@vellumai/assistant 0.8.10 → 0.8.11-staging.1

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 (400) hide show
  1. package/bun.lock +62 -1
  2. package/docs/workspace-tools.md +196 -0
  3. package/examples/plugins/echo/README.md +3 -3
  4. package/knip.json +1 -0
  5. package/openapi.yaml +460 -128
  6. package/package.json +2 -1
  7. package/scripts/build-plugin-api.ts +299 -0
  8. package/src/__tests__/agent-loop-callsite-precedence.test.ts +7 -0
  9. package/src/__tests__/agent-loop-compaction-events.test.ts +197 -0
  10. package/src/__tests__/agent-loop-exit-reason.test.ts +93 -96
  11. package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +2 -0
  12. package/src/__tests__/agent-loop-output-hooks.test.ts +274 -1
  13. package/src/__tests__/agent-loop-override-profile.test.ts +3 -0
  14. package/src/__tests__/agent-loop-provider-error-recording.test.ts +4 -0
  15. package/src/__tests__/agent-loop-thinking.test.ts +4 -0
  16. package/src/__tests__/agent-loop.test.ts +578 -5
  17. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +0 -1
  18. package/src/__tests__/approval-cascade.test.ts +1 -0
  19. package/src/__tests__/background-workers-disk-pressure.test.ts +0 -2
  20. package/src/__tests__/btw-routes.test.ts +0 -1
  21. package/src/__tests__/build-persisted-content.test.ts +75 -1
  22. package/src/__tests__/catalog-install-normalize.test.ts +141 -0
  23. package/src/__tests__/ces-startup-timeout.test.ts +60 -0
  24. package/src/__tests__/compaction-events.test.ts +1 -0
  25. package/src/__tests__/config-managed-gemini-defaults.test.ts +2 -46
  26. package/src/__tests__/context-overflow-reducer.test.ts +264 -124
  27. package/src/__tests__/context-window-manager-overflow-rung.test.ts +351 -0
  28. package/src/__tests__/conversation-abort-tool-results.test.ts +1 -1
  29. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +13 -5
  30. package/src/__tests__/conversation-agent-loop-overflow.test.ts +284 -455
  31. package/src/__tests__/conversation-agent-loop.test.ts +131 -551
  32. package/src/__tests__/conversation-app-control-instantiation.test.ts +13 -0
  33. package/src/__tests__/conversation-confirmation-signals.test.ts +1 -0
  34. package/src/__tests__/conversation-fork-crud.test.ts +259 -0
  35. package/src/__tests__/conversation-history-web-search.test.ts +1 -1
  36. package/src/__tests__/conversation-lifecycle.test.ts +257 -1
  37. package/src/__tests__/conversation-process-callsite.test.ts +1 -0
  38. package/src/__tests__/conversation-provider-retry-repair.test.ts +38 -377
  39. package/src/__tests__/conversation-queue.test.ts +1 -39
  40. package/src/__tests__/conversation-runtime-assembly.test.ts +119 -8
  41. package/src/__tests__/conversation-skill-tools.test.ts +491 -5
  42. package/src/__tests__/conversation-slash-queue.test.ts +1 -1
  43. package/src/__tests__/conversation-slash-unknown.test.ts +1 -0
  44. package/src/__tests__/conversation-speed-override.test.ts +1 -0
  45. package/src/__tests__/conversation-store.test.ts +74 -0
  46. package/src/__tests__/conversation-surfaces-app-control.test.ts +4 -1
  47. package/src/__tests__/conversation-tool-setup-attribution.test.ts +323 -0
  48. package/src/__tests__/conversation-tool-setup-tools-disabled.test.ts +34 -0
  49. package/src/__tests__/conversation-workspace-cache-state.test.ts +1 -0
  50. package/src/__tests__/conversation-workspace-injection.test.ts +1 -1
  51. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -0
  52. package/src/__tests__/corrected-target.test.ts +93 -0
  53. package/src/__tests__/credential-execution-feature-gates.test.ts +3 -5
  54. package/src/__tests__/credential-execution-tools.test.ts +23 -11
  55. package/src/__tests__/credential-security-invariants.test.ts +6 -1
  56. package/src/__tests__/db-schedule-syntax-migration.test.ts +80 -0
  57. package/src/__tests__/device-id.test.ts +70 -1
  58. package/src/__tests__/embedding-managed-proxy-selection.test.ts +6 -40
  59. package/src/__tests__/empty-response-hook.test.ts +242 -66
  60. package/src/__tests__/external-plugin-loader.test.ts +0 -31
  61. package/src/__tests__/get-skill-detail-audit.test.ts +43 -1
  62. package/src/__tests__/guardian-routing-invariants.test.ts +91 -0
  63. package/src/__tests__/history-repair-hook.test.ts +228 -3
  64. package/src/__tests__/host-app-control-proxy.test.ts +45 -0
  65. package/src/__tests__/host-browser-proxy.test.ts +254 -9
  66. package/src/__tests__/identity-routes.test.ts +1 -0
  67. package/src/__tests__/image-recovery-hook.test.ts +387 -0
  68. package/src/__tests__/injector-chain.test.ts +5 -4
  69. package/src/__tests__/injector-v3-suppression.test.ts +373 -47
  70. package/src/__tests__/intent-routing.test.ts +7 -0
  71. package/src/__tests__/memory-retrieval-hook.test.ts +117 -15
  72. package/src/__tests__/notification-decision-strategy.test.ts +3 -3
  73. package/src/__tests__/oauth-store.test.ts +0 -85
  74. package/src/__tests__/{context-overflow-policy.test.ts → overflow-policy.test.ts} +1 -1
  75. package/src/__tests__/parallel-tool.benchmark.test.ts +4 -0
  76. package/src/__tests__/persist-unsendable-image-downscale.test.ts +29 -9
  77. package/src/__tests__/persist-unsendable-image.test.ts +4 -4
  78. package/src/__tests__/persistence-secret-redaction.test.ts +78 -0
  79. package/src/__tests__/plugin-bootstrap.test.ts +82 -73
  80. package/src/__tests__/plugin-tool-contribution.test.ts +7 -4
  81. package/src/__tests__/plugin-types.test.ts +0 -8
  82. package/src/__tests__/provider-catalog-visibility.test.ts +1 -9
  83. package/src/__tests__/prune-old-conversations-job.test.ts +99 -0
  84. package/src/__tests__/registry.test.ts +240 -1
  85. package/src/__tests__/require-fresh-approval.test.ts +3 -0
  86. package/src/__tests__/schedule-routes.test.ts +116 -1
  87. package/src/__tests__/schedule-store.test.ts +28 -0
  88. package/src/__tests__/schedule-tools.test.ts +94 -1
  89. package/src/__tests__/server-history-render.test.ts +39 -0
  90. package/src/__tests__/skill-projection-feature-flag.test.ts +13 -0
  91. package/src/__tests__/skill-projection.benchmark.test.ts +25 -7
  92. package/src/__tests__/skills.test.ts +202 -0
  93. package/src/__tests__/slim-skill-category.test.ts +195 -0
  94. package/src/__tests__/strip-memory-injections.test.ts +33 -39
  95. package/src/__tests__/test-support/tool-invocation-seed.ts +79 -0
  96. package/src/__tests__/title-generate-hook.test.ts +9 -7
  97. package/src/__tests__/tool-audit-listener.test.ts +264 -1
  98. package/src/__tests__/tool-error-hook.test.ts +4 -3
  99. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -0
  100. package/src/__tests__/tool-executor-lifecycle-events.test.ts +273 -0
  101. package/src/__tests__/tool-result-truncate-hook.test.ts +1 -0
  102. package/src/__tests__/tool-start-timestamp.test.ts +218 -0
  103. package/src/__tests__/tools-get-route.test.ts +202 -0
  104. package/src/__tests__/workspace-tool-loader.test.ts +319 -0
  105. package/src/__tests__/workspace-tools-watcher-flag.test.ts +70 -0
  106. package/src/agent/loop.ts +569 -319
  107. package/src/api/events/tool-result.ts +9 -0
  108. package/src/api/events/tool-use-start.ts +7 -0
  109. package/src/api/index.ts +10 -0
  110. package/src/api/responses/conversation-message.ts +135 -27
  111. package/src/api/responses/memory-v3-selection-log.ts +4 -4
  112. package/src/approvals/guardian-request-resolvers.ts +26 -0
  113. package/src/browser-session/backends/host-bridge.ts +29 -0
  114. package/src/browser-session/index.ts +1 -0
  115. package/src/browser-session/types.ts +5 -1
  116. package/src/cli/commands/__tests__/schedules.test.ts +62 -4
  117. package/src/cli/commands/__tests__/skills.test.ts +53 -0
  118. package/src/cli/commands/channel-verification-sessions.ts +6 -6
  119. package/src/cli/commands/inference-providers.ts +0 -8
  120. package/src/cli/commands/plugins.ts +2 -2
  121. package/src/cli/commands/schedules.ts +27 -4
  122. package/src/cli/commands/skills.ts +187 -146
  123. package/src/cli/commands/tools.ts +106 -0
  124. package/src/cli/lib/__tests__/install-from-github.test.ts +256 -328
  125. package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +6 -2
  126. package/src/cli/lib/__tests__/plugin-details.test.ts +10 -16
  127. package/src/cli/lib/__tests__/plugin-marketplace.test.ts +2 -2
  128. package/src/cli/lib/__tests__/search-plugins.test.ts +145 -240
  129. package/src/cli/lib/install-from-github.ts +187 -117
  130. package/src/cli/lib/plugin-catalog-cache.ts +9 -9
  131. package/src/cli/lib/plugin-details.ts +38 -68
  132. package/src/cli/lib/plugin-marketplace.ts +42 -14
  133. package/src/cli/lib/search-plugins.ts +29 -129
  134. package/src/cli/program.ts +2 -0
  135. package/src/config/bundled-skills/acp/SKILL.md +1 -0
  136. package/src/config/bundled-skills/app-builder/SKILL.md +1 -0
  137. package/src/config/bundled-skills/app-control/SKILL.md +1 -0
  138. package/src/config/bundled-skills/computer-use/SKILL.md +1 -0
  139. package/src/config/bundled-skills/contacts/SKILL.md +1 -0
  140. package/src/config/bundled-skills/document-editor/SKILL.md +1 -0
  141. package/src/config/bundled-skills/followups/SKILL.md +1 -0
  142. package/src/config/bundled-skills/image-studio/SKILL.md +1 -0
  143. package/src/config/bundled-skills/media-processing/SKILL.md +1 -0
  144. package/src/config/bundled-skills/messaging/SKILL.md +1 -0
  145. package/src/config/bundled-skills/phone-calls/SKILL.md +1 -0
  146. package/src/config/bundled-skills/playbooks/SKILL.md +1 -0
  147. package/src/config/bundled-skills/schedule/SKILL.md +1 -0
  148. package/src/config/bundled-skills/schedule/TOOLS.json +11 -3
  149. package/src/config/bundled-skills/sequences/SKILL.md +1 -0
  150. package/src/config/bundled-skills/settings/SKILL.md +1 -0
  151. package/src/config/bundled-skills/skill-management/SKILL.md +101 -1
  152. package/src/config/bundled-skills/subagent/SKILL.md +1 -0
  153. package/src/config/bundled-skills/transcribe/SKILL.md +1 -0
  154. package/src/config/env-registry.ts +23 -0
  155. package/src/config/feature-flag-registry.json +17 -81
  156. package/src/config/loader.ts +5 -22
  157. package/src/config/schema.ts +2 -0
  158. package/src/config/schemas/__tests__/compaction-logs.test.ts +56 -0
  159. package/src/config/schemas/__tests__/memory-v2.test.ts +0 -1
  160. package/src/config/schemas/__tests__/memory-v3.test.ts +61 -1
  161. package/src/config/schemas/compaction-logs.ts +79 -0
  162. package/src/config/schemas/memory-v2.ts +0 -8
  163. package/src/config/schemas/memory-v3.ts +104 -33
  164. package/src/config/seed-inference-profiles.ts +1 -1
  165. package/src/config/skills.ts +117 -47
  166. package/src/context/compactor.ts +11 -0
  167. package/src/context/strip-injections.ts +38 -4
  168. package/src/credential-execution/feature-gates.ts +0 -21
  169. package/src/credential-execution/startup-timeout.ts +32 -4
  170. package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +18 -0
  171. package/src/daemon/conversation-agent-loop-handlers.ts +140 -91
  172. package/src/daemon/conversation-agent-loop.ts +123 -658
  173. package/src/daemon/conversation-error.ts +6 -33
  174. package/src/daemon/conversation-lifecycle.ts +1 -1
  175. package/src/daemon/conversation-runtime-assembly.ts +183 -22
  176. package/src/daemon/conversation-skill-tools.ts +137 -8
  177. package/src/daemon/conversation-slash.ts +0 -14
  178. package/src/daemon/conversation-store.ts +2 -19
  179. package/src/daemon/conversation-tool-setup.ts +87 -1
  180. package/src/daemon/conversation.ts +119 -50
  181. package/src/daemon/external-plugins-bootstrap.ts +36 -95
  182. package/src/daemon/handlers/config-channels.ts +11 -2
  183. package/src/daemon/handlers/shared.ts +9 -1
  184. package/src/daemon/handlers/skills.ts +10 -4
  185. package/src/daemon/host-app-control-proxy.ts +72 -57
  186. package/src/daemon/host-browser-proxy.ts +117 -22
  187. package/src/daemon/lifecycle.ts +34 -5
  188. package/src/daemon/message-protocol.ts +0 -7
  189. package/src/daemon/message-types/schedules.ts +1 -0
  190. package/src/daemon/message-types/skills.ts +17 -0
  191. package/src/daemon/providers-setup.ts +3 -0
  192. package/src/daemon/server.ts +3 -3
  193. package/src/daemon/tool-setup-types.ts +9 -3
  194. package/src/daemon/trust-context.ts +23 -0
  195. package/src/daemon/workspace-tools-watcher.ts +324 -0
  196. package/src/events/tool-audit-listener.ts +78 -16
  197. package/src/events/tool-metrics-listener.ts +2 -5
  198. package/src/memory/__tests__/compaction-log-writer-clickhouse.test.ts +227 -0
  199. package/src/memory/__tests__/conversation-queries.test.ts +176 -0
  200. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +20 -32
  201. package/src/memory/compaction-log-writer-clickhouse.ts +418 -0
  202. package/src/memory/conversation-crud.ts +134 -3
  203. package/src/memory/conversation-queries.ts +64 -7
  204. package/src/memory/db-init.ts +14 -0
  205. package/src/memory/embedding-backend.test.ts +130 -1
  206. package/src/memory/embedding-backend.ts +79 -106
  207. package/src/memory/embedding-gemini.ts +5 -0
  208. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +12 -0
  209. package/src/memory/graph/__tests__/handle-remember-v2.test.ts +19 -0
  210. package/src/memory/graph/conversation-graph-memory.ts +36 -25
  211. package/src/memory/graph/tool-handlers.ts +3 -0
  212. package/src/memory/job-handlers/cleanup.ts +3 -1
  213. package/src/memory/jobs-store.ts +0 -28
  214. package/src/memory/jobs-worker.ts +10 -22
  215. package/src/memory/memory-marker.ts +29 -0
  216. package/src/memory/memory-retrospective-startup-cleanup.ts +1 -1
  217. package/src/memory/migrations/268-add-memory-v3-selections.ts +6 -0
  218. package/src/memory/migrations/270-schedule-description.ts +36 -0
  219. package/src/memory/migrations/275-tool-invocations-add-skill-id.test.ts +81 -0
  220. package/src/memory/migrations/275-tool-invocations-add-skill-id.ts +20 -0
  221. package/src/memory/migrations/276-tool-invocations-created-at-id-index.test.ts +68 -0
  222. package/src/memory/migrations/276-tool-invocations-created-at-id-index.ts +20 -0
  223. package/src/memory/migrations/277-add-memory-v3-ever-injected.ts +29 -0
  224. package/src/memory/migrations/278-tool-invocations-telemetry-columns.test.ts +96 -0
  225. package/src/memory/migrations/278-tool-invocations-telemetry-columns.ts +39 -0
  226. package/src/memory/migrations/279-create-skill-loaded-events.test.ts +84 -0
  227. package/src/memory/migrations/279-create-skill-loaded-events.ts +26 -0
  228. package/src/memory/migrations/280-conversations-surfaced-at.test.ts +88 -0
  229. package/src/memory/migrations/280-conversations-surfaced-at.ts +24 -0
  230. package/src/memory/migrations/index.ts +10 -0
  231. package/src/memory/migrations/registry.ts +8 -0
  232. package/src/memory/schema/conversations.ts +16 -0
  233. package/src/memory/schema/infrastructure.ts +26 -0
  234. package/src/memory/skill-loaded-events-store.test.ts +160 -0
  235. package/src/memory/skill-loaded-events-store.ts +95 -0
  236. package/src/memory/tool-executed-events-store.test.ts +219 -0
  237. package/src/memory/tool-executed-events-store.ts +102 -0
  238. package/src/memory/tool-usage-store.ts +15 -3
  239. package/src/memory/v2/__tests__/consolidation-job.test.ts +117 -12
  240. package/src/memory/v2/__tests__/consolidation-prompt-flag-gating-guard.test.ts +189 -0
  241. package/src/memory/v2/__tests__/injected-block-slugs.test.ts +90 -0
  242. package/src/memory/v2/__tests__/page-store.test.ts +33 -0
  243. package/src/memory/v2/__tests__/prompts-consolidation.test.ts +88 -15
  244. package/src/memory/v2/activation-store.ts +50 -1
  245. package/src/memory/v2/consolidation-job.ts +113 -29
  246. package/src/memory/v2/injected-block-slugs.ts +79 -0
  247. package/src/memory/v2/injection.ts +6 -1
  248. package/src/memory/v2/prompts/consolidation.ts +414 -13
  249. package/src/memory/v2/router.ts +2 -28
  250. package/src/memory/v2/static-context.ts +1 -1
  251. package/src/memory/v2/types.ts +16 -0
  252. package/src/notifications/__tests__/copy-composer.test.ts +244 -0
  253. package/src/notifications/access-request-copy.ts +298 -0
  254. package/src/notifications/adapters/slack.ts +3 -3
  255. package/src/notifications/adapters/telegram.ts +2 -1
  256. package/src/notifications/copy-composer.ts +49 -267
  257. package/src/notifications/decision-engine.ts +16 -35
  258. package/src/notifications/home-feed-side-effect.ts +1 -6
  259. package/src/oauth/oauth-store.ts +0 -9
  260. package/src/permissions/checker.test.ts +83 -1
  261. package/src/permissions/checker.ts +25 -2
  262. package/src/permissions/gateway-threshold-reader.test.ts +182 -0
  263. package/src/permissions/gateway-threshold-reader.ts +80 -0
  264. package/src/platform/client.ts +1 -3
  265. package/src/platform/feature-gate.ts +3 -12
  266. package/src/plugin-api/constants.ts +4 -2
  267. package/src/plugin-api/index.ts +63 -11
  268. package/src/plugin-api/types.ts +236 -71
  269. package/src/plugins/defaults/compaction/compact.ts +66 -2
  270. package/src/plugins/defaults/compaction/context-overflow-reducer.ts +240 -32
  271. package/src/plugins/defaults/compaction/corrected-target.ts +53 -0
  272. package/src/{daemon/context-overflow-policy.ts → plugins/defaults/compaction/overflow-policy.ts} +1 -1
  273. package/src/plugins/defaults/compaction/window-manager.ts +303 -1
  274. package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +173 -0
  275. package/src/plugins/defaults/empty-response/hooks/stop.ts +11 -115
  276. package/src/plugins/defaults/empty-response/nudge-state-store.ts +46 -0
  277. package/src/plugins/defaults/history-repair/hooks/post-model-call.ts +50 -0
  278. package/src/plugins/defaults/history-repair/hooks/stop.ts +22 -0
  279. package/src/plugins/defaults/history-repair/repair-state-store.ts +51 -0
  280. package/src/plugins/defaults/history-repair/terminal.ts +39 -2
  281. package/src/plugins/defaults/image-recovery/detect.ts +25 -0
  282. package/src/plugins/defaults/image-recovery/hooks/post-model-call.ts +73 -0
  283. package/src/plugins/defaults/image-recovery/hooks/stop.ts +22 -0
  284. package/src/plugins/defaults/image-recovery/image-recovery-state-store.ts +48 -0
  285. package/src/plugins/defaults/image-recovery/package.json +14 -0
  286. package/src/{daemon/persist-unsendable-image.ts → plugins/defaults/image-recovery/recover.ts} +67 -14
  287. package/src/plugins/defaults/index.ts +71 -5
  288. package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +76 -112
  289. package/src/plugins/defaults/memory-retrieval/hooks/{user-prompt-submit-temp.ts → user-prompt-submit.ts} +83 -74
  290. package/src/plugins/defaults/memory-retrieval/injector-chain.ts +14 -8
  291. package/src/plugins/defaults/memory-retrieval/injectors.ts +2 -18
  292. package/src/plugins/defaults/memory-retrieval/package.json +14 -0
  293. package/src/plugins/defaults/memory-v3-shadow/__tests__/carry-integration.test.ts +1157 -0
  294. package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +683 -0
  295. package/src/plugins/defaults/memory-v3-shadow/__tests__/live-integration.test.ts +161 -140
  296. package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +160 -0
  297. package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +335 -316
  298. package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +145 -53
  299. package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +38 -1
  300. package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +18 -8
  301. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-integration.test.ts +112 -71
  302. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +192 -51
  303. package/src/plugins/defaults/memory-v3-shadow/__tests__/types.test.ts +4 -16
  304. package/src/plugins/defaults/memory-v3-shadow/card.test.ts +173 -0
  305. package/src/plugins/defaults/memory-v3-shadow/card.ts +116 -0
  306. package/src/plugins/defaults/memory-v3-shadow/core-set.test.ts +104 -0
  307. package/src/plugins/defaults/memory-v3-shadow/core-set.ts +59 -0
  308. package/src/plugins/defaults/memory-v3-shadow/ever-injected-store.test.ts +305 -0
  309. package/src/plugins/defaults/memory-v3-shadow/ever-injected-store.ts +278 -0
  310. package/src/plugins/defaults/memory-v3-shadow/hot-set.test.ts +138 -0
  311. package/src/plugins/defaults/memory-v3-shadow/hot-set.ts +85 -0
  312. package/src/plugins/defaults/memory-v3-shadow/injector.ts +331 -24
  313. package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +119 -13
  314. package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +169 -114
  315. package/src/plugins/defaults/memory-v3-shadow/page-content.ts +47 -16
  316. package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +144 -66
  317. package/src/plugins/defaults/memory-v3-shadow/prune.test.ts +758 -0
  318. package/src/plugins/defaults/memory-v3-shadow/prune.ts +471 -0
  319. package/src/plugins/defaults/memory-v3-shadow/render-injection.ts +68 -16
  320. package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +19 -12
  321. package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +96 -43
  322. package/src/plugins/defaults/memory-v3-shadow/types.ts +34 -17
  323. package/src/plugins/defaults/title-generate/hooks/stop.ts +9 -11
  324. package/src/plugins/pipeline.ts +8 -5
  325. package/src/plugins/types.ts +5 -51
  326. package/src/providers/cache-control.ts +26 -0
  327. package/src/providers/inference/__tests__/base-url-route-validation.test.ts +1 -2
  328. package/src/providers/model-catalog.ts +13 -1
  329. package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +147 -0
  330. package/src/providers/openai/chat-completions-provider.ts +46 -0
  331. package/src/providers/openai/responses-provider.ts +45 -0
  332. package/src/providers/registry.ts +0 -8
  333. package/src/runtime/__tests__/agent-wake.test.ts +0 -1
  334. package/src/runtime/agent-wake.ts +13 -0
  335. package/src/runtime/routes/__tests__/acp-routes.test.ts +151 -0
  336. package/src/runtime/routes/__tests__/consolidation-routes.test.ts +12 -50
  337. package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +322 -0
  338. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +0 -62
  339. package/src/runtime/routes/__tests__/plugins-routes.test.ts +31 -11
  340. package/src/runtime/routes/acp-routes.test.ts +106 -0
  341. package/src/runtime/routes/acp-routes.ts +248 -2
  342. package/src/runtime/routes/browser-tabs-routes.ts +1 -1
  343. package/src/runtime/routes/channel-verification-routes.ts +14 -5
  344. package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +0 -14
  345. package/src/runtime/routes/consolidation-routes.ts +6 -82
  346. package/src/runtime/routes/conversation-list-routes.ts +6 -0
  347. package/src/runtime/routes/conversation-management-routes.ts +71 -0
  348. package/src/runtime/routes/identity-routes.ts +8 -0
  349. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +33 -34
  350. package/src/runtime/routes/inference-provider-connection-routes.ts +0 -45
  351. package/src/runtime/routes/plugins-routes.ts +34 -45
  352. package/src/runtime/routes/schedule-routes.ts +43 -5
  353. package/src/runtime/routes/settings-routes.ts +140 -15
  354. package/src/runtime/routes/skills-routes.ts +18 -6
  355. package/src/runtime/services/__tests__/conversation-serializer.test.ts +140 -0
  356. package/src/runtime/services/conversation-serializer.ts +38 -1
  357. package/src/runtime/verification-outbound-actions.ts +147 -2
  358. package/src/runtime/verification-templates.ts +29 -3
  359. package/src/schedule/schedule-store.ts +19 -0
  360. package/src/skills/catalog-install.ts +77 -13
  361. package/src/tasks/task-scheduler.ts +1 -0
  362. package/src/telemetry/types.ts +66 -1
  363. package/src/telemetry/usage-telemetry-reporter.test.ts +542 -13
  364. package/src/telemetry/usage-telemetry-reporter.ts +213 -20
  365. package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +49 -2
  366. package/src/tools/browser/__tests__/browser-status.test.ts +29 -5
  367. package/src/tools/browser/browser-execution.ts +27 -9
  368. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +380 -4
  369. package/src/tools/browser/cdp-client/__tests__/host-bridge-cdp-client.test.ts +107 -0
  370. package/src/tools/browser/cdp-client/__tests__/types.test.ts +6 -1
  371. package/src/tools/browser/cdp-client/factory.ts +217 -17
  372. package/src/tools/browser/cdp-client/host-bridge-cdp-client.ts +67 -0
  373. package/src/tools/browser/cdp-client/types.ts +22 -2
  374. package/src/tools/credential-execution/make-authenticated-request.ts +2 -1
  375. package/src/tools/credential-execution/manage-secure-command-tool.ts +169 -164
  376. package/src/tools/credential-execution/run-authenticated-command.ts +2 -1
  377. package/src/tools/executor.ts +39 -7
  378. package/src/tools/registry.ts +387 -5
  379. package/src/tools/schedule/create.ts +16 -0
  380. package/src/tools/schedule/list.ts +12 -4
  381. package/src/tools/schedule/update.ts +12 -0
  382. package/src/tools/skills/load.ts +11 -6
  383. package/src/tools/terminal/safe-env.ts +2 -0
  384. package/src/tools/types.ts +65 -9
  385. package/src/tools/workspace-tools/loader.ts +673 -0
  386. package/src/usage/attribution.ts +28 -0
  387. package/src/util/device-id.ts +17 -3
  388. package/src/util/platform.ts +16 -0
  389. package/tsconfig.plugin-api.json +13 -0
  390. package/src/__tests__/plugin-external-api.test.ts +0 -68
  391. package/src/__tests__/plugin-skill-contribution.test.ts +0 -355
  392. package/src/daemon/message-types/browser.ts +0 -10
  393. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +0 -187
  394. package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/eval-turns.json +0 -36
  395. package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/live-turns.json +0 -37
  396. package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-eviction.test.ts +0 -106
  397. package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-skeleton.test.ts +0 -44
  398. package/src/plugins/defaults/memory-v3-shadow/working-set.ts +0 -91
  399. package/src/plugins/external-api.ts +0 -114
  400. package/src/plugins/plugin-skill-contributions.ts +0 -292
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Template-only copy for outbound guardian verification messages (Telegram, Slack, and voice).
2
+ * Template-only copy for outbound guardian verification messages (Telegram, Slack, email, and voice).
3
3
  *
