@vellumai/assistant 0.5.15 → 0.6.0

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 +3 -3
  2. package/Dockerfile +0 -3
  3. package/docs/architecture/integrations.md +15 -14
  4. package/knip.json +4 -1
  5. package/openapi.yaml +670 -122
  6. package/package.json +1 -1
  7. package/src/__tests__/actor-token-service.test.ts +68 -0
  8. package/src/__tests__/agent-loop.test.ts +0 -32
  9. package/src/__tests__/always-loaded-tools-guard.test.ts +2 -2
  10. package/src/__tests__/anthropic-provider.test.ts +57 -3
  11. package/src/__tests__/app-compiler.test.ts +120 -0
  12. package/src/__tests__/assistant-feature-flags-integration.test.ts +5 -377
  13. package/src/__tests__/call-conversation-messages.test.ts +2 -6
  14. package/src/__tests__/call-domain.test.ts +2 -6
  15. package/src/__tests__/call-pointer-messages.test.ts +2 -14
  16. package/src/__tests__/call-recovery.test.ts +2 -6
  17. package/src/__tests__/call-routes-http.test.ts +2 -6
  18. package/src/__tests__/call-store.test.ts +2 -6
  19. package/src/__tests__/cancel-resolves-conversation-key.test.ts +2 -6
  20. package/src/__tests__/canonical-guardian-store.test.ts +2 -6
  21. package/src/__tests__/ces-rpc-credential-backend.test.ts +4 -1
  22. package/src/__tests__/channel-delivery-store.test.ts +2 -6
  23. package/src/__tests__/channel-retry-sweep.test.ts +2 -6
  24. package/src/__tests__/checker.test.ts +84 -3
  25. package/src/__tests__/clawhub.test.ts +54 -24
  26. package/src/__tests__/cli-command-risk-guard.test.ts +108 -6
  27. package/src/__tests__/cli-memory.test.ts +377 -0
  28. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +12 -2
  29. package/src/__tests__/config-schema.test.ts +1 -3
  30. package/src/__tests__/config-set-platform-guard.test.ts +302 -0
  31. package/src/__tests__/config-watcher-feature-flags.test.ts +211 -0
  32. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +2 -6
  33. package/src/__tests__/contacts-tools.test.ts +31 -0
  34. package/src/__tests__/context-overflow-reducer.test.ts +86 -0
  35. package/src/__tests__/context-token-estimator.test.ts +175 -10
  36. package/src/__tests__/conversation-agent-loop-overflow.test.ts +9 -0
  37. package/src/__tests__/conversation-agent-loop.test.ts +9 -0
  38. package/src/__tests__/conversation-attachments.test.ts +2 -6
  39. package/src/__tests__/conversation-attention-store.test.ts +2 -6
  40. package/src/__tests__/conversation-clear-safety.test.ts +2 -6
  41. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +4 -10
  42. package/src/__tests__/conversation-disk-view-integration.test.ts +2 -6
  43. package/src/__tests__/conversation-disk-view.test.ts +2 -6
  44. package/src/__tests__/conversation-error.test.ts +33 -2
  45. package/src/__tests__/conversation-fork-crud.test.ts +2 -6
  46. package/src/__tests__/conversation-history-web-search.test.ts +5 -0
  47. package/src/__tests__/conversation-load-history-repair.test.ts +5 -1
  48. package/src/__tests__/conversation-media-retry.test.ts +91 -0
  49. package/src/__tests__/conversation-runtime-assembly.test.ts +7 -4
  50. package/src/__tests__/conversation-slash-commands.test.ts +2 -6
  51. package/src/__tests__/conversation-starter-routes.test.ts +20 -11
  52. package/src/__tests__/conversation-store.test.ts +2 -6
  53. package/src/__tests__/conversation-usage.test.ts +3 -6
  54. package/src/__tests__/conversation-wipe.test.ts +11 -408
  55. package/src/__tests__/credential-execution-feature-gates.test.ts +3 -3
  56. package/src/__tests__/credential-execution-shell-lockdown.test.ts +2 -2
  57. package/src/__tests__/credential-security-e2e.test.ts +6 -1
  58. package/src/__tests__/docker-signing-key-bootstrap.test.ts +7 -73
  59. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +6 -7
  60. package/src/__tests__/followup-tools.test.ts +2 -6
  61. package/src/__tests__/graph-extraction-event-date.test.ts +186 -0
  62. package/src/__tests__/guardian-action-conversation-turn.test.ts +2 -6
  63. package/src/__tests__/guardian-action-followup-executor.test.ts +2 -6
  64. package/src/__tests__/guardian-action-followup-store.test.ts +2 -6
  65. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +2 -6
  66. package/src/__tests__/guardian-action-late-reply.test.ts +2 -6
  67. package/src/__tests__/guardian-action-store.test.ts +2 -6
  68. package/src/__tests__/guardian-binding-drift-heal.test.ts +2 -6
  69. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +8 -8
  70. package/src/__tests__/guardian-dispatch.test.ts +2 -6
  71. package/src/__tests__/guardian-grant-minting.test.ts +2 -14
  72. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +2 -6
  73. package/src/__tests__/guardian-routing-invariants.test.ts +343 -6
  74. package/src/__tests__/guardian-routing-state.test.ts +2 -6
  75. package/src/__tests__/guardian-verification-voice-binding.test.ts +2 -6
  76. package/src/__tests__/heartbeat-service.test.ts +1 -3
  77. package/src/__tests__/inbound-invite-redemption.test.ts +2 -6
  78. package/src/__tests__/injection-block.test.ts +154 -0
  79. package/src/__tests__/install-meta.test.ts +506 -0
  80. package/src/__tests__/install-skill-routing.test.ts +292 -0
  81. package/src/__tests__/intent-routing.test.ts +6 -18
  82. package/src/__tests__/invite-redemption-service.test.ts +2 -6
  83. package/src/__tests__/invite-routes-http.test.ts +2 -6
  84. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +2 -14
  85. package/src/__tests__/list-messages-attachments.test.ts +2 -6
  86. package/src/__tests__/llm-context-route-provider.test.ts +2 -6
  87. package/src/__tests__/llm-request-log-turn-query.test.ts +2 -6
  88. package/src/__tests__/llm-usage-store.test.ts +2 -6
  89. package/src/__tests__/log-export-workspace.test.ts +4 -34
  90. package/src/__tests__/managed-skill-lifecycle.test.ts +7 -37
  91. package/src/__tests__/managed-store.test.ts +40 -21
  92. package/src/__tests__/memory-jobs-worker-backoff.test.ts +2 -8
  93. package/src/__tests__/memory-recall-log-store.test.ts +2 -6
  94. package/src/__tests__/memory-upsert-concurrency.test.ts +4 -112
  95. package/src/__tests__/messaging-send-tool.test.ts +6 -6
  96. package/src/__tests__/migration-cross-version-compatibility.test.ts +1 -29
  97. package/src/__tests__/migration-export-http.test.ts +3 -34
  98. package/src/__tests__/migration-import-commit-http.test.ts +1 -29
  99. package/src/__tests__/migration-import-preflight-http.test.ts +3 -34
  100. package/src/__tests__/no-domain-routing-in-prompt-guard.test.ts +2 -1
  101. package/src/__tests__/non-member-access-request.test.ts +2 -6
  102. package/src/__tests__/notification-guardian-path.test.ts +2 -6
  103. package/src/__tests__/oauth-apps-routes.test.ts +120 -10
  104. package/src/__tests__/oauth-cli.test.ts +364 -2
  105. package/src/__tests__/oauth-connect-orchestrator.test.ts +709 -0
  106. package/src/__tests__/oauth-provider-serializer.test.ts +2 -1
  107. package/src/__tests__/oauth-provider-visibility.test.ts +149 -0
  108. package/src/__tests__/oauth-providers-routes.test.ts +5 -2
  109. package/src/__tests__/oauth-store.test.ts +0 -5
  110. package/src/__tests__/oauth2-gateway-transport.test.ts +18 -3
  111. package/src/__tests__/outlook-attachments.test.ts +301 -0
  112. package/src/__tests__/outlook-automation-tools.test.ts +425 -0
  113. package/src/__tests__/outlook-categories.test.ts +212 -0
  114. package/src/__tests__/outlook-client-automation.test.ts +246 -0
  115. package/src/__tests__/outlook-compose-tools.test.ts +325 -0
  116. package/src/__tests__/outlook-declutter-tools.test.ts +585 -0
  117. package/src/__tests__/outlook-email-watcher.test.ts +322 -0
  118. package/src/__tests__/outlook-follow-up.test.ts +196 -0
  119. package/src/__tests__/outlook-messaging-provider.test.ts +1071 -0
  120. package/src/__tests__/outlook-trash.test.ts +77 -0
  121. package/src/__tests__/outlook-unsubscribe.test.ts +250 -0
  122. package/src/__tests__/path-policy.test.ts +2 -17
  123. package/src/__tests__/permission-types.test.ts +0 -1
  124. package/src/__tests__/platform-callback-registration.test.ts +7 -11
  125. package/src/__tests__/playbook-execution.test.ts +76 -80
  126. package/src/__tests__/playbook-tools.test.ts +5 -7
  127. package/src/__tests__/provider-commit-message-generator.test.ts +0 -1
  128. package/src/__tests__/provider-error-scenarios.test.ts +21 -2
  129. package/src/__tests__/qdrant-manager.test.ts +68 -21
  130. package/src/__tests__/rebuild-index-graph-nodes.test.ts +273 -0
  131. package/src/__tests__/registry.test.ts +2 -2
  132. package/src/__tests__/require-fresh-approval.test.ts +64 -3
  133. package/src/__tests__/runtime-events-sse-parity.test.ts +2 -6
  134. package/src/__tests__/runtime-events-sse.test.ts +2 -6
  135. package/src/__tests__/sandbox-diagnostics.test.ts +20 -29
  136. package/src/__tests__/scaffold-managed-skill-tool.test.ts +2 -10
  137. package/src/__tests__/schedule-store.test.ts +2 -6
  138. package/src/__tests__/schedule-tools.test.ts +2 -6
  139. package/src/__tests__/scheduler-recurrence.test.ts +1 -5
  140. package/src/__tests__/scoped-approval-grants.test.ts +2 -6
  141. package/src/__tests__/scoped-grant-security-matrix.test.ts +2 -6
  142. package/src/__tests__/search-skills-unified.test.ts +421 -0
  143. package/src/__tests__/secret-allowlist.test.ts +20 -35
  144. package/src/__tests__/secret-onetime-send.test.ts +2 -0
  145. package/src/__tests__/send-endpoint-busy.test.ts +2 -6
  146. package/src/__tests__/sequence-store.test.ts +2 -6
  147. package/src/__tests__/server-history-render.test.ts +2 -6
  148. package/src/__tests__/shell-credential-ref.test.ts +0 -5
  149. package/src/__tests__/skill-feature-flags-integration.test.ts +38 -31
  150. package/src/__tests__/skill-feature-flags.test.ts +6 -6
  151. package/src/__tests__/skill-load-feature-flag.test.ts +13 -54
  152. package/src/__tests__/skill-load-inline-command.test.ts +3 -65
  153. package/src/__tests__/skill-load-inline-includes.test.ts +3 -65
  154. package/src/__tests__/skill-load-tool.test.ts +3 -67
  155. package/src/__tests__/skill-memory.test.ts +480 -195
  156. package/src/__tests__/skills-uninstall.test.ts +2 -2
  157. package/src/__tests__/skills.test.ts +23 -50
  158. package/src/__tests__/slack-channel-config.test.ts +2 -21
  159. package/src/__tests__/slack-inbound-verification.test.ts +2 -6
  160. package/src/__tests__/starter-bundle.test.ts +2 -8
  161. package/src/__tests__/stt-hints.test.ts +7 -2
  162. package/src/__tests__/system-prompt.test.ts +25 -45
  163. package/src/__tests__/task-compiler.test.ts +2 -27
  164. package/src/__tests__/task-management-tools.test.ts +2 -27
  165. package/src/__tests__/task-memory-cleanup.test.ts +173 -250
  166. package/src/__tests__/task-runner.test.ts +2 -27
  167. package/src/__tests__/task-scheduler.test.ts +2 -27
  168. package/src/__tests__/terminal-tools.test.ts +1 -17
  169. package/src/__tests__/test-preload.ts +3 -0
  170. package/src/__tests__/token-estimator-accuracy.benchmark.test.ts +0 -79
  171. package/src/__tests__/tool-approval-handler.test.ts +4 -27
  172. package/src/__tests__/tool-execution-abort-cleanup.test.ts +2 -11
  173. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -25
  174. package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
  175. package/src/__tests__/tool-executor.test.ts +0 -1
  176. package/src/__tests__/tool-grant-request-escalation.test.ts +4 -27
  177. package/src/__tests__/tool-preview-lifecycle.test.ts +0 -20
  178. package/src/__tests__/tool-side-effects-slack-dm.test.ts +276 -0
  179. package/src/__tests__/trust-store.test.ts +10 -42
  180. package/src/__tests__/trusted-contact-approval-notifier.test.ts +1 -30
  181. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +3 -27
  182. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +2 -28
  183. package/src/__tests__/trusted-contact-multichannel.test.ts +2 -28
  184. package/src/__tests__/trusted-contact-verification.test.ts +2 -28
  185. package/src/__tests__/turn-boundary-resolution.test.ts +2 -34
  186. package/src/__tests__/twilio-provider.test.ts +0 -16
  187. package/src/__tests__/twilio-routes-twiml.test.ts +7 -12
  188. package/src/__tests__/twilio-routes.test.ts +0 -24
  189. package/src/__tests__/update-bulletin.test.ts +17 -89
  190. package/src/__tests__/usage-cache-backfill-migration.test.ts +1 -26
  191. package/src/__tests__/usage-routes.test.ts +2 -27
  192. package/src/__tests__/user-reference.test.ts +1 -5
  193. package/src/__tests__/vbundle-pax-and-symlink.test.ts +4 -34
  194. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +2 -53
  195. package/src/__tests__/verification-control-plane-policy.test.ts +0 -2
  196. package/src/__tests__/voice-invite-redemption.test.ts +2 -27
  197. package/src/__tests__/voice-scoped-grant-consumer.test.ts +2 -30
  198. package/src/__tests__/voice-session-bridge.test.ts +2 -27
  199. package/src/__tests__/volume-security-guard.test.ts +2 -0
  200. package/src/__tests__/workspace-lifecycle.test.ts +29 -1
  201. package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +4 -29
  202. package/src/__tests__/workspace-migration-012-rename-conversation-disk-view-dirs.test.ts +2 -2
  203. package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +4 -29
  204. package/src/__tests__/workspace-migration-026-backfill-install-meta.test.ts +558 -0
  205. package/src/__tests__/workspace-migration-down-functions.test.ts +0 -6
  206. package/src/__tests__/workspace-policy.test.ts +1 -1
  207. package/src/acp/client-handler.ts +1 -2
  208. package/src/agent/attachments.ts +7 -2
  209. package/src/agent/image-optimize.ts +165 -0
  210. package/src/agent/loop.ts +1 -15
  211. package/src/bundler/app-compiler.ts +179 -2
  212. package/src/bundler/package-resolver.ts +3 -5
  213. package/src/cli/__tests__/notifications.test.ts +1 -24
  214. package/src/cli/cli-memory.ts +179 -0
  215. package/src/cli/commands/avatar.ts +3 -3
  216. package/src/cli/commands/config.ts +26 -13
  217. package/src/cli/commands/doctor.ts +2 -2
  218. package/src/cli/commands/memory.ts +41 -55
  219. package/src/cli/commands/oauth/__tests__/connect.test.ts +2 -2
  220. package/src/cli/commands/oauth/__tests__/disconnect.test.ts +2 -2
  221. package/src/cli/commands/oauth/__tests__/mode.test.ts +8 -1
  222. package/src/cli/commands/oauth/__tests__/providers-update.test.ts +1 -1
  223. package/src/cli/commands/oauth/__tests__/status.test.ts +2 -2
  224. package/src/cli/commands/oauth/connect.ts +26 -6
  225. package/src/cli/commands/oauth/mode.ts +7 -0
  226. package/src/cli/commands/oauth/providers.ts +49 -42
  227. package/src/cli/commands/oauth/shared.ts +39 -3
  228. package/src/cli/commands/platform/__tests__/connect.test.ts +3 -49
  229. package/src/cli/commands/platform/__tests__/disconnect.test.ts +3 -49
  230. package/src/cli/commands/platform/__tests__/status.test.ts +5 -55
  231. package/src/cli/commands/platform/index.ts +16 -16
  232. package/src/cli/commands/skills.ts +88 -16
  233. package/src/cli/commands/trust.ts +2 -2
  234. package/src/cli/lib/daemon-credential-client.ts +2 -3
  235. package/src/config/bundled-skills/acp/TOOLS.json +1 -1
  236. package/src/config/bundled-skills/computer-use/TOOLS.json +7 -7
  237. package/src/config/bundled-skills/contacts/SKILL.md +0 -1
  238. package/src/config/bundled-skills/contacts/TOOLS.json +0 -8
  239. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -4
  240. package/src/config/bundled-skills/gmail/SKILL.md +2 -10
  241. package/src/config/bundled-skills/google-calendar/SKILL.md +1 -9
  242. package/src/config/bundled-skills/messaging/SKILL.md +26 -19
  243. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +40 -33
  244. package/src/config/bundled-skills/outlook/SKILL.md +189 -0
  245. package/src/config/bundled-skills/outlook/TOOLS.json +530 -0
  246. package/src/config/bundled-skills/outlook/tools/outlook-attachments.ts +85 -0
  247. package/src/config/bundled-skills/outlook/tools/outlook-categories.ts +77 -0
  248. package/src/config/bundled-skills/outlook/tools/outlook-draft.ts +84 -0
  249. package/src/config/bundled-skills/outlook/tools/outlook-follow-up.ts +94 -0
  250. package/src/config/bundled-skills/outlook/tools/outlook-forward.ts +49 -0
  251. package/src/config/bundled-skills/outlook/tools/outlook-outreach-scan.ts +237 -0
  252. package/src/config/bundled-skills/outlook/tools/outlook-rules.ts +161 -0
  253. package/src/config/bundled-skills/outlook/tools/outlook-send-draft.ts +32 -0
  254. package/src/config/bundled-skills/outlook/tools/outlook-sender-digest.ts +272 -0
  255. package/src/config/bundled-skills/outlook/tools/outlook-trash.ts +29 -0
  256. package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +129 -0
  257. package/src/config/bundled-skills/outlook/tools/outlook-vacation.ts +87 -0
  258. package/src/config/bundled-skills/outlook/tools/shared.ts +20 -0
  259. package/src/config/bundled-skills/outlook-calendar/SKILL.md +51 -0
  260. package/src/config/bundled-skills/outlook-calendar/TOOLS.json +221 -0
  261. package/src/config/bundled-skills/outlook-calendar/calendar-client.ts +252 -0
  262. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.ts +53 -0
  263. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.ts +74 -0
  264. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.ts +18 -0
  265. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.ts +46 -0
  266. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.ts +36 -0
  267. package/src/config/bundled-skills/outlook-calendar/tools/shared.ts +17 -0
  268. package/src/config/bundled-skills/outlook-calendar/types.ts +120 -0
  269. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +47 -40
  270. package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +16 -29
  271. package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +16 -18
  272. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +39 -47
  273. package/src/config/bundled-skills/settings/TOOLS.json +3 -3
  274. package/src/config/bundled-skills/slack/SKILL.md +1 -7
  275. package/src/config/bundled-tool-registry.ts +56 -4
  276. package/src/config/env-registry.ts +15 -8
  277. package/src/config/feature-flag-registry.json +29 -116
  278. package/src/config/loader.ts +4 -0
  279. package/src/config/schemas/platform.ts +8 -0
  280. package/src/config/schemas/security.ts +0 -6
  281. package/src/config/schemas/services.ts +8 -0
  282. package/src/config/schemas/timeouts.ts +1 -1
  283. package/src/config/skills.ts +18 -7
  284. package/src/context/token-estimator.ts +25 -18
  285. package/src/context/window-manager.ts +32 -9
  286. package/src/credential-execution/approval-bridge.ts +0 -1
  287. package/src/credential-execution/process-manager.ts +3 -1
  288. package/src/daemon/config-watcher.ts +51 -0
  289. package/src/daemon/context-overflow-reducer.ts +46 -2
  290. package/src/daemon/conversation-agent-loop-handlers.ts +123 -82
  291. package/src/daemon/conversation-agent-loop.ts +99 -63
  292. package/src/daemon/conversation-error.ts +31 -8
  293. package/src/daemon/conversation-lifecycle.ts +33 -0
  294. package/src/daemon/conversation-media-retry.ts +85 -7
  295. package/src/daemon/conversation-notifiers.ts +4 -1
  296. package/src/daemon/conversation-process.ts +1 -0
  297. package/src/daemon/conversation-runtime-assembly.ts +5 -0
  298. package/src/daemon/conversation-usage.ts +1 -0
  299. package/src/daemon/conversation.ts +41 -2
  300. package/src/daemon/daemon-control.ts +8 -2
  301. package/src/daemon/handlers/shared.ts +22 -12
  302. package/src/daemon/handlers/skills.ts +423 -201
  303. package/src/daemon/lifecycle.ts +52 -4
  304. package/src/daemon/main.ts +5 -1
  305. package/src/daemon/message-types/conversations.ts +5 -1
  306. package/src/daemon/message-types/messages.ts +3 -1
  307. package/src/daemon/message-types/skills.ts +97 -36
  308. package/src/daemon/providers-setup.ts +7 -0
  309. package/src/daemon/server.ts +35 -22
  310. package/src/daemon/tool-side-effects.ts +27 -5
  311. package/src/events/domain-events.ts +1 -2
  312. package/src/heartbeat/heartbeat-service.ts +1 -0
  313. package/src/hooks/cli.ts +2 -2
  314. package/src/hooks/runner.ts +15 -38
  315. package/src/inbound/platform-callback-registration.ts +14 -14
  316. package/src/memory/admin.ts +11 -45
  317. package/src/memory/conversation-bootstrap.ts +2 -0
  318. package/src/memory/conversation-crud.ts +242 -348
  319. package/src/memory/conversation-group-migration.ts +157 -0
  320. package/src/memory/conversation-queries.ts +4 -2
  321. package/src/memory/db-init.ts +39 -3
  322. package/src/memory/embed.ts +73 -0
  323. package/src/memory/embedding-backend.ts +8 -14
  324. package/src/memory/embedding-runtime-manager.ts +12 -114
  325. package/src/memory/fingerprint.ts +2 -2
  326. package/src/memory/graph/bootstrap.ts +512 -0
  327. package/src/memory/graph/capability-seed.ts +297 -0
  328. package/src/memory/graph/consolidation.ts +691 -0
  329. package/src/memory/graph/conversation-graph-memory.ts +630 -0
  330. package/src/memory/graph/decay.test.ts +208 -0
  331. package/src/memory/graph/decay.ts +195 -0
  332. package/src/memory/graph/extraction-job.ts +69 -0
  333. package/src/memory/graph/extraction.test.ts +936 -0
  334. package/src/memory/graph/extraction.ts +1254 -0
  335. package/src/memory/graph/graph-search.ts +266 -0
  336. package/src/memory/graph/image-ref-utils.ts +29 -0
  337. package/src/memory/graph/injection.test.ts +513 -0
  338. package/src/memory/graph/injection.ts +439 -0
  339. package/src/memory/graph/inspect.ts +534 -0
  340. package/src/memory/graph/narrative.ts +267 -0
  341. package/src/memory/graph/pattern-scan.ts +269 -0
  342. package/src/memory/graph/retriever.ts +1008 -0
  343. package/src/memory/graph/scoring.test.ts +548 -0
  344. package/src/memory/graph/scoring.ts +232 -0
  345. package/src/memory/graph/serendipity.ts +65 -0
  346. package/src/memory/graph/store.test.ts +1050 -0
  347. package/src/memory/graph/store.ts +699 -0
  348. package/src/memory/graph/tool-handlers.ts +426 -0
  349. package/src/memory/graph/tools.ts +141 -0
  350. package/src/memory/graph/triggers.test.ts +487 -0
  351. package/src/memory/graph/triggers.ts +223 -0
  352. package/src/memory/graph/types.ts +271 -0
  353. package/src/memory/group-crud.ts +191 -0
  354. package/src/memory/indexer.ts +37 -19
  355. package/src/memory/job-handlers/cleanup.ts +0 -53
  356. package/src/memory/job-handlers/conversation-starters.ts +91 -53
  357. package/src/memory/job-handlers/embedding.test.ts +3 -27
  358. package/src/memory/job-handlers/embedding.ts +5 -31
  359. package/src/memory/job-handlers/index-maintenance.ts +23 -11
  360. package/src/memory/job-handlers/summarization.ts +32 -17
  361. package/src/memory/job-utils.ts +1 -1
  362. package/src/memory/jobs-store.ts +50 -70
  363. package/src/memory/jobs-worker.ts +147 -112
  364. package/src/memory/llm-usage-store.ts +35 -2
  365. package/src/memory/message-content.ts +1 -0
  366. package/src/memory/migrations/201-oauth-providers-feature-flag.ts +11 -0
  367. package/src/memory/migrations/202-drop-callback-transport-column.ts +13 -0
  368. package/src/memory/migrations/202-memory-graph-tables.ts +130 -0
  369. package/src/memory/migrations/203-drop-memory-items-tables.ts +23 -0
  370. package/src/memory/migrations/204-rename-memory-graph-type-values.ts +46 -0
  371. package/src/memory/migrations/205-memory-graph-image-refs.ts +11 -0
  372. package/src/memory/migrations/index.ts +6 -0
  373. package/src/memory/migrations/registry.ts +8 -0
  374. package/src/memory/qdrant-client.ts +44 -17
  375. package/src/memory/qdrant-manager.ts +26 -5
  376. package/src/memory/schema/index.ts +1 -0
  377. package/src/memory/schema/memory-graph.ts +139 -0
  378. package/src/memory/schema/oauth.ts +1 -1
  379. package/src/memory/search/semantic.ts +47 -91
  380. package/src/memory/slack-thread-store.ts +17 -0
  381. package/src/memory/task-memory-cleanup.ts +28 -50
  382. package/src/messaging/providers/outlook/adapter.ts +200 -0
  383. package/src/messaging/providers/outlook/client.ts +610 -0
  384. package/src/messaging/providers/outlook/types.ts +201 -0
  385. package/src/notifications/adapters/macos.ts +1 -0
  386. package/src/notifications/adapters/slack.ts +1 -1
  387. package/src/notifications/copy-composer.ts +9 -0
  388. package/src/notifications/signal.ts +16 -0
  389. package/src/oauth/__tests__/identity-verifier.test.ts +1 -1
  390. package/src/oauth/connect-orchestrator.ts +10 -3
  391. package/src/oauth/oauth-store.ts +10 -11
  392. package/src/oauth/provider-serializer.ts +3 -0
  393. package/src/oauth/provider-visibility.ts +16 -0
  394. package/src/oauth/seed-providers.ts +50 -17
  395. package/src/permissions/checker.ts +62 -9
  396. package/src/permissions/defaults.ts +4 -4
  397. package/src/permissions/types.ts +2 -4
  398. package/src/permissions/workspace-policy.ts +1 -1
  399. package/src/playbooks/playbook-compiler.ts +19 -18
  400. package/src/playbooks/types.ts +4 -3
  401. package/src/prompts/system-prompt.ts +6 -93
  402. package/src/prompts/templates/UPDATES.md +6 -0
  403. package/src/providers/anthropic/client.ts +47 -19
  404. package/src/providers/gemini/client.ts +1 -1
  405. package/src/providers/openai/client.ts +1 -1
  406. package/src/providers/registry.ts +1 -1
  407. package/src/providers/retry.ts +19 -3
  408. package/src/runtime/actor-trust-resolver.ts +5 -1
  409. package/src/runtime/auth/__tests__/credential-service.test.ts +1 -27
  410. package/src/runtime/auth/__tests__/token-service.test.ts +1 -25
  411. package/src/runtime/auth/route-policy.ts +7 -4
  412. package/src/runtime/guardian-reply-router.ts +10 -2
  413. package/src/runtime/http-server.ts +23 -3
  414. package/src/runtime/middleware/auth.ts +20 -0
  415. package/src/runtime/routes/attachment-routes.test.ts +106 -0
  416. package/src/runtime/routes/attachment-routes.ts +106 -16
  417. package/src/runtime/routes/brain-graph-routes.ts +21 -22
  418. package/src/runtime/routes/btw-routes.ts +8 -0
  419. package/src/runtime/routes/conversation-management-routes.ts +2 -0
  420. package/src/runtime/routes/conversation-query-routes.ts +2 -58
  421. package/src/runtime/routes/conversation-starter-routes.ts +2 -2
  422. package/src/runtime/routes/debug-routes.ts +1 -1
  423. package/src/runtime/routes/global-search-routes.ts +21 -19
  424. package/src/runtime/routes/group-routes.ts +207 -0
  425. package/src/runtime/routes/guardian-action-routes.ts +21 -10
  426. package/src/runtime/routes/guardian-bootstrap-routes.ts +23 -19
  427. package/src/runtime/routes/inbound-message-handler.ts +19 -0
  428. package/src/runtime/routes/inbound-stages/background-dispatch.ts +43 -2
  429. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +292 -0
  430. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +207 -0
  431. package/src/runtime/routes/memory-item-routes.test.ts +2 -31
  432. package/src/runtime/routes/memory-item-routes.ts +385 -341
  433. package/src/runtime/routes/oauth-apps.ts +18 -1
  434. package/src/runtime/routes/oauth-providers.ts +13 -1
  435. package/src/runtime/routes/schedule-routes.ts +2 -0
  436. package/src/runtime/routes/settings-routes.ts +1 -0
  437. package/src/runtime/routes/skills-routes.ts +103 -37
  438. package/src/runtime/routes/usage-routes.ts +19 -2
  439. package/src/runtime/routes/work-items-routes.test.ts +2 -27
  440. package/src/runtime/routes/workspace-routes.test.ts +3 -27
  441. package/src/schedule/scheduler.ts +8 -1
  442. package/src/security/oauth2.ts +1 -1
  443. package/src/security/secret-allowlist.ts +4 -4
  444. package/src/security/secure-keys.ts +4 -8
  445. package/src/shared/provider-env-vars.ts +19 -0
  446. package/src/skills/catalog-cache.ts +5 -0
  447. package/src/skills/catalog-install.ts +15 -14
  448. package/src/skills/clawhub.ts +134 -154
  449. package/src/skills/install-meta.ts +208 -0
  450. package/src/skills/managed-store.ts +27 -16
  451. package/src/skills/skill-memory.ts +210 -96
  452. package/src/skills/skillssh-registry.ts +19 -17
  453. package/src/tasks/task-runner.ts +3 -1
  454. package/src/telemetry/usage-telemetry-reporter.test.ts +3 -5
  455. package/src/tools/browser/runtime-check.ts +3 -1
  456. package/src/tools/memory/register.ts +63 -46
  457. package/src/tools/permission-checker.ts +7 -19
  458. package/src/tools/shared/filesystem/image-read.ts +22 -85
  459. package/src/tools/skills/skill-script-runner.ts +1 -1
  460. package/src/tools/terminal/safe-env.ts +1 -0
  461. package/src/tools/tool-manifest.ts +3 -3
  462. package/src/util/browser.ts +25 -10
  463. package/src/util/bun-runtime.ts +172 -0
  464. package/src/util/device-id.ts +3 -65
  465. package/src/watcher/providers/outlook-calendar.ts +343 -0
  466. package/src/watcher/providers/outlook.ts +198 -0
  467. package/src/workspace/git-service.ts +27 -6
  468. package/src/workspace/migrations/025-remove-oauth-app-setup-skills.ts +76 -0
  469. package/src/workspace/migrations/026-backfill-install-meta.ts +325 -0
  470. package/src/workspace/migrations/027-remove-orphaned-optimized-images-cache.ts +42 -0
  471. package/src/workspace/migrations/registry.ts +6 -0
  472. package/src/__tests__/context-memory-e2e.test.ts +0 -415
  473. package/src/__tests__/journal-context.test.ts +0 -268
  474. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +0 -297
  475. package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -459
  476. package/src/__tests__/memory-query-builder.test.ts +0 -59
  477. package/src/__tests__/memory-recall-quality.test.ts +0 -1046
  478. package/src/__tests__/memory-regressions.experimental.test.ts +0 -629
  479. package/src/__tests__/memory-regressions.test.ts +0 -3696
  480. package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -295
  481. package/src/daemon/conversation-memory.ts +0 -207
  482. package/src/memory/conversation-starters-cadence.ts +0 -74
  483. package/src/memory/items-extractor.ts +0 -860
  484. package/src/memory/job-handlers/batch-extraction.ts +0 -741
  485. package/src/memory/job-handlers/extraction.ts +0 -40
  486. package/src/memory/job-handlers/journal-carry-forward.test.ts +0 -383
  487. package/src/memory/job-handlers/journal-carry-forward.ts +0 -255
  488. package/src/memory/journal-memory.ts +0 -224
  489. package/src/memory/query-builder.ts +0 -47
  490. package/src/memory/query-expansion.ts +0 -83
  491. package/src/memory/retriever.test.ts +0 -1590
  492. package/src/memory/retriever.ts +0 -1323
  493. package/src/memory/search/formatting.test.ts +0 -140
  494. package/src/memory/search/formatting.ts +0 -262
  495. package/src/memory/search/mmr.ts +0 -136
  496. package/src/memory/search/ranking.ts +0 -15
  497. package/src/memory/search/staleness.ts +0 -40
  498. package/src/memory/search/tier-classifier.ts +0 -18
  499. package/src/memory/search/types.ts +0 -121
  500. package/src/prompts/journal-context.ts +0 -156
  501. package/src/tools/memory/definitions.ts +0 -69
  502. package/src/tools/memory/handlers.test.ts +0 -590
  503. package/src/tools/memory/handlers.ts +0 -434
