@chances-ai/wire 24.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 (93) hide show
  1. package/dist/rpc/acp/adapter.d.ts +32 -0
  2. package/dist/rpc/acp/adapter.d.ts.map +1 -0
  3. package/dist/rpc/acp/adapter.js +185 -0
  4. package/dist/rpc/acp/adapter.js.map +1 -0
  5. package/dist/rpc/acp/engine-driver.d.ts +128 -0
  6. package/dist/rpc/acp/engine-driver.d.ts.map +1 -0
  7. package/dist/rpc/acp/engine-driver.js +550 -0
  8. package/dist/rpc/acp/engine-driver.js.map +1 -0
  9. package/dist/rpc/acp/event-map.d.ts +22 -0
  10. package/dist/rpc/acp/event-map.d.ts.map +1 -0
  11. package/dist/rpc/acp/event-map.js +205 -0
  12. package/dist/rpc/acp/event-map.js.map +1 -0
  13. package/dist/rpc/acp/load-sdk.d.ts +3 -0
  14. package/dist/rpc/acp/load-sdk.d.ts.map +1 -0
  15. package/dist/rpc/acp/load-sdk.js +24 -0
  16. package/dist/rpc/acp/load-sdk.js.map +1 -0
  17. package/dist/rpc/acp/workspace-query.d.ts +41 -0
  18. package/dist/rpc/acp/workspace-query.d.ts.map +1 -0
  19. package/dist/rpc/acp/workspace-query.js +89 -0
  20. package/dist/rpc/acp/workspace-query.js.map +1 -0
  21. package/dist/rpc/driver.d.ts +42 -0
  22. package/dist/rpc/driver.d.ts.map +1 -0
  23. package/dist/rpc/driver.js +7 -0
  24. package/dist/rpc/driver.js.map +1 -0
  25. package/dist/rpc/event-map.d.ts +8 -0
  26. package/dist/rpc/event-map.d.ts.map +1 -0
  27. package/dist/rpc/event-map.js +91 -0
  28. package/dist/rpc/event-map.js.map +1 -0
  29. package/dist/rpc/index.d.ts +13 -0
  30. package/dist/rpc/index.d.ts.map +1 -0
  31. package/dist/rpc/index.js +18 -0
  32. package/dist/rpc/index.js.map +1 -0
  33. package/dist/rpc/lines.d.ts +2 -0
  34. package/dist/rpc/lines.d.ts.map +1 -0
  35. package/dist/rpc/lines.js +24 -0
  36. package/dist/rpc/lines.js.map +1 -0
  37. package/dist/rpc/protocol.d.ts +315 -0
  38. package/dist/rpc/protocol.d.ts.map +1 -0
  39. package/dist/rpc/protocol.js +70 -0
  40. package/dist/rpc/protocol.js.map +1 -0
  41. package/dist/rpc/rpc-server.d.ts +56 -0
  42. package/dist/rpc/rpc-server.d.ts.map +1 -0
  43. package/dist/rpc/rpc-server.js +305 -0
  44. package/dist/rpc/rpc-server.js.map +1 -0
  45. package/dist/rpc/stdout-guard.d.ts +5 -0
  46. package/dist/rpc/stdout-guard.d.ts.map +1 -0
  47. package/dist/rpc/stdout-guard.js +31 -0
  48. package/dist/rpc/stdout-guard.js.map +1 -0
  49. package/dist/rpc/writer.d.ts +34 -0
  50. package/dist/rpc/writer.d.ts.map +1 -0
  51. package/dist/rpc/writer.js +85 -0
  52. package/dist/rpc/writer.js.map +1 -0
  53. package/dist/serve/acp-session-host.d.ts +120 -0
  54. package/dist/serve/acp-session-host.d.ts.map +1 -0
  55. package/dist/serve/acp-session-host.js +276 -0
  56. package/dist/serve/acp-session-host.js.map +1 -0
  57. package/dist/serve/auth.d.ts +21 -0
  58. package/dist/serve/auth.d.ts.map +1 -0
  59. package/dist/serve/auth.js +58 -0
  60. package/dist/serve/auth.js.map +1 -0
  61. package/dist/serve/highlight.d.ts +25 -0
  62. package/dist/serve/highlight.d.ts.map +1 -0
  63. package/dist/serve/highlight.js +28 -0
  64. package/dist/serve/highlight.js.map +1 -0
  65. package/dist/serve/index.d.ts +14 -0
  66. package/dist/serve/index.d.ts.map +1 -0
  67. package/dist/serve/index.js +23 -0
  68. package/dist/serve/index.js.map +1 -0
  69. package/dist/serve/pairing.d.ts +25 -0
  70. package/dist/serve/pairing.d.ts.map +1 -0
  71. package/dist/serve/pairing.js +10 -0
  72. package/dist/serve/pairing.js.map +1 -0
  73. package/dist/serve/relay-frames.d.ts +29 -0
  74. package/dist/serve/relay-frames.d.ts.map +1 -0
  75. package/dist/serve/relay-frames.js +54 -0
  76. package/dist/serve/relay-frames.js.map +1 -0
  77. package/dist/serve/relay.d.ts +146 -0
  78. package/dist/serve/relay.d.ts.map +1 -0
  79. package/dist/serve/relay.js +475 -0
  80. package/dist/serve/relay.js.map +1 -0
  81. package/dist/serve/replay-hub.d.ts +102 -0
  82. package/dist/serve/replay-hub.d.ts.map +1 -0
  83. package/dist/serve/replay-hub.js +176 -0
  84. package/dist/serve/replay-hub.js.map +1 -0
  85. package/dist/serve/tls.d.ts +20 -0
  86. package/dist/serve/tls.d.ts.map +1 -0
  87. package/dist/serve/tls.js +64 -0
  88. package/dist/serve/tls.js.map +1 -0
  89. package/dist/serve/ws-transport.d.ts +64 -0
  90. package/dist/serve/ws-transport.d.ts.map +1 -0
  91. package/dist/serve/ws-transport.js +92 -0
  92. package/dist/serve/ws-transport.js.map +1 -0
  93. package/package.json +42 -0
