@vellumai/assistant 0.3.5 → 0.3.7

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 (487) hide show
  1. package/README.md +51 -0
  2. package/eslint.config.mjs +31 -0
  3. package/package.json +1 -1
  4. package/scripts/ipc/check-swift-decoder-drift.ts +4 -1
  5. package/scripts/ipc/generate-swift.ts +18 -2
  6. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +338 -1
  7. package/src/__tests__/approval-conversation-turn.test.ts +214 -0
  8. package/src/__tests__/browser-manager.test.ts +1 -0
  9. package/src/__tests__/call-conversation-messages.test.ts +130 -0
  10. package/src/__tests__/call-orchestrator.test.ts +752 -271
  11. package/src/__tests__/call-pointer-messages.test.ts +148 -0
  12. package/src/__tests__/call-recovery.test.ts +3 -0
  13. package/src/__tests__/call-routes-http.test.ts +5 -0
  14. package/src/__tests__/call-store.test.ts +3 -0
  15. package/src/__tests__/channel-approval-routes.test.ts +1260 -85
  16. package/src/__tests__/channel-approval.test.ts +37 -0
  17. package/src/__tests__/channel-approvals.test.ts +4 -65
  18. package/src/__tests__/channel-guardian.test.ts +556 -0
  19. package/src/__tests__/channel-readiness-service.test.ts +74 -7
  20. package/src/__tests__/checker.test.ts +14 -7
  21. package/src/__tests__/clarification-resolver.test.ts +44 -24
  22. package/src/__tests__/commit-message-enrichment-service.test.ts +9 -4
  23. package/src/__tests__/computer-use-session-working-dir.test.ts +8 -0
  24. package/src/__tests__/config-schema.test.ts +12 -7
  25. package/src/__tests__/context-window-manager.test.ts +30 -2
  26. package/src/__tests__/contradiction-checker.test.ts +20 -5
  27. package/src/__tests__/credential-security-invariants.test.ts +6 -2
  28. package/src/__tests__/db-migration-rollback.test.ts +752 -0
  29. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +2 -0
  30. package/src/__tests__/fuzzy-match-property.test.ts +5 -5
  31. package/src/__tests__/guardian-action-store.test.ts +123 -0
  32. package/src/__tests__/guardian-action-sweep.test.ts +277 -0
  33. package/src/__tests__/guardian-dispatch.test.ts +389 -0
  34. package/src/__tests__/guardian-question-copy.test.ts +47 -0
  35. package/src/__tests__/handlers-telegram-config.test.ts +4 -2
  36. package/src/__tests__/handlers-twilio-config.test.ts +126 -0
  37. package/src/__tests__/intent-routing.test.ts +2 -0
  38. package/src/__tests__/ipc-snapshot.test.ts +228 -1
  39. package/src/__tests__/memory-upsert-concurrency.test.ts +828 -0
  40. package/src/__tests__/model-intents.test.ts +96 -0
  41. package/src/__tests__/no-direct-anthropic-sdk-imports.test.ts +42 -0
  42. package/src/__tests__/oauth2-gateway-transport.test.ts +130 -0
  43. package/src/__tests__/onboarding-starter-tasks.test.ts +2 -0
  44. package/src/__tests__/provider-commit-message-generator.test.ts +89 -13
  45. package/src/__tests__/provider-error-scenarios.test.ts +621 -0
  46. package/src/__tests__/provider-fail-open-selection.test.ts +119 -0
  47. package/src/__tests__/qdrant-manager.test.ts +27 -20
  48. package/src/__tests__/relay-server.test.ts +779 -40
  49. package/src/__tests__/run-orchestrator-assistant-events.test.ts +2 -0
  50. package/src/__tests__/run-orchestrator.test.ts +20 -4
  51. package/src/__tests__/runtime-runs-http.test.ts +17 -1
  52. package/src/__tests__/runtime-runs.test.ts +16 -0
  53. package/src/__tests__/schedule-store.test.ts +18 -4
  54. package/src/__tests__/scheduler-recurrence.test.ts +13 -4
  55. package/src/__tests__/session-abort-tool-results.test.ts +6 -0
  56. package/src/__tests__/session-agent-loop.test.ts +857 -0
  57. package/src/__tests__/session-conflict-gate.test.ts +6 -0
  58. package/src/__tests__/session-pre-run-repair.test.ts +6 -0
  59. package/src/__tests__/session-profile-injection.test.ts +6 -0
  60. package/src/__tests__/session-provider-retry-repair.test.ts +6 -0
  61. package/src/__tests__/session-queue.test.ts +6 -0
  62. package/src/__tests__/session-runtime-assembly.test.ts +237 -13
  63. package/src/__tests__/session-slash-known.test.ts +6 -0
  64. package/src/__tests__/session-slash-queue.test.ts +6 -0
  65. package/src/__tests__/session-slash-unknown.test.ts +6 -0
  66. package/src/__tests__/session-surfaces-task-progress.test.ts +2 -0
  67. package/src/__tests__/session-tool-setup-app-refresh.test.ts +1 -0
  68. package/src/__tests__/session-tool-setup-memory-scope.test.ts +1 -0
  69. package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +1 -0
  70. package/src/__tests__/session-workspace-injection.test.ts +6 -0
  71. package/src/__tests__/session-workspace-tool-tracking.test.ts +6 -0
  72. package/src/__tests__/skills.test.ts +2 -0
  73. package/src/__tests__/sms-messaging-provider.test.ts +2 -1
  74. package/src/__tests__/starter-task-flow.test.ts +2 -0
  75. package/src/__tests__/swarm-dag-pathological.test.ts +535 -0
  76. package/src/__tests__/system-prompt.test.ts +2 -0
  77. package/src/__tests__/task-management-tools.test.ts +2 -2
  78. package/src/__tests__/task-runner.test.ts +14 -4
  79. package/src/__tests__/terminal-tools.test.ts +25 -19
  80. package/src/__tests__/tool-execution-abort-cleanup.test.ts +545 -0
  81. package/src/__tests__/tool-executor-shell-integration.test.ts +11 -11
  82. package/src/__tests__/tool-executor.test.ts +23 -24
  83. package/src/__tests__/trust-store.test.ts +3 -3
  84. package/src/__tests__/twilio-rest.test.ts +29 -0
  85. package/src/__tests__/twilio-routes-elevenlabs.test.ts +3 -0
  86. package/src/__tests__/twilio-routes-twiml.test.ts +11 -0
  87. package/src/__tests__/twilio-routes.test.ts +141 -21
  88. package/src/__tests__/user-reference.test.ts +2 -0
  89. package/src/__tests__/voice-quality.test.ts +222 -0
  90. package/src/__tests__/web-search.test.ts +45 -29
  91. package/src/agent/loop.ts +1 -1
  92. package/src/agent-heartbeat/agent-heartbeat-service.ts +2 -10
  93. package/src/amazon/client.ts +1418 -0
  94. package/src/amazon/request-extractor.ts +135 -0
  95. package/src/amazon/session.ts +109 -0
  96. package/src/autonomy/autonomy-store.ts +5 -5
  97. package/src/browser-extension-relay/client.ts +124 -0
  98. package/src/browser-extension-relay/protocol.ts +63 -0
  99. package/src/browser-extension-relay/server.ts +177 -0
  100. package/src/bundler/app-bundler.ts +3 -3
  101. package/src/bundler/bundle-signer.ts +1 -1
  102. package/src/bundler/signature-verifier.ts +1 -1
  103. package/src/calls/call-conversation-messages.ts +33 -0
  104. package/src/calls/call-domain.ts +106 -5
  105. package/src/calls/call-orchestrator.ts +252 -54
  106. package/src/calls/call-pointer-messages.ts +53 -0
  107. package/src/calls/call-recovery.ts +3 -8
  108. package/src/calls/call-store.ts +69 -87
  109. package/src/calls/elevenlabs-config.ts +3 -2
  110. package/src/calls/guardian-action-sweep.ts +105 -0
  111. package/src/calls/guardian-dispatch.ts +203 -0
  112. package/src/calls/guardian-question-copy.ts +133 -0
  113. package/src/calls/relay-server.ts +466 -8
  114. package/src/calls/speaker-identification.ts +1 -1
  115. package/src/calls/twilio-config.ts +7 -5
  116. package/src/calls/twilio-provider.ts +6 -4
  117. package/src/calls/twilio-rest.ts +40 -15
  118. package/src/calls/twilio-routes.ts +60 -45
  119. package/src/calls/types.ts +3 -1
  120. package/src/channels/types.ts +25 -0
  121. package/src/cli/amazon.ts +815 -0
  122. package/src/cli/config-commands.ts +2 -2
  123. package/src/cli/core-commands.ts +4 -3
  124. package/src/cli/influencer.ts +244 -0
  125. package/src/cli/map.ts +89 -6
  126. package/src/cli.ts +1 -1
  127. package/src/config/agent-schema.ts +171 -0
  128. package/src/config/bundled-skills/amazon/SKILL.md +127 -0
  129. package/src/config/bundled-skills/amazon/icon.svg +13 -0
  130. package/src/config/bundled-skills/api-mapping/SKILL.md +78 -0
  131. package/src/config/bundled-skills/browser/SKILL.md +1 -0
  132. package/src/config/bundled-skills/browser/TOOLS.json +17 -0
  133. package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +25 -0
  134. package/src/config/bundled-skills/doordash/SKILL.md +51 -51
  135. package/src/config/bundled-skills/email-setup/SKILL.md +14 -5
  136. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +183 -0
  137. package/src/config/bundled-skills/influencer/SKILL.md +144 -0
  138. package/src/config/bundled-skills/macos-automation/icon.svg +12 -0
  139. package/src/config/bundled-skills/media-processing/SKILL.md +72 -95
  140. package/src/config/bundled-skills/media-processing/TOOLS.json +57 -147
  141. package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +77 -0
  142. package/src/config/bundled-skills/media-processing/__tests__/cost-tracker.test.ts +69 -0
  143. package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +303 -0
  144. package/src/config/bundled-skills/media-processing/services/concurrency-pool.ts +55 -0
  145. package/src/config/bundled-skills/media-processing/services/cost-tracker.ts +86 -0
  146. package/src/config/bundled-skills/media-processing/services/gemini-map.ts +339 -0
  147. package/src/config/bundled-skills/media-processing/services/preprocess.ts +551 -0
  148. package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +7 -9
  149. package/src/config/bundled-skills/media-processing/services/reduce.ts +197 -0
  150. package/src/config/bundled-skills/media-processing/tools/analyze-keyframes.ts +88 -253
  151. package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +22 -153
  152. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +2 -2
  153. package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +28 -51
  154. package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +35 -270
  155. package/src/config/bundled-skills/messaging/SKILL.md +12 -2
  156. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +4 -7
  157. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +2 -1
  158. package/src/config/bundled-skills/phone-calls/SKILL.md +86 -21
  159. package/src/config/bundled-skills/twitter/icon.svg +14 -0
  160. package/src/config/bundled-tool-registry.ts +310 -0
  161. package/src/config/calls-schema.ts +181 -0
  162. package/src/config/core-schema.ts +309 -0
  163. package/src/config/defaults.ts +27 -3
  164. package/src/config/env-registry.ts +169 -0
  165. package/src/config/env.ts +175 -0
  166. package/src/config/loader.ts +6 -6
  167. package/src/config/memory-schema.ts +528 -0
  168. package/src/config/sandbox-schema.ts +55 -0
  169. package/src/config/schema.ts +157 -1138
  170. package/src/config/skill-state.ts +1 -1
  171. package/src/config/skills-schema.ts +32 -0
  172. package/src/config/skills.ts +35 -24
  173. package/src/config/system-prompt.ts +107 -56
  174. package/src/config/templates/SOUL.md +1 -1
  175. package/src/config/types.ts +1 -0
  176. package/src/config/user-reference.ts +4 -9
  177. package/src/config/vellum-skills/catalog.json +0 -7
  178. package/src/config/vellum-skills/chatgpt-import/tools/chatgpt-import.ts +5 -1
  179. package/src/config/vellum-skills/slack-oauth-setup/SKILL.md +1 -0
  180. package/src/config/vellum-skills/sms-setup/SKILL.md +112 -14
  181. package/src/context/window-manager.ts +27 -7
  182. package/src/daemon/approval-generators.ts +186 -0
  183. package/src/daemon/approved-devices-store.ts +140 -0
  184. package/src/daemon/assistant-attachments.ts +1 -1
  185. package/src/daemon/classifier.ts +35 -32
  186. package/src/daemon/config-watcher.ts +1 -1
  187. package/src/daemon/daemon-control.ts +254 -0
  188. package/src/daemon/handlers/apps.ts +2 -3
  189. package/src/daemon/handlers/config-channels.ts +158 -0
  190. package/src/daemon/handlers/config-inbox.ts +540 -0
  191. package/src/daemon/handlers/config-ingress.ts +231 -0
  192. package/src/daemon/handlers/config-integrations.ts +258 -0
  193. package/src/daemon/handlers/config-model.ts +143 -0
  194. package/src/daemon/handlers/config-parental.ts +163 -0
  195. package/src/daemon/handlers/config-scheduling.ts +172 -0
  196. package/src/daemon/handlers/config-slack.ts +92 -0
  197. package/src/daemon/handlers/config-telegram.ts +301 -0
  198. package/src/daemon/handlers/config-tools.ts +177 -0
  199. package/src/daemon/handlers/config-trust.ts +104 -0
  200. package/src/daemon/handlers/config-twilio.ts +1080 -0
  201. package/src/daemon/handlers/config.ts +53 -2463
  202. package/src/daemon/handlers/diagnostics.ts +1 -1
  203. package/src/daemon/handlers/dictation.ts +4 -6
  204. package/src/daemon/handlers/documents.ts +18 -32
  205. package/src/daemon/handlers/index.ts +9 -0
  206. package/src/daemon/handlers/misc.ts +3 -5
  207. package/src/daemon/handlers/pairing.ts +98 -0
  208. package/src/daemon/handlers/sessions.ts +74 -5
  209. package/src/daemon/handlers/shared.ts +3 -1
  210. package/src/daemon/handlers/skills.ts +1 -1
  211. package/src/daemon/handlers/twitter-auth.ts +2 -0
  212. package/src/daemon/handlers/work-items.ts +2 -2
  213. package/src/daemon/handlers/workspace-files.ts +4 -3
  214. package/src/daemon/install-cli-launchers.ts +113 -0
  215. package/src/daemon/ipc-contract/apps.ts +356 -0
  216. package/src/daemon/ipc-contract/browser.ts +74 -0
  217. package/src/daemon/ipc-contract/computer-use.ts +151 -0
  218. package/src/daemon/ipc-contract/diagnostics.ts +56 -0
  219. package/src/daemon/ipc-contract/documents.ts +74 -0
  220. package/src/daemon/ipc-contract/inbox.ts +209 -0
  221. package/src/daemon/ipc-contract/integrations.ts +284 -0
  222. package/src/daemon/ipc-contract/memory.ts +48 -0
  223. package/src/daemon/ipc-contract/messages.ts +211 -0
  224. package/src/daemon/ipc-contract/pairing.ts +45 -0
  225. package/src/daemon/ipc-contract/parental-control.ts +95 -0
  226. package/src/daemon/ipc-contract/schedules.ts +97 -0
  227. package/src/daemon/ipc-contract/sessions.ts +321 -0
  228. package/src/daemon/ipc-contract/shared.ts +42 -0
  229. package/src/daemon/ipc-contract/skills.ts +120 -0
  230. package/src/daemon/ipc-contract/subagents.ts +58 -0
  231. package/src/daemon/ipc-contract/surfaces.ts +250 -0
  232. package/src/daemon/ipc-contract/trust.ts +60 -0
  233. package/src/daemon/ipc-contract/work-items.ts +225 -0
  234. package/src/daemon/ipc-contract/workspace.ts +113 -0
  235. package/src/daemon/ipc-contract-inventory.json +62 -0
  236. package/src/daemon/ipc-contract-inventory.ts +55 -29
  237. package/src/daemon/ipc-contract.ts +227 -2527
  238. package/src/daemon/ipc-protocol.ts +1 -1
  239. package/src/daemon/ipc-validate.ts +7 -0
  240. package/src/daemon/lifecycle.ts +97 -379
  241. package/src/daemon/pairing-store.ts +177 -0
  242. package/src/daemon/providers-setup.ts +43 -0
  243. package/src/daemon/ride-shotgun-handler.ts +67 -2
  244. package/src/daemon/server.ts +60 -44
  245. package/src/daemon/session-agent-loop-handlers.ts +421 -0
  246. package/src/daemon/session-agent-loop.ts +113 -275
  247. package/src/daemon/session-dynamic-profile.ts +1 -1
  248. package/src/daemon/session-history.ts +1 -1
  249. package/src/daemon/session-media-retry.ts +1 -1
  250. package/src/daemon/session-messaging.ts +37 -2
  251. package/src/daemon/session-notifiers.ts +5 -25
  252. package/src/daemon/session-process.ts +99 -59
  253. package/src/daemon/session-queue-manager.ts +98 -4
  254. package/src/daemon/session-runtime-assembly.ts +149 -15
  255. package/src/daemon/session-surfaces.ts +26 -4
  256. package/src/daemon/session-tool-setup.ts +28 -30
  257. package/src/daemon/session-workspace.ts +1 -1
  258. package/src/daemon/session.ts +24 -1
  259. package/src/daemon/shutdown-handlers.ts +122 -0
  260. package/src/daemon/trace-emitter.ts +1 -1
  261. package/src/daemon/watch-handler.ts +36 -33
  262. package/src/doordash/cart-queries.ts +787 -0
  263. package/src/doordash/client.ts +144 -127
  264. package/src/doordash/order-queries.ts +85 -0
  265. package/src/doordash/queries.ts +10 -1308
  266. package/src/doordash/search-queries.ts +203 -0
  267. package/src/doordash/session.ts +3 -2
  268. package/src/doordash/store-queries.ts +246 -0
  269. package/src/doordash/types.ts +367 -0
  270. package/src/email/providers/agentmail.ts +2 -1
  271. package/src/email/providers/index.ts +3 -2
  272. package/src/email/service.ts +3 -2
  273. package/src/errors.ts +43 -0
  274. package/src/home-base/prebuilt/seed.ts +1 -1
  275. package/src/hooks/cli.ts +6 -5
  276. package/src/hooks/config.ts +6 -8
  277. package/src/hooks/discovery.ts +6 -5
  278. package/src/hooks/manager.ts +4 -3
  279. package/src/hooks/runner.ts +2 -2
  280. package/src/hooks/templates.ts +5 -5
  281. package/src/inbound/public-ingress-urls.ts +3 -1
  282. package/src/index.ts +4 -2
  283. package/src/influencer/client.ts +1104 -0
  284. package/src/instrument.ts +4 -3
  285. package/src/logfire.ts +4 -3
  286. package/src/memory/admin.ts +25 -35
  287. package/src/memory/attachments-store.ts +4 -7
  288. package/src/memory/channel-delivery-store.ts +30 -1
  289. package/src/memory/channel-guardian-store.ts +200 -1
  290. package/src/memory/clarification-resolver.ts +37 -33
  291. package/src/memory/conflict-store.ts +67 -61
  292. package/src/memory/contradiction-checker.ts +141 -117
  293. package/src/memory/conversation-store.ts +335 -51
  294. package/src/memory/db-connection.ts +27 -4
  295. package/src/memory/db-init.ts +121 -4
  296. package/src/memory/db.ts +14 -1
  297. package/src/memory/embedding-backend.ts +27 -5
  298. package/src/memory/embedding-ollama.ts +2 -1
  299. package/src/memory/entity-extractor.ts +38 -35
  300. package/src/memory/guardian-action-store.ts +430 -0
  301. package/src/memory/inbox-escalation-projection.ts +59 -0
  302. package/src/memory/inbox-thread-store.ts +218 -0
  303. package/src/memory/ingress-invite-store.ts +338 -0
  304. package/src/memory/ingress-member-store.ts +350 -0
  305. package/src/memory/items-extractor.ts +91 -97
  306. package/src/memory/job-handlers/index-maintenance.ts +3 -3
  307. package/src/memory/job-handlers/media-processing.ts +11 -42
  308. package/src/memory/job-handlers/summarization.ts +32 -26
  309. package/src/memory/job-utils.ts +3 -10
  310. package/src/memory/jobs-store.ts +6 -9
  311. package/src/memory/jobs-worker.ts +51 -36
  312. package/src/memory/migrations/001-job-deferrals.ts +45 -0
  313. package/src/memory/migrations/002-tool-invocations-fk.ts +43 -0
  314. package/src/memory/migrations/003-memory-fts-backfill.ts +24 -0
  315. package/src/memory/migrations/004-entity-relation-dedup.ts +87 -0
  316. package/src/memory/migrations/005-fingerprint-scope-unique.ts +80 -0
  317. package/src/memory/migrations/006-scope-salted-fingerprints.ts +62 -0
  318. package/src/memory/migrations/007-assistant-id-to-self.ts +254 -0
  319. package/src/memory/migrations/008-remove-assistant-id-columns.ts +208 -0
  320. package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +83 -0
  321. package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +56 -0
  322. package/src/memory/migrations/011-call-sessions-provider-sid-dedup.ts +63 -0
  323. package/src/memory/migrations/012-call-sessions-add-initiated-from.ts +19 -0
  324. package/src/memory/migrations/013-guardian-action-tables.ts +68 -0
  325. package/src/memory/migrations/014-backfill-inbox-thread-state.ts +76 -0
  326. package/src/memory/migrations/015-drop-active-search-index.ts +27 -0
  327. package/src/memory/migrations/016-memory-segments-indexes.ts +11 -0
  328. package/src/memory/migrations/017-memory-items-indexes.ts +12 -0
  329. package/src/memory/migrations/018-remaining-table-indexes.ts +13 -0
  330. package/src/memory/migrations/index.ts +24 -0
  331. package/src/memory/migrations/registry.ts +79 -0
  332. package/src/memory/migrations/validate-migration-state.ts +69 -0
  333. package/src/memory/qdrant-manager.ts +49 -8
  334. package/src/memory/query-builder.ts +1 -1
  335. package/src/memory/raw-query.ts +119 -0
  336. package/src/memory/recall-cache.ts +4 -1
  337. package/src/memory/retriever.ts +163 -47
  338. package/src/memory/schema-migration.ts +25 -984
  339. package/src/memory/schema.ts +130 -7
  340. package/src/memory/search/entity.ts +10 -19
  341. package/src/memory/search/lexical.ts +81 -52
  342. package/src/memory/search/ranking.ts +21 -22
  343. package/src/memory/search/semantic.ts +157 -19
  344. package/src/memory/shared-app-links-store.ts +4 -5
  345. package/src/memory/validation.ts +19 -0
  346. package/src/messaging/draft-store.ts +5 -6
  347. package/src/messaging/providers/sms/adapter.ts +3 -6
  348. package/src/messaging/providers/telegram-bot/adapter.ts +2 -5
  349. package/src/messaging/providers/whatsapp/adapter.ts +136 -0
  350. package/src/messaging/providers/whatsapp/client.ts +67 -0
  351. package/src/messaging/style-analyzer.ts +5 -4
  352. package/src/messaging/thread-summarizer.ts +61 -69
  353. package/src/messaging/triage-engine.ts +62 -71
  354. package/src/migrations/config-merge.ts +53 -0
  355. package/src/migrations/data-layout.ts +68 -0
  356. package/src/migrations/data-merge.ts +33 -0
  357. package/src/migrations/hooks-merge.ts +90 -0
  358. package/src/migrations/index.ts +6 -0
  359. package/src/migrations/log.ts +23 -0
  360. package/src/migrations/skills-merge.ts +33 -0
  361. package/src/migrations/workspace-layout.ts +79 -0
  362. package/src/permissions/checker.ts +126 -11
  363. package/src/permissions/prompter.ts +14 -0
  364. package/src/permissions/shell-identity.ts +31 -1
  365. package/src/permissions/trust-store.ts +21 -1
  366. package/src/providers/anthropic/client.ts +4 -4
  367. package/src/providers/failover.ts +2 -2
  368. package/src/providers/model-intents.ts +70 -0
  369. package/src/providers/ollama/client.ts +2 -1
  370. package/src/providers/provider-send-message.ts +176 -0
  371. package/src/providers/registry.ts +71 -30
  372. package/src/providers/retry.ts +35 -1
  373. package/src/providers/types.ts +12 -1
  374. package/src/runtime/approval-conversation-turn.ts +97 -0
  375. package/src/runtime/approval-message-composer.ts +115 -5
  376. package/src/runtime/assistant-event-hub.ts +3 -1
  377. package/src/runtime/channel-approval-parser.ts +36 -2
  378. package/src/runtime/channel-approvals.ts +0 -21
  379. package/src/runtime/channel-guardian-service.ts +48 -7
  380. package/src/runtime/channel-readiness-service.ts +160 -34
  381. package/src/runtime/channel-readiness-types.ts +10 -4
  382. package/src/runtime/channel-retry-sweep.ts +184 -0
  383. package/src/runtime/guardian-context-resolver.ts +108 -0
  384. package/src/runtime/http-server.ts +289 -745
  385. package/src/runtime/http-types.ts +56 -3
  386. package/src/runtime/middleware/auth.ts +116 -0
  387. package/src/runtime/middleware/error-handler.ts +33 -0
  388. package/src/runtime/middleware/twilio-validation.ts +127 -0
  389. package/src/runtime/routes/app-routes.ts +1 -1
  390. package/src/runtime/routes/call-routes.ts +49 -6
  391. package/src/runtime/routes/channel-delivery-routes.ts +170 -0
  392. package/src/runtime/routes/channel-guardian-routes.ts +1191 -0
  393. package/src/runtime/routes/channel-inbound-routes.ts +1152 -0
  394. package/src/runtime/routes/channel-route-shared.ts +144 -0
  395. package/src/runtime/routes/channel-routes.ts +32 -1634
  396. package/src/runtime/routes/conversation-routes.ts +50 -7
  397. package/src/runtime/routes/events-routes.ts +2 -2
  398. package/src/runtime/routes/identity-routes.ts +126 -0
  399. package/src/runtime/routes/pairing-routes.ts +144 -0
  400. package/src/runtime/routes/run-routes.ts +15 -1
  401. package/src/runtime/run-orchestrator.ts +52 -34
  402. package/src/schedule/schedule-store.ts +36 -32
  403. package/src/schedule/scheduler.ts +3 -3
  404. package/src/security/encrypted-store.ts +5 -7
  405. package/src/security/oauth2.ts +45 -15
  406. package/src/security/parental-control-store.ts +183 -0
  407. package/src/security/secret-allowlist.ts +4 -3
  408. package/src/security/secret-scanner.ts +5 -5
  409. package/src/security/secure-keys.ts +1 -1
  410. package/src/security/token-manager.ts +3 -2
  411. package/src/services/vercel-deploy.ts +6 -2
  412. package/src/skills/tool-manifest.ts +3 -3
  413. package/src/skills/vellum-catalog-remote.ts +75 -16
  414. package/src/slack/slack-webhook.ts +2 -1
  415. package/src/swarm/orchestrator.ts +92 -1
  416. package/src/swarm/router-planner.ts +6 -9
  417. package/src/swarm/worker-prompts.ts +9 -12
  418. package/src/tasks/task-compiler.ts +19 -28
  419. package/src/tasks/task-runner.ts +1 -1
  420. package/src/tools/assets/search.ts +15 -14
  421. package/src/tools/browser/__tests__/auth-detector.test.ts +1 -0
  422. package/src/tools/browser/auto-navigate.ts +1 -0
  423. package/src/tools/browser/browser-execution.ts +13 -1
  424. package/src/tools/browser/browser-manager.ts +119 -4
  425. package/src/tools/browser/network-recorder.ts +5 -0
  426. package/src/tools/credentials/broker.ts +11 -2
  427. package/src/tools/credentials/metadata-store.ts +18 -14
  428. package/src/tools/credentials/post-connect-hooks.ts +61 -0
  429. package/src/tools/credentials/vault.ts +49 -23
  430. package/src/tools/executor.ts +80 -18
  431. package/src/tools/host-terminal/cli-discover.ts +1 -1
  432. package/src/tools/network/script-proxy/http-forwarder.ts +1 -1
  433. package/src/tools/network/script-proxy/mitm-handler.ts +1 -1
  434. package/src/tools/network/script-proxy/server.ts +1 -1
  435. package/src/tools/network/script-proxy/session-manager.ts +6 -5
  436. package/src/tools/network/web-fetch.ts +18 -2
  437. package/src/tools/network/web-search.ts +7 -3
  438. package/src/tools/reminder/reminder-store.ts +14 -15
  439. package/src/tools/schedule/create.ts +1 -0
  440. package/src/tools/schedule/list.ts +2 -1
  441. package/src/tools/shared/filesystem/file-ops-service.ts +5 -7
  442. package/src/tools/skills/skill-script-runner.ts +24 -9
  443. package/src/tools/skills/skill-tool-factory.ts +1 -0
  444. package/src/tools/tasks/work-item-enqueue.ts +2 -2
  445. package/src/tools/terminal/evaluate-typescript.ts +21 -12
  446. package/src/tools/terminal/parser.ts +50 -0
  447. package/src/tools/watcher/delete.ts +6 -0
  448. package/src/tools/weather/service.ts +1 -1
  449. package/src/twitter/client.ts +190 -24
  450. package/src/twitter/session.ts +4 -3
  451. package/src/util/clipboard.ts +1 -1
  452. package/src/util/errors.ts +65 -8
  453. package/src/util/fs.ts +40 -0
  454. package/src/util/json.ts +10 -0
  455. package/src/util/log-redact.ts +189 -0
  456. package/src/util/logger.ts +25 -18
  457. package/src/util/object.ts +3 -0
  458. package/src/util/platform.ts +72 -365
  459. package/src/util/pricing.ts +1 -1
  460. package/src/util/promise-guard.ts +1 -1
  461. package/src/util/retry.ts +19 -0
  462. package/src/util/row-mapper.ts +79 -0
  463. package/src/util/silently.ts +21 -0
  464. package/src/watcher/engine.ts +5 -1
  465. package/src/watcher/provider-types.ts +20 -0
  466. package/src/watcher/providers/github.ts +156 -0
  467. package/src/watcher/providers/gmail.ts +1 -0
  468. package/src/watcher/providers/google-calendar.ts +1 -0
  469. package/src/watcher/providers/linear.ts +460 -0
  470. package/src/watcher/providers/slack.ts +1 -0
  471. package/src/work-items/work-item-runner.ts +1 -1
  472. package/src/workspace/git-service.ts +1 -1
  473. package/src/workspace/provider-commit-message-generator.ts +51 -22
  474. package/src/__tests__/call-bridge.test.ts +0 -517
  475. package/src/__tests__/session-process-bridge.test.ts +0 -244
  476. package/src/calls/call-bridge.ts +0 -168
  477. package/src/config/bundled-skills/media-processing/services/capability-registry.ts +0 -137
  478. package/src/config/bundled-skills/media-processing/services/event-detection-service.ts +0 -280
  479. package/src/config/bundled-skills/media-processing/services/feedback-aggregation.ts +0 -144
  480. package/src/config/bundled-skills/media-processing/services/feedback-store.ts +0 -136
  481. package/src/config/bundled-skills/media-processing/services/retrieval-service.ts +0 -95
  482. package/src/config/bundled-skills/media-processing/services/timeline-service.ts +0 -267
  483. package/src/config/bundled-skills/media-processing/tools/detect-events.ts +0 -110
  484. package/src/config/bundled-skills/media-processing/tools/recalibrate.ts +0 -235
  485. package/src/config/bundled-skills/media-processing/tools/select-tracking-profile.ts +0 -142
  486. package/src/config/bundled-skills/media-processing/tools/submit-feedback.ts +0 -150
  487. package/src/config/vellum-skills/google-oauth-setup/SKILL.md +0 -199