@@ -56,7 +56,7 @@ import * as contactMerge from "./bundled-skills/contacts/tools/contact-merge.js"
56
56
  import * as contactSearch from "./bundled-skills/contacts/tools/contact-search.js";
57
57
  import * as contactUpsert from "./bundled-skills/contacts/tools/contact-upsert.js";
58
58
  import * as googleContacts from "./bundled-skills/contacts/tools/google-contacts.js";
59
- // ── conversations ─────────────────────────────────────────────────────────────
59
+ // ── conversations ──────────────────────────────────────────────────────────────
60
60
  import * as renameConversation from "./bundled-skills/conversations/tools/rename-conversation.js";
61
61
  // ── document ───────────────────────────────────────────────────────────────────
62
62
  import * as documentCreate from "./bundled-skills/document/tools/document-create.js";
@@ -107,6 +107,25 @@ import * as messagingSend from "./bundled-skills/messaging/tools/messaging-send.
107
107
  import * as messagingSenderDigest from "./bundled-skills/messaging/tools/messaging-sender-digest.js";
108
108
  // ── notifications ──────────────────────────────────────────────────────────────
109
109
  import * as sendNotification from "./bundled-skills/notifications/tools/send-notification.js";
110
+ // ── outlook ────────────────────────────────────────────────────────────────────
111
+ import * as outlookAttachments from "./bundled-skills/outlook/tools/outlook-attachments.js";
112
+ import * as outlookCategories from "./bundled-skills/outlook/tools/outlook-categories.js";
113
+ import * as outlookDraft from "./bundled-skills/outlook/tools/outlook-draft.js";
114
+ import * as outlookFollowUp from "./bundled-skills/outlook/tools/outlook-follow-up.js";
115
+ import * as outlookForward from "./bundled-skills/outlook/tools/outlook-forward.js";
116
+ import * as outlookOutreachScan from "./bundled-skills/outlook/tools/outlook-outreach-scan.js";
117
+ import * as outlookRules from "./bundled-skills/outlook/tools/outlook-rules.js";
118
+ import * as outlookSendDraft from "./bundled-skills/outlook/tools/outlook-send-draft.js";
119
+ import * as outlookSenderDigest from "./bundled-skills/outlook/tools/outlook-sender-digest.js";
120
+ import * as outlookTrash from "./bundled-skills/outlook/tools/outlook-trash.js";
121
+ import * as outlookUnsubscribe from "./bundled-skills/outlook/tools/outlook-unsubscribe.js";
122
+ import * as outlookVacation from "./bundled-skills/outlook/tools/outlook-vacation.js";
123
+ // ── outlook-calendar ───────────────────────────────────────────────────────────
124
+ import * as outlookCalendarCheckAvailability from "./bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.js";
125
+ import * as outlookCalendarCreateEvent from "./bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.js";
126
+ import * as outlookCalendarGetEvent from "./bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.js";
127
+ import * as outlookCalendarListEvents from "./bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.js";
128
+ import * as outlookCalendarRsvp from "./bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.js";
110
129
  // ── phone-calls ────────────────────────────────────────────────────────────────
