@yefengr/remote-pi 0.7.16 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +44 -95
  2. package/dist/actions/handlers.js +1 -1
  3. package/dist/actions/handlers.js.map +1 -1
  4. package/dist/actions/registry.d.ts +1 -1
  5. package/dist/actions/registry.js +1 -1
  6. package/dist/{daemon/commands.d.ts → commands.d.ts} +3 -4
  7. package/dist/{daemon/commands.js → commands.js} +8 -151
  8. package/dist/commands.js.map +1 -0
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.js +20 -38
  11. package/dist/index.js.map +1 -1
  12. package/dist/pairing/storage.js +4 -4
  13. package/dist/pairing/storage.js.map +1 -1
  14. package/dist/protocol/v2/schemas.d.ts +4 -4
  15. package/dist/session/local_config.d.ts +0 -5
  16. package/dist/session/local_config.js +6 -29
  17. package/dist/session/local_config.js.map +1 -1
  18. package/dist/transport/relay_client.js.map +1 -1
  19. package/package.json +1 -8
  20. package/dist/bin/supervisord.d.ts +0 -2
  21. package/dist/bin/supervisord.js +0 -78
  22. package/dist/bin/supervisord.js.map +0 -1
  23. package/dist/daemon/cli-links.d.ts +0 -30
  24. package/dist/daemon/cli-links.js +0 -134
  25. package/dist/daemon/cli-links.js.map +0 -1
  26. package/dist/daemon/client.d.ts +0 -20
  27. package/dist/daemon/client.js +0 -131
  28. package/dist/daemon/client.js.map +0 -1
  29. package/dist/daemon/commands.js.map +0 -1
  30. package/dist/daemon/control_protocol.d.ts +0 -198
  31. package/dist/daemon/control_protocol.js +0 -40
  32. package/dist/daemon/control_protocol.js.map +0 -1
  33. package/dist/daemon/cron_log.d.ts +0 -24
  34. package/dist/daemon/cron_log.js +0 -57
  35. package/dist/daemon/cron_log.js.map +0 -1
  36. package/dist/daemon/cron_registry.d.ts +0 -43
  37. package/dist/daemon/cron_registry.js +0 -149
  38. package/dist/daemon/cron_registry.js.map +0 -1
  39. package/dist/daemon/install-runtime.d.ts +0 -10
  40. package/dist/daemon/install-runtime.js +0 -81
  41. package/dist/daemon/install-runtime.js.map +0 -1
  42. package/dist/daemon/install.d.ts +0 -110
  43. package/dist/daemon/install.js +0 -263
  44. package/dist/daemon/install.js.map +0 -1
  45. package/dist/daemon/registry.d.ts +0 -51
  46. package/dist/daemon/registry.js +0 -207
  47. package/dist/daemon/registry.js.map +0 -1
  48. package/dist/daemon/rpc_child.d.ts +0 -135
  49. package/dist/daemon/rpc_child.js +0 -472
  50. package/dist/daemon/rpc_child.js.map +0 -1
  51. package/dist/daemon/status.d.ts +0 -45
  52. package/dist/daemon/status.js +0 -87
  53. package/dist/daemon/status.js.map +0 -1
  54. package/dist/daemon/supervisor-ipc.d.ts +0 -2
  55. package/dist/daemon/supervisor-ipc.js +0 -20
  56. package/dist/daemon/supervisor-ipc.js.map +0 -1
  57. package/dist/daemon/supervisor.d.ts +0 -70
  58. package/dist/daemon/supervisor.js +0 -637
  59. package/dist/daemon/supervisor.js.map +0 -1
  60. package/dist/session/ipc.d.ts +0 -6
  61. package/dist/session/ipc.js +0 -15
  62. package/dist/session/ipc.js.map +0 -1
  63. package/docs/daemon.md +0 -175
  64. package/service-templates/launchd.plist.template +0 -35
  65. package/service-templates/systemd.service.template +0 -19
  66. package/service-templates/task-launcher.vbs.template +0 -10
  67. package/service-templates/task-scheduler.xml.template +0 -38
