@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.
- package/Dockerfile +1 -3
- package/README.md +13 -14
- package/dist/gateway/src/agent-permission-http.d.ts +74 -19
- package/dist/gateway/src/agent-permission-http.js +56 -16
- package/dist/gateway/src/agent-permission-http.js.map +1 -1
- package/dist/gateway/src/embedded.js +61 -153
- package/dist/gateway/src/embedded.js.map +1 -1
- package/dist/gateway/src/index.js +98 -193
- package/dist/gateway/src/index.js.map +1 -1
- package/dist/gateway/src/pairings.d.ts +3 -3
- package/dist/gateway/src/pairings.js +5 -4
- package/dist/gateway/src/pairings.js.map +1 -1
- package/dist/gateway/src/relay.d.ts +2 -2
- package/dist/gateway/src/relay.js +85 -161
- package/dist/gateway/src/relay.js.map +1 -1
- package/dist/gateway/src/sessions.d.ts +28 -42
- package/dist/gateway/src/sessions.js +145 -200
- package/dist/gateway/src/sessions.js.map +1 -1
- package/dist/gateway/src/state-store.d.ts +6 -9
- package/dist/gateway/src/state-store.js +19 -26
- package/dist/gateway/src/state-store.js.map +1 -1
- package/dist/gateway/src/tokens.d.ts +7 -27
- package/dist/gateway/src/tokens.js +60 -86
- package/dist/gateway/src/tokens.js.map +1 -1
- package/dist/gateway/src/tunnel.d.ts +13 -11
- package/dist/gateway/src/tunnel.js +36 -36
- package/dist/gateway/src/tunnel.js.map +1 -1
- package/dist/gateway/tsconfig.tsbuildinfo +1 -1
- package/dist/shared-protocol/src/index.d.ts +11978 -3423
- package/dist/shared-protocol/src/index.js +114 -163
- package/dist/shared-protocol/src/index.js.map +1 -1
- package/package.json +11 -11
- package/src/agent-permission-http.ts +63 -20
- package/src/embedded.ts +60 -158
- package/src/index.ts +98 -199
- package/src/pairings.ts +7 -6
- package/src/relay.ts +97 -193
- package/src/sessions.ts +150 -213
- package/src/state-store.ts +25 -41
- package/src/tokens.ts +63 -109
- 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 =
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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)
|
|
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
|
-
|
|
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
|
-
// ──
|
|
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()
|
|
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()
|
|
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"
|
|
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.
|
|
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(
|
|
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.
|
|
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).
|
|
581
|
-
reasoningEffort: agentReasoningEffortSchema.
|
|
582
|
-
|
|
583
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
.
|
|
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
|
-
"
|
|
746
|
-
"
|
|
747
|
-
"
|
|
748
|
-
"
|
|
749
|
-
"
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
847
|
-
return schema.parse(payload);
|
|
798
|
+
return protocolMessageSchemas[type].parse(payload);
|
|
848
799
|
}
|
|
849
800
|
//# sourceMappingURL=index.js.map
|