4
4
  * All outbound verification messages are composed from these templates
5
5
  * to prevent free-form caller/user text injection. Only typed variables
@@ -26,6 +26,10 @@ export const GUARDIAN_VERIFY_TEMPLATE_KEYS = {
26
26
  "guardian_verify.slack.trusted_contact_challenge",
27
27
  /** Resend Slack DM verification for inbound trusted contact (includes the code). */
28
28
  SLACK_TRUSTED_CONTACT_RESEND: "guardian_verify.slack.trusted_contact_resend",
29
+ /** Initial outbound email verification prompt (includes the code). */
30
+ EMAIL_CHALLENGE_REQUEST: "guardian_verify.email.challenge_request",
31
+ /** Resend email verification prompt (includes the code). */
32
+ EMAIL_RESEND: "guardian_verify.email.resend",
29
33
  /** Outbound voice call intro prompt: asks guardian to enter verification code via keypad. */
30
34
  VOICE_CALL_INTRO: "guardian_verify.voice.call_intro",
31
35
  /** Voice retry prompt after an incorrect code entry. */
@@ -42,7 +46,7 @@ export const GUARDIAN_VERIFY_TEMPLATE_KEYS = {
42
46
  CHANNEL_BOOTSTRAP_BOUND: "guardian_verify.channel.bootstrap_bound",
43
47
  } as const;
44
48
 
45
- /** Template keys for Telegram/Slack text-based verification messages. */
49
+ /** Template keys for Telegram/Slack/email text-based verification messages. */
46
50
  type TextVerifyTemplateKey =
47
51
  | typeof GUARDIAN_VERIFY_TEMPLATE_KEYS.ALREADY_VERIFIED
48
52
  | typeof GUARDIAN_VERIFY_TEMPLATE_KEYS.TELEGRAM_CHALLENGE_REQUEST
@@ -50,7 +54,9 @@ type TextVerifyTemplateKey =
50
54
  | typeof GUARDIAN_VERIFY_TEMPLATE_KEYS.SLACK_CHALLENGE_REQUEST
51
55
  | typeof GUARDIAN_VERIFY_TEMPLATE_KEYS.SLACK_RESEND
52
56
  | typeof GUARDIAN_VERIFY_TEMPLATE_KEYS.SLACK_TRUSTED_CONTACT_CHALLENGE
53
- | typeof GUARDIAN_VERIFY_TEMPLATE_KEYS.SLACK_TRUSTED_CONTACT_RESEND;
57
+ | typeof GUARDIAN_VERIFY_TEMPLATE_KEYS.SLACK_TRUSTED_CONTACT_RESEND
58
+ | typeof GUARDIAN_VERIFY_TEMPLATE_KEYS.EMAIL_CHALLENGE_REQUEST
59
+ | typeof GUARDIAN_VERIFY_TEMPLATE_KEYS.EMAIL_RESEND;
54
60
 
55
61
  /** Template keys for deterministic channel verification reply messages. */
56
62
  type ChannelVerifyReplyTemplateKey =
@@ -115,6 +121,14 @@ const templates: Record<
115
121
  [GUARDIAN_VERIFY_TEMPLATE_KEYS.SLACK_TRUSTED_CONTACT_RESEND]: (vars) => {
116
122
  return `Vellum assistant verification: your code is ${vars.code}. Reply with this code to verify your identity. It expires in ${vars.expiresInMinutes} minutes. (resent)`;
117
123
  },
124
+
125
+ [GUARDIAN_VERIFY_TEMPLATE_KEYS.EMAIL_CHALLENGE_REQUEST]: (vars) => {
126
+ return `Vellum assistant guardian verification requested.\n\nYour verification code is: ${vars.code}\n\nReply to this email with only the 6-digit code above to complete verification. This code expires in ${vars.expiresInMinutes} minutes.`;
127
+ },
128
+
129
+ [GUARDIAN_VERIFY_TEMPLATE_KEYS.EMAIL_RESEND]: (vars) => {
130
+ return `Vellum assistant guardian verification requested.\n\nYour new verification code is: ${vars.code}\n\nReply to this email with only the 6-digit code above to complete verification. This code expires in ${vars.expiresInMinutes} minutes. (resent)`;
131
+ },
118
132
  };
