@linkshell/gateway 0.3.9 → 0.4.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 (41) hide show
  1. package/Dockerfile +1 -3
  2. package/README.md +13 -14
  3. package/dist/gateway/src/agent-permission-http.d.ts +74 -19
  4. package/dist/gateway/src/agent-permission-http.js +56 -16
  5. package/dist/gateway/src/agent-permission-http.js.map +1 -1
  6. package/dist/gateway/src/embedded.js +61 -153
  7. package/dist/gateway/src/embedded.js.map +1 -1
  8. package/dist/gateway/src/index.js +98 -193
  9. package/dist/gateway/src/index.js.map +1 -1
  10. package/dist/gateway/src/pairings.d.ts +3 -3
  11. package/dist/gateway/src/pairings.js +5 -4
  12. package/dist/gateway/src/pairings.js.map +1 -1
  13. package/dist/gateway/src/relay.d.ts +2 -2
  14. package/dist/gateway/src/relay.js +85 -161
  15. package/dist/gateway/src/relay.js.map +1 -1
  16. package/dist/gateway/src/sessions.d.ts +28 -42
  17. package/dist/gateway/src/sessions.js +145 -200
  18. package/dist/gateway/src/sessions.js.map +1 -1
  19. package/dist/gateway/src/state-store.d.ts +6 -9
  20. package/dist/gateway/src/state-store.js +19 -26
  21. package/dist/gateway/src/state-store.js.map +1 -1
  22. package/dist/gateway/src/tokens.d.ts +7 -27
  23. package/dist/gateway/src/tokens.js +60 -86
  24. package/dist/gateway/src/tokens.js.map +1 -1
  25. package/dist/gateway/src/tunnel.d.ts +13 -11
  26. package/dist/gateway/src/tunnel.js +36 -36
  27. package/dist/gateway/src/tunnel.js.map +1 -1
  28. package/dist/gateway/tsconfig.tsbuildinfo +1 -1
  29. package/dist/shared-protocol/src/index.d.ts +11978 -3423
  30. package/dist/shared-protocol/src/index.js +114 -163
  31. package/dist/shared-protocol/src/index.js.map +1 -1
  32. package/package.json +11 -11
  33. package/src/agent-permission-http.ts +63 -20
  34. package/src/embedded.ts +60 -158
  35. package/src/index.ts +98 -199
  36. package/src/pairings.ts +7 -6
  37. package/src/relay.ts +97 -193
  38. package/src/sessions.ts +150 -213
  39. package/src/state-store.ts +25 -41
  40. package/src/tokens.ts +63 -109
  41. package/src/tunnel.ts +43 -49
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
2
  // ── Protocol version ────────────────────────────────────────────────
3
- export const PROTOCOL_VERSION = 2;
3
+ export const PROTOCOL_VERSION = 1;
4
4
  // ── Device & Session enums ──────────────────────────────────────────
5
5
  export const deviceRoleSchema = z.enum(["host", "client"]);
