@vellumai/assistant 0.8.8 → 0.8.9-dev.202606091853.fbaa2ae

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 (475) hide show
  1. package/ARCHITECTURE.md +6 -6
  2. package/bun.lock +2 -2
  3. package/docs/activation-funnel-telemetry.md +310 -0
  4. package/examples/plugins/echo/README.md +61 -60
  5. package/examples/plugins/echo/hooks/post-tool-use.ts +18 -0
  6. package/examples/plugins/echo/hooks/stop.ts +16 -0
  7. package/examples/plugins/echo/hooks/user-prompt-submit.ts +18 -0
  8. package/examples/plugins/echo/package.json +1 -2
  9. package/examples/plugins/echo/src/emit.ts +19 -0
  10. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +7 -6
  11. package/openapi.yaml +263 -121
  12. package/package.json +2 -2
  13. package/src/__tests__/activation-early-marking.test.ts +120 -0
  14. package/src/__tests__/agent-loop-callsite-precedence.test.ts +69 -14
  15. package/src/__tests__/agent-loop-exit-reason.test.ts +204 -144
  16. package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +50 -35
  17. package/src/__tests__/agent-loop-output-hooks.test.ts +357 -0
  18. package/src/__tests__/agent-loop-override-profile.test.ts +25 -6
  19. package/src/__tests__/agent-loop-provider-error-recording.test.ts +41 -21
  20. package/src/__tests__/agent-loop-thinking.test.ts +36 -20
  21. package/src/__tests__/agent-loop.test.ts +441 -96
  22. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +14 -14
  23. package/src/__tests__/agent-wake-override-profile.test.ts +17 -21
  24. package/src/__tests__/anthropic-provider.test.ts +23 -8
  25. package/src/__tests__/app-builder-tool-scripts.test.ts +21 -0
  26. package/src/__tests__/app-control-flow.test.ts +1 -1
  27. package/src/__tests__/app-dir-path-guard.test.ts +1 -0
  28. package/src/__tests__/app-executors.test.ts +132 -0
  29. package/src/__tests__/approval-cascade.test.ts +6 -5
  30. package/src/__tests__/approval-routes-http.test.ts +4 -1
  31. package/src/__tests__/background-workers-disk-pressure.test.ts +1 -1
  32. package/src/__tests__/channel-approval-routes.test.ts +1 -1
  33. package/src/__tests__/channel-approvals.test.ts +1 -1
  34. package/src/__tests__/compaction-circuit.test.ts +258 -0
  35. package/src/__tests__/compaction-direct.test.ts +146 -0
  36. package/src/__tests__/compaction-events.test.ts +7 -7
  37. package/src/__tests__/compaction.benchmark.test.ts +1 -1
  38. package/src/__tests__/compactor-web-search-strip.test.ts +213 -0
  39. package/src/__tests__/context-overflow-reducer.test.ts +265 -125
  40. package/src/__tests__/context-window-manager-compact-retry.test.ts +121 -15
  41. package/src/__tests__/conversation-abort-tool-results.test.ts +7 -5
  42. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +7 -10
  43. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +78 -119
  44. package/src/__tests__/conversation-agent-loop-overflow.test.ts +158 -234
  45. package/src/__tests__/conversation-agent-loop.test.ts +342 -623
  46. package/src/__tests__/conversation-clean-command.test.ts +5 -2
  47. package/src/__tests__/conversation-confirmation-signals.test.ts +6 -5
  48. package/src/__tests__/conversation-crud-inference-profile.test.ts +7 -9
  49. package/src/__tests__/conversation-error.test.ts +15 -1
  50. package/src/__tests__/conversation-history-web-search.test.ts +6 -1
  51. package/src/__tests__/conversation-media-retry.test.ts +1 -1
  52. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +44 -4
  53. package/src/__tests__/conversation-process-callsite.test.ts +15 -15
  54. package/src/__tests__/conversation-provider-retry-repair.test.ts +66 -65
  55. package/src/__tests__/conversation-queue.test.ts +10 -10
  56. package/src/__tests__/conversation-runtime-assembly.test.ts +1059 -231
  57. package/src/__tests__/conversation-runtime-workspace.test.ts +115 -20
  58. package/src/__tests__/conversation-slash-queue.test.ts +7 -5
  59. package/src/__tests__/conversation-slash-unknown.test.ts +7 -5
  60. package/src/__tests__/conversation-speed-override.test.ts +11 -10
  61. package/src/__tests__/conversation-starter-routes.test.ts +14 -6
  62. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +395 -0
  63. package/src/__tests__/conversation-surfaces-app-control.test.ts +48 -1
  64. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +73 -4
  65. package/src/__tests__/conversation-undo.test.ts +2 -2
  66. package/src/__tests__/conversation-workspace-cache-state.test.ts +24 -21
  67. package/src/__tests__/conversation-workspace-injection.test.ts +69 -7
  68. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +15 -12
  69. package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
  70. package/src/__tests__/corrected-target.test.ts +93 -0
  71. package/src/__tests__/credential-security-invariants.test.ts +1 -0
  72. package/src/__tests__/cu-unified-flow.test.ts +36 -0
  73. package/src/__tests__/db-acp-history.test.ts +101 -0
  74. package/src/__tests__/dynamic-page-surface.test.ts +31 -0
  75. package/src/__tests__/empty-response-hook.test.ts +1 -1
  76. package/src/__tests__/file-write-tool.test.ts +63 -0
  77. package/src/__tests__/gateway-only-guard.test.ts +17 -2
  78. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  79. package/src/__tests__/guardian-routing-invariants.test.ts +93 -4
  80. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
  81. package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
  82. package/src/__tests__/heartbeat-service.test.ts +1 -0
  83. package/src/__tests__/history-repair-hook.test.ts +5 -1
  84. package/src/__tests__/host-app-control-proxy.test.ts +45 -0
  85. package/src/__tests__/host-app-control-routes.test.ts +1 -1
  86. package/src/__tests__/host-cu-routes-targeted.test.ts +3 -3
  87. package/src/__tests__/inference-profile-reaper.test.ts +62 -0
  88. package/src/__tests__/inference-profile-session-handler.test.ts +86 -0
  89. package/src/__tests__/injector-background-turn.test.ts +13 -23
  90. package/src/__tests__/injector-chain.test.ts +268 -44
  91. package/src/__tests__/injector-disk-pressure.test.ts +210 -52
  92. package/src/__tests__/injector-document-comments.test.ts +97 -114
  93. package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
  94. package/src/__tests__/injector-v3-suppression.test.ts +4 -4
  95. package/src/__tests__/list-messages-client-message-id.test.ts +91 -0
  96. package/src/__tests__/list-messages-hidden-metadata.test.ts +38 -0
  97. package/src/__tests__/llm-resolver.test.ts +73 -0
  98. package/src/__tests__/memory-retrieval-hook.test.ts +156 -38
  99. package/src/__tests__/memory-v2-static-injector.test.ts +86 -8
  100. package/src/__tests__/notification-decision-strategy.test.ts +3 -3
  101. package/src/__tests__/parallel-tool.benchmark.test.ts +35 -8
  102. package/src/__tests__/persist-unsendable-image-downscale.test.ts +145 -0
  103. package/src/__tests__/persist-unsendable-image.test.ts +97 -1
  104. package/src/__tests__/plugin-api-shim.test.ts +6 -9
  105. package/src/__tests__/plugin-bootstrap.test.ts +91 -81
  106. package/src/__tests__/plugin-registry.test.ts +3 -49
  107. package/src/__tests__/plugin-skill-contribution.test.ts +15 -14
  108. package/src/__tests__/plugin-tool-contribution.test.ts +7 -4
  109. package/src/__tests__/plugin-types.test.ts +0 -70
  110. package/src/__tests__/post-turn-tool-result-truncation.test.ts +69 -0
  111. package/src/__tests__/pre-model-call-sanitize.test.ts +109 -0
  112. package/src/__tests__/published-app-updater.test.ts +138 -0
  113. package/src/__tests__/reaction-persistence.test.ts +1 -1
  114. package/src/__tests__/send-endpoint-busy.test.ts +4 -1
  115. package/src/__tests__/skill-feature-flags-integration.test.ts +31 -0
  116. package/src/__tests__/steer-tool-repair.test.ts +1 -1
  117. package/src/__tests__/subagent-call-site-routing.test.ts +1 -1
  118. package/src/__tests__/subagent-detail.test.ts +25 -7
  119. package/src/__tests__/subagent-fork-notifications.test.ts +1 -3
  120. package/src/__tests__/subagent-fork-spawn.test.ts +1 -1
  121. package/src/__tests__/subagent-manager-notify.test.ts +1 -3
  122. package/src/__tests__/subagent-notify-parent.test.ts +1 -3
  123. package/src/__tests__/subagent-spawn-tool-fork.test.ts +1 -1
  124. package/src/__tests__/title-generate-hook.test.ts +5 -1
  125. package/src/__tests__/tool-error-hook.test.ts +1 -1
  126. package/src/__tests__/tool-result-truncate-hook.test.ts +1 -1
  127. package/src/__tests__/user-plugin-loader.test.ts +54 -286
  128. package/src/__tests__/web-fetch.test.ts +45 -0
  129. package/src/acp/__tests__/agent-process.test.ts +161 -0
  130. package/src/acp/__tests__/client-handler.test.ts +40 -0
  131. package/src/acp/__tests__/helpers/acp-config-stub.ts +0 -2
  132. package/src/acp/__tests__/helpers/acp-history-db.ts +82 -0
  133. package/src/acp/__tests__/helpers/exec-file-stub.ts +106 -0
  134. package/src/acp/__tests__/prepare-agent-env.test.ts +97 -0
  135. package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
  136. package/src/acp/__tests__/session-manager-resume.test.ts +888 -0
  137. package/src/acp/agent-process.ts +61 -1
  138. package/src/acp/auto-install.test.ts +280 -0
  139. package/src/acp/auto-install.ts +232 -0
  140. package/src/acp/client-handler.ts +31 -0
  141. package/src/acp/prepare-agent-env.ts +80 -27
  142. package/src/acp/resolve-agent.test.ts +188 -28
  143. package/src/acp/resolve-agent.ts +119 -42
  144. package/src/acp/resume-hint.ts +23 -0
  145. package/src/acp/session-manager.ts +507 -73
  146. package/src/agent/compaction-circuit.ts +60 -102
  147. package/src/agent/loop.ts +403 -251
  148. package/src/api/responses/conversation-message.ts +22 -2
  149. package/src/api/responses/memory-v3-selection-log.ts +19 -10
  150. package/src/approvals/guardian-request-resolvers.ts +27 -1
  151. package/src/background-wake/next-wake.ts +1 -0
  152. package/src/cli/commands/__tests__/memory-v3.test.ts +191 -210
  153. package/src/cli/commands/channel-verification-sessions.ts +6 -6
  154. package/src/cli/commands/db/__tests__/repair.test.ts +3 -1
  155. package/src/cli/commands/memory-v3.ts +57 -199
  156. package/src/cli/commands/plugins.ts +43 -37
  157. package/src/cli/lib/__tests__/install-from-github.test.ts +790 -111
  158. package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +196 -0
  159. package/src/cli/lib/__tests__/plugin-details.test.ts +381 -0
  160. package/src/cli/lib/__tests__/plugin-marketplace.test.ts +270 -0
  161. package/src/cli/lib/__tests__/search-plugins.test.ts +233 -32
  162. package/src/cli/lib/install-from-github.ts +797 -60
  163. package/src/cli/lib/plugin-catalog-cache.ts +84 -0
  164. package/src/cli/lib/plugin-details.ts +416 -0
  165. package/src/cli/lib/plugin-marketplace.ts +215 -0
  166. package/src/cli/lib/search-plugins.ts +201 -29
  167. package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
  168. package/src/config/acp-defaults.test.ts +10 -0
  169. package/src/config/acp-defaults.ts +9 -3
  170. package/src/config/acp-schema.ts +1 -7
  171. package/src/config/bundled-skills/acp/SKILL.md +80 -41
  172. package/src/config/bundled-skills/acp/TOOLS.json +4 -4
  173. package/src/config/bundled-skills/app-builder/SKILL.md +224 -381
  174. package/src/config/bundled-skills/app-builder/TOOLS.json +72 -2
  175. package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +48 -0
  176. package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +57 -0
  177. package/src/config/bundled-skills/app-builder/references/SLIDES.md +38 -0
  178. package/src/config/bundled-skills/app-builder/tools/app-list.ts +62 -0
  179. package/src/config/bundled-skills/app-builder/tools/app-update.ts +18 -0
  180. package/src/config/bundled-skills/document-editor/SKILL.md +28 -23
  181. package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
  182. package/src/config/bundled-tool-registry.ts +4 -0
  183. package/src/config/call-site-defaults.ts +0 -3
  184. package/src/config/feature-flag-registry.json +10 -16
  185. package/src/config/llm-resolver.ts +39 -7
  186. package/src/config/schemas/__tests__/memory-v3.test.ts +25 -9
  187. package/src/config/schemas/call-site-catalog.ts +0 -21
  188. package/src/config/schemas/heartbeat.ts +9 -0
  189. package/src/config/schemas/llm.ts +17 -3
  190. package/src/config/schemas/memory-v3.ts +58 -8
  191. package/src/config/seed-inference-profiles.ts +18 -0
  192. package/src/context/compactor.ts +22 -4
  193. package/src/context/post-turn-tool-result-truncation.ts +39 -1
  194. package/src/context/strip-injections.ts +8 -2
  195. package/src/daemon/conversation-agent-loop-handlers.ts +18 -36
  196. package/src/daemon/conversation-agent-loop.ts +308 -1297
  197. package/src/daemon/conversation-error.ts +31 -4
  198. package/src/daemon/conversation-history.ts +1 -1
  199. package/src/daemon/conversation-lifecycle.ts +11 -255
  200. package/src/daemon/conversation-media-retry.ts +19 -6
  201. package/src/daemon/conversation-messaging.ts +17 -0
  202. package/src/daemon/conversation-process.ts +22 -141
  203. package/src/daemon/conversation-queue-manager.ts +8 -0
  204. package/src/daemon/conversation-registry.ts +159 -0
  205. package/src/daemon/conversation-runtime-assembly.ts +361 -393
  206. package/src/daemon/conversation-store.ts +9 -90
  207. package/src/daemon/conversation-surfaces.ts +165 -11
  208. package/src/daemon/conversation-workspace.ts +17 -0
  209. package/src/daemon/conversation.ts +444 -62
  210. package/src/daemon/disk-pressure-policy.ts +0 -1
  211. package/src/daemon/external-plugins-bootstrap.ts +36 -46
  212. package/src/daemon/handlers/config-channels.ts +11 -2
  213. package/src/daemon/handlers/conversations.ts +3 -1
  214. package/src/daemon/handlers/skills.ts +4 -1
  215. package/src/daemon/host-app-control-proxy.ts +72 -57
  216. package/src/daemon/host-proxy-preactivation.ts +1 -3
  217. package/src/daemon/lifecycle.ts +21 -7
  218. package/src/daemon/persist-unsendable-image.ts +62 -25
  219. package/src/daemon/process-message.ts +1 -1
  220. package/src/daemon/server.ts +2 -0
  221. package/src/daemon/tool-side-effects.ts +15 -0
  222. package/src/daemon/wake-conversation-ops.ts +269 -0
  223. package/src/embedded/plugin-api.ts +2 -2
  224. package/src/export/__tests__/transcript-formatter.test.ts +5 -0
  225. package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -0
  226. package/src/heartbeat/heartbeat-run-store.ts +23 -1
  227. package/src/heartbeat/heartbeat-service.ts +26 -0
  228. package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
  229. package/src/ipc/__tests__/ui-request-route.test.ts +3 -3
  230. package/src/ipc/skill-routes/__tests__/memory.test.ts +15 -0
  231. package/src/ipc/skill-routes/memory.ts +4 -2
  232. package/src/memory/__tests__/activation-session-store.test.ts +41 -0
  233. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +87 -0
  234. package/src/memory/__tests__/onboarding-events-store.test.ts +80 -0
  235. package/src/memory/activation-session-store.ts +43 -0
  236. package/src/memory/conversation-crud.ts +29 -19
  237. package/src/memory/conversation-starter-checkpoints.ts +1 -0
  238. package/src/memory/db-init.ts +6 -0
  239. package/src/memory/job-handlers/conversation-starters.ts +13 -2
  240. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -4
  241. package/src/memory/jobs-worker.ts +25 -1
  242. package/src/memory/migrations/272-acp-session-history-cwd.ts +36 -0
  243. package/src/memory/migrations/273-onboarding-events-funnel-columns.ts +46 -0
  244. package/src/memory/migrations/274-create-activation-sessions.ts +15 -0
  245. package/src/memory/migrations/index.ts +3 -0
  246. package/src/memory/onboarding-events-store.ts +66 -18
  247. package/src/memory/schema/acp.ts +4 -0
  248. package/src/memory/schema/infrastructure.ts +13 -0
  249. package/src/memory/v2/__tests__/consolidation-job.test.ts +4 -97
  250. package/src/memory/v2/__tests__/page-store.test.ts +22 -0
  251. package/src/memory/v2/consolidation-job.ts +2 -63
  252. package/src/memory/v2/types.ts +5 -0
  253. package/src/messaging/providers/telegram-bot/api.ts +14 -5
  254. package/src/notifications/__tests__/copy-composer.test.ts +244 -0
  255. package/src/notifications/access-request-copy.ts +298 -0
  256. package/src/notifications/adapters/slack.ts +3 -3
  257. package/src/notifications/adapters/telegram.ts +9 -2
  258. package/src/notifications/copy-composer.ts +49 -267
  259. package/src/notifications/decision-engine.ts +16 -35
  260. package/src/notifications/home-feed-side-effect.ts +1 -6
  261. package/src/plugin-api/constants.ts +4 -0
  262. package/src/plugin-api/index.ts +40 -11
  263. package/src/plugin-api/types.ts +108 -0
  264. package/src/plugins/defaults/compaction/compact.ts +106 -0
  265. package/src/{daemon → plugins/defaults/compaction}/context-overflow-reducer.ts +250 -42
  266. package/src/plugins/defaults/compaction/corrected-target.ts +53 -0
  267. package/src/plugins/defaults/compaction/manager-store.ts +57 -0
  268. package/src/plugins/defaults/compaction/package.json +1 -2
  269. package/src/{context → plugins/defaults/compaction}/window-manager.ts +95 -25
  270. package/src/plugins/defaults/empty-response/package.json +0 -1
  271. package/src/plugins/defaults/history-repair/package.json +0 -1
  272. package/src/plugins/defaults/index.ts +156 -26
  273. package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +100 -52
  274. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +285 -0
  275. package/src/plugins/defaults/memory-retrieval/injector-chain.ts +2 -2
  276. package/src/plugins/defaults/{injectors/register.ts → memory-retrieval/injectors.ts} +148 -73
  277. package/src/plugins/defaults/memory-retrieval/package.json +14 -0
  278. package/src/plugins/defaults/memory-retrieval/unified-turn-context.ts +223 -0
  279. package/src/plugins/defaults/memory-v3-shadow/__tests__/capabilities.test.ts +71 -0
  280. package/src/plugins/defaults/memory-v3-shadow/__tests__/dense.test.ts +181 -0
  281. package/src/plugins/defaults/memory-v3-shadow/__tests__/edge.test.ts +247 -0
  282. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/live-integration.test.ts +147 -134
  283. package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +456 -0
  284. package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +662 -0
  285. package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +306 -0
  286. package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +91 -0
  287. package/src/plugins/defaults/memory-v3-shadow/__tests__/section-dense-store.test.ts +402 -0
  288. package/src/plugins/defaults/memory-v3-shadow/__tests__/section-needle.test.ts +135 -0
  289. package/src/plugins/defaults/memory-v3-shadow/__tests__/sections.test.ts +125 -0
  290. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selection-log-store.test.ts +74 -19
  291. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-integration.test.ts +446 -0
  292. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +592 -0
  293. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/types.test.ts +2 -24
  294. package/src/plugins/defaults/memory-v3-shadow/capabilities.ts +91 -0
  295. package/src/plugins/defaults/memory-v3-shadow/dense.ts +97 -0
  296. package/src/plugins/defaults/memory-v3-shadow/edge.ts +252 -0
  297. package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +14 -0
  298. package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +19 -0
  299. package/src/plugins/defaults/memory-v3-shadow/injector.ts +76 -0
  300. package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +555 -0
  301. package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +266 -0
  302. package/src/plugins/defaults/memory-v3-shadow/package.json +14 -0
  303. package/src/plugins/defaults/memory-v3-shadow/page-content.ts +71 -0
  304. package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +204 -0
  305. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/render-injection.ts +16 -8
  306. package/src/plugins/defaults/memory-v3-shadow/section-dense-store.ts +236 -0
  307. package/src/plugins/defaults/memory-v3-shadow/section-needle.ts +200 -0
  308. package/src/plugins/defaults/memory-v3-shadow/sections.ts +115 -0
  309. package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +156 -0
  310. package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +382 -0
  311. package/src/plugins/defaults/memory-v3-shadow/types.ts +92 -0
  312. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/working-set.ts +4 -1
  313. package/src/plugins/defaults/title-generate/package.json +0 -1
  314. package/src/plugins/defaults/tool-error/package.json +0 -1
  315. package/src/plugins/defaults/tool-result-truncate/package.json +0 -1
  316. package/src/plugins/external-api.ts +12 -2
  317. package/src/plugins/pipeline.ts +6 -293
  318. package/src/plugins/registry.ts +9 -37
  319. package/src/plugins/types.ts +76 -381
  320. package/src/plugins/user-loader.ts +30 -127
  321. package/src/prompts/__tests__/system-prompt.test.ts +6 -0
  322. package/src/prompts/system-prompt.ts +61 -10
  323. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +71 -4
  324. package/src/providers/anthropic/client.ts +9 -10
  325. package/src/providers/inference/kimi-cjk-token-ids.ts +493 -0
  326. package/src/providers/inference/logit-bias.ts +55 -0
  327. package/src/providers/model-catalog.ts +34 -0
  328. package/src/providers/openai/__tests__/vision-not-supported.test.ts +75 -0
  329. package/src/providers/openai/chat-completions-provider.ts +44 -1
  330. package/src/providers/retry.ts +22 -0
  331. package/src/providers/types.ts +6 -0
  332. package/src/runtime/__tests__/agent-wake.test.ts +555 -691
  333. package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
  334. package/src/runtime/agent-wake.ts +108 -209
  335. package/src/runtime/assistant-event-hub.ts +1 -1
  336. package/src/runtime/channel-approvals.ts +1 -1
  337. package/src/runtime/interactive-ui.ts +1 -1
  338. package/src/runtime/routes/__tests__/acp-routes.test.ts +466 -55
  339. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
  340. package/src/runtime/routes/__tests__/plugins-routes.test.ts +423 -73
  341. package/src/runtime/routes/__tests__/stt-routes.test.ts +112 -0
  342. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +5 -4
  343. package/src/runtime/routes/__tests__/surface-content-routes.test.ts +4 -1
  344. package/src/runtime/routes/acp-routes.test.ts +185 -32
  345. package/src/runtime/routes/acp-routes.ts +328 -30
  346. package/src/runtime/routes/app-management-routes.ts +3 -0
  347. package/src/runtime/routes/approval-routes.ts +1 -1
  348. package/src/runtime/routes/browser-routes.ts +1 -1
  349. package/src/runtime/routes/browser-tabs-routes.ts +6 -10
  350. package/src/runtime/routes/channel-verification-routes.ts +14 -5
  351. package/src/runtime/routes/conversation-cli-routes.ts +1 -1
  352. package/src/runtime/routes/conversation-list-routes.ts +1 -1
  353. package/src/runtime/routes/conversation-query-routes.ts +1 -1
  354. package/src/runtime/routes/conversation-routes.ts +30 -2
  355. package/src/runtime/routes/conversation-starter-routes.ts +13 -7
  356. package/src/runtime/routes/conversations-import-routes.ts +24 -7
  357. package/src/runtime/routes/host-app-control-routes.ts +1 -1
  358. package/src/runtime/routes/host-cu-routes.ts +1 -1
  359. package/src/runtime/routes/identity-routes.ts +18 -3
  360. package/src/runtime/routes/inbound-message-handler.ts +1 -1
  361. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +33 -34
  362. package/src/runtime/routes/inference-profile-session-handler.ts +11 -0
  363. package/src/runtime/routes/inference-profile-session-reaper.ts +6 -0
  364. package/src/runtime/routes/memory-v3-routes.ts +65 -305
  365. package/src/runtime/routes/playground/__tests__/force-compact.test.ts +1 -1
  366. package/src/runtime/routes/playground/helpers.ts +1 -1
  367. package/src/runtime/routes/plugins-routes.ts +337 -35
  368. package/src/runtime/routes/stt-routes.ts +45 -12
  369. package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
  370. package/src/runtime/routes/work-items-routes.ts +2 -4
  371. package/src/runtime/routes/workspace-routes.ts +50 -15
  372. package/src/runtime/services/conversation-serializer.ts +1 -1
  373. package/src/runtime/verification-outbound-actions.ts +147 -2
  374. package/src/runtime/verification-templates.ts +29 -3
  375. package/src/services/published-app-updater.ts +30 -8
  376. package/src/signals/cancel.ts +2 -4
  377. package/src/subagent/manager.ts +21 -5
  378. package/src/telemetry/__tests__/activation-funnel.test.ts +95 -0
  379. package/src/telemetry/activation-funnel.ts +167 -0
  380. package/src/telemetry/types.ts +13 -0
  381. package/src/telemetry/usage-telemetry-reporter.test.ts +154 -0
  382. package/src/telemetry/usage-telemetry-reporter.ts +26 -1
  383. package/src/tools/acp/context.ts +20 -0
  384. package/src/tools/acp/list-agents.test.ts +9 -19
  385. package/src/tools/acp/list-agents.ts +3 -15
  386. package/src/tools/acp/spawn.test.ts +173 -202
  387. package/src/tools/acp/spawn.ts +37 -172
  388. package/src/tools/acp/steer.test.ts +105 -8
  389. package/src/tools/acp/steer.ts +48 -17
  390. package/src/tools/apps/executors.ts +166 -50
  391. package/src/tools/browser/browser-execution.ts +12 -2
  392. package/src/tools/filesystem/write.ts +34 -0
  393. package/src/tools/network/web-fetch.ts +65 -24
  394. package/src/tools/skills/load.ts +1 -1
  395. package/src/tools/subagent/spawn.ts +2 -4
  396. package/src/tools/ui-surface/definitions.ts +32 -5
  397. package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +4 -5
  398. package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +69 -45
  399. package/docs/plugins.md +0 -832
  400. package/examples/plugins/echo/register.ts +0 -143
  401. package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -405
  402. package/src/__tests__/compaction-pipeline.test.ts +0 -210
  403. package/src/__tests__/compaction-timeout-recovery.test.ts +0 -251
  404. package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -667
  405. package/src/__tests__/pipeline-runner.test.ts +0 -554
  406. package/src/daemon/wake-target-adapter.ts +0 -253
  407. package/src/memory/v3/__tests__/assign.test.ts +0 -242
  408. package/src/memory/v3/__tests__/capabilities.test.ts +0 -118
  409. package/src/memory/v3/__tests__/core.test.ts +0 -39
  410. package/src/memory/v3/__tests__/health.test.ts +0 -219
  411. package/src/memory/v3/__tests__/maintain-job.test.ts +0 -288
  412. package/src/memory/v3/__tests__/needle.test.ts +0 -107
  413. package/src/memory/v3/__tests__/orchestrate.test.ts +0 -436
  414. package/src/memory/v3/__tests__/provider-blocks.test.ts +0 -13
  415. package/src/memory/v3/__tests__/reconcile.test.ts +0 -274
  416. package/src/memory/v3/__tests__/render-injection.test.ts +0 -61
  417. package/src/memory/v3/__tests__/router.test.ts +0 -332
  418. package/src/memory/v3/__tests__/selector.test.ts +0 -470
  419. package/src/memory/v3/__tests__/shadow-plugin.test.ts +0 -432
  420. package/src/memory/v3/__tests__/snapshot.test.ts +0 -168
  421. package/src/memory/v3/__tests__/tree.test.ts +0 -192
  422. package/src/memory/v3/assign.ts +0 -268
  423. package/src/memory/v3/capabilities.ts +0 -124
  424. package/src/memory/v3/core.ts +0 -26
  425. package/src/memory/v3/health.ts +0 -0
  426. package/src/memory/v3/maintain-job.ts +0 -314
  427. package/src/memory/v3/needle.ts +0 -115
  428. package/src/memory/v3/orchestrate.ts +0 -126
  429. package/src/memory/v3/page-content.ts +0 -34
  430. package/src/memory/v3/provider-blocks.ts +0 -26
  431. package/src/memory/v3/reconcile.ts +0 -523
  432. package/src/memory/v3/router.ts +0 -190
  433. package/src/memory/v3/selection-log-store.ts +0 -84
  434. package/src/memory/v3/selector.ts +0 -226
  435. package/src/memory/v3/shadow-plugin.ts +0 -411
  436. package/src/memory/v3/snapshot.ts +0 -209
  437. package/src/memory/v3/tree.ts +0 -174
  438. package/src/memory/v3/types.ts +0 -59
  439. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +0 -187
  440. package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +0 -93
  441. package/src/plugins/defaults/circuit-breaker/package.json +0 -15
  442. package/src/plugins/defaults/circuit-breaker/register.ts +0 -39
  443. package/src/plugins/defaults/compaction/middlewares/compaction.ts +0 -25
  444. package/src/plugins/defaults/compaction/register.ts +0 -35
  445. package/src/plugins/defaults/compaction/terminal.ts +0 -73
  446. package/src/plugins/defaults/empty-response/register.ts +0 -23
  447. package/src/plugins/defaults/history-repair/register.ts +0 -24
  448. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +0 -216
  449. package/src/plugins/defaults/overflow-reduce/middlewares/overflowReduce.ts +0 -126
  450. package/src/plugins/defaults/overflow-reduce/package.json +0 -15
  451. package/src/plugins/defaults/overflow-reduce/register.ts +0 -42
  452. package/src/plugins/defaults/title-generate/register.ts +0 -35
  453. package/src/plugins/defaults/tool-error/register.ts +0 -23
  454. package/src/plugins/defaults/tool-result-truncate/register.ts +0 -24
  455. package/src/proactive-artifact/aux-message-injector.ts +0 -97
  456. package/src/proactive-artifact/decision.test.ts +0 -226
  457. package/src/proactive-artifact/decision.ts +0 -165
  458. package/src/proactive-artifact/index.ts +0 -7
  459. package/src/proactive-artifact/job.test.ts +0 -962
  460. package/src/proactive-artifact/job.ts +0 -372
  461. package/src/proactive-artifact/message-copy.ts +0 -58
  462. package/src/proactive-artifact/trigger-state.test.ts +0 -286
  463. package/src/proactive-artifact/trigger-state.ts +0 -123
  464. package/src/util/map-limit.ts +0 -27
  465. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/eval-turns.json +0 -0
  466. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/live-turns.json +0 -0
  467. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-eviction.test.ts +0 -0
  468. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-skeleton.test.ts +0 -0
  469. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/README.md +0 -0
  470. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/assignments.json +0 -0
  471. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/core.json +0 -0
  472. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-x.md +0 -0
  473. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-y.md +0 -0
  474. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-b/topic-z.md +0 -0
  475. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/llm-retry.ts +0 -0
