@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
@@ -18,8 +18,13 @@
18
18
  import type { ManageSecureCommandTool } from "@vellumai/service-contracts/rpc";
19
19
 
20
20
  import { RiskLevel } from "../../permissions/types.js";
21
+ import { getCesClient } from "../../security/secure-keys.js";
21
22
  import { getLogger } from "../../util/logger.js";
22
- import type { ToolContext, ToolDefinition, ToolExecutionResult } from "../types.js";
23
+ import type {
24
+ ToolContext,
25
+ ToolDefinition,
26
+ ToolExecutionResult,
27
+ } from "../types.js";
23
28
 
24
29
  const log = getLogger("ces-tool:manage-secure-command-tool");
25
30
 
@@ -34,211 +39,211 @@ class ManageSecureCommandToolImpl implements ToolDefinition {
34
39
  defaultRiskLevel = RiskLevel.High;
35
40
 
36
41
  input_schema = {
42
+ type: "object",
43
+ properties: {
44
+ action: {
45
+ type: "string",
46
+ enum: ["register", "unregister"],
47
+ description:
48
+ 'Whether to install/update ("register") or remove ("unregister") the secure command tool.',
49
+ },
50
+ toolName: {
51
+ type: "string",
52
+ description:
53
+ "Unique tool name for the secure command (e.g. aws-cli, kubectl).",
54
+ },
55
+ bundleId: {
56
+ type: "string",
57
+ description:
58
+ "Bundle identifier for the secure command package (required for register).",
59
+ },
60
+ version: {
61
+ type: "string",
62
+ description:
63
+ "Semantic version of the bundle to install (required for register).",
64
+ },
65
+ sourceUrl: {
66
+ type: "string",
67
+ description:
68
+ "URL from which CES will download the bundle (required for register). Must be HTTPS.",
69
+ },
70
+ sha256: {
71
+ type: "string",
72
+ description:
73
+ "SHA-256 hash of the bundle for integrity verification (required for register).",
74
+ },
75
+ credentialHandle: {
76
+ type: "string",
77
+ description:
78
+ "CES credential handle the tool should use (required for register).",
79
+ },
80
+ description: {
81
+ type: "string",
82
+ description:
83
+ "Human-readable description of what the secure command tool does (required for register).",
84
+ },
85
+ secureCommandManifest: {
37
86
  type: "object",
87
+ description:
88
+ "Full secure command manifest for the bundle (required for register). " +
89
+ "Contains entrypoint, command profiles, auth adapter, egress mode, etc. " +
90
+ "CES validates this manifest before publishing the bundle.",
38
91
  properties: {
39
- action: {
92
+ schemaVersion: {
40
93
  type: "string",
41
- enum: ["register", "unregister"],
42
- description:
43
- 'Whether to install/update ("register") or remove ("unregister") the secure command tool.',
94
+ description: 'Manifest schema version. Must be "1".',
44
95
  },
45
- toolName: {
96
+ bundleDigest: {
46
97
  type: "string",
47
- description:
48
- "Unique tool name for the secure command (e.g. aws-cli, kubectl).",
98
+ description: "SHA-256 hex digest of the command bundle.",
49
99
  },
50
100
  bundleId: {
51
101
  type: "string",
52
- description:
53
- "Bundle identifier for the secure command package (required for register).",
102
+ description: "Unique identifier for the command bundle.",
54
103
  },
55
104
  version: {
56
105
  type: "string",
57
- description:
58
- "Semantic version of the bundle to install (required for register).",
59
- },
60
- sourceUrl: {
61
- type: "string",
62
- description:
63
- "URL from which CES will download the bundle (required for register). Must be HTTPS.",
64
- },
65
- sha256: {
66
- type: "string",
67
- description:
68
- "SHA-256 hash of the bundle for integrity verification (required for register).",
106
+ description: "Semantic version of the bundle.",
69
107
  },
70
- credentialHandle: {
108
+ entrypoint: {
71
109
  type: "string",
72
110
  description:
73
- "CES credential handle the tool should use (required for register).",
111
+ 'Path to the executable entrypoint within the bundle (e.g. "bin/gh").',
74
112
  },
75
- description: {
76
- type: "string",
113
+ commandProfiles: {
114
+ type: "object",
77
115
  description:
78
- "Human-readable description of what the secure command tool does (required for register).",
116
+ "Named command profiles. Each profile defines a narrow execution boundary.",
117
+ additionalProperties: {
118
+ type: "object",
119
+ properties: {
120
+ description: { type: "string" },
121
+ allowedArgvPatterns: {
122
+ type: "array",
123
+ items: {
124
+ type: "object",
125
+ properties: {
126
+ name: { type: "string" },
127
+ tokens: {
128
+ type: "array",
129
+ items: { type: "string" },
130
+ },
131
+ },
132
+ required: ["name", "tokens"],
133
+ },
134
+ },
135
+ deniedSubcommands: {
136
+ type: "array",
137
+ items: { type: "string" },
138
+ },
139
+ deniedFlags: {
140
+ type: "array",
141
+ items: { type: "string" },
142
+ },
143
+ allowedNetworkTargets: {
144
+ type: "array",
145
+ items: {
146
+ type: "object",
147
+ properties: {
148
+ hostPattern: { type: "string" },
149
+ ports: {
150
+ type: "array",
151
+ items: { type: "number" },
152
+ },
153
+ protocols: {
154
+ type: "array",
155
+ items: { type: "string" },
156
+ },
157
+ },
158
+ required: ["hostPattern"],
159
+ },
160
+ },
161
+ },
162
+ required: [
163
+ "description",
164
+ "allowedArgvPatterns",
165
+ "deniedSubcommands",
166
+ ],
167
+ },
79
168
  },
80
- secureCommandManifest: {
169
+ authAdapter: {
81
170
  type: "object",
82
171
  description:
83
- "Full secure command manifest for the bundle (required for register). " +
84
- "Contains entrypoint, command profiles, auth adapter, egress mode, etc. " +
85
- "CES validates this manifest before publishing the bundle.",
172
+ "Auth adapter configuration describing how credentials are injected. " +
173
+ "Use type=env_var to set an environment variable, type=temp_file to write " +
174
+ "credentials to a temporary file, or type=credential_process to run a helper command.",
86
175
  properties: {
87
- schemaVersion: {
176
+ type: {
88
177
  type: "string",
89
- description: 'Manifest schema version. Must be "1".',
90
- },
91
- bundleDigest: {
92
- type: "string",
93
- description: "SHA-256 hex digest of the command bundle.",
94
- },
95
- bundleId: {
96
- type: "string",
97
- description: "Unique identifier for the command bundle.",
178
+ enum: ["env_var", "temp_file", "credential_process"],
179
+ description:
180
+ "Adapter type: env_var, temp_file, or credential_process.",
98
181
  },
99
- version: {
182
+ envVarName: {
100
183
  type: "string",
101
- description: "Semantic version of the bundle.",
184
+ description:
185
+ "Environment variable name for credential injection (required for all types).",
102
186
  },
103
- entrypoint: {
187
+ valuePrefix: {
104
188
  type: "string",
105
189
  description:
106
- 'Path to the executable entrypoint within the bundle (e.g. "bin/gh").',
190
+ 'Optional prefix prepended to the credential value (env_var only, e.g. "Bearer ").',
107
191
  },
108
- commandProfiles: {
109
- type: "object",
192
+ fileExtension: {
193
+ type: "string",
110
194
  description:
111
- "Named command profiles. Each profile defines a narrow execution boundary.",
112
- additionalProperties: {
113
- type: "object",
114
- properties: {
115
- description: { type: "string" },
116
- allowedArgvPatterns: {
117
- type: "array",
118
- items: {
119
- type: "object",
120
- properties: {
121
- name: { type: "string" },
122
- tokens: {
123
- type: "array",
124
- items: { type: "string" },
125
- },
126
- },
127
- required: ["name", "tokens"],
128
- },
129
- },
130
- deniedSubcommands: {
131
- type: "array",
132
- items: { type: "string" },
133
- },
134
- deniedFlags: {
135
- type: "array",
136
- items: { type: "string" },
137
- },
138
- allowedNetworkTargets: {
139
- type: "array",
140
- items: {
141
- type: "object",
142
- properties: {
143
- hostPattern: { type: "string" },
144
- ports: {
145
- type: "array",
146
- items: { type: "number" },
147
- },
148
- protocols: {
149
- type: "array",
150
- items: { type: "string" },
151
- },
152
- },
153
- required: ["hostPattern"],
154
- },
155
- },
156
- },
157
- required: [
158
- "description",
159
- "allowedArgvPatterns",
160
- "deniedSubcommands",
161
- ],
162
- },
195
+ 'Optional file extension for the temp file (temp_file only, e.g. ".json").',
163
196
  },
164
- authAdapter: {
165
- type: "object",
197
+ fileMode: {
198
+ type: "number",
166
199
  description:
167
- "Auth adapter configuration describing how credentials are injected. " +
168
- "Use type=env_var to set an environment variable, type=temp_file to write " +
169
- "credentials to a temporary file, or type=credential_process to run a helper command.",
170
- properties: {
171
- type: {
172
- type: "string",
173
- enum: ["env_var", "temp_file", "credential_process"],
174
- description:
175
- "Adapter type: env_var, temp_file, or credential_process.",
176
- },
177
- envVarName: {
178
- type: "string",
179
- description:
180
- "Environment variable name for credential injection (required for all types).",
181
- },
182
- valuePrefix: {
183
- type: "string",
184
- description:
185
- 'Optional prefix prepended to the credential value (env_var only, e.g. "Bearer ").',
186
- },
187
- fileExtension: {
188
- type: "string",
189
- description:
190
- 'Optional file extension for the temp file (temp_file only, e.g. ".json").',
191
- },
192
- fileMode: {
193
- type: "number",
194
- description:
195
- "Optional file mode/permissions for the temp file (temp_file only, e.g. 0o600).",
196
- },
197
- helperCommand: {
198
- type: "string",
199
- description:
200
- "Command to run to obtain credentials (credential_process only, required for that type).",
201
- },
202
- timeoutMs: {
203
- type: "number",
204
- description:
205
- "Timeout in milliseconds for the helper command (credential_process only).",
206
- },
207
- },
208
- required: ["type", "envVarName"],
200
+ "Optional file mode/permissions for the temp file (temp_file only, e.g. 0o600).",
209
201
  },
210
- egressMode: {
202
+ helperCommand: {
211
203
  type: "string",
212
- enum: ["proxy_required", "no_network"],
213
- description: "Network egress enforcement mode.",
204
+ description:
205
+ "Command to run to obtain credentials (credential_process only, required for that type).",
214
206
  },
215
- cleanConfigDirs: {
216
- type: "object",
207
+ timeoutMs: {
208
+ type: "number",
217
209
  description:
218
- "Config directories to mount as empty tmpfs during execution.",
219
- additionalProperties: { type: "string" },
210
+ "Timeout in milliseconds for the helper command (credential_process only).",
220
211
  },
221
212
  },
222
- required: [
223
- "schemaVersion",
224
- "bundleDigest",
225
- "bundleId",
226
- "version",
227
- "entrypoint",
228
- "commandProfiles",
229
- "authAdapter",
230
- "egressMode",
231
- ],
213
+ required: ["type", "envVarName"],
214
+ },
215
+ egressMode: {
216
+ type: "string",
217
+ enum: ["proxy_required", "no_network"],
218
+ description: "Network egress enforcement mode.",
219
+ },
220
+ cleanConfigDirs: {
221
+ type: "object",
222
+ description:
223
+ "Config directories to mount as empty tmpfs during execution.",
224
+ additionalProperties: { type: "string" },
232
225
  },
233
226
  },
234
- required: ["action", "toolName"],
235
- };
227
+ required: [
228
+ "schemaVersion",
229
+ "bundleDigest",
230
+ "bundleId",
231
+ "version",
232
+ "entrypoint",
233
+ "commandProfiles",
234
+ "authAdapter",
235
+ "egressMode",
236
+ ],
237
+ },
238
+ },
239
+ required: ["action", "toolName"],
240
+ };
236
241
 
237
242
  async execute(
238
243
  input: Record<string, unknown>,
239
- context: ToolContext,
244
+ _context: ToolContext,
240
245
  ): Promise<ToolExecutionResult> {
241
- const cesClient = context.cesClient;
246
+ const cesClient = getCesClient();
242
247
  if (!cesClient) {
243
248
  return {
244
249
  content:
@@ -16,6 +16,7 @@ import {
16
16
  } from "@vellumai/service-contracts/credential-rpc";
17
17
 
18
18
  import { RiskLevel } from "../../permissions/types.js";
19
+ import { getCesClient } from "../../security/secure-keys.js";
19
20
  import { getLogger } from "../../util/logger.js";
20
21
  import type {
21
22
  ToolContext,
@@ -106,7 +107,7 @@ export const runAuthenticatedCommandTool = {
106
107
  input: Record<string, unknown>,
107
108
  context: ToolContext,
108
109
  ): Promise<ToolExecutionResult> {
109
- const cesClient = context.cesClient;
110
+ const cesClient = getCesClient();
110
111
  if (!cesClient) {
111
112
  return {
112
113
  content:
@@ -7,6 +7,7 @@ import { PermissionPrompter } from "../permissions/prompter.js";
7
7
  import { RiskLevel } from "../permissions/types.js";
8
8
  import { isUntrustedTrustClass } from "../runtime/actor-trust-resolver.js";
9
9
  import { redactSensitiveFields } from "../security/redaction.js";
10
+ import { getCesClient } from "../security/secure-keys.js";
10
11
  import { TokenExpiredError } from "../security/token-manager.js";
11
12
  import { PermissionDeniedError, ToolError } from "../util/errors.js";
12
13
  import { pathExists, safeStatSync } from "../util/fs.js";
@@ -21,10 +22,11 @@ import { sandboxPolicy } from "./shared/filesystem/path-policy.js";
21
22
  import { MAX_FILE_SIZE_BYTES } from "./shared/filesystem/size-guard.js";
22
23
  import { ToolApprovalHandler } from "./tool-approval-handler.js";
23
24
  import { resolveToolInvocationAlias } from "./tool-name-aliases.js";
24
- import type {
25
- ToolContext,
26
- ToolExecutionResult,
27
- ToolLifecycleEvent,
25
+ import {
26
+ stringifyToolInput,
27
+ type ToolContext,
28
+ type ToolExecutionResult,
29
+ type ToolLifecycleEvent,
28
30
  } from "./types.js";
29
31
 
30
32
  const log = getLogger("tool-executor");
@@ -207,7 +209,8 @@ export class ToolExecutor {
207
209
  // indicator, present the proposal to the guardian via the existing
208
210
  // confirmation transport, commit the decision to CES, and retry
209
211
  // the original tool invocation with the granted grantId.
210
- if (execResult.cesApprovalRequired && !context.cesClient) {
212
+ const cesClient = getCesClient();
213
+ if (execResult.cesApprovalRequired && !cesClient) {
211
214
  const msg = `CES approval required for "${name}" but no CES client is available. Ensure the Credential Execution Service is running.`;
212
215
  const durationMs = Date.now() - startTime;
213
216
  emitLifecycleEvent(context, {
@@ -228,11 +231,11 @@ export class ToolExecutor {
228
231
  });
229
232
  return { content: msg, isError: true };
230
233
  }
231
- if (execResult.cesApprovalRequired && context.cesClient) {
234
+ if (execResult.cesApprovalRequired && cesClient) {
232
235
  const bridgeResult = await bridgeCesApproval(
233
236
  execResult.cesApprovalRequired,
234
237
  this.prompter,
235
- context.cesClient,
238
+ cesClient,
236
239
  {
237
240
  isInteractive: context.isInteractive,
238
241
  conversationId: context.conversationId,
@@ -308,6 +311,15 @@ export class ToolExecutor {
308
311
  }
309
312
  }
310
313
 
314
+ // Sized from the RAW pre-sanitization result — sensitive-output
315
+ // extraction below strips directives and swaps raw values for
316
+ // placeholders, which changes the content length, and telemetry must
317
+ // report the true payload size. Only the size leaves the device,
318
+ // never the payload. Stamped here (not centrally in
319
+ // emitLifecycleEvent) because only this site sees the content before
320
+ // extractAndSanitize() rewrites it.
321
+ const rawResultBytes = Buffer.byteLength(execResult.content, "utf8");
322
+
311
323
  // Sensitive output extraction: strip directives, replace raw values
312
324
  // with placeholders, and attach bindings for agent-loop substitution.
313
325
  const { sanitizedContent, bindings } = extractAndSanitize(
@@ -339,6 +351,7 @@ export class ToolExecutor {
339
351
  decision,
340
352
  durationMs,
341
353
  result: safeResult,
354
+ resultBytes: rawResultBytes,
342
355
  });
343
356
 
344
357
  // Merge risk metadata from the classifier assessment cache onto the
@@ -491,6 +504,25 @@ function emitLifecycleEvent(
491
504
  input: sanitizeToolInput(event.toolName, event.input),
492
505
  };
493
506
 
507
+ // Stamp telemetry fields centrally so every executed/error event carries
508
+ // them — including the pre-execution gate failures (aborted, disk
509
+ // pressure, unknown/inactive tool) emitted from checkPreExecutionGates(),
510
+ // whose emission sites don't have to remember to copy them. This is the
511
+ // sole writer of both fields. (`resultBytes` is the exception: it is
512
+ // stamped at the executed emission site in executeInternal, the only
513
+ // place that sees the result content before sensitive-output extraction
514
+ // rewrites it; the spread above passes it through untouched.)
515
+ if (sanitizedEvent.type === "executed" || sanitizedEvent.type === "error") {
516
+ sanitizedEvent.attribution = context.attribution ?? null;
517
+ // Sized from the RAW pre-sanitization input — redaction changes the
518
+ // serialized length, and telemetry must report the true payload size.
519
+ // Only the size leaves the device, never the payload.
520
+ sanitizedEvent.inputBytes = Buffer.byteLength(
521
+ stringifyToolInput(event.input),
522
+ "utf8",
523
+ );
524
+ }
525
+
494
526
  try {
495
527
  const maybePromise = handler(sanitizedEvent as ToolLifecycleEvent);
496
528
  if (maybePromise) {