@@ -1,135 +0,0 @@
1
- import { EventEmitter } from "node:events";
2
- import type { DaemonState, ProcessState, RelayState, RuntimeState } from "./control_protocol.js";
3
- import { type LocalConfig } from "../session/local_config.js";
4
- /** RPC child wrapper. PID creation is not readiness: only structured stdout
5
- * responses/events can move runtime from pending to ready. */
6
- export interface RpcChildOptions {
7
- piBin?: string;
8
- cwd: string;
9
- /** Stable daemon endpoint identity supplied by the supervisor. */
10
- endpointId?: string;
11
- env?: NodeJS.ProcessEnv;
12
- config?: LocalConfig;
13
- readinessTimeoutMs?: number;
14
- promptTimeoutMs?: number;
15
- }
16
- export interface RpcChildExitEvent {
17
- code: number | null;
18
- signal: NodeJS.Signals | null;
19
- /** True for every exit not initiated through stop(), including code 0. */
20
- isCrash: boolean;
21
- }
22
- export interface PromptAcceptance {
23
- accepted: boolean;
24
- code?: string;
25
- error?: string;
26
- }
27
- export interface RuntimeReadyEvent {
28
- control_protocol_version?: number;
29
- extension_version?: string;
30
- endpoint_id?: string;
31
- runtime_instance_id?: string;
32
- session_id?: string;
33
- }
34
- export interface RuntimeFailedEvent {
35
- stage?: string;
36
- code: string;
37
- message?: string;
38
- retryable: boolean;
39
- }
40
- export interface RelayStateChangedEvent {
41
- state: RelayState;
42
- }
43
- export interface SessionChangedEvent {
44
- session_id?: string;
45
- }
46
- export declare const RPC_CONTROL_STATUS_KEY = "remote-pi:control";
47
- export declare const DEFAULT_READINESS_TIMEOUT_MS = 10000;
48
- export declare const DEFAULT_PROMPT_TIMEOUT_MS = 5000;
49
- export declare function resolvePiBin(piBin: string, plat?: NodeJS.Platform): string;
50
- export interface PiSpawnTarget {
51
- command: string;
52
- prefixArgs: string[];
53
- }
54
- export declare function resolvePiSpawn(piBin: string, plat?: NodeJS.Platform, nodeExe?: string): PiSpawnTarget;
55
- export declare function _npmShimTarget(cmdPath: string): string | null;
56
- export declare function busyTransition(line: string): boolean | null;
57
- /**
58
- * The installed Pi RPC starts configured extensions itself. In particular this
59
- * must not attach Remote Pi with `-e`, which could load it a second time.
60
- */
61
- export declare function rpcSpawnArgs(sessionName?: string): string[];
62
- type ParsedRuntimeEvent = {
63
- type: "runtime_ready";
64
- event: RuntimeReadyEvent;
65
- } | {
66
- type: "runtime_failed";
67
- event: RuntimeFailedEvent;
68
- } | {
69
- type: "relay_state_changed";
70
- event: RelayStateChangedEvent;
71
- } | {
72
- type: "session_changed";
73
- event: SessionChangedEvent;
74
- };
75
- /**
76
- * Parses direct daemon-control events and the current extension's custom
77
- * relay-state message shape. Natural-language stderr is intentionally absent.
78
- */
79
- export declare function parseRuntimeEvent(line: string): ParsedRuntimeEvent | null;
80
- export declare class RpcChild extends EventEmitter {
81
- private readonly opts;
82
- private child;
83
- private _state;
84
- private _process;
85
- private _runtime;
86
- private _relay;
87
- private _startedAt;
88
- private _runtimeInstanceId;
89
- private _sessionId;
90
- private _restartCount;
91
- private _stopping;
92
- private stdoutBuf;
93
- private _busy;
94
- private rpcReady;
95
- private extensionReady;
96
- private extensionReadyEvent;
97
- private readinessTimer;
98
- private readyPromise;
99
- private readyResolve;
100
- private readonly statePending;
101
- private readonly promptPending;
102
- constructor(opts: RpcChildOptions);
103
- get state(): DaemonState;
104
- get processState(): ProcessState;
105
- get runtimeState(): RuntimeState;
106
- get relayState(): RelayState;
107
- get isBusy(): boolean;
108
- get pid(): number | undefined;
109
- get restartCount(): number;
110
- get startedAt(): number | undefined;
111
- get runtimeInstanceId(): string | undefined;
112
- get sessionId(): string | undefined;
113
- get uptimeMs(): number | undefined;
114
- /** Resolves true only after the readiness probe/event, false on timeout/exit. */
115
- ready(): Promise<boolean>;
116
- spawn(): void;
117
- /** Waits for Pi's correlated prompt acceptance response, not merely stdin write. */
118
- sendPrompt(text: string, requestId?: string, timeoutMs?: number): Promise<PromptAcceptance>;
119
- stop(timeoutMs?: number): Promise<void>;
120
- refreshBusy(timeoutMs?: number): Promise<boolean>;
121
- /** Test injection point for deterministic RPC event/response coverage. */
122
- _ingestStdoutForTest(line: string): void;
123
- private startReadinessProbe;
124
- private onStdout;
125
- private handleStdoutLine;
126
- private parseResponse;
127
- private handleResponse;
128
- private handleRuntimeEvent;
129
- private acceptExtensionReady;
130
- private maybeMarkReady;
131
- private failRuntime;
132
- private onExit;
133
- noteRestart(): void;
134
- }
135
- export {};
@@ -1,472 +0,0 @@
1
- import { execFileSync, spawn } from "node:child_process";
2
- import { randomUUID } from "node:crypto";
3
- import { EventEmitter } from "node:events";
4
- import { existsSync, readFileSync } from "node:fs";
5
- import { dirname, join } from "node:path";
6
- import { defaultAgentName, loadLocalConfig } from "../session/local_config.js";
7
- export const RPC_CONTROL_STATUS_KEY = "remote-pi:control";
8
- export const DEFAULT_READINESS_TIMEOUT_MS = 10_000;
9
- export const DEFAULT_PROMPT_TIMEOUT_MS = 5_000;
10
- const WIN_EXECUTABLE_EXTS = [".exe", ".cmd", ".bat", ".com"];
11
- export function resolvePiBin(piBin, plat = process.platform) {
12
- if (plat !== "win32")
13
- return piBin;
14
- if (piBin.includes("\\") || piBin.includes("/") || /\.[a-z0-9]+$/i.test(piBin))
15
- return piBin;
16
- try {
17
- const out = execFileSync("where", [piBin], { encoding: "utf8" });
18
- const lines = out.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
19
- return lines.find((line) => WIN_EXECUTABLE_EXTS.some((ext) => line.toLowerCase().endsWith(ext))) ?? lines[0] ?? piBin;
20
- }
21
- catch {
22
- return piBin;
23
- }
24
- }
25
- export function resolvePiSpawn(piBin, plat = process.platform, nodeExe = process.execPath) {
26
- const resolved = resolvePiBin(piBin, plat);
27
- if (plat !== "win32")
28
- return { command: resolved, prefixArgs: [] };
29
- if (/\.(cmd|bat)$/i.test(resolved)) {
30
- const target = _npmShimTarget(resolved);
31
- if (target)
32
- return { command: nodeExe, prefixArgs: [target] };
33
- }
34
- return { command: resolved, prefixArgs: [] };
35
- }
36
- export function _npmShimTarget(cmdPath) {
37
- let content;
38
- try {
39
- content = readFileSync(cmdPath, "utf8");
40
- }
41
- catch {
42
- return null;
43
- }
44
- const match = content.match(/"%dp0%\\([^\"]+\.[cm]?js)"/i);
45
- if (!match)
46
- return null;
47
- const target = join(dirname(cmdPath), match[1]);
48
- return existsSync(target) ? target : null;
49
- }
50
- export function busyTransition(line) {
51
- let value;
52
- try {
53
- value = JSON.parse(line);
54
- }
55
- catch {
56
- return null;
57
- }
58
- const type = value?.type;
59
- if (type === "message_start")
60
- return true;
61
- if (type === "message_end")
62
- return false;
63
- return null;
64
- }
65
- /**
66
- * The installed Pi RPC starts configured extensions itself. In particular this
67
- * must not attach Remote Pi with `-e`, which could load it a second time.
68
- */
69
- export function rpcSpawnArgs(sessionName) {
70
- return [
71
- "--mode", "rpc",
72
- "--approve",
73
- "--continue",
74
- ...(sessionName ? ["--name", sessionName] : []),
75
- ];
76
- }
77
- /**
78
- * Parses direct daemon-control events and the current extension's custom
79
- * relay-state message shape. Natural-language stderr is intentionally absent.
80
- */
81
- export function parseRuntimeEvent(line) {
82
- let raw;
83
- try {
84
- raw = JSON.parse(line);
85
- }
86
- catch {
87
- return null;
88
- }
89
- if (!raw || typeof raw !== "object" || Array.isArray(raw))
90
- return null;
91
- let obj = raw;
92
- if (obj["type"] === "extension_ui_request" && obj["method"] === "setStatus" && obj["statusKey"] === RPC_CONTROL_STATUS_KEY) {
93
- if (typeof obj["statusText"] !== "string")
94
- return null;
95
- try {
96
- raw = JSON.parse(obj["statusText"]);
97
- }
98
- catch {
99
- return null;
100
- }
101
- if (!raw || typeof raw !== "object" || Array.isArray(raw))
102
- return null;
103
- obj = raw;
104
- }
105
- let type = obj["type"];
106
- let payload = obj;
107
- const messageContainer = type === "message_start" || type === "message_end" ? obj["message"] : undefined;
108
- const customContainer = type === "entry_appended" ? obj["entry"] : messageContainer;
109
- if (customContainer && typeof customContainer === "object" && !Array.isArray(customContainer)) {
110
- const custom = customContainer;
111
- const customType = custom["customType"];
112
- const details = custom["details"];
113
- if (typeof customType === "string" && details && typeof details === "object" && !Array.isArray(details)) {
114
- type = customType.replace(/^remote-pi:/, "").replace(/-/g, "_");
115
- payload = details;
116
- }
117
- }
118
- if (type === "runtime_ready") {
119
- return {
120
- type,
121
- event: {
122
- control_protocol_version: typeof payload["control_protocol_version"] === "number" ? payload["control_protocol_version"] : undefined,
123
- extension_version: typeof payload["extension_version"] === "string" ? payload["extension_version"] : undefined,
124
- endpoint_id: typeof payload["endpoint_id"] === "string" ? payload["endpoint_id"] : undefined,
125
- runtime_instance_id: typeof payload["runtime_instance_id"] === "string" ? payload["runtime_instance_id"] : undefined,
126
- session_id: typeof payload["session_id"] === "string" ? payload["session_id"] : undefined,
127
- },
128
- };
129
- }
130
- if (type === "runtime_failed") {
131
- if (typeof payload["code"] !== "string" || typeof payload["retryable"] !== "boolean")
132
- return null;
133
- return { type, event: {
134
- stage: typeof payload["stage"] === "string" ? payload["stage"] : undefined,
135
- code: payload["code"],
136
- message: typeof payload["message"] === "string" ? payload["message"] : undefined,
137
- retryable: payload["retryable"],
138
- } };
139
- }
140
- if (type === "relay_state_changed" || type === "relay_state") {
141
- const state = payload["state"] ?? payload["status"];
142
- if (state === "disconnected" || state === "connecting" || state === "connected" || state === "reconnecting") {
143
- return { type: "relay_state_changed", event: { state } };
144
- }
145
- }
146
- if (type === "session_changed") {
147
- return { type, event: { session_id: typeof payload["session_id"] === "string" ? payload["session_id"] : undefined } };
148
- }
149
- return null;
150
- }
151
- export class RpcChild extends EventEmitter {
152
- opts;
153
- child = null;
154
- _state = "stopped";
155
- _process = "absent";
156
- _runtime = "pending";
157
- _relay = "disconnected";
158
- _startedAt;
159
- _runtimeInstanceId;
160
- _sessionId;
161
- _restartCount = 0;
162
- _stopping = false;
163
- stdoutBuf = "";
164
- _busy = false;
165
- rpcReady = false;
166
- extensionReady = false;
167
- extensionReadyEvent = null;
168
- readinessTimer = null;
169
- readyPromise = Promise.resolve(false);
170
- readyResolve = null;
171
- statePending = new Map();
172
- promptPending = new Map();
173
- constructor(opts) {
174
- super();
175
- this.opts = opts;
176
- }
177
- get state() { return this._state; }
178
- get processState() { return this._process; }
179
- get runtimeState() { return this._runtime; }
180
- get relayState() { return this._relay; }
181
- get isBusy() { return this._busy; }
182
- get pid() { return this.child?.pid; }
183
- get restartCount() { return this._restartCount; }
184
- get startedAt() { return this._startedAt; }
185
- get runtimeInstanceId() { return this._runtimeInstanceId; }
186
- get sessionId() { return this._sessionId; }
187
- get uptimeMs() { return this._startedAt === undefined ? undefined : Date.now() - this._startedAt; }
188
- /** Resolves true only after the readiness probe/event, false on timeout/exit. */
189
- ready() { return this.readyPromise; }
190
- spawn() {
191
- if (this.child)
192
- return;
193
- this._stopping = false;
194
- this._busy = false;
195
- this._state = "starting";
196
- this._process = "spawning";
197
- this._runtime = "pending";
198
- this._relay = "connecting";
199
- this._sessionId = undefined;
200
- this.rpcReady = false;
201
- this.extensionReady = false;
202
- this.extensionReadyEvent = null;
203
- this._runtimeInstanceId = randomUUID();
204
- this.readyPromise = new Promise((resolve) => { this.readyResolve = resolve; });
205
- const target = resolvePiSpawn(this.opts.piBin ?? "pi");
206
- const config = this.opts.config ?? loadLocalConfig(this.opts.cwd);
207
- const sessionName = config.agent_name ?? defaultAgentName(this.opts.cwd);
208
- const args = [...target.prefixArgs, ...rpcSpawnArgs(sessionName)];
209
- const env = {
210
- ...process.env,
211
- ...this.opts.env,
212
- REMOTE_PI_DAEMON: "1",
213
- REMOTE_PI_ENDPOINT_ID: this.opts.endpointId ?? "",
214
- REMOTE_PI_RUNTIME_INSTANCE_ID: this._runtimeInstanceId,
215
- ...(this.opts.config ? { REMOTE_PI_DIRECT_CONFIG: JSON.stringify(this.opts.config) } : {}),
216
- };
217
- const child = spawn(target.command, args, { cwd: this.opts.cwd, env, stdio: ["pipe", "pipe", "pipe"], windowsHide: process.platform === "win32" });
218
- this.child = child;
219
- this._startedAt = Date.now();
220
- // A spawned ChildProcess object is not evidence its executable completed
221
- // startup. Preserve `spawning` until Node reports the OS spawn event.
222
- child.once("spawn", () => {
223
- if (this.child === child && this._process === "spawning")
224
- this._process = "running";
225
- });
226
- child.stdout?.on("data", (chunk) => this.onStdout(chunk));
227
- child.stderr?.on("data", (chunk) => process.stderr.write(`[${this.opts.cwd}] ${chunk.toString()}`));
228
- child.on("exit", (code, signal) => this.onExit(code, signal));
229
- child.on("error", (error) => {
230
- this.failRuntime({ stage: "spawn", code: "spawn_failed", message: String(error), retryable: true });
231
- this._process = "exited";
232
- });
233
- this.startReadinessProbe();
234
- this.emit("spawn", { pid: child.pid, runtime_instance_id: this._runtimeInstanceId });
235
- }
236
- /** Waits for Pi's correlated prompt acceptance response, not merely stdin write. */
237
- sendPrompt(text, requestId = `sv-${randomUUID()}`, timeoutMs = this.opts.promptTimeoutMs ?? DEFAULT_PROMPT_TIMEOUT_MS) {
238
- if (!this.child?.stdin || this._process !== "running" || this._runtime !== "ready") {
239
- return Promise.resolve({ accepted: false, code: "runtime_not_ready", error: "daemon RPC runtime is not ready" });
240
- }
241
- return new Promise((resolve) => {
242
- const timer = setTimeout(() => {
243
- this.promptPending.delete(requestId);
244
- resolve({ accepted: false, code: "prompt_response_timeout", error: "Pi did not accept the prompt before timeout" });
245
- }, timeoutMs);
246
- this.promptPending.set(requestId, { resolve, timer });
247
- try {
248
- this.child.stdin.write(JSON.stringify({ id: requestId, type: "prompt", message: text }) + "\n");
249
- }
250
- catch (error) {
251
- clearTimeout(timer);
252
- this.promptPending.delete(requestId);
253
- resolve({ accepted: false, code: "stdin_write_failed", error: String(error) });
254
- }
255
- });
256
- }
257
- async stop(timeoutMs = 5_000) {
258
- if (!this.child)
259
- return;
260
- this._stopping = true;
261
- const child = this.child;
262
- await new Promise((resolve) => {
263
- this.once("exit", resolve);
264
- try {
265
- child.kill("SIGTERM");
266
- }
267
- catch {
268
- resolve();
269
- }
270
- const timer = setTimeout(() => { try {
271
- child.kill("SIGKILL");
272
- }
273
- catch { /* process already gone */ } }, timeoutMs);
274
- this.once("exit", () => clearTimeout(timer));
275
- });
276
- }
277
- async refreshBusy(timeoutMs = 1_500) {
278
- if (this._process !== "running" || !this.child?.stdin)
279
- return this._busy;
280
- const id = `gs-${randomUUID()}`;
281
- return new Promise((resolve) => {
282
- const timer = setTimeout(() => { this.statePending.delete(id); resolve(this._busy); }, timeoutMs);
283
- this.statePending.set(id, { resolve, timer });
284
- try {
285
- this.child.stdin.write(JSON.stringify({ id, type: "get_state" }) + "\n");
286
- }
287
- catch {
288
- clearTimeout(timer);
289
- this.statePending.delete(id);
290
- resolve(this._busy);
291
- }
292
- });
293
- }
294
- /** Test injection point for deterministic RPC event/response coverage. */
295
- _ingestStdoutForTest(line) { this.handleStdoutLine(line); }
296
- startReadinessProbe() {
297
- const timeoutMs = this.opts.readinessTimeoutMs ?? DEFAULT_READINESS_TIMEOUT_MS;
298
- this.readinessTimer = setTimeout(() => {
299
- if (this.rpcReady && !this.extensionReady) {
300
- this.failRuntime({ stage: "extension", code: "extension_not_ready", message: "Pi RPC is ready but the configured Remote Pi extension did not report readiness", retryable: false });
301
- return;
302
- }
303
- this.failRuntime({ stage: "rpc_probe", code: "readiness_timeout", message: "Pi RPC get_state did not respond before timeout", retryable: true });
304
- }, timeoutMs);
305
- const id = `ready-${randomUUID()}`;
306
- try {
307
- this.child?.stdin?.write(JSON.stringify({ id, type: "get_state" }) + "\n");
308
- }
309
- catch (error) {
310
- this.failRuntime({ stage: "rpc_probe", code: "readiness_probe_write_failed", message: String(error), retryable: true });
311
- }
312
- }
313
- onStdout(chunk) {
314
- this.stdoutBuf += chunk.toString();
315
- let newline;
316
- while ((newline = this.stdoutBuf.indexOf("\n")) >= 0) {
317
- const line = this.stdoutBuf.slice(0, newline);
318
- this.stdoutBuf = this.stdoutBuf.slice(newline + 1);
319
- if (line.trim())
320
- this.handleStdoutLine(line);
321
- }
322
- }
323
- handleStdoutLine(line) {
324
- const busy = busyTransition(line);
325
- if (busy !== null)
326
- this._busy = busy;
327
- const response = this.parseResponse(line);
328
- if (response)
329
- this.handleResponse(response);
330
- const event = parseRuntimeEvent(line);
331
- if (event)
332
- this.handleRuntimeEvent(event);
333
- this.emit("stdout", line);
334
- }
335
- parseResponse(line) {
336
- try {
337
- const value = JSON.parse(line);
338
- return value.type === "response" ? value : null;
339
- }
340
- catch {
341
- return null;
342
- }
343
- }
344
- handleResponse(response) {
345
- if (typeof response.id !== "string" || typeof response.command !== "string")
346
- return;
347
- if (response.command === "get_state") {
348
- const pending = this.statePending.get(response.id);
349
- if (pending) {
350
- clearTimeout(pending.timer);
351
- this.statePending.delete(response.id);
352
- const streaming = response.data?.isStreaming;
353
- if (typeof streaming === "boolean")
354
- this._busy = streaming;
355
- pending.resolve(this._busy);
356
- }
357
- if (response.success === true) {
358
- const data = response.data;
359
- this.rpcReady = true;
360
- if (typeof data?.sessionId === "string")
361
- this._sessionId = data.sessionId;
362
- this.maybeMarkReady();
363
- }
364
- else {
365
- this.failRuntime({ stage: "rpc_probe", code: "readiness_probe_rejected", message: typeof response.error === "string" ? response.error : "Pi rejected get_state", retryable: true });
366
- }
367
- return;
368
- }
369
- if (response.command === "prompt") {
370
- const pending = this.promptPending.get(response.id);
371
- if (!pending)
372
- return;
373
- clearTimeout(pending.timer);
374
- this.promptPending.delete(response.id);
375
- pending.resolve(response.success === true
376
- ? { accepted: true }
377
- : { accepted: false, code: "prompt_rejected", error: typeof response.error === "string" ? response.error : "Pi rejected prompt" });
378
- }
379
- }
380
- handleRuntimeEvent(event) {
381
- switch (event.type) {
382
- case "runtime_ready":
383
- this.acceptExtensionReady(event.event);
384
- break;
385
- case "runtime_failed":
386
- this.failRuntime(event.event);
387
- break;
388
- case "relay_state_changed":
389
- this._relay = event.event.state;
390
- this.emit("relay_state_changed", event.event);
391
- break;
392
- case "session_changed":
393
- this._sessionId = event.event.session_id;
394
- this.emit("session_changed", event.event);
395
- break;
396
- }
397
- }
398
- acceptExtensionReady(event) {
399
- if (this._runtime === "failed" || !this.child)
400
- return;
401
- if (event.control_protocol_version !== 2) {
402
- this.failRuntime({ stage: "extension", code: "control_protocol_mismatch", message: "Remote Pi extension control protocol is incompatible", retryable: false });
403
- return;
404
- }
405
- if (event.endpoint_id !== this.opts.endpointId || event.runtime_instance_id !== this._runtimeInstanceId) {
406
- this.failRuntime({ stage: "extension", code: "runtime_identity_mismatch", message: "Remote Pi extension reported a different endpoint runtime identity", retryable: false });
407
- return;
408
- }
409
- this.extensionReady = true;
410
- this.extensionReadyEvent = event;
411
- if (event.session_id)
412
- this._sessionId = event.session_id;
413
- this.maybeMarkReady();
414
- }
415
- maybeMarkReady() {
416
- if (!this.rpcReady || !this.extensionReady || this._runtime === "failed" || !this.child)
417
- return;
418
- this._process = "running";
419
- if (this.readinessTimer) {
420
- clearTimeout(this.readinessTimer);
421
- this.readinessTimer = null;
422
- }
423
- this._runtime = "ready";
424
- this._state = "running";
425
- this.readyResolve?.(true);
426
- this.readyResolve = null;
427
- this.emit("runtime_ready", { ...this.extensionReadyEvent, session_id: this._sessionId, endpoint_id: this.opts.endpointId, runtime_instance_id: this._runtimeInstanceId });
428
- }
429
- failRuntime(event) {
430
- if (this._runtime === "failed")
431
- return;
432
- if (this.readinessTimer) {
433
- clearTimeout(this.readinessTimer);
434
- this.readinessTimer = null;
435
- }
436
- this._runtime = "failed";
437
- this._state = event.retryable ? "crashed" : "blocked";
438
- this.readyResolve?.(false);
439
- this.readyResolve = null;
440
- this.emit("runtime_failed", event);
441
- }
442
- onExit(code, signal) {
443
- if (this.readinessTimer) {
444
- clearTimeout(this.readinessTimer);
445
- this.readinessTimer = null;
446
- }
447
- const isCrash = !this._stopping;
448
- this._process = "exited";
449
- if (this._runtime !== "failed")
450
- this._runtime = "pending";
451
- this._state = isCrash ? "crashed" : "stopped";
452
- this.child = null;
453
- this._startedAt = undefined;
454
- this._busy = false;
455
- this._relay = "disconnected";
456
- this.readyResolve?.(false);
457
- this.readyResolve = null;
458
- for (const pending of this.statePending.values()) {
459
- clearTimeout(pending.timer);
460
- pending.resolve(false);
461
- }
462
- this.statePending.clear();
463
- for (const pending of this.promptPending.values()) {
464
- clearTimeout(pending.timer);
465
- pending.resolve({ accepted: false, code: "child_exited", error: "daemon exited before Pi accepted the prompt" });
466
- }
467
- this.promptPending.clear();
468
- this.emit("exit", { code, signal, isCrash });
469
- }
470
- noteRestart() { this._restartCount += 1; }
471
- }
472
- //# sourceMappingURL=rpc_child.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rpc_child.js","sourceRoot":"","sources":["../../src/daemon/rpc_child.ts"],"names":[],"mappings":"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"}