@@ -0,0 +1,24 @@
1
+ // Split a byte/string stream into LF-delimited lines. Splits on "\n" ONLY
2
+ // (stripping a trailing "\r") and never on U+2028/U+2029 — those are valid
3
+ // inside JSON strings, and Node's `readline` would wrongly break on them (pi
4
+ // learned this the hard way: `modes/rpc/jsonl.ts`). `process.stdin` is an
5
+ // AsyncIterable<Buffer>; the bespoke RPC server consumes the yielded lines.
6
+ export async function* linesFromStream(stream) {
7
+ let buf = "";
8
+ for await (const chunk of stream) {
9
+ buf += typeof chunk === "string" ? chunk : Buffer.from(chunk).toString("utf8");
10
+ let nl = buf.indexOf("\n");
11
+ while (nl !== -1) {
12
+ let line = buf.slice(0, nl);
13
+ if (line.endsWith("\r"))
14
+ line = line.slice(0, -1);
15
+ yield line;
16
+ buf = buf.slice(nl + 1);
17
+ nl = buf.indexOf("\n");
18
+ }
19
+ }
20
+ const tail = buf.endsWith("\r") ? buf.slice(0, -1) : buf;
21
+ if (tail.length > 0)
22
+ yield tail;
23
+ }
24
+ //# sourceMappingURL=lines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lines.js","sourceRoot":"","sources":["../../src/rpc/lines.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,2EAA2E;AAC3E,6EAA6E;AAC7E,0EAA0E;AAC1E,4EAA4E;AAE5E,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,eAAe,CACpC,MAA0C;IAE1C,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,GAAG,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/E,IAAI,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,IAAI,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5B,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,IAAI,CAAC;YACX,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACxB,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACzD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,CAAC;AAClC,CAAC"}
@@ -0,0 +1,315 @@
1
+ import { z } from "zod";
2
+ import type { JSONValue } from "@chances-ai/runtime";
3
+ /** Bumped on any breaking wire change. Carried in the `ready` handshake.
4
+ * v2 (M2 / docs/6.2): additive `rseq` cursor + relay control frames. Old
5
+ * clients ignore the extra field + unknown frames, so v2 is wire-compatible —
6
+ * the bump is a capability signal, not a break. */
7
+ export declare const PROTOCOL_VERSION: 2;
8
+ export declare const PROTOCOL_NAME: "chances-rpc";
9
+ export declare const CommandSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
10
+ type: z.ZodLiteral<"prompt">;
11
+ id: z.ZodOptional<z.ZodString>;
12
+ text: z.ZodString;
13
+ }, "strip", z.ZodTypeAny, {
14
+ type: "prompt";
15
+ text: string;
16
+ id?: string | undefined;
17
+ }, {
18
+ type: "prompt";
19
+ text: string;
20
+ id?: string | undefined;
21
+ }>, z.ZodObject<{
22
+ type: z.ZodLiteral<"abort">;
23
+ id: z.ZodOptional<z.ZodString>;
24
+ }, "strip", z.ZodTypeAny, {
25
+ type: "abort";
26
+ id?: string | undefined;
27
+ }, {
28
+ type: "abort";
29
+ id?: string | undefined;
30
+ }>, z.ZodObject<{
31
+ type: z.ZodLiteral<"set_model">;
32
+ id: z.ZodOptional<z.ZodString>;
33
+ provider: z.ZodOptional<z.ZodString>;
34
+ model: z.ZodOptional<z.ZodString>;
35
+ }, "strip", z.ZodTypeAny, {
36
+ type: "set_model";
37
+ id?: string | undefined;
38
+ provider?: string | undefined;
39
+ model?: string | undefined;
40
+ }, {
41
+ type: "set_model";
42
+ id?: string | undefined;
43
+ provider?: string | undefined;
44
+ model?: string | undefined;
45
+ }>, z.ZodObject<{
46
+ type: z.ZodLiteral<"get_state">;
47
+ id: z.ZodOptional<z.ZodString>;
48
+ }, "strip", z.ZodTypeAny, {
49
+ type: "get_state";
50
+ id?: string | undefined;
51
+ }, {
52
+ type: "get_state";
53
+ id?: string | undefined;
54
+ }>, z.ZodObject<{
55
+ type: z.ZodLiteral<"get_models">;
56
+ id: z.ZodOptional<z.ZodString>;
57
+ }, "strip", z.ZodTypeAny, {
58
+ type: "get_models";
59
+ id?: string | undefined;
60
+ }, {
61
+ type: "get_models";
62
+ id?: string | undefined;
63
+ }>, z.ZodObject<{
64
+ type: z.ZodLiteral<"permission_response">;
65
+ id: z.ZodString;
66
+ allow: z.ZodBoolean;
67
+ remember: z.ZodOptional<z.ZodBoolean>;
68
+ }, "strip", z.ZodTypeAny, {
69
+ type: "permission_response";
70
+ id: string;
71
+ allow: boolean;
72
+ remember?: boolean | undefined;
73
+ }, {
74
+ type: "permission_response";
75
+ id: string;
76
+ allow: boolean;
77
+ remember?: boolean | undefined;
78
+ }>, z.ZodObject<{
79
+ type: z.ZodLiteral<"set_options">;
80
+ id: z.ZodOptional<z.ZodString>;
81
+ toolChunks: z.ZodOptional<z.ZodBoolean>;
82
+ }, "strip", z.ZodTypeAny, {
83
+ type: "set_options";
84
+ id?: string | undefined;
85
+ toolChunks?: boolean | undefined;
86
+ }, {
87
+ type: "set_options";
88
+ id?: string | undefined;
89
+ toolChunks?: boolean | undefined;
90
+ }>, z.ZodObject<{
91
+ type: z.ZodLiteral<"ping">;
92
+ id: z.ZodOptional<z.ZodString>;
93
+ }, "strip", z.ZodTypeAny, {
94
+ type: "ping";
95
+ id?: string | undefined;
96
+ }, {
97
+ type: "ping";
98
+ id?: string | undefined;
99
+ }>]>;
100
+ export type Command = z.infer<typeof CommandSchema>;
101
+ export type CommandType = Command["type"];
102
+ export type PromptCommand = Extract<Command, {
103
+ type: "prompt";
104
+ }>;
105
+ export type RpcErrorCode = "PARSE_ERROR" | "UNKNOWN_COMMAND" | "AGENT_BUSY" | "BAD_REQUEST" | "INTERNAL";
106
+ export interface RpcError {
107
+ code: RpcErrorCode;
108
+ message: string;
109
+ }
110
+ export interface ModelInfo {
111
+ provider: string;
112
+ model: string;
113
+ }
114
+ export interface ReadyFrame {
115
+ type: "ready";
116
+ protocol: typeof PROTOCOL_NAME;
117
+ version: typeof PROTOCOL_VERSION;
118
+ agent: {
119
+ name: string;
120
+ version: string;
121
+ };
122
+ sessionId: string;
123
+ models: ModelInfo[];
124
+ capabilities: {
125
+ permissionPrompt: true;
126
+ toolChunks: boolean;
127
+ steering: false;
128
+ /** (M2) Relay reconnect/replay available. OPTIONAL: `RpcServer` is consumed
129
+ * UNCHANGED (docs/6.2 §5) and never sets it, so it is absent on the raw
130
+ * engine `ready`. The actual reconnect handshake is the relay's
131
+ * {@link RelayWelcomeFrame}; this field is reserved for a future relay that
132
+ * stamps it + for documentation. */
133
+ reconnect?: boolean;
134
+ };
135
+ }
136
+ /** Reply to a command, correlated by the command's `id` (echoed, may be null
137
+ * for un-attributable transport errors — codex C9). */
138
+ export interface ResponseFrame {
139
+ type: "response";
140
+ id: string | null;
141
+ command: CommandType | "parse";
142
+ ok: boolean;
143
+ data?: JSONValue;
144
+ error?: RpcError;
145
+ }
146
+ export interface RequestPermissionFrame {
147
+ type: "request_permission";
148
+ /** Permission id; the client answers with `permission_response {id}`. */
149
+ id: string;
150
+ /** The originating tool call (codex Round-1 MUST-FIX #3). */
151
+ callId?: string;
152
+ tool: string;
153
+ category: string;
154
+ summary: string;
155
+ args: JSONValue;
156
+ cacheKey?: string;
157
+ }
158
+ export type StopReason = "end" | "cancelled" | "error";
159
+ /** Streamed agent events, mapped from the internal `AppEvent` union. */
160
+ export type EventFrame = {
161
+ type: "turn_start";
162
+ commandId?: string;
163
+ turnId: string;
164
+ prompt: string;
165
+ sessionId?: string;
166
+ } | {
167
+ type: "assistant_delta";
168
+ turnId: string;
169
+ text: string;
170
+ agentId?: string;
171
+ } | {
172
+ type: "tool_call";
173
+ callId: string;
174
+ name: string;
175
+ args: JSONValue;
176
+ agentId?: string;
177
+ } | {
178
+ type: "tool_result";
179
+ callId: string;
180
+ name: string;
181
+ ok: boolean;
182
+ output: string;
183
+ agentId?: string;
184
+ } | {
185
+ type: "tool_chunk";
186
+ callId: string;
187
+ sessionId: string;
188
+ seq: number;
189
+ text: string;
190
+ bytes: number;
191
+ dropped?: number;
192
+ terminal?: true;
193
+ state?: "running" | "exited" | "killed";
194
+ exitCode?: number;
195
+ reason?: "exit" | "signal" | "timeout" | "io-error";
196
+ agentId?: string;
197
+ } | {
198
+ type: "usage";
199
+ model: string;
200
+ inputTokens: number;
201
+ outputTokens: number;
202
+ costUsd: number;
203
+ agentId?: string;
204
+ } | {
205
+ type: "compaction_start";
206
+ reason: string;
207
+ beforeTokens: number;
208
+ } | {
209
+ type: "compaction_end";
210
+ reason: string;
211
+ ok: boolean;
212
+ savedTokens?: number;
213
+ durationMs: number;
214
+ } | {
215
+ type: "subagent_done";
216
+ taskId: string;
217
+ agentName: string;
218
+ status: "completed" | "failed" | "cancelled";
219
+ durationMs: number;
220
+ tokens?: {
221
+ input: number;
222
+ output: number;
223
+ };
224
+ } | {
225
+ type: "error";
226
+ code: string;
227
+ message: string;
228
+ } | {
229
+ type: "result";
230
+ commandId?: string;
231
+ turnId?: string;
232
+ text: string;
233
+ usage: {
234
+ inputTokens: number;
235
+ outputTokens: number;
236
+ costUsd: number;
237
+ };
238
+ stopReason: StopReason;
239
+ };
240
+ /**
241
+ * Engine→client frames. The optional `rseq` is the **relay-assigned monotonic
242
+ * cursor** (M2 / docs/6.2 §3.2): the serve `ReplayHub` stamps it on every
243
+ * outbound frame at the write boundary; `RpcServer` never sets it (the engine
244
+ * is cursor-agnostic). It is named **`rseq`, not `seq`**, on purpose: the
245
+ * `tool_chunk` variant ALREADY carries a top-level `seq` (its own chunk-ordering
246
+ * counter, protocol line ~128). A relay cursor named `seq` would produce a
247
+ * duplicate JSON key on tool_chunk frames — `JSON.parse` keeps the LAST, so the
248
+ * client would read the chunk's seq as the cursor and corrupt reconnect on any
249
+ * streaming turn. `rseq` is collision-free across every variant. It doubles as
250
+ * the SSE `id:` value in the M5/M6 transports (an SSE field, not a JSON key, so
251
+ * the name is independent there).
252
+ */
253
+ export type ServerFrame = (ReadyFrame | ResponseFrame | RequestPermissionFrame | EventFrame) & {
254
+ rseq?: number;
255
+ };
256
+ /** Sent once per attach, BEFORE any replayed/live frame. Carries the relay's
257
+ * reconnect snapshot so a fresh OR resuming client knows where it stands
258
+ * without inferring from the stream (goose/OpenHands "subscribe pushes state"). */
259
+ export interface RelayWelcomeFrame {
260
+ type: "relay_welcome";
261
+ /** Per-attach fencing token. Reserved for the M5 stateless POST transport
262
+ * (which echoes `{epoch}` since it has no socket to gate by); NOT enforced on
263
+ * the M2 WebSocket (fan-out has no exclusive lock to fence). */
264
+ epoch: number;
265
+ /** The highest `rseq` the relay has assigned so far (the live head). */
266
+ headSeq: number;
267
+ /** True iff the client's `Last-Event-ID` predates the ring floor — its cursor
268
+ * is unrecoverable, so it must discard its transcript and take the full ring
269
+ * replay that follows (cold reload — never a silent gap). [goose
270
+ * `ClientTooFarBehind`.] */
271
+ reset: boolean;
272
+ /** Whether a turn is in flight right now (snoop-derived: `turn_start` → true,
273
+ * `result` → false), so a reconnecting client can lock its composer. */
274
+ busy: boolean;
275
+ /** Ids of `request_permission` frames still open (unanswered) at attach time,
276
+ * re-sent right after the welcome so a parked turn is answerable. */
277
+ pendingPermissionIds: string[];
278
+ /** (v21 M4 / docs/6.5 §5) Controller-lease snapshot. `lease` = whether the
279
+ * optional single-controller lease is enabled (default false ⇒ fan-out: any
280
+ * paired device drives, the engine serializes turns via AGENT_BUSY). When
281
+ * enabled, `holder` is the clientId currently allowed to drive (null =
282
+ * unclaimed) and `controlEpoch` increments on each handoff. A client compares
283
+ * its own clientId to `holder` to know if it is the controller or a read-only
284
+ * viewer. */
285
+ lease: boolean;
286
+ holder: string | null;
287
+ controlEpoch: number;
288
+ }
289
+ /** Stand-alone cold-reload signal. M2 carries the same intent inside
290
+ * {@link RelayWelcomeFrame.reset}; this variant exists for forward-compat with
291
+ * a mid-stream reset under M3. */
292
+ export interface ResetFrame {
293
+ type: "reset";
294
+ }
295
+ export type RelayFrame = RelayWelcomeFrame | ResetFrame;
296
+ /** Everything a client may receive on the wire: engine frames + relay control. */
297
+ export type ClientInboundFrame = ServerFrame | RelayFrame;
298
+ /** The JSON key the relay cursor is spliced under. Centralised so the splicer,
299
+ * the reader, and the round-trip test agree. */
300
+ export declare const RSEQ_KEY: "rseq";
301
+ /**
302
+ * Splice the relay cursor onto an already-serialized frame line as the FIRST
303
+ * key — an O(1) string op, **payload-agnostic** (it never parses the frame, so
304
+ * it carries unchanged to the M3 ACP wire). Safe because every `ServerFrame`
305
+ * serializes to a non-empty object `{"type":...,...}` (≥1 field ⇒ the byte at
306
+ * index 0 is always `{` and index 1 is `"`), so splicing `"rseq":N,` after the
307
+ * opening brace yields valid JSON with `rseq` first. `line` may or may not end
308
+ * in `\n`; the splice is before the first key, so the trailing newline is
309
+ * untouched.
310
+ */
311
+ export declare function stampSeq(line: string, seq: number): string;
312
+ /** Read the relay cursor off a parsed inbound frame (`undefined` ⇒ a control
313
+ * frame or a pre-M2 relay). Kept beside {@link stampSeq} so the key never drifts. */
314
+ export declare function readRseq(frame: ClientInboundFrame): number | undefined;
315
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/rpc/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ // Wire protocol for the bespoke Stable RPC transport (5.2).
2
+ //
3
+ // Schema-first (codex C2): inbound frames — untrusted client input — are
4
+ // validated by zod; outbound frames are typed structurally (the server
5
+ // constructs them, so a schema would only re-state the type). One LF-NDJSON
6
+ // object per line; see docs/5.2-design.md § D3.
7
+ import { z } from "zod";
8
+ /** Bumped on any breaking wire change. Carried in the `ready` handshake.
9
+ * v2 (M2 / docs/6.2): additive `rseq` cursor + relay control frames. Old
10
+ * clients ignore the extra field + unknown frames, so v2 is wire-compatible —
11
+ * the bump is a capability signal, not a break. */
12
+ export const PROTOCOL_VERSION = 2;
13
+ export const PROTOCOL_NAME = "chances-rpc";
14
+ // `z.json()`-equivalent for `args` payloads (zod 3 has no built-in json).
15
+ const jsonValue = z.lazy(() => z.union([
16
+ z.string(),
17
+ z.number(),
18
+ z.boolean(),
19
+ z.null(),
20
+ z.array(jsonValue),
21
+ z.record(jsonValue),
22
+ ]));
23
+ // ---------------------------------------------------------------------------
24
+ // Inbound commands (stdin → server). Validated.
25
+ export const CommandSchema = z.discriminatedUnion("type", [
26
+ z.object({ type: z.literal("prompt"), id: z.string().optional(), text: z.string() }),
27
+ z.object({ type: z.literal("abort"), id: z.string().optional() }),
28
+ z.object({
29
+ type: z.literal("set_model"),
30
+ id: z.string().optional(),
31
+ provider: z.string().optional(),
32
+ model: z.string().optional(),
33
+ }),
34
+ z.object({ type: z.literal("get_state"), id: z.string().optional() }),
35
+ z.object({ type: z.literal("get_models"), id: z.string().optional() }),
36
+ // `id` here is the permission-request id being answered (NOT a command
37
+ // correlation id — permission_response gets no response of its own).
38
+ z.object({
39
+ type: z.literal("permission_response"),
40
+ id: z.string(),
41
+ allow: z.boolean(),
42
+ remember: z.boolean().optional(),
43
+ }),
44
+ z.object({ type: z.literal("set_options"), id: z.string().optional(), toolChunks: z.boolean().optional() }),
45
+ z.object({ type: z.literal("ping"), id: z.string().optional() }),
46
+ ]);
47
+ /** The JSON key the relay cursor is spliced under. Centralised so the splicer,
48
+ * the reader, and the round-trip test agree. */
49
+ export const RSEQ_KEY = "rseq";
50
+ /**
51
+ * Splice the relay cursor onto an already-serialized frame line as the FIRST
52
+ * key — an O(1) string op, **payload-agnostic** (it never parses the frame, so
53
+ * it carries unchanged to the M3 ACP wire). Safe because every `ServerFrame`
54
+ * serializes to a non-empty object `{"type":...,...}` (≥1 field ⇒ the byte at
55
+ * index 0 is always `{` and index 1 is `"`), so splicing `"rseq":N,` after the
56
+ * opening brace yields valid JSON with `rseq` first. `line` may or may not end
57
+ * in `\n`; the splice is before the first key, so the trailing newline is
58
+ * untouched.
59
+ */
60
+ export function stampSeq(line, seq) {
61
+ // `{"type":...}` → `{"rseq":<seq>,"type":...}`. Slice(1) drops the leading `{`.
62
+ return `{"${RSEQ_KEY}":${seq},${line.slice(1)}`;
63
+ }
64
+ /** Read the relay cursor off a parsed inbound frame (`undefined` ⇒ a control
65
+ * frame or a pre-M2 relay). Kept beside {@link stampSeq} so the key never drifts. */
66
+ export function readRseq(frame) {
67
+ const v = frame[RSEQ_KEY];
68
+ return typeof v === "number" ? v : undefined;
69
+ }
70
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/rpc/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { EngineHost } from "./driver.js";
2
+ import { BoundedNdjsonWriter } from "./writer.js";
3
+ export interface RpcServerOptions {
4
+ host: EngineHost;
5
+ writer: BoundedNdjsonWriter;
6
+ agent: {
7
+ name: string;
8
+ version: string;
9
+ };
10
+ /** `--yes`: auto-approve every tool permission (trusted automation). When
11
+ * false (default), each permission is round-tripped to the client. */
12
+ autoApprove?: boolean;
13
+ /** Forward `tool:chunk` (live PTY output) by default (N2). */
14
+ toolChunks?: boolean;
15
+ /** stderr sink for the routed bus `log` event (defaults to process.stderr). */
16
+ logSink?: (line: string) => void;
17
+ }
18
+ export declare class RpcServer {
19
+ private readonly host;
20
+ private readonly writer;
21
+ private readonly agent;
22
+ private readonly autoApprove;
23
+ private toolChunks;
24
+ private readonly logSink;
25
+ private built;
26
+ private unsub;
27
+ private activeTurn;
28
+ /** The in-flight `handlePrompt` promise (fire-and-forget from the read
29
+ * loop). Tracked so shutdown can await its terminal `result` before
30
+ * closing the writer (Round-2 M1). */
31
+ private activePrompt;
32
+ private readonly pending;
33
+ private readonly resolvedIds;
34
+ private readonly resolvedSet;
35
+ private shuttingDown;
36
+ constructor(opts: RpcServerOptions);
37
+ /** Drive the server until `lines` ends, then shut down. Returns an exit code. */
38
+ run(lines: AsyncIterable<string>): Promise<number>;
39
+ /** Idempotent shutdown. Order (Round-1 S4): cancel the turn → deny pending
40
+ * permissions (so a turn blocked in the resolver unwinds — M2) → dispose
41
+ * (disposers may emit their LAST bus frames, still subscribed) → flush →
42
+ * close. */
43
+ shutdown(): Promise<void>;
44
+ private handleLine;
45
+ private dispatch;
46
+ private handlePrompt;
47
+ private makeResolver;
48
+ private resolvePermission;
49
+ /** Resolve every outstanding permission with deny — unblocks a turn parked
50
+ * in the resolver on `abort` / shutdown (Round-1 M2). */
51
+ private denyAllPending;
52
+ private markResolved;
53
+ private respondOk;
54
+ private respondError;
55
+ }
56
+ //# sourceMappingURL=rpc-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-server.d.ts","sourceRoot":"","sources":["../../src/rpc/rpc-server.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,aAAa,CAAC;AAU3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAkBlD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC;0EACsE;IACtE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;IAC1D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IAEjD,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,UAAU,CAAqE;IACvF;;0CAEsC;IACtC,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsD;IAC9E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,YAAY,CAAS;gBAEjB,IAAI,EAAE,gBAAgB;IASlC,iFAAiF;IAC3E,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAuCxD;;;gBAGY;IACN,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBjB,UAAU;YAkCV,QAAQ;YA4CR,YAAY;IAsC1B,OAAO,CAAC,YAAY;IA2BpB,OAAO,CAAC,iBAAiB;IASzB;6DACyD;IACzD,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,YAAY;CAGrB"}