@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
@@ -9,11 +9,20 @@
9
9
  * messages is a no-op. Tiers are ordered so that less destructive
10
10
  * transformations are tried first.
11
11
  *
12
- * Tier progression:
13
- * 1. Forced compaction (emergency keep-boundary options)
12
+ * Rung progression:
13
+ * 0. Emergency summarize-around-last-tool-pair (preserves the most recent
14
+ * tool call/result while aggressively compressing earlier history)
15
+ * 1. Forced full-history compaction (emergency keep-boundary options)
14
16
  * 2. Aggressive tool-result text truncation across retained history
15
17
  * 3. Media/file payload stubbing (replace images/files with text stubs)
16
18
  * 4. Runtime injection downgrade to minimal mode
19
+ * terminal. Auto-compress the latest turn (policy-gated by the caller)
20
+ *
21
+ * Rungs 1–4 are the "middle tiers" and are bounded by `maxMiddleTierAttempts`.
22
+ * The emergency rung always runs first; the auto-compress rung runs last and
23
+ * only when the caller permits it. The caller invokes the reducer repeatedly,
24
+ * re-running the agent loop after each rung, until either the context fits or
25
+ * `state.exhausted` is true.
17
26
  */
18
27
 
19
28
  import type { ContextWindowConfig } from "../../../config/types.js";
@@ -29,19 +38,38 @@ import {
29
38
  } from "../../../daemon/conversation-media-retry.js";
30
39
  import type { InjectionMode } from "../../../daemon/conversation-runtime-assembly.js";
31
40
  import type { Message } from "../../../providers/types.js";
41
+ import type { TrustClass } from "../../../runtime/actor-trust-resolver.js";
42
+ import { getLogger } from "../../../util/logger.js";
43
+ import { defaultCompact, defaultEmergencyCompact } from "./compact.js";
32
44
  import type {
33
45
  ContextWindowCompactOptions,
34
46
  ContextWindowResult,
35
47
  } from "./window-manager.js";
36
48
 
49
+ const log = getLogger("context-overflow-reducer");
50
+
37
51
  /**
38
52
  * Identifies which reduction tier was applied in a given step.
39
53
  */
40
54
  export type ReducerTier =
55
+ | "emergency_compaction"
41
56
  | "forced_compaction"
42
57
  | "tool_result_truncation"
43
58
  | "media_stubbing"
44
- | "injection_downgrade";
59
+ | "injection_downgrade"
60
+ | "auto_compress_latest_turn";
61
+
62
+ /**
63
+ * The "middle tiers" — the rungs bounded by `maxMiddleTierAttempts`. The
64
+ * emergency and auto-compress rungs are intentionally excluded so they remain
65
+ * reachable regardless of how small the middle-tier budget is.
66
+ */
67
+ const MIDDLE_TIERS: readonly ReducerTier[] = [
68
+ "forced_compaction",
69
+ "tool_result_truncation",
70
+ "media_stubbing",
71
+ "injection_downgrade",
72
+ ];
45
73
 
46
74
  /**
47
75
  * Tracks the cumulative state of the reducer across successive calls.
@@ -94,18 +122,35 @@ export interface ReducerConfig {
94
122
  targetTokens: number;
95
123
  /** Pre-computed tool token budget to include in estimations. */
96
124
  toolTokenBudget?: number;
125
+ /**
126
+ * Conversation whose {@link ContextWindowManager} the compaction rungs
127
+ * resolve from the compaction store to run the summary call.
128
+ */
129
+ conversationId: string;
130
+ /** Per-conversation inference-profile override for the summary call. */
131
+ overrideProfile?: string | null;
132
+ /** Trust class of the actor whose turn triggered overflow recovery. */
133
+ actorTrustClass?: TrustClass;
134
+ /**
135
+ * The provider-reported estimate at the overflow that triggered recovery.
136
+ * Sizes the emergency summarize-around-last-tool-pair cut.
137
+ */
138
+ previousEstimatedInputTokens: number;
139
+ /**
140
+ * Maximum number of middle-tier reductions (forced compaction, tool-result
141
+ * truncation, media stubbing, injection downgrade) to apply before
142
+ * escalating to the terminal auto-compress rung. The emergency and
143
+ * auto-compress rungs are not counted against this budget.
144
+ */
145
+ maxMiddleTierAttempts: number;
146
+ /**
147
+ * Whether the terminal auto-compress-latest-turn rung is permitted. The
148
+ * caller resolves this from the overflow policy; when false, the ladder ends
149
+ * once the middle tiers are exhausted.
150
+ */
151
+ allowAutoCompressLatestTurn: boolean;
97
152
  }
98
153
 
