@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,23 +1,28 @@
1
- import { describe, expect, test } from 'bun:test';
2
-
3
- import { areStatementsCoherent, computeConflictRelevance, overlapRatio as _overlapRatio,tokenizeForConflictRelevance as _tokenizeForConflictRelevance } from '../memory/conflict-intent.js';
4
-
5
- describe('tokenizeForConflictRelevance hardening', () => {
6
- test('excludes numeric-only tokens from relevance', () => {
7
- const relevance = computeConflictRelevance(
8
- 'Check PR 5526',
9
- { existingStatement: 'Track PR 5525 for review.', candidateStatement: 'Track PR 5526 for review.' },
10
- );
1
+ import { describe, expect, test } from "bun:test";
2
+
3
+ import {
4
+ areStatementsCoherent,
5
+ computeConflictRelevance,
6
+ overlapRatio as _overlapRatio,
7
+ tokenizeForConflictRelevance as _tokenizeForConflictRelevance,
8
+ } from "../memory/conflict-intent.js";
9
+
10
+ describe("tokenizeForConflictRelevance hardening", () => {
11
+ test("excludes numeric-only tokens from relevance", () => {
12
+ const relevance = computeConflictRelevance("Check PR 5526", {
13
+ existingStatement: "Track PR 5525 for review.",
14
+ candidateStatement: "Track PR 5526 for review.",
15
+ });
11
16
  // Numeric tokens "5526" and "5525" should be excluded, so overlap is minimal
12
17
  expect(relevance).toBeLessThan(0.5);
13
18
  });
14
19
 
15
- test('excludes URL boilerplate tokens from relevance', () => {
20
+ test("excludes URL boilerplate tokens from relevance", () => {
16
21
  const relevance = computeConflictRelevance(
17
- 'Check https://github.com/org/repo/pull/123',
22
+ "Check https://github.com/org/repo/pull/123",
18
23
  {
19
- existingStatement: 'Review https://github.com/org/repo/pull/456',
20
- candidateStatement: 'Review https://github.com/org/repo/pull/789',
24
+ existingStatement: "Review https://github.com/org/repo/pull/456",
25
+ candidateStatement: "Review https://github.com/org/repo/pull/789",
21
26
  },
22
27
  );
23
28
  // URL tokens like "https", "github", "pull" should be excluded;
@@ -25,34 +30,34 @@ describe('tokenizeForConflictRelevance hardening', () => {
25
30
  expect(relevance).toBeLessThanOrEqual(0.5);
26
31
  });
27
32
 
28
- test('URL-embedded tracking tokens are stripped, standalone usage preserved', () => {
33
+ test("URL-embedded tracking tokens are stripped, standalone usage preserved", () => {
29
34
  // URLs containing "issue", "pull", etc. are stripped entirely before tokenizing
30
35
  const urlRelevance = computeConflictRelevance(
31
- 'Check https://github.com/org/repo/issues/42',
36
+ "Check https://github.com/org/repo/issues/42",
32
37
  {
33
- existingStatement: 'Review https://github.com/org/repo/issues/10',
34
- candidateStatement: 'Review https://github.com/org/repo/issues/11',
38
+ existingStatement: "Review https://github.com/org/repo/issues/10",
39
+ candidateStatement: "Review https://github.com/org/repo/issues/11",
35
40
  },
36
41
  );
37
42
  expect(urlRelevance).toBeLessThanOrEqual(0.5);
38
43
 
39
44
  // Standalone "issue" is preserved as a meaningful token
40
45
  const standaloneRelevance = computeConflictRelevance(
41
- 'should I file an issue?',
46
+ "should I file an issue?",
42
47
  {
43
- existingStatement: 'File an issue when bugs are found.',
44
- candidateStatement: 'Skip filing an issue for minor bugs.',
48
+ existingStatement: "File an issue when bugs are found.",
49
+ candidateStatement: "Skip filing an issue for minor bugs.",
45
50
  },
46
51
  );
47
52
  expect(standaloneRelevance).toBeGreaterThan(0);
48
53
  });
49
54
 
50
- test('strips scheme-less bare domain URLs from relevance', () => {
55
+ test("strips scheme-less bare domain URLs from relevance", () => {
51
56
  const relevance = computeConflictRelevance(
52
- 'Check github.com/org/repo/pull/123',
57
+ "Check github.com/org/repo/pull/123",
53
58
  {
54
- existingStatement: 'Review gitlab.com/org/repo/issues/456',
55
- candidateStatement: 'Review github.com/org/repo/pull/789',
59
+ existingStatement: "Review gitlab.com/org/repo/issues/456",
60
+ candidateStatement: "Review github.com/org/repo/pull/789",
56
61
  },
57
62
  );
58
63
  // Bare URLs should be stripped entirely; tokens like "pull", "issues"
@@ -60,24 +65,21 @@ describe('tokenizeForConflictRelevance hardening', () => {
60
65
  expect(relevance).toBeLessThanOrEqual(0.5);
61
66
  });
62
67
 
63
- test('preserves dotted identifiers that look like file paths', () => {
64
- const relevance = computeConflictRelevance(
65
- 'Use index.ts/runtime parser',
66
- {
67
- existingStatement: 'Keep index.ts/runtime approach.',
68
- candidateStatement: 'Switch to config.ts/runtime approach.',
69
- },
70
- );
68
+ test("preserves dotted identifiers that look like file paths", () => {
69
+ const relevance = computeConflictRelevance("Use index.ts/runtime parser", {
70
+ existingStatement: "Keep index.ts/runtime approach.",
71
+ candidateStatement: "Switch to config.ts/runtime approach.",
72
+ });
71
73
  // File-like identifiers should NOT be stripped as URLs
72
74
  expect(relevance).toBeGreaterThan(0);
73
75
  });
74
76
 
75
- test('still computes meaningful relevance for real content tokens', () => {
77
+ test("still computes meaningful relevance for real content tokens", () => {
76
78
  const relevance = computeConflictRelevance(
77
- 'Should I use React for frontend?',
79
+ "Should I use React for frontend?",
78
80
  {
79
- existingStatement: 'Use React for frontend work.',
80
- candidateStatement: 'Use Vue for frontend work.',
81
+ existingStatement: "Use React for frontend work.",
82
+ candidateStatement: "Use Vue for frontend work.",
81
83
  },
82
84
  );
83
85
  // Real content tokens like "react", "frontend" should still match
@@ -85,58 +87,74 @@ describe('tokenizeForConflictRelevance hardening', () => {
85
87
  });
86
88
  });
87
89
 
88
- describe('statement coherence (areStatementsCoherent)', () => {
89
- test('unrelated statements are incoherent', () => {
90
- expect(areStatementsCoherent(
91
- 'The default model for the summarize CLI is google/gemini-3-flash-preview.',
92
- "User's favorite color is blue.",
93
- )).toBe(false);
90
+ describe("statement coherence (areStatementsCoherent)", () => {
91
+ test("unrelated statements are incoherent", () => {
92
+ expect(
93
+ areStatementsCoherent(
94
+ "The default model for the summarize CLI is google/gemini-3-flash-preview.",
95
+ "User's favorite color is blue.",
96
+ ),
97
+ ).toBe(false);
94
98
  });
95
99
 
96
- test('related statements are coherent', () => {
97
- expect(areStatementsCoherent(
98
- "User's favorite color is blue.",
99
- "User's favorite color is green.",
100
- )).toBe(true);
100
+ test("related statements are coherent", () => {
101
+ expect(
102
+ areStatementsCoherent(
103
+ "User's favorite color is blue.",
104
+ "User's favorite color is green.",
105
+ ),
106
+ ).toBe(true);
101
107
  });
102
108
 
103
- test('topically similar preferences are coherent', () => {
104
- expect(areStatementsCoherent(
105
- 'Use React for frontend work.',
106
- 'Use Vue for frontend work.',
107
- )).toBe(true);
109
+ test("topically similar preferences are coherent", () => {
110
+ expect(
111
+ areStatementsCoherent(
112
+ "Use React for frontend work.",
113
+ "Use Vue for frontend work.",
114
+ ),
115
+ ).toBe(true);
108
116
  });
109
117
 
110
- test('completely disjoint technical topics are incoherent', () => {
111
- expect(areStatementsCoherent(
112
- 'Always use PostgreSQL for database storage.',
113
- 'The preferred terminal font is JetBrains Mono.',
114
- )).toBe(false);
118
+ test("completely disjoint technical topics are incoherent", () => {
119
+ expect(
120
+ areStatementsCoherent(
121
+ "Always use PostgreSQL for database storage.",
122
+ "The preferred terminal font is JetBrains Mono.",
123
+ ),
124
+ ).toBe(false);
115
125
  });
116
126
 
117
- test('short technical terms (3 chars) are preserved for coherence', () => {
127
+ test("short technical terms (3 chars) are preserved for coherence", () => {
118
128
  // "vim" and "css" are 3 chars — should not be filtered
119
- expect(areStatementsCoherent(
120
- 'Use Vim for editing.',
121
- 'Use Emacs instead of Vim.',
122
- )).toBe(true);
123
-
124
- expect(areStatementsCoherent(
125
- 'Use CSS grid for layouts.',
126
- 'Use CSS flexbox for layouts.',
127
- )).toBe(true);
128
-
129
- expect(areStatementsCoherent(
130
- 'Use npm for installs.',
131
- 'Use npm with --legacy-peer-deps.',
132
- )).toBe(true);
129
+ expect(
130
+ areStatementsCoherent(
131
+ "Use Vim for editing.",
132
+ "Use Emacs instead of Vim.",
133
+ ),
134
+ ).toBe(true);
135
+
136
+ expect(
137
+ areStatementsCoherent(
138
+ "Use CSS grid for layouts.",
139
+ "Use CSS flexbox for layouts.",
140
+ ),
141
+ ).toBe(true);
142
+
143
+ expect(
144
+ areStatementsCoherent(
145
+ "Use npm for installs.",
146
+ "Use npm with --legacy-peer-deps.",
147
+ ),
148
+ ).toBe(true);
133
149
  });
134
150
 
135
- test('short terms with no shared context are still incoherent', () => {
151
+ test("short terms with no shared context are still incoherent", () => {
136
152
  // No shared tokens at all — completely different topics
137
- expect(areStatementsCoherent(
138
- 'Vim is the preferred editor.',
139
- 'CSS grid handles page layouts.',
140
- )).toBe(false);
153
+ expect(
154
+ areStatementsCoherent(
155
+ "Vim is the preferred editor.",
156
+ "CSS grid handles page layouts.",
157
+ ),
158
+ ).toBe(false);
141
159
  });
142
160
  });
@@ -1,4 +1,4 @@
1
- import { describe, expect, test } from 'bun:test';
1
+ import { describe, expect, test } from "bun:test";
2
2
 
3
3
  import {
4
4
  isConflictKindEligible,
@@ -6,117 +6,188 @@ import {
6
6
  isDurableInstructionStatement,
7
7
  isStatementConflictEligible,
8
8
  isTransientTrackingStatement,
9
- } from '../memory/conflict-policy.js';
9
+ } from "../memory/conflict-policy.js";
10
10
 
11
- describe('conflict-policy', () => {
12
- const config = { conflictableKinds: ['preference', 'profile', 'constraint'] };
11
+ describe("conflict-policy", () => {
12
+ const config = { conflictableKinds: ["preference", "profile", "constraint"] };
13
13
 
14
- describe('isConflictKindEligible', () => {
15
- test('returns true for eligible kind', () => {
16
- expect(isConflictKindEligible('preference', config)).toBe(true);
17
- expect(isConflictKindEligible('profile', config)).toBe(true);
18
- expect(isConflictKindEligible('constraint', config)).toBe(true);
14
+ describe("isConflictKindEligible", () => {
15
+ test("returns true for eligible kind", () => {
16
+ expect(isConflictKindEligible("preference", config)).toBe(true);
17
+ expect(isConflictKindEligible("profile", config)).toBe(true);
18
+ expect(isConflictKindEligible("constraint", config)).toBe(true);
19
19
  });
20
20
 
21
- test('returns false for ineligible kind', () => {
22
- expect(isConflictKindEligible('project', config)).toBe(false);
23
- expect(isConflictKindEligible('todo', config)).toBe(false);
24
- expect(isConflictKindEligible('fact', config)).toBe(false);
21
+ test("returns false for ineligible kind", () => {
22
+ expect(isConflictKindEligible("project", config)).toBe(false);
23
+ expect(isConflictKindEligible("todo", config)).toBe(false);
24
+ expect(isConflictKindEligible("fact", config)).toBe(false);
25
25
  });
26
26
  });
27
27
 
28
- describe('isConflictKindPairEligible', () => {
29
- test('returns true when both kinds are eligible', () => {
30
- expect(isConflictKindPairEligible('preference', 'profile', config)).toBe(true);
28
+ describe("isConflictKindPairEligible", () => {
29
+ test("returns true when both kinds are eligible", () => {
30
+ expect(isConflictKindPairEligible("preference", "profile", config)).toBe(
31
+ true,
32
+ );
31
33
  });
32
34
 
33
- test('returns false when existing kind is ineligible', () => {
34
- expect(isConflictKindPairEligible('project', 'preference', config)).toBe(false);
35
+ test("returns false when existing kind is ineligible", () => {
36
+ expect(isConflictKindPairEligible("project", "preference", config)).toBe(
37
+ false,
38
+ );
35
39
  });
36
40
 
37
- test('returns false when candidate kind is ineligible', () => {
38
- expect(isConflictKindPairEligible('preference', 'todo', config)).toBe(false);
41
+ test("returns false when candidate kind is ineligible", () => {
42
+ expect(isConflictKindPairEligible("preference", "todo", config)).toBe(
43
+ false,
44
+ );
39
45
  });
40
46
 
41
- test('returns false when both kinds are ineligible', () => {
42
- expect(isConflictKindPairEligible('project', 'todo', config)).toBe(false);
47
+ test("returns false when both kinds are ineligible", () => {
48
+ expect(isConflictKindPairEligible("project", "todo", config)).toBe(false);
43
49
  });
44
50
  });
45
51
 
46
- describe('isTransientTrackingStatement', () => {
47
- test('detects PR URLs', () => {
48
- expect(isTransientTrackingStatement('Track https://github.com/org/repo/pull/5526')).toBe(true);
52
+ describe("isTransientTrackingStatement", () => {
53
+ test("detects PR URLs", () => {
54
+ expect(
55
+ isTransientTrackingStatement(
56
+ "Track https://github.com/org/repo/pull/5526",
57
+ ),
58
+ ).toBe(true);
49
59
  });
50
60
 
51
- test('detects issue/ticket references', () => {
52
- expect(isTransientTrackingStatement('Track PR #5526 and #5525')).toBe(true);
53
- expect(isTransientTrackingStatement('See issue #42 for details')).toBe(true);
54
- expect(isTransientTrackingStatement('Filed ticket 1234')).toBe(true);
61
+ test("detects issue/ticket references", () => {
62
+ expect(isTransientTrackingStatement("Track PR #5526 and #5525")).toBe(
63
+ true,
64
+ );
65
+ expect(isTransientTrackingStatement("See issue #42 for details")).toBe(
66
+ true,
67
+ );
68
+ expect(isTransientTrackingStatement("Filed ticket 1234")).toBe(true);
55
69
  });
56
70
 
57
- test('detects tracking language', () => {
58
- expect(isTransientTrackingStatement('While we wait for CI to pass')).toBe(true);
59
- expect(isTransientTrackingStatement('This PR needs review')).toBe(true);
71
+ test("detects tracking language", () => {
72
+ expect(isTransientTrackingStatement("While we wait for CI to pass")).toBe(
73
+ true,
74
+ );
75
+ expect(isTransientTrackingStatement("This PR needs review")).toBe(true);
60
76
  });
61
77
 
62
- test('does not flag generic time words as transient', () => {
63
- expect(isTransientTrackingStatement('The deadline is today')).toBe(false);
64
- expect(isTransientTrackingStatement('I need this right now')).toBe(false);
78
+ test("does not flag generic time words as transient", () => {
79
+ expect(isTransientTrackingStatement("The deadline is today")).toBe(false);
80
+ expect(isTransientTrackingStatement("I need this right now")).toBe(false);
65
81
  });
66
82
 
67
- test('does not flag durable statements', () => {
68
- expect(isTransientTrackingStatement('Always answer with concise bullet points')).toBe(false);
69
- expect(isTransientTrackingStatement('User prefers dark mode')).toBe(false);
83
+ test("does not flag durable statements", () => {
84
+ expect(
85
+ isTransientTrackingStatement(
86
+ "Always answer with concise bullet points",
87
+ ),
88
+ ).toBe(false);
89
+ expect(isTransientTrackingStatement("User prefers dark mode")).toBe(
90
+ false,
91
+ );
70
92
  });
71
93
 
72
- test('does not false-positive on non-PR URLs', () => {
73
- expect(isTransientTrackingStatement('Visit https://example.com for docs')).toBe(false);
94
+ test("does not false-positive on non-PR URLs", () => {
95
+ expect(
96
+ isTransientTrackingStatement("Visit https://example.com for docs"),
97
+ ).toBe(false);
74
98
  });
75
99
  });
76
100
 
77
- describe('isDurableInstructionStatement', () => {
78
- test('detects durable instruction cues', () => {
79
- expect(isDurableInstructionStatement('Always answer with concise bullet points')).toBe(true);
80
- expect(isDurableInstructionStatement('Never use semicolons in JavaScript')).toBe(true);
81
- expect(isDurableInstructionStatement('Use concise format for status updates')).toBe(true);
82
- expect(isDurableInstructionStatement('The default database is Postgres')).toBe(true);
83
- });
84
-
85
- test('rejects statements without durable cues', () => {
86
- expect(isDurableInstructionStatement('Check the build output')).toBe(false);
87
- expect(isDurableInstructionStatement('Run the migration script')).toBe(false);
101
+ describe("isDurableInstructionStatement", () => {
102
+ test("detects durable instruction cues", () => {
103
+ expect(
104
+ isDurableInstructionStatement(
105
+ "Always answer with concise bullet points",
106
+ ),
107
+ ).toBe(true);
108
+ expect(
109
+ isDurableInstructionStatement("Never use semicolons in JavaScript"),
110
+ ).toBe(true);
111
+ expect(
112
+ isDurableInstructionStatement("Use concise format for status updates"),
113
+ ).toBe(true);
114
+ expect(
115
+ isDurableInstructionStatement("The default database is Postgres"),
116
+ ).toBe(true);
117
+ });
118
+
119
+ test("rejects statements without durable cues", () => {
120
+ expect(isDurableInstructionStatement("Check the build output")).toBe(
121
+ false,
122
+ );
123
+ expect(isDurableInstructionStatement("Run the migration script")).toBe(
124
+ false,
125
+ );
88
126
  });
89
127
  });
90
128
 
91
- describe('isStatementConflictEligible', () => {
92
- test('rejects transient statements for any kind', () => {
93
- expect(isStatementConflictEligible('preference', 'Track PR #5526')).toBe(false);
94
- expect(isStatementConflictEligible('instruction', 'This PR needs review')).toBe(false);
95
- });
96
-
97
- test('accepts durable instruction statements', () => {
98
- expect(isStatementConflictEligible('instruction', 'Always use TypeScript strict mode')).toBe(true);
99
- expect(isStatementConflictEligible('style', 'Default to concise format')).toBe(true);
100
- });
101
-
102
- test('rejects non-durable instruction statements', () => {
103
- expect(isStatementConflictEligible('instruction', 'Run the build first')).toBe(false);
104
- expect(isStatementConflictEligible('style', 'Check the output')).toBe(false);
105
- });
106
-
107
- test('accepts non-transient statements for non-instruction kinds', () => {
108
- expect(isStatementConflictEligible('preference', 'User prefers dark mode')).toBe(true);
109
- expect(isStatementConflictEligible('fact', 'User works at Acme Corp')).toBe(true);
110
- });
111
-
112
- test('rejects kinds not in conflictableKinds when config is provided', () => {
113
- const policyConfig = { conflictableKinds: ['preference', 'profile'] };
114
- expect(isStatementConflictEligible('fact', 'User works at Acme Corp', policyConfig)).toBe(false);
115
- expect(isStatementConflictEligible('preference', 'User prefers dark mode', policyConfig)).toBe(true);
116
- });
117
-
118
- test('skips kind check when config is omitted', () => {
119
- expect(isStatementConflictEligible('fact', 'User works at Acme Corp')).toBe(true);
129
+ describe("isStatementConflictEligible", () => {
130
+ test("rejects transient statements for any kind", () => {
131
+ expect(isStatementConflictEligible("preference", "Track PR #5526")).toBe(
132
+ false,
133
+ );
134
+ expect(
135
+ isStatementConflictEligible("instruction", "This PR needs review"),
136
+ ).toBe(false);
137
+ });
138
+
139
+ test("accepts durable instruction statements", () => {
140
+ expect(
141
+ isStatementConflictEligible(
142
+ "instruction",
143
+ "Always use TypeScript strict mode",
144
+ ),
145
+ ).toBe(true);
146
+ expect(
147
+ isStatementConflictEligible("style", "Default to concise format"),
148
+ ).toBe(true);
149
+ });
150
+
151
+ test("rejects non-durable instruction statements", () => {
152
+ expect(
153
+ isStatementConflictEligible("instruction", "Run the build first"),
154
+ ).toBe(false);
155
+ expect(isStatementConflictEligible("style", "Check the output")).toBe(
156
+ false,
157
+ );
158
+ });
159
+
160
+ test("accepts non-transient statements for non-instruction kinds", () => {
161
+ expect(
162
+ isStatementConflictEligible("preference", "User prefers dark mode"),
163
+ ).toBe(true);
164
+ expect(
165
+ isStatementConflictEligible("fact", "User works at Acme Corp"),
166
+ ).toBe(true);
167
+ });
168
+
169
+ test("rejects kinds not in conflictableKinds when config is provided", () => {
170
+ const policyConfig = { conflictableKinds: ["preference", "profile"] };
171
+ expect(
172
+ isStatementConflictEligible(
173
+ "fact",
174
+ "User works at Acme Corp",
175
+ policyConfig,
176
+ ),
177
+ ).toBe(false);
178
+ expect(
179
+ isStatementConflictEligible(
180
+ "preference",
181
+ "User prefers dark mode",
182
+ policyConfig,
183
+ ),
184
+ ).toBe(true);
185
+ });
186
+
187
+ test("skips kind check when config is omitted", () => {
188
+ expect(
189
+ isStatementConflictEligible("fact", "User works at Acme Corp"),
190
+ ).toBe(true);
120
191
  });
121
192
  });
122
193
  });