@vellumai/assistant 0.8.3 → 0.8.5

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 (665) hide show
  1. package/ARCHITECTURE.md +2 -2
  2. package/docker-entrypoint.sh +0 -1
  3. package/docs/browser-use-architecture-phase2.md +1 -1
  4. package/knip.json +2 -1
  5. package/node_modules/@vellumai/gateway-client/src/types.ts +2 -0
  6. package/openapi.yaml +1492 -100
  7. package/package.json +1 -1
  8. package/src/__tests__/agent-loop-exit-reason.test.ts +4 -5
  9. package/src/__tests__/agent-loop-override-profile.test.ts +1 -1
  10. package/src/__tests__/agent-loop.test.ts +88 -3
  11. package/src/__tests__/anthropic-provider.test.ts +302 -33
  12. package/src/__tests__/approval-cascade.test.ts +1 -1
  13. package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
  14. package/src/__tests__/assistant-feature-flags-integration.test.ts +3 -3
  15. package/src/__tests__/audit-log-rotation.test.ts +70 -16
  16. package/src/__tests__/background-workers-disk-pressure.test.ts +4 -3
  17. package/src/__tests__/btw-routes.test.ts +2 -3
  18. package/src/__tests__/call-controller.test.ts +0 -1
  19. package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
  20. package/src/__tests__/channel-delivery-store.test.ts +193 -0
  21. package/src/__tests__/channel-guardian.test.ts +3 -3
  22. package/src/__tests__/channel-reply-delivery.test.ts +284 -5
  23. package/src/__tests__/channel-retry-sweep.test.ts +274 -1
  24. package/src/__tests__/checker.test.ts +6 -15
  25. package/src/__tests__/compaction-events.test.ts +2 -1
  26. package/src/__tests__/compactor-call-site-logging.test.ts +214 -0
  27. package/src/__tests__/compactor-preserved-tail-count.test.ts +110 -0
  28. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +5 -11
  29. package/src/__tests__/computer-use-tools.test.ts +2 -4
  30. package/src/__tests__/config-watcher.test.ts +1 -1
  31. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  32. package/src/__tests__/context-token-estimator.test.ts +91 -1
  33. package/src/__tests__/conversation-abort-tool-results.test.ts +1 -1
  34. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -1
  35. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +55 -4
  36. package/src/__tests__/conversation-agent-loop-overflow.test.ts +228 -8
  37. package/src/__tests__/conversation-agent-loop.test.ts +188 -129
  38. package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -5
  39. package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
  40. package/src/__tests__/conversation-clean-command.test.ts +137 -0
  41. package/src/__tests__/conversation-clear-safety.test.ts +25 -25
  42. package/src/__tests__/conversation-confirmation-signals.test.ts +1 -1
  43. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
  44. package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
  45. package/src/__tests__/conversation-error.test.ts +31 -0
  46. package/src/__tests__/conversation-fork-crud.test.ts +324 -0
  47. package/src/__tests__/conversation-lifecycle.test.ts +53 -12
  48. package/src/__tests__/conversation-load-history-repair.test.ts +1 -1
  49. package/src/__tests__/conversation-load-history-stripped.test.ts +279 -0
  50. package/src/__tests__/conversation-pairing.test.ts +2 -2
  51. package/src/__tests__/conversation-process-callsite.test.ts +1 -1
  52. package/src/__tests__/conversation-provider-retry-repair.test.ts +2 -1
  53. package/src/__tests__/conversation-queue.test.ts +1 -1
  54. package/src/__tests__/conversation-routes-disk-view.test.ts +109 -0
  55. package/src/__tests__/conversation-routes-slash-commands.test.ts +35 -0
  56. package/src/__tests__/conversation-runtime-assembly.test.ts +264 -81
  57. package/src/__tests__/conversation-seed-composer.test.ts +66 -4
  58. package/src/__tests__/conversation-skill-tools.test.ts +2 -5
  59. package/src/__tests__/conversation-slash-commands.test.ts +36 -8
  60. package/src/__tests__/conversation-slash-queue.test.ts +1 -1
  61. package/src/__tests__/conversation-slash-unknown.test.ts +1 -1
  62. package/src/__tests__/conversation-speed-override.test.ts +1 -1
  63. package/src/__tests__/conversation-store.test.ts +1 -1
  64. package/src/__tests__/conversation-surfaces-task-progress.test.ts +220 -0
  65. package/src/__tests__/conversation-sync-tags.test.ts +99 -32
  66. package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -1
  67. package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
  68. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -1
  69. package/src/__tests__/credential-execution-feature-gates.test.ts +9 -7
  70. package/src/__tests__/credential-execution-tools.test.ts +6 -6
  71. package/src/__tests__/credential-security-invariants.test.ts +7 -0
  72. package/src/__tests__/credential-vault-unit.test.ts +2 -2
  73. package/src/__tests__/cu-unified-flow.test.ts +10 -1
  74. package/src/__tests__/dm-backfill.test.ts +64 -0
  75. package/src/__tests__/dm-persistence.test.ts +33 -0
  76. package/src/__tests__/document-find-replace.test.ts +501 -0
  77. package/src/__tests__/dynamic-page-surface.test.ts +2 -2
  78. package/src/__tests__/email-html-renderer.test.ts +12 -0
  79. package/src/__tests__/first-greeting.test.ts +23 -2
  80. package/src/__tests__/gateway-flag-listener.test.ts +237 -0
  81. package/src/__tests__/gemini-provider.test.ts +78 -0
  82. package/src/__tests__/guardian-dispatch.test.ts +0 -1
  83. package/src/__tests__/guardian-outbound-http.test.ts +7 -5
  84. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
  85. package/src/__tests__/headless-browser-navigate.test.ts +172 -0
  86. package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
  87. package/src/__tests__/heartbeat-service.test.ts +4 -0
  88. package/src/__tests__/host-bash-proxy.test.ts +6 -0
  89. package/src/__tests__/host-browser-proxy.test.ts +10 -0
  90. package/src/__tests__/host-cu-proxy.test.ts +8 -1
  91. package/src/__tests__/host-file-proxy.test.ts +8 -1
  92. package/src/__tests__/host-shell-tool.test.ts +1 -1
  93. package/src/__tests__/host-transfer-proxy.test.ts +8 -1
  94. package/src/__tests__/identity-routes.test.ts +57 -0
  95. package/src/__tests__/inbound-slack-persistence.test.ts +3 -0
  96. package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
  97. package/src/__tests__/injector-chain.test.ts +2 -0
  98. package/src/__tests__/injector-document-comments.test.ts +378 -0
  99. package/src/__tests__/injector-pkb-v2-silenced.test.ts +4 -25
  100. package/src/__tests__/list-messages-attachments.test.ts +21 -17
  101. package/src/__tests__/list-messages-hidden-metadata.test.ts +217 -0
  102. package/src/__tests__/list-messages-page-latest.test.ts +130 -14
  103. package/src/__tests__/list-messages-tool-merge.test.ts +77 -17
  104. package/src/__tests__/llm-context-normalization.test.ts +0 -2
  105. package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
  106. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
  107. package/src/__tests__/llm-resolver.test.ts +161 -9
  108. package/src/__tests__/llm-usage-store.test.ts +66 -0
  109. package/src/__tests__/log-export-routes.test.ts +99 -2
  110. package/src/__tests__/logger.test.ts +89 -0
  111. package/src/__tests__/mcp-abort-signal.test.ts +2 -2
  112. package/src/__tests__/media-generate-image.test.ts +31 -0
  113. package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
  114. package/src/__tests__/message-queue-steer.test.ts +114 -0
  115. package/src/__tests__/model-intents.test.ts +2 -4
  116. package/src/__tests__/notification-guardian-path.test.ts +0 -1
  117. package/src/__tests__/onboarding-template-contract.test.ts +1 -1
  118. package/src/__tests__/openai-provider.test.ts +151 -0
  119. package/src/__tests__/openai-responses-provider.test.ts +118 -16
  120. package/src/__tests__/outbound-slack-persistence.test.ts +187 -20
  121. package/src/__tests__/pending-interactions-resolved-event.test.ts +189 -0
  122. package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
  123. package/src/__tests__/platform.test.ts +2 -5
  124. package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
  125. package/src/__tests__/plugin-bootstrap.test.ts +2 -2
  126. package/src/__tests__/plugin-source-watcher.test.ts +302 -0
  127. package/src/__tests__/plugin-tool-contribution.test.ts +13 -6
  128. package/src/__tests__/plugin-types.test.ts +3 -2
  129. package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
  130. package/src/__tests__/pricing.test.ts +12 -0
  131. package/src/__tests__/process-message-background-slack.test.ts +1 -51
  132. package/src/__tests__/process-message-display-content.test.ts +21 -16
  133. package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
  134. package/src/__tests__/registry.test.ts +2 -8
  135. package/src/__tests__/require-fresh-approval.test.ts +2 -2
  136. package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
  137. package/src/__tests__/server-history-render.test.ts +83 -4
  138. package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
  139. package/src/__tests__/skill-feature-flags.test.ts +2 -2
  140. package/src/__tests__/skill-projection-feature-flag.test.ts +4 -7
  141. package/src/__tests__/skill-projection.benchmark.test.ts +2 -6
  142. package/src/__tests__/skill-tool-factory.test.ts +1 -1
  143. package/src/__tests__/steer-tool-repair.test.ts +249 -0
  144. package/src/__tests__/subagent-notify-parent.test.ts +1 -1
  145. package/src/__tests__/suggestion-routes.test.ts +1 -0
  146. package/src/__tests__/sync-message-contract.test.ts +59 -0
  147. package/src/__tests__/system-prompt.test.ts +161 -124
  148. package/src/__tests__/terminal-tools.test.ts +12 -2
  149. package/src/__tests__/thinking-block-replay.test.ts +113 -0
  150. package/src/__tests__/thread-backfill.test.ts +370 -22
  151. package/src/__tests__/tool-approval-handler.test.ts +1 -5
  152. package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
  153. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
  154. package/src/__tests__/tool-executor-lifecycle-events.test.ts +15 -5
  155. package/src/__tests__/tool-executor.test.ts +89 -53
  156. package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
  157. package/src/__tests__/tool-result-metadata-plumbing.test.ts +167 -0
  158. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  159. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
  160. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  161. package/src/__tests__/twilio-routes.test.ts +1 -1
  162. package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
  163. package/src/__tests__/usage-routes.test.ts +3 -0
  164. package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
  165. package/src/__tests__/web-fetch.test.ts +2 -2
  166. package/src/__tests__/workspace-git-service.test.ts +94 -10
  167. package/src/__tests__/workspace-migration-088-deprecate-background-conversation-override.test.ts +158 -0
  168. package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
  169. package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
  170. package/src/acp/prepare-agent-env.ts +78 -0
  171. package/src/acp/session-manager.ts +1 -1
  172. package/src/agent/attachments.ts +1 -0
  173. package/src/agent/loop.ts +65 -20
  174. package/src/api/README.md +5 -0
  175. package/src/api/index.ts +4 -0
  176. package/src/api/package.json +10 -0
  177. package/src/background-wake/background-wake-routes.test.ts +233 -0
  178. package/src/background-wake/next-wake.test.ts +289 -0
  179. package/src/background-wake/next-wake.ts +172 -0
  180. package/src/background-wake/runtime-registry.ts +24 -0
  181. package/src/browser/operations.ts +15 -0
  182. package/src/cli/commands/__tests__/browser.test.ts +23 -5
  183. package/src/cli/commands/__tests__/conversations-slack.test.ts +572 -0
  184. package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
  185. package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
  186. package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
  187. package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
  188. package/src/cli/commands/__tests__/memory-v2.test.ts +10 -12
  189. package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
  190. package/src/cli/commands/browser.ts +247 -0
  191. package/src/cli/commands/conversations.ts +128 -1
  192. package/src/cli/commands/domain.ts +91 -41
  193. package/src/cli/commands/inference-providers.ts +147 -1
  194. package/src/cli/commands/inference.ts +93 -40
  195. package/src/cli/commands/memory-v2-compare-render.ts +115 -0
  196. package/src/cli/commands/memory-v2.ts +483 -0
  197. package/src/cli/commands/memory-v3-render.ts +344 -0
  198. package/src/cli/commands/memory-v3.ts +316 -0
  199. package/src/cli/commands/notifications.ts +24 -2
  200. package/src/cli/program.ts +2 -0
  201. package/src/cli/utils/conversation-id.ts +17 -5
  202. package/src/config/assistant-feature-flags.ts +21 -9
  203. package/src/config/bundled-skills/app-builder/SKILL.md +2 -2
  204. package/src/config/bundled-skills/document-editor/SKILL.md +124 -0
  205. package/src/config/bundled-skills/document-editor/TOOLS.json +258 -0
  206. package/src/config/bundled-skills/document-editor/tools/comment-list.ts +12 -0
  207. package/src/config/bundled-skills/document-editor/tools/comment-reply.ts +12 -0
  208. package/src/config/bundled-skills/document-editor/tools/comment-resolve.ts +12 -0
  209. package/src/config/bundled-skills/document-editor/tools/document-find.ts +12 -0
  210. package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
  211. package/src/config/bundled-skills/document-editor/tools/document-replace-text.ts +12 -0
  212. package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
  213. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
  214. package/src/config/bundled-skills/media-processing/SKILL.md +8 -0
  215. package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
  216. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
  217. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
  218. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
  219. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
  220. package/src/config/bundled-skills/schedule/SKILL.md +8 -0
  221. package/src/config/bundled-tool-registry.ts +24 -12
  222. package/src/config/call-site-defaults.ts +20 -0
  223. package/src/config/feature-flag-registry.json +115 -3
  224. package/src/config/llm-resolver.ts +16 -2
  225. package/src/config/schemas/__tests__/memory-v2.test.ts +217 -1
  226. package/src/config/schemas/call-site-catalog.ts +35 -0
  227. package/src/config/schemas/llm.ts +14 -0
  228. package/src/config/schemas/memory-v2.ts +294 -1
  229. package/src/config/schemas/memory.ts +2 -1
  230. package/src/context/compactor.ts +60 -1
  231. package/src/context/token-estimator.ts +47 -4
  232. package/src/context/window-manager.ts +25 -0
  233. package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
  234. package/src/conversations/message-consolidation.ts +404 -0
  235. package/src/credential-health/credential-health-service.ts +34 -19
  236. package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -1
  237. package/src/daemon/__tests__/conversation-tool-setup.test.ts +66 -6
  238. package/src/daemon/__tests__/meet-manifest-loader.test.ts +1 -1
  239. package/src/daemon/__tests__/native-web-search-metadata.test.ts +357 -0
  240. package/src/daemon/__tests__/web-search-status-text.test.ts +287 -0
  241. package/src/daemon/conversation-agent-loop-handlers.ts +155 -36
  242. package/src/daemon/conversation-agent-loop.ts +307 -88
  243. package/src/daemon/conversation-error.ts +31 -1
  244. package/src/daemon/conversation-lifecycle.ts +149 -118
  245. package/src/daemon/conversation-messaging.ts +3 -0
  246. package/src/daemon/conversation-process.ts +273 -0
  247. package/src/daemon/conversation-queue-manager.ts +14 -0
  248. package/src/daemon/conversation-runtime-assembly.ts +145 -84
  249. package/src/daemon/conversation-slash.ts +37 -5
  250. package/src/daemon/conversation-surfaces.ts +45 -2
  251. package/src/daemon/conversation-tool-setup.ts +70 -3
  252. package/src/daemon/conversation-usage.ts +2 -0
  253. package/src/daemon/conversation.ts +54 -32
  254. package/src/daemon/disk-pressure-guard.ts +14 -2
  255. package/src/daemon/first-greeting.ts +10 -0
  256. package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +498 -0
  257. package/src/daemon/handlers/config-a2a.ts +160 -0
  258. package/src/daemon/handlers/config-model.test.ts +2 -0
  259. package/src/daemon/handlers/conversations.ts +90 -3
  260. package/src/daemon/handlers/shared.ts +92 -29
  261. package/src/daemon/host-bash-proxy.ts +1 -1
  262. package/src/daemon/host-browser-proxy.ts +5 -5
  263. package/src/daemon/host-cu-proxy.ts +5 -5
  264. package/src/daemon/host-file-proxy.ts +5 -5
  265. package/src/daemon/host-proxy-base.ts +4 -4
  266. package/src/daemon/host-transfer-proxy.ts +11 -11
  267. package/src/daemon/lifecycle.ts +40 -23
  268. package/src/daemon/meet-manifest-loader.ts +1 -7
  269. package/src/daemon/message-protocol.ts +4 -0
  270. package/src/daemon/message-types/conversations.ts +14 -9
  271. package/src/daemon/message-types/document-comments.ts +50 -0
  272. package/src/daemon/message-types/home.ts +1 -13
  273. package/src/daemon/message-types/messages.ts +66 -7
  274. package/src/daemon/message-types/surfaces.ts +3 -1
  275. package/src/daemon/message-types/sync.ts +14 -0
  276. package/src/daemon/message-types/web-activity.ts +57 -0
  277. package/src/daemon/plugin-source-watcher.ts +135 -3
  278. package/src/daemon/process-message.ts +69 -12
  279. package/src/daemon/shutdown-handlers.ts +24 -5
  280. package/src/daemon/switch-inference-profile-tool.ts +52 -0
  281. package/src/daemon/tool-setup-types.ts +13 -0
  282. package/src/daemon/trust-context.ts +6 -0
  283. package/src/documents/document-comments-store.test.ts +338 -0
  284. package/src/documents/document-comments-store.ts +237 -0
  285. package/src/documents/document-store.ts +202 -0
  286. package/src/events/relationship-state-updated.ts +25 -0
  287. package/src/heartbeat/__tests__/heartbeat-service.test.ts +1 -2
  288. package/src/heartbeat/heartbeat-service.ts +1 -0
  289. package/src/home/__tests__/suggested-prompts.test.ts +33 -2
  290. package/src/home/feed-types.ts +6 -1
  291. package/src/home/home-content-refresh.ts +52 -0
  292. package/src/home/home-greeting-cache.ts +69 -0
  293. package/src/home/home-greeting.ts +85 -0
  294. package/src/home/suggested-prompts.ts +168 -9
  295. package/src/ipc/gateway-flag-listener.ts +123 -0
  296. package/src/ipc/skill-routes/registries.ts +8 -12
  297. package/src/memory/__tests__/db-async-query.test.ts +165 -0
  298. package/src/memory/__tests__/db-maintenance.test.ts +115 -0
  299. package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +241 -0
  300. package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
  301. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +135 -2
  302. package/src/memory/__tests__/memory-retrospective-job.test.ts +327 -6
  303. package/src/memory/auto-analysis-enqueue.ts +5 -1
  304. package/src/memory/conversation-crud.ts +191 -100
  305. package/src/memory/conversation-starters-cadence.ts +3 -1
  306. package/src/memory/conversation-title-service.ts +19 -3
  307. package/src/memory/db-async-query.ts +214 -0
  308. package/src/memory/db-init.ts +26 -0
  309. package/src/memory/db-maintenance.ts +30 -21
  310. package/src/memory/delivery-crud.ts +41 -0
  311. package/src/memory/delivery-status.ts +141 -15
  312. package/src/memory/external-conversation-store.ts +32 -1
  313. package/src/memory/graph/bootstrap.ts +8 -1
  314. package/src/memory/graph/capability-seed.ts +7 -3
  315. package/src/memory/graph/conversation-graph-memory.ts +100 -17
  316. package/src/memory/graph/extraction.ts +1 -5
  317. package/src/memory/graph/graph-search.ts +7 -1
  318. package/src/memory/indexer.ts +28 -18
  319. package/src/memory/job-handlers/cleanup.ts +76 -18
  320. package/src/memory/job-handlers/conversation-starters.ts +1 -4
  321. package/src/memory/jobs/embed-pkb-file.ts +6 -1
  322. package/src/memory/jobs-store.ts +14 -0
  323. package/src/memory/jobs-worker.ts +68 -15
  324. package/src/memory/llm-request-log-source-clickhouse.ts +42 -2
  325. package/src/memory/llm-request-log-source-local.ts +7 -0
  326. package/src/memory/llm-request-log-source.ts +9 -2
  327. package/src/memory/llm-request-log-store.ts +43 -1
  328. package/src/memory/llm-usage-store.ts +24 -0
  329. package/src/memory/memory-retrospective-constants.ts +28 -0
  330. package/src/memory/memory-retrospective-enqueue.ts +11 -3
  331. package/src/memory/memory-retrospective-job.ts +413 -18
  332. package/src/memory/memory-retrospective-startup-cleanup.ts +3 -3
  333. package/src/memory/memory-v2-activation-log-store.ts +41 -14
  334. package/src/memory/migrations/100-core-tables.ts +1 -0
  335. package/src/memory/migrations/109-external-conversation-bindings.ts +1 -0
  336. package/src/memory/migrations/253-conversation-last-notified-profile.ts +15 -0
  337. package/src/memory/migrations/253-document-comments.ts +47 -0
  338. package/src/memory/migrations/254-external-conversation-binding-chat-name.ts +43 -0
  339. package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +24 -0
  340. package/src/memory/migrations/256-memory-v2-injection-events.ts +113 -0
  341. package/src/memory/migrations/257-strip-base-url-non-openai-compatible.ts +22 -0
  342. package/src/memory/migrations/258-onboarding-events-prior-assistants.ts +13 -0
  343. package/src/memory/migrations/259-conversation-cleaned-at.ts +33 -0
  344. package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
  345. package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
  346. package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
  347. package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
  348. package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
  349. package/src/memory/migrations/index.ts +34 -0
  350. package/src/memory/migrations/registry.ts +58 -0
  351. package/src/memory/onboarding-events-store.ts +7 -0
  352. package/src/memory/schema/calls.ts +1 -0
  353. package/src/memory/schema/conversations.ts +3 -0
  354. package/src/memory/schema/infrastructure.ts +22 -0
  355. package/src/memory/tool-usage-store.ts +36 -8
  356. package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
  357. package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
  358. package/src/memory/v2/__tests__/harness-metrics.test.ts +74 -0
  359. package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
  360. package/src/memory/v2/__tests__/harness-replay-input.test.ts +225 -0
  361. package/src/memory/v2/__tests__/harness-runner.test.ts +109 -0
  362. package/src/memory/v2/__tests__/injection-events.test.ts +318 -0
  363. package/src/memory/v2/__tests__/injection.test.ts +158 -112
  364. package/src/memory/v2/__tests__/page-index.test.ts +365 -1
  365. package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
  366. package/src/memory/v2/__tests__/router.test.ts +660 -4
  367. package/src/memory/v2/consolidation-job.ts +14 -0
  368. package/src/memory/v2/harness/compare.ts +57 -0
  369. package/src/memory/v2/harness/metrics.ts +124 -0
  370. package/src/memory/v2/harness/oracle.ts +145 -0
  371. package/src/memory/v2/harness/replay-input.ts +224 -0
  372. package/src/memory/v2/harness/retriever.ts +74 -0
  373. package/src/memory/v2/harness/router-retriever.ts +43 -0
  374. package/src/memory/v2/harness/runner.ts +106 -0
  375. package/src/memory/v2/harness/trace.ts +58 -0
  376. package/src/memory/v2/injection-events.ts +101 -0
  377. package/src/memory/v2/injection.ts +42 -25
  378. package/src/memory/v2/page-index.ts +209 -7
  379. package/src/memory/v2/page-store.ts +18 -0
  380. package/src/memory/v2/prompts/router.ts +26 -1
  381. package/src/memory/v2/qdrant.ts +14 -2
  382. package/src/memory/v2/router.ts +369 -62
  383. package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
  384. package/src/memory/v3/__tests__/consolidation-job.test.ts +468 -0
  385. package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
  386. package/src/memory/v3/__tests__/edges.test.ts +563 -0
  387. package/src/memory/v3/__tests__/filter.test.ts +512 -0
  388. package/src/memory/v3/__tests__/gate.test.ts +574 -0
  389. package/src/memory/v3/__tests__/index-composition.test.ts +233 -0
  390. package/src/memory/v3/__tests__/loop.test.ts +530 -0
  391. package/src/memory/v3/__tests__/retriever.test.ts +226 -0
  392. package/src/memory/v3/__tests__/scouts.test.ts +440 -0
  393. package/src/memory/v3/__tests__/shadow-middleware.test.ts +312 -0
  394. package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
  395. package/src/memory/v3/__tests__/traversal.test.ts +469 -0
  396. package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
  397. package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
  398. package/src/memory/v3/__tests__/tree-walk.test.ts +707 -0
  399. package/src/memory/v3/__tests__/validate.test.ts +245 -0
  400. package/src/memory/v3/auto-edges.ts +223 -0
  401. package/src/memory/v3/coactivation-store.ts +124 -0
  402. package/src/memory/v3/consolidation-job.ts +323 -0
  403. package/src/memory/v3/edge-learning-job.ts +160 -0
  404. package/src/memory/v3/edges.ts +249 -0
  405. package/src/memory/v3/filter.ts +281 -0
  406. package/src/memory/v3/gate.ts +334 -0
  407. package/src/memory/v3/index-composition.ts +113 -0
  408. package/src/memory/v3/llm-capture.ts +46 -0
  409. package/src/memory/v3/loop.ts +382 -0
  410. package/src/memory/v3/maintenance.ts +144 -0
  411. package/src/memory/v3/prompt-context.ts +33 -0
  412. package/src/memory/v3/prompts/consolidation.ts +458 -0
  413. package/src/memory/v3/prompts/system-prompts.ts +196 -0
  414. package/src/memory/v3/retriever.ts +33 -0
  415. package/src/memory/v3/scouts.ts +420 -0
  416. package/src/memory/v3/shadow-middleware.ts +305 -0
  417. package/src/memory/v3/traversal.ts +206 -0
  418. package/src/memory/v3/tree-index.ts +237 -0
  419. package/src/memory/v3/tree-store.ts +394 -0
  420. package/src/memory/v3/tree-walk.ts +351 -0
  421. package/src/memory/v3/types.ts +65 -0
  422. package/src/memory/v3/validate.ts +300 -0
  423. package/src/messaging/providers/index.ts +7 -1
  424. package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +329 -3
  425. package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +34 -1
  426. package/src/messaging/providers/slack/adapter.ts +178 -25
  427. package/src/messaging/providers/slack/api.test.ts +54 -0
  428. package/src/messaging/providers/slack/api.ts +119 -3
  429. package/src/messaging/providers/slack/client.ts +12 -0
  430. package/src/messaging/providers/slack/deep-link.ts +20 -1
  431. package/src/messaging/providers/slack/message-metadata.test.ts +48 -0
  432. package/src/messaging/providers/slack/message-metadata.ts +156 -0
  433. package/src/messaging/providers/slack/render-transcript.test.ts +107 -75
  434. package/src/messaging/providers/slack/render-transcript.ts +176 -49
  435. package/src/messaging/providers/slack/send.test.ts +77 -0
  436. package/src/messaging/providers/slack/send.ts +8 -2
  437. package/src/messaging/providers/slack/types.ts +14 -0
  438. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +4 -1
  439. package/src/notifications/__tests__/home-feed-side-effect.test.ts +116 -54
  440. package/src/notifications/adapters/macos.ts +18 -1
  441. package/src/notifications/adapters/platform.ts +1 -1
  442. package/src/notifications/conversation-seed-composer.ts +14 -2
  443. package/src/notifications/decision-engine.ts +1 -4
  444. package/src/notifications/deferred-emit.ts +135 -0
  445. package/src/notifications/emit-signal.ts +38 -50
  446. package/src/notifications/home-feed-side-effect.ts +60 -30
  447. package/src/oauth/connect-orchestrator.ts +3 -0
  448. package/src/oauth/credential-token-resolver.ts +2 -0
  449. package/src/oauth/manual-token-connection.ts +19 -0
  450. package/src/oauth/oauth-store.ts +12 -0
  451. package/src/oauth/seed-providers.ts +22 -0
  452. package/src/permissions/prompter.ts +8 -5
  453. package/src/permissions/question-prompter.ts +5 -2
  454. package/src/permissions/secret-prompter.ts +6 -3
  455. package/src/plugin-api/index.ts +4 -0
  456. package/src/plugin-api/types.ts +7 -33
  457. package/src/plugins/defaults/index.ts +6 -0
  458. package/src/plugins/defaults/injectors.ts +100 -20
  459. package/src/plugins/external-plugin-loader.ts +5 -68
  460. package/src/plugins/types.ts +11 -16
  461. package/src/proactive-artifact/aux-message-injector.ts +17 -4
  462. package/src/prompts/__tests__/system-prompt.test.ts +46 -2
  463. package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
  464. package/src/prompts/normalize-onboarding.ts +40 -0
  465. package/src/prompts/persona-resolver.ts +36 -21
  466. package/src/prompts/sections.ts +69 -19
  467. package/src/prompts/system-prompt.ts +118 -216
  468. package/src/prompts/template-detection.ts +37 -0
  469. package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +141 -0
  470. package/src/prompts/templates/BOOTSTRAP.md +10 -2
  471. package/src/prompts/templates/VOICE.md +3 -0
  472. package/src/prompts/templates/system-sections.ts +281 -9
  473. package/src/providers/__tests__/connection-model-compat.test.ts +234 -0
  474. package/src/providers/__tests__/retry-callsite.test.ts +85 -5
  475. package/src/providers/anthropic/client.ts +159 -66
  476. package/src/providers/call-site-routing.ts +14 -2
  477. package/src/providers/connection-model-compat.ts +38 -0
  478. package/src/providers/connection-resolution.ts +16 -2
  479. package/src/providers/fireworks/client.ts +20 -2
  480. package/src/providers/gemini/client.ts +49 -6
  481. package/src/providers/inference/__tests__/base-url-route-validation.test.ts +342 -0
  482. package/src/providers/inference/__tests__/base-url-security.test.ts +189 -0
  483. package/src/providers/inference/__tests__/codex-token-refresh.test.ts +254 -0
  484. package/src/providers/inference/adapter-factory.ts +18 -1
  485. package/src/providers/inference/auth.ts +3 -3
  486. package/src/providers/inference/codex-token-refresh.ts +128 -0
  487. package/src/providers/inference/resolve-auth.ts +49 -6
  488. package/src/providers/minimax/client.ts +106 -0
  489. package/src/providers/model-catalog.ts +91 -1
  490. package/src/providers/model-intents.ts +1 -1
  491. package/src/providers/openai/chat-completions-provider.ts +63 -23
  492. package/src/providers/openai/codex-models.ts +18 -0
  493. package/src/providers/openai/responses-provider.ts +86 -23
  494. package/src/providers/openrouter/client.ts +5 -1
  495. package/src/providers/provider-send-message.ts +7 -1
  496. package/src/providers/retry.ts +34 -3
  497. package/src/providers/thinking-config.ts +26 -1
  498. package/src/providers/types.ts +25 -0
  499. package/src/providers/usage-tracking.ts +2 -0
  500. package/src/runtime/AGENTS.md +2 -2
  501. package/src/runtime/__tests__/agent-wake.test.ts +214 -0
  502. package/src/runtime/__tests__/background-job-runner.test.ts +128 -0
  503. package/src/runtime/agent-wake.ts +152 -56
  504. package/src/runtime/assistant-event-hub.ts +76 -6
  505. package/src/runtime/auth/route-policy.ts +43 -3
  506. package/src/runtime/background-job-runner.ts +26 -0
  507. package/src/runtime/btw-sidechain.ts +0 -6
  508. package/src/runtime/channel-reply-delivery.ts +182 -47
  509. package/src/runtime/channel-retry-sweep.ts +141 -16
  510. package/src/runtime/http-types.ts +7 -6
  511. package/src/runtime/migrations/vbundle-builder.ts +10 -3
  512. package/src/runtime/pending-interactions.ts +50 -8
  513. package/src/runtime/routes/__tests__/content-source-routes.test.ts +162 -0
  514. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +161 -1
  515. package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +14 -0
  516. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +290 -0
  517. package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
  518. package/src/runtime/routes/__tests__/sanity-routes.test.ts +280 -0
  519. package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +266 -0
  520. package/src/runtime/routes/acp-routes.test.ts +255 -6
  521. package/src/runtime/routes/acp-routes.ts +8 -1
  522. package/src/runtime/routes/approval-routes.ts +4 -1
  523. package/src/runtime/routes/avatar-routes.ts +10 -10
  524. package/src/runtime/routes/background-wake-routes.ts +188 -0
  525. package/src/runtime/routes/browser-tabs-routes.ts +200 -0
  526. package/src/runtime/routes/btw-routes.ts +0 -6
  527. package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +246 -0
  528. package/src/runtime/routes/content-source-routes.ts +78 -0
  529. package/src/runtime/routes/conversation-cli-routes.ts +147 -2
  530. package/src/runtime/routes/conversation-list-routes.ts +12 -4
  531. package/src/runtime/routes/conversation-management-routes.ts +77 -20
  532. package/src/runtime/routes/conversation-query-routes.ts +196 -31
  533. package/src/runtime/routes/conversation-routes.ts +472 -425
  534. package/src/runtime/routes/conversation-starter-routes.ts +6 -3
  535. package/src/runtime/routes/disk-pressure-routes.ts +1 -1
  536. package/src/runtime/routes/document-comments-routes.ts +287 -0
  537. package/src/runtime/routes/documents-routes.ts +33 -0
  538. package/src/runtime/routes/domain-routes.ts +60 -10
  539. package/src/runtime/routes/email-routes.ts +5 -2
  540. package/src/runtime/routes/events-routes.ts +54 -10
  541. package/src/runtime/routes/group-routes.ts +24 -8
  542. package/src/runtime/routes/home-feed-routes.ts +6 -3
  543. package/src/runtime/routes/host-app-control-routes.ts +1 -1
  544. package/src/runtime/routes/host-browser-routes.ts +17 -2
  545. package/src/runtime/routes/host-cu-routes.ts +2 -2
  546. package/src/runtime/routes/identity-routes.ts +21 -0
  547. package/src/runtime/routes/inbound-message-handler.ts +288 -58
  548. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
  549. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +365 -6
  550. package/src/runtime/routes/inbound-stages/background-dispatch.ts +283 -82
  551. package/src/runtime/routes/index.ts +20 -4
  552. package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
  553. package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
  554. package/src/runtime/routes/inference-provider-connection-routes.ts +63 -7
  555. package/src/runtime/routes/integrations/a2a.ts +60 -1
  556. package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
  557. package/src/runtime/routes/log-export-routes.ts +39 -0
  558. package/src/runtime/routes/memory-item-routes.ts +8 -3
  559. package/src/runtime/routes/memory-v2-routes.ts +427 -0
  560. package/src/runtime/routes/memory-v3-routes.ts +316 -0
  561. package/src/runtime/routes/migration-routes.ts +21 -24
  562. package/src/runtime/routes/notification-routes.ts +19 -2
  563. package/src/runtime/routes/plugins-routes.ts +337 -0
  564. package/src/runtime/routes/question-routes.ts +4 -1
  565. package/src/runtime/routes/rename-conversation-routes.ts +6 -2
  566. package/src/runtime/routes/sanity-routes.ts +159 -0
  567. package/src/runtime/routes/secret-routes.ts +25 -5
  568. package/src/runtime/routes/settings-routes.ts +12 -11
  569. package/src/runtime/routes/slack-channel-routes.ts +188 -0
  570. package/src/runtime/routes/workspace-routes.ts +25 -10
  571. package/src/runtime/services/conversation-serializer.ts +30 -4
  572. package/src/runtime/sync/resource-sync-events.ts +106 -38
  573. package/src/runtime/sync/sync-publisher.test.ts +49 -0
  574. package/src/runtime/sync/sync-publisher.ts +2 -1
  575. package/src/runtime/verification-outbound-actions.ts +73 -1
  576. package/src/schedule/integration-status.ts +3 -1
  577. package/src/security/__tests__/oauth2-device-code.test.ts +479 -0
  578. package/src/security/oauth2-device-code.ts +307 -0
  579. package/src/security/oauth2.ts +26 -9
  580. package/src/security/secure-keys.ts +5 -0
  581. package/src/skills/catalog-install.ts +6 -2
  582. package/src/telemetry/types.ts +12 -0
  583. package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
  584. package/src/telemetry/usage-telemetry-reporter.ts +1 -0
  585. package/src/tools/acp/spawn.test.ts +119 -0
  586. package/src/tools/acp/spawn.ts +15 -2
  587. package/src/tools/apps/definitions.ts +2 -8
  588. package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
  589. package/src/tools/ask-question/ask-question-tool.ts +38 -45
  590. package/src/tools/browser/__tests__/pinned-tabs.test.ts +150 -0
  591. package/src/tools/browser/browser-execution.ts +106 -0
  592. package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
  593. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +28 -0
  594. package/src/tools/browser/cdp-client/__tests__/types.test.ts +4 -0
  595. package/src/tools/browser/cdp-client/cdp-inspect-client.ts +22 -0
  596. package/src/tools/browser/cdp-client/extension-cdp-client.ts +42 -2
  597. package/src/tools/browser/cdp-client/factory.ts +171 -4
  598. package/src/tools/browser/cdp-client/local-cdp-client.ts +21 -0
  599. package/src/tools/browser/cdp-client/types.ts +101 -0
  600. package/src/tools/browser/pinned-tabs.ts +146 -0
  601. package/src/tools/computer-use/definitions.ts +22 -78
  602. package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
  603. package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
  604. package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
  605. package/src/tools/credentials/vault.ts +3 -9
  606. package/src/tools/document/document-comment-tool.test.ts +379 -0
  607. package/src/tools/document/document-comment-tool.ts +156 -0
  608. package/src/tools/document/document-tool.ts +187 -2
  609. package/src/tools/execution-target.ts +21 -23
  610. package/src/tools/executor.ts +6 -1
  611. package/src/tools/filesystem/edit.ts +3 -9
  612. package/src/tools/filesystem/list.ts +3 -9
  613. package/src/tools/filesystem/read.ts +3 -9
  614. package/src/tools/filesystem/write.ts +3 -9
  615. package/src/tools/host-filesystem/edit.ts +3 -9
  616. package/src/tools/host-filesystem/read.ts +3 -9
  617. package/src/tools/host-filesystem/transfer.ts +3 -9
  618. package/src/tools/host-filesystem/write.ts +3 -9
  619. package/src/tools/host-terminal/host-shell.ts +3 -9
  620. package/src/tools/mcp/mcp-tool-factory.ts +1 -8
  621. package/src/tools/memory/register.test.ts +1 -1
  622. package/src/tools/memory/register.ts +4 -9
  623. package/src/tools/network/__tests__/web-fetch-metadata.test.ts +229 -0
  624. package/src/tools/network/__tests__/web-search-metadata.test.ts +346 -0
  625. package/src/tools/network/domain-normalize.ts +17 -0
  626. package/src/tools/network/web-fetch.ts +216 -73
  627. package/src/tools/network/web-search.ts +216 -98
  628. package/src/tools/registry.ts +7 -23
  629. package/src/tools/schema-transforms.ts +1 -1
  630. package/src/tools/skills/execute.ts +3 -9
  631. package/src/tools/skills/load.ts +3 -9
  632. package/src/tools/skills/skill-tool-factory.ts +1 -8
  633. package/src/tools/subagent/notify-parent.ts +3 -9
  634. package/src/tools/system/request-permission.ts +3 -9
  635. package/src/tools/terminal/safe-env.ts +3 -2
  636. package/src/tools/terminal/shell.ts +3 -9
  637. package/src/tools/tool-approval-handler.ts +19 -12
  638. package/src/tools/tool-defaults.ts +94 -0
  639. package/src/tools/types.ts +31 -98
  640. package/src/tools/ui-surface/definitions.ts +9 -23
  641. package/src/types/onboarding-context.ts +4 -0
  642. package/src/usage/pricing.ts +23 -0
  643. package/src/usage/types.ts +12 -0
  644. package/src/util/__tests__/favicon.test.ts +84 -0
  645. package/src/util/favicon.ts +40 -0
  646. package/src/util/logger.ts +16 -7
  647. package/src/util/platform.ts +7 -7
  648. package/src/util/sqlite3-runtime.ts +65 -0
  649. package/src/workspace/git-service.ts +75 -4
  650. package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
  651. package/src/workspace/migrations/088-deprecate-background-conversation-override.ts +103 -0
  652. package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
  653. package/src/workspace/migrations/registry.ts +4 -0
  654. package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
  655. package/src/__tests__/message-complete-display-id.test.ts +0 -175
  656. package/src/config/bundled-skills/document/SKILL.md +0 -54
  657. package/src/config/bundled-skills/document/TOOLS.json +0 -106
  658. package/src/daemon/seed-files.ts +0 -18
  659. package/src/prompts/cache-boundary.ts +0 -8
  660. package/src/runtime/routes/interface-routes.ts +0 -43
  661. /package/src/config/bundled-skills/{document → document-editor}/tools/document-create.ts +0 -0
  662. /package/src/config/bundled-skills/{document → document-editor}/tools/document-delete.ts +0 -0
  663. /package/src/config/bundled-skills/{document → document-editor}/tools/document-list.ts +0 -0
  664. /package/src/config/bundled-skills/{document → document-editor}/tools/document-read.ts +0 -0
  665. /package/src/config/bundled-skills/{document → document-editor}/tools/document-update.ts +0 -0
