@vellumai/assistant 0.6.0 → 0.6.1

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 (285) 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 +32 -1
  6. package/docs/architecture/integrations.md +1 -1
  7. package/docs/architecture/memory.md +21 -24
  8. package/openapi.yaml +538 -3
  9. package/package.json +5 -1
  10. package/src/__tests__/anthropic-provider.test.ts +160 -95
  11. package/src/__tests__/app-dir-path-guard.test.ts +1 -0
  12. package/src/__tests__/app-executors.test.ts +47 -1
  13. package/src/__tests__/app-source-watcher.test.ts +159 -0
  14. package/src/__tests__/checker.test.ts +38 -6
  15. package/src/__tests__/config-schema.test.ts +5 -0
  16. package/src/__tests__/conversation-agent-loop-overflow.test.ts +4 -6
  17. package/src/__tests__/conversation-agent-loop.test.ts +4 -51
  18. package/src/__tests__/conversation-history-web-search.test.ts +1 -1
  19. package/src/__tests__/conversation-runtime-assembly.test.ts +653 -832
  20. package/src/__tests__/conversation-runtime-workspace.test.ts +1 -93
  21. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +17 -4
  22. package/src/__tests__/conversation-wipe.test.ts +2 -6
  23. package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -12
  24. package/src/__tests__/conversation-workspace-injection.test.ts +25 -26
  25. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -1
  26. package/src/__tests__/copy-composer-tc-templates.test.ts +335 -0
  27. package/src/__tests__/date-context.test.ts +76 -210
  28. package/src/__tests__/db-schedule-syntax-migration.test.ts +16 -1
  29. package/src/__tests__/file-list-tool.test.ts +219 -0
  30. package/src/__tests__/first-greeting.test.ts +1 -1
  31. package/src/__tests__/heartbeat-service.test.ts +180 -3
  32. package/src/__tests__/identity-routes.test.ts +328 -0
  33. package/src/__tests__/injection-block.test.ts +24 -0
  34. package/src/__tests__/install-skill-routing.test.ts +7 -6
  35. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +15 -14
  36. package/src/__tests__/list-messages-tool-merge.test.ts +300 -0
  37. package/src/__tests__/llm-context-normalization.test.ts +18 -18
  38. package/src/__tests__/llm-context-route-provider.test.ts +101 -0
  39. package/src/__tests__/llm-request-log-turn-query.test.ts +162 -0
  40. package/src/__tests__/log-export-workspace.test.ts +72 -105
  41. package/src/__tests__/mcp-abort-signal.test.ts +5 -0
  42. package/src/__tests__/mcp-client-auth.test.ts +5 -0
  43. package/src/__tests__/memory-recall-log-store.test.ts +132 -0
  44. package/src/__tests__/migration-export-streaming.test.ts +304 -0
  45. package/src/__tests__/migration-import-commit-http.test.ts +11 -10
  46. package/src/__tests__/mock-fetch.ts +87 -0
  47. package/src/__tests__/notification-decision-recipient-context.test.ts +282 -0
  48. package/src/__tests__/onboarding-template-contract.test.ts +62 -14
  49. package/src/__tests__/parser.test.ts +32 -0
  50. package/src/__tests__/permission-checker-host-gate.test.ts +452 -0
  51. package/src/__tests__/permission-controls-v2-flag.test.ts +55 -0
  52. package/src/__tests__/permission-mode-sse.test.ts +418 -0
  53. package/src/__tests__/permission-mode-store.test.ts +277 -0
  54. package/src/__tests__/permission-mode.test.ts +101 -0
  55. package/src/__tests__/platform-bash-auto-approve.test.ts +359 -0
  56. package/src/__tests__/profiler-routes.test.ts +502 -0
  57. package/src/__tests__/profiler-run-store.test.ts +441 -0
  58. package/src/__tests__/proxy-approval-callback.test.ts +4 -75
  59. package/src/__tests__/registry.test.ts +1 -1
  60. package/src/__tests__/sandbox-host-parity.test.ts +5 -4
  61. package/src/__tests__/scheduler-reuse-conversation.test.ts +368 -0
  62. package/src/__tests__/scrub-corrupted-image-attachments.test.ts +278 -0
  63. package/src/__tests__/search-skills-unified.test.ts +4 -3
  64. package/src/__tests__/send-endpoint-busy.test.ts +42 -3
  65. package/src/__tests__/set-permission-mode.test.ts +274 -0
  66. package/src/__tests__/skill-load-feature-flag.test.ts +12 -0
  67. package/src/__tests__/skill-memory.test.ts +2 -783
  68. package/src/__tests__/strip-memory-injections.test.ts +187 -0
  69. package/src/__tests__/subagent-detail.test.ts +84 -0
  70. package/src/__tests__/subagent-disposal.test.ts +308 -0
  71. package/src/__tests__/subagent-manager-notify.test.ts +19 -10
  72. package/src/__tests__/subagent-notify-parent.test.ts +390 -0
  73. package/src/__tests__/subagent-role-registry.test.ts +108 -0
  74. package/src/__tests__/subagent-tool-filtering.test.ts +71 -0
  75. package/src/__tests__/subagent-tools.test.ts +464 -4
  76. package/src/__tests__/system-prompt-ask-mode.test.ts +139 -0
  77. package/src/__tests__/task-memory-cleanup.test.ts +12 -12
  78. package/src/__tests__/terminal-tools.test.ts +17 -27
  79. package/src/__tests__/test-preload.ts +4 -0
  80. package/src/__tests__/tool-executor.test.ts +4 -26
  81. package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
  82. package/src/__tests__/top-level-renderer.test.ts +10 -13
  83. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +116 -2
  84. package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +387 -0
  85. package/src/agent/loop.ts +6 -0
  86. package/src/approvals/guardian-request-resolvers.ts +24 -0
  87. package/src/avatar/traits-png-sync.ts +3 -3
  88. package/src/cli/__tests__/run-assistant-command.ts +29 -0
  89. package/src/cli/commands/__tests__/email-download.test.ts +245 -0
  90. package/src/cli/commands/__tests__/email-list.test.ts +192 -0
  91. package/src/cli/commands/__tests__/email-register.test.ts +186 -0
  92. package/src/cli/commands/__tests__/email-send.test.ts +291 -0
  93. package/src/cli/commands/__tests__/email-status.test.ts +181 -0
  94. package/src/cli/commands/__tests__/email-unregister.test.ts +139 -0
  95. package/src/cli/commands/__tests__/routes.test.ts +562 -0
  96. package/src/cli/commands/conversations.ts +1 -8
  97. package/src/cli/commands/email.ts +584 -835
  98. package/src/cli/commands/memory.ts +1 -34
  99. package/src/cli/commands/notifications.ts +7 -2
  100. package/src/cli/commands/oauth/connect.ts +14 -5
  101. package/src/cli/commands/routes.ts +396 -0
  102. package/src/cli/commands/skills.ts +130 -20
  103. package/src/cli/program.ts +2 -0
  104. package/src/cli.ts +1 -120
  105. package/src/config/bundled-skills/app-builder/SKILL.md +4 -1
  106. package/src/config/bundled-skills/gmail/SKILL.md +2 -2
  107. package/src/config/bundled-skills/messaging/SKILL.md +7 -0
  108. package/src/config/bundled-skills/schedule/SKILL.md +22 -2
  109. package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
  110. package/src/config/bundled-skills/settings/tools/avatar-get.ts +3 -13
  111. package/src/config/bundled-skills/settings/tools/avatar-remove.ts +2 -4
  112. package/src/config/bundled-skills/settings/tools/avatar-update.ts +5 -2
  113. package/src/config/bundled-skills/slack/SKILL.md +2 -0
  114. package/src/config/bundled-skills/subagent/SKILL.md +43 -3
  115. package/src/config/bundled-skills/subagent/TOOLS.json +29 -4
  116. package/src/config/env-registry.ts +63 -0
  117. package/src/config/feature-flag-registry.json +17 -1
  118. package/src/config/schema.ts +8 -0
  119. package/src/config/schemas/filing.ts +51 -0
  120. package/src/config/schemas/heartbeat.ts +15 -12
  121. package/src/config/schemas/memory-lifecycle.ts +12 -0
  122. package/src/config/schemas/security.ts +14 -0
  123. package/src/daemon/app-source-watcher.ts +93 -0
  124. package/src/daemon/config-watcher.ts +79 -1
  125. package/src/daemon/conversation-agent-loop-handlers.ts +20 -0
  126. package/src/daemon/conversation-agent-loop.ts +158 -65
  127. package/src/daemon/conversation-history.ts +4 -19
  128. package/src/daemon/conversation-lifecycle.ts +8 -14
  129. package/src/daemon/conversation-process.ts +13 -7
  130. package/src/daemon/conversation-runtime-assembly.ts +300 -306
  131. package/src/daemon/conversation-tool-setup.ts +44 -14
  132. package/src/daemon/conversation-workspace.ts +1 -2
  133. package/src/daemon/conversation.ts +18 -0
  134. package/src/daemon/date-context.ts +26 -53
  135. package/src/daemon/first-greeting.ts +1 -1
  136. package/src/daemon/handlers/conversations.ts +4 -7
  137. package/src/daemon/handlers/shared.test.ts +143 -0
  138. package/src/daemon/handlers/shared.ts +63 -5
  139. package/src/daemon/handlers/skills.ts +11 -18
  140. package/src/daemon/lifecycle.ts +199 -157
  141. package/src/daemon/message-types/conversations.ts +25 -6
  142. package/src/daemon/message-types/messages.ts +9 -1
  143. package/src/daemon/message-types/schedules.ts +1 -0
  144. package/src/daemon/message-types/settings.ts +6 -0
  145. package/src/daemon/profiler-run-store.ts +557 -0
  146. package/src/daemon/server.ts +89 -9
  147. package/src/daemon/shutdown-handlers.ts +5 -0
  148. package/src/daemon/tool-side-effects.ts +23 -3
  149. package/src/export/transcript-formatter.ts +148 -0
  150. package/src/filing/filing-service.ts +228 -0
  151. package/src/heartbeat/heartbeat-service.ts +96 -7
  152. package/src/mcp/client.ts +6 -0
  153. package/src/mcp/mcp-oauth-provider.ts +149 -27
  154. package/src/memory/admin.ts +33 -32
  155. package/src/memory/app-store.ts +69 -0
  156. package/src/memory/conversation-bootstrap.ts +1 -1
  157. package/src/memory/conversation-crud.ts +136 -107
  158. package/src/memory/conversation-group-migration.ts +1 -1
  159. package/src/memory/conversation-queries.ts +58 -12
  160. package/src/memory/conversation-title-service.ts +1 -0
  161. package/src/memory/db-init.ts +182 -376
  162. package/src/memory/graph/bootstrap.ts +75 -66
  163. package/src/memory/graph/capability-seed.ts +167 -15
  164. package/src/memory/graph/consolidation.ts +38 -4
  165. package/src/memory/graph/conversation-graph-memory.ts +133 -104
  166. package/src/memory/graph/extraction-job.ts +9 -4
  167. package/src/memory/graph/extraction.ts +66 -23
  168. package/src/memory/graph/graph-memory-state-store.ts +37 -0
  169. package/src/memory/graph/graph-search.ts +29 -15
  170. package/src/memory/graph/injection.ts +38 -8
  171. package/src/memory/graph/inspect.ts +12 -3
  172. package/src/memory/graph/retriever.ts +365 -262
  173. package/src/memory/graph/store.test.ts +48 -0
  174. package/src/memory/graph/store.ts +150 -11
  175. package/src/memory/graph/tool-handlers.ts +84 -209
  176. package/src/memory/graph/tools.ts +8 -52
  177. package/src/memory/graph/types.ts +24 -0
  178. package/src/memory/job-handlers/cleanup.ts +44 -1
  179. package/src/memory/jobs-store.ts +70 -60
  180. package/src/memory/jobs-worker.ts +44 -28
  181. package/src/memory/llm-request-log-store.ts +96 -12
  182. package/src/memory/memory-recall-log-store.ts +49 -5
  183. package/src/memory/migrations/203-drop-memory-items-tables.ts +33 -1
  184. package/src/memory/migrations/206-memory-graph-node-edits.ts +19 -0
  185. package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +131 -0
  186. package/src/memory/migrations/207-conversation-graph-memory-state.ts +20 -0
  187. package/src/memory/migrations/208-conversations-last-message-at.ts +35 -0
  188. package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +85 -0
  189. package/src/memory/migrations/210-schedule-reuse-conversation.ts +13 -0
  190. package/src/memory/migrations/211-memory-recall-logs-query-context.ts +21 -0
  191. package/src/memory/migrations/212-llm-request-logs-created-at-index.ts +19 -0
  192. package/src/memory/migrations/index.ts +8 -0
  193. package/src/memory/migrations/registry.ts +8 -0
  194. package/src/memory/schema/conversations.ts +14 -0
  195. package/src/memory/schema/infrastructure.ts +8 -1
  196. package/src/memory/schema/memory-core.ts +0 -51
  197. package/src/memory/schema/memory-graph.ts +15 -0
  198. package/src/memory/task-memory-cleanup.ts +30 -11
  199. package/src/notifications/copy-composer.ts +86 -0
  200. package/src/notifications/decision-engine.ts +35 -0
  201. package/src/permissions/checker.ts +12 -1
  202. package/src/permissions/permission-mode-store.ts +180 -0
  203. package/src/permissions/permission-mode.ts +31 -0
  204. package/src/permissions/workspace-policy.ts +9 -0
  205. package/src/prompts/system-prompt.ts +59 -7
  206. package/src/prompts/templates/BOOTSTRAP-REFERENCE.md +100 -0
  207. package/src/prompts/templates/BOOTSTRAP.md +70 -165
  208. package/src/prompts/templates/HEARTBEAT.md +3 -1
  209. package/src/prompts/templates/SOUL.md +25 -4
  210. package/src/prompts/templates/UPDATES.md +8 -0
  211. package/src/providers/anthropic/client.ts +107 -219
  212. package/src/runtime/auth/route-policy.ts +23 -0
  213. package/src/runtime/http-server.ts +32 -2
  214. package/src/runtime/http-types.ts +12 -1
  215. package/src/runtime/migrations/vbundle-builder.ts +389 -3
  216. package/src/runtime/migrations/vbundle-importer.ts +8 -6
  217. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +378 -0
  218. package/src/runtime/routes/app-management-routes.ts +1 -11
  219. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +26 -0
  220. package/src/runtime/routes/archive-utils.ts +29 -0
  221. package/src/runtime/routes/avatar-routes.ts +2 -9
  222. package/src/runtime/routes/btw-routes.ts +14 -1
  223. package/src/runtime/routes/conversation-analysis-routes.ts +173 -0
  224. package/src/runtime/routes/conversation-management-routes.ts +1 -14
  225. package/src/runtime/routes/conversation-query-routes.ts +49 -3
  226. package/src/runtime/routes/conversation-routes.ts +264 -44
  227. package/src/runtime/routes/heartbeat-routes.ts +4 -10
  228. package/src/runtime/routes/identity-routes.ts +53 -18
  229. package/src/runtime/routes/llm-context-normalization.ts +14 -10
  230. package/src/runtime/routes/log-export-routes.ts +23 -275
  231. package/src/runtime/routes/memory-item-routes.test.ts +168 -233
  232. package/src/runtime/routes/migration-routes.ts +18 -7
  233. package/src/runtime/routes/profiler-routes.ts +350 -0
  234. package/src/runtime/routes/schedule-routes.ts +27 -12
  235. package/src/runtime/routes/settings-routes.ts +95 -8
  236. package/src/runtime/routes/subagents-routes.ts +28 -7
  237. package/src/runtime/routes/user-route-dispatcher.ts +223 -0
  238. package/src/runtime/routes/user-routes.ts +41 -0
  239. package/src/runtime/routes/workspace-routes.ts +0 -1
  240. package/src/schedule/schedule-store.ts +30 -0
  241. package/src/schedule/scheduler.ts +45 -18
  242. package/src/skills/catalog-install.ts +10 -2
  243. package/src/skills/managed-store.ts +2 -2
  244. package/src/skills/skill-memory.ts +1 -293
  245. package/src/subagent/index.ts +13 -3
  246. package/src/subagent/manager.ts +308 -29
  247. package/src/subagent/types.ts +68 -0
  248. package/src/tasks/task-runner.ts +4 -4
  249. package/src/tools/apps/executors.ts +29 -4
  250. package/src/tools/filesystem/list.ts +93 -0
  251. package/src/tools/permission-checker.ts +78 -0
  252. package/src/tools/registry.ts +4 -0
  253. package/src/tools/schedule/create.ts +3 -0
  254. package/src/tools/schedule/list.ts +1 -0
  255. package/src/tools/schedule/update.ts +6 -0
  256. package/src/tools/shared/filesystem/errors.ts +5 -0
  257. package/src/tools/shared/filesystem/file-ops-service.ts +90 -2
  258. package/src/tools/shared/filesystem/types.ts +17 -0
  259. package/src/tools/shared/shell-output.ts +31 -2
  260. package/src/tools/subagent/abort.ts +12 -2
  261. package/src/tools/subagent/message.ts +9 -2
  262. package/src/tools/subagent/notify-parent.ts +79 -0
  263. package/src/tools/subagent/read.ts +29 -8
  264. package/src/tools/subagent/resolve.ts +21 -0
  265. package/src/tools/subagent/spawn.ts +2 -0
  266. package/src/tools/subagent/status.ts +11 -1
  267. package/src/tools/system/avatar-generator.ts +3 -3
  268. package/src/tools/system/register.ts +23 -0
  269. package/src/tools/system/set-permission-mode.ts +103 -0
  270. package/src/tools/terminal/parser.ts +30 -5
  271. package/src/tools/terminal/safe-env.ts +16 -1
  272. package/src/tools/tool-manifest.ts +6 -0
  273. package/src/tools/types.ts +2 -0
  274. package/src/util/logger.ts +1 -1
  275. package/src/util/platform.ts +50 -17
  276. package/src/workspace/migrations/023-move-config-files-to-workspace.ts +2 -2
  277. package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +2 -2
  278. package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +270 -0
  279. package/src/workspace/migrations/029-seed-pkb.ts +84 -0
  280. package/src/workspace/migrations/registry.ts +4 -0
  281. package/src/workspace/top-level-renderer.ts +5 -9
  282. package/src/__tests__/cli-memory.test.ts +0 -377
  283. package/src/__tests__/clipboard.test.ts +0 -88
  284. package/src/cli/cli-memory.ts +0 -179
  285. package/src/util/clipboard.ts +0 -34
@@ -0,0 +1,173 @@
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
+ import { resolveLocalTrustContext } from "../local-actor-identity.js";
23
+
24
+ const log = getLogger("conversation-analysis-routes");
25
+
26
+ // ---------------------------------------------------------------------------
27
+ // Dependency types — injected by the daemon at wiring time
28
+ // ---------------------------------------------------------------------------
29
+
30
+ export interface ConversationAnalysisDeps {
31
+ sendMessageDeps: SendMessageDeps;
32
+ buildConversationDetailResponse: (
33
+ id: string,
34
+ ) => Record<string, unknown> | null;
35
+ }
36
+
37
+ // ---------------------------------------------------------------------------
38
+ // Route definitions
39
+ // ---------------------------------------------------------------------------
40
+
41
+ export function conversationAnalysisRouteDefinitions(
42
+ deps: ConversationAnalysisDeps,
43
+ ): RouteDefinition[] {
44
+ return [
45
+ {
46
+ endpoint: "conversations/:id/analyze",
47
+ method: "POST",
48
+ policyKey: "conversations/analyze",
49
+ summary: "Analyze a conversation",
50
+ description:
51
+ "Create a new conversation with a structured self-assessment of an existing conversation.",
52
+ tags: ["conversations"],
53
+ handler: async ({ params }) => {
54
+ // a. Resolve conversation ID
55
+ const resolvedId = resolveConversationId(params.id);
56
+ if (!resolvedId) {
57
+ return httpError(
58
+ "NOT_FOUND",
59
+ `Conversation ${params.id} not found`,
60
+ 404,
61
+ );
62
+ }
63
+
64
+ // b. Load the conversation
65
+ const conversation = getConversation(resolvedId);
66
+ if (!conversation) {
67
+ return httpError(
68
+ "NOT_FOUND",
69
+ `Conversation ${resolvedId} not found`,
70
+ 404,
71
+ );
72
+ }
73
+
74
+ // c. Reject private conversations
75
+ if (conversation.conversationType === "private") {
76
+ return httpError(
77
+ "FORBIDDEN",
78
+ "Private conversations cannot be analyzed",
79
+ 403,
80
+ );
81
+ }
82
+
83
+ // d. Check for messages
84
+ const existingMessages = getMessages(resolvedId);
85
+ if (existingMessages.length === 0) {
86
+ return httpError(
87
+ "BAD_REQUEST",
88
+ "Conversation has no messages to analyze",
89
+ 400,
90
+ );
91
+ }
92
+
93
+ // e. Build the analysis transcript
94
+ const { buildAnalysisTranscript } =
95
+ await import("../../export/transcript-formatter.js");
96
+ const transcript = buildAnalysisTranscript(resolvedId);
97
+
98
+ // f. Create a new conversation for the analysis
99
+ const newConv = createConversation({
100
+ title: `Analysis: ${conversation.title ?? "Untitled"}`,
101
+ });
102
+
103
+ // g. Build the analysis prompt
104
+ const prompt = `<transcript>
105
+ ${transcript}
106
+ </transcript>
107
+
108
+ Analyze the conversation above. Provide a structured self-assessment:
109
+
110
+ 1. **Summary**: What was the user trying to accomplish? What was the outcome?
111
+ 2. **What went well**: Effective tool usage, good reasoning, helpful responses, problem-solving patterns.
112
+ 3. **What went wrong**: Errors, unnecessary tool calls, incorrect assumptions, wasted turns, misunderstandings.
113
+ 4. **Root causes**: Why did failures happen? Missing context? Wrong approach? Tool limitations?
114
+ 5. **Recommendations**: Specific, actionable improvements for similar conversations next time.
115
+
116
+ Be honest and specific. Reference particular moments in the transcript. Focus on patterns that generalize beyond this specific conversation.
117
+
118
+ If you identify insights worth remembering for future conversations, use your memory tools to save them.`;
119
+
120
+ // h. Persist the user message
121
+ const message = await addMessage(
122
+ newConv.id,
123
+ "user",
124
+ JSON.stringify([{ type: "text", text: prompt }]),
125
+ { provenanceTrustClass: "guardian" as const },
126
+ );
127
+ const messageId = message.id;
128
+
129
+ // i. Load the conversation into memory and set guardian trust context
130
+ const analysisConversation =
131
+ await deps.sendMessageDeps.getOrCreateConversation(newConv.id);
132
+ analysisConversation.setTrustContext(resolveLocalTrustContext("vellum"));
133
+ await analysisConversation.ensureActorScopedHistory();
134
+
135
+ // j. Build onEvent using inline hub publisher
136
+ const onEvent = (msg: ServerMessage) => {
137
+ deps.sendMessageDeps.assistantEventHub.publish(
138
+ buildAssistantEvent(DAEMON_INTERNAL_ASSISTANT_ID, msg, newConv.id),
139
+ );
140
+ };
141
+
142
+ // k. Set up processing state (required by runAgentLoop guard)
143
+ analysisConversation.processing = true;
144
+ analysisConversation.abortController = new AbortController();
145
+ analysisConversation.currentRequestId = crypto.randomUUID();
146
+
147
+ // l. Fire-and-forget the agent loop
148
+ analysisConversation
149
+ .runAgentLoop(prompt, messageId, onEvent, {
150
+ isInteractive: false,
151
+ isUserMessage: true,
152
+ })
153
+ .catch((err) => {
154
+ log.error(
155
+ { err, conversationId: newConv.id },
156
+ "Analysis agent loop failed",
157
+ );
158
+ });
159
+
160
+ // m. Return the new conversation detail
161
+ const detail = deps.buildConversationDetailResponse(newConv.id);
162
+ if (!detail) {
163
+ return httpError(
164
+ "INTERNAL_ERROR",
165
+ `Analysis conversation ${newConv.id} could not be loaded`,
166
+ 500,
167
+ );
168
+ }
169
+ return Response.json(detail);
170
+ },
171
+ },
172
+ ];
173
+ }
@@ -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",