@vellumai/assistant 0.10.12-dev.202607250140.9979030 → 0.10.12-staging.2

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 (255) hide show
  1. package/README.md +1 -1
  2. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +0 -1
  3. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +0 -1
  4. package/node_modules/@vellumai/service-contracts/package.json +0 -1
  5. package/openapi.yaml +4 -14
  6. package/package.json +1 -1
  7. package/src/__tests__/acp-session.test.ts +3 -3
  8. package/src/__tests__/approval-cascade.test.ts +5 -5
  9. package/src/__tests__/approval-routes-http.test.ts +3 -3
  10. package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +16 -16
  11. package/src/__tests__/assistant-event-hub-targeted.test.ts +11 -13
  12. package/src/__tests__/assistant-event-hub.test.ts +11 -13
  13. package/src/__tests__/assistant-event.test.ts +9 -12
  14. package/src/__tests__/assistant-id-boundary-guard.test.ts +58 -0
  15. package/src/__tests__/assistant-stream-state.test.ts +3 -5
  16. package/src/__tests__/avatar-identity-sync.test.ts +3 -3
  17. package/src/__tests__/channel-approvals.test.ts +27 -0
  18. package/src/__tests__/channel-guardian.test.ts +512 -85
  19. package/src/__tests__/channel-readiness-slack-remote.test.ts +3 -151
  20. package/src/__tests__/channel-setup-panel-ack.test.ts +9 -12
  21. package/src/__tests__/chat-reveal-guard-priming.test.ts +28 -28
  22. package/src/__tests__/compaction-events.test.ts +8 -8
  23. package/src/__tests__/config-loader-backfill.test.ts +5 -4
  24. package/src/__tests__/config-loader-platform-defaults.test.ts +28 -54
  25. package/src/__tests__/config-model-image-provider.test.ts +0 -20
  26. package/src/__tests__/config-schema.test.ts +1 -12
  27. package/src/__tests__/config-set-platform-guard.test.ts +12 -11
  28. package/src/__tests__/config-sounds-sync.test.ts +4 -4
  29. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +2 -2
  30. package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +3 -3
  31. package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +4 -4
  32. package/src/__tests__/conversation-agent-loop-overflow.test.ts +12 -12
  33. package/src/__tests__/conversation-agent-loop.test.ts +29 -29
  34. package/src/__tests__/conversation-confirmation-signals.test.ts +14 -14
  35. package/src/__tests__/conversation-history-web-search.test.ts +1 -1
  36. package/src/__tests__/conversation-key-store-disk-view.test.ts +5 -5
  37. package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +4 -4
  38. package/src/__tests__/conversation-message-sync-tags.test.ts +4 -4
  39. package/src/__tests__/conversation-queue.test.ts +81 -81
  40. package/src/__tests__/conversation-runtime-assembly.test.ts +0 -27
  41. package/src/__tests__/conversation-slash-queue.test.ts +11 -11
  42. package/src/__tests__/conversation-slash-unknown.test.ts +2 -2
  43. package/src/__tests__/conversation-speed-override.test.ts +2 -2
  44. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +16 -18
  45. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +17 -17
  46. package/src/__tests__/conversation-surfaces-app-open.test.ts +4 -7
  47. package/src/__tests__/conversation-surfaces-data-persist.test.ts +7 -7
  48. package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +9 -9
  49. package/src/__tests__/conversation-surfaces-standalone.test.ts +12 -12
  50. package/src/__tests__/conversation-surfaces-state-update.test.ts +5 -8
  51. package/src/__tests__/conversation-surfaces-table-action.test.ts +3 -6
  52. package/src/__tests__/conversation-surfaces-task-progress.test.ts +46 -46
  53. package/src/__tests__/conversation-sync-tags.test.ts +5 -5
  54. package/src/__tests__/conversation-wait-for-idle.test.ts +2 -2
  55. package/src/__tests__/daemon-assistant-events.test.ts +15 -15
  56. package/src/__tests__/emit-event-signal.test.ts +6 -6
  57. package/src/__tests__/events-tail-route.test.ts +4 -6
  58. package/src/__tests__/helpers/native-web-search-harness.ts +10 -10
  59. package/src/__tests__/host-browser-proxy.test.ts +1 -1
  60. package/src/__tests__/host-transfer-pending-interactions.test.ts +8 -8
  61. package/src/__tests__/image-credentials.test.ts +8 -65
  62. package/src/__tests__/list-messages-page-latest.test.ts +2 -2
  63. package/src/__tests__/log-redact.test.ts +0 -18
  64. package/src/__tests__/managed-profile-guard.test.ts +0 -27
  65. package/src/__tests__/media-generate-image.test.ts +11 -62
  66. package/src/__tests__/memory-retrieval-hook.test.ts +4 -4
  67. package/src/__tests__/notification-deep-link.test.ts +12 -12
  68. package/src/__tests__/notification-vellum-adapter.test.ts +8 -8
  69. package/src/__tests__/outbound-slack-persistence.test.ts +8 -8
  70. package/src/__tests__/pending-interactions-resolved-event.test.ts +6 -6
  71. package/src/__tests__/plugin-event-hub-facade.test.ts +15 -18
  72. package/src/__tests__/provider-platform-proxy-integration.test.ts +1 -0
  73. package/src/__tests__/request-secret-standalone-channel-gate.test.ts +3 -3
  74. package/src/__tests__/runtime-events-sse-parity.test.ts +10 -10
  75. package/src/__tests__/runtime-events-sse.test.ts +1 -1
  76. package/src/__tests__/schedule-routes.test.ts +2 -2
  77. package/src/__tests__/schedule-store.test.ts +3 -3
  78. package/src/__tests__/secret-patterns.test.ts +27 -0
  79. package/src/__tests__/secret-prompt-log-hygiene.test.ts +3 -3
  80. package/src/__tests__/secret-prompter-channel-fallback.test.ts +3 -3
  81. package/src/__tests__/secret-response-routing.test.ts +3 -3
  82. package/src/__tests__/secret-scanner.test.ts +0 -36
  83. package/src/__tests__/send-endpoint-busy.test.ts +7 -7
  84. package/src/__tests__/starter-task-flow.test.ts +3 -6
  85. package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
  86. package/src/__tests__/subagent-disposal.test.ts +10 -10
  87. package/src/__tests__/subagent-fork-notifications.test.ts +4 -4
  88. package/src/__tests__/subagent-fork-prompt-role.test.ts +3 -3
  89. package/src/__tests__/subagent-fork-spawn.test.ts +4 -4
  90. package/src/__tests__/subagent-manager-notify.test.ts +10 -10
  91. package/src/__tests__/subagent-spawn-and-await.test.ts +13 -13
  92. package/src/__tests__/sync-message-contract.test.ts +3 -3
  93. package/src/__tests__/tool-preview-lifecycle.test.ts +28 -28
  94. package/src/__tests__/tool-result-metadata-plumbing.test.ts +5 -5
  95. package/src/__tests__/tool-start-timestamp.test.ts +4 -4
  96. package/src/__tests__/ui-choice-copy-surfaces.test.ts +13 -13
  97. package/src/__tests__/ui-work-result-surface.test.ts +3 -3
  98. package/src/__tests__/voice-scoped-grant-consumer.test.ts +6 -6
  99. package/src/__tests__/voice-session-bridge.test.ts +44 -44
  100. package/src/acp/__tests__/client-handler.test.ts +3 -3
  101. package/src/acp/__tests__/session-manager-persistence.test.ts +10 -10
  102. package/src/acp/__tests__/session-manager-resume.test.ts +7 -7
  103. package/src/acp/client-handler.ts +3 -3
  104. package/src/acp/session-manager.ts +8 -8
  105. package/src/api/events/subagent-event.ts +2 -2
  106. package/src/calls/call-controller.ts +27 -27
  107. package/src/calls/voice-session-bridge.ts +7 -7
  108. package/src/cli/commands/config.ts +8 -23
  109. package/src/cli/lib/bundled-marketplace.json +0 -12
  110. package/src/cli.ts +109 -2
  111. package/src/config/__tests__/default-profile-catalog.test.ts +0 -9
  112. package/src/config/__tests__/deployment-context-defaults.test.ts +0 -9
  113. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +7 -13
  114. package/src/config/default-profile-catalog.ts +1 -1
  115. package/src/config/feature-flag-registry.json +0 -8
  116. package/src/config/loader.ts +1 -7
  117. package/src/config/raw-config-utils.ts +1 -1
  118. package/src/config/schemas/__tests__/memory-v3.test.ts +0 -1
  119. package/src/config/schemas/memory-v3.ts +0 -8
  120. package/src/config/schemas/services.ts +2 -10
  121. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +3 -3
  122. package/src/daemon/__tests__/native-web-search-metadata.test.ts +5 -5
  123. package/src/daemon/__tests__/web-search-status-text.test.ts +2 -2
  124. package/src/daemon/channel-ui-capability.ts +0 -23
  125. package/src/daemon/conversation-agent-loop-handlers.ts +3 -3
  126. package/src/daemon/conversation-agent-loop.ts +4 -4
  127. package/src/daemon/conversation-messaging.ts +14 -14
  128. package/src/daemon/conversation-notifiers.ts +2 -2
  129. package/src/daemon/conversation-process.ts +4 -4
  130. package/src/daemon/conversation-queue-manager.ts +7 -7
  131. package/src/daemon/conversation-runtime-assembly.ts +0 -11
  132. package/src/daemon/conversation-surfaces.ts +4 -4
  133. package/src/daemon/conversation-tool-setup.ts +3 -3
  134. package/src/daemon/conversation-usage.ts +11 -11
  135. package/src/daemon/conversation.ts +11 -11
  136. package/src/daemon/handlers/config-channels.ts +134 -40
  137. package/src/daemon/handlers/config-model.ts +7 -15
  138. package/src/daemon/host-proxy-base.ts +4 -4
  139. package/src/daemon/message-protocol.ts +143 -16
  140. package/src/daemon/message-types/acp.ts +20 -0
  141. package/src/daemon/message-types/apps.ts +11 -0
  142. package/src/daemon/message-types/background-tools.ts +14 -0
  143. package/src/daemon/message-types/bookmarks.ts +13 -0
  144. package/src/daemon/message-types/computer-use.ts +12 -0
  145. package/src/daemon/message-types/contacts.ts +13 -0
  146. package/src/daemon/message-types/conversations.ts +345 -9
  147. package/src/daemon/message-types/document-comments.ts +14 -0
  148. package/src/daemon/message-types/documents.ts +13 -0
  149. package/src/daemon/message-types/home.ts +15 -0
  150. package/src/daemon/message-types/host-app-control.ts +9 -0
  151. package/src/daemon/message-types/host-bash.ts +12 -0
  152. package/src/daemon/message-types/host-browser.ts +7 -0
  153. package/src/daemon/message-types/host-cu.ts +10 -0
  154. package/src/daemon/message-types/host-file.ts +12 -0
  155. package/src/daemon/message-types/host-transfer.ts +12 -0
  156. package/src/daemon/message-types/host-ui-snapshot.ts +7 -0
  157. package/src/daemon/message-types/integrations.ts +90 -0
  158. package/src/daemon/message-types/memory.ts +10 -0
  159. package/src/daemon/message-types/messages.ts +48 -0
  160. package/src/daemon/message-types/notifications.ts +7 -0
  161. package/src/daemon/message-types/schedules.ts +14 -0
  162. package/src/daemon/message-types/settings.ts +17 -0
  163. package/src/daemon/message-types/skills.ts +5 -0
  164. package/src/daemon/message-types/subagents.ts +63 -0
  165. package/src/daemon/message-types/surfaces.ts +9 -0
  166. package/src/daemon/message-types/sync.ts +2 -0
  167. package/src/daemon/message-types/upgrades.ts +14 -0
  168. package/src/daemon/message-types/workflows.ts +25 -0
  169. package/src/daemon/message-types/workspace.ts +137 -0
  170. package/src/daemon/process-message.ts +5 -5
  171. package/src/daemon/tool-side-effects.ts +10 -10
  172. package/src/daemon/wake-conversation-ops.ts +4 -4
  173. package/src/ipc/routes/__tests__/conversation-sync-ipc-routes.test.ts +2 -2
  174. package/src/ipc/routes/events-ipc-routes.ts +3 -3
  175. package/src/media/app-icon-generator.ts +8 -15
  176. package/src/media/avatar-router.ts +5 -9
  177. package/src/media/image-credentials.ts +10 -42
  178. package/src/media/image-service.ts +13 -1
  179. package/src/media/types.ts +3 -26
  180. package/src/notifications/adapters/macos.ts +3 -3
  181. package/src/oauth/AGENTS.md +1 -1
  182. package/src/permissions/confirmation-guardian-request.test.ts +2 -2
  183. package/src/permissions/confirmation-guardian-request.ts +2 -2
  184. package/src/permissions/prompter.ts +5 -5
  185. package/src/permissions/question-prompter.test.ts +8 -8
  186. package/src/permissions/secret-prompter.ts +2 -2
  187. package/src/plugin-api/conversation-turn.ts +4 -4
  188. package/src/plugin-api/event-hub-facade.ts +4 -6
  189. package/src/plugin-api/index.ts +4 -17
  190. package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +28 -28
  191. package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +2 -180
  192. package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +0 -3
  193. package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +0 -1
  194. package/src/plugins/defaults/memory/v3/__tests__/tuning-profile.test.ts +0 -1
  195. package/src/plugins/defaults/memory/v3/orchestrate.ts +15 -97
  196. package/src/plugins/defaults/memory/v3/shadow-plugin.ts +0 -1
  197. package/src/plugins/defaults/memory/v3/tuning-profile.ts +0 -3
  198. package/src/plugins/defaults/memory/v3/types.ts +1 -4
  199. package/src/plugins/defaults/platform-hosted/__tests__/reengage.test.ts +12 -104
  200. package/src/plugins/defaults/platform-hosted/routes/reengage.ts +12 -104
  201. package/src/plugins/types.ts +2 -2
  202. package/src/providers/__tests__/registry-native-web-search.test.ts +1 -0
  203. package/src/providers/anthropic/client.ts +9 -11
  204. package/src/providers/inference/connections.ts +14 -30
  205. package/src/providers/model-catalog.ts +0 -51
  206. package/src/providers/registry.ts +1 -0
  207. package/src/runtime/assistant-event-hub.ts +18 -18
  208. package/src/runtime/assistant-event.ts +11 -23
  209. package/src/runtime/assistant-stream-state.ts +4 -4
  210. package/src/runtime/channel-approvals.ts +25 -0
  211. package/src/runtime/channel-readiness-service.ts +7 -105
  212. package/src/runtime/channel-retry-sweep.ts +2 -2
  213. package/src/runtime/http-types.ts +2 -2
  214. package/src/runtime/routes/acp-routes.ts +2 -2
  215. package/src/runtime/routes/canned-message-complete.ts +2 -2
  216. package/src/runtime/routes/conversation-query-routes.ts +6 -35
  217. package/src/runtime/routes/conversation-routes.ts +2 -8
  218. package/src/runtime/routes/guardian-approval-prompt.ts +2 -2
  219. package/src/runtime/routes/image-generation-routes.ts +9 -12
  220. package/src/runtime/routes/inbound-stages/background-dispatch.ts +4 -4
  221. package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +7 -7
  222. package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +5 -5
  223. package/src/runtime/routes/workspace-routes.test.ts +2 -2
  224. package/src/runtime/slack-reply-session.test.ts +12 -12
  225. package/src/runtime/slack-reply-session.ts +17 -17
  226. package/src/runtime/sync/sync-publisher.test.ts +5 -7
  227. package/src/security/AGENTS.md +1 -1
  228. package/src/security/credential-key.ts +0 -17
  229. package/src/security/secret-ingress.ts +105 -14
  230. package/src/security/secret-patterns.ts +139 -8
  231. package/src/security/secret-scanner.ts +3 -8
  232. package/src/signals/emit-event.ts +3 -3
  233. package/src/signals/event-stream.ts +5 -5
  234. package/src/subagent/manager.ts +15 -15
  235. package/src/tools/acp/context.ts +5 -5
  236. package/src/tools/browser/browser-screencast.ts +6 -6
  237. package/src/tools/subagent/spawn.ts +3 -3
  238. package/src/util/log-redact.ts +3 -7
  239. package/src/workflows/leaf-runner.ts +5 -5
  240. package/src/workspace/migrations/registry.ts +0 -2
  241. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +0 -449
  242. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +0 -468
  243. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +0 -449
  244. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +0 -468
  245. package/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +0 -449
  246. package/node_modules/@vellumai/service-contracts/src/secret-detection.ts +0 -468
  247. package/src/__tests__/slack-required-scopes-mirror.test.ts +0 -81
  248. package/src/__tests__/workspace-migration-134-image-generation-mode-to-provider.test.ts +0 -284
  249. package/src/daemon/__tests__/channel-ui-capability.test.ts +0 -26
  250. package/src/plugin-api/__tests__/publish-event.test.ts +0 -54
  251. package/src/plugin-api/publish-event.ts +0 -39
  252. package/src/plugins/defaults/memory/v3/span-query.test.ts +0 -86
  253. package/src/plugins/defaults/memory/v3/span-query.ts +0 -71
  254. package/src/providers/inference/__tests__/connections-credential-normalize.test.ts +0 -87
  255. package/src/workspace/migrations/134-image-generation-mode-to-provider.ts +0 -128
