@vellumai/assistant 0.6.0 → 0.6.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 (358) hide show
  1. package/AGENTS.md +4 -0
  2. package/ARCHITECTURE.md +68 -15
  3. package/Dockerfile +2 -2
  4. package/bun.lock +6 -2
  5. package/docker-entrypoint.sh +42 -1
  6. package/docs/architecture/integrations.md +1 -1
  7. package/docs/architecture/memory.md +21 -24
  8. package/node_modules/@vellumai/ces-contracts/src/handles.ts +7 -9
  9. package/openapi.yaml +539 -4
  10. package/package.json +5 -1
  11. package/src/__tests__/anthropic-provider.test.ts +160 -95
  12. package/src/__tests__/app-dir-path-guard.test.ts +1 -0
  13. package/src/__tests__/app-executors.test.ts +47 -1
  14. package/src/__tests__/app-source-watcher.test.ts +159 -0
  15. package/src/__tests__/assistant-event-hub.test.ts +30 -0
  16. package/src/__tests__/checker.test.ts +138 -172
  17. package/src/__tests__/cli-command-risk-guard.test.ts +1 -1
  18. package/src/__tests__/config-schema.test.ts +5 -0
  19. package/src/__tests__/context-overflow-approval.test.ts +5 -5
  20. package/src/__tests__/conversation-agent-loop-overflow.test.ts +4 -6
  21. package/src/__tests__/conversation-agent-loop.test.ts +4 -51
  22. package/src/__tests__/conversation-analysis-routes.test.ts +169 -0
  23. package/src/__tests__/conversation-directories-parse.test.ts +105 -0
  24. package/src/__tests__/conversation-history-web-search.test.ts +1 -1
  25. package/src/__tests__/conversation-runtime-assembly.test.ts +653 -832
  26. package/src/__tests__/conversation-runtime-workspace.test.ts +1 -93
  27. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +17 -4
  28. package/src/__tests__/conversation-wipe.test.ts +2 -6
  29. package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -12
  30. package/src/__tests__/conversation-workspace-injection.test.ts +25 -26
  31. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -1
  32. package/src/__tests__/copy-composer-tc-templates.test.ts +335 -0
  33. package/src/__tests__/credential-execution-approval-bridge.test.ts +0 -2
  34. package/src/__tests__/date-context.test.ts +76 -210
  35. package/src/__tests__/db-schedule-syntax-migration.test.ts +16 -1
  36. package/src/__tests__/file-list-tool.test.ts +219 -0
  37. package/src/__tests__/first-greeting.test.ts +1 -1
  38. package/src/__tests__/heartbeat-service.test.ts +180 -3
  39. package/src/__tests__/identity-routes.test.ts +328 -0
  40. package/src/__tests__/init-feature-flag-overrides.test.ts +167 -0
  41. package/src/__tests__/injection-block.test.ts +24 -0
  42. package/src/__tests__/inline-command-runner.test.ts +7 -5
  43. package/src/__tests__/install-skill-routing.test.ts +7 -6
  44. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +15 -14
  45. package/src/__tests__/list-messages-tool-merge.test.ts +300 -0
  46. package/src/__tests__/llm-context-normalization.test.ts +18 -18
  47. package/src/__tests__/llm-context-route-provider.test.ts +101 -0
  48. package/src/__tests__/llm-request-log-turn-query.test.ts +162 -0
  49. package/src/__tests__/log-export-workspace.test.ts +257 -100
  50. package/src/__tests__/managed-credential-catalog-cli.test.ts +12 -14
  51. package/src/__tests__/mcp-abort-signal.test.ts +5 -0
  52. package/src/__tests__/mcp-client-auth.test.ts +5 -0
  53. package/src/__tests__/memory-recall-log-store.test.ts +132 -0
  54. package/src/__tests__/migration-export-streaming.test.ts +304 -0
  55. package/src/__tests__/migration-import-commit-http.test.ts +11 -10
  56. package/src/__tests__/mock-fetch.ts +87 -0
  57. package/src/__tests__/navigate-settings-tab.test.ts +14 -1
  58. package/src/__tests__/notification-broadcaster.test.ts +65 -0
  59. package/src/__tests__/notification-decision-recipient-context.test.ts +282 -0
  60. package/src/__tests__/onboarding-template-contract.test.ts +63 -14
  61. package/src/__tests__/parser.test.ts +32 -0
  62. package/src/__tests__/permission-checker-host-gate.test.ts +452 -0
  63. package/src/__tests__/permission-controls-v2-flag.test.ts +55 -0
  64. package/src/__tests__/permission-mode-sse.test.ts +418 -0
  65. package/src/__tests__/permission-mode-store.test.ts +277 -0
  66. package/src/__tests__/permission-mode.test.ts +101 -0
  67. package/src/__tests__/pkb-autoinject.test.ts +96 -0
  68. package/src/__tests__/platform-bash-auto-approve.test.ts +359 -0
  69. package/src/__tests__/profiler-routes.test.ts +502 -0
  70. package/src/__tests__/profiler-run-store.test.ts +441 -0
  71. package/src/__tests__/proxy-approval-callback.test.ts +4 -75
  72. package/src/__tests__/registry.test.ts +1 -1
  73. package/src/__tests__/require-fresh-approval.test.ts +0 -2
  74. package/src/__tests__/sandbox-diagnostics.test.ts +1 -32
  75. package/src/__tests__/sandbox-host-parity.test.ts +5 -4
  76. package/src/__tests__/scheduler-reuse-conversation.test.ts +368 -0
  77. package/src/__tests__/scrub-corrupted-image-attachments.test.ts +278 -0
  78. package/src/__tests__/search-skills-unified.test.ts +4 -3
  79. package/src/__tests__/send-endpoint-busy.test.ts +42 -3
  80. package/src/__tests__/set-permission-mode.test.ts +274 -0
  81. package/src/__tests__/skill-load-feature-flag.test.ts +12 -0
  82. package/src/__tests__/skill-memory.test.ts +2 -783
  83. package/src/__tests__/strip-memory-injections.test.ts +187 -0
  84. package/src/__tests__/subagent-detail.test.ts +84 -0
  85. package/src/__tests__/subagent-disposal.test.ts +308 -0
  86. package/src/__tests__/subagent-manager-notify.test.ts +19 -10
  87. package/src/__tests__/subagent-notify-parent.test.ts +390 -0
  88. package/src/__tests__/subagent-role-registry.test.ts +108 -0
  89. package/src/__tests__/subagent-tool-filtering.test.ts +71 -0
  90. package/src/__tests__/subagent-tools.test.ts +464 -4
  91. package/src/__tests__/system-prompt-ask-mode.test.ts +139 -0
  92. package/src/__tests__/task-memory-cleanup.test.ts +12 -12
  93. package/src/__tests__/terminal-sandbox.test.ts +1 -1
  94. package/src/__tests__/terminal-tools.test.ts +16 -29
  95. package/src/__tests__/test-preload.ts +18 -0
  96. package/src/__tests__/tool-domain-event-publisher.test.ts +0 -1
  97. package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -8
  98. package/src/__tests__/tool-executor.test.ts +4 -27
  99. package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
  100. package/src/__tests__/top-level-renderer.test.ts +10 -13
  101. package/src/__tests__/transport-hints-queue.test.ts +77 -0
  102. package/src/__tests__/trust-store.test.ts +4 -4
  103. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +116 -2
  104. package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +387 -0
  105. package/src/__tests__/workspace-migration-030-seed-pkb-autoinject.test.ts +168 -0
  106. package/src/__tests__/workspace-policy.test.ts +2 -7
  107. package/src/agent/loop.ts +6 -29
  108. package/src/approvals/guardian-request-resolvers.ts +24 -0
  109. package/src/avatar/traits-png-sync.ts +3 -3
  110. package/src/channels/types.ts +5 -0
  111. package/src/cli/__tests__/run-assistant-command.ts +56 -0
  112. package/src/cli/__tests__/unknown-command.test.ts +33 -0
  113. package/src/cli/commands/__tests__/email-download.test.ts +245 -0
  114. package/src/cli/commands/__tests__/email-list.test.ts +192 -0
  115. package/src/cli/commands/__tests__/email-register.test.ts +186 -0
  116. package/src/cli/commands/__tests__/email-send.test.ts +291 -0
  117. package/src/cli/commands/__tests__/email-status.test.ts +181 -0
  118. package/src/cli/commands/__tests__/email-unregister.test.ts +139 -0
  119. package/src/cli/commands/__tests__/routes.test.ts +562 -0
  120. package/src/cli/commands/conversations.ts +1 -8
  121. package/src/cli/commands/default-action.ts +68 -1
  122. package/src/cli/commands/email.ts +584 -835
  123. package/src/cli/commands/memory.ts +1 -34
  124. package/src/cli/commands/notifications.ts +7 -2
  125. package/src/cli/commands/oauth/__tests__/connect.test.ts +27 -0
  126. package/src/cli/commands/oauth/connect.ts +25 -5
  127. package/src/cli/commands/platform/__tests__/connect.test.ts +1 -1
  128. package/src/cli/commands/platform/__tests__/disconnect.test.ts +1 -1
  129. package/src/cli/commands/platform/__tests__/status.test.ts +1 -1
  130. package/src/cli/commands/routes.ts +396 -0
  131. package/src/cli/commands/skills.ts +130 -20
  132. package/src/cli/program.ts +11 -2
  133. package/src/cli.ts +1 -120
  134. package/src/config/assistant-feature-flags.ts +59 -55
  135. package/src/config/bundled-skills/app-builder/SKILL.md +91 -5
  136. package/src/config/bundled-skills/gmail/SKILL.md +13 -8
  137. package/src/config/bundled-skills/gmail/TOOLS.json +1 -1
  138. package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +2 -1
  139. package/src/config/bundled-skills/messaging/SKILL.md +7 -0
  140. package/src/config/bundled-skills/schedule/SKILL.md +22 -2
  141. package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
  142. package/src/config/bundled-skills/settings/TOOLS.json +1 -1
  143. package/src/config/bundled-skills/settings/tools/avatar-get.ts +3 -13
  144. package/src/config/bundled-skills/settings/tools/avatar-remove.ts +2 -4
  145. package/src/config/bundled-skills/settings/tools/avatar-update.ts +5 -2
  146. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +8 -3
  147. package/src/config/bundled-skills/slack/SKILL.md +2 -0
  148. package/src/config/bundled-skills/subagent/SKILL.md +43 -3
  149. package/src/config/bundled-skills/subagent/TOOLS.json +29 -4
  150. package/src/config/env-registry.ts +63 -0
  151. package/src/config/feature-flag-registry.json +17 -1
  152. package/src/config/schema.ts +8 -0
  153. package/src/config/schemas/filing.ts +51 -0
  154. package/src/config/schemas/heartbeat.ts +15 -12
  155. package/src/config/schemas/memory-lifecycle.ts +12 -0
  156. package/src/config/schemas/security.ts +14 -0
  157. package/src/config/schemas/services.ts +8 -0
  158. package/src/credential-execution/approval-bridge.ts +0 -1
  159. package/src/credential-execution/managed-catalog.ts +3 -7
  160. package/src/daemon/app-source-watcher.ts +93 -0
  161. package/src/daemon/config-watcher.ts +85 -3
  162. package/src/daemon/context-overflow-approval.ts +0 -1
  163. package/src/daemon/conversation-agent-loop-handlers.ts +20 -0
  164. package/src/daemon/conversation-agent-loop.ts +179 -65
  165. package/src/daemon/conversation-attachments.ts +0 -1
  166. package/src/daemon/conversation-history.ts +4 -19
  167. package/src/daemon/conversation-lifecycle.ts +8 -14
  168. package/src/daemon/conversation-messaging.ts +3 -0
  169. package/src/daemon/conversation-process.ts +30 -8
  170. package/src/daemon/conversation-queue-manager.ts +8 -0
  171. package/src/daemon/conversation-runtime-assembly.ts +359 -308
  172. package/src/daemon/conversation-surfaces.ts +65 -0
  173. package/src/daemon/conversation-tool-setup.ts +44 -17
  174. package/src/daemon/conversation-workspace.ts +1 -2
  175. package/src/daemon/conversation.ts +19 -3
  176. package/src/daemon/date-context.ts +26 -53
  177. package/src/daemon/first-greeting.ts +1 -1
  178. package/src/daemon/handlers/conversations.ts +5 -7
  179. package/src/daemon/handlers/shared.test.ts +143 -0
  180. package/src/daemon/handlers/shared.ts +70 -5
  181. package/src/daemon/handlers/skills.ts +11 -18
  182. package/src/daemon/lifecycle.ts +220 -158
  183. package/src/daemon/message-types/conversations.ts +29 -6
  184. package/src/daemon/message-types/messages.ts +9 -2
  185. package/src/daemon/message-types/notifications.ts +12 -0
  186. package/src/daemon/message-types/schedules.ts +1 -0
  187. package/src/daemon/message-types/settings.ts +18 -0
  188. package/src/daemon/profiler-run-store.ts +557 -0
  189. package/src/daemon/server.ts +87 -10
  190. package/src/daemon/shutdown-handlers.ts +5 -0
  191. package/src/daemon/tool-side-effects.ts +23 -3
  192. package/src/daemon/transport-hints.ts +33 -0
  193. package/src/export/transcript-formatter.ts +148 -0
  194. package/src/filing/filing-service.ts +228 -0
  195. package/src/heartbeat/heartbeat-service.ts +96 -7
  196. package/src/index.ts +1 -1
  197. package/src/mcp/client.ts +6 -0
  198. package/src/mcp/mcp-oauth-provider.ts +149 -27
  199. package/src/memory/admin.ts +33 -32
  200. package/src/memory/app-store.ts +69 -0
  201. package/src/memory/conversation-bootstrap.ts +1 -1
  202. package/src/memory/conversation-crud.ts +151 -117
  203. package/src/memory/conversation-directories.ts +39 -0
  204. package/src/memory/conversation-group-migration.ts +66 -6
  205. package/src/memory/conversation-queries.ts +58 -12
  206. package/src/memory/conversation-title-service.ts +1 -0
  207. package/src/memory/db-init.ts +182 -376
  208. package/src/memory/embedding-local.ts +1 -1
  209. package/src/memory/graph/bootstrap.ts +75 -66
  210. package/src/memory/graph/capability-seed.ts +167 -17
  211. package/src/memory/graph/consolidation.ts +38 -4
  212. package/src/memory/graph/conversation-graph-memory.ts +133 -104
  213. package/src/memory/graph/extraction-job.ts +9 -4
  214. package/src/memory/graph/extraction.ts +66 -23
  215. package/src/memory/graph/graph-memory-state-store.ts +37 -0
  216. package/src/memory/graph/graph-search.ts +29 -15
  217. package/src/memory/graph/injection.ts +38 -8
  218. package/src/memory/graph/inspect.ts +12 -3
  219. package/src/memory/graph/retriever.ts +365 -262
  220. package/src/memory/graph/store.test.ts +48 -0
  221. package/src/memory/graph/store.ts +150 -11
  222. package/src/memory/graph/tool-handlers.ts +84 -209
  223. package/src/memory/graph/tools.ts +8 -52
  224. package/src/memory/graph/types.ts +24 -0
  225. package/src/memory/group-crud.ts +25 -9
  226. package/src/memory/job-handlers/cleanup.ts +44 -1
  227. package/src/memory/jobs-store.ts +70 -60
  228. package/src/memory/jobs-worker.ts +44 -28
  229. package/src/memory/llm-request-log-store.ts +96 -12
  230. package/src/memory/memory-recall-log-store.ts +49 -5
  231. package/src/memory/migrations/203-drop-memory-items-tables.ts +33 -1
  232. package/src/memory/migrations/206-memory-graph-node-edits.ts +19 -0
  233. package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +131 -0
  234. package/src/memory/migrations/207-conversation-graph-memory-state.ts +20 -0
  235. package/src/memory/migrations/208-conversations-last-message-at.ts +35 -0
  236. package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +85 -0
  237. package/src/memory/migrations/210-schedule-reuse-conversation.ts +13 -0
  238. package/src/memory/migrations/211-memory-recall-logs-query-context.ts +21 -0
  239. package/src/memory/migrations/212-llm-request-logs-created-at-index.ts +19 -0
  240. package/src/memory/migrations/index.ts +8 -0
  241. package/src/memory/migrations/registry.ts +8 -0
  242. package/src/memory/schema/conversations.ts +14 -0
  243. package/src/memory/schema/infrastructure.ts +8 -1
  244. package/src/memory/schema/memory-core.ts +0 -51
  245. package/src/memory/schema/memory-graph.ts +15 -0
  246. package/src/memory/task-memory-cleanup.ts +30 -11
  247. package/src/messaging/provider.ts +1 -1
  248. package/src/notifications/broadcaster.ts +6 -0
  249. package/src/notifications/conversation-pairing.ts +12 -4
  250. package/src/notifications/copy-composer.ts +86 -0
  251. package/src/notifications/decision-engine.ts +35 -0
  252. package/src/notifications/emit-signal.ts +14 -0
  253. package/src/notifications/signal.ts +11 -0
  254. package/src/oauth/platform-connection.test.ts +2 -2
  255. package/src/oauth/seed-providers.ts +1 -0
  256. package/src/permissions/checker.ts +15 -4
  257. package/src/permissions/defaults.ts +7 -8
  258. package/src/permissions/permission-mode-store.ts +180 -0
  259. package/src/permissions/permission-mode.ts +31 -0
  260. package/src/permissions/prompter.ts +0 -2
  261. package/src/permissions/workspace-policy.ts +9 -0
  262. package/src/platform/client.ts +1 -1
  263. package/src/prompts/system-prompt.ts +59 -7
  264. package/src/prompts/templates/BOOTSTRAP-REFERENCE.md +100 -0
  265. package/src/prompts/templates/BOOTSTRAP.md +76 -162
  266. package/src/prompts/templates/HEARTBEAT.md +3 -1
  267. package/src/prompts/templates/SOUL.md +30 -9
  268. package/src/prompts/templates/UPDATES.md +8 -0
  269. package/src/providers/anthropic/client.ts +107 -219
  270. package/src/runtime/assistant-event-hub.ts +22 -0
  271. package/src/runtime/auth/route-policy.ts +23 -0
  272. package/src/runtime/auth/token-service.ts +8 -0
  273. package/src/runtime/http-server.ts +32 -2
  274. package/src/runtime/http-types.ts +12 -1
  275. package/src/runtime/migrations/vbundle-builder.ts +389 -3
  276. package/src/runtime/migrations/vbundle-importer.ts +8 -6
  277. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +378 -0
  278. package/src/runtime/routes/app-management-routes.ts +1 -11
  279. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +26 -0
  280. package/src/runtime/routes/archive-utils.ts +29 -0
  281. package/src/runtime/routes/avatar-routes.ts +2 -9
  282. package/src/runtime/routes/btw-routes.ts +14 -1
  283. package/src/runtime/routes/conversation-analysis-routes.ts +185 -0
  284. package/src/runtime/routes/conversation-management-routes.ts +1 -14
  285. package/src/runtime/routes/conversation-query-routes.ts +49 -3
  286. package/src/runtime/routes/conversation-routes.ts +270 -44
  287. package/src/runtime/routes/group-routes.ts +22 -8
  288. package/src/runtime/routes/heartbeat-routes.ts +4 -10
  289. package/src/runtime/routes/identity-routes.ts +53 -18
  290. package/src/runtime/routes/llm-context-normalization.ts +14 -10
  291. package/src/runtime/routes/log-export/AGENTS.md +104 -0
  292. package/src/runtime/routes/log-export/__tests__/workspace-allowlist-error-contract.test.ts +103 -0
  293. package/src/runtime/routes/log-export/__tests__/workspace-allowlist.test.ts +716 -0
  294. package/src/runtime/routes/log-export/workspace-allowlist.ts +458 -0
  295. package/src/runtime/routes/log-export-routes.ts +41 -278
  296. package/src/runtime/routes/memory-item-routes.test.ts +168 -233
  297. package/src/runtime/routes/migration-routes.ts +18 -7
  298. package/src/runtime/routes/profiler-routes.ts +350 -0
  299. package/src/runtime/routes/schedule-routes.ts +27 -12
  300. package/src/runtime/routes/settings-routes.ts +95 -8
  301. package/src/runtime/routes/subagents-routes.ts +28 -7
  302. package/src/runtime/routes/user-route-dispatcher.ts +223 -0
  303. package/src/runtime/routes/user-routes.ts +41 -0
  304. package/src/runtime/routes/workspace-routes.ts +0 -1
  305. package/src/schedule/schedule-store.ts +30 -0
  306. package/src/schedule/scheduler.ts +45 -18
  307. package/src/skills/catalog-install.ts +10 -2
  308. package/src/skills/inline-command-runner.ts +12 -14
  309. package/src/skills/managed-store.ts +2 -2
  310. package/src/skills/skill-memory.ts +1 -293
  311. package/src/subagent/index.ts +13 -3
  312. package/src/subagent/manager.ts +308 -29
  313. package/src/subagent/types.ts +68 -0
  314. package/src/tasks/task-runner.ts +4 -4
  315. package/src/tools/apps/executors.ts +29 -4
  316. package/src/tools/filesystem/list.ts +93 -0
  317. package/src/tools/permission-checker.ts +78 -18
  318. package/src/tools/registry.ts +4 -0
  319. package/src/tools/schedule/create.ts +3 -0
  320. package/src/tools/schedule/list.ts +1 -0
  321. package/src/tools/schedule/update.ts +6 -0
  322. package/src/tools/secret-detection-handler.ts +0 -1
  323. package/src/tools/shared/filesystem/errors.ts +5 -0
  324. package/src/tools/shared/filesystem/file-ops-service.ts +90 -2
  325. package/src/tools/shared/filesystem/types.ts +17 -0
  326. package/src/tools/shared/shell-output.ts +31 -2
  327. package/src/tools/skills/sandbox-runner.ts +3 -6
  328. package/src/tools/subagent/abort.ts +12 -2
  329. package/src/tools/subagent/message.ts +9 -2
  330. package/src/tools/subagent/notify-parent.ts +79 -0
  331. package/src/tools/subagent/read.ts +29 -8
  332. package/src/tools/subagent/resolve.ts +21 -0
  333. package/src/tools/subagent/spawn.ts +2 -0
  334. package/src/tools/subagent/status.ts +11 -1
  335. package/src/tools/system/avatar-generator.ts +3 -3
  336. package/src/tools/system/register.ts +23 -0
  337. package/src/tools/system/set-permission-mode.ts +103 -0
  338. package/src/tools/terminal/parser.ts +30 -5
  339. package/src/tools/terminal/safe-env.ts +16 -1
  340. package/src/tools/terminal/sandbox-diagnostics.ts +4 -4
  341. package/src/tools/terminal/sandbox.ts +4 -1
  342. package/src/tools/terminal/shell.ts +3 -5
  343. package/src/tools/tool-manifest.ts +6 -0
  344. package/src/tools/types.ts +2 -3
  345. package/src/util/logger.ts +1 -1
  346. package/src/util/platform.ts +50 -17
  347. package/src/watcher/provider-types.ts +1 -1
  348. package/src/workspace/migrations/023-move-config-files-to-workspace.ts +2 -2
  349. package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +2 -2
  350. package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +270 -0
  351. package/src/workspace/migrations/029-seed-pkb.ts +85 -0
  352. package/src/workspace/migrations/030-seed-pkb-autoinject.ts +73 -0
  353. package/src/workspace/migrations/registry.ts +6 -0
  354. package/src/workspace/top-level-renderer.ts +5 -9
  355. package/src/__tests__/cli-memory.test.ts +0 -377
  356. package/src/__tests__/clipboard.test.ts +0 -88
  357. package/src/cli/cli-memory.ts +0 -179
  358. package/src/util/clipboard.ts +0 -34
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Route handler for conversation analysis.
3
+ *
4
+ * POST /v1/conversations/:id/analyze — analyze a conversation via a new
5
+ * agent loop that produces a structured self-assessment.
6
+ */
7
+
8
+ import type { ServerMessage } from "../../daemon/message-protocol.js";
9
+ import {
10
+ addMessage,
11
+ createConversation,
12
+ getConversation,
13
+ getMessages,
14
+ } from "../../memory/conversation-crud.js";
15
+ import { resolveConversationId } from "../../memory/conversation-key-store.js";
16
+ import { getLogger } from "../../util/logger.js";
17
+ import { buildAssistantEvent } from "../assistant-event.js";
18
+ import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
19
+ import { httpError } from "../http-errors.js";
20
+ import type { RouteDefinition } from "../http-router.js";
21
+ import type { SendMessageDeps } from "../http-types.js";
22
+
23
+ const log = getLogger("conversation-analysis-routes");
24
+
25
+ // ---------------------------------------------------------------------------
26
+ // Dependency types — injected by the daemon at wiring time
27
+ // ---------------------------------------------------------------------------
28
+
29
+ export interface ConversationAnalysisDeps {
30
+ sendMessageDeps: SendMessageDeps;
31
+ buildConversationDetailResponse: (
32
+ id: string,
33
+ ) => Record<string, unknown> | null;
34
+ }
35
+
36
+ // ---------------------------------------------------------------------------
37
+ // Route definitions
38
+ // ---------------------------------------------------------------------------
39
+
40
+ export function conversationAnalysisRouteDefinitions(
41
+ deps: ConversationAnalysisDeps,
42
+ ): RouteDefinition[] {
43
+ return [
44
+ {
45
+ endpoint: "conversations/:id/analyze",
46
+ method: "POST",
47
+ policyKey: "conversations/analyze",
48
+ summary: "Analyze a conversation",
49
+ description:
50
+ "Create a new conversation with a structured self-assessment of an existing conversation.",
51
+ tags: ["conversations"],
52
+ handler: async ({ params }) => {
53
+ // a. Resolve conversation ID
54
+ const resolvedId = resolveConversationId(params.id);
55
+ if (!resolvedId) {
56
+ return httpError(
57
+ "NOT_FOUND",
58
+ `Conversation ${params.id} not found`,
59
+ 404,
60
+ );
61
+ }
62
+
63
+ // b. Load the conversation
64
+ const conversation = getConversation(resolvedId);
65
+ if (!conversation) {
66
+ return httpError(
67
+ "NOT_FOUND",
68
+ `Conversation ${resolvedId} not found`,
69
+ 404,
70
+ );
71
+ }
72
+
73
+ // c. Reject private conversations
74
+ if (conversation.conversationType === "private") {
75
+ return httpError(
76
+ "FORBIDDEN",
77
+ "Private conversations cannot be analyzed",
78
+ 403,
79
+ );
80
+ }
81
+
82
+ // d. Check for messages
83
+ const existingMessages = getMessages(resolvedId);
84
+ if (existingMessages.length === 0) {
85
+ return httpError(
86
+ "BAD_REQUEST",
87
+ "Conversation has no messages to analyze",
88
+ 400,
89
+ );
90
+ }
91
+
92
+ // e. Build the analysis transcript
93
+ const { buildAnalysisTranscript } =
94
+ await import("../../export/transcript-formatter.js");
95
+ const transcript = buildAnalysisTranscript(resolvedId);
96
+
97
+ // f. Create a new conversation for the analysis
98
+ const newConv = createConversation({
99
+ title: `Analysis: ${conversation.title ?? "Untitled"}`,
100
+ });
101
+
102
+ // g. Build the analysis prompt
103
+ const prompt = `<transcript>
104
+ ${transcript}
105
+ </transcript>
106
+
107
+ Analyze the conversation above. Provide a structured self-assessment:
108
+
109
+ 1. **Summary**: What was the user trying to accomplish? What was the outcome?
110
+ 2. **What went well**: Effective tool usage, good reasoning, helpful responses, problem-solving patterns.
111
+ 3. **What went wrong**: Errors, unnecessary tool calls, incorrect assumptions, wasted turns, misunderstandings.
112
+ 4. **Root causes**: Why did failures happen? Missing context? Wrong approach? Tool limitations?
113
+ 5. **Recommendations**: Specific, actionable improvements for similar conversations next time.
114
+
115
+ Be honest and specific. Reference particular moments in the transcript. Focus on patterns that generalize beyond this specific conversation.
116
+
117
+ Do not use tools during analysis. If you identify insights worth remembering for future conversations, include them in the response as explicit memory candidates instead of saving them directly.`;
118
+
119
+ // h. Persist the user message
120
+ const message = await addMessage(
121
+ newConv.id,
122
+ "user",
123
+ JSON.stringify([{ type: "text", text: prompt }]),
124
+ { provenanceTrustClass: "unknown" as const },
125
+ );
126
+ const messageId = message.id;
127
+
128
+ // i. Load the conversation into memory with untrusted analysis context
129
+ const analysisConversation =
130
+ await deps.sendMessageDeps.getOrCreateConversation(newConv.id);
131
+ analysisConversation.setTrustContext({
132
+ trustClass: "unknown",
133
+ sourceChannel: "vellum",
134
+ });
135
+ await analysisConversation.ensureActorScopedHistory();
136
+ // Analysis runs over attacker-influenced transcript content, so do not
137
+ // expose any tools, even when a live client is available.
138
+ analysisConversation.setSubagentAllowedTools(new Set<string>());
139
+
140
+ const hasLiveSubscriber =
141
+ deps.sendMessageDeps.assistantEventHub.hasSubscribersForEvent({
142
+ assistantId: DAEMON_INTERNAL_ASSISTANT_ID,
143
+ conversationId: newConv.id,
144
+ });
145
+
146
+ // j. Build onEvent using inline hub publisher
147
+ const onEvent = (msg: ServerMessage) => {
148
+ deps.sendMessageDeps.assistantEventHub.publish(
149
+ buildAssistantEvent(DAEMON_INTERNAL_ASSISTANT_ID, msg, newConv.id),
150
+ );
151
+ };
152
+ analysisConversation.updateClient(onEvent, !hasLiveSubscriber);
153
+
154
+ // k. Set up processing state (required by runAgentLoop guard)
155
+ analysisConversation.processing = true;
156
+ analysisConversation.abortController = new AbortController();
157
+ analysisConversation.currentRequestId = crypto.randomUUID();
158
+
159
+ // l. Fire-and-forget the agent loop
160
+ analysisConversation
161
+ .runAgentLoop(prompt, messageId, onEvent, {
162
+ isInteractive: hasLiveSubscriber,
163
+ isUserMessage: true,
164
+ })
165
+ .catch((err) => {
166
+ log.error(
167
+ { err, conversationId: newConv.id },
168
+ "Analysis agent loop failed",
169
+ );
170
+ });
171
+
172
+ // m. Return the new conversation detail
173
+ const detail = deps.buildConversationDetailResponse(newConv.id);
174
+ if (!detail) {
175
+ return httpError(
176
+ "INTERNAL_ERROR",
177
+ `Analysis conversation ${newConv.id} could not be loaded`,
178
+ 500,
179
+ );
180
+ }
181
+ return Response.json(detail);
182
+ },
183
+ },
184
+ ];
185
+ }
@@ -344,12 +344,6 @@ export function conversationManagementRouteDefinitions(
344
344
  targetId: segId,
345
345
  });
