@vellumai/assistant 0.8.2 → 0.8.4

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 (503) hide show
  1. package/ARCHITECTURE.md +11 -12
  2. package/docker-entrypoint.sh +13 -2
  3. package/docker-init-apt-root.sh +79 -6
  4. package/node_modules/@vellumai/gateway-client/src/types.ts +2 -0
  5. package/openapi.yaml +945 -36
  6. package/package.json +1 -1
  7. package/src/__tests__/agent-loop-exit-reason.test.ts +271 -0
  8. package/src/__tests__/agent-loop-override-profile.test.ts +1 -1
  9. package/src/__tests__/agent-loop-provider-error-recording.test.ts +195 -0
  10. package/src/__tests__/agent-loop.test.ts +88 -3
  11. package/src/__tests__/anthropic-provider.test.ts +272 -0
  12. package/src/__tests__/approval-cascade.test.ts +1 -1
  13. package/src/__tests__/background-workers-disk-pressure.test.ts +2 -1
  14. package/src/__tests__/channel-delivery-store.test.ts +193 -0
  15. package/src/__tests__/channel-reply-delivery.test.ts +284 -5
  16. package/src/__tests__/channel-retry-sweep.test.ts +274 -1
  17. package/src/__tests__/compaction-events.test.ts +1 -1
  18. package/src/__tests__/compactor-preserved-tail-count.test.ts +110 -0
  19. package/src/__tests__/compactor-tail-resolution.test.ts +107 -1
  20. package/src/__tests__/config-get-vision-flag.test.ts +136 -0
  21. package/src/__tests__/config-loader-backfill.test.ts +115 -18
  22. package/src/__tests__/config-watcher.test.ts +1 -1
  23. package/src/__tests__/context-token-estimator.test.ts +112 -57
  24. package/src/__tests__/conversation-abort-tool-results.test.ts +1 -1
  25. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +54 -3
  26. package/src/__tests__/conversation-agent-loop-overflow.test.ts +31 -6
  27. package/src/__tests__/conversation-agent-loop.test.ts +77 -3
  28. package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
  29. package/src/__tests__/conversation-clean-command.test.ts +137 -0
  30. package/src/__tests__/conversation-confirmation-signals.test.ts +1 -1
  31. package/src/__tests__/conversation-fork-crud.test.ts +161 -0
  32. package/src/__tests__/conversation-lifecycle.test.ts +1 -1
  33. package/src/__tests__/conversation-load-cleaned-at.test.ts +279 -0
  34. package/src/__tests__/conversation-load-history-repair.test.ts +1 -1
  35. package/src/__tests__/conversation-media-retry.test.ts +19 -8
  36. package/src/__tests__/conversation-pairing.test.ts +2 -2
  37. package/src/__tests__/conversation-process-callsite.test.ts +1 -1
  38. package/src/__tests__/conversation-provider-retry-repair.test.ts +1 -1
  39. package/src/__tests__/conversation-queue.test.ts +1 -1
  40. package/src/__tests__/conversation-runtime-assembly.test.ts +290 -85
  41. package/src/__tests__/conversation-seed-composer.test.ts +66 -4
  42. package/src/__tests__/conversation-slash-commands.test.ts +36 -8
  43. package/src/__tests__/conversation-slash-queue.test.ts +1 -1
  44. package/src/__tests__/conversation-slash-unknown.test.ts +1 -1
  45. package/src/__tests__/conversation-speed-override.test.ts +1 -1
  46. package/src/__tests__/conversation-surfaces-task-progress.test.ts +220 -0
  47. package/src/__tests__/conversation-workspace-cache-state.test.ts +1 -1
  48. package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
  49. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -1
  50. package/src/__tests__/credential-security-invariants.test.ts +6 -0
  51. package/src/__tests__/cu-unified-flow.test.ts +10 -1
  52. package/src/__tests__/date-context.test.ts +45 -0
  53. package/src/__tests__/dm-backfill.test.ts +64 -0
  54. package/src/__tests__/dm-persistence.test.ts +33 -0
  55. package/src/__tests__/document-find-replace.test.ts +501 -0
  56. package/src/__tests__/external-plugin-loader.test.ts +91 -19
  57. package/src/__tests__/first-greeting.test.ts +23 -2
  58. package/src/__tests__/guardian-action-no-hardcoded-copy.test.ts +0 -1
  59. package/src/__tests__/guardian-dispatch.test.ts +1 -0
  60. package/src/__tests__/headless-browser-navigate.test.ts +172 -0
  61. package/src/__tests__/heartbeat-service.test.ts +24 -164
  62. package/src/__tests__/helpers/channel-test-adapter.ts +0 -2
  63. package/src/__tests__/host-app-control-proxy.test.ts +241 -0
  64. package/src/__tests__/host-bash-proxy.test.ts +6 -0
  65. package/src/__tests__/host-browser-proxy.test.ts +10 -0
  66. package/src/__tests__/host-cu-proxy.test.ts +8 -1
  67. package/src/__tests__/host-file-proxy.test.ts +8 -1
  68. package/src/__tests__/host-proxy-preactivation.test.ts +200 -13
  69. package/src/__tests__/host-transfer-proxy.test.ts +8 -1
  70. package/src/__tests__/identity-routes.test.ts +57 -0
  71. package/src/__tests__/inbound-slack-persistence.test.ts +3 -0
  72. package/src/__tests__/injector-background-turn.test.ts +153 -0
  73. package/src/__tests__/injector-chain.test.ts +7 -0
  74. package/src/__tests__/injector-document-comments.test.ts +378 -0
  75. package/src/__tests__/injector-pkb-v2-silenced.test.ts +4 -25
  76. package/src/__tests__/lifecycle-memory-v2-seed.test.ts +9 -2
  77. package/src/__tests__/list-messages-attachments.test.ts +21 -17
  78. package/src/__tests__/list-messages-hidden-metadata.test.ts +217 -0
  79. package/src/__tests__/list-messages-page-latest.test.ts +130 -14
  80. package/src/__tests__/list-messages-tool-merge.test.ts +17 -16
  81. package/src/__tests__/llm-callsite-catalog.test.ts +25 -0
  82. package/src/__tests__/llm-catalog-parity.test.ts +3 -0
  83. package/src/__tests__/llm-context-normalization.test.ts +0 -2
  84. package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +116 -0
  85. package/src/__tests__/llm-request-log-error-payload.test.ts +138 -0
  86. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +2 -0
  87. package/src/__tests__/llm-resolver.test.ts +340 -3
  88. package/src/__tests__/log-export-routes.test.ts +99 -2
  89. package/src/__tests__/managed-profile-guard.test.ts +10 -0
  90. package/src/__tests__/message-queue-steer.test.ts +114 -0
  91. package/src/__tests__/notification-decision-fallback.test.ts +0 -91
  92. package/src/__tests__/notification-decision-strategy.test.ts +14 -31
  93. package/src/__tests__/notification-deep-link.test.ts +15 -0
  94. package/src/__tests__/notification-guardian-path.test.ts +1 -2
  95. package/src/__tests__/notification-platform-adapter.test.ts +5 -4
  96. package/src/__tests__/notification-telegram-adapter.test.ts +1 -0
  97. package/src/__tests__/notification-vellum-adapter.test.ts +113 -0
  98. package/src/__tests__/openai-provider.test.ts +323 -3
  99. package/src/__tests__/openai-responses-cutover-guard.test.ts +3 -3
  100. package/src/__tests__/openai-responses-provider.test.ts +4 -4
  101. package/src/__tests__/openrouter-provider-only.test.ts +51 -3
  102. package/src/__tests__/openrouter-token-estimation.test.ts +34 -25
  103. package/src/__tests__/outbound-slack-persistence.test.ts +187 -20
  104. package/src/__tests__/pending-interactions-resolved-event.test.ts +190 -0
  105. package/src/__tests__/platform-proxy-context.test.ts +6 -1
  106. package/src/__tests__/platform.test.ts +0 -3
  107. package/src/__tests__/plugin-source-watcher.test.ts +302 -0
  108. package/src/__tests__/plugin-tool-contribution.test.ts +3 -3
  109. package/src/__tests__/plugin-types.test.ts +2 -2
  110. package/src/__tests__/process-message-background-slack.test.ts +1 -51
  111. package/src/__tests__/process-message-display-content.test.ts +21 -16
  112. package/src/__tests__/provider-catalog-visibility.test.ts +16 -0
  113. package/src/__tests__/provider-platform-proxy-integration.test.ts +27 -25
  114. package/src/__tests__/secret-routes-platform-proxy.test.ts +1 -1
  115. package/src/__tests__/server-history-render.test.ts +83 -4
  116. package/src/__tests__/steer-tool-repair.test.ts +249 -0
  117. package/src/__tests__/system-prompt.test.ts +57 -101
  118. package/src/__tests__/terminal-tools.test.ts +11 -1
  119. package/src/__tests__/thinking-block-replay.test.ts +113 -0
  120. package/src/__tests__/thread-backfill.test.ts +370 -22
  121. package/src/__tests__/tool-executor.test.ts +90 -1
  122. package/src/__tests__/tool-result-metadata-plumbing.test.ts +167 -0
  123. package/src/__tests__/twilio-routes.test.ts +1 -1
  124. package/src/__tests__/web-fetch.test.ts +2 -2
  125. package/src/__tests__/workspace-git-service.test.ts +88 -5
  126. package/src/__tests__/workspace-migration-087-memory-router-balanced-profile.test.ts +228 -0
  127. package/src/__tests__/workspace-migration-088-deprecate-background-conversation-override.test.ts +158 -0
  128. package/src/a2a/__tests__/agent-card.test.ts +98 -0
  129. package/src/a2a/__tests__/e2e-a2a-channel.test.ts +597 -0
  130. package/src/a2a/__tests__/protocol-helpers.test.ts +113 -0
  131. package/src/a2a/__tests__/task-store.test.ts +246 -0
  132. package/src/a2a/agent-card.ts +58 -0
  133. package/src/a2a/feature-gate.ts +8 -0
  134. package/src/a2a/protocol-constants.ts +21 -0
  135. package/src/a2a/protocol-errors.ts +50 -0
  136. package/src/a2a/protocol-types.ts +162 -0
  137. package/src/a2a/task-store.ts +168 -0
  138. package/src/agent/attachments.ts +1 -0
  139. package/src/agent/loop.ts +208 -22
  140. package/src/background-wake/next-wake.test.ts +289 -0
  141. package/src/background-wake/next-wake.ts +172 -0
  142. package/src/browser/operations.ts +15 -0
  143. package/src/channels/config.ts +9 -0
  144. package/src/channels/types.ts +14 -0
  145. package/src/cli/commands/__tests__/conversations-slack.test.ts +572 -0
  146. package/src/cli/commands/__tests__/memory-v2.test.ts +9 -12
  147. package/src/cli/{__tests__ → commands/__tests__}/notifications.test.ts +201 -28
  148. package/src/cli/commands/__tests__/schedules.test.ts +469 -0
  149. package/src/cli/commands/conversations.ts +128 -1
  150. package/src/cli/commands/inference-providers.ts +147 -1
  151. package/src/cli/commands/memory-v2.ts +308 -0
  152. package/src/cli/commands/notifications.ts +89 -37
  153. package/src/cli/commands/plugins.ts +67 -0
  154. package/src/cli/commands/schedules.ts +297 -5
  155. package/src/cli/lib/__tests__/search-plugins.test.ts +261 -0
  156. package/src/cli/lib/install-from-github.ts +8 -9
  157. package/src/cli/lib/search-plugins.ts +163 -0
  158. package/src/cli/program.ts +14 -0
  159. package/src/cli/utils/conversation-id.ts +17 -5
  160. package/src/config/assistant-feature-flags.ts +24 -54
  161. package/src/config/bundled-skills/app-builder/SKILL.md +117 -1
  162. package/src/config/bundled-skills/document-editor/SKILL.md +115 -0
  163. package/src/config/bundled-skills/document-editor/TOOLS.json +240 -0
  164. package/src/config/bundled-skills/document-editor/tools/comment-list.ts +12 -0
  165. package/src/config/bundled-skills/document-editor/tools/comment-reply.ts +12 -0
  166. package/src/config/bundled-skills/document-editor/tools/comment-resolve.ts +12 -0
  167. package/src/config/bundled-skills/document-editor/tools/document-find.ts +12 -0
  168. package/src/config/bundled-skills/document-editor/tools/document-replace-text.ts +12 -0
  169. package/src/config/bundled-skills/media-processing/SKILL.md +8 -0
  170. package/src/config/bundled-skills/phone-calls/SKILL.md +1 -1
  171. package/src/config/bundled-skills/schedule/SKILL.md +8 -0
  172. package/src/config/bundled-tool-registry.ts +22 -12
  173. package/src/config/call-site-defaults.ts +124 -0
  174. package/src/config/feature-flag-registry.json +111 -23
  175. package/src/config/llm-resolver.ts +66 -1
  176. package/src/config/schema.ts +2 -0
  177. package/src/config/schemas/__tests__/memory-v2.test.ts +7 -3
  178. package/src/config/schemas/call-site-catalog.ts +21 -0
  179. package/src/config/schemas/channels.ts +9 -0
  180. package/src/config/schemas/conversations.ts +10 -0
  181. package/src/config/schemas/heartbeat.ts +14 -0
  182. package/src/config/schemas/llm.ts +4 -3
  183. package/src/config/schemas/memory-retrospective.ts +1 -1
  184. package/src/config/schemas/memory-v2.ts +51 -4
  185. package/src/config/schemas/memory.ts +3 -1
  186. package/src/config/seed-inference-profiles.ts +99 -29
  187. package/src/context/compactor.ts +80 -13
  188. package/src/context/token-estimator.ts +72 -31
  189. package/src/context/window-manager.ts +25 -0
  190. package/src/credential-health/credential-health-service.ts +34 -19
  191. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +3 -22
  192. package/src/daemon/__tests__/conversation-tool-setup.test.ts +66 -6
  193. package/src/daemon/__tests__/native-web-search-metadata.test.ts +357 -0
  194. package/src/daemon/__tests__/web-search-status-text.test.ts +287 -0
  195. package/src/daemon/conversation-agent-loop-handlers.ts +231 -23
  196. package/src/daemon/conversation-agent-loop.ts +252 -56
  197. package/src/daemon/conversation-lifecycle.ts +142 -116
  198. package/src/daemon/conversation-messaging.ts +3 -0
  199. package/src/daemon/conversation-process.ts +273 -0
  200. package/src/daemon/conversation-queue-manager.ts +14 -0
  201. package/src/daemon/conversation-runtime-assembly.ts +144 -75
  202. package/src/daemon/conversation-slash.ts +37 -5
  203. package/src/daemon/conversation-surfaces.ts +45 -2
  204. package/src/daemon/conversation-tool-setup.ts +7 -0
  205. package/src/daemon/conversation.ts +42 -12
  206. package/src/daemon/date-context.ts +40 -0
  207. package/src/daemon/first-greeting.ts +10 -0
  208. package/src/daemon/guardian-action-generators.ts +1 -125
  209. package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +498 -0
  210. package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +248 -0
  211. package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +154 -0
  212. package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +133 -0
  213. package/src/daemon/handlers/__tests__/config-a2a.test.ts +95 -0
  214. package/src/daemon/handlers/config-a2a.ts +449 -0
  215. package/src/daemon/handlers/config-model.test.ts +1 -0
  216. package/src/daemon/handlers/conversations.ts +80 -0
  217. package/src/daemon/handlers/shared.ts +92 -29
  218. package/src/daemon/host-app-control-proxy.ts +69 -18
  219. package/src/daemon/host-bash-proxy.ts +1 -1
  220. package/src/daemon/host-cu-proxy.ts +1 -1
  221. package/src/daemon/host-file-proxy.ts +1 -1
  222. package/src/daemon/host-proxy-preactivation.ts +85 -18
  223. package/src/daemon/host-transfer-proxy.ts +1 -1
  224. package/src/daemon/lifecycle.ts +67 -65
  225. package/src/daemon/memory-v2-startup.ts +49 -13
  226. package/src/daemon/message-protocol.ts +4 -0
  227. package/src/daemon/message-types/conversations.ts +8 -0
  228. package/src/daemon/message-types/document-comments.ts +50 -0
  229. package/src/daemon/message-types/messages.ts +68 -1
  230. package/src/daemon/message-types/notifications.ts +21 -0
  231. package/src/daemon/message-types/surfaces.ts +3 -1
  232. package/src/daemon/message-types/web-activity.ts +57 -0
  233. package/src/daemon/pkb-reminder-builder.test.ts +10 -53
  234. package/src/daemon/pkb-reminder-builder.ts +4 -19
  235. package/src/daemon/plugin-source-watcher.ts +135 -3
  236. package/src/daemon/process-message.ts +72 -12
  237. package/src/daemon/query-complexity-router.ts +75 -0
  238. package/src/daemon/skill-memory-refresh.ts +5 -1
  239. package/src/daemon/trust-context.ts +6 -0
  240. package/src/daemon/wake-target-adapter.ts +2 -0
  241. package/src/documents/document-comments-store.test.ts +338 -0
  242. package/src/documents/document-comments-store.ts +237 -0
  243. package/src/documents/document-store.ts +202 -0
  244. package/src/export/__tests__/transcript-formatter.test.ts +121 -0
  245. package/src/export/transcript-formatter.ts +54 -20
  246. package/src/heartbeat/__tests__/heartbeat-service.test.ts +44 -1
  247. package/src/heartbeat/heartbeat-service.ts +35 -191
  248. package/src/home/__tests__/feed-types.test.ts +40 -0
  249. package/src/home/__tests__/suggested-prompts.test.ts +33 -2
  250. package/src/home/feed-types.ts +20 -3
  251. package/src/home/home-content-refresh.ts +52 -0
  252. package/src/home/home-greeting-cache.ts +69 -0
  253. package/src/home/home-greeting.ts +94 -0
  254. package/src/home/suggested-prompts.ts +177 -9
  255. package/src/ipc/cli-client.ts +147 -45
  256. package/src/memory/__tests__/conversation-queries.test.ts +220 -0
  257. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +135 -2
  258. package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +2 -50
  259. package/src/memory/__tests__/memory-retrospective-job.test.ts +407 -10
  260. package/src/memory/conversation-crud.ts +133 -43
  261. package/src/memory/conversation-queries.ts +87 -1
  262. package/src/memory/conversation-title-service.ts +26 -4
  263. package/src/memory/db-init.ts +22 -0
  264. package/src/memory/delivery-crud.ts +41 -0
  265. package/src/memory/delivery-status.ts +141 -15
  266. package/src/memory/external-conversation-store.ts +32 -1
  267. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +84 -3
  268. package/src/memory/graph/conversation-graph-memory.ts +18 -6
  269. package/src/memory/graph/tools.ts +6 -37
  270. package/src/memory/invite-store.ts +53 -0
  271. package/src/memory/jobs-worker.ts +21 -1
  272. package/src/memory/llm-request-log-source-clickhouse.ts +7 -2
  273. package/src/memory/llm-request-log-store.ts +92 -1
  274. package/src/memory/memory-retrospective-constants.ts +28 -0
  275. package/src/memory/memory-retrospective-enqueue.ts +4 -22
  276. package/src/memory/memory-retrospective-job.ts +438 -21
  277. package/src/memory/memory-retrospective-startup-cleanup.ts +3 -3
  278. package/src/memory/memory-v2-activation-log-store.ts +26 -8
  279. package/src/memory/migrations/100-core-tables.ts +1 -0
  280. package/src/memory/migrations/109-external-conversation-bindings.ts +1 -0
  281. package/src/memory/migrations/250-provider-connection-base-url-and-models.ts +28 -0
  282. package/src/memory/migrations/251-a2a-tasks.ts +49 -0
  283. package/src/memory/migrations/252-llm-request-log-agent-loop-exit-reason.ts +32 -0
  284. package/src/memory/migrations/253-conversation-last-notified-profile.ts +15 -0
  285. package/src/memory/migrations/253-document-comments.ts +47 -0
  286. package/src/memory/migrations/254-external-conversation-binding-chat-name.ts +43 -0
  287. package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +24 -0
  288. package/src/memory/migrations/256-memory-v2-injection-events.ts +113 -0
  289. package/src/memory/migrations/257-strip-base-url-non-openai-compatible.ts +22 -0
  290. package/src/memory/migrations/258-onboarding-events-prior-assistants.ts +13 -0
  291. package/src/memory/migrations/259-conversation-cleaned-at.ts +33 -0
  292. package/src/memory/migrations/index.ts +20 -0
  293. package/src/memory/migrations/registry.ts +33 -0
  294. package/src/memory/onboarding-events-store.ts +7 -0
  295. package/src/memory/schema/a2a.ts +15 -0
  296. package/src/memory/schema/calls.ts +1 -0
  297. package/src/memory/schema/conversations.ts +3 -0
  298. package/src/memory/schema/index.ts +1 -0
  299. package/src/memory/schema/inference.ts +2 -0
  300. package/src/memory/schema/infrastructure.ts +2 -0
  301. package/src/memory/v2/__tests__/activation-store.test.ts +25 -23
  302. package/src/memory/v2/__tests__/cli-command-store.test.ts +404 -0
  303. package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +25 -4
  304. package/src/memory/v2/__tests__/injection-events.test.ts +318 -0
  305. package/src/memory/v2/__tests__/injection.test.ts +221 -17
  306. package/src/memory/v2/__tests__/page-index.test.ts +365 -1
  307. package/src/memory/v2/__tests__/router.test.ts +489 -1
  308. package/src/memory/v2/__tests__/static-context.test.ts +12 -1
  309. package/src/memory/v2/activation-store.ts +14 -16
  310. package/src/memory/v2/cli-command-content.ts +19 -0
  311. package/src/memory/v2/cli-command-store.ts +304 -0
  312. package/src/memory/v2/consolidation-job.ts +14 -0
  313. package/src/memory/v2/frontmatter-sweep.ts +7 -1
  314. package/src/memory/v2/injection-events.ts +101 -0
  315. package/src/memory/v2/injection.ts +69 -29
  316. package/src/memory/v2/page-index.ts +246 -19
  317. package/src/memory/v2/page-store.ts +18 -0
  318. package/src/memory/v2/router.ts +209 -55
  319. package/src/memory/v2/static-context.ts +4 -4
  320. package/src/memory/v2/types.ts +23 -0
  321. package/src/messaging/providers/a2a/__tests__/deliver.test.ts +274 -0
  322. package/src/messaging/providers/a2a/deliver.ts +156 -0
  323. package/src/messaging/providers/gmail/client.ts +9 -2
  324. package/src/messaging/providers/index.ts +18 -3
  325. package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +329 -3
  326. package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +34 -1
  327. package/src/messaging/providers/slack/adapter.ts +178 -25
  328. package/src/messaging/providers/slack/api.test.ts +54 -0
  329. package/src/messaging/providers/slack/api.ts +119 -3
  330. package/src/messaging/providers/slack/client.ts +12 -0
  331. package/src/messaging/providers/slack/deep-link.ts +20 -1
  332. package/src/messaging/providers/slack/message-metadata.test.ts +48 -0
  333. package/src/messaging/providers/slack/message-metadata.ts +156 -0
  334. package/src/messaging/providers/slack/render-transcript.test.ts +107 -75
  335. package/src/messaging/providers/slack/render-transcript.ts +176 -49
  336. package/src/messaging/providers/slack/send.test.ts +77 -0
  337. package/src/messaging/providers/slack/send.ts +8 -2
  338. package/src/messaging/providers/slack/types.ts +14 -0
  339. package/src/notifications/__tests__/broadcaster.test.ts +203 -0
  340. package/src/notifications/__tests__/decision-engine.test.ts +283 -0
  341. package/src/notifications/__tests__/deterministic-checks.test.ts +286 -0
  342. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +5 -1
  343. package/src/notifications/__tests__/home-feed-side-effect.test.ts +521 -36
  344. package/src/notifications/adapters/macos.ts +12 -2
  345. package/src/notifications/broadcaster.ts +29 -4
  346. package/src/notifications/conversation-seed-composer.ts +14 -2
  347. package/src/notifications/copy-composer.ts +17 -64
  348. package/src/notifications/decision-engine.ts +111 -44
  349. package/src/notifications/deferred-emit.ts +135 -0
  350. package/src/notifications/deterministic-checks.ts +96 -0
  351. package/src/notifications/emit-signal.ts +10 -1
  352. package/src/notifications/home-feed-side-effect.ts +136 -27
  353. package/src/notifications/signal.ts +0 -4
  354. package/src/notifications/types.ts +8 -0
  355. package/src/oauth/connect-orchestrator.ts +3 -0
  356. package/src/oauth/credential-token-resolver.ts +2 -0
  357. package/src/oauth/manual-token-connection.ts +19 -0
  358. package/src/oauth/oauth-store.ts +12 -0
  359. package/src/oauth/platform-connection.test.ts +43 -3
  360. package/src/oauth/platform-connection.ts +13 -4
  361. package/src/oauth/seed-providers.ts +22 -0
  362. package/src/permissions/prompter.ts +5 -2
  363. package/src/permissions/secret-prompter.ts +4 -1
  364. package/src/plugins/defaults/injectors.ts +118 -26
  365. package/src/plugins/external-plugin-loader.ts +82 -10
  366. package/src/plugins/types.ts +16 -7
  367. package/src/prompts/__tests__/system-prompt.test.ts +44 -45
  368. package/src/prompts/__tests__/task-progress-hint-section.test.ts +4 -8
  369. package/src/prompts/normalize-onboarding.ts +40 -0
  370. package/src/prompts/sections.ts +32 -14
  371. package/src/prompts/system-prompt.ts +105 -76
  372. package/src/prompts/template-detection.ts +37 -0
  373. package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +141 -0
  374. package/src/prompts/templates/BOOTSTRAP.md +13 -5
  375. package/src/prompts/templates/VOICE.md +3 -0
  376. package/src/prompts/templates/system-sections.ts +51 -10
  377. package/src/providers/__tests__/inference.test.ts +2 -0
  378. package/src/providers/anthropic/client.ts +132 -5
  379. package/src/providers/call-site-routing.ts +24 -6
  380. package/src/providers/connection-resolution.ts +63 -13
  381. package/src/providers/fireworks/client.ts +20 -2
  382. package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +74 -0
  383. package/src/providers/inference/__tests__/base-url-route-validation.test.ts +342 -0
  384. package/src/providers/inference/__tests__/base-url-security.test.ts +189 -0
  385. package/src/providers/inference/__tests__/codex-token-refresh.test.ts +254 -0
  386. package/src/providers/inference/__tests__/connections-openai-compatible.test.ts +175 -0
  387. package/src/providers/inference/__tests__/connections-status-label.test.ts +15 -0
  388. package/src/providers/inference/adapter-factory.ts +24 -21
  389. package/src/providers/inference/auth.ts +15 -3
  390. package/src/providers/inference/backfill.ts +14 -1
  391. package/src/providers/inference/codex-token-refresh.ts +128 -0
  392. package/src/providers/inference/connections.ts +85 -5
  393. package/src/providers/inference/resolve-auth.ts +50 -5
  394. package/src/providers/model-catalog.ts +244 -242
  395. package/src/providers/model-intents.ts +3 -3
  396. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +235 -0
  397. package/src/providers/openai/chat-completions-provider.ts +215 -25
  398. package/src/providers/openai/responses-provider.ts +9 -3
  399. package/src/providers/openrouter/client.ts +46 -4
  400. package/src/providers/platform-proxy/constants.ts +3 -4
  401. package/src/providers/provider-catalog-visibility.ts +3 -1
  402. package/src/providers/provider-send-message.ts +27 -12
  403. package/src/providers/registry.ts +30 -1
  404. package/src/providers/types.ts +25 -0
  405. package/src/runtime/__tests__/agent-wake.test.ts +214 -0
  406. package/src/runtime/__tests__/background-job-runner.test.ts +128 -0
  407. package/src/runtime/agent-wake.ts +212 -57
  408. package/src/runtime/auth/route-policy.ts +20 -3
  409. package/src/runtime/background-job-runner.ts +26 -0
  410. package/src/runtime/channel-reply-delivery.ts +182 -47
  411. package/src/runtime/channel-retry-sweep.ts +141 -16
  412. package/src/runtime/http-server.ts +7 -16
  413. package/src/runtime/http-types.ts +7 -51
  414. package/src/runtime/pending-interactions.ts +51 -8
  415. package/src/runtime/routes/__tests__/consolidation-routes.test.ts +258 -0
  416. package/src/runtime/routes/__tests__/content-source-routes.test.ts +162 -0
  417. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +121 -5
  418. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +275 -44
  419. package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +12 -0
  420. package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +14 -0
  421. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +271 -0
  422. package/src/runtime/routes/__tests__/sanity-routes.test.ts +280 -0
  423. package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +266 -0
  424. package/src/runtime/routes/approval-routes.ts +4 -1
  425. package/src/runtime/routes/channel-availability-routes.ts +5 -0
  426. package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +246 -0
  427. package/src/runtime/routes/consolidation-routes.ts +100 -0
  428. package/src/runtime/routes/content-source-routes.ts +78 -0
  429. package/src/runtime/routes/conversation-cli-routes.ts +146 -1
  430. package/src/runtime/routes/conversation-query-routes.ts +130 -12
  431. package/src/runtime/routes/conversation-routes.ts +288 -76
  432. package/src/runtime/routes/document-comments-routes.ts +287 -0
  433. package/src/runtime/routes/documents-routes.ts +33 -0
  434. package/src/runtime/routes/home-feed-routes.ts +6 -3
  435. package/src/runtime/routes/host-app-control-routes.ts +1 -1
  436. package/src/runtime/routes/host-browser-routes.ts +8 -1
  437. package/src/runtime/routes/identity-routes.ts +21 -0
  438. package/src/runtime/routes/inbound-message-handler.ts +288 -58
  439. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +365 -6
  440. package/src/runtime/routes/inbound-stages/background-dispatch.ts +283 -82
  441. package/src/runtime/routes/index.ts +14 -4
  442. package/src/runtime/routes/inference-provider-connection-routes.ts +192 -3
  443. package/src/runtime/routes/integrations/a2a.ts +294 -0
  444. package/src/runtime/routes/llm-call-sites-routes.ts +11 -1
  445. package/src/runtime/routes/log-export-routes.ts +39 -0
  446. package/src/runtime/routes/memory-v2-routes.ts +217 -0
  447. package/src/runtime/routes/notification-routes.ts +19 -2
  448. package/src/runtime/routes/question-routes.ts +4 -1
  449. package/src/runtime/routes/sanity-routes.ts +159 -0
  450. package/src/runtime/routes/slack-channel-routes.ts +187 -0
  451. package/src/runtime/routes/subagents-routes.ts +41 -0
  452. package/src/runtime/services/conversation-serializer.ts +30 -4
  453. package/src/schedule/integration-status.ts +3 -1
  454. package/src/security/__tests__/oauth2-device-code.test.ts +479 -0
  455. package/src/security/oauth2-device-code.ts +307 -0
  456. package/src/security/oauth2.ts +26 -9
  457. package/src/security/secure-keys.ts +5 -0
  458. package/src/skills/catalog-install.ts +6 -2
  459. package/src/subagent/manager.ts +2 -0
  460. package/src/tools/browser/__tests__/pinned-tabs.test.ts +80 -0
  461. package/src/tools/browser/browser-execution.ts +93 -0
  462. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +28 -0
  463. package/src/tools/browser/cdp-client/__tests__/types.test.ts +1 -0
  464. package/src/tools/browser/cdp-client/cdp-inspect-client.ts +10 -0
  465. package/src/tools/browser/cdp-client/extension-cdp-client.ts +15 -1
  466. package/src/tools/browser/cdp-client/factory.ts +87 -3
  467. package/src/tools/browser/cdp-client/local-cdp-client.ts +9 -0
  468. package/src/tools/browser/cdp-client/types.ts +36 -0
  469. package/src/tools/browser/pinned-tabs.ts +90 -0
  470. package/src/tools/document/document-comment-tool.test.ts +379 -0
  471. package/src/tools/document/document-comment-tool.ts +156 -0
  472. package/src/tools/document/document-tool.ts +128 -2
  473. package/src/tools/memory/register.ts +1 -9
  474. package/src/tools/network/__tests__/web-fetch-metadata.test.ts +229 -0
  475. package/src/tools/network/__tests__/web-search-metadata.test.ts +346 -0
  476. package/src/tools/network/domain-normalize.ts +17 -0
  477. package/src/tools/network/web-fetch.ts +213 -64
  478. package/src/tools/network/web-search.ts +191 -66
  479. package/src/tools/registry.ts +2 -2
  480. package/src/tools/terminal/safe-env.ts +3 -2
  481. package/src/tools/tool-approval-handler.ts +19 -12
  482. package/src/tools/types.ts +41 -2
  483. package/src/tools/ui-surface/definitions.ts +3 -1
  484. package/src/types/onboarding-context.ts +4 -0
  485. package/src/util/__tests__/favicon.test.ts +84 -0
  486. package/src/util/favicon.ts +40 -0
  487. package/src/util/platform.ts +0 -5
  488. package/src/workspace/git-service.ts +75 -4
  489. package/src/workspace/migrations/087-memory-router-balanced-profile.ts +91 -0
  490. package/src/workspace/migrations/088-deprecate-background-conversation-override.ts +103 -0
  491. package/src/workspace/migrations/registry.ts +4 -0
  492. package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -441
  493. package/src/config/bundled-skills/document/SKILL.md +0 -54
  494. package/src/config/bundled-skills/document/TOOLS.json +0 -106
  495. package/src/daemon/seed-files.ts +0 -18
  496. package/src/memory/graph/__tests__/remember-description.test.ts +0 -55
  497. package/src/runtime/guardian-action-conversation-turn.ts +0 -99
  498. package/src/runtime/routes/interface-routes.ts +0 -43
  499. /package/src/config/bundled-skills/{document → document-editor}/tools/document-create.ts +0 -0
  500. /package/src/config/bundled-skills/{document → document-editor}/tools/document-delete.ts +0 -0
  501. /package/src/config/bundled-skills/{document → document-editor}/tools/document-list.ts +0 -0
  502. /package/src/config/bundled-skills/{document → document-editor}/tools/document-read.ts +0 -0
  503. /package/src/config/bundled-skills/{document → document-editor}/tools/document-update.ts +0 -0
