@vellumai/assistant 0.8.3 → 0.8.4

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 (342) hide show
  1. package/docker-entrypoint.sh +0 -1
  2. package/node_modules/@vellumai/gateway-client/src/types.ts +2 -0
  3. package/openapi.yaml +610 -16
  4. package/package.json +1 -1
  5. package/src/__tests__/agent-loop-exit-reason.test.ts +4 -5
  6. package/src/__tests__/agent-loop-override-profile.test.ts +1 -1
  7. package/src/__tests__/agent-loop.test.ts +88 -3
  8. package/src/__tests__/anthropic-provider.test.ts +272 -0
  9. package/src/__tests__/approval-cascade.test.ts +1 -1
  10. package/src/__tests__/background-workers-disk-pressure.test.ts +2 -1
  11. package/src/__tests__/channel-delivery-store.test.ts +193 -0
  12. package/src/__tests__/channel-reply-delivery.test.ts +284 -5
  13. package/src/__tests__/channel-retry-sweep.test.ts +274 -1
  14. package/src/__tests__/compaction-events.test.ts +1 -1
  15. package/src/__tests__/compactor-preserved-tail-count.test.ts +110 -0
  16. package/src/__tests__/config-watcher.test.ts +1 -1
  17. package/src/__tests__/context-token-estimator.test.ts +91 -1
  18. package/src/__tests__/conversation-abort-tool-results.test.ts +1 -1
  19. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +54 -3
  20. package/src/__tests__/conversation-agent-loop-overflow.test.ts +31 -6
  21. package/src/__tests__/conversation-agent-loop.test.ts +25 -7
  22. package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
  23. package/src/__tests__/conversation-clean-command.test.ts +137 -0
  24. package/src/__tests__/conversation-confirmation-signals.test.ts +1 -1
  25. package/src/__tests__/conversation-fork-crud.test.ts +161 -0
  26. package/src/__tests__/conversation-lifecycle.test.ts +1 -1
  27. package/src/__tests__/conversation-load-cleaned-at.test.ts +279 -0
  28. package/src/__tests__/conversation-load-history-repair.test.ts +1 -1
  29. package/src/__tests__/conversation-pairing.test.ts +2 -2
  30. package/src/__tests__/conversation-process-callsite.test.ts +1 -1
  31. package/src/__tests__/conversation-provider-retry-repair.test.ts +1 -1
  32. package/src/__tests__/conversation-queue.test.ts +1 -1
  33. package/src/__tests__/conversation-runtime-assembly.test.ts +264 -81
  34. package/src/__tests__/conversation-seed-composer.test.ts +66 -4
  35. package/src/__tests__/conversation-slash-commands.test.ts +36 -8
  36. package/src/__tests__/conversation-slash-queue.test.ts +1 -1
  37. package/src/__tests__/conversation-slash-unknown.test.ts +1 -1
  38. package/src/__tests__/conversation-speed-override.test.ts +1 -1
  39. package/src/__tests__/conversation-surfaces-task-progress.test.ts +220 -0
  40. package/src/__tests__/conversation-workspace-cache-state.test.ts +1 -1
  41. package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
  42. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -1
  43. package/src/__tests__/credential-security-invariants.test.ts +6 -0
  44. package/src/__tests__/cu-unified-flow.test.ts +10 -1
  45. package/src/__tests__/dm-backfill.test.ts +64 -0
  46. package/src/__tests__/dm-persistence.test.ts +33 -0
  47. package/src/__tests__/document-find-replace.test.ts +501 -0
  48. package/src/__tests__/first-greeting.test.ts +23 -2
  49. package/src/__tests__/headless-browser-navigate.test.ts +172 -0
  50. package/src/__tests__/host-bash-proxy.test.ts +6 -0
  51. package/src/__tests__/host-browser-proxy.test.ts +10 -0
  52. package/src/__tests__/host-cu-proxy.test.ts +8 -1
  53. package/src/__tests__/host-file-proxy.test.ts +8 -1
  54. package/src/__tests__/host-transfer-proxy.test.ts +8 -1
  55. package/src/__tests__/identity-routes.test.ts +57 -0
  56. package/src/__tests__/inbound-slack-persistence.test.ts +3 -0
  57. package/src/__tests__/injector-chain.test.ts +2 -0
  58. package/src/__tests__/injector-document-comments.test.ts +378 -0
  59. package/src/__tests__/injector-pkb-v2-silenced.test.ts +4 -25
  60. package/src/__tests__/list-messages-attachments.test.ts +21 -17
  61. package/src/__tests__/list-messages-hidden-metadata.test.ts +217 -0
  62. package/src/__tests__/list-messages-page-latest.test.ts +130 -14
  63. package/src/__tests__/list-messages-tool-merge.test.ts +17 -16
  64. package/src/__tests__/llm-context-normalization.test.ts +0 -2
  65. package/src/__tests__/llm-resolver.test.ts +85 -1
  66. package/src/__tests__/log-export-routes.test.ts +99 -2
  67. package/src/__tests__/message-queue-steer.test.ts +114 -0
  68. package/src/__tests__/openai-provider.test.ts +105 -0
  69. package/src/__tests__/openai-responses-provider.test.ts +4 -4
  70. package/src/__tests__/outbound-slack-persistence.test.ts +187 -20
  71. package/src/__tests__/pending-interactions-resolved-event.test.ts +190 -0
  72. package/src/__tests__/platform.test.ts +0 -3
  73. package/src/__tests__/plugin-source-watcher.test.ts +302 -0
  74. package/src/__tests__/process-message-background-slack.test.ts +1 -51
  75. package/src/__tests__/process-message-display-content.test.ts +21 -16
  76. package/src/__tests__/server-history-render.test.ts +83 -4
  77. package/src/__tests__/steer-tool-repair.test.ts +249 -0
  78. package/src/__tests__/system-prompt.test.ts +51 -28
  79. package/src/__tests__/terminal-tools.test.ts +11 -1
  80. package/src/__tests__/thinking-block-replay.test.ts +113 -0
  81. package/src/__tests__/thread-backfill.test.ts +370 -22
  82. package/src/__tests__/tool-executor.test.ts +90 -1
  83. package/src/__tests__/tool-result-metadata-plumbing.test.ts +167 -0
  84. package/src/__tests__/twilio-routes.test.ts +1 -1
  85. package/src/__tests__/web-fetch.test.ts +2 -2
  86. package/src/__tests__/workspace-git-service.test.ts +88 -5
  87. package/src/__tests__/workspace-migration-088-deprecate-background-conversation-override.test.ts +158 -0
  88. package/src/agent/attachments.ts +1 -0
  89. package/src/agent/loop.ts +57 -20
  90. package/src/background-wake/next-wake.test.ts +289 -0
  91. package/src/background-wake/next-wake.ts +172 -0
  92. package/src/browser/operations.ts +15 -0
  93. package/src/cli/commands/__tests__/conversations-slack.test.ts +572 -0
  94. package/src/cli/commands/__tests__/memory-v2.test.ts +9 -12
  95. package/src/cli/commands/conversations.ts +128 -1
  96. package/src/cli/commands/inference-providers.ts +147 -1
  97. package/src/cli/commands/memory-v2.ts +308 -0
  98. package/src/cli/commands/notifications.ts +24 -2
  99. package/src/cli/utils/conversation-id.ts +17 -5
  100. package/src/config/bundled-skills/app-builder/SKILL.md +2 -2
  101. package/src/config/bundled-skills/document-editor/SKILL.md +115 -0
  102. package/src/config/bundled-skills/document-editor/TOOLS.json +240 -0
  103. package/src/config/bundled-skills/document-editor/tools/comment-list.ts +12 -0
  104. package/src/config/bundled-skills/document-editor/tools/comment-reply.ts +12 -0
  105. package/src/config/bundled-skills/document-editor/tools/comment-resolve.ts +12 -0
  106. package/src/config/bundled-skills/document-editor/tools/document-find.ts +12 -0
  107. package/src/config/bundled-skills/document-editor/tools/document-replace-text.ts +12 -0
  108. package/src/config/bundled-skills/media-processing/SKILL.md +8 -0
  109. package/src/config/bundled-skills/schedule/SKILL.md +8 -0
  110. package/src/config/bundled-tool-registry.ts +22 -12
  111. package/src/config/call-site-defaults.ts +19 -0
  112. package/src/config/feature-flag-registry.json +99 -3
  113. package/src/config/llm-resolver.ts +16 -2
  114. package/src/config/schemas/__tests__/memory-v2.test.ts +4 -0
  115. package/src/config/schemas/call-site-catalog.ts +21 -0
  116. package/src/config/schemas/llm.ts +3 -0
  117. package/src/config/schemas/memory-v2.ts +48 -1
  118. package/src/context/compactor.ts +8 -1
  119. package/src/context/token-estimator.ts +47 -4
  120. package/src/context/window-manager.ts +25 -0
  121. package/src/credential-health/credential-health-service.ts +34 -19
  122. package/src/daemon/__tests__/conversation-tool-setup.test.ts +66 -6
  123. package/src/daemon/__tests__/native-web-search-metadata.test.ts +357 -0
  124. package/src/daemon/__tests__/web-search-status-text.test.ts +287 -0
  125. package/src/daemon/conversation-agent-loop-handlers.ts +153 -23
  126. package/src/daemon/conversation-agent-loop.ts +223 -54
  127. package/src/daemon/conversation-lifecycle.ts +142 -116
  128. package/src/daemon/conversation-messaging.ts +3 -0
  129. package/src/daemon/conversation-process.ts +273 -0
  130. package/src/daemon/conversation-queue-manager.ts +14 -0
  131. package/src/daemon/conversation-runtime-assembly.ts +135 -75
  132. package/src/daemon/conversation-slash.ts +37 -5
  133. package/src/daemon/conversation-surfaces.ts +45 -2
  134. package/src/daemon/conversation-tool-setup.ts +7 -0
  135. package/src/daemon/conversation.ts +42 -5
  136. package/src/daemon/first-greeting.ts +10 -0
  137. package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +498 -0
  138. package/src/daemon/handlers/config-a2a.ts +160 -0
  139. package/src/daemon/handlers/config-model.test.ts +1 -0
  140. package/src/daemon/handlers/conversations.ts +79 -0
  141. package/src/daemon/handlers/shared.ts +92 -29
  142. package/src/daemon/host-bash-proxy.ts +1 -1
  143. package/src/daemon/host-cu-proxy.ts +1 -1
  144. package/src/daemon/host-file-proxy.ts +1 -1
  145. package/src/daemon/host-transfer-proxy.ts +1 -1
  146. package/src/daemon/lifecycle.ts +18 -4
  147. package/src/daemon/message-protocol.ts +4 -0
  148. package/src/daemon/message-types/conversations.ts +8 -0
  149. package/src/daemon/message-types/document-comments.ts +50 -0
  150. package/src/daemon/message-types/messages.ts +68 -1
  151. package/src/daemon/message-types/surfaces.ts +3 -1
  152. package/src/daemon/message-types/web-activity.ts +57 -0
  153. package/src/daemon/plugin-source-watcher.ts +135 -3
  154. package/src/daemon/process-message.ts +69 -12
  155. package/src/daemon/query-complexity-router.ts +75 -0
  156. package/src/daemon/trust-context.ts +6 -0
  157. package/src/documents/document-comments-store.test.ts +338 -0
  158. package/src/documents/document-comments-store.ts +237 -0
  159. package/src/documents/document-store.ts +202 -0
  160. package/src/heartbeat/__tests__/heartbeat-service.test.ts +0 -1
  161. package/src/heartbeat/heartbeat-service.ts +1 -0
  162. package/src/home/__tests__/suggested-prompts.test.ts +33 -2
  163. package/src/home/feed-types.ts +6 -1
  164. package/src/home/home-content-refresh.ts +52 -0
  165. package/src/home/home-greeting-cache.ts +69 -0
  166. package/src/home/home-greeting.ts +94 -0
  167. package/src/home/suggested-prompts.ts +177 -9
  168. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +135 -2
  169. package/src/memory/__tests__/memory-retrospective-job.test.ts +320 -6
  170. package/src/memory/conversation-crud.ts +133 -43
  171. package/src/memory/db-init.ts +16 -0
  172. package/src/memory/delivery-crud.ts +41 -0
  173. package/src/memory/delivery-status.ts +141 -15
  174. package/src/memory/external-conversation-store.ts +32 -1
  175. package/src/memory/jobs-worker.ts +21 -1
  176. package/src/memory/memory-retrospective-constants.ts +28 -0
  177. package/src/memory/memory-retrospective-enqueue.ts +3 -2
  178. package/src/memory/memory-retrospective-job.ts +408 -18
  179. package/src/memory/memory-retrospective-startup-cleanup.ts +3 -3
  180. package/src/memory/memory-v2-activation-log-store.ts +26 -8
  181. package/src/memory/migrations/100-core-tables.ts +1 -0
  182. package/src/memory/migrations/109-external-conversation-bindings.ts +1 -0
  183. package/src/memory/migrations/253-conversation-last-notified-profile.ts +15 -0
  184. package/src/memory/migrations/253-document-comments.ts +47 -0
  185. package/src/memory/migrations/254-external-conversation-binding-chat-name.ts +43 -0
  186. package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +24 -0
  187. package/src/memory/migrations/256-memory-v2-injection-events.ts +113 -0
  188. package/src/memory/migrations/257-strip-base-url-non-openai-compatible.ts +22 -0
  189. package/src/memory/migrations/258-onboarding-events-prior-assistants.ts +13 -0
  190. package/src/memory/migrations/259-conversation-cleaned-at.ts +33 -0
  191. package/src/memory/migrations/index.ts +17 -0
  192. package/src/memory/migrations/registry.ts +25 -0
  193. package/src/memory/onboarding-events-store.ts +7 -0
  194. package/src/memory/schema/calls.ts +1 -0
  195. package/src/memory/schema/conversations.ts +3 -0
  196. package/src/memory/schema/infrastructure.ts +1 -0
  197. package/src/memory/v2/__tests__/injection-events.test.ts +318 -0
  198. package/src/memory/v2/__tests__/injection.test.ts +31 -14
  199. package/src/memory/v2/__tests__/page-index.test.ts +365 -1
  200. package/src/memory/v2/__tests__/router.test.ts +489 -1
  201. package/src/memory/v2/consolidation-job.ts +14 -0
  202. package/src/memory/v2/injection-events.ts +101 -0
  203. package/src/memory/v2/injection.ts +21 -10
  204. package/src/memory/v2/page-index.ts +209 -7
  205. package/src/memory/v2/page-store.ts +18 -0
  206. package/src/memory/v2/router.ts +209 -55
  207. package/src/messaging/providers/index.ts +7 -1
  208. package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +329 -3
  209. package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +34 -1
  210. package/src/messaging/providers/slack/adapter.ts +178 -25
  211. package/src/messaging/providers/slack/api.test.ts +54 -0
  212. package/src/messaging/providers/slack/api.ts +119 -3
  213. package/src/messaging/providers/slack/client.ts +12 -0
  214. package/src/messaging/providers/slack/deep-link.ts +20 -1
  215. package/src/messaging/providers/slack/message-metadata.test.ts +48 -0
  216. package/src/messaging/providers/slack/message-metadata.ts +156 -0
  217. package/src/messaging/providers/slack/render-transcript.test.ts +107 -75
  218. package/src/messaging/providers/slack/render-transcript.ts +176 -49
  219. package/src/messaging/providers/slack/send.test.ts +77 -0
  220. package/src/messaging/providers/slack/send.ts +8 -2
  221. package/src/messaging/providers/slack/types.ts +14 -0
  222. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +4 -1
  223. package/src/notifications/__tests__/home-feed-side-effect.test.ts +116 -54
  224. package/src/notifications/conversation-seed-composer.ts +14 -2
  225. package/src/notifications/deferred-emit.ts +135 -0
  226. package/src/notifications/emit-signal.ts +9 -1
  227. package/src/notifications/home-feed-side-effect.ts +60 -30
  228. package/src/oauth/connect-orchestrator.ts +3 -0
  229. package/src/oauth/credential-token-resolver.ts +2 -0
  230. package/src/oauth/manual-token-connection.ts +19 -0
  231. package/src/oauth/oauth-store.ts +12 -0
  232. package/src/oauth/seed-providers.ts +22 -0
  233. package/src/permissions/prompter.ts +5 -2
  234. package/src/permissions/secret-prompter.ts +4 -1
  235. package/src/plugins/defaults/injectors.ts +82 -9
  236. package/src/prompts/__tests__/system-prompt.test.ts +46 -2
  237. package/src/prompts/normalize-onboarding.ts +40 -0
  238. package/src/prompts/sections.ts +32 -14
  239. package/src/prompts/system-prompt.ts +105 -68
  240. package/src/prompts/template-detection.ts +37 -0
  241. package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +141 -0
  242. package/src/prompts/templates/BOOTSTRAP.md +8 -0
  243. package/src/prompts/templates/VOICE.md +3 -0
  244. package/src/prompts/templates/system-sections.ts +53 -3
  245. package/src/providers/anthropic/client.ts +132 -5
  246. package/src/providers/fireworks/client.ts +20 -2
  247. package/src/providers/inference/__tests__/base-url-route-validation.test.ts +342 -0
  248. package/src/providers/inference/__tests__/base-url-security.test.ts +189 -0
  249. package/src/providers/inference/__tests__/codex-token-refresh.test.ts +254 -0
  250. package/src/providers/inference/adapter-factory.ts +15 -1
  251. package/src/providers/inference/auth.ts +3 -3
  252. package/src/providers/inference/codex-token-refresh.ts +128 -0
  253. package/src/providers/inference/resolve-auth.ts +49 -6
  254. package/src/providers/model-catalog.ts +48 -1
  255. package/src/providers/openai/chat-completions-provider.ts +57 -20
  256. package/src/providers/openai/responses-provider.ts +9 -3
  257. package/src/providers/openrouter/client.ts +5 -1
  258. package/src/providers/types.ts +25 -0
  259. package/src/runtime/__tests__/agent-wake.test.ts +214 -0
  260. package/src/runtime/__tests__/background-job-runner.test.ts +128 -0
  261. package/src/runtime/agent-wake.ts +151 -56
  262. package/src/runtime/auth/route-policy.ts +7 -3
  263. package/src/runtime/background-job-runner.ts +26 -0
  264. package/src/runtime/channel-reply-delivery.ts +182 -47
  265. package/src/runtime/channel-retry-sweep.ts +141 -16
  266. package/src/runtime/http-types.ts +7 -4
  267. package/src/runtime/pending-interactions.ts +51 -8
  268. package/src/runtime/routes/__tests__/content-source-routes.test.ts +162 -0
  269. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +55 -1
  270. package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +14 -0
  271. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +271 -0
  272. package/src/runtime/routes/__tests__/sanity-routes.test.ts +280 -0
  273. package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +266 -0
  274. package/src/runtime/routes/approval-routes.ts +4 -1
  275. package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +246 -0
  276. package/src/runtime/routes/content-source-routes.ts +78 -0
  277. package/src/runtime/routes/conversation-cli-routes.ts +146 -1
  278. package/src/runtime/routes/conversation-query-routes.ts +60 -1
  279. package/src/runtime/routes/conversation-routes.ts +281 -76
  280. package/src/runtime/routes/document-comments-routes.ts +287 -0
  281. package/src/runtime/routes/documents-routes.ts +33 -0
  282. package/src/runtime/routes/home-feed-routes.ts +6 -3
  283. package/src/runtime/routes/host-app-control-routes.ts +1 -1
  284. package/src/runtime/routes/host-browser-routes.ts +8 -1
  285. package/src/runtime/routes/identity-routes.ts +21 -0
  286. package/src/runtime/routes/inbound-message-handler.ts +288 -58
  287. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +365 -6
  288. package/src/runtime/routes/inbound-stages/background-dispatch.ts +283 -82
  289. package/src/runtime/routes/index.ts +12 -4
  290. package/src/runtime/routes/inference-provider-connection-routes.ts +63 -7
  291. package/src/runtime/routes/integrations/a2a.ts +60 -1
  292. package/src/runtime/routes/log-export-routes.ts +39 -0
  293. package/src/runtime/routes/memory-v2-routes.ts +217 -0
  294. package/src/runtime/routes/notification-routes.ts +19 -2
  295. package/src/runtime/routes/question-routes.ts +4 -1
  296. package/src/runtime/routes/sanity-routes.ts +159 -0
  297. package/src/runtime/routes/slack-channel-routes.ts +187 -0
  298. package/src/runtime/services/conversation-serializer.ts +30 -4
  299. package/src/schedule/integration-status.ts +3 -1
  300. package/src/security/__tests__/oauth2-device-code.test.ts +479 -0
  301. package/src/security/oauth2-device-code.ts +307 -0
  302. package/src/security/oauth2.ts +26 -9
  303. package/src/security/secure-keys.ts +5 -0
  304. package/src/skills/catalog-install.ts +6 -2
  305. package/src/tools/browser/__tests__/pinned-tabs.test.ts +80 -0
  306. package/src/tools/browser/browser-execution.ts +93 -0
  307. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +28 -0
  308. package/src/tools/browser/cdp-client/__tests__/types.test.ts +1 -0
  309. package/src/tools/browser/cdp-client/cdp-inspect-client.ts +10 -0
  310. package/src/tools/browser/cdp-client/extension-cdp-client.ts +15 -1
  311. package/src/tools/browser/cdp-client/factory.ts +87 -3
  312. package/src/tools/browser/cdp-client/local-cdp-client.ts +9 -0
  313. package/src/tools/browser/cdp-client/types.ts +36 -0
  314. package/src/tools/browser/pinned-tabs.ts +90 -0
  315. package/src/tools/document/document-comment-tool.test.ts +379 -0
  316. package/src/tools/document/document-comment-tool.ts +156 -0
  317. package/src/tools/document/document-tool.ts +128 -2
  318. package/src/tools/network/__tests__/web-fetch-metadata.test.ts +229 -0
  319. package/src/tools/network/__tests__/web-search-metadata.test.ts +346 -0
  320. package/src/tools/network/domain-normalize.ts +17 -0
  321. package/src/tools/network/web-fetch.ts +213 -64
  322. package/src/tools/network/web-search.ts +191 -66
  323. package/src/tools/terminal/safe-env.ts +3 -2
  324. package/src/tools/tool-approval-handler.ts +19 -12
  325. package/src/tools/types.ts +4 -0
  326. package/src/tools/ui-surface/definitions.ts +3 -1
  327. package/src/types/onboarding-context.ts +4 -0
  328. package/src/util/__tests__/favicon.test.ts +84 -0
  329. package/src/util/favicon.ts +40 -0
  330. package/src/util/platform.ts +0 -5
  331. package/src/workspace/git-service.ts +75 -4
  332. package/src/workspace/migrations/088-deprecate-background-conversation-override.ts +103 -0
  333. package/src/workspace/migrations/registry.ts +2 -0
  334. package/src/config/bundled-skills/document/SKILL.md +0 -54
  335. package/src/config/bundled-skills/document/TOOLS.json +0 -106
  336. package/src/daemon/seed-files.ts +0 -18
  337. package/src/runtime/routes/interface-routes.ts +0 -43
  338. /package/src/config/bundled-skills/{document → document-editor}/tools/document-create.ts +0 -0
  339. /package/src/config/bundled-skills/{document → document-editor}/tools/document-delete.ts +0 -0
  340. /package/src/config/bundled-skills/{document → document-editor}/tools/document-list.ts +0 -0
  341. /package/src/config/bundled-skills/{document → document-editor}/tools/document-read.ts +0 -0
  342. /package/src/config/bundled-skills/{document → document-editor}/tools/document-update.ts +0 -0
