@vellumai/assistant 0.10.0 → 0.10.1-dev.202606240317.ea25efe

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 (972) hide show
  1. package/ARCHITECTURE.md +36 -37
  2. package/bun.lock +3 -0
  3. package/docs/workflows.md +12 -7
  4. package/eslint-rules/cli-no-daemon-internals.js +12 -0
  5. package/node_modules/@slack/types/LICENSE +23 -0
  6. package/node_modules/@slack/types/README.md +32 -0
  7. package/node_modules/@slack/types/dist/block-kit/block-elements.d.ts +953 -0
  8. package/node_modules/@slack/types/dist/block-kit/block-elements.d.ts.map +1 -0
  9. package/node_modules/@slack/types/dist/block-kit/block-elements.js +4 -0
  10. package/node_modules/@slack/types/dist/block-kit/block-elements.js.map +1 -0
  11. package/node_modules/@slack/types/dist/block-kit/blocks.d.ts +474 -0
  12. package/node_modules/@slack/types/dist/block-kit/blocks.d.ts.map +1 -0
  13. package/node_modules/@slack/types/dist/block-kit/blocks.js +3 -0
  14. package/node_modules/@slack/types/dist/block-kit/blocks.js.map +1 -0
  15. package/node_modules/@slack/types/dist/block-kit/composition-objects.d.ts +237 -0
  16. package/node_modules/@slack/types/dist/block-kit/composition-objects.d.ts.map +1 -0
  17. package/node_modules/@slack/types/dist/block-kit/composition-objects.js +4 -0
  18. package/node_modules/@slack/types/dist/block-kit/composition-objects.js.map +1 -0
  19. package/node_modules/@slack/types/dist/block-kit/extensions.d.ts +88 -0
  20. package/node_modules/@slack/types/dist/block-kit/extensions.d.ts.map +1 -0
  21. package/node_modules/@slack/types/dist/block-kit/extensions.js +3 -0
  22. package/node_modules/@slack/types/dist/block-kit/extensions.js.map +1 -0
  23. package/node_modules/@slack/types/dist/calls.d.ts +26 -0
  24. package/node_modules/@slack/types/dist/calls.d.ts.map +1 -0
  25. package/node_modules/@slack/types/dist/calls.js +6 -0
  26. package/node_modules/@slack/types/dist/calls.js.map +1 -0
  27. package/node_modules/@slack/types/dist/chunk.d.ts +52 -0
  28. package/node_modules/@slack/types/dist/chunk.d.ts.map +1 -0
  29. package/node_modules/@slack/types/dist/chunk.js +3 -0
  30. package/node_modules/@slack/types/dist/chunk.js.map +1 -0
  31. package/node_modules/@slack/types/dist/common/bot-profile.d.ts +12 -0
  32. package/node_modules/@slack/types/dist/common/bot-profile.d.ts.map +1 -0
  33. package/node_modules/@slack/types/dist/common/bot-profile.js +3 -0
  34. package/node_modules/@slack/types/dist/common/bot-profile.js.map +1 -0
  35. package/node_modules/@slack/types/dist/common/status-emoji-display-info.d.ts +6 -0
  36. package/node_modules/@slack/types/dist/common/status-emoji-display-info.d.ts.map +1 -0
  37. package/node_modules/@slack/types/dist/common/status-emoji-display-info.js +3 -0
  38. package/node_modules/@slack/types/dist/common/status-emoji-display-info.js.map +1 -0
  39. package/node_modules/@slack/types/dist/dialog.d.ts +36 -0
  40. package/node_modules/@slack/types/dist/dialog.d.ts.map +1 -0
  41. package/node_modules/@slack/types/dist/dialog.js +3 -0
  42. package/node_modules/@slack/types/dist/dialog.js.map +1 -0
  43. package/node_modules/@slack/types/dist/events/app.d.ts +204 -0
  44. package/node_modules/@slack/types/dist/events/app.d.ts.map +1 -0
  45. package/node_modules/@slack/types/dist/events/app.js +3 -0
  46. package/node_modules/@slack/types/dist/events/app.js.map +1 -0
  47. package/node_modules/@slack/types/dist/events/assistant.d.ts +29 -0
  48. package/node_modules/@slack/types/dist/events/assistant.d.ts.map +1 -0
  49. package/node_modules/@slack/types/dist/events/assistant.js +3 -0
  50. package/node_modules/@slack/types/dist/events/assistant.js.map +1 -0
  51. package/node_modules/@slack/types/dist/events/call.d.ts +8 -0
  52. package/node_modules/@slack/types/dist/events/call.d.ts.map +1 -0
  53. package/node_modules/@slack/types/dist/events/call.js +3 -0
  54. package/node_modules/@slack/types/dist/events/call.js.map +1 -0
  55. package/node_modules/@slack/types/dist/events/channel.d.ts +85 -0
  56. package/node_modules/@slack/types/dist/events/channel.d.ts.map +1 -0
  57. package/node_modules/@slack/types/dist/events/channel.js +3 -0
  58. package/node_modules/@slack/types/dist/events/channel.js.map +1 -0
  59. package/node_modules/@slack/types/dist/events/dnd.d.ts +24 -0
  60. package/node_modules/@slack/types/dist/events/dnd.d.ts.map +1 -0
  61. package/node_modules/@slack/types/dist/events/dnd.js +3 -0
  62. package/node_modules/@slack/types/dist/events/dnd.js.map +1 -0
  63. package/node_modules/@slack/types/dist/events/email.d.ts +6 -0
  64. package/node_modules/@slack/types/dist/events/email.d.ts.map +1 -0
  65. package/node_modules/@slack/types/dist/events/email.js +3 -0
  66. package/node_modules/@slack/types/dist/events/email.js.map +1 -0
  67. package/node_modules/@slack/types/dist/events/emoji.d.ts +11 -0
  68. package/node_modules/@slack/types/dist/events/emoji.d.ts.map +1 -0
  69. package/node_modules/@slack/types/dist/events/emoji.js +3 -0
  70. package/node_modules/@slack/types/dist/events/emoji.js.map +1 -0
  71. package/node_modules/@slack/types/dist/events/entity-details-requested.d.ts +21 -0
  72. package/node_modules/@slack/types/dist/events/entity-details-requested.d.ts.map +1 -0
  73. package/node_modules/@slack/types/dist/events/entity-details-requested.js +3 -0
  74. package/node_modules/@slack/types/dist/events/entity-details-requested.js.map +1 -0
  75. package/node_modules/@slack/types/dist/events/file.d.ts +60 -0
  76. package/node_modules/@slack/types/dist/events/file.d.ts.map +1 -0
  77. package/node_modules/@slack/types/dist/events/file.js +4 -0
  78. package/node_modules/@slack/types/dist/events/file.js.map +1 -0
  79. package/node_modules/@slack/types/dist/events/function.d.ts +33 -0
  80. package/node_modules/@slack/types/dist/events/function.d.ts.map +1 -0
  81. package/node_modules/@slack/types/dist/events/function.js +3 -0
  82. package/node_modules/@slack/types/dist/events/function.js.map +1 -0
  83. package/node_modules/@slack/types/dist/events/grid-migration.d.ts +9 -0
  84. package/node_modules/@slack/types/dist/events/grid-migration.d.ts.map +1 -0
  85. package/node_modules/@slack/types/dist/events/grid-migration.js +3 -0
  86. package/node_modules/@slack/types/dist/events/grid-migration.js.map +1 -0
  87. package/node_modules/@slack/types/dist/events/group.d.ts +55 -0
  88. package/node_modules/@slack/types/dist/events/group.d.ts.map +1 -0
  89. package/node_modules/@slack/types/dist/events/group.js +3 -0
  90. package/node_modules/@slack/types/dist/events/group.js.map +1 -0
  91. package/node_modules/@slack/types/dist/events/im.d.ts +26 -0
  92. package/node_modules/@slack/types/dist/events/im.d.ts.map +1 -0
  93. package/node_modules/@slack/types/dist/events/im.js +3 -0
  94. package/node_modules/@slack/types/dist/events/im.js.map +1 -0
  95. package/node_modules/@slack/types/dist/events/index.d.ts +60 -0
  96. package/node_modules/@slack/types/dist/events/index.d.ts.map +1 -0
  97. package/node_modules/@slack/types/dist/events/index.js +43 -0
  98. package/node_modules/@slack/types/dist/events/index.js.map +1 -0
  99. package/node_modules/@slack/types/dist/events/invite.d.ts +20 -0
  100. package/node_modules/@slack/types/dist/events/invite.d.ts.map +1 -0
  101. package/node_modules/@slack/types/dist/events/invite.js +3 -0
  102. package/node_modules/@slack/types/dist/events/invite.js.map +1 -0
  103. package/node_modules/@slack/types/dist/events/link-shared.d.ts +16 -0
  104. package/node_modules/@slack/types/dist/events/link-shared.d.ts.map +1 -0
  105. package/node_modules/@slack/types/dist/events/link-shared.js +3 -0
  106. package/node_modules/@slack/types/dist/events/link-shared.js.map +1 -0
  107. package/node_modules/@slack/types/dist/events/member.d.ts +19 -0
  108. package/node_modules/@slack/types/dist/events/member.d.ts.map +1 -0
  109. package/node_modules/@slack/types/dist/events/member.js +3 -0
  110. package/node_modules/@slack/types/dist/events/member.js.map +1 -0
  111. package/node_modules/@slack/types/dist/events/message-metadata.d.ts +38 -0
  112. package/node_modules/@slack/types/dist/events/message-metadata.d.ts.map +1 -0
  113. package/node_modules/@slack/types/dist/events/message-metadata.js +3 -0
  114. package/node_modules/@slack/types/dist/events/message-metadata.js.map +1 -0
  115. package/node_modules/@slack/types/dist/events/message.d.ts +306 -0
  116. package/node_modules/@slack/types/dist/events/message.d.ts.map +1 -0
  117. package/node_modules/@slack/types/dist/events/message.js +3 -0
  118. package/node_modules/@slack/types/dist/events/message.js.map +1 -0
  119. package/node_modules/@slack/types/dist/events/pin.d.ts +60 -0
  120. package/node_modules/@slack/types/dist/events/pin.d.ts.map +1 -0
  121. package/node_modules/@slack/types/dist/events/pin.js +3 -0
  122. package/node_modules/@slack/types/dist/events/pin.js.map +1 -0
  123. package/node_modules/@slack/types/dist/events/reaction.d.ts +23 -0
  124. package/node_modules/@slack/types/dist/events/reaction.d.ts.map +1 -0
  125. package/node_modules/@slack/types/dist/events/reaction.js +3 -0
  126. package/node_modules/@slack/types/dist/events/reaction.js.map +1 -0
  127. package/node_modules/@slack/types/dist/events/shared-channel.d.ts +134 -0
  128. package/node_modules/@slack/types/dist/events/shared-channel.d.ts.map +1 -0
  129. package/node_modules/@slack/types/dist/events/shared-channel.js +3 -0
  130. package/node_modules/@slack/types/dist/events/shared-channel.js.map +1 -0
  131. package/node_modules/@slack/types/dist/events/star.d.ts +13 -0
  132. package/node_modules/@slack/types/dist/events/star.d.ts.map +1 -0
  133. package/node_modules/@slack/types/dist/events/star.js +3 -0
  134. package/node_modules/@slack/types/dist/events/star.js.map +1 -0
  135. package/node_modules/@slack/types/dist/events/steps-from-apps.d.ts +82 -0
  136. package/node_modules/@slack/types/dist/events/steps-from-apps.d.ts.map +1 -0
  137. package/node_modules/@slack/types/dist/events/steps-from-apps.js +3 -0
  138. package/node_modules/@slack/types/dist/events/steps-from-apps.js.map +1 -0
  139. package/node_modules/@slack/types/dist/events/subteam.d.ts +66 -0
  140. package/node_modules/@slack/types/dist/events/subteam.d.ts.map +1 -0
  141. package/node_modules/@slack/types/dist/events/subteam.js +3 -0
  142. package/node_modules/@slack/types/dist/events/subteam.js.map +1 -0
  143. package/node_modules/@slack/types/dist/events/team.d.ts +99 -0
  144. package/node_modules/@slack/types/dist/events/team.d.ts.map +1 -0
  145. package/node_modules/@slack/types/dist/events/team.js +3 -0
  146. package/node_modules/@slack/types/dist/events/team.js.map +1 -0
  147. package/node_modules/@slack/types/dist/events/token.d.ts +8 -0
  148. package/node_modules/@slack/types/dist/events/token.d.ts.map +1 -0
  149. package/node_modules/@slack/types/dist/events/token.js +3 -0
  150. package/node_modules/@slack/types/dist/events/token.js.map +1 -0
  151. package/node_modules/@slack/types/dist/events/user.d.ts +313 -0
  152. package/node_modules/@slack/types/dist/events/user.d.ts.map +1 -0
  153. package/node_modules/@slack/types/dist/events/user.js +3 -0
  154. package/node_modules/@slack/types/dist/events/user.js.map +1 -0
  155. package/node_modules/@slack/types/dist/index.d.ts +12 -0
  156. package/node_modules/@slack/types/dist/index.d.ts.map +1 -0
  157. package/node_modules/@slack/types/dist/index.js +28 -0
  158. package/node_modules/@slack/types/dist/index.js.map +1 -0
  159. package/node_modules/@slack/types/dist/message-attachments.d.ts +171 -0
  160. package/node_modules/@slack/types/dist/message-attachments.d.ts.map +1 -0
  161. package/node_modules/@slack/types/dist/message-attachments.js +3 -0
  162. package/node_modules/@slack/types/dist/message-attachments.js.map +1 -0
  163. package/node_modules/@slack/types/dist/message-metadata.d.ts +281 -0
  164. package/node_modules/@slack/types/dist/message-metadata.d.ts.map +1 -0
  165. package/node_modules/@slack/types/dist/message-metadata.js +27 -0
  166. package/node_modules/@slack/types/dist/message-metadata.js.map +1 -0
  167. package/node_modules/@slack/types/dist/views.d.ts +71 -0
  168. package/node_modules/@slack/types/dist/views.d.ts.map +1 -0
  169. package/node_modules/@slack/types/dist/views.js +3 -0
  170. package/node_modules/@slack/types/dist/views.js.map +1 -0
  171. package/node_modules/@slack/types/package.json +47 -0
  172. package/node_modules/@vellumai/gateway-client/bun.lock +3 -0
  173. package/node_modules/@vellumai/gateway-client/package.json +1 -0
  174. package/node_modules/@vellumai/gateway-client/src/__tests__/contact-read-contracts.test.ts +69 -0
  175. package/node_modules/@vellumai/gateway-client/src/__tests__/guardian-delivery-contract.test.ts +91 -0
  176. package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +96 -0
  177. package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +162 -0
  178. package/node_modules/@vellumai/gateway-client/src/guardian-delivery-contract.ts +48 -0
  179. package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +8 -0
  180. package/node_modules/@vellumai/gateway-client/src/index.ts +28 -0
  181. package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +4 -2
  182. package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +3 -2
  183. package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +95 -0
  184. package/openapi.yaml +458 -18
  185. package/package.json +2 -1
  186. package/scripts/memory-inspect.ts +24 -14
  187. package/scripts/test.sh +36 -15
  188. package/src/__tests__/access-request-seed-content-blocks.test.ts +83 -103
  189. package/src/__tests__/activation-early-marking.test.ts +1 -1
  190. package/src/__tests__/actor-token-service.test.ts +39 -17
  191. package/src/__tests__/agent-loop-callsite-precedence.test.ts +1 -40
  192. package/src/__tests__/agent-loop-compaction-events.test.ts +0 -1
  193. package/src/__tests__/agent-loop-compaction-strip.test.ts +0 -1
  194. package/src/__tests__/agent-loop-exit-reason.test.ts +0 -1
  195. package/src/__tests__/agent-loop-pushes-post-hook-prompt.test.ts +306 -0
  196. package/src/__tests__/agent-loop-regrowth-guard.test.ts +0 -1
  197. package/src/__tests__/agent-loop.test.ts +3 -0
  198. package/src/__tests__/agent-wake-override-profile.test.ts +2 -0
  199. package/src/__tests__/anthropic-provider.test.ts +210 -9
  200. package/src/__tests__/app-builder-skill-instructions.test.ts +47 -5
  201. package/src/__tests__/app-conversation-ids-backfill.test.ts +1 -1
  202. package/src/__tests__/app-source-watcher.test.ts +30 -10
  203. package/src/__tests__/approval-cascade.test.ts +6 -0
  204. package/src/__tests__/approval-interception-trust-gates.test.ts +151 -0
  205. package/src/__tests__/approval-primitive.test.ts +1 -1
  206. package/src/__tests__/approval-routes-http.test.ts +1 -1
  207. package/src/__tests__/assistant-attachments.test.ts +155 -0
  208. package/src/__tests__/assistant-event-hub-machine-name.test.ts +2 -4
  209. package/src/__tests__/assistant-events-sse-hardening.test.ts +1 -1
  210. package/src/__tests__/assistant-events-sse-shed.test.ts +1 -1
  211. package/src/__tests__/attachment-upload-trusted-source.test.ts +13 -8
  212. package/src/__tests__/attachments-store.test.ts +1 -1
  213. package/src/__tests__/audit-log-rotation.test.ts +50 -54
  214. package/src/__tests__/auth-fallback-events-store.test.ts +1 -1
  215. package/src/__tests__/auto-analysis-end-to-end.test.ts +9 -14
  216. package/src/__tests__/background-shell-bash.test.ts +4 -1
  217. package/src/__tests__/background-shell-host-bash.test.ts +17 -3
  218. package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
  219. package/src/__tests__/call-controller.test.ts +20 -1
  220. package/src/__tests__/call-conversation-messages.test.ts +1 -1
  221. package/src/__tests__/call-domain.test.ts +1 -1
  222. package/src/__tests__/call-pointer-messages.test.ts +3 -4
  223. package/src/__tests__/call-recovery.test.ts +1 -1
  224. package/src/__tests__/call-routes-http.test.ts +1 -1
  225. package/src/__tests__/call-store.test.ts +1 -1
  226. package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
  227. package/src/__tests__/canonical-guardian-store.test.ts +24 -1
  228. package/src/__tests__/card-surface-data.test.ts +60 -0
  229. package/src/__tests__/channel-approval-routes.test.ts +73 -1119
  230. package/src/__tests__/channel-delivery-store.test.ts +1 -1
  231. package/src/__tests__/channel-guardian.test.ts +291 -641
  232. package/src/__tests__/channel-inbound-disk-pressure.test.ts +1 -2
  233. package/src/__tests__/channel-retry-sweep.test.ts +1 -1
  234. package/src/__tests__/compaction-events.test.ts +6 -0
  235. package/src/__tests__/compaction-trail-store.test.ts +6 -5
  236. package/src/__tests__/compaction.benchmark.test.ts +0 -1
  237. package/src/__tests__/compactor-image-manifest-trust.test.ts +1 -1
  238. package/src/__tests__/config-loader-backfill.test.ts +188 -52
  239. package/src/__tests__/config-schema.test.ts +35 -0
  240. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +1 -2
  241. package/src/__tests__/contact-store-user-file.test.ts +2 -2
  242. package/src/__tests__/contacts-relay-reads.test.ts +409 -0
  243. package/src/__tests__/contacts-tools.test.ts +4 -4
  244. package/src/__tests__/contacts-write.test.ts +1 -2
  245. package/src/__tests__/context-search-conversations-source.test.ts +1 -1
  246. package/src/__tests__/context-window-manager-compact-retry.test.ts +6 -2
  247. package/src/__tests__/context-window-manager-overflow-rung.test.ts +6 -2
  248. package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
  249. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -0
  250. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +3 -0
  251. package/src/__tests__/conversation-agent-loop-overflow.test.ts +3 -0
  252. package/src/__tests__/conversation-agent-loop.test.ts +7 -0
  253. package/src/__tests__/conversation-attachments.test.ts +2 -5
  254. package/src/__tests__/conversation-attention-store.test.ts +1 -1
  255. package/src/__tests__/conversation-attention-telegram.test.ts +1 -2
  256. package/src/__tests__/conversation-clear-safety.test.ts +1 -1
  257. package/src/__tests__/conversation-confirmation-signals.test.ts +6 -0
  258. package/src/__tests__/conversation-crud-inference-profile.test.ts +1 -1
  259. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +12 -19
  260. package/src/__tests__/conversation-disk-view-integration.test.ts +1 -1
  261. package/src/__tests__/conversation-disk-view.test.ts +1 -1
  262. package/src/__tests__/conversation-fork-crud.test.ts +10 -8
  263. package/src/__tests__/conversation-fork-retrospective.test.ts +250 -0
  264. package/src/__tests__/conversation-fork-route.test.ts +1 -1
  265. package/src/__tests__/conversation-inference-profile-list.test.ts +1 -1
  266. package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
  267. package/src/__tests__/conversation-init.benchmark.test.ts +1 -1
  268. package/src/__tests__/conversation-key-store-disk-view.test.ts +1 -1
  269. package/src/__tests__/conversation-lifecycle.test.ts +117 -0
  270. package/src/__tests__/conversation-list-source.test.ts +3 -3
  271. package/src/__tests__/conversation-process-callsite.test.ts +6 -14
  272. package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
  273. package/src/__tests__/conversation-queue.test.ts +95 -0
  274. package/src/__tests__/conversation-routes-disk-view.test.ts +1 -1
  275. package/src/__tests__/conversation-routes-guardian-reply.test.ts +12 -0
  276. package/src/__tests__/conversation-routes-slash-commands.test.ts +12 -0
  277. package/src/__tests__/conversation-runtime-assembly.test.ts +115 -12
  278. package/src/__tests__/conversation-slash-queue.test.ts +6 -0
  279. package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
  280. package/src/__tests__/conversation-speed-override.test.ts +6 -0
  281. package/src/__tests__/conversation-starter-routes.test.ts +5 -5
  282. package/src/__tests__/conversation-store.test.ts +1 -1
  283. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +4 -4
  284. package/src/__tests__/conversation-surfaces-task-progress.test.ts +352 -0
  285. package/src/__tests__/conversation-sync-tags.test.ts +1 -1
  286. package/src/__tests__/conversation-tool-setup-attribution.test.ts +47 -0
  287. package/src/__tests__/conversation-usage.test.ts +1 -1
  288. package/src/__tests__/conversation-wipe.test.ts +9 -8
  289. package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -0
  290. package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
  291. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
  292. package/src/__tests__/conversations-import-system-filter.test.ts +1 -1
  293. package/src/__tests__/copy-composer-tc-templates.test.ts +17 -0
  294. package/src/__tests__/credential-security-invariants.test.ts +0 -1
  295. package/src/__tests__/db-acp-history.test.ts +2 -2
  296. package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +5 -7
  297. package/src/__tests__/db-conversation-inference-profile-migration.test.ts +6 -7
  298. package/src/__tests__/db-llm-request-log-provider-migration.test.ts +5 -10
  299. package/src/__tests__/db-migration-rollback.test.ts +129 -39
  300. package/src/__tests__/db-proxy-transaction.test.ts +1 -1
  301. package/src/__tests__/db-schedule-syntax-migration.test.ts +0 -11
  302. package/src/__tests__/db-test-helpers.ts +36 -19
  303. package/src/__tests__/delete-propagation.test.ts +1 -1
  304. package/src/__tests__/deterministic-verification-control-plane.test.ts +28 -8
  305. package/src/__tests__/disk-pressure-guard.test.ts +41 -0
  306. package/src/__tests__/disk-pressure-tools.test.ts +41 -1
  307. package/src/__tests__/dm-backfill.test.ts +1 -1
  308. package/src/__tests__/drop-capability-card-state-migration.test.ts +0 -8
  309. package/src/__tests__/dynamic-page-surface.test.ts +0 -94
  310. package/src/__tests__/edit-propagation.test.ts +1 -1
  311. package/src/__tests__/emit-signal-routing-intent.test.ts +93 -5
  312. package/src/__tests__/empty-response-hook.test.ts +42 -0
  313. package/src/__tests__/events-client-registration.test.ts +1 -1
  314. package/src/__tests__/events-dev-bypass-actor.test.ts +7 -1
  315. package/src/__tests__/followup-tools.test.ts +1 -1
  316. package/src/__tests__/gemini-count-tokens.test.ts +70 -0
  317. package/src/__tests__/guardian-action-sweep.test.ts +9 -2
  318. package/src/__tests__/guardian-binding-drift-heal.test.ts +76 -11
  319. package/src/__tests__/guardian-card-withdrawal.test.ts +1 -1
  320. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -1
  321. package/src/__tests__/guardian-dispatch.test.ts +96 -2
  322. package/src/__tests__/guardian-outbound-http.test.ts +20 -12
  323. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +1 -1
  324. package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
  325. package/src/__tests__/guardian-routing-state.test.ts +1 -2
  326. package/src/__tests__/guardian-verification-voice-binding.test.ts +1 -1
  327. package/src/__tests__/headless-browser-mode.test.ts +2 -2
  328. package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
  329. package/src/__tests__/heartbeat-service.test.ts +6 -0
  330. package/src/__tests__/helpers/channel-test-adapter.ts +92 -0
  331. package/src/__tests__/host-app-control-routes.test.ts +24 -30
  332. package/src/__tests__/host-bash-routes.test.ts +31 -41
  333. package/src/__tests__/host-browser-routes.test.ts +26 -32
  334. package/src/__tests__/host-cu-routes-targeted.test.ts +25 -33
  335. package/src/__tests__/host-file-routes-targeted.test.ts +40 -52
  336. package/src/__tests__/host-transfer-routes-targeted.test.ts +31 -43
  337. package/src/__tests__/http-conversation-lineage.test.ts +1 -1
  338. package/src/__tests__/http-user-message-parity.test.ts +165 -8
  339. package/src/__tests__/image-recovery-hook.test.ts +1 -1
  340. package/src/__tests__/inbound-invite-redemption.test.ts +1 -2
  341. package/src/__tests__/inbound-trust-verdict.test.ts +254 -0
  342. package/src/__tests__/inference-profile-reaper.test.ts +1 -1
  343. package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
  344. package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
  345. package/src/__tests__/injector-chain.test.ts +1 -1
  346. package/src/__tests__/injector-disk-pressure.test.ts +11 -6
  347. package/src/__tests__/internal-telemetry-routes.test.ts +1 -1
  348. package/src/__tests__/invite-redemption-service.test.ts +244 -43
  349. package/src/__tests__/invite-routes-http.test.ts +35 -186
  350. package/src/__tests__/invite-service-ipc.test.ts +287 -0
  351. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +5 -5
  352. package/src/__tests__/jobs-store-upsert-debounced.test.ts +9 -12
  353. package/src/__tests__/list-messages-attachments.test.ts +42 -1
  354. package/src/__tests__/list-messages-client-message-id.test.ts +1 -1
  355. package/src/__tests__/list-messages-hidden-metadata.test.ts +1 -1
  356. package/src/__tests__/list-messages-page-latest.test.ts +1 -1
  357. package/src/__tests__/list-messages-tool-merge.test.ts +1 -1
  358. package/src/__tests__/llm-context-normalization.test.ts +105 -0
  359. package/src/__tests__/llm-context-route-provider.test.ts +69 -4
  360. package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +9 -5
  361. package/src/__tests__/llm-request-log-call-site.test.ts +6 -6
  362. package/src/__tests__/llm-request-log-turn-query.test.ts +27 -13
  363. package/src/__tests__/llm-resolver.test.ts +205 -5
  364. package/src/__tests__/llm-usage-store.test.ts +65 -1
  365. package/src/__tests__/log-export-routes.test.ts +1 -1
  366. package/src/__tests__/log-export-workspace.test.ts +3 -3
  367. package/src/__tests__/media-stream-server-integration.test.ts +127 -0
  368. package/src/__tests__/memory-jobs-worker-lanes.test.ts +5 -5
  369. package/src/__tests__/memory-recall-log-store.test.ts +1 -1
  370. package/src/__tests__/memory-upsert-concurrency.test.ts +3 -4
  371. package/src/__tests__/messages-after-tiebreaker.test.ts +1 -1
  372. package/src/__tests__/migration-import-from-url.test.ts +2 -2
  373. package/src/__tests__/mtime-cache.test.ts +375 -0
  374. package/src/__tests__/non-member-access-request.test.ts +190 -19
  375. package/src/__tests__/notification-broadcaster.test.ts +4 -0
  376. package/src/__tests__/notification-candidate-guardian-context.test.ts +203 -0
  377. package/src/__tests__/notification-decision-recipient-context.test.ts +33 -32
  378. package/src/__tests__/notification-deep-link.test.ts +4 -0
  379. package/src/__tests__/notification-guardian-path.test.ts +20 -1
  380. package/src/__tests__/notification-schedule-notify-dedup.test.ts +1 -1
  381. package/src/__tests__/oauth-provider-profiles.test.ts +1 -1
  382. package/src/__tests__/oauth-provider-visibility.test.ts +1 -1
  383. package/src/__tests__/oauth-store.test.ts +1 -1
  384. package/src/__tests__/pending-interactions-resolved-event.test.ts +7 -4
  385. package/src/__tests__/persist-unsendable-image-downscale.test.ts +1 -1
  386. package/src/__tests__/persist-unsendable-image.test.ts +1 -1
  387. package/src/__tests__/persona-resolver.test.ts +39 -1
  388. package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
  389. package/src/__tests__/playbook-execution.test.ts +1 -1
  390. package/src/__tests__/playbook-tools.test.ts +1 -1
  391. package/src/__tests__/plugin-api-model-profiles.test.ts +74 -21
  392. package/src/__tests__/plugin-bootstrap.test.ts +78 -0
  393. package/src/__tests__/provider-platform-proxy-integration.test.ts +25 -5
  394. package/src/__tests__/provider-usage-tracking.test.ts +40 -1
  395. package/src/__tests__/prune-old-conversations-job.test.ts +1 -1
  396. package/src/__tests__/reaction-persistence.test.ts +1 -1
  397. package/src/__tests__/registry.test.ts +3 -0
  398. package/src/__tests__/relay-server.test.ts +1026 -73
  399. package/src/__tests__/runtime-attachment-metadata.test.ts +9 -1
  400. package/src/__tests__/runtime-events-sse-bilingual.test.ts +7 -9
  401. package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
  402. package/src/__tests__/runtime-events-sse-reconnect.test.ts +1 -1
  403. package/src/__tests__/runtime-events-sse.test.ts +1 -1
  404. package/src/__tests__/schedule-retry.test.ts +1 -1
  405. package/src/__tests__/schedule-routes-workflow-validation.test.ts +1 -1
  406. package/src/__tests__/schedule-routes.test.ts +1 -1
  407. package/src/__tests__/schedule-store.test.ts +1 -1
  408. package/src/__tests__/schedule-tools.test.ts +1 -1
  409. package/src/__tests__/scheduler-disk-pressure.test.ts +1 -1
  410. package/src/__tests__/scheduler-recurrence.test.ts +1 -1
  411. package/src/__tests__/scheduler-reuse-conversation.test.ts +1 -1
  412. package/src/__tests__/scheduler-wake.test.ts +2 -1
  413. package/src/__tests__/scoped-approval-grants.test.ts +1 -1
  414. package/src/__tests__/scoped-grant-security-matrix.test.ts +5 -5
  415. package/src/__tests__/scrub-corrupted-image-attachments.test.ts +0 -8
  416. package/src/__tests__/secret-ingress-http.test.ts +12 -0
  417. package/src/__tests__/secret-routes-platform-proxy.test.ts +1 -0
  418. package/src/__tests__/send-endpoint-busy.test.ts +31 -9
  419. package/src/__tests__/sequence-store.test.ts +1 -1
  420. package/src/__tests__/server-history-render.test.ts +40 -1
  421. package/src/__tests__/settings-routes.test.ts +11 -10
  422. package/src/__tests__/skill-load-tool.test.ts +72 -0
  423. package/src/__tests__/skills.test.ts +44 -0
  424. package/src/__tests__/slack-inbound-verification.test.ts +48 -5
  425. package/src/__tests__/slack-messaging-token-resolution.test.ts +13 -2
  426. package/src/__tests__/slack-reaction-canonical-approval.test.ts +1 -1
  427. package/src/__tests__/sse-actor-principal-guardian-source.test.ts +102 -0
  428. package/src/__tests__/steer-on-enqueue-question.test.ts +181 -0
  429. package/src/__tests__/stt-hints.test.ts +44 -13
  430. package/src/__tests__/subagent-detail.test.ts +27 -0
  431. package/src/__tests__/subagent-disposal.test.ts +65 -0
  432. package/src/__tests__/subagent-tool-gate-mode.test.ts +2 -73
  433. package/src/__tests__/subagent-tools.test.ts +1 -31
  434. package/src/__tests__/system-prompt.test.ts +1 -1
  435. package/src/__tests__/system-storage-cleanup-skill.test.ts +56 -0
  436. package/src/__tests__/task-compiler.test.ts +1 -1
  437. package/src/__tests__/task-management-tools.test.ts +1 -1
  438. package/src/__tests__/task-memory-cleanup.test.ts +9 -6
  439. package/src/__tests__/task-scheduler.test.ts +1 -1
  440. package/src/__tests__/thread-backfill.test.ts +1 -1
  441. package/src/__tests__/tool-approval-handler.test.ts +1 -1
  442. package/src/__tests__/tool-approval-seed-content-blocks.test.ts +2 -0
  443. package/src/__tests__/tool-executor.test.ts +37 -1
  444. package/src/__tests__/tool-grant-request-escalation.test.ts +1 -2
  445. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +73 -1
  446. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +34 -34
  447. package/src/__tests__/trusted-contact-multichannel.test.ts +1 -2
  448. package/src/__tests__/trusted-contact-verification.test.ts +1 -1
  449. package/src/__tests__/turn-boundary-resolution.test.ts +3 -3
  450. package/src/__tests__/turn-events-store.test.ts +1 -1
  451. package/src/__tests__/twilio-routes.test.ts +98 -3
  452. package/src/__tests__/usage-cache-backfill-migration.test.ts +20 -10
  453. package/src/__tests__/usage-routes.test.ts +1 -1
  454. package/src/__tests__/user-plugin-loader.test.ts +34 -29
  455. package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
  456. package/src/__tests__/voice-invite-redemption.test.ts +134 -36
  457. package/src/__tests__/voice-scoped-grant-consumer.test.ts +1 -1
  458. package/src/__tests__/voice-session-bridge.test.ts +1 -1
  459. package/src/__tests__/workspace-git-service.test.ts +114 -1
  460. package/src/__tests__/workspace-heartbeat-service.test.ts +45 -0
  461. package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +1 -1
  462. package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +1 -1
  463. package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +88 -18
  464. package/src/__tests__/workspace-migration-108-drop-balanced-economy-profile.test.ts +6 -6
  465. package/src/__tests__/workspace-migration-109-swap-quality-profile-to-glm-5p2.test.ts +281 -0
  466. package/src/__tests__/workspace-migration-110-flip-balanced-profile-to-together.test.ts +167 -0
  467. package/src/__tests__/workspace-migrations-runner.test.ts +55 -0
  468. package/src/__tests__/workspace-tool-loader.test.ts +3 -0
  469. package/src/a2a/__tests__/e2e-a2a-channel.test.ts +1 -1
  470. package/src/a2a/__tests__/task-store.test.ts +1 -1
  471. package/src/acp/__tests__/session-manager-persistence.test.ts +1 -1
  472. package/src/acp/__tests__/session-manager-resume.test.ts +22 -11
  473. package/src/acp/__tests__/session-manager-startup.test.ts +1 -1
  474. package/src/acp/__tests__/session-manager.test.ts +72 -1
  475. package/src/acp/index.ts +10 -0
  476. package/src/acp/session-manager.ts +35 -0
  477. package/src/agent/loop-exclusive-tool.test.ts +150 -0
  478. package/src/agent/loop.ts +101 -27
  479. package/src/api/constants/sse-replay.ts +41 -0
  480. package/src/api/events/ui-surface-show.ts +8 -3
  481. package/src/api/index.ts +7 -6
  482. package/src/api/responses/conversation-message.ts +4 -0
  483. package/src/api/responses/llm-request-log-entry.ts +25 -0
  484. package/src/api/responses/subagent-detail.ts +17 -0
  485. package/src/api/surfaces.ts +33 -0
  486. package/src/approvals/AGENTS.md +1 -2
  487. package/src/approvals/guardian-decision-primitive.ts +13 -210
  488. package/src/approvals/guardian-request-resolvers.ts +104 -58
  489. package/src/background-wake/wake-intent-hooks.test.ts +1 -1
  490. package/src/calls/__tests__/inbound-trust-reader.test.ts +110 -0
  491. package/src/calls/__tests__/relay-setup-router.test.ts +349 -65
  492. package/src/calls/guardian-dispatch.ts +10 -8
  493. package/src/calls/inbound-trust-reader.ts +56 -0
  494. package/src/calls/media-stream-server.ts +21 -0
  495. package/src/calls/relay-server.ts +231 -72
  496. package/src/calls/relay-setup-router.ts +57 -13
  497. package/src/calls/relay-verification.ts +7 -7
  498. package/src/calls/stt-hints.ts +9 -12
  499. package/src/calls/twilio-routes.ts +13 -3
  500. package/src/cli/commands/__tests__/cache.test.ts +8 -1
  501. package/src/cli/commands/cache.ts +194 -181
  502. package/src/cli/commands/contacts.ts +6 -24
  503. package/src/cli/commands/db/__tests__/repair.test.ts +15 -6
  504. package/src/cli/commands/db/__tests__/status.test.ts +7 -3
  505. package/src/cli/commands/db/status.ts +212 -33
  506. package/src/cli/commands/mcp.ts +252 -218
  507. package/src/cli/commands/memory/__tests__/memory-v3.test.ts +6 -1
  508. package/src/cli/commands/memory/__tests__/worker.test.ts +302 -0
  509. package/src/cli/commands/memory/index.ts +4 -0
  510. package/src/cli/commands/memory/memory-retrospective.ts +129 -0
  511. package/src/cli/commands/memory/memory-v3.ts +176 -4
  512. package/src/cli/commands/memory/worker.ts +175 -0
  513. package/src/cli/commands/plugins.ts +343 -14
  514. package/src/cli/lib/__tests__/install-from-github.test.ts +40 -0
  515. package/src/cli/lib/__tests__/list-installed-plugins.test.ts +160 -1
  516. package/src/cli/lib/__tests__/plugin-pin-history.test.ts +162 -0
  517. package/src/cli/lib/__tests__/toggle-plugin.test.ts +158 -0
  518. package/src/cli/lib/install-from-github.ts +47 -6
  519. package/src/cli/lib/list-installed-plugins.ts +179 -1
  520. package/src/cli/lib/plugin-marketplace.ts +11 -0
  521. package/src/cli/lib/plugin-pin-history.ts +257 -0
  522. package/src/cli/lib/toggle-plugin.ts +146 -0
  523. package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +143 -0
  524. package/src/config/__tests__/sync-gated-profiles.test.ts +2 -2
  525. package/src/config/bundled-skills/app-builder/SKILL.md +15 -33
  526. package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +3 -8
  527. package/src/config/bundled-skills/app-builder/references/INTERACTION_HOOKS.md +64 -37
  528. package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +1 -1
  529. package/src/config/bundled-skills/app-builder/references/WIDGETS.md +14 -72
  530. package/src/config/bundled-skills/app-builder/references/examples/README.md +1 -2
  531. package/src/config/bundled-skills/contacts/SKILL.md +7 -12
  532. package/src/config/bundled-skills/messaging/tools/shared.ts +4 -1
  533. package/src/config/bundled-skills/system-storage-cleanup/SKILL.md +74 -0
  534. package/src/config/bundled-skills/workflows/SKILL.md +4 -3
  535. package/src/config/call-site-defaults.ts +11 -2
  536. package/src/config/feature-flag-registry.json +0 -8
  537. package/src/config/llm-resolver.ts +151 -14
  538. package/src/config/loader.ts +36 -5
  539. package/src/config/profile-dispatchability.ts +11 -0
  540. package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
  541. package/src/config/schemas/call-site-catalog.ts +7 -0
  542. package/src/config/schemas/llm.ts +2 -0
  543. package/src/config/schemas/memory-lifecycle.ts +17 -3
  544. package/src/config/schemas/memory-v3.ts +7 -0
  545. package/src/config/schemas/memory.ts +4 -0
  546. package/src/config/schemas/timeouts.ts +32 -0
  547. package/src/config/seed-inference-profiles.ts +147 -50
  548. package/src/config/skills.ts +27 -5
  549. package/src/config/sync-gated-profiles.ts +13 -1
  550. package/src/contacts/__tests__/guardian-delivery-reader.test.ts +312 -0
  551. package/src/contacts/contact-store.ts +21 -0
  552. package/src/contacts/contacts-write.ts +3 -0
  553. package/src/contacts/guardian-delivery-reader.ts +223 -0
  554. package/src/contacts/member-status.ts +9 -0
  555. package/src/credential-health/credential-health-service.ts +1 -5
  556. package/src/daemon/__tests__/conversation-tool-setup.test.ts +44 -0
  557. package/src/daemon/app-source-watcher.ts +31 -18
  558. package/src/daemon/assistant-attachments.ts +94 -4
  559. package/src/daemon/conversation-agent-loop-handlers.ts +3 -0
  560. package/src/daemon/conversation-agent-loop.ts +18 -36
  561. package/src/daemon/conversation-process.ts +35 -16
  562. package/src/daemon/conversation-runtime-assembly.ts +91 -66
  563. package/src/daemon/conversation-surfaces.ts +273 -18
  564. package/src/daemon/conversation-tool-setup.ts +24 -64
  565. package/src/daemon/conversation.ts +149 -53
  566. package/src/daemon/disk-pressure-guard.ts +12 -2
  567. package/src/daemon/event-loop-watchdog.test.ts +85 -0
  568. package/src/daemon/event-loop-watchdog.ts +133 -0
  569. package/src/daemon/external-plugins-bootstrap.ts +26 -80
  570. package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +1 -1
  571. package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +1 -1
  572. package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +1 -1
  573. package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +1 -1
  574. package/src/daemon/handlers/__tests__/config-a2a.test.ts +1 -1
  575. package/src/daemon/handlers/config-channels.ts +41 -27
  576. package/src/daemon/handlers/conversations.ts +84 -0
  577. package/src/daemon/handlers/shared.ts +7 -0
  578. package/src/daemon/lifecycle.ts +44 -5
  579. package/src/daemon/memory-v2-startup.test.ts +72 -0
  580. package/src/daemon/memory-v2-startup.ts +87 -19
  581. package/src/daemon/message-types/inbox.ts +0 -6
  582. package/src/daemon/message-types/messages.ts +0 -4
  583. package/src/daemon/message-types/surfaces.ts +12 -11
  584. package/src/daemon/server.ts +0 -4
  585. package/src/daemon/shutdown-handlers.ts +20 -0
  586. package/src/daemon/tool-setup-types.ts +7 -5
  587. package/src/daemon/trust-context.ts +6 -0
  588. package/src/daemon/wake-conversation-ops.ts +70 -0
  589. package/src/daemon/workspace-tools-watcher.ts +7 -3
  590. package/src/documents/document-comments-store.test.ts +1 -1
  591. package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +1 -1
  592. package/src/heartbeat/__tests__/heartbeat-service.test.ts +6 -0
  593. package/src/heartbeat/heartbeat-service.ts +3 -4
  594. package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
  595. package/src/ipc/__tests__/browser-ipc.test.ts +73 -2
  596. package/src/ipc/__tests__/clients-list-ipc.test.ts +1 -1
  597. package/src/ipc/__tests__/watcher-ipc.test.ts +59 -39
  598. package/src/ipc/assistant-server.ts +10 -2
  599. package/src/ipc/gateway-client.ts +2 -1
  600. package/src/ipc/routes/__tests__/invite-ipc-routes.test.ts +58 -0
  601. package/src/ipc/routes/invite-ipc-routes.ts +66 -0
  602. package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
  603. package/src/memory/__tests__/activation-session-store.test.ts +1 -1
  604. package/src/memory/__tests__/auto-analysis-guard.test.ts +1 -1
  605. package/src/memory/__tests__/conversation-group-migration.test.ts +1 -1
  606. package/src/memory/__tests__/conversation-queries.test.ts +1 -1
  607. package/src/memory/__tests__/db-async-query.test.ts +1 -1
  608. package/src/memory/__tests__/db-logs-attach.test.ts +110 -0
  609. package/src/memory/__tests__/db-maintenance.test.ts +28 -36
  610. package/src/memory/__tests__/db-memory-attach.test.ts +113 -0
  611. package/src/memory/__tests__/find-analysis-conversation.test.ts +1 -1
  612. package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +1 -1
  613. package/src/memory/__tests__/fork-message-copy.test.ts +232 -0
  614. package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +3 -0
  615. package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +5 -5
  616. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +8 -6
  617. package/src/memory/__tests__/memory-retrospective-job.test.ts +30 -37
  618. package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +69 -66
  619. package/src/memory/__tests__/memory-retrospective-state.test.ts +1 -1
  620. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
  621. package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +1 -1
  622. package/src/memory/__tests__/onboarding-events-store.test.ts +1 -1
  623. package/src/memory/__tests__/prompt-override.test.ts +192 -0
  624. package/src/memory/__tests__/table-relocation.test.ts +129 -0
  625. package/src/memory/conversation-crud.ts +461 -152
  626. package/src/memory/db-async-query.ts +89 -5
  627. package/src/memory/db-connection.ts +101 -18
  628. package/src/memory/db-init.ts +409 -234
  629. package/src/memory/db-maintenance.ts +43 -38
  630. package/src/memory/db-singleton.ts +45 -19
  631. package/src/memory/embedding-gemini.test.ts +3 -1
  632. package/src/memory/embedding-gemini.ts +18 -2
  633. package/src/memory/fork-message-copy.ts +170 -0
  634. package/src/memory/graph/__tests__/handle-remember-v2.test.ts +92 -0
  635. package/src/memory/graph/bootstrap.test.ts +6 -3
  636. package/src/memory/graph/retriever.test.ts +12 -12
  637. package/src/memory/graph/store.test.ts +15 -25
  638. package/src/memory/graph/store.ts +23 -14
  639. package/src/memory/graph/tool-handlers.ts +34 -5
  640. package/src/memory/graph/tools.ts +5 -2
  641. package/src/memory/indexer.ts +21 -9
  642. package/src/memory/job-handlers/cleanup.ts +10 -3
  643. package/src/memory/job-handlers/embedding.test.ts +4 -4
  644. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +4 -4
  645. package/src/memory/jobs/embed-pkb-file.test.ts +7 -7
  646. package/src/memory/jobs-store.ts +36 -24
  647. package/src/memory/llm-request-log-store.ts +51 -19
  648. package/src/memory/llm-usage-store.ts +79 -21
  649. package/src/memory/memory-retrospective-job.ts +27 -19
  650. package/src/memory/memory-retrospective-startup-cleanup.ts +10 -2
  651. package/src/memory/migrations/{100-core-tables.ts → 000-core-tables.ts} +6 -10
  652. package/src/memory/migrations/014-backfill-inbox-thread-state.ts +13 -3
  653. package/src/memory/migrations/104-core-indexes.ts +1 -1
  654. package/src/memory/migrations/126-backfill-guardian-principal-id.ts +189 -196
  655. package/src/memory/migrations/127-guardian-principal-id-not-null.ts +98 -105
  656. package/src/memory/migrations/134-contacts-notes-column.ts +66 -69
  657. package/src/memory/migrations/135-backfill-contact-interaction-stats.ts +19 -22
  658. package/src/memory/migrations/136-drop-assistant-id-columns.ts +241 -219
  659. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +204 -209
  660. package/src/memory/migrations/141-rename-verification-table.ts +45 -48
  661. package/src/memory/migrations/142-rename-verification-session-id-column.ts +16 -23
  662. package/src/memory/migrations/143-rename-guardian-verification-values.ts +23 -30
  663. package/src/memory/migrations/144-rename-voice-to-phone.ts +133 -136
  664. package/src/memory/migrations/145-drop-accounts-table.ts +4 -7
  665. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +79 -82
  666. package/src/memory/migrations/148-drop-reminders-table.ts +3 -6
  667. package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +71 -78
  668. package/src/memory/migrations/157-invite-contact-id.ts +73 -76
  669. package/src/memory/migrations/162-guardian-timestamps-epoch-ms.ts +44 -58
  670. package/src/memory/migrations/169-rename-gmail-provider-key-to-google.ts +36 -43
  671. package/src/memory/migrations/174-rename-thread-starters-table.ts +30 -37
  672. package/src/memory/migrations/176-drop-capability-card-state.ts +17 -22
  673. package/src/memory/migrations/177-create-trace-events-table.ts +23 -28
  674. package/src/memory/migrations/180-backfill-inline-attachments-to-disk.ts +36 -43
  675. package/src/memory/migrations/181-rename-thread-starters-checkpoints.ts +14 -21
  676. package/src/memory/migrations/191-backfill-audio-attachment-mime-types.ts +17 -24
  677. package/src/memory/migrations/192-contacts-user-file-column.ts +6 -9
  678. package/src/memory/migrations/193-add-source-type-columns.ts +33 -36
  679. package/src/memory/migrations/194-memory-recall-logs.ts +34 -39
  680. package/src/memory/migrations/196-strip-integration-prefix-from-provider-keys.ts +59 -66
  681. package/src/memory/migrations/199-guardian-request-enrichment-columns.ts +41 -48
  682. package/src/memory/migrations/204-rename-memory-graph-type-values.ts +11 -18
  683. package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +76 -83
  684. package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +135 -68
  685. package/src/memory/migrations/211-memory-recall-logs-query-context.ts +6 -11
  686. package/src/memory/migrations/212-llm-request-logs-created-at-index.ts +4 -9
  687. package/src/memory/migrations/217-conversation-host-access.ts +13 -18
  688. package/src/memory/migrations/220-normalize-user-file-by-principal.ts +86 -93
  689. package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +41 -48
  690. package/src/memory/migrations/230-acp-session-history.ts +23 -28
  691. package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +58 -62
  692. package/src/memory/migrations/232-activation-state.ts +11 -16
  693. package/src/memory/migrations/233-document-conversations.ts +20 -25
  694. package/src/memory/migrations/234-memory-v2-activation-logs.ts +26 -31
  695. package/src/memory/migrations/235-slack-compaction-watermark.ts +5 -10
  696. package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +6 -11
  697. package/src/memory/migrations/237-heartbeat-runs.ts +22 -27
  698. package/src/memory/migrations/239-trace-events-created-at-index.ts +4 -9
  699. package/src/memory/migrations/242-message-bookmarks.ts +17 -22
  700. package/src/memory/migrations/245-memory-retrospective-state.ts +8 -13
  701. package/src/memory/migrations/249-normalize-slack-external-content.ts +37 -41
  702. package/src/memory/migrations/251-a2a-tasks.ts +27 -32
  703. package/src/memory/migrations/254-external-conversation-binding-chat-name.ts +12 -17
  704. package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +10 -15
  705. package/src/memory/migrations/256-memory-v2-injection-events.ts +70 -74
  706. package/src/memory/migrations/259-conversation-cleaned-at.ts +4 -9
  707. package/src/memory/migrations/260-rename-cleaned-at.ts +11 -16
  708. package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +3 -8
  709. package/src/memory/migrations/262-memory-v3-coactivation.ts +21 -26
  710. package/src/memory/migrations/263-memory-v3-auto-edges.ts +14 -19
  711. package/src/memory/migrations/270-schedule-description.ts +7 -12
  712. package/src/memory/migrations/272-acp-session-history-cwd.ts +8 -13
  713. package/src/memory/migrations/281-memory-retrospective-remembered-log.ts +8 -13
  714. package/src/memory/migrations/297-move-llm-request-logs-to-logs-db.ts +111 -0
  715. package/src/memory/migrations/298-move-memory-jobs-to-memory-db.ts +128 -0
  716. package/src/memory/migrations/299-canonical-guardian-deliveries-conversation-index.ts +19 -0
  717. package/src/memory/migrations/__tests__/014-backfill-inbox-thread-state.test.ts +108 -0
  718. package/src/memory/migrations/__tests__/136-drop-assistant-id-columns.test.ts +82 -0
  719. package/src/memory/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +224 -0
  720. package/src/memory/migrations/__tests__/297-move-llm-request-logs.test.ts +180 -0
  721. package/src/memory/migrations/__tests__/run-migrations.test.ts +333 -7
  722. package/src/memory/migrations/helpers/relocation.ts +227 -0
  723. package/src/memory/migrations/registry.ts +63 -0
  724. package/src/memory/migrations/run-migrations.ts +187 -16
  725. package/src/memory/migrations/schema-introspection.ts +14 -0
  726. package/src/memory/migrations/validate-migration-state.ts +50 -145
  727. package/src/memory/prompt-override.ts +129 -0
  728. package/src/memory/raw-query.ts +47 -2
  729. package/src/memory/skill-loaded-events-store.test.ts +1 -1
  730. package/src/memory/task-memory-cleanup.ts +62 -41
  731. package/src/memory/tool-executed-events-store.test.ts +1 -1
  732. package/src/memory/turn-trace-store.test.ts +1 -1
  733. package/src/memory/v2/__tests__/backfill-jobs.test.ts +16 -15
  734. package/src/memory/v2/__tests__/cli-command-store.test.ts +25 -0
  735. package/src/memory/v2/__tests__/harness-compare.test.ts +1 -1
  736. package/src/memory/v2/__tests__/harness-oracle.test.ts +1 -1
  737. package/src/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
  738. package/src/memory/v2/__tests__/skill-store.test.ts +80 -0
  739. package/src/memory/v2/__tests__/sweep-job.test.ts +2 -2
  740. package/src/memory/v2/cli-command-store.ts +75 -38
  741. package/src/memory/v2/prompts/consolidation.ts +13 -82
  742. package/src/memory/v2/prompts/router.ts +21 -93
  743. package/src/memory/v2/skill-store.ts +68 -31
  744. package/src/memory/v3-eval/__tests__/eval-packets.test.ts +38 -0
  745. package/src/memory/v3-eval/__tests__/eval-tally.test.ts +139 -0
  746. package/src/memory/v3-eval/eval-packets.ts +197 -12
  747. package/src/memory/v3-eval/eval-tally.ts +234 -0
  748. package/src/memory/worker-control.ts +118 -0
  749. package/src/memory/worker-process.ts +72 -0
  750. package/src/messaging/provider.ts +10 -0
  751. package/src/messaging/providers/gmail/adapter.ts +1 -0
  752. package/src/messaging/providers/gmail/client.ts +13 -0
  753. package/src/messaging/providers/index.ts +1 -1
  754. package/src/messaging/providers/slack/send.test.ts +87 -39
  755. package/src/messaging/providers/slack/send.ts +84 -105
  756. package/src/notifications/README.md +9 -5
  757. package/src/notifications/__tests__/broadcaster.test.ts +16 -8
  758. package/src/notifications/__tests__/connected-channels.test.ts +114 -0
  759. package/src/notifications/__tests__/decision-engine.test.ts +78 -9
  760. package/src/notifications/__tests__/destination-resolver.test.ts +256 -0
  761. package/src/notifications/__tests__/deterministic-checks.test.ts +43 -1
  762. package/src/notifications/adapters/slack.ts +12 -10
  763. package/src/notifications/approval-card-builder.ts +81 -20
  764. package/src/notifications/approval-card-data.ts +8 -5
  765. package/src/notifications/broadcaster.ts +8 -1
  766. package/src/notifications/canonical-delivery-recorder.ts +7 -5
  767. package/src/notifications/conversation-candidates.ts +24 -59
  768. package/src/notifications/copy-composer.ts +48 -68
  769. package/src/notifications/decision-engine.ts +15 -7
  770. package/src/notifications/destination-resolver.ts +68 -24
  771. package/src/notifications/deterministic-checks.ts +19 -16
  772. package/src/notifications/emit-signal.ts +68 -15
  773. package/src/notifications/trusted-contact-payloads.ts +70 -0
  774. package/src/oauth/byo-connection.test.ts +9 -0
  775. package/src/oauth/connection-resolver.test.ts +174 -6
  776. package/src/oauth/connection-resolver.ts +132 -5
  777. package/src/oauth/oauth-store.ts +16 -3
  778. package/src/oauth/scope-utils.ts +39 -0
  779. package/src/permissions/question-prompter.test.ts +1 -1
  780. package/src/permissions/question-prompter.ts +7 -4
  781. package/src/plugin-api/index.ts +9 -4
  782. package/src/plugin-api/model-profiles.test.ts +123 -0
  783. package/src/plugin-api/model-profiles.ts +5 -1
  784. package/src/plugin-api/vision-support.test.ts +173 -0
  785. package/src/plugin-api/vision-support.ts +113 -0
  786. package/src/plugins/defaults/advisor/__tests__/consult.test.ts +90 -0
  787. package/src/plugins/defaults/advisor/__tests__/context-pack-gating.test.ts +106 -0
  788. package/src/plugins/defaults/advisor/__tests__/context-pack.test.ts +60 -0
  789. package/src/plugins/defaults/advisor/consult.ts +65 -6
  790. package/src/plugins/defaults/advisor/context-pack.ts +288 -0
  791. package/src/plugins/defaults/advisor/steering.ts +14 -2
  792. package/src/plugins/defaults/advisor/tools/advisor.ts +32 -5
  793. package/src/plugins/defaults/compaction/window-manager.ts +45 -64
  794. package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +13 -4
  795. package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +441 -0
  796. package/src/plugins/defaults/image-fallback/hooks/post-tool-use.ts +57 -0
  797. package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +61 -0
  798. package/src/plugins/defaults/image-fallback/package.json +14 -0
  799. package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +108 -0
  800. package/src/plugins/defaults/image-fallback/src/caption-cache.ts +49 -0
  801. package/src/plugins/defaults/image-fallback/src/image-persist.ts +56 -0
  802. package/src/plugins/defaults/image-fallback/src/vision-caption.ts +120 -0
  803. package/src/plugins/defaults/index.ts +27 -0
  804. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +14 -1
  805. package/src/plugins/defaults/memory-retrieval/injectors.ts +4 -4
  806. package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +134 -5
  807. package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +11 -2
  808. package/src/plugins/defaults/memory-v3-shadow/pool-select.test.ts +146 -0
  809. package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +246 -19
  810. package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +8 -1
  811. package/src/plugins/external-plugin-loader.ts +47 -6
  812. package/src/plugins/mtime-cache.ts +772 -0
  813. package/src/plugins/pipeline.ts +7 -2
  814. package/src/plugins/registry.ts +16 -5
  815. package/src/plugins/user-loader.ts +22 -76
  816. package/src/prompts/persona-resolver.ts +29 -11
  817. package/src/prompts/system-prompt.ts +1 -1
  818. package/src/prompts/templates/system-sections.ts +4 -4
  819. package/src/providers/__tests__/count-tokens-forwarding.test.ts +98 -0
  820. package/src/providers/anthropic/client.ts +290 -185
  821. package/src/providers/call-site-routing.ts +14 -0
  822. package/src/providers/gemini/client.ts +43 -0
  823. package/src/providers/inference/adapter-factory.ts +6 -0
  824. package/src/providers/inference/connections.ts +6 -1
  825. package/src/providers/model-catalog.ts +53 -0
  826. package/src/providers/openai/responses-provider.ts +5 -0
  827. package/src/providers/openrouter/client.ts +5 -0
  828. package/src/providers/platform-proxy/constants.ts +5 -0
  829. package/src/providers/provider-send-message.ts +4 -0
  830. package/src/providers/ratelimit.ts +13 -0
  831. package/src/providers/retry.ts +14 -0
  832. package/src/providers/together/client.ts +35 -0
  833. package/src/providers/types.ts +25 -0
  834. package/src/providers/usage-tracking.ts +11 -0
  835. package/src/runtime/AGENTS.md +9 -1
  836. package/src/runtime/__tests__/agent-wake.test.ts +259 -4
  837. package/src/runtime/__tests__/guardian-vellum-migration.test.ts +181 -0
  838. package/src/runtime/__tests__/is-guardian-bound-for-channel.test.ts +64 -0
  839. package/src/runtime/__tests__/local-principal-trust.test.ts +164 -0
  840. package/src/runtime/__tests__/slack-block-formatting.test.ts +39 -10
  841. package/src/runtime/__tests__/trust-verdict-consumer.test.ts +670 -0
  842. package/src/runtime/access-request-helper.ts +19 -39
  843. package/src/runtime/actor-trust-resolver.ts +8 -16
  844. package/src/runtime/agent-wake.ts +183 -60
  845. package/src/runtime/anchored-guardian.test.ts +156 -0
  846. package/src/runtime/anchored-guardian.ts +135 -0
  847. package/src/runtime/assistant-stream-state.ts +9 -2
  848. package/src/runtime/auth/__tests__/require-bound-guardian.test.ts +99 -0
  849. package/src/runtime/auth/require-bound-guardian.ts +21 -11
  850. package/src/runtime/channel-reply-delivery.ts +6 -3
  851. package/src/runtime/channel-verification-service.ts +24 -0
  852. package/src/runtime/guardian-decision-types.ts +3 -22
  853. package/src/runtime/guardian-vellum-migration.ts +66 -7
  854. package/src/runtime/http-server.ts +1 -15
  855. package/src/runtime/invite-redemption-service.ts +155 -6
  856. package/src/runtime/invite-service.ts +113 -62
  857. package/src/runtime/local-actor-identity.ts +76 -11
  858. package/src/runtime/local-principal-trust.ts +52 -0
  859. package/src/runtime/migrations/__tests__/vbundle-builder-fd-leak.test.ts +3 -0
  860. package/src/runtime/pending-interactions.ts +11 -1
  861. package/src/runtime/routes/__tests__/acp-routes.test.ts +1 -1
  862. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -1
  863. package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +277 -0
  864. package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +140 -0
  865. package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +26 -7
  866. package/src/runtime/routes/__tests__/consolidation-routes.test.ts +14 -10
  867. package/src/runtime/routes/__tests__/contact-routes-update-channel-relay.test.ts +164 -0
  868. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
  869. package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +1 -1
  870. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +8 -8
  871. package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +1 -1
  872. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +1 -3
  873. package/src/runtime/routes/__tests__/invite-relay-routes.test.ts +240 -0
  874. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +4 -0
  875. package/src/runtime/routes/__tests__/plugins-routes.test.ts +143 -0
  876. package/src/runtime/routes/__tests__/retrospective-routes.test.ts +1 -1
  877. package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +1 -1
  878. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +163 -0
  879. package/src/runtime/routes/acp-routes-list.test.ts +4 -0
  880. package/src/runtime/routes/acp-routes.test.ts +5 -6
  881. package/src/runtime/routes/attachment-routes.ts +21 -17
  882. package/src/runtime/routes/browser-routes.ts +19 -1
  883. package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +5 -9
  884. package/src/runtime/routes/channel-verification-routes.ts +13 -2
  885. package/src/runtime/routes/contact-routes.ts +275 -164
  886. package/src/runtime/routes/conversation-query-routes.ts +15 -5
  887. package/src/runtime/routes/conversation-routes.ts +80 -66
  888. package/src/runtime/routes/conversation-starter-routes.ts +7 -8
  889. package/src/runtime/routes/events-routes.ts +2 -2
  890. package/src/runtime/routes/guardian-approval-interception.ts +13 -274
  891. package/src/runtime/routes/host-app-control-routes.ts +5 -4
  892. package/src/runtime/routes/host-bash-routes.ts +5 -4
  893. package/src/runtime/routes/host-browser-routes.ts +9 -11
  894. package/src/runtime/routes/host-cu-routes.ts +5 -4
  895. package/src/runtime/routes/host-file-routes.ts +5 -4
  896. package/src/runtime/routes/host-transfer-routes.ts +6 -6
  897. package/src/runtime/routes/http-adapter.ts +1 -1
  898. package/src/runtime/routes/inbound-message-handler.ts +21 -16
  899. package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +376 -0
  900. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +86 -64
  901. package/src/runtime/routes/inbound-stages/admission-policy.ts +20 -5
  902. package/src/runtime/routes/inbound-stages/background-dispatch.ts +16 -4
  903. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +21 -8
  904. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +14 -3
  905. package/src/runtime/routes/llm-context-normalization.ts +71 -0
  906. package/src/runtime/routes/log-export-routes.ts +2 -2
  907. package/src/runtime/routes/mcp-auth-routes.ts +38 -15
  908. package/src/runtime/routes/memory-eval-routes.ts +92 -0
  909. package/src/runtime/routes/memory-item-routes.test.ts +12 -11
  910. package/src/runtime/routes/migration-routes.ts +51 -40
  911. package/src/runtime/routes/plugins-routes.ts +164 -8
  912. package/src/runtime/routes/schedule-routes.ts +1 -0
  913. package/src/runtime/routes/subagents-routes.ts +5 -0
  914. package/src/runtime/routes/surface-action-routes.ts +39 -51
  915. package/src/runtime/routes/usage-routes.ts +3 -0
  916. package/src/runtime/routes/work-items-routes.test.ts +1 -1
  917. package/src/runtime/slack-block-formatting.ts +46 -48
  918. package/src/runtime/trust-verdict-consumer.ts +210 -0
  919. package/src/schedule/scheduler.ts +6 -9
  920. package/src/signals/user-message.ts +16 -0
  921. package/src/subagent/manager.ts +9 -0
  922. package/src/telemetry/usage-telemetry-reporter.test.ts +1 -1
  923. package/src/tools/ask-question/ask-question-tool.test.ts +89 -52
  924. package/src/tools/ask-question/ask-question-tool.ts +27 -73
  925. package/src/tools/browser/__tests__/browser-status.test.ts +20 -0
  926. package/src/tools/browser/browser-execution.ts +16 -4
  927. package/src/tools/document/document-comment-tool.test.ts +1 -1
  928. package/src/tools/executor.ts +15 -3
  929. package/src/tools/host-terminal/host-shell.ts +28 -9
  930. package/src/tools/memory/register.test.ts +32 -0
  931. package/src/tools/skills/load.ts +43 -2
  932. package/src/tools/subagent/spawn.ts +4 -10
  933. package/src/tools/terminal/shell.ts +16 -5
  934. package/src/tools/tool-defaults.ts +2 -0
  935. package/src/tools/types.ts +18 -2
  936. package/src/tools/ui-surface/definitions.ts +0 -43
  937. package/src/util/fs-watcher-error.ts +36 -0
  938. package/src/util/log-redact.ts +2 -4
  939. package/src/util/logs-db-path.ts +22 -0
  940. package/src/util/memory-db-path.ts +23 -0
  941. package/src/util/platform.ts +5 -0
  942. package/src/watcher/providers/gmail.ts +7 -2
  943. package/src/workflows/engine-integration.test.ts +1 -1
  944. package/src/workflows/engine.test.ts +1 -1
  945. package/src/workflows/engine.ts +22 -0
  946. package/src/workflows/fanout-load.test.ts +1 -1
  947. package/src/workflows/journal-store.test.ts +1 -1
  948. package/src/workflows/leaf-runner.test.ts +40 -1
  949. package/src/workflows/leaf-runner.ts +26 -1
  950. package/src/workspace/git-service.ts +144 -29
  951. package/src/workspace/migrations/109-swap-quality-profile-to-glm-5p2.ts +121 -0
  952. package/src/workspace/migrations/110-flip-balanced-profile-to-together.ts +82 -0
  953. package/src/workspace/migrations/registry.ts +4 -0
  954. package/src/workspace/migrations/runner.ts +32 -2
  955. package/src/__tests__/access-request-decision.test.ts +0 -375
  956. package/src/__tests__/guardian-grant-minting.test.ts +0 -607
  957. package/src/__tests__/plugin-source-watcher.test.ts +0 -302
  958. package/src/api/events/turn-profile-auto-routed.ts +0 -28
  959. package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +0 -107
  960. package/src/daemon/plugin-source-watcher.ts +0 -278
  961. package/src/daemon/switch-inference-profile-tool.ts +0 -62
  962. package/src/memory/guardian-approvals.ts +0 -361
  963. package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +0 -66
  964. package/src/memory/migrations/038-actor-token-records.ts +0 -45
  965. package/src/memory/migrations/039-actor-refresh-token-records.ts +0 -57
  966. package/src/memory/migrations/103-complex-migrations.ts +0 -23
  967. package/src/memory/migrations/113-late-migrations.ts +0 -30
  968. package/src/memory/migrations/index.ts +0 -301
  969. package/src/runtime/routes/access-request-decision.ts +0 -297
  970. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +0 -963
  971. package/src/runtime/routes/channel-guardian-routes.ts +0 -19
  972. package/src/runtime/routes/guardian-expiry-sweep.ts +0 -132