@@ -0,0 +1,40 @@
1
+ import { isPrivateOrLocalHost } from "../tools/network/url-safety.js";
2
+
3
+ /** Strip the trailing `:port` from a host string. IPv6 hosts are bracketed
4
+ * ("[::1]:8080" → "[::1]"); IPv4/DNS hosts have a single colon ("host:8080" → "host"). */
5
+ function stripPort(host: string): string {
6
+ if (host.startsWith("[")) {
7
+ const end = host.indexOf("]");
8
+ return end === -1 ? host : host.slice(0, end + 1);
9
+ }
10
+ const lastColon = host.lastIndexOf(":");
11
+ if (lastColon === -1) return host;
12
+ return host.slice(0, lastColon);
13
+ }
14
+
15
+ /** Match any IP literal — IPv4 dotted-quad or IPv6 (bracketed or bare with a colon).
16
+ * We reject every IP from the favicon path because we don't reverse-lookup hosts,
17
+ * so a raw IP — public or private — would expose the literal to Google when the
18
+ * client renders the icon. DNS names are fine; only literals are rejected. */
19
+ function isIPLiteral(host: string): boolean {
20
+ if (/^\d{1,3}(\.\d{1,3}){3}$/.test(host)) return true;
21
+ if (host.startsWith("[") || host.includes(":")) return true;
22
+ return false;
23
+ }
24
+
25
+ /** Deterministic favicon URL for a host using Google's s2 service.
26
+ * Returns undefined for empty/malformed hosts, raw IP literals, and any host
27
+ * isPrivateOrLocalHost flags. Callers omit the field on undefined so we never
28
+ * leak internal hostnames or arbitrary IPs to Google when clients render the
29
+ * icon. */
30
+ export function faviconUrlForDomain(domain: string): string | undefined {
31
+ const trimmed = domain.trim().toLowerCase();
32
+ if (!trimmed || trimmed.includes("/") || trimmed.includes(" ")) {
33
+ return undefined;
34
+ }
35
+ const hostOnly = stripPort(trimmed);
36
+ if (!hostOnly || isIPLiteral(hostOnly) || isPrivateOrLocalHost(hostOnly)) {
37
+ return undefined;
38
+ }
39
+ return `https://www.google.com/s2/favicons?domain=${encodeURIComponent(hostOnly)}&sz=64`;
40
+ }
@@ -17,7 +17,7 @@ import {
17
17
  getIsContainerized,
18
18
  } from "../config/env-registry.js";
