@vellumai/assistant 0.4.48 → 0.4.49

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 (252) hide show
  1. package/ARCHITECTURE.md +2 -2
  2. package/README.md +2 -23
  3. package/docs/architecture/integrations.md +45 -41
  4. package/docs/architecture/keychain-broker.md +3 -3
  5. package/docs/runbook-trusted-contacts.md +3 -8
  6. package/hook-templates/debug-prompt-logger/hook.json +1 -1
  7. package/hook-templates/debug-prompt-logger/run.sh +1 -3
  8. package/package.json +1 -1
  9. package/src/__tests__/actor-token-service.test.ts +0 -1
  10. package/src/__tests__/anthropic-provider.test.ts +156 -0
  11. package/src/__tests__/approval-cascade.test.ts +810 -0
  12. package/src/__tests__/approval-primitive.test.ts +0 -1
  13. package/src/__tests__/approval-routes-http.test.ts +2 -0
  14. package/src/__tests__/assistant-attachments.test.ts +12 -34
  15. package/src/__tests__/assistant-feature-flag-guardrails.test.ts +76 -0
  16. package/src/__tests__/assistant-feature-flags-integration.test.ts +0 -1
  17. package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +2 -2
  18. package/src/__tests__/channel-guardian.test.ts +0 -2
  19. package/src/__tests__/channel-readiness-routes.test.ts +15 -6
  20. package/src/__tests__/channel-readiness-service.test.ts +10 -9
  21. package/src/__tests__/checker.test.ts +9 -29
  22. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +1 -1
  23. package/src/__tests__/computer-use-tools.test.ts +2 -19
  24. package/src/__tests__/config-watcher.test.ts +0 -1
  25. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  26. package/src/__tests__/context-image-dimensions.test.ts +332 -0
  27. package/src/__tests__/context-token-estimator.test.ts +196 -13
  28. package/src/__tests__/conversation-attention-store.test.ts +0 -1
  29. package/src/__tests__/conversation-attention-telegram.test.ts +0 -1
  30. package/src/__tests__/conversation-routes-guardian-reply.test.ts +144 -0
  31. package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
  32. package/src/__tests__/credential-metadata-store.test.ts +64 -73
  33. package/src/__tests__/credential-security-invariants.test.ts +13 -7
  34. package/src/__tests__/credential-vault-unit.test.ts +280 -49
  35. package/src/__tests__/credential-vault.test.ts +138 -16
  36. package/src/__tests__/credentials-cli.test.ts +71 -0
  37. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  38. package/src/__tests__/ephemeral-permissions.test.ts +3 -3
  39. package/src/__tests__/gateway-only-guard.test.ts +0 -1
  40. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
  41. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
  42. package/src/__tests__/guardian-routing-invariants.test.ts +0 -1
  43. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
  44. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -39
  45. package/src/__tests__/heartbeat-service.test.ts +0 -1
  46. package/src/__tests__/host-cu-proxy.test.ts +629 -0
  47. package/src/__tests__/host-shell-tool.test.ts +27 -15
  48. package/src/__tests__/http-user-message-parity.test.ts +1 -0
  49. package/src/__tests__/ingress-url-consistency.test.ts +14 -21
  50. package/src/__tests__/integration-status.test.ts +32 -51
  51. package/src/__tests__/intent-routing.test.ts +0 -1
  52. package/src/__tests__/invite-routes-http.test.ts +10 -9
  53. package/src/__tests__/keychain-broker-client.test.ts +11 -43
  54. package/src/__tests__/notification-routing-intent.test.ts +0 -1
  55. package/src/__tests__/oauth-cli.test.ts +373 -14
  56. package/src/__tests__/oauth-provider-profiles.test.ts +9 -9
  57. package/src/__tests__/oauth-scope-policy.test.ts +4 -6
  58. package/src/__tests__/oauth-store.test.ts +756 -0
  59. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
  60. package/src/__tests__/provider-error-scenarios.test.ts +0 -1
  61. package/src/__tests__/provider-streaming.benchmark.test.ts +0 -1
  62. package/src/__tests__/public-ingress-urls.test.ts +15 -21
  63. package/src/__tests__/recording-handler.test.ts +3 -4
  64. package/src/__tests__/registry.test.ts +2 -2
  65. package/src/__tests__/runtime-events-sse.test.ts +55 -7
  66. package/src/__tests__/schedule-store.test.ts +0 -1
  67. package/src/__tests__/scheduler-recurrence.test.ts +0 -1
  68. package/src/__tests__/scoped-approval-grants.test.ts +0 -1
  69. package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
  70. package/src/__tests__/secret-ingress-handler.test.ts +0 -1
  71. package/src/__tests__/send-endpoint-busy.test.ts +21 -6
  72. package/src/__tests__/sequence-store.test.ts +0 -1
  73. package/src/__tests__/session-init.benchmark.test.ts +4 -5
  74. package/src/__tests__/skill-include-graph.test.ts +66 -0
  75. package/src/__tests__/skill-load-feature-flag.test.ts +0 -1
  76. package/src/__tests__/skill-load-tool.test.ts +149 -1
  77. package/src/__tests__/skill-projection-feature-flag.test.ts +0 -1
  78. package/src/__tests__/skills-uninstall.test.ts +1 -1
  79. package/src/__tests__/skills.test.ts +3 -3
  80. package/src/__tests__/slack-channel-config.test.ts +67 -3
  81. package/src/__tests__/slack-share-routes.test.ts +17 -19
  82. package/src/__tests__/system-prompt.test.ts +0 -1
  83. package/src/__tests__/telegram-invite-adapter.test.ts +18 -22
  84. package/src/__tests__/terminal-tools.test.ts +4 -3
  85. package/src/__tests__/test-support/computer-use-skill-harness.ts +3 -2
  86. package/src/__tests__/tool-approval-handler.test.ts +0 -1
  87. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
  88. package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
  89. package/src/__tests__/tool-executor-shell-integration.test.ts +0 -1
  90. package/src/__tests__/tool-executor.test.ts +0 -1
  91. package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
  92. package/src/__tests__/trust-store-pattern-matches.test.ts +29 -0
  93. package/src/__tests__/trust-store.test.ts +1 -22
  94. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  95. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
  96. package/src/__tests__/twilio-routes.test.ts +0 -16
  97. package/src/__tests__/verification-control-plane-policy.test.ts +0 -1
  98. package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
  99. package/src/agent/ax-tree-compaction.test.ts +235 -0
  100. package/src/agent/loop.ts +76 -130
  101. package/src/calls/call-domain.ts +1 -6
  102. package/src/calls/relay-server.ts +9 -13
  103. package/src/calls/twilio-config.ts +2 -7
  104. package/src/calls/twilio-routes.ts +1 -2
  105. package/src/calls/voice-ingress-preflight.ts +1 -1
  106. package/src/cli/commands/browser-relay.ts +18 -12
  107. package/src/cli/commands/completions.ts +0 -3
  108. package/src/cli/commands/credentials.ts +101 -15
  109. package/src/cli/commands/oauth/apps.ts +255 -0
  110. package/src/cli/commands/oauth/connections.ts +299 -0
  111. package/src/cli/commands/oauth/index.ts +52 -0
  112. package/src/cli/commands/oauth/providers.ts +242 -0
  113. package/src/cli/commands/skills.ts +4 -338
  114. package/src/cli/program.ts +1 -5
  115. package/src/cli/reference.ts +1 -3
  116. package/src/config/assistant-feature-flags.ts +0 -3
  117. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +1 -1
  118. package/src/config/bundled-skills/computer-use/SKILL.md +3 -6
  119. package/src/config/bundled-skills/computer-use/TOOLS.json +22 -4
  120. package/src/config/bundled-skills/google-calendar/calendar-client.ts +21 -16
  121. package/src/config/bundled-skills/messaging/tools/shared.ts +1 -4
  122. package/src/config/bundled-skills/settings/SKILL.md +1 -1
  123. package/src/config/bundled-skills/settings/TOOLS.json +2 -8
  124. package/src/config/bundled-skills/settings/tools/voice-config-update.ts +5 -33
  125. package/src/config/env-registry.ts +14 -83
  126. package/src/config/env.ts +11 -50
  127. package/src/config/feature-flag-registry.json +16 -16
  128. package/src/config/loader.ts +0 -6
  129. package/src/config/schema.ts +3 -1
  130. package/src/config/skills.ts +21 -2
  131. package/src/context/image-dimensions.ts +229 -0
  132. package/src/context/token-estimator.ts +75 -12
  133. package/src/context/window-manager.ts +49 -10
  134. package/src/daemon/assistant-attachments.ts +1 -13
  135. package/src/daemon/handlers/config-ingress.ts +8 -33
  136. package/src/daemon/handlers/config-slack-channel.ts +49 -46
  137. package/src/daemon/handlers/config-telegram.ts +32 -16
  138. package/src/daemon/handlers/sessions.ts +10 -24
  139. package/src/daemon/handlers/shared.ts +0 -130
  140. package/src/daemon/host-cu-proxy.ts +401 -0
  141. package/src/daemon/lifecycle.ts +36 -68
  142. package/src/daemon/message-protocol.ts +3 -0
  143. package/src/daemon/message-types/computer-use.ts +2 -119
  144. package/src/daemon/message-types/host-cu.ts +19 -0
  145. package/src/daemon/message-types/messages.ts +3 -0
  146. package/src/daemon/server.ts +14 -21
  147. package/src/daemon/session-agent-loop-handlers.ts +2 -0
  148. package/src/daemon/session-attachments.ts +1 -2
  149. package/src/daemon/session-slash.ts +1 -1
  150. package/src/daemon/session-surfaces.ts +40 -28
  151. package/src/daemon/session-tool-setup.ts +2 -9
  152. package/src/daemon/session.ts +138 -15
  153. package/src/daemon/tool-side-effects.ts +2 -8
  154. package/src/daemon/watch-handler.ts +2 -2
  155. package/src/events/tool-metrics-listener.ts +2 -2
  156. package/src/hooks/manager.ts +1 -4
  157. package/src/inbound/public-ingress-urls.ts +7 -7
  158. package/src/logfire.ts +16 -5
  159. package/src/memory/conversation-key-store.ts +21 -0
  160. package/src/memory/db-init.ts +4 -0
  161. package/src/memory/migrations/149-oauth-tables.ts +60 -0
  162. package/src/memory/migrations/index.ts +1 -0
  163. package/src/memory/schema/index.ts +1 -0
  164. package/src/memory/schema/oauth.ts +65 -0
  165. package/src/messaging/provider.ts +4 -4
  166. package/src/messaging/providers/gmail/client.ts +82 -2
  167. package/src/messaging/providers/gmail/people-client.ts +10 -10
  168. package/src/messaging/providers/telegram-bot/adapter.ts +17 -17
  169. package/src/messaging/providers/whatsapp/adapter.ts +11 -8
  170. package/src/messaging/registry.ts +2 -32
  171. package/src/notifications/copy-composer.ts +0 -5
  172. package/src/notifications/signal.ts +4 -5
  173. package/src/oauth/byo-connection.test.ts +126 -25
  174. package/src/oauth/byo-connection.ts +22 -6
  175. package/src/oauth/connect-orchestrator.ts +113 -57
  176. package/src/oauth/connect-types.ts +17 -23
  177. package/src/oauth/connection-resolver.ts +35 -11
  178. package/src/oauth/connection.ts +1 -1
  179. package/src/oauth/manual-token-connection.ts +104 -0
  180. package/src/oauth/oauth-store.ts +496 -0
  181. package/src/oauth/platform-connection.test.ts +29 -0
  182. package/src/oauth/platform-connection.ts +6 -5
  183. package/src/oauth/provider-behaviors.ts +124 -0
  184. package/src/oauth/scope-policy.ts +9 -2
  185. package/src/oauth/seed-providers.ts +161 -0
  186. package/src/oauth/token-persistence.ts +74 -78
  187. package/src/permissions/checker.ts +3 -3
  188. package/src/permissions/defaults.ts +0 -1
  189. package/src/permissions/prompter.ts +10 -1
  190. package/src/permissions/trust-store.ts +13 -0
  191. package/src/prompts/__tests__/build-cli-reference-section.test.ts +3 -1
  192. package/src/prompts/system-prompt.ts +28 -40
  193. package/src/providers/anthropic/client.ts +133 -24
  194. package/src/providers/retry.ts +1 -27
  195. package/src/runtime/auth/route-policy.ts +0 -3
  196. package/src/runtime/channel-reply-delivery.ts +0 -40
  197. package/src/runtime/gateway-client.ts +0 -7
  198. package/src/runtime/http-server.ts +8 -6
  199. package/src/runtime/http-types.ts +2 -2
  200. package/src/runtime/middleware/twilio-validation.ts +1 -11
  201. package/src/runtime/pending-interactions.ts +14 -12
  202. package/src/runtime/routes/channel-delivery-routes.ts +0 -1
  203. package/src/runtime/routes/conversation-routes.ts +73 -19
  204. package/src/runtime/routes/events-routes.ts +21 -11
  205. package/src/runtime/routes/host-cu-routes.ts +97 -0
  206. package/src/runtime/routes/inbound-stages/background-dispatch.ts +12 -111
  207. package/src/runtime/routes/integrations/slack/share.ts +6 -7
  208. package/src/runtime/routes/log-export-routes.ts +126 -8
  209. package/src/runtime/routes/settings-routes.ts +55 -48
  210. package/src/runtime/routes/surface-action-routes.ts +1 -1
  211. package/src/runtime/routes/watch-routes.ts +128 -0
  212. package/src/schedule/integration-status.ts +10 -9
  213. package/src/security/credential-key.ts +0 -156
  214. package/src/security/keychain-broker-client.ts +5 -6
  215. package/src/security/oauth2.ts +1 -1
  216. package/src/security/token-manager.ts +119 -46
  217. package/src/skills/catalog-install.ts +358 -0
  218. package/src/skills/include-graph.ts +32 -0
  219. package/src/telegram/bot-username.ts +2 -3
  220. package/src/tools/browser/network-recorder.ts +1 -1
  221. package/src/tools/browser/network-recording-types.ts +1 -1
  222. package/src/tools/computer-use/definitions.ts +46 -11
  223. package/src/tools/computer-use/registry.ts +4 -5
  224. package/src/tools/credentials/broker.ts +1 -2
  225. package/src/tools/credentials/metadata-store.ts +17 -121
  226. package/src/tools/credentials/vault.ts +94 -167
  227. package/src/tools/registry.ts +2 -7
  228. package/src/tools/skills/load.ts +62 -3
  229. package/src/tools/watch/watch-state.ts +0 -12
  230. package/src/util/logger.ts +7 -41
  231. package/src/util/platform.ts +9 -28
  232. package/src/watcher/providers/google-calendar.ts +2 -1
  233. package/src/__tests__/computer-use-session-compaction.test.ts +0 -143
  234. package/src/__tests__/computer-use-session-lifecycle.test.ts +0 -322
  235. package/src/__tests__/computer-use-session-working-dir.test.ts +0 -166
  236. package/src/__tests__/computer-use-skill-baseline.test.ts +0 -78
  237. package/src/__tests__/computer-use-skill-endstate.test.ts +0 -105
  238. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +0 -249
  239. package/src/__tests__/ride-shotgun-handler.test.ts +0 -452
  240. package/src/cli/commands/dev.ts +0 -129
  241. package/src/cli/commands/map.ts +0 -391
  242. package/src/cli/commands/oauth.ts +0 -77
  243. package/src/config/bundled-skills/computer-use/tools/computer-use-request-control.ts +0 -16
  244. package/src/daemon/computer-use-session.ts +0 -1026
  245. package/src/daemon/ride-shotgun-handler.ts +0 -569
  246. package/src/oauth/provider-base-urls.ts +0 -21
  247. package/src/oauth/provider-profiles.ts +0 -192
  248. package/src/prompts/computer-use-prompt.ts +0 -98
  249. package/src/runtime/routes/computer-use-routes.ts +0 -641
  250. package/src/runtime/telegram-streaming-delivery.test.ts +0 -729
  251. package/src/runtime/telegram-streaming-delivery.ts +0 -393
  252. package/src/tools/computer-use/request-computer-control.ts +0 -56
