@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
package/README.md CHANGED
@@ -286,6 +286,57 @@ Response type: `channel_readiness_response` with `success`, optional `snapshots`
286
286
  | `src/runtime/channel-readiness-service.ts` | Service class with probe registration, cached readiness evaluation, and built-in SMS/Telegram probes |
287
287
  | `src/daemon/handlers/config.ts` | `handleChannelReadiness` — IPC handler for `channel_readiness` messages |
288
288
 
289
+ ## Assistant Inbox (Ingress Membership + Escalation)
290
+
291
+ The assistant inbox provides secure cross-user messaging, allowing external users (non-guardians) to interact with the assistant through channels (Telegram, SMS) under the owner's control. Access is governed by an invite-based membership system with per-member policy enforcement.
292
+
293
+ ### Ingress Membership
294
+
295
+ External users join through **invite tokens** — the owner creates an invite via the desktop UI or IPC, and the external user redeems the token by sending it as a channel message. Redemption auto-creates a **member** record with an access policy:
296
+
297
+ - **`allow`** — Messages are processed normally through the agent pipeline.
298
+ - **`deny`** — Messages are rejected with a refusal notice.
299
+ - **`escalate`** — Messages are held for guardian (owner) approval before processing.
300
+
301
+ Non-members (senders with no invite redemption) are denied by default. Members can be listed, updated, revoked, or blocked via the `ingress_member` IPC contract.
302
+
303
+ ### Escalation Flow (Dual-Surface)
304
+
305
+ When a member's policy is `escalate`, inbound messages create a `channel_guardian_approval_request` and notify the guardian through two surfaces:
306
+
307
+ 1. **Channel push notification** — The guardian receives a message on their configured channel (Telegram/SMS) describing the escalation, allowing quick approve/deny from their phone.
308
+ 2. **Desktop inbox UI** — The macOS `AssistantInboxPanel` shows pending escalations with approve/deny buttons in the Escalations tab. A 15-second polling loop keeps the queue current.
309
+
310
+ On **approve**: the original message payload is recovered from the channel delivery store and processed through the agent pipeline. The assistant's reply is delivered back to the external user via the gateway. On **deny**: a refusal message is sent to the external user.
311
+
312
+ If no guardian binding exists, escalation fails closed — the message is denied rather than left in a silent wait state.
313
+
314
+ ### Inbox Thread State
315
+
316
+ The `assistant_inbox_thread_state` table provides a denormalized view of per-contact conversation threads, tracking unread counts, pending escalation counts, and last message timestamps. Threads are keyed by `conversationId` and bound to `(assistantId, sourceChannel, externalChatId)`. The escalation projection (`inbox-escalation-projection.ts`) keeps badge counts in sync with the `channel_guardian_approval_requests` table.
317
+
318
+ ### IPC Contracts
319
+
320
+ | Message Type | Actions | Description |
321
+ |---|---|---|
322
+ | `ingress_invite` | create, list, revoke, redeem | Manage invite tokens (SHA-256 hashed, raw token returned once on create) |
323
+ | `ingress_member` | list, upsert, revoke, block | Manage member records and access policies |
324
+ | `assistant_inbox` | list_threads, get_thread_messages | Query inbox threads and message history |
325
+ | `assistant_inbox_escalation` | list, decide | List pending escalations and approve/deny from desktop |
326
+ | `assistant_inbox_reply` | — | Send a reply to an external user from the desktop inbox |
327
+
328
+ ### Key Modules
329
+
330
+ | File | Purpose |
331
+ |------|---------|
332
+ | `src/memory/ingress-invite-store.ts` | CRUD for invite tokens with SHA-256 hashing and expiry |
333
+ | `src/memory/ingress-member-store.ts` | CRUD for ingress members with policy enforcement |
334
+ | `src/memory/inbox-thread-store.ts` | Inbox thread state queries (unread counts, escalation badges) |
335
+ | `src/memory/inbox-escalation-projection.ts` | Projects escalation state from approval requests onto thread state |
336
+ | `src/daemon/handlers/config-inbox.ts` | IPC handlers for all inbox contracts |
337
+ | `src/daemon/ipc-contract/inbox.ts` | TypeScript type definitions for inbox IPC messages |
338
+ | `src/runtime/routes/channel-routes.ts` | ACL enforcement point — member lookup, policy check, escalation creation |
339
+
289
340
  ## Database