@@ -1,286 +0,0 @@
1
- import {
2
- existsSync,
3
- mkdirSync,
4
- readFileSync,
5
- rmSync,
6
- writeFileSync,
7
- } from "node:fs";
8
- import { join } from "node:path";
9
- import { beforeEach, describe, expect, test } from "bun:test";
10
-
11
- import { initializeDb } from "../memory/db-init.js";
12
- import { rawRun } from "../memory/raw-query.js";
13
- import { getDataDir } from "../util/platform.js";
14
-
15
- initializeDb();
16
-
17
- import {
18
- backfillGuardIfNeeded,
19
- getUserMessageCountUpTo,
20
- hasProactiveArtifactCompleted,
21
- releaseProactiveArtifactClaim,
22
- tryClaimProactiveArtifactTrigger,
23
- } from "./trigger-state.js";
24
-
25
- let seedId = 0;
26
-
27
- function guardPath(): string {
28
- return join(getDataDir(), ".proactive-artifact-completed");
29
- }
30
-
31
- function seedUserMessage(createdAt: number): void {
32
- const id = ++seedId;
33
- const convId = `test-conv-${id}`;
34
- rawRun(
35
- `INSERT INTO conversations (id, title, created_at, updated_at, conversation_type, source)
36
- VALUES (?, ?, ?, ?, 'standard', 'user')`,
37
- convId,
38
- `Test ${id}`,
39
- createdAt,
40
- createdAt,
41
- );
42
- rawRun(
43
- `INSERT INTO messages (id, conversation_id, role, content, created_at)
44
- VALUES (?, ?, 'user', 'hello', ?)`,
45
- `test-msg-${id}`,
46
- convId,
47
- createdAt,
48
- );
49
- }
50
-
51
- function removeGuard(): void {
52
- try {
53
- rmSync(guardPath(), { force: true });
54
- } catch {
55
- /* ignore */
56
- }
57
- }
58
-
59
- describe("trigger-state", () => {
60
- beforeEach(() => {
61
- rawRun("DELETE FROM messages");
62
- rawRun("DELETE FROM conversations");
63
- removeGuard();
64
- seedId = 0;
65
- });
66
-
67
- describe("getUserMessageCountUpTo", () => {
68
- test("returns 0 when no messages exist", () => {
69
- expect(getUserMessageCountUpTo(Date.now())).toBe(0);
70
- });
71
-
72
- test("counts only user messages in standard conversations", () => {
73
- const now = 1000;
74
- seedUserMessage(now);
75
- seedUserMessage(now + 1);
76
-
77
- // Insert a non-user message
78
- const convId = "non-user-conv";
79
- rawRun(
80
- `INSERT INTO conversations (id, title, created_at, updated_at, conversation_type, source)
81
- VALUES (?, ?, ?, ?, 'standard', 'user')`,
82
- convId,
83
- "Non-user",
84
- now + 2,
85
- now + 2,
86
- );
87
- rawRun(
88
- `INSERT INTO messages (id, conversation_id, role, content, created_at)
89
- VALUES (?, ?, 'assistant', 'hi', ?)`,
90
- "assistant-msg",
91
- convId,
92
- now + 2,
93
- );
94
-
95
- // Insert a user message in a non-standard conversation
96
- const bgConvId = "bg-conv";
97
- rawRun(
98
- `INSERT INTO conversations (id, title, created_at, updated_at, conversation_type, source)
99
- VALUES (?, ?, ?, ?, 'background', 'user')`,
100
- bgConvId,
101
- "Background",
102
- now + 3,
103
- now + 3,
104
- );
105
- rawRun(
106
- `INSERT INTO messages (id, conversation_id, role, content, created_at)
107
- VALUES (?, ?, 'user', 'hello', ?)`,
108
- "bg-msg",
109
- bgConvId,
110
- now + 3,
111
- );
112
-
113
- expect(getUserMessageCountUpTo(now + 10)).toBe(2);
114
- });
115
-
116
- test("respects beforeOrAt filter", () => {
117
- seedUserMessage(100);
118
- seedUserMessage(200);
119
- seedUserMessage(300);
120
-
121
- expect(getUserMessageCountUpTo(150)).toBe(1);
122
- expect(getUserMessageCountUpTo(250)).toBe(2);
123
- expect(getUserMessageCountUpTo(350)).toBe(3);
124
- });
125
-
126
- test("counts user messages across standard conversations", () => {
127
- seedUserMessage(100);
128
- seedUserMessage(200);
129
- seedUserMessage(300);
130
- seedUserMessage(400);
131
-
132
- expect(getUserMessageCountUpTo(400)).toBe(4);
133
- });
134
-
135
- test("caps at 11 due to LIMIT", () => {
136
- for (let i = 1; i <= 15; i++) {
137
- seedUserMessage(i * 100);
138
- }
139
- expect(getUserMessageCountUpTo(Date.now())).toBe(11);
140
- });
141
- });
142
-
143
- describe("tryClaimProactiveArtifactTrigger", () => {
144
- test("returns false at count 1, 2, 3 and does NOT write guard", () => {
145
- seedUserMessage(100);
146
- expect(tryClaimProactiveArtifactTrigger(100)).toBe(false);
147
- expect(existsSync(guardPath())).toBe(false);
148
-
149
- seedUserMessage(200);
150
- expect(tryClaimProactiveArtifactTrigger(200)).toBe(false);
151
- expect(existsSync(guardPath())).toBe(false);
152
-
153
- seedUserMessage(300);
154
- expect(tryClaimProactiveArtifactTrigger(300)).toBe(false);
155
- expect(existsSync(guardPath())).toBe(false);
156
- });
157
-
158
- test("returns true at count 4 (start of window) and writes guard", () => {
159
- for (let i = 1; i <= 4; i++) seedUserMessage(i * 100);
160
-
161
- expect(tryClaimProactiveArtifactTrigger(400)).toBe(true);
162
- expect(existsSync(guardPath())).toBe(true);
163
- });
164
-
165
- test("returns true at count 10 (end of window) and writes guard", () => {
166
- for (let i = 1; i <= 10; i++) seedUserMessage(i * 100);
167
-
168
- expect(tryClaimProactiveArtifactTrigger(1000)).toBe(true);
169
- expect(existsSync(guardPath())).toBe(true);
170
- });
171
-
172
- test("returns true at count 7 (mid-window) and writes guard", () => {
173
- for (let i = 1; i <= 7; i++) seedUserMessage(i * 100);
174
-
175
- expect(tryClaimProactiveArtifactTrigger(700)).toBe(true);
176
- expect(existsSync(guardPath())).toBe(true);
177
- });
178
-
179
- test("returns false on second call (EEXIST from wx)", () => {
180
- for (let i = 1; i <= 4; i++) seedUserMessage(i * 100);
181
-
182
- expect(tryClaimProactiveArtifactTrigger(400)).toBe(true);
183
- expect(tryClaimProactiveArtifactTrigger(400)).toBe(false);
184
- });
185
-
186
- test("returns false at count > 10 and writes guard permanently", () => {
187
- for (let i = 1; i <= 11; i++) seedUserMessage(i * 100);
188
-
189
- expect(tryClaimProactiveArtifactTrigger(1100)).toBe(false);
190
- expect(existsSync(guardPath())).toBe(true);
191
- });
192
-
193
- test("concurrent calls: only one returns true", () => {
194
- for (let i = 1; i <= 4; i++) seedUserMessage(i * 100);
195
-
196
- const results = [
197
- tryClaimProactiveArtifactTrigger(400),
198
- tryClaimProactiveArtifactTrigger(400),
199
- tryClaimProactiveArtifactTrigger(400),
200
- ];
201
-
202
- expect(results.filter((r) => r === true)).toHaveLength(1);
203
- expect(results.filter((r) => r === false)).toHaveLength(2);
204
- });
205
-
206
- test("rapid next-message race: in-window trigger still fires", () => {
207
- for (let i = 1; i <= 5; i++) seedUserMessage(i * 100);
208
-
209
- expect(tryClaimProactiveArtifactTrigger(400)).toBe(true);
210
- });
211
- });
212
-
213
- describe("releaseProactiveArtifactClaim", () => {
214
- test("removes guard file so next turn can retry", () => {
215
- for (let i = 1; i <= 4; i++) seedUserMessage(i * 100);
216
-
217
- expect(tryClaimProactiveArtifactTrigger(400)).toBe(true);
218
- expect(existsSync(guardPath())).toBe(true);
219
-
220
- releaseProactiveArtifactClaim();
221
- expect(existsSync(guardPath())).toBe(false);
222
-
223
- seedUserMessage(500);
224
- expect(tryClaimProactiveArtifactTrigger(500)).toBe(true);
225
- expect(existsSync(guardPath())).toBe(true);
226
- });
227
-
228
- test("is no-op when guard does not exist", () => {
229
- expect(existsSync(guardPath())).toBe(false);
230
- releaseProactiveArtifactClaim();
231
- expect(existsSync(guardPath())).toBe(false);
232
- });
233
- });
234
-
235
- describe("hasProactiveArtifactCompleted", () => {
236
- test("returns false when guard does not exist", () => {
237
- expect(hasProactiveArtifactCompleted()).toBe(false);
238
- });
239
-
240
- test("returns true when guard exists", () => {
241
- mkdirSync(join(getDataDir()), { recursive: true });
242
- writeFileSync(guardPath(), new Date().toISOString());
243
- expect(hasProactiveArtifactCompleted()).toBe(true);
244
- });
245
- });
246
-
247
- describe("backfillGuardIfNeeded", () => {
248
- test("creates guard when count > 10", () => {
249
- for (let i = 1; i <= 11; i++) {
250
- seedUserMessage(i * 100);
251
- }
252
-
253
- backfillGuardIfNeeded();
254
- expect(existsSync(guardPath())).toBe(true);
255
- });
256
-
257
- test("is no-op when count is within window (4-10)", () => {
258
- for (let i = 1; i <= 7; i++) {
259
- seedUserMessage(i * 100);
260
- }
261
-
262
- backfillGuardIfNeeded();
263
- expect(existsSync(guardPath())).toBe(false);
264
- });
265
-
266
- test("is no-op when count < 4", () => {
267
- seedUserMessage(100);
268
- seedUserMessage(200);
269
- seedUserMessage(300);
270
-
271
- backfillGuardIfNeeded();
272
- expect(existsSync(guardPath())).toBe(false);
273
- });
274
-
275
- test("is no-op when guard already exists", () => {
276
- for (let i = 1; i <= 11; i++) {
277
- seedUserMessage(i * 100);
278
- }
279
-
280
- mkdirSync(join(getDataDir()), { recursive: true });
281
- writeFileSync(guardPath(), "already-exists");
282
- backfillGuardIfNeeded();
283
- expect(readFileSync(guardPath(), "utf-8")).toBe("already-exists");
284
- });
285
- });
286
- });
@@ -1,123 +0,0 @@
1
- import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
2
- import { dirname, join } from "node:path";
3
-
4
- import { rawGet } from "../memory/raw-query.js";
5
- import { getLogger } from "../util/logger.js";
6
- import { getDataDir } from "../util/platform.js";
7
-
8
- const log = getLogger("proactive-artifact-trigger");
9
-
10
- const TRIGGER_MIN = 4;
11
- const TRIGGER_MAX = 10;
12
-
13
- function guardPath(): string {
14
- return join(getDataDir(), ".proactive-artifact-completed");
15
- }
16
-
17
- /**
18
- * Count user messages in standard conversations with created_at <= beforeOrAt.
19
- * This is intentionally cross-conversation: a user who starts a new thread
20
- * early should still enter the proactive artifact trigger window. The job
21
- * separately scopes raw transcript context to the triggering conversation.
22
- *
23
- * LIMIT caps scan cost since we only care about thresholds up to TRIGGER_MAX.
24
- */
25
- export function getUserMessageCountUpTo(beforeOrAt: number): number {
26
- const row = rawGet<{ c: number }>(
27
- `SELECT COUNT(*) AS c FROM (
28
- SELECT 1 FROM messages m
29
- JOIN conversations c ON m.conversation_id = c.id
30
- WHERE m.role = 'user'
31
- AND c.conversation_type = 'standard'
32
- AND m.created_at <= ?
33
- LIMIT ${TRIGGER_MAX + 1}
34
- ) sub`,
35
- beforeOrAt,
36
- );
37
- return row?.c ?? 0;
38
- }
39
-
40
- /**
41
- * Fast-path check to avoid the COUNT query on every turn.
42
- * Returns true if the proactive artifact trigger has already fired.
43
- */
44
- export function hasProactiveArtifactCompleted(): boolean {
45
- return existsSync(guardPath());
46
- }
47
-
48
- /**
49
- * Atomic check-and-claim with count-first ordering.
50
- *
51
- * Trigger window: messages TRIGGER_MIN–TRIGGER_MAX (4–10). Returns true if
52
- * count is in-window and exclusive file create succeeded. The guard acts as
53
- * an in-flight lock — the job releases it on decision-skip so the next turn
54
- * can retry. Past the window, the guard is written permanently.
55
- */
56
- export function tryClaimProactiveArtifactTrigger(
57
- userMessageCreatedAt: number,
58
- ): boolean {
59
- const count = getUserMessageCountUpTo(userMessageCreatedAt);
60
-
61
- if (count < TRIGGER_MIN) {
62
- return false;
63
- }
64
-
65
- if (count > TRIGGER_MAX) {
66
- try {
67
- mkdirSync(dirname(guardPath()), { recursive: true });
68
- writeFileSync(guardPath(), new Date().toISOString(), { flag: "wx" });
69
- } catch {
70
- // Already written or fs error — either way, window is closed
71
- }
72
- return false;
73
- }
74
-
75
- // count in [TRIGGER_MIN, TRIGGER_MAX] — attempt exclusive guard write
76
- try {
77
- mkdirSync(dirname(guardPath()), { recursive: true });
78
- writeFileSync(guardPath(), new Date().toISOString(), { flag: "wx" });
79
- return true;
80
- } catch (err: unknown) {
81
- if (err instanceof Error && "code" in err && err.code === "EEXIST") {
82
- return false;
83
- }
84
- log.warn({ err }, "Failed to write proactive artifact guard file");
85
- return false;
86
- }
87
- }
88
-
89
- /**
90
- * Release the in-flight claim so the next turn can retry.
91
- * Called when the decision phase skips (no build committed).
92
- */
93
- export function releaseProactiveArtifactClaim(): void {
94
- try {
95
- rmSync(guardPath(), { force: true });
96
- } catch {
97
- // Best-effort — if removal fails, the next turn just won't retry
98
- }
99
- }
100
-
101
- /**
102
- * Called at daemon startup. If the guard file does not exist and the user
103
- * already has messages past the trigger window, write the guard. This
104
- * handles existing users who had many messages before the feature existed.
105
- */
106
- export function backfillGuardIfNeeded(): void {
107
- if (hasProactiveArtifactCompleted()) {
108
- return;
109
- }
110
-
111
- const count = getUserMessageCountUpTo(Date.now());
112
- if (count > TRIGGER_MAX) {
113
- try {
114
- mkdirSync(dirname(guardPath()), { recursive: true });
115
- writeFileSync(guardPath(), new Date().toISOString(), { flag: "wx" });
116
- } catch (err: unknown) {
117
- if (err instanceof Error && "code" in err && err.code === "EEXIST") {
118
- return;
119
- }
120
- log.warn({ err }, "Failed to backfill proactive artifact guard file");
121
- }
122
- }
123
- }
@@ -1,27 +0,0 @@
1
- /**
2
- * Map `fn` over `items` with bounded concurrency, preserving input order in the
3
- * result array. At most `limit` invocations of `fn` are in flight at once.
4
- *
5
- * Each of the `min(limit, items.length)` workers pulls the next index off a
6
- * shared cursor and processes it, so faster items don't block on slower ones.
7
- * Results are written back to their original positions, so `out[i]` always
8
- * corresponds to `items[i]` regardless of completion order.
9
- */
10
- export async function mapLimit<T, R>(
11
- items: T[],
12
- limit: number,
13
- fn: (t: T) => Promise<R>,
14
- ): Promise<R[]> {
15
- const out: R[] = new Array(items.length);
16
- let next = 0;
17
- await Promise.all(
18
- Array.from({ length: Math.min(limit, items.length) }, async () => {
19
- while (true) {
20
- const i = next++;
21
- if (i >= items.length) return;
22
- out[i] = await fn(items[i]!);
23
- }
24
- }),
25
- );
26
- return out;
27
- }