@@ -1,5 +1,12 @@
1
1
  import { execFile, spawnSync } from "node:child_process";
2
- import { existsSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
2
+ import {
3
+ chmodSync,
4
+ existsSync,
5
+ mkdirSync,
6
+ readFileSync,
7
+ unlinkSync,
8
+ writeFileSync,
9
+ } from "node:fs";
3
10
  import { join } from "node:path";
4
11
  import { promisify } from "node:util";
5
12
 
@@ -70,6 +77,41 @@ const WORKSPACE_GITIGNORE_RULES = [
70
77
  "session-token",
71
78
  ];
72
79
 
80
+ const NULL_GIT_OID = "0000000000000000000000000000000000000000";
81
+
82
+ const WORKSPACE_BRANCH_GUARD_HOOK = `#!/bin/sh
83
+ set -eu
84
+
85
+ state="\${1:-}"
86
+ if [ "$state" != "prepared" ]; then
87
+ exit 0
88
+ fi
89
+
90
+ while read -r _old_oid new_oid refname; do
91
+ case "$refname" in
92
+ refs/heads/main)
93
+ ;;
94
+ refs/heads/*)
95
+ if [ "$new_oid" = "${NULL_GIT_OID}" ]; then
96
+ continue
97
+ fi
98
+
99
+ cat >&2 <<MSG
100
+ Blocked: assistant workspace git branches are disabled.
101
+
102
+ Use the workspace main branch for assistant state. Create task branches only in
103
+ external product repositories or dedicated worktrees.
104
+
105
+ Rejected ref update: $refname
106
+ MSG
107
+ exit 1
108
+ ;;
109
+ esac
110
+ done
111
+
112
+ exit 0
113
+ `;
114
+
73
115
  /** Properties added by Node's child_process errors. */
74
116
  interface ExecError extends Error {
75
117
  killed?: boolean;
@@ -426,7 +468,9 @@ export class WorkspaceGitService {
426
468
  // These calls are OUTSIDE the rev-parse try/catch so that
427
469
  // normalization errors are not misclassified as "no commits".
428
470
  this.ensureGitignoreRulesLocked();
471
+ this.ensureBranchGuardHookLocked();
429
472
  await this.ensureCommitIdentityLocked();
473
+ await this.ensureBranchGuardConfigLocked();
430
474
  await this.ensureOnMainLocked();
431
475
  this.initialized = true;
432
476
  this.recordInitSuccess();
@@ -444,7 +488,9 @@ export class WorkspaceGitService {
444
488
  // in the corruption-recovery path we fall through here after
445
489
  // removing .git, so branch enforcement is still useful.
446
490
  this.ensureGitignoreRulesLocked();
491
+ this.ensureBranchGuardHookLocked();
447
492
  await this.ensureCommitIdentityLocked();
493
+ await this.ensureBranchGuardConfigLocked();
448
494
  await this.ensureOnMainLocked();
449
495
 
450
496
  // Create initial commit synchronously within the lock to prevent
@@ -452,9 +498,14 @@ export class WorkspaceGitService {
452
498
  // initial commit could run concurrently and consume edits meant
453
499
  // for the first user-requested commit.
454
500
  const status = await this.getStatusInternal();
455
- const hasExistingFiles =
456
- status.untracked.length > 1 || // More than just .gitignore
457
- status.untracked.some((f) => f !== ".gitignore");
501
+ const autoCreatedInitFiles = new Set([
502
+ ".gitignore",
503
+ ".githooks/",
504
+ ".githooks/reference-transaction",
505
+ ]);
506
+ const hasExistingFiles = status.untracked.some(
507
+ (f) => !autoCreatedInitFiles.has(f),
508
+ );
458
509
 
459
510
  await this.execGit(["add", "-A"]);
460
511
 
@@ -766,6 +817,26 @@ export class WorkspaceGitService {
766
817
  await this.execGit(["config", "user.email", gitEmail]);
767
818
  }
768
819
 
820
+ /**
821
+ * Ensure workspace branch guard hook is present.
822
+ * Must be called with the mutex lock held.
823
+ */
824
+ private ensureBranchGuardHookLocked(): void {
825
+ const hooksDir = join(this.workspaceDir, ".githooks");
826
+ const hookPath = join(hooksDir, "reference-transaction");
827
+ mkdirSync(hooksDir, { recursive: true });
828
+ writeFileSync(hookPath, WORKSPACE_BRANCH_GUARD_HOOK, "utf-8");
829
+ chmodSync(hookPath, 0o755);
830
+ }
831
+
832
+ /**
833
+ * Ensure workspace git uses the branch guard hook path.
834
+ * Must be called with the mutex lock held.
835
+ */
836
+ private async ensureBranchGuardConfigLocked(): Promise<void> {
837
+ await this.execGit(["config", "core.hooksPath", ".githooks"]);
838
+ }
839
+
769
840
  /**
770
841
  * Ensure the workspace repo is on the `main` branch.
771
842
  * If on a different branch or in detached HEAD state, switches to main
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Workspace migration 088: Deprecate stale
3
+ * `prompts/system/08-background-conversation.md` overrides.
4
+ *
5
+ * PR #31210 moved the background-conversation guidance out of the bundled
6
+ * system prompt and into a per-turn user-message injector. As a side effect:
7
+ *
8
+ * - Workspace overrides that gated on `{{#isBackgroundConversation}}` now
9
+ * evaluate the gate as false (the key is no longer passed to the system
10
+ * prompt context) and silently stop rendering in background turns.
11
+ * - Plain-text overrides without a gate would now render unconditionally
12
+ * in ALL conversations — the opposite of intended behavior.
13
+ *
14
+ * Either failure mode is silent. To prevent it, this migration renames any
15
+ * existing `prompts/system/08-background-conversation.md` to
16
+ * `08-background-conversation.md.deprecated` so the section-discovery walker
17
+ * (which only picks up `.md` files) stops loading it, while preserving the
18
+ * user's customized text on disk for manual review.
19
+ *
20
+ * Idempotent: re-runs after `08-background-conversation.md` has already been
21
+ * renamed are no-ops. If both files exist (a user re-created the override
22
+ * after a prior partial run), the bundled section is gone — drop the `.md`
23
+ * and keep the previously-preserved `.deprecated` copy.
24
+ */
25
+
26
+ import { existsSync, renameSync, unlinkSync } from "node:fs";
27
+ import { join } from "node:path";
28
+
29
+ import { getLogger } from "../../util/logger.js";
30
+ import type { WorkspaceMigration } from "./types.js";
31
+
32
+ const log = getLogger(
33
+ "workspace-migration-088-deprecate-background-conversation-override",
34
+ );
35
+
36
+ const OVERRIDE_FILENAME = "08-background-conversation.md";
37
+ const DEPRECATED_FILENAME = "08-background-conversation.md.deprecated";
38
+
39
+ export const deprecateBackgroundConversationOverrideMigration: WorkspaceMigration =
40
+ {
41
+ id: "088-deprecate-background-conversation-override",
42
+ description:
43
+ "Rename stale prompts/system/08-background-conversation.md overrides to .deprecated so they stop rendering after the section moved to a per-turn injector",
44
+ retryFailedCheckpoint: true,
45
+
46
+ run(workspaceDir: string): void {
47
+ const promptDir = join(workspaceDir, "prompts", "system");
48
+ const overridePath = join(promptDir, OVERRIDE_FILENAME);
49
+ const deprecatedPath = join(promptDir, DEPRECATED_FILENAME);
50
+
51
+ if (!existsSync(overridePath)) return;
52
+
53
+ if (existsSync(deprecatedPath)) {
54
+ try {
55
+ unlinkSync(overridePath);
56
+ log.info(
57
+ { path: overridePath, preserved: deprecatedPath },
58
+ "Removed re-created background-conversation override; preserved copy already exists",
59
+ );
60
+ } catch (err) {
61
+ log.warn(
62
+ { err, path: overridePath },
63
+ "Failed to remove background-conversation override",
64
+ );
65
+ throw err;
66
+ }
67
+ return;
68
+ }
69
+
70
+ try {
71
+ renameSync(overridePath, deprecatedPath);
72
+ log.info(
73
+ { from: overridePath, to: deprecatedPath },
74
+ "Renamed stale background-conversation override to .deprecated",
75
+ );
76
+ } catch (err) {
77
+ log.warn(
78
+ { err, from: overridePath, to: deprecatedPath },
79
+ "Failed to rename background-conversation override",
80
+ );
81
+ throw err;
82
+ }
83
+ },
84
+
85
+ down(workspaceDir: string): void {
86
+ const promptDir = join(workspaceDir, "prompts", "system");
87
+ const overridePath = join(promptDir, OVERRIDE_FILENAME);
88
+ const deprecatedPath = join(promptDir, DEPRECATED_FILENAME);
89
+
90
+ if (!existsSync(deprecatedPath)) return;
91
+ if (existsSync(overridePath)) return;
92
+
93
+ try {
94
+ renameSync(deprecatedPath, overridePath);
95
+ } catch (err) {
96
+ log.warn(
97
+ { err, from: deprecatedPath, to: overridePath },
98
+ "Failed to restore background-conversation override",
99
+ );
100
+ throw err;
101
+ }
102
+ },
103
+ };
@@ -85,6 +85,7 @@ import { removeLegacySkillsIndexMigration } from "./084-remove-legacy-skills-ind
85
85
  import { memoryV2Bm25BReembedDisabledV2PagesMigration } from "./085-memory-v2-bm25-b-reembed-disabled-v2-pages.js";
86
86
  import { revertStaleGeminiMisRewritesMigration } from "./086-revert-stale-gemini-mis-rewrites.js";
87
87
  import { memoryRouterBalancedProfileMigration } from "./087-memory-router-balanced-profile.js";
88
+ import { deprecateBackgroundConversationOverrideMigration } from "./088-deprecate-background-conversation-override.js";
88
89
  import { migrateToWorkspaceVolumeMigration } from "./migrate-to-workspace-volume.js";
89
90
  import type { WorkspaceMigration } from "./types.js";
90
91
 
@@ -181,4 +182,5 @@ export const WORKSPACE_MIGRATIONS: WorkspaceMigration[] = [
181
182
  memoryV2Bm25BReembedDisabledV2PagesMigration,
182
183
  revertStaleGeminiMisRewritesMigration,
183
184
  memoryRouterBalancedProfileMigration,
185
+ deprecateBackgroundConversationOverrideMigration,
184
186
  ];
@@ -1,54 +0,0 @@
1
- ---
2
- name: document
3
- description: Write, draft, or compose long-form text (blog posts, articles, essays, reports, guides)
4
- compatibility: "Designed for Vellum personal assistants"
5
- metadata:
6
- emoji: "📄"
7
- vellum:
8
- display-name: "Document"
9
- activation-hints:
10
- - "User asks to write, draft, or collaborate on long-form content — use the document editor for a better editing experience"
11
- - "When content will be iterated on, reviewed, or exported, prefer the document editor over inline markdown"
12
- - "When a file attachment contains a draft or document the user wants to iterate on, open it in the editor"
13
- ---
14
-
15
- Create and edit long-form documents using the built-in rich text editor. Documents open in workspace mode with chat docked to the side.
16
-
17
- ## Tools
18
-
19
- - **document_create** - Opens a new document editor with an optional title and initial Markdown content. Returns a `surface_id` for subsequent updates.
20
- - **document_update** - Updates content in an open document editor by `surface_id`. Supports `replace` (overwrite) and `append` (add to end) modes.
21
- - **document_read** - Reads the current content of a document by `surface_id` when it belongs to the current conversation, or when the current actor is the guardian/local user. Use to verify content before editing.
22
- - **document_list** - Lists documents. Without `query`, lists the current conversation's documents. With `query`, searches by title; guardian/local users can search across conversations, while other actors are scoped to the current conversation.
23
- - **document_delete** - Deletes a document by `surface_id`. Use to clean up unwanted documents.
24
-
25
- ## Retrieving existing documents
26
-
27
- When the user asks to see, open, or pull up a document:
28
-
29
- 1. Check the `<active_documents>` block in your context — it lists all documents in this conversation with their `surface_id` and title. If the document is there, call `document_read` with its `surface_id`. Done in one call.
30
- 2. If the document is NOT in `<active_documents>`, call `document_list` with a `query` matching the document title. For guardian/local users, this searches across previous conversations and sessions.
31
- 3. Once you have the `surface_id`, call `document_read` to retrieve the content.
32
-
33
- **Never** search the filesystem, conversation history, or archives to find a document. Always use `document_list` with a `query`.
34
-
35
- ## Creating a new document
36
-
37
- 1. **Create the document**: Call `document_create` with a title (inferred from the request). Call the tool immediately, not after conversational preamble.
38
- 2. **Write content in Markdown**: Use proper structure (`#` for titles, `##` for sections), **bold**, _italic_, code blocks, tables, lists, blockquotes as appropriate.
39
- 3. **CRITICAL - Stream content in chunks**: Call `document_update` MULTIPLE times, not just once. Break content into logical chunks (paragraphs, sections, or every 200-300 words). Call `document_update` with `mode: "append"` for EACH chunk separately. The user experiences real-time content appearing as you write.
40
-
41
- ## Editing an existing document
42
-
43
- When the user requests changes to a document:
44
-
45
- 1. Find the `surface_id` from the `<active_documents>` context block.
46
- 2. Use `document_update` with the existing `surface_id` — do NOT call `document_create` again.
47
- 3. Use `mode: "replace"` for full rewrites or `mode: "append"` for additions.
48
-
49
- ## Usage Notes
50
-
51
- - The `mode` parameter on `document_update` defaults to `append`.
52
- - Documents are automatically saved and accessible via the Generated panel.
53
- - Users can manually edit documents at any time.
54
- - Write in clear, engaging prose. Use active voice, vary sentence structure, and break content into logical sections with descriptive headings.
@@ -1,106 +0,0 @@
1
- {
2
- "version": 1,
3
- "tools": [
4
- {
5
- "name": "document_create",
6
- "description": "Create a new long-form document with a rich text editor. Use this when the user asks to write a blog post, article, or any long-form content. The editor opens in workspace mode with chat docked to the side.",
7
- "category": "document",
8
- "risk": "low",
9
- "input_schema": {
10
- "type": "object",
11
- "properties": {
12
- "title": {
13
- "type": "string",
14
- "description": "Initial title for the document (optional, can be updated later)"
15
- },
16
- "initial_content": {
17
- "type": "string",
18
- "description": "Initial Markdown content to populate the editor (optional)"
19
- }
20
- }
21
- },
22
- "executor": "tools/document-create.ts",
23
- "execution_target": "host"
24
- },
25
- {
26
- "name": "document_update",
27
- "description": "Update content in an open document editor. Use this to stream generated content or apply edits.",
28
- "category": "document",
29
- "risk": "low",
30
- "input_schema": {
31
- "type": "object",
32
- "properties": {
33
- "surface_id": {
34
- "type": "string",
35
- "description": "The ID of the document surface to update"
36
- },
37
- "content": {
38
- "type": "string",
39
- "description": "Markdown content to set or append"
40
- },
41
- "mode": {
42
- "type": "string",
43
- "enum": ["replace", "append"],
44
- "description": "Whether to replace all content or append to the end. Defaults to append."
45
- }
46
- },
47
- "required": ["surface_id", "content"]
48
- },
49
- "executor": "tools/document-update.ts",
50
- "execution_target": "host"
51
- },
52
- {
53
- "name": "document_read",
54
- "description": "Read the current content of a document by its surface_id when it belongs to the current conversation, or when the current actor is the guardian/local user. Use this to verify document state before making edits.",
55
- "category": "document",
56
- "risk": "low",
57
- "input_schema": {
58
- "type": "object",
59
- "properties": {
60
- "surface_id": {
61
- "type": "string",
62
- "description": "The ID of the document to read"
63
- }
64
- },
65
- "required": ["surface_id"]
66
- },
67
- "executor": "tools/document-read.ts",
68
- "execution_target": "host"
69
- },
70
- {
71
- "name": "document_list",
72
- "description": "List documents. Without a query, lists documents in the current conversation. With a query, searches documents by title; guardian/local users can search across conversations, while other actors are scoped to the current conversation.",
73
- "category": "document",
74
- "risk": "low",
75
- "input_schema": {
76
- "type": "object",
77
- "properties": {
78
- "query": {
79
- "type": "string",
80
- "description": "Search documents by title. Omit to list only the current conversation's documents."
81
- }
82
- }
83
- },
84
- "executor": "tools/document-list.ts",
85
- "execution_target": "host"
86
- },
87
- {
88
- "name": "document_delete",
89
- "description": "Delete a document by its surface_id.",
90
- "category": "document",
91
- "risk": "low",
92
- "input_schema": {
93
- "type": "object",
94
- "properties": {
95
- "surface_id": {
96
- "type": "string",
97
- "description": "The ID of the document to delete"
98
- }
99
- },
100
- "required": ["surface_id"]
101
- },
102
- "executor": "tools/document-delete.ts",
103
- "execution_target": "host"
104
- }
105
- ]
106
- }
@@ -1,18 +0,0 @@
1
- import { existsSync, mkdirSync } from "node:fs";
2
-
3
- import { getLogger } from "../util/logger.js";
4
- import { getInterfacesDir } from "../util/platform.js";
5
-
6
- const log = getLogger("seed-files");
7
-
8
- /**
9
- * Ensures interface directories exist so the runtime can serve files
10
- * immediately. Called during daemon startup.
11
- */
12
- export function seedInterfaceFiles(): void {
13
- const tuiDir = getInterfacesDir();
14
- if (!existsSync(tuiDir)) {
15
- mkdirSync(tuiDir, { recursive: true });
16
- log.info("Created interfaces directory");
17
- }
18
- }
@@ -1,43 +0,0 @@
1
- /**
2
- * GET /v1/interfaces/:path*
3
- *
4
- * Serves interface definition files from the workspace's `interfaces/`
5
- * directory. Returns the raw file content as `text/plain`.
6
- */
7
-
8
- import { existsSync, readFileSync } from "node:fs";
9
- import { resolve } from "node:path";
10
-
11
- import { getInterfacesDir } from "../../util/platform.js";
12
- import { NotFoundError } from "./errors.js";
13
- import type { RouteDefinition } from "./types.js";
14
-
15
- export const ROUTES: RouteDefinition[] = [
16
- {
17
- operationId: "getInterface",
18
- endpoint: "interfaces/:path*",
19
- method: "GET",
20
- policyKey: "interfaces",
21
- summary: "Serve an interface definition file",
22
- tags: ["interfaces"],
23
- responseHeaders: { "Content-Type": "text/plain; charset=utf-8" },
24
- handler: ({ pathParams }) => {
25
- const interfacePath = pathParams?.path;
26
- if (!interfacePath) {
27
- throw new NotFoundError("Interface not found");
28
- }
29
-
30
- const interfacesDir = getInterfacesDir();
31
- const fullPath = resolve(interfacesDir, interfacePath);
32
- if (
33
- (fullPath !== interfacesDir &&
34
- !fullPath.startsWith(interfacesDir + "/")) ||
35
- !existsSync(fullPath)
36
- ) {
37
- throw new NotFoundError("Interface not found");
38
- }
39
-
40
- return readFileSync(fullPath, "utf-8");
41
- },
42
- },
43
- ];