@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
@@ -0,0 +1,351 @@
1
+ /**
2
+ * Coverage for the turn-scoped overflow-recovery state machine that lives on
3
+ * `ContextWindowManager.reduceOverflowOneRung`. The manager holds the reducer
4
+ * state across the successive rung calls of a single turn, derives the
5
+ * compaction target from its own preflight budget corrected by the provider's
6
+ * actual token count, and starts a fresh ladder once the turn boundary resets
7
+ * it. `reduceContextOverflow` is mocked so these tests pin the manager's own
8
+ * orchestration without exercising the full reduction ladder.
9
+ */
10
+ import { beforeEach, describe, expect, mock, test } from "bun:test";
11
+
12
+ function makeLoggerStub(): Record<string, unknown> {
13
+ const stub: Record<string, unknown> = {};
14
+ for (const m of [
15
+ "info",
16
+ "warn",
17
+ "error",
18
+ "debug",
19
+ "trace",
20
+ "fatal",
21
+ "silent",
22
+ "child",
23
+ ]) {
24
+ stub[m] = m === "child" ? () => makeLoggerStub() : () => {};
25
+ }
26
+ return stub;
27
+ }
28
+
29
+ mock.module("../util/logger.js", () => ({
30
+ getLogger: () => makeLoggerStub(),
31
+ }));
32
+
33
+ // ── Module-level mock state ───────────────────────────────────────────
34
+ // The reducer call is captured so tests can assert which state and config the
35
+ // manager fed in; the returned step is seeded per call so tests can drive the
36
+ // ladder forward across rungs.
37
+
38
+ interface ReducerState {
39
+ appliedTiers: string[];
40
+ injectionMode: string;
41
+ exhausted: boolean;
42
+ }
43
+
44
+ interface ReducerStepResult {
45
+ messages: unknown;
46
+ tier: string;
47
+ state: ReducerState;
48
+ estimatedTokens: number;
49
+ }
50
+
51
+ let reduceCalls: Array<{
52
+ messages: unknown;
53
+ config: Record<string, unknown>;
54
+ state: ReducerState | undefined;
55
+ }> = [];
56
+ let reduceSteps: ReducerStepResult[] = [];
57
+
58
+ const estimateReturns: number[] = [];
59
+
60
+ mock.module("../context/token-estimator.js", () => ({
61
+ estimatePromptTokens: (): number => {
62
+ const next = estimateReturns.shift();
63
+ if (next === undefined) {
64
+ throw new Error(
65
+ "estimatePromptTokens called more times than estimateReturns seeded",
66
+ );
67
+ }
68
+ return next;
69
+ },
70
+ // Deterministic per-tool budget so tests can assert the manager fed the
71
+ // turn's resolved tool set (not the constructor-time snapshot) into the
72
+ // overflow estimate.
73
+ estimateToolsTokens: (tools: unknown[]): number => tools.length * 1_000,
74
+ }));
75
+
76
+ mock.module(
77
+ "../plugins/defaults/compaction/context-overflow-reducer.js",
78
+ () => ({
79
+ createInitialReducerState: (): ReducerState => ({
80
+ appliedTiers: [],
81
+ injectionMode: "full",
82
+ exhausted: false,
83
+ }),
84
+ reduceContextOverflow: async (
85
+ messages: unknown,
86
+ config: Record<string, unknown>,
87
+ state: ReducerState | undefined,
88
+ ): Promise<ReducerStepResult> => {
89
+ reduceCalls.push({ messages, config, state });
90
+ const idx = reduceCalls.length - 1;
91
+ const step = reduceSteps[idx];
92
+ if (!step) {
93
+ throw new Error(
94
+ `Mock reducer called ${reduceCalls.length} time(s) but only ${reduceSteps.length} step(s) seeded`,
95
+ );
96
+ }
97
+ return step;
98
+ },
99
+ }),
100
+ );
101
+
102
+ import { ContextWindowManager } from "../plugins/defaults/compaction/window-manager.js";
103
+ import type { Message, Provider, ToolDefinition } from "../providers/types.js";
104
+
105
+ function makeProvider(): Provider {
106
+ return {
107
+ name: "mock-provider",
108
+ sendMessage: async () => ({
109
+ content: [],
110
+ model: "mock-model",
111
+ usage: { inputTokens: 0, outputTokens: 0 },
112
+ stopReason: "end_turn",
113
+ }),
114
+ };
115
+ }
116
+
117
+ function makeMessages(count: number): Message[] {
118
+ const messages: Message[] = [];
119
+ for (let i = 0; i < count; i++) {
120
+ messages.push({
121
+ role: i % 2 === 0 ? "user" : "assistant",
122
+ content: [{ type: "text", text: `msg ${i}` }],
123
+ });
124
+ }
125
+ return messages;
126
+ }
127
+
128
+ function makeConfig(maxAttempts: number = 3) {
129
+ return {
130
+ enabled: true,
131
+ maxInputTokens: 200_000,
132
+ targetBudgetRatio: 0.3,
133
+ compactThreshold: 0.8,
134
+ summaryBudgetRatio: 0.05,
135
+ overflowRecovery: {
136
+ enabled: true,
137
+ safetyMarginRatio: 0.05,
138
+ maxAttempts,
139
+ interactiveLatestTurnCompression: "summarize" as const,
140
+ nonInteractiveLatestTurnCompression: "summarize" as const,
141
+ },
142
+ };
143
+ }
144
+
145
+ function buildManager(maxAttempts: number = 3): ContextWindowManager {
146
+ return new ContextWindowManager({
147
+ provider: makeProvider(),
148
+ systemPrompt: "you are a test assistant",
149
+ config: makeConfig(maxAttempts),
150
+ conversationId: "conv-test",
151
+ });
152
+ }
153
+
154
+ function makeStep(
155
+ appliedTiers: string[],
156
+ exhausted: boolean = false,
157
+ ): ReducerStepResult {
158
+ return {
159
+ messages: makeMessages(2),
160
+ tier: appliedTiers[appliedTiers.length - 1] ?? "emergency_compaction",
161
+ state: { appliedTiers, injectionMode: "full", exhausted },
162
+ estimatedTokens: 100_000,
163
+ };
164
+ }
165
+
166
+ describe("ContextWindowManager.reduceOverflowOneRung", () => {
167
+ beforeEach(() => {
168
+ reduceCalls = [];
169
+ reduceSteps = [];
170
+ estimateReturns.length = 0;
171
+ });
172
+
173
+ test("holds reducer state across rungs within a turn", async () => {
174
+ // GIVEN a manager and a reducer that advances the ladder one rung per call
175
+ estimateReturns.push(240_000, 240_000);
176
+ reduceSteps = [
177
+ makeStep(["emergency_compaction"]),
178
+ makeStep(["emergency_compaction", "forced_compaction"]),
179
+ ];
180
+ const manager = buildManager();
181
+
182
+ // WHEN two rungs run within the same turn
183
+ await manager.reduceOverflowOneRung(makeMessages(10), {
184
+ actualTokens: null,
185
+ allowAutoCompressLatestTurn: false,
186
+ });
187
+ await manager.reduceOverflowOneRung(makeMessages(10), {
188
+ actualTokens: null,
189
+ allowAutoCompressLatestTurn: false,
190
+ });
191
+
192
+ // THEN the first call seeds an empty ladder
193
+ expect(reduceCalls).toHaveLength(2);
194
+ expect(reduceCalls[0]?.state?.appliedTiers).toEqual([]);
195
+ // AND the second call carries the first rung's state forward
196
+ expect(reduceCalls[1]?.state?.appliedTiers).toEqual([
197
+ "emergency_compaction",
198
+ ]);
199
+ });
200
+
201
+ test("reuses the first rung's corrected target across the turn's later rungs", async () => {
202
+ // GIVEN the provider rejected at 480k while the estimator counted 240k, and
203
+ // only one estimate is seeded so a second estimate call would throw
204
+ estimateReturns.push(240_000);
205
+ reduceSteps = [
206
+ makeStep(["emergency_compaction"]),
207
+ makeStep(["emergency_compaction", "forced_compaction"]),
208
+ ];
209
+ const manager = buildManager();
210
+
211
+ // WHEN two rungs run within the same turn with the provider's actual count
212
+ await manager.reduceOverflowOneRung(makeMessages(10), {
213
+ actualTokens: 480_000,
214
+ allowAutoCompressLatestTurn: false,
215
+ });
216
+ await manager.reduceOverflowOneRung(makeMessages(4), {
217
+ actualTokens: 480_000,
218
+ allowAutoCompressLatestTurn: false,
219
+ });
220
+
221
+ // THEN the corrected target (190k preflight / 2x error ratio) is computed
222
+ // once and reused, rather than re-derived against the shrunk prompt
223
+ expect(reduceCalls[0]?.config.targetTokens).toBe(95_000);
224
+ expect(reduceCalls[1]?.config.targetTokens).toBe(95_000);
225
+ expect(reduceCalls[0]?.config.previousEstimatedInputTokens).toBe(240_000);
226
+ expect(reduceCalls[1]?.config.previousEstimatedInputTokens).toBe(240_000);
227
+ });
228
+
229
+ test("resetOverflowRecovery starts a fresh ladder", async () => {
230
+ // GIVEN a manager whose ladder has already advanced one rung
231
+ estimateReturns.push(240_000, 240_000);
232
+ reduceSteps = [
233
+ makeStep(["emergency_compaction"]),
234
+ makeStep(["emergency_compaction"]),
235
+ ];
236
+ const manager = buildManager();
237
+ await manager.reduceOverflowOneRung(makeMessages(10), {
238
+ actualTokens: null,
239
+ allowAutoCompressLatestTurn: false,
240
+ });
241
+
242
+ // WHEN the turn boundary resets recovery and a new rung runs
243
+ manager.resetOverflowRecovery();
244
+ await manager.reduceOverflowOneRung(makeMessages(10), {
245
+ actualTokens: null,
246
+ allowAutoCompressLatestTurn: false,
247
+ });
248
+
249
+ // THEN the post-reset call seeds an empty ladder again
250
+ expect(reduceCalls[1]?.state?.appliedTiers).toEqual([]);
251
+ });
252
+
253
+ test("corrected target lowers below preflight when the provider under-counted", async () => {
254
+ // GIVEN the provider rejected at 480k while the estimator counted 240k
255
+ estimateReturns.push(240_000);
256
+ reduceSteps = [makeStep(["emergency_compaction"])];
257
+ const manager = buildManager();
258
+
259
+ // WHEN a rung runs with the provider's actual token count
260
+ await manager.reduceOverflowOneRung(makeMessages(10), {
261
+ actualTokens: 480_000,
262
+ allowAutoCompressLatestTurn: false,
263
+ });
264
+
265
+ // THEN the target is the preflight budget (200k * 0.95 = 190k) divided by
266
+ // the 2x estimation-error ratio
267
+ expect(reduceCalls[0]?.config.targetTokens).toBe(95_000);
268
+ });
269
+
270
+ test("estimates against the turn's resolved tool set, not the constructor snapshot", async () => {
271
+ // GIVEN a manager whose live tool set (3 tools) differs from the stale
272
+ // constructor-time budget snapshot
273
+ estimateReturns.push(240_000);
274
+ reduceSteps = [makeStep(["emergency_compaction"])];
275
+ const resolvedTools = [
276
+ { name: "a" },
277
+ { name: "b" },
278
+ { name: "c" },
279
+ ] as unknown as ToolDefinition[];
280
+ const manager = new ContextWindowManager({
281
+ provider: makeProvider(),
282
+ systemPrompt: "you are a test assistant",
283
+ config: makeConfig(),
284
+ conversationId: "conv-test",
285
+ toolTokenBudget: 50,
286
+ resolveTools: () => resolvedTools,
287
+ });
288
+
289
+ // WHEN a rung runs
290
+ await manager.reduceOverflowOneRung(makeMessages(10), {
291
+ actualTokens: null,
292
+ allowAutoCompressLatestTurn: false,
293
+ });
294
+
295
+ // THEN the reducer is fed the resolved tool budget (3 tools * 1k) rather
296
+ // than the constructor snapshot (50)
297
+ expect(reduceCalls[0]?.config.toolTokenBudget).toBe(3_000);
298
+ });
299
+
300
+ test("target is the full preflight budget when the actual count is unknown", async () => {
301
+ // GIVEN no provider-reported actual token count
302
+ estimateReturns.push(240_000);
303
+ reduceSteps = [makeStep(["emergency_compaction"])];
304
+ const manager = buildManager();
305
+
306
+ // WHEN a rung runs
307
+ await manager.reduceOverflowOneRung(makeMessages(10), {
308
+ actualTokens: null,
309
+ allowAutoCompressLatestTurn: false,
310
+ });
311
+
312
+ // THEN the target is the uncorrected preflight budget (200k * 0.95)
313
+ expect(reduceCalls[0]?.config.targetTokens).toBe(190_000);
314
+ });
315
+
316
+ test("long histories widen the safety margin", async () => {
317
+ // GIVEN a history longer than the 50-message threshold
318
+ estimateReturns.push(240_000);
319
+ reduceSteps = [makeStep(["emergency_compaction"])];
320
+ const manager = buildManager();
321
+
322
+ // WHEN a rung runs over 60 messages with no actual-token correction
323
+ await manager.reduceOverflowOneRung(makeMessages(60), {
324
+ actualTokens: null,
325
+ allowAutoCompressLatestTurn: false,
326
+ });
327
+
328
+ // THEN the safety margin bumps to 0.15 → preflight budget 200k * 0.85
329
+ expect(reduceCalls[0]?.config.targetTokens).toBe(170_000);
330
+ });
331
+
332
+ test("forwards the policy auto-compress permission to the ladder", async () => {
333
+ // GIVEN the overflow policy permits the terminal auto-compress rung
334
+ estimateReturns.push(240_000);
335
+ reduceSteps = [makeStep(["emergency_compaction"])];
336
+ const manager = buildManager();
337
+
338
+ // WHEN a rung runs
339
+ await manager.reduceOverflowOneRung(makeMessages(10), {
340
+ actualTokens: null,
341
+ allowAutoCompressLatestTurn: true,
342
+ overrideProfile: "fast",
343
+ });
344
+
345
+ // THEN the manager passes the policy decision and profile through to the
346
+ // reducer config alongside the budget it owns
347
+ expect(reduceCalls[0]?.config.allowAutoCompressLatestTurn).toBe(true);
348
+ expect(reduceCalls[0]?.config.overrideProfile).toBe("fast");
349
+ expect(reduceCalls[0]?.config.maxMiddleTierAttempts).toBe(3);
350
+ });
351
+ });
@@ -177,6 +177,7 @@ mock.module("../plugins/defaults/compaction/window-manager.js", () => ({
177
177
  async maybeCompact() {
178
178
  return { compacted: false };
179
179
  }
180
+ resetOverflowRecovery() {}
180
181
  },
181
182
  createContextSummaryMessage: () => ({
182
183
  role: "user",
@@ -273,7 +274,6 @@ mock.module("../agent/loop.js", () => ({
273
274
  return {
274
275
  history,
275
276
  exitReason: null,
276
- appendedNewMessages: true,
277
277
  newMessages: history.slice(messages.length),
278
278
  };
279
279
  }
@@ -123,7 +123,7 @@ mock.module(
123
123
  }),
124
124
  );
125
125
 
126
- mock.module("../daemon/context-overflow-policy.js", () => ({
126
+ mock.module("../plugins/defaults/compaction/overflow-policy.js", () => ({
127
127
  resolveOverflowAction: () => "fail_gracefully",
128
128
  }));
129
129
 
@@ -264,6 +264,7 @@ mock.module("../plugins/defaults/history-repair/terminal.js", () => ({
264
264
  },
265
265
  }),
266
266
  deepRepairHistory: (msgs: Message[]) => ({ messages: msgs, stats: {} }),
267
+ isRepairableOrderingError: () => false,
267
268
  }));
268
269
 
269
270
  mock.module("../daemon/conversation-usage.js", () => ({
@@ -331,10 +332,6 @@ mock.module("../daemon/conversation-error.js", () => ({
331
332
  isContextTooLarge: () => false,
332
333
  }));
333
334
 
334
- mock.module("../daemon/conversation-slash.js", () => ({
335
- isProviderOrderingError: () => false,
336
- }));
337
-
338
335
  mock.module("../util/truncate.js", () => ({
339
336
  truncate: (s: string) => s,
340
337
  }));
@@ -435,6 +432,17 @@ function makeCtx(
435
432
  updateConfig: () => {},
436
433
  shouldCompact: () => ({ needed: false, estimatedTokens: 0 }),
437
434
  maybeCompact: async () => ({ compacted: false }),
435
+ resetOverflowRecovery: () => {},
436
+ reduceOverflowOneRung: async (msgs: Message[]) => ({
437
+ messages: msgs,
438
+ tier: "forced_compaction",
439
+ state: {
440
+ appliedTiers: ["forced_compaction"],
441
+ injectionMode: "full",
442
+ exhausted: true,
443
+ },
444
+ estimatedTokens: 1000,
445
+ }),
438
446
  } as unknown as Conversation["contextWindowManager"],
439
447
  contextCompactedMessageCount: 0,
440
448
  contextCompactedAt: null,