@vellumai/assistant 0.6.5 → 0.6.6

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 (443) hide show
  1. package/AGENTS.md +9 -1
  2. package/ARCHITECTURE.md +15 -17
  3. package/Dockerfile +6 -4
  4. package/__tests__/permissions/gateway-threshold-reader.test.ts +283 -0
  5. package/docs/architecture/integrations.md +32 -39
  6. package/docs/architecture/memory.md +25 -30
  7. package/docs/architecture/security.md +7 -6
  8. package/docs/browser-use-architecture-phase2.md +63 -20
  9. package/docs/plugins.md +761 -0
  10. package/examples/plugins/echo/README.md +132 -0
  11. package/examples/plugins/echo/package.json +17 -0
  12. package/examples/plugins/echo/register.ts +187 -0
  13. package/node_modules/@vellumai/egress-proxy/src/types.ts +19 -0
  14. package/openapi.yaml +212 -68
  15. package/package.json +1 -1
  16. package/src/__tests__/app-compiler.test.ts +57 -0
  17. package/src/__tests__/approval-cascade.test.ts +7 -2
  18. package/src/__tests__/auto-analysis-end-to-end.test.ts +1 -0
  19. package/src/__tests__/avatar-generator.test.ts +4 -2
  20. package/src/__tests__/bundled-asset.test.ts +6 -6
  21. package/src/__tests__/catalog-cache.test.ts +69 -0
  22. package/src/__tests__/checker.test.ts +459 -171
  23. package/src/__tests__/circuit-breaker-pipeline.test.ts +406 -0
  24. package/src/__tests__/compaction-events.test.ts +501 -0
  25. package/src/__tests__/compaction-pipeline.test.ts +210 -0
  26. package/src/__tests__/compaction-strip-metadata-clear.test.ts +181 -0
  27. package/src/__tests__/compaction-timeout-recovery.test.ts +262 -0
  28. package/src/__tests__/config-model-image-provider.test.ts +110 -0
  29. package/src/__tests__/config-schema.test.ts +22 -9
  30. package/src/__tests__/config-watcher-cleanup-throttle.test.ts +0 -4
  31. package/src/__tests__/contacts-tools.test.ts +26 -0
  32. package/src/__tests__/context-overflow-policy.test.ts +7 -7
  33. package/src/__tests__/context-window-manager.test.ts +355 -4
  34. package/src/__tests__/conversation-abort-tool-results.test.ts +4 -1
  35. package/src/__tests__/conversation-agent-loop-overflow.test.ts +26 -30
  36. package/src/__tests__/conversation-agent-loop.test.ts +30 -141
  37. package/src/__tests__/conversation-confirmation-signals.test.ts +6 -1
  38. package/src/__tests__/conversation-history-web-search.test.ts +1 -0
  39. package/src/__tests__/conversation-init.benchmark.test.ts +2 -16
  40. package/src/__tests__/conversation-pairing.test.ts +174 -10
  41. package/src/__tests__/conversation-pre-run-repair.test.ts +4 -1
  42. package/src/__tests__/conversation-process-callsite.test.ts +3 -0
  43. package/src/__tests__/conversation-provider-retry-repair.test.ts +16 -7
  44. package/src/__tests__/conversation-queue.test.ts +29 -14
  45. package/src/__tests__/conversation-routes-disk-view.test.ts +7 -6
  46. package/src/__tests__/conversation-runtime-assembly.test.ts +155 -110
  47. package/src/__tests__/conversation-runtime-workspace.test.ts +23 -38
  48. package/src/__tests__/conversation-seed-composer.test.ts +2 -2
  49. package/src/__tests__/conversation-slash-queue.test.ts +7 -2
  50. package/src/__tests__/conversation-slash-unknown.test.ts +25 -2
  51. package/src/__tests__/conversation-speed-override.test.ts +6 -1
  52. package/src/__tests__/conversation-title-service.test.ts +116 -0
  53. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +41 -2
  54. package/src/__tests__/conversation-usage.test.ts +1 -1
  55. package/src/__tests__/conversation-workspace-cache-state.test.ts +4 -1
  56. package/src/__tests__/conversation-workspace-injection.test.ts +3 -0
  57. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +4 -1
  58. package/src/__tests__/credential-health-service.test.ts +78 -9
  59. package/src/__tests__/credential-security-invariants.test.ts +2 -2
  60. package/src/__tests__/db-schedule-syntax-migration.test.ts +1 -0
  61. package/src/__tests__/empty-response-pipeline.test.ts +305 -0
  62. package/src/__tests__/extension-id-sync-guard.test.ts +3 -3
  63. package/src/__tests__/first-greeting.test.ts +247 -5
  64. package/src/__tests__/headless-browser-mode.test.ts +57 -0
  65. package/src/__tests__/history-repair-pipeline.test.ts +399 -0
  66. package/src/__tests__/host-browser-e2e-cloud.test.ts +307 -0
  67. package/src/__tests__/host-browser-e2e-self-hosted.test.ts +3 -3
  68. package/src/__tests__/host-proxy-interface.test.ts +36 -2
  69. package/src/__tests__/image-credentials.test.ts +137 -0
  70. package/src/__tests__/image-service-dispatcher.test.ts +186 -0
  71. package/src/__tests__/injector-chain.test.ts +526 -0
  72. package/src/__tests__/intent-routing.test.ts +0 -26
  73. package/src/__tests__/llm-call-pipeline.test.ts +285 -0
  74. package/src/__tests__/llm-schema.test.ts +1 -1
  75. package/src/__tests__/media-generate-image.test.ts +119 -13
  76. package/src/__tests__/memory-retrieval-pipeline.test.ts +401 -0
  77. package/src/__tests__/memory-upsert-concurrency.test.ts +1 -0
  78. package/src/__tests__/migration-import-from-url.test.ts +5 -68
  79. package/src/__tests__/model-intents.test.ts +4 -2
  80. package/src/__tests__/notification-broadcaster.test.ts +3 -3
  81. package/src/__tests__/notification-decision-strategy.test.ts +0 -11
  82. package/src/__tests__/notification-schedule-notify-dedup.test.ts +108 -0
  83. package/src/__tests__/oauth-apps-routes.test.ts +1 -1
  84. package/src/__tests__/oauth-cli.test.ts +14 -12
  85. package/src/__tests__/oauth-connect-orchestrator.test.ts +4 -13
  86. package/src/__tests__/oauth-provider-serializer.test.ts +6 -4
  87. package/src/__tests__/oauth-provider-visibility.test.ts +3 -5
  88. package/src/__tests__/oauth-providers-routes.test.ts +3 -2
  89. package/src/__tests__/oauth-store.test.ts +41 -76
  90. package/src/__tests__/onboarding-template-contract.test.ts +16 -64
  91. package/src/__tests__/openai-image-service.test.ts +368 -0
  92. package/src/__tests__/overflow-reduce-pipeline.test.ts +676 -0
  93. package/src/__tests__/permission-checker-host-gate.test.ts +0 -24
  94. package/src/__tests__/persist-onboarding-artifacts.test.ts +266 -0
  95. package/src/__tests__/persistence-pipeline.test.ts +377 -0
  96. package/src/__tests__/pipeline-runner.test.ts +565 -0
  97. package/src/__tests__/platform.test.ts +5 -2
  98. package/src/__tests__/plugin-bootstrap.test.ts +483 -0
  99. package/src/__tests__/plugin-registry.test.ts +273 -0
  100. package/src/__tests__/plugin-route-contribution.test.ts +288 -0
  101. package/src/__tests__/plugin-skill-contribution.test.ts +367 -0
  102. package/src/__tests__/plugin-tool-contribution.test.ts +286 -0
  103. package/src/__tests__/plugin-types.test.ts +320 -0
  104. package/src/__tests__/pricing.test.ts +44 -12
  105. package/src/__tests__/proxy-approval-callback.test.ts +69 -8
  106. package/src/__tests__/reaction-persistence.test.ts +1 -0
  107. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
  108. package/src/__tests__/registry.test.ts +0 -2
  109. package/src/__tests__/schedule-routes.test.ts +131 -1
  110. package/src/__tests__/scheduler-recurrence.test.ts +14 -70
  111. package/src/__tests__/scheduler-reuse-conversation.test.ts +10 -50
  112. package/src/__tests__/secret-detection-handler.test.ts +0 -10
  113. package/src/__tests__/shell-identity.test.ts +0 -134
  114. package/src/__tests__/suggestion-routes.test.ts +103 -4
  115. package/src/__tests__/task-memory-cleanup.test.ts +1 -0
  116. package/src/__tests__/task-scheduler.test.ts +3 -15
  117. package/src/__tests__/test-preload.ts +11 -0
  118. package/src/__tests__/title-generate-pipeline.test.ts +224 -0
  119. package/src/__tests__/token-estimate-pipeline.test.ts +431 -0
  120. package/src/__tests__/tool-error-pipeline.test.ts +244 -0
  121. package/src/__tests__/tool-execute-pipeline.test.ts +431 -0
  122. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -6
  123. package/src/__tests__/tool-executor-shell-integration.test.ts +7 -10
  124. package/src/__tests__/tool-executor.test.ts +141 -0
  125. package/src/__tests__/tool-result-truncate-pipeline.test.ts +356 -0
  126. package/src/__tests__/tool-result-truncation.test.ts +0 -110
  127. package/src/__tests__/user-plugin-loader.test.ts +191 -0
  128. package/src/__tests__/workspace-migration-046-seed-conversation-starters-callsite.test.ts +185 -0
  129. package/src/__tests__/workspace-migration-049-release-notes-default-sonnet.test.ts +100 -0
  130. package/src/__tests__/workspace-migration-050-seed-main-agent-opus-callsite.test.ts +171 -0
  131. package/src/__tests__/workspace-migration-051-seed-conversation-summarization-callsite.test.ts +252 -0
  132. package/src/__tests__/workspace-migration-remove-hooks.test.ts +99 -0
  133. package/src/__tests__/workspace-policy.test.ts +21 -3
  134. package/src/agent/loop.ts +340 -102
  135. package/src/approvals/__tests__/guardian-feed-event.test.ts +304 -0
  136. package/src/approvals/guardian-request-resolvers.ts +80 -0
  137. package/src/backup/__tests__/backup-worker.test.ts +2 -13
  138. package/src/backup/backup-worker.ts +3 -15
  139. package/src/bundler/app-compiler.ts +84 -1
  140. package/src/calls/call-state.ts +2 -2
  141. package/src/channels/__tests__/types.test.ts +3 -3
  142. package/src/channels/types.ts +6 -4
  143. package/src/cli/__tests__/notifications.test.ts +87 -211
  144. package/src/cli/commands/__tests__/backup.test.ts +1 -1
  145. package/src/cli/commands/__tests__/image-generation.test.ts +255 -35
  146. package/src/cli/commands/__tests__/inference-send.test.ts +12 -0
  147. package/src/cli/commands/__tests__/tts-synthesize.test.ts +12 -0
  148. package/src/cli/commands/backup.ts +2 -2
  149. package/src/cli/commands/clients.ts +138 -0
  150. package/src/cli/commands/completions.ts +2 -9
  151. package/src/cli/commands/conversations.ts +55 -7
  152. package/src/cli/commands/image-generation.ts +33 -34
  153. package/src/cli/commands/notifications.ts +68 -103
  154. package/src/cli/commands/oauth/__tests__/providers-register.test.ts +1 -1
  155. package/src/cli/commands/oauth/__tests__/providers-update.test.ts +1 -1
  156. package/src/cli/commands/oauth/connect.ts +2 -2
  157. package/src/cli/commands/oauth/providers.ts +176 -8
  158. package/src/cli/commands/oauth/status.ts +46 -36
  159. package/src/cli/commands/skills.ts +3 -4
  160. package/src/cli/program.ts +25 -29
  161. package/src/config/__tests__/backup-schema.test.ts +7 -2
  162. package/src/config/bundled-skills/app-builder/SKILL.md +2 -2
  163. package/src/config/bundled-skills/app-builder/references/WIDGETS.md +10 -10
  164. package/src/config/bundled-skills/contacts/tools/contact-merge.ts +66 -87
  165. package/src/config/bundled-skills/contacts/tools/contact-search.ts +28 -51
  166. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +22 -40
  167. package/src/config/bundled-skills/image-studio/SKILL.md +2 -1
  168. package/src/config/bundled-skills/image-studio/TOOLS.json +2 -1
  169. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +23 -39
  170. package/src/config/bundled-skills/messaging/SKILL.md +3 -3
  171. package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +207 -0
  172. package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +12 -0
  173. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +58 -0
  174. package/src/config/bundled-skills/schedule/SKILL.md +8 -3
  175. package/src/config/bundled-skills/schedule/TOOLS.json +15 -7
  176. package/src/config/bundled-skills/schedule/references/SCRIPT_MODE_PATTERNS.md +59 -0
  177. package/src/config/bundled-tool-registry.ts +0 -15
  178. package/src/config/feature-flag-registry.json +17 -1
  179. package/src/config/schema.ts +19 -0
  180. package/src/config/schemas/backup.ts +1 -1
  181. package/src/config/schemas/conversations.ts +16 -0
  182. package/src/config/schemas/llm.ts +2 -3
  183. package/src/config/schemas/security.ts +6 -6
  184. package/src/config/schemas/tts.ts +11 -0
  185. package/src/config/skill-state.ts +6 -2
  186. package/src/config/skills.ts +94 -5
  187. package/src/context/__tests__/compact-prompt.test.ts +27 -9
  188. package/src/context/prompts/compact.md +26 -12
  189. package/src/context/tool-result-truncation.ts +3 -63
  190. package/src/context/window-manager.ts +190 -16
  191. package/src/credential-health/credential-health-service.ts +19 -6
  192. package/src/daemon/__tests__/conversation-feed-event.test.ts +317 -0
  193. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +4 -12
  194. package/src/daemon/__tests__/conversation-tool-setup.test.ts +14 -15
  195. package/src/daemon/config-watcher.ts +0 -2
  196. package/src/daemon/context-overflow-policy.ts +4 -13
  197. package/src/daemon/conversation-agent-loop-handlers.ts +83 -22
  198. package/src/daemon/conversation-agent-loop.ts +984 -683
  199. package/src/daemon/conversation-history.ts +10 -19
  200. package/src/daemon/conversation-lifecycle.ts +37 -19
  201. package/src/daemon/conversation-notifiers.ts +2 -110
  202. package/src/daemon/conversation-process.ts +14 -7
  203. package/src/daemon/conversation-runtime-assembly.ts +532 -411
  204. package/src/daemon/conversation-tool-setup.ts +41 -4
  205. package/src/daemon/conversation.ts +80 -35
  206. package/src/daemon/external-plugins-bootstrap.ts +478 -0
  207. package/src/daemon/first-greeting.ts +191 -14
  208. package/src/daemon/handlers/config-model.ts +11 -0
  209. package/src/daemon/handlers/skills.ts +5 -1
  210. package/src/daemon/lifecycle.ts +33 -68
  211. package/src/daemon/message-types/computer-use.ts +2 -34
  212. package/src/daemon/message-types/conversations.ts +49 -0
  213. package/src/daemon/message-types/messages.ts +12 -0
  214. package/src/daemon/server.ts +5 -3
  215. package/src/daemon/shutdown-handlers.ts +2 -12
  216. package/src/daemon/tool-side-effects.ts +14 -56
  217. package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +160 -0
  218. package/src/heartbeat/heartbeat-service.ts +24 -1
  219. package/src/home/__tests__/feed-population-integration.test.ts +312 -0
  220. package/src/home/emit-feed-event.ts +7 -0
  221. package/src/home/feed-types.ts +41 -2
  222. package/src/home/rewrite-command-preview.ts +66 -0
  223. package/src/ipc/__tests__/socket-path.test.ts +11 -50
  224. package/src/ipc/cli-client.ts +1 -1
  225. package/src/ipc/cli-server.ts +3 -3
  226. package/src/ipc/gateway-client.ts +4 -1
  227. package/src/ipc/routes/browser-context.ts +2 -0
  228. package/src/ipc/routes/browser.ts +1 -0
  229. package/src/ipc/routes/get-contact.ts +16 -0
  230. package/src/ipc/routes/index.ts +14 -0
  231. package/src/ipc/routes/list-clients.ts +31 -0
  232. package/src/ipc/routes/merge-contacts.ts +17 -0
  233. package/src/ipc/routes/notification.ts +133 -0
  234. package/src/ipc/routes/rename-conversation.ts +59 -0
  235. package/src/ipc/routes/search-contacts.ts +19 -0
  236. package/src/ipc/routes/upsert-contact.ts +25 -0
  237. package/src/ipc/socket-path.ts +14 -38
  238. package/src/media/app-icon-generator.ts +23 -46
  239. package/src/media/avatar-router.ts +26 -41
  240. package/src/media/gemini-image-service.ts +8 -41
  241. package/src/media/image-credentials.ts +73 -0
  242. package/src/media/image-service.ts +85 -0
  243. package/src/media/openai-image-service.ts +131 -0
  244. package/src/media/types.ts +46 -0
  245. package/src/memory/conversation-crud.ts +48 -18
  246. package/src/memory/conversation-queries.ts +57 -4
  247. package/src/memory/conversation-title-service.ts +25 -0
  248. package/src/memory/db-init.ts +8 -0
  249. package/src/memory/embedding-gemini.test.ts +41 -2
  250. package/src/memory/embedding-gemini.ts +6 -1
  251. package/src/memory/graph/bootstrap.test.ts +282 -0
  252. package/src/memory/graph/bootstrap.ts +8 -5
  253. package/src/memory/graph/extraction.ts +10 -2
  254. package/src/memory/graph/graph-search.test.ts +1 -0
  255. package/src/memory/graph/inspect.ts +2 -2
  256. package/src/memory/graph/retriever.ts +10 -3
  257. package/src/memory/migrations/041-approval-prompt-ts-tracker.ts +26 -0
  258. package/src/memory/migrations/149-oauth-tables.ts +1 -0
  259. package/src/memory/migrations/223-schedule-script-column.ts +11 -0
  260. package/src/memory/migrations/224-oauth-providers-managed-service-is-paid.ts +24 -0
  261. package/src/memory/migrations/225-oauth-providers-available-scopes.ts +13 -0
  262. package/src/memory/migrations/index.ts +4 -0
  263. package/src/memory/pkb/pkb-index.test.ts +1 -0
  264. package/src/memory/pkb/pkb-reconcile.test.ts +1 -0
  265. package/src/memory/pkb/pkb-search.test.ts +65 -4
  266. package/src/memory/pkb/pkb-search.ts +40 -18
  267. package/src/memory/qdrant-client.test.ts +60 -0
  268. package/src/memory/qdrant-client.ts +25 -0
  269. package/src/memory/schema/infrastructure.ts +1 -0
  270. package/src/memory/schema/oauth.ts +4 -1
  271. package/src/messaging/providers/slack/render-transcript.test.ts +77 -29
  272. package/src/messaging/providers/slack/render-transcript.ts +58 -0
  273. package/src/notifications/conversation-pairing.ts +78 -19
  274. package/src/notifications/copy-composer.ts +0 -5
  275. package/src/notifications/emit-signal.ts +1 -1
  276. package/src/notifications/signal.ts +1 -2
  277. package/src/oauth/AGENTS.md +1 -1
  278. package/src/oauth/__tests__/identity-verifier.test.ts +2 -1
  279. package/src/oauth/connect-orchestrator.ts +8 -34
  280. package/src/oauth/connect-types.ts +6 -10
  281. package/src/oauth/manual-token-connection.ts +23 -0
  282. package/src/oauth/oauth-store.ts +30 -14
  283. package/src/oauth/provider-serializer.ts +6 -1
  284. package/src/oauth/seed-providers.ts +56 -108
  285. package/src/outbound-proxy/http-forwarder.ts +9 -0
  286. package/src/permissions/approval-policy.test.ts +293 -18
  287. package/src/permissions/approval-policy.ts +110 -58
  288. package/src/permissions/arg-parser.test.ts +161 -0
  289. package/src/permissions/arg-parser.ts +141 -0
  290. package/src/permissions/bash-risk-classifier.test.ts +414 -2
  291. package/src/permissions/bash-risk-classifier.ts +303 -60
  292. package/src/permissions/checker.ts +157 -29
  293. package/src/permissions/command-registry.test.ts +239 -0
  294. package/src/permissions/command-registry.ts +234 -54
  295. package/src/permissions/defaults.ts +5 -4
  296. package/src/permissions/gateway-threshold-reader.ts +196 -0
  297. package/src/permissions/prompter.ts +4 -0
  298. package/src/permissions/risk-types.ts +61 -4
  299. package/src/permissions/schedule-risk-classifier.test.ts +129 -0
  300. package/src/permissions/schedule-risk-classifier.ts +85 -0
  301. package/src/permissions/shell-identity.ts +2 -42
  302. package/src/permissions/types.ts +2 -0
  303. package/src/permissions/workspace-policy.ts +8 -3
  304. package/src/plugins/defaults/circuit-breaker.ts +146 -0
  305. package/src/plugins/defaults/compaction.ts +145 -0
  306. package/src/plugins/defaults/empty-response.ts +126 -0
  307. package/src/plugins/defaults/history-repair.ts +85 -0
  308. package/src/plugins/defaults/index.ts +116 -0
  309. package/src/plugins/defaults/injectors.ts +491 -0
  310. package/src/plugins/defaults/llm-call.ts +82 -0
  311. package/src/plugins/defaults/memory-retrieval.ts +226 -0
  312. package/src/plugins/defaults/overflow-reduce.ts +181 -0
  313. package/src/plugins/defaults/persistence.ts +129 -0
  314. package/src/plugins/defaults/title-generate.ts +95 -0
  315. package/src/plugins/defaults/token-estimate.ts +104 -0
  316. package/src/plugins/defaults/tool-error.ts +126 -0
  317. package/src/plugins/defaults/tool-execute.ts +89 -0
  318. package/src/plugins/defaults/tool-result-truncate.ts +88 -0
  319. package/src/plugins/pipeline.ts +316 -0
  320. package/src/plugins/plugin-skill-contributions.ts +292 -0
  321. package/src/plugins/registry.ts +241 -0
  322. package/src/plugins/types.ts +1134 -0
  323. package/src/plugins/user-loader.ts +177 -0
  324. package/src/prompts/templates/BOOTSTRAP.md +27 -77
  325. package/src/providers/model-catalog.ts +52 -29
  326. package/src/providers/model-intents.ts +1 -1
  327. package/src/providers/openrouter/client.ts +5 -1
  328. package/src/providers/speech-to-text/deepgram-realtime.test.ts +61 -0
  329. package/src/providers/speech-to-text/deepgram-realtime.ts +57 -0
  330. package/src/providers/speech-to-text/xai-realtime.test.ts +72 -4
  331. package/src/providers/speech-to-text/xai-realtime.ts +39 -14
  332. package/src/runtime/AGENTS.md +25 -16
  333. package/src/runtime/__tests__/browser-extension-pair-routes.test.ts +3 -3
  334. package/src/runtime/__tests__/client-registry.test.ts +293 -0
  335. package/src/runtime/client-registry.ts +261 -0
  336. package/src/runtime/http-server.ts +77 -8
  337. package/src/runtime/http-types.ts +0 -2
  338. package/src/runtime/migrations/vbundle-builder.ts +1 -22
  339. package/src/runtime/routes/approval-prompt-ts-tracker.ts +51 -31
  340. package/src/runtime/routes/approval-routes.ts +17 -0
  341. package/src/runtime/routes/browser-extension-pair-routes.ts +27 -8
  342. package/src/runtime/routes/conversation-routes.ts +223 -116
  343. package/src/runtime/routes/inbound-message-handler.ts +88 -13
  344. package/src/runtime/routes/memory-item-routes.test.ts +1 -0
  345. package/src/runtime/routes/migration-routes.ts +0 -3
  346. package/src/runtime/routes/playground/__tests__/force-compact.test.ts +284 -0
  347. package/src/runtime/routes/playground/__tests__/guard.test.ts +80 -0
  348. package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +294 -0
  349. package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +271 -0
  350. package/src/runtime/routes/playground/__tests__/seed-conversation.test.ts +202 -0
  351. package/src/runtime/routes/playground/__tests__/seeded-conversations.test.ts +309 -0
  352. package/src/runtime/routes/playground/__tests__/state.test.ts +224 -0
  353. package/src/runtime/routes/playground/conversation-not-found.ts +29 -0
  354. package/src/runtime/routes/playground/deps.ts +56 -0
  355. package/src/runtime/routes/playground/force-compact.ts +73 -0
  356. package/src/runtime/routes/playground/guard.ts +37 -0
  357. package/src/runtime/routes/playground/index.ts +28 -0
  358. package/src/runtime/routes/playground/inject-failures.ts +159 -0
  359. package/src/runtime/routes/playground/reset-circuit.ts +115 -0
  360. package/src/runtime/routes/playground/seed-conversation.ts +139 -0
  361. package/src/runtime/routes/playground/seeded-conversations.ts +78 -0
  362. package/src/runtime/routes/playground/state.ts +78 -0
  363. package/src/runtime/routes/schedule-routes.ts +89 -8
  364. package/src/runtime/skill-route-registry.ts +75 -15
  365. package/src/schedule/run-script.ts +68 -0
  366. package/src/schedule/schedule-store.ts +7 -1
  367. package/src/schedule/scheduler.ts +48 -8
  368. package/src/skills/catalog-cache.ts +12 -5
  369. package/src/tools/browser/__tests__/browser-status.test.ts +189 -0
  370. package/src/tools/browser/browser-execution.ts +88 -19
  371. package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +230 -0
  372. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +146 -3
  373. package/src/tools/browser/cdp-client/extension-cdp-client.ts +54 -3
  374. package/src/tools/browser/cdp-client/factory.ts +15 -4
  375. package/src/tools/executor.ts +126 -74
  376. package/src/tools/network/script-proxy/session-manager.ts +37 -1
  377. package/src/tools/permission-checker.ts +98 -49
  378. package/src/tools/policy-context.ts +4 -0
  379. package/src/tools/registry.ts +140 -3
  380. package/src/tools/schedule/create.ts +23 -8
  381. package/src/tools/schedule/update.ts +3 -1
  382. package/src/tools/secret-detection-handler.ts +0 -51
  383. package/src/tools/system/avatar-generator.ts +6 -2
  384. package/src/tools/types.ts +28 -2
  385. package/src/util/platform.ts +7 -2
  386. package/src/util/pricing.ts +26 -3
  387. package/src/workspace/migrations/006-services-config.ts +2 -4
  388. package/src/workspace/migrations/022-move-hooks-to-workspace.ts +2 -3
  389. package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +3 -4
  390. package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +108 -0
  391. package/src/workspace/migrations/047-remove-watch-callsites.ts +54 -0
  392. package/src/workspace/migrations/048-remove-workspace-hooks.ts +81 -0
  393. package/src/workspace/migrations/049-release-notes-default-sonnet.ts +80 -0
  394. package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +86 -0
  395. package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +128 -0
  396. package/src/workspace/migrations/registry.ts +12 -0
  397. package/tsconfig.json +1 -1
  398. package/hook-templates/debug-prompt-logger/hook.json +0 -7
  399. package/hook-templates/debug-prompt-logger/run.sh +0 -66
  400. package/src/__tests__/compaction-circuit-breaker.test.ts +0 -336
  401. package/src/__tests__/context-overflow-approval.test.ts +0 -156
  402. package/src/__tests__/hooks-blocking.test.ts +0 -178
  403. package/src/__tests__/hooks-cli.test.ts +0 -182
  404. package/src/__tests__/hooks-config.test.ts +0 -108
  405. package/src/__tests__/hooks-discovery.test.ts +0 -211
  406. package/src/__tests__/hooks-integration.test.ts +0 -196
  407. package/src/__tests__/hooks-manager.test.ts +0 -226
  408. package/src/__tests__/hooks-runner.test.ts +0 -175
  409. package/src/__tests__/hooks-settings.test.ts +0 -160
  410. package/src/__tests__/hooks-templates.test.ts +0 -169
  411. package/src/__tests__/hooks-ts-runner.test.ts +0 -170
  412. package/src/__tests__/hooks-watch.test.ts +0 -112
  413. package/src/__tests__/notification-schedule-dedup.test.ts +0 -213
  414. package/src/__tests__/oauth-scope-policy.test.ts +0 -180
  415. package/src/__tests__/send-notification-tool.test.ts +0 -83
  416. package/src/cli/commands/shotgun.ts +0 -266
  417. package/src/config/bundled-skills/conversations/SKILL.md +0 -20
  418. package/src/config/bundled-skills/conversations/TOOLS.json +0 -23
  419. package/src/config/bundled-skills/conversations/tools/rename-conversation.ts +0 -88
  420. package/src/config/bundled-skills/heartbeat/SKILL.md +0 -43
  421. package/src/config/bundled-skills/notifications/SKILL.md +0 -40
  422. package/src/config/bundled-skills/notifications/TOOLS.json +0 -80
  423. package/src/config/bundled-skills/notifications/tools/send-notification.ts +0 -152
  424. package/src/config/bundled-skills/notifications/tools/shared.ts +0 -13
  425. package/src/config/bundled-skills/screen-watch/SKILL.md +0 -27
  426. package/src/config/bundled-skills/screen-watch/TOOLS.json +0 -35
  427. package/src/config/bundled-skills/screen-watch/tools/start-screen-watch.ts +0 -12
  428. package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -84
  429. package/src/daemon/context-overflow-approval.ts +0 -52
  430. package/src/daemon/watch-handler.ts +0 -399
  431. package/src/hooks/cli.ts +0 -253
  432. package/src/hooks/config.ts +0 -100
  433. package/src/hooks/discovery.ts +0 -135
  434. package/src/hooks/manager.ts +0 -179
  435. package/src/hooks/runner.ts +0 -117
  436. package/src/hooks/templates.ts +0 -77
  437. package/src/hooks/types.ts +0 -75
  438. package/src/oauth/scope-policy.ts +0 -89
  439. package/src/runtime/gateway-internal-client.ts +0 -94
  440. package/src/runtime/routes/watch-routes.ts +0 -156
  441. package/src/signals/shotgun.ts +0 -203
  442. package/src/tools/watch/screen-watch.ts +0 -144
  443. package/src/tools/watch/watch-state.ts +0 -142
