@canonmsg/backend-contracts 1.8.1 → 2.0.0

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 (193) hide show
  1. package/dist/agentBehaviorPolicy.d.ts +45 -86
  2. package/dist/agentBehaviorPolicy.js +0 -53
  3. package/dist/cjs/agentBehaviorPolicy.js +1 -54
  4. package/dist/cjs/contactRequest.js +0 -30
  5. package/dist/cjs/index.js +0 -8
  6. package/dist/cjs/media.js +0 -13
  7. package/dist/cjs/message.js +0 -64
  8. package/dist/cjs/runtimeCardFields.js +1 -58
  9. package/dist/cjs/turnProtocol.js +1 -41
  10. package/dist/contactRequest.d.ts +23 -42
  11. package/dist/contactRequest.js +0 -29
  12. package/dist/index.d.ts +0 -8
  13. package/dist/index.js +0 -8
  14. package/dist/media.d.ts +11 -24
  15. package/dist/media.js +0 -12
  16. package/dist/message.d.ts +50 -133
  17. package/dist/message.js +1 -64
  18. package/dist/runtimeCardFields.d.ts +39 -112
  19. package/dist/runtimeCardFields.js +0 -57
  20. package/dist/turnProtocol.d.ts +24 -91
  21. package/dist/turnProtocol.js +0 -40
  22. package/package.json +5 -8
  23. package/dist/bridgeLocal.d.ts +0 -1729
  24. package/dist/bridgeLocal.js +0 -673
  25. package/dist/cjs/bridgeLocal.js +0 -676
  26. package/dist/cjs/controlSignals.js +0 -44
  27. package/dist/cjs/endpointRegistry.js +0 -264
  28. package/dist/cjs/hitl.js +0 -0
  29. package/dist/cjs/inboundFrame.js +0 -92
  30. package/dist/cjs/restEndpoints.js +0 -237
  31. package/dist/cjs/sendContextual.js +0 -92
  32. package/dist/cjs/sseEvents.js +0 -298
  33. package/dist/controlSignals.d.ts +0 -55
  34. package/dist/controlSignals.js +0 -41
  35. package/dist/endpointRegistry.d.ts +0 -13
  36. package/dist/endpointRegistry.js +0 -261
  37. package/dist/hitl.d.ts +0 -303
  38. package/dist/hitl.js +0 -168
  39. package/dist/inboundFrame.d.ts +0 -229
  40. package/dist/inboundFrame.js +0 -89
  41. package/dist/restEndpoints.d.ts +0 -531
  42. package/dist/restEndpoints.js +0 -234
  43. package/dist/schemas/agent-behavior-settings-record.schema.json +0 -48
  44. package/dist/schemas/bridge-connection-state-notification.schema.json +0 -19
  45. package/dist/schemas/bridge-get-attachment-params.schema.json +0 -24
  46. package/dist/schemas/bridge-get-attachment-result.schema.json +0 -20
  47. package/dist/schemas/bridge-hello-params.schema.json +0 -42
  48. package/dist/schemas/bridge-hello-result.schema.json +0 -105
  49. package/dist/schemas/bridge-hitl-state.schema.json +0 -38
  50. package/dist/schemas/bridge-ok-result.schema.json +0 -15
  51. package/dist/schemas/bridge-ready-notification.schema.json +0 -79
  52. package/dist/schemas/bridge-resync-reason.schema.json +0 -9
  53. package/dist/schemas/bridge-resync.schema.json +0 -18
  54. package/dist/schemas/bridge-rpc-error.schema.json +0 -19
  55. package/dist/schemas/bridge-rpc-id.schema.json +0 -12
  56. package/dist/schemas/bridge-rpc-notification.schema.json +0 -20
  57. package/dist/schemas/bridge-rpc-request.schema.json +0 -31
  58. package/dist/schemas/bridge-rpc-response.schema.json +0 -81
  59. package/dist/schemas/bridge-status-result.schema.json +0 -76
  60. package/dist/schemas/bridge-upload-media-params.schema.json +0 -28
  61. package/dist/schemas/bridge-upstream-state.schema.json +0 -10
  62. package/dist/schemas/contacts-response.schema.json +0 -52
  63. package/dist/schemas/control-channel-key.schema.json +0 -10
  64. package/dist/schemas/control-primitive-event.schema.json +0 -30
  65. package/dist/schemas/control-primitive-map.schema.json +0 -15
  66. package/dist/schemas/control-session-event.schema.json +0 -26
  67. package/dist/schemas/control-session-node.schema.json +0 -11
  68. package/dist/schemas/control-signal-event.schema.json +0 -35
  69. package/dist/schemas/control-signal-node.schema.json +0 -22
  70. package/dist/schemas/control-signal-type.schema.json +0 -10
  71. package/dist/schemas/conversations-response.schema.json +0 -167
  72. package/dist/schemas/create-contact-request-request.schema.json +0 -17
  73. package/dist/schemas/create-contact-request-response.schema.json +0 -51
  74. package/dist/schemas/create-conversation-request.schema.json +0 -82
  75. package/dist/schemas/create-conversation-response.schema.json +0 -29
  76. package/dist/schemas/delete-message-response.schema.json +0 -11
  77. package/dist/schemas/delivery-intent.schema.json +0 -11
  78. package/dist/schemas/forward-message-request.schema.json +0 -25
  79. package/dist/schemas/forward-message-response.schema.json +0 -35
  80. package/dist/schemas/forwarded-from.schema.json +0 -18
  81. package/dist/schemas/get-messages-query.schema.json +0 -17
  82. package/dist/schemas/hitl-approval-category.schema.json +0 -15
  83. package/dist/schemas/hitl-approval-detail.schema.json +0 -21
  84. package/dist/schemas/hitl-approval-outcome-record.schema.json +0 -33
  85. package/dist/schemas/hitl-approval-reply-record.schema.json +0 -57
  86. package/dist/schemas/hitl-approval-request-record.schema.json +0 -105
  87. package/dist/schemas/hitl-approval-risk.schema.json +0 -11
  88. package/dist/schemas/hitl-card-outcome-record.schema.json +0 -48
  89. package/dist/schemas/hitl-card-reply-record.schema.json +0 -46
  90. package/dist/schemas/hitl-card-request-record.schema.json +0 -73
  91. package/dist/schemas/hitl-input-answers.schema.json +0 -23
  92. package/dist/schemas/hitl-input-kind.schema.json +0 -10
  93. package/dist/schemas/hitl-input-outcome-record.schema.json +0 -46
  94. package/dist/schemas/hitl-input-question.schema.json +0 -54
  95. package/dist/schemas/hitl-input-reply-record.schema.json +0 -44
  96. package/dist/schemas/hitl-input-request-record.schema.json +0 -134
  97. package/dist/schemas/hitl-pending.schema.json +0 -31
  98. package/dist/schemas/hitl-request-accepted.schema.json +0 -18
  99. package/dist/schemas/hitl-request-kind.schema.json +0 -10
  100. package/dist/schemas/hitl-resolution-status.schema.json +0 -10
  101. package/dist/schemas/hitl-resolution.schema.json +0 -38
  102. package/dist/schemas/hitl-session-rule.schema.json +0 -32
  103. package/dist/schemas/inbound-disposition.schema.json +0 -13
  104. package/dist/schemas/inbound-frame-attachment-v1.schema.json +0 -94
  105. package/dist/schemas/inbound-frame-contact-card-v1.schema.json +0 -59
  106. package/dist/schemas/inbound-frame-group-context-v1.schema.json +0 -96
  107. package/dist/schemas/inbound-frame-reply-context-v1.schema.json +0 -261
  108. package/dist/schemas/inbound-frame-shape-v1.schema.json +0 -12
  109. package/dist/schemas/inbound-frame-v1.schema.json +0 -506
  110. package/dist/schemas/mark-read-response.schema.json +0 -11
  111. package/dist/schemas/media-attachment-kind.schema.json +0 -11
  112. package/dist/schemas/media-attachment.schema.json +0 -42
  113. package/dist/schemas/messages-page-response.schema.json +0 -290
  114. package/dist/schemas/participation-decision-input.schema.json +0 -44
  115. package/dist/schemas/participation-history-message.schema.json +0 -23
  116. package/dist/schemas/participation-history-snapshot.schema.json +0 -37
  117. package/dist/schemas/participation-style.schema.json +0 -13
  118. package/dist/schemas/react-request.schema.json +0 -22
  119. package/dist/schemas/react-response.schema.json +0 -35
  120. package/dist/schemas/resolve-admission-request.schema.json +0 -30
  121. package/dist/schemas/resolve-admission-response.schema.json +0 -129
  122. package/dist/schemas/resolved-agent-behavior-policy-record.schema.json +0 -81
  123. package/dist/schemas/rest-contact.schema.json +0 -40
  124. package/dist/schemas/rest-conversation-last-message.schema.json +0 -77
  125. package/dist/schemas/rest-conversation.schema.json +0 -155
  126. package/dist/schemas/rest-message.schema.json +0 -252
  127. package/dist/schemas/rest-ok-response.schema.json +0 -11
  128. package/dist/schemas/rest-session-selection.schema.json +0 -40
  129. package/dist/schemas/runtime-card-field-choice.schema.json +0 -23
  130. package/dist/schemas/runtime-card-field-type.schema.json +0 -17
  131. package/dist/schemas/runtime-card-field.schema.json +0 -180
  132. package/dist/schemas/runtime-card-line-item-column-type.schema.json +0 -12
  133. package/dist/schemas/runtime-card-line-item-column.schema.json +0 -74
  134. package/dist/schemas/send-contextual-deferred-response.schema.json +0 -39
  135. package/dist/schemas/send-contextual-messaged-response.schema.json +0 -42
  136. package/dist/schemas/send-contextual-request.schema.json +0 -103
  137. package/dist/schemas/send-contextual-response.schema.json +0 -105
  138. package/dist/schemas/send-contextual-self-context.schema.json +0 -19
  139. package/dist/schemas/send-contextual-state-response.schema.json +0 -24
  140. package/dist/schemas/send-message-request.schema.json +0 -106
  141. package/dist/schemas/send-message-response.schema.json +0 -14
  142. package/dist/schemas/sender-type.schema.json +0 -9
  143. package/dist/schemas/serialize-message-input.schema.json +0 -29
  144. package/dist/schemas/serialized-agent-client-type.schema.json +0 -12
  145. package/dist/schemas/serialized-contact-card.schema.json +0 -65
  146. package/dist/schemas/serialized-contact-request-status.schema.json +0 -11
  147. package/dist/schemas/serialized-contact-request.schema.json +0 -157
  148. package/dist/schemas/serialized-content-type.schema.json +0 -13
  149. package/dist/schemas/serialized-message.schema.json +0 -249
  150. package/dist/schemas/serialized-reactions.schema.json +0 -14
  151. package/dist/schemas/serialized-sender-type.schema.json +0 -9
  152. package/dist/schemas/set-streaming-request.schema.json +0 -67
  153. package/dist/schemas/set-typing-request.schema.json +0 -25
  154. package/dist/schemas/sse-access-policy.schema.json +0 -10
  155. package/dist/schemas/sse-agent-context-payload.schema.json +0 -57
  156. package/dist/schemas/sse-connected-payload.schema.json +0 -18
  157. package/dist/schemas/sse-contact-payload.schema.json +0 -40
  158. package/dist/schemas/sse-contact-removed-payload.schema.json +0 -14
  159. package/dist/schemas/sse-contact-request-payload.schema.json +0 -157
  160. package/dist/schemas/sse-conversation-updated-payload.schema.json +0 -48
  161. package/dist/schemas/sse-error-payload.schema.json +0 -23
  162. package/dist/schemas/sse-event-envelope.schema.json +0 -42
  163. package/dist/schemas/sse-event-family.schema.json +0 -12
  164. package/dist/schemas/sse-event-type.schema.json +0 -28
  165. package/dist/schemas/sse-heartbeat-payload.schema.json +0 -14
  166. package/dist/schemas/sse-membership-change.schema.json +0 -28
  167. package/dist/schemas/sse-message-created-payload.schema.json +0 -414
  168. package/dist/schemas/sse-message-deleted-payload.schema.json +0 -18
  169. package/dist/schemas/sse-message-updated-payload.schema.json +0 -46
  170. package/dist/schemas/sse-presence-payload.schema.json +0 -21
  171. package/dist/schemas/sse-provenance.schema.json +0 -64
  172. package/dist/schemas/sse-replay-expired-payload.schema.json +0 -21
  173. package/dist/schemas/sse-runtime-control-kind.schema.json +0 -13
  174. package/dist/schemas/sse-runtime-control-payload.schema.json +0 -44
  175. package/dist/schemas/sse-runtime-updated-payload.schema.json +0 -78
  176. package/dist/schemas/sse-self-context.schema.json +0 -45
  177. package/dist/schemas/sse-turn-dispatch.schema.json +0 -29
  178. package/dist/schemas/sse-turn-updated-payload.schema.json +0 -33
  179. package/dist/schemas/sse-typing-payload.schema.json +0 -32
  180. package/dist/schemas/sse-voice-session-event-payload.schema.json +0 -170
  181. package/dist/schemas/sse-voice-session.schema.json +0 -157
  182. package/dist/schemas/trigger-decision.schema.json +0 -27
  183. package/dist/schemas/turn-lifecycle-state.schema.json +0 -14
  184. package/dist/schemas/turn-message-semantics.schema.json +0 -10
  185. package/dist/schemas/turn-metadata.schema.json +0 -56
  186. package/dist/schemas/turn-state-like.schema.json +0 -39
  187. package/dist/schemas/update-disposition-request.schema.json +0 -22
  188. package/dist/schemas/upload-media-request.schema.json +0 -25
  189. package/dist/schemas/upload-media-response.schema.json +0 -55
  190. package/dist/sendContextual.d.ts +0 -114
  191. package/dist/sendContextual.js +0 -89
  192. package/dist/sseEvents.d.ts +0 -494
  193. package/dist/sseEvents.js +0 -295
