@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
@@ -1,15 +1,16 @@
1
- import { beforeEach, describe, expect, mock,test } from 'bun:test';
1
+ import { beforeEach, describe, expect, mock, test } from "bun:test";
2
2
 
3
3
  // ── Mocks ────────────────────────────────────────────────────────────
4
4
 
5
- mock.module('../util/logger.js', () => ({
6
- getLogger: () => new Proxy({} as Record<string, unknown>, {
7
- get: () => () => {},
8
- }),
5
+ mock.module("../util/logger.js", () => ({
6
+ getLogger: () =>
7
+ new Proxy({} as Record<string, unknown>, {
8
+ get: () => () => {},
9
+ }),
9
10
  }));
10
11
 
11
- mock.module('../util/platform.js', () => ({
12
- getDataDir: () => '/tmp/browser-fill-credential-test',
12
+ mock.module("../util/platform.js", () => ({
13
+ getDataDir: () => "/tmp/browser-fill-credential-test",
13
14
  }));
14
15
 
15
16
  let mockPage: {
@@ -26,7 +27,7 @@ let mockPage: {
26
27
 
27
28
  let snapshotMaps: Map<string, Map<string, string>>;
28
29
 
29
- mock.module('../tools/browser/browser-manager.js', () => {
30
+ mock.module("../tools/browser/browser-manager.js", () => {
30
31
  snapshotMaps = new Map();
31
32
  return {
32
33
  browserManager: {
@@ -45,7 +46,7 @@ mock.module('../tools/browser/browser-manager.js', () => {
45
46
  };
46
47
  });
47
48
 
48
- mock.module('../tools/network/url-safety.js', () => ({
49
+ mock.module("../tools/network/url-safety.js", () => ({
49
50
  parseUrl: () => null,
50
51
  isPrivateOrLocalHost: () => false,
51
52
  resolveHostAddresses: async () => [],
@@ -56,32 +57,33 @@ mock.module('../tools/network/url-safety.js', () => ({
56
57
  let mockGetSecureKey: ReturnType<typeof mock>;
57
58
  let mockGetCredentialMetadata: ReturnType<typeof mock>;
58
59
 
59
- mock.module('../security/secure-keys.js', () => ({
60
+ mock.module("../security/secure-keys.js", () => ({
60
61
  getSecureKey: (...args: unknown[]) => mockGetSecureKey(...args),
61
62
  setSecureKey: () => true,
62
63
  deleteSecureKey: () => true,
63
64
  listSecureKeys: () => [],
64
- getBackendType: () => 'encrypted',
65
+ getBackendType: () => "encrypted",
65
66
  _resetBackend: () => {},
66
67
  _setBackend: () => {},
67
68
  }));
68
69
 
69
- mock.module('../tools/credentials/metadata-store.js', () => ({
70
- getCredentialMetadata: (...args: unknown[]) => mockGetCredentialMetadata(...args),
70
+ mock.module("../tools/credentials/metadata-store.js", () => ({
71
+ getCredentialMetadata: (...args: unknown[]) =>
72
+ mockGetCredentialMetadata(...args),
71
73
  getCredentialMetadataById: () => undefined,
72
74
  upsertCredentialMetadata: () => {},
73
75
  deleteCredentialMetadata: () => {},
74
76
  _setMetadataPath: () => {},
75
77
  }));
76
78
 
77
- import { executeBrowserFillCredential } from '../tools/browser/headless-browser.js';
78
- import type { ToolContext } from '../tools/types.js';
79
+ import { executeBrowserFillCredential } from "../tools/browser/headless-browser.js";
80
+ import type { ToolContext } from "../tools/types.js";
79
81
 
80
82
  const ctx: ToolContext = {
81
- sessionId: 'test-session',
82
- conversationId: 'test-conversation',
83
- workingDir: '/tmp',
84
- guardianTrustClass: 'guardian',
83
+ sessionId: "test-session",
84
+ conversationId: "test-conversation",
85
+ workingDir: "/tmp",
86
+ guardianTrustClass: "guardian",
85
87
  };
86
88
 
87
89
  function resetMockPage() {
@@ -89,10 +91,13 @@ function resetMockPage() {
89
91
  click: mock(async () => {}),
90
92
  fill: mock(async () => {}),
91
93
  press: mock(async () => {}),
92
- evaluate: mock(async () => ''),
93
- title: mock(async () => 'Test Page'),
94
- url: mock(() => 'https://example.com/'),
95
- goto: mock(async () => ({ status: () => 200, url: () => 'https://example.com/' })),
94
+ evaluate: mock(async () => ""),
95
+ title: mock(async () => "Test Page"),
96
+ url: mock(() => "https://example.com/"),
97
+ goto: mock(async () => ({
98
+ status: () => 200,
99
+ url: () => "https://example.com/",
100
+ })),
96
101
  close: async () => {},
97
102
  isClosed: () => false,
98
103
  };
@@ -103,7 +108,7 @@ function defaultMetadata(service: string, field: string) {
103
108
  credentialId: `${service}:${field}`,
104
109
  service,
105
110
  field,
106
- allowedTools: ['browser_fill_credential'],
111
+ allowedTools: ["browser_fill_credential"],
107
112
  allowedDomains: [] as string[],
108
113
  createdAt: Date.now(),
109
114
  updatedAt: Date.now(),
@@ -112,199 +117,262 @@ function defaultMetadata(service: string, field: string) {
112
117
 
113
118
  // ── browser_fill_credential ──────────────────────────────────────────
114
119
 
115
- describe('executeBrowserFillCredential', () => {
120
+ describe("executeBrowserFillCredential", () => {
116
121
  beforeEach(() => {
117
122
  resetMockPage();
118
123
  snapshotMaps.clear();
119
- mockGetSecureKey = mock(() => 'super-secret-password');
120
- mockGetCredentialMetadata = mock((service: string, field: string) => defaultMetadata(service, field));
124
+ mockGetSecureKey = mock(() => "super-secret-password");
125
+ mockGetCredentialMetadata = mock((service: string, field: string) =>
126
+ defaultMetadata(service, field),
127
+ );
121
128
  });
122
129
 
123
- test('fills credential into element by element_id', async () => {
124
- snapshotMaps.set('test-session', new Map([['e1', '[data-vellum-eid="e1"]']]));
130
+ test("fills credential into element by element_id", async () => {
131
+ snapshotMaps.set(
132
+ "test-session",
133
+ new Map([["e1", '[data-vellum-eid="e1"]']]),
134
+ );
125
135
  const result = await executeBrowserFillCredential(
126
- { service: 'gmail', field: 'password', element_id: 'e1' },
136
+ { service: "gmail", field: "password", element_id: "e1" },
127
137
  ctx,
128
138
  );
129
139
  expect(result.isError).toBe(false);
130
- expect(result.content).toContain('Filled password for gmail');
131
- expect(mockPage.fill).toHaveBeenCalledWith('[data-vellum-eid="e1"]', 'super-secret-password');
132
- expect(mockGetSecureKey).toHaveBeenCalledWith('credential:gmail:password');
140
+ expect(result.content).toContain("Filled password for gmail");
141
+ expect(mockPage.fill).toHaveBeenCalledWith(
142
+ '[data-vellum-eid="e1"]',
143
+ "super-secret-password",
144
+ );
145
+ expect(mockGetSecureKey).toHaveBeenCalledWith("credential:gmail:password");
133
146
  });
134
147
 
135
- test('fills credential by CSS selector', async () => {
148
+ test("fills credential by CSS selector", async () => {
136
149
  const result = await executeBrowserFillCredential(
137
- { service: 'github', field: 'token', selector: 'input[name="password"]' },
150
+ { service: "github", field: "token", selector: 'input[name="password"]' },
138
151
  ctx,
139
152
  );
140
153
  expect(result.isError).toBe(false);
141
- expect(result.content).toContain('Filled token for github');
142
- expect(mockPage.fill).toHaveBeenCalledWith('input[name="password"]', 'super-secret-password');
154
+ expect(result.content).toContain("Filled token for github");
155
+ expect(mockPage.fill).toHaveBeenCalledWith(
156
+ 'input[name="password"]',
157
+ "super-secret-password",
158
+ );
143
159
  });
144
160
 
145
- test('returns error when credential not found', async () => {
161
+ test("returns error when credential not found", async () => {
146
162
  mockGetCredentialMetadata = mock(() => undefined);
147
- snapshotMaps.set('test-session', new Map([['e1', '[data-vellum-eid="e1"]']]));
163
+ snapshotMaps.set(
164
+ "test-session",
165
+ new Map([["e1", '[data-vellum-eid="e1"]']]),
166
+ );
148
167
  const result = await executeBrowserFillCredential(
149
- { service: 'slack', field: 'api_key', element_id: 'e1' },
168
+ { service: "slack", field: "api_key", element_id: "e1" },
150
169
  ctx,
151
170
  );
152
171
  expect(result.isError).toBe(true);
153
- expect(result.content).toContain('No credential stored for slack/api_key');
154
- expect(result.content).toContain('credential_store');
172
+ expect(result.content).toContain("No credential stored for slack/api_key");
173
+ expect(result.content).toContain("credential_store");
155
174
  expect(mockPage.fill).not.toHaveBeenCalled();
156
175
  });
157
176
 
158
- test('returns error when metadata exists but no stored value', async () => {
177
+ test("returns error when metadata exists but no stored value", async () => {
159
178
  mockGetSecureKey = mock(() => undefined);
160
- snapshotMaps.set('test-session', new Map([['e1', '[data-vellum-eid="e1"]']]));
179
+ snapshotMaps.set(
180
+ "test-session",
181
+ new Map([["e1", '[data-vellum-eid="e1"]']]),
182
+ );
161
183
  const result = await executeBrowserFillCredential(
162
- { service: 'slack', field: 'api_key', element_id: 'e1' },
184
+ { service: "slack", field: "api_key", element_id: "e1" },
163
185
  ctx,
164
186
  );
165
187
  expect(result.isError).toBe(true);
166
- expect(result.content).toContain('No credential stored for slack/api_key');
167
- expect(result.content).toContain('credential_store');
188
+ expect(result.content).toContain("No credential stored for slack/api_key");
189
+ expect(result.content).toContain("credential_store");
168
190
  expect(mockPage.fill).not.toHaveBeenCalled();
169
191
  });
170
192
 
171
- test('returns error when element not found', async () => {
193
+ test("returns error when element not found", async () => {
172
194
  const result = await executeBrowserFillCredential(
173
- { service: 'gmail', field: 'password', element_id: 'e99' },
195
+ { service: "gmail", field: "password", element_id: "e99" },
174
196
  ctx,
175
197
  );
176
198
  expect(result.isError).toBe(true);
177
199
  expect(result.content).toContain('element_id "e99" not found');
178
- expect(result.content).toContain('browser_snapshot');
200
+ expect(result.content).toContain("browser_snapshot");
179
201
  });
180
202
 
181
- test('presses Enter after fill when press_enter is true', async () => {
182
- snapshotMaps.set('test-session', new Map([['e2', '[data-vellum-eid="e2"]']]));
203
+ test("presses Enter after fill when press_enter is true", async () => {
204
+ snapshotMaps.set(
205
+ "test-session",
206
+ new Map([["e2", '[data-vellum-eid="e2"]']]),
207
+ );
183
208
  const result = await executeBrowserFillCredential(
184
- { service: 'gmail', field: 'password', element_id: 'e2', press_enter: true },
209
+ {
210
+ service: "gmail",
211
+ field: "password",
212
+ element_id: "e2",
213
+ press_enter: true,
214
+ },
185
215
  ctx,
186
216
  );
187
217
  expect(result.isError).toBe(false);
188
- expect(mockPage.fill).toHaveBeenCalledWith('[data-vellum-eid="e2"]', 'super-secret-password');
189
- expect(mockPage.press).toHaveBeenCalledWith('[data-vellum-eid="e2"]', 'Enter');
218
+ expect(mockPage.fill).toHaveBeenCalledWith(
219
+ '[data-vellum-eid="e2"]',
220
+ "super-secret-password",
221
+ );
222
+ expect(mockPage.press).toHaveBeenCalledWith(
223
+ '[data-vellum-eid="e2"]',
224
+ "Enter",
225
+ );
190
226
  });
191
227
 
192
- test('credential value NEVER appears in result content', async () => {
193
- snapshotMaps.set('test-session', new Map([['e1', '[data-vellum-eid="e1"]']]));
228
+ test("credential value NEVER appears in result content", async () => {
229
+ snapshotMaps.set(
230
+ "test-session",
231
+ new Map([["e1", '[data-vellum-eid="e1"]']]),
232
+ );
194
233
  const result = await executeBrowserFillCredential(
195
- { service: 'gmail', field: 'password', element_id: 'e1' },
234
+ { service: "gmail", field: "password", element_id: "e1" },
196
235
  ctx,
197
236
  );
198
237
  expect(result.isError).toBe(false);
199
- expect(result.content).not.toContain('super-secret-password');
238
+ expect(result.content).not.toContain("super-secret-password");
200
239
  });
201
240
 
202
- test('returns error when service is missing', async () => {
203
- snapshotMaps.set('test-session', new Map([['e1', '[data-vellum-eid="e1"]']]));
241
+ test("returns error when service is missing", async () => {
242
+ snapshotMaps.set(
243
+ "test-session",
244
+ new Map([["e1", '[data-vellum-eid="e1"]']]),
245
+ );
204
246
  const result = await executeBrowserFillCredential(
205
- { field: 'password', element_id: 'e1' },
247
+ { field: "password", element_id: "e1" },
206
248
  ctx,
207
249
  );
208
250
  expect(result.isError).toBe(true);
209
- expect(result.content).toContain('service is required');
251
+ expect(result.content).toContain("service is required");
210
252
  });
211
253
 
212
- test('returns error when field is missing', async () => {
213
- snapshotMaps.set('test-session', new Map([['e1', '[data-vellum-eid="e1"]']]));
254
+ test("returns error when field is missing", async () => {
255
+ snapshotMaps.set(
256
+ "test-session",
257
+ new Map([["e1", '[data-vellum-eid="e1"]']]),
258
+ );
214
259
  const result = await executeBrowserFillCredential(
215
- { service: 'gmail', element_id: 'e1' },
260
+ { service: "gmail", element_id: "e1" },
216
261
  ctx,
217
262
  );
218
263
  expect(result.isError).toBe(true);
219
- expect(result.content).toContain('field is required');
264
+ expect(result.content).toContain("field is required");
220
265
  });
221
266
 
222
267
  // -----------------------------------------------------------------------
223
268
  // Broker-mediated credential access — verify broker path is used
224
269
  // -----------------------------------------------------------------------
225
- describe('broker integration', () => {
226
- test('fill succeeds with no domain or tool-policy checks', async () => {
227
- snapshotMaps.set('test-session', new Map([['e1', '[data-vellum-eid="e1"]']]));
270
+ describe("broker integration", () => {
271
+ test("fill succeeds with no domain or tool-policy checks", async () => {
272
+ snapshotMaps.set(
273
+ "test-session",
274
+ new Map([["e1", '[data-vellum-eid="e1"]']]),
275
+ );
228
276
  const result = await executeBrowserFillCredential(
229
- { service: 'gmail', field: 'password', element_id: 'e1' },
277
+ { service: "gmail", field: "password", element_id: "e1" },
230
278
  ctx,
231
279
  );
232
280
  expect(result.isError).toBe(false);
233
- expect(result.content).toContain('Filled password for gmail');
234
- expect(result.content).not.toContain('super-secret-password');
281
+ expect(result.content).toContain("Filled password for gmail");
282
+ expect(result.content).not.toContain("super-secret-password");
235
283
  });
236
284
 
237
- test('credential access goes through broker (metadata + value checked)', async () => {
238
- snapshotMaps.set('test-session', new Map([['e1', '[data-vellum-eid="e1"]']]));
285
+ test("credential access goes through broker (metadata + value checked)", async () => {
286
+ snapshotMaps.set(
287
+ "test-session",
288
+ new Map([["e1", '[data-vellum-eid="e1"]']]),
289
+ );
239
290
  await executeBrowserFillCredential(
240
- { service: 'gmail', field: 'password', element_id: 'e1' },
291
+ { service: "gmail", field: "password", element_id: "e1" },
241
292
  ctx,
242
293
  );
243
294
  // Broker checks metadata first, then reads the value
244
- expect(mockGetCredentialMetadata).toHaveBeenCalledWith('gmail', 'password');
245
- expect(mockGetSecureKey).toHaveBeenCalledWith('credential:gmail:password');
295
+ expect(mockGetCredentialMetadata).toHaveBeenCalledWith(
296
+ "gmail",
297
+ "password",
298
+ );
299
+ expect(mockGetSecureKey).toHaveBeenCalledWith(
300
+ "credential:gmail:password",
301
+ );
246
302
  });
247
303
 
248
- test('returns tool policy denial with actionable message', async () => {
304
+ test("returns tool policy denial with actionable message", async () => {
249
305
  mockGetCredentialMetadata = mock((service: string, field: string) => ({
250
306
  ...defaultMetadata(service, field),
251
- allowedTools: ['some_other_tool'],
307
+ allowedTools: ["some_other_tool"],
252
308
  }));
253
- snapshotMaps.set('test-session', new Map([['e1', '[data-vellum-eid="e1"]']]));
309
+ snapshotMaps.set(
310
+ "test-session",
311
+ new Map([["e1", '[data-vellum-eid="e1"]']]),
312
+ );
254
313
  const result = await executeBrowserFillCredential(
255
- { service: 'gmail', field: 'password', element_id: 'e1' },
314
+ { service: "gmail", field: "password", element_id: "e1" },
256
315
  ctx,
257
316
  );
258
317
  expect(result.isError).toBe(true);
259
- expect(result.content).toContain('Policy denied');
260
- expect(result.content).toContain('not allowed to use credential');
261
- expect(result.content).toContain('credential_store');
318
+ expect(result.content).toContain("Policy denied");
319
+ expect(result.content).toContain("not allowed to use credential");
320
+ expect(result.content).toContain("credential_store");
262
321
  expect(mockPage.fill).not.toHaveBeenCalled();
263
322
  });
264
323
 
265
- test('returns domain policy denial with actionable message', async () => {
324
+ test("returns domain policy denial with actionable message", async () => {
266
325
  mockGetCredentialMetadata = mock((service: string, field: string) => ({
267
326
  ...defaultMetadata(service, field),
268
- allowedDomains: ['other-site.com'],
327
+ allowedDomains: ["other-site.com"],
269
328
  }));
270
- snapshotMaps.set('test-session', new Map([['e1', '[data-vellum-eid="e1"]']]));
329
+ snapshotMaps.set(
330
+ "test-session",
331
+ new Map([["e1", '[data-vellum-eid="e1"]']]),
332
+ );
271
333
  const result = await executeBrowserFillCredential(
272
- { service: 'gmail', field: 'password', element_id: 'e1' },
334
+ { service: "gmail", field: "password", element_id: "e1" },
273
335
  ctx,
274
336
  );
275
337
  expect(result.isError).toBe(true);
276
- expect(result.content).toContain('Domain policy denied');
277
- expect(result.content).toContain('Navigate to an allowed domain');
338
+ expect(result.content).toContain("Domain policy denied");
339
+ expect(result.content).toContain("Navigate to an allowed domain");
278
340
  expect(mockPage.fill).not.toHaveBeenCalled();
279
341
  });
280
342
 
281
- test('passes current page domain to broker', async () => {
343
+ test("passes current page domain to broker", async () => {
282
344
  mockGetCredentialMetadata = mock((service: string, field: string) => ({
283
345
  ...defaultMetadata(service, field),
284
- allowedDomains: ['example.com'],
346
+ allowedDomains: ["example.com"],
285
347
  }));
286
- snapshotMaps.set('test-session', new Map([['e1', '[data-vellum-eid="e1"]']]));
348
+ snapshotMaps.set(
349
+ "test-session",
350
+ new Map([["e1", '[data-vellum-eid="e1"]']]),
351
+ );
287
352
  const result = await executeBrowserFillCredential(
288
- { service: 'gmail', field: 'password', element_id: 'e1' },
353
+ { service: "gmail", field: "password", element_id: "e1" },
289
354
  ctx,
290
355
  );
291
356
  // Page URL is https://example.com/ which matches allowedDomains
292
357
  expect(result.isError).toBe(false);
293
- expect(result.content).toContain('Filled password for gmail');
358
+ expect(result.content).toContain("Filled password for gmail");
294
359
  });
295
360
 
296
- test('policy denial errors never contain credential values', async () => {
361
+ test("policy denial errors never contain credential values", async () => {
297
362
  mockGetCredentialMetadata = mock((service: string, field: string) => ({
298
363
  ...defaultMetadata(service, field),
299
- allowedTools: ['other_tool'],
364
+ allowedTools: ["other_tool"],
300
365
  }));
301
- snapshotMaps.set('test-session', new Map([['e1', '[data-vellum-eid="e1"]']]));
366
+ snapshotMaps.set(
367
+ "test-session",
368
+ new Map([["e1", '[data-vellum-eid="e1"]']]),
369
+ );
302
370
  const result = await executeBrowserFillCredential(
303
- { service: 'gmail', field: 'password', element_id: 'e1' },
371
+ { service: "gmail", field: "password", element_id: "e1" },
304
372
  ctx,
305
373
  );
306
374
  expect(result.isError).toBe(true);
307
- expect(result.content).not.toContain('super-secret-password');
375
+ expect(result.content).not.toContain("super-secret-password");
308
376
  });
309
377
  });
310
378
  });