@code-yeongyu/senpi 2026.9.2 → 2026.9.3
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/CHANGELOG.md +124 -2
- package/dist/beta/omo-local-update-fingerprint.d.ts.map +1 -1
- package/dist/beta/omo-local-update-fingerprint.js +0 -1
- package/dist/beta/omo-local-update-fingerprint.js.map +1 -1
- package/dist/core/agent-session.d.ts +1 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +7 -4
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/dynamic-prompt/build.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/build.js +2 -5
- package/dist/core/dynamic-prompt/build.js.map +1 -1
- package/dist/core/dynamic-prompt/index.d.ts +1 -2
- package/dist/core/dynamic-prompt/index.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/index.js +1 -2
- package/dist/core/dynamic-prompt/index.js.map +1 -1
- package/dist/core/dynamic-prompt/intent-gate.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/intent-gate.js +9 -24
- package/dist/core/dynamic-prompt/intent-gate.js.map +1 -1
- package/dist/core/dynamic-prompt/policies.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/policies.js +3 -7
- package/dist/core/dynamic-prompt/policies.js.map +1 -1
- package/dist/core/dynamic-prompt/style.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/style.js +6 -8
- package/dist/core/dynamic-prompt/style.js.map +1 -1
- package/dist/core/dynamic-prompt/verification.js +1 -1
- package/dist/core/dynamic-prompt/verification.js.map +1 -1
- package/dist/core/dynamic-prompt/working-task.d.ts +2 -0
- package/dist/core/dynamic-prompt/working-task.d.ts.map +1 -0
- package/dist/core/dynamic-prompt/working-task.js +10 -0
- package/dist/core/dynamic-prompt/working-task.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/options.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/options.js +6 -2
- package/dist/core/extensions/builtin/claude-sdk-oauth/options.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js +2 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/extension-wiring.js +1 -1
- package/dist/core/extensions/builtin/compaction/extension-wiring.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-event-source.d.ts +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-event-source.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-event-source.js +27 -9
- package/dist/core/extensions/builtin/config-reload/watch-event-source.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js +52 -50
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +2 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js +7 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js +7 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js +7 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.js +7 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js +2 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts +50 -0
- package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/execution-tooling.js +66 -0
- package/dist/core/extensions/builtin/prompt-preset/execution-tooling.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +5 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +6 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.js +11 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k2-7.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k2-7.js +11 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k2-7.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +2 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.js +8 -2
- package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.js +8 -3
- package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts +4 -3
- package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-notify.js +18 -18
- package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +7 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-registry.js +37 -8
- package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-status.js +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-status.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/prompt.d.ts +1 -1
- package/dist/core/extensions/builtin/terminal/prompt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/prompt.js +17 -13
- package/dist/core/extensions/builtin/terminal/prompt.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js +14 -2
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/context.d.ts +2 -0
- package/dist/core/extensions/builtin/terminal/tools/context.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/context.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/monitor.js +27 -10
- package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -1
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +17 -8
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/settings-manager.d.ts +2 -2
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +5 -3
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/index.d.ts +1 -1
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js +1 -1
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/rpc/host-ensure.d.ts +6 -0
- package/dist/modes/rpc/host-ensure.d.ts.map +1 -1
- package/dist/modes/rpc/host-ensure.js +36 -9
- package/dist/modes/rpc/host-ensure.js.map +1 -1
- package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
- package/dist/modes/rpc/host-lifecycle.js +16 -4
- package/dist/modes/rpc/host-lifecycle.js.map +1 -1
- package/dist/modes/rpc/multi-session-host.d.ts +7 -4
- package/dist/modes/rpc/multi-session-host.d.ts.map +1 -1
- package/dist/modes/rpc/multi-session-host.js +7 -4
- package/dist/modes/rpc/multi-session-host.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +8 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +62 -7
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +1 -1
- package/dist/modes/rpc/rpc-mode.js +1 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/session-command-router.d.ts +22 -0
- package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
- package/dist/modes/rpc/session-command-router.js +132 -94
- package/dist/modes/rpc/session-command-router.js.map +1 -1
- package/dist/modes/rpc/session-event-fanout.d.ts +40 -0
- package/dist/modes/rpc/session-event-fanout.d.ts.map +1 -0
- package/dist/modes/rpc/session-event-fanout.js +146 -0
- package/dist/modes/rpc/session-event-fanout.js.map +1 -0
- package/dist/modes/rpc/session-event-writer.d.ts +6 -13
- package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
- package/dist/modes/rpc/session-event-writer.js +48 -96
- package/dist/modes/rpc/session-event-writer.js.map +1 -1
- package/dist/modes/rpc/session-registry.d.ts +9 -8
- package/dist/modes/rpc/session-registry.d.ts.map +1 -1
- package/dist/modes/rpc/session-registry.js +14 -42
- package/dist/modes/rpc/session-registry.js.map +1 -1
- package/dist/modes/rpc/session-teardown.d.ts +12 -0
- package/dist/modes/rpc/session-teardown.d.ts.map +1 -0
- package/dist/modes/rpc/session-teardown.js +117 -0
- package/dist/modes/rpc/session-teardown.js.map +1 -0
- package/docs/rpc.md +10 -6
- package/docs/settings.md +4 -4
- package/docs/terminal-tools.md +26 -6
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +57 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +4 -2
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/extension/skill-contribution.ts +43 -9
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +4 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +10 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/SKILL.md +1 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/runtime-apis.md +1 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool-options.ts +3 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +2 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts +3 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +2 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.js +26 -4
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/google-vertex.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opengateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry-profile/profiles.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry-profile/profiles.js +3 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry-profile/profiles.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
- package/dist/core/dynamic-prompt/exploration.d.ts +0 -2
- package/dist/core/dynamic-prompt/exploration.d.ts.map +0 -1
- package/dist/core/dynamic-prompt/exploration.js +0 -6
- package/dist/core/dynamic-prompt/exploration.js.map +0 -1
- package/dist/core/dynamic-prompt/parallel-tools.d.ts +0 -2
- package/dist/core/dynamic-prompt/parallel-tools.d.ts.map +0 -1
- package/dist/core/dynamic-prompt/parallel-tools.js +0 -8
- package/dist/core/dynamic-prompt/parallel-tools.js.map +0 -1
|
@@ -28,6 +28,16 @@ export function isTransportGoneError(error) {
|
|
|
28
28
|
error.message.startsWith("RPC transport is not writable.") ||
|
|
29
29
|
error.message === "RPC socket closed")));
|
|
30
30
|
}
|
|
31
|
+
export class RpcClientOpenInFlightError extends Error {
|
|
32
|
+
constructor() {
|
|
33
|
+
super("An open_session request is already in flight");
|
|
34
|
+
this.code = "open_session_in_flight";
|
|
35
|
+
this.name = "RpcClientOpenInFlightError";
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Keep pre-lease startup delivery bounded by both record count and wire size.
|
|
39
|
+
const MAX_PENDING_SESSION_EVENTS = 512;
|
|
40
|
+
const MAX_PENDING_SESSION_EVENT_BYTES = 1024 * 1024;
|
|
31
41
|
export class RpcClient {
|
|
32
42
|
constructor(options = {}) {
|
|
33
43
|
this.process = null;
|
|
@@ -36,6 +46,9 @@ export class RpcClient {
|
|
|
36
46
|
this.eventListeners = [];
|
|
37
47
|
this.pendingRequests = new Map();
|
|
38
48
|
this.requestId = 0;
|
|
49
|
+
this.pendingOpenSession = false;
|
|
50
|
+
this.pendingSessionEvents = [];
|
|
51
|
+
this.pendingSessionEventBytes = 0;
|
|
39
52
|
this.stderr = "";
|
|
40
53
|
this.exitError = null;
|
|
41
54
|
this.disconnectNotified = false;
|
|
@@ -118,6 +131,9 @@ export class RpcClient {
|
|
|
118
131
|
* Stop the RPC agent process.
|
|
119
132
|
*/
|
|
120
133
|
async stop() {
|
|
134
|
+
this.pendingOpenSession = false;
|
|
135
|
+
this.pendingSessionEvents = [];
|
|
136
|
+
this.pendingSessionEventBytes = 0;
|
|
121
137
|
if (this.socket) {
|
|
122
138
|
this.stopping = true;
|
|
123
139
|
this.stopReadingStdout?.();
|
|
@@ -125,6 +141,8 @@ export class RpcClient {
|
|
|
125
141
|
this.socket.destroy();
|
|
126
142
|
this.socket = null;
|
|
127
143
|
this.sessionId = undefined;
|
|
144
|
+
this.pendingOpenSession = false;
|
|
145
|
+
this.pendingSessionEvents = [];
|
|
128
146
|
this.notifyDisconnect(new RpcTransportGoneError());
|
|
129
147
|
return;
|
|
130
148
|
}
|
|
@@ -209,10 +227,23 @@ export class RpcClient {
|
|
|
209
227
|
await this.send({ type: "set_client_info", width, capabilities }, this.sessionId !== undefined);
|
|
210
228
|
}
|
|
211
229
|
async openSession(options) {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
this.
|
|
215
|
-
|
|
230
|
+
if (this.pendingOpenSession)
|
|
231
|
+
throw new RpcClientOpenInFlightError();
|
|
232
|
+
this.pendingOpenSession = true;
|
|
233
|
+
try {
|
|
234
|
+
const response = await this.send({ type: "open_session", ...options }, false);
|
|
235
|
+
const opened = this.getData(response);
|
|
236
|
+
this.sessionId = opened.sessionId;
|
|
237
|
+
this.pendingOpenSession = false;
|
|
238
|
+
this.flushPendingSessionEvents();
|
|
239
|
+
return opened;
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
this.pendingOpenSession = false;
|
|
243
|
+
this.pendingSessionEvents = [];
|
|
244
|
+
this.pendingSessionEventBytes = 0;
|
|
245
|
+
throw error;
|
|
246
|
+
}
|
|
216
247
|
}
|
|
217
248
|
async sendExtensionUIResponse(response) {
|
|
218
249
|
await this.send(response, true, undefined, false);
|
|
@@ -674,10 +705,23 @@ export class RpcClient {
|
|
|
674
705
|
pending.resolve(data);
|
|
675
706
|
return;
|
|
676
707
|
}
|
|
677
|
-
// Otherwise it's an event.
|
|
678
|
-
//
|
|
679
|
-
if (data.sessionId
|
|
708
|
+
// Otherwise it's an event. During open_session, retain tagged events until
|
|
709
|
+
// the response establishes the lease so startup hooks are not lost.
|
|
710
|
+
if (typeof data.sessionId === "string" && data.sessionId !== this.sessionId) {
|
|
711
|
+
if (this.pendingOpenSession) {
|
|
712
|
+
const bytes = Buffer.byteLength(line);
|
|
713
|
+
this.pendingSessionEvents.push({ sessionId: data.sessionId, event: data, bytes });
|
|
714
|
+
this.pendingSessionEventBytes += bytes;
|
|
715
|
+
while (this.pendingSessionEvents.length > MAX_PENDING_SESSION_EVENTS ||
|
|
716
|
+
this.pendingSessionEventBytes > MAX_PENDING_SESSION_EVENT_BYTES) {
|
|
717
|
+
const oldest = this.pendingSessionEvents.shift();
|
|
718
|
+
if (!oldest)
|
|
719
|
+
break;
|
|
720
|
+
this.pendingSessionEventBytes -= oldest.bytes;
|
|
721
|
+
}
|
|
722
|
+
}
|
|
680
723
|
return;
|
|
724
|
+
}
|
|
681
725
|
for (const listener of this.eventListeners) {
|
|
682
726
|
listener(data);
|
|
683
727
|
}
|
|
@@ -686,6 +730,17 @@ export class RpcClient {
|
|
|
686
730
|
// Ignore non-JSON lines
|
|
687
731
|
}
|
|
688
732
|
}
|
|
733
|
+
flushPendingSessionEvents() {
|
|
734
|
+
const pending = this.pendingSessionEvents;
|
|
735
|
+
this.pendingSessionEvents = [];
|
|
736
|
+
this.pendingSessionEventBytes = 0;
|
|
737
|
+
for (const { sessionId, event } of pending) {
|
|
738
|
+
if (sessionId !== this.sessionId)
|
|
739
|
+
continue;
|
|
740
|
+
for (const listener of this.eventListeners)
|
|
741
|
+
listener(event);
|
|
742
|
+
}
|
|
743
|
+
}
|
|
689
744
|
createProcessExitError(code, signal) {
|
|
690
745
|
return new Error(`Agent process exited (code=${code} signal=${signal}). Stderr: ${this.stderr}`);
|
|
691
746
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-client.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RPC Client for programmatic access to the coding agent.\n *\n * Spawns the agent in RPC mode and provides a typed API for all operations.\n */\n\nimport { type ChildProcess, spawn } from \"node:child_process\";\nimport { createConnection, type Socket } from \"node:net\";\nimport type { AgentMessage, ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { ImageContent } from \"@earendil-works/pi-ai\";\nimport type { PromptDisposition, SessionStats } from \"../../core/agent-session.ts\";\nimport type { BashResult } from \"../../core/bash-executor.ts\";\nimport type { CompactionResult } from \"../../core/compaction/index.ts\";\nimport type { ServiceTier } from \"../../core/extensions/builtin/service-tier.ts\";\nimport { MissingSessionCwdError } from \"../../core/session-cwd.ts\";\nimport type { SessionEntry, SessionTreeNode } from \"../../core/session-manager.ts\";\nimport type { JsonAgentSessionEvent } from \"../json-event.ts\";\nimport { attachJsonlLineReader, serializeJsonLine } from \"./jsonl.ts\";\nimport type {\n\tRpcAccountFailoverEvent,\n\tRpcAuthAccountsChangedEvent,\n\tRpcCommand,\n\tRpcExtensionEvent,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcProviderAccount,\n\tRpcResponse,\n\tRpcSessionModelEntry,\n\tRpcSessionReplacedEvent,\n\tRpcSessionState,\n\tRpcSlashCommand,\n} from \"./rpc-types.ts\";\nimport {\n\treadSocketSecret,\n\tresolveSocketTransportAddress,\n\tsendSocketHandshake,\n\tsocketSecretPath,\n} from \"./socket-transport.ts\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Distributive Omit that works with union types */\ntype DistributiveOmit<T, K extends keyof T> = T extends unknown ? Omit<T, K> : never;\n\n/** RpcCommand without the id field (for internal send) */\ntype RpcCommandBody = DistributiveOmit<RpcCommand, \"id\">;\n\nexport interface RpcClientOptions {\n\t/** Connect to an existing multi-session Unix socket instead of spawning a child. */\n\tsocketPath?: string;\n\t/** Called once when an established transport disconnects. */\n\tonDisconnect?: (error: RpcTransportGoneError) => void;\n\t/** Path to the CLI entry point (default: searches for dist/cli.js) */\n\tcliPath?: string;\n\t/** Working directory for the agent */\n\tcwd?: string;\n\t/** Environment variables */\n\tenv?: Record<string, string>;\n\t/** Provider to use */\n\tprovider?: string;\n\t/** Model ID to use */\n\tmodel?: string;\n\t/** Additional CLI arguments */\n\targs?: string[];\n}\n\nexport interface ModelInfo {\n\tprovider: string;\n\tid: string;\n\tcontextWindow: number;\n\treasoning: boolean;\n\tsupportedThinkingLevels?: ThinkingLevel[];\n}\n\ntype PromptOptions = {\n\timages?: ImageContent[];\n\tstreamingBehavior?: \"steer\" | \"followUp\";\n\tthinkingLevel?: ThinkingLevel;\n\tpromptDisposition?: (disposition: PromptDisposition) => void;\n\tpreflightResult?: (success: boolean) => void;\n\tsessionTitlePrompt?: string | false;\n\texpandPromptTemplates?: boolean;\n};\n\nexport type RpcProviderAccountEvent = RpcAuthAccountsChangedEvent | RpcAccountFailoverEvent;\nexport type RpcClientEvent =\n\t| JsonAgentSessionEvent\n\t| RpcProviderAccountEvent\n\t| RpcExtensionEvent\n\t| RpcExtensionUIRequest\n\t// The host swapped the live session behind this connection. Part of the public\n\t// union so a typed client can discriminate on the type and read the new\n\t// `durableSessionId` without casting: the command response carries only\n\t// `{ cancelled }`, and a replacement may be driven by another client or an\n\t// extension, so this is the only channel delivering the new identity.\n\t| RpcSessionReplacedEvent\n\t| { type: \"bash_start\" }\n\t| { type: \"bash_end\" };\nexport type RpcEventListener = (event: RpcClientEvent) => void;\n\nfunction isProviderAccountEvent(event: RpcClientEvent): event is RpcProviderAccountEvent {\n\treturn event.type === \"auth_accounts_changed\" || event.type === \"account_failover\";\n}\n\n// ============================================================================\n// RPC Client\n// ============================================================================\n\nexport class RpcTransportGoneError extends Error {\n\treadonly code = \"rpc_transport_gone\" as const;\n\n\tconstructor(message = \"Shared RPC host is unavailable\") {\n\t\tsuper(message);\n\t\tthis.name = \"RpcTransportGoneError\";\n\t}\n}\n\nexport function isTransportGoneError(error: unknown): error is RpcTransportGoneError {\n\treturn (\n\t\terror instanceof RpcTransportGoneError ||\n\t\t(error instanceof Error &&\n\t\t\t(error.message === \"Client not started\" ||\n\t\t\t\terror.message.startsWith(\"RPC transport is not writable.\") ||\n\t\t\t\terror.message === \"RPC socket closed\"))\n\t);\n}\n\nexport class RpcClient {\n\tprivate process: ChildProcess | null = null;\n\tprivate socket: Socket | null = null;\n\tprivate stopReadingStdout: (() => void) | null = null;\n\tprivate eventListeners: RpcEventListener[] = [];\n\tprivate pendingRequests: Map<\n\t\tstring,\n\t\t{\n\t\t\tresolve: (response: RpcResponse) => void;\n\t\t\treject: (error: Error) => void;\n\t\t\tonResponse?: (response: RpcResponse) => void;\n\t\t\tonReject?: (error: Error) => void;\n\t\t}\n\t> = new Map();\n\tprivate requestId = 0;\n\tprivate sessionId: string | undefined;\n\tprivate stderr = \"\";\n\tprivate exitError: Error | null = null;\n\tprivate disconnectNotified = false;\n\tprivate stopping = false;\n\tprivate options: RpcClientOptions;\n\n\tconstructor(options: RpcClientOptions = {}) {\n\t\tthis.options = options;\n\t}\n\n\t/**\n\t * Start the RPC agent process.\n\t */\n\tasync start(): Promise<void> {\n\t\tif (this.process || this.socket) {\n\t\t\tthrow new Error(\"Client already started\");\n\t\t}\n\n\t\tthis.exitError = null;\n\t\tthis.stopping = false;\n\t\tthis.disconnectNotified = false;\n\t\tif (this.options.socketPath) {\n\t\t\tawait this.startSocket(this.options.socketPath);\n\t\t\treturn;\n\t\t}\n\n\t\tconst cliPath = this.options.cliPath ?? \"dist/cli.js\";\n\t\tconst args = [\"--mode\", \"rpc\"];\n\n\t\tif (this.options.provider) {\n\t\t\targs.push(\"--provider\", this.options.provider);\n\t\t}\n\t\tif (this.options.model) {\n\t\t\targs.push(\"--model\", this.options.model);\n\t\t}\n\t\tif (this.options.args) {\n\t\t\targs.push(...this.options.args);\n\t\t}\n\n\t\tconst childProcess = spawn(\"node\", [cliPath, ...args], {\n\t\t\tcwd: this.options.cwd,\n\t\t\tenv: { ...process.env, ...this.options.env },\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t// Callers may be console-less on win32 (GUI hosts, detached daemons), and a\n\t\t\t// console-subsystem child would then allocate a fresh visible terminal window.\n\t\t\twindowsHide: true,\n\t\t});\n\t\tthis.process = childProcess;\n\n\t\t// Collect stderr for debugging\n\t\tchildProcess.stderr?.on(\"data\", (data) => {\n\t\t\tthis.stderr += data.toString();\n\t\t\tprocess.stderr.write(data);\n\t\t});\n\n\t\tchildProcess.once(\"exit\", (code, signal) => {\n\t\t\tif (this.process !== childProcess) return;\n\t\t\tconst error = this.createProcessExitError(code, signal);\n\t\t\tthis.exitError = error;\n\t\t\tthis.rejectPendingRequests(error);\n\t\t});\n\t\tchildProcess.once(\"error\", (error) => {\n\t\t\tif (this.process !== childProcess) return;\n\t\t\tconst processError = new Error(`Agent process error: ${error.message}. Stderr: ${this.stderr}`);\n\t\t\tthis.exitError = processError;\n\t\t\tthis.rejectPendingRequests(processError);\n\t\t});\n\t\tchildProcess.stdin?.on(\"error\", (error) => {\n\t\t\tif (this.process !== childProcess) return;\n\t\t\tconst stdinError =\n\t\t\t\tthis.exitError ?? new Error(`Agent process stdin error: ${error.message}. Stderr: ${this.stderr}`);\n\t\t\tthis.exitError = stdinError;\n\t\t\tthis.rejectPendingRequests(stdinError);\n\t\t});\n\n\t\t// Set up strict JSONL reader for stdout.\n\t\tthis.stopReadingStdout = attachJsonlLineReader(childProcess.stdout!, (line) => {\n\t\t\tthis.handleLine(line);\n\t\t});\n\n\t\t// Wait a moment for process to initialize\n\t\tawait new Promise((resolve) => setTimeout(resolve, 100));\n\n\t\tif (this.process.exitCode !== null) {\n\t\t\tconst error = this.exitError ?? this.createProcessExitError(this.process.exitCode, this.process.signalCode);\n\t\t\tthis.exitError = error;\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Stop the RPC agent process.\n\t */\n\tasync stop(): Promise<void> {\n\t\tif (this.socket) {\n\t\t\tthis.stopping = true;\n\t\t\tthis.stopReadingStdout?.();\n\t\t\tthis.stopReadingStdout = null;\n\t\t\tthis.socket.destroy();\n\t\t\tthis.socket = null;\n\t\t\tthis.sessionId = undefined;\n\t\t\tthis.notifyDisconnect(new RpcTransportGoneError());\n\t\t\treturn;\n\t\t}\n\t\tif (!this.process) return;\n\n\t\tthis.stopReadingStdout?.();\n\t\tthis.stopReadingStdout = null;\n\t\tthis.process.kill(\"SIGTERM\");\n\n\t\t// Wait for process to exit\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.process?.kill(\"SIGKILL\");\n\t\t\t\tresolve();\n\t\t\t}, 1000);\n\n\t\t\tthis.process?.on(\"exit\", () => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\n\t\tthis.process = null;\n\t\tthis.pendingRequests.clear();\n\t}\n\n\tprivate async startSocket(path: string): Promise<void> {\n\t\tconst secret = process.platform === \"win32\" ? await readSocketSecret(socketSecretPath(path)) : undefined;\n\t\tconst socket = createConnection(resolveSocketTransportAddress(path, process.platform, secret));\n\t\tthis.socket = socket;\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst onConnect = () => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tconst onError = (error: Error) => {\n\t\t\t\tcleanup();\n\t\t\t\tthis.socket = null;\n\t\t\t\treject(error);\n\t\t\t};\n\t\t\tconst cleanup = () => {\n\t\t\t\tsocket.off(\"connect\", onConnect);\n\t\t\t\tsocket.off(\"error\", onError);\n\t\t\t};\n\t\t\tsocket.once(\"connect\", onConnect);\n\t\t\tsocket.once(\"error\", onError);\n\t\t});\n\t\tif (secret) sendSocketHandshake(socket, secret);\n\t\tthis.stopReadingStdout = attachJsonlLineReader(socket, (line) => this.handleLine(line));\n\t\tsocket.once(\"close\", () => {\n\t\t\tif (this.socket !== socket) return;\n\t\t\tthis.socket = null;\n\t\t\tthis.notifyDisconnect(new RpcTransportGoneError());\n\t\t});\n\t\tsocket.once(\"error\", (error) => {\n\t\t\tif (this.socket !== socket) return;\n\t\t\tthis.notifyDisconnect(new RpcTransportGoneError());\n\t\t\tvoid error;\n\t\t});\n\t}\n\n\t/**\n\t * Subscribe to agent events.\n\t */\n\tonEvent(listener: RpcEventListener): () => void {\n\t\tthis.eventListeners.push(listener);\n\t\treturn () => {\n\t\t\tconst index = this.eventListeners.indexOf(listener);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.eventListeners.splice(index, 1);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Get collected stderr output (useful for debugging).\n\t */\n\tgetStderr(): string {\n\t\treturn this.stderr;\n\t}\n\n\t// =========================================================================\n\t// Command Methods\n\t// =========================================================================\n\n\tasync setClientInfo(width: number, capabilities?: string[]): Promise<void> {\n\t\tawait this.send({ type: \"set_client_info\", width, capabilities }, this.sessionId !== undefined);\n\t}\n\n\tasync openSession(options: {\n\t\tsessionPath?: string;\n\t\tcwd?: string;\n\t\tprovider?: string;\n\t\tmodelId?: string;\n\t\tthinkingLevel?: ThinkingLevel;\n\t\tpermissionPreset?: string;\n\t}): Promise<{ sessionId: string; state: RpcSessionState; attached?: boolean }> {\n\t\tconst response = await this.send({ type: \"open_session\", ...options }, false);\n\t\tconst opened = this.getData<{ sessionId: string; state: RpcSessionState; attached?: boolean }>(response);\n\t\tthis.sessionId = opened.sessionId;\n\t\treturn opened;\n\t}\n\n\tasync sendExtensionUIResponse(response: RpcExtensionUIResponse): Promise<void> {\n\t\tawait this.send(response, true, undefined, false);\n\t}\n\n\tasync closeSession(sessionId = this.sessionId): Promise<void> {\n\t\tif (!sessionId) return;\n\t\ttry {\n\t\t\tawait this.send({ type: \"close_session\", sessionId }, false);\n\t\t} catch (error) {\n\t\t\tif (!isTransportGoneError(error)) throw error;\n\t\t}\n\t\tif (this.sessionId === sessionId) this.sessionId = undefined;\n\t}\n\n\tasync listSessions(): Promise<\n\t\tArray<{\n\t\t\tsessionId: string;\n\t\t\tdurableSessionId?: string;\n\t\t\tsessionPath?: string;\n\t\t\tcwd: string;\n\t\t\tname?: string;\n\t\t\tstatus: \"opening\" | \"open\" | \"closing\" | \"closed\";\n\t\t}>\n\t> {\n\t\tconst response = await this.send({ type: \"list_sessions\" }, false);\n\t\treturn this.getData<{\n\t\t\tsessions: Array<{\n\t\t\t\tsessionId: string;\n\t\t\t\tdurableSessionId?: string;\n\t\t\t\tsessionPath?: string;\n\t\t\t\tcwd: string;\n\t\t\t\tname?: string;\n\t\t\t\tstatus: \"opening\" | \"open\" | \"closing\" | \"closed\";\n\t\t\t}>;\n\t\t}>(response).sessions;\n\t}\n\n\t/**\n\t * Send a prompt to the agent.\n\t * Returns immediately after sending; use onEvent() to receive streaming events.\n\t * Use waitForIdle() to wait for completion.\n\t *\n\t * The disposition/preflight callbacks mirror AgentSession's local prompt contract:\n\t * they fire synchronously while the response frame is dispatched — before any\n\t * queued message_start event — so optimistic-echo eligibility is settled in wire\n\t * order. A success response without a disposition (older host) maps to \"handled\"\n\t * so the echo degrades to canonical-only rendering instead of double-rendering.\n\t */\n\tasync prompt(message: string, images?: ImageContent[]): Promise<void>;\n\tasync prompt(message: string, options?: PromptOptions): Promise<void>;\n\tasync prompt(message: string, optionsOrImages?: PromptOptions | ImageContent[]): Promise<void> {\n\t\tconst options: PromptOptions = Array.isArray(optionsOrImages)\n\t\t\t? { images: optionsOrImages }\n\t\t\t: (optionsOrImages ?? {});\n\t\tconst response = await this.send(\n\t\t\t{\n\t\t\t\ttype: \"prompt\",\n\t\t\t\tmessage,\n\t\t\t\t...(options.images ? { images: options.images } : {}),\n\t\t\t\t...(options.streamingBehavior ? { streamingBehavior: options.streamingBehavior } : {}),\n\t\t\t\t...(options.thinkingLevel ? { thinkingLevel: options.thinkingLevel } : {}),\n\t\t\t\t...(options.sessionTitlePrompt !== undefined ? { sessionTitlePrompt: options.sessionTitlePrompt } : {}),\n\t\t\t\t...(options.expandPromptTemplates !== undefined\n\t\t\t\t\t? { expandPromptTemplates: options.expandPromptTemplates }\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t\ttrue,\n\t\t\t{\n\t\t\t\tonResponse: (wireResponse) => {\n\t\t\t\t\tif (!wireResponse.success) {\n\t\t\t\t\t\toptions?.preflightResult?.(false);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst data = (wireResponse as { data?: { disposition?: PromptDisposition } }).data;\n\t\t\t\t\toptions?.promptDisposition?.(data?.disposition ?? \"handled\");\n\t\t\t\t\toptions?.preflightResult?.(true);\n\t\t\t\t},\n\t\t\t\tonReject: () => {\n\t\t\t\t\toptions?.preflightResult?.(false);\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\tif (!response.success) {\n\t\t\tthrow new Error((response as Extract<RpcResponse, { success: false }>).error);\n\t\t}\n\t}\n\n\tasync appendUserMessage(content: unknown): Promise<void> {\n\t\tawait this.send({ type: \"append_user_message\", content });\n\t}\n\n\tasync appendSessionEntry(entry: import(\"../../core/session-manager.ts\").SessionEntry): Promise<void> {\n\t\tawait this.send({ type: \"append_session_entry\", entry });\n\t}\n\n\tasync sendCustomMessage<T = unknown>(\n\t\tmessage: { customType: string; content: unknown; display: boolean; details?: T },\n\t\toptions?: { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" },\n\t): Promise<void> {\n\t\tawait this.send({ type: \"send_custom_message\", ...message, ...options });\n\t}\n\n\t/**\n\t * Queue a steering message to interrupt the agent mid-run.\n\t */\n\tasync steer(message: string, images?: ImageContent[], recovery?: { enqueueOrder?: number }): Promise<void> {\n\t\tawait this.send({ type: \"steer\", message, images, enqueueOrder: recovery?.enqueueOrder });\n\t}\n\n\t/**\n\t * Queue a follow-up message to be processed after the agent finishes.\n\t */\n\tasync followUp(message: string, images?: ImageContent[], recovery?: { enqueueOrder?: number }): Promise<void> {\n\t\tawait this.send({ type: \"follow_up\", message, images, enqueueOrder: recovery?.enqueueOrder });\n\t}\n\n\t/**\n\t * Abort current operation.\n\t */\n\tasync abort(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.send({ type: \"abort\" });\n\t\t} catch (error) {\n\t\t\tif (!isTransportGoneError(error)) throw error;\n\t\t}\n\t}\n\n\tasync abortCompaction(): Promise<void> {\n\t\tawait this.send({ type: \"abort_compaction\" });\n\t}\n\n\tasync reload(): Promise<{ cancelled: boolean; reason?: string }> {\n\t\tconst response = await this.send({ type: \"reload\" });\n\t\treturn this.getData(response);\n\t}\n\n\tasync checkReloadVeto(): Promise<{ cancelled: boolean; reason?: string }> {\n\t\tconst response = await this.send({ type: \"check_reload_veto\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Clear queued steering and follow-up messages, returning their text.\n\t */\n\tasync clearQueue(options?: { abortWillFollow?: boolean }): Promise<{\n\t\tsteering: string[];\n\t\tfollowUp: string[];\n\t\tordered: Array<{ text: string; mode: \"steer\" | \"followUp\"; enqueueOrder: number }>;\n\t}> {\n\t\tconst response = await this.send({ type: \"clear_queue\", abortWillFollow: options?.abortWillFollow });\n\t\treturn this.getData(response);\n\t}\n\n\tasync getSteeringMessages(): Promise<string[]> {\n\t\tconst response = await this.send({ type: \"get_steering_messages\" });\n\t\treturn this.getData<{ messages: string[] }>(response).messages;\n\t}\n\n\tasync getFollowUpMessages(): Promise<string[]> {\n\t\tconst response = await this.send({ type: \"get_follow_up_messages\" });\n\t\treturn this.getData<{ messages: string[] }>(response).messages;\n\t}\n\n\tasync abortBranchSummary(): Promise<void> {\n\t\tawait this.send({ type: \"abort_branch_summary\" });\n\t}\n\n\tasync recordBashResult(command: string, result: BashResult, excludeFromContext?: boolean): Promise<void> {\n\t\tawait this.send({ type: \"record_bash_result\", command, result, excludeFromContext });\n\t}\n\n\tasync setLabel(entryId: string, label?: string): Promise<void> {\n\t\tawait this.send({ type: \"set_label\", entryId, label });\n\t}\n\n\t/**\n\t * Start a new session, optionally with parent tracking.\n\t * @param parentSession - Optional parent session path for lineage tracking\n\t * @returns Object with `cancelled: true` if an extension cancelled the new session\n\t */\n\tasync newSession(parentSession?: string): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"new_session\", parentSession });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get current session state.\n\t */\n\tasync getState(): Promise<RpcSessionState> {\n\t\tconst response = await this.send({ type: \"get_state\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set model by provider and ID.\n\t */\n\tasync setModel(\n\t\tprovider: string,\n\t\tmodelId: string,\n\t): Promise<{ provider: string; id: string; systemPromptName?: string }> {\n\t\tconst response = await this.send({ type: \"set_model\", provider, modelId });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Cycle to next model.\n\t */\n\tasync setFavoriteModels(models: RpcSessionModelEntry[]): Promise<void> {\n\t\tawait this.send({ type: \"set_favorite_models\", models });\n\t}\n\n\tasync setScopedModels(models: RpcSessionModelEntry[]): Promise<void> {\n\t\tawait this.send({ type: \"set_scoped_models\", models });\n\t}\n\n\tasync cycleModel(direction: \"forward\" | \"backward\" = \"forward\"): Promise<{\n\t\tmodel: { provider: string; id: string };\n\t\tthinkingLevel: ThinkingLevel;\n\t\tisScoped: boolean;\n\t} | null> {\n\t\tconst response = await this.send({ type: \"cycle_model\", direction });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get list of available models.\n\t */\n\tasync getAvailableModels(): Promise<ModelInfo[]> {\n\t\tconst response = await this.send({ type: \"get_available_models\" });\n\t\treturn this.getData<{ models: ModelInfo[] }>(response).models;\n\t}\n\n\t/**\n\t * Set thinking level.\n\t *\n\t * `scope: \"turn\"` changes only this session's level without rewriting the model's remembered\n\t * level; it throws when the active model does not support the requested level, and the\n\t * session keeps the level it already had.\n\t */\n\tasync setThinkingLevel(level: ThinkingLevel, options?: { scope?: \"turn\" }): Promise<void> {\n\t\tconst response = await this.send({ type: \"set_thinking_level\", level, scope: options?.scope });\n\t\tif (!response.success) {\n\t\t\tthrow new Error((response as Extract<RpcResponse, { success: false }>).error);\n\t\t}\n\t}\n\n\t/**\n\t * Cycle thinking level.\n\t */\n\tasync cycleThinkingLevel(): Promise<{ level: ThinkingLevel } | null> {\n\t\tconst response = await this.send({ type: \"cycle_thinking_level\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get list of available thinking levels for the current model.\n\t */\n\tasync getAvailableThinkingLevels(): Promise<ThinkingLevel[]> {\n\t\tconst response = await this.send({ type: \"get_available_thinking_levels\" });\n\t\treturn this.getData<{ levels: ThinkingLevel[] }>(response).levels;\n\t}\n\n\t/**\n\t * Turn OpenAI Codex fast mode (the `priority` service tier) on or off for the active model.\n\t *\n\t * The choice is remembered per model, so a later session on the same model starts the same\n\t * way. Throws when the request is refused: a non-Codex model, or an active `:priority` model\n\t * pin that fast mode must not undo.\n\t */\n\tasync setFastMode(\n\t\tenabled: boolean,\n\t): Promise<{ enabled: boolean; serviceTier: ServiceTier; provider: string; modelId: string }> {\n\t\tconst response = await this.send({ type: \"set_fast_mode\", enabled });\n\t\treturn this.getData(response);\n\t}\n\n\t/** Current fast-mode state and the service tier requests would carry. */\n\tasync getFastMode(): Promise<{ enabled: boolean; serviceTier: ServiceTier | null }> {\n\t\tconst response = await this.send({ type: \"get_fast_mode\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set steering mode.\n\t */\n\tasync setSteeringMode(mode: \"all\" | \"one-at-a-time\"): Promise<void> {\n\t\tawait this.send({ type: \"set_steering_mode\", mode });\n\t}\n\n\t/**\n\t * Set follow-up mode.\n\t */\n\tasync setFollowUpMode(mode: \"all\" | \"one-at-a-time\"): Promise<void> {\n\t\tawait this.send({ type: \"set_follow_up_mode\", mode });\n\t}\n\n\t/**\n\t * Compact session context.\n\t */\n\tasync compact(customInstructions?: string): Promise<CompactionResult> {\n\t\tconst response = await this.send({ type: \"compact\", customInstructions });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set auto-compaction enabled/disabled.\n\t */\n\tasync setAutoCompaction(enabled: boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_auto_compaction\", enabled });\n\t}\n\n\t/**\n\t * Set auto-retry enabled/disabled.\n\t */\n\tasync setAutoRetry(enabled: boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_auto_retry\", enabled });\n\t}\n\n\t/**\n\t * Abort in-progress retry.\n\t */\n\tasync abortRetry(): Promise<void> {\n\t\tawait this.send({ type: \"abort_retry\" });\n\t}\n\n\t/**\n\t * Execute a bash command.\n\t */\n\tasync bash(\n\t\tcommand: string,\n\t\toptions?: { excludeFromContext?: boolean; executionId?: string; operations?: Record<string, unknown> },\n\t): Promise<BashResult> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"bash\",\n\t\t\tcommand,\n\t\t\texcludeFromContext: options?.excludeFromContext,\n\t\t\texecutionId: options?.executionId,\n\t\t\toperations: options?.operations,\n\t\t});\n\t\treturn this.getData(response);\n\t}\n\n\tasync navigateTree(\n\t\ttargetId: string,\n\t\toptions?: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string },\n\t): Promise<{ cancelled: boolean; editorText?: string; aborted?: boolean; summaryEntry?: unknown }> {\n\t\tconst response = await this.send({ type: \"navigate_tree\", targetId, ...options });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Abort running bash command.\n\t */\n\tasync abortBash(): Promise<void> {\n\t\tawait this.send({ type: \"abort_bash\" });\n\t}\n\n\tasync cleanupBashOutput(path: string): Promise<void> {\n\t\tawait this.send({ type: \"cleanup_bash_output\", path });\n\t}\n\n\t/**\n\t * Get session statistics.\n\t */\n\tasync getSessionStats(): Promise<SessionStats> {\n\t\tconst response = await this.send({ type: \"get_session_stats\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Export session to HTML.\n\t */\n\tasync exportHtml(outputPath?: string, themeName?: string): Promise<{ path: string }> {\n\t\tconst response = await this.send({ type: \"export_html\", outputPath, themeName });\n\t\treturn this.getData(response);\n\t}\n\n\tasync exportJsonl(outputPath?: string): Promise<{ path: string }> {\n\t\tconst response = await this.send({ type: \"export_jsonl\", outputPath });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Switch to a different session file.\n\t * @returns Object with `cancelled: true` if an extension cancelled the switch\n\t */\n\tasync switchSession(sessionPath: string, options?: { cwdOverride?: string }): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"switch_session\", sessionPath, cwdOverride: options?.cwdOverride });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Fork from a specific message.\n\t * @returns Object with `text` (the message text) and `cancelled` (if extension cancelled)\n\t */\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\" },\n\t): Promise<{ text: string; cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"fork\", entryId, position: options?.position });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Clone the current active branch into a new session.\n\t * @returns Object with `cancelled: true` if an extension cancelled the clone\n\t */\n\tasync clone(): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"clone\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get messages available for forking.\n\t */\n\tasync getForkMessages(): Promise<Array<{ entryId: string; text: string }>> {\n\t\tconst response = await this.send({ type: \"get_fork_messages\" });\n\t\treturn this.getData<{ messages: Array<{ entryId: string; text: string }> }>(response).messages;\n\t}\n\n\t/**\n\t * Get session entries in append order, optionally only those after the `since` entry id.\n\t */\n\tasync getEntries(since?: string): Promise<{ entries: SessionEntry[]; leafId: string | null }> {\n\t\tconst response = await this.send({ type: \"get_entries\", since });\n\t\treturn this.getData<{ entries: SessionEntry[]; leafId: string | null }>(response);\n\t}\n\n\t/**\n\t * Get the session entry tree.\n\t */\n\tasync getTree(): Promise<{ tree: SessionTreeNode[]; leafId: string | null }> {\n\t\tconst response = await this.send({ type: \"get_tree\" });\n\t\treturn this.getData<{ tree: SessionTreeNode[]; leafId: string | null }>(response);\n\t}\n\n\t/**\n\t * Get text of last assistant message.\n\t */\n\tasync getLastAssistantText(): Promise<string | null> {\n\t\tconst response = await this.send({ type: \"get_last_assistant_text\" });\n\t\treturn this.getData<{ text: string | null }>(response).text;\n\t}\n\n\t/**\n\t * Set the session display name.\n\t */\n\tasync setSessionName(name: string): Promise<void> {\n\t\tawait this.send({ type: \"set_session_name\", name });\n\t}\n\n\tasync importJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"import_jsonl\", inputPath, cwdOverride });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get all messages in the session.\n\t */\n\tasync getMessages(): Promise<AgentMessage[]> {\n\t\tconst response = await this.send({ type: \"get_messages\" });\n\t\treturn this.getData<{ messages: AgentMessage[] }>(response).messages;\n\t}\n\n\t/**\n\t * Get available commands (extension commands, prompt templates, skills).\n\t */\n\tasync getCommands(): Promise<RpcSlashCommand[]> {\n\t\tconst response = await this.send({ type: \"get_commands\" });\n\t\treturn this.getData<{ commands: RpcSlashCommand[] }>(response).commands;\n\t}\n\n\t/** Invoke one extension-owned RPC request handler and return its structured result. */\n\tasync requestExtension<T = unknown>(name: string, data?: unknown): Promise<T> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"extension_request\",\n\t\t\tname,\n\t\t\t...(data === undefined ? {} : { data }),\n\t\t});\n\t\treturn this.getData<T>(response);\n\t}\n\n\t/** List safe metadata for the named provider's configured account slots. */\n\tasync getProviderAccounts(provider: string): Promise<RpcProviderAccount[]> {\n\t\tconst response = await this.send({ type: \"get_provider_accounts\", provider });\n\t\treturn this.getData<{ accounts: RpcProviderAccount[] }>(response).accounts;\n\t}\n\n\t/** Pin a provider account for future session-affine requests, or clear the pin. */\n\tasync pinProviderAccount(provider: string, name: string | null): Promise<void> {\n\t\tawait this.send({ type: \"account_pin\", provider, name });\n\t}\n\n\t/** Remove a persisted provider account slot. Environment slots are read-only. */\n\tasync removeProviderAccount(provider: string, name: string): Promise<void> {\n\t\tawait this.send({ type: \"account_remove\", provider, name });\n\t}\n\n\t// =========================================================================\n\t// Helpers\n\t// =========================================================================\n\n\t/**\n\t * Wait for agent to become idle (no streaming).\n\t * Resolves when agent_settled event is received.\n\t */\n\twaitForIdle(timeout = 60000): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tunsubscribe();\n\t\t\t\treject(new Error(`Timeout waiting for agent to become idle. Stderr: ${this.stderr}`));\n\t\t\t}, timeout);\n\n\t\t\tconst unsubscribe = this.onEvent((event) => {\n\t\t\t\tif (event.type === \"agent_settled\") {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Collect events until agent becomes idle.\n\t */\n\tcollectEvents(timeout = 60000): Promise<JsonAgentSessionEvent[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst events: JsonAgentSessionEvent[] = [];\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tunsubscribe();\n\t\t\t\treject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`));\n\t\t\t}, timeout);\n\n\t\t\tconst unsubscribe = this.onEvent((event) => {\n\t\t\t\tif (\n\t\t\t\t\tisProviderAccountEvent(event) ||\n\t\t\t\t\tevent.type === \"extension_event\" ||\n\t\t\t\t\tevent.type === \"bash_start\" ||\n\t\t\t\t\tevent.type === \"bash_end\" ||\n\t\t\t\t\tevent.type === \"extension_ui_request\" ||\n\t\t\t\t\t// Connection-level, not part of the agent's event stream.\n\t\t\t\t\tevent.type === \"session_replaced\"\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\tevents.push(event);\n\t\t\t\tif (event.type === \"agent_settled\") {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tresolve(events);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Send prompt and wait for completion, returning all events.\n\t */\n\tasync promptAndWait(message: string, images?: ImageContent[], timeout = 60000): Promise<JsonAgentSessionEvent[]> {\n\t\tconst eventsPromise = this.collectEvents(timeout);\n\t\tawait this.prompt(message, images ? { images } : undefined);\n\t\treturn eventsPromise;\n\t}\n\n\t// =========================================================================\n\t// Internal\n\t// =========================================================================\n\n\tprivate handleLine(line: string): void {\n\t\ttry {\n\t\t\tconst data = JSON.parse(line);\n\n\t\t\t// Check if it's a response to a pending request\n\t\t\tif (data.type === \"response\" && data.id && this.pendingRequests.has(data.id)) {\n\t\t\t\tconst pending = this.pendingRequests.get(data.id)!;\n\t\t\t\tthis.pendingRequests.delete(data.id);\n\t\t\t\t// Response hooks run synchronously inside the frame dispatch so ordering-sensitive\n\t\t\t\t// contracts (e.g. optimistic-echo disposition) settle before the NEXT frame —\n\t\t\t\t// never through the microtask scheduled by resolve().\n\t\t\t\tpending.onResponse?.(data as RpcResponse);\n\t\t\t\tpending.resolve(data as RpcResponse);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Otherwise it's an event. Multi-session hosts broadcast all session\n\t\t\t// events to every connection; a routed client exposes only its lease.\n\t\t\tif (data.sessionId !== undefined && this.sessionId !== undefined && data.sessionId !== this.sessionId) return;\n\t\t\tfor (const listener of this.eventListeners) {\n\t\t\t\tlistener(data as RpcClientEvent);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore non-JSON lines\n\t\t}\n\t}\n\n\tprivate createProcessExitError(code: number | null, signal: NodeJS.Signals | null): Error {\n\t\treturn new Error(`Agent process exited (code=${code} signal=${signal}). Stderr: ${this.stderr}`);\n\t}\n\n\tprivate notifyDisconnect(error: RpcTransportGoneError): void {\n\t\tthis.rejectPendingRequests(error);\n\t\tif (!this.disconnectNotified && !this.stopping) {\n\t\t\tthis.disconnectNotified = true;\n\t\t\tthis.options.onDisconnect?.(error);\n\t\t}\n\t}\n\n\tprivate rejectPendingRequests(error: Error): void {\n\t\tfor (const pending of this.pendingRequests.values()) {\n\t\t\tpending.onReject?.(error);\n\t\t\tpending.reject(error);\n\t\t}\n\t\tthis.pendingRequests.clear();\n\t}\n\n\tprivate async send(\n\t\tcommand: RpcCommandBody | RpcExtensionUIResponse,\n\t\troute = true,\n\t\thooks?: { onResponse?: (response: RpcResponse) => void; onReject?: (error: Error) => void },\n\t\texpectResponse = true,\n\t): Promise<RpcResponse> {\n\t\tconst childProcess = this.process;\n\t\tconst stream = this.socket ?? childProcess?.stdin;\n\t\tif (!stream) {\n\t\t\tthrow new RpcTransportGoneError();\n\t\t}\n\t\tif (this.exitError) {\n\t\t\tthrow this.exitError;\n\t\t}\n\t\tif (childProcess?.exitCode !== null && childProcess?.exitCode !== undefined) {\n\t\t\tconst error = this.createProcessExitError(childProcess.exitCode, childProcess.signalCode);\n\t\t\tthis.exitError = error;\n\t\t\tthrow error;\n\t\t}\n\t\tif (stream.destroyed || !stream.writable) {\n\t\t\tconst error = new RpcTransportGoneError();\n\t\t\tthis.notifyDisconnect(error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst id = \"type\" in command && command.type === \"extension_ui_response\" ? command.id : `req_${++this.requestId}`;\n\t\tconst fullCommand = {\n\t\t\t...command,\n\t\t\t...(route && this.sessionId && !(\"sessionId\" in command) ? { sessionId: this.sessionId } : {}),\n\t\t\t...(command.type === \"extension_ui_response\" ? {} : { id }),\n\t\t} as RpcCommand;\n\n\t\tif (!expectResponse) {\n\t\t\tstream.write(serializeJsonLine(fullCommand));\n\t\t\treturn Promise.resolve({ type: \"response\", command: command.type, success: true } as RpcResponse);\n\t\t}\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tconst pending = this.pendingRequests.get(id);\n\t\t\t\tthis.pendingRequests.delete(id);\n\t\t\t\tconst timeoutError = new Error(`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`);\n\t\t\t\tpending?.onReject?.(timeoutError);\n\t\t\t\treject(timeoutError);\n\t\t\t}, 30000);\n\n\t\t\tthis.pendingRequests.set(id, {\n\t\t\t\tresolve: (response) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve(response);\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t\t...(hooks?.onResponse ? { onResponse: hooks.onResponse } : {}),\n\t\t\t\t...(hooks?.onReject ? { onReject: hooks.onReject } : {}),\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\tstream.write(serializeJsonLine(fullCommand));\n\t\t\t} catch (error: unknown) {\n\t\t\t\tconst writeError = error instanceof Error ? error : new Error(String(error));\n\t\t\t\tconst pending = this.pendingRequests.get(id);\n\t\t\t\tthis.pendingRequests.delete(id);\n\t\t\t\tpending?.onReject?.(writeError);\n\t\t\t\tpending?.reject(writeError);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate getData<T>(response: RpcResponse): T {\n\t\tif (!response.success) {\n\t\t\tconst errorResponse = response as Extract<RpcResponse, { success: false }>;\n\t\t\tif (errorResponse.errorCode === \"missing_session_cwd\" && errorResponse.errorData) {\n\t\t\t\tthrow new MissingSessionCwdError(\n\t\t\t\t\terrorResponse.errorData as ConstructorParameters<typeof MissingSessionCwdError>[0],\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(errorResponse.error);\n\t\t}\n\t\t// Type assertion: we trust response.data matches T based on the command sent.\n\t\t// This is safe because each public method specifies the correct T for its command.\n\t\tconst successResponse = response as Extract<RpcResponse, { success: true; data: unknown }>;\n\t\treturn successResponse.data as T;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"rpc-client.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RPC Client for programmatic access to the coding agent.\n *\n * Spawns the agent in RPC mode and provides a typed API for all operations.\n */\n\nimport { type ChildProcess, spawn } from \"node:child_process\";\nimport { createConnection, type Socket } from \"node:net\";\nimport type { AgentMessage, ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { ImageContent } from \"@earendil-works/pi-ai\";\nimport type { PromptDisposition, SessionStats } from \"../../core/agent-session.ts\";\nimport type { BashResult } from \"../../core/bash-executor.ts\";\nimport type { CompactionResult } from \"../../core/compaction/index.ts\";\nimport type { ServiceTier } from \"../../core/extensions/builtin/service-tier.ts\";\nimport { MissingSessionCwdError } from \"../../core/session-cwd.ts\";\nimport type { SessionEntry, SessionTreeNode } from \"../../core/session-manager.ts\";\nimport type { JsonAgentSessionEvent } from \"../json-event.ts\";\nimport { attachJsonlLineReader, serializeJsonLine } from \"./jsonl.ts\";\nimport type {\n\tRpcAccountFailoverEvent,\n\tRpcAuthAccountsChangedEvent,\n\tRpcCommand,\n\tRpcExtensionEvent,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcProviderAccount,\n\tRpcResponse,\n\tRpcSessionModelEntry,\n\tRpcSessionReplacedEvent,\n\tRpcSessionState,\n\tRpcSlashCommand,\n} from \"./rpc-types.ts\";\nimport {\n\treadSocketSecret,\n\tresolveSocketTransportAddress,\n\tsendSocketHandshake,\n\tsocketSecretPath,\n} from \"./socket-transport.ts\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Distributive Omit that works with union types */\ntype DistributiveOmit<T, K extends keyof T> = T extends unknown ? Omit<T, K> : never;\n\n/** RpcCommand without the id field (for internal send) */\ntype RpcCommandBody = DistributiveOmit<RpcCommand, \"id\">;\n\nexport interface RpcClientOptions {\n\t/** Connect to an existing multi-session Unix socket instead of spawning a child. */\n\tsocketPath?: string;\n\t/** Called once when an established transport disconnects. */\n\tonDisconnect?: (error: RpcTransportGoneError) => void;\n\t/** Path to the CLI entry point (default: searches for dist/cli.js) */\n\tcliPath?: string;\n\t/** Working directory for the agent */\n\tcwd?: string;\n\t/** Environment variables */\n\tenv?: Record<string, string>;\n\t/** Provider to use */\n\tprovider?: string;\n\t/** Model ID to use */\n\tmodel?: string;\n\t/** Additional CLI arguments */\n\targs?: string[];\n}\n\nexport interface ModelInfo {\n\tprovider: string;\n\tid: string;\n\tcontextWindow: number;\n\treasoning: boolean;\n\tsupportedThinkingLevels?: ThinkingLevel[];\n}\n\ntype PromptOptions = {\n\timages?: ImageContent[];\n\tstreamingBehavior?: \"steer\" | \"followUp\";\n\tthinkingLevel?: ThinkingLevel;\n\tpromptDisposition?: (disposition: PromptDisposition) => void;\n\tpreflightResult?: (success: boolean) => void;\n\tsessionTitlePrompt?: string | false;\n\texpandPromptTemplates?: boolean;\n};\n\nexport type RpcProviderAccountEvent = RpcAuthAccountsChangedEvent | RpcAccountFailoverEvent;\nexport type RpcClientEvent =\n\t| JsonAgentSessionEvent\n\t| RpcProviderAccountEvent\n\t| RpcExtensionEvent\n\t| RpcExtensionUIRequest\n\t// The host swapped the live session behind this connection. Part of the public\n\t// union so a typed client can discriminate on the type and read the new\n\t// `durableSessionId` without casting: the command response carries only\n\t// `{ cancelled }`, and a replacement may be driven by another client or an\n\t// extension, so this is the only channel delivering the new identity.\n\t| RpcSessionReplacedEvent\n\t| { type: \"bash_start\" }\n\t| { type: \"bash_end\" };\nexport type RpcEventListener = (event: RpcClientEvent) => void;\n\nfunction isProviderAccountEvent(event: RpcClientEvent): event is RpcProviderAccountEvent {\n\treturn event.type === \"auth_accounts_changed\" || event.type === \"account_failover\";\n}\n\n// ============================================================================\n// RPC Client\n// ============================================================================\n\nexport class RpcTransportGoneError extends Error {\n\treadonly code = \"rpc_transport_gone\" as const;\n\n\tconstructor(message = \"Shared RPC host is unavailable\") {\n\t\tsuper(message);\n\t\tthis.name = \"RpcTransportGoneError\";\n\t}\n}\n\nexport function isTransportGoneError(error: unknown): error is RpcTransportGoneError {\n\treturn (\n\t\terror instanceof RpcTransportGoneError ||\n\t\t(error instanceof Error &&\n\t\t\t(error.message === \"Client not started\" ||\n\t\t\t\terror.message.startsWith(\"RPC transport is not writable.\") ||\n\t\t\t\terror.message === \"RPC socket closed\"))\n\t);\n}\n\nexport class RpcClientOpenInFlightError extends Error {\n\treadonly code = \"open_session_in_flight\" as const;\n\n\tconstructor() {\n\t\tsuper(\"An open_session request is already in flight\");\n\t\tthis.name = \"RpcClientOpenInFlightError\";\n\t}\n}\n\n// Keep pre-lease startup delivery bounded by both record count and wire size.\nconst MAX_PENDING_SESSION_EVENTS = 512;\nconst MAX_PENDING_SESSION_EVENT_BYTES = 1024 * 1024;\n\nexport class RpcClient {\n\tprivate process: ChildProcess | null = null;\n\tprivate socket: Socket | null = null;\n\tprivate stopReadingStdout: (() => void) | null = null;\n\tprivate eventListeners: RpcEventListener[] = [];\n\tprivate pendingRequests: Map<\n\t\tstring,\n\t\t{\n\t\t\tresolve: (response: RpcResponse) => void;\n\t\t\treject: (error: Error) => void;\n\t\t\tonResponse?: (response: RpcResponse) => void;\n\t\t\tonReject?: (error: Error) => void;\n\t\t}\n\t> = new Map();\n\tprivate requestId = 0;\n\tprivate sessionId: string | undefined;\n\tprivate pendingOpenSession = false;\n\tprivate pendingSessionEvents: Array<{ sessionId: string; event: RpcClientEvent; bytes: number }> = [];\n\tprivate pendingSessionEventBytes = 0;\n\tprivate stderr = \"\";\n\tprivate exitError: Error | null = null;\n\tprivate disconnectNotified = false;\n\tprivate stopping = false;\n\tprivate options: RpcClientOptions;\n\n\tconstructor(options: RpcClientOptions = {}) {\n\t\tthis.options = options;\n\t}\n\n\t/**\n\t * Start the RPC agent process.\n\t */\n\tasync start(): Promise<void> {\n\t\tif (this.process || this.socket) {\n\t\t\tthrow new Error(\"Client already started\");\n\t\t}\n\n\t\tthis.exitError = null;\n\t\tthis.stopping = false;\n\t\tthis.disconnectNotified = false;\n\t\tif (this.options.socketPath) {\n\t\t\tawait this.startSocket(this.options.socketPath);\n\t\t\treturn;\n\t\t}\n\n\t\tconst cliPath = this.options.cliPath ?? \"dist/cli.js\";\n\t\tconst args = [\"--mode\", \"rpc\"];\n\n\t\tif (this.options.provider) {\n\t\t\targs.push(\"--provider\", this.options.provider);\n\t\t}\n\t\tif (this.options.model) {\n\t\t\targs.push(\"--model\", this.options.model);\n\t\t}\n\t\tif (this.options.args) {\n\t\t\targs.push(...this.options.args);\n\t\t}\n\n\t\tconst childProcess = spawn(\"node\", [cliPath, ...args], {\n\t\t\tcwd: this.options.cwd,\n\t\t\tenv: { ...process.env, ...this.options.env },\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t// Callers may be console-less on win32 (GUI hosts, detached daemons), and a\n\t\t\t// console-subsystem child would then allocate a fresh visible terminal window.\n\t\t\twindowsHide: true,\n\t\t});\n\t\tthis.process = childProcess;\n\n\t\t// Collect stderr for debugging\n\t\tchildProcess.stderr?.on(\"data\", (data) => {\n\t\t\tthis.stderr += data.toString();\n\t\t\tprocess.stderr.write(data);\n\t\t});\n\n\t\tchildProcess.once(\"exit\", (code, signal) => {\n\t\t\tif (this.process !== childProcess) return;\n\t\t\tconst error = this.createProcessExitError(code, signal);\n\t\t\tthis.exitError = error;\n\t\t\tthis.rejectPendingRequests(error);\n\t\t});\n\t\tchildProcess.once(\"error\", (error) => {\n\t\t\tif (this.process !== childProcess) return;\n\t\t\tconst processError = new Error(`Agent process error: ${error.message}. Stderr: ${this.stderr}`);\n\t\t\tthis.exitError = processError;\n\t\t\tthis.rejectPendingRequests(processError);\n\t\t});\n\t\tchildProcess.stdin?.on(\"error\", (error) => {\n\t\t\tif (this.process !== childProcess) return;\n\t\t\tconst stdinError =\n\t\t\t\tthis.exitError ?? new Error(`Agent process stdin error: ${error.message}. Stderr: ${this.stderr}`);\n\t\t\tthis.exitError = stdinError;\n\t\t\tthis.rejectPendingRequests(stdinError);\n\t\t});\n\n\t\t// Set up strict JSONL reader for stdout.\n\t\tthis.stopReadingStdout = attachJsonlLineReader(childProcess.stdout!, (line) => {\n\t\t\tthis.handleLine(line);\n\t\t});\n\n\t\t// Wait a moment for process to initialize\n\t\tawait new Promise((resolve) => setTimeout(resolve, 100));\n\n\t\tif (this.process.exitCode !== null) {\n\t\t\tconst error = this.exitError ?? this.createProcessExitError(this.process.exitCode, this.process.signalCode);\n\t\t\tthis.exitError = error;\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Stop the RPC agent process.\n\t */\n\tasync stop(): Promise<void> {\n\t\tthis.pendingOpenSession = false;\n\t\tthis.pendingSessionEvents = [];\n\t\tthis.pendingSessionEventBytes = 0;\n\t\tif (this.socket) {\n\t\t\tthis.stopping = true;\n\t\t\tthis.stopReadingStdout?.();\n\t\t\tthis.stopReadingStdout = null;\n\t\t\tthis.socket.destroy();\n\t\t\tthis.socket = null;\n\t\t\tthis.sessionId = undefined;\n\t\t\tthis.pendingOpenSession = false;\n\t\t\tthis.pendingSessionEvents = [];\n\t\t\tthis.notifyDisconnect(new RpcTransportGoneError());\n\t\t\treturn;\n\t\t}\n\t\tif (!this.process) return;\n\n\t\tthis.stopReadingStdout?.();\n\t\tthis.stopReadingStdout = null;\n\t\tthis.process.kill(\"SIGTERM\");\n\n\t\t// Wait for process to exit\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.process?.kill(\"SIGKILL\");\n\t\t\t\tresolve();\n\t\t\t}, 1000);\n\n\t\t\tthis.process?.on(\"exit\", () => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\n\t\tthis.process = null;\n\t\tthis.pendingRequests.clear();\n\t}\n\n\tprivate async startSocket(path: string): Promise<void> {\n\t\tconst secret = process.platform === \"win32\" ? await readSocketSecret(socketSecretPath(path)) : undefined;\n\t\tconst socket = createConnection(resolveSocketTransportAddress(path, process.platform, secret));\n\t\tthis.socket = socket;\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst onConnect = () => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tconst onError = (error: Error) => {\n\t\t\t\tcleanup();\n\t\t\t\tthis.socket = null;\n\t\t\t\treject(error);\n\t\t\t};\n\t\t\tconst cleanup = () => {\n\t\t\t\tsocket.off(\"connect\", onConnect);\n\t\t\t\tsocket.off(\"error\", onError);\n\t\t\t};\n\t\t\tsocket.once(\"connect\", onConnect);\n\t\t\tsocket.once(\"error\", onError);\n\t\t});\n\t\tif (secret) sendSocketHandshake(socket, secret);\n\t\tthis.stopReadingStdout = attachJsonlLineReader(socket, (line) => this.handleLine(line));\n\t\tsocket.once(\"close\", () => {\n\t\t\tif (this.socket !== socket) return;\n\t\t\tthis.socket = null;\n\t\t\tthis.notifyDisconnect(new RpcTransportGoneError());\n\t\t});\n\t\tsocket.once(\"error\", (error) => {\n\t\t\tif (this.socket !== socket) return;\n\t\t\tthis.notifyDisconnect(new RpcTransportGoneError());\n\t\t\tvoid error;\n\t\t});\n\t}\n\n\t/**\n\t * Subscribe to agent events.\n\t */\n\tonEvent(listener: RpcEventListener): () => void {\n\t\tthis.eventListeners.push(listener);\n\t\treturn () => {\n\t\t\tconst index = this.eventListeners.indexOf(listener);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.eventListeners.splice(index, 1);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Get collected stderr output (useful for debugging).\n\t */\n\tgetStderr(): string {\n\t\treturn this.stderr;\n\t}\n\n\t// =========================================================================\n\t// Command Methods\n\t// =========================================================================\n\n\tasync setClientInfo(width: number, capabilities?: string[]): Promise<void> {\n\t\tawait this.send({ type: \"set_client_info\", width, capabilities }, this.sessionId !== undefined);\n\t}\n\n\tasync openSession(options: {\n\t\tsessionPath?: string;\n\t\tcwd?: string;\n\t\tprovider?: string;\n\t\tmodelId?: string;\n\t\tthinkingLevel?: ThinkingLevel;\n\t\tpermissionPreset?: string;\n\t}): Promise<{ sessionId: string; state: RpcSessionState; attached?: boolean }> {\n\t\tif (this.pendingOpenSession) throw new RpcClientOpenInFlightError();\n\t\tthis.pendingOpenSession = true;\n\t\ttry {\n\t\t\tconst response = await this.send({ type: \"open_session\", ...options }, false);\n\t\t\tconst opened = this.getData<{ sessionId: string; state: RpcSessionState; attached?: boolean }>(response);\n\t\t\tthis.sessionId = opened.sessionId;\n\t\t\tthis.pendingOpenSession = false;\n\t\t\tthis.flushPendingSessionEvents();\n\t\t\treturn opened;\n\t\t} catch (error) {\n\t\t\tthis.pendingOpenSession = false;\n\t\t\tthis.pendingSessionEvents = [];\n\t\t\tthis.pendingSessionEventBytes = 0;\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync sendExtensionUIResponse(response: RpcExtensionUIResponse): Promise<void> {\n\t\tawait this.send(response, true, undefined, false);\n\t}\n\n\tasync closeSession(sessionId = this.sessionId): Promise<void> {\n\t\tif (!sessionId) return;\n\t\ttry {\n\t\t\tawait this.send({ type: \"close_session\", sessionId }, false);\n\t\t} catch (error) {\n\t\t\tif (!isTransportGoneError(error)) throw error;\n\t\t}\n\t\tif (this.sessionId === sessionId) this.sessionId = undefined;\n\t}\n\n\tasync listSessions(): Promise<\n\t\tArray<{\n\t\t\tsessionId: string;\n\t\t\tdurableSessionId?: string;\n\t\t\tsessionPath?: string;\n\t\t\tcwd: string;\n\t\t\tname?: string;\n\t\t\tstatus: \"opening\" | \"open\" | \"closing\" | \"closed\";\n\t\t}>\n\t> {\n\t\tconst response = await this.send({ type: \"list_sessions\" }, false);\n\t\treturn this.getData<{\n\t\t\tsessions: Array<{\n\t\t\t\tsessionId: string;\n\t\t\t\tdurableSessionId?: string;\n\t\t\t\tsessionPath?: string;\n\t\t\t\tcwd: string;\n\t\t\t\tname?: string;\n\t\t\t\tstatus: \"opening\" | \"open\" | \"closing\" | \"closed\";\n\t\t\t}>;\n\t\t}>(response).sessions;\n\t}\n\n\t/**\n\t * Send a prompt to the agent.\n\t * Returns immediately after sending; use onEvent() to receive streaming events.\n\t * Use waitForIdle() to wait for completion.\n\t *\n\t * The disposition/preflight callbacks mirror AgentSession's local prompt contract:\n\t * they fire synchronously while the response frame is dispatched — before any\n\t * queued message_start event — so optimistic-echo eligibility is settled in wire\n\t * order. A success response without a disposition (older host) maps to \"handled\"\n\t * so the echo degrades to canonical-only rendering instead of double-rendering.\n\t */\n\tasync prompt(message: string, images?: ImageContent[]): Promise<void>;\n\tasync prompt(message: string, options?: PromptOptions): Promise<void>;\n\tasync prompt(message: string, optionsOrImages?: PromptOptions | ImageContent[]): Promise<void> {\n\t\tconst options: PromptOptions = Array.isArray(optionsOrImages)\n\t\t\t? { images: optionsOrImages }\n\t\t\t: (optionsOrImages ?? {});\n\t\tconst response = await this.send(\n\t\t\t{\n\t\t\t\ttype: \"prompt\",\n\t\t\t\tmessage,\n\t\t\t\t...(options.images ? { images: options.images } : {}),\n\t\t\t\t...(options.streamingBehavior ? { streamingBehavior: options.streamingBehavior } : {}),\n\t\t\t\t...(options.thinkingLevel ? { thinkingLevel: options.thinkingLevel } : {}),\n\t\t\t\t...(options.sessionTitlePrompt !== undefined ? { sessionTitlePrompt: options.sessionTitlePrompt } : {}),\n\t\t\t\t...(options.expandPromptTemplates !== undefined\n\t\t\t\t\t? { expandPromptTemplates: options.expandPromptTemplates }\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t\ttrue,\n\t\t\t{\n\t\t\t\tonResponse: (wireResponse) => {\n\t\t\t\t\tif (!wireResponse.success) {\n\t\t\t\t\t\toptions?.preflightResult?.(false);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst data = (wireResponse as { data?: { disposition?: PromptDisposition } }).data;\n\t\t\t\t\toptions?.promptDisposition?.(data?.disposition ?? \"handled\");\n\t\t\t\t\toptions?.preflightResult?.(true);\n\t\t\t\t},\n\t\t\t\tonReject: () => {\n\t\t\t\t\toptions?.preflightResult?.(false);\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\tif (!response.success) {\n\t\t\tthrow new Error((response as Extract<RpcResponse, { success: false }>).error);\n\t\t}\n\t}\n\n\tasync appendUserMessage(content: unknown): Promise<void> {\n\t\tawait this.send({ type: \"append_user_message\", content });\n\t}\n\n\tasync appendSessionEntry(entry: import(\"../../core/session-manager.ts\").SessionEntry): Promise<void> {\n\t\tawait this.send({ type: \"append_session_entry\", entry });\n\t}\n\n\tasync sendCustomMessage<T = unknown>(\n\t\tmessage: { customType: string; content: unknown; display: boolean; details?: T },\n\t\toptions?: { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"nextTurn\" },\n\t): Promise<void> {\n\t\tawait this.send({ type: \"send_custom_message\", ...message, ...options });\n\t}\n\n\t/**\n\t * Queue a steering message to interrupt the agent mid-run.\n\t */\n\tasync steer(message: string, images?: ImageContent[], recovery?: { enqueueOrder?: number }): Promise<void> {\n\t\tawait this.send({ type: \"steer\", message, images, enqueueOrder: recovery?.enqueueOrder });\n\t}\n\n\t/**\n\t * Queue a follow-up message to be processed after the agent finishes.\n\t */\n\tasync followUp(message: string, images?: ImageContent[], recovery?: { enqueueOrder?: number }): Promise<void> {\n\t\tawait this.send({ type: \"follow_up\", message, images, enqueueOrder: recovery?.enqueueOrder });\n\t}\n\n\t/**\n\t * Abort current operation.\n\t */\n\tasync abort(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.send({ type: \"abort\" });\n\t\t} catch (error) {\n\t\t\tif (!isTransportGoneError(error)) throw error;\n\t\t}\n\t}\n\n\tasync abortCompaction(): Promise<void> {\n\t\tawait this.send({ type: \"abort_compaction\" });\n\t}\n\n\tasync reload(): Promise<{ cancelled: boolean; reason?: string }> {\n\t\tconst response = await this.send({ type: \"reload\" });\n\t\treturn this.getData(response);\n\t}\n\n\tasync checkReloadVeto(): Promise<{ cancelled: boolean; reason?: string }> {\n\t\tconst response = await this.send({ type: \"check_reload_veto\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Clear queued steering and follow-up messages, returning their text.\n\t */\n\tasync clearQueue(options?: { abortWillFollow?: boolean }): Promise<{\n\t\tsteering: string[];\n\t\tfollowUp: string[];\n\t\tordered: Array<{ text: string; mode: \"steer\" | \"followUp\"; enqueueOrder: number }>;\n\t}> {\n\t\tconst response = await this.send({ type: \"clear_queue\", abortWillFollow: options?.abortWillFollow });\n\t\treturn this.getData(response);\n\t}\n\n\tasync getSteeringMessages(): Promise<string[]> {\n\t\tconst response = await this.send({ type: \"get_steering_messages\" });\n\t\treturn this.getData<{ messages: string[] }>(response).messages;\n\t}\n\n\tasync getFollowUpMessages(): Promise<string[]> {\n\t\tconst response = await this.send({ type: \"get_follow_up_messages\" });\n\t\treturn this.getData<{ messages: string[] }>(response).messages;\n\t}\n\n\tasync abortBranchSummary(): Promise<void> {\n\t\tawait this.send({ type: \"abort_branch_summary\" });\n\t}\n\n\tasync recordBashResult(command: string, result: BashResult, excludeFromContext?: boolean): Promise<void> {\n\t\tawait this.send({ type: \"record_bash_result\", command, result, excludeFromContext });\n\t}\n\n\tasync setLabel(entryId: string, label?: string): Promise<void> {\n\t\tawait this.send({ type: \"set_label\", entryId, label });\n\t}\n\n\t/**\n\t * Start a new session, optionally with parent tracking.\n\t * @param parentSession - Optional parent session path for lineage tracking\n\t * @returns Object with `cancelled: true` if an extension cancelled the new session\n\t */\n\tasync newSession(parentSession?: string): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"new_session\", parentSession });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get current session state.\n\t */\n\tasync getState(): Promise<RpcSessionState> {\n\t\tconst response = await this.send({ type: \"get_state\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set model by provider and ID.\n\t */\n\tasync setModel(\n\t\tprovider: string,\n\t\tmodelId: string,\n\t): Promise<{ provider: string; id: string; systemPromptName?: string }> {\n\t\tconst response = await this.send({ type: \"set_model\", provider, modelId });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Cycle to next model.\n\t */\n\tasync setFavoriteModels(models: RpcSessionModelEntry[]): Promise<void> {\n\t\tawait this.send({ type: \"set_favorite_models\", models });\n\t}\n\n\tasync setScopedModels(models: RpcSessionModelEntry[]): Promise<void> {\n\t\tawait this.send({ type: \"set_scoped_models\", models });\n\t}\n\n\tasync cycleModel(direction: \"forward\" | \"backward\" = \"forward\"): Promise<{\n\t\tmodel: { provider: string; id: string };\n\t\tthinkingLevel: ThinkingLevel;\n\t\tisScoped: boolean;\n\t} | null> {\n\t\tconst response = await this.send({ type: \"cycle_model\", direction });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get list of available models.\n\t */\n\tasync getAvailableModels(): Promise<ModelInfo[]> {\n\t\tconst response = await this.send({ type: \"get_available_models\" });\n\t\treturn this.getData<{ models: ModelInfo[] }>(response).models;\n\t}\n\n\t/**\n\t * Set thinking level.\n\t *\n\t * `scope: \"turn\"` changes only this session's level without rewriting the model's remembered\n\t * level; it throws when the active model does not support the requested level, and the\n\t * session keeps the level it already had.\n\t */\n\tasync setThinkingLevel(level: ThinkingLevel, options?: { scope?: \"turn\" }): Promise<void> {\n\t\tconst response = await this.send({ type: \"set_thinking_level\", level, scope: options?.scope });\n\t\tif (!response.success) {\n\t\t\tthrow new Error((response as Extract<RpcResponse, { success: false }>).error);\n\t\t}\n\t}\n\n\t/**\n\t * Cycle thinking level.\n\t */\n\tasync cycleThinkingLevel(): Promise<{ level: ThinkingLevel } | null> {\n\t\tconst response = await this.send({ type: \"cycle_thinking_level\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get list of available thinking levels for the current model.\n\t */\n\tasync getAvailableThinkingLevels(): Promise<ThinkingLevel[]> {\n\t\tconst response = await this.send({ type: \"get_available_thinking_levels\" });\n\t\treturn this.getData<{ levels: ThinkingLevel[] }>(response).levels;\n\t}\n\n\t/**\n\t * Turn OpenAI Codex fast mode (the `priority` service tier) on or off for the active model.\n\t *\n\t * The choice is remembered per model, so a later session on the same model starts the same\n\t * way. Throws when the request is refused: a non-Codex model, or an active `:priority` model\n\t * pin that fast mode must not undo.\n\t */\n\tasync setFastMode(\n\t\tenabled: boolean,\n\t): Promise<{ enabled: boolean; serviceTier: ServiceTier; provider: string; modelId: string }> {\n\t\tconst response = await this.send({ type: \"set_fast_mode\", enabled });\n\t\treturn this.getData(response);\n\t}\n\n\t/** Current fast-mode state and the service tier requests would carry. */\n\tasync getFastMode(): Promise<{ enabled: boolean; serviceTier: ServiceTier | null }> {\n\t\tconst response = await this.send({ type: \"get_fast_mode\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set steering mode.\n\t */\n\tasync setSteeringMode(mode: \"all\" | \"one-at-a-time\"): Promise<void> {\n\t\tawait this.send({ type: \"set_steering_mode\", mode });\n\t}\n\n\t/**\n\t * Set follow-up mode.\n\t */\n\tasync setFollowUpMode(mode: \"all\" | \"one-at-a-time\"): Promise<void> {\n\t\tawait this.send({ type: \"set_follow_up_mode\", mode });\n\t}\n\n\t/**\n\t * Compact session context.\n\t */\n\tasync compact(customInstructions?: string): Promise<CompactionResult> {\n\t\tconst response = await this.send({ type: \"compact\", customInstructions });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set auto-compaction enabled/disabled.\n\t */\n\tasync setAutoCompaction(enabled: boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_auto_compaction\", enabled });\n\t}\n\n\t/**\n\t * Set auto-retry enabled/disabled.\n\t */\n\tasync setAutoRetry(enabled: boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_auto_retry\", enabled });\n\t}\n\n\t/**\n\t * Abort in-progress retry.\n\t */\n\tasync abortRetry(): Promise<void> {\n\t\tawait this.send({ type: \"abort_retry\" });\n\t}\n\n\t/**\n\t * Execute a bash command.\n\t */\n\tasync bash(\n\t\tcommand: string,\n\t\toptions?: { excludeFromContext?: boolean; executionId?: string; operations?: Record<string, unknown> },\n\t): Promise<BashResult> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"bash\",\n\t\t\tcommand,\n\t\t\texcludeFromContext: options?.excludeFromContext,\n\t\t\texecutionId: options?.executionId,\n\t\t\toperations: options?.operations,\n\t\t});\n\t\treturn this.getData(response);\n\t}\n\n\tasync navigateTree(\n\t\ttargetId: string,\n\t\toptions?: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string },\n\t): Promise<{ cancelled: boolean; editorText?: string; aborted?: boolean; summaryEntry?: unknown }> {\n\t\tconst response = await this.send({ type: \"navigate_tree\", targetId, ...options });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Abort running bash command.\n\t */\n\tasync abortBash(): Promise<void> {\n\t\tawait this.send({ type: \"abort_bash\" });\n\t}\n\n\tasync cleanupBashOutput(path: string): Promise<void> {\n\t\tawait this.send({ type: \"cleanup_bash_output\", path });\n\t}\n\n\t/**\n\t * Get session statistics.\n\t */\n\tasync getSessionStats(): Promise<SessionStats> {\n\t\tconst response = await this.send({ type: \"get_session_stats\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Export session to HTML.\n\t */\n\tasync exportHtml(outputPath?: string, themeName?: string): Promise<{ path: string }> {\n\t\tconst response = await this.send({ type: \"export_html\", outputPath, themeName });\n\t\treturn this.getData(response);\n\t}\n\n\tasync exportJsonl(outputPath?: string): Promise<{ path: string }> {\n\t\tconst response = await this.send({ type: \"export_jsonl\", outputPath });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Switch to a different session file.\n\t * @returns Object with `cancelled: true` if an extension cancelled the switch\n\t */\n\tasync switchSession(sessionPath: string, options?: { cwdOverride?: string }): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"switch_session\", sessionPath, cwdOverride: options?.cwdOverride });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Fork from a specific message.\n\t * @returns Object with `text` (the message text) and `cancelled` (if extension cancelled)\n\t */\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\" },\n\t): Promise<{ text: string; cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"fork\", entryId, position: options?.position });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Clone the current active branch into a new session.\n\t * @returns Object with `cancelled: true` if an extension cancelled the clone\n\t */\n\tasync clone(): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"clone\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get messages available for forking.\n\t */\n\tasync getForkMessages(): Promise<Array<{ entryId: string; text: string }>> {\n\t\tconst response = await this.send({ type: \"get_fork_messages\" });\n\t\treturn this.getData<{ messages: Array<{ entryId: string; text: string }> }>(response).messages;\n\t}\n\n\t/**\n\t * Get session entries in append order, optionally only those after the `since` entry id.\n\t */\n\tasync getEntries(since?: string): Promise<{ entries: SessionEntry[]; leafId: string | null }> {\n\t\tconst response = await this.send({ type: \"get_entries\", since });\n\t\treturn this.getData<{ entries: SessionEntry[]; leafId: string | null }>(response);\n\t}\n\n\t/**\n\t * Get the session entry tree.\n\t */\n\tasync getTree(): Promise<{ tree: SessionTreeNode[]; leafId: string | null }> {\n\t\tconst response = await this.send({ type: \"get_tree\" });\n\t\treturn this.getData<{ tree: SessionTreeNode[]; leafId: string | null }>(response);\n\t}\n\n\t/**\n\t * Get text of last assistant message.\n\t */\n\tasync getLastAssistantText(): Promise<string | null> {\n\t\tconst response = await this.send({ type: \"get_last_assistant_text\" });\n\t\treturn this.getData<{ text: string | null }>(response).text;\n\t}\n\n\t/**\n\t * Set the session display name.\n\t */\n\tasync setSessionName(name: string): Promise<void> {\n\t\tawait this.send({ type: \"set_session_name\", name });\n\t}\n\n\tasync importJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"import_jsonl\", inputPath, cwdOverride });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get all messages in the session.\n\t */\n\tasync getMessages(): Promise<AgentMessage[]> {\n\t\tconst response = await this.send({ type: \"get_messages\" });\n\t\treturn this.getData<{ messages: AgentMessage[] }>(response).messages;\n\t}\n\n\t/**\n\t * Get available commands (extension commands, prompt templates, skills).\n\t */\n\tasync getCommands(): Promise<RpcSlashCommand[]> {\n\t\tconst response = await this.send({ type: \"get_commands\" });\n\t\treturn this.getData<{ commands: RpcSlashCommand[] }>(response).commands;\n\t}\n\n\t/** Invoke one extension-owned RPC request handler and return its structured result. */\n\tasync requestExtension<T = unknown>(name: string, data?: unknown): Promise<T> {\n\t\tconst response = await this.send({\n\t\t\ttype: \"extension_request\",\n\t\t\tname,\n\t\t\t...(data === undefined ? {} : { data }),\n\t\t});\n\t\treturn this.getData<T>(response);\n\t}\n\n\t/** List safe metadata for the named provider's configured account slots. */\n\tasync getProviderAccounts(provider: string): Promise<RpcProviderAccount[]> {\n\t\tconst response = await this.send({ type: \"get_provider_accounts\", provider });\n\t\treturn this.getData<{ accounts: RpcProviderAccount[] }>(response).accounts;\n\t}\n\n\t/** Pin a provider account for future session-affine requests, or clear the pin. */\n\tasync pinProviderAccount(provider: string, name: string | null): Promise<void> {\n\t\tawait this.send({ type: \"account_pin\", provider, name });\n\t}\n\n\t/** Remove a persisted provider account slot. Environment slots are read-only. */\n\tasync removeProviderAccount(provider: string, name: string): Promise<void> {\n\t\tawait this.send({ type: \"account_remove\", provider, name });\n\t}\n\n\t// =========================================================================\n\t// Helpers\n\t// =========================================================================\n\n\t/**\n\t * Wait for agent to become idle (no streaming).\n\t * Resolves when agent_settled event is received.\n\t */\n\twaitForIdle(timeout = 60000): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tunsubscribe();\n\t\t\t\treject(new Error(`Timeout waiting for agent to become idle. Stderr: ${this.stderr}`));\n\t\t\t}, timeout);\n\n\t\t\tconst unsubscribe = this.onEvent((event) => {\n\t\t\t\tif (event.type === \"agent_settled\") {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Collect events until agent becomes idle.\n\t */\n\tcollectEvents(timeout = 60000): Promise<JsonAgentSessionEvent[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst events: JsonAgentSessionEvent[] = [];\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tunsubscribe();\n\t\t\t\treject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`));\n\t\t\t}, timeout);\n\n\t\t\tconst unsubscribe = this.onEvent((event) => {\n\t\t\t\tif (\n\t\t\t\t\tisProviderAccountEvent(event) ||\n\t\t\t\t\tevent.type === \"extension_event\" ||\n\t\t\t\t\tevent.type === \"bash_start\" ||\n\t\t\t\t\tevent.type === \"bash_end\" ||\n\t\t\t\t\tevent.type === \"extension_ui_request\" ||\n\t\t\t\t\t// Connection-level, not part of the agent's event stream.\n\t\t\t\t\tevent.type === \"session_replaced\"\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\tevents.push(event);\n\t\t\t\tif (event.type === \"agent_settled\") {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tresolve(events);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Send prompt and wait for completion, returning all events.\n\t */\n\tasync promptAndWait(message: string, images?: ImageContent[], timeout = 60000): Promise<JsonAgentSessionEvent[]> {\n\t\tconst eventsPromise = this.collectEvents(timeout);\n\t\tawait this.prompt(message, images ? { images } : undefined);\n\t\treturn eventsPromise;\n\t}\n\n\t// =========================================================================\n\t// Internal\n\t// =========================================================================\n\n\tprivate handleLine(line: string): void {\n\t\ttry {\n\t\t\tconst data = JSON.parse(line);\n\n\t\t\t// Check if it's a response to a pending request\n\t\t\tif (data.type === \"response\" && data.id && this.pendingRequests.has(data.id)) {\n\t\t\t\tconst pending = this.pendingRequests.get(data.id)!;\n\t\t\t\tthis.pendingRequests.delete(data.id);\n\t\t\t\t// Response hooks run synchronously inside the frame dispatch so ordering-sensitive\n\t\t\t\t// contracts (e.g. optimistic-echo disposition) settle before the NEXT frame —\n\t\t\t\t// never through the microtask scheduled by resolve().\n\t\t\t\tpending.onResponse?.(data as RpcResponse);\n\t\t\t\tpending.resolve(data as RpcResponse);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Otherwise it's an event. During open_session, retain tagged events until\n\t\t\t// the response establishes the lease so startup hooks are not lost.\n\t\t\tif (typeof data.sessionId === \"string\" && data.sessionId !== this.sessionId) {\n\t\t\t\tif (this.pendingOpenSession) {\n\t\t\t\t\tconst bytes = Buffer.byteLength(line);\n\t\t\t\t\tthis.pendingSessionEvents.push({ sessionId: data.sessionId, event: data as RpcClientEvent, bytes });\n\t\t\t\t\tthis.pendingSessionEventBytes += bytes;\n\t\t\t\t\twhile (\n\t\t\t\t\t\tthis.pendingSessionEvents.length > MAX_PENDING_SESSION_EVENTS ||\n\t\t\t\t\t\tthis.pendingSessionEventBytes > MAX_PENDING_SESSION_EVENT_BYTES\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst oldest = this.pendingSessionEvents.shift();\n\t\t\t\t\t\tif (!oldest) break;\n\t\t\t\t\t\tthis.pendingSessionEventBytes -= oldest.bytes;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (const listener of this.eventListeners) {\n\t\t\t\tlistener(data as RpcClientEvent);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore non-JSON lines\n\t\t}\n\t}\n\n\tprivate flushPendingSessionEvents(): void {\n\t\tconst pending = this.pendingSessionEvents;\n\t\tthis.pendingSessionEvents = [];\n\t\tthis.pendingSessionEventBytes = 0;\n\t\tfor (const { sessionId, event } of pending) {\n\t\t\tif (sessionId !== this.sessionId) continue;\n\t\t\tfor (const listener of this.eventListeners) listener(event);\n\t\t}\n\t}\n\n\tprivate createProcessExitError(code: number | null, signal: NodeJS.Signals | null): Error {\n\t\treturn new Error(`Agent process exited (code=${code} signal=${signal}). Stderr: ${this.stderr}`);\n\t}\n\n\tprivate notifyDisconnect(error: RpcTransportGoneError): void {\n\t\tthis.rejectPendingRequests(error);\n\t\tif (!this.disconnectNotified && !this.stopping) {\n\t\t\tthis.disconnectNotified = true;\n\t\t\tthis.options.onDisconnect?.(error);\n\t\t}\n\t}\n\n\tprivate rejectPendingRequests(error: Error): void {\n\t\tfor (const pending of this.pendingRequests.values()) {\n\t\t\tpending.onReject?.(error);\n\t\t\tpending.reject(error);\n\t\t}\n\t\tthis.pendingRequests.clear();\n\t}\n\n\tprivate async send(\n\t\tcommand: RpcCommandBody | RpcExtensionUIResponse,\n\t\troute = true,\n\t\thooks?: { onResponse?: (response: RpcResponse) => void; onReject?: (error: Error) => void },\n\t\texpectResponse = true,\n\t): Promise<RpcResponse> {\n\t\tconst childProcess = this.process;\n\t\tconst stream = this.socket ?? childProcess?.stdin;\n\t\tif (!stream) {\n\t\t\tthrow new RpcTransportGoneError();\n\t\t}\n\t\tif (this.exitError) {\n\t\t\tthrow this.exitError;\n\t\t}\n\t\tif (childProcess?.exitCode !== null && childProcess?.exitCode !== undefined) {\n\t\t\tconst error = this.createProcessExitError(childProcess.exitCode, childProcess.signalCode);\n\t\t\tthis.exitError = error;\n\t\t\tthrow error;\n\t\t}\n\t\tif (stream.destroyed || !stream.writable) {\n\t\t\tconst error = new RpcTransportGoneError();\n\t\t\tthis.notifyDisconnect(error);\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst id = \"type\" in command && command.type === \"extension_ui_response\" ? command.id : `req_${++this.requestId}`;\n\t\tconst fullCommand = {\n\t\t\t...command,\n\t\t\t...(route && this.sessionId && !(\"sessionId\" in command) ? { sessionId: this.sessionId } : {}),\n\t\t\t...(command.type === \"extension_ui_response\" ? {} : { id }),\n\t\t} as RpcCommand;\n\n\t\tif (!expectResponse) {\n\t\t\tstream.write(serializeJsonLine(fullCommand));\n\t\t\treturn Promise.resolve({ type: \"response\", command: command.type, success: true } as RpcResponse);\n\t\t}\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tconst pending = this.pendingRequests.get(id);\n\t\t\t\tthis.pendingRequests.delete(id);\n\t\t\t\tconst timeoutError = new Error(`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`);\n\t\t\t\tpending?.onReject?.(timeoutError);\n\t\t\t\treject(timeoutError);\n\t\t\t}, 30000);\n\n\t\t\tthis.pendingRequests.set(id, {\n\t\t\t\tresolve: (response) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve(response);\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t\t...(hooks?.onResponse ? { onResponse: hooks.onResponse } : {}),\n\t\t\t\t...(hooks?.onReject ? { onReject: hooks.onReject } : {}),\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\tstream.write(serializeJsonLine(fullCommand));\n\t\t\t} catch (error: unknown) {\n\t\t\t\tconst writeError = error instanceof Error ? error : new Error(String(error));\n\t\t\t\tconst pending = this.pendingRequests.get(id);\n\t\t\t\tthis.pendingRequests.delete(id);\n\t\t\t\tpending?.onReject?.(writeError);\n\t\t\t\tpending?.reject(writeError);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate getData<T>(response: RpcResponse): T {\n\t\tif (!response.success) {\n\t\t\tconst errorResponse = response as Extract<RpcResponse, { success: false }>;\n\t\t\tif (errorResponse.errorCode === \"missing_session_cwd\" && errorResponse.errorData) {\n\t\t\t\tthrow new MissingSessionCwdError(\n\t\t\t\t\terrorResponse.errorData as ConstructorParameters<typeof MissingSessionCwdError>[0],\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(errorResponse.error);\n\t\t}\n\t\t// Type assertion: we trust response.data matches T based on the command sent.\n\t\t// This is safe because each public method specifies the correct T for its command.\n\t\tconst successResponse = response as Extract<RpcResponse, { success: true; data: unknown }>;\n\t\treturn successResponse.data as T;\n\t}\n}\n"]}
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
* | ---------------- | ----------------------------------------------------------------------------------------------- | ----------------------------------------------- | ----- |
|
|
30
30
|
* | `get_protocol_info` | - | `{ protocolVersion: 1, serverVersion, capabilities, mode: "classic"|"multi" }` | Answered in BOTH modes; side-effect-free capability probe. |
|
|
31
31
|
* | `open_session` | `sessionPath?`, `cwd?`, `provider?`, `modelId?`, `thinkingLevel?`, `permissionPreset?` (all optional; paths MUST be absolute) | `{ sessionId, state: RpcSessionState, attached?: boolean }` | `sessionPath` = today's `--session` semantics (open-if-exists else create persisting there); `provider`/`modelId` applied only on create (resume restores the session's model); params form the immutable launch profile (D8). |
|
|
32
|
-
* | `close_session` | `sessionId` | `{}` | Aborts active work
|
|
32
|
+
* | `close_session` | `sessionId` | `{}` | Aborts active work and awaits teardown for the host grace window, then force-releases; the first closer's response is the LAST record tagged with that handle, while concurrent closes join and receive targeted success responses. |
|
|
33
33
|
* | `list_sessions` | - | `{ sessions: [{ sessionId, durableSessionId, sessionPath, cwd, name, status }] }` | Includes `opening`/`closing` entries with their status. |
|
|
34
34
|
* | `get_steering_messages` / `get_follow_up_messages` / `clear_queue` | queue read or clear parameters | host-authoritative queue values | Interactive attach clients must not read bootstrap queues. |
|
|
35
35
|
* | `abort_branch_summary` / `record_bash_result` / `set_label` | narrow mutation payloads | `{}` | Routes interactive runtime mutations to the owning host session. |
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
* | ---------------- | ----------------------------------------------------------------------------------------------- | ----------------------------------------------- | ----- |
|
|
30
30
|
* | `get_protocol_info` | - | `{ protocolVersion: 1, serverVersion, capabilities, mode: "classic"|"multi" }` | Answered in BOTH modes; side-effect-free capability probe. |
|
|
31
31
|
* | `open_session` | `sessionPath?`, `cwd?`, `provider?`, `modelId?`, `thinkingLevel?`, `permissionPreset?` (all optional; paths MUST be absolute) | `{ sessionId, state: RpcSessionState, attached?: boolean }` | `sessionPath` = today's `--session` semantics (open-if-exists else create persisting there); `provider`/`modelId` applied only on create (resume restores the session's model); params form the immutable launch profile (D8). |
|
|
32
|
-
* | `close_session` | `sessionId` | `{}` | Aborts active work
|
|
32
|
+
* | `close_session` | `sessionId` | `{}` | Aborts active work and awaits teardown for the host grace window, then force-releases; the first closer's response is the LAST record tagged with that handle, while concurrent closes join and receive targeted success responses. |
|
|
33
33
|
* | `list_sessions` | - | `{ sessions: [{ sessionId, durableSessionId, sessionPath, cwd, name, status }] }` | Includes `opening`/`closing` entries with their status. |
|
|
34
34
|
* | `get_steering_messages` / `get_follow_up_messages` / `clear_queue` | queue read or clear parameters | host-authoritative queue values | Interactive attach clients must not read bootstrap queues. |
|
|
35
35
|
* | `abort_branch_summary` / `record_bash_result` / `set_label` | narrow mutation payloads | `{}` | Routes interactive runtime mutations to the owning host session. |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-mode.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-mode.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RPC mode: Headless operation with JSON stdin/stdout protocol.\n *\n * Used for embedding the agent in other applications.\n * Receives commands as JSON on stdin, outputs events and responses as JSON on stdout.\n *\n * Protocol:\n * - Commands: JSON objects with `type` field, optional `id` for correlation\n * - Responses: JSON objects with `type: \"response\"`, `command`, `success`, and optional `data`/`error`\n * - Events: AgentSessionEvent objects streamed as they occur\n * - Extension UI: Extension UI requests are emitted, client responds with extension_ui_response\n *\n * This is the single-connection stdio host. The RPC command loop, extension-UI\n * bridge, and event subscription live in `connection-handler.ts` so the same\n * logic can also serve a caller-owned RPC transport. This file owns exactly the\n * process-level concerns that a per-connection handler must NOT\n * touch: stdout takeover, stdin wiring, signal handlers, and process exit.\n *\n * ── Multi-session mode (`--multi-session`) ─────────────────────────────────\n *\n * Startup: `senpi --mode rpc --multi-session` → NO default session is constructed\n * (no default `AgentSessionRuntime`, no default extension/watcher load). Classic\n * `senpi --mode rpc` is byte-identical to today. Mode is fixed at process start;\n * there is no runtime transition.\n *\n * D1 normative table (multi-session mode):\n *\n * | Command | Params | Success data | Notes |\n * | ---------------- | ----------------------------------------------------------------------------------------------- | ----------------------------------------------- | ----- |\n * | `get_protocol_info` | - | `{ protocolVersion: 1, serverVersion, capabilities, mode: \"classic\"|\"multi\" }` | Answered in BOTH modes; side-effect-free capability probe. |\n * | `open_session` | `sessionPath?`, `cwd?`, `provider?`, `modelId?`, `thinkingLevel?`, `permissionPreset?` (all optional; paths MUST be absolute) | `{ sessionId, state: RpcSessionState, attached?: boolean }` | `sessionPath` = today's `--session` semantics (open-if-exists else create persisting there); `provider`/`modelId` applied only on create (resume restores the session's model); params form the immutable launch profile (D8). |\n * | `close_session` | `sessionId` | `{}` | Aborts active work, awaits agent idle + settled persistence, flushes queued events, detaches subscriptions; its response is the LAST record tagged with that handle — no events after (test-pinned). |\n * | `list_sessions` | - | `{ sessions: [{ sessionId, durableSessionId, sessionPath, cwd, name, status }] }` | Includes `opening`/`closing` entries with their status. |\n * | `get_steering_messages` / `get_follow_up_messages` / `clear_queue` | queue read or clear parameters | host-authoritative queue values | Interactive attach clients must not read bootstrap queues. |\n * | `abort_branch_summary` / `record_bash_result` / `set_label` | narrow mutation payloads | `{}` | Routes interactive runtime mutations to the owning host session. |\n * | every existing command | + `sessionId` (REQUIRED in multi mode) | unchanged | Routed to that session. |\n *\n * Identities (D6): response-level `sessionId` = opaque routing handle, unique per\n * process epoch, ephemeral (dies with the child). `state.sessionId` = durable\n * JSONL session identity (what a resume cursor stores today). `list_sessions`\n * exposes both. Clients store both, discard routing handles on child exit, verify\n * only durable ids against cursors.\n *\n * Stable error codes (in the response `error` field, machine-matchable):\n * `unknown_session`, `session_closing`, `session_path_in_use`, `missing_session_id`\n * (session-scoped command without `sessionId` in multi mode), `multi_session_disabled`\n * (`open_session` in classic mode), `invalid_path` (relative `sessionPath`/`cwd`),\n * `open_failed: <detail>`.\n *\n * Tagging: every response/event/`extension_ui_request` belonging to a session\n * carries top-level `sessionId` (routing handle). `get_protocol_info`/\n * `list_sessions` responses are untagged. Classic mode: nothing tagged\n * (byte-identical).\n *\n * Ordering guarantee (D9): strict FIFO per session; one total stdout order;\n * cross-session order unspecified; fair round-robin between sessions' queued\n * complete records; NO cross-session batch coalescing (per-session event buffers;\n * the process-wide single-array coalescer in `event-output-buffer.ts` must not\n * merge records of different sessions into one write). Starvation freedom is NOT\n * promised (single pipe); a giant tool record delays others — bounded only by\n * record completion.\n *\n * Duplicate/idempotency: duplicate `open_session` while a path reservation is\n * held → `session_path_in_use`. `close_session` on unknown/already-closed →\n * `unknown_session` error. Request `id`s are client-owned; the server echoes them\n * without dedup.\n *\n * Full prose docs: `packages/coding-agent/docs/rpc.md` (Multi-session mode).\n */\n\nimport type { AgentSessionEvent } from \"../../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport { envValue } from \"../../core/brand.ts\";\nimport {\n\tflushRawStdout,\n\ttakeOverStdout,\n\twaitForRawStdoutBackpressure,\n\twriteRawStdout,\n} from \"../../core/output-guard.ts\";\nimport { killTrackedDetachedChildren } from \"../../utils/shell.ts\";\nimport { toJsonEvent } from \"../json-event.ts\";\nimport { createRpcConnectionHandler, type RpcConnectionSink } from \"./connection-handler.ts\";\nimport { parseClientCapabilities } from \"./custom-capability.ts\";\nimport { attachJsonlLineReader, MAX_RPC_LINE_CHARACTERS, serializeJsonLine } from \"./jsonl.ts\";\n\n// Re-export types for consumers\nexport type {\n\tRpcCommand,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcResponse,\n\tRpcSessionState,\n} from \"./rpc-types.ts\";\n\n/**\n * Run in RPC mode.\n * Listens for JSON commands on stdin, outputs events and responses on stdout.\n */\nexport async function runRpcMode(runtimeHost: AgentSessionRuntime): Promise<never> {\n\ttakeOverStdout();\n\n\tconst sink: RpcConnectionSink = {\n\t\twriteRaw: (chunk) => {\n\t\t\tconst linearized = chunk\n\t\t\t\t.split(\"\\n\")\n\t\t\t\t.filter((line) => line.length > 0)\n\t\t\t\t.map((line) => {\n\t\t\t\t\tconst value = JSON.parse(line) as { type?: string };\n\t\t\t\t\treturn JSON.stringify(value.type === \"message_update\" ? toJsonEvent(value as AgentSessionEvent) : value);\n\t\t\t\t})\n\t\t\t\t.join(\"\\n\");\n\t\t\twriteRawStdout(linearized.length > 0 ? `${linearized}\\n` : \"\");\n\t\t},\n\t\twaitForBackpressure: waitForRawStdoutBackpressure,\n\t};\n\n\t// Client capability flags reach this single-connection stdio host via the\n\t// SENPI_RPC_CLIENT_CAPABILITIES env var (comma-separated). A launcher can set\n\t// it from a client handshake; a plain stdio client that sets nothing gets\n\t// byte-identical default behavior.\n\tconst capabilities = parseClientCapabilities(envValue(\"RPC_CLIENT_CAPABILITIES\"));\n\tconst handler = createRpcConnectionHandler(runtimeHost, sink, { capabilities });\n\n\tlet shuttingDown = false;\n\tconst signalCleanupHandlers: Array<() => void> = [];\n\n\tconst registerSignalHandlers = (): void => {\n\t\tconst signals: NodeJS.Signals[] = [\"SIGTERM\"];\n\t\tif (process.platform !== \"win32\") {\n\t\t\tsignals.push(\"SIGHUP\");\n\t\t}\n\n\t\tfor (const signal of signals) {\n\t\t\tconst handler = () => {\n\t\t\t\tkillTrackedDetachedChildren();\n\t\t\t\tvoid shutdown(signal === \"SIGHUP\" ? 129 : 143, signal);\n\t\t\t};\n\t\t\tprocess.on(signal, handler);\n\t\t\tsignalCleanupHandlers.push(() => process.off(signal, handler));\n\t\t}\n\t};\n\n\tregisterSignalHandlers();\n\n\tlet detachInput = () => {};\n\n\tasync function shutdown(exitCode = 0, signal?: NodeJS.Signals): Promise<never> {\n\t\tif (shuttingDown) {\n\t\t\tprocess.exit(exitCode);\n\t\t}\n\t\tshuttingDown = true;\n\t\tfor (const cleanup of signalCleanupHandlers) {\n\t\t\tcleanup();\n\t\t}\n\t\tawait handler.dispose();\n\t\tdetachInput();\n\t\tprocess.stdin.pause();\n\t\tif (signal !== \"SIGTERM\") {\n\t\t\tawait flushRawStdout();\n\t\t}\n\t\tprocess.exit(exitCode);\n\t}\n\n\tconst handleInputLine = async (line: string): Promise<void> => {\n\t\tawait handler.handleInputLine(line);\n\t\tif (handler.isShutdownRequested()) {\n\t\t\tawait shutdown();\n\t\t}\n\t};\n\n\tconst onInputEnd = () => {\n\t\tvoid shutdown();\n\t};\n\tprocess.stdin.on(\"end\", onInputEnd);\n\n\tdetachInput = (() => {\n\t\tconst detachJsonl = attachJsonlLineReader(\n\t\t\tprocess.stdin,\n\t\t\t(line) => {\n\t\t\t\tvoid handleInputLine(line);\n\t\t\t},\n\t\t\t{\n\t\t\t\tmaxLineLength: MAX_RPC_LINE_CHARACTERS,\n\t\t\t\tonOversizedLine: () => {\n\t\t\t\t\twriteRawStdout(\n\t\t\t\t\t\tserializeJsonLine({\n\t\t\t\t\t\t\ttype: \"response\",\n\t\t\t\t\t\t\tcommand: \"parse\",\n\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\terror: `RPC input line exceeds ${MAX_RPC_LINE_CHARACTERS} characters.`,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tvoid waitForRawStdoutBackpressure();\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\treturn () => {\n\t\t\tdetachJsonl();\n\t\t\tprocess.stdin.off(\"end\", onInputEnd);\n\t\t};\n\t})();\n\n\t// Keep process alive forever\n\treturn new Promise(() => {});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"rpc-mode.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-mode.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RPC mode: Headless operation with JSON stdin/stdout protocol.\n *\n * Used for embedding the agent in other applications.\n * Receives commands as JSON on stdin, outputs events and responses as JSON on stdout.\n *\n * Protocol:\n * - Commands: JSON objects with `type` field, optional `id` for correlation\n * - Responses: JSON objects with `type: \"response\"`, `command`, `success`, and optional `data`/`error`\n * - Events: AgentSessionEvent objects streamed as they occur\n * - Extension UI: Extension UI requests are emitted, client responds with extension_ui_response\n *\n * This is the single-connection stdio host. The RPC command loop, extension-UI\n * bridge, and event subscription live in `connection-handler.ts` so the same\n * logic can also serve a caller-owned RPC transport. This file owns exactly the\n * process-level concerns that a per-connection handler must NOT\n * touch: stdout takeover, stdin wiring, signal handlers, and process exit.\n *\n * ── Multi-session mode (`--multi-session`) ─────────────────────────────────\n *\n * Startup: `senpi --mode rpc --multi-session` → NO default session is constructed\n * (no default `AgentSessionRuntime`, no default extension/watcher load). Classic\n * `senpi --mode rpc` is byte-identical to today. Mode is fixed at process start;\n * there is no runtime transition.\n *\n * D1 normative table (multi-session mode):\n *\n * | Command | Params | Success data | Notes |\n * | ---------------- | ----------------------------------------------------------------------------------------------- | ----------------------------------------------- | ----- |\n * | `get_protocol_info` | - | `{ protocolVersion: 1, serverVersion, capabilities, mode: \"classic\"|\"multi\" }` | Answered in BOTH modes; side-effect-free capability probe. |\n * | `open_session` | `sessionPath?`, `cwd?`, `provider?`, `modelId?`, `thinkingLevel?`, `permissionPreset?` (all optional; paths MUST be absolute) | `{ sessionId, state: RpcSessionState, attached?: boolean }` | `sessionPath` = today's `--session` semantics (open-if-exists else create persisting there); `provider`/`modelId` applied only on create (resume restores the session's model); params form the immutable launch profile (D8). |\n * | `close_session` | `sessionId` | `{}` | Aborts active work and awaits teardown for the host grace window, then force-releases; the first closer's response is the LAST record tagged with that handle, while concurrent closes join and receive targeted success responses. |\n * | `list_sessions` | - | `{ sessions: [{ sessionId, durableSessionId, sessionPath, cwd, name, status }] }` | Includes `opening`/`closing` entries with their status. |\n * | `get_steering_messages` / `get_follow_up_messages` / `clear_queue` | queue read or clear parameters | host-authoritative queue values | Interactive attach clients must not read bootstrap queues. |\n * | `abort_branch_summary` / `record_bash_result` / `set_label` | narrow mutation payloads | `{}` | Routes interactive runtime mutations to the owning host session. |\n * | every existing command | + `sessionId` (REQUIRED in multi mode) | unchanged | Routed to that session. |\n *\n * Identities (D6): response-level `sessionId` = opaque routing handle, unique per\n * process epoch, ephemeral (dies with the child). `state.sessionId` = durable\n * JSONL session identity (what a resume cursor stores today). `list_sessions`\n * exposes both. Clients store both, discard routing handles on child exit, verify\n * only durable ids against cursors.\n *\n * Stable error codes (in the response `error` field, machine-matchable):\n * `unknown_session`, `session_closing`, `session_path_in_use`, `missing_session_id`\n * (session-scoped command without `sessionId` in multi mode), `multi_session_disabled`\n * (`open_session` in classic mode), `invalid_path` (relative `sessionPath`/`cwd`),\n * `open_failed: <detail>`.\n *\n * Tagging: every response/event/`extension_ui_request` belonging to a session\n * carries top-level `sessionId` (routing handle). `get_protocol_info`/\n * `list_sessions` responses are untagged. Classic mode: nothing tagged\n * (byte-identical).\n *\n * Ordering guarantee (D9): strict FIFO per session; one total stdout order;\n * cross-session order unspecified; fair round-robin between sessions' queued\n * complete records; NO cross-session batch coalescing (per-session event buffers;\n * the process-wide single-array coalescer in `event-output-buffer.ts` must not\n * merge records of different sessions into one write). Starvation freedom is NOT\n * promised (single pipe); a giant tool record delays others — bounded only by\n * record completion.\n *\n * Duplicate/idempotency: duplicate `open_session` while a path reservation is\n * held → `session_path_in_use`. `close_session` on unknown/already-closed →\n * `unknown_session` error. Request `id`s are client-owned; the server echoes them\n * without dedup.\n *\n * Full prose docs: `packages/coding-agent/docs/rpc.md` (Multi-session mode).\n */\n\nimport type { AgentSessionEvent } from \"../../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport { envValue } from \"../../core/brand.ts\";\nimport {\n\tflushRawStdout,\n\ttakeOverStdout,\n\twaitForRawStdoutBackpressure,\n\twriteRawStdout,\n} from \"../../core/output-guard.ts\";\nimport { killTrackedDetachedChildren } from \"../../utils/shell.ts\";\nimport { toJsonEvent } from \"../json-event.ts\";\nimport { createRpcConnectionHandler, type RpcConnectionSink } from \"./connection-handler.ts\";\nimport { parseClientCapabilities } from \"./custom-capability.ts\";\nimport { attachJsonlLineReader, MAX_RPC_LINE_CHARACTERS, serializeJsonLine } from \"./jsonl.ts\";\n\n// Re-export types for consumers\nexport type {\n\tRpcCommand,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcResponse,\n\tRpcSessionState,\n} from \"./rpc-types.ts\";\n\n/**\n * Run in RPC mode.\n * Listens for JSON commands on stdin, outputs events and responses on stdout.\n */\nexport async function runRpcMode(runtimeHost: AgentSessionRuntime): Promise<never> {\n\ttakeOverStdout();\n\n\tconst sink: RpcConnectionSink = {\n\t\twriteRaw: (chunk) => {\n\t\t\tconst linearized = chunk\n\t\t\t\t.split(\"\\n\")\n\t\t\t\t.filter((line) => line.length > 0)\n\t\t\t\t.map((line) => {\n\t\t\t\t\tconst value = JSON.parse(line) as { type?: string };\n\t\t\t\t\treturn JSON.stringify(value.type === \"message_update\" ? toJsonEvent(value as AgentSessionEvent) : value);\n\t\t\t\t})\n\t\t\t\t.join(\"\\n\");\n\t\t\twriteRawStdout(linearized.length > 0 ? `${linearized}\\n` : \"\");\n\t\t},\n\t\twaitForBackpressure: waitForRawStdoutBackpressure,\n\t};\n\n\t// Client capability flags reach this single-connection stdio host via the\n\t// SENPI_RPC_CLIENT_CAPABILITIES env var (comma-separated). A launcher can set\n\t// it from a client handshake; a plain stdio client that sets nothing gets\n\t// byte-identical default behavior.\n\tconst capabilities = parseClientCapabilities(envValue(\"RPC_CLIENT_CAPABILITIES\"));\n\tconst handler = createRpcConnectionHandler(runtimeHost, sink, { capabilities });\n\n\tlet shuttingDown = false;\n\tconst signalCleanupHandlers: Array<() => void> = [];\n\n\tconst registerSignalHandlers = (): void => {\n\t\tconst signals: NodeJS.Signals[] = [\"SIGTERM\"];\n\t\tif (process.platform !== \"win32\") {\n\t\t\tsignals.push(\"SIGHUP\");\n\t\t}\n\n\t\tfor (const signal of signals) {\n\t\t\tconst handler = () => {\n\t\t\t\tkillTrackedDetachedChildren();\n\t\t\t\tvoid shutdown(signal === \"SIGHUP\" ? 129 : 143, signal);\n\t\t\t};\n\t\t\tprocess.on(signal, handler);\n\t\t\tsignalCleanupHandlers.push(() => process.off(signal, handler));\n\t\t}\n\t};\n\n\tregisterSignalHandlers();\n\n\tlet detachInput = () => {};\n\n\tasync function shutdown(exitCode = 0, signal?: NodeJS.Signals): Promise<never> {\n\t\tif (shuttingDown) {\n\t\t\tprocess.exit(exitCode);\n\t\t}\n\t\tshuttingDown = true;\n\t\tfor (const cleanup of signalCleanupHandlers) {\n\t\t\tcleanup();\n\t\t}\n\t\tawait handler.dispose();\n\t\tdetachInput();\n\t\tprocess.stdin.pause();\n\t\tif (signal !== \"SIGTERM\") {\n\t\t\tawait flushRawStdout();\n\t\t}\n\t\tprocess.exit(exitCode);\n\t}\n\n\tconst handleInputLine = async (line: string): Promise<void> => {\n\t\tawait handler.handleInputLine(line);\n\t\tif (handler.isShutdownRequested()) {\n\t\t\tawait shutdown();\n\t\t}\n\t};\n\n\tconst onInputEnd = () => {\n\t\tvoid shutdown();\n\t};\n\tprocess.stdin.on(\"end\", onInputEnd);\n\n\tdetachInput = (() => {\n\t\tconst detachJsonl = attachJsonlLineReader(\n\t\t\tprocess.stdin,\n\t\t\t(line) => {\n\t\t\t\tvoid handleInputLine(line);\n\t\t\t},\n\t\t\t{\n\t\t\t\tmaxLineLength: MAX_RPC_LINE_CHARACTERS,\n\t\t\t\tonOversizedLine: () => {\n\t\t\t\t\twriteRawStdout(\n\t\t\t\t\t\tserializeJsonLine({\n\t\t\t\t\t\t\ttype: \"response\",\n\t\t\t\t\t\t\tcommand: \"parse\",\n\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\terror: `RPC input line exceeds ${MAX_RPC_LINE_CHARACTERS} characters.`,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tvoid waitForRawStdoutBackpressure();\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\treturn () => {\n\t\t\tdetachJsonl();\n\t\t\tprocess.stdin.off(\"end\", onInputEnd);\n\t\t};\n\t})();\n\n\t// Keep process alive forever\n\treturn new Promise(() => {});\n}\n"]}
|
|
@@ -41,6 +41,7 @@ export declare class SessionCommandRouter {
|
|
|
41
41
|
private readonly connectionOptions;
|
|
42
42
|
private readonly widths;
|
|
43
43
|
private readonly pendingCapabilities;
|
|
44
|
+
private readonly finalizations;
|
|
44
45
|
private readonly idleNow;
|
|
45
46
|
private readonly idleEvictionMs;
|
|
46
47
|
private readonly emptyExitMs;
|
|
@@ -89,7 +90,28 @@ export declare class SessionCommandRouter {
|
|
|
89
90
|
* and their event stream.
|
|
90
91
|
*/
|
|
91
92
|
private releaseOwnedSession;
|
|
93
|
+
/**
|
|
94
|
+
* Releases one attachment (or every attachment when draining) and reports
|
|
95
|
+
* whether this caller became the finalizer. The join token is installed inside
|
|
96
|
+
* the registry callback, before any await, so a close that lands between the
|
|
97
|
+
* claim and finalizeClose() always finds a token to wait on instead of
|
|
98
|
+
* answering ahead of the terminal records.
|
|
99
|
+
*/
|
|
100
|
+
private claimClose;
|
|
101
|
+
/** claimClose() for lifecycle paths that treat a lost race as "nothing to do". */
|
|
102
|
+
private tryClaimClose;
|
|
92
103
|
private close;
|
|
104
|
+
/** Detaches the closing connection's UI/width state; a rerender failure must not abort the close. */
|
|
105
|
+
private releaseOwnerAttachment;
|
|
106
|
+
/**
|
|
107
|
+
* Runs the finalizer side of a close for a handle whose beginClose() made this
|
|
108
|
+
* caller the owner: dispose the binding, complete the registry teardown, emit
|
|
109
|
+
* the terminal records, then release joiners. Every step is guarded so the join
|
|
110
|
+
* token always resolves and a failing binding yields one logged line, never a
|
|
111
|
+
* second response or an escaped rejection.
|
|
112
|
+
*/
|
|
113
|
+
private finalizeClose;
|
|
114
|
+
private createFinalization;
|
|
93
115
|
private code;
|
|
94
116
|
}
|
|
95
117
|
//# sourceMappingURL=session-command-router.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-command-router.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/session-command-router.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAO9D,OAAO,EAAE,uBAAuB,EAA0B,MAAM,sBAAsB,CAAC;AACvF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"session-command-router.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/session-command-router.ts"],"names":[],"mappings":"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"}
|