@@ -164,6 +164,26 @@ mock.module("../tools/credentials/metadata-store.js", () => ({
164
164
  },
165
165
  }));
166
166
 
167
+ // ---------------------------------------------------------------------------
168
+ // Mock oauth-store
169
+ // ---------------------------------------------------------------------------
170
+
171
+ let disconnectOAuthProviderCalls: string[] = [];
172
+ let disconnectOAuthProviderResult: "disconnected" | "not-found" | "error" =
173
+ "not-found";
174
+
175
+ mock.module("../oauth/oauth-store.js", () => ({
176
+ disconnectOAuthProvider: async (
177
+ providerKey: string,
178
+ ): Promise<"disconnected" | "not-found" | "error"> => {
179
+ disconnectOAuthProviderCalls.push(providerKey);
180
+ return disconnectOAuthProviderResult;
181
+ },
182
+ getConnectionByProvider: (): undefined => undefined,
183
+ listConnections: (): never[] => [],
184
+ deleteConnection: (): boolean => false,
185
+ }));
186
+
167
187
  // ---------------------------------------------------------------------------
168
188
  // Import the module under test (after mocks are registered)
169
189
  // ---------------------------------------------------------------------------
@@ -281,6 +301,8 @@ describe("assistant credentials CLI", () => {
281
301
  _listMetadataCalls = 0;
282
302
  _getMetadataCalls = 0;
283
303
  _getMetadataByIdCalls = 0;
304
+ disconnectOAuthProviderCalls = [];
305
+ disconnectOAuthProviderResult = "not-found";
284
306
  process.exitCode = 0;
285
307
  });