119
133
 
120
134
  /**
@@ -129,6 +143,18 @@ export function composeVerificationSlack(
129
143
  return composer(vars);
130
144
  }
131
145
 
146
+ /**
147
+ * Compose an outbound verification email from a template key and typed variables.
148
+ * Returns plain string content suitable for email delivery.
149
+ */
150
+ export function composeVerificationEmail(
151
+ templateKey: TextVerifyTemplateKey,
152
+ vars: GuardianVerifyTemplateVars,
153
+ ): string {
154
+ const composer = templates[templateKey];
155
+ return composer(vars);
156
+ }
157
+
132
158
  /**
133
159
  * Compose an outbound verification Telegram message from a template key and typed variables.
134
160
  * Returns plain string content suitable for Telegram delivery.
@@ -33,6 +33,7 @@ export type ScheduleStatus = "active" | "firing" | "fired" | "cancelled";
33
33
  export interface ScheduleJob {
34
34
  id: string;
35
35
  name: string;
36
+ description: string;
36
37
  enabled: boolean;
37
38
  syntax: ScheduleSyntax;
38
39
  expression: string | null;
@@ -85,6 +86,7 @@ export function isValidCronExpression(expr: string): boolean {
85
86
 
86
87
  export function createSchedule(params: {
87
88
  name: string;
89
+ description?: string;
88
90
  cronExpression?: string | null;
89
91
  timezone?: string | null;
90
92
  message: string;
@@ -141,6 +143,10 @@ export function createSchedule(params: {
141
143
  const retryBackoffMs = params.retryBackoffMs ?? 60000;
142
144
  const timeoutMs = params.timeoutMs ?? null;
143
145
  const createdFromConversationId = params.createdFromConversationId ?? null;
146
+ const description = normalizeDescription(
147
+ params.description,
148
+ params.createdBy === "defer" ? "" : params.name,
149
+ );
144
150
 
145
151
  let nextRunAt: number;
146
152
  if (isOneShot) {
@@ -154,6 +160,7 @@ export function createSchedule(params: {
154
160
  const row = {
155
161
  id,
156
162
  name: params.name,
163
+ description,
157
164
  enabled,
158
165
  cronExpression: expression,
159
166
  scheduleSyntax: syntax,
@@ -252,6 +259,7 @@ export function updateSchedule(
252
259
  id: string,
253
260
  updates: {
254
261
  name?: string;
262
+ description?: string;
255
263
  cronExpression?: string;
256
264
  timezone?: string | null;
257
265
  message?: string;
@@ -313,6 +321,8 @@ export function updateSchedule(
313
321
  const set: Record<string, unknown> = { updatedAt: now };
314
322
 
315
323
  if (updates.name !== undefined) set.name = updates.name;
324
+ if (updates.description !== undefined)
325
+ set.description = normalizeDescription(updates.description);
316
326
  if (updates.cronExpression !== undefined || updates.expression !== undefined)
317
327
  set.cronExpression = newExpr;
318
328
  if (updates.syntax !== undefined) set.scheduleSyntax = newSyntax;
@@ -980,6 +990,7 @@ function parseJobRow(row: typeof scheduleJobs.$inferSelect): ScheduleJob {
980
990
  return {
981
991
  id: row.id,
982
992
  name: row.name,
993
+ description: row.description ?? "",
983
994
  enabled: row.enabled,
984
995
  syntax: row.scheduleSyntax as ScheduleSyntax,
985
996
  expression: row.cronExpression,
@@ -1008,6 +1019,14 @@ function parseJobRow(row: typeof scheduleJobs.$inferSelect): ScheduleJob {
1008
1019
  };
1009
1020
  }
1010
1021
 
1022
+ function normalizeDescription(
1023
+ value: string | undefined,
1024
+ fallback = "",
1025
+ ): string {
1026
+ const normalized = value?.trim() ?? "";
1027
+ return normalized || fallback;
1028
+ }
1029
+
1011
1030
  function safeParseJson(
1012
1031
  json: string | null | undefined,
1013
1032
  ): Record<string, unknown> {
@@ -47,11 +47,6 @@ export interface CatalogSkill {
47
47
  };
48
48
  }
49
49
 
50
- export interface CatalogManifest {
51
- version: number;
52
- skills: CatalogSkill[];
53
- }
54
-
55
50
  /**
56
51
  * Resolve the directory containing a `catalog.json` and first-party skill
57
52
  * sources — either bundled next to a compiled binary (e.g. `Vellum.app`) or
@@ -97,6 +92,75 @@ export function getRepoSkillsDir(): string | undefined {
97
92
 
98
93
  // ─── Catalog operations ──────────────────────────────────────────────────────
99
94
 
95
+ /**
96
+ * Raw skill entry as returned by the platform `/v1/skills/` API. The platform
97
+ * serializer flattens the skill's metadata into top-level fields
98
+ * (`category`, `display_name`, `icon`) rather than the nested
99
+ * `metadata.vellum.*` shape used by the local `catalog.json`. Both shapes are
100
+ * accepted here so the daemon has a single canonical representation downstream.
101
+ */
102
+ interface RawCatalogEntry {
103
+ id?: unknown;
104
+ name?: unknown;
105
+ description?: unknown;
106
+ icon?: unknown;
107
+ emoji?: string;
108
+ includes?: string[];
109
+ version?: string;
110
+ updatedAt?: unknown;
111
+ display_name?: unknown;
112
+ category?: unknown;
113
+ updated_at?: unknown;
114
+ metadata?: CatalogSkill["metadata"];
115
+ }
116
+
117
+ function asStr(value: unknown): string | undefined {
118
+ return typeof value === "string" && value.length > 0 ? value : undefined;
119
+ }
120
+
121
+ /**
122
+ * Normalize a platform API entry into a canonical {@link CatalogSkill}.
123
+ *
124
+ * The platform flattens `category`, `display_name`, and `icon` to the top
125
+ * level, so re-nest them under `metadata.vellum` to match the local catalog
126
+ * shape that the rest of the daemon reads (`metadata.vellum.category`,
127
+ * `metadata.vellum["display-name"]`). Existing nested values take precedence
128
+ * so a future API change to the nested shape keeps working.
129
+ */
130
+ function normalizeCatalogEntry(raw: unknown): CatalogSkill | null {
131
+ if (typeof raw !== "object" || raw === null) return null;
132
+ const entry = raw as RawCatalogEntry;
133
+
134
+ const id = asStr(entry.id);
135
+ if (!id) return null;
136
+
137
+ const nested = entry.metadata?.vellum;
138
+ const category = nested?.category ?? asStr(entry.category);
139
+ const displayName = nested?.["display-name"] ?? asStr(entry.display_name);
140
+ const icon = asStr(entry.icon) ?? asStr(entry.metadata?.icon);
141
+ const updatedAt = asStr(entry.updatedAt) ?? asStr(entry.updated_at);
142
+
143
+ return {
144
+ id,
145
+ name: asStr(entry.name) ?? id,
146
+ description: asStr(entry.description) ?? "",
147
+ ...(icon ? { icon } : {}),
148
+ ...(entry.emoji ? { emoji: entry.emoji } : {}),
149
+ ...(entry.includes ? { includes: entry.includes } : {}),
150
+ ...(entry.version ? { version: entry.version } : {}),
151
+ ...(updatedAt ? { updatedAt } : {}),
152
+ metadata: {
153
+ ...entry.metadata,
154
+ ...(icon ? { icon } : {}),
155
+ vellum: {
156
+ ...nested,
157
+ ...(displayName ? { "display-name": displayName } : {}),
158
+ ...(category ? { category } : {}),
159
+ },
160
+ },
161
+ };
162
+ }
163
+
100
164
  export async function fetchCatalog(): Promise<CatalogSkill[]> {
101
165
  const platformUrl = getPlatformBaseUrl();
102
166
  const url = `${platformUrl}/v1/skills/`;
@@ -110,23 +174,23 @@ export async function fetchCatalog(): Promise<CatalogSkill[]> {
110
174
  );
111
175
  }
