@vellumai/assistant 0.12.1-dev.202609141913.5e16607 → 0.12.1-staging.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 (439) hide show
  1. package/AGENTS.md +0 -4
  2. package/ARCHITECTURE.md +12 -11
  3. package/docs/architecture/turn-actor.md +8 -15
  4. package/docs/guardian-request-flow.md +0 -16
  5. package/openapi.yaml +49 -291
  6. package/package.json +1 -1
  7. package/src/__tests__/always-loaded-tools-guard.test.ts +10 -18
  8. package/src/__tests__/app-compiler.test.ts +0 -6
  9. package/src/__tests__/app-control-tool-schemas.test.ts +2 -5
  10. package/src/__tests__/app-dir-path-guard.test.ts +3 -1
  11. package/src/__tests__/app-source-watcher.test.ts +218 -0
  12. package/src/{calls/__tests__ → __tests__}/call-controller.test.ts +82 -503
  13. package/src/__tests__/computer-use-skill-proxy-bridge.test.ts +2 -5
  14. package/src/__tests__/computer-use-tools.test.ts +5 -17
  15. package/src/__tests__/config-schema-cmd.test.ts +2 -2
  16. package/src/__tests__/config-schema.test.ts +29 -28
  17. package/src/__tests__/config-watcher-skill-reseed.test.ts +359 -0
  18. package/src/__tests__/config-watcher.test.ts +8 -23
  19. package/src/__tests__/connection-model-compat.test.ts +2 -2
  20. package/src/__tests__/conversation-key-store-disk-view.test.ts +1 -1
  21. package/src/__tests__/conversation-pairing.test.ts +0 -26
  22. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +10 -4
  23. package/src/__tests__/conversation-queue.test.ts +207 -48
  24. package/src/__tests__/conversation-retry-discard.test.ts +1 -54
  25. package/src/__tests__/conversation-skill-tools.test.ts +0 -27
  26. package/src/__tests__/conversation-surfaces-app-control.test.ts +3 -8
  27. package/src/__tests__/conversation-surfaces-task-progress.test.ts +0 -67
  28. package/src/__tests__/conversation-title-service.test.ts +10 -14
  29. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +5 -3
  30. package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -51
  31. package/src/__tests__/credential-record-retire.test.ts +1 -171
  32. package/src/__tests__/credential-routes.test.ts +3 -212
  33. package/src/__tests__/credential-security-invariants.test.ts +2 -4
  34. package/src/__tests__/cu-unified-flow.test.ts +2 -8
  35. package/src/__tests__/document-sync-tags.test.ts +0 -25
  36. package/src/__tests__/drain-kick-guard.test.ts +2 -0
  37. package/src/__tests__/drain-requeue-on-contention.test.ts +6 -0
  38. package/src/__tests__/evict-conversations-for-reload.test.ts +1 -1
  39. package/src/__tests__/host-bash-proxy.test.ts +45 -26
  40. package/src/__tests__/host-browser-proxy.test.ts +17 -6
  41. package/src/__tests__/host-file-proxy-targeted.test.ts +0 -23
  42. package/src/__tests__/host-file-proxy.test.ts +23 -11
  43. package/src/__tests__/host-transfer-proxy-targeted.test.ts +9 -30
  44. package/src/__tests__/llm-catalog-parity.test.ts +0 -25
  45. package/src/__tests__/mcp-auth-routes.test.ts +9 -6
  46. package/src/__tests__/mcp-config-secret-boundary.test.ts +136 -78
  47. package/src/__tests__/mcp-health-check.test.ts +11 -8
  48. package/src/__tests__/mcp-list-plugin-servers.test.ts +10 -8
  49. package/src/{calls/__tests__ → __tests__}/media-stream-audio-transcode.test.ts +1 -1
  50. package/src/{calls/__tests__ → __tests__}/media-stream-output.test.ts +8 -37
  51. package/src/{calls/__tests__ → __tests__}/media-stream-parser.test.ts +1 -1
  52. package/src/{calls/__tests__ → __tests__}/media-stream-server-integration.test.ts +57 -150
  53. package/src/{calls/__tests__ → __tests__}/media-stream-stt-session.test.ts +5 -5
  54. package/src/{calls/__tests__ → __tests__}/media-turn-detector.test.ts +1 -1
  55. package/src/__tests__/messages-after-tiebreaker.test.ts +0 -91
  56. package/src/__tests__/messages-read-boundary-guard.test.ts +1 -1
  57. package/src/__tests__/messaging-send-tool.test.ts +548 -355
  58. package/src/__tests__/model-intents.test.ts +0 -3
  59. package/src/__tests__/notification-vellum-adapter.test.ts +2 -85
  60. package/src/__tests__/outlook-messaging-provider.test.ts +6 -6
  61. package/src/__tests__/platform-callback-registration.test.ts +16 -8
  62. package/src/__tests__/platform-client-verify-credential.test.ts +0 -2
  63. package/src/__tests__/plugin-import-boundary-guard.test.ts +0 -13
  64. package/src/__tests__/script-proxy-certs.test.ts +0 -35
  65. package/src/__tests__/skill-feature-flags-integration.test.ts +1 -1
  66. package/src/__tests__/skill-feature-flags.test.ts +2 -2
  67. package/src/__tests__/speaker-identification.test.ts +56 -0
  68. package/src/__tests__/subagent-tool-gate-mode.test.ts +3 -19
  69. package/src/__tests__/subagent-tools.test.ts +2 -3
  70. package/src/__tests__/telephony-tts-guard.test.ts +3 -38
  71. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +0 -4
  72. package/src/{calls/__tests__/voice-session-bridge-turn-flow.test.ts → __tests__/voice-session-bridge.test.ts} +12 -20
  73. package/src/__tests__/watch-retro-tool-availability.test.ts +17 -8
  74. package/src/__tests__/workspace-git-service.test.ts +0 -26
  75. package/src/acp/__tests__/agent-process.test.ts +4 -258
  76. package/src/acp/__tests__/auth-required.test.ts +0 -96
  77. package/src/acp/__tests__/client-handler.test.ts +2 -90
  78. package/src/acp/__tests__/session-manager-persistence.test.ts +1 -5
  79. package/src/acp/__tests__/session-manager-resume.test.ts +6 -270
  80. package/src/acp/__tests__/session-manager-usage.test.ts +2 -4
  81. package/src/acp/__tests__/session-manager.test.ts +4 -895
  82. package/src/acp/agent-process.test.ts +1 -4
  83. package/src/acp/agent-process.ts +9 -94
  84. package/src/acp/auth-required.ts +1 -50
  85. package/src/acp/auto-install.test.ts +7 -9
  86. package/src/acp/client-handler.ts +3 -16
  87. package/src/acp/resolve-agent.test.ts +6 -220
  88. package/src/acp/resolve-agent.ts +23 -88
  89. package/src/acp/session-manager.test.ts +3 -196
  90. package/src/acp/session-manager.ts +18 -441
  91. package/src/acp/types.ts +5 -50
  92. package/src/api/events/app-files-changed.ts +3 -4
  93. package/src/api/events/notification-intent.ts +0 -2
  94. package/src/api/index.ts +0 -6
  95. package/src/apps/app-store.ts +1 -1
  96. package/src/bundler/app-compiler.ts +0 -15
  97. package/src/calls/__tests__/voice-control-protocol.test.ts +25 -58
  98. package/src/calls/__tests__/voice-session-bridge.test.ts +1 -37
  99. package/src/calls/__tests__/voice-triage-escalate.test.ts +0 -105
  100. package/src/calls/call-constants.ts +4 -24
  101. package/src/calls/call-controller.ts +199 -499
  102. package/src/calls/call-transport.ts +0 -16
  103. package/src/calls/media-stream-output.ts +0 -32
  104. package/src/calls/media-stream-server.ts +30 -82
  105. package/src/calls/media-stream-stt-session.ts +0 -15
  106. package/src/calls/resolve-call-tts-provider.ts +2 -33
  107. package/src/calls/speaker-identification.ts +233 -0
  108. package/src/calls/tts-call-strategy.ts +5 -9
  109. package/src/calls/types.ts +0 -2
  110. package/src/calls/voice-control-protocol.ts +21 -53
  111. package/src/calls/voice-session-bridge.ts +46 -59
  112. package/src/calls/voice-triage-escalate.ts +56 -175
  113. package/src/cli/commands/apps.help.ts +13 -67
  114. package/src/cli/commands/apps.ts +0 -183
  115. package/src/cli/commands/bash.help.ts +13 -8
  116. package/src/cli/commands/bash.ts +25 -7
  117. package/src/cli/commands/channels/index.help.ts +2 -70
  118. package/src/cli/commands/channels/index.ts +3 -16
  119. package/src/cli/commands/credentials.help.ts +2 -6
  120. package/src/cli/commands/credentials.ts +2 -2
  121. package/src/cli/commands/mcp.help.ts +8 -8
  122. package/src/cli/commands/mcp.ts +1 -1
  123. package/src/cli/commands/roadmap.help.ts +1 -5
  124. package/src/cli/commands/roadmap.ts +1 -1
  125. package/src/cli/lib/bundled-marketplace.json +90 -103
  126. package/src/config/__tests__/default-profile-catalog.test.ts +0 -22
  127. package/src/config/__tests__/memory-retrospective-schema.test.ts +1 -15
  128. package/src/config/__tests__/platform-rehydration.test.ts +9 -99
  129. package/src/config/acp-defaults.test.ts +3 -13
  130. package/src/config/acp-defaults.ts +6 -23
  131. package/src/config/acp-schema.ts +2 -30
  132. package/src/config/bundled-skills/acp/SKILL.md +14 -22
  133. package/src/config/bundled-skills/acp/TOOLS.json +1 -5
  134. package/src/config/bundled-skills/app-builder/SKILL.md +9 -12
  135. package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +1 -1
  136. package/src/config/bundled-skills/messaging/SKILL.md +3 -3
  137. package/src/config/bundled-skills/messaging/TOOLS.json +3 -3
  138. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +139 -67
  139. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +1 -1
  140. package/src/config/bundled-skills/schedule/SKILL.md +4 -3
  141. package/src/config/bundled-skills/screen-annotation/SKILL.md +1 -8
  142. package/src/config/bundled-skills/screen-annotation/tools/screen-annotation.test.ts +1 -4
  143. package/src/config/bundled-skills/skill-management/TOOLS.json +2 -2
  144. package/src/config/default-profile-catalog.ts +1 -1
  145. package/src/config/env.ts +2 -2
  146. package/src/config/feature-flag-registry.json +12 -24
  147. package/src/config/loader.ts +0 -1
  148. package/src/config/memory-v3-gate.test.ts +0 -31
  149. package/src/config/memory-v3-gate.ts +16 -20
  150. package/src/config/platform-rehydration.ts +27 -11
  151. package/src/config/schema.ts +2 -2
  152. package/src/config/schemas/__tests__/live-voice.test.ts +158 -8
  153. package/src/config/schemas/calls.ts +28 -1
  154. package/src/config/schemas/live-voice.ts +173 -1
  155. package/src/config/schemas/mcp.ts +1 -1
  156. package/src/config/schemas/memory-retrospective.ts +0 -10
  157. package/src/config/schemas/services.ts +0 -8
  158. package/src/config/schemas/skills.ts +14 -0
  159. package/src/credential-execution/process-manager.test.ts +19 -18
  160. package/src/daemon/__tests__/conversation-tool-setup.test.ts +121 -66
  161. package/src/daemon/__tests__/plugin-mcp-reconcile.test.ts +1 -4
  162. package/src/daemon/app-source-watcher.ts +218 -0
  163. package/src/daemon/config-watcher.ts +194 -13
  164. package/src/daemon/conversation-process.ts +64 -35
  165. package/src/daemon/conversation-skill-tools.ts +31 -13
  166. package/src/daemon/conversation-store.ts +1 -1
  167. package/src/daemon/conversation-surfaces.ts +8 -10
  168. package/src/daemon/conversation-tool-setup.ts +43 -37
  169. package/src/daemon/conversation.ts +3 -0
  170. package/src/daemon/host-bash-proxy.ts +12 -8
  171. package/src/daemon/host-browser-proxy.ts +1 -15
  172. package/src/daemon/host-file-proxy.ts +10 -8
  173. package/src/daemon/host-transfer-proxy.ts +18 -14
  174. package/src/daemon/lifecycle.ts +5 -0
  175. package/src/daemon/mcp-reload-service.ts +5 -5
  176. package/src/daemon/message-types/sync.ts +0 -1
  177. package/src/daemon/orphan-reaper.ts +1 -1
  178. package/src/daemon/providers-setup.ts +1 -1
  179. package/src/daemon/shutdown-handlers.ts +9 -1
  180. package/src/daemon/skill-memory-refresh.ts +0 -64
  181. package/src/daemon/tool-side-effects.ts +18 -7
  182. package/src/home/__tests__/feed-writer.test.ts +0 -22
  183. package/src/home/feed-writer.ts +2 -11
  184. package/src/hooks/types.ts +0 -33
  185. package/src/inbound/platform-callback-registration.ts +5 -4
  186. package/src/live-voice/__tests__/live-voice-metrics.test.ts +3 -0
  187. package/src/live-voice/__tests__/live-voice-progress.test.ts +15 -15
  188. package/src/live-voice/__tests__/live-voice-vad.test.ts +2 -2
  189. package/src/{calls → live-voice}/__tests__/progress-narration.test.ts +4 -4
  190. package/src/{calls → live-voice}/__tests__/progress-phrases.test.ts +1 -1
  191. package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +69 -13
  192. package/src/live-voice/live-voice-session.ts +693 -213
  193. package/src/{calls → live-voice}/progress-narration.ts +2 -2
  194. package/src/live-voice/protocol.ts +2 -0
  195. package/src/mcp/__tests__/effective-config.test.ts +2 -2
  196. package/src/mcp/effective-config.ts +3 -3
  197. package/src/mcp/mcp-header-store.ts +45 -29
  198. package/src/mcp/startup.ts +4 -8
  199. package/src/messaging/provider.ts +3 -10
  200. package/src/messaging/providers/callback-routing.ts +0 -18
  201. package/src/messaging/providers/channel-transport.ts +0 -56
  202. package/src/messaging/providers/discord/transport.ts +0 -17
  203. package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +17 -6
  204. package/src/messaging/providers/slack/adapter.ts +44 -7
  205. package/src/messaging/providers/slack/transport.ts +0 -16
  206. package/src/messaging/providers/telegram-bot/adapter.ts +48 -1
  207. package/src/messaging/providers/telegram-bot/client.ts +26 -0
  208. package/src/messaging/providers/telegram-bot/transport.ts +0 -20
  209. package/src/messaging/providers/whatsapp/adapter.ts +48 -1
  210. package/src/messaging/providers/whatsapp/client.ts +29 -0
  211. package/src/messaging/providers/whatsapp/transport.ts +0 -18
  212. package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +0 -8
  213. package/src/notifications/__tests__/assistant-reply-producer.test.ts +0 -55
  214. package/src/notifications/__tests__/guardian-feed-projection.test.ts +2 -158
  215. package/src/notifications/__tests__/home-feed-side-effect.test.ts +3 -153
  216. package/src/notifications/__tests__/schedule-result-producer.test.ts +3 -99
  217. package/src/notifications/adapters/macos.ts +0 -3
  218. package/src/notifications/assistant-reply-producer.ts +3 -8
  219. package/src/notifications/conversation-pairing.ts +16 -36
  220. package/src/notifications/delivered-post-record.ts +1 -11
  221. package/src/notifications/guardian-feed-projection.ts +5 -125
  222. package/src/notifications/home-feed-side-effect.ts +7 -55
  223. package/src/notifications/schedule-result-producer.ts +22 -66
  224. package/src/oauth/__tests__/seed-providers-managed.test.ts +0 -54
  225. package/src/oauth/byo-connection.test.ts +0 -45
  226. package/src/oauth/byo-connection.ts +6 -36
  227. package/src/oauth/connection-resolver.test.ts +0 -73
  228. package/src/oauth/connection-resolver.ts +2 -95
  229. package/src/oauth/seed-providers.ts +0 -165
  230. package/src/outbound-proxy/certs.ts +5 -3
  231. package/src/permissions/checker.test.ts +6 -11
  232. package/src/persistence/compaction-log-store-clickhouse.ts +3 -3
  233. package/src/persistence/conversation-crud.ts +63 -71
  234. package/src/persistence/conversation-lineage.ts +4 -12
  235. package/src/persistence/conversation-title-service.ts +26 -9
  236. package/src/persistence/llm-request-log-sink-clickhouse.ts +3 -3
  237. package/src/persistence/llm-request-log-source-clickhouse.ts +3 -3
  238. package/src/persistence/message-reads.ts +0 -30
  239. package/src/persistence/migrations/157-invite-contact-id.ts +6 -18
  240. package/src/persistence/schema/memory-core.ts +0 -5
  241. package/src/platform/client.test.ts +2 -4
  242. package/src/platform/client.ts +10 -2
  243. package/src/plugin-api/constants.ts +0 -2
  244. package/src/plugin-api/index.ts +0 -1
  245. package/src/plugin-api/types.ts +0 -2
  246. package/src/plugins/defaults/index.ts +0 -2
  247. package/src/plugins/defaults/memory/__tests__/memory-retrospective-accounting.test.ts +0 -46
  248. package/src/plugins/defaults/memory/__tests__/memory-retrospective-enqueue.test.ts +5 -9
  249. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +10 -20
  250. package/src/plugins/defaults/memory/__tests__/memory-retrospective-state.test.ts +0 -219
  251. package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +0 -31
  252. package/src/plugins/defaults/memory/__tests__/memory-retrospective-trigger-check.test.ts +0 -63
  253. package/src/plugins/defaults/memory/__tests__/shutdown-hook.test.ts +0 -4
  254. package/src/plugins/defaults/memory/graph/capability-seed.ts +6 -4
  255. package/src/plugins/defaults/memory/hooks/init.ts +0 -10
  256. package/src/plugins/defaults/memory/hooks/shutdown.ts +0 -2
  257. package/src/plugins/defaults/memory/jobs-worker.ts +0 -13
  258. package/src/plugins/defaults/memory/memory-retrospective-accounting.ts +60 -34
  259. package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +5 -3
  260. package/src/plugins/defaults/memory/memory-retrospective-job.ts +3 -12
  261. package/src/plugins/defaults/memory/memory-retrospective-state.ts +71 -312
  262. package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +1 -2
  263. package/src/plugins/defaults/memory/memory-retrospective-trigger-check.ts +3 -5
  264. package/src/plugins/defaults/memory/startup.ts +1 -6
  265. package/src/plugins/defaults/memory/substrate/__tests__/skill-content.test.ts +9 -7
  266. package/src/plugins/defaults/memory/substrate/skill-content.ts +2 -2
  267. package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +0 -89
  268. package/src/plugins/defaults/memory/worker.ts +0 -6
  269. package/src/plugins/mcp-servers.ts +75 -15
  270. package/src/providers/__tests__/connection-model-compat.test.ts +3 -3
  271. package/src/providers/gemini/client.ts +23 -9
  272. package/src/providers/inference/auth.ts +3 -2
  273. package/src/providers/inference/connection-availability.ts +8 -27
  274. package/src/providers/inference/resolve-auth.ts +4 -22
  275. package/src/providers/model-catalog.ts +0 -34
  276. package/src/providers/model-intents.ts +5 -10
  277. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +18 -146
  278. package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +1 -83
  279. package/src/providers/openai/chat-completions-provider.ts +78 -192
  280. package/src/providers/openai/codex-models.ts +4 -0
  281. package/src/runtime/AGENTS.md +0 -2
  282. package/src/runtime/auth/same-actor.ts +3 -38
  283. package/src/runtime/http-server.ts +151 -160
  284. package/src/runtime/routes/__tests__/acp-routes.test.ts +4 -159
  285. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +1 -108
  286. package/src/runtime/routes/__tests__/default-provider-routes.test.ts +2 -2
  287. package/src/runtime/routes/__tests__/mcp-add-default-risk.test.ts +12 -16
  288. package/src/runtime/routes/acp-routes.test.ts +0 -15
  289. package/src/runtime/routes/acp-routes.ts +9 -72
  290. package/src/runtime/routes/app-management-routes.ts +0 -73
  291. package/src/runtime/routes/app-routes.ts +1 -1
  292. package/src/runtime/routes/conversation-list-routes.ts +3 -14
  293. package/src/runtime/routes/conversation-query-routes.ts +0 -40
  294. package/src/runtime/routes/credential-routes.ts +10 -19
  295. package/src/runtime/routes/debug-bash-routes.ts +173 -0
  296. package/src/runtime/routes/diagnostics-routes.ts +3 -55
  297. package/src/runtime/routes/index.ts +2 -4
  298. package/src/runtime/routes/log-export-routes.ts +0 -2
  299. package/src/runtime/routes/mcp-auth-routes.ts +47 -39
  300. package/src/runtime/routes/migration-routes.ts +20 -6
  301. package/src/runtime/routes/platform-routes.ts +15 -18
  302. package/src/runtime/services/__tests__/conversation-serializer.test.ts +0 -28
  303. package/src/runtime/services/conversation-serializer.ts +3 -16
  304. package/src/runtime/sync/resource-sync-events.ts +1 -2
  305. package/src/schedule/worker.ts +1 -1
  306. package/src/security/ces-rpc-record-backend.ts +0 -7
  307. package/src/subagent/consult-context.ts +25 -12
  308. package/src/tools/acp/list-agents.test.ts +1 -3
  309. package/src/tools/acp/spawn.test.ts +11 -146
  310. package/src/tools/acp/spawn.ts +3 -21
  311. package/src/tools/acp/status.ts +3 -40
  312. package/src/tools/app-control/skill-proxy-bridge.ts +1 -2
  313. package/src/tools/capability-offer.test.ts +2 -22
  314. package/src/tools/capability-offer.ts +1 -16
  315. package/src/tools/computer-use/definitions.ts +2 -4
  316. package/src/tools/computer-use/skill-proxy-bridge.ts +1 -2
  317. package/src/tools/credentials/metadata-store.ts +0 -100
  318. package/src/tools/host-filesystem/edit.test.ts +1 -2
  319. package/src/tools/host-filesystem/edit.ts +2 -2
  320. package/src/tools/host-filesystem/read.test.ts +1 -2
  321. package/src/tools/host-filesystem/read.ts +2 -2
  322. package/src/tools/host-filesystem/transfer.test.ts +1 -2
  323. package/src/tools/host-filesystem/transfer.ts +2 -2
  324. package/src/tools/host-filesystem/write.test.ts +1 -2
  325. package/src/tools/host-filesystem/write.ts +2 -2
  326. package/src/tools/host-terminal/host-shell.test.ts +0 -16
  327. package/src/tools/host-terminal/host-shell.ts +20 -4
  328. package/src/tools/policy-context.ts +7 -6
  329. package/src/tools/subagent/spawn.ts +8 -5
  330. package/src/tools/watch/watch-retro-report.ts +8 -0
  331. package/src/util/__tests__/language-subtag.test.ts +1 -23
  332. package/src/util/fs-watcher-error.ts +36 -0
  333. package/src/util/language-subtag.ts +0 -16
  334. package/src/util/platform.ts +0 -8
  335. package/src/workspace/git-service.ts +54 -5
  336. package/src/workspace/migrations/registry.ts +0 -6
  337. package/scripts/smoke-desktop-window-theme.ts +0 -186
  338. package/src/__tests__/git-porcelain.test.ts +0 -47
  339. package/src/__tests__/helpers/set-workspace-mcp.ts +0 -11
  340. package/src/__tests__/message-deleted-hook-dispatch.test.ts +0 -119
  341. package/src/__tests__/resolve-app.test.ts +0 -135
  342. package/src/__tests__/service-account-token.test.ts +0 -247
  343. package/src/__tests__/source-fingerprint.test.ts +0 -184
  344. package/src/__tests__/workspace-migration-154-repair-retired-codex-gpt-5-4-model-ids.test.ts +0 -336
  345. package/src/acp/__tests__/helpers/acp-model-option.ts +0 -51
  346. package/src/acp/model-config.test.ts +0 -166
  347. package/src/acp/model-config.ts +0 -138
  348. package/src/api/events/acp-session-model-update.test.ts +0 -88
  349. package/src/api/events/acp-session-model-update.ts +0 -46
  350. package/src/apps/resolve-app.ts +0 -81
  351. package/src/apps/source-fingerprint.ts +0 -266
  352. package/src/calls/__tests__/barge-in-guard.test.ts +0 -81
  353. package/src/calls/__tests__/voice-leg-coordinator.test.ts +0 -229
  354. package/src/calls/__tests__/voice-progress-cadence.test.ts +0 -274
  355. package/src/calls/barge-in-guard.ts +0 -118
  356. package/src/calls/voice-leg-coordinator.ts +0 -189
  357. package/src/calls/voice-progress-cadence.ts +0 -423
  358. package/src/cli/commands/__tests__/apps.test.ts +0 -245
  359. package/src/cli/commands/__tests__/bash.test.ts +0 -53
  360. package/src/cli/commands/__tests__/roadmap.help.test.ts +0 -19
  361. package/src/cli/commands/channels/__tests__/send.test.ts +0 -218
  362. package/src/cli/commands/channels/send.ts +0 -128
  363. package/src/config/__tests__/platform-identity.test.ts +0 -255
  364. package/src/config/acp-agent-write.ts +0 -43
  365. package/src/config/acp-schema.test.ts +0 -81
  366. package/src/config/platform-identity.ts +0 -201
  367. package/src/config/schemas/__tests__/voice.test.ts +0 -148
  368. package/src/config/schemas/voice.ts +0 -150
  369. package/src/daemon/__tests__/skill-memory-refresh-mtime.test.ts +0 -133
  370. package/src/daemon/app-change-notify.ts +0 -45
  371. package/src/desktop/__tests__/fake-desktop.ts +0 -119
  372. package/src/desktop/desktop-chrome-policy.test.ts +0 -71
  373. package/src/desktop/desktop-chrome-policy.ts +0 -42
  374. package/src/desktop/desktop-dependencies.test.ts +0 -102
  375. package/src/desktop/desktop-dependencies.ts +0 -306
  376. package/src/desktop/desktop-feature.test.ts +0 -18
  377. package/src/desktop/desktop-feature.ts +0 -19
  378. package/src/desktop/desktop-panel-config.test.ts +0 -135
  379. package/src/desktop/desktop-panel-config.ts +0 -149
  380. package/src/desktop/desktop-session-manager.test.ts +0 -627
  381. package/src/desktop/desktop-session-manager.ts +0 -814
  382. package/src/desktop/desktop-stream-bridge.test.ts +0 -395
  383. package/src/desktop/desktop-stream-bridge.ts +0 -214
  384. package/src/desktop/desktop-wallpaper.test.ts +0 -191
  385. package/src/desktop/desktop-wallpaper.ts +0 -113
  386. package/src/desktop/desktop-window-theme.ts +0 -170
  387. package/src/i18n/AGENTS.md +0 -22
  388. package/src/i18n/__tests__/i18n.test.ts +0 -108
  389. package/src/i18n/index.ts +0 -16
  390. package/src/i18n/locales.ts +0 -93
  391. package/src/i18n/messages.ts +0 -61
  392. package/src/i18n/title.ts +0 -25
  393. package/src/mcp/__tests__/workspace-mcp-config.test.ts +0 -135
  394. package/src/mcp/spec-schema.ts +0 -111
  395. package/src/mcp/workspace-mcp-config.ts +0 -188
  396. package/src/messaging/providers/__tests__/proactive-address.test.ts +0 -95
  397. package/src/persistence/conversation-title-placeholders.ts +0 -23
  398. package/src/persistence/message-cursor.ts +0 -78
  399. package/src/persistence/migrations/__tests__/157-invite-contact-id.test.ts +0 -149
  400. package/src/plugins/defaults/memory/__tests__/memory-retrospective-cursor-backfill.test.ts +0 -118
  401. package/src/plugins/defaults/memory/__tests__/memory-retrospective-cursor-preserve.test.ts +0 -83
  402. package/src/plugins/defaults/memory/hooks/message-deleted.ts +0 -21
  403. package/src/plugins/defaults/memory/memory-retrospective-cursor-backfill.ts +0 -126
  404. package/src/plugins/defaults/memory/memory-retrospective-cursor-preserve.ts +0 -79
  405. package/src/plugins/defaults/memory/memory-retrospective-cursor.ts +0 -28
  406. package/src/plugins/defaults/memory/skill-md-mtime-poll.ts +0 -9
  407. package/src/providers/gemini-thought-signature.test.ts +0 -63
  408. package/src/providers/gemini-thought-signature.ts +0 -44
  409. package/src/providers/inference/service-account-token.ts +0 -248
  410. package/src/providers/openai/__tests__/chat-completions-provider-thought-signature.test.ts +0 -613
  411. package/src/providers/openai/__tests__/google-thought-signature.test.ts +0 -235
  412. package/src/providers/openai/google-thought-signature.ts +0 -320
  413. package/src/runtime/__tests__/channel-send.test.ts +0 -443
  414. package/src/runtime/__tests__/desktop-stream-upgrade.test.ts +0 -89
  415. package/src/runtime/__tests__/live-voice-upgrade.test.ts +0 -58
  416. package/src/runtime/__tests__/runtime-ws-test-utils.ts +0 -72
  417. package/src/runtime/__tests__/watch-stream-upgrade.test.ts +0 -59
  418. package/src/runtime/channel-send.ts +0 -316
  419. package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +0 -205
  420. package/src/runtime/routes/__tests__/channel-send-routes.test.ts +0 -127
  421. package/src/runtime/routes/__tests__/dictation-cleanup-guard.test.ts +0 -107
  422. package/src/runtime/routes/channel-send-routes.ts +0 -85
  423. package/src/runtime/routes/desktop-setup-routes.test.ts +0 -74
  424. package/src/runtime/routes/desktop-setup-routes.ts +0 -35
  425. package/src/security/__tests__/ces-http-record-backend.test.ts +0 -137
  426. package/src/security/ces-http-record-backend.ts +0 -120
  427. package/src/skills/__tests__/workspace-skill-md-signature.test.ts +0 -60
  428. package/src/skills/workspace-skill-md-signature.ts +0 -50
  429. package/src/tools/acp/status.test.ts +0 -94
  430. package/src/tools/terminal/__tests__/sanitized-bash.test.ts +0 -57
  431. package/src/tools/terminal/sanitized-bash.ts +0 -105
  432. package/src/util/ca-bundle.ts +0 -13
  433. package/src/workspace/git-porcelain.ts +0 -66
  434. package/src/workspace/migrations/154-repair-retired-codex-gpt-5-4-model-ids.ts +0 -258
  435. package/src/workspace/migrations/155-move-front-model-config-to-voice.ts +0 -78
  436. package/src/workspace/migrations/156-extract-workspace-mcp-json.ts +0 -214
  437. package/src/workspace/migrations/__tests__/155-move-front-model-config-to-voice.test.ts +0 -102
  438. package/src/workspace/migrations/__tests__/156-extract-workspace-mcp-json.test.ts +0 -199
  439. /package/src/{calls → live-voice}/progress-phrases.ts +0 -0