package/README.md CHANGED
@@ -145,7 +145,7 @@ All approval prompt delivery paths use a **fail-closed** policy -- if the prompt
145
145
 
146
146
  ### Plain-Text Fallback for Non-Rich Channels
147
147
 
148
- Channels that do not support rich inline approval UI (e.g., inline keyboards) receive plain-text instructions embedded in the message body. The `supportsInlineOptions` channel capability (`channelSupportsInlineOptions()`) determines whether to send the structured `promptText` (for channels whose adapter renders inline buttons like Telegram) or the `plainTextFallback` string (for all other channels). The fallback text includes instructions so the user can respond via text; the conversational approval engine then classifies the free-text response.
148
+ Channels that do not support rich inline approval UI (e.g., inline keyboards) receive plain-text instructions embedded in the message body. The `channelSupportsRichApprovalUI()` check determines whether to send the structured `promptText` (for rich channels like Telegram) or the `plainTextFallback` string (for all other channels). The fallback text includes instructions so the user can respond via text; the conversational approval engine then classifies the free-text response.
149
149
 
150
150
  ### Key modules
151
151
 
@@ -17,7 +17,6 @@
17
17
  "./rpc": "./src/rpc.ts",
18
18
  "./attachment-naming": "./src/attachment-naming.ts",