286
308
 
@@ -611,6 +633,55 @@ describe("assistant credentials CLI", () => {
611
633
  ),
612
634
  ).toBeUndefined();
613
635
  });
636
+
637
+ test("calls disconnectOAuthProvider for OAuth cleanup", async () => {
638
+ seedCredential("gmail", "access_token", "ya29.token_value");
639
+
640
+ const result = await runCli(["delete", "gmail:access_token", "--json"]);
641
+ expect(result.exitCode).toBe(0);
642
+ const parsed = JSON.parse(result.stdout);
643
+ expect(parsed.ok).toBe(true);
644
+
645
+ // disconnectOAuthProvider should have been called with the service name
646
+ expect(disconnectOAuthProviderCalls).toEqual(["gmail"]);
647
+ });
648
+
649
+ test("succeeds when only OAuth connection exists (no legacy credential)", async () => {
650
+ // No legacy credential seeded — only the OAuth disconnect finds something
651
+ disconnectOAuthProviderResult = "disconnected";
652
+
653
+ const result = await runCli(["delete", "gmail:access_token", "--json"]);
654
+ expect(result.exitCode).toBe(0);
655
+ const parsed = JSON.parse(result.stdout);
656
+ expect(parsed.ok).toBe(true);
657
+ expect(parsed.service).toBe("gmail");
658
+ expect(parsed.field).toBe("access_token");
659
+
660
+ expect(disconnectOAuthProviderCalls).toEqual(["gmail"]);
661
+ });
662
+
663
+ test("demonstrates colon-in-service-name parsing limitation with integration:gmail", async () => {
664
+ // parseCredentialName("integration:gmail:access_token") splits on the
665
+ // first colon, yielding service="integration" and field="gmail:access_token".
666
+ // This is incorrect for the intended service "integration:gmail". The fix
667
+ // for this limitation is addressed by introducing a dedicated `disconnect`
668
+ // subcommand (PR 5).
669
+ const result = await runCli([
670
+ "delete",
671
+ "integration:gmail:access_token",
672
+ "--json",
673
+ ]);
674
+ // The command parses as service="integration", field="gmail:access_token"
675
+ // which finds nothing and reports not-found.
676
+ expect(result.exitCode).toBe(1);
677
+ const parsed = JSON.parse(result.stdout);
678
+ expect(parsed.ok).toBe(false);
679
+ expect(parsed.error).toContain("not found");
680
+
681
+ // disconnectOAuthProvider was called with "integration" (wrong) instead
682
+ // of "integration:gmail" (intended).
683
+ expect(disconnectOAuthProviderCalls).toEqual(["integration"]);
684
+ });
614
685
  });