@@ -50,12 +50,17 @@ import * as computerUseWait from "./bundled-skills/computer-use/tools/computer-u
50
50
  import * as contactMerge from "./bundled-skills/contacts/tools/contact-merge.js";
51
51
  import * as contactSearch from "./bundled-skills/contacts/tools/contact-search.js";
52
52
  import * as googleContacts from "./bundled-skills/contacts/tools/google-contacts.js";
53
- // ── document ───────────────────────────────────────────────────────────────────
54
- import * as documentCreate from "./bundled-skills/document/tools/document-create.js";
55
- import * as documentDelete from "./bundled-skills/document/tools/document-delete.js";
56
- import * as documentList from "./bundled-skills/document/tools/document-list.js";
57
- import * as documentRead from "./bundled-skills/document/tools/document-read.js";
58
- import * as documentUpdate from "./bundled-skills/document/tools/document-update.js";
53
+ // ── document-editor ────────────────────────────────────────────────────────────
54
+ import * as commentList from "./bundled-skills/document-editor/tools/comment-list.js";
55
+ import * as commentReply from "./bundled-skills/document-editor/tools/comment-reply.js";
56
+ import * as commentResolve from "./bundled-skills/document-editor/tools/comment-resolve.js";
57
+ import * as documentCreate from "./bundled-skills/document-editor/tools/document-create.js";
58
+ import * as documentDelete from "./bundled-skills/document-editor/tools/document-delete.js";
59
+ import * as documentFind from "./bundled-skills/document-editor/tools/document-find.js";
60
+ import * as documentList from "./bundled-skills/document-editor/tools/document-list.js";
61
+ import * as documentRead from "./bundled-skills/document-editor/tools/document-read.js";
62
+ import * as documentReplaceText from "./bundled-skills/document-editor/tools/document-replace-text.js";
63
+ import * as documentUpdate from "./bundled-skills/document-editor/tools/document-update.js";
59
64
  // ── followups ──────────────────────────────────────────────────────────────────
