@linkshell/wire 0.2.8 → 0.2.9

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/dist/updates.js CHANGED
@@ -2,46 +2,12 @@ import { z } from "zod";
2
2
  import { asyncQuestionSchema } from "./async-questions.js";
3
3
  import { sessionGoalSchema } from "./goal.js";
4
4
  import { backgroundTaskSchema, permissionOptionSchema, questionAnswerSchema, questionSchema, sessionDriverSchema, sessionStateSchema, toolKindSchema } from "./model.js";
5
+ import { contentBlockSchema, toolCallContentSchema, toolCallStatusSchema } from "./content.js";
6
+ export * from "./content.js";
5
7
  import { workflowAgentStateSchema, workflowSchema } from "./workflow.js";
6
8
  // Session updates mirror ACP's `SessionUpdate` shapes (discriminated by
7
9
  // `sessionUpdate`) so one renderer works for every agent. LinkShell-specific
8
10
  // updates use the `ls_` prefix.
9
- export const contentBlockSchema = z.discriminatedUnion("type", [
10
- z.object({ type: z.literal("text"), text: z.string() }),
11
- z.object({
12
- type: z.literal("image"),
13
- mimeType: z.string(),
14
- data: z.string().optional(),
15
- uri: z.string().optional(),
16
- }),
17
- z.object({
18
- type: z.literal("resource_link"),
19
- uri: z.string(),
20
- name: z.string(),
21
- /** What the link names: a file (default), a skill the user invoked, or another agent. */
22
- kind: z.enum(["file", "skill", "agent"]).optional(),
23
- }),
24
- ]);
25
- export const toolCallStatusSchema = z.enum(["pending", "in_progress", "completed", "failed"]);
26
- export const toolCallContentSchema = z.discriminatedUnion("type", [
27
- z.object({ type: z.literal("content"), content: contentBlockSchema }),
28
- /** ACP diff: full before/after text. */
29
- z.object({
30
- type: z.literal("diff"),
31
- path: z.string(),
32
- oldText: z.string().nullable().optional(),
33
- newText: z.string(),
34
- }),
35
- /** Unified diff, for agents (Codex) that report patches rather than file text. */
36
- z.object({
37
- type: z.literal("patch"),
38
- path: z.string(),
39
- change: z.enum(["add", "delete", "update"]),
40
- movePath: z.string().optional(),
41
- diff: z.string(),
42
- }),
43
- z.object({ type: z.literal("terminal"), terminalId: z.string() }),
44
- ]);
45
11
  export const toolCallLocationSchema = z.object({
46
12
  path: z.string(),
47
13
  line: z.number().int().optional(),
@@ -62,6 +28,8 @@ export const toolDetailSchema = z.discriminatedUnion("type", [
62
28
  agentType: z.string().optional(),
63
29
  /** A named agent's address, distinct from its role. */
64
30
  name: z.string().optional(),
31
+ nativeSessionId: z.string().optional(),
32
+ canCancel: z.boolean().optional(),
65
33
  model: z.string().optional(),
66
34
  /** Agent outcome when a tool's coarse completed/failed state is insufficient. */
67
35
  state: workflowAgentStateSchema.optional(),
@@ -81,16 +49,26 @@ export const planEntrySchema = z.object({
81
49
  priority: z.enum(["high", "medium", "low"]).default("medium"),
82
50
  status: z.enum(["pending", "in_progress", "completed"]),
83
51
  });
84
- export const stopReasonSchema = z.enum(["end_turn", "cancelled", "error", "max_tokens", "refusal"]);
52
+ export const stopReasonSchema = z.enum(["end_turn", "cancelled", "error", "max_tokens", "max_turn_requests", "refusal", "unknown"]);
85
53
  export const sessionConfigOptionSchema = z.object({
86
54
  /** Agent-defined id; "model" and "mode" are the common ones. */
87
55
  id: z.string(),
88
56
  name: z.string(),
89
- category: z.enum(["model", "mode", "effort", "other"]).default("other"),
57
+ description: z.string().optional(),
58
+ type: z.enum(["select", "boolean"]).optional(),
59
+ category: z.enum(["model", "model_config", "mode", "effort", "other"]).default("other"),
90
60
  current: z.string(),
91
- values: z.array(z.object({ value: z.string(), name: z.string(), description: z.string().optional() })),
61
+ values: z.array(z.object({ value: z.string(), name: z.string(), description: z.string().optional(), group: z.string().optional() })),
92
62
  });
93
63
  export const sessionUpdateSchema = z.discriminatedUnion("sessionUpdate", [
64
+ z.object({
65
+ sessionUpdate: z.literal("ls_message"),
66
+ messageId: z.string(), role: z.enum(["user", "agent", "thought", "session"]),
67
+ parentToolCallId: z.string().optional(),
68
+ content: z.array(contentBlockSchema).optional(),
69
+ append: z.boolean().optional(),
70
+ senderSessionId: z.string().optional(), recipientSessionId: z.string().optional(),
71
+ }),
94
72
  z.object({
95
73
  sessionUpdate: z.literal("user_message_chunk"),
96
74
  messageId: z.string().optional(),
@@ -114,9 +92,11 @@ export const sessionUpdateSchema = z.discriminatedUnion("sessionUpdate", [
114
92
  /** Set when a sub-agent made this call: the sub-agent's own (spawn) tool call. */
115
93
  parentToolCallId: z.string().optional(),
116
94
  title: z.string(),
95
+ name: z.string().optional(),
117
96
  kind: toolKindSchema,
118
97
  status: toolCallStatusSchema,
119
98
  rawInput: z.unknown().optional(),
99
+ rawOutput: z.unknown().optional(),
120
100
  content: z.array(toolCallContentSchema).optional(),
121
101
  locations: z.array(toolCallLocationSchema).optional(),
122
102
  detail: toolDetailSchema.optional(),
@@ -127,16 +107,28 @@ export const sessionUpdateSchema = z.discriminatedUnion("sessionUpdate", [
127
107
  parentToolCallId: z.string().optional(),
128
108
  status: toolCallStatusSchema.optional(),
129
109
  title: z.string().optional(),
110
+ name: z.string().optional(),
111
+ kind: toolKindSchema.optional(),
112
+ rawInput: z.unknown().optional(),
113
+ locations: z.array(toolCallLocationSchema).optional(),
130
114
  detail: toolDetailSchema.optional(),
131
115
  /** Replaces the tool call's content when present. */
132
116
  content: z.array(toolCallContentSchema).optional(),
133
117
  /** Streamed output appended to the tool call's running output. */
134
118
  appendOutput: z.string().optional(),
119
+ replaceOutput: z.string().optional(),
120
+ /** ACP v2 null/empty content clears every previous diff and attachment. */
121
+ replaceContent: z.boolean().optional(),
135
122
  rawOutput: z.unknown().optional(),
136
123
  }),
137
124
  z.object({
138
125
  sessionUpdate: z.literal("plan"),
139
126
  entries: z.array(planEntrySchema),
127
+ planId: z.string().optional(),
128
+ title: z.string().optional(),
129
+ markdown: z.string().nullable().optional(),
130
+ path: z.string().nullable().optional(),
131
+ removed: z.boolean().optional(),
140
132
  }),
141
133
  z.object({
142
134
  sessionUpdate: z.literal("ls_goal"),
@@ -152,13 +144,16 @@ export const sessionUpdateSchema = z.discriminatedUnion("sessionUpdate", [
152
144
  }),
153
145
  z.object({
154
146
  sessionUpdate: z.literal("session_info_update"),
155
- title: z.string().optional(),
147
+ title: z.string().nullable().optional(),
148
+ updatedAt: z.string().nullable().optional(),
156
149
  model: z.string().optional(),
157
150
  }),
158
151
  z.object({
159
152
  sessionUpdate: z.literal("usage_update"),
160
153
  usedTokens: z.number().optional(),
161
154
  contextWindow: z.number().optional(),
155
+ cost: z.object({ amount: z.number(), currency: z.string() }).nullable().optional(),
156
+ tokens: z.object({ totalTokens: z.number(), inputTokens: z.number(), outputTokens: z.number(), thoughtTokens: z.number().nullish(), cachedReadTokens: z.number().nullish(), cachedWriteTokens: z.number().nullish() }).optional(),
162
157
  }),
163
158
  // ── LinkShell extensions ──
164
159
  z.object({
@@ -199,9 +194,13 @@ export const sessionUpdateSchema = z.discriminatedUnion("sessionUpdate", [
199
194
  z.object({
200
195
  sessionUpdate: z.literal("ls_permission"),
201
196
  requestId: z.string(),
197
+ childSessionId: z.string().optional(),
202
198
  toolCallId: z.string().optional(),
203
199
  title: z.string(),
204
200
  detail: z.string().optional(),
201
+ tool: z.object({ title: z.string().optional(), kind: toolKindSchema.optional(), rawInput: z.unknown().optional(), content: z.array(toolCallContentSchema).optional(), locations: z.array(toolCallLocationSchema).optional() }).optional(),
202
+ /** URL interactions stay out of form answers and are opened only after consent. */
203
+ url: z.object({ url: z.string(), elicitationId: z.string() }).optional(),
205
204
  options: z.array(permissionOptionSchema).min(1),
206
205
  /**
207
206
  * The agent is asking the user something: answer with `sessions.answer`.
@@ -225,6 +224,7 @@ export const sessionUpdateSchema = z.discriminatedUnion("sessionUpdate", [
225
224
  z.object({
226
225
  sessionUpdate: z.literal("ls_status"),
227
226
  state: sessionStateSchema,
227
+ turnActive: z.boolean().optional(),
228
228
  }),
229
229
  /** A background task as it is now (the whole record each time: the latest for its id holds). */
230
230
  z.object({
@@ -238,6 +238,8 @@ export const sessionUpdateSchema = z.discriminatedUnion("sessionUpdate", [
238
238
  hint: z.string().optional(),
239
239
  }),
240
240
  ]);
241
+ /** Live ACP notices are not session history and never change execution state. */
242
+ export const sessionNoticeSchema = z.object({ severity: z.string(), title: z.string(), description: z.string().optional() });
241
243
  /** One entry in a session's append-only event log. */
242
244
  export const sessionEventSchema = z.object({
243
245
  sessionId: z.string(),
@@ -1 +1 @@
1
- {"version":3,"file":"updates.js","sourceRoot":"","sources":["../src/updates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"updates.js","sourceRoot":"","sources":["../src/updates.ts"],"names":[],"mappings":"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"}
@@ -126,6 +126,7 @@ export declare const workflowSchema: z.ZodObject<{
126
126
  result?: string | undefined;
127
127
  }>, "many">>;
128
128
  }, "strip", z.ZodTypeAny, {
129
+ name?: string | undefined;
129
130
  completed?: number | undefined;
130
131
  state?: "paused" | "running" | "completed" | "failed" | "stopped" | undefined;
131
132
  tokens?: number | undefined;
@@ -133,7 +134,6 @@ export declare const workflowSchema: z.ZodObject<{
133
134
  startedAt?: number | undefined;
134
135
  endedAt?: number | undefined;
135
136
  runId?: string | undefined;
136
- name?: string | undefined;
137
137
  started?: number | undefined;
138
138
  phases?: {
139
139
  id: string;
@@ -155,6 +155,7 @@ export declare const workflowSchema: z.ZodObject<{
155
155
  result?: string | undefined;
156
156
  }[] | undefined;
157
157
  }, {
158
+ name?: string | undefined;
158
159
  completed?: number | undefined;
159
160
  state?: "paused" | "running" | "completed" | "failed" | "stopped" | undefined;
160
161
  tokens?: number | undefined;
@@ -162,7 +163,6 @@ export declare const workflowSchema: z.ZodObject<{
162
163
  startedAt?: number | undefined;
163
164
  endedAt?: number | undefined;
164
165
  runId?: string | undefined;
165
- name?: string | undefined;
166
166
  started?: number | undefined;
167
167
  phases?: {
168
168
  id: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@linkshell/wire",
3
- "version": "0.2.8",
3
+ "version": "0.2.9",
4
4
  "description": "Wire protocol for LinkShell v2: session model, JSON-RPC methods, end-to-end encryption and the relay client.",
5
5
  "license": "MIT",
6
6
  "repository": {
package/src/acp.ts ADDED
@@ -0,0 +1,49 @@
1
+ import { z } from "zod";
2
+
3
+ const env = z.record(z.string());
4
+ export const mcpServerSchema = z.discriminatedUnion("type", [
5
+ z.object({ type: z.literal("stdio"), name: z.string().min(1), command: z.string().min(1), args: z.array(z.string()).default([]), env: env.default({}) }),
6
+ z.object({ type: z.literal("http"), name: z.string().min(1), url: z.string().url(), headers: env.default({}) }),
7
+ z.object({ type: z.literal("sse"), name: z.string().min(1), url: z.string().url(), headers: env.default({}) }),
8
+ z.object({ type: z.literal("acp"), name: z.string().min(1), command: z.string().min(1), args: z.array(z.string()).default([]), env: env.default({}) }),
9
+ ]);
10
+ export type AcpMcpServer = z.infer<typeof mcpServerSchema>;
11
+
12
+ /** Session tool configuration is persisted on the host, outside the transcript. */
13
+ export const acpAgentSettingsSchema = z.object({
14
+ protocolVersion: z.union([z.literal(1), z.literal(2)]).default(1),
15
+ experimental: z.boolean().default(true),
16
+ mcpServers: z.array(mcpServerSchema).max(32).default([]),
17
+ additionalDirectories: z.array(z.string().min(1)).max(32).default([]),
18
+ });
19
+ export type AcpAgentSettings = z.infer<typeof acpAgentSettingsSchema>;
20
+
21
+ export const acpRemoteAgentSchema = z.object({
22
+ id: z.string().regex(/^[a-z][a-z0-9_-]{0,63}$/),
23
+ label: z.string().min(1).max(80),
24
+ transport: z.enum(["stdio", "http", "websocket"]),
25
+ command: z.string().optional(), args: z.array(z.string()).default([]),
26
+ url: z.string().url().optional(),
27
+ /** Header name to environment-variable name. The UI does not store secrets. */
28
+ headerEnv: env.default({}),
29
+ settings: acpAgentSettingsSchema.default({}),
30
+ });
31
+ export type AcpRemoteAgent = z.infer<typeof acpRemoteAgentSchema>;
32
+
33
+ export const acpAuthMethodSchema = z.object({ id: z.string(), name: z.string(), description: z.string().optional(), type: z.enum(["agent", "terminal"]) });
34
+ export const acpFeaturesSchema = z.object({
35
+ protocolVersion: z.number(),
36
+ authMethods: z.array(acpAuthMethodSchema),
37
+ logout: z.boolean(), providers: z.boolean(), nes: z.boolean(),
38
+ additionalDirectories: z.boolean(), mcpHttp: z.boolean(), mcpSse: z.boolean(),
39
+ });
40
+ export type AcpFeatures = z.infer<typeof acpFeaturesSchema>;
41
+
42
+ export const acpProviderSchema = z.object({
43
+ providerId: z.string(), supported: z.array(z.string()), required: z.boolean(),
44
+ current: z.object({ apiType: z.string(), baseUrl: z.string() }).nullish(),
45
+ });
46
+ export type AcpProvider = z.infer<typeof acpProviderSchema>;
47
+
48
+ /** Editor payloads follow ACP's versioned schema; the host validates before forwarding. */
49
+ export const acpEditorOperationSchema = z.enum(["nes/start", "nes/suggest", "nes/close", "nes/accept", "nes/reject", "document/didOpen", "document/didChange", "document/didClose", "document/didSave", "document/didFocus"]);
package/src/content.ts ADDED
@@ -0,0 +1,63 @@
1
+ import { z } from "zod";
2
+
3
+ const optionalString = z.string().nullish().transform((value) => value ?? undefined);
4
+ const optionalMeta = z.record(z.unknown()).nullish().transform((value) => value ?? undefined);
5
+ const contentMetadata = {
6
+ annotations: z.object({ audience: z.array(z.enum(["user", "assistant"])).nullish().transform((value) => value ?? undefined), priority: z.number().nullish().transform((value) => value ?? undefined), lastModified: optionalString }).passthrough().nullish().transform((value) => value ?? undefined),
7
+ _meta: optionalMeta,
8
+ };
9
+ const contentVariants = z.discriminatedUnion("type", [
10
+ z.object({ type: z.literal("text"), text: z.string(), ...contentMetadata }),
11
+ z.object({
12
+ type: z.literal("image"),
13
+ mimeType: z.string(),
14
+ data: optionalString,
15
+ uri: optionalString,
16
+ ...contentMetadata,
17
+ }),
18
+ z.object({ type: z.literal("audio"), mimeType: z.string(), data: optionalString, uri: optionalString, ...contentMetadata }),
19
+ z.object({
20
+ type: z.literal("resource"),
21
+ resource: z.object({ uri: z.string(), mimeType: optionalString, text: optionalString, blob: optionalString, assetUri: optionalString, _meta: optionalMeta }),
22
+ ...contentMetadata,
23
+ }),
24
+ z.object({
25
+ type: z.literal("resource_link"),
26
+ uri: z.string(),
27
+ name: z.string(),
28
+ title: optionalString,
29
+ description: optionalString,
30
+ mimeType: optionalString,
31
+ size: z.number().nullish().transform((value) => value ?? undefined),
32
+ ...contentMetadata,
33
+ /** What the link names: a file (default), a skill the user invoked, or another agent. */
34
+ kind: z.enum(["file", "skill", "agent"]).optional(),
35
+ }),
36
+ ]);
37
+ export type ContentBlock = z.infer<typeof contentVariants>;
38
+ // Hide the nested validator implementation from every exported RPC declaration.
39
+ export const contentBlockSchema: z.ZodType<ContentBlock, z.ZodTypeDef, unknown> = contentVariants;
40
+
41
+ export const toolCallStatusSchema = z.enum(["pending", "in_progress", "completed", "failed"]);
42
+ export type ToolCallStatus = z.infer<typeof toolCallStatusSchema>;
43
+
44
+ export const toolCallContentSchema = z.discriminatedUnion("type", [
45
+ z.object({ type: z.literal("content"), content: contentBlockSchema }),
46
+ /** ACP diff: full before/after text. */
47
+ z.object({
48
+ type: z.literal("diff"),
49
+ path: z.string(),
50
+ oldText: z.string().nullable().optional(),
51
+ newText: z.string(),
52
+ }),
53
+ /** Unified diff, for agents (Codex) that report patches rather than file text. */
54
+ z.object({
55
+ type: z.literal("patch"),
56
+ path: z.string(),
57
+ change: z.enum(["add", "delete", "update"]),
58
+ movePath: z.string().optional(),
59
+ diff: z.string(),
60
+ }),
61
+ z.object({ type: z.literal("terminal"), terminalId: z.string() }),
62
+ ]);
63
+ export type ToolCallContent = z.infer<typeof toolCallContentSchema>;
package/src/editor.ts ADDED
@@ -0,0 +1,27 @@
1
+ import { z } from "zod";
2
+
3
+ export const textPositionSchema = z.object({ line: z.number().int().nonnegative(), character: z.number().int().nonnegative() });
4
+ export const textRangeSchema = z.object({ start: textPositionSchema, end: textPositionSchema });
5
+ export type TextPosition = z.infer<typeof textPositionSchema>;
6
+ const suggestion = { id: z.string(), uri: z.string() };
7
+ export const editSuggestionSchema = z.discriminatedUnion("kind", [
8
+ z.object({ kind: z.literal("edit"), ...suggestion, edits: z.array(z.object({ range: textRangeSchema, newText: z.string() })), cursorPosition: textPositionSchema.nullish() }),
9
+ z.object({ kind: z.literal("jump"), ...suggestion, position: textPositionSchema }),
10
+ z.object({ kind: z.literal("rename"), ...suggestion, position: textPositionSchema, newName: z.string() }),
11
+ z.object({ kind: z.literal("searchAndReplace"), ...suggestion, search: z.string(), replace: z.string(), isRegex: z.boolean().nullish() }),
12
+ ]);
13
+ export type EditSuggestion = z.infer<typeof editSuggestionSchema>;
14
+ export const editorRequestSchema = z.object({
15
+ agent: z.string(), operation: z.enum(["open", "suggest", "preview", "apply", "save", "reject", "close"]),
16
+ editorId: z.string().optional(), cwd: z.string().optional(), path: z.string().optional(),
17
+ text: z.string().max(262144).optional(), position: textPositionSchema.optional(),
18
+ suggestionId: z.string().optional(), previewId: z.string().optional(),
19
+ });
20
+ export type EditorRequest = z.infer<typeof editorRequestSchema>;
21
+ export const editorResultSchema = z.object({
22
+ editorId: z.string().optional(), path: z.string().optional(), text: z.string().optional(), version: z.number().optional(),
23
+ suggestions: z.array(editSuggestionSchema).optional(),
24
+ preview: z.object({ id: z.string(), path: z.string(), before: z.string(), after: z.string(), kind: z.enum(["edit", "jump", "searchAndReplace"]), position: textPositionSchema.optional() }).optional(),
25
+ position: textPositionSchema.optional(),
26
+ });
27
+ export type EditorResult = z.infer<typeof editorResultSchema>;
package/src/index.ts CHANGED
@@ -11,3 +11,6 @@ export * from "./relay-client.js";
11
11
  export * from "./direct.js";
12
12
  export * from "./computer-preview.js";
13
13
  export * from "./async-questions.js";
14
+ export * from "./questions.js";
15
+ export * from "./acp.js";
16
+ export * from "./editor.js";
package/src/model.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { z } from "zod";
2
2
  import { asyncQuestionSchema } from "./async-questions.js";
3
3
  import { workflowAgentStateSchema, workflowSchema } from "./workflow.js";
4
+ import { toolCallContentSchema } from "./content.js";
4
5
 
5
6
  /**
6
7
  * How far LinkShell can take a given agent. The UI renders capabilities from
@@ -21,6 +22,10 @@ export const agentCapabilitiesSchema = z.object({
21
22
  steer: z.boolean(),
22
23
  permissions: z.boolean(),
23
24
  images: z.boolean(),
25
+ audio: z.boolean().optional(),
26
+ embeddedContext: z.boolean().optional(),
27
+ /** Host-managed ACP settings and optional protocol features. */
28
+ acp: z.boolean().optional(),
24
29
  /**
25
30
  * The agent forks sessions itself, keeping everything it knew. Every agent's
26
31
  * sessions can be forked: without this (or from a single reply, where the
@@ -67,7 +72,7 @@ export type AgentInfo = z.infer<typeof agentInfoSchema>;
67
72
  export const sessionDriverSchema = z.enum(["desktop", "remote", "none"]);
68
73
  export type SessionDriver = z.infer<typeof sessionDriverSchema>;
69
74
 
70
- export const sessionStateSchema = z.enum(["idle", "running", "waiting", "error", "offline"]);
75
+ export const sessionStateSchema = z.enum(["idle", "running", "waiting", "error", "offline", "unknown"]);
71
76
  export type SessionState = z.infer<typeof sessionStateSchema>;
72
77
 
73
78
  export const toolKindSchema = z.enum([
@@ -79,6 +84,7 @@ export const toolKindSchema = z.enum([
79
84
  "execute",
80
85
  "think",
81
86
  "fetch",
87
+ "switch_mode",
82
88
  "other",
83
89
  ]);
84
90
  export type ToolKind = z.infer<typeof toolKindSchema>;
@@ -106,6 +112,14 @@ export type SessionActivity = z.infer<typeof sessionActivitySchema>;
106
112
  */
107
113
  export const questionSchema = z.object({
108
114
  id: z.string(),
115
+ constraints: z.object({
116
+ type: z.enum(["string", "number", "integer", "boolean", "array"]),
117
+ minimum: z.number().optional(), maximum: z.number().optional(),
118
+ minLength: z.number().int().nonnegative().optional(), maxLength: z.number().int().nonnegative().optional(),
119
+ minItems: z.number().int().nonnegative().optional(), maxItems: z.number().int().nonnegative().optional(),
120
+ pattern: z.string().optional(), format: z.string().optional(),
121
+ }).optional(),
122
+ defaults: z.array(z.string()).optional(),
109
123
  /** A short label for the question ("Auth method"). */
110
124
  header: z.string().optional(),
111
125
  text: z.string(),
@@ -131,9 +145,12 @@ export type QuestionAnswer = z.infer<typeof questionAnswerSchema>;
131
145
 
132
146
  export const pendingPermissionSchema = z.object({
133
147
  requestId: z.string(),
148
+ childSessionId: z.string().optional(),
134
149
  toolCallId: z.string().optional(),
135
150
  title: z.string(),
136
151
  detail: z.string().optional(),
152
+ tool: z.object({ title: z.string().optional(), kind: toolKindSchema.optional(), rawInput: z.unknown().optional(), content: z.array(toolCallContentSchema).optional(), locations: z.array(z.object({ path: z.string(), line: z.number().int().optional() })).optional() }).optional(),
153
+ url: z.object({ url: z.string(), elicitationId: z.string() }).optional(),
137
154
  options: z.array(permissionOptionSchema).min(1),
138
155
  /** Set when this is a question to answer (`sessions.answer`) rather than a permission to give. */
139
156
  questions: z.array(questionSchema).optional(),
@@ -150,6 +167,8 @@ export type QueuedMessage = z.infer<typeof queuedMessageSchema>;
150
167
 
151
168
  /** A sub-agent a session started: the tool call it runs under, and how it is doing. */
152
169
  export const subagentInfoSchema = z.object({
170
+ nativeSessionId: z.string().optional(),
171
+ canCancel: z.boolean().optional(),
153
172
  toolCallId: z.string(),
154
173
  parentToolCallId: z.string().optional(),
155
174
  /** What it was asked to do. */
package/src/peer.ts CHANGED
@@ -91,13 +91,21 @@ export class RpcPeer {
91
91
  receive(text: string): void {
92
92
  for (const line of text.split("\n")) {
93
93
  if (!line.trim()) continue;
94
- let message: Record<string, unknown>;
94
+ let message: Record<string, unknown> | Record<string, unknown>[];
95
95
  try {
96
- message = JSON.parse(line) as Record<string, unknown>;
96
+ message = JSON.parse(line) as typeof message;
97
97
  } catch {
98
98
  continue;
99
99
  }
100
- this.dispatch(message);
100
+ if (Array.isArray(message)) {
101
+ if (!message.length || message.length > 128) {
102
+ this.write({ jsonrpc: "2.0", id: null, error: { code: -32600, message: "invalid JSON-RPC batch" } });
103
+ continue;
104
+ }
105
+ const responses: Record<string, unknown>[] = [];
106
+ void Promise.all(message.map((entry) => Promise.resolve(this.dispatch(entry, (response) => { responses.push(response); }))))
107
+ .then(() => { if (responses.length) this.write(responses); });
108
+ } else void this.dispatch(message);
101
109
  }
102
110
  }
103
111
 
@@ -116,7 +124,13 @@ export class RpcPeer {
116
124
  return this.closed;
117
125
  }
118
126
 
119
- private dispatch(message: Record<string, unknown>): void {
127
+ hasPendingRequest(id: RpcId): boolean { return this.pending.has(id); }
128
+
129
+ private dispatch(message: Record<string, unknown>, respond = (response: Record<string, unknown>) => this.write(response)): void | Promise<void> {
130
+ if (!message || typeof message !== "object" || Array.isArray(message)) {
131
+ respond({ jsonrpc: "2.0", id: null, error: { code: -32600, message: "invalid JSON-RPC request" } });
132
+ return;
133
+ }
120
134
  const id = message.id as RpcId | undefined;
121
135
  const method = typeof message.method === "string" ? message.method : undefined;
122
136
 
@@ -139,27 +153,27 @@ export class RpcPeer {
139
153
 
140
154
  const handler = this.options.onRequest;
141
155
  if (!handler) {
142
- this.write({ jsonrpc: "2.0", id, error: { code: RPC_METHOD_NOT_FOUND, message: `no handler for ${method}` } });
156
+ respond({ jsonrpc: "2.0", id, error: { code: RPC_METHOD_NOT_FOUND, message: `no handler for ${method}` } });
143
157
  return;
144
158
  }
145
- Promise.resolve()
159
+ return Promise.resolve()
146
160
  .then(() => handler(method, message.params, id))
147
161
  .then(
148
162
  (result) => {
149
163
  if (result === ABANDON) return;
150
- this.write({ jsonrpc: "2.0", id, result: result ?? {} });
164
+ respond({ jsonrpc: "2.0", id, result: result ?? {} });
151
165
  },
152
166
  (error: unknown) => {
153
167
  const rpcError =
154
168
  error instanceof RpcError
155
169
  ? error
156
170
  : new RpcError(RPC_APP_ERROR, error instanceof Error ? error.message : String(error), { code: "internal" });
157
- this.write({ jsonrpc: "2.0", id, error: rpcError.toObject() });
171
+ respond({ jsonrpc: "2.0", id, error: rpcError.toObject() });
158
172
  },
159
173
  );
160
174
  }
161
175
 
162
- private write(message: Record<string, unknown>): void {
176
+ private write(message: Record<string, unknown> | Record<string, unknown>[]): void {
163
177
  if (this.closed) return;
164
178
  try {
165
179
  this.options.send(JSON.stringify(message));
@@ -0,0 +1,39 @@
1
+ import type { Question, QuestionAnswer } from "./model.js";
2
+
3
+ /** Shared validation keeps the phone's feedback and the host's acceptance identical. */
4
+ export function questionAnswerError(question: Question, answer: QuestionAnswer | undefined): string | undefined {
5
+ const label = question.header ?? question.text;
6
+ const values = answer?.values ?? [];
7
+ const c = question.constraints;
8
+ if (values.length > 1 && question.kind !== "choices") return `${label}只能填写一个答案`;
9
+ if (question.options && values.some((value) => !question.options!.some((option) => option.value === value))) return `${label}包含无效选项`;
10
+ const present = c?.type === "array" ? answer !== undefined : c?.type === "string" ? values[0] !== undefined || !!answer?.other?.trim() : values.some((value) => value !== "") || !!answer?.other?.trim();
11
+ if (!present) return question.required ? `还没回答:${label}` : undefined;
12
+ if (!c) return;
13
+ const value = values[0] ?? "";
14
+ if (c.type === "number" || c.type === "integer") {
15
+ const number = Number(value);
16
+ if (!value.trim() || !Number.isFinite(number) || (c.type === "integer" && !Number.isInteger(number))) return `${label}需要填写${c.type === "integer" ? "整数" : "数字"}`;
17
+ if (c.minimum !== undefined && number < c.minimum) return `${label}不能小于 ${c.minimum}`;
18
+ if (c.maximum !== undefined && number > c.maximum) return `${label}不能大于 ${c.maximum}`;
19
+ }
20
+ if (c.type === "array") {
21
+ if (new Set(values).size !== values.length) return `${label}不能重复选择`;
22
+ if (c.minItems !== undefined && values.length < c.minItems) return `${label}至少选择 ${c.minItems} 项`;
23
+ if (c.maxItems !== undefined && values.length > c.maxItems) return `${label}最多选择 ${c.maxItems} 项`;
24
+ }
25
+ if (c.type === "string") {
26
+ const length = [...value].length;
27
+ if (c.minLength !== undefined && length < c.minLength) return `${label}至少需要 ${c.minLength} 个字符`;
28
+ if (c.maxLength !== undefined && length > c.maxLength) return `${label}最多允许 ${c.maxLength} 个字符`;
29
+ if (c.pattern) {
30
+ try { if (!new RegExp(c.pattern, "u").test(value)) return `${label}格式不符合要求`; }
31
+ catch { return `${label}的格式规则无效`; }
32
+ }
33
+ if (c.format === "email" && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) return `${label}需要有效的邮箱地址`;
34
+ if (c.format === "uri") { try { new URL(value); } catch { return `${label}需要完整的网址`; } }
35
+ if (c.format === "date" && (!/^\d{4}-\d{2}-\d{2}$/.test(value) || !Number.isFinite(Date.parse(value)) || new Date(value).toISOString().slice(0, 10) !== value)) return `${label}需要有效日期(YYYY-MM-DD)`;
36
+ if (c.format === "date-time" && (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/i.test(value) || !Number.isFinite(Date.parse(value)))) return `${label}需要包含时区的有效日期时间`;
37
+ }
38
+ return;
39
+ }