@vellumai/assistant 0.3.5 → 0.3.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 (486) 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 +26 -2
  164. package/src/config/env-registry.ts +162 -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 +156 -1137
  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 +217 -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 +54 -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 +315 -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 +60 -0
  236. package/src/daemon/ipc-contract-inventory.ts +55 -29
  237. package/src/daemon/ipc-contract.ts +226 -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 +96 -4
  254. package/src/daemon/session-runtime-assembly.ts +149 -15
  255. package/src/daemon/session-surfaces.ts +19 -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 +10 -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 +160 -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 +119 -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/channel-approval-parser.ts +36 -2
  377. package/src/runtime/channel-approvals.ts +0 -21
  378. package/src/runtime/channel-guardian-service.ts +48 -7
  379. package/src/runtime/channel-readiness-service.ts +160 -34
  380. package/src/runtime/channel-readiness-types.ts +10 -4
  381. package/src/runtime/channel-retry-sweep.ts +184 -0
  382. package/src/runtime/guardian-context-resolver.ts +108 -0
  383. package/src/runtime/http-server.ts +275 -743
  384. package/src/runtime/http-types.ts +56 -3
  385. package/src/runtime/middleware/auth.ts +116 -0
  386. package/src/runtime/middleware/error-handler.ts +33 -0
  387. package/src/runtime/middleware/twilio-validation.ts +127 -0
  388. package/src/runtime/routes/app-routes.ts +1 -1
  389. package/src/runtime/routes/call-routes.ts +49 -6
  390. package/src/runtime/routes/channel-delivery-routes.ts +170 -0
  391. package/src/runtime/routes/channel-guardian-routes.ts +1191 -0
  392. package/src/runtime/routes/channel-inbound-routes.ts +1152 -0
  393. package/src/runtime/routes/channel-route-shared.ts +144 -0
  394. package/src/runtime/routes/channel-routes.ts +32 -1634
  395. package/src/runtime/routes/conversation-routes.ts +50 -7
  396. package/src/runtime/routes/events-routes.ts +2 -2
  397. package/src/runtime/routes/identity-routes.ts +126 -0
  398. package/src/runtime/routes/pairing-routes.ts +143 -0
  399. package/src/runtime/routes/run-routes.ts +15 -1
  400. package/src/runtime/run-orchestrator.ts +52 -34
  401. package/src/schedule/schedule-store.ts +36 -32
  402. package/src/schedule/scheduler.ts +3 -3
  403. package/src/security/encrypted-store.ts +5 -7
  404. package/src/security/oauth2.ts +45 -15
  405. package/src/security/parental-control-store.ts +183 -0
  406. package/src/security/secret-allowlist.ts +4 -3
  407. package/src/security/secret-scanner.ts +5 -5
  408. package/src/security/secure-keys.ts +1 -1
  409. package/src/security/token-manager.ts +3 -2
  410. package/src/services/vercel-deploy.ts +6 -2
  411. package/src/skills/tool-manifest.ts +3 -3
  412. package/src/skills/vellum-catalog-remote.ts +75 -16
  413. package/src/slack/slack-webhook.ts +2 -1
  414. package/src/swarm/orchestrator.ts +92 -1
  415. package/src/swarm/router-planner.ts +6 -9
  416. package/src/swarm/worker-prompts.ts +9 -12
  417. package/src/tasks/task-compiler.ts +19 -28
  418. package/src/tasks/task-runner.ts +1 -1
  419. package/src/tools/assets/search.ts +15 -14
  420. package/src/tools/browser/__tests__/auth-detector.test.ts +1 -0
  421. package/src/tools/browser/auto-navigate.ts +1 -0
  422. package/src/tools/browser/browser-execution.ts +10 -1
  423. package/src/tools/browser/browser-manager.ts +119 -4
  424. package/src/tools/browser/network-recorder.ts +5 -0
  425. package/src/tools/credentials/broker.ts +11 -2
  426. package/src/tools/credentials/metadata-store.ts +18 -14
  427. package/src/tools/credentials/post-connect-hooks.ts +61 -0
  428. package/src/tools/credentials/vault.ts +49 -23
  429. package/src/tools/executor.ts +68 -9
  430. package/src/tools/host-terminal/cli-discover.ts +1 -1
  431. package/src/tools/network/script-proxy/http-forwarder.ts +1 -1
  432. package/src/tools/network/script-proxy/mitm-handler.ts +1 -1
  433. package/src/tools/network/script-proxy/server.ts +1 -1
  434. package/src/tools/network/script-proxy/session-manager.ts +6 -5
  435. package/src/tools/network/web-fetch.ts +18 -2
  436. package/src/tools/network/web-search.ts +7 -3
  437. package/src/tools/reminder/reminder-store.ts +14 -15
  438. package/src/tools/schedule/create.ts +1 -0
  439. package/src/tools/schedule/list.ts +2 -1
  440. package/src/tools/shared/filesystem/file-ops-service.ts +5 -7
  441. package/src/tools/skills/skill-script-runner.ts +24 -9
  442. package/src/tools/skills/skill-tool-factory.ts +1 -0
  443. package/src/tools/tasks/work-item-enqueue.ts +2 -2
  444. package/src/tools/terminal/evaluate-typescript.ts +21 -12
  445. package/src/tools/terminal/parser.ts +50 -0
  446. package/src/tools/watcher/delete.ts +6 -0
  447. package/src/tools/weather/service.ts +1 -1
  448. package/src/twitter/client.ts +190 -24
  449. package/src/twitter/session.ts +4 -3
  450. package/src/util/clipboard.ts +1 -1
  451. package/src/util/errors.ts +65 -8
  452. package/src/util/fs.ts +40 -0
  453. package/src/util/json.ts +10 -0
  454. package/src/util/log-redact.ts +189 -0
  455. package/src/util/logger.ts +19 -17
  456. package/src/util/object.ts +3 -0
  457. package/src/util/platform.ts +72 -365
  458. package/src/util/pricing.ts +1 -1
  459. package/src/util/promise-guard.ts +1 -1
  460. package/src/util/retry.ts +19 -0
  461. package/src/util/row-mapper.ts +79 -0
  462. package/src/util/silently.ts +21 -0
  463. package/src/watcher/engine.ts +5 -1
  464. package/src/watcher/provider-types.ts +20 -0
  465. package/src/watcher/providers/github.ts +156 -0
  466. package/src/watcher/providers/gmail.ts +1 -0
  467. package/src/watcher/providers/google-calendar.ts +1 -0
  468. package/src/watcher/providers/linear.ts +460 -0
  469. package/src/watcher/providers/slack.ts +1 -0
  470. package/src/work-items/work-item-runner.ts +1 -1
  471. package/src/workspace/git-service.ts +1 -1
  472. package/src/workspace/provider-commit-message-generator.ts +51 -22
  473. package/src/__tests__/call-bridge.test.ts +0 -517
  474. package/src/__tests__/session-process-bridge.test.ts +0 -244
  475. package/src/calls/call-bridge.ts +0 -168
  476. package/src/config/bundled-skills/media-processing/services/capability-registry.ts +0 -137
  477. package/src/config/bundled-skills/media-processing/services/event-detection-service.ts +0 -280
  478. package/src/config/bundled-skills/media-processing/services/feedback-aggregation.ts +0 -144
  479. package/src/config/bundled-skills/media-processing/services/feedback-store.ts +0 -136
  480. package/src/config/bundled-skills/media-processing/services/retrieval-service.ts +0 -95
  481. package/src/config/bundled-skills/media-processing/services/timeline-service.ts +0 -267
  482. package/src/config/bundled-skills/media-processing/tools/detect-events.ts +0 -110
  483. package/src/config/bundled-skills/media-processing/tools/recalibrate.ts +0 -235
  484. package/src/config/bundled-skills/media-processing/tools/select-tracking-profile.ts +0 -142
  485. package/src/config/bundled-skills/media-processing/tools/submit-feedback.ts +0 -150
  486. package/src/config/vellum-skills/google-oauth-setup/SKILL.md +0 -199