112
176
 
113
- const manifest = (await response.json()) as CatalogManifest;
177
+ const manifest = (await response.json()) as { skills?: unknown };
114
178
  if (!Array.isArray(manifest.skills)) {
115
179
  throw new Error("Platform catalog has invalid skills array");
116
180
  }
117
- return manifest.skills.filter(
118
- (s): s is CatalogSkill => !!s && typeof s.id === "string",
119
- );
181
+ return manifest.skills
182
+ .map((s) => normalizeCatalogEntry(s))
183
+ .filter((s): s is CatalogSkill => s !== null);
120
184
  }
121
185
 
122
186
  export function readLocalCatalog(repoSkillsDir: string): CatalogSkill[] {
123
187
  try {
124
188
  const raw = readFileSync(join(repoSkillsDir, "catalog.json"), "utf-8");
125
- const manifest = JSON.parse(raw) as CatalogManifest;
189
+ const manifest = JSON.parse(raw) as { skills?: unknown };
126
190
  if (!Array.isArray(manifest.skills)) return [];
127
- return manifest.skills.filter(
128
- (s): s is CatalogSkill => !!s && typeof s.id === "string",
129
- );
191
+ return manifest.skills
192
+ .map((s) => normalizeCatalogEntry(s))
193
+ .filter((s): s is CatalogSkill => s !== null);
130
194
  } catch {
131
195
  return [];
132
196
  }
@@ -13,6 +13,7 @@ export function scheduleTask(opts: {
13
13
  }): ReturnType<typeof createSchedule> {
14
14
  return createSchedule({
15
15
  name: opts.name,
16
+ description: `Run task: ${opts.name}`,
16
17
  cronExpression: opts.cronExpression,
17
18
  timezone: opts.timezone ?? null,
18
19
  message: `run_task:${opts.taskId}`,
@@ -34,6 +34,27 @@ export interface TelemetryEventBase {
34
34
  assistant_version: string | null;
35
35
  }
36
36
 
37
+ /**
38
+ * Base for telemetry events that occur in the context of a model call.
39
+ * Standardizes model attribution across event types — field names/shapes
40
+ * mirror the existing llm_usage event so downstream consumers (dbt, admin
41
+ * charts) can join/group consistently.
42
+ *
43
+ * `provider`/`model` are nullable on the wire because rows persisted before
44
+ * the attribution columns existed, and rows whose attribution resolution
45
+ * failed, must still ship; the platform serializer accepts null.
46
+ */
47
+ export interface ModelTelemetryEventBase extends TelemetryEventBase {
48
+ /** Provider serving the call, e.g. "anthropic", "fireworks". */
49
+ provider: string | null;
50
+ /** Model id active for the call, e.g. "claude-fable-5". */
51
+ model: string | null;
52
+ /** Inference profile slug. Null when no profile applied. */
53
+ inference_profile: string | null;
54
+ /** How the profile was attributed (same enum as llm_usage). */
55
+ inference_profile_source: UsageAttributionProfileSource | null;
56
+ }
57
+
37
58
  /** LLM usage event — one per provider API call. */
38
59
  export interface LlmUsageTelemetryEvent extends TelemetryEventBase {
39
60
  type: "llm_usage";
@@ -225,10 +246,54 @@ export interface AuthFallbackTelemetryEvent extends TelemetryEventBase {
225
246
  window_end: number;
226
247
  }
227
248
 
249
+ /**
250
+ * Tool-executed event — one per tool invocation. Carries NO tool
251
+ * args/inputs or result contents (customer PII per ToS) — payload sizes
252
+ * and metadata only; no raw error messages. Identity/attribution come
253
+ * from the upload envelope per the per-event-wins contract. Not to be
254
+ * confused with the since-reverted `tool_execution` permission-audit
255
+ * event, which no longer exists on the wire.
256
+ */
257
+ export interface ToolExecutedTelemetryEvent extends ModelTelemetryEventBase {
258
+ type: "tool_executed";
259
+ tool_name: string;
260
+ /**
261
+ * `"errored"` means the invocation failed at the execution layer — a
262
+ * thrown error / infra failure (audit decision `"error"`). A tool that
263
+ * runs to completion but returns an `isError` result payload still
264
+ * counts as `"fulfilled"`: it executed.
265
+ */
266
+ status: "fulfilled" | "errored";
267
+ duration_ms: number;
268
+ /** Serialized tool-argument size in bytes. Null when unknown. */
269
+ arg_bytes: number | null;
270
+ /** Serialized tool-result size in bytes. Null when unknown. */
271
+ result_bytes: number | null;
272
+ conversation_id: string | null;
273
+ }
274
+
275
+ /**
276
+ * Skill-loaded event — one per skill load. Emitted only for
277
+ * Vellum-produced skills (bundled, or managed with vellum origin).
278
+ * Metadata only — no skill output or conversation content.
279
+ */
280
+ export interface SkillLoadedTelemetryEvent extends ModelTelemetryEventBase {
281
+ type: "skill_loaded";
282
+ skill_name: string;
283
+ /**
284
+ * ISO 8601 timestamp — the catalog's `updatedAt`, effectively the
285
+ * skill version. Null when the catalog carries no timestamp.
286
+ */
287
+ skill_updated_at: string | null;
288
+ conversation_id: string | null;
289
+ }
290
+
228
291
  /** Discriminated union of all telemetry event types. */
229
292
  export type TelemetryEvent =
230
293
  | LlmUsageTelemetryEvent
231
294
  | TurnTelemetryEvent
232
295
  | LifecycleTelemetryEvent
233
296
  | OnboardingTelemetryEvent
234
- | AuthFallbackTelemetryEvent;
297
+ | AuthFallbackTelemetryEvent
298
+ | ToolExecutedTelemetryEvent
299
+ | SkillLoadedTelemetryEvent;