@@ -0,0 +1,143 @@
1
+ import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import {
4
+ afterAll,
5
+ afterEach,
6
+ beforeEach,
7
+ describe,
8
+ expect,
9
+ mock,
10
+ test,
11
+ } from "bun:test";
12
+
13
+ const WORKSPACE_DIR = process.env.VELLUM_WORKSPACE_DIR!;
14
+ const CONFIG_PATH = join(WORKSPACE_DIR, "config.json");
15
+
16
+ function ensureTestDir(): void {
17
+ const dirs = [
18
+ WORKSPACE_DIR,
19
+ join(WORKSPACE_DIR, "data"),
20
+ join(WORKSPACE_DIR, "data", "memory"),
21
+ join(WORKSPACE_DIR, "data", "logs"),
22
+ ];
23
+ for (const dir of dirs) {
24
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
25
+ }
26
+ }
27
+
28
+ function makeLoggerStub(): Record<string, unknown> {
29
+ const stub: Record<string, unknown> = {};
30
+ for (const m of [
31
+ "info",
32
+ "warn",
33
+ "error",
34
+ "debug",
35
+ "trace",
36
+ "fatal",
37
+ "silent",
38
+ "child",
39
+ ]) {
40
+ stub[m] = m === "child" ? () => makeLoggerStub() : () => {};
41
+ }
42
+ return stub;
43
+ }
44
+
45
+ mock.module("../../util/logger.js", () => ({
46
+ getLogger: () => makeLoggerStub(),
47
+ }));
48
+
49
+ afterAll(() => {
50
+ mock.restore();
51
+ });
52
+
53
+ import { resolveCallSiteConfig } from "../llm-resolver.js";
54
+ import { invalidateConfigCache, loadConfig } from "../loader.js";
55
+
56
+ function writeConfig(obj: unknown): void {
57
+ writeFileSync(CONFIG_PATH, JSON.stringify(obj, null, 2) + "\n");
58
+ }
59
+
60
+ /**
61
+ * Base config where the active profile resolves to a DIFFERENT model than the
62
+ * `balanced` profile that the shipped `memoryV3SelectL2` call-site default
63
+ * points at. This lets each test distinguish the two failure modes:
64
+ * - call-site default applied (fixed) -> model "balanced-model"
65
+ * - silently downgraded to active -> model "active-model"
66
+ */
67
+ function baseLlm(callSites: Record<string, unknown>): unknown {
68
+ return {
69
+ llm: {
70
+ default: { provider: "anthropic", model: "default-model" },
71
+ profiles: {
72
+ balanced: { provider: "anthropic", model: "balanced-model" },
73
+ speedy: { provider: "anthropic", model: "active-model" },
74
+ },
75
+ activeProfile: "speedy",
76
+ callSites,
77
+ },
78
+ };
79
+ }
80
+
81
+ describe("config recovery prunes call-site overrides emptied by a strip", () => {
82
+ beforeEach(() => {
83
+ ensureTestDir();
84
+ if (existsSync(CONFIG_PATH)) rmSync(CONFIG_PATH, { force: true });
85
+ delete process.env.IS_PLATFORM;
86
+ invalidateConfigCache();
87
+ });
88
+
89
+ afterEach(() => {
90
+ delete process.env.IS_PLATFORM;
91
+ if (existsSync(CONFIG_PATH)) rmSync(CONFIG_PATH, { force: true });
92
+ invalidateConfigCache();
93
+ });
94
+
95
+ test("an undefined call-site profile ref falls back to the shipped default, not the active profile", () => {
96
+ // The `.profile` ref is invalid (no such profile), so schema recovery
97
+ // strips it. Before the fix this left `callSites.memoryV3SelectL2 = {}`,
98
+ // which the resolver treats as a present override and so skips the shipped
99
+ // `{profile:"balanced"}` default — silently resolving to the active profile.
100
+ writeConfig(baseLlm({ memoryV3SelectL2: { profile: "ghost-profile" } }));
101
+
102
+ const config = loadConfig();
103
+
104
+ // The emptied call-site entry must be pruned entirely, not left as `{}`.
105
+ expect(config.llm.callSites?.memoryV3SelectL2).toBeUndefined();
106
+
107
+ // Resolution now lands on the shipped call-site default (balanced), not the
108
+ // active profile ("active-model"), which is what the bug produced.
109
+ const resolved = resolveCallSiteConfig("memoryV3SelectL2", config.llm);
110
+ expect(resolved.model).toBe("balanced-model");
111
+ });
112
+
113
+ test("a valid sibling call-site override survives while the invalid one is pruned", () => {
114
+ // memoryRouter -> balanced is valid and must be preserved; only the invalid
115
+ // memoryV3SelectL2 entry is pruned. Guards against over-pruning the parent.
116
+ writeConfig(
117
+ baseLlm({
118
+ memoryV3SelectL2: { profile: "missing" },
119
+ memoryRouter: { profile: "balanced" },
120
+ }),
121
+ );
122
+
123
+ const config = loadConfig();
124
+
125
+ expect(config.llm.callSites?.memoryV3SelectL2).toBeUndefined();
126
+ expect(config.llm.callSites?.memoryRouter).toEqual({ profile: "balanced" });
127
+ });
128
+
129
+ test("a partial override keeping other fields is not pruned", () => {
130
+ // Stripping the invalid `.profile` leaves a non-empty `{temperature:0.5}`,
131
+ // a legitimate user override the resolver should keep (and which therefore
132
+ // still shadows the shipped default per existing either/or semantics).
133
+ writeConfig(
134
+ baseLlm({ memoryV3SelectL2: { profile: "missing", temperature: 0.5 } }),
135
+ );
136
+
137
+ const config = loadConfig();
138
+
139
+ expect(config.llm.callSites?.memoryV3SelectL2).toEqual({
140
+ temperature: 0.5,
141
+ });
142
+ });
143
+ });
@@ -181,7 +181,7 @@ describe("reconcileFlagGatedProfiles", () => {
181
181
  expect(after.llm.profiles["os-beta"]).toBeUndefined();
182
182
  expect(after.llm.profileOrder.includes("os-beta")).toBe(false);
183
183
  expect(after.llm.activeProfile).toBe("balanced");
184
- expect(after.llm.advisorProfile).toBe("quality-optimized");
184
+ expect(after.llm.advisorProfile).toBe("frontier");
185
185
  });