@@ -1,7 +1,6 @@
1
1
  // Smoke command (run all security test files together):
2
2
  // bun test src/__tests__/checker.test.ts src/__tests__/trust-store.test.ts src/__tests__/session-skill-tools.test.ts src/__tests__/skill-script-runner-host.test.ts
3
3
 
4
- /* eslint-disable @typescript-eslint/no-explicit-any */
5
4
  import { describe, test, expect, beforeAll, beforeEach, afterEach, mock } from 'bun:test';
6
5
  import { mkdtempSync, mkdirSync, rmSync, writeFileSync, symlinkSync, realpathSync } from 'node:fs';
7
6
  import { tmpdir, homedir } from 'node:os';
@@ -39,9 +38,16 @@ mock.module('../util/logger.js', () => ({
39
38
 
40
39
  // Mutable config object so tests can switch permissions.mode between
41
40
  // 'legacy', 'strict', and 'workspace' without re-registering the mock.
42
- const testConfig: Record<string, any> = {
43
- permissions: { mode: 'legacy' as 'legacy' | 'strict' | 'workspace' },
44
- skills: { load: { extraDirs: [] as string[] } },
41
+ interface TestConfig {
42
+ permissions: { mode: 'legacy' | 'strict' | 'workspace' };
43
+ skills: { load: { extraDirs: string[] } };
44
+ sandbox: { enabled: boolean };
45
+ [key: string]: unknown;
46
+ }
47
+
48
+ const testConfig: TestConfig = {
49
+ permissions: { mode: 'legacy' },
50
+ skills: { load: { extraDirs: [] } },
45
51
  sandbox: { enabled: true },
46
52
  };
47
53
 
@@ -58,6 +64,7 @@ mock.module('../config/loader.js', () => ({
58
64
 
59
65
  import { classifyRisk, check, generateAllowlistOptions, generateScopeOptions, _resetLegacyDeprecationWarning } from '../permissions/checker.js';
60
66
  import { RiskLevel } from '../permissions/types.js';
67
+ import type { TrustRule } from '../permissions/types.js';
61
68
  import { addRule, clearCache, findHighestPriorityRule } from '../permissions/trust-store.js';
62
69
  import { getDefaultRuleTemplates } from '../permissions/defaults.js';
63
70
  import { registerTool, getTool } from '../tools/registry.js';
@@ -2353,13 +2360,13 @@ describe('Permission Checker', () => {
2353
2360
  const trustDir = dirnameFn(trustPath);
2354
2361
  if (!existsSync(trustDir)) mkdirSyncFs(trustDir, { recursive: true });
2355
2362
 
2356
- let currentRules: any[] = [];
2363
+ let currentRules: TrustRule[] = [];
2357
2364
  try {
2358
2365
  const raw = readFileSync(trustPath, 'utf-8');
2359
2366
  currentRules = JSON.parse(raw).rules ?? [];
2360
2367
  } catch { /* first run */ }
2361
2368
 
2362
- currentRules = currentRules.filter((r: any) => r.id !== opts.id);
2369
+ currentRules = currentRules.filter((r: TrustRule) => r.id !== opts.id);
2363
2370
  currentRules.push({
2364
2371
  ...opts,
2365
2372
  createdAt: Date.now(),
@@ -2486,7 +2493,7 @@ describe('Permission Checker', () => {
2486
2493
  // Write the executionTarget field directly (addVersionBoundRule doesn't support it)
2487
2494
  const trustPath = join(checkerTestDir, 'protected', 'trust.json');
2488
2495
  const raw = JSON.parse((await import('node:fs')).readFileSync(trustPath, 'utf-8'));
2489
- const rule = raw.rules.find((r: any) => r.id === 'inv4-target-scoped');
2496
+ const rule = raw.rules.find((r: TrustRule) => r.id === 'inv4-target-scoped');
2490
2497
  rule.executionTarget = '/usr/local/bin/node';
2491
2498
  (await import('node:fs')).writeFileSync(trustPath, JSON.stringify(raw, null, 2));
2492
2499
  clearCache();
@@ -6,33 +6,53 @@ let llmResolution: 'keep_existing' | 'keep_candidate' | 'merge' | 'still_unclear
6
6
  let llmResolvedStatement = '';
7
7
  let llmExplanation = 'Unclear response from user.';
8
8
 
9
- mock.module('@anthropic-ai/sdk', () => ({
10
- default: class MockAnthropic {
11
- messages = {
12
- create: async (_body: unknown, opts?: { signal?: AbortSignal }) => {
13
- llmCallCount += 1;
14
- if (llmDelayMs > 0) {
15
- await new Promise((resolve, reject) => {
16
- const timer = setTimeout(resolve, llmDelayMs);
17
- opts?.signal?.addEventListener('abort', () => {
18
- clearTimeout(timer);
19
- reject(new Error('Request was aborted.'));
20
- });
9
+ mock.module('../providers/provider-send-message.js', () => ({
10
+ getConfiguredProvider: () => ({
11
+ sendMessage: async (
12
+ _messages: unknown,
13
+ _tools: unknown,
14
+ _system: unknown,
15
+ opts?: { signal?: AbortSignal },
16
+ ) => {
17
+ llmCallCount += 1;
18
+ if (llmDelayMs > 0) {
19
+ await new Promise((resolve, reject) => {
20
+ const timer = setTimeout(resolve, llmDelayMs);
21
+ opts?.signal?.addEventListener('abort', () => {
22
+ clearTimeout(timer);
23
+ reject(new Error('Request was aborted.'));
21
24
  });
22
- }
23
- return {
24
- content: [{
25
- type: 'tool_use',
26
- input: {
27
- resolution: llmResolution,
28
- resolved_statement: llmResolvedStatement,
29
- explanation: llmExplanation,
30
- },
31
- }],
32
- };
33
- },
25
+ });
26
+ }
27
+ return {
28
+ content: [{
29
+ type: 'tool_use' as const,
30
+ id: 'test-tool-use-id',
31
+ name: 'resolve_conflict',
32
+ input: {
33
+ resolution: llmResolution,
34
+ resolved_statement: llmResolvedStatement,
35
+ explanation: llmExplanation,
36
+ },
37
+ }],
38
+ model: 'claude-haiku-4-5-20251001',
39
+ stopReason: 'tool_use',
40
+ usage: { inputTokens: 0, outputTokens: 0 },
41
+ };
42
+ },
43
+ }),
44
+ createTimeout: (ms: number) => {
45
+ const controller = new AbortController();
46
+ const timer = setTimeout(() => controller.abort(), ms);
47
+ return {
48
+ signal: controller.signal,
49
+ cleanup: () => clearTimeout(timer),
34
50
  };
35
51
  },
52
+ extractToolUse: (response: { content: Array<{ type: string }> }) => {
53
+ return response.content.find((b: { type: string }) => b.type === 'tool_use');
54
+ },
55
+ userMessage: (text: string) => ({ role: 'user', content: [{ type: 'text', text }] }),
36
56
  }));
37
57
 
38
58
  mock.module('../config/loader.js', () => ({
@@ -308,25 +308,30 @@ describe('CommitEnrichmentService', () => {
308
308
  });
309
309
 
310
310
  test('job timeout triggers retry with backoff then fails after max retries', async () => {
311
- // Use a very short timeout so the real git notes write times out
312
311
  const service = new CommitEnrichmentService({
313
312
  maxQueueSize: 10,
314
313
  maxConcurrency: 1,
315
- jobTimeoutMs: 1, // 1ms timeout — will always time out
314
+ jobTimeoutMs: 10, // short timeout
316
315
  maxRetries: 2,
317
316
  });
318
317
 
319
318
  const commitHash = await createCommit();
319
+
320
+ // Use a slow gitService so the timeout always wins the race.
321
+ // A 1ms timeout against a real git write is flaky on fast CI runners.
322
+ const slowGitService = new WorkspaceGitService(testDir);
323
+ await slowGitService.ensureInitialized();
324
+ slowGitService.writeNote = () => new Promise<void>(() => {});
325
+
320
326
  service.enqueue({
321
327
  workspaceDir: testDir,
322
328
  commitHash,
323
329
  context: makeContext(),
324
- gitService,
330
+ gitService: slowGitService,
325
331
  });
326
332
 
327
333
  // Wait for all retries to complete (initial + 2 retries, with backoff)
328
334
  // Backoff: 1s after attempt 1, 2s after attempt 2 = ~3s total
329
- // But since the job itself is very fast to time out, total time is dominated by backoff
330
335
  await waitForDrain(service, 10000);
331
336
  await service.shutdown();
332
337
 
@@ -8,6 +8,13 @@ mock.module('../util/logger.js', () => ({
8
8
  getLogger: () => new Proxy({} as Record<string, unknown>, {
9
9
  get: () => () => {},
10
10
  }),
11
+ getCliLogger: () => new Proxy({} as Record<string, unknown>, {
12
+ get: () => () => {},
13
+ }),
14
+ isDebug: () => false,
15
+ truncateForLog: (value: string, maxLen = 500) => value.length > maxLen ? value.slice(0, maxLen) + '...' : value,
16
+ initLogger: () => {},
17
+ pruneOldLogFiles: () => 0,
11
18
  }));
12
19
 
13
20
  mock.module('../util/platform.js', () => ({
@@ -38,6 +45,7 @@ mock.module('../util/platform.js', () => ({
38
45
  isMacOS: () => false,
39
46
  isLinux: () => true,
40
47
  isWindows: () => false,
48
+ readHttpToken: () => null,
41
49
  }));
42
50
 
43
51
  mock.module('../tools/executor.js', () => ({
@@ -74,9 +74,9 @@ describe('AssistantConfigSchema', () => {
74
74
  const result = AssistantConfigSchema.parse({});
75
75
  expect(result.provider).toBe('anthropic');
76
76
  expect(result.model).toBe('claude-opus-4-6');
77
- expect(result.maxTokens).toBe(64000);
77
+ expect(result.maxTokens).toBe(16000);
78
78
  expect(result.apiKeys).toEqual({});
79
- expect(result.thinking).toEqual({ enabled: false, budgetTokens: 10000 });
79
+ expect(result.thinking).toEqual({ enabled: false, budgetTokens: 10000, streamThinking: false });
80
80
  expect(result.contextWindow).toEqual({
81
81
  enabled: true,
82
82
  maxInputTokens: 180000,
@@ -707,6 +707,11 @@ describe('AssistantConfigSchema', () => {
707
707
  callerIdentity: {
708
708
  allowPerCallOverride: true,
709
709
  },
710
+ verification: {
711
+ enabled: false,
712
+ maxAttempts: 3,
713
+ codeLength: 6,
714
+ },
710
715
  });
711
716
  });
712
717
 
@@ -1188,8 +1193,8 @@ describe('loadConfig with schema validation', () => {
1188
1193
  const config = loadConfig();
1189
1194
  expect(config.provider).toBe('anthropic');
1190
1195
  expect(config.model).toBe('claude-opus-4-6');
1191
- expect(config.maxTokens).toBe(64000);
1192
- expect(config.thinking).toEqual({ enabled: false, budgetTokens: 10000 });
1196
+ expect(config.maxTokens).toBe(16000);
1197
+ expect(config.thinking).toEqual({ enabled: false, budgetTokens: 10000, streamThinking: false });
1193
1198
  expect(config.contextWindow).toEqual({
1194
1199
  enabled: true,
1195
1200
  maxInputTokens: 180000,
@@ -1210,7 +1215,7 @@ describe('loadConfig with schema validation', () => {
1210
1215
  test('falls back to default for invalid maxTokens', () => {
1211
1216
  writeConfig({ maxTokens: -100 });
1212
1217
  const config = loadConfig();
1213
- expect(config.maxTokens).toBe(64000);
1218
+ expect(config.maxTokens).toBe(16000);
1214
1219
  });
1215
1220
 
1216
1221
  test('falls back to defaults for invalid nested values', () => {
@@ -1235,13 +1240,13 @@ describe('loadConfig with schema validation', () => {
1235
1240
  expect(config.model).toBe('gpt-4');
1236
1241
  expect(config.thinking.enabled).toBe(true);
1237
1242
  expect(config.thinking.budgetTokens).toBe(5000);
1238
- expect(config.maxTokens).toBe(64000);
1243
+ expect(config.maxTokens).toBe(16000);
1239
1244
  });
1240
1245
 
1241
1246
  test('handles no config file', () => {
1242
1247
  const config = loadConfig();
1243
1248
  expect(config.provider).toBe('anthropic');
1244
- expect(config.maxTokens).toBe(64000);
1249
+ expect(config.maxTokens).toBe(16000);
1245
1250
  });
1246
1251
 
1247
1252
  test('partial nested objects get defaults for missing fields', () => {
@@ -287,7 +287,7 @@ describe('ContextWindowManager', () => {
287
287
  expect(getSummaryFromContextMessage(userMessage)).toBeNull();
288
288
  });
289
289
 
290
- test('skips compaction during cooldown when projected gain is too low', async () => {
290
+ test('skips compaction during cooldown', async () => {
291
291
  const provider = createProvider(() => {
292
292
  throw new Error('summarizer should not be called while cooldown skip is active');
293
293
  });
@@ -307,7 +307,7 @@ describe('ContextWindowManager', () => {
307
307
  lastCompactedAt: Date.now() - 30_000,
308
308
  });
309
309
  expect(result.compacted).toBe(false);
310
- expect(result.reason).toBe('compaction cooldown active with low projected gain');
310
+ expect(result.reason).toBe('compaction cooldown active');
311
311
  });
312
312
 
313
313
  test('ignores cooldown and compacts under severe token pressure', async () => {
@@ -338,6 +338,34 @@ describe('ContextWindowManager', () => {
338
338
  expect(result.reason).toBeUndefined();
339
339
  });
340
340
 
341
+ test('force=true bypasses cooldown for context-too-large recovery', async () => {
342
+ const provider = createProvider(() => ({
343
+ content: [{ type: 'text', text: '## Goals\n- forced compaction' }],
344
+ model: 'mock-model',
345
+ usage: { inputTokens: 60, outputTokens: 12 },
346
+ stopReason: 'end_turn',
347
+ }));
348
+ const manager = new ContextWindowManager(
349
+ provider,
350
+ 'system prompt',
351
+ makeConfig({ maxInputTokens: 260, targetInputTokens: 180, preserveRecentUserTurns: 1 }),
352
+ );
353
+ const long = 'c'.repeat(220);
354
+ const history: Message[] = [
355
+ message('user', `u1 ${long}`),
356
+ message('assistant', `a1 ${long}`),
357
+ message('user', `u2 ${long}`),
358
+ ];
359
+
360
+ // Same setup as the cooldown test, but with force=true — should compact.
361
+ const result = await manager.maybeCompact(history, undefined, {
362
+ lastCompactedAt: Date.now() - 30_000,
363
+ force: true,
364
+ });
365
+ expect(result.compacted).toBe(true);
366
+ expect(result.reason).toBeUndefined();
367
+ });
368
+
341
369
  test('image-heavy payload is no longer underestimated as below-threshold', async () => {
342
370
  const provider = createProvider(() => ({
343
371
  content: [{ type: 'text', text: '## Goals\n- compacted image-heavy history' }],
@@ -15,22 +15,37 @@ const classifyRelationshipMock = mock(async () => {
15
15
  return {
16
16
  content: [
17
17
  {
18
- type: 'tool_use',
18
+ type: 'tool_use' as const,
19
+ id: 'test-tool-use-id',
20
+ name: 'classify_relationship',
19
21
  input: {
20
22
  relationship: nextRelationship,
21
23
  explanation: nextExplanation,
22
24
  },
23
25
  },
24
26
  ],
27
+ model: 'claude-haiku-4-5-20251001',
28
+ stopReason: 'tool_use',
29
+ usage: { inputTokens: 0, outputTokens: 0 },
25
30
  };
26
31
  });
27
32
 
28
- mock.module('@anthropic-ai/sdk', () => ({
29
- default: class MockAnthropic {
30
- messages = {
31
- create: classifyRelationshipMock,
33
+ mock.module('../providers/provider-send-message.js', () => ({
34
+ getConfiguredProvider: () => ({
35
+ sendMessage: classifyRelationshipMock,
36
+ }),
37
+ createTimeout: (ms: number) => {
38
+ const controller = new AbortController();
39
+ const timer = setTimeout(() => controller.abort(), ms);
40
+ return {
41
+ signal: controller.signal,
42
+ cleanup: () => clearTimeout(timer),
32
43
  };
33
44
  },
45
+ extractToolUse: (response: { content: Array<{ type: string }> }) => {
46
+ return response.content.find((b: { type: string }) => b.type === 'tool_use');
47
+ },
48
+ userMessage: (text: string) => ({ role: 'user', content: [{ type: 'text', text }] }),
34
49
  }));
35
50
 
36
51
  mock.module('../util/platform.js', () => ({
@@ -180,7 +180,10 @@ describe('Invariant 2: no generic plaintext secret read API', () => {
180
180
  'tools/credentials/broker.ts', // brokered credential access
181
181
  'tools/network/web-search.ts', // web search API key lookup
182
182
  'daemon/handlers.ts', // Vercel API token + integration OAuth
183
- 'daemon/handlers/config.ts', // Vercel API token + integration OAuth (split handler)
183
+ 'daemon/handlers/config-integrations.ts', // Vercel API token + Twitter integration OAuth
184
+ 'daemon/handlers/config-telegram.ts', // Telegram bot token management
185
+ 'daemon/handlers/config-twilio.ts', // Twilio credential management
186
+ 'daemon/handlers/config-ingress.ts', // Ingress config (reads Twilio credentials for webhook sync)
184
187
  'security/token-manager.ts', // OAuth token refresh flow
185
188
  'email/providers/index.ts', // email provider API key lookup
186
189
  'tools/network/script-proxy/session-manager.ts', // proxy credential injection at runtime
@@ -198,6 +201,7 @@ describe('Invariant 2: no generic plaintext secret read API', () => {
198
201
  'cli/config-commands.ts', // CLI config management
199
202
  'messaging/providers/telegram-bot/adapter.ts', // Telegram bot token lookup for connectivity check
200
203
  'messaging/providers/sms/adapter.ts', // Twilio credential lookup for SMS connectivity check
204
+ 'runtime/channel-readiness-service.ts', // channel readiness probes for SMS/Telegram connectivity
201
205
  ]);
202
206
 
203
207
  const thisDir = dirname(fileURLToPath(import.meta.url));
@@ -313,7 +317,7 @@ describe('Invariant 3: secrets never logged in plaintext', () => {
313
317
  const logCallPattern = /log\.\w+\(\{([^}]*)}/g;
314
318
  const loggedFields: string[] = [];
315
319
  let match;
316
- while ((match = logCallPattern.exec(prompterSrc)) !== null) {
320
+ while ((match = logCallPattern.exec(prompterSrc)) != null) {
317
321
  // Collect field names from the structured log object
318
322
  const fields = match[1].split(',').map(f => f.trim().split(':')[0].trim());
319
323
  loggedFields.push(...fields);