615
686
 
616
687
  // =========================================================================
@@ -46,7 +46,6 @@ mock.module("../util/logger.js", () => ({
46
46
  ...realLogger,
47
47
  getLogger: () => noopLogger,
48
48
  getCliLogger: () => noopLogger,
49
- isDebug: () => false,
50
49
  truncateForLog: (v: string) => v,
51
50
  initLogger: () => {},
52
51
  pruneOldLogFiles: () => 0,
@@ -328,11 +328,11 @@ describe("ephemeral-permissions", () => {
328
328
  testConfig.permissions.mode = "workspace";
329
329
  });
330
330
 
331
- test("workspace mode auto-allows workspace-scoped file_write (medium risk)", async () => {
331
+ test("workspace mode prompts for workspace-scoped file_write (medium risk)", async () => {
332
332
  const filePath = join(testDir, "workspace-test-file.txt");
333
333
  const result = await check("file_write", { path: filePath }, testDir);
334
- expect(result.decision).toBe("allow");
335
- expect(result.reason).toContain("Workspace mode");
334
+ expect(result.decision).toBe("prompt");
335
+ expect(result.reason).toContain("medium risk");
336
336
  });
337
337
 
338
338
  test("workspace mode still prompts for file_write outside workspace", async () => {
@@ -37,7 +37,6 @@ const ALLOWLIST = new Set([
37
37
  // --- Documentation and comments that mention the port for explanatory purposes ---
38
38
  "AGENTS.md", // documents the gateway-only rule itself
39
39
  "ARCHITECTURE.md", // architecture overview with port references
40
- "assistant/docs/runbook-trusted-contacts.md", // operator runbook targeting runtime-only /v1/contacts endpoints
41
40
  "assistant/src/runtime/middleware/twilio-validation.ts", // comment explaining proxy URL rewriting
42
41
  ]);
43
42
 
@@ -35,7 +35,6 @@ mock.module("../util/logger.js", () => ({
35
35
  new Proxy({} as Record<string, unknown>, {
36
36
  get: () => () => {},
37
37
  }),
38
- isDebug: () => false,
39
38
  truncateForLog: (value: string) => value,
40
39
  }));
41
40
 
@@ -21,7 +21,6 @@ mock.module("../util/logger.js", () => ({
21
21
  new Proxy({} as Record<string, unknown>, {
22
22
  get: () => () => {},
23
23
  }),
24
- isDebug: () => false,
25
24
  truncateForLog: (value: string) => value,
26
25
  }));
27
26
 
@@ -42,7 +42,6 @@ mock.module("../util/logger.js", () => ({
42
42
  new Proxy({} as Record<string, unknown>, {
43
43
  get: () => () => {},
44
44
  }),
45
- isDebug: () => false,
46
45
  truncateForLog: (value: string) => value,
47
46
  }));
48
47
 
@@ -57,7 +57,6 @@ mock.module("../security/secure-keys.js", () => ({
57
57
 
58
58
  mock.module("../config/env.js", () => ({
59
59
  isHttpAuthDisabled: () => true,
60
- getTwilioUserPhoneNumber: () => null,
61
60
  }));
62
61
 
63
62
  mock.module("../inbound/public-ingress-urls.js", () => ({
@@ -147,7 +147,6 @@ import { handleConfirmationResponse } from "../daemon/handlers/sessions.js";
147
147
 
148
148
  interface TestSession {
149
149
  messages: Array<{ role: string; content: unknown[] }>;
150
- hasEscalationHandler: () => boolean;
151
150
  setChannelCapabilities: (caps: unknown) => void;
152
151
  isProcessing: () => boolean;
153
152
  hasPendingConfirmation: (requestId: string) => boolean;
@@ -181,8 +180,6 @@ function createContext(session: TestSession): {
181
180
  const sent: ServerMessage[] = [];
182
181
  const ctx: HandlerContext = {
183
182
  sessions: new Map(),
184
- cuSessions: new Map(),
185
- cuObservationParseSequence: new Map(),
186
183
  sharedRequestTimestamps: [],
187
184
  debounceTimers: new DebouncerMap({ defaultDelayMs: 100 }),
188
185
  suppressConfigReload: false,
@@ -202,7 +199,6 @@ function createContext(session: TestSession): {
202
199
  function makeSession(overrides: Partial<TestSession> = {}): TestSession {
203
200
  return {
204
201
  messages: [],
205
- hasEscalationHandler: () => true,
206
202
  setChannelCapabilities: () => {},
207
203
  isProcessing: () => false,
208
204
  hasPendingConfirmation: () => true,
@@ -277,39 +273,4 @@ describe("handleConfirmationResponse canonical status sync", () => {
277
273
  );
278
274
  expect(resolveMock).toHaveBeenCalledWith("req-confirm-allow");
279
275
  });
280
-
281
- test("syncs canonical status to denied for deny decisions in CU sessions", () => {
282
- const cuSession = {
283
- hasPendingConfirmation: (requestId: string) =>
284
- requestId === "req-confirm-deny",
285
- handleConfirmationResponse: mock(() => {}),
286
- };
287
- const { ctx } = createContext(
288
- makeSession({
289
- hasPendingConfirmation: () => false,
290
- }),
291
- );
292
- ctx.cuSessions.set("cu-1", cuSession as any);
293
-
294
- const msg: ConfirmationResponse = {
295
- type: "confirmation_response",
296
- requestId: "req-confirm-deny",
297
- decision: "always_deny",
298
- };
299
-
300
- handleConfirmationResponse(msg, ctx);
301
-
302
- expect(
303
- (cuSession.handleConfirmationResponse as any).mock.calls.length,
304
- ).toBe(1);
305
- expect((cuSession.handleConfirmationResponse as any).mock.calls[0]).toEqual(
306
- ["req-confirm-deny", "always_deny", undefined, undefined],
307
- );
308
- expect(resolveCanonicalGuardianRequestMock).toHaveBeenCalledWith(
309
- "req-confirm-deny",
310
- "pending",
311
- { status: "denied" },
312
- );
313
- expect(resolveMock).toHaveBeenCalledWith("req-confirm-deny");
314
- });
315
276
  });
@@ -67,7 +67,6 @@ mock.module("../util/logger.js", () => ({
67
67
  warn: () => {},
68
68
  error: () => {},
69
69
  }),
70
- isDebug: () => false,
71
70
  }));
72
71
 
73
72
  // Mock conversation title service