99
- /**
100
- * Compaction callback — the reducer does not own the ContextWindowManager
101
- * instance, so the caller provides a function that performs compaction.
102
- */
103
- export type CompactFn = (
104
- messages: Message[],
105
- signal: AbortSignal | undefined,
106
- options: ContextWindowCompactOptions,
107
- ) => Promise<ContextWindowResult>;
108
-
109
154
  // Aggressive truncation cap for tool results during overflow recovery.
110
155
  // Much tighter than the normal per-result budget.
111
156
  const OVERFLOW_TOOL_RESULT_MAX_CHARS = 4_000;
@@ -121,53 +166,163 @@ export async function reduceContextOverflow(
121
166
  messages: Message[],
122
167
  config: ReducerConfig,
123
168
  state: ReducerState | undefined,
124
- compactFn: CompactFn,
125
169
  signal?: AbortSignal,
126
170
  ): Promise<ReducerStepResult> {
127
171
  const applied = state?.appliedTiers ?? [];
172
+ const step = await selectNextRung(messages, config, state, applied, signal);
128
173
 
129
- // Tier 1: forced compaction
130
- if (!applied.includes("forced_compaction")) {
131
- return applyForcedCompaction(messages, config, applied, compactFn, signal);
132
- }
174
+ // Exhaustion is decided centrally from the rungs applied so far so the last
175
+ // rung that actually runs sets `exhausted`, avoiding a wasted no-op rerun.
176
+ step.state.exhausted = isLadderExhausted(step.state.appliedTiers, config);
177
+ return step;
178
+ }
133
179
 