111
130
  import * as callEnd from "./bundled-skills/phone-calls/tools/call-end.js";
112
131
  import * as callStart from "./bundled-skills/phone-calls/tools/call-start.js";
@@ -290,6 +309,39 @@ export const bundledToolRegistry = new Map<string, SkillToolScript>([
290
309
  // notifications
291
310
  ["notifications:tools/send-notification.ts", sendNotification],
292
311
 
312
+ // outlook
313
+ ["outlook:tools/outlook-rules.ts", outlookRules],
314
+ ["outlook:tools/outlook-vacation.ts", outlookVacation],
315
+ ["outlook:tools/outlook-sender-digest.ts", outlookSenderDigest],
316
+ ["outlook:tools/outlook-outreach-scan.ts", outlookOutreachScan],
317
+ ["outlook:tools/outlook-draft.ts", outlookDraft],
318
+ ["outlook:tools/outlook-send-draft.ts", outlookSendDraft],
319
+ ["outlook:tools/outlook-forward.ts", outlookForward],
320
+ ["outlook:tools/outlook-trash.ts", outlookTrash],
321
+ ["outlook:tools/outlook-categories.ts", outlookCategories],
322
+ ["outlook:tools/outlook-follow-up.ts", outlookFollowUp],
323
+ ["outlook:tools/outlook-unsubscribe.ts", outlookUnsubscribe],
324
+ ["outlook:tools/outlook-attachments.ts", outlookAttachments],
325
+
326
+ // outlook-calendar
327
+ [
328
+ "outlook-calendar:tools/outlook-calendar-list-events.ts",
329
+ outlookCalendarListEvents,
330
+ ],
331
+ [
332
+ "outlook-calendar:tools/outlook-calendar-get-event.ts",
333
+ outlookCalendarGetEvent,
334
+ ],
335
+ [
336
+ "outlook-calendar:tools/outlook-calendar-create-event.ts",
337
+ outlookCalendarCreateEvent,
338
+ ],
339
+ [
340
+ "outlook-calendar:tools/outlook-calendar-check-availability.ts",
341
+ outlookCalendarCheckAvailability,
342
+ ],
343
+ ["outlook-calendar:tools/outlook-calendar-rsvp.ts", outlookCalendarRsvp],
344
+
293
345
  // phone-calls
294
346
  ["phone-calls:tools/call-start.ts", callStart],
295
347
  ["phone-calls:tools/call-status.ts", callStatus],
@@ -322,12 +374,12 @@ export const bundledToolRegistry = new Map<string, SkillToolScript>([
322
374
  ["sequences:tools/sequence-analytics.ts", sequenceAnalytics],
323
375
 
324
376
  // settings
325
- ["settings:tools/avatar-get.ts", avatarGet],
326
- ["settings:tools/avatar-update.ts", avatarUpdate],
327
- ["settings:tools/avatar-remove.ts", avatarRemove],
328
377
  ["settings:tools/voice-config-update.ts", voiceConfigUpdate],
329
378
  ["settings:tools/open-system-settings.ts", openSystemSettings],
330
379
  ["settings:tools/navigate-settings-tab.ts", navigateSettingsTab],
380
+ ["settings:tools/avatar-update.ts", avatarUpdate],
381
+ ["settings:tools/avatar-remove.ts", avatarRemove],
382
+ ["settings:tools/avatar-get.ts", avatarGet],
331
383
 
332
384
  // skill-management
333
385
  ["skill-management:tools/scaffold-managed.ts", scaffoldManaged],
@@ -45,17 +45,24 @@ export function getIsContainerized(): boolean {
45
45
  }
46
46
 
47
47
  /**
48
- * Whether this assistant is running as a platform-managed remote instance.
48
+ * IS_PLATFORM boolean, default: false
49
+ * When true, indicates the assistant is running as a platform-managed
50
+ * remote instance. Controls platform-specific behaviors like webhook
51
+ * callback registration and blocking `platform disconnect`.
49
52
  *
50
- * Currently this is determined solely by the IS_CONTAINERIZED env var, which
51
- * the platform sets when provisioning assistant containers. This is not ideal
52
- * because any Docker environment could set it. We plan to replace this with a
53
- * less spoof-able mechanism in the future — e.g. a signed platform token
54
- * verified via asymmetric cryptography or an authenticated attestation
55
- * endpoint on the platform.
53
+ * Separate from IS_CONTAINERIZED because local Docker assistants are
54
+ * containerized (need CES sidecar, gateway trust store, etc.) but are
55
+ * not platform-managed.
56
+ */
57
+ export function getIsPlatform(): boolean {
58
+ return flag("IS_PLATFORM");
59
+ }
60
+
61
+ /**
62
+ * Whether this assistant is running as a platform-managed remote instance.
56
63
  */
57
64
  export function isPlatformRemote(): boolean {
58
- return getIsContainerized();
65
+ return getIsPlatform();
59
66
  }
60
67
 
61
68
  /**
@@ -18,21 +18,13 @@
18
18
  "defaultEnabled": false
19
19
  },
20
20
  {
21
- "id": "platform-hosted-enabled",
21
+ "id": "local-docker-enabled",
22
22
  "scope": "macos",
23
- "key": "platform-hosted-enabled",
24
- "label": "Platform Hosted Assistants",
25
- "description": "Enable the Vellum Cloud hosting option on the Hosting screen",
23
+ "key": "local-docker-enabled",
24
+ "label": "Local Docker Mode",
25
+ "description": "When enabled, the Local hosting option uses Docker under the hood for sandboxed execution, hiding the separate Docker card",
26
26
  "defaultEnabled": false
27
27
  },
28
- {
29
- "id": "contacts",
30
- "scope": "assistant",
31
- "key": "contacts",
32
- "label": "Contacts",
33
- "description": "Show the Contacts tab in Settings for viewing and managing contacts",
34
- "defaultEnabled": true
35
- },
36
28
  {
37
29
  "id": "email-channel",
38
30
  "scope": "assistant",
@@ -137,102 +129,6 @@
137
129
  "description": "Enable managed (organization-hosted) sign-in flow in the onboarding experience",
138
130
  "defaultEnabled": true
139
131
  },
140
- {
141
- "id": "integration-twitter",
142
- "scope": "assistant",
143
- "key": "integration-twitter",
144
- "label": "Twitter / X Integration",
145
- "description": "Enable the Twitter / X OAuth setup skill for connecting to the Twitter API",
146
- "defaultEnabled": false
147
- },
148
- {
149
- "id": "integration-github",
150
- "scope": "assistant",
151
- "key": "integration-github",
152
- "label": "GitHub Integration",
153
- "description": "Enable the GitHub OAuth setup skill for connecting to GitHub",
154
- "defaultEnabled": false
155
- },
156
- {
157
- "id": "integration-linear",
158
- "scope": "assistant",
159
- "key": "integration-linear",
160
- "label": "Linear Integration",
161
- "description": "Enable the Linear OAuth setup skill for connecting to Linear",
162
- "defaultEnabled": false
163
- },
164
- {
165
- "id": "integration-spotify",
166
- "scope": "assistant",
167
- "key": "integration-spotify",
168
- "label": "Spotify Integration",
169
- "description": "Enable the Spotify OAuth setup skill for connecting to the Spotify API",
170
- "defaultEnabled": false
171
- },
172
- {
173
- "id": "integration-todoist",
174
- "scope": "assistant",
175
- "key": "integration-todoist",
176
- "label": "Todoist Integration",
177
- "description": "Enable the Todoist OAuth setup skill for connecting to Todoist",
178
- "defaultEnabled": false
179
- },
180
- {
181
- "id": "integration-discord",
182
- "scope": "assistant",
183
- "key": "integration-discord",
184
- "label": "Discord Integration",
185
- "description": "Enable the Discord OAuth setup skill for connecting to Discord",
186
- "defaultEnabled": false
187
- },
188
- {
189
- "id": "integration-dropbox",
190
- "scope": "assistant",
191
- "key": "integration-dropbox",
192
- "label": "Dropbox Integration",
193
- "description": "Enable the Dropbox OAuth setup skill for connecting to Dropbox",
194
- "defaultEnabled": false
195
- },
196
- {
197
- "id": "integration-asana",
198
- "scope": "assistant",
199
- "key": "integration-asana",
200
- "label": "Asana Integration",
201
- "description": "Enable the Asana OAuth setup skill for connecting to Asana",
202
- "defaultEnabled": false
203
- },
204
- {
205
- "id": "integration-airtable",
206
- "scope": "assistant",
207
- "key": "integration-airtable",
208
- "label": "Airtable Integration",
209
- "description": "Enable the Airtable OAuth setup skill for connecting to Airtable",
210
- "defaultEnabled": false
211
- },
212
- {
213
- "id": "integration-hubspot",
214
- "scope": "assistant",
215
- "key": "integration-hubspot",
216
- "label": "HubSpot Integration",
217
- "description": "Enable the HubSpot OAuth setup skill for connecting to HubSpot CRM",
218
- "defaultEnabled": false
219
- },
220
- {
221
- "id": "integration-figma",
222
- "scope": "assistant",
223
- "key": "integration-figma",
224
- "label": "Figma Integration",
225
- "description": "Enable the Figma OAuth setup skill for connecting to Figma",
226
- "defaultEnabled": false
227
- },
228
- {
229
- "id": "integration-notion",
230
- "scope": "assistant",
231
- "key": "integration-notion",
232
- "label": "Notion Integration",
233
- "description": "Enable the Notion setup skill for connecting to Notion",
234
- "defaultEnabled": false
235
- },
236
132
  {
237
133
  "id": "conversation-starters",
238
134
  "scope": "assistant",
@@ -273,6 +169,14 @@
273
169
  "description": "Show the Schedules tab in Settings for viewing and managing schedules",
274
170
  "defaultEnabled": false
275
171
  },
172
+ {
173
+ "id": "settings-integrations-grid",
174
+ "scope": "assistant",
175
+ "key": "settings-integrations-grid",
176
+ "label": "Integrations Grid",
177
+ "description": "Show the Integrations grid in Models & Services settings, replacing individual OAuth provider cards",
178
+ "defaultEnabled": false
179
+ },
276
180
  {
277
181
  "id": "quick-input",
278
182
  "scope": "macos",
@@ -337,14 +241,6 @@
337
241
  "description": "Show older versions in the version picker, allowing rollback to previous releases",
338
242
  "defaultEnabled": true
339
243
  },
340
- {
341
- "id": "show-background-conversations",
342
- "scope": "assistant",
343
- "key": "show-background-conversations",
344
- "label": "Show Background Conversations",
345
- "description": "Include background conversations (heartbeat, tasks) in the sidebar conversation list",
346
- "defaultEnabled": false
347
- },
348
244
  {
349
245
  "id": "voice-mode",
350
246
  "scope": "assistant",
@@ -360,6 +256,23 @@
360
256
  "label": "Fast Mode",
361
257
  "description": "Enable Anthropic fast mode for Opus 4.6, delivering up to 2.5x higher output tokens per second at premium pricing",
362
258
  "defaultEnabled": false
259
+ },
260
+ {
261
+ "id": "conversation-groups-ui",
262
+ "scope": "assistant",
263
+ "key": "conversation-groups-ui",
264
+ "label": "Conversation Groups",
265
+ "description": "Enable custom conversation group creation, move-to-group, and group management in the sidebar",
266
+ "defaultEnabled": false
267
+ },
268
+ {
269
+ "id": "teleport",
270
+ "scope": "macos",
271
+ "key": "teleport",
272
+ "label": "Teleport",
273
+ "description": "Enable teleport UI in General settings for moving assistants between hosting environments",
274
+ "defaultEnabled": false
363
275
  }
364
276
  ]
365
277
  }
278
+
@@ -124,6 +124,10 @@ const DEPRECATED_FIELDS: Record<string, string> = {
124
124
  "providerOrder has been removed from the config schema. " +
125
125
  "Provider selection is now handled automatically. " +
126
126
  "The field will be removed from your config file.",
127
+ "permissions.dangerouslySkipPermissions":
128
+ "permissions.dangerouslySkipPermissions has been removed. " +
129
+ "Permission prompts are now always shown when required. " +
130
+ "The field will be removed from your config file.",
127
131
  };
128
132
 
129
133
  /**
@@ -56,6 +56,14 @@ export const UiConfigSchema = z
56
56
  .describe(
57
57
  "IANA timezone identifier for displaying dates and times (e.g. 'America/New_York')",
58
58
  ),
59
+ greetingModelIntent: z
60
+ .enum(["latency-optimized", "quality-optimized"], {
61
+ error: "ui.greetingModelIntent must be 'latency-optimized' or 'quality-optimized'",
62
+ })
63
+ .default("latency-optimized")
64
+ .describe(
65
+ "Model intent for empty-state greeting generation (latency-optimized = fast/small model, quality-optimized = primary model)",
66
+ ),
59
67
  })
60
68
  .describe("User interface display settings");
61
69
 
@@ -79,12 +79,6 @@ export const PermissionsConfigSchema = z
79
79
  .describe(
80
80
  "Permission mode — 'strict' requires explicit approval for all operations, 'workspace' allows operations within the workspace",
81
81
  ),
82
- dangerouslySkipPermissions: z
83
- .boolean({
84
- error: "permissions.dangerouslySkipPermissions must be a boolean",
85
- })
86
- .default(false)
87
- .describe("Auto-accept all permission prompts without asking"),
88
82
  })
89
83
  .describe("Permission enforcement mode for tool operations");
90
84
 
@@ -51,6 +51,11 @@ export const GoogleOAuthServiceSchema = BaseServiceSchema.extend({
51
51
  });
52
52
  export type GoogleOAuthService = z.infer<typeof GoogleOAuthServiceSchema>;
53
53
 
54
+ export const OutlookOAuthServiceSchema = BaseServiceSchema.extend({
55
+ mode: ServiceModeSchema.default("your-own"),
56
+ });
57
+ export type OutlookOAuthService = z.infer<typeof OutlookOAuthServiceSchema>;
58
+
54
59
  export const ServicesSchema = z.object({
55
60
  inference: InferenceServiceSchema.default(InferenceServiceSchema.parse({})),
56
61
  "image-generation": ImageGenerationServiceSchema.default(
@@ -62,5 +67,8 @@ export const ServicesSchema = z.object({
62
67
  "google-oauth": GoogleOAuthServiceSchema.default(
63
68
  GoogleOAuthServiceSchema.parse({}),
64
69
  ),
70
+ "outlook-oauth": OutlookOAuthServiceSchema.default(
71
+ OutlookOAuthServiceSchema.parse({}),
72
+ ),
65
73
  });
66
74
  export type Services = z.infer<typeof ServicesSchema>;
@@ -36,7 +36,7 @@ export const TimeoutConfigSchema = z
36
36
  .number({ error: "timeouts.providerStreamTimeoutSec must be a number" })
37
37
  .finite("timeouts.providerStreamTimeoutSec must be finite")
38
38
  .positive("timeouts.providerStreamTimeoutSec must be a positive number")
39
- .default(300)
39
+ .default(1800)
40
40
  .describe(
41
41
  "Timeout for waiting on the LLM provider's streaming response (seconds)",
42
42
  ),
@@ -73,7 +73,6 @@ export interface SkillSummary {
73
73
  bundled?: boolean;
74
74
  icon?: string;
75
75
  emoji?: string;
76
- homepage?: string;
77
76
  source: SkillSource;
78
77
  /** Parsed tool manifest metadata, if the skill has a valid TOOLS.json. */
79
78
  toolManifest?: SkillToolManifestMeta;
@@ -962,8 +961,9 @@ function isEscapingSymlink(filePath: string, rootDir: string): boolean {
962
961
  /**
963
962
  * Check for a `references/` subdirectory within a skill directory and return
964
963
  * a formatted listing of available `.md` reference files with full absolute
965
- * paths. Returns `null` if no references exist. Files are listed in
966
- * alphabetical order. Non-`.md` files are ignored. Symlinks that resolve
964
+ * paths. Returns `null` if no references exist. Files are discovered
965
+ * recursively through subdirectories and listed alphabetically within each
966
+ * directory level. Non-`.md` files are ignored. Symlinks that resolve
967
967
  * outside the skill directory are skipped.
968
968
  */
969
969
  export function listReferenceFiles(directoryPath: string): string | null {
@@ -977,10 +977,21 @@ export function listReferenceFiles(directoryPath: string): string | null {
977
977
  return null;
978
978
  }
979
979
 
980
- const entries = readdirSync(refsDir);
980
+ const entries = readdirSync(refsDir, { recursive: true }) as string[];
981
981
  const mdFiles = entries
982
982
  .filter((f) => f.toLowerCase().endsWith(".md"))
983
- .filter((f) => !isEscapingSymlink(join(refsDir, f), directoryPath))
983
+ .filter((f) => {
984
+ // Check the file itself
985
+ if (isEscapingSymlink(join(refsDir, f), directoryPath)) return false;
986
+ // Check all intermediate directory components (e.g. for "sub/dir/file.md"
987
+ // check "sub" and "sub/dir") to prevent traversal through symlinked dirs.
988
+ const parts = f.split("/");
989
+ for (let i = 1; i < parts.length; i++) {
990
+ const ancestor = join(refsDir, ...parts.slice(0, i));
991
+ if (isEscapingSymlink(ancestor, directoryPath)) return false;
992
+ }
993
+ return true;
994
+ })
984
995
  .sort((a, b) => a.localeCompare(b));
985
996
 
986
997
  if (mdFiles.length === 0) return null;
@@ -991,8 +1002,8 @@ export function listReferenceFiles(directoryPath: string): string | null {
991
1002
  "The following reference files are available in this skill's directory. Use `file_read` to load any that are relevant to the current task:",
992
1003
  "",
993
1004
  ];
994
- for (const filename of mdFiles) {
995
- lines.push(`- \`${join(refsDir, filename)}\``);
1005
+ for (const filepath of mdFiles) {
1006
+ lines.push(`- \`${join(refsDir, filepath)}\` (references/${filepath})`);
996
1007
  }
997
1008
 
998
1009
  return lines.join("\n");
@@ -9,7 +9,6 @@ const CHARS_PER_TOKEN = 4;
9
9
  const MESSAGE_OVERHEAD_TOKENS = 4;
10
10
  const TEXT_BLOCK_OVERHEAD_TOKENS = 2;
11
11
  const TOOL_BLOCK_OVERHEAD_TOKENS = 16;
12
- const IMAGE_BLOCK_TOKENS = 1024;
13
12
  const IMAGE_BLOCK_OVERHEAD_TOKENS = 16;
14
13
  const FILE_BLOCK_OVERHEAD_TOKENS = 48;
15
14
  const WEB_SEARCH_RESULT_TOKENS = 800;
@@ -20,12 +19,15 @@ const GEMINI_INLINE_FILE_MIME_TYPES = new Set(["application/pdf"]);
20
19
  // Anthropic scales images to fit within 1568x1568 maintaining aspect ratio,
21
20
  // then charges ~(width * height) / 750 tokens.
22
21
  const ANTHROPIC_IMAGE_MAX_DIMENSION = 1568;
22
+ // Anthropic caps images at ~1.2 megapixels in addition to the 1568px dimension limit.
23
+ // Images exceeding this are further scaled down. The docs state images above ~1,600 tokens
24
+ // are resized. 1,200,000 / 750 = 1,600 tokens, matching the documented threshold.
25
+ // Reference table (max sizes that won't be resized):
26
+ // 1:1 → 1092x1092 (~1,590 tokens) 1:2 → 784x1568 (~1,639 tokens)
27
+ // See: https://platform.claude.com/docs/en/build-with-claude/vision#evaluate-image-size
28
+ const ANTHROPIC_IMAGE_MAX_PIXELS = 1_200_000;
23
29
  const ANTHROPIC_IMAGE_TOKENS_PER_PIXEL = 1 / 750;
24
- const ANTHROPIC_IMAGE_MAX_TOKENS = Math.ceil(
25
- ANTHROPIC_IMAGE_MAX_DIMENSION *
26
- ANTHROPIC_IMAGE_MAX_DIMENSION *
27
- ANTHROPIC_IMAGE_TOKENS_PER_PIXEL,
28
- ); // ~3,277 tokens
30
+ const ANTHROPIC_IMAGE_MAX_TOKENS = 1_600;
29
31
 
30
32
  // Anthropic renders each PDF page as an image (~1,568 tokens at standard
31
33
  // resolution) plus any extracted text. Typical PDF pages are 50-150 KB.
@@ -85,17 +87,23 @@ function estimateFileDataTokens(
85
87
  }
86
88
 
87
89
  function estimateAnthropicImageTokens(width: number, height: number): number {
88
- // Scale down to fit within 1568x1568 bounding box, maintaining aspect ratio
89
- const scale = Math.min(
90
+ // Step 1: Scale to fit within 1568px bounding box
91
+ const dimScale = Math.min(
90
92
  1,
91
93
  ANTHROPIC_IMAGE_MAX_DIMENSION / Math.max(width, height),
92
94
  );
93
- const scaledWidth = Math.round(width * scale);
94
- const scaledHeight = Math.round(height * scale);
95
- return Math.max(
96
- IMAGE_BLOCK_TOKENS, // minimum 1024
97
- Math.ceil(scaledWidth * scaledHeight * ANTHROPIC_IMAGE_TOKENS_PER_PIXEL),
98
- );
95
+ let scaledWidth = Math.round(width * dimScale);
96
+ let scaledHeight = Math.round(height * dimScale);
97
+
98
+ // Step 2: Scale further if exceeds megapixel budget
99
+ const pixels = scaledWidth * scaledHeight;
100
+ if (pixels > ANTHROPIC_IMAGE_MAX_PIXELS) {
101
+ const mpScale = Math.sqrt(ANTHROPIC_IMAGE_MAX_PIXELS / pixels);
102
+ scaledWidth = Math.round(scaledWidth * mpScale);
103
+ scaledHeight = Math.round(scaledHeight * mpScale);
104
+ }
105
+
106
+ return Math.ceil(scaledWidth * scaledHeight * ANTHROPIC_IMAGE_TOKENS_PER_PIXEL);
99
107
  }
100
108
 
101
109
  function estimateImageTokens(
@@ -143,11 +151,10 @@ export function estimateContentBlockTokens(
143
151
  return tokens;
144
152
  }
145
153
  case "image":
146
- return Math.max(
147
- IMAGE_BLOCK_TOKENS,
154
+ return (
148
155
  IMAGE_BLOCK_OVERHEAD_TOKENS +
149
- estimateTextTokens(block.source.media_type) +
150
- estimateImageTokens(block, options),
156
+ estimateTextTokens(block.source.media_type) +
157
+ estimateImageTokens(block, options)
151
158
  );
152
159
  case "file":
153
160
  return (
@@ -581,7 +581,7 @@ export class ContextWindowManager {
581
581
  const overheadTokens =
582
582
  estimateTextTokens(SUMMARY_SYSTEM_PROMPT) +
583
583
  estimateTextTokens(currentSummary) +
584
- // Scaffolding text in buildSummaryPrompt ("Update the summary...",
584
+ // Scaffolding text in buildSummaryContentBlocks ("Update the summary...",
585
585
  // section headers, etc.) — generous fixed estimate.
586
586
  200 +
587
587
  this.summaryMaxTokens;
@@ -598,6 +598,7 @@ export class ContextWindowManager {
598
598
  for (const block of blocks) {
599
599
  totalTokens += estimateBlockTokens(block);
600
600
  }
601
+ const originalTotalTokens = totalTokens;
601
602
  if (totalTokens <= maxTranscriptTokens) return blocks;
602
603
 
603
604
  // First pass: drop images from the beginning until we fit or run out of
@@ -618,17 +619,43 @@ export class ContextWindowManager {
618
619
  if (totalTokens <= maxTranscriptTokens) return result;
619
620
 
620
621
  // Second pass: drop text blocks from the beginning (oldest) until we fit.
622
+ // If a single text block exceeds the remaining budget, truncate it rather
623
+ // than dropping it entirely so the summarizer always has content to work with.
621
624
  let dropUntil = 0;
622
625
  let droppedTokens = 0;
623
626
  for (let i = 0; i < result.length && totalTokens > maxTranscriptTokens; i++) {
624
- droppedTokens += estimateBlockTokens(result[i]);
625
- totalTokens -= estimateBlockTokens(result[i]);
627
+ const blockTokens = estimateBlockTokens(result[i]);
628
+ const excess = totalTokens - maxTranscriptTokens;
629
+ if (blockTokens > excess && result[i].type === "text") {
630
+ // Truncate this block to shed exactly the excess tokens.
631
+ // Subtract the cost of the "[...truncated] " prefix so the final
632
+ // block (prefix + kept text) stays within budget.
633
+ const truncationPrefix = "[...truncated] ";
634
+ const prefixTokens = estimateTextTokens(truncationPrefix);
635
+ const keepTokens = Math.max(1, blockTokens - excess - prefixTokens);
636
+ const text = (result[i] as { type: "text"; text: string }).text;
637
+ // Approximate: 1 token ≈ 4 characters for truncation purposes.
638
+ const keepChars = Math.max(1, Math.floor(keepTokens * 4));
639
+ const truncatedText = text.slice(-keepChars);
640
+ const truncatedBlock: ContentBlock = {
641
+ type: "text",
642
+ text: `${truncationPrefix}${truncatedText}`,
643
+ };
644
+ const newBlockTokens = estimateBlockTokens(truncatedBlock);
645
+ droppedTokens += blockTokens - newBlockTokens;
646
+ totalTokens -= blockTokens - newBlockTokens;
647
+ result[i] = truncatedBlock;
648
+ dropUntil = i;
649
+ break;
650
+ }
651
+ droppedTokens += blockTokens;
652
+ totalTokens -= blockTokens;
626
653
  dropUntil = i + 1;
627
654
  }
628
655
 
629
656
  log.info(
630
657
  {
631
- originalTokens: totalTokens + droppedTokens,
658
+ originalTokens: originalTotalTokens,
632
659
  cappedTokens: maxTranscriptTokens,
633
660
  droppedTokens,
634
661
  },
@@ -892,11 +919,7 @@ function serializeMessagesToContentBlocks(messages: Message[]): ContentBlock[] {
892
919
  textLines.length = 0;
893
920
  }
894
921
  blocks.push(block);
895
- } else if (block.type === "web_search_tool_result") {
896
- textLines.push(
897
- `web_search_tool_result ${block.tool_use_id}: [opaque]`,
898
- );
899
- } else if (block.type === "tool_result") {
922
+ } else if (block.type === "tool_result") { // guard:allow-tool-result-only — web_search_tool_result handled by serializeBlock via else branch
900
923
  // Extract images from tool_result contentBlocks before serializing.
901
924
  const collectedImages: ImageContent[] = [];
902
925
  textLines.push(serializeToolResultBlock(block, collectedImages));
@@ -103,7 +103,6 @@ function mapUserDecisionToCesDecision(
103
103
  userDecision: decision,
104
104
  };
105
105
  case "temporary_override":
106
- case "dangerously_skip_permissions":
107
106
  return {
108
107
  grantDecision: "approved",
109
108
  ttl: undefined,
@@ -31,6 +31,7 @@ import { StringDecoder } from "node:string_decoder";
31
31
  import type { Subprocess } from "bun";
32
32
 
33
33
  import type { AssistantConfig } from "../config/schema.js";
34
+ import { ensureBun } from "../util/bun-runtime.js";
34
35
  import { getLogger } from "../util/logger.js";
35
36
  import type { CesTransport } from "./client.js";
36
37
  import {
@@ -266,8 +267,9 @@ export function createCesProcessManager(
266
267
  "Spawning CES child process from source",
267
268
  );
268
269
 
270
+ const bunPath = await ensureBun();
269
271
  const proc = Bun.spawn({
270
- cmd: ["bun", "run", discovery.sourcePath],
272
+ cmd: [bunPath, "run", discovery.sourcePath],
271
273
  stdin: "pipe",
272
274
  stdout: "pipe",
273
275
  stderr: "ignore",