@@ -412,34 +412,3 @@ describe("listSweepCandidateConversationIds", () => {
412
412
  ]);
413
413
  });
414
414
  });
415
-
416
- describe("runRetrospectiveSweep: cursor survives a regenerated reply", () => {
417
- beforeEach(() => {
418
- resetTables();
419
- enqueueCalls = [];
420
- enqueueDeclines = new Set();
421
- });
422
-
423
- test("a stale conversation whose cursor row was regenerated away is still swept", async () => {
424
- const conv = createConversation({ id: "conv-a" });
425
- insertMessage(conv.id, { createdAt: 1_000 });
426
- const reply = insertMessage(conv.id, {
427
- role: "assistant",
428
- createdAt: 2_000,
429
- });
430
- await upsertRetrospectiveState({
431
- conversationId: conv.id,
432
- lastProcessedMessageId: reply,
433
- lastProcessedCreatedAt: 2_000,
434
- lastRunAt: Date.now() - SWEEP_INTERVAL_MS - 60_000,
435
- });
436
- getDb().delete(messages).where(eq(messages.id, reply)).run();
437
- insertMessage(conv.id, { role: "assistant", createdAt: 3_000 });
438
-
439
- await runRetrospectiveSweep(makeConfig());
440
-
441
- expect(enqueueCalls).toEqual([
442
- { conversationId: conv.id, trigger: "sweep" },
443
- ]);
444
- });
445
- });
@@ -12,8 +12,6 @@ mock.module("../memory-retrospective-enqueue.js", () => ({
12
12
  },
13
13
  }));