60
65
  import * as followupCreate from "./bundled-skills/followups/tools/followup-create.js";
61
66
  import * as followupList from "./bundled-skills/followups/tools/followup-list.js";
@@ -169,12 +174,17 @@ export const bundledToolRegistry = new Map<string, SkillToolScript>([
169
174
  ["contacts:tools/contact-merge.ts", contactMerge],
170
175
  ["contacts:tools/google-contacts.ts", googleContacts],
171
176
 
172
- // document
173
- ["document:tools/document-create.ts", documentCreate],
174
- ["document:tools/document-delete.ts", documentDelete],
175
- ["document:tools/document-list.ts", documentList],
176
- ["document:tools/document-read.ts", documentRead],
177
- ["document:tools/document-update.ts", documentUpdate],
177
+ // document-editor
178
+ ["document-editor:tools/document-create.ts", documentCreate],
179
+ ["document-editor:tools/document-update.ts", documentUpdate],
180
+ ["document-editor:tools/document-read.ts", documentRead],
181
+ ["document-editor:tools/document-list.ts", documentList],
182
+ ["document-editor:tools/document-delete.ts", documentDelete],
183
+ ["document-editor:tools/document-find.ts", documentFind],
184
+ ["document-editor:tools/document-replace-text.ts", documentReplaceText],
185
+ ["document-editor:tools/comment-list.ts", commentList],
186
+ ["document-editor:tools/comment-resolve.ts", commentResolve],
187
+ ["document-editor:tools/comment-reply.ts", commentReply],
178
188
 
179
189
  // followups
180
190
  ["followups:tools/followup-create.ts", followupCreate],
@@ -0,0 +1,124 @@
1
+ import { type LLMCallSite } from "./schemas/llm.js";
2
+
3
+ type CallSiteDefaultConfig = {
4
+ profile: string;
5
+ maxTokens?: number;
6
+ effort?: "none" | "low" | "medium" | "high" | "xhigh" | "max";
7
+ temperature?: number | null;
8
+ thinking?: { enabled?: boolean; streamThinking?: boolean };
9
+ contextWindow?: { maxInputTokens?: number };
10
+ };
11
+
12
+ export const CALL_SITE_DEFAULTS: Record<LLMCallSite, CallSiteDefaultConfig> = {
13
+ mainAgent: { profile: "balanced" },
14
+ subagentSpawn: { profile: "balanced" },
15
+ compactionAgent: { profile: "balanced" },
16
+ analyzeConversation: { profile: "balanced" },
17
+ patternScan: { profile: "balanced" },
18
+ narrativeRefinement: { profile: "balanced" },
19
+ callAgent: { profile: "balanced" },
20
+ proactiveArtifactBuild: { profile: "balanced" },
21
+ memoryConsolidation: { profile: "balanced" },
22
+ identityIntro: { profile: "balanced" },
23
+ emptyStateGreeting: { profile: "balanced" },
24
+
25
+ memoryRouter: {
26
+ profile: "balanced",
27
+ contextWindow: { maxInputTokens: 1000000 },
28
+ },
29
+ recall: {
30
+ profile: "balanced",
31
+ maxTokens: 4096,
32
+ effort: "low",
33
+ thinking: { enabled: false, streamThinking: false },
34
+ temperature: 0,
35
+ },
36
+ conversationStarters: {
37
+ profile: "balanced",
38
+ effort: "low",
39
+ thinking: { enabled: false },
40
+ },
41
+
42
+ filingAgent: { profile: "cost-optimized" },
43
+ proactiveArtifactDecision: { profile: "cost-optimized" },
44
+ memoryExtraction: { profile: "cost-optimized" },
45
+ memoryRetrieval: { profile: "cost-optimized" },
46
+ memoryRetrospective: { profile: "cost-optimized" },
47
+ memoryV2Migration: { profile: "cost-optimized" },
48
+ memoryV2Sweep: { profile: "cost-optimized" },
49
+ memoryV2Consolidation: { profile: "balanced" },
50
+ conversationSummarization: { profile: "cost-optimized" },
51
+ conversationTitle: { profile: "cost-optimized" },
52
+ approvalCopy: { profile: "cost-optimized" },
53
+ approvalConversation: { profile: "cost-optimized" },
54
+ trustRuleSuggestion: { profile: "cost-optimized" },
55
+ styleAnalyzer: { profile: "cost-optimized" },
56
+ meetConsentMonitor: { profile: "cost-optimized" },
57
+ meetChatOpportunity: { profile: "cost-optimized" },
58
+ inference: { profile: "cost-optimized" },
59
+
60
+ heartbeatAgent: {
61
+ profile: "cost-optimized",
62
+ },
63
+ commitMessage: {
64
+ profile: "cost-optimized",
65
+ maxTokens: 120,
66
+ temperature: 0.2,
67
+ effort: "low",
68
+ thinking: { enabled: false },
69
+ },
70
+ replySuggestion: {
71
+ profile: "cost-optimized",
72
+ effort: "low",
73
+ thinking: { enabled: false },
74
+ },
75
+ guardianQuestionCopy: {
76
+ profile: "cost-optimized",
77
+ effort: "low",
78
+ thinking: { enabled: false },
79
+ },
80
+ notificationDecision: {
81
+ profile: "cost-optimized",
82
+ effort: "low",
83
+ thinking: { enabled: false },
84
+ },
85
+ preferenceExtraction: {
86
+ profile: "cost-optimized",
87
+ effort: "low",
88
+ thinking: { enabled: false },
89
+ },
90
+ interactionClassifier: {
91
+ profile: "cost-optimized",
92
+ effort: "low",
93
+ thinking: { enabled: false },
94
+ },
95
+ inviteInstructionGenerator: {
96
+ profile: "cost-optimized",
97
+ effort: "low",
98
+ thinking: { enabled: false },
99
+ },
100
+ skillCategoryInference: {
101
+ profile: "cost-optimized",
102
+ effort: "low",
103
+ thinking: { enabled: false },
104
+ },
105
+ homeGreeting: {
106
+ profile: "cost-optimized",
107
+ maxTokens: 60,
108
+ effort: "low",
109
+ thinking: { enabled: false },
110
+ temperature: 0.7,
111
+ },
112
+ homeSuggestedPrompts: {
113
+ profile: "cost-optimized",
114
+ maxTokens: 512,
115
+ effort: "low",
116
+ thinking: { enabled: false },
117
+ },
118
+ queryComplexityRouter: {
119
+ profile: "cost-optimized",
120
+ maxTokens: 16,
121
+ effort: "low",
122
+ thinking: { enabled: false },
123
+ },
124
+ };
@@ -10,11 +10,11 @@
10
10
  "defaultEnabled": false
11
11
  },
12
12
  {
13
- "id": "memory-retrospective",
13
+ "id": "memory-retrospective-fork",
14
14
  "scope": "assistant",
15
- "key": "memory-retrospective",
16
- "label": "Memory retrospective pass",
17
- "description": "Run a focused, memory-only retrospective during active conversations and at conversation lifecycle. The retrospective agent re-reads the messages added since the last successful run, dedupes against memory/archive/, and calls `remember` for what wasn't captured in the moment. Enabling this also relaxes the in-conversation pressure to call `remember` (lighter PKB reminder + relaxed tool description) so the assistant can stay present and trust the retrospective as the backstop.",
15
+ "key": "memory-retrospective-fork",
16
+ "label": "Fork-based memory retrospective",
17
+ "description": "Fork the source conversation through its latest message for memory retrospectives, instead of rendering the slice into a transcript and waking an empty background conversation. Lets the retrospective hit the provider prompt cache and read compaction summary + tail messages natively.",
18
18
  "defaultEnabled": false
19
19
  },
20
20
  {
@@ -33,6 +33,14 @@
33
33
  "description": "When enabled, the Local hosting option uses Docker under the hood for sandboxed execution, hiding the separate Docker card",
34
34
  "defaultEnabled": false
35
35
  },
36
+ {
37
+ "id": "a2a-channel",
38
+ "scope": "assistant",
39
+ "key": "a2a-channel",
40
+ "label": "A2A Channel",
41
+ "description": "Enable the A2A (Agent-to-Agent) channel for inter-assistant communication via the open A2A protocol",
42
+ "defaultEnabled": false
43
+ },
36
44
  {
37
45
  "id": "email-channel",
38
46
  "scope": "assistant",
@@ -43,7 +51,7 @@
43
51
  },
44
52
  {
45
53
  "id": "settings-developer-nav",
46
- "scope": "client",
54
+ "scope": "assistant",
47
55
  "key": "settings-developer-nav",
48
56
  "label": "Settings Developer Nav",
49
57
  "description": "Control Developer nav visibility in macOS settings",
@@ -89,6 +97,14 @@
89
97
  "description": "Surface credential grant and audit inspection endpoints for reviewing active grants and access logs",
90
98
  "defaultEnabled": false
91
99
  },
100
+ {
101
+ "id": "chatgpt-subscription-auth",
102
+ "scope": "assistant",
103
+ "key": "chatgpt-subscription-auth",
104
+ "label": "ChatGPT Subscription Auth",
105
+ "description": "Enable ChatGPT subscription OAuth as a provider auth type for OpenAI models, using the Codex device-code flow.",
106
+ "defaultEnabled": false
107
+ },
92
108
  {
93
109
  "id": "deploy-to-vercel",
94
110
  "scope": "assistant",
@@ -145,6 +161,14 @@
145
161
  "description": "Show a speaker button on assistant messages to generate and play the message as audio via Fish Audio TTS",
146
162
  "defaultEnabled": false
147
163
  },
164
+ {
165
+ "id": "openai-compatible-endpoints",
166
+ "scope": "assistant",
167
+ "key": "openai-compatible-endpoints",
168
+ "label": "OpenAI-Compatible Endpoints",
169
+ "description": "Enable user-configured OpenAI-compatible inference endpoints with custom base URLs and model identifiers",
170
+ "defaultEnabled": false
171
+ },
148
172
  {
149
173
  "id": "backward-releases",
150
174
  "scope": "assistant",
@@ -267,7 +291,7 @@
267
291
  },
268
292
  {
269
293
  "id": "account-deletion",
270
- "scope": "client",
294
+ "scope": "assistant",
271
295
  "key": "account-deletion",
272
296
  "label": "Account Deletion",
273
297
  "description": "Surfaces the user-initiated account deletion flow in client settings.",
@@ -281,14 +305,6 @@
281
305
  "description": "Enable the app-control skill (per-app screenshot + raw input bypassing AX tree)",
282
306
  "defaultEnabled": false
283
307
  },
284
- {
285
- "id": "species-migration",
286
- "scope": "assistant",
287
- "key": "species-migration",
288
- "label": "Species Migration",
289
- "description": "Enable the Species Migration skill for migrating from OpenClaw, Hermes, Manus, and other assistant species into Vellum.",
290
- "defaultEnabled": false
291
- },
292
308
  {
293
309
  "id": "analyze-conversation",
294
310
  "scope": "assistant",
@@ -299,7 +315,7 @@
299
315
  },
300
316
  {
301
317
  "id": "pro-plan-adjust",
302
- "scope": "assistant",
318
+ "scope": "client",
303
319
  "key": "pro-plan-adjust",
304
320
  "label": "Pro Plan Adjust",
305
321
  "description": "Show the rich Plan card (current plan, features, Manage/Upgrade CTA) at the top of the macOS Settings \u2192 Billing tab.",
@@ -322,19 +338,91 @@
322
338
  "defaultEnabled": false
323
339
  },
324
340
  {
325
- "id": "provider-deepseek",
341
+ "id": "velvet-theme",
342
+ "scope": "client",
343
+ "key": "velvet-theme",
344
+ "label": "Velvet Theme",
345
+ "description": "Show the Velvet theme option in the macOS appearance settings. Velvet is a dark-mode variant with red/pink accent colors.",
346
+ "defaultEnabled": false
347
+ },
348
+ {
349
+ "id": "query-complexity-routing",
350
+ "scope": "assistant",
351
+ "key": "query-complexity-routing",
352
+ "label": "Query Complexity Routing",
353
+ "description": "Automatically route user messages to the most appropriate inference profile based on query complexity. Simple queries use the speed profile, complex queries escalate to the quality profile. The user is notified of each switch and can opt out by pinning a profile on the conversation.",
354
+ "defaultEnabled": false
355
+ },
356
+ {
357
+ "id": "queue-steering",
326
358
  "scope": "assistant",
327
- "key": "provider-deepseek",
328
- "label": "DeepSeek Provider",
329
- "description": "Enable the DeepSeek direct API provider and its models (V4 Pro, V4 Flash) in the provider picker and model selection UI",
359
+ "key": "queue-steering",
360
+ "label": "Queue Steering",
361
+ "description": "Enable the 'Push to agent' button on queued messages, allowing users to steer the assistant to a specific queued message by aborting the current generation and promoting the message to the head of the queue.",
362
+ "defaultEnabled": false
363
+ },
364
+ {
365
+ "id": "chat-pull-to-refresh-enabled",
366
+ "scope": "client",
367
+ "key": "chat-pull-to-refresh-enabled",
368
+ "label": "Chat Pull to Refresh",
369
+ "description": "Enable pull-to-refresh gesture in the chat view.",
330
370
  "defaultEnabled": false
331
371
  },
332
372
  {
333
- "id": "provider-minimax",
373
+ "id": "doctor",
374
+ "scope": "client",
375
+ "key": "doctor",
376
+ "label": "Doctor",
377
+ "description": "Enable the Doctor diagnostic tab in Debug settings.",
378
+ "defaultEnabled": false
379
+ },
380
+ {
381
+ "id": "home-page",
382
+ "scope": "client",
383
+ "key": "home-page",
384
+ "label": "Home Page",
385
+ "description": "Enable the Home page as the default landing view.",
386
+ "defaultEnabled": false
387
+ },
388
+ {
389
+ "id": "platform-notifications",
390
+ "scope": "client",
391
+ "key": "platform-notifications",
392
+ "label": "Platform Notifications",
393
+ "description": "Enable the Notifications tab in settings.",
394
+ "defaultEnabled": false
395
+ },
396
+ {
397
+ "id": "rollback-enabled",
398
+ "scope": "assistant",
399
+ "key": "rollback-enabled",
400
+ "label": "Rollback Enabled",
401
+ "description": "Show older versions in the version picker, allowing rollback to previous releases.",
402
+ "defaultEnabled": false
403
+ },
404
+ {
405
+ "id": "self-hosted-assistant",
406
+ "scope": "client",
407
+ "key": "self-hosted-assistant",
408
+ "label": "Self-Hosted Assistant",
409
+ "description": "Enable self-hosted assistant configuration.",
410
+ "defaultEnabled": false
411
+ },
412
+ {
413
+ "id": "settings-sleep-policy",
334
414
  "scope": "assistant",
335
- "key": "provider-minimax",
336
- "label": "MiniMax Provider",
337
- "description": "Enable the MiniMax direct API provider and its models (M2.7, M2.5, M2.1, M2, and highspeed variants) in the provider picker and model selection UI",
415
+ "key": "settings-sleep-policy",
416
+ "label": "Settings Sleep Policy",
417
+ "description": "Enable sleep policy settings.",
418
+ "defaultEnabled": false
419
+ },
420
+ {
421
+ "id": "velvet",
422
+ "scope": "client",
423
+ "key": "velvet",
424
+ "label": "Velvet",
425
+ "description": "Enable the Velvet design theme.",
338
426
  "defaultEnabled": false
339
427
  }
340
428
  ]