6
6
  export const sessionStateSchema = z.enum([
@@ -19,12 +19,10 @@ export const terminalProviderSchema = z.enum([
19
19
  "custom",
20
20
  ]);
21
21
  export const errorCodeSchema = z.enum([
22
- "device_not_found",
23
22
  "session_not_found",
24
23
  "pairing_expired",
25
24
  "pairing_not_found",
26
25
  "control_conflict",
27
- "device_terminated",
28
26
  "session_terminated",
29
27
  "ack_out_of_range",
30
28
  "invalid_message",
@@ -34,7 +32,7 @@ export const errorCodeSchema = z.enum([
34
32
  export const envelopeSchema = z.object({
35
33
  id: z.string().min(1),
36
34
  type: z.string().min(1),
37
- hostDeviceId: z.string().min(1),
35
+ sessionId: z.string().min(1),
38
36
  terminalId: z.string().min(1).optional(),
39
37
  deviceId: z.string().min(1).optional(),
40
38
  timestamp: z.string().datetime(),
@@ -61,12 +59,13 @@ export const terminalResizePayloadSchema = z.object({
61
59
  export const sessionConnectPayloadSchema = z.object({
62
60
  role: deviceRoleSchema,
63
61
  clientName: z.string().min(1),
62
+ provider: terminalProviderSchema.optional(),
64
63
  protocolVersion: z.number().int().optional(),
65
64
  machineId: z.string().min(1).optional(),
66
65
  hostname: z.string().optional(),
67
66
  platform: z.string().optional(),
68
67
  cwd: z.string().optional(),
69
- capabilities: z.array(z.string().min(1)).optional(),
68
+ projectName: z.string().optional(),
70
69
  });
71
70
  export const terminalExitPayloadSchema = z.object({
72
71
  exitCode: z.number().int().nullable(),
@@ -79,7 +78,7 @@ export const sessionResumePayloadSchema = z.object({
79
78
  // Backward-compatible single-terminal cursor.
80
79
  lastAckedSeq: z.number().int().min(-1).optional().default(-1),
81
80
  // Multi-terminal resume cursor keyed by terminalId.
82
- lastAckedSeqByTerminal: z.record(z.string(), z.number().int().min(-1)).optional().default({}),
81
+ lastAckedSeqByTerminal: z.record(z.number().int().min(-1)).optional().default({}),
83
82
  machineId: z.string().min(1).optional(),
84
83
  });
85
84
  export const sessionHeartbeatPayloadSchema = z.object({
@@ -87,14 +86,14 @@ export const sessionHeartbeatPayloadSchema = z.object({
87
86
  });
88
87
  export const pairingCreatedPayloadSchema = z.object({
89
88
  pairingCode: z.string().length(6),
90
- hostDeviceId: z.string().min(1),
89
+ sessionId: z.string().min(1),
91
90
  expiresAt: z.string().datetime(),
92
91
  });
93
92
  export const sessionClaimPayloadSchema = z.object({
94
93
  pairingCode: z.string().length(6),
95
94
  });
96
95
  export const sessionClaimedPayloadSchema = z.object({
97
- hostDeviceId: z.string().min(1),
96
+ sessionId: z.string().min(1),
98
97
  });
99
98
  export const controlClaimPayloadSchema = z.object({
100
99
  deviceId: z.string().min(1),
@@ -146,13 +145,15 @@ export const screenIcePayloadSchema = z.object({
146
145
  });
147
146
  // ── Terminal spawn/list payloads ───────────────────────────────────
148
147
  export const terminalSpawnPayloadSchema = z.object({
149
- cwd: z.string().min(1).optional(),
148
+ cwd: z.string().min(1),
149
+ provider: terminalProviderSchema.optional(),
150
150
  });
151
151
  export const terminalInfoSchema = z.object({
152
152
  terminalId: z.string().min(1),
153
153
  cwd: z.string(),
154
+ projectName: z.string(),
155
+ provider: z.string(),
154
156
  status: z.enum(["running", "exited"]),
155
- shell: z.string().optional(),
156
157
  });
157
158
  export const terminalListPayloadSchema = z.object({
158
159
  terminals: z.array(terminalInfoSchema),
@@ -160,7 +161,8 @@ export const terminalListPayloadSchema = z.object({
160
161
  export const terminalSpawnedPayloadSchema = z.object({
161
162
  terminalId: z.string().min(1),
162
163
  cwd: z.string(),
163
- shell: z.string().optional(),
164
+ projectName: z.string(),
165
+ provider: z.string().optional(),
164
166
  });
165
167
  export const terminalKillPayloadSchema = z.object({
166
168
  terminalId: z.string().min(1),
@@ -201,7 +203,7 @@ export const terminalFileReadResultPayloadSchema = z.object({
201
203
  error: z.string().optional(),
202
204
  requestId: z.string().min(1).optional(),
203
205
  });
204
- // ── Legacy terminal status payloads ─────────────────────────────────
206
+ // ── Terminal status payloads (from Claude Code hooks) ────────────────
205
207
  export const terminalStatusPayloadSchema = z.object({
206
208
  phase: z.enum([
207
209
  "thinking",
@@ -262,14 +264,14 @@ export const tunnelRequestPayloadSchema = z.object({
262
264
  requestId: z.string().min(1),
263
265
  method: z.string().min(1),
264
266
  url: z.string(),
265
- headers: z.record(z.string(), z.string()),
267
+ headers: z.record(z.string()),
266
268
  body: z.string().nullable(), // base64 encoded
267
269
  port: z.number().int().min(1).max(65535),
268
270
  });
269
271
  export const tunnelResponsePayloadSchema = z.object({
270
272
  requestId: z.string().min(1),
271
273
  statusCode: z.number().int(),
272
- headers: z.record(z.string(), z.string()),
274
+ headers: z.record(z.string()),
273
275
  body: z.string(), // base64 encoded chunk
274
276
  isFinal: z.boolean(),
275
277
  });
@@ -301,7 +303,6 @@ export const agentReasoningEffortSchema = z.enum([
301
303
  "high",
302
304
  "xhigh",
303
305
  ]);
304
- export const agentServiceTierSchema = z.enum(["standard", "fast"]);
305
306
  export const agentPermissionModeSchema = z.enum([
306
307
  "read_only",
307
308
  "workspace_write",
@@ -309,12 +310,10 @@ export const agentPermissionModeSchema = z.enum([
309
310
  ]);
310
311
  export const agentCollaborationModeSchema = z.enum(["default", "plan"]);
311
312
  export const agentContentBlockSchema = z.object({
312
- type: z.enum(["text", "image", "file"]),
313
+ type: z.enum(["text", "image"]),
313
314
  text: z.string().optional(),
314
315
  data: z.string().optional(),
315
316
  mimeType: z.string().optional(),
316
- path: z.string().optional(),
317
- name: z.string().optional(),
318
317
  });
319
318
  export const agentMessageSchema = z.object({
320
319
  id: z.string().min(1),
@@ -345,11 +344,6 @@ export const agentPermissionSchema = z.object({
345
344
  export const agentModelOptionSchema = z.object({
346
345
  id: z.string().min(1),
347
346
  label: z.string().min(1),
348
- reasoningEfforts: z.array(agentReasoningEffortSchema).optional(),
349
- defaultReasoningEffort: agentReasoningEffortSchema.optional(),
350
- speedTiers: z.array(agentServiceTierSchema).optional(),
351
- supportsImages: z.boolean().optional(),
352
- description: z.string().optional(),
353
347
  });
354
348
  export const agentCommandDescriptorSchema = z.object({
355
349
  id: z.string().min(1),
@@ -379,19 +373,14 @@ export const agentProviderCapabilitySchema = z.object({
379
373
  supportsPermission: z.boolean().optional(),
380
374
  supportsPlan: z.boolean().optional(),
381
375
  supportsCancel: z.boolean().optional(),
382
- providerProtocol: z.string().optional(),
383
- modelsSource: z.enum(["runtime", "fallback", "static", "unavailable"]).optional(),
384
- modelListError: z.string().optional(),
385
376
  models: z.array(agentModelOptionSchema).optional(),
386
377
  defaultModel: z.string().min(1).optional(),
387
378
  reasoningEfforts: z.array(agentReasoningEffortSchema).optional(),
388
- speedTiers: z.array(agentServiceTierSchema).optional(),
389
- defaultServiceTier: agentServiceTierSchema.optional(),
390
379
  permissionModes: z.array(agentPermissionModeSchema).optional(),
391
380
  commands: z.array(agentCommandDescriptorSchema).optional(),
392
381
  modes: z.array(agentModeDescriptorSchema).optional(),
393
382
  currentMode: z.string().optional(),
394
- features: z.record(z.string(), z.boolean()).optional(),
383
+ features: z.record(z.boolean()).optional(),
395
384
  });
396
385
  export const agentCapabilitiesPayloadSchema = z.object({
397
386
  enabled: z.boolean(),
@@ -399,7 +388,6 @@ export const agentCapabilitiesPayloadSchema = z.object({
399
388
  machineId: z.string().min(1).optional(),
400
389
  providers: z.array(agentProviderCapabilitySchema).optional(),
401
390
  protocolVersion: z.number().int().optional(),
402
- capabilitiesRevision: z.number().int().optional(),
403
391
  error: z.string().optional(),
404
392
  supportsSessionList: z.boolean().default(false),
405
393
  supportsSessionLoad: z.boolean().default(false),
@@ -409,6 +397,60 @@ export const agentCapabilitiesPayloadSchema = z.object({
409
397
  supportsPlan: z.boolean().default(false),
410
398
  supportsCancel: z.boolean().default(false),
411
399
  });
400
+ export const agentInitializePayloadSchema = z.object({});
401
+ export const agentSessionNewPayloadSchema = z.object({
402
+ cwd: z.string().optional(),
403
+ provider: agentProviderSchema.optional(),
404
+ mcpServers: z.record(z.unknown()).optional(),
405
+ });
406
+ export const agentSessionLoadPayloadSchema = z.object({
407
+ agentSessionId: z.string().min(1),
408
+ cwd: z.string().optional(),
409
+ });
410
+ export const agentSessionListPayloadSchema = z.object({});
411
+ export const agentPromptPayloadSchema = z.object({
412
+ agentSessionId: z.string().optional(),
413
+ clientMessageId: z.string().min(1),
414
+ contentBlocks: z.array(agentContentBlockSchema).min(1),
415
+ model: z.string().min(1).optional(),
416
+ reasoningEffort: agentReasoningEffortSchema.optional(),
417
+ permissionMode: agentPermissionModeSchema.optional(),
418
+ });
419
+ export const agentCancelPayloadSchema = z.object({
420
+ agentSessionId: z.string().optional(),
421
+ });
422
+ export const agentUpdatePayloadSchema = z.object({
423
+ agentSessionId: z.string().optional(),
424
+ kind: z.enum(["message", "message_delta", "tool_call", "tool_result", "plan", "status", "error"]),
425
+ message: agentMessageSchema.optional(),
426
+ delta: z.string().optional(),
427
+ toolCall: agentToolCallSchema.optional(),
428
+ plan: z.array(z.object({
429
+ id: z.string().min(1),
430
+ text: z.string().min(1),
431
+ status: z.enum(["pending", "in_progress", "completed"]),
432
+ })).optional(),
433
+ status: z.enum(["idle", "running", "waiting_permission", "error"]).optional(),
434
+ error: z.string().optional(),
435
+ });
436
+ export const agentPermissionRequestPayloadSchema = agentPermissionSchema.extend({
437
+ agentSessionId: z.string().optional(),
438
+ });
439
+ export const agentPermissionResponsePayloadSchema = z.object({
440
+ agentSessionId: z.string().optional(),
441
+ requestId: z.string().min(1),
442
+ outcome: z.enum(["allow", "deny", "cancelled"]),
443
+ optionId: z.string().optional(),
444
+ });
445
+ export const agentSnapshotPayloadSchema = z.object({
446
+ agentSessionId: z.string().optional(),
447
+ capabilities: agentCapabilitiesPayloadSchema.optional(),
448
+ messages: z.array(agentMessageSchema).default([]),
449
+ toolCalls: z.array(agentToolCallSchema).default([]),
450
+ pendingPermissions: z.array(agentPermissionSchema).default([]),
451
+ status: z.enum(["unavailable", "idle", "running", "waiting_permission", "error"]).default("unavailable"),
452
+ error: z.string().optional(),
453
+ });
412
454
  // ── Agent Workspace v2 payloads ────────────────────────────────────
413
455
  export const agentV2StatusSchema = z.enum([
414
456
  "unavailable",
@@ -487,16 +529,13 @@ export const agentV2SubagentActionSchema = z.object({
487
529
  model: z.string().optional(),
488
530
  receiverThreadIds: z.array(z.string().min(1)).default([]),
489
531
  receiverAgents: z.array(agentV2SubagentRefSchema).default([]),
490
- agentStates: z.record(z.string(), agentV2SubagentStateSchema).default({}),
532
+ agentStates: z.record(agentV2SubagentStateSchema).default({}),
491
533
  });
492
534
  export const agentV2TimelineItemSchema = z.object({
493
535
  id: z.string().min(1),
494
536
  conversationId: z.string().min(1),
495
537
  type: z.enum(["message", "tool_call", "plan", "permission", "status", "error"]),
496
538
  kind: agentV2TimelineKindSchema.optional(),
497
- revision: z.number().int().nonnegative().optional(),
498
- source: z.enum(["device", "device-history", "device-live", "app-server", "cache"]).optional(),
499
- canonical: z.boolean().optional(),
500
539
  turnId: z.string().optional(),
501
540
  itemId: z.string().optional(),
502
541
  role: z.enum(["user", "assistant", "system"]).optional(),
@@ -515,7 +554,7 @@ export const agentV2TimelineItemSchema = z.object({
515
554
  permission: agentPermissionSchema.optional(),
516
555
  status: agentV2StatusSchema.optional(),
517
556
  error: z.string().optional(),
518
- metadata: z.record(z.string(), z.unknown()).optional(),
557
+ metadata: z.record(z.unknown()).optional(),
519
558
  createdAt: z.number(),
520
559
  updatedAt: z.number().optional(),
521
560
  isStreaming: z.boolean().optional(),
@@ -528,16 +567,10 @@ export const agentV2ConversationSchema = z.object({
528
567
  title: z.string().optional(),
529
568
  model: z.string().optional(),
530
569
  reasoningEffort: agentReasoningEffortSchema.optional(),
531
- serviceTier: agentServiceTierSchema.optional(),
532
570
  permissionMode: agentPermissionModeSchema.optional(),
533
571
  collaborationMode: agentCollaborationModeSchema.optional(),
534
572
  status: agentV2StatusSchema.default("idle"),
535
573
  archived: z.boolean().default(false),
536
- timelineRevision: z.number().int().nonnegative().optional(),
537
- historyComplete: z.boolean().optional(),
538
- runningTurnId: z.string().optional(),
539
- source: z.enum(["device", "device-history", "device-live", "app-server", "cache"]).optional(),
540
- canonical: z.boolean().optional(),
541
574
  lastMessagePreview: z.string().optional(),
542
575
  lastActivityAt: z.number(),
543
576
  createdAt: z.number(),
@@ -553,7 +586,6 @@ export const agentV2ConversationOpenPayloadSchema = z.object({
553
586
  provider: agentProviderSchema.optional(),
554
587
  model: z.string().optional(),
555
588
  reasoningEffort: agentReasoningEffortSchema.optional(),
556
- serviceTier: agentServiceTierSchema.optional(),
557
589
  permissionMode: agentPermissionModeSchema.optional(),
558
590
  collaborationMode: agentCollaborationModeSchema.optional(),
559
591
  title: z.string().optional(),
@@ -561,11 +593,6 @@ export const agentV2ConversationOpenPayloadSchema = z.object({
561
593
  export const agentV2ConversationOpenedPayloadSchema = z.object({
562
594
  conversation: agentV2ConversationSchema,
563
595
  snapshot: z.array(agentV2TimelineItemSchema).default([]),
564
- revision: z.number().int().nonnegative().optional(),
565
- cursor: z.string().optional(),
566
- hasMore: z.boolean().optional(),
567
- source: z.enum(["device", "device-history", "device-live", "app-server", "cache"]).optional(),
568
- canonical: z.boolean().optional(),
569
596
  });
570
597
  export const agentV2ConversationListPayloadSchema = z.object({
571
598
  includeArchived: z.boolean().optional().default(false),
@@ -577,11 +604,10 @@ export const agentV2PromptPayloadSchema = z.object({
577
604
  conversationId: z.string().min(1),
578
605
  clientMessageId: z.string().min(1),
579
606
  contentBlocks: z.array(agentContentBlockSchema).min(1),
580
- model: z.string().min(1).nullable().optional(),
581
- reasoningEffort: agentReasoningEffortSchema.nullable().optional(),
582
- serviceTier: agentServiceTierSchema.nullable().optional(),
583
- permissionMode: agentPermissionModeSchema.nullable().optional(),
584
- collaborationMode: agentCollaborationModeSchema.nullable().optional(),
607
+ model: z.string().min(1).optional(),
608
+ reasoningEffort: agentReasoningEffortSchema.optional(),
609
+ permissionMode: agentPermissionModeSchema.optional(),
610
+ collaborationMode: agentCollaborationModeSchema.optional(),
585
611
  });
586
612
  export const agentV2CommandExecutePayloadSchema = z.object({
587
613
  conversationId: z.string().min(1),
@@ -602,7 +628,7 @@ export const agentV2PermissionRespondPayloadSchema = z.object({
602
628
  export const agentV2StructuredInputRespondPayloadSchema = z.object({
603
629
  conversationId: z.string().min(1),
604
630
  requestId: z.string().min(1),
605
- answers: z.record(z.string(), z.array(z.string())),
631
+ answers: z.record(z.array(z.string())),
606
632
  });
607
633
  export const agentV2SnapshotRequestPayloadSchema = z.object({
608
634
  conversationId: z.string().optional(),
@@ -612,62 +638,11 @@ export const agentV2SnapshotPayloadSchema = z.object({
612
638
  activeConversationId: z.string().optional(),
613
639
  items: z.array(agentV2TimelineItemSchema).default([]),
614
640
  machineId: z.string().min(1).optional(),
615
- revision: z.number().int().nonnegative().optional(),
616
- cursor: z.string().optional(),
617
- hasMore: z.boolean().optional(),
618
- source: z.enum(["device", "device-history", "device-live", "app-server", "cache"]).optional(),
619
- canonical: z.boolean().optional(),
620
- });
621
- export const agentV2HistoryRequestPayloadSchema = z.object({
622
- conversationId: z.string().min(1),
623
- cursor: z.string().optional(),
624
- limit: z.number().int().positive().max(200).optional().default(80),
625
- direction: z.enum(["older", "newer"]).optional().default("older"),
626
- });
627
- export const agentV2HistoryPagePayloadSchema = z.object({
628
- conversationId: z.string().min(1),
629
- conversation: agentV2ConversationSchema.optional(),
630
- items: z.array(agentV2TimelineItemSchema).default([]),
631
- revision: z.number().int().nonnegative(),
632
- cursor: z.string().optional(),
633
- hasMore: z.boolean().default(false),
634
- source: z.enum(["device", "device-history", "device-live", "app-server", "cache"]).default("device-history"),
635
- canonical: z.boolean().default(true),
636
- });
637
- export const agentV2DeltaRequestPayloadSchema = z.object({
638
- conversationId: z.string().min(1),
639
- sinceRevision: z.number().int().nonnegative().optional().default(0),
640
- limit: z.number().int().positive().max(500).optional().default(100),
641
- });
642
- export const agentV2DeltaPayloadSchema = z.object({
643
- conversationId: z.string().min(1),
644
- conversation: agentV2ConversationSchema.optional(),
645
- items: z.array(agentV2TimelineItemSchema).default([]),
646
- sinceRevision: z.number().int().nonnegative().optional(),
647
- revision: z.number().int().nonnegative(),
648
- reset: z.boolean().optional().default(false),
649
- cursor: z.string().optional(),
650
- hasMore: z.boolean().default(false),
651
- source: z.enum(["device", "device-history", "device-live", "app-server", "cache"]).default("device-live"),
652
- canonical: z.boolean().default(true),
653
- });
654
- export const agentV2RunningStatePayloadSchema = z.object({
655
- conversationId: z.string().min(1),
656
- status: agentV2StatusSchema,
657
- runningTurnId: z.string().optional(),
658
- revision: z.number().int().nonnegative().optional(),
659
- error: z.string().optional(),
660
- updatedAt: z.number(),
661
- source: z.enum(["device", "device-history", "device-live", "app-server", "cache"]).default("device-live"),
662
- canonical: z.boolean().default(true),
663
641
  });
664
642
  export const agentV2EventPayloadSchema = z.object({
665
643
  conversationId: z.string().min(1),
666
644
  conversation: agentV2ConversationSchema.optional(),
667
645
  item: agentV2TimelineItemSchema.optional(),
668
- revision: z.number().int().nonnegative().optional(),
669
- source: z.enum(["device", "device-history", "device-live", "app-server", "cache"]).optional(),
670
- canonical: z.boolean().optional(),
671
646
  patch: z.object({
672
647
  itemId: z.string().min(1),
673
648
  kind: agentV2TimelineKindSchema.optional(),
@@ -688,7 +663,7 @@ export const agentV2EventPayloadSchema = z.object({
688
663
  })).optional(),
689
664
  permission: agentPermissionSchema.optional(),
690
665
  error: z.string().optional(),
691
- metadata: z.record(z.string(), z.unknown()).optional(),
666
+ metadata: z.record(z.unknown()).optional(),
692
667
  updatedAt: z.number().optional(),
693
668
  isStreaming: z.boolean().optional(),
694
669
  }).optional(),
@@ -697,58 +672,29 @@ export const agentV2PermissionRequestPayloadSchema = agentPermissionSchema.exten
697
672
  conversationId: z.string().min(1),
698
673
  item: agentV2TimelineItemSchema.optional(),
699
674
  });
700
- export const codexJsonRpcErrorSchema = z.object({
701
- code: z.number().int(),
702
- message: z.string(),
703
- data: z.unknown().optional(),
704
- }).passthrough();
705
- export const agentCodexRpcPayloadSchema = z
706
- .object({
707
- jsonrpc: z.string().optional(),
708
- id: z.union([z.string(), z.number().int()]).optional(),
709
- method: z.string().min(1).optional(),
710
- params: z.unknown().optional(),
711
- result: z.unknown().optional(),
712
- error: codexJsonRpcErrorSchema.optional(),
713
- })
714
- .passthrough()
715
- .superRefine((value, ctx) => {
716
- const hasMethod = typeof value.method === "string";
717
- const hasId = Object.prototype.hasOwnProperty.call(value, "id");
718
- const hasResult = Object.prototype.hasOwnProperty.call(value, "result");
719
- const hasError = Object.prototype.hasOwnProperty.call(value, "error");
720
- if (hasMethod) {
721
- if (hasResult || hasError) {
722
- ctx.addIssue({
723
- code: "custom",
724
- message: "JSON-RPC request/notification cannot include result or error",
725
- });
726
- }
727
- return;
728
- }
729
- if (!hasId) {
730
- ctx.addIssue({
731
- code: "custom",
732
- message: "JSON-RPC response must include id",
733
- });
734
- return;
735
- }
736
- if (hasResult === hasError) {
737
- ctx.addIssue({
738
- code: "custom",
739
- message: "JSON-RPC response must include exactly one of result or error",
740
- });
741
- }
675
+ // Lightweight one-shot notification from CLI to mobile (toast-style).
676
+ // Used to confirm model switches, signal unsupported native commands, etc.
677
+ export const agentV2NoticePayloadSchema = z.object({
678
+ conversationId: z.string().optional(),
679
+ kind: z.enum([
680
+ "model_changed",
681
+ "effort_changed",
682
+ "permission_changed",
683
+ "native_unsupported",
684
+ "info",
685
+ "warning",
686
+ ]),
687
+ title: z.string().min(1),
688
+ detail: z.string().optional(),
689
+ durationMs: z.number().int().positive().optional(),
742
690
  });
743
691
  // ── Protocol message type registry ──────────────────────────────────
744
692
  export const protocolMessageSchemas = {
745
- "device.connect": sessionConnectPayloadSchema,
746
- "device.ack": sessionAckPayloadSchema,
747
- "device.resume": sessionResumePayloadSchema,
748
- "device.heartbeat": sessionHeartbeatPayloadSchema,
749
- "device.error": errorPayloadSchema,
750
- "device.host_disconnected": sessionHostDisconnectedPayloadSchema,
751
- "device.host_reconnected": sessionHostReconnectedPayloadSchema,
693
+ "session.connect": sessionConnectPayloadSchema,
694
+ "session.ack": sessionAckPayloadSchema,
695
+ "session.resume": sessionResumePayloadSchema,
696
+ "session.heartbeat": sessionHeartbeatPayloadSchema,
697
+ "session.error": errorPayloadSchema,
752
698
  "terminal.output": terminalOutputPayloadSchema,
753
699
  "terminal.input": terminalInputPayloadSchema,
754
700
  "terminal.resize": terminalResizePayloadSchema,
@@ -788,6 +734,17 @@ export const protocolMessageSchemas = {
788
734
  "tunnel.ws.close": tunnelWsClosePayloadSchema,
789
735
  "terminal.history.request": terminalHistoryRequestPayloadSchema,
790
736
  "terminal.history.response": terminalHistoryResponsePayloadSchema,
737
+ "agent.initialize": agentInitializePayloadSchema,
738
+ "agent.capabilities": agentCapabilitiesPayloadSchema,
739
+ "agent.session.new": agentSessionNewPayloadSchema,
740
+ "agent.session.load": agentSessionLoadPayloadSchema,
741
+ "agent.session.list": agentSessionListPayloadSchema,
742
+ "agent.prompt": agentPromptPayloadSchema,
743
+ "agent.cancel": agentCancelPayloadSchema,
744
+ "agent.update": agentUpdatePayloadSchema,
745
+ "agent.permission.request": agentPermissionRequestPayloadSchema,
746
+ "agent.permission.response": agentPermissionResponsePayloadSchema,
747
+ "agent.snapshot": agentSnapshotPayloadSchema,
791
748
  "agent.v2.capabilities.request": agentV2CapabilitiesRequestPayloadSchema,
792
749
  "agent.v2.capabilities": agentV2CapabilitiesPayloadSchema,
793
750
  "agent.v2.conversation.open": agentV2ConversationOpenPayloadSchema,
@@ -802,13 +759,8 @@ export const protocolMessageSchemas = {
802
759
  "agent.v2.structured_input.respond": agentV2StructuredInputRespondPayloadSchema,
803
760
  "agent.v2.snapshot.request": agentV2SnapshotRequestPayloadSchema,
804
761
  "agent.v2.snapshot": agentV2SnapshotPayloadSchema,
805
- "agent.v2.history.request": agentV2HistoryRequestPayloadSchema,
806
- "agent.v2.history.page": agentV2HistoryPagePayloadSchema,
807
- "agent.v2.delta.request": agentV2DeltaRequestPayloadSchema,
808
- "agent.v2.delta": agentV2DeltaPayloadSchema,
809
- "agent.v2.running_state": agentV2RunningStatePayloadSchema,
810
762
  "agent.v2.event": agentV2EventPayloadSchema,
811
- "agent.codex.rpc": agentCodexRpcPayloadSchema,
763
+ "agent.v2.notice": agentV2NoticePayloadSchema,
812
764
  };
813
765
  // ── UUID helper (works in Node, Web, and Expo) ─────────────────────
814
766
  function generateId() {
@@ -826,7 +778,7 @@ export function createEnvelope(input) {
826
778
  return {
827
779
  id: input.id ?? generateId(),
828
780
  type: input.type,
829
- hostDeviceId: input.hostDeviceId,
781
+ sessionId: input.sessionId,
830
782
  terminalId: input.terminalId,
831
783
  deviceId: input.deviceId,
832
784
  timestamp: new Date().toISOString(),
@@ -843,7 +795,6 @@ export function serializeEnvelope(message) {
843
795
  return JSON.stringify(message);
844
796
  }
845
797
  export function parseTypedPayload(type, payload) {
846
- const schema = protocolMessageSchemas[type];
847
- return schema.parse(payload);
798
+ return protocolMessageSchemas[type].parse(payload);
848
799
  }
849
800
  //# sourceMappingURL=index.js.map