19
19
  "./redacted-credential": "./src/redacted-credential.ts",
20
- "./secret-detection": "./src/secret-detection.ts",
21
20
  "./error": "./src/error.ts"
22
21
  },
23
22
  "scripts": {
@@ -17,7 +17,6 @@
17
17
  "./rpc": "./src/rpc.ts",
18
18
  "./attachment-naming": "./src/attachment-naming.ts",
19
19
  "./redacted-credential": "./src/redacted-credential.ts",
20
- "./secret-detection": "./src/secret-detection.ts",
21
20
  "./error": "./src/error.ts"
22
21
  },
23
22
  "scripts": {
@@ -17,7 +17,6 @@
17
17
  "./rpc": "./src/rpc.ts",
18
18
  "./attachment-naming": "./src/attachment-naming.ts",
19
19
  "./redacted-credential": "./src/redacted-credential.ts",
20
- "./secret-detection": "./src/secret-detection.ts",
21
20
  "./error": "./src/error.ts"
22
21
  },
23
22
  "scripts": {
package/openapi.yaml CHANGED
@@ -19356,12 +19356,6 @@ paths:
19356
19356
  - low
19357
19357
  - medium
19358
19358
  - high
19359
- bypassSecretCheck:
19360
- description:
19361
- When true, skip the secret-ingress scan for this message only. Set exclusively when the user explicitly
19362
- confirms a client-side blocked send (the composer's "Send anyway" action); it is per-message and
19363
- never persisted.
19364
- type: boolean
19365
19359
  hidden:
19366
19360
  description:
19367
19361
  "When true, persist the user message but suppress it from the UI transcript (it stays in LLM-side history
@@ -32459,10 +32453,8 @@ components:
32459
32453
  anyOf:
32460
32454
  - type: object
32461
32455
  properties:
32462
- provider:
32463
- type: string
32464
- model:
32465
- type: string
32456
+ mode:
32457
+ $ref: "#/components/schemas/ServiceMode"
32466
32458
  additionalProperties: {}
32467
32459
  - type: "null"
32468
32460
  inference:
@@ -33273,10 +33265,8 @@ components:
33273
33265
  image-generation:
33274
33266
  type: object
33275
33267
  properties:
33276
- provider:
33277
- type: string
33278
- model:
33279
- type: string
33268
+ mode:
33269
+ $ref: "#/components/schemas/ServiceMode"
33280
33270
  additionalProperties: {}
33281
33271
  inference:
33282
33272
  type: object
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vellumai/assistant",
3
- "version": "0.10.12-dev.202607250140.9979030",
3
+ "version": "0.10.12-staging.2",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "exports": {
@@ -2,7 +2,7 @@ import { beforeEach, describe, expect, mock, test } from "bun:test";
2
2
 
3
3
  import { VellumAcpClientHandler } from "../acp/client-handler.js";
4
4
  import { AcpSessionManager } from "../acp/session-manager.js";
5
- import type { AssistantEvent } from "../daemon/message-protocol.js";
5
+ import type { ServerMessage } from "../daemon/message-protocol.js";
6
6
  import * as pendingInteractions from "../runtime/pending-interactions.js";
7
7
 
8
8
  // ---------------------------------------------------------------------------
@@ -10,8 +10,8 @@ import * as pendingInteractions from "../runtime/pending-interactions.js";
10
10
  // ---------------------------------------------------------------------------
11
11
 
12
12
  describe("VellumAcpClientHandler", () => {
13
- let sent: AssistantEvent[];
14
- let sendToVellum: (msg: AssistantEvent) => void;
13
+ let sent: ServerMessage[];
14
+ let sendToVellum: (msg: ServerMessage) => void;
15
15
  let handler: VellumAcpClientHandler;
16
16
 
17
17
  beforeEach(() => {
@@ -11,7 +11,7 @@ import { Minimatch } from "minimatch";
11
11
  import { CompactionCircuit } from "../agent/compaction-circuit.js";
12
12
  import type { AgentEvent } from "../agent/loop.js";
13
13
  import type { ConfirmationStateChangedEvent } from "../api/events/confirmation-state-changed.js";
14
- import type { AssistantEvent } from "../daemon/message-protocol.js";
14
+ import type { ServerMessage } from "../daemon/message-protocol.js";
15
15
  import type { Message, ProviderResponse } from "../providers/types.js";
16
16
  import type { ConfirmationDetails } from "../runtime/pending-interactions.js";
17
17
 
@@ -188,7 +188,7 @@ function makeProvider() {
188
188
  }
189
189
 
190
190
  function makeConversation(
191
- sendToClient?: (msg: AssistantEvent) => void,
191
+ sendToClient?: (msg: ServerMessage) => void,
192
192
  conversationId = CONV_ID,
193
193
  ): Conversation {
194
194
  return new Conversation(
@@ -257,7 +257,7 @@ beforeEach(() => {
257
257
 
258
258
  describe("approval cascading", () => {
259
259
  test("allow (one-time) does NOT cascade", () => {
260
- const emitted: AssistantEvent[] = [];
260
+ const emitted: ServerMessage[] = [];
261
261
  const conversationObj = makeConversation(
262
262
  (msg) => emitted.push(msg),
263
263
  CONV_ID,
@@ -291,7 +291,7 @@ describe("approval cascading", () => {
291
291
  });
292
292
 
293
293
  test("deny (one-time) does NOT cascade", () => {
294
- const emitted: AssistantEvent[] = [];
294
+ const emitted: ServerMessage[] = [];
295
295
  const conversationObj = makeConversation(
296
296
  (msg) => emitted.push(msg),
297
297
  CONV_ID,
@@ -325,7 +325,7 @@ describe("approval cascading", () => {
325
325
  });
326
326
 
327
327
  test("already-resolved request handled gracefully", () => {
328
- const emitted: AssistantEvent[] = [];
328
+ const emitted: ServerMessage[] = [];
329
329
  const conversationObj = makeConversation(
330
330
  (msg) => emitted.push(msg),
331
331
  CONV_ID,
@@ -7,7 +7,7 @@
7
7
  import { beforeEach, describe, expect, mock, test } from "bun:test";
8
8
 
9
9
  import type { Conversation } from "../daemon/conversation.js";
10
- import type { AssistantEvent } from "../daemon/message-protocol.js";
10
+ import type { ServerMessage } from "../daemon/message-protocol.js";
11
11
  import type { SecretPromptResult } from "../permissions/secret-prompt-types.js";
12
12
 
13
13
  mock.module("../config/env.js", () => ({
@@ -123,7 +123,7 @@ function makeIdleSession(opts?: {
123
123
  runAgentLoop: async (
124
124
  _content: string,
125
125
  _messageId: string,
126
- options?: { onEvent?: (msg: AssistantEvent) => void },
126
+ options?: { onEvent?: (msg: ServerMessage) => void },
127
127
  ) => {
128
128
  const onEvent = options?.onEvent ?? (() => {});
129
129
  onEvent({ type: "assistant_text_delta", text: "Hello!" });
@@ -186,7 +186,7 @@ function makeConfirmationEmittingSession(opts?: {
186
186
  runAgentLoop: async (
187
187
  _content: string,
188
188
  _messageId: string,
189
- options?: { onEvent?: (msg: AssistantEvent) => void },
189
+ options?: { onEvent?: (msg: ServerMessage) => void },
190
190
  ) => {
191
191
  const onEvent = options?.onEvent ?? (() => {});
192
192
  // Simulate PermissionPrompter.prompt(): self-register in pendingInteractions
@@ -14,14 +14,14 @@
14
14
  */
15
15
  import { describe, expect, test } from "bun:test";
16
16
 
17
- import type { AssistantEventEnvelope } from "../runtime/assistant-event.js";
17
+ import type { AssistantEvent } from "../runtime/assistant-event.js";
18
18
  import {
19
19
  AssistantEventHub,
20
20
  assistantEventHub,
21
21
  broadcastMessage,
22
22
  } from "../runtime/assistant-event-hub.js";
23
23
 
24
- function makeSyncChangedEvent(originClientId?: string): AssistantEventEnvelope {
24
+ function makeSyncChangedEvent(originClientId?: string): AssistantEvent {
25
25
  return {
26
26
  id: "evt_test_sync",
27
27
  conversationId: undefined,
@@ -37,9 +37,9 @@ function makeSyncChangedEvent(originClientId?: string): AssistantEventEnvelope {
37
37
  describe("AssistantEventHub — self-echo suppression (excludeClientId)", () => {
38
38
  test("skips the named client and delivers to every other client", async () => {
39
39
  const hub = new AssistantEventHub();
40
- const receivedA: AssistantEventEnvelope[] = [];
41
- const receivedB: AssistantEventEnvelope[] = [];
42
- const receivedC: AssistantEventEnvelope[] = [];
40
+ const receivedA: AssistantEvent[] = [];
41
+ const receivedB: AssistantEvent[] = [];
42
+ const receivedC: AssistantEvent[] = [];
43
43
 
44
44
  hub.subscribe({
45
45
  type: "client",
@@ -82,8 +82,8 @@ describe("AssistantEventHub — self-echo suppression (excludeClientId)", () =>
82
82
 
83
83
  test("delivers to every subscriber when excludeClientId is omitted", async () => {
84
84
  const hub = new AssistantEventHub();
85
- const receivedA: AssistantEventEnvelope[] = [];
86
- const receivedB: AssistantEventEnvelope[] = [];
85
+ const receivedA: AssistantEvent[] = [];
86
+ const receivedB: AssistantEvent[] = [];
87
87
 
88
88
  hub.subscribe({
89
89
  type: "client",
@@ -112,7 +112,7 @@ describe("AssistantEventHub — self-echo suppression (excludeClientId)", () =>
112
112
 
113
113
  test("excludeClientId does not match process-type subscribers", async () => {
114
114
  const hub = new AssistantEventHub();
115
- const receivedProcess: AssistantEventEnvelope[] = [];
115
+ const receivedProcess: AssistantEvent[] = [];
116
116
 
117
117
  // A process subscriber sits in the same hub as a client whose id
118
118
  // matches `excludeClientId`. It must never be suppressed because
@@ -134,8 +134,8 @@ describe("AssistantEventHub — self-echo suppression (excludeClientId)", () =>
134
134
 
135
135
  test("excludeClientId composes with conversation-scoped subscribers", async () => {
136
136
  const hub = new AssistantEventHub();
137
- const receivedA: AssistantEventEnvelope[] = [];
138
- const receivedB: AssistantEventEnvelope[] = [];
137
+ const receivedA: AssistantEvent[] = [];
138
+ const receivedB: AssistantEvent[] = [];
139
139
 
140
140
  hub.subscribe({
141
141
  type: "client",
@@ -159,7 +159,7 @@ describe("AssistantEventHub — self-echo suppression (excludeClientId)", () =>
159
159
  });
160
160
 
161
161
  // Scoped event for sess_x; both clients filter to sess_x; exclude A.
162
- const event: AssistantEventEnvelope = {
162
+ const event: AssistantEvent = {
163
163
  id: "evt_scoped",
164
164
  conversationId: "sess_x",
165
165
  emittedAt: "2026-05-03T00:00:00.000Z",
@@ -179,8 +179,8 @@ describe("AssistantEventHub — self-echo suppression (excludeClientId)", () =>
179
179
 
180
180
  describe("broadcastMessage — derives excludeClientId from sync_changed.originClientId", () => {
181
181
  test("skips the originating client when originClientId is present", async () => {
182
- const receivedA: AssistantEventEnvelope[] = [];
183
- const receivedB: AssistantEventEnvelope[] = [];
182
+ const receivedA: AssistantEvent[] = [];
183
+ const receivedB: AssistantEvent[] = [];
184
184
 
185
185
  const subA = assistantEventHub.subscribe({
186
186
  type: "client",
@@ -221,8 +221,8 @@ describe("broadcastMessage — derives excludeClientId from sync_changed.originC
221
221
  });
222
222
 
223
223
  test("fans out to every client when originClientId is absent", async () => {
224
- const receivedA: AssistantEventEnvelope[] = [];
225
- const receivedB: AssistantEventEnvelope[] = [];
224
+ const receivedA: AssistantEvent[] = [];
225
+ const receivedB: AssistantEvent[] = [];
226
226
 
227
227
  const subA = assistantEventHub.subscribe({
228
228
  type: "client",
@@ -260,7 +260,7 @@ describe("broadcastMessage — derives excludeClientId from sync_changed.originC
260
260
  });
261
261
 
262
262
  test("ignores an empty-string originClientId (treats as absent)", async () => {
263
- const receivedA: AssistantEventEnvelope[] = [];
263
+ const receivedA: AssistantEvent[] = [];
264
264
 
265
265
  const subA = assistantEventHub.subscribe({
266
266
  type: "client",
@@ -13,12 +13,10 @@
13
13
  */
14
14
  import { describe, expect, test } from "bun:test";
15
15
 
16
- import type { AssistantEventEnvelope } from "../runtime/assistant-event.js";
16
+ import type { AssistantEvent } from "../runtime/assistant-event.js";
17
17
  import { AssistantEventHub } from "../runtime/assistant-event-hub.js";
18
18
 
19
- function makeEvent(
20
- overrides: Partial<AssistantEventEnvelope> = {},
21
- ): AssistantEventEnvelope {
19
+ function makeEvent(overrides: Partial<AssistantEvent> = {}): AssistantEvent {
22
20
  return {
23
21
  id: "evt_test",
24
22
  conversationId: "sess_web",
@@ -37,8 +35,8 @@ function makeEvent(
37
35
  describe("AssistantEventHub — targeted delivery (targetClientId)", () => {
38
36
  test("delivers only to the named client, bypassing conversation filter", async () => {
39
37
  const hub = new AssistantEventHub();
40
- const receivedA: AssistantEventEnvelope[] = [];
41
- const receivedB: AssistantEventEnvelope[] = [];
38
+ const receivedA: AssistantEvent[] = [];
39
+ const receivedB: AssistantEvent[] = [];
42
40
 
43
41
  // client-a is subscribed to "sess_macos" — different from the event's "sess_web"
44
42
  hub.subscribe({
@@ -77,8 +75,8 @@ describe("AssistantEventHub — targeted delivery (targetClientId)", () => {
77
75
 
78
76
  test("does not deliver to a client with a different clientId", async () => {
79
77
  const hub = new AssistantEventHub();
80
- const receivedA: AssistantEventEnvelope[] = [];
81
- const receivedB: AssistantEventEnvelope[] = [];
78
+ const receivedA: AssistantEvent[] = [];
79
+ const receivedB: AssistantEvent[] = [];
82
80
 
83
81
  hub.subscribe({
84
82
  type: "client",
@@ -108,7 +106,7 @@ describe("AssistantEventHub — targeted delivery (targetClientId)", () => {
108
106
 
109
107
  test("targeted delivery with wrong capability does not deliver", async () => {
110
108
  const hub = new AssistantEventHub();
111
- const receivedA: AssistantEventEnvelope[] = [];
109
+ const receivedA: AssistantEvent[] = [];
112
110
 
113
111
  // client-a only has host_file capability, NOT host_bash
114
112
  hub.subscribe({
@@ -132,7 +130,7 @@ describe("AssistantEventHub — targeted delivery (targetClientId)", () => {
132
130
 
133
131
  test("targeted delivery with matching capability delivers", async () => {
134
132
  const hub = new AssistantEventHub();
135
- const receivedA: AssistantEventEnvelope[] = [];
133
+ const receivedA: AssistantEvent[] = [];
136
134
 
137
135
  hub.subscribe({
138
136
  type: "client",
@@ -154,7 +152,7 @@ describe("AssistantEventHub — targeted delivery (targetClientId)", () => {
154
152
 
155
153
  test("process-type subscriber is never matched by targetClientId", async () => {
156
154
  const hub = new AssistantEventHub();
157
- const received: AssistantEventEnvelope[] = [];
155
+ const received: AssistantEvent[] = [];
158
156
 
159
157
  hub.subscribe({
160
158
  type: "process",
@@ -175,8 +173,8 @@ describe("AssistantEventHub — targeted delivery (targetClientId)", () => {
175
173
  describe("AssistantEventHub — untargeted capability targeting is unchanged", () => {
176
174
  test("targetCapability without targetClientId still applies conversation scoping", async () => {
177
175
  const hub = new AssistantEventHub();
178
- const receivedA: AssistantEventEnvelope[] = [];
179
- const receivedB: AssistantEventEnvelope[] = [];
176
+ const receivedA: AssistantEvent[] = [];
177
+ const receivedB: AssistantEvent[] = [];
180
178
 
181
179
  hub.subscribe({
182
180
  type: "client",
@@ -1,6 +1,6 @@
1
1
  import { beforeEach, describe, expect, test } from "bun:test";
2
2
 
3
- import type { AssistantEventEnvelope } from "../runtime/assistant-event.js";
3
+ import type { AssistantEvent } from "../runtime/assistant-event.js";
4
4
  import {
5
5
  AssistantEventHub,
6
6
  broadcastMessage,
@@ -12,9 +12,7 @@ import {
12
12
  } from "../runtime/assistant-stream-state.js";
13
13
  import * as pendingInteractions from "../runtime/pending-interactions.js";
14
14
 
15
- function makeEvent(
16
- overrides: Partial<AssistantEventEnvelope> = {},
17
- ): AssistantEventEnvelope {
15
+ function makeEvent(overrides: Partial<AssistantEvent> = {}): AssistantEvent {
18
16
  return {
19
17
  id: "evt_test",
20
18
  conversationId: "sess_1",
@@ -33,7 +31,7 @@ function makeEvent(
33
31
  describe("AssistantEventHub — fanout", () => {
34
32
  test("delivers event to a single matching subscriber", async () => {
35
33
  const hub = new AssistantEventHub();
36
- const received: AssistantEventEnvelope[] = [];
34
+ const received: AssistantEvent[] = [];
37
35
 
38
36
  hub.subscribe({
39
37
  type: "process",
@@ -77,8 +75,8 @@ describe("AssistantEventHub — fanout", () => {
77
75
 
78
76
  test("conversationId filter further restricts delivery", async () => {
79
77
  const hub = new AssistantEventHub();
80
- const receivedA: AssistantEventEnvelope[] = [];
81
- const receivedB: AssistantEventEnvelope[] = [];
78
+ const receivedA: AssistantEvent[] = [];
79
+ const receivedB: AssistantEvent[] = [];
82
80
 
83
81
  hub.subscribe({
84
82
  type: "process",
@@ -103,7 +101,7 @@ describe("AssistantEventHub — fanout", () => {
103
101
 
104
102
  test("subscriber without conversationId filter receives all conversations", async () => {
105
103
  const hub = new AssistantEventHub();
106
- const received: AssistantEventEnvelope[] = [];
104
+ const received: AssistantEvent[] = [];
107
105
 
108
106
  hub.subscribe({
109
107
  type: "process",
@@ -161,7 +159,7 @@ describe("AssistantEventHub — fanout", () => {
161
159
  describe("AssistantEventHub — unsubscribe cleanup", () => {
162
160
  test("dispose stops event delivery", async () => {
163
161
  const hub = new AssistantEventHub();
164
- const received: AssistantEventEnvelope[] = [];
162
+ const received: AssistantEvent[] = [];
165
163
 
166
164
  const s = hub.subscribe({
167
165
  type: "process",
@@ -236,8 +234,8 @@ describe("AssistantEventHub — unsubscribe cleanup", () => {
236
234
 
237
235
  test("disposing one subscription does not affect others", async () => {
238
236
  const hub = new AssistantEventHub();
239
- const received1: AssistantEventEnvelope[] = [];
240
- const received2: AssistantEventEnvelope[] = [];
237
+ const received1: AssistantEvent[] = [];
238
+ const received2: AssistantEvent[] = [];
241
239
 
242
240
  const s1 = hub.subscribe({
243
241
  type: "process",
@@ -343,7 +341,7 @@ describe("AssistantEventHub — exception isolation", () => {
343
341
  describe("AssistantEventHub — re-entrancy / snapshot isolation", () => {
344
342
  test("subscriber added during publish does not receive the in-flight event", async () => {
345
343
  const hub = new AssistantEventHub();
346
- const lateReceived: AssistantEventEnvelope[] = [];
344
+ const lateReceived: AssistantEvent[] = [];
347
345
 
348
346
  hub.subscribe({
349
347
  type: "process",
@@ -365,7 +363,7 @@ describe("AssistantEventHub — re-entrancy / snapshot isolation", () => {
365
363
 
366
364
  test("subscriber that disposes itself mid-publish does not affect remaining subscribers", async () => {
367
365
  const hub = new AssistantEventHub();
368
- const received: AssistantEventEnvelope[] = [];
366
+ const received: AssistantEvent[] = [];
369
367
  let s: ReturnType<typeof hub.subscribe>;
370
368
 
371
369
  // eslint-disable-next-line prefer-const
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, test } from "bun:test";
2
2
 
3
- import type { AssistantEventEnvelope } from "../runtime/assistant-event.js";
3
+ import type { AssistantEvent } from "../runtime/assistant-event.js";
4
4
  import {
5
5
  formatSseFrame,
6
6
  formatSseHeartbeat,
@@ -8,9 +8,9 @@ import {
8
8
 
9
9
  // ── Type / shape tests ────────────────────────────────────────────────────────
10
10
 
11
- describe("AssistantEventEnvelope shape", () => {
11
+ describe("AssistantEvent shape", () => {
12
12
  test("accepts a minimal valid event", () => {
13
- const event: AssistantEventEnvelope = {
13
+ const event: AssistantEvent = {
14
14
  id: "evt_001",
15
15
  emittedAt: "2026-02-18T21:20:00.000Z",
16
16
  message: {
@@ -27,7 +27,7 @@ describe("AssistantEventEnvelope shape", () => {
27
27
  });
28
28
 
29
29
  test("accepts a full event with conversationId", () => {
30
- const event: AssistantEventEnvelope = {
30
+ const event: AssistantEvent = {
31
31
  id: "evt_002",
32
32
  conversationId: "conv_456",
33
33
  emittedAt: "2026-02-18T21:20:00.000Z",
@@ -45,7 +45,7 @@ describe("AssistantEventEnvelope shape", () => {
45
45
  // ── SSE framing tests ─────────────────────────────────────────────────────────
46
46
 
47
47
  describe("formatSseFrame", () => {
48
- const baseEvent: AssistantEventEnvelope = {
48
+ const baseEvent: AssistantEvent = {
49
49
  id: "evt_003",
50
50
  conversationId: "sess_xyz",
51
51
  emittedAt: "2026-02-18T00:00:00.000Z",
@@ -73,7 +73,7 @@ describe("formatSseFrame", () => {
73
73
  const dataLine = frame.split("\n").find((l) => l.startsWith("data: "))!;
74
74
  const parsed = JSON.parse(
75
75
  dataLine.slice("data: ".length),
76
- ) as AssistantEventEnvelope;
76
+ ) as AssistantEvent;
77
77
 
78
78
  expect(parsed.id).toBe(baseEvent.id);
79
79
  expect(parsed.conversationId).toBe(baseEvent.conversationId);
@@ -82,16 +82,13 @@ describe("formatSseFrame", () => {
82
82
  });
83
83
 
84
84
  test("id line uses the event id verbatim", () => {
85
- const event: AssistantEventEnvelope = {
86
- ...baseEvent,
87
- id: "unique-evt-id-xyz",
88
- };
85
+ const event: AssistantEvent = { ...baseEvent, id: "unique-evt-id-xyz" };
89
86
  const frame = formatSseFrame(event);
90
87
  expect(frame).toContain("id: unique-evt-id-xyz\n");
91
88
  });
92
89
 
93
90
  test("strips newline characters from event.id to prevent SSE frame injection", () => {
94
- const event: AssistantEventEnvelope = {
91
+ const event: AssistantEvent = {
95
92
  ...baseEvent,
96
93
  id: 'foo\ndata: {"injected":true}',
97
94
  };
@@ -116,7 +113,7 @@ describe("formatSseFrame", () => {
116
113
  });
117
114
 
118
115
  test("seq lands in the JSON payload (envelope) when set, never in SSE id", () => {
119
- const event: AssistantEventEnvelope = {
116
+ const event: AssistantEvent = {
120
117
  ...baseEvent,
121
118
  id: "uuid-event-id",
122
119
  seq: 42,
@@ -312,6 +312,64 @@ describe("assistant ID boundary", () => {
312
312
  // surfaces invites callers to pass external IDs into daemon scoping.
313
313
  // -------------------------------------------------------------------------
314
314
 
315
+ test("message contract types do not contain assistantId for guardian requests", () => {
316
+ const contractPath = join(
317
+ import.meta.dir,
318
+ "..",
319
+ "daemon",
320
+ "message-types",
321
+ "integrations.ts",
322
+ );
323
+ const content = readFileSync(contractPath, "utf-8");
324
+
325
+ // Extract the interface blocks for the request types and verify
326
+ // none of them declare an assistantId property.
327
+ const requestTypeNames = ["ChannelVerificationSessionRequest"];
328
+
329
+ for (const typeName of requestTypeNames) {
330
+ // Find the interface/type block — match from the type name to the next
331
+ // closing brace at the same indentation level. We use a simple heuristic:
332
+ // find the line declaring the type, then scan forward to the closing '}'.
333
+ const typeIndex = content.indexOf(typeName);
334
+ expect(
335
+ typeIndex,
336
+ `Expected to find ${typeName} in message contract`,
337
+ ).toBeGreaterThan(-1);
338
+
339
+ // Extract from the type declaration to the next '}' line
340
+ const blockStart = content.indexOf("{", typeIndex);
341
+ if (blockStart === -1) continue;
342
+ let braceDepth = 0;
343
+ let blockEnd = blockStart;
344
+ for (let i = blockStart; i < content.length; i++) {
345
+ if (content[i] === "{") braceDepth++;
346
+ if (content[i] === "}") braceDepth--;
347
+ if (braceDepth === 0) {
348
+ blockEnd = i + 1;
349
+ break;
350
+ }
351
+ }
352
+ const block = content.slice(blockStart, blockEnd);
353
+
354
+ // The block should not contain an assistantId property declaration
355
+ // (matches "assistantId?" or "assistantId:" on a non-comment line)
356
+ const lines = block.split("\n");
357
+ for (const line of lines) {
358
+ const trimmed = line.trim();
359
+ if (
360
+ trimmed.startsWith("//") ||
361
+ trimmed.startsWith("*") ||
362
+ trimmed.startsWith("/*")
363
+ )
364
+ continue;
365
+ expect(
366
+ /\bassistantId\s*[?:]/.test(trimmed),
367
+ `${typeName} must not declare an assistantId property. Found: "${trimmed}"`,
368
+ ).toBe(false);
369
+ }
370
+ }
371
+ });
372
+
315
373
  test("guardian outbound param interfaces do not contain assistantId", () => {
316
374
  const actionsPath = join(
317
375
  import.meta.dir,
@@ -8,7 +8,7 @@ import {
8
8
  import { dirname, join } from "node:path";
9
9
  import { beforeEach, describe, expect, test } from "bun:test";
10
10
 
11
- import type { AssistantEventEnvelope } from "../runtime/assistant-event.js";
11
+ import type { AssistantEvent } from "../runtime/assistant-event.js";
12
12
  import type {
13
13
  EventTargeting,
14
14
  ReplaySubscriber,
@@ -26,9 +26,7 @@ import {
26
26
 
27
27
  const CONV = "conv_test";
28
28
 
29
- function mkEvent(
30
- overrides: Partial<AssistantEventEnvelope> = {},
31
- ): AssistantEventEnvelope {
29
+ function mkEvent(overrides: Partial<AssistantEvent> = {}): AssistantEvent {
32
30
  const conversationId =
33
31
  "conversationId" in overrides ? overrides.conversationId : CONV;
34
32
  return {
@@ -41,7 +39,7 @@ function mkEvent(
41
39
  text: "x",
42
40
  },
43
41
  ...overrides,
44
- } as AssistantEventEnvelope;
42
+ } as AssistantEvent;
45
43
  }
46
44
 
47
45
  describe("assistant-stream-state", () => {
@@ -1,7 +1,7 @@
1
1
  import { describe, expect, test } from "bun:test";
2
2
 
3
3
  import { SYNC_TAGS } from "../daemon/message-types/sync.js";
4
- import type { AssistantEventEnvelope } from "../runtime/assistant-event.js";
4
+ import type { AssistantEvent } from "../runtime/assistant-event.js";
5
5
  import { assistantEventHub } from "../runtime/assistant-event-hub.js";
6
6
  import { ROUTES as AVATAR_ROUTES } from "../runtime/routes/avatar-routes.js";
7
7
  import { publishIdentityChanged } from "../runtime/sync/resource-sync-events.js";
@@ -19,7 +19,7 @@ async function waitFor(predicate: () => boolean): Promise<void> {
19
19
 
20
20
  describe("avatar and identity sync events", () => {
21
21
  test("notify_avatar_updated emits legacy avatar event and sync tag", async () => {
22
- const received: AssistantEventEnvelope[] = [];
22
+ const received: AssistantEvent[] = [];
23
23
  const subscription = assistantEventHub.subscribe({
24
24
  type: "process",
25
25
  callback: (event) => {
@@ -50,7 +50,7 @@ describe("avatar and identity sync events", () => {
50
50
  });
51
51
 
52
52
  test("identity changes emit legacy identity event and identity sync tags", async () => {
53
- const received: AssistantEventEnvelope[] = [];
53
+ const received: AssistantEvent[] = [];
54
54
  const subscription = assistantEventHub.subscribe({
55
55
  type: "process",
56
56
  callback: (event) => {