@@ -30,7 +30,7 @@ mock.module("../providers/registry.js", () => ({
30
30
  mock.module("../config/loader.js", () => ({
31
31
  getConfig: () => ({
32
32
  ui: {},
33
-
33
+
34
34
  llm: {
35
35
  default: {
36
36
  provider: "mock-provider",
@@ -206,6 +206,24 @@ mock.module("../config/skill-state.js", () => ({
206
206
  })),
207
207
  }));
208
208
 
209
+ // Avoid real workspace-git initialization on /tmp — on CI runners,
210
+ // `git add -A` under /tmp hits permission errors on systemd-private dirs,
211
+ // which blocks `runAgentLoopImpl` for long enough to trip the test's
212
+ // 5s timeout before `AgentLoop.run` is invoked.
213
+ mock.module("../workspace/git-service.js", () => ({
214
+ getWorkspaceGitService: () => ({
215
+ ensureInitialized: async () => {},
216
+ }),
217
+ }));
218
+
219
+ mock.module("../workspace/turn-commit.js", () => ({
220
+ commitTurnChanges: async () => {},
221
+ }));
222
+
223
+ mock.module("../memory/app-git-service.js", () => ({
224
+ commitAppTurnChanges: async () => {},
225
+ }));
226
+
209
227
  // ---------------------------------------------------------------------------
210
228
  // AgentLoop mock — tracks whether run() was called
211
229
  // ---------------------------------------------------------------------------
@@ -218,6 +236,9 @@ mock.module("../agent/loop.js", () => ({
218
236
  getToolTokenBudget() {
219
237
  return 0;
220
238
  }
239
+ getResolvedTools() {
240
+ return [];
241
+ }
221
242
  getActiveModel() {
222
243
  return undefined;
223
244
  }
@@ -226,7 +247,9 @@ mock.module("../agent/loop.js", () => ({
226
247
  onEvent: (event: AgentEvent) => void,
227
248
  _signal?: AbortSignal,
228
249
  _requestId?: string,
229
- _onCheckpoint?: (checkpoint: CheckpointInfo) => CheckpointDecision,
250
+ _onCheckpoint?: (
251
+ checkpoint: CheckpointInfo,
252
+ ) => CheckpointDecision | Promise<CheckpointDecision>,
230
253
  ): Promise<Message[]> {
231
254
  agentLoopRunCalled = true;
232
255
  const assistantMsg: Message = {
@@ -211,6 +211,9 @@ mock.module("../agent/loop.js", () => ({
211
211
  getToolTokenBudget() {
212
212
  return 0;
213
213
  }
214
+ getResolvedTools() {
215
+ return [];
216
+ }
214
217
  getActiveModel() {
215
218
  return undefined;
216
219
  }
@@ -219,7 +222,9 @@ mock.module("../agent/loop.js", () => ({
219
222
  _onEvent: (event: AgentEvent) => void,
220
223
  _signal?: AbortSignal,
221
224
  _requestId?: string,
222
- _onCheckpoint?: (checkpoint: CheckpointInfo) => CheckpointDecision,
225
+ _onCheckpoint?: (
226
+ checkpoint: CheckpointInfo,
227
+ ) => CheckpointDecision | Promise<CheckpointDecision>,
223
228
  ): Promise<Message[]> {
224
229
  return [];
225
230
  }
@@ -214,6 +214,122 @@ describe("conversation-title-service", () => {
214
214
  );
215
215
  });
216
216
 
217
+ test("rejects meta-failure outputs like 'Missing Context' and uses fallback", async () => {
218
+ mockRunBtwSidechain.mockImplementationOnce(async () => ({
219
+ text: "Missing Context",
220
+ hadTextDeltas: true,
221
+ response: {
222
+ content: [{ type: "text", text: "Missing Context" }],
223
+ model: "test-model",
224
+ usage: { inputTokens: 10, outputTokens: 5 },
225
+ stopReason: "end_turn",
226
+ },
227
+ }));
228
+
229
+ const provider = {
230
+ name: "test-provider",
231
+ sendMessage: mock(async () => {
232
+ throw new Error("should not call directly");
233
+ }),
234
+ };
235
+
236
+ const result = await generateAndPersistConversationTitle({
237
+ conversationId: "conv-1",
238
+ provider,
239
+ userMessage: "so about that t-shirt...",
240
+ });
241
+
242
+ expect(result.title).toBe("Untitled Conversation");
243
+ expect(mockUpdateConversationTitle).toHaveBeenCalledWith(
244
+ "conv-1",
245
+ "Untitled Conversation",
246
+ 1,
247
+ );
248
+ });
249
+
250
+ test.each([
251
+ "missing context",
252
+ "No Context",
253
+ "Insufficient Context",
254
+ "Unclear Request",
255
+ "No Topic",
256
+ "Empty Conversation",
257
+ ])("rejects meta-failure variant: %s", async (bad) => {
258
+ mockRunBtwSidechain.mockImplementationOnce(async () => ({
259
+ text: bad,
260
+ hadTextDeltas: true,
261
+ response: {
262
+ content: [{ type: "text", text: bad }],
263
+ model: "test-model",
264
+ usage: { inputTokens: 10, outputTokens: 5 },
265
+ stopReason: "end_turn",
266
+ },
267
+ }));
268
+
269
+ const provider = {
270
+ name: "test-provider",
271
+ sendMessage: mock(async () => {
272
+ throw new Error("should not call directly");
273
+ }),
274
+ };
275
+
276
+ const result = await generateAndPersistConversationTitle({
277
+ conversationId: "conv-1",
278
+ provider,
279
+ userMessage: "something",
280
+ });
281
+
282
+ expect(result.title).toBe("Untitled Conversation");
283
+ });
284
+
285
+ test("regeneration skips LLM call when recent messages have no extractable text", async () => {
286
+ mockGetMessages.mockReturnValueOnce([
287
+ {
288
+ role: "assistant",
289
+ content: JSON.stringify([
290
+ { type: "tool_use", id: "toolu_1", name: "bash", input: {} },
291
+ ]),
292
+ },
293
+ {
294
+ role: "user",
295
+ content: JSON.stringify([
296
+ {
297
+ type: "tool_result",
298
+ tool_use_id: "toolu_1",
299
+ content: [{ type: "image", source: {} }],
300
+ },
301
+ ]),
302
+ },
303
+ {
304
+ role: "assistant",
305
+ content: JSON.stringify([
306
+ { type: "tool_use", id: "toolu_2", name: "bash", input: {} },
307
+ ]),
308
+ },
309
+ ]);
310
+
311
+ mockGetConversation.mockReturnValueOnce({
312
+ title: "Existing Title",
313
+ isAutoTitle: 1,
314
+ });
315
+
316
+ const provider = {
317
+ name: "test-provider",
318
+ sendMessage: mock(async () => {
319
+ throw new Error("should not call directly");
320
+ }),
321
+ };
322
+
323
+ const result = await regenerateConversationTitle({
324
+ conversationId: "conv-1",
325
+ provider,
326
+ });
327
+
328
+ expect(mockRunBtwSidechain).not.toHaveBeenCalled();
329
+ expect(mockUpdateConversationTitle).not.toHaveBeenCalled();
330
+ expect(result).toEqual({ title: "Existing Title", updated: false });
331
+ });
332
+
217
333
  test("title prompt content does not contain generation instructions", async () => {
218
334
  const provider = {
219
335
  name: "test-provider",
@@ -44,7 +44,9 @@ mock.module("../tools/browser/browser-screencast.js", () => ({
44
44
  registerConversationSender: mock(() => {}),
45
45
  }));
46
46
 
47
- // Mock app-store functions used by handleAppChange in tool-side-effects
47
+ // Stub app-store functions used by other modules (e.g. app-source-watcher,
48
+ // conversation-surfaces) so tool-side-effects' hooks can run without touching
49
+ // the real app store during tests.
48
50
  mock.module("../memory/app-store.js", () => ({
49
51
  getApp: mock(() => null),
50
52
  getAppDirPath: mock(() => "/tmp/test-apps/dummy"),
@@ -286,6 +288,44 @@ describe("session-tool-setup app refresh side effects", () => {
286
288
 
287
289
  expect(broadcastSpy).not.toHaveBeenCalled();
288
290
  });
291
+
292
+ test("fires notify side effects regardless of compile outcome reported in payload", async () => {
293
+ // The hook observes the tool result but does not branch on compile
294
+ // status fields inside it. Whether the executor reports a successful
295
+ // compile or returns compile_errors, the hook still refreshes
296
+ // surfaces and broadcasts — compile retries are the LLM's
297
+ // responsibility via a follow-up tool call, not the hook's.
298
+ const ctx = makeCtx();
299
+ const executor = makeFakeExecutor({
300
+ content: JSON.stringify({
301
+ id: "new-app-err",
302
+ name: "Busted",
303
+ compiled: false,
304
+ compile_errors: [{ text: "syntax error" }],
305
+ }),
306
+ isError: false,
307
+ });
308
+ const broadcastSpy = mock(() => {});
309
+
310
+ const toolFn = createToolExecutor(
311
+ executor as unknown as ToolExecutor,
312
+ noopPrompter,
313
+ noopSecretPrompter,
314
+ ctx,
315
+ noopLifecycleHandler,
316
+ broadcastSpy,
317
+ );
318
+
319
+ await toolFn("app_create", { name: "Busted", html: "" });
320
+
321
+ expect(refreshSpy).toHaveBeenCalledTimes(1);
322
+ expect(broadcastSpy.mock.calls.length).toBeGreaterThanOrEqual(1);
323
+ expect((broadcastSpy.mock.calls as unknown[][])[0][0]).toEqual({
324
+ type: "app_files_changed",
325
+ appId: "new-app-err",
326
+ });
327
+ expect(updatePublishedSpy).toHaveBeenCalledTimes(1);
328
+ });
289
329
  });
290
330
 
291
331
  // ── app_delete side effects ────────────────────────────────────────
@@ -435,5 +475,4 @@ describe("session-tool-setup app refresh side effects", () => {
435
475
  expect(updatePublishedSpy).toHaveBeenCalledTimes(1);
436
476
  });
437
477
  });
438
-
439
478
  });
@@ -105,7 +105,7 @@ describe("recordUsage", () => {
105
105
  expect(events[0].estimatedCostUsd).toBe(
106
106
  expectedPricing.estimatedCostUsd ?? null,
107
107
  );
108
- // Sanity: fast should be 6x standard ($30 * 6 = $180)
108
+ // Sanity: fast should be 6x standard (claude-opus-4-6 at $5/$25 → $30 * 6 = $180)
109
109
  expect(expectedPricing.estimatedCostUsd).toBe(180);
110
110
  });
111
111
 
@@ -24,7 +24,7 @@ mock.module("../providers/registry.js", () => ({
24
24
  mock.module("../config/loader.js", () => ({
25
25
  getConfig: () => ({
26
26
  ui: {},
27
-
27
+
28
28
  llm: {
29
29
  default: {
30
30
  provider: "mock-provider",
@@ -167,6 +167,9 @@ mock.module("../agent/loop.js", () => ({
167
167
  getToolTokenBudget() {
168
168
  return 0;
169
169
  }
170
+ getResolvedTools() {
171
+ return [];
172
+ }
170
173
  getActiveModel() {
171
174
  return undefined;
172
175
  }
@@ -227,6 +227,9 @@ mock.module("../agent/loop.js", () => ({
227
227
  getToolTokenBudget() {
228
228
  return 0;
229
229
  }
230
+ getResolvedTools() {
231
+ return [];
232
+ }
230
233
  getActiveModel() {
231
234
  return undefined;
232
235
  }
@@ -31,7 +31,7 @@ mock.module("../providers/registry.js", () => ({
31
31
  mock.module("../config/loader.js", () => ({
32
32
  getConfig: () => ({
33
33
  ui: {},
34
-
34
+
35
35
  llm: {
36
36
  default: {
37
37
  provider: "mock-provider",
@@ -211,6 +211,9 @@ mock.module("../agent/loop.js", () => ({
211
211
  getToolTokenBudget() {
212
212
  return 0;
213
213
  }
214
+ getResolvedTools() {
215
+ return [];
216
+ }
214
217
  getActiveModel() {
215
218
  return undefined;
216
219
  }
@@ -50,6 +50,21 @@ mock.module("../oauth/oauth-store.js", () => ({
50
50
  getProvider: (provider: string) =>
51
51
  mockProviders.find((p) => p.provider === provider),
52
52
  isProviderConnected: () => false,
53
+ // Needed by manual-token-connection.ts at import time — these aren't
54
+ // invoked in this test suite but must resolve so the module loads.
55
+ createConnection: () => {
56
+ throw new Error("createConnection not mocked");
57
+ },
58
+ deleteConnection: () => {
59
+ throw new Error("deleteConnection not mocked");
60
+ },
61
+ getConnectionByProvider: () => undefined,
62
+ updateConnection: () => {
63
+ throw new Error("updateConnection not mocked");
64
+ },
65
+ upsertApp: async () => {
66
+ throw new Error("upsertApp not mocked");
67
+ },
53
68
  }));
54
69
 
55
70
  mock.module("../util/logger.js", () => ({
@@ -63,11 +78,8 @@ mock.module("../util/logger.js", () => ({
63
78
 
64
79
  // ── Import under test ────────────────────────────────────────────────
65
80
 
66
- const {
67
- checkAllCredentials,
68
- checkCredentialForProvider,
69
- _setFetchFn,
70
- } = await import("../credential-health/credential-health-service.js");
81
+ const { checkAllCredentials, checkCredentialForProvider, _setFetchFn } =
82
+ await import("../credential-health/credential-health-service.js");
71
83
 
72
84
  // Inject mock fetch via the test helper (Bun's global fetch can't be
73
85
  // overridden via globalThis assignment).
@@ -125,10 +137,7 @@ function addConnection(
125
137
  }
126
138
 
127
139
  function setToken(connectionId: string, token = "mock-token") {
128
- secureKeyValues.set(
129
- `oauth_connection/${connectionId}/access_token`,
130
- token,
131
- );
140
+ secureKeyValues.set(`oauth_connection/${connectionId}/access_token`, token);
132
141
  }
133
142
 
134
143
  // ── Tests ────────────────────────────────────────────────────────────
@@ -322,6 +331,66 @@ describe("credential-health-service", () => {
322
331
  expect(slack!.status).toBe("healthy");
323
332
  });
324
333
 
334
+ describe("manual-token providers", () => {
335
+ // slack_channel and telegram store their primary access token at
336
+ // credential/<provider>/bot_token rather than at
337
+ // oauth_connection/<id>/access_token. The health check must resolve the
338
+ // provider-specific path via manualTokenAccessCredentialKey — otherwise
339
+ // every manual-token connection gets flagged as missing_token and ends
340
+ // up in the heartbeat <credential-status> block even when credentials
341
+ // are valid.
342
+
343
+ test("slack_channel is healthy when bot_token is present and ping succeeds", async () => {
344
+ addProvider("slack_channel", {
345
+ pingUrl: "https://slack.com/api/auth.test",
346
+ });
347
+ addConnection("slack_channel", "conn-slack", {
348
+ expiresAt: null,
349
+ hasRefreshToken: false,
350
+ grantedScopes: [],
351
+ });
352
+ secureKeyValues.set("credential/slack_channel/bot_token", "xoxb-valid");
353
+
354
+ const report = await checkAllCredentials();
355
+ expect(report.results).toHaveLength(1);
356
+ expect(report.results[0]!.status).toBe("healthy");
357
+ expect(report.unhealthy).toHaveLength(0);
358
+ });
359
+
360
+ test("slack_channel is missing_token when bot_token is absent, even if OAuth access-token path is populated", async () => {
361
+ addProvider("slack_channel", {
362
+ pingUrl: "https://slack.com/api/auth.test",
363
+ });
364
+ addConnection("slack_channel", "conn-slack", {
365
+ expiresAt: null,
366
+ hasRefreshToken: false,
367
+ grantedScopes: [],
368
+ });
369
+ // Write to the OAuth access-token path — this must be IGNORED for
370
+ // manual-token providers, otherwise the fix isn't routing correctly.
371
+ secureKeyValues.set(
372
+ "oauth_connection/conn-slack/access_token",
373
+ "should-be-ignored",
374
+ );
375
+
376
+ const report = await checkAllCredentials();
377
+ expect(report.results[0]!.status).toBe("missing_token");
378
+ });
379
+
380
+ test("telegram resolves to credential/telegram/bot_token", async () => {
381
+ addProvider("telegram");
382
+ addConnection("telegram", "conn-tg", {
383
+ expiresAt: null,
384
+ hasRefreshToken: false,
385
+ grantedScopes: [],
386
+ });
387
+ secureKeyValues.set("credential/telegram/bot_token", "telegram-token");
388
+
389
+ const report = await checkAllCredentials();
390
+ expect(report.results[0]!.status).toBe("healthy");
391
+ });
392
+ });
393
+
325
394
  describe("checkCredentialForProvider", () => {
326
395
  test("returns null when no connections exist", async () => {
327
396
  const result = await checkCredentialForProvider("google");
@@ -206,8 +206,7 @@ describe("Invariant 2: no generic plaintext secret read API", () => {
206
206
  "config/bundled-skills/media-processing/tools/analyze-keyframes.ts", // keyframe analysis tool API key lookup
207
207
  "providers/registry.ts", // provider registry API key lookup for initialization
208
208
  "providers/provider-availability.ts", // provider availability API key check
209
- "media/app-icon-generator.ts", // app icon generation API key lookup
210
- "media/avatar-router.ts", // avatar generation API key lookup
209
+ "media/image-credentials.ts", // shared image-gen credential resolver (provider API key lookup)
211
210
  "memory/embedding-backend.ts", // embedding backend API key lookup
212
211
  "daemon/providers-setup.ts", // provider initialization API key lookup
213
212
  "workspace/migrations/006-services-config.ts", // services config migration reads provider API keys
@@ -216,6 +215,7 @@ describe("Invariant 2: no generic plaintext secret read API", () => {
216
215
  "daemon/handlers/config-model.ts", // masked provider key display
217
216
  "providers/speech-to-text/resolve.ts", // STT provider API key lookup
218
217
  "daemon/lifecycle.ts", // CES client injection into secure-keys at startup
218
+ "daemon/external-plugins-bootstrap.ts", // reads credentials at plugin init (manifest.requiresCredential) via the CES-mediated getSecureKeyAsync path
219
219
  "inbound/platform-callback-registration.ts", // managed credential lookup for platform base URL, assistant ID, and API key
220
220
  "tts/providers/elevenlabs-provider.ts", // ElevenLabs TTS API key lookup
221
221
  "tts/providers/deepgram-provider.ts", // Deepgram TTS API key lookup
@@ -43,6 +43,7 @@ describe("schedule_syntax column migration", () => {
43
43
  status TEXT NOT NULL DEFAULT 'active',
44
44
  quiet INTEGER NOT NULL DEFAULT 0,
45
45
  reuse_conversation INTEGER NOT NULL DEFAULT 0,
46
+ script TEXT,
46
47
  created_at INTEGER NOT NULL,
47
48
  updated_at INTEGER NOT NULL
48
49
  )