290
341
 
291
342
  SQLite via Drizzle ORM, stored at `~/.vellum/workspace/data/db/assistant.db`. Key tables include conversations, messages, tool invocations, attachments, memory segments (with FTS5), memory items, entities, reminders, and recurrence schedules (cron + RRULE).
package/eslint.config.mjs CHANGED
@@ -10,6 +10,37 @@ const eslintConfig = defineConfig([
10
10
  "error",
11
11
  { argsIgnorePattern: "^_", varsIgnorePattern: "^_" },
12
12
  ],
13
+
14
+ // Standardize on `undefined` only — avoid `null` in new code.
15
+ // Prefer `=== undefined`, `?? fallback`, or `?.` optional chaining
16
+ // instead of `=== null`.
17
+ "no-restricted-syntax": [
18
+ "error",
19
+ {
20
+ selector:
21
+ "BinaryExpression[operator='==='][right.type='Literal'][right.raw='null']",
22
+ message:
23
+ "Avoid `=== null`. Prefer `=== undefined`, `?? fallback`, or optional chaining `?.` instead.",
24
+ },
25
+ {
26
+ selector:
27
+ "BinaryExpression[operator='==='][left.type='Literal'][left.raw='null']",
28
+ message:
29
+ "Avoid `null ===`. Prefer `=== undefined`, `?? fallback`, or optional chaining `?.` instead.",
30
+ },
31
+ {
32
+ selector:
33
+ "BinaryExpression[operator='!=='][right.type='Literal'][right.raw='null']",
34
+ message:
35
+ "Avoid `!== null`. Prefer `!== undefined`, nullish coalescing `??`, or optional chaining `?.` instead.",
36
+ },
37
+ {
38
+ selector:
39
+ "BinaryExpression[operator='!=='][left.type='Literal'][left.raw='null']",
40
+ message:
41
+ "Avoid `null !==`. Prefer `!== undefined`, nullish coalescing `??`, or optional chaining `?.` instead.",
42
+ },
43
+ ],
13
44
  },
14
45
  },
15
46
  ]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vellumai/assistant",
