@vellumai/assistant 0.4.17 → 0.4.18

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 (515) hide show
  1. package/eslint.config.mjs +2 -2
  2. package/package.json +1 -1
  3. package/src/__tests__/access-request-decision.test.ts +128 -120
  4. package/src/__tests__/account-registry.test.ts +121 -110
  5. package/src/__tests__/active-skill-tools.test.ts +200 -172
  6. package/src/__tests__/actor-token-service.test.ts +341 -274
  7. package/src/__tests__/agent-loop-thinking.test.ts +28 -19
  8. package/src/__tests__/agent-loop.test.ts +798 -378
  9. package/src/__tests__/anthropic-provider.test.ts +405 -247
  10. package/src/__tests__/app-builder-tool-scripts.test.ts +97 -97
  11. package/src/__tests__/app-bundler.test.ts +112 -79
  12. package/src/__tests__/app-executors.test.ts +205 -178
  13. package/src/__tests__/app-git-history.test.ts +90 -73
  14. package/src/__tests__/app-git-service.test.ts +67 -53
  15. package/src/__tests__/app-open-proxy.test.ts +29 -25
  16. package/src/__tests__/approval-conversation-turn.test.ts +100 -81
  17. package/src/__tests__/approval-hardcoded-copy-guard.test.ts +45 -17
  18. package/src/__tests__/approval-message-composer.test.ts +119 -119
  19. package/src/__tests__/approval-primitive.test.ts +264 -233
  20. package/src/__tests__/approval-routes-http.test.ts +4 -3
  21. package/src/__tests__/asset-materialize-tool.test.ts +250 -178
  22. package/src/__tests__/asset-search-tool.test.ts +251 -191
  23. package/src/__tests__/assistant-attachment-directive.test.ts +187 -142
  24. package/src/__tests__/assistant-attachments.test.ts +254 -186
  25. package/src/__tests__/assistant-event-hub.test.ts +105 -63
  26. package/src/__tests__/assistant-event.test.ts +66 -58
  27. package/src/__tests__/assistant-events-sse-hardening.test.ts +113 -73
  28. package/src/__tests__/assistant-feature-flag-guard.test.ts +78 -52
  29. package/src/__tests__/assistant-feature-flag-guardrails.test.ts +48 -45
  30. package/src/__tests__/assistant-feature-flags-integration.test.ts +118 -77
  31. package/src/__tests__/assistant-id-boundary-guard.test.ts +158 -104
  32. package/src/__tests__/attachments-store.test.ts +240 -183
  33. package/src/__tests__/attachments.test.ts +70 -62
  34. package/src/__tests__/audit-log-rotation.test.ts +50 -35
  35. package/src/__tests__/browser-fill-credential.test.ts +169 -101
  36. package/src/__tests__/browser-manager.test.ts +97 -75
  37. package/src/__tests__/browser-runtime-check.test.ts +16 -15
  38. package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +12 -10
  39. package/src/__tests__/browser-skill-endstate.test.ts +97 -72
  40. package/src/__tests__/bundle-scanner.test.ts +47 -22
  41. package/src/__tests__/bundled-asset.test.ts +74 -47
  42. package/src/__tests__/call-constants.test.ts +19 -19
  43. package/src/__tests__/call-controller.test.ts +0 -1
  44. package/src/__tests__/call-conversation-messages.test.ts +90 -65
  45. package/src/__tests__/call-domain.test.ts +149 -121
  46. package/src/__tests__/call-pointer-message-composer.test.ts +113 -83
  47. package/src/__tests__/call-pointer-messages.test.ts +213 -154
  48. package/src/__tests__/call-pointer-no-hardcoded-copy.guard.test.ts +9 -10
  49. package/src/__tests__/call-recovery.test.ts +232 -212
  50. package/src/__tests__/call-routes-http.test.ts +0 -1
  51. package/src/__tests__/call-start-guardian-guard.test.ts +32 -30
  52. package/src/__tests__/call-state-machine.test.ts +62 -51
  53. package/src/__tests__/call-state.test.ts +89 -75
  54. package/src/__tests__/call-store.test.ts +387 -316
  55. package/src/__tests__/callback-handoff-copy.test.ts +84 -82
  56. package/src/__tests__/canonical-guardian-store.test.ts +331 -280
  57. package/src/__tests__/channel-approval-routes.test.ts +1643 -1115
  58. package/src/__tests__/channel-approval.test.ts +139 -137
  59. package/src/__tests__/channel-approvals.test.ts +0 -1
  60. package/src/__tests__/channel-delivery-store.test.ts +232 -194
  61. package/src/__tests__/channel-guardian.test.ts +5 -3
  62. package/src/__tests__/channel-invite-transport.test.ts +107 -92
  63. package/src/__tests__/channel-policy.test.ts +42 -38
  64. package/src/__tests__/channel-readiness-service.test.ts +119 -102
  65. package/src/__tests__/channel-reply-delivery.test.ts +147 -118
  66. package/src/__tests__/channel-retry-sweep.test.ts +153 -110
  67. package/src/__tests__/checker.test.ts +3309 -1850
  68. package/src/__tests__/clarification-resolver.test.ts +91 -79
  69. package/src/__tests__/classifier.test.ts +64 -54
  70. package/src/__tests__/claude-code-skill-regression.test.ts +42 -37
  71. package/src/__tests__/claude-code-tool-profiles.test.ts +31 -29
  72. package/src/__tests__/clawhub.test.ts +92 -82
  73. package/src/__tests__/cli.test.ts +30 -30
  74. package/src/__tests__/clipboard.test.ts +53 -46
  75. package/src/__tests__/commit-guarantee.test.ts +59 -52
  76. package/src/__tests__/commit-message-enrichment-service.test.ts +203 -75
  77. package/src/__tests__/compaction.benchmark.test.ts +33 -31
  78. package/src/__tests__/computer-use-session-compaction.test.ts +60 -50
  79. package/src/__tests__/computer-use-session-lifecycle.test.ts +145 -117
  80. package/src/__tests__/computer-use-session-working-dir.test.ts +62 -48
  81. package/src/__tests__/computer-use-skill-baseline.test.ts +22 -19
  82. package/src/__tests__/computer-use-skill-endstate.test.ts +45 -31
  83. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +121 -88
  84. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +65 -42
  85. package/src/__tests__/computer-use-skill-proxy-bridge.test.ts +33 -18
  86. package/src/__tests__/computer-use-tools.test.ts +121 -98
  87. package/src/__tests__/config-schema.test.ts +443 -347
  88. package/src/__tests__/config-watcher.test.ts +96 -81
  89. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +148 -133
  90. package/src/__tests__/conflict-intent-tokenization.test.ts +96 -78
  91. package/src/__tests__/conflict-policy.test.ts +151 -80
  92. package/src/__tests__/conflict-store.test.ts +203 -157
  93. package/src/__tests__/connection-policy.test.ts +89 -59
  94. package/src/__tests__/contacts-tools.test.ts +247 -178
  95. package/src/__tests__/context-memory-e2e.test.ts +306 -214
  96. package/src/__tests__/context-token-estimator.test.ts +114 -74
  97. package/src/__tests__/context-window-manager.test.ts +269 -167
  98. package/src/__tests__/contradiction-checker.test.ts +161 -135
  99. package/src/__tests__/conversation-attention-store.test.ts +350 -290
  100. package/src/__tests__/conversation-attention-telegram.test.ts +0 -1
  101. package/src/__tests__/conversation-pairing.test.ts +220 -113
  102. package/src/__tests__/conversation-store.test.ts +390 -235
  103. package/src/__tests__/credential-broker-browser-fill.test.ts +325 -250
  104. package/src/__tests__/credential-broker-server-use.test.ts +283 -243
  105. package/src/__tests__/credential-broker.test.ts +128 -74
  106. package/src/__tests__/credential-host-pattern-match.test.ts +64 -44
  107. package/src/__tests__/credential-metadata-store.test.ts +360 -311
  108. package/src/__tests__/credential-policy-validate.test.ts +81 -65
  109. package/src/__tests__/credential-resolve.test.ts +212 -145
  110. package/src/__tests__/credential-security-e2e.test.ts +144 -103
  111. package/src/__tests__/credential-security-invariants.test.ts +253 -208
  112. package/src/__tests__/credential-selection.test.ts +254 -146
  113. package/src/__tests__/credential-vault-unit.test.ts +531 -341
  114. package/src/__tests__/credential-vault.test.ts +761 -484
  115. package/src/__tests__/daemon-assistant-events.test.ts +91 -66
  116. package/src/__tests__/daemon-lifecycle.test.ts +258 -190
  117. package/src/__tests__/daemon-server-session-init.test.ts +0 -1
  118. package/src/__tests__/date-context.test.ts +314 -249
  119. package/src/__tests__/db-migration-rollback.test.ts +259 -130
  120. package/src/__tests__/db-schedule-syntax-migration.test.ts +78 -41
  121. package/src/__tests__/delete-managed-skill-tool.test.ts +77 -53
  122. package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -1
  123. package/src/__tests__/dictation-mode-detection.test.ts +77 -55
  124. package/src/__tests__/dictation-profile-store.test.ts +70 -56
  125. package/src/__tests__/dictation-text-processing.test.ts +53 -35
  126. package/src/__tests__/diff.test.ts +102 -98
  127. package/src/__tests__/domain-normalize.test.ts +54 -54
  128. package/src/__tests__/domain-policy.test.ts +71 -55
  129. package/src/__tests__/dynamic-page-surface.test.ts +31 -33
  130. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +69 -69
  131. package/src/__tests__/edit-engine.test.ts +56 -56
  132. package/src/__tests__/elevenlabs-client.test.ts +117 -91
  133. package/src/__tests__/elevenlabs-config.test.ts +32 -31
  134. package/src/__tests__/email-classifier.test.ts +15 -12
  135. package/src/__tests__/email-cli.test.ts +121 -108
  136. package/src/__tests__/emit-signal-routing-intent.test.ts +76 -69
  137. package/src/__tests__/encrypted-store.test.ts +180 -154
  138. package/src/__tests__/entity-extractor.test.ts +108 -87
  139. package/src/__tests__/entity-search.test.ts +664 -258
  140. package/src/__tests__/ephemeral-permissions.test.ts +224 -188
  141. package/src/__tests__/event-bus.test.ts +81 -77
  142. package/src/__tests__/extract-email.test.ts +29 -20
  143. package/src/__tests__/file-edit-tool.test.ts +62 -44
  144. package/src/__tests__/file-ops-service.test.ts +131 -114
  145. package/src/__tests__/file-read-tool.test.ts +48 -31
  146. package/src/__tests__/file-write-tool.test.ts +43 -37
  147. package/src/__tests__/filesystem-tools.test.ts +238 -209
  148. package/src/__tests__/followup-tools.test.ts +237 -162
  149. package/src/__tests__/forbidden-legacy-symbols.test.ts +19 -20
  150. package/src/__tests__/frontmatter.test.ts +96 -81
  151. package/src/__tests__/fuzzy-match-property.test.ts +75 -81
  152. package/src/__tests__/fuzzy-match.test.ts +71 -65
  153. package/src/__tests__/gateway-client-managed-outbound.test.ts +76 -57
  154. package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
  155. package/src/__tests__/gateway-only-guard.test.ts +0 -1
  156. package/src/__tests__/gemini-image-service.test.ts +113 -100
  157. package/src/__tests__/gemini-provider.test.ts +297 -220
  158. package/src/__tests__/get-weather.test.ts +188 -114
  159. package/src/__tests__/gmail-integration.test.ts +0 -1
  160. package/src/__tests__/guardian-action-conversation-turn.test.ts +226 -171
  161. package/src/__tests__/guardian-action-copy-generator.test.ts +111 -93
  162. package/src/__tests__/guardian-action-followup-executor.test.ts +0 -1
  163. package/src/__tests__/guardian-action-followup-store.test.ts +199 -167
  164. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +297 -250
  165. package/src/__tests__/guardian-action-late-reply.test.ts +462 -316
  166. package/src/__tests__/guardian-action-no-hardcoded-copy.test.ts +23 -18
  167. package/src/__tests__/guardian-action-store.test.ts +158 -109
  168. package/src/__tests__/guardian-action-sweep.test.ts +114 -100
  169. package/src/__tests__/guardian-actions-endpoint.test.ts +440 -256
  170. package/src/__tests__/guardian-control-plane-policy.test.ts +497 -331
  171. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +217 -215
  172. package/src/__tests__/guardian-dispatch.test.ts +316 -256
  173. package/src/__tests__/guardian-grant-minting.test.ts +247 -178
  174. package/src/__tests__/guardian-outbound-http.test.ts +5 -3
  175. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +99 -96
  176. package/src/__tests__/guardian-question-copy.test.ts +17 -17
  177. package/src/__tests__/guardian-question-mode.test.ts +134 -100
  178. package/src/__tests__/guardian-routing-invariants.test.ts +0 -1
  179. package/src/__tests__/guardian-routing-state.test.ts +0 -1
  180. package/src/__tests__/guardian-verification-intent-routing.test.ts +94 -88
  181. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
  182. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +0 -1
  183. package/src/__tests__/handle-user-message-secret-resume.test.ts +0 -1
  184. package/src/__tests__/handlers-add-trust-rule-metadata.test.ts +92 -76
  185. package/src/__tests__/handlers-cu-observation-blob.test.ts +103 -70
  186. package/src/__tests__/handlers-ipc-blob-probe.test.ts +77 -51
  187. package/src/__tests__/handlers-slack-config.test.ts +63 -54
  188. package/src/__tests__/handlers-task-submit-slash.test.ts +18 -18
  189. package/src/__tests__/handlers-telegram-config.test.ts +662 -329
  190. package/src/__tests__/handlers-twitter-config.test.ts +525 -298
  191. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +3 -2
  192. package/src/__tests__/headless-browser-interactions.test.ts +444 -280
  193. package/src/__tests__/headless-browser-navigate.test.ts +116 -79
  194. package/src/__tests__/headless-browser-read-tools.test.ts +123 -86
  195. package/src/__tests__/headless-browser-snapshot.test.ts +71 -56
  196. package/src/__tests__/heartbeat-service.test.ts +76 -58
  197. package/src/__tests__/history-repair-observability.test.ts +14 -14
  198. package/src/__tests__/history-repair.test.ts +171 -167
  199. package/src/__tests__/home-base-bootstrap.test.ts +30 -27
  200. package/src/__tests__/hooks-blocking.test.ts +86 -37
  201. package/src/__tests__/hooks-cli.test.ts +104 -68
  202. package/src/__tests__/hooks-config.test.ts +81 -43
  203. package/src/__tests__/hooks-discovery.test.ts +106 -96
  204. package/src/__tests__/hooks-integration.test.ts +78 -72
  205. package/src/__tests__/hooks-manager.test.ts +99 -61
  206. package/src/__tests__/hooks-runner.test.ts +94 -71
  207. package/src/__tests__/hooks-settings.test.ts +69 -64
  208. package/src/__tests__/hooks-templates.test.ts +85 -54
  209. package/src/__tests__/hooks-ts-runner.test.ts +82 -45
  210. package/src/__tests__/hooks-watch.test.ts +32 -22
  211. package/src/__tests__/host-file-edit-tool.test.ts +190 -148
  212. package/src/__tests__/host-file-read-tool.test.ts +86 -63
  213. package/src/__tests__/host-file-write-tool.test.ts +98 -64
  214. package/src/__tests__/host-shell-tool.test.ts +342 -233
  215. package/src/__tests__/inbound-invite-redemption.test.ts +0 -1
  216. package/src/__tests__/ingress-member-store.test.ts +163 -159
  217. package/src/__tests__/ingress-reconcile.test.ts +0 -1
  218. package/src/__tests__/ingress-routes-http.test.ts +441 -356
  219. package/src/__tests__/ingress-url-consistency.test.ts +125 -64
  220. package/src/__tests__/integration-status.test.ts +93 -73
  221. package/src/__tests__/intent-routing.test.ts +148 -118
  222. package/src/__tests__/invite-redemption-service.test.ts +163 -121
  223. package/src/__tests__/ipc-blob-store.test.ts +104 -91
  224. package/src/__tests__/ipc-contract-inventory.test.ts +27 -15
  225. package/src/__tests__/ipc-contract.test.ts +24 -23
  226. package/src/__tests__/ipc-protocol.test.ts +52 -46
  227. package/src/__tests__/ipc-roundtrip.benchmark.test.ts +61 -50
  228. package/src/__tests__/ipc-snapshot.test.ts +1135 -1056
  229. package/src/__tests__/ipc-validate.test.ts +240 -179
  230. package/src/__tests__/key-migration.test.ts +123 -90
  231. package/src/__tests__/keychain.test.ts +150 -123
  232. package/src/__tests__/lifecycle-docs-guard.test.ts +65 -64
  233. package/src/__tests__/llm-usage-store.test.ts +112 -87
  234. package/src/__tests__/managed-skill-lifecycle.test.ts +147 -108
  235. package/src/__tests__/managed-store.test.ts +411 -360
  236. package/src/__tests__/mcp-cli.test.ts +189 -123
  237. package/src/__tests__/mcp-health-check.test.ts +26 -21
  238. package/src/__tests__/media-generate-image.test.ts +122 -99
  239. package/src/__tests__/media-reuse-story.e2e.test.ts +282 -214
  240. package/src/__tests__/media-visibility-policy.test.ts +86 -38
  241. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +146 -100
  242. package/src/__tests__/memory-lifecycle-e2e.test.ts +385 -297
  243. package/src/__tests__/memory-query-builder.test.ts +32 -33
  244. package/src/__tests__/memory-recall-quality.test.ts +761 -407
  245. package/src/__tests__/memory-regressions.experimental.test.ts +443 -380
  246. package/src/__tests__/memory-regressions.test.ts +3725 -2642
  247. package/src/__tests__/memory-retrieval-budget.test.ts +7 -8
  248. package/src/__tests__/memory-retrieval.benchmark.test.ts +144 -109
  249. package/src/__tests__/memory-upsert-concurrency.test.ts +292 -201
  250. package/src/__tests__/messaging-send-tool.test.ts +36 -29
  251. package/src/__tests__/migration-cli-flows.test.ts +69 -53
  252. package/src/__tests__/migration-ordering.test.ts +103 -86
  253. package/src/__tests__/mime-builder.test.ts +55 -32
  254. package/src/__tests__/mock-signup-server.test.ts +384 -246
  255. package/src/__tests__/model-intents.test.ts +61 -37
  256. package/src/__tests__/no-direct-anthropic-sdk-imports.test.ts +9 -12
  257. package/src/__tests__/no-is-trusted-guard.test.ts +24 -21
  258. package/src/__tests__/non-member-access-request.test.ts +3 -2
  259. package/src/__tests__/notification-broadcaster.test.ts +99 -81
  260. package/src/__tests__/notification-decision-fallback.test.ts +223 -178
  261. package/src/__tests__/notification-decision-strategy.test.ts +375 -337
  262. package/src/__tests__/notification-deep-link.test.ts +67 -61
  263. package/src/__tests__/notification-guardian-path.test.ts +248 -206
  264. package/src/__tests__/notification-routing-intent.test.ts +166 -93
  265. package/src/__tests__/notification-thread-candidate-validation.test.ts +78 -75
  266. package/src/__tests__/notification-thread-candidates.test.ts +64 -61
  267. package/src/__tests__/oauth-callback-registry.test.ts +40 -30
  268. package/src/__tests__/oauth-connect-handler.test.ts +109 -89
  269. package/src/__tests__/oauth-scope-policy.test.ts +63 -55
  270. package/src/__tests__/oauth2-gateway-transport.test.ts +252 -174
  271. package/src/__tests__/onboarding-starter-tasks.test.ts +93 -89
  272. package/src/__tests__/onboarding-template-contract.test.ts +93 -94
  273. package/src/__tests__/openai-provider.test.ts +366 -274
  274. package/src/__tests__/pairing-concurrent.test.ts +18 -12
  275. package/src/__tests__/pairing-routes.test.ts +45 -41
  276. package/src/__tests__/parallel-tool.benchmark.test.ts +108 -58
  277. package/src/__tests__/parser.test.ts +316 -226
  278. package/src/__tests__/path-classifier.test.ts +24 -25
  279. package/src/__tests__/path-policy.test.ts +187 -147
  280. package/src/__tests__/phone.test.ts +36 -36
  281. package/src/__tests__/platform-move-helper.test.ts +48 -40
  282. package/src/__tests__/platform-socket-path.test.ts +23 -24
  283. package/src/__tests__/platform-workspace-migration.test.ts +464 -414
  284. package/src/__tests__/platform.test.ts +61 -53
  285. package/src/__tests__/playbook-execution.test.ts +397 -265
  286. package/src/__tests__/playbook-tools.test.ts +267 -196
  287. package/src/__tests__/prebuilt-home-base-seed.test.ts +30 -27
  288. package/src/__tests__/pricing.test.ts +316 -136
  289. package/src/__tests__/profile-compiler.test.ts +206 -188
  290. package/src/__tests__/provider-commit-message-generator.test.ts +114 -106
  291. package/src/__tests__/provider-error-scenarios.test.ts +212 -158
  292. package/src/__tests__/provider-fail-open-selection.test.ts +51 -44
  293. package/src/__tests__/provider-registry-ollama.test.ts +13 -9
  294. package/src/__tests__/provider-streaming.benchmark.test.ts +232 -183
  295. package/src/__tests__/proxy-approval-callback.test.ts +180 -119
  296. package/src/__tests__/public-ingress-urls.test.ts +112 -94
  297. package/src/__tests__/qdrant-manager.test.ts +147 -98
  298. package/src/__tests__/ratelimit.test.ts +152 -82
  299. package/src/__tests__/recording-handler.test.ts +273 -151
  300. package/src/__tests__/recording-intent-fallback.test.ts +94 -75
  301. package/src/__tests__/recording-intent-handler.test.ts +0 -1
  302. package/src/__tests__/recording-intent.test.ts +578 -379
  303. package/src/__tests__/recording-state-machine.test.ts +530 -316
  304. package/src/__tests__/recurrence-engine-rruleset.test.ts +150 -92
  305. package/src/__tests__/recurrence-engine.test.ts +81 -41
  306. package/src/__tests__/recurrence-types.test.ts +63 -44
  307. package/src/__tests__/relay-server.test.ts +2131 -1602
  308. package/src/__tests__/reminder-store.test.ts +158 -80
  309. package/src/__tests__/reminder.test.ts +113 -109
  310. package/src/__tests__/remote-skill-policy.test.ts +96 -72
  311. package/src/__tests__/request-file-tool.test.ts +74 -67
  312. package/src/__tests__/response-tier.test.ts +131 -74
  313. package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
  314. package/src/__tests__/runtime-events-sse-parity.test.ts +167 -145
  315. package/src/__tests__/runtime-events-sse.test.ts +0 -1
  316. package/src/__tests__/sandbox-diagnostics.test.ts +66 -56
  317. package/src/__tests__/sandbox-host-parity.test.ts +377 -301
  318. package/src/__tests__/scaffold-managed-skill-tool.test.ts +213 -161
  319. package/src/__tests__/schedule-store.test.ts +268 -205
  320. package/src/__tests__/schedule-tools.test.ts +702 -524
  321. package/src/__tests__/scheduler-recurrence.test.ts +240 -130
  322. package/src/__tests__/scoped-approval-grants.test.ts +258 -168
  323. package/src/__tests__/scoped-grant-security-matrix.test.ts +160 -146
  324. package/src/__tests__/script-proxy-certs.test.ts +38 -35
  325. package/src/__tests__/script-proxy-connect-tunnel.test.ts +71 -46
  326. package/src/__tests__/script-proxy-decision-trace.test.ts +161 -84
  327. package/src/__tests__/script-proxy-http-forwarder.test.ts +146 -129
  328. package/src/__tests__/script-proxy-injection-runtime.test.ts +139 -113
  329. package/src/__tests__/script-proxy-mitm-handler.test.ts +226 -142
  330. package/src/__tests__/script-proxy-policy-runtime.test.ts +126 -86
  331. package/src/__tests__/script-proxy-policy.test.ts +308 -153
  332. package/src/__tests__/script-proxy-rewrite-specificity.test.ts +74 -62
  333. package/src/__tests__/script-proxy-router.test.ts +111 -77
  334. package/src/__tests__/script-proxy-session-manager.test.ts +156 -113
  335. package/src/__tests__/script-proxy-session-runtime.test.ts +28 -24
  336. package/src/__tests__/secret-allowlist.test.ts +105 -90
  337. package/src/__tests__/secret-ingress-handler.test.ts +41 -30
  338. package/src/__tests__/secret-onetime-send.test.ts +67 -50
  339. package/src/__tests__/secret-prompt-log-hygiene.test.ts +35 -31
  340. package/src/__tests__/secret-response-routing.test.ts +50 -41
  341. package/src/__tests__/secret-scanner-executor.test.ts +152 -111
  342. package/src/__tests__/secret-scanner.test.ts +495 -413
  343. package/src/__tests__/secure-keys.test.ts +132 -121
  344. package/src/__tests__/send-endpoint-busy.test.ts +0 -1
  345. package/src/__tests__/send-notification-tool.test.ts +43 -42
  346. package/src/__tests__/sensitive-output-placeholders.test.ts +72 -64
  347. package/src/__tests__/sequence-store.test.ts +335 -167
  348. package/src/__tests__/server-history-render.test.ts +341 -202
  349. package/src/__tests__/session-abort-tool-results.test.ts +133 -70
  350. package/src/__tests__/session-confirmation-signals.test.ts +252 -160
  351. package/src/__tests__/session-conflict-gate.test.ts +775 -585
  352. package/src/__tests__/session-error.test.ts +222 -191
  353. package/src/__tests__/session-evictor.test.ts +79 -62
  354. package/src/__tests__/session-init.benchmark.test.ts +170 -108
  355. package/src/__tests__/session-load-history-repair.test.ts +273 -139
  356. package/src/__tests__/session-messaging-secret-redirect.test.ts +130 -90
  357. package/src/__tests__/session-pre-run-repair.test.ts +106 -59
  358. package/src/__tests__/session-profile-injection.test.ts +198 -130
  359. package/src/__tests__/session-provider-retry-repair.test.ts +223 -141
  360. package/src/__tests__/session-queue.test.ts +624 -321
  361. package/src/__tests__/session-runtime-assembly.test.ts +425 -329
  362. package/src/__tests__/session-runtime-workspace.test.ts +69 -61
  363. package/src/__tests__/session-skill-tools.test.ts +973 -678
  364. package/src/__tests__/session-slash-known.test.ts +185 -133
  365. package/src/__tests__/session-slash-queue.test.ts +147 -81
  366. package/src/__tests__/session-slash-unknown.test.ts +135 -90
  367. package/src/__tests__/session-surfaces-task-progress.test.ts +122 -87
  368. package/src/__tests__/session-tool-setup-app-refresh.test.ts +338 -177
  369. package/src/__tests__/session-tool-setup-memory-scope.test.ts +63 -40
  370. package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +60 -37
  371. package/src/__tests__/session-tool-setup-tools-disabled.test.ts +28 -26
  372. package/src/__tests__/session-undo.test.ts +43 -30
  373. package/src/__tests__/session-workspace-cache-state.test.ts +108 -67
  374. package/src/__tests__/session-workspace-injection.test.ts +245 -117
  375. package/src/__tests__/session-workspace-tool-tracking.test.ts +260 -93
  376. package/src/__tests__/shared-filesystem-errors.test.ts +47 -47
  377. package/src/__tests__/shell-credential-ref.test.ts +126 -90
  378. package/src/__tests__/shell-identity.test.ts +134 -111
  379. package/src/__tests__/shell-parser-fuzz.test.ts +263 -179
  380. package/src/__tests__/shell-parser-property.test.ts +435 -288
  381. package/src/__tests__/shell-tool-proxy-mode.test.ts +142 -70
  382. package/src/__tests__/size-guard.test.ts +42 -44
  383. package/src/__tests__/skill-feature-flags-integration.test.ts +79 -52
  384. package/src/__tests__/skill-feature-flags.test.ts +75 -47
  385. package/src/__tests__/skill-include-graph.test.ts +143 -148
  386. package/src/__tests__/skill-load-feature-flag.test.ts +94 -59
  387. package/src/__tests__/skill-load-tool.test.ts +371 -199
  388. package/src/__tests__/skill-projection-feature-flag.test.ts +131 -88
  389. package/src/__tests__/skill-projection.benchmark.test.ts +93 -65
  390. package/src/__tests__/skill-script-runner-host.test.ts +460 -250
  391. package/src/__tests__/skill-script-runner-sandbox.test.ts +168 -108
  392. package/src/__tests__/skill-script-runner.test.ts +115 -74
  393. package/src/__tests__/skill-tool-factory.test.ts +140 -96
  394. package/src/__tests__/skill-tool-manifest.test.ts +306 -210
  395. package/src/__tests__/skill-version-hash.test.ts +70 -56
  396. package/src/__tests__/skills.test.ts +0 -1
  397. package/src/__tests__/slack-channel-config.test.ts +127 -84
  398. package/src/__tests__/slack-skill.test.ts +60 -47
  399. package/src/__tests__/slash-commands-catalog.test.ts +37 -31
  400. package/src/__tests__/slash-commands-parser.test.ts +71 -64
  401. package/src/__tests__/slash-commands-resolver.test.ts +143 -107
  402. package/src/__tests__/slash-commands-rewrite.test.ts +22 -22
  403. package/src/__tests__/speaker-identification.test.ts +28 -25
  404. package/src/__tests__/starter-bundle.test.ts +27 -23
  405. package/src/__tests__/starter-task-flow.test.ts +67 -52
  406. package/src/__tests__/subagent-manager-notify.test.ts +154 -108
  407. package/src/__tests__/subagent-tools.test.ts +311 -270
  408. package/src/__tests__/subagent-types.test.ts +40 -40
  409. package/src/__tests__/surface-mutex-cleanup.test.ts +42 -30
  410. package/src/__tests__/swarm-dag-pathological.test.ts +122 -111
  411. package/src/__tests__/swarm-orchestrator.test.ts +135 -101
  412. package/src/__tests__/swarm-plan-validator.test.ts +125 -73
  413. package/src/__tests__/swarm-recursion.test.ts +58 -46
  414. package/src/__tests__/swarm-router-planner.test.ts +99 -74
  415. package/src/__tests__/swarm-session-integration.test.ts +148 -91
  416. package/src/__tests__/swarm-tool.test.ts +65 -45
  417. package/src/__tests__/swarm-worker-backend.test.ts +59 -45
  418. package/src/__tests__/swarm-worker-runner.test.ts +133 -118
  419. package/src/__tests__/system-prompt.test.ts +290 -256
  420. package/src/__tests__/task-compiler.test.ts +176 -120
  421. package/src/__tests__/task-management-tools.test.ts +561 -456
  422. package/src/__tests__/task-memory-cleanup.test.ts +627 -362
  423. package/src/__tests__/task-runner.test.ts +117 -94
  424. package/src/__tests__/task-scheduler.test.ts +113 -84
  425. package/src/__tests__/task-tools.test.ts +349 -264
  426. package/src/__tests__/terminal-sandbox.test.ts +138 -108
  427. package/src/__tests__/terminal-tools.test.ts +350 -305
  428. package/src/__tests__/thread-seed-composer.test.ts +307 -180
  429. package/src/__tests__/tool-approval-handler.test.ts +238 -137
  430. package/src/__tests__/tool-audit-listener.test.ts +69 -69
  431. package/src/__tests__/tool-domain-event-publisher.test.ts +142 -132
  432. package/src/__tests__/tool-execution-abort-cleanup.test.ts +153 -146
  433. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +136 -105
  434. package/src/__tests__/tool-executor-lifecycle-events.test.ts +355 -239
  435. package/src/__tests__/tool-executor-redaction.test.ts +112 -109
  436. package/src/__tests__/tool-executor-shell-integration.test.ts +130 -79
  437. package/src/__tests__/tool-executor.test.ts +1274 -674
  438. package/src/__tests__/tool-grant-request-escalation.test.ts +401 -283
  439. package/src/__tests__/tool-metrics-listener.test.ts +97 -85
  440. package/src/__tests__/tool-notification-listener.test.ts +42 -25
  441. package/src/__tests__/tool-permission-simulate-handler.test.ts +137 -113
  442. package/src/__tests__/tool-policy.test.ts +44 -25
  443. package/src/__tests__/tool-profiling-listener.test.ts +99 -93
  444. package/src/__tests__/tool-result-truncation.test.ts +5 -4
  445. package/src/__tests__/tool-trace-listener.test.ts +131 -111
  446. package/src/__tests__/top-level-renderer.test.ts +62 -58
  447. package/src/__tests__/top-level-scanner.test.ts +68 -64
  448. package/src/__tests__/trace-emitter.test.ts +56 -56
  449. package/src/__tests__/trust-context-guards.test.ts +65 -65
  450. package/src/__tests__/trust-store.test.ts +1239 -806
  451. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  452. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
  453. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +3 -2
  454. package/src/__tests__/trusted-contact-multichannel.test.ts +3 -2
  455. package/src/__tests__/trusted-contact-verification.test.ts +251 -231
  456. package/src/__tests__/turn-commit.test.ts +259 -200
  457. package/src/__tests__/twilio-provider.test.ts +140 -126
  458. package/src/__tests__/twilio-rest.test.ts +22 -18
  459. package/src/__tests__/twilio-routes-elevenlabs.test.ts +0 -1
  460. package/src/__tests__/twilio-routes-twiml.test.ts +55 -55
  461. package/src/__tests__/twilio-routes.test.ts +0 -1
  462. package/src/__tests__/twitter-auth-handler.test.ts +184 -139
  463. package/src/__tests__/twitter-cli-error-shaping.test.ts +88 -73
  464. package/src/__tests__/twitter-cli-routing.test.ts +146 -99
  465. package/src/__tests__/twitter-oauth-client.test.ts +82 -65
  466. package/src/__tests__/update-bulletin-format.test.ts +69 -66
  467. package/src/__tests__/update-bulletin-state.test.ts +66 -60
  468. package/src/__tests__/update-bulletin.test.ts +150 -114
  469. package/src/__tests__/update-template-contract.test.ts +15 -10
  470. package/src/__tests__/url-safety.test.ts +288 -265
  471. package/src/__tests__/user-reference.test.ts +32 -32
  472. package/src/__tests__/view-image-tool.test.ts +118 -96
  473. package/src/__tests__/voice-invite-redemption.test.ts +111 -106
  474. package/src/__tests__/voice-quality.test.ts +117 -102
  475. package/src/__tests__/voice-scoped-grant-consumer.test.ts +204 -146
  476. package/src/__tests__/voice-session-bridge.test.ts +351 -216
  477. package/src/__tests__/weather-skill-regression.test.ts +170 -120
  478. package/src/__tests__/web-fetch.test.ts +664 -526
  479. package/src/__tests__/web-search.test.ts +379 -213
  480. package/src/__tests__/work-item-output.test.ts +90 -53
  481. package/src/__tests__/workspace-git-service.test.ts +437 -356
  482. package/src/__tests__/workspace-heartbeat-service.test.ts +125 -91
  483. package/src/__tests__/workspace-lifecycle.test.ts +98 -64
  484. package/src/__tests__/workspace-policy.test.ts +139 -71
  485. package/src/commands/__tests__/cc-command-registry.test.ts +142 -134
  486. package/src/config/__tests__/feature-flag-registry-guard.test.ts +48 -39
  487. package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +25 -10
  488. package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +0 -1
  489. package/src/config/bundled-skills/messaging/SKILL.md +4 -3
  490. package/src/config/bundled-skills/messaging/tools/gmail-outreach-scan.ts +15 -5
  491. package/src/config/bundled-skills/messaging/tools/gmail-sender-digest.ts +16 -5
  492. package/src/config/bundled-skills/slack/tools/slack-scan-digest.ts +34 -32
  493. package/src/config/bundled-tool-registry.ts +2 -0
  494. package/src/config/env.ts +3 -4
  495. package/src/memory/db-connection.ts +16 -10
  496. package/src/messaging/providers/gmail/adapter.ts +10 -3
  497. package/src/messaging/providers/gmail/client.ts +280 -72
  498. package/src/runtime/auth/__tests__/context.test.ts +75 -65
  499. package/src/runtime/auth/__tests__/credential-service.test.ts +137 -114
  500. package/src/runtime/auth/__tests__/guard-tests.test.ts +84 -90
  501. package/src/runtime/auth/__tests__/ipc-auth-context.test.ts +40 -40
  502. package/src/runtime/auth/__tests__/middleware.test.ts +80 -74
  503. package/src/runtime/auth/__tests__/policy.test.ts +9 -9
  504. package/src/runtime/auth/__tests__/route-policy.test.ts +76 -65
  505. package/src/runtime/auth/__tests__/scopes.test.ts +68 -60
  506. package/src/runtime/auth/__tests__/subject.test.ts +54 -54
  507. package/src/runtime/auth/__tests__/token-service.test.ts +115 -108
  508. package/src/runtime/auth/scopes.ts +3 -0
  509. package/src/runtime/auth/token-service.ts +4 -1
  510. package/src/runtime/auth/types.ts +2 -1
  511. package/src/runtime/http-server.ts +2 -1
  512. package/src/security/secure-keys.ts +103 -53
  513. package/src/tools/browser/__tests__/auth-cache.test.ts +69 -63
  514. package/src/tools/browser/__tests__/auth-detector.test.ts +218 -157
  515. package/src/tools/browser/__tests__/jit-auth.test.ts +83 -99