@@ -70,6 +70,7 @@ function makeSessionEmittingViaClient(...messages: ServerMessage[]): Session {
70
70
  setChannelCapabilities: () => {},
71
71
  setAssistantId: () => {},
72
72
  setGuardianContext: () => {},
73
+ setCommandIntent: () => {},
73
74
  updateClient: (handler: (msg: ServerMessage) => void) => {
74
75
  clientHandler = handler;
75
76
  },
@@ -94,6 +95,7 @@ function makeSessionEmittingViaAgentLoop(...messages: ServerMessage[]): Session
94
95
  setChannelCapabilities: () => {},
95
96
  setAssistantId: () => {},
96
97
  setGuardianContext: () => {},
98
+ setCommandIntent: () => {},
97
99
  updateClient: () => {},
98
100
  runAgentLoop: async (_content: string, _messageId: string, onEvent: (msg: ServerMessage) => void) => {
99
101
  for (const msg of messages) {
@@ -51,6 +51,8 @@ function makeSessionWithConfirmation(message: ServerMessage): Session {
51
51
  setChannelCapabilities: () => {},
52
52
  setAssistantId: () => {},
53
53
  setGuardianContext: () => {},
54
+ setCommandIntent: () => {},
55
+ setTurnChannelContext: () => {},
54
56
  updateClient: (handler: (msg: ServerMessage) => void) => {
55
57
  clientHandler = handler;
56
58
  },
@@ -74,6 +76,8 @@ function makeSessionWithEvent(message: ServerMessage): Session {
74
76
  setChannelCapabilities: () => {},
75
77
  setAssistantId: () => {},
76
78
  setGuardianContext: () => {},
79
+ setCommandIntent: () => {},
80
+ setTurnChannelContext: () => {},
77
81
  updateClient: () => {},
78
82
  runAgentLoop: async (_content: string, _messageId: string, onEvent: (msg: ServerMessage) => void) => {
79
83
  onEvent(message);
@@ -240,6 +244,8 @@ describe('startRun channel capability resolution', () => {
240
244
  },
241
245
  setAssistantId: () => {},
242
246
  setGuardianContext: () => {},
247
+ setCommandIntent: () => {},
248
+ setTurnChannelContext: () => {},
243
249
  updateClient: () => {},
244
250
  runAgentLoop: async () => {},
245
251
  handleConfirmationResponse: () => {},
@@ -263,7 +269,7 @@ describe('startRun channel capability resolution', () => {
263
269
  expect(capturedCapabilities!.dashboardCapable).toBe(false);
264
270
  });
265
271
 
266
- test('defaults to http-api when no sourceChannel is provided', async () => {
272
+ test('defaults to macos (from http-api fallback) when no sourceChannel is provided', async () => {
267
273
  const conversation = createConversation('http-api default test');
268
274
  let capturedCapabilities: ChannelCapabilities | null = null;
269
275
 
@@ -276,6 +282,8 @@ describe('startRun channel capability resolution', () => {
276
282
  },
277
283
  setAssistantId: () => {},
278
284
  setGuardianContext: () => {},
285
+ setCommandIntent: () => {},
286
+ setTurnChannelContext: () => {},
279
287
  updateClient: () => {},
280
288
  runAgentLoop: async () => {},
281
289
  handleConfirmationResponse: () => {},
@@ -292,10 +300,10 @@ describe('startRun channel capability resolution', () => {
292
300
  await new Promise((r) => setTimeout(r, 50));
293
301
 
294
302
  expect(capturedCapabilities).not.toBeNull();
295
- expect(capturedCapabilities!.channel).toBe('http-api');
303
+ expect(capturedCapabilities!.channel).toBe('macos');
296
304
  });
297
305
 
298
- test('defaults to http-api when options are provided without sourceChannel', async () => {
306
+ test('defaults to macos (from http-api fallback) when options are provided without sourceChannel', async () => {
299
307
  const conversation = createConversation('options no channel test');
300
308
  let capturedCapabilities: ChannelCapabilities | null = null;
301
309
 
@@ -308,6 +316,8 @@ describe('startRun channel capability resolution', () => {
308
316
  },
309
317
  setAssistantId: () => {},
310
318
  setGuardianContext: () => {},
319
+ setCommandIntent: () => {},
320
+ setTurnChannelContext: () => {},
311
321
  updateClient: () => {},
312
322
  runAgentLoop: async () => {},
313
323
  handleConfirmationResponse: () => {},
@@ -326,7 +336,7 @@ describe('startRun channel capability resolution', () => {
326
336
  await new Promise((r) => setTimeout(r, 50));
327
337
 
328
338
  expect(capturedCapabilities).not.toBeNull();
329
- expect(capturedCapabilities!.channel).toBe('http-api');
339
+ expect(capturedCapabilities!.channel).toBe('macos');
330
340
  });
331
341
  });
332
342
 
@@ -353,6 +363,8 @@ describe('strictSideEffects re-derivation across runs', () => {
353
363
  setChannelCapabilities: () => {},
354
364
  setAssistantId: () => {},
355
365
  setGuardianContext: () => {},
366
+ setCommandIntent: () => {},
367
+ setTurnChannelContext: () => {},
356
368
  updateClient: () => {},
357
369
  runAgentLoop: async () => {},
358
370
  handleConfirmationResponse: () => {},
@@ -389,6 +401,8 @@ describe('strictSideEffects re-derivation across runs', () => {
389
401
  setChannelCapabilities: () => {},
390
402
  setAssistantId: () => {},
391
403
  setGuardianContext: () => {},
404
+ setCommandIntent: () => {},
405
+ setTurnChannelContext: () => {},
392
406
  updateClient: () => {},
393
407
  runAgentLoop: async () => {},
394
408
  handleConfirmationResponse: () => {},
@@ -426,6 +440,8 @@ describe('strictSideEffects re-derivation across runs', () => {
426
440
  setChannelCapabilities: () => {},
427
441
  setAssistantId: () => {},
428
442
  setGuardianContext: () => {},
443
+ setCommandIntent: () => {},
444
+ setTurnChannelContext: () => {},
429
445
  updateClient: () => {},
430
446
  runAgentLoop: async () => {},
431
447
  handleConfirmationResponse: () => {},
@@ -60,6 +60,9 @@ function makeCompletingSession(): Session {
60
60
  persistUserMessage: () => undefined as unknown as string,
61
61
  memoryPolicy: { scopeId: 'default', includeDefaultFallback: false, strictSideEffects: false },
62
62
  setChannelCapabilities: () => {},
63
+ setAssistantId: () => {},
64
+ setGuardianContext: () => {},
65
+ setCommandIntent: () => {},
63
66
  updateClient: () => {},
64
67
  runAgentLoop: async () => {
65
68
  processing = true;
@@ -67,6 +70,7 @@ function makeCompletingSession(): Session {
67
70
  processing = false;
68
71
  },
69
72
  handleConfirmationResponse: () => {},
73
+ handleSecretResponse: () => {},
70
74
  } as unknown as Session;
71
75
  }
72
76
 
@@ -76,11 +80,15 @@ function makeFailingSession(errorMsg: string): Session {
76
80
  persistUserMessage: () => undefined as unknown as string,
77
81
  memoryPolicy: { scopeId: 'default', includeDefaultFallback: false, strictSideEffects: false },
78
82
  setChannelCapabilities: () => {},
83
+ setAssistantId: () => {},
84
+ setGuardianContext: () => {},
85
+ setCommandIntent: () => {},
79
86
  updateClient: () => {},
80
87
  runAgentLoop: async (_content: string, _messageId: string, onEvent: (msg: ServerMessage) => void) => {
81
88
  onEvent({ type: 'error', message: errorMsg });
82
89
  },
83
90
  handleConfirmationResponse: () => {},
91
+ handleSecretResponse: () => {},
84
92
  } as unknown as Session;
85
93
  }
86
94
 
@@ -91,6 +99,9 @@ function makeConfirmationSession(toolName: string): Session {
91
99
  persistUserMessage: () => undefined as unknown as string,
92
100
  memoryPolicy: { scopeId: 'default', includeDefaultFallback: false, strictSideEffects: false },
93
101
  setChannelCapabilities: () => {},
102
+ setAssistantId: () => {},
103
+ setGuardianContext: () => {},
104
+ setCommandIntent: () => {},
94
105
  updateClient: (handler: (msg: ServerMessage) => void) => {
95
106
  clientHandler = handler;
96
107
  },
@@ -108,6 +119,7 @@ function makeConfirmationSession(toolName: string): Session {
108
119
  await new Promise<void>(() => {});
109
120
  },
110
121
  handleConfirmationResponse: () => {},
122
+ handleSecretResponse: () => {},
111
123
  } as unknown as Session;
112
124
  }
113
125
 
@@ -118,12 +130,16 @@ function makeHangingSession(): Session {
118
130
  persistUserMessage: () => undefined as unknown as string,
119
131
  memoryPolicy: { scopeId: 'default', includeDefaultFallback: false, strictSideEffects: false },
120
132
  setChannelCapabilities: () => {},
133
+ setAssistantId: () => {},
134
+ setGuardianContext: () => {},
135
+ setCommandIntent: () => {},
121
136
  updateClient: () => {},
122
137
  runAgentLoop: async () => {
123
138
  processing = true;
124
139
  await new Promise<void>(() => {});
125
140
  },
126
141
  handleConfirmationResponse: () => {},
142
+ handleSecretResponse: () => {},
127
143
  } as unknown as Session;
128
144
  }
129
145
 
@@ -207,7 +223,7 @@ describe('runtime runs — HTTP layer', () => {
207
223
 
208
224
  const body = await res.json() as { status: string; disk: { path: string; totalMb: number; usedMb: number; freeMb: number } | null };
209
225
  expect(body.status).toBe('healthy');
210
- if (body.disk !== null) {
226
+ if (body.disk != null) {
211
227
  expect(typeof body.disk.path).toBe('string');
212
228
  expect(body.disk.totalMb).toBeGreaterThan(0);
213
229
  expect(body.disk.usedMb).toBeGreaterThanOrEqual(0);
@@ -50,6 +50,9 @@ function makeCompletingSession(): Session {
50
50
  persistUserMessage: () => undefined as unknown as string,
51
51
  memoryPolicy: { scopeId: 'default', includeDefaultFallback: false, strictSideEffects: false },
52
52
  setChannelCapabilities: () => {},
53
+ setAssistantId: () => {},
54
+ setGuardianContext: () => {},
55
+ setCommandIntent: () => {},
53
56
  updateClient: () => {},
54
57
  runAgentLoop: async () => {
55
58
  processing = true;
@@ -58,6 +61,7 @@ function makeCompletingSession(): Session {
58
61
  processing = false;
59
62
  },
60
63
  handleConfirmationResponse: () => {},
64
+ handleSecretResponse: () => {},
61
65
  } as unknown as Session;
62
66
  }
63
67
 
@@ -69,6 +73,9 @@ function makeHangingSession(): Session {
69
73
  persistUserMessage: () => undefined as unknown as string,
70
74
  memoryPolicy: { scopeId: 'default', includeDefaultFallback: false, strictSideEffects: false },
71
75
  setChannelCapabilities: () => {},
76
+ setAssistantId: () => {},
77
+ setGuardianContext: () => {},
78
+ setCommandIntent: () => {},
72
79
  updateClient: () => {},
73
80
  runAgentLoop: async () => {
74
81
  processing = true;
@@ -76,6 +83,7 @@ function makeHangingSession(): Session {
76
83
  await new Promise<void>(() => {});
77
84
  },
78
85
  handleConfirmationResponse: () => {},
86
+ handleSecretResponse: () => {},
79
87
  } as unknown as Session;
80
88
  }
81
89
 
@@ -86,11 +94,15 @@ function makeFailingSession(errorMsg: string): Session {
86
94
  persistUserMessage: () => undefined as unknown as string,
87
95
  memoryPolicy: { scopeId: 'default', includeDefaultFallback: false, strictSideEffects: false },
88
96
  setChannelCapabilities: () => {},
97
+ setAssistantId: () => {},
98
+ setGuardianContext: () => {},
99
+ setCommandIntent: () => {},
89
100
  updateClient: () => {},
90
101
  runAgentLoop: async (_content: string, _messageId: string, onEvent: (msg: ServerMessage) => void) => {
91
102
  onEvent({ type: 'error', message: errorMsg });
92
103
  },
93
104
  handleConfirmationResponse: () => {},
105
+ handleSecretResponse: () => {},
94
106
  } as unknown as Session;
95
107
  }
96
108
 
@@ -102,6 +114,9 @@ function makeConfirmationSession(toolName: string): Session {
102
114
  persistUserMessage: () => undefined as unknown as string,
103
115
  memoryPolicy: { scopeId: 'default', includeDefaultFallback: false, strictSideEffects: false },
104
116
  setChannelCapabilities: () => {},
117
+ setAssistantId: () => {},
118
+ setGuardianContext: () => {},
119
+ setCommandIntent: () => {},
105
120
  updateClient: (handler: (msg: ServerMessage) => void) => {
106
121
  clientHandler = handler;
107
122
  },
@@ -119,6 +134,7 @@ function makeConfirmationSession(toolName: string): Session {
119
134
  await new Promise<void>(() => {});
120
135
  },
121
136
  handleConfirmationResponse: () => {},
137
+ handleSecretResponse: () => {},
122
138
  } as unknown as Session;
123
139
  }
124
140
 
@@ -24,6 +24,8 @@ mock.module('../util/logger.js', () => ({
24
24
  getLogger: () => new Proxy({} as Record<string, unknown>, {
25
25
  get: () => () => {},
26
26
  }),
27
+ isDebug: () => false,
28
+ truncateForLog: (value: string) => value,
27
29
  }));
28
30
 
29
31
  import { initializeDb, getDb, resetDb } from '../memory/db.js';
@@ -259,10 +261,18 @@ describe('claimDueSchedules (RRULE set)', () => {
259
261
  });
260
262
 
261
263
  test('claims RRULE set schedule and correctly advances nextRunAt past exclusions', () => {
264
+ // Use a recent DTSTART (1 hour ago) so rrule doesn't iterate through hundreds of
265
+ // thousands of occurrences when computing the next run.
266
+ const pastDate = new Date(Date.now() - 3_600_000);
267
+ const pad = (n: number) => String(n).padStart(2, '0');
268
+ const ds = `${pastDate.getUTCFullYear()}${pad(pastDate.getUTCMonth() + 1)}${pad(pastDate.getUTCDate())}T${pad(pastDate.getUTCHours())}${pad(pastDate.getUTCMinutes())}${pad(pastDate.getUTCSeconds())}Z`;
269
+ // Exclude the 2nd minute after DTSTART (safely in the past, won't block the next run)
270
+ const exMinute = new Date(pastDate.getTime() + 60_000);
271
+ const exDs = `${exMinute.getUTCFullYear()}${pad(exMinute.getUTCMonth() + 1)}${pad(exMinute.getUTCDate())}T${pad(exMinute.getUTCHours())}${pad(exMinute.getUTCMinutes())}${pad(pastDate.getUTCSeconds())}Z`;
262
272
  const expression = [
263
- 'DTSTART:20250101T000000Z',
273
+ `DTSTART:${ds}`,
264
274
  'RRULE:FREQ=MINUTELY;INTERVAL=1',
265
- 'EXDATE:20250101T000100Z',
275
+ `EXDATE:${exDs}`,
266
276
  ].join('\n');
267
277
 
268
278
  const job = createSchedule({
@@ -400,8 +410,12 @@ describe('claimDueSchedules', () => {
400
410
  });
401
411
 
402
412
  test('claims due RRULE schedules and advances nextRunAt', () => {
403
- // Use an RRULE that fires every minute (roughly), with a DTSTART in the past
404
- const rrule = 'DTSTART:20250101T000000Z\nRRULE:FREQ=MINUTELY;INTERVAL=1';
413
+ // Use a recent DTSTART (1 hour ago) so rrule doesn't iterate through
414
+ // hundreds of thousands of occurrences when computing the next run.
415
+ const pastDate = new Date(Date.now() - 3_600_000);
416
+ const pad = (n: number) => String(n).padStart(2, '0');
417
+ const ds = `${pastDate.getUTCFullYear()}${pad(pastDate.getUTCMonth() + 1)}${pad(pastDate.getUTCDate())}T${pad(pastDate.getUTCHours())}${pad(pastDate.getUTCMinutes())}${pad(pastDate.getUTCSeconds())}Z`;
418
+ const rrule = `DTSTART:${ds}\nRRULE:FREQ=MINUTELY;INTERVAL=1`;
405
419
  const job = createSchedule({
406
420
  name: 'Claim RRULE',
407
421
  cronExpression: rrule,
@@ -23,6 +23,8 @@ mock.module('../util/logger.js', () => ({
23
23
  getLogger: () => new Proxy({} as Record<string, unknown>, {
24
24
  get: () => () => {},
25
25
  }),
26
+ isDebug: () => false,
27
+ truncateForLog: (value: string) => value,
26
28
  }));
27
29
 
28
30
  import { initializeDb, getDb, resetDb } from '../memory/db.js';
@@ -252,8 +254,8 @@ describe('scheduler RRULE execution', () => {
252
254
  const currentMinuteDate = new Date(now);
253
255
  currentMinuteDate.setUTCSeconds(0);
254
256
  currentMinuteDate.setUTCMilliseconds(0);
255
- // Round to the previous minute boundary relative to dtstart
256
- const exDate = `${currentMinuteDate.getUTCFullYear()}${pad(currentMinuteDate.getUTCMonth() + 1)}${pad(currentMinuteDate.getUTCDate())}T${pad(currentMinuteDate.getUTCHours())}${pad(currentMinuteDate.getUTCMinutes())}00Z`;
257
+ // Seconds must match DTSTART so the EXDATE aligns with a recurrence instance
258
+ const exDate = `${currentMinuteDate.getUTCFullYear()}${pad(currentMinuteDate.getUTCMonth() + 1)}${pad(currentMinuteDate.getUTCDate())}T${pad(currentMinuteDate.getUTCHours())}${pad(currentMinuteDate.getUTCMinutes())}${pad(pastDate.getUTCSeconds())}Z`;
257
259
 
258
260
  const expression = `DTSTART:${ds}\nRRULE:FREQ=MINUTELY;INTERVAL=1\nEXDATE:${exDate}`;
259
261
 
@@ -286,10 +288,17 @@ describe('scheduler RRULE execution', () => {
286
288
  });
287
289
 
288
290
  test('RRULE set schedule fires and creates cron_runs entry', async () => {
291
+ // Use a recent DTSTART (1 hour ago) so rrule doesn't iterate through hundreds of
292
+ // thousands of occurrences when computing the next run.
293
+ const pastDate = new Date(Date.now() - 3_600_000);
294
+ const pad = (n: number) => String(n).padStart(2, '0');
295
+ const ds = `${pastDate.getUTCFullYear()}${pad(pastDate.getUTCMonth() + 1)}${pad(pastDate.getUTCDate())}T${pad(pastDate.getUTCHours())}${pad(pastDate.getUTCMinutes())}${pad(pastDate.getUTCSeconds())}Z`;
296
+ const exMinute = new Date(pastDate.getTime() + 60_000);
297
+ const exDs = `${exMinute.getUTCFullYear()}${pad(exMinute.getUTCMonth() + 1)}${pad(exMinute.getUTCDate())}T${pad(exMinute.getUTCHours())}${pad(exMinute.getUTCMinutes())}${pad(exMinute.getUTCSeconds())}Z`;
289
298
  const expression = [
290
- 'DTSTART:20250101T000000Z',
299
+ `DTSTART:${ds}`,
291
300
  'RRULE:FREQ=MINUTELY;INTERVAL=1',
292
- 'EXDATE:20250101T000100Z',
301
+ `EXDATE:${exDs}`,
293
302
  ].join('\n');
294
303
 
295
304
  const schedule = createSchedule({
@@ -11,6 +11,12 @@ mock.module('../util/platform.js', () => ({
11
11
  getDataDir: () => '/tmp',
12
12
  }));
13
13
 
14
+ mock.module('../memory/guardian-action-store.js', () => ({
15
+ getPendingDeliveryByConversation: () => null,
16
+ getGuardianActionRequest: () => null,
17
+ resolveGuardianActionRequest: () => {},
18
+ }));
19
+
14
20
  mock.module('../providers/registry.js', () => ({
15
21
  getProvider: () => ({ name: 'mock-provider' }),
16
22
  initializeProviders: () => {},