3
- "version": "0.3.5",
3
+ "version": "0.3.6",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "vellum": "./src/index.ts"
@@ -53,6 +53,9 @@ const SWIFT_OMIT_ALLOWLIST = new Set<string>([
53
53
  'browser_handoff_request',
54
54
  // Guardian verification — daemon-internal for Telegram channel setup
55
55
  'guardian_verification_response',
56
+ // Ingress invite/member management — not yet consumed by the macOS client
57
+ 'ingress_invite_response',
58
+ 'ingress_member_response',
56
59
  // Work item messages — not yet consumed by the macOS client
57
60
  'work_item_get_response',
58
61
  'work_item_run_task_response',
@@ -99,7 +102,7 @@ function extractSwiftDecodeCases(swiftSource: string): Set<string> {
99
102
 
100
103
  const decoderSection = swiftSource.slice(decoderStart);
101
104
 
102
- while ((match = re.exec(decoderSection)) !== null) {
105
+ while ((match = re.exec(decoderSection)) != null) {
103
106
  cases.add(match[1]);
104
107
  }
105
108
 
@@ -21,11 +21,25 @@ import * as TJS from 'typescript-json-schema';
21
21
 
22
22
  const ROOT = path.resolve(import.meta.dirname ?? __dirname, '../..');
23
23
  const CONTRACT_PATH = path.join(ROOT, 'src/daemon/ipc-contract.ts');
24
+ const DOMAIN_DIR = path.join(ROOT, 'src/daemon/ipc-contract');
24
25
  const OUTPUT_PATH = path.resolve(
25
26
  ROOT,
26
27
  '../clients/shared/IPC/Generated/IPCContractGenerated.swift',
27
28
  );
28
29
 
30
+ /** Collect all .ts files: the barrel + domain files. */
31
+ function getContractFiles(): string[] {
32
+ const files = [CONTRACT_PATH];
33
+ if (fs.existsSync(DOMAIN_DIR)) {
34
+ for (const f of fs.readdirSync(DOMAIN_DIR)) {
35
+ if (f.endsWith('.ts')) {
36
+ files.push(path.join(DOMAIN_DIR, f));
37
+ }
38
+ }
39
+ }
40
+ return files;
41
+ }
42
+
29
43
  const PREAMBLE = `// AUTO-GENERATED from assistant/src/daemon/ipc-contract.ts — DO NOT EDIT
30
44
  // Regenerate: cd assistant && bun run generate:ipc
31
45
  //
@@ -76,7 +90,9 @@ interface SchemaDef {
76
90
  // --- Step 1: Generate JSON Schema from TypeScript ---
77
91
 
78
92
  function generateSchemas(): Record<string, SchemaDef> {
79
- const program = TJS.getProgramFromFiles([CONTRACT_PATH], {
93
+ const contractFiles = getContractFiles();
94
+
95
+ const program = TJS.getProgramFromFiles(contractFiles, {
80
96
  strict: true,
81
97
  target: 99,
82
98
  module: 199,
@@ -95,7 +111,7 @@ function generateSchemas(): Record<string, SchemaDef> {
95
111
  throw new Error('Failed to create schema generator');
96
112
  }
97
113
 
98
- const symbols = generator.getMainFileSymbols(program, [CONTRACT_PATH]);
114
+ const symbols = generator.getMainFileSymbols(program, contractFiles);
99
115
  const result: Record<string, SchemaDef> = {};
100
116
 
101
117
  const skipped: string[] = [];
@@ -37,7 +37,7 @@ exports[`IPC message snapshots ClientMessage types session_create serializes to
37
37
  "threadType": "standard",
38
38
  "title": "New session",
39
39
  "transport": {
40
- "channelId": "desktop",
40
+ "channelId": "macos",
41
41
  "hints": [
42
42
  "dashboard-capable",
43
43
  ],
@@ -374,6 +374,13 @@ exports[`IPC message snapshots ClientMessage types schedule_remove serializes to
374
374
  }
375
375
  `;
376
376
 
377
+ exports[`IPC message snapshots ClientMessage types schedule_run_now serializes to expected JSON 1`] = `
378
+ {
379
+ "id": "sched-001",
380
+ "type": "schedule_run_now",
381
+ }
382
+ `;
383
+
377
384
  exports[`IPC message snapshots ClientMessage types reminders_list serializes to expected JSON 1`] = `
378
385
  {
379
386
  "type": "reminders_list",
@@ -475,6 +482,15 @@ exports[`IPC message snapshots ClientMessage types sessions_clear serializes to
475
482
  }
476
483
  `;
477
484
 
485
+ exports[`IPC message snapshots ClientMessage types conversation_search serializes to expected JSON 1`] = `
486
+ {
487
+ "limit": 20,
488
+ "maxMessagesPerConversation": 3,
489
+ "query": "hello world",
490
+ "type": "conversation_search",
491
+ }
492
+ `;
493
+
478
494
  exports[`IPC message snapshots ClientMessage types ipc_blob_probe serializes to expected JSON 1`] = `
479
495
  {
480
496
  "nonceSha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
@@ -931,6 +947,95 @@ exports[`IPC message snapshots ClientMessage types dictation_request serializes
931
947
  }
932
948
  `;
933
949
 
950
+ exports[`IPC message snapshots ClientMessage types parental_control_get serializes to expected JSON 1`] = `
951
+ {
952
+ "type": "parental_control_get",
953
+ }
954
+ `;
955
+
956
+ exports[`IPC message snapshots ClientMessage types parental_control_verify_pin serializes to expected JSON 1`] = `
957
+ {
958
+ "pin": "123456",
959
+ "type": "parental_control_verify_pin",
960
+ }
961
+ `;
962
+
963
+ exports[`IPC message snapshots ClientMessage types parental_control_set_pin serializes to expected JSON 1`] = `
964
+ {
965
+ "current_pin": "123456",
966
+ "new_pin": "654321",
967
+ "type": "parental_control_set_pin",
968
+ }
969
+ `;
970
+
971
+ exports[`IPC message snapshots ClientMessage types parental_control_update serializes to expected JSON 1`] = `
972
+ {
973
+ "blocked_tool_categories": [
974
+ "shell",
975
+ "network",
976
+ ],
977
+ "content_restrictions": [
978
+ "violence",
979
+ "adult_content",
980
+ ],
981
+ "enabled": true,
982
+ "pin": "123456",
983
+ "type": "parental_control_update",
984
+ }
985
+ `;
986
+
987
+ exports[`IPC message snapshots ClientMessage types ingress_invite serializes to expected JSON 1`] = `
988
+ {
989
+ "action": "create",
990
+ "expiresInMs": 86400000,
991
+ "maxUses": 5,
992
+ "note": "Test invite",
993
+ "sourceChannel": "telegram",
994
+ "type": "ingress_invite",
995
+ }
996
+ `;
997
+
998
+ exports[`IPC message snapshots ClientMessage types ingress_member serializes to expected JSON 1`] = `
999
+ {
1000
+ "action": "upsert",
1001
+ "displayName": "Test User",
1002
+ "externalChatId": "chat-456",
1003
+ "externalUserId": "user-123",
1004
+ "policy": "allow",
1005
+ "sourceChannel": "telegram",
1006
+ "status": "active",
1007
+ "type": "ingress_member",
1008
+ "username": "testuser",
1009
+ }
1010
+ `;
1011
+
1012
+ exports[`IPC message snapshots ClientMessage types assistant_inbox serializes to expected JSON 1`] = `
1013
+ {
1014
+ "action": "list_threads",
1015
+ "assistantId": "asst-001",
1016
+ "limit": 20,
1017
+ "offset": 0,
1018
+ "type": "assistant_inbox",
1019
+ }
1020
+ `;
1021
+
1022
+ exports[`IPC message snapshots ClientMessage types assistant_inbox_escalation serializes to expected JSON 1`] = `
1023
+ {
1024
+ "action": "list",
1025
+ "assistantId": "asst-001",
1026
+ "status": "pending",
1027
+ "type": "assistant_inbox_escalation",
1028
+ }
1029
+ `;
1030
+
1031
+ exports[`IPC message snapshots ClientMessage types assistant_inbox_reply serializes to expected JSON 1`] = `
1032
+ {
1033
+ "content": "Hello from the assistant",
1034
+ "conversationId": "conv-001",
1035
+ "type": "assistant_inbox_reply",
1036
+ }
1037
+ `;
1038
+
934
1039
  exports[`IPC message snapshots ServerMessage types auth_result serializes to expected JSON 1`] = `
935
1040
  {
936
1041
  "success": true,
@@ -1086,6 +1191,14 @@ exports[`IPC message snapshots ServerMessage types session_info serializes to ex
1086
1191
  }
1087
1192
  `;
1088
1193
 
1194
+ exports[`IPC message snapshots ServerMessage types session_title_updated serializes to expected JSON 1`] = `
1195
+ {
1196
+ "sessionId": "sess-001",
1197
+ "title": "Plan sprint rollout",
1198
+ "type": "session_title_updated",
1199
+ }
1200
+ `;
1201
+
1089
1202
  exports[`IPC message snapshots ServerMessage types session_list_response serializes to expected JSON 1`] = `
1090
1203
  {
1091
1204
  "sessions": [
@@ -1113,6 +1226,28 @@ exports[`IPC message snapshots ServerMessage types sessions_clear_response seria
1113
1226
  }
1114
1227
  `;
1115
1228
 
1229
+ exports[`IPC message snapshots ServerMessage types conversation_search_response serializes to expected JSON 1`] = `
1230
+ {
1231
+ "query": "hello world",
1232
+ "results": [
1233
+ {
1234
+ "conversationId": "conv-001",
1235
+ "conversationTitle": "My Conversation",
1236
+ "conversationUpdatedAt": 1700000000,
1237
+ "matchingMessages": [
1238
+ {
1239
+ "createdAt": 1699999000,
1240
+ "excerpt": "…hello world, how are you?…",
1241
+ "messageId": "msg-001",
1242
+ "role": "user",
1243
+ },
1244
+ ],
1245
+ },
1246
+ ],
1247
+ "type": "conversation_search_response",
1248
+ }
1249
+ `;
1250
+
1116
1251
  exports[`IPC message snapshots ServerMessage types error serializes to expected JSON 1`] = `
1117
1252
  {
1118
1253
  "message": "Something went wrong",
@@ -2475,6 +2610,17 @@ exports[`IPC message snapshots ServerMessage types task_run_thread_created seria
2475
2610
  }
2476
2611
  `;
2477
2612
 
2613
+ exports[`IPC message snapshots ServerMessage types guardian_request_thread_created serializes to expected JSON 1`] = `
2614
+ {
2615
+ "callSessionId": "call-001",
2616
+ "conversationId": "conv-guardian-001",
2617
+ "questionText": "What is the gate code?",
2618
+ "requestId": "req-guardian-001",
2619
+ "title": "Guardian action request",
2620
+ "type": "guardian_request_thread_created",
2621
+ }
2622
+ `;
2623
+
2478
2624
  exports[`IPC message snapshots ServerMessage types subagent_spawned serializes to expected JSON 1`] = `
2479
2625
  {
2480
2626
  "label": "Research Agent",
@@ -2599,3 +2745,194 @@ exports[`IPC message snapshots ServerMessage types dictation_response serializes
2599
2745
  "type": "dictation_response",
2600
2746
  }
2601
2747
  `;
2748
+
2749
+ exports[`IPC message snapshots ServerMessage types parental_control_get_response serializes to expected JSON 1`] = `
2750
+ {
2751
+ "blocked_tool_categories": [
2752
+ "shell",
2753
+ "network",
2754
+ ],
2755
+ "content_restrictions": [
2756
+ "violence",
2757
+ "adult_content",
2758
+ ],
2759
+ "enabled": true,
2760
+ "has_pin": true,
2761
+ "type": "parental_control_get_response",
2762
+ }
2763
+ `;
2764
+
2765
+ exports[`IPC message snapshots ServerMessage types parental_control_verify_pin_response serializes to expected JSON 1`] = `
2766
+ {
2767
+ "type": "parental_control_verify_pin_response",
2768
+ "verified": true,
2769
+ }
2770
+ `;
2771
+
2772
+ exports[`IPC message snapshots ServerMessage types parental_control_set_pin_response serializes to expected JSON 1`] = `
2773
+ {
2774
+ "success": true,
2775
+ "type": "parental_control_set_pin_response",
2776
+ }
2777
+ `;
2778
+
2779
+ exports[`IPC message snapshots ServerMessage types parental_control_update_response serializes to expected JSON 1`] = `
2780
+ {
2781
+ "blocked_tool_categories": [
2782
+ "shell",
2783
+ "network",
2784
+ ],
2785
+ "content_restrictions": [
2786
+ "violence",
2787
+ "adult_content",
2788
+ ],
2789
+ "enabled": true,
2790
+ "has_pin": true,
2791
+ "success": true,
2792
+ "type": "parental_control_update_response",
2793
+ }
2794
+ `;
2795
+
2796
+ exports[`IPC message snapshots ServerMessage types ingress_invite_response serializes to expected JSON 1`] = `
2797
+ {
2798
+ "invite": {
2799
+ "createdAt": 1700000000,
2800
+ "expiresAt": 1700100000000,
2801
+ "id": "inv-001",
2802
+ "maxUses": 5,
2803
+ "note": "Test invite",
2804
+ "sourceChannel": "telegram",
2805
+ "status": "active",
2806
+ "token": "tok-abc123",
2807
+ "tokenHash": "hash-abc123",
2808
+ "useCount": 0,
2809
+ },
2810
+ "success": true,
2811
+ "type": "ingress_invite_response",
2812
+ }
2813
+ `;
2814
+
2815
+ exports[`IPC message snapshots ServerMessage types ingress_member_response serializes to expected JSON 1`] = `
2816
+ {
2817
+ "member": {
2818
+ "createdAt": 1700000000,
2819
+ "displayName": "Test User",
2820
+ "externalChatId": "chat-456",
2821
+ "externalUserId": "user-123",
2822
+ "id": "mem-001",
2823
+ "lastSeenAt": 1700000000,
2824
+ "policy": "allow",
2825
+ "sourceChannel": "telegram",
2826
+ "status": "active",
2827
+ "username": "testuser",
2828
+ },
2829
+ "success": true,
2830
+ "type": "ingress_member_response",
2831
+ }
2832
+ `;
2833
+
2834
+ exports[`IPC message snapshots ServerMessage types assistant_inbox_response serializes to expected JSON 1`] = `
2835
+ {
2836
+ "success": true,
2837
+ "threads": [
2838
+ {
2839
+ "conversationId": "conv-001",
2840
+ "displayName": "Test User",
2841
+ "externalChatId": "chat-456",
2842
+ "externalUserId": "user-123",
2843
+ "hasPendingEscalation": false,
2844
+ "lastInboundAt": 1700000000,
2845
+ "lastMessageAt": 1700000000,
2846
+ "lastOutboundAt": 1699999000,
2847
+ "sourceChannel": "telegram",
2848
+ "unreadCount": 3,
2849
+ "username": "testuser",
2850
+ },
2851
+ ],
2852
+ "type": "assistant_inbox_response",
2853
+ }
2854
+ `;
2855
+
2856
+ exports[`IPC message snapshots ServerMessage types assistant_inbox_escalation_response serializes to expected JSON 1`] = `
2857
+ {
2858
+ "escalations": [
2859
+ {
2860
+ "channel": "telegram",
2861
+ "conversationId": "conv-001",
2862
+ "createdAt": 1700000000,
2863
+ "id": "esc-001",
2864
+ "requestSummary": "User wants to delete their account",
2865
+ "requesterChatId": "chat-456",
2866
+ "requesterExternalUserId": "user-123",
2867
+ "runId": "run-001",
2868
+ "status": "pending",
2869
+ },
2870
+ ],
2871
+ "success": true,
2872
+ "type": "assistant_inbox_escalation_response",
2873
+ }
2874
+ `;
2875
+
2876
+ exports[`IPC message snapshots ServerMessage types assistant_inbox_reply_response serializes to expected JSON 1`] = `
2877
+ {
2878
+ "messageId": "msg-reply-001",
2879
+ "success": true,
2880
+ "type": "assistant_inbox_reply_response",
2881
+ }
2882
+ `;
2883
+
2884
+ exports[`IPC message snapshots ClientMessage types pairing_approval_response serializes to expected JSON 1`] = `
2885
+ {
2886
+ "decision": "approve_once",
2887
+ "pairingRequestId": "pair-001",
2888
+ "type": "pairing_approval_response",
2889
+ }
2890
+ `;
2891
+
2892
+ exports[`IPC message snapshots ClientMessage types approved_devices_list serializes to expected JSON 1`] = `
2893
+ {
2894
+ "type": "approved_devices_list",
2895
+ }
2896
+ `;
2897
+
2898
+ exports[`IPC message snapshots ClientMessage types approved_device_remove serializes to expected JSON 1`] = `
2899
+ {
2900
+ "hashedDeviceId": "hashed-device-001",
2901
+ "type": "approved_device_remove",
2902
+ }
2903
+ `;
2904
+
2905
+ exports[`IPC message snapshots ClientMessage types approved_devices_clear serializes to expected JSON 1`] = `
2906
+ {
2907
+ "type": "approved_devices_clear",
2908
+ }
2909
+ `;
2910
+
2911
+ exports[`IPC message snapshots ServerMessage types pairing_approval_request serializes to expected JSON 1`] = `
2912
+ {
2913
+ "deviceId": "device-001",
2914
+ "deviceName": "iPhone 15",
2915
+ "pairingRequestId": "pair-001",
2916
+ "type": "pairing_approval_request",
2917
+ }
2918
+ `;
2919
+
2920
+ exports[`IPC message snapshots ServerMessage types approved_devices_list_response serializes to expected JSON 1`] = `
2921
+ {
2922
+ "devices": [
2923
+ {
2924
+ "deviceName": "iPhone 15",
2925
+ "hashedDeviceId": "hashed-device-001",
2926
+ "lastPairedAt": 1700000000000,
2927
+ },
2928
+ ],
2929
+ "type": "approved_devices_list_response",
2930
+ }
2931
+ `;
2932
+
2933
+ exports[`IPC message snapshots ServerMessage types approved_device_remove_response serializes to expected JSON 1`] = `
2934
+ {
2935
+ "success": true,
2936
+ "type": "approved_device_remove_response",
2937
+ }
2938
+ `;