@@ -8,29 +8,28 @@
8
8
  * 4. Missing guardian binding causes a skip
9
9
  */
10
10
 
11
- import { mkdtempSync, rmSync } from 'node:fs';
12
- import { tmpdir } from 'node:os';
13
- import { join } from 'node:path';
11
+ import { mkdtempSync, rmSync } from "node:fs";
12
+ import { tmpdir } from "node:os";
13
+ import { join } from "node:path";
14
+ import { afterAll, beforeEach, describe, expect, mock, test } from "bun:test";
14
15
 
15
- import { afterAll, beforeEach, describe, expect, mock, test } from 'bun:test';
16
+ const testDir = mkdtempSync(join(tmpdir(), "confirmation-bridge-test-"));
16
17
 
17
- const testDir = mkdtempSync(join(tmpdir(), 'confirmation-bridge-test-'));
18
-
19
- mock.module('../util/platform.js', () => ({
18
+ mock.module("../util/platform.js", () => ({
20
19
  getDataDir: () => testDir,
21
- isMacOS: () => process.platform === 'darwin',
22
- isLinux: () => process.platform === 'linux',
23
- isWindows: () => process.platform === 'win32',
24
- getSocketPath: () => join(testDir, 'test.sock'),
25
- getPidPath: () => join(testDir, 'test.pid'),
26
- getDbPath: () => join(testDir, 'test.db'),
27
- getLogPath: () => join(testDir, 'test.log'),
20
+ isMacOS: () => process.platform === "darwin",
21
+ isLinux: () => process.platform === "linux",
22
+ isWindows: () => process.platform === "win32",
23
+ getSocketPath: () => join(testDir, "test.sock"),
24
+ getPidPath: () => join(testDir, "test.pid"),
25
+ getDbPath: () => join(testDir, "test.db"),
26
+ getLogPath: () => join(testDir, "test.log"),
28
27
  ensureDataDir: () => {},
29
28
  migrateToDataLayout: () => {},
30
29
  migrateToWorkspaceLayout: () => {},
31
30
  }));
32
31
 
33
- mock.module('../util/logger.js', () => ({
32
+ mock.module("../util/logger.js", () => ({
34
33
  getLogger: () =>
35
34
  new Proxy({} as Record<string, unknown>, {
36
35
  get: () => () => {},
@@ -41,21 +40,33 @@ mock.module('../util/logger.js', () => ({
41
40
 
42
41
  // Mock notification emission — capture calls without running the full pipeline
43
42
  const emittedSignals: Array<Record<string, unknown>> = [];
44
- const mockOnThreadCreatedCallbacks: Array<(info: { conversationId: string; title: string; sourceEventName: string }) => void> = [];
45
- mock.module('../notifications/emit-signal.js', () => ({
43
+ const mockOnThreadCreatedCallbacks: Array<
44
+ (info: {
45
+ conversationId: string;
46
+ title: string;
47
+ sourceEventName: string;
48
+ }) => void
49
+ > = [];
50
+ mock.module("../notifications/emit-signal.js", () => ({
46
51
  emitNotificationSignal: async (params: Record<string, unknown>) => {
47
52
  emittedSignals.push(params);
48
53
  // Capture onThreadCreated callback so tests can invoke it
49
- if (typeof params.onThreadCreated === 'function') {
50
- mockOnThreadCreatedCallbacks.push(params.onThreadCreated as (info: { conversationId: string; title: string; sourceEventName: string }) => void);
54
+ if (typeof params.onThreadCreated === "function") {
55
+ mockOnThreadCreatedCallbacks.push(
56
+ params.onThreadCreated as (info: {
57
+ conversationId: string;
58
+ title: string;
59
+ sourceEventName: string;
60
+ }) => void,
61
+ );
51
62
  }
52
63
  return {
53
- signalId: 'test-signal',
64
+ signalId: "test-signal",
54
65
  deduplicated: false,
55
66
  dispatched: true,
56
- reason: 'ok',
67
+ reason: "ok",
57
68
  deliveryResults: [
58
- { channel: 'telegram', destination: 'guardian-chat-1', success: true },
69
+ { channel: "telegram", destination: "guardian-chat-1", success: true },
59
70
  ],
60
71
  };
61
72
  },
@@ -63,37 +74,37 @@ mock.module('../notifications/emit-signal.js', () => ({
63
74
  }));
64
75
 
65
76
  // Mock channel guardian service — provide a guardian binding for 'self' + 'telegram'
66
- mock.module('../runtime/channel-guardian-service.js', () => ({
77
+ mock.module("../runtime/channel-guardian-service.js", () => ({
67
78
  getGuardianBinding: (assistantId: string, channel: string) => {
68
- if (assistantId === 'self' && channel === 'telegram') {
79
+ if (assistantId === "self" && channel === "telegram") {
69
80
  return {
70
- id: 'binding-1',
71
- assistantId: 'self',
72
- channel: 'telegram',
73
- guardianExternalUserId: 'guardian-1',
74
- guardianDeliveryChatId: 'guardian-chat-1',
75
- status: 'active',
81
+ id: "binding-1",
82
+ assistantId: "self",
83
+ channel: "telegram",
84
+ guardianExternalUserId: "guardian-1",
85
+ guardianDeliveryChatId: "guardian-chat-1",
86
+ status: "active",
76
87
  };
77
88
  }
78
89
  return null;
79
90
  },
80
91
  }));
81
92
 
82
- import type { GuardianRuntimeContext } from '../daemon/session-runtime-assembly.js';
93
+ import type { GuardianRuntimeContext } from "../daemon/session-runtime-assembly.js";
83
94
  import {
84
95
  createCanonicalGuardianRequest,
85
96
  generateCanonicalRequestCode,
86
97
  listCanonicalGuardianDeliveries,
87
- } from '../memory/canonical-guardian-store.js';
88
- import { getDb, initializeDb, resetDb } from '../memory/db.js';
89
- import { bridgeConfirmationRequestToGuardian } from '../runtime/confirmation-request-guardian-bridge.js';
98
+ } from "../memory/canonical-guardian-store.js";
99
+ import { getDb, initializeDb, resetDb } from "../memory/db.js";
100
+ import { bridgeConfirmationRequestToGuardian } from "../runtime/confirmation-request-guardian-bridge.js";
90
101
 
91
102
  initializeDb();
92
103
 
93
104
  function resetTables(): void {
94
105
  const db = getDb();
95
- db.run('DELETE FROM canonical_guardian_deliveries');
96
- db.run('DELETE FROM canonical_guardian_requests');
106
+ db.run("DELETE FROM canonical_guardian_deliveries");
107
+ db.run("DELETE FROM canonical_guardian_requests");
97
108
  }
98
109
 
99
110
  afterAll(() => {
@@ -112,30 +123,32 @@ afterAll(() => {
112
123
  function makeCanonicalRequest(overrides: Record<string, unknown> = {}) {
113
124
  return createCanonicalGuardianRequest({
114
125
  id: `req-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,
115
- kind: 'tool_approval',
116
- sourceType: 'channel',
117
- sourceChannel: 'telegram',
118
- conversationId: 'conv-1',
119
- requesterExternalUserId: 'requester-1',
120
- guardianExternalUserId: 'guardian-1',
121
- guardianPrincipalId: 'test-principal-id',
122
- toolName: 'bash',
123
- status: 'pending',
126
+ kind: "tool_approval",
127
+ sourceType: "channel",
128
+ sourceChannel: "telegram",
129
+ conversationId: "conv-1",
130
+ requesterExternalUserId: "requester-1",
131
+ guardianExternalUserId: "guardian-1",
132
+ guardianPrincipalId: "test-principal-id",
133
+ toolName: "bash",
134
+ status: "pending",
124
135
  requestCode: generateCanonicalRequestCode(),
125
136
  expiresAt: new Date(Date.now() + 5 * 60 * 1000).toISOString(),
126
137
  ...overrides,
127
138
  });
128
139
  }
129
140
 
130
- function makeTrustedContactContext(overrides: Partial<GuardianRuntimeContext> = {}): GuardianRuntimeContext {
141
+ function makeTrustedContactContext(
142
+ overrides: Partial<GuardianRuntimeContext> = {},
143
+ ): GuardianRuntimeContext {
131
144
  return {
132
- sourceChannel: 'telegram',
133
- trustClass: 'trusted_contact',
134
- guardianExternalUserId: 'guardian-1',
135
- guardianChatId: 'guardian-chat-1',
136
- requesterExternalUserId: 'requester-1',
137
- requesterChatId: 'requester-chat-1',
138
- requesterIdentifier: '@requester',
145
+ sourceChannel: "telegram",
146
+ trustClass: "trusted_contact",
147
+ guardianExternalUserId: "guardian-1",
148
+ guardianChatId: "guardian-chat-1",
149
+ requesterExternalUserId: "requester-1",
150
+ requesterChatId: "requester-chat-1",
151
+ requesterIdentifier: "@requester",
139
152
  ...overrides,
140
153
  };
141
154
  }
@@ -144,82 +157,82 @@ function makeTrustedContactContext(overrides: Partial<GuardianRuntimeContext> =
144
157
  // TESTS
145
158
  // ===========================================================================
146
159
 
147
- describe('bridgeConfirmationRequestToGuardian', () => {
160
+ describe("bridgeConfirmationRequestToGuardian", () => {
148
161
  beforeEach(() => {
149
162
  resetTables();
150
163
  emittedSignals.length = 0;
151
164
  mockOnThreadCreatedCallbacks.length = 0;
152
165
  });
153
166
 
154
- test('emits guardian.question for trusted-contact sessions', () => {
167
+ test("emits guardian.question for trusted-contact sessions", () => {
155
168
  const canonicalRequest = makeCanonicalRequest();
156
169
  const guardianContext = makeTrustedContactContext();
157
170
 
158
171
  const result = bridgeConfirmationRequestToGuardian({
159
172
  canonicalRequest,
160
173
  guardianContext,
161
- conversationId: 'conv-1',
162
- toolName: 'bash',
174
+ conversationId: "conv-1",
175
+ toolName: "bash",
163
176
  });
164
177
 
165
- expect('bridged' in result && result.bridged).toBe(true);
178
+ expect("bridged" in result && result.bridged).toBe(true);
166
179
  expect(emittedSignals).toHaveLength(1);
167
- expect(emittedSignals[0].sourceEventName).toBe('guardian.question');
168
- expect(emittedSignals[0].sourceChannel).toBe('telegram');
169
- expect(emittedSignals[0].sourceSessionId).toBe('conv-1');
180
+ expect(emittedSignals[0].sourceEventName).toBe("guardian.question");
181
+ expect(emittedSignals[0].sourceChannel).toBe("telegram");
182
+ expect(emittedSignals[0].sourceSessionId).toBe("conv-1");
170
183
 
171
184
  const payload = emittedSignals[0].contextPayload as Record<string, unknown>;
172
185
  expect(payload.requestId).toBe(canonicalRequest.id);
173
186
  expect(payload.requestCode).toBe(canonicalRequest.requestCode);
174
- expect(payload.toolName).toBe('bash');
175
- expect(payload.requesterExternalUserId).toBe('requester-1');
176
- expect(payload.requesterIdentifier).toBe('@requester');
187
+ expect(payload.toolName).toBe("bash");
188
+ expect(payload.requesterExternalUserId).toBe("requester-1");
189
+ expect(payload.requesterIdentifier).toBe("@requester");
177
190
  });
178
191
 
179
- test('skips guardian actor sessions (self-approve)', () => {
192
+ test("skips guardian actor sessions (self-approve)", () => {
180
193
  const canonicalRequest = makeCanonicalRequest();
181
194
  const guardianContext: GuardianRuntimeContext = {
182
- sourceChannel: 'telegram',
183
- trustClass: 'guardian',
184
- guardianExternalUserId: 'guardian-1',
195
+ sourceChannel: "telegram",
196
+ trustClass: "guardian",
197
+ guardianExternalUserId: "guardian-1",
185
198
  };
186
199
 
187
200
  const result = bridgeConfirmationRequestToGuardian({
188
201
  canonicalRequest,
189
202
  guardianContext,
190
- conversationId: 'conv-1',
191
- toolName: 'bash',
203
+ conversationId: "conv-1",
204
+ toolName: "bash",
192
205
  });
193
206
 
194
- expect('skipped' in result && result.skipped).toBe(true);
195
- if ('skipped' in result) {
196
- expect(result.reason).toBe('not_trusted_contact');
207
+ expect("skipped" in result && result.skipped).toBe(true);
208
+ if ("skipped" in result) {
209
+ expect(result.reason).toBe("not_trusted_contact");
197
210
  }
198
211
  expect(emittedSignals).toHaveLength(0);
199
212
  });
200
213
 
201
- test('skips unknown actor sessions', () => {
214
+ test("skips unknown actor sessions", () => {
202
215
  const canonicalRequest = makeCanonicalRequest();
203
216
  const guardianContext: GuardianRuntimeContext = {
204
- sourceChannel: 'telegram',
205
- trustClass: 'unknown',
217
+ sourceChannel: "telegram",
218
+ trustClass: "unknown",
206
219
  };
207
220
 
208
221
  const result = bridgeConfirmationRequestToGuardian({
209
222
  canonicalRequest,
210
223
  guardianContext,
211
- conversationId: 'conv-1',
212
- toolName: 'bash',
224
+ conversationId: "conv-1",
225
+ toolName: "bash",
213
226
  });
214
227
 
215
- expect('skipped' in result && result.skipped).toBe(true);
216
- if ('skipped' in result) {
217
- expect(result.reason).toBe('not_trusted_contact');
228
+ expect("skipped" in result && result.skipped).toBe(true);
229
+ if ("skipped" in result) {
230
+ expect(result.reason).toBe("not_trusted_contact");
218
231
  }
219
232
  expect(emittedSignals).toHaveLength(0);
220
233
  });
221
234
 
222
- test('skips when guardian identity is missing', () => {
235
+ test("skips when guardian identity is missing", () => {
223
236
  const canonicalRequest = makeCanonicalRequest();
224
237
  const guardianContext = makeTrustedContactContext({
225
238
  guardianExternalUserId: undefined,
@@ -228,105 +241,107 @@ describe('bridgeConfirmationRequestToGuardian', () => {
228
241
  const result = bridgeConfirmationRequestToGuardian({
229
242
  canonicalRequest,
230
243
  guardianContext,
231
- conversationId: 'conv-1',
232
- toolName: 'bash',
244
+ conversationId: "conv-1",
245
+ toolName: "bash",
233
246
  });
234
247
 
235
- expect('skipped' in result && result.skipped).toBe(true);
236
- if ('skipped' in result) {
237
- expect(result.reason).toBe('missing_guardian_identity');
248
+ expect("skipped" in result && result.skipped).toBe(true);
249
+ if ("skipped" in result) {
250
+ expect(result.reason).toBe("missing_guardian_identity");
238
251
  }
239
252
  expect(emittedSignals).toHaveLength(0);
240
253
  });
241
254
 
242
- test('skips when no guardian binding exists for channel', () => {
243
- const canonicalRequest = makeCanonicalRequest({ sourceChannel: 'sms' });
255
+ test("skips when no guardian binding exists for channel", () => {
256
+ const canonicalRequest = makeCanonicalRequest({ sourceChannel: "sms" });
244
257
  const guardianContext = makeTrustedContactContext({
245
- sourceChannel: 'sms',
258
+ sourceChannel: "sms",
246
259
  });
247
260
 
248
261
  const result = bridgeConfirmationRequestToGuardian({
249
262
  canonicalRequest,
250
263
  guardianContext,
251
- conversationId: 'conv-1',
252
- toolName: 'bash',
264
+ conversationId: "conv-1",
265
+ toolName: "bash",
253
266
  });
254
267
 
255
- expect('skipped' in result && result.skipped).toBe(true);
256
- if ('skipped' in result) {
257
- expect(result.reason).toBe('no_guardian_binding');
268
+ expect("skipped" in result && result.skipped).toBe(true);
269
+ if ("skipped" in result) {
270
+ expect(result.reason).toBe("no_guardian_binding");
258
271
  }
259
272
  expect(emittedSignals).toHaveLength(0);
260
273
  });
261
274
 
262
- test('sets correct attention hints for urgency', () => {
275
+ test("sets correct attention hints for urgency", () => {
263
276
  const canonicalRequest = makeCanonicalRequest();
264
277
  const guardianContext = makeTrustedContactContext();
265
278
 
266
279
  bridgeConfirmationRequestToGuardian({
267
280
  canonicalRequest,
268
281
  guardianContext,
269
- conversationId: 'conv-1',
270
- toolName: 'bash',
282
+ conversationId: "conv-1",
283
+ toolName: "bash",
271
284
  });
272
285
 
273
286
  const hints = emittedSignals[0].attentionHints as Record<string, unknown>;
274
287
  expect(hints.requiresAction).toBe(true);
275
- expect(hints.urgency).toBe('high');
288
+ expect(hints.urgency).toBe("high");
276
289
  expect(hints.isAsyncBackground).toBe(false);
277
290
  expect(hints.visibleInSourceNow).toBe(false);
278
291
  });
279
292
 
280
- test('uses dedupe key scoped to canonical request ID', () => {
293
+ test("uses dedupe key scoped to canonical request ID", () => {
281
294
  const canonicalRequest = makeCanonicalRequest();
282
295
  const guardianContext = makeTrustedContactContext();
283
296
 
284
297
  bridgeConfirmationRequestToGuardian({
285
298
  canonicalRequest,
286
299
  guardianContext,
287
- conversationId: 'conv-1',
288
- toolName: 'bash',
300
+ conversationId: "conv-1",
301
+ toolName: "bash",
289
302
  });
290
303
 
291
- expect(emittedSignals[0].dedupeKey).toBe(`tc-confirmation-request:${canonicalRequest.id}`);
304
+ expect(emittedSignals[0].dedupeKey).toBe(
305
+ `tc-confirmation-request:${canonicalRequest.id}`,
306
+ );
292
307
  });
293
308
 
294
- test('creates vellum delivery row via onThreadCreated callback', () => {
309
+ test("creates vellum delivery row via onThreadCreated callback", () => {
295
310
  const canonicalRequest = makeCanonicalRequest();
296
311
  const guardianContext = makeTrustedContactContext();
297
312
 
298
313
  bridgeConfirmationRequestToGuardian({
299
314
  canonicalRequest,
300
315
  guardianContext,
301
- conversationId: 'conv-1',
302
- toolName: 'bash',
316
+ conversationId: "conv-1",
317
+ toolName: "bash",
303
318
  });
304
319
 
305
320
  expect(mockOnThreadCreatedCallbacks).toHaveLength(1);
306
321
 
307
322
  // Simulate the broadcaster invoking onThreadCreated
308
323
  mockOnThreadCreatedCallbacks[0]({
309
- conversationId: 'guardian-thread-1',
310
- title: 'Guardian question',
311
- sourceEventName: 'guardian.question',
324
+ conversationId: "guardian-thread-1",
325
+ title: "Guardian question",
326
+ sourceEventName: "guardian.question",
312
327
  });
313
328
 
314
329
  const deliveries = listCanonicalGuardianDeliveries(canonicalRequest.id);
315
330
  expect(deliveries).toHaveLength(1);
316
- expect(deliveries[0].destinationChannel).toBe('vellum');
317
- expect(deliveries[0].destinationConversationId).toBe('guardian-thread-1');
331
+ expect(deliveries[0].destinationChannel).toBe("vellum");
332
+ expect(deliveries[0].destinationConversationId).toBe("guardian-thread-1");
318
333
  });
319
334
 
320
- test('uses custom assistantId when provided', () => {
335
+ test("uses custom assistantId when provided", () => {
321
336
  const canonicalRequest = makeCanonicalRequest();
322
337
  const guardianContext = makeTrustedContactContext();
323
338
 
324
339
  bridgeConfirmationRequestToGuardian({
325
340
  canonicalRequest,
326
341
  guardianContext,
327
- conversationId: 'conv-1',
328
- toolName: 'bash',
329
- assistantId: 'custom-assistant',
342
+ conversationId: "conv-1",
343
+ toolName: "bash",
344
+ assistantId: "custom-assistant",
330
345
  });
331
346
 
332
347
  // The mock only returns a binding for 'self', so 'custom-assistant'
@@ -336,7 +351,7 @@ describe('bridgeConfirmationRequestToGuardian', () => {
336
351
  expect(emittedSignals).toHaveLength(0);
337
352
  });
338
353
 
339
- test('passes assistantId to notification signal', () => {
354
+ test("passes assistantId to notification signal", () => {
340
355
  const canonicalRequest = makeCanonicalRequest();
341
356
  const guardianContext = makeTrustedContactContext();
342
357
 
@@ -344,14 +359,14 @@ describe('bridgeConfirmationRequestToGuardian', () => {
344
359
  bridgeConfirmationRequestToGuardian({
345
360
  canonicalRequest,
346
361
  guardianContext,
347
- conversationId: 'conv-1',
348
- toolName: 'bash',
362
+ conversationId: "conv-1",
363
+ toolName: "bash",
349
364
  });
350
365
 
351
- expect(emittedSignals[0].assistantId).toBe('self');
366
+ expect(emittedSignals[0].assistantId).toBe("self");
352
367
  });
353
368
 
354
- test('includes requesterChatId as null when not provided', () => {
369
+ test("includes requesterChatId as null when not provided", () => {
355
370
  const canonicalRequest = makeCanonicalRequest();
356
371
  const guardianContext = makeTrustedContactContext({
357
372
  requesterChatId: undefined,
@@ -360,37 +375,37 @@ describe('bridgeConfirmationRequestToGuardian', () => {
360
375
  bridgeConfirmationRequestToGuardian({
361
376
  canonicalRequest,
362
377
  guardianContext,
363
- conversationId: 'conv-1',
364
- toolName: 'bash',
378
+ conversationId: "conv-1",
379
+ toolName: "bash",
365
380
  });
366
381
 
367
382
  const payload = emittedSignals[0].contextPayload as Record<string, unknown>;
368
383
  expect(payload.requesterChatId).toBeNull();
369
384
  });
370
385
 
371
- test('skips when binding guardian identity does not match canonical request guardian', () => {
386
+ test("skips when binding guardian identity does not match canonical request guardian", () => {
372
387
  // Create a canonical request where guardianExternalUserId differs from the
373
388
  // binding's guardianExternalUserId ('guardian-1' in the mock).
374
389
  const canonicalRequest = makeCanonicalRequest({
375
- guardianExternalUserId: 'old-guardian-who-was-rebound',
390
+ guardianExternalUserId: "old-guardian-who-was-rebound",
376
391
  });
377
392
  const guardianContext = makeTrustedContactContext();
378
393
 
379
394
  const result = bridgeConfirmationRequestToGuardian({
380
395
  canonicalRequest,
381
396
  guardianContext,
382
- conversationId: 'conv-1',
383
- toolName: 'bash',
397
+ conversationId: "conv-1",
398
+ toolName: "bash",
384
399
  });
385
400
 
386
- expect('skipped' in result && result.skipped).toBe(true);
387
- if ('skipped' in result) {
388
- expect(result.reason).toBe('binding_identity_mismatch');
401
+ expect("skipped" in result && result.skipped).toBe(true);
402
+ if ("skipped" in result) {
403
+ expect(result.reason).toBe("binding_identity_mismatch");
389
404
  }
390
405
  expect(emittedSignals).toHaveLength(0);
391
406
  });
392
407
 
393
- test('does not skip when canonical request guardian identity is null', () => {
408
+ test("does not skip when canonical request guardian identity is null", () => {
394
409
  // When guardianExternalUserId is null on the canonical request (e.g. desktop
395
410
  // flow), the identity check should be skipped and the bridge should proceed.
396
411
  const canonicalRequest = makeCanonicalRequest({
@@ -401,11 +416,11 @@ describe('bridgeConfirmationRequestToGuardian', () => {
401
416
  const result = bridgeConfirmationRequestToGuardian({
402
417
  canonicalRequest,
403
418
  guardianContext,
404
- conversationId: 'conv-1',
405
- toolName: 'bash',
419
+ conversationId: "conv-1",
420
+ toolName: "bash",
406
421
  });
407
422
 
408
- expect('bridged' in result && result.bridged).toBe(true);
423
+ expect("bridged" in result && result.bridged).toBe(true);
409
424
  expect(emittedSignals).toHaveLength(1);
410
425
  });
411
426
  });