@victor-software-house/pi-acp 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{auto-spawn-CQ_aaNZA.mjs → client-BjK2BnaD.mjs} +34 -4
- package/dist/client-BjK2BnaD.mjs.map +1 -0
- package/dist/{serve-DmuHYqF-.mjs → daemon-tHPrf3qs.mjs} +801 -26
- package/dist/daemon-tHPrf3qs.mjs.map +1 -0
- package/dist/index.mjs +16 -25
- package/dist/index.mjs.map +1 -1
- package/dist/operator-AtBT_SZT.mjs +52 -0
- package/dist/operator-AtBT_SZT.mjs.map +1 -0
- package/dist/pi-package-DFOfbtij.mjs +3 -0
- package/dist/pi-package-aHs6rWNo.mjs +29 -0
- package/dist/pi-package-aHs6rWNo.mjs.map +1 -0
- package/dist/{socket-BUNWxnAN.mjs → socket-wvV053VI.mjs} +28 -25
- package/dist/socket-wvV053VI.mjs.map +1 -0
- package/package.json +5 -3
- package/dist/auto-spawn-CQ_aaNZA.mjs.map +0 -1
- package/dist/client-P4T6wITz.mjs +0 -35
- package/dist/client-P4T6wITz.mjs.map +0 -1
- package/dist/daemon-D76_nP59.mjs +0 -338
- package/dist/daemon-D76_nP59.mjs.map +0 -1
- package/dist/in-process-Byo-O30j.mjs +0 -31
- package/dist/in-process-Byo-O30j.mjs.map +0 -1
- package/dist/operator-DURoHk8w.mjs +0 -85
- package/dist/operator-DURoHk8w.mjs.map +0 -1
- package/dist/serve-DmuHYqF-.mjs.map +0 -1
- package/dist/socket-BUNWxnAN.mjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
#!/usr/bin/env
|
|
2
|
-
import {
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { o as socketPath } from "./socket-wvV053VI.mjs";
|
|
3
3
|
import { spawn } from "node:child_process";
|
|
4
4
|
import { connect } from "node:net";
|
|
5
5
|
import { setTimeout } from "node:timers/promises";
|
|
@@ -49,6 +49,36 @@ function autoSpawnDaemon() {
|
|
|
49
49
|
}).unref();
|
|
50
50
|
}
|
|
51
51
|
//#endregion
|
|
52
|
-
|
|
52
|
+
//#region src/client/index.ts
|
|
53
|
+
const CONNECT_TIMEOUT_MS = 3e3;
|
|
54
|
+
async function runClient() {
|
|
55
|
+
let socket = await tryConnect();
|
|
56
|
+
if (socket === null) {
|
|
57
|
+
autoSpawnDaemon();
|
|
58
|
+
socket = await waitForSocket(CONNECT_TIMEOUT_MS);
|
|
59
|
+
}
|
|
60
|
+
if (socket === null) {
|
|
61
|
+
process.stderr.write("pi-acp: failed to connect to daemon socket within 3s. Try `pi-acp --daemon` manually.\n");
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
process.stdin.pipe(socket);
|
|
65
|
+
socket.pipe(process.stdout);
|
|
66
|
+
let exiting = false;
|
|
67
|
+
const exitOnce = (code) => {
|
|
68
|
+
if (exiting) return;
|
|
69
|
+
exiting = true;
|
|
70
|
+
process.exit(code);
|
|
71
|
+
};
|
|
72
|
+
socket.on("close", () => exitOnce(0));
|
|
73
|
+
socket.on("error", (err) => {
|
|
74
|
+
process.stderr.write(`pi-acp: socket error: ${err.message}\n`);
|
|
75
|
+
exitOnce(1);
|
|
76
|
+
});
|
|
77
|
+
process.on("SIGINT", () => socket?.destroy());
|
|
78
|
+
process.on("SIGTERM", () => socket?.destroy());
|
|
79
|
+
process.stdout.on("error", () => exitOnce(0));
|
|
80
|
+
}
|
|
81
|
+
//#endregion
|
|
82
|
+
export { runClient };
|
|
53
83
|
|
|
54
|
-
//# sourceMappingURL=
|
|
84
|
+
//# sourceMappingURL=client-BjK2BnaD.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-BjK2BnaD.mjs","names":["delay"],"sources":["../src/client/auto-spawn.ts","../src/client/index.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { connect, type Socket } from \"node:net\";\nimport { setTimeout as delay } from \"node:timers/promises\";\n\nimport { socketPath } from \"@pi-acp/daemon/socket\";\n\nconst POLL_INTERVAL_MS = 50;\n\nexport async function tryConnect(): Promise<Socket | null> {\n\tconst path = socketPath();\n\treturn await new Promise<Socket | null>((resolve) => {\n\t\tconst sock = connect(path);\n\t\tconst onConnect = (): void => {\n\t\t\tsock.off(\"error\", onError);\n\t\t\tresolve(sock);\n\t\t};\n\t\tconst onError = (): void => {\n\t\t\tsock.off(\"connect\", onConnect);\n\t\t\ttry {\n\t\t\t\tsock.destroy();\n\t\t\t} catch {\n\t\t\t\t/* best-effort */\n\t\t\t}\n\t\t\tresolve(null);\n\t\t};\n\t\tsock.once(\"connect\", onConnect);\n\t\tsock.once(\"error\", onError);\n\t});\n}\n\nexport async function waitForSocket(timeoutMs: number): Promise<Socket | null> {\n\tconst deadline = Date.now() + timeoutMs;\n\twhile (Date.now() < deadline) {\n\t\tconst sock = await tryConnect();\n\t\tif (sock) return sock;\n\t\tawait delay(POLL_INTERVAL_MS);\n\t}\n\treturn null;\n}\n\n/**\n * Fork pi-acp --daemon detached so the daemon outlives this process.\n *\n * Note: we resolve the entry-point script via `process.argv[1]` so the same\n * bin / dev entry is reused without the client needing to know its own path.\n */\nexport function autoSpawnDaemon(): void {\n\tconst entry = process.argv[1];\n\tif (entry === undefined) {\n\t\tthrow new Error(\"pi-acp: cannot resolve entry script for daemon spawn\");\n\t}\n\tconst child = spawn(process.execPath, [entry, \"--daemon\"], {\n\t\tdetached: true,\n\t\tstdio: \"ignore\",\n\t\tenv: process.env,\n\t});\n\tchild.unref();\n}\n","/**\n * Thin-client entry point. Connects to (or auto-spawns) the daemon, then\n * forwards stdio in both directions.\n */\n\nimport type { Socket } from \"node:net\";\nimport { autoSpawnDaemon, tryConnect, waitForSocket } from \"@pi-acp/client/auto-spawn\";\n\nconst CONNECT_TIMEOUT_MS = 3000;\n\nexport async function runClient(): Promise<void> {\n\tlet socket: Socket | null = await tryConnect();\n\tif (socket === null) {\n\t\tautoSpawnDaemon();\n\t\tsocket = await waitForSocket(CONNECT_TIMEOUT_MS);\n\t}\n\tif (socket === null) {\n\t\tprocess.stderr.write(\n\t\t\t\"pi-acp: failed to connect to daemon socket within 3s. Try `pi-acp --daemon` manually.\\n\",\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\n\t// Wire both pipes synchronously before yielding. The daemon won't send\n\t// frames until it receives an initialize request, so there's no window\n\t// where socket->stdout drops bytes — but don't reorder these.\n\tprocess.stdin.pipe(socket);\n\tsocket.pipe(process.stdout);\n\n\tlet exiting = false;\n\tconst exitOnce = (code: number): void => {\n\t\tif (exiting) return;\n\t\texiting = true;\n\t\tprocess.exit(code);\n\t};\n\n\tsocket.on(\"close\", () => exitOnce(0));\n\tsocket.on(\"error\", (err) => {\n\t\tprocess.stderr.write(`pi-acp: socket error: ${err.message}\\n`);\n\t\texitOnce(1);\n\t});\n\tprocess.on(\"SIGINT\", () => socket?.destroy());\n\tprocess.on(\"SIGTERM\", () => socket?.destroy());\n\tprocess.stdout.on(\"error\", () => exitOnce(0));\n}\n"],"mappings":";;;;;;AAMA,MAAM,mBAAmB;AAEzB,eAAsB,aAAqC;CAC1D,MAAM,OAAO,YAAY;AACzB,QAAO,MAAM,IAAI,SAAwB,YAAY;EACpD,MAAM,OAAO,QAAQ,KAAK;EAC1B,MAAM,kBAAwB;AAC7B,QAAK,IAAI,SAAS,QAAQ;AAC1B,WAAQ,KAAK;;EAEd,MAAM,gBAAsB;AAC3B,QAAK,IAAI,WAAW,UAAU;AAC9B,OAAI;AACH,SAAK,SAAS;WACP;AAGR,WAAQ,KAAK;;AAEd,OAAK,KAAK,WAAW,UAAU;AAC/B,OAAK,KAAK,SAAS,QAAQ;GAC1B;;AAGH,eAAsB,cAAc,WAA2C;CAC9E,MAAM,WAAW,KAAK,KAAK,GAAG;AAC9B,QAAO,KAAK,KAAK,GAAG,UAAU;EAC7B,MAAM,OAAO,MAAM,YAAY;AAC/B,MAAI,KAAM,QAAO;AACjB,QAAMA,WAAM,iBAAiB;;AAE9B,QAAO;;;;;;;;AASR,SAAgB,kBAAwB;CACvC,MAAM,QAAQ,QAAQ,KAAK;AAC3B,KAAI,UAAU,KAAA,EACb,OAAM,IAAI,MAAM,uDAAuD;AAE1D,OAAM,QAAQ,UAAU,CAAC,OAAO,WAAW,EAAE;EAC1D,UAAU;EACV,OAAO;EACP,KAAK,QAAQ;EACb,CACI,CAAC,OAAO;;;;AChDd,MAAM,qBAAqB;AAE3B,eAAsB,YAA2B;CAChD,IAAI,SAAwB,MAAM,YAAY;AAC9C,KAAI,WAAW,MAAM;AACpB,mBAAiB;AACjB,WAAS,MAAM,cAAc,mBAAmB;;AAEjD,KAAI,WAAW,MAAM;AACpB,UAAQ,OAAO,MACd,0FACA;AACD,UAAQ,KAAK,EAAE;;AAMhB,SAAQ,MAAM,KAAK,OAAO;AAC1B,QAAO,KAAK,QAAQ,OAAO;CAE3B,IAAI,UAAU;CACd,MAAM,YAAY,SAAuB;AACxC,MAAI,QAAS;AACb,YAAU;AACV,UAAQ,KAAK,KAAK;;AAGnB,QAAO,GAAG,eAAe,SAAS,EAAE,CAAC;AACrC,QAAO,GAAG,UAAU,QAAQ;AAC3B,UAAQ,OAAO,MAAM,yBAAyB,IAAI,QAAQ,IAAI;AAC9D,WAAS,EAAE;GACV;AACF,SAAQ,GAAG,gBAAgB,QAAQ,SAAS,CAAC;AAC7C,SAAQ,GAAG,iBAAiB,QAAQ,SAAS,CAAC;AAC9C,SAAQ,OAAO,GAAG,eAAe,SAAS,EAAE,CAAC"}
|