19
19
  import { logSerializers } from "./log-redact.js";
20
- import { getLogPath } from "./platform.js";
20
+ import { getLogsDir } from "./platform.js";
21
21
  import { createSentryLogStream } from "./sentry-log-stream.js";
22
22
 
23
23
  /** Common pino-pretty options that inline [module] into the message prefix. */
@@ -87,7 +87,7 @@ function resolveLogDir(config: LogFileConfig): string | undefined {
87
87
  if (getIsContainerized()) {
88
88
  // Config has a host-specific path that can't be created inside the
89
89
  // container (e.g. /Users/…). Fall back to the default log directory.
90
- const fallback = join(getLogPath(), "..");
90
+ const fallback = getLogsDir();
91
91
  console.warn(
92
92
  `[logger] Configured logFile.dir "${config.dir}" cannot be created ` +
93
93
  `in container (${(err as Error).message}). Falling back to "${fallback}".`,
@@ -210,7 +210,8 @@ function getRootLogger(): pino.Logger {
210
210
  }
211
211
 
212
212
  try {
213
- const logPath = getLogPath();
213
+ const logDir = getLogsDir();
214
+ const logPath = logFilePathForDate(logDir, new Date());
214
215
  // Use sync: true so the fd is opened immediately. This prevents
215
216
  // "sonic boom is not ready yet" errors when commander calls
216
217
  // process.exit(0) for --help/--version before the async fd is ready.
@@ -247,6 +248,10 @@ function getRootLogger(): pino.Logger {
247
248
  fileStream,
248
249
  );
249
250
  }
251
+
252
+ // Register state so ensureCurrentDate() rebuilds across UTC midnight.
253
+ activeLogFileConfig = { dir: logDir, retentionDays: 0 };
254
+ activeLogDate = formatDate(new Date());
250
255
  } catch {
251
256
  rootLogger = pino(
252
257
  {
@@ -274,16 +279,20 @@ export function truncateForLog(value: string, maxLen = 500): string {
274
279
  /**
275
280
  * Returns a lazy logger that only initializes pino when a log method is called.
276
281
  * This avoids "sonic boom is not ready yet" errors when the process exits
277
- * quickly (e.g. `assistant --help`).
282
+ * quickly (e.g. `assistant --help`). The child is rebuilt whenever the
283
+ * underlying root logger changes (e.g. day rollover, late initLogger()).
278
284
  */
279
285
  export function getLogger(name: string): pino.Logger {
286
+ let cachedRoot: pino.Logger | null = null;
280
287
  let child: pino.Logger | null = null;
281
288
  const handler: ProxyHandler<pino.Logger> = {
282
289
  get(_target, prop, receiver) {
283
- if (!child) {
284
- child = getRootLogger().child({ module: name });
290
+ const root = getRootLogger();
291
+ if (root !== cachedRoot) {
292
+ cachedRoot = root;
293
+ child = root.child({ module: name });
285
294
  }
286
- const val = Reflect.get(child, prop, receiver);
295
+ const val = Reflect.get(child!, prop, receiver);
287
296
  if (typeof val === "function") {
288
297
  return val.bind(child);
289
298
  }
@@ -103,10 +103,6 @@ export function getSandboxWorkingDir(): string {
103
103
  return getWorkspaceDir();
104
104
  }
105
105
 
106
- export function getInterfacesDir(): string {
107
- return join(getDataDir(), "interfaces");
108
- }
109
-
110
106
  /**
111
107
  * Returns the sounds directory (~/.vellum/workspace/data/sounds).
112
108
  * Custom sound files and sound configuration live here.
@@ -162,8 +158,13 @@ export function getDbPath(): string {
162
158
  return join(getDataDir(), "db", "assistant.db");
163
159
  }
164
160
 
165
- export function getLogPath(): string {
166
- return join(getDataDir(), "logs", "vellum.log");
161
+ /**
162
+ * Returns the directory where logs live: `<dataDir>/logs/`. Files rotate
163
+ * daily (`assistant-YYYY-MM-DD.log`), so callers ask for the directory and
164
+ * let the logger own the filename.
165
+ */
166
+ export function getLogsDir(): string {
167
+ return join(getDataDir(), "logs");
167
168
  }
168
169
 
169
170
  export function getHistoryPath(): string {
@@ -413,7 +414,6 @@ export function ensureDataDir(): void {
413
414
  join(wsData, "memory", "knowledge"),
414
415
  join(wsData, "apps"),
415
416
  join(wsData, "attachments"),
416
- join(wsData, "interfaces"),
417
417
  join(wsData, "sounds"),
418
418
  ];
419
419
  for (const dir of dirs) {
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Shared helper for locating a `sqlite3` CLI binary on the host.
3
+ *
4
+ * Used by `memory/db-async-query.ts` so slow statements (`VACUUM`,
5
+ * `PRAGMA optimize`, large bulk deletes) can be shelled out to a
6
+ * subprocess and run without blocking the daemon's main event loop.
7
+ *
8
+ * Resolution order (matches the spirit of `bun-runtime.ts#findBun()`):
9
+ * 1. Common system install locations
10
+ * 2. `Bun.which("sqlite3")` (PATH lookup)
11
+ *
12
+ * Unlike `bun-runtime.ts`, this module does **not** download `sqlite3`
13
+ * when missing. The async path is opt-out (callers fall back to the
14
+ * synchronous in-process `bun:sqlite` connection); if a user wants the
15
+ * non-blocking behavior they install one package.
16
+ *
17
+ * On platform (k8s assistant container) `sqlite3` is installed in the
18
+ * Dockerfile, so the primary path is always available there. On macOS
19
+ * `sqlite3` ships with the OS. On most Linux distros it's available via
20
+ * the system package manager.
21
+ */
22
+
23
+ import { existsSync } from "node:fs";
24
+
25
+ let cachedSqlite3Path: string | undefined | null;
26
+
27
+ /**
28
+ * Synchronous lookup for a usable `sqlite3` CLI binary.
29
+ * Returns the path if found, `undefined` otherwise. Result is cached
30
+ * per-process so the filesystem checks only happen once.
31
+ */
32
+ export function findSqlite3(): string | undefined {
33
+ if (cachedSqlite3Path !== undefined) {
34
+ return cachedSqlite3Path ?? undefined;
35
+ }
36
+
37
+ // 1. Common install locations. We check these before `Bun.which` so we
38
+ // pick a deterministic, predictable binary even when PATH is
39
+ // unusual (e.g. a daemon launched with a stripped env).
40
+ for (const p of [
41
+ "/usr/bin/sqlite3",
42
+ "/usr/local/bin/sqlite3",
43
+ "/opt/homebrew/bin/sqlite3",
44
+ ]) {
45
+ if (existsSync(p)) {
46
+ cachedSqlite3Path = p;
47
+ return p;
48
+ }
49
+ }
50
+
51
+ // 2. PATH lookup.
52
+ const which = Bun.which("sqlite3");
53
+ if (which) {
54
+ cachedSqlite3Path = which;
55
+ return which;
56
+ }
57
+
58
+ cachedSqlite3Path = null;
59
+ return undefined;
60
+ }
61
+
62
+ /** Reset the cached lookup. Test-only. */
63
+ export function _resetSqlite3Cache(): void {
64
+ cachedSqlite3Path = undefined;
65
+ }
@@ -1,5 +1,12 @@
1
1
  import { execFile, spawnSync } from "node:child_process";
2
- import { existsSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
2
+ import {
3
+ chmodSync,
4
+ existsSync,
5
+ mkdirSync,
6
+ readFileSync,
7
+ unlinkSync,
8
+ writeFileSync,
9
+ } from "node:fs";
3
10
  import { join } from "node:path";
4
11
  import { promisify } from "node:util";
5
12
 
@@ -70,6 +77,41 @@ const WORKSPACE_GITIGNORE_RULES = [
70
77
  "session-token",
71
78
  ];
72
79
 
80
+ const NULL_GIT_OID = "0000000000000000000000000000000000000000";
81
+
82
+ const WORKSPACE_BRANCH_GUARD_HOOK = `#!/bin/sh
83
+ set -eu
84
+
85
+ state="\${1:-}"
86
+ if [ "$state" != "prepared" ]; then
87
+ exit 0
88
+ fi
89
+
90
+ while read -r _old_oid new_oid refname; do
91
+ case "$refname" in
92
+ refs/heads/main)
93
+ ;;
94
+ refs/heads/*)
95
+ if [ "$new_oid" = "${NULL_GIT_OID}" ]; then
96
+ continue
97
+ fi
98
+
99
+ cat >&2 <<MSG
100
+ Blocked: assistant workspace git branches are disabled.
101
+
102
+ Use the workspace main branch for assistant state. Create task branches only in
103
+ external product repositories or dedicated worktrees.
104
+
105
+ Rejected ref update: $refname
106
+ MSG
107
+ exit 1
108
+ ;;
109
+ esac
110
+ done
111
+
112
+ exit 0
113
+ `;
114
+
73
115
  /** Properties added by Node's child_process errors. */
74
116
  interface ExecError extends Error {
75
117
  killed?: boolean;
@@ -426,7 +468,9 @@ export class WorkspaceGitService {
426
468
  // These calls are OUTSIDE the rev-parse try/catch so that
427
469
  // normalization errors are not misclassified as "no commits".
428
470
  this.ensureGitignoreRulesLocked();
471
+ this.ensureBranchGuardHookLocked();
429
472
  await this.ensureCommitIdentityLocked();
473
+ await this.ensureBranchGuardConfigLocked();
430
474
  await this.ensureOnMainLocked();
431
475
  this.initialized = true;
432
476
  this.recordInitSuccess();
@@ -444,7 +488,9 @@ export class WorkspaceGitService {
444
488
  // in the corruption-recovery path we fall through here after
445
489
  // removing .git, so branch enforcement is still useful.
446
490
  this.ensureGitignoreRulesLocked();
491
+ this.ensureBranchGuardHookLocked();
447
492
  await this.ensureCommitIdentityLocked();
493
+ await this.ensureBranchGuardConfigLocked();
448
494
  await this.ensureOnMainLocked();
449
495
 
450
496
  // Create initial commit synchronously within the lock to prevent
@@ -452,9 +498,14 @@ export class WorkspaceGitService {
452
498
  // initial commit could run concurrently and consume edits meant
453
499
  // for the first user-requested commit.
454
500
  const status = await this.getStatusInternal();
455
- const hasExistingFiles =
456
- status.untracked.length > 1 || // More than just .gitignore
457
- status.untracked.some((f) => f !== ".gitignore");
501
+ const autoCreatedInitFiles = new Set([
502
+ ".gitignore",
503
+ ".githooks/",
504
+ ".githooks/reference-transaction",
505
+ ]);
506
+ const hasExistingFiles = status.untracked.some(
507
+ (f) => !autoCreatedInitFiles.has(f),
508
+ );
458
509
 
459
510
  await this.execGit(["add", "-A"]);
460
511
 
@@ -766,6 +817,26 @@ export class WorkspaceGitService {
766
817
  await this.execGit(["config", "user.email", gitEmail]);
767
818
  }
768
819
 
820
+ /**
821
+ * Ensure workspace branch guard hook is present.
822
+ * Must be called with the mutex lock held.
823
+ */
824
+ private ensureBranchGuardHookLocked(): void {
825
+ const hooksDir = join(this.workspaceDir, ".githooks");
826
+ const hookPath = join(hooksDir, "reference-transaction");
827
+ mkdirSync(hooksDir, { recursive: true });
828
+ writeFileSync(hookPath, WORKSPACE_BRANCH_GUARD_HOOK, "utf-8");
829
+ chmodSync(hookPath, 0o755);
830
+ }
831
+
832
+ /**
833
+ * Ensure workspace git uses the branch guard hook path.
834
+ * Must be called with the mutex lock held.
835
+ */
836
+ private async ensureBranchGuardConfigLocked(): Promise<void> {
837
+ await this.execGit(["config", "core.hooksPath", ".githooks"]);
838
+ }
839
+
769
840
  /**
770
841
  * Ensure the workspace repo is on the `main` branch.
771
842
  * If on a different branch or in detached HEAD state, switches to main
@@ -140,6 +140,7 @@ const GEMINI_CATALOG_MODELS = new Set<string>([
140
140
  "gemini-3.1-pro-preview-customtools",
141
141
  "gemini-3-flash-preview",
142
142
  "gemini-3.1-flash-lite-preview",
143
+ "gemini-3.1-flash-lite",
143
144
  "gemini-2.5-flash",
144
145
  "gemini-2.5-flash-lite",
145
146
  "gemini-2.5-pro",
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Workspace migration 088: Deprecate stale
3
+ * `prompts/system/08-background-conversation.md` overrides.
4
+ *
5
+ * PR #31210 moved the background-conversation guidance out of the bundled
6
+ * system prompt and into a per-turn user-message injector. As a side effect:
7
+ *
8
+ * - Workspace overrides that gated on `{{#isBackgroundConversation}}` now
9
+ * evaluate the gate as false (the key is no longer passed to the system
10
+ * prompt context) and silently stop rendering in background turns.
11
+ * - Plain-text overrides without a gate would now render unconditionally
12
+ * in ALL conversations — the opposite of intended behavior.
13
+ *
14
+ * Either failure mode is silent. To prevent it, this migration renames any
15
+ * existing `prompts/system/08-background-conversation.md` to
16
+ * `08-background-conversation.md.deprecated` so the section-discovery walker
17
+ * (which only picks up `.md` files) stops loading it, while preserving the
18
+ * user's customized text on disk for manual review.
19
+ *
20
+ * Idempotent: re-runs after `08-background-conversation.md` has already been
21
+ * renamed are no-ops. If both files exist (a user re-created the override
22
+ * after a prior partial run), the bundled section is gone — drop the `.md`
23
+ * and keep the previously-preserved `.deprecated` copy.
24
+ */
25
+
26
+ import { existsSync, renameSync, unlinkSync } from "node:fs";
27
+ import { join } from "node:path";
28
+
29
+ import { getLogger } from "../../util/logger.js";
30
+ import type { WorkspaceMigration } from "./types.js";
31
+
32
+ const log = getLogger(
33
+ "workspace-migration-088-deprecate-background-conversation-override",
34
+ );
35
+
36
+ const OVERRIDE_FILENAME = "08-background-conversation.md";
37
+ const DEPRECATED_FILENAME = "08-background-conversation.md.deprecated";
38
+
39
+ export const deprecateBackgroundConversationOverrideMigration: WorkspaceMigration =
40
+ {
41
+ id: "088-deprecate-background-conversation-override",
42
+ description:
43
+ "Rename stale prompts/system/08-background-conversation.md overrides to .deprecated so they stop rendering after the section moved to a per-turn injector",
44
+ retryFailedCheckpoint: true,
45
+
46
+ run(workspaceDir: string): void {
47
+ const promptDir = join(workspaceDir, "prompts", "system");
48
+ const overridePath = join(promptDir, OVERRIDE_FILENAME);
49
+ const deprecatedPath = join(promptDir, DEPRECATED_FILENAME);
50
+
51
+ if (!existsSync(overridePath)) return;
52
+
53
+ if (existsSync(deprecatedPath)) {
54
+ try {
55
+ unlinkSync(overridePath);
56
+ log.info(
57
+ { path: overridePath, preserved: deprecatedPath },
58
+ "Removed re-created background-conversation override; preserved copy already exists",
59
+ );
60
+ } catch (err) {
61
+ log.warn(
62
+ { err, path: overridePath },
63
+ "Failed to remove background-conversation override",
64
+ );
65
+ throw err;
66
+ }
67
+ return;
68
+ }
69
+
70
+ try {
71
+ renameSync(overridePath, deprecatedPath);
72
+ log.info(
73
+ { from: overridePath, to: deprecatedPath },
74
+ "Renamed stale background-conversation override to .deprecated",
75
+ );
76
+ } catch (err) {
77
+ log.warn(
78
+ { err, from: overridePath, to: deprecatedPath },
79
+ "Failed to rename background-conversation override",
80
+ );
81
+ throw err;
82
+ }
83
+ },
84
+
85
+ down(workspaceDir: string): void {
86
+ const promptDir = join(workspaceDir, "prompts", "system");
87
+ const overridePath = join(promptDir, OVERRIDE_FILENAME);
88
+ const deprecatedPath = join(promptDir, DEPRECATED_FILENAME);
89
+
90
+ if (!existsSync(deprecatedPath)) return;
91
+ if (existsSync(overridePath)) return;
92
+
93
+ try {
94
+ renameSync(deprecatedPath, overridePath);
95
+ } catch (err) {
96
+ log.warn(
97
+ { err, from: deprecatedPath, to: overridePath },
98
+ "Failed to restore background-conversation override",
99
+ );
100
+ throw err;
101
+ }
102
+ },
103
+ };
@@ -0,0 +1,86 @@
1
+ import * as fs from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+
4
+ import { getLogger } from "../../util/logger.js";
5
+ import type { WorkspaceMigration } from "./types.js";
6
+
7
+ const log = getLogger("workspace-migration-089-move-memory-tree-out-of-v3");
8
+
9
+ function isNotFoundError(err: unknown): boolean {
10
+ return (
11
+ typeof err === "object" &&
12
+ err !== null &&
13
+ "code" in err &&
14
+ err.code === "ENOENT"
15
+ );
16
+ }
17
+
18
+ /**
19
+ * Move `<workspace>/memory/<fromRel>` to `<workspace>/memory/<toRel>` when the
20
+ * source exists and the destination does not. Idempotent: a missing source is a
21
+ * no-op (already migrated, or never created), and an existing destination is
22
+ * left untouched (we never clobber). Both directions go through here so `run`
23
+ * and `down` share the same safety checks.
24
+ */
25
+ function moveMemorySubdir(
26
+ workspaceDir: string,
27
+ fromRel: string,
28
+ toRel: string,
29
+ ): void {
30
+ const memoryDir = join(workspaceDir, "memory");
31
+ const src = join(memoryDir, fromRel);
32
+ const dest = join(memoryDir, toRel);
33
+ try {
34
+ if (!fs.existsSync(src)) return;
35
+ if (fs.existsSync(dest)) {
36
+ log.warn(
37
+ { src, dest },
38
+ "Both source and destination tree dirs exist; leaving in place for manual resolution",
39
+ );
40
+ return;
41
+ }
42
+ fs.mkdirSync(dirname(dest), { recursive: true });
43
+ fs.renameSync(src, dest);
44
+ log.info({ src, dest }, "Moved memory tree directory");
45
+ } catch (err) {
46
+ if (isNotFoundError(err)) return;
47
+ log.warn({ err, src, dest }, "Failed to move memory tree directory");
48
+ throw err;
49
+ }
50
+ }
51
+
52
+ /** Remove `<workspace>/memory/v3` if it is now an empty wrapper (the tree was
53
+ * its only child). Best-effort — a non-empty or missing dir is left alone. */
54
+ function removeEmptyV3Wrapper(workspaceDir: string): void {
55
+ const v3Dir = join(workspaceDir, "memory", "v3");
56
+ try {
57
+ if (fs.existsSync(v3Dir) && fs.readdirSync(v3Dir).length === 0) {
58
+ fs.rmdirSync(v3Dir);
59
+ }
60
+ } catch {
61
+ // Non-fatal: leaving an empty memory/v3 wrapper is harmless.
62
+ }
63
+ }
64
+
65
+ /**
66
+ * Relocate the v3 memory tree from `memory/v3/tree` to `memory/tree`.
67
+ *
68
+ * The tree is a DAG overlay over the flat `memory/concepts/` pages and is now a
69
+ * top-level sibling of `concepts/` (matching the storage design), no longer
70
+ * nested under a `v3/` wrapper. `getTreeDir` reads `memory/tree` after this
71
+ * change, so any pre-existing hand-authored tree must move with it.
72
+ */
73
+ export const moveMemoryTreeOutOfV3Migration: WorkspaceMigration = {
74
+ id: "089-move-memory-tree-out-of-v3",
75
+ description: "Relocate the v3 memory tree from memory/v3/tree to memory/tree",
76
+ retryFailedCheckpoint: true,
77
+
78
+ run(workspaceDir: string): void {
79
+ moveMemorySubdir(workspaceDir, join("v3", "tree"), "tree");
80
+ removeEmptyV3Wrapper(workspaceDir);
81
+ },
82
+
83
+ down(workspaceDir: string): void {
84
+ moveMemorySubdir(workspaceDir, "tree", join("v3", "tree"));
85
+ },
86
+ };
@@ -85,6 +85,8 @@ import { removeLegacySkillsIndexMigration } from "./084-remove-legacy-skills-ind
85
85
  import { memoryV2Bm25BReembedDisabledV2PagesMigration } from "./085-memory-v2-bm25-b-reembed-disabled-v2-pages.js";
86
86
  import { revertStaleGeminiMisRewritesMigration } from "./086-revert-stale-gemini-mis-rewrites.js";
87
87
  import { memoryRouterBalancedProfileMigration } from "./087-memory-router-balanced-profile.js";
88
+ import { deprecateBackgroundConversationOverrideMigration } from "./088-deprecate-background-conversation-override.js";
89
+ import { moveMemoryTreeOutOfV3Migration } from "./089-move-memory-tree-out-of-v3.js";
88
90
  import { migrateToWorkspaceVolumeMigration } from "./migrate-to-workspace-volume.js";
89
91
  import type { WorkspaceMigration } from "./types.js";
90
92
 
@@ -181,4 +183,6 @@ export const WORKSPACE_MIGRATIONS: WorkspaceMigration[] = [
181
183
  memoryV2Bm25BReembedDisabledV2PagesMigration,
182
184
  revertStaleGeminiMisRewritesMigration,
183
185
  memoryRouterBalancedProfileMigration,
186
+ deprecateBackgroundConversationOverrideMigration,
187
+ moveMemoryTreeOutOfV3Migration,
184
188
  ];