14
14
 
15
- import { eq } from "drizzle-orm";
16
-
17
15
  import type { AssistantConfig } from "../../../../config/types.js";
18
16
  import { createConversation } from "../../../../persistence/conversation-crud.js";
19
17
  import {
@@ -309,64 +307,3 @@ describe("maybeEnqueueRetrospective — kind-aware accounting", () => {
309
307
  ]);
310
308
  });
311
309
  });
312
-
313
- // ---------------------------------------------------------------------------
314
- // maybeEnqueueRetrospective: the cursor survives a regenerated reply.
315
- //
316
- // The cursor normally lands on the latest assistant reply, and a regenerate
317
- // deletes exactly that row. With its `createdAt` persisted the cursor still
318
- // bounds the count, so the conversation keeps getting retrospectives.
319
- // ---------------------------------------------------------------------------
320
-
321
- describe("maybeEnqueueRetrospective: cursor survives a regenerated reply", () => {
322
- beforeEach(() => {
323
- resetTables();
324
- enqueueCalls = [];
325
- });
326
-
327
- test("a regenerate that deletes the cursor's row does not stall the conversation", async () => {
328
- const conv = createConversation("conv");
329
- insertMessage(conv.id, { createdAt: 1_000 });
330
- const reply = insertMessage(conv.id, {
331
- role: "assistant",
332
- createdAt: 2_000,
333
- });
334
- await upsertRetrospectiveState({
335
- conversationId: conv.id,
336
- lastProcessedMessageId: reply,
337
- lastProcessedCreatedAt: 2_000,
338
- lastRunAt: Date.now() - 24 * 60 * 60_000,
339
- });
340
- // Regenerate: the retry route discards the latest assistant turn, then
341
- // a fresh reply and the next user message land.
342
- getDb().delete(messages).where(eq(messages.id, reply)).run();
343
- insertMessage(conv.id, { role: "assistant", createdAt: 3_000 });
344
- insertMessage(conv.id, { createdAt: 4_000 });
345
-
346
- maybeEnqueueRetrospective(conv.id, makeConfig());
347
-
348
- expect(enqueueCalls).toEqual([
349
- { conversationId: conv.id, trigger: "interval" },
350
- ]);
351
- });
352
-
353
- test("a cursor written without a timestamp still goes quiet once its row is gone", async () => {
354
- const conv = createConversation("conv");
355
- insertMessage(conv.id, { createdAt: 1_000 });
356
- const reply = insertMessage(conv.id, {
357
- role: "assistant",
358
- createdAt: 2_000,
359
- });
360
- await upsertRetrospectiveState({
361
- conversationId: conv.id,
362
- lastProcessedMessageId: reply,
363
- lastRunAt: Date.now() - 24 * 60 * 60_000,
364
- });
365
- getDb().delete(messages).where(eq(messages.id, reply)).run();
366
- insertMessage(conv.id, { createdAt: 4_000 });
367
-
368
- maybeEnqueueRetrospective(conv.id, makeConfig());
369
-
370
- expect(enqueueCalls).toEqual([]);
371
- });
372
- });
@@ -14,10 +14,6 @@ mock.module("../worker-control.js", () => ({
14
14
  },
15
15
  }));