134
- // Tier 2: aggressive tool-result truncation
135
- if (!applied.includes("tool_result_truncation")) {
136
- return applyToolResultTruncation(messages, config, applied, state);
180
+ async function selectNextRung(
181
+ messages: Message[],
182
+ config: ReducerConfig,
183
+ state: ReducerState | undefined,
184
+ applied: ReducerTier[],
185
+ signal?: AbortSignal,
186
+ ): Promise<ReducerStepResult> {
187
+ // Rung 0: emergency summarize-around-last-tool-pair (uncounted, runs first).
188
+ if (!applied.includes("emergency_compaction")) {
189
+ return applyEmergencyCompaction(messages, config, applied, signal);
137
190
  }
138
191
 
139
- // Tier 3: media/file payload stubbing
140
- if (!applied.includes("media_stubbing")) {
141
- return applyMediaStubbing(messages, config, applied, state);
192
+ // Middle tiers (rungs 1–4), bounded by the configured attempt budget.
193
+ const middleApplied = applied.filter((t) => MIDDLE_TIERS.includes(t)).length;
194
+ if (
195
+ middleApplied < config.maxMiddleTierAttempts &&
196
+ hasUnappliedMiddleTier(applied)
197
+ ) {
198
+ if (!applied.includes("forced_compaction")) {
199
+ return applyForcedCompaction(messages, config, applied, signal);
200
+ }
201
+ if (!applied.includes("tool_result_truncation")) {
202
+ return applyToolResultTruncation(messages, config, applied, state);
203
+ }
204
+ if (!applied.includes("media_stubbing")) {
205
+ return applyMediaStubbing(messages, config, applied, state);
206
+ }
207
+ return applyInjectionDowngrade(messages, config, applied, state);
142
208
  }
143
209
 
144
- // Tier 4: injection downgrade
145
- if (!applied.includes("injection_downgrade")) {
146
- return applyInjectionDowngrade(messages, config, applied, state);
210
+ // Terminal rung: auto-compress the latest turn (uncounted, policy-gated).
211
+ if (
212
+ config.allowAutoCompressLatestTurn &&
213
+ !applied.includes("auto_compress_latest_turn")
214
+ ) {
215
+ return applyAutoCompressLatestTurn(
216
+ messages,
217
+ config,
218
+ applied,
219
+ state,
220
+ signal,
221
+ );
147
222
  }
148
223
 
149
- // All tiers exhausted
224
+ // No rung left to apply — return a no-op step. `reduceContextOverflow`
225
+ // marks it exhausted via `isLadderExhausted`.
150
226
  const estimatedTokens = estimatePromptTokens(messages, config.systemPrompt, {
151
227
  providerName: config.providerName,
152
228
  toolTokenBudget: config.toolTokenBudget,
153
229
  });
154
230
  return {
155
231
  messages,
156
- tier: "injection_downgrade",
232
+ tier: applied[applied.length - 1] ?? "forced_compaction",
157
233
  state: {
158
234
  appliedTiers: [...applied],
159
235
  injectionMode: state?.injectionMode ?? "minimal",
236
+ toolResultMaxChars: state?.toolResultMaxChars,
237
+ compactionOptions: state?.compactionOptions,
160
238
  exhausted: true,
161
239
  },
162
240
  estimatedTokens,
163
241
  };
164
242
  }
165
243
 
244
+ /** Whether any middle tier remains unapplied. */
245
+ function hasUnappliedMiddleTier(applied: ReducerTier[]): boolean {
246
+ return MIDDLE_TIERS.some((tier) => !applied.includes(tier));
247
+ }
248
+
249
+ /**
250
+ * Decide whether the ladder has nothing more to try after the given rungs.
251
+ * The terminal auto-compress rung is the last; before it, the middle tiers
252
+ * are exhausted once the attempt budget is spent or every middle tier ran.
253
+ */
254
+ function isLadderExhausted(
255
+ applied: ReducerTier[],
256
+ config: ReducerConfig,
257
+ ): boolean {
258
+ if (applied.includes("auto_compress_latest_turn")) {
259
+ return true;
260
+ }
261
+ const middleApplied = applied.filter((t) => MIDDLE_TIERS.includes(t)).length;
262
+ const middleExhausted =
263
+ middleApplied >= config.maxMiddleTierAttempts ||
264
+ !hasUnappliedMiddleTier(applied);
265
+ if (!middleExhausted) {
266
+ return false;
267
+ }
268
+ // Middle tiers are done — the ladder continues only if the terminal
269
+ // auto-compress rung is permitted and has not run yet.
270
+ return !config.allowAutoCompressLatestTurn;
271
+ }
272
+
273
+ async function applyEmergencyCompaction(
274
+ messages: Message[],
275
+ config: ReducerConfig,
276
+ applied: ReducerTier[],
277
+ signal?: AbortSignal,
278
+ ): Promise<ReducerStepResult> {
279
+ let result: ContextWindowResult | null = null;
280
+ try {
281
+ result = await defaultEmergencyCompact({
282
+ conversationId: config.conversationId,
283
+ messages,
284
+ previousEstimatedInputTokens: config.previousEstimatedInputTokens,
285
+ overrideProfile: config.overrideProfile ?? null,
286
+ signal,
287
+ });
288
+ } catch (err) {
289
+ // No tool pair to split on, an unparseable summary, or a provider error.
290
+ // Fall through to forced compaction below rather than failing recovery.
291
+ log.warn(
292
+ { err },
293
+ "Emergency mid-turn compaction failed; falling through to forced compaction",
294
+ );
295
+ }
296
+
297
+ if (result?.compacted) {
298
+ return {
299
+ messages: result.messages,
300
+ tier: "emergency_compaction",
301
+ state: {
302
+ appliedTiers: [...applied, "emergency_compaction"],
303
+ injectionMode: "full",
304
+ exhausted: false,
305
+ },
306
+ estimatedTokens: result.estimatedInputTokens,
307
+ compactionResult: result,
308
+ };
309
+ }
310
+
311
+ // Emergency compaction produced no reduction; continue straight to forced
312
+ // compaction in the same step so the caller does not waste a provider rerun
313
+ // on unchanged messages.
314
+ return applyForcedCompaction(
315
+ messages,
316
+ config,
317
+ [...applied, "emergency_compaction"],
318
+ signal,
319
+ );
320
+ }
321
+
166
322
  async function applyForcedCompaction(
167
323
  messages: Message[],
168
324
  config: ReducerConfig,
169
325
  applied: ReducerTier[],
170
- compactFn: CompactFn,
171
326
  signal?: AbortSignal,
172
327
  ): Promise<ReducerStepResult> {
173
328
  const compactionOptions: ContextWindowCompactOptions = {
@@ -175,7 +330,14 @@ async function applyForcedCompaction(
175
330
  minKeepRecentUserTurns: 0,
176
331
  };
177
332
 
178
- const result = await compactFn(messages, signal, compactionOptions);
333
+ const result = await defaultCompact({
334
+ conversationId: config.conversationId,
335
+ messages,
336
+ signal,
337
+ ...compactionOptions,
338
+ overrideProfile: config.overrideProfile ?? null,
339
+ actorTrustClass: config.actorTrustClass,
340
+ });
179
341
  const nextMessages = result.compacted ? result.messages : messages;
180
342
  const estimatedTokens = result.compacted
181
343
  ? result.estimatedInputTokens
@@ -339,12 +501,58 @@ function applyInjectionDowngrade(
339
501
  injectionMode: "minimal",
340
502
  toolResultMaxChars: prevState?.toolResultMaxChars,
341
503
  compactionOptions: prevState?.compactionOptions,
342
- exhausted: true,
504
+ exhausted: false,
343
505
  },
344
506
  estimatedTokens,
345
507
  };
346
508
  }
347
509
 
510
+ async function applyAutoCompressLatestTurn(
511
+ messages: Message[],
512
+ config: ReducerConfig,
513
+ applied: ReducerTier[],
514
+ prevState: ReducerState | undefined,
515
+ signal?: AbortSignal,
516
+ ): Promise<ReducerStepResult> {
517
+ // Force-compress the latest turn as a last resort. Shares the forced
518
+ // compaction options, but runs after the middle tiers have been spent.
519
+ const compactionOptions: ContextWindowCompactOptions = {
520
+ force: true,
521
+ minKeepRecentUserTurns: 0,
522
+ };
523
+
524
+ const result = await defaultCompact({
525
+ conversationId: config.conversationId,
526
+ messages,
527
+ signal,
528
+ ...compactionOptions,
529
+ overrideProfile: config.overrideProfile ?? null,
530
+ actorTrustClass: config.actorTrustClass,
531
+ });
532
+ const nextMessages = result.compacted ? result.messages : messages;
533
+ const estimatedTokens = result.compacted
534
+ ? result.estimatedInputTokens
535
+ : estimatePromptTokens(nextMessages, config.systemPrompt, {
536
+ providerName: config.providerName,
537
+ toolTokenBudget: config.toolTokenBudget,
538
+ });
539
+
540
+ const nextApplied: ReducerTier[] = [...applied, "auto_compress_latest_turn"];
541
+ return {
542
+ messages: nextMessages,
543
+ tier: "auto_compress_latest_turn",
544
+ state: {
545
+ appliedTiers: nextApplied,
546
+ injectionMode: prevState?.injectionMode ?? "full",
547
+ toolResultMaxChars: prevState?.toolResultMaxChars,
548
+ compactionOptions,
549
+ exhausted: false,
550
+ },
551
+ estimatedTokens,
552
+ compactionResult: result,
553
+ };
554
+ }
555
+
348
556
  /**
349
557
  * Create the initial (empty) reducer state.
350
558
  */
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Corrected compaction target for reactive context-overflow recovery.
3
+ *
4
+ * When the provider rejects a request as context-too-large, the rejection
5
+ * reveals the *actual* token count it measured (e.g. "242201 tokens > 200000").
6
+ * The local estimator that gated the call may have significantly under-counted,
7
+ * so compacting to the nominal preflight budget would still overshoot the
8
+ * provider's real limit and re-reject. Scaling the preflight budget down by the
9
+ * observed estimator error yields a target that, once the estimator re-measures
10
+ * the reduced history, lands under the provider's true ceiling.
11
+ */
12
+
13
+ /** The compaction target plus the estimator-error context used to derive it. */
14
+ export interface CorrectedOverflowTarget {
15
+ /**
16
+ * Token budget the reducer should compact below. Equal to `preflightBudget`
17
+ * when the estimator did not under-count, and lower otherwise.
18
+ */
19
+ targetTokens: number;
20
+ /**
21
+ * The provider-actual / estimator ratio when the estimator under-counted
22
+ * (> 1), otherwise `null`. Exposed so callers can log the adjustment without
23
+ * recomputing it.
24
+ */
25
+ estimationErrorRatio: number | null;
26
+ }
27
+
28
+ /**
29
+ * Compute the compaction target for an overflow rejection, lowering the
30
+ * preflight budget in proportion to how badly the estimator under-counted.
31
+ *
32
+ * @param preflightBudget The nominal target the estimator gates against.
33
+ * @param actualTokens Provider-reported token count from the rejection, or
34
+ * `null` when it could not be parsed.
35
+ * @param estimatedTokens The estimator's count for the same history at overflow.
36
+ */
37
+ export function computeCorrectedOverflowTarget(params: {
38
+ preflightBudget: number;
39
+ actualTokens: number | null;
40
+ estimatedTokens: number;
41
+ }): CorrectedOverflowTarget {
42
+ const { preflightBudget, actualTokens, estimatedTokens } = params;
43
+ if (actualTokens != null && actualTokens > 0 && estimatedTokens > 0) {
44
+ const estimationErrorRatio = actualTokens / estimatedTokens;
45
+ if (estimationErrorRatio > 1.0) {
46
+ return {
47
+ targetTokens: Math.floor(preflightBudget / estimationErrorRatio),
48
+ estimationErrorRatio,
49
+ };
50
+ }
51
+ }
52
+ return { targetTokens: preflightBudget, estimationErrorRatio: null };
53
+ }
@@ -1,4 +1,4 @@
1
- import type { ContextOverflowRecoveryConfig } from "../config/schemas/inference.js";
1
+ import type { ContextOverflowRecoveryConfig } from "../../../config/schemas/inference.js";
2
2
 
3
3
  /**
4
4
  * Actions the overflow recovery loop can take when the context window is