package/dist/sseEvents.js DELETED
@@ -1,295 +0,0 @@
1
- // Wire contract v1 — SSE event envelope + per-family payload schemas.
2
- //
3
- // Grounded in what stream-service ACTUALLY emits (stream-service/src/stream.ts
4
- // + listeners.ts) and what @canonmsg/core's CanonStream consumes — not in
5
- // design-doc prose. Payload slots that stream-service passes through opaquely
6
- // (behavior policies, runtime snapshots, raw RTDB values) stay loose objects;
7
- // slots stream-service constructs field-by-field are closed.
8
- //
9
- // The golden fixtures in @canonmsg/test-fixtures parse under these schemas;
10
- // the future Python framework must pass the same fixtures.
11
- import { z } from 'zod';
12
- import { SerializedContactRequestSchema } from './contactRequest.js';
13
- import { SerializedMessageSchema, SerializedReactionsSchema } from './message.js';
14
- export const SseAccessPolicySchema = z.enum(['open', 'approval-required', 'owner-only']);
15
- // ── Lifecycle events ───────────────────────────────────────────────────
16
- export const SseConnectedPayloadSchema = z.object({
17
- connectionId: z.string(),
18
- agentId: z.string(),
19
- });
20
- /** Trusted, server-injected identity & access info (stream.ts `agent.context`). */
21
- export const SseAgentContextPayloadSchema = z.looseObject({
22
- agentId: z.string(),
23
- canonContactId: z.string().optional(),
24
- clientType: z.string().optional(),
25
- ownerId: z.string(),
26
- ownerName: z.string(),
27
- /** Resolved agent behavior policy — passed through opaquely. */
28
- defaultBehavior: z.record(z.string(), z.unknown()).optional(),
29
- inboundPolicy: SseAccessPolicySchema,
30
- groupJoinPolicy: SseAccessPolicySchema,
31
- discoverable: z.boolean(),
32
- });
33
- export const SseHeartbeatPayloadSchema = z.object({
34
- timestamp: z.string(),
35
- });
36
- export const SseReplayExpiredPayloadSchema = z.looseObject({
37
- lastAvailableId: z.string().nullable().optional(),
38
- message: z.string().optional(),
39
- });
40
- export const SseErrorPayloadSchema = z.looseObject({
41
- code: z.string().optional(),
42
- message: z.string().optional(),
43
- retryAfterMs: z.number().optional(),
44
- activeConnections: z.number().optional(),
45
- maxConnections: z.number().optional(),
46
- });
47
- // ── Messages family ────────────────────────────────────────────────────
48
- export const SseSelfContextSchema = z.object({
49
- id: z.string(),
50
- type: z.literal('cross_session'),
51
- context: z.string(),
52
- createdAt: z.string().nullable(),
53
- updatedAt: z.string().nullable(),
54
- });
55
- export const SseTurnDispatchSchema = z.looseObject({
56
- kind: z.enum(['run_turn', 'observe_only']),
57
- reason: z.string(),
58
- addressed: z.boolean(),
59
- policyVersion: z.string().optional(),
60
- });
61
- export const SseProvenanceSchema = z.looseObject({
62
- conversation: z.looseObject({
63
- id: z.string(),
64
- type: z.enum(['direct', 'group', 'unknown']),
65
- }),
66
- sender: z.looseObject({
67
- id: z.string(),
68
- name: z.string().optional(),
69
- type: z.enum(['human', 'ai_agent']),
70
- isOwner: z.boolean(),
71
- }),
72
- mentionedAgent: z.boolean(),
73
- });
74
- /**
75
- * `message.created` — the inbound message envelope. `message` is exactly the
76
- * SerializedMessage the shared serializer emits (the E2EE S1 slot).
77
- */
78
- export const SseMessageCreatedPayloadSchema = z.looseObject({
79
- conversationId: z.string(),
80
- /** Resolved agent behavior policy — passed through opaquely. */
81
- behavior: z.record(z.string(), z.unknown()).optional(),
82
- activeSelfContextId: z.string().nullable().optional(),
83
- selfContexts: z.array(SseSelfContextSchema).optional(),
84
- provenance: SseProvenanceSchema.optional(),
85
- turnDispatch: SseTurnDispatchSchema.optional(),
86
- message: SerializedMessageSchema,
87
- });
88
- export const SseMessageUpdatedPayloadSchema = z.object({
89
- conversationId: z.string(),
90
- messageId: z.string(),
91
- actorId: z.string().optional(),
92
- updatedAt: z.string().optional(),
93
- changes: z.looseObject({
94
- reactions: SerializedReactionsSchema,
95
- }),
96
- });
97
- export const SseMessageDeletedPayloadSchema = z.object({
98
- conversationId: z.string(),
99
- messageId: z.string(),
100
- });
101
- export const SseMembershipChangeSchema = z.object({
102
- addedMemberIds: z.array(z.string()),
103
- removedMemberIds: z.array(z.string()),
104
- memberCount: z.number(),
105
- });
106
- export const SseConversationUpdatedPayloadSchema = z.object({
107
- conversationId: z.string(),
108
- changes: z.record(z.string(), z.unknown()),
109
- membershipChange: SseMembershipChangeSchema.optional(),
110
- });
111
- // ── Contacts family ────────────────────────────────────────────────────
112
- /** `contact.request` / `contact.approved` carry the serialized contact request. */
113
- export const SseContactRequestPayloadSchema = SerializedContactRequestSchema;
114
- /**
115
- * `contact.added` / `contact.updated`. `source` is a pass-through string —
116
- * canonical values today: direct_add, phone_book, contact_request, link, qr,
117
- * group, open_inbound_message, unknown.
118
- */
119
- export const SseContactPayloadSchema = z.object({
120
- id: z.string(),
121
- source: z.string(),
122
- addedAt: z.string().nullable(),
123
- displayNameOverride: z.string().nullable(),
124
- });
125
- export const SseContactRemovedPayloadSchema = z.object({
126
- id: z.string(),
127
- });
128
- // ── Typing / presence family ───────────────────────────────────────────
129
- export const SseTypingPayloadSchema = z.object({
130
- conversationId: z.string(),
131
- userId: z.string(),
132
- isTyping: z.boolean(),
133
- status: z.enum(['thinking', 'typing']).optional(),
134
- timestamp: z.number().optional(),
135
- });
136
- export const SsePresencePayloadSchema = z.object({
137
- userId: z.string(),
138
- online: z.boolean(),
139
- lastSeen: z.string().optional(),
140
- });
141
- // ── Runtime / turn family ──────────────────────────────────────────────
142
- /** Aggregated RTDB runtime snapshot — nodes are passed through opaquely. */
143
- export const SseRuntimeUpdatedPayloadSchema = z.object({
144
- conversationId: z.string(),
145
- agentId: z.string(),
146
- runtime: z.record(z.string(), z.unknown()).nullable(),
147
- runtimeInfo: z.record(z.string(), z.unknown()).nullable(),
148
- sessionState: z.record(z.string(), z.unknown()).nullable(),
149
- sessionConfig: z.record(z.string(), z.unknown()).nullable(),
150
- });
151
- export const SseTurnUpdatedPayloadSchema = z.object({
152
- conversationId: z.string(),
153
- agentId: z.string(),
154
- turn: z.record(z.string(), z.unknown()).nullable(),
155
- });
156
- export const SseRuntimeControlKindSchema = z.enum([
157
- 'session',
158
- 'signal',
159
- 'primitive',
160
- 'runtimeInput',
161
- 'runtimeCard',
162
- 'runtimeApproval',
163
- ]);
164
- export const SseRuntimeControlPayloadSchema = z.object({
165
- conversationId: z.string(),
166
- agentId: z.string(),
167
- kind: SseRuntimeControlKindSchema,
168
- requestId: z.string().optional(),
169
- updatedAt: z.number().optional(),
170
- value: z.record(z.string(), z.unknown()),
171
- });
172
- // ── Voice family ───────────────────────────────────────────────────────
173
- export const SseVoiceSessionSchema = z.looseObject({
174
- id: z.string(),
175
- conversationId: z.string(),
176
- roomName: z.string(),
177
- mode: z.enum(['human', 'runtime_voice']),
178
- status: z.enum(['active', 'ended', 'error']),
179
- createdBy: z.string(),
180
- participantIds: z.array(z.string()),
181
- participants: z.array(z.looseObject({
182
- userId: z.string(),
183
- userType: z.enum(['human', 'ai_agent', 'system']),
184
- displayName: z.string().nullable(),
185
- joinedAt: z.string().nullable(),
186
- leftAt: z.string().nullable(),
187
- })).optional(),
188
- targetAgentId: z.string().nullable().optional(),
189
- createdAt: z.string().nullable().optional(),
190
- updatedAt: z.string().nullable().optional(),
191
- endedAt: z.string().nullable().optional(),
192
- error: z.string().nullable().optional(),
193
- });
194
- export const SseVoiceSessionEventPayloadSchema = z.object({
195
- conversationId: z.string(),
196
- session: SseVoiceSessionSchema,
197
- });
198
- // ── Envelope + registry ────────────────────────────────────────────────
199
- /**
200
- * Every SSE `event:` name stream-service emits today (stream.ts + listeners.ts;
201
- * mirrored by CanonStream's dispatch switch in core). NOTE: `contact.updated`
202
- * is emitted by stream-service but not yet consumed by CanonStream.
203
- */
204
- export const SSE_EVENT_TYPES = [
205
- 'connected',
206
- 'agent.context',
207
- 'heartbeat',
208
- 'message.created',
209
- 'message.updated',
210
- 'message.deleted',
211
- 'conversation.updated',
212
- 'contact.request',
213
- 'contact.approved',
214
- 'contact.added',
215
- 'contact.updated',
216
- 'contact.removed',
217
- 'typing',
218
- 'presence',
219
- 'runtime.updated',
220
- 'turn.updated',
221
- 'runtime.control',
222
- 'voice.session.started',
223
- 'voice.session.ended',
224
- 'replay.expired',
225
- 'error',
226
- ];
227
- export const SseEventTypeSchema = z.enum(SSE_EVENT_TYPES);
228
- /** Payload schema for every event type — the machine-readable event registry. */
229
- export const SSE_EVENT_PAYLOAD_SCHEMAS = {
230
- 'connected': SseConnectedPayloadSchema,
231
- 'agent.context': SseAgentContextPayloadSchema,
232
- 'heartbeat': SseHeartbeatPayloadSchema,
233
- 'message.created': SseMessageCreatedPayloadSchema,
234
- 'message.updated': SseMessageUpdatedPayloadSchema,
235
- 'message.deleted': SseMessageDeletedPayloadSchema,
236
- 'conversation.updated': SseConversationUpdatedPayloadSchema,
237
- 'contact.request': SseContactRequestPayloadSchema,
238
- 'contact.approved': SseContactRequestPayloadSchema,
239
- 'contact.added': SseContactPayloadSchema,
240
- 'contact.updated': SseContactPayloadSchema,
241
- 'contact.removed': SseContactRemovedPayloadSchema,
242
- 'typing': SseTypingPayloadSchema,
243
- 'presence': SsePresencePayloadSchema,
244
- 'runtime.updated': SseRuntimeUpdatedPayloadSchema,
245
- 'turn.updated': SseTurnUpdatedPayloadSchema,
246
- 'runtime.control': SseRuntimeControlPayloadSchema,
247
- 'voice.session.started': SseVoiceSessionEventPayloadSchema,
248
- 'voice.session.ended': SseVoiceSessionEventPayloadSchema,
249
- 'replay.expired': SseReplayExpiredPayloadSchema,
250
- 'error': SseErrorPayloadSchema,
251
- };
252
- /**
253
- * Subscription families (`?events=` filter). Lifecycle events (`connected`,
254
- * `agent.context`, `heartbeat`, `replay.expired`, `error`) are always sent.
255
- */
256
- export const SSE_EVENT_FAMILIES = [
257
- 'messages',
258
- 'contacts',
259
- 'typing_presence',
260
- 'runtime_turn',
261
- 'voice',
262
- ];
263
- export const SseEventFamilySchema = z.enum(SSE_EVENT_FAMILIES);
264
- export const SSE_EVENT_FAMILY_BY_TYPE = {
265
- 'connected': 'lifecycle',
266
- 'agent.context': 'lifecycle',
267
- 'heartbeat': 'lifecycle',
268
- 'message.created': 'messages',
269
- 'message.updated': 'messages',
270
- 'message.deleted': 'messages',
271
- 'conversation.updated': 'messages',
272
- 'contact.request': 'contacts',
273
- 'contact.approved': 'contacts',
274
- 'contact.added': 'contacts',
275
- 'contact.updated': 'contacts',
276
- 'contact.removed': 'contacts',
277
- 'typing': 'typing_presence',
278
- 'presence': 'typing_presence',
279
- 'runtime.updated': 'runtime_turn',
280
- 'turn.updated': 'runtime_turn',
281
- 'runtime.control': 'runtime_turn',
282
- 'voice.session.started': 'voice',
283
- 'voice.session.ended': 'voice',
284
- 'replay.expired': 'lifecycle',
285
- 'error': 'lifecycle',
286
- };
287
- /**
288
- * A parsed SSE frame: `id:` (replay cursor), `event:`, and the JSON-decoded
289
- * `data:` payload. Validate `data` with SSE_EVENT_PAYLOAD_SCHEMAS[event].
290
- */
291
- export const SseEventEnvelopeSchema = z.object({
292
- id: z.string().optional(),
293
- event: SseEventTypeSchema,
294
- data: z.unknown(),
295
- });