16
16
 
17
- mock.module("../skill-md-mtime-poll.js", () => ({
18
- stopWorkspaceSkillMdMtimePoll: () => {},
19
- }));
20
-
21
17
  const memoryShutdown = (await import("../hooks/shutdown.js")).default;
22
18
 
23
19
  describe("memory shutdown hook", () => {
@@ -16,7 +16,6 @@ import {
16
16
  loadSkillCatalog,
17
17
  type SkillSummary,
18
18
  } from "../../../../config/skills.js";
19
- import { loadWorkspaceMcpConfig } from "../../../../mcp/workspace-mcp-config.js";
20
19
  import {
21
20
  enqueueMemoryJob,
22
21
  upsertEmbedGraphNodeJob,
@@ -132,9 +131,12 @@ export function seedSkillGraphNodes(): void {
132
131
  const input = fromSkillSummary(summary);
133
132
 
134
133
  if (summary.id === "mcp-setup") {
135
- const names = Object.keys(loadWorkspaceMcpConfig().servers);
136
- if (names.length > 0) {
137
- input.description += ` Configured: ${names.join(", ")}`;
134
+ const servers = config.mcp?.servers;
135
+ if (servers) {
136
+ const names = Object.keys(servers);
137
+ if (names.length > 0) {
138
+ input.description += ` Configured: ${names.join(", ")}`;
139
+ }
138
140
  }
139
141
  }
140
142
 
@@ -17,7 +17,6 @@ import type { HookFunction, InitContext } from "@vellumai/plugin-api";
17
17
  import { getConfig } from "../../../../config/loader.js";
18
18
  import { registerMemoryPluginJobHandlers } from "../job-handler-registration.js";
19
19
  import { getLogger } from "../logging.js";
20
- import { backfillRetrospectiveCursorTimestamps } from "../memory-retrospective-cursor-backfill.js";
21
20
  import { runMemoryStartup } from "../startup.js";
22
21
  import { ensureMemoryV3PluginSchema } from "../v3/plugin-schema.js";
23
22
 
@@ -31,15 +30,6 @@ const init: HookFunction<InitContext> = async () => {
31
30
  // against an empty table and failed as an unknown type.
32
31
  registerMemoryPluginJobHandlers();
33
32
 
34
- // Retrospective cursors written before the timestamp column existed can
35
- // only be completed while their message rows still exist, so start the
36
- // fill at boot, ahead of any client regenerating a reply. Detached and
37
- // fail-open like the rest of memory startup; the memory worker runs the
38
- // same idempotent pass as a second chance.
39
- void backfillRetrospectiveCursorTimestamps().catch((err) =>
40
- log.warn({ err }, "Retrospective cursor timestamp backfill failed"),
41
- );
42
-
43
33
  // The memory-v3 plugin-owned schema on the memory connection
44
34
  // (`v3/plugin-schema.ts`): the pools and injected-sections tables and the
45
35
  // selection log's `section_key` column, ensured idempotently on every
@@ -9,11 +9,9 @@
9
9
 
10
10
  import type { HookFunction, ShutdownContext } from "@vellumai/plugin-api";
11
11
 
12
- import { stopWorkspaceSkillMdMtimePoll } from "../skill-md-mtime-poll.js";
13
12
  import { stopMemoryWorkerProcess } from "../worker-control.js";
14
13
 
15
14
  const shutdown: HookFunction<ShutdownContext> = async () => {
16
- stopWorkspaceSkillMdMtimePoll();
17
15
  stopMemoryWorkerProcess();
18
16
  };
19
17
 
@@ -62,7 +62,6 @@ import {
62
62
  import { isJobQueueResolution, type JobHandler } from "../../types.js";
63
63
  import { sweepOrphanConversationMemoryTables } from "./conversation-memory-orphan-sweep.js";
64
64
  import { getLogger } from "./logging.js";
65
- import { backfillRetrospectiveCursorTimestamps } from "./memory-retrospective-cursor-backfill.js";
66
65
  import { sweepOrphanMemoryRetrospectiveConversations } from "./memory-retrospective-startup-cleanup.js";
67
66
  import { getWorkspaceDir } from "./paths.js";
68
67
  // SUBSTRATE (v2+v3) — feeds `enqueueSubstrateMaintenanceJobs`.
@@ -260,18 +259,6 @@ export function startMemoryJobsWorkerLoop(): MemoryJobsWorker {
260
259
  );
261
260
  });
262
261
 
263
- // Second chance for the cursor timestamp backfill the daemon's memory init
264
- // hook starts at boot: rows written before the column existed get their
265
- // `createdAt` so a later deletion of the row they point at (a regenerated
266
- // reply) cannot stall the conversation's retrospectives. Idempotent,
267
- // detached, and best-effort, same as the sweeps.
268
- void backfillRetrospectiveCursorTimestamps().catch((err: unknown) => {
269
- log.warn(
270
- { err },
271
- "Retrospective cursor timestamp backfill failed; continuing worker startup",
272
- );
273
- });
274
-
275
262
  // Also catch up on relocated conversation-keyed tables orphaned while the
276
263
  // plugin was disabled: with memory off, the conversation-deleted hook never
277
264
  // fired, so deletes during that window left rows behind (the pre-Wave-2 main
@@ -31,7 +31,7 @@
31
31
  // accounting; once newer real messages arrive it is copied into the next
32
32
  // run's fork as inert prefix context.
33
33
 
34
- import { and, eq, like, or } from "drizzle-orm";
34
+ import { and, eq, gt, like, or } from "drizzle-orm";
35
35
 
36
36
  import {
37
37
  countMessagesAfter,
@@ -43,11 +43,6 @@ import {
43
43
  SIGHT_FRAME_ATTACHMENT_IDS_KEY,
44
44
  } from "../../../persistence/conversation-types.js";
45
45
  import { getDb } from "../../../persistence/db-connection.js";
46
- import {
47
- messagesAfterBoundFilter,
48
- type MessagesAfterRef,
49
- resolveMessagesAfterBound,
50
- } from "../../../persistence/message-cursor.js";
51
46
  import { messages } from "../../../persistence/schema/index.js";
52
47
  import { SKILL_CARD_MESSAGE_KIND } from "./memory-retrospective-constants.js";
53
48
 
@@ -103,9 +98,9 @@ export function isSkillCardMessage(row: { metadata: string | null }): boolean {
103
98
  */
104
99
  export function getRetrospectiveMessagesAfter(
105
100
  conversationId: string,
106
- after: MessagesAfterRef,
101
+ afterMessageId: string | null,
107
102
  ): MessageRow[] {
108
- const rows = getMessagesAfter(conversationId, after);
103
+ const rows = getMessagesAfter(conversationId, afterMessageId);
109
104
  const firstUnfinalized = rows.findIndex((row) => row.finalized !== 1);
110
105
  const bounded =
111
106
  firstUnfinalized === -1 ? rows : rows.slice(0, firstUnfinalized);
@@ -121,13 +116,13 @@ export function getRetrospectiveMessagesAfter(
121
116
  */
122
117
  export function countRetrospectiveMessagesAfter(
123
118
  conversationId: string,
124
- after: MessagesAfterRef,
119
+ afterMessageId: string | null,
125
120
  ): number {
126
- const total = countMessagesAfter(conversationId, after);
121
+ const total = countMessagesAfter(conversationId, afterMessageId);
127
122
  if (total === 0) {
128
123
  return 0;
129
124
  }
130
- const excluded = countExcludedMessagesAfter(conversationId, after);
125
+ const excluded = countExcludedMessagesAfter(conversationId, afterMessageId);
131
126
  return Math.max(0, total - excluded);
132
127
  }
133
128
 
@@ -172,8 +167,7 @@ export function messagesHaveUserActivity(
172
167
  * a non-tool_result block. Powers the `memory.retrospective.requireUserActivity`
173
168
  * enqueue gate, so only user rows are loaded. Cursor semantics mirror
174
169
  * `countMessagesAfter`: a null/`""` reference scans the whole conversation,
175
- * a cursor whose row is gone falls back to the timestamp it carries, and a
176
- * bare id whose row is gone means no new work.
170
+ * and a vanished reference means no new work.
177
171
  *
178
172
  * Operates on the raw `content` column: rows that do not parse to a block
179
173
  * array (file-backed `{ ref }` rows, legacy plain strings) count as
@@ -183,15 +177,37 @@ export function messagesHaveUserActivity(
183
177
  */
184
178
  export function hasQualifyingUserMessageAfter(
185
179
  conversationId: string,
186
- after: MessagesAfterRef,
180
+ afterMessageId: string | null,
187
181
  ): boolean {
188
- const start = resolveMessagesAfterBound(after);
189
- if (start.kind === "vanished") {
190
- return false;
182
+ const cursorId =
183
+ afterMessageId === null || afterMessageId === "" ? null : afterMessageId;
184
+ const db = getDb();
185
+
186
+ let ref: { createdAt: number } | undefined;
187
+ if (cursorId !== null) {
188
+ ref = db
189
+ .select({ createdAt: messages.createdAt })
190
+ .from(messages)
191
+ .where(eq(messages.id, cursorId))
192
+ .get();
193
+ if (!ref) {
194
+ return false;
195
+ }
191
196
  }
197
+
192
198
  const afterCursor =
193
- start.kind === "after" ? [messagesAfterBoundFilter(start.bound)] : [];
194
- const rows = getDb()
199
+ cursorId !== null && ref
200
+ ? [
201
+ or(
202
+ gt(messages.createdAt, ref.createdAt),
203
+ and(
204
+ eq(messages.createdAt, ref.createdAt),
205
+ gt(messages.id, cursorId),
206
+ ),
207
+ ),
208
+ ]
209
+ : [];
210
+ const rows = db
195
211
  .select({ content: messages.content, metadata: messages.metadata })
196
212
  .from(messages)
197
213
  .where(
@@ -232,14 +248,18 @@ function rawUserContentCarriesActivity(raw: string | null): boolean {
232
248
  * — at most one per successful retrospective run); each candidate is then
233
249
  * JSON-verified by {@link isSkillCardMessage} so an incidental substring
234
250
  * match in unrelated metadata can never exclude a real message from
235
- * accounting. The cursor resolves exactly as `countMessagesAfter`'s does,
236
- * including the null/`""` "count everything" cases and the vanished-reference
237
- * "no new work" case.
251
+ * accounting. The cursor comparison mirrors `countMessagesAfter`'s
252
+ * tie-breaker semantics, including the null/`""` "count everything" cases
253
+ * and the vanished-reference "no new work" case.
238
254
  */
239
255
  function countExcludedMessagesAfter(
240
256
  conversationId: string,
241
- after: MessagesAfterRef,
257
+ afterMessageId: string | null,
242
258
  ): number {
259
+ // The `""` sentinel (failure-only state rows) counts everything, matching
260
+ // `countMessagesAfter`.
261
+ const cursorId =
262
+ afterMessageId === null || afterMessageId === "" ? null : afterMessageId;
243
263
  const db = getDb();
244
264
  const candidates = db
245
265
  .select({
@@ -262,11 +282,18 @@ function countExcludedMessagesAfter(
262
282
  return 0;
263
283
  }
264
284
 
265
- const start = resolveMessagesAfterBound(after);
266
- // Vanished reference: `countMessagesAfter` reported 0, so there is nothing
267
- // to subtract from.
268
- if (start.kind === "vanished") {
269
- return 0;
285
+ let ref: { createdAt: number } | undefined;
286
+ if (cursorId !== null) {
287
+ ref = db
288
+ .select({ createdAt: messages.createdAt })
289
+ .from(messages)
290
+ .where(eq(messages.id, cursorId))
291
+ .get();
292
+ // Vanished reference: `countMessagesAfter` reported 0, so there is
293
+ // nothing to subtract from.
294
+ if (!ref) {
295
+ return 0;
296
+ }
270
297
  }
271
298
 
272
299
  let count = 0;
@@ -274,12 +301,11 @@ function countExcludedMessagesAfter(
274
301
  if (!isExcludedFromRetrospectiveAccounting(row)) {
275
302
  continue;
276
303
  }
277
- if (start.kind === "after") {
278
- const { createdAt, id } = start.bound;
279
- const isAfter =
280
- row.createdAt > createdAt ||
281
- (row.createdAt === createdAt && row.id > id);
282
- if (!isAfter) {
304
+ if (cursorId !== null && ref) {
305
+ const after =
306
+ row.createdAt > ref.createdAt ||
307
+ (row.createdAt === ref.createdAt && row.id > cursorId);
308
+ if (!after) {
283
309
  continue;
284
310
  }
285
311
  }
@@ -47,7 +47,6 @@ import { resolveCapabilities } from "../../../runtime/capabilities.js";
47
47
  import { getLogger } from "./logging.js";
48
48
  import { hasQualifyingUserMessageAfter } from "./memory-retrospective-accounting.js";
49
49
  import { isMemoryRetrospectiveSource } from "./memory-retrospective-constants.js";
50
- import { retrospectiveCursor } from "./memory-retrospective-cursor.js";
51
50
  import { getRetrospectiveState } from "./memory-retrospective-state.js";
52
51
 
53
52
  const log = getLogger("memory-retrospective-enqueue");
@@ -140,7 +139,7 @@ function isRetrospectiveEnabled(): boolean {
140
139
  /**
141
140
  * The `memory.retrospective.requireUserActivity` gate: pass when the config
142
141
  * is off or the unprocessed tail (everything after the conversation's
143
- * retrospective cursor) contains at least one user message carrying
142
+ * `lastProcessedMessageId`) contains at least one user message carrying
144
143
  * non-tool_result content. A gate that cannot be evaluated (config or DB
145
144
  * unavailable) passes — an unevaluable gate must not silence retrospectives.
146
145
  */
@@ -154,7 +153,10 @@ function passesUserActivityGate(
154
153
  }
155
154
  const state = getRetrospectiveState(conversationId);
156
155
  if (
157
- hasQualifyingUserMessageAfter(conversationId, retrospectiveCursor(state))
156
+ hasQualifyingUserMessageAfter(
157
+ conversationId,
158
+ state?.lastProcessedMessageId ?? null,
159
+ )
158
160
  ) {
159
161
  return true;
160
162
  }
@@ -58,7 +58,7 @@ import {
58
58
  parseClientOs,
59
59
  parseInterfaceId,
60
60
  } from "../../../channels/types.js";
61
- import { isSkillImprovementActive } from "../../../config/memory-v3-gate.js";
61
+ import { isV3TierActive } from "../../../config/memory-v3-gate.js";
62
62
  import type { AssistantConfig } from "../../../config/types.js";
63
63
  import { warmGuardianBindings } from "../../../contacts/guardian-delivery-reader.js";
64
64
  import { extractTurnContextTimestamp } from "../../../context/compactor.js";
@@ -95,7 +95,6 @@ import {
95
95
  MEMORY_RETROSPECTIVE_SOURCE,
96
96
  SKILL_MANAGEMENT_SKILL_ID,
97
97
  } from "./memory-retrospective-constants.js";
98
- import { retrospectiveCursor } from "./memory-retrospective-cursor.js";
99
98
  import { loadRetrospectiveRunMessages } from "./memory-retrospective-fork-boundary.js";
100
99
  import { buildForkInstruction } from "./memory-retrospective-prompt.js";
101
100
  import {
@@ -358,7 +357,7 @@ export async function runForkBasedRetrospective(
358
357
  // `memory-retrospective-accounting.ts`.
359
358
  const newMessages = getRetrospectiveMessagesAfter(
360
359
  sourceConversationId,
361
- retrospectiveCursor(state),
360
+ lastProcessedMessageId,
362
361
  );
363
362
 
364
363
  if (newMessages.length === 0) {
@@ -449,7 +448,7 @@ export async function runForkBasedRetrospective(
449
448
  }
450
449
  const forkId = forkConversationRow.id;
451
450
 
452
- const procToSkillsActive = isSkillImprovementActive(config);
451
+ const procToSkillsActive = isV3TierActive(config);
453
452
  const instruction = buildForkInstruction({
454
453
  windowStartTimestamp,
455
454
  windowAnchorKind: turnContextTimestamp ? "turn_context" : "created_at",
@@ -651,7 +650,6 @@ export async function runForkBasedRetrospective(
651
650
  sourceConversationId,
652
651
  retrospectiveConversationId: forkId,
653
652
  cutoffMessageId,
654
- cutoffCreatedAt: cutoffMessage.createdAt,
655
653
  newMessageCount: newMessages.length,
656
654
  prior,
657
655
  priorRemembers,
@@ -949,11 +947,6 @@ async function finalizeSuccessfulRetrospective(args: {
949
947
  sourceConversationId: string;
950
948
  retrospectiveConversationId: string;
951
949
  cutoffMessageId: string;
952
- /**
953
- * `createdAt` of the cutoff row, persisted beside its id so the cursor
954
- * keeps bounding reads after the row is deleted.
955
- */
956
- cutoffCreatedAt: number;
957
950
  newMessageCount: number;
958
951
  prior: PriorRetrospective | null;
959
952
  priorRemembers: string[];
@@ -973,7 +966,6 @@ async function finalizeSuccessfulRetrospective(args: {
973
966
  sourceConversationId,
974
967
  retrospectiveConversationId,
975
968
  cutoffMessageId,
976
- cutoffCreatedAt,
977
969
  newMessageCount,
978
970
  prior,
979
971
  priorRemembers,
@@ -985,7 +977,6 @@ async function finalizeSuccessfulRetrospective(args: {
985
977
  await upsertRetrospectiveState({
986
978
  conversationId: sourceConversationId,
987
979
  lastProcessedMessageId: cutoffMessageId,
988
- lastProcessedCreatedAt: cutoffCreatedAt,
989
980
  lastRunAt: Date.now(),
990
981
  rememberedLog: appendToRememberedLog(priorRemembers, runRemembers),
991
982
  });