186
186
 
187
187
  test("flag off with no os-beta present is a no-op", () => {
@@ -262,7 +262,7 @@ describe("reconcileFlagGatedProfiles", () => {
262
262
  expect(after.llm.profileOrder.includes("os-beta")).toBe(false);
263
263
  expect(after.llm.profileOrder.includes("experiment")).toBe(false);
264
264
  expect(after.llm.activeProfile).toBe("balanced");
265
- expect(after.llm.advisorProfile).toBe("quality-optimized");
265
+ expect(after.llm.advisorProfile).toBe("frontier");
266
266
  expect(
267
267
  (
268
268
  after.llm as unknown as Record<
@@ -86,7 +86,7 @@ Every app works phone (~360px) to desktop (~1400px+). The `<turn_context>` block
86
86
 
87
87
  Full detail when reachable: `{baseDir}/references/RESPONSIVE.md`.
88
88
 
89
- A design-system CSS and widget library are **auto-injected** (inside a `@layer`, so your own styles always win). Use the `--v-*` variables and `.v-*` classes below — they switch light/dark automatically, no manual dark-mode CSS needed. **Always use `window.vellum.widgets.*` chart functions** instead of hand-coded SVG/CSS charts.
89
+ A design-system CSS and CSS widget library are **auto-injected** (inside a `@layer`, so your own styles always win). Use the `--v-*` variables and `.v-*` classes below — they switch light/dark automatically, no manual dark-mode CSS needed. For charts, bundle `chart.js` (an allowed package), or hand-write inline SVG / CSS bars for tiny sparklines — sized to the container so they can't overflow.
90
90
 
91
91
  **Design tokens** (use these, don't invent hex values):
92
92
 
@@ -106,7 +106,7 @@ A design-system CSS and widget library are **auto-injected** (inside a `@layer`,
106
106
 
107
107
  **Utility classes:** `.v-button` (`.secondary`/`.danger`/`.ghost`), `.v-card`, `.v-list`/`.v-list-item`, `.v-badge` (`.success`/`.warning`/`.danger`), `.v-input-row`, `.v-empty-state`, `.v-toggle`.
108
108
 
109
- **Theme in JS:** `window.vellum.theme.mode` (`'light'`/`'dark'`); listen on `window.addEventListener("vellum-theme-change", e => e.detail.mode)`.
109
+ **Theme:** the `--v-*` tokens switch light/dark on their own. For custom (non-token) colors that must follow the theme, use `@media (prefers-color-scheme: dark)` in CSS.
110
110
 
111
111
  For a **custom branded look**, write complete CSS with hardcoded colors + `@media (prefers-color-scheme: dark)` — don't mix `--v-*` auto-switching vars with hardcoded colors in the same element.
112
112
 
@@ -118,27 +118,9 @@ Full detail when reachable: `{baseDir}/references/DESIGN_SYSTEM.md`. Note: in lo
118
118
 
119
119
  CSS classes for standard patterns: `.v-metric-card`/`.v-metric-grid` (big-number stats), `.v-data-table` (sortable, sticky header, `th[data-sortable]`), `.v-tabs`, `.v-accordion`, `.v-search-bar`, `.v-timeline`, `.v-action-list` (rows with per-item actions), `.v-card-grid`, `.v-progress-bar`, `.v-status-badge` (`.success`/`.error`/`.warning`/`.info`), `.v-stat-row`/`.v-stat`, `.v-tag-group`, `.v-avatar-row`. Landing-page components: `.v-hero`/`.v-hero-badge`/`.v-hero-subtitle`, `.v-section-header`/`.v-section-label`, `.v-feature-grid`/`.v-feature-card`, `.v-pullquote`, `.v-comparison` (`.before`/`.after`), `.v-page`, `.v-gradient-text`, `.v-animate-in`. Domain widgets: `.v-weather-card`, `.v-stock-ticker`, `.v-receipt`, `.v-invoice`, `.v-itinerary`, `.v-boarding-pass`.
120
120
 
121
- JS utilities at `window.vellum.widgets.*`:
122
-
123
- ```javascript
124
- // Charts — ALWAYS use these, never hand-code SVG/CSS charts (they handle bounds, scaling, dark mode)
125
- vellum.widgets.sparkline("el-id", [10,25,15,30], { width:200, height:40, color:"var(--v-success)", fill:true });
126
- vellum.widgets.barChart("el-id", [{label:"Jan",value:120},{label:"Feb",value:180,color:"var(--v-success)"}], { width:400, height:200, showValues:true, horizontal:false });
127
- vellum.widgets.lineChart("el-id", [{label:"Mon",value:42},{label:"Tue",value:58}], { width:400, height:200, showDots:true, showGrid:true });
128
- vellum.widgets.progressRing("el-id", 75, { size:100, strokeWidth:8, color:"var(--v-success)", label:"75%" });
129
- // Formatting
130
- vellum.widgets.formatCurrency(1234.56, "USD"); // "$1,234.56"
131
- vellum.widgets.formatDate("2025-01-15", "relative"); // "3d ago" ("short" → "1/15/25")
132
- vellum.widgets.formatNumber(1234567, { compact:true }); // "1.2M"
133
- // Behaviors
134
- vellum.widgets.sortTable("table-id"); // wire th[data-sortable]
135
- vellum.widgets.filterTable("table-id", "input-id"); // live text search
136
- vellum.widgets.tabs("tabs-id"); vellum.widgets.accordion("acc-id", { allowMultiple:true });
137
- vellum.widgets.toast("Saved!", "success", 4000); // success | error | warning | info
138
- vellum.widgets.countdown("el", "2025-12-31T00:00:00Z", { onComplete:()=>{} });
139
- ```
121
+ Interactive behavior is your own JS: charts the bundleable `chart.js` (or inline SVG for tiny sparklines); formatting → `Intl.NumberFormat` / `Intl.DateTimeFormat`; table sort/filter, tabs, accordions, toasts, countdowns → plain JS wired to the `.v-*` markup.
140
122
 
141
- Use custom HTML for novel/creative UIs (games, art tools); widgets for standard patterns; mix freely. Full list: `{baseDir}/references/WIDGETS.md`.
123
+ Use custom HTML for novel/creative UIs (games, art tools); the `.v-*` classes for standard patterns; mix freely. Full list: `{baseDir}/references/WIDGETS.md`.
142
124
 
143
125
  ---
144
126
 
@@ -270,7 +252,7 @@ The point of these apps is to put **the user's own data and the assistant's capa
270
252
  ```tsx
271
253
  async function loadRecords() {
272
254
  const res = await window.vellum.fetch("/v1/x/my-route");
273
- if (!res.ok) { window.vellum.widgets.toast("Couldn't load", "error"); return []; }
255
+ if (!res.ok) { notifyError("Couldn't load"); return []; } // your own toast/inline error
274
256
  return res.json();
275
257
  }
276
258
  ```
@@ -282,7 +264,7 @@ useEffect(() => {
282
264
  window.vellum.fetch("/v1/x/items")
283
265
  .then(res => res.ok ? res.json() : Promise.reject(res.status))
284
266
  .then(setItems)
285
- .catch(() => window.vellum.widgets.toast("Couldn't load", "error"));
267
+ .catch(() => notifyError("Couldn't load")); // your own toast/inline error
286
268
  }, []);
287
269
  ```
288
270
 
@@ -307,25 +289,25 @@ export async function POST(req: Request): Promise<Response> {
307
289
 
308
290
  The optional `context` arg exposes daemon singletons — e.g. `context.assistantEventHub.publish({...})` to push real-time events to connected clients (UI updates, navigation, notifications). It's immutable. Full guide + copyable examples (Focus Timer, Habit Tracker, Expense Tracker): `{baseDir}/references/CUSTOM_ROUTES.md`, `{baseDir}/references/examples/`.
309
291
 
310
- **Persistence options:** `localStorage` for ephemeral UI state (filters, view modes, drafts); custom routes for persistent records and server-side logic. (`window.vellum.data.*` is deprecated — only for editing pre-existing legacy apps.)
292
+ **Persistence options:** `localStorage` for ephemeral UI state (filters, view modes, drafts); custom routes for persistent records and server-side logic.
311
293
 
312
294
  ---
313
295
 
314
296
  ## Interaction standards
315
297
 
316
- - **Feedback for every action** — `vellum.widgets.toast()` after creates, deletes, updates, errors.
317
- - **Confirm destructive actions** — `window.vellum.confirm(title, message)` (returns `Promise<boolean>`) before deleting or resetting.
298
+ - **Feedback for every action** — a toast or inline confirmation after creates, deletes, updates, errors. Build your own (e.g. toggle the `.v-toast` class with JS).
299
+ - **Confirm destructive actions** — render your own confirmation (an inline "Are you sure?" or a modal) before deleting or resetting.
318
300
  - **Validate forms** before submit, show errors inline, disable submit during async.
319
301
  - **Loading states** — skeleton or spinner, never a blank screen.
320
302
  - **Designed empty states** — `.v-empty-state` when there's no data.
321
303
 
322
304
  ### Keep the assistant aware
323
305
 
324
- Wire `window.vellum.sendAction()` during the build so the assistant sees meaningful interactions. **Reactive** hooks trigger a response (form submissions, selections worth explaining); **silent** hooks (`state_update`) accumulate context without interrupting (tab changes, filter changes). Examples in `{baseDir}/references/INTERACTION_HOOKS.md`.
306
+ Wire `window.vellum.sendAction()` during the build so the app can pull the assistant in. The host handles two actions: **`relay_prompt`** (`{ prompt, conversation }`) sends a message to the assistant as if the user typed it — the way to get an explanation, summary, or follow-up from inside the app (`conversation: "new"` starts a fresh chat instead of the open one); **`set_view`** (`{ view }`) arranges the app and chat (`"split"` / `"full"` / `"chat"`). These two are the whole app→host surface — relay anything you want the assistant to act on as a self-contained prompt. Patterns in `{baseDir}/references/INTERACTION_HOOKS.md`.
325
307
 
326
- ### Actionable UI & links
308
+ ### Actionable UI
327
309
 
328
- For triage/bulk-action UIs: render a `dynamic_page` with selectable items + action buttons → user selects and clicks → UI sends `surfaceAction` with action ID + selected IDs execute tools, `ui_update`, toast. Use `window.vellum.confirm()` for destructive actions. Make items clickable with `vellum.openLink(url, metadata)` (include `metadata.provider` and `metadata.type`).
310
+ For triage/bulk-action UIs: render selectable items + action buttons → the user selects and clicks → relay the choice as a prompt with `window.vellum.sendAction("relay_prompt", { prompt: ... })`, listing the selected items in the text, so the assistant can run the tools and report back. Render your own confirmation for destructive actions.
329
311
 
330
312
  ---
331
313
 
@@ -348,9 +330,9 @@ Slide decks are a different domain — skip app patterns (contextual headers, se
348
330
  Read with `file_read` using the `{baseDir}/references/...` paths (`{baseDir}` resolves to this skill's directory):
349
331
 
350
332
  - `RESPONSIVE.md` — mobile vs desktop, universal baseline, safe areas
351
- - `DESIGN_SYSTEM.md` — token table, utility classes, theme detection
352
- - `WIDGETS.md` — widget classes, chart utilities, formatting helpers
333
+ - `DESIGN_SYSTEM.md` — token table, utility classes, theme/dark mode
334
+ - `WIDGETS.md` — CSS widget classes (no JS chart/format runtime)
353
335
  - `CUSTOM_ROUTES.md` — server-side persistence and custom API routes
354
336
  - `examples/` — complete copyable example apps
355
- - `INTERACTION_HOOKS.md` — sendAction patterns, reactive vs silent
337
+ - `INTERACTION_HOOKS.md` — relay_prompt / set_view app→host actions
356
338
  - `SLIDES.md` — presentation slide design
@@ -38,11 +38,6 @@ When the user wants a specific branded look, write complete CSS with hardcoded c
38
38
 
39
39
  ---
40
40
 
41
- ## Theme detection in JavaScript
42
-
43
- ```javascript
44
- console.log(window.vellum.theme.mode); // 'light' or 'dark'
45
- window.addEventListener("vellum-theme-change", (e) => {
46
- console.log("Theme:", e.detail.mode);
47
- });
48
- ```
41
+ ## Theme and dark mode
42
+
43
+ The `--v-*` tokens switch between light and dark automatically, so token-based UI needs no dark-mode code. For custom (non-token) colors that must follow the theme, use `@media (prefers-color-scheme: dark)` in CSS.
@@ -1,56 +1,83 @@
1
1
  # App Interaction Hooks
2
2
 
3
- When building apps, proactively wire `sendAction` hooks so the assistant stays aware of meaningful user interactions. Two patterns are available:
3
+ A sandboxed app drives the assistant and its own on-screen layout through
4
+ `window.vellum.sendAction(actionId, data)`. When the app is open inside a
5
+ conversation — the chat panel, split view, or mobile app overlay, the surface
6
+ this skill builds for — the host acts on exactly two actions: `relay_prompt`
7
+ and `set_view`. Wire them during the build so the app can pull the assistant in
8
+ and arrange itself.
4
9
 
5
- ## Reactive hooks
10
+ Both actions are about the app↔conversation relationship, so an app opened
11
+ standalone — from the Library, with no chat beside it — has nothing listening,
12
+ and `sendAction` there no-ops. Treat them as enhancements: every feature must
13
+ still work when the call is ignored.
6
14
 
7
- Reactive hooks trigger an assistant response. Use them for moments where the assistant's input adds value - selections that need explanation, completions worth celebrating, or submissions that benefit from feedback.
15
+ ## `relay_prompt` send a message to the assistant
8
16
 
9
- ```javascript
10
- // User selects a city on a map assistant can provide insights
11
- window.vellum.sendAction("city_selected", { city: "Tokyo" });
17
+ Sends `prompt` into the conversation as if the user typed it; the assistant
18
+ then responds in chat. This is the channel for involving the assistant from an
19
+ app, so phrase the intent as natural language.
12
20
 
13
- // User submits a form — assistant can confirm and suggest next steps
14
- window.vellum.sendAction("form_submitted", {
15
- formId: "signup",
16
- email: "user@example.com",
21
+ ```javascript
22
+ // A button in a dashboard: "Explain this anomaly"
23
+ window.vellum.sendAction("relay_prompt", {
24
+ prompt: "Revenue dropped 40% on the 14th — what happened?",
17
25
  });
18
26
 
19
- // User completes a level assistant can congratulate and hint at what's next
20
- window.vellum.sendAction("level_complete", { level: 5, score: 2400 });
27
+ // Start a fresh conversation instead of using the open one
28
+ window.vellum.sendAction("relay_prompt", {
29
+ prompt: "Draft a follow-up email to this customer.",
30
+ conversation: "new", // "active" (default) | "new"
31
+ });
21
32
  ```
22
33
 
23
- ## Silent hooks
34
+ - **`prompt`** (required) — the message text. Empty or missing → ignored.
35
+ - **`conversation`** — `"active"` (default: the open conversation) or
36
+ `"new"` (a fresh draft). With `"active"` and nothing open, it's a no-op.
37
+ - **The layout is left exactly as-is.** Relaying never opens, closes, or
38
+ resizes the app — if the user has chat and app side by side, it stays that
39
+ way. Each relay is delivered even when the same text is sent repeatedly.
24
40
 
25
- Silent hooks accumulate state without interrupting the user. The state is automatically included as context when the next reactive hook fires.
41
+ The assistant can't see the app's internal state, so make every prompt
42
+ **self-contained**: include the numbers, selection, or row the user is acting
43
+ on. "Summarize these" won't work; "Summarize these 3 expenses: $42 lunch,
44
+ $118 hotel, $30 taxi" will.
26
45
 
27
- ```javascript
28
- // User navigates to a new tab no response needed, but assistant should know
29
- window.vellum.sendAction("state_update", {
30
- currentView: "forecast",
31
- city: "Tokyo",
32
- });
46
+ Good triggers: "explain this chart," "what should I focus on," "turn these
47
+ into tasks," "compare the two selected plans." Wire them on the buttons and
48
+ selections where the assistant's help is the actual point.
33
49
 
34
- // Score changes during gameplay — track silently
35
- window.vellum.sendAction("state_update", { score: 1250, lives: 2 });
50
+ ### Triage / bulk-action UIs
36
51
 
37
- // User applies a filter context for future questions
38
- window.vellum.sendAction("state_update", {
39
- filter: "last-30-days",
40
- sortBy: "revenue",
41
- });
52
+ Render selectable items + an action button, then relay the user's choice as a
53
+ prompt the assistant can act on:
54
+
55
+ ```javascript
56
+ function runBulkAction(selected) {
57
+ const list = selected.map((s) => `- ${s.title} (${s.id})`).join("\n");
58
+ window.vellum.sendAction("relay_prompt", {
59
+ prompt: `Archive these ${selected.length} items:\n${list}`,
60
+ });
61
+ }
42
62
  ```
43
63
 
44
- ## When to use reactive vs silent
64
+ ## `set_view` arrange the app and chat
65
+
66
+ Moves the app panel. Independent of `relay_prompt`; use it only when the app
67
+ itself should change the layout.
45
68
 
46
- Choose based on whether the assistant's response would genuinely help the user at that moment:
69
+ ```javascript
70
+ window.vellum.sendAction("set_view", { view: "split" }); // app + chat side by side
71
+ window.vellum.sendAction("set_view", { view: "full" }); // app full-width
72
+ window.vellum.sendAction("set_view", { view: "chat" }); // close app, back to chat
73
+ ```
47
74
 
48
- | App type | Silent (state accumulation) | Reactive (triggers response) |
49
- | ------------------- | ---------------------------------------------------- | ---------------------------------------------------------- |
50
- | **Dashboards** | Tab navigation, filter changes, date range selection | Anomaly detected, threshold breached, data export complete |
51
- | **Games** | Score updates, move tracking, timer ticks | Level complete, achievement unlocked, game over |
52
- | **Forms & wizards** | Field focus, partial input, step navigation | Form submitted, validation failed on submit |
53
- | **Trackers** | Incremental progress, status toggles, reordering | Milestone reached, streak achieved, all items complete |
54
- | **Data explorers** | Sorting, paging, column toggling | Row selected for detail, comparison initiated |
75
+ - **`"split"`** side by side with the conversation. Desktop only; ignored on
76
+ mobile, which has no side-by-side layout.
77
+ - **`"full"`** the app takes the full width.
78
+ - **`"chat"`** closes the app and returns to the conversation.
55
79
 
56
- Wire hooks during the initial build - don't wait for the user to ask. Apps that communicate state back to the assistant feel alive; apps that don't feel like static pages.
80
+ Most apps never need this the user controls the layout from the app's nav
81
+ bar. Reach for it only when an in-app action implies a layout change (e.g. a
82
+ "Discuss with assistant" button that opens `split` so the reply lands beside
83
+ the app).
@@ -40,7 +40,7 @@ The conversation context's `<turn_context>` block carries an `interface:` field.
40
40
 
41
41
  - Use fluid widths only. No fixed-pixel layouts. Prefer `%`, `fr`, `minmax`, `clamp()` over `px` on container widths.
42
42
  - At narrow widths, collapse tables into stacked cards with labels and values arranged vertically.
43
- - Size `vellum.widgets.*` chart containers in `vw` / `%`, not fixed `px`.
43
+ - Size chart containers (`chart.js` canvas or inline SVG) in `vw` / `%`, not fixed `px`.
44
44
 
45
45
  ---
46
46
 
@@ -1,6 +1,6 @@
1
1
  # Widget Component Library
2
2
 
3
- A CSS/JS widget library is auto-injected alongside the design system. Use these for standard UI patterns - skip them when custom HTML serves the user better.
3
+ A CSS widget library is auto-injected alongside the design system — the `.v-*` classes below. Use these for standard UI patterns; skip them when custom HTML serves the user better. The classes are styling only; wire any interactive behavior with your own JS (see below).
4
4
 
5
5
  ## Layout widgets
6
6
 
@@ -18,7 +18,7 @@ A CSS/JS widget library is auto-injected alongside the design system. Use these
18
18
  | `.v-progress-bar` / `.v-progress-track` / `.v-progress-fill` | Horizontal progress |
19
19
  | `.v-status-badge` | Colored pill with dot (`.success`/`.error`/`.warning`/`.info`) |
20
20
  | `.v-stat-row` / `.v-stat` | Horizontal label-value pairs |
21
- | `.v-toast` | Notification banner - prefer `vellum.widgets.toast()` |
21
+ | `.v-toast` | Notification banner (show/hide with your own JS) |
22
22
  | `.v-avatar-row` | Contact/team display |
23
23
  | `.v-tag-group` | Wrapping tag row |
24
24
 
@@ -48,78 +48,20 @@ A CSS/JS widget library is auto-injected alongside the design system. Use these
48
48
  | `.v-gradient-text` | Accent-colored gradient text |
49
49
  | `.v-animate-in` | Staggered fade-in for children |
50
50
 
51
- ## Widget JavaScript utilities
51
+ ## Interactive behavior — your own JS
52
52
 
53
- Interactive utilities at `window.vellum.widgets.*`:
53
+ The `.v-*` classes are styling only. Wire behavior with standard web tools:
54
54
 
55
- ### Charts
55
+ - **Charts** → the bundleable `chart.js`, or hand-written inline SVG / CSS bars for tiny sparklines, sized to the container to avoid overflow.
56
+ - **Notifications** → toggle the `.v-toast` class with your own JS.
57
+ - **Table sort/filter, tabs, accordions, countdowns** → plain JS event handlers.
58
+ - **Formatting** → `Intl.NumberFormat` / `Intl.DateTimeFormat`.
59
+ - **Theme** → `@media (prefers-color-scheme: dark)` in CSS.
56
60
 
57
- Always use these instead of hand-coding SVG/CSS charts:
61
+ The complete in-app JS API is `window.vellum.sendAction`, `window.vellum.fetch`, and `window.vellum.route` (see [`INTERACTION_HOOKS.md`](./INTERACTION_HOOKS.md)).
58
62
 
59
- ```javascript
60
- vellum.widgets.sparkline("container-id", [10, 25, 15, 30], {
61
- width: 200,
62
- height: 40,
63
- color: "var(--v-success)",
64
- strokeWidth: 2,
65
- fill: true,
66
- });
67
- vellum.widgets.barChart(
68
- "container-id",
69
- [
70
- { label: "Jan", value: 120 },
71
- { label: "Feb", value: 180, color: "var(--v-success)" },
72
- ],
73
- {
74
- width: 400,
75
- height: 200,
76
- showLabels: true,
77
- showValues: true,
78
- horizontal: false,
79
- },
80
- );
81
- vellum.widgets.lineChart(
82
- "container-id",
83
- [
84
- { label: "Mon", value: 42 },
85
- { label: "Tue", value: 58 },
86
- ],
87
- { width: 400, height: 200, showDots: true, showGrid: true, gridLines: 4 },
88
- );
89
- vellum.widgets.progressRing("container-id", 75, {
90
- size: 100,
91
- strokeWidth: 8,
92
- color: "var(--v-success)",
93
- label: "75%",
94
- });
95
- ```
63
+ ## When to use the CSS widgets vs custom HTML
96
64
 
97
- ### Data Formatting
98
-
99
- ```javascript
100
- vellum.widgets.formatCurrency(1234.56, "USD"); // "$1,234.56"
101
- vellum.widgets.formatDate("2025-01-15", "relative"); // "3d ago"
102
- vellum.widgets.formatDate("2025-01-15", "short"); // "1/15/25"
103
- vellum.widgets.formatNumber(1234567, { compact: true }); // "1.2M"
104
- ```
105
-
106
- ### Interactive Behaviors
107
-
108
- ```javascript
109
- vellum.widgets.sortTable("table-id"); // Wire th[data-sortable] click-to-sort
110
- vellum.widgets.filterTable("table-id", "input-id"); // Live text search
111
- vellum.widgets.tabs("tabs-id"); // Tab switching + keyboard nav
112
- vellum.widgets.accordion("accordion-id", { allowMultiple: true });
113
- vellum.widgets.multiSelect("table-id"); // Checkboxes + select-all
114
- vellum.widgets.toast("Saved!", "success", 4000); // Auto-dismiss notification
115
- vellum.widgets.countdown("timer-el", "2025-12-31T00:00:00Z", {
116
- onComplete: () => {},
117
- });
118
- ```
119
-
120
- ## When to use widgets vs custom HTML
121
-
122
- - **Use widgets** for standard patterns - tables, metrics, timelines, notifications
123
- - **Use custom HTML** for novel or creative UIs - games, art tools, unique dashboards
124
- - **Mix freely** - widgets compose well together and with custom elements
125
- - **ALWAYS use `vellum.widgets.*` chart functions** instead of hand-coding SVG/CSS charts. They handle overflow clipping, bounds, scaling, and dark mode. Hand-coded charts break layouts.
65
+ - **Use the CSS widget classes** for standard patterns — tables, metrics, timelines, notifications.
66
+ - **Use custom HTML** for novel or creative UIs — games, art tools, unique dashboards.
67
+ - **Mix freely** — the classes compose well together and with custom elements.
@@ -12,6 +12,5 @@ the `frontend-design` skill).
12
12
  | [Habit Tracker](./habit-tracker.md) | Full CRUD addressed by `id` query param | `GET`, `POST`, `PATCH`, `DELETE` |
13
13
  | [Expense Tracker](./expense-tracker.md) | Create / read / delete + client-side aggregation | `GET`, `POST`, `DELETE` |
14
14
 
15
- All three persist through a `routes/*.ts` handler — never through `window.vellum.data`, which
16
- is a desktop-only bridge that silently no-ops on web. See
15
+ All three persist through a `routes/*.ts` handler. See
17
16
  [CUSTOM_ROUTES.md](../CUSTOM_ROUTES.md) for the full route handler reference.
@@ -218,16 +218,14 @@ Use this when the guardian wants to authorize a specific phone number to call th
218
218
  **Important**: The response includes a `voiceCode` field that is only returned at creation time and cannot be retrieved later. Extract and present it clearly.
219
219
 
220
220
  ```bash
221
- assistant contacts invites create --source-channel phone --contact-id "<contact_id>" --expected-external-user-id "<phone_E164>" --friend-name "<invitee_name>" --guardian-name "<guardian_name>" --max-uses 1 --note "<optional note, e.g. the person it is for>" --json
221
+ assistant contacts invites create --source-channel phone --contact-id "<contact_id>" --expected-external-user-id "<phone_E164>" --max-uses 1 --note "<optional note, e.g. the person it is for>" --json
222
222
  ```
223
223
 
224
224
  Required flags:
225
225
 
226
226
  - `--source-channel` -- must be `phone`
227
- - `--contact-id` -- the ID of the contact this invite is for. Look up the contact first with `assistant contacts list`. New contacts must be added via the Contacts tab in the assistant web UI; you cannot create them here.
227
+ - `--contact-id` -- the ID of the contact this invite is for. Look up the contact first with `assistant contacts list`. New contacts must be added via the Contacts tab in the assistant web UI; you cannot create them here. The contact's `displayName` is used to personalize the voice greeting; the guardian label is resolved at runtime.
228
228
  - `--expected-external-user-id` -- the invitee's phone number in E.164 format (e.g., `+15551234567`)
229
- - `--friend-name` -- the invitee's display name (e.g., "Mom", "Dr. Smith"). Used during the voice verification call to personalize the experience.
230
- - `--guardian-name` -- the guardian's display name (e.g., "Alex"). Used during the voice verification call so the invitee knows who invited them.
231
229
 
232
230
  Optional flags:
233
231
 
@@ -235,10 +233,9 @@ Optional flags:
235
233
  - `--expires-in-ms` -- expiration time in milliseconds from now (e.g., `86400000` for 24 hours). Defaults to 7 days if omitted.
236
234
  - `--note` -- a human-readable label for the invite (e.g., "For Mom", "Dr. Smith")
237
235
 
238
- The create response contains `{ ok: true, invite: { id, voiceCode, expectedExternalUserId, friendName, guardianName, ... } }`.
236
+ The create response contains `{ ok: true, invite: { id, voiceCode, expectedExternalUserId, ... } }`.
239
237
 
240
238
  - `voiceCode` is the numeric code the invitee must enter and is only returned at creation time.
241
- - `friendName` and `guardianName` are echoed back in the response.
242
239
  - Voice invite responses do **not** include `token` or `share.url`. Do not try to build or send a deep link for voice invites.
243
240
 
244
241
  **Presenting to the guardian**: Give the guardian clear instructions to relay to the invitee:
@@ -264,7 +261,7 @@ If the user provides a phone number without the `+` country code prefix, ask the
264
261
  Use this when the guardian wants to invite someone to message the assistant via email. Email invites use a 6-digit code - the invitee sends the code to the assistant's email address to redeem access.
265
262
 
266
263
  ```bash
267
- assistant contacts invites create --source-channel email --contact-id "<contact_id>" --contact-name "<invitee_name>" --max-uses 1 --note "<optional note, e.g. the person it is for>" --json
264
+ assistant contacts invites create --source-channel email --contact-id "<contact_id>" --max-uses 1 --note "<optional note, e.g. the person it is for>" --json
268
265
  ```
269
266
 
270
267
  Required flags:
@@ -295,7 +292,7 @@ If the assistant's email address is not available, tell the guardian they need t
295
292
  Use this when the guardian wants to invite someone to message the assistant on WhatsApp. WhatsApp invites use a 6-digit code - the invitee sends the code to the assistant's WhatsApp number to redeem access.
296
293
 
297
294
  ```bash
298
- assistant contacts invites create --source-channel whatsapp --contact-id "<contact_id>" --contact-name "<invitee_name>" --max-uses 1 --note "<optional note, e.g. the person it is for>" --json
295
+ assistant contacts invites create --source-channel whatsapp --contact-id "<contact_id>" --max-uses 1 --note "<optional note, e.g. the person it is for>" --json
299
296
  ```
300
297
 
301
298
  Required flags:
@@ -328,7 +325,7 @@ If the assistant's WhatsApp integration is not configured at all (Meta WhatsApp
328
325
  Use this when the guardian wants to invite someone to message the assistant on Slack. Slack invites use a 6-digit code -- the invitee sends the code as a direct message to the assistant's Slack bot to redeem access.
329
326
 
330
327
  ```bash
331
- assistant contacts invites create --source-channel slack --contact-id "<contact_id>" --contact-name "<invitee_name>" --max-uses 1 --note "<optional note, e.g. the person it is for>" --json
328
+ assistant contacts invites create --source-channel slack --contact-id "<contact_id>" --max-uses 1 --note "<optional note, e.g. the person it is for>" --json
332
329
  ```
333
330
 
334
331
  Required flags:
@@ -451,8 +448,6 @@ Each channel has:
451
448
  - `contactId is required for create` -- when creating an invite, always pass `--contact-id`. Look up or create the contact first.
452
449
  - `expectedExternalUserId is required for voice invites` -- voice invites must include the invitee's phone number via `--expected-external-user-id`.
453
450
  - `expectedExternalUserId must be in E.164 format` -- the phone number must start with `+` followed by country code and number (e.g., `+15551234567`).
454
- - `friendName is required for voice invites` -- voice invites must include the invitee's display name via `--friend-name`.
455
- - `guardianName is required for voice invites` -- voice invites must include the guardian's display name via `--guardian-name`.
456
451
  - `Invite not found or already revoked` -- the invite ID may be invalid or the invite is already revoked.
457
452
 
458
453
  ## Tips
@@ -485,7 +480,7 @@ Each channel has:
485
480
 
486
481
  **"Revoke invite"** / **"Cancel invite link"** -- List invites to identify the target, confirm, then revoke with `assistant contacts invites revoke <invite_id> --json`.
487
482
 
488
- **"Create a voice invite for +15551234567"** -- Look up or create the contact first, then create a voice invite with `assistant contacts invites create --source-channel phone --contact-id <contact_id> --expected-external-user-id "+15551234567" --friend-name "<name>" --guardian-name "<name>"`. Present the invite code and instructions: the person must call from that number and enter the code.
483
+ **"Create a voice invite for +15551234567"** -- Look up or create the contact first, then create a voice invite with `assistant contacts invites create --source-channel phone --contact-id <contact_id> --expected-external-user-id "+15551234567"`. Present the invite code and instructions: the person must call from that number and enter the code. The caller's name and the guardian's name resolve from the bound contact and the runtime guardian — no name flags needed.
489
484
 
490
485
  **"Let my mom call in"** / **"Invite someone by phone"** -- Ask for the phone number in E.164 format, look up or create the contact first, then create a voice invite with `assistant contacts invites create --source-channel phone --contact-id <contact_id>`, and present the code + calling instructions.
491
486
 
@@ -137,5 +137,8 @@ export async function getProviderConnection(
137
137
  ): Promise<OAuthConnection | undefined> {
138
138
  if (provider.resolveConnection) return provider.resolveConnection(account);
139
139
  if (await provider.isConnected?.()) return undefined;
140
- return resolveOAuthConnection(provider.credentialService, { account });
140
+ return resolveOAuthConnection(provider.credentialService, {
141
+ account,
142
+ requiredScopes: provider.requiredScopes,
143
+ });
141
144
  }