@@ -1,6 +1,7 @@
1
1
  import { z } from "zod";
2
2
 
3
3
  import { getCatalogProviderForModel } from "../providers/model-catalog.js";
4
+ import { CALL_SITE_DEFAULTS } from "./call-site-defaults.js";
4
5
  import {
5
6
  type LLMCallSite,
6
7
  LLMConfigBase,
@@ -56,7 +57,9 @@ export function resolveCallSiteConfig(
56
57
  opts.overrideProfile != null
57
58
  ? llm.profiles?.[opts.overrideProfile]
58
59
  : undefined;
59
- const site = llm.callSites?.[callSite];
60
+ const site =
61
+ llm.callSites?.[callSite] ??
62
+ effectiveDefault(callSite, llm, opts.overrideProfile != null);
60
63
 
61
64
  if (callSite === "mainAgent") {
62
65
  appendCallSiteLayers(layers, callSite, llm, site);
@@ -77,6 +80,68 @@ export function resolveCallSiteConfig(
77
80
 
78
81
  type Mergeable = Record<string, unknown>;
79
82
 
83
+ /**
84
+ * Returns the effective default profile key the resolver would actually
85
+ * select for a call site when no per-turn `overrideProfile` is supplied.
86
+ *
87
+ * Mirrors the layering in `resolveCallSiteConfig`:
88
+ * - For `mainAgent`, the workspace's `activeProfile` sits ABOVE the
89
+ * call-site catalog default (and above any static `llm.callSites.mainAgent`
90
+ * override), so a non-disabled `activeProfile` wins.
91
+ * - For other call sites, the catalog default sits ABOVE `activeProfile`,
92
+ * so the catalog default (with `custom-*` fallback) wins.
93
+ */
94
+ export function resolveDefaultProfileKey(
95
+ callSite: LLMCallSite,
96
+ llm: z.infer<typeof LLMSchema>,
97
+ ): string | undefined {
98
+ if (callSite === "mainAgent" && llm.activeProfile != null) {
99
+ const active = llm.profiles?.[llm.activeProfile];
100
+ if (active != null && active.status !== "disabled") {
101
+ return llm.activeProfile;
102
+ }
103
+ }
104
+
105
+ const dflt = CALL_SITE_DEFAULTS[callSite];
106
+ if (dflt?.profile == null) return undefined;
107
+ const target = llm.profiles?.[dflt.profile];
108
+ if (target != null && target.status !== "disabled") return dflt.profile;
109
+ const customKey = `custom-${dflt.profile}`;
110
+ const customTarget = llm.profiles?.[customKey];
111
+ if (customTarget != null && customTarget.status !== "disabled")
112
+ return customKey;
113
+ return undefined;
114
+ }
115
+
116
+ function effectiveDefault(
117
+ callSite: LLMCallSite,
118
+ llm: z.infer<typeof LLMSchema>,
119
+ hasOverrideProfile = false,
120
+ ): z.infer<typeof LLMSchema>["callSites"][LLMCallSite] | undefined {
121
+ const dflt = CALL_SITE_DEFAULTS[callSite];
122
+ if (dflt == null) return undefined;
123
+ const targetProfile =
124
+ dflt.profile != null ? llm.profiles?.[dflt.profile] : undefined;
125
+ const profileUnavailable =
126
+ dflt.profile != null &&
127
+ (targetProfile == null || targetProfile.status === "disabled");
128
+
129
+ if (profileUnavailable && !hasOverrideProfile) {
130
+ const customKey = `custom-${dflt.profile}`;
131
+ const customProfile = llm.profiles?.[customKey];
132
+ if (customProfile != null && customProfile.status !== "disabled") {
133
+ return { ...dflt, profile: customKey };
134
+ }
135
+ }
136
+
137
+ const stripProfile = hasOverrideProfile || profileUnavailable;
138
+ if (stripProfile) {
139
+ const { profile: _profile, ...rest } = dflt;
140
+ return Object.keys(rest).length > 0 ? rest : undefined;
141
+ }
142
+ return dflt;
143
+ }
144
+
80
145
  function withImpliedProviderForKnownModel(source: Mergeable): Mergeable {
81
146
  if (source.provider !== undefined) return source;
82
147
  const model = source.model;
@@ -20,6 +20,7 @@ import { AnalysisConfigSchema } from "./schemas/analysis.js";
20
20
  import { BackupConfigSchema } from "./schemas/backup.js";
21
21
  import { CallsConfigSchema } from "./schemas/calls.js";
22
22
  import {
23
+ A2AConfigSchema,
23
24
  SlackConfigSchema,
24
25
  TelegramConfigSchema,
25
26
  TwilioConfigSchema,
@@ -111,6 +112,7 @@ export const AssistantConfigSchema = z
111
112
  whatsapp: WhatsAppConfigSchema.default(WhatsAppConfigSchema.parse({})),
112
113
  telegram: TelegramConfigSchema.default(TelegramConfigSchema.parse({})),
113
114
  slack: SlackConfigSchema.default(SlackConfigSchema.parse({})),
115
+ a2a: A2AConfigSchema.default(A2AConfigSchema.parse({})),
114
116
  ingress: IngressConfigSchema,
115
117
  platform: PlatformConfigSchema.default(PlatformConfigSchema.parse({})),
116
118
  daemon: DaemonConfigSchema.default(DaemonConfigSchema.parse({})),
@@ -23,6 +23,7 @@ describe("MemoryV2ConfigSchema", () => {
23
23
  bm25_k1: 1.2,
24
24
  bm25_b: 0.4,
25
25
  consolidation_interval_hours: 4,
26
+ consolidation_max_buffer_lines: 100,
26
27
  max_page_chars: 5000,
27
28
  consolidation_prompt_path: null,
28
29
  rerank: {
@@ -33,9 +34,12 @@ describe("MemoryV2ConfigSchema", () => {
33
34
  dtype: "q8",
34
35
  },
35
36
  router: {
36
- enabled: false,
37
+ enabled: true,
37
38
  max_page_ids: 25,
38
39
  router_prompt_path: null,
40
+ batch_size: null,
41
+ tier1_size: null,
42
+ tier2_size: null,
39
43
  },
40
44
  });
41
45
  });
@@ -161,9 +165,9 @@ describe("MemoryV2ConfigSchema", () => {
161
165
  expect(() => MemoryV2ConfigSchema.parse({ epsilon: 1.5 })).toThrow();
162
166
  });
163
167
 
164
- test("router defaults to disabled with max_page_ids=25", () => {
168
+ test("router defaults to enabled with max_page_ids=25", () => {
165
169
  const parsed = MemoryV2ConfigSchema.parse({});
166
- expect(parsed.router.enabled).toBe(false);
170
+ expect(parsed.router.enabled).toBe(true);
167
171
  expect(parsed.router.max_page_ids).toBe(25);
168
172
  });
169
173
 
@@ -300,6 +300,27 @@ const CATALOG_RECORD: CatalogRecord = {
300
300
  "Builds the personalized artifact in a background conversation with tool access.",
301
301
  domain: "agentLoop",
302
302
  },
303
+ homeGreeting: {
304
+ id: "homeGreeting",
305
+ displayName: "Home Greeting",
306
+ description:
307
+ "Generates the personalized greeting shown on the Home page in the assistant's tone/persona.",
308
+ domain: "ui",
309
+ },
310
+ homeSuggestedPrompts: {
311
+ id: "homeSuggestedPrompts",
312
+ displayName: "Home Suggested Prompts",
313
+ description:
314
+ "Generates contextual conversation-starter suggestions for the Home page.",
315
+ domain: "ui",
316
+ },
317
+ queryComplexityRouter: {
318
+ id: "queryComplexityRouter",
319
+ displayName: "Query Complexity Router",
320
+ description:
321
+ "Classifies user message complexity to route to the appropriate inference profile.",
322
+ domain: "agentLoop",
323
+ },
303
324
  };
304
325
 
305
326
  // Source of truth for call-site display metadata. API responses and usage
@@ -99,6 +99,15 @@ export const TelegramConfigSchema = z
99
99
  })
100
100
  .describe("Telegram bot channel configuration");
101
101
 
102
+ export const A2AConfigSchema = z
103
+ .object({
104
+ enabled: z
105
+ .boolean({ error: "a2a.enabled must be a boolean" })
106
+ .default(false)
107
+ .describe("Whether the A2A channel is enabled"),
108
+ })
109
+ .describe("Agent-to-Agent protocol channel configuration");
110
+
102
111
  export const SlackConfigSchema = z
103
112
  .object({
104
113
  deliverAuthBypass: z
@@ -10,6 +10,16 @@ export const ConversationsConfigSchema = z
10
10
  .describe(
11
11
  "When true, skip the second-pass title regeneration that fires after the third user turn. The initial auto-generated title and manual renames are unaffected.",
12
12
  ),
13
+ backgroundInjection: z
14
+ .string({
15
+ error: "conversations.backgroundInjection must be a string",
16
+ })
17
+ .default(
18
+ "This is a background turn — your guardian isn't watching. If anything noteworthy comes up, send them a notification so they see it when they're back by invoking the `notifications` skill (`assistant notifications send --message \"...\"`)",
19
+ )
20
+ .describe(
21
+ "Inner text injected into the tail user message of non-interactive turns in background/scheduled conversations. The injector wraps this in <background_turn>...</background_turn> tags. Empty string disables the injection.",
22
+ ),
13
23
  })
14
24
  .describe("Conversation behavior configuration");
15
25
 
@@ -56,6 +56,20 @@ export const HeartbeatConfigSchema = z
56
56
  .describe(
57
57
  "Maximum heartbeats that can run consecutively without a guardian message. Counter resets when the guardian sends a message. Set to null for unlimited.",
58
58
  ),
59
+ disposition: z
60
+ .string({ error: "heartbeat.disposition must be a string" })
61
+ .default(
62
+ `This is your time to do something useful, interesting, or creative while your guardian is away.
63
+
64
+ Before checking on anything, ask yourself: is there something I want to work on, think about, or make progress on right now? A project, an idea, something I noticed, something I've been meaning to get to. If so, do it.
65
+
66
+ If you do something worth sharing — built something, noticed something, had an idea — send your guardian a notification so they see it when they're back.
67
+
68
+ If nothing needs attention and nothing stirs, that's fine. But make sure you actually considered it first rather than defaulting to "nothing to do."`,
69
+ )
70
+ .describe(
71
+ "Inner text injected into the heartbeat prompt. The service wraps this in <heartbeat-disposition>...</heartbeat-disposition> tags. Empty string disables the block.",
72
+ ),
59
73
  })
60
74
  .describe("Periodic heartbeat configuration for health monitoring")
61
75
  .superRefine((config, ctx) => {
@@ -20,9 +20,7 @@ const LLMProvider = z.enum([
20
20
  "ollama",
21
21
  "fireworks",
22
22
  "openrouter",
23
- "zai",
24
- "deepseek",
25
- "minimax",
23
+ "openai-compatible",
26
24
  ]);
27
25
  type LLMProvider = z.infer<typeof LLMProvider>;
28
26
 
@@ -78,6 +76,9 @@ export const LLMCallSiteEnum = z.enum([
78
76
  "trustRuleSuggestion",
79
77
  "proactiveArtifactDecision",
80
78
  "proactiveArtifactBuild",
79
+ "homeGreeting",
80
+ "homeSuggestedPrompts",
81
+ "queryComplexityRouter",
81
82
  ]);
82
83
  export type LLMCallSite = z.infer<typeof LLMCallSiteEnum>;
83
84
 
@@ -40,7 +40,7 @@ export const MemoryRetrospectiveConfigSchema = z
40
40
  ),
41
41
  })
42
42
  .describe(
43
- "Controls the memory-retrospective background pass triggered by the `memory-retrospective` feature flag. Model selection lives under llm.callSites.memoryRetrospective.",
43
+ "Controls the memory-retrospective background pass. Model selection lives under llm.callSites.memoryRetrospective.",
44
44
  );
45
45
 
46
46
  export type MemoryRetrospectiveConfig = z.infer<