346
346
  }
347
- for (const itemId of result.orphanedItemIds) {
348
- enqueueMemoryJob("delete_qdrant_vectors", {
349
- targetType: "item",
350
- targetId: itemId,
351
- });
352
- }
353
347
  for (const summaryId of result.deletedSummaryIds) {
354
348
  enqueueMemoryJob("delete_qdrant_vectors", {
355
349
  targetType: "summary",
@@ -359,7 +353,6 @@ export function conversationManagementRouteDefinitions(
359
353
  log.info(
360
354
  {
361
355
  conversationId: resolvedId,
362
- unsuperseded: result.unsupersededItemIds.length,
363
356
  summariesDeleted: result.deletedSummaryIds.length,
364
357
  jobsCancelled: result.cancelledJobCount,
365
358
  },
@@ -367,7 +360,7 @@ export function conversationManagementRouteDefinitions(
367
360
  );
368
361
  return Response.json({
369
362
  wiped: true,
370
- unsupersededItems: result.unsupersededItemIds.length,
363
+ unsupersededItems: 0,
371
364
  deletedSummaries: result.deletedSummaryIds.length,
372
365
  cancelledJobs: result.cancelledJobCount,
373
366
  });
@@ -417,12 +410,6 @@ export function conversationManagementRouteDefinitions(
417
410
  targetId: segId,
418
411
  });
419
412
  }
420
- for (const itemId of deleted.orphanedItemIds) {
421
- enqueueMemoryJob("delete_qdrant_vectors", {
422
- targetType: "item",
423
- targetId: itemId,
424
- });
425
- }
426
413
  for (const summaryId of deleted.deletedSummaryIds) {
427
414
  enqueueMemoryJob("delete_qdrant_vectors", {
428
415
  targetType: "summary",
@@ -43,7 +43,10 @@ import {
43
43
  } from "../../daemon/handlers/conversation-history.js";
44
44
  import { deleteQueuedMessage } from "../../daemon/handlers/conversations.js";
45
45
  import { getAssistantMessageIdsInTurn } from "../../memory/conversation-crud.js";
46
- import { getRequestLogsByMessageId } from "../../memory/llm-request-log-store.js";
46
+ import {
47
+ getRequestLogById,
48
+ getRequestLogsByMessageId,
49
+ } from "../../memory/llm-request-log-store.js";
47
50
  import { getMemoryRecallLogByMessageIds } from "../../memory/memory-recall-log-store.js";
48
51
  import { resolvePricingForUsage } from "../../util/pricing.js";
49
52
  import { httpError } from "../http-errors.js";
@@ -487,8 +490,8 @@ export function conversationQueryRouteDefinitions(
487
490
  );
488
491
  return {
489
492
  id: log.id,
490
- requestPayload,
491
- responsePayload,
493
+ requestPayload: null,
494
+ responsePayload: null,
492
495
  createdAt: log.createdAt,
493
496
  ...result,
494
497
  };
@@ -498,6 +501,49 @@ export function conversationQueryRouteDefinitions(
498
501
  },
499
502
  },
500
503
 
504
+ // ── Raw payload for a single LLM request log ─────────────────────
505
+ {
506
+ endpoint: "llm-request-logs/:id/payload",
507
+ method: "GET",
508
+ policyKey: "llm-request-logs/payload",
509
+ summary: "Get raw payload for a single LLM request log",
510
+ description:
511
+ "Return the full request and response payloads for a specific log entry.",
512
+ tags: ["messages"],
513
+ responseBody: z.object({
514
+ id: z.string(),
515
+ requestPayload: z.unknown(),
516
+ responsePayload: z.unknown(),
517
+ }),
518
+ handler: ({ params }) => {
519
+ const logId = params.id;
520
+ if (!logId) {
521
+ return httpError("BAD_REQUEST", "log id is required", 400);
522
+ }
523
+ const log = getRequestLogById(logId);
524
+ if (!log) {
525
+ return httpError("NOT_FOUND", "log not found", 404);
526
+ }
527
+ let requestPayload: unknown;
528
+ try {
529
+ requestPayload = JSON.parse(log.requestPayload);
530
+ } catch {
531
+ requestPayload = log.requestPayload;
532
+ }
533
+ let responsePayload: unknown;
534
+ try {
535
+ responsePayload = JSON.parse(log.responsePayload);
536
+ } catch {
537
+ responsePayload = log.responsePayload;
538
+ }
539
+ return Response.json({
540
+ id: log.id,
541
+ requestPayload,
542
+ responsePayload,
543
+ });
544
+ },
545
+ },
546
+
501
547
  // ── Delete queued message ─────────────────────────────────────────
502
548
  {
503
549
  endpoint: "messages/queued/:id",