@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
@@ -4400,7 +4400,7 @@ describe("Permission Checker", () => {
4400
4400
  });
4401
4401
  });
4402
4402
 
4403
- describe("bash network_mode=proxied — no special-casing", () => {
4403
+ describe("bash network_mode=proxied — risk capped at medium", () => {
4404
4404
  beforeEach(() => {
4405
4405
  clearCache();
4406
4406
  testConfig.permissions = { mode: "workspace" };
@@ -4408,8 +4408,6 @@ describe("bash network_mode=proxied — no special-casing", () => {
4408
4408
  });
4409
4409
 
4410
4410
  test("proxied bash follows normal rules (auto-allowed by default rule)", async () => {
4411
- // Proxied bash is no longer force-prompted — the default allow-bash rule
4412
- // auto-allows low/medium risk commands regardless of network_mode.
4413
4411
  const result = await check(
4414
4412
  "bash",
4415
4413
  { command: "curl https://api.example.com", network_mode: "proxied" },
@@ -4418,6 +4416,41 @@ describe("bash network_mode=proxied — no special-casing", () => {
4418
4416
  expect(result.decision).toBe("allow");
4419
4417
  });
4420
4418
 
4419
+ test("proxied bash caps high-risk commands to medium", async () => {
4420
+ // pipe-to-interpreter (stdin exec) is normally High risk, but proxied mode caps at Medium
4421
+ const risk = await classifyRisk("bash", {
4422
+ command: "cat exploit.py | python3",
4423
+ network_mode: "proxied",
4424
+ });
4425
+ expect(risk).toBe(RiskLevel.Medium);
4426
+ });
4427
+
4428
+ test("pipe to python3 -c is not high risk (inline code, not stdin exec)", async () => {
4429
+ const risk = await classifyRisk("bash", {
4430
+ command: 'cat data.json | python3 -c "import sys; print(sys.stdin.read())"',
4431
+ });
4432
+ expect(risk).toBe(RiskLevel.Low);
4433
+ });
4434
+
4435
+ test("pipe to python3 without -c is high risk (stdin exec)", async () => {
4436
+ const risk = await classifyRisk("bash", {
4437
+ command: "cat exploit.py | python3",
4438
+ });
4439
+ expect(risk).toBe(RiskLevel.High);
4440
+ });
4441
+
4442
+ test("proxied bash with high-risk command is auto-allowed by default rule", async () => {
4443
+ const result = await check(
4444
+ "bash",
4445
+ {
4446
+ command: "cat exploit.py | python3",
4447
+ network_mode: "proxied",
4448
+ },
4449
+ "/tmp",
4450
+ );
4451
+ expect(result.decision).toBe("allow");
4452
+ });
4453
+
4421
4454
  test("host_bash with network_mode=proxied follows normal flow", async () => {
4422
4455
  addRule("host_bash", "**", "everywhere");
4423
4456
  const result = await check(
@@ -4790,15 +4823,14 @@ describe("workspace mode — auto-allow workspace-scoped operations", () => {
4790
4823
  }
4791
4824
  });
4792
4825
 
4793
- // ── proxied bash — follows normal rules (no special-casing) ──
4826
+ // ── proxied bash — risk capped at medium ──
4794
4827
 
4795
- test("bash with network_mode=proxied → allow (follows normal rules in workspace mode)", async () => {
4828
+ test("bash with network_mode=proxied → allow (risk capped at medium)", async () => {
4796
4829
  const result = await check(
4797
4830
  "bash",
4798
4831
  { command: "curl https://api.example.com", network_mode: "proxied" },
4799
4832
  workspaceDir,
4800
4833
  );
4801
- // Default allow-bash rule auto-allows; proxied mode is not special-cased.
4802
4834
  expect(result.decision).toBe("allow");
4803
4835
  });
4804
4836
 
@@ -169,6 +169,7 @@ describe("AssistantConfigSchema", () => {
169
169
  enqueueIntervalMs: 6 * 60 * 60 * 1000,
170
170
  supersededItemRetentionMs: 30 * 24 * 60 * 60 * 1000,
171
171
  conversationRetentionDays: 0,
172
+ llmRequestLogRetentionMs: 7 * 24 * 60 * 60 * 1000,
172
173
  });
173
174
  });
174
175
 
@@ -421,6 +422,8 @@ describe("AssistantConfigSchema", () => {
421
422
  const result = AssistantConfigSchema.parse({});
422
423
  expect(result.permissions).toEqual({
423
424
  mode: "workspace",
425
+ askBeforeActing: true,
426
+ hostAccess: false,
424
427
  });
425
428
  });
426
429
 
@@ -1128,6 +1131,8 @@ describe("loadConfig with schema validation", () => {
1128
1131
  const config = loadConfig();
1129
1132
  expect(config.permissions).toEqual({
1130
1133
  mode: "workspace",
1134
+ askBeforeActing: true,
1135
+ hostAccess: false,
1131
1136
  });
1132
1137
  });
1133
1138
 
@@ -206,11 +206,13 @@ mock.module("../daemon/conversation-memory.js", () => ({
206
206
  let mockApplyRuntimeInjections: (msgs: Message[]) => Message[] = (msgs) => msgs;
207
207
  mock.module("../daemon/conversation-runtime-assembly.js", () => ({
208
208
  applyRuntimeInjections: (msgs: Message[]) => mockApplyRuntimeInjections(msgs),
209
- stripInjectedContext: (msgs: Message[]) => msgs,
209
+ stripInjectionsForCompaction: (msgs: Message[]) => msgs,
210
+ findLastInjectedNowContent: () => null,
211
+ readNowScratchpad: () => null,
210
212
  }));
211
213
 
212
214
  mock.module("../daemon/date-context.js", () => ({
213
- buildTemporalContext: () => null,
215
+ formatTurnTimestamp: () => "2026-01-01 (Thu) 00:00:00 +00:00 (UTC)",
214
216
  }));
215
217
 
216
218
  mock.module("../daemon/history-repair.js", () => ({
@@ -226,10 +228,6 @@ mock.module("../daemon/history-repair.js", () => ({
226
228
  deepRepairHistory: (msgs: Message[]) => ({ messages: msgs, stats: {} }),
227
229
  }));
228
230
 
229
- mock.module("../daemon/conversation-history.js", () => ({
230
- consolidateAssistantMessages: () => {},
231
- }));
232
-
233
231
  const recordUsageMock = mock(() => {});
234
232
  mock.module("../daemon/conversation-usage.js", () => ({
235
233
  recordUsage: recordUsageMock,
@@ -195,11 +195,13 @@ mock.module("../daemon/conversation-memory.js", () => ({
195
195
 
196
196
  mock.module("../daemon/conversation-runtime-assembly.js", () => ({
197
197
  applyRuntimeInjections: (msgs: Message[]) => msgs,
198
- stripInjectedContext: (msgs: Message[]) => msgs,
198
+ stripInjectionsForCompaction: (msgs: Message[]) => msgs,
199
+ findLastInjectedNowContent: () => null,
200
+ readNowScratchpad: () => null,
199
201
  }));
200
202
 
201
203
  mock.module("../daemon/date-context.js", () => ({
202
- buildTemporalContext: () => null,
204
+ formatTurnTimestamp: () => "2026-01-01 (Thu) 00:00:00 +00:00 (UTC)",
203
205
  }));
204
206
 
205
207
  mock.module("../daemon/history-repair.js", () => ({
@@ -215,11 +217,6 @@ mock.module("../daemon/history-repair.js", () => ({
215
217
  deepRepairHistory: (msgs: Message[]) => ({ messages: msgs, stats: {} }),
216
218
  }));
217
219
 
218
- const consolidateAssistantMessagesMock = mock(() => false);
219
- mock.module("../daemon/conversation-history.js", () => ({
220
- consolidateAssistantMessages: consolidateAssistantMessagesMock,
221
- }));
222
-
223
220
  const recordUsageMock = mock(() => {});
224
221
  const recordRequestLogMock = mock(() => {});
225
222
  mock.module("../daemon/conversation-usage.js", () => ({
@@ -471,8 +468,6 @@ beforeEach(() => {
471
468
  recordRequestLogMock.mockClear();
472
469
  syncMessageToDiskMock.mockClear();
473
470
  rebuildConversationDiskViewFromDbStateMock.mockClear();
474
- consolidateAssistantMessagesMock.mockReset();
475
- consolidateAssistantMessagesMock.mockImplementation(() => false);
476
471
  });
477
472
 
478
473
  describe("session-agent-loop", () => {
@@ -1944,48 +1939,6 @@ describe("session-agent-loop", () => {
1944
1939
  expect(drainReason).toBe("loop_complete");
1945
1940
  });
1946
1941
 
1947
- test("rebuilds disk view after consolidation mutates persisted history", async () => {
1948
- consolidateAssistantMessagesMock.mockReturnValue(true);
1949
-
1950
- const ctx = makeCtx({
1951
- agentLoopRun: async (
1952
- messages: Message[],
1953
- onEvent: (event: AgentEvent) => void,
1954
- ) => {
1955
- onEvent({
1956
- type: "message_complete",
1957
- message: {
1958
- role: "assistant",
1959
- content: [{ type: "text", text: "done" }],
1960
- },
1961
- });
1962
- onEvent({
1963
- type: "usage",
1964
- inputTokens: 10,
1965
- outputTokens: 5,
1966
- model: "test",
1967
- providerDurationMs: 50,
1968
- });
1969
- return [
1970
- ...messages,
1971
- {
1972
- role: "assistant" as const,
1973
- content: [{ type: "text", text: "done" }] as ContentBlock[],
1974
- },
1975
- ];
1976
- },
1977
- });
1978
-
1979
- await runAgentLoopImpl(ctx, "hi", "msg-consolidate", () => {});
1980
-
1981
- expect(consolidateAssistantMessagesMock).toHaveBeenCalledWith(
1982
- "test-conv",
1983
- "msg-consolidate",
1984
- );
1985
- expect(rebuildConversationDiskViewFromDbStateMock).toHaveBeenCalledWith(
1986
- "test-conv",
1987
- );
1988
- });
1989
1942
  });
1990
1943
 
1991
1944
  describe("stale pending surface cleanup", () => {
@@ -41,7 +41,7 @@ mock.module("../memory/conversation-crud.js", () => ({
41
41
  deleteMessageById: (messageId: string) => {
42
42
  deletedMessageIds.push(messageId);
43
43
  dbMessages = dbMessages.filter((m) => m.id !== messageId);
44
- return { segmentIds: [], orphanedItemIds: [] };
44
+ return { segmentIds: [], deletedSummaryIds: [] };
45
45
  },
46
46
  updateMessageContent: (messageId: string, content: string) => {
47
47
  updatedMessages.push({ id: messageId, content });