@muha-sdk/pi-adapter 0.0.0-stage → 0.1.14
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/LICENSE +21 -0
- package/README.md +106 -2
- package/dist/PI-SDK-LICENSE +21 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/ordered-agent-session.mjs +3584 -0
- package/dist/pi-events.d.ts +8 -0
- package/dist/pi-events.d.ts.map +1 -0
- package/dist/pi-events.js +67 -0
- package/dist/pi-events.js.map +1 -0
- package/dist/pi-input.d.ts +3 -0
- package/dist/pi-input.d.ts.map +1 -0
- package/dist/pi-input.js +33 -0
- package/dist/pi-input.js.map +1 -0
- package/dist/pi-owned-worker.d.ts +11 -0
- package/dist/pi-owned-worker.d.ts.map +1 -0
- package/dist/pi-owned-worker.js +113 -0
- package/dist/pi-owned-worker.js.map +1 -0
- package/dist/pi-process.d.ts +16 -0
- package/dist/pi-process.d.ts.map +1 -0
- package/dist/pi-process.js +319 -0
- package/dist/pi-process.js.map +1 -0
- package/dist/sdk-extensions.mjs +63 -0
- package/dist/sdk-loader.mjs +42 -0
- package/dist/sdk-patch.json +1 -0
- package/dist/sdk-sessions.mjs +52 -0
- package/dist/sdk-settings.mjs +44 -0
- package/dist/sdk-worker.mjs +94 -0
- package/dist/third-party-licenses/aws-sdk-3.972.39.LICENSE +201 -0
- package/dist/third-party-licenses/data-uri-to-buffer-4.0.1.README.md +88 -0
- package/dist/third-party-licenses/nodable-entities-2.1.0.LICENSE +21 -0
- package/dist/third-party-licenses/xml-naming-0.1.0.LICENSE +21 -0
- package/package.json +40 -4
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AdapterTurnEvent } from "@muha-sdk/core/internal";
|
|
2
|
+
export declare class PiEvents {
|
|
3
|
+
#private;
|
|
4
|
+
readonly emit: (event: AdapterTurnEvent) => void;
|
|
5
|
+
constructor(emit: (event: AdapterTurnEvent) => void);
|
|
6
|
+
receive(raw: unknown): void;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=pi-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-events.d.ts","sourceRoot":"","sources":["../src/pi-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAehE,qBAAa,QAAQ;;IAKP,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI;gBAAvC,IAAI,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI;IAE5D,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;CAkC5B"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
function object(value) {
|
|
2
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
3
|
+
throw new Error("Invalid Pi event object");
|
|
4
|
+
return value;
|
|
5
|
+
}
|
|
6
|
+
function string(value) {
|
|
7
|
+
if (typeof value !== "string")
|
|
8
|
+
throw new Error("Invalid Pi event string");
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
function tokens(value) {
|
|
12
|
+
if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0)
|
|
13
|
+
throw new Error("Invalid Pi usage");
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
export class PiEvents {
|
|
17
|
+
emit;
|
|
18
|
+
#message = 0;
|
|
19
|
+
#input = 0;
|
|
20
|
+
#output = 0;
|
|
21
|
+
#cached = 0;
|
|
22
|
+
constructor(emit) {
|
|
23
|
+
this.emit = emit;
|
|
24
|
+
}
|
|
25
|
+
receive(raw) {
|
|
26
|
+
const event = object(raw);
|
|
27
|
+
if (event.type === "message_start" && object(event.message).role === "assistant") {
|
|
28
|
+
this.#message++;
|
|
29
|
+
this.emit({ type: "assistant.message.started", nativeMessageId: String(this.#message) });
|
|
30
|
+
}
|
|
31
|
+
else if (event.type === "message_update") {
|
|
32
|
+
const update = object(event.assistantMessageEvent);
|
|
33
|
+
if ((update.type === "text_delta" || update.type === "thinking_delta") && update.delta) {
|
|
34
|
+
this.emit({ type: update.type === "text_delta" ? "assistant.message.delta" : "assistant.reasoning.delta",
|
|
35
|
+
nativeMessageId: String(this.#message), delta: string(update.delta) });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else if (event.type === "message_end" && object(event.message).role === "assistant") {
|
|
39
|
+
const { content, usage } = object(event.message);
|
|
40
|
+
if (!Array.isArray(content))
|
|
41
|
+
throw new Error("Invalid Pi Assistant Message content");
|
|
42
|
+
this.emit({ type: "assistant.message.completed", nativeMessageId: String(this.#message),
|
|
43
|
+
text: content.map(object).filter(part => part.type === "text").map(part => string(part.text)).join("") });
|
|
44
|
+
if (usage) {
|
|
45
|
+
const native = object(usage);
|
|
46
|
+
this.#input += tokens(native.input) + tokens(native.cacheRead) + tokens(native.cacheWrite);
|
|
47
|
+
this.#output += tokens(native.output);
|
|
48
|
+
this.#cached += tokens(native.cacheRead);
|
|
49
|
+
this.emit({ type: "usage.updated", usage: {
|
|
50
|
+
inputTokens: this.#input, outputTokens: this.#output, cachedInputTokens: this.#cached,
|
|
51
|
+
} });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else if (event.type === "tool_execution_start") {
|
|
55
|
+
this.emit({ type: "tool.started", nativeToolCallId: string(event.toolCallId), toolName: string(event.toolName), input: event.args });
|
|
56
|
+
}
|
|
57
|
+
else if (event.type === "tool_execution_update") {
|
|
58
|
+
this.emit({ type: "tool.updated", nativeToolCallId: string(event.toolCallId), update: event.partialResult ?? null });
|
|
59
|
+
}
|
|
60
|
+
else if (event.type === "tool_execution_end") {
|
|
61
|
+
if (typeof event.isError !== "boolean")
|
|
62
|
+
throw new Error("Invalid Pi tool result status");
|
|
63
|
+
this.emit({ type: "tool.completed", nativeToolCallId: string(event.toolCallId), output: event.result ?? null, isError: event.isError });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=pi-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-events.js","sourceRoot":"","sources":["../src/pi-events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-input.d.ts","sourceRoot":"","sources":["../src/pi-input.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAYhE,wBAAsB,OAAO,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAWpF"}
|
package/dist/pi-input.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { MuhaError } from "@muha-sdk/core";
|
|
3
|
+
function invalid(message) { throw new MuhaError({ code: "INVALID_INPUT", message }); }
|
|
4
|
+
function mediaType(bytes) {
|
|
5
|
+
if (bytes.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10])))
|
|
6
|
+
return "image/png";
|
|
7
|
+
if (bytes[0] === 255 && bytes[1] === 216 && bytes[2] === 255)
|
|
8
|
+
return "image/jpeg";
|
|
9
|
+
if (bytes.toString("ascii", 0, 4) === "RIFF" && bytes.toString("ascii", 8, 12) === "WEBP")
|
|
10
|
+
return "image/webp";
|
|
11
|
+
if (["GIF87a", "GIF89a"].includes(bytes.toString("ascii", 0, 6)))
|
|
12
|
+
return "image/gif";
|
|
13
|
+
return invalid("Pi image file became invalid before native acceptance");
|
|
14
|
+
}
|
|
15
|
+
export async function piInput(input) {
|
|
16
|
+
return Promise.all(input.map(async (part) => {
|
|
17
|
+
if (part.type === "text")
|
|
18
|
+
return { type: "text", text: part.text };
|
|
19
|
+
if (part.source.type === "base64")
|
|
20
|
+
return { type: "image", mimeType: part.source.mediaType, data: part.source.data };
|
|
21
|
+
let bytes;
|
|
22
|
+
try {
|
|
23
|
+
bytes = await readFile(part.source.path);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return invalid("Pi image file became unreadable before native acceptance");
|
|
27
|
+
}
|
|
28
|
+
// Snapshot verified bytes for IPC: subsequent file changes cannot alter
|
|
29
|
+
// the content received by the SDK after Muha accepts this input.
|
|
30
|
+
return { type: "image", mimeType: mediaType(bytes), data: bytes.toString("base64") };
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=pi-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-input.js","sourceRoot":"","sources":["../src/pi-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,SAAS,OAAO,CAAC,OAAe,IAAW,MAAM,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AAErG,SAAS,SAAS,CAAC,KAAa;IAC9B,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,WAAW,CAAC;IACpG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;QAAE,OAAO,YAAY,CAAC;IAClF,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,MAAM;QAAE,OAAO,YAAY,CAAC;IAC/G,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,WAAW,CAAC;IACrF,OAAO,OAAO,CAAC,uDAAuD,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAkC;IAC9D,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;QACxC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACnE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACrH,IAAI,KAAa,CAAC;QAClB,IAAI,CAAC;YAAC,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QACjD,MAAM,CAAC;YAAC,OAAO,OAAO,CAAC,0DAA0D,CAAC,CAAC;QAAC,CAAC;QACrF,wEAAwE;QACxE,iEAAiE;QACjE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IACvF,CAAC,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type ChildProcess } from "node:child_process";
|
|
2
|
+
export declare class PiOwnedWorker {
|
|
3
|
+
#private;
|
|
4
|
+
readonly shutdownMs: number;
|
|
5
|
+
readonly onLoss: (message: string) => void;
|
|
6
|
+
readonly child: ChildProcess;
|
|
7
|
+
readonly exited: Promise<void>;
|
|
8
|
+
constructor(env: NodeJS.ProcessEnv, shutdownMs: number, onLoss: (message: string) => void);
|
|
9
|
+
close(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=pi-owned-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-owned-worker.d.ts","sourceRoot":"","sources":["../src/pi-owned-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQ9D,qBAAa,aAAa;;IAQY,QAAQ,CAAC,UAAU,EAAE,MAAM;IAC7D,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IAR5C,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;gBAMnB,GAAG,EAAE,MAAM,CAAC,UAAU,EAAW,UAAU,EAAE,MAAM,EACpD,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IAoD5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CA2BvB"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createInterface } from "node:readline";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
// The exact Core dependency ships this private, qualified Linux subreaper.
|
|
5
|
+
// fd3 carries ownership control; fd4 carries Node's unchanged SDK IPC protocol.
|
|
6
|
+
// Kernel adoption covers children born before the SDK can report their PID.
|
|
7
|
+
export class PiOwnedWorker {
|
|
8
|
+
shutdownMs;
|
|
9
|
+
onLoss;
|
|
10
|
+
child;
|
|
11
|
+
exited;
|
|
12
|
+
#control;
|
|
13
|
+
#closing;
|
|
14
|
+
#reaped = false;
|
|
15
|
+
#lossReported = false;
|
|
16
|
+
constructor(env, shutdownMs, onLoss) {
|
|
17
|
+
this.shutdownMs = shutdownMs;
|
|
18
|
+
this.onLoss = onLoss;
|
|
19
|
+
const supervisor = new URL("./acp-supervisor", import.meta.resolve("@muha-sdk/core"));
|
|
20
|
+
this.child = spawn(fileURLToPath(supervisor), [String(Math.min(1000, Math.floor(shutdownMs / 4))), process.execPath,
|
|
21
|
+
fileURLToPath(new URL("./sdk-worker.mjs", import.meta.url))], { env, stdio: ["ignore", "ignore", "ignore", "pipe", "ipc"], serialization: "json" });
|
|
22
|
+
this.#control = this.child.stdio[3];
|
|
23
|
+
const lose = (message) => {
|
|
24
|
+
if (!this.#closing && !this.#lossReported) {
|
|
25
|
+
this.#lossReported = true;
|
|
26
|
+
this.onLoss(message);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
this.#control.on("error", () => lose("Pi ownership channel failed"));
|
|
30
|
+
const lines = createInterface({ input: this.#control });
|
|
31
|
+
lines.on("error", () => lose("Pi ownership reader failed"));
|
|
32
|
+
lines.on("line", line => {
|
|
33
|
+
try {
|
|
34
|
+
const event = JSON.parse(line);
|
|
35
|
+
if (event.type === "ready") {
|
|
36
|
+
if (!this.#closing)
|
|
37
|
+
this.#control.write("go\n");
|
|
38
|
+
}
|
|
39
|
+
else if (event.type === "closed") {
|
|
40
|
+
this.#reaped = event.noChildren === true && event.cleanupError === false;
|
|
41
|
+
}
|
|
42
|
+
else if (event.type === "error") {
|
|
43
|
+
lose(`Pi supervisor failed during ${String(event.operation)} (${String(event.errno)})`);
|
|
44
|
+
}
|
|
45
|
+
else if (!["spawned", "nativeExit", "closing"].includes(String(event.type))) {
|
|
46
|
+
lose("Invalid Pi ownership response");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
lose("Invalid Pi ownership response");
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
this.exited = new Promise((resolve, reject) => {
|
|
54
|
+
this.child.once("error", () => {
|
|
55
|
+
lose("Pi ownership helper could not start");
|
|
56
|
+
reject(new Error("Pi ownership helper could not start"));
|
|
57
|
+
});
|
|
58
|
+
this.child.once("exit", (code, signal) => {
|
|
59
|
+
if (code !== 0 || signal !== null) {
|
|
60
|
+
const message = "Pi supervisor exited without proving descendant cleanup";
|
|
61
|
+
lose(message);
|
|
62
|
+
reject(new Error(message));
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
this.child.once("close", (code, signal) => {
|
|
66
|
+
// The unchanged helper exits zero only after proving ECHILD.
|
|
67
|
+
if (code === 0 && signal === null)
|
|
68
|
+
this.#reaped = true;
|
|
69
|
+
if (this.#reaped)
|
|
70
|
+
resolve();
|
|
71
|
+
else
|
|
72
|
+
reject(new Error("Pi supervisor exited without proving descendant cleanup"));
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
void this.exited.catch(() => { });
|
|
76
|
+
}
|
|
77
|
+
close() {
|
|
78
|
+
if (this.#closing)
|
|
79
|
+
return this.#closing;
|
|
80
|
+
// First allow the SDK's normal abort/dispose path. An unresponsive SDK is
|
|
81
|
+
// then terminated by its independent owner, which also adopts late forks.
|
|
82
|
+
this.#closing = new Promise((resolve, reject) => {
|
|
83
|
+
const force = setTimeout(() => {
|
|
84
|
+
if (!this.#reaped && !this.#control.destroyed)
|
|
85
|
+
this.#control.write("close\n");
|
|
86
|
+
}, Math.floor(this.shutdownMs / 2));
|
|
87
|
+
const deadline = setTimeout(() => {
|
|
88
|
+
clearTimeout(force);
|
|
89
|
+
this.child.kill("SIGKILL");
|
|
90
|
+
this.#release();
|
|
91
|
+
reject(new Error("Pi descendant cleanup timed out"));
|
|
92
|
+
}, this.shutdownMs);
|
|
93
|
+
this.exited.then(() => {
|
|
94
|
+
clearTimeout(force);
|
|
95
|
+
clearTimeout(deadline);
|
|
96
|
+
this.#release();
|
|
97
|
+
resolve();
|
|
98
|
+
}, error => {
|
|
99
|
+
clearTimeout(force);
|
|
100
|
+
clearTimeout(deadline);
|
|
101
|
+
this.#release();
|
|
102
|
+
reject(error);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
return this.#closing;
|
|
106
|
+
}
|
|
107
|
+
#release() {
|
|
108
|
+
this.#control.destroy();
|
|
109
|
+
if (this.child.connected)
|
|
110
|
+
this.child.disconnect();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=pi-owned-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-owned-worker.js","sourceRoot":"","sources":["../src/pi-owned-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type OfficialAdapterOptions } from "@muha-sdk/core";
|
|
2
|
+
import type { AdapterCreateSessionOptions, AdapterResumeSessionOptions, AdapterSession, AdapterListedSession, LiveHarnessAdapter, LiveHarnessAdapterContext } from "@muha-sdk/core/internal";
|
|
3
|
+
export declare class PiProcess implements LiveHarnessAdapter {
|
|
4
|
+
#private;
|
|
5
|
+
readonly options: OfficialAdapterOptions;
|
|
6
|
+
readonly context: LiveHarnessAdapterContext;
|
|
7
|
+
readonly kind = "pi";
|
|
8
|
+
readonly route: "native";
|
|
9
|
+
constructor(options: OfficialAdapterOptions, context: LiveHarnessAdapterContext);
|
|
10
|
+
initialize(): Promise<void>;
|
|
11
|
+
createSession(options: AdapterCreateSessionOptions): Promise<AdapterSession>;
|
|
12
|
+
resumeSession(options: AdapterResumeSessionOptions): Promise<AdapterSession>;
|
|
13
|
+
listSessions(workspacePath: string): Promise<readonly AdapterListedSession[]>;
|
|
14
|
+
close(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=pi-process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-process.d.ts","sourceRoot":"","sources":["../src/pi-process.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoC,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC/F,OAAO,KAAK,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,cAAc,EACnC,oBAAoB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAMxJ,qBAAa,SAAU,YAAW,kBAAkB;;IAKtC,QAAQ,CAAC,OAAO,EAAE,sBAAsB;IAAE,QAAQ,CAAC,OAAO,EAAE,yBAAyB;IAJjG,QAAQ,CAAC,IAAI,QAAQ;IACrB,QAAQ,CAAC,KAAK,EAAG,QAAQ,CAAU;gBAGd,OAAO,EAAE,sBAAsB,EAAW,OAAO,EAAE,yBAAyB;IAQ3F,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,aAAa,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,cAAc,CAAC;IAG5E,aAAa,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,cAAc,CAAC;IAY5E,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,oBAAoB,EAAE,CAAC;IAK7E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { PiOwnedWorker } from "./pi-owned-worker.js";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { PiEvents } from "./pi-events.js";
|
|
4
|
+
import { piInput } from "./pi-input.js";
|
|
5
|
+
import { MuhaError } from "@muha-sdk/core";
|
|
6
|
+
function failure(operation, message) {
|
|
7
|
+
return new MuhaError({ code: "HARNESS_ERROR", harness: "pi", operation, message });
|
|
8
|
+
}
|
|
9
|
+
export class PiProcess {
|
|
10
|
+
options;
|
|
11
|
+
context;
|
|
12
|
+
kind = "pi";
|
|
13
|
+
route = "native";
|
|
14
|
+
#workers = new Set();
|
|
15
|
+
#closed = false;
|
|
16
|
+
constructor(options, context) {
|
|
17
|
+
this.options = options;
|
|
18
|
+
this.context = context;
|
|
19
|
+
}
|
|
20
|
+
async #worker() {
|
|
21
|
+
if (this.#closed)
|
|
22
|
+
throw failure("initialize", "Pi Adapter is closed");
|
|
23
|
+
const worker = new PiWorker(this.options, this.context);
|
|
24
|
+
this.#workers.add(worker);
|
|
25
|
+
try {
|
|
26
|
+
await worker.request("ready", {});
|
|
27
|
+
return worker;
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
await worker.close();
|
|
31
|
+
this.#workers.delete(worker);
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async initialize() {
|
|
36
|
+
const worker = await this.#worker();
|
|
37
|
+
await worker.close();
|
|
38
|
+
this.#workers.delete(worker);
|
|
39
|
+
}
|
|
40
|
+
async createSession(options) {
|
|
41
|
+
return this.#session("create", options);
|
|
42
|
+
}
|
|
43
|
+
async resumeSession(options) {
|
|
44
|
+
return this.#session("resume", options);
|
|
45
|
+
}
|
|
46
|
+
async #session(command, options) {
|
|
47
|
+
const worker = await this.#worker();
|
|
48
|
+
try {
|
|
49
|
+
const result = await worker.request(command, { ...options, shutdownTimeoutMs: this.options.shutdownTimeoutMs });
|
|
50
|
+
const session = new PiSession(worker, result, () => this.#workers.delete(worker));
|
|
51
|
+
worker.session = session;
|
|
52
|
+
return session;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
await worker.close();
|
|
56
|
+
this.#workers.delete(worker);
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async listSessions(workspacePath) {
|
|
61
|
+
const worker = await this.#worker();
|
|
62
|
+
try {
|
|
63
|
+
return await worker.request("list", { workspacePath });
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
await worker.close();
|
|
67
|
+
this.#workers.delete(worker);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async close() {
|
|
71
|
+
this.#closed = true;
|
|
72
|
+
await Promise.all([...this.#workers].map(worker => worker.close()));
|
|
73
|
+
this.#workers.clear();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
class PiWorker {
|
|
77
|
+
options;
|
|
78
|
+
context;
|
|
79
|
+
#child;
|
|
80
|
+
#pending = new Map();
|
|
81
|
+
#exited;
|
|
82
|
+
#owner;
|
|
83
|
+
#closing;
|
|
84
|
+
#queue = Promise.resolve();
|
|
85
|
+
#lostReported = false;
|
|
86
|
+
#protocolMessage;
|
|
87
|
+
session;
|
|
88
|
+
turn;
|
|
89
|
+
constructor(options, context) {
|
|
90
|
+
this.options = options;
|
|
91
|
+
this.context = context;
|
|
92
|
+
const env = { ...process.env };
|
|
93
|
+
for (const [key, value] of Object.entries(options.env ?? {})) {
|
|
94
|
+
if (value === undefined)
|
|
95
|
+
delete env[key];
|
|
96
|
+
else
|
|
97
|
+
env[key] = value;
|
|
98
|
+
}
|
|
99
|
+
this.#owner = new PiOwnedWorker(env, this.options.shutdownTimeoutMs ?? 5000, message => this.#lost(message));
|
|
100
|
+
this.#child = this.#owner.child;
|
|
101
|
+
this.#exited = this.#owner.exited.then(() => {
|
|
102
|
+
if (!this.#closing)
|
|
103
|
+
this.#lost("Pi SDK process exited unexpectedly");
|
|
104
|
+
});
|
|
105
|
+
void this.#exited.catch(() => { });
|
|
106
|
+
this.#child.on("error", error => this.#lost(error.message));
|
|
107
|
+
this.#child.on("disconnect", () => { if (!this.#closing)
|
|
108
|
+
this.#lost("Pi SDK control channel was lost"); });
|
|
109
|
+
this.#child.on("message", message => {
|
|
110
|
+
this.#queue = this.#queue.then(() => this.#receive(message)).catch(error => this.#failProtocol(error));
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
#failProtocol(cause) {
|
|
114
|
+
const data = cause instanceof MuhaError ? cause.data : cause;
|
|
115
|
+
if (data && typeof data === "object" && "code" in data && data.code === "EVENT_STORE_ERROR")
|
|
116
|
+
return;
|
|
117
|
+
if (this.#protocolMessage !== undefined || this.#lostReported)
|
|
118
|
+
return;
|
|
119
|
+
this.#protocolMessage = cause instanceof Error ? cause.message : "Invalid Pi SDK control output";
|
|
120
|
+
if (this.session)
|
|
121
|
+
this.session.closed = true;
|
|
122
|
+
// Quarantine this Session through deliberate, bounded shutdown before
|
|
123
|
+
// publishing its protocol failure. Do not label valid process exit during
|
|
124
|
+
// that shutdown as unexpected loss, or retry malformed protocol behavior.
|
|
125
|
+
void this.close().catch(error => this.#lost(String(error)));
|
|
126
|
+
}
|
|
127
|
+
#lost(message) {
|
|
128
|
+
if (this.#lostReported)
|
|
129
|
+
return;
|
|
130
|
+
this.#lostReported = true;
|
|
131
|
+
const error = this.#protocolMessage === undefined ? failure("startTurn", message)
|
|
132
|
+
: new MuhaError({ code: "ADAPTER_PROTOCOL_ERROR", harness: "pi", message: this.#protocolMessage });
|
|
133
|
+
for (const pending of this.#pending.values()) {
|
|
134
|
+
clearTimeout(pending.timer);
|
|
135
|
+
pending.reject(this.#protocolMessage === undefined ? failure(pending.operation, message) : error);
|
|
136
|
+
}
|
|
137
|
+
this.#pending.clear();
|
|
138
|
+
if (this.#protocolMessage !== undefined) {
|
|
139
|
+
this.turn?.finish({ type: "adapter.protocolError", message: this.#protocolMessage });
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
this.turn?.finish({ type: "turn.failed", error: error.data });
|
|
143
|
+
if (!this.#closing)
|
|
144
|
+
this.context.reportFatalError(error.data, this.session ? [this.session] : []);
|
|
145
|
+
}
|
|
146
|
+
async #receive(raw) {
|
|
147
|
+
if (raw === null || typeof raw !== "object")
|
|
148
|
+
throw new Error("Malformed Pi SDK control message");
|
|
149
|
+
const message = raw;
|
|
150
|
+
// Quarantine stops public normalization, not native evidence retention.
|
|
151
|
+
// SDK abort/shutdown callbacks can still arrive during bounded close.
|
|
152
|
+
if (message.type === "native") {
|
|
153
|
+
await this.context.recordNativeEvent("pi", { source: "AgentSession.subscribe", payload: message.event });
|
|
154
|
+
if (this.#protocolMessage === undefined)
|
|
155
|
+
this.turn?.nativeEvents.receive(message.event);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (message.type === "diagnostic") {
|
|
159
|
+
if (typeof message.source !== "string" || !["SessionManager.list", "createAgentSession.modelFallbackMessage",
|
|
160
|
+
"createAgentSession.extensionsResult.errors", "AgentSession.bindExtensions.onError"].includes(message.source)) {
|
|
161
|
+
throw new Error("Unknown Pi SDK diagnostic source");
|
|
162
|
+
}
|
|
163
|
+
await this.context.recordNativeEvent("pi", { source: message.source, payload: message.payload });
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
if (this.#protocolMessage !== undefined)
|
|
167
|
+
return;
|
|
168
|
+
if (message.type === "reply") {
|
|
169
|
+
const pending = this.#pending.get(String(message.id));
|
|
170
|
+
if (!pending)
|
|
171
|
+
throw new Error("Unknown Pi command correlation");
|
|
172
|
+
clearTimeout(pending.timer);
|
|
173
|
+
this.#pending.delete(String(message.id));
|
|
174
|
+
if (message.error) {
|
|
175
|
+
if (message.protocolError === true)
|
|
176
|
+
pending.reject(new MuhaError({ code: "ADAPTER_PROTOCOL_ERROR", harness: "pi", message: String(message.error) }));
|
|
177
|
+
else
|
|
178
|
+
pending.reject(new MuhaError({ code: "HARNESS_ERROR", harness: "pi", operation: pending.operation,
|
|
179
|
+
message: String(message.error), ...(typeof message.nativeCode === "string" ? { nativeCode: message.nativeCode } : {}) }));
|
|
180
|
+
}
|
|
181
|
+
else
|
|
182
|
+
pending.resolve(message.value);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const turn = this.turn;
|
|
186
|
+
if (message.type === "settled" && turn && turn.nativeTurnId === message.turnId) {
|
|
187
|
+
if (message.error)
|
|
188
|
+
turn.finish({ type: "turn.failed", error: failure("startTurn", String(message.error)).data });
|
|
189
|
+
else if (message.interrupted)
|
|
190
|
+
turn.finish({ type: "turn.interrupted" });
|
|
191
|
+
else if (typeof message.text === "string") {
|
|
192
|
+
turn.finish({ type: "turn.completed" });
|
|
193
|
+
}
|
|
194
|
+
else
|
|
195
|
+
turn.finish({ type: "adapter.protocolError", message: "Pi completed without a final Assistant Message" });
|
|
196
|
+
this.turn = undefined;
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
throw new Error("Unknown Pi SDK message");
|
|
200
|
+
}
|
|
201
|
+
request(command, args) {
|
|
202
|
+
return new Promise((resolve, reject) => {
|
|
203
|
+
if (this.#closing || this.#lostReported || !this.#child.connected) {
|
|
204
|
+
reject(failure("initialize", "Pi SDK process is unavailable"));
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
const id = randomUUID();
|
|
208
|
+
const operation = command === "create" ? "createSession"
|
|
209
|
+
: command === "resume" ? "resumeSession" : command === "list" ? "listSessions"
|
|
210
|
+
: command === "prompt" ? "startTurn" : command === "setModel" ? "setModel"
|
|
211
|
+
: command === "setEffort" ? "setEffort" : command === "abort" ? "interruptTurn" : "initialize";
|
|
212
|
+
// Only SDK startup uses the Registration startup bound. Once ready,
|
|
213
|
+
// command acknowledgements remain under Core's existing watchdog.
|
|
214
|
+
const timer = command === "ready" ? setTimeout(() => {
|
|
215
|
+
this.#pending.delete(id);
|
|
216
|
+
reject(failure(operation, `Pi SDK ${command} timed out`));
|
|
217
|
+
}, this.options.startupTimeoutMs ?? 10000) : undefined;
|
|
218
|
+
this.#pending.set(id, { operation, resolve, reject, timer });
|
|
219
|
+
this.#child.send({ id, command, args }, error => { if (error)
|
|
220
|
+
this.#lost(error.message); });
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
close() {
|
|
224
|
+
return this.#closing ??= (async () => {
|
|
225
|
+
try {
|
|
226
|
+
if (this.#child.connected)
|
|
227
|
+
this.#child.send({ command: "close" });
|
|
228
|
+
await this.#owner.close();
|
|
229
|
+
await this.#queue;
|
|
230
|
+
this.#lost("Pi SDK process closed");
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
this.#lost(error instanceof Error ? error.message : String(error));
|
|
234
|
+
throw error;
|
|
235
|
+
}
|
|
236
|
+
})();
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
class PiSession {
|
|
240
|
+
worker;
|
|
241
|
+
release;
|
|
242
|
+
nativeSessionId;
|
|
243
|
+
model;
|
|
244
|
+
effort;
|
|
245
|
+
closed = false;
|
|
246
|
+
constructor(worker, result, release) {
|
|
247
|
+
this.worker = worker;
|
|
248
|
+
this.release = release;
|
|
249
|
+
this.nativeSessionId = result.id;
|
|
250
|
+
this.model = result.model;
|
|
251
|
+
this.effort = result.effort;
|
|
252
|
+
}
|
|
253
|
+
async startTurn(input) {
|
|
254
|
+
const nativeInput = await piInput(input);
|
|
255
|
+
const turn = new PiTurn(this.worker);
|
|
256
|
+
this.worker.turn = turn;
|
|
257
|
+
turn.push({ type: "turn.started" });
|
|
258
|
+
try {
|
|
259
|
+
await this.worker.request("prompt", { input: nativeInput, turnId: turn.nativeTurnId });
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
this.worker.turn = undefined;
|
|
263
|
+
throw error;
|
|
264
|
+
}
|
|
265
|
+
return turn;
|
|
266
|
+
}
|
|
267
|
+
async setModel(model) {
|
|
268
|
+
const result = await this.worker.request("setModel", { model });
|
|
269
|
+
this.model = result.model;
|
|
270
|
+
this.effort = undefined;
|
|
271
|
+
}
|
|
272
|
+
async setEffort(effort) {
|
|
273
|
+
const result = await this.worker.request("setEffort", { effort });
|
|
274
|
+
this.effort = result.effort;
|
|
275
|
+
}
|
|
276
|
+
async close() {
|
|
277
|
+
this.closed = true;
|
|
278
|
+
try {
|
|
279
|
+
await this.worker.close();
|
|
280
|
+
}
|
|
281
|
+
finally {
|
|
282
|
+
this.release();
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
class PiTurn {
|
|
287
|
+
worker;
|
|
288
|
+
nativeTurnId = randomUUID();
|
|
289
|
+
nativeEvents = new PiEvents(event => this.push(event));
|
|
290
|
+
#events = [];
|
|
291
|
+
#wake;
|
|
292
|
+
#ended = false;
|
|
293
|
+
constructor(worker) {
|
|
294
|
+
this.worker = worker;
|
|
295
|
+
}
|
|
296
|
+
push(event) { if (!this.#ended) {
|
|
297
|
+
this.#events.push(event);
|
|
298
|
+
this.#wake?.();
|
|
299
|
+
} }
|
|
300
|
+
finish(event) { if (!this.#ended) {
|
|
301
|
+
this.push(event);
|
|
302
|
+
this.#ended = true;
|
|
303
|
+
} }
|
|
304
|
+
async *[Symbol.asyncIterator]() {
|
|
305
|
+
while (true) {
|
|
306
|
+
const event = this.#events.shift();
|
|
307
|
+
if (event)
|
|
308
|
+
yield event;
|
|
309
|
+
else if (this.#ended)
|
|
310
|
+
return;
|
|
311
|
+
else
|
|
312
|
+
await new Promise(resolve => { this.#wake = resolve; });
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
async interrupt() { await this.worker.request("abort", {}); }
|
|
316
|
+
async respondToApproval() { throw failure("respondToApproval", "Pi has no native Approval Request"); }
|
|
317
|
+
async respondToQuestion() { throw failure("respondToQuestion", "Pi Questions are not supported"); }
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=pi-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-process.js","sourceRoot":"","sources":["../src/pi-process.ts"],"names":[],"mappings":"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"}
|