@elpapi42/pi-fleet-sdk 0.5.0 → 0.6.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/README.md +6 -0
- package/dist/fleet/agent.d.ts +20 -1
- package/dist/fleet/agent.d.ts.map +1 -1
- package/dist/fleet/agent.js.map +1 -1
- package/dist/fleet/client.d.ts.map +1 -1
- package/dist/fleet/client.js +23 -19
- package/dist/fleet/client.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/worker/activity.d.ts +18 -0
- package/dist/worker/activity.d.ts.map +1 -0
- package/dist/worker/activity.js +227 -0
- package/dist/worker/activity.js.map +1 -0
- package/dist/worker/control.d.ts +0 -2
- package/dist/worker/control.d.ts.map +1 -1
- package/dist/worker/control.js +1 -132
- package/dist/worker/control.js.map +1 -1
- package/dist/worker/protocol.d.ts +19 -1
- package/dist/worker/protocol.d.ts.map +1 -1
- package/dist/worker/protocol.js.map +1 -1
- package/dist/worker/server.js +30 -97
- package/dist/worker/server.js.map +1 -1
- package/dist/worker/stream.d.ts +7 -0
- package/dist/worker/stream.d.ts.map +1 -0
- package/dist/worker/stream.js +217 -0
- package/dist/worker/stream.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { Dealer } from "zeromq";
|
|
3
|
+
import { AgentUnavailableError } from "../fleet/agent.js";
|
|
4
|
+
import { decode, encode, } from "./protocol.js";
|
|
5
|
+
const STREAM_IDLE_PROBE_MS = 1_000;
|
|
6
|
+
export function receiveEvents(record) {
|
|
7
|
+
const controller = new AbortController();
|
|
8
|
+
const iterator = readEvents(record, controller.signal);
|
|
9
|
+
let closePromise;
|
|
10
|
+
const close = () => {
|
|
11
|
+
if (!closePromise) {
|
|
12
|
+
controller.abort();
|
|
13
|
+
closePromise = iterator.return(undefined).then(() => undefined);
|
|
14
|
+
}
|
|
15
|
+
return closePromise;
|
|
16
|
+
};
|
|
17
|
+
return {
|
|
18
|
+
next: () => iterator.next(),
|
|
19
|
+
async return() {
|
|
20
|
+
await close();
|
|
21
|
+
return { done: true, value: undefined };
|
|
22
|
+
},
|
|
23
|
+
async throw(error) {
|
|
24
|
+
controller.abort();
|
|
25
|
+
try {
|
|
26
|
+
return await iterator.throw(error);
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
await close();
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
[Symbol.asyncIterator]() {
|
|
33
|
+
return this;
|
|
34
|
+
},
|
|
35
|
+
close,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async function* readEvents(record, signal) {
|
|
39
|
+
if (signal.aborted)
|
|
40
|
+
return;
|
|
41
|
+
const runtime = record.runtime;
|
|
42
|
+
if (!runtime?.endpoint)
|
|
43
|
+
throw new AgentUnavailableError(record.name);
|
|
44
|
+
const socket = new Dealer({ routingId: randomUUID(), immediate: true, linger: 0, sendTimeout: STREAM_IDLE_PROBE_MS });
|
|
45
|
+
let subscriptionId;
|
|
46
|
+
try {
|
|
47
|
+
socket.connect(runtime.endpoint);
|
|
48
|
+
const request = {
|
|
49
|
+
version: 1,
|
|
50
|
+
requestId: randomUUID(),
|
|
51
|
+
command: "subscribe",
|
|
52
|
+
agentId: record.id,
|
|
53
|
+
runtimeGeneration: runtime.generation,
|
|
54
|
+
};
|
|
55
|
+
await socket.send(encode(request));
|
|
56
|
+
const acknowledgement = await receiveWithDeadline(socket, signal);
|
|
57
|
+
if (acknowledgement === "aborted")
|
|
58
|
+
return;
|
|
59
|
+
if (acknowledgement === "idle")
|
|
60
|
+
throw new AgentUnavailableError(record.name);
|
|
61
|
+
const response = decode(acknowledgement[0]);
|
|
62
|
+
if (!isSubscribeResponse(response) || !response.ok || response.requestId !== request.requestId ||
|
|
63
|
+
response.agentId !== record.id || response.runtimeGeneration !== runtime.generation ||
|
|
64
|
+
typeof response.subscriptionId !== "string" || !response.subscriptionId) {
|
|
65
|
+
throw new AgentUnavailableError(record.name);
|
|
66
|
+
}
|
|
67
|
+
subscriptionId = response.subscriptionId;
|
|
68
|
+
let nextFrame = socket.receive();
|
|
69
|
+
void nextFrame.catch(() => { });
|
|
70
|
+
let probeRequestId;
|
|
71
|
+
while (!signal.aborted) {
|
|
72
|
+
const result = await awaitStreamFrame(nextFrame, signal);
|
|
73
|
+
if (result === "aborted")
|
|
74
|
+
return;
|
|
75
|
+
if (result === "idle") {
|
|
76
|
+
if (probeRequestId)
|
|
77
|
+
throw new AgentUnavailableError(record.name);
|
|
78
|
+
probeRequestId = randomUUID();
|
|
79
|
+
const probe = {
|
|
80
|
+
version: 1,
|
|
81
|
+
requestId: probeRequestId,
|
|
82
|
+
command: "subscription.status",
|
|
83
|
+
agentId: record.id,
|
|
84
|
+
runtimeGeneration: runtime.generation,
|
|
85
|
+
subscriptionId,
|
|
86
|
+
};
|
|
87
|
+
await socket.send(encode(probe));
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
nextFrame = socket.receive();
|
|
91
|
+
void nextFrame.catch(() => { });
|
|
92
|
+
const frame = decode(result[0]);
|
|
93
|
+
if (isEventFrame(frame) && frame.agentId === record.id && frame.runtimeGeneration === runtime.generation &&
|
|
94
|
+
frame.subscriptionId === subscriptionId) {
|
|
95
|
+
yield frame.event;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (isSubscriptionStatusResponse(frame) && frame.requestId === probeRequestId &&
|
|
99
|
+
frame.agentId === record.id && frame.runtimeGeneration === runtime.generation &&
|
|
100
|
+
frame.subscriptionId === subscriptionId) {
|
|
101
|
+
if (!frame.ok)
|
|
102
|
+
throw new AgentUnavailableError(record.name);
|
|
103
|
+
probeRequestId = undefined;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
throw new AgentUnavailableError(record.name);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
if (signal.aborted)
|
|
111
|
+
return;
|
|
112
|
+
if (error instanceof AgentUnavailableError)
|
|
113
|
+
throw error;
|
|
114
|
+
throw new AgentUnavailableError(record.name);
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
const unsubscribe = {
|
|
118
|
+
version: 1,
|
|
119
|
+
requestId: randomUUID(),
|
|
120
|
+
command: "unsubscribe",
|
|
121
|
+
agentId: record.id,
|
|
122
|
+
runtimeGeneration: runtime.generation,
|
|
123
|
+
subscriptionId,
|
|
124
|
+
};
|
|
125
|
+
try {
|
|
126
|
+
await socket.send(encode(unsubscribe));
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// A closed or failed worker cannot retain this connection-scoped subscription.
|
|
130
|
+
}
|
|
131
|
+
socket.close();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async function receiveWithDeadline(socket, signal) {
|
|
135
|
+
const receive = socket.receive();
|
|
136
|
+
void receive.catch(() => { });
|
|
137
|
+
return awaitStreamFrame(receive, signal);
|
|
138
|
+
}
|
|
139
|
+
async function awaitStreamFrame(nextFrame, signal) {
|
|
140
|
+
let timer;
|
|
141
|
+
let onAbort;
|
|
142
|
+
try {
|
|
143
|
+
return await Promise.race([
|
|
144
|
+
nextFrame,
|
|
145
|
+
new Promise((resolve) => {
|
|
146
|
+
timer = setTimeout(() => resolve("idle"), STREAM_IDLE_PROBE_MS);
|
|
147
|
+
}),
|
|
148
|
+
new Promise((resolve) => {
|
|
149
|
+
onAbort = () => resolve("aborted");
|
|
150
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
151
|
+
}),
|
|
152
|
+
]);
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
if (timer)
|
|
156
|
+
clearTimeout(timer);
|
|
157
|
+
if (onAbort)
|
|
158
|
+
signal.removeEventListener("abort", onAbort);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function isSubscribeResponse(response) {
|
|
162
|
+
return isRecord(response) && response.version === 1 && response.command === "subscribe" &&
|
|
163
|
+
typeof response.requestId === "string" && typeof response.agentId === "string" &&
|
|
164
|
+
typeof response.runtimeGeneration === "string" && typeof response.ok === "boolean";
|
|
165
|
+
}
|
|
166
|
+
function isSubscriptionStatusResponse(response) {
|
|
167
|
+
return isRecord(response) && response.version === 1 && response.command === "subscription.status" &&
|
|
168
|
+
typeof response.requestId === "string" && typeof response.agentId === "string" &&
|
|
169
|
+
typeof response.runtimeGeneration === "string" && typeof response.subscriptionId === "string" &&
|
|
170
|
+
typeof response.ok === "boolean";
|
|
171
|
+
}
|
|
172
|
+
function isEventFrame(response) {
|
|
173
|
+
if (!isRecord(response) || response.version !== 1 || response.command !== "event" ||
|
|
174
|
+
typeof response.agentId !== "string" || typeof response.runtimeGeneration !== "string" ||
|
|
175
|
+
typeof response.subscriptionId !== "string")
|
|
176
|
+
return false;
|
|
177
|
+
return isAgentEvent(response.event);
|
|
178
|
+
}
|
|
179
|
+
function isAgentEvent(value) {
|
|
180
|
+
if (!isRecord(value) || typeof value.type !== "string" || typeof value.eventId !== "string" ||
|
|
181
|
+
typeof value.activityId !== "string" || typeof value.timestamp !== "number")
|
|
182
|
+
return false;
|
|
183
|
+
switch (value.type) {
|
|
184
|
+
case "thinking.started":
|
|
185
|
+
case "message.started":
|
|
186
|
+
return true;
|
|
187
|
+
case "thinking.finished":
|
|
188
|
+
return typeof value.content === "string";
|
|
189
|
+
case "message.finished":
|
|
190
|
+
return typeof value.text === "string";
|
|
191
|
+
case "tool.started":
|
|
192
|
+
return typeof value.toolName === "string" && typeof value.argsTruncated === "boolean" && isJsonValue(value.args);
|
|
193
|
+
case "tool.finished":
|
|
194
|
+
return typeof value.toolName === "string" && typeof value.isError === "boolean" && isToolOutput(value.output);
|
|
195
|
+
default:
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
function isToolOutput(value) {
|
|
200
|
+
if (!isRecord(value) || !Array.isArray(value.content) || typeof value.truncated !== "boolean" || typeof value.detailsTruncated !== "boolean")
|
|
201
|
+
return false;
|
|
202
|
+
if ("details" in value && !isJsonValue(value.details))
|
|
203
|
+
return false;
|
|
204
|
+
return value.content.every((part) => isRecord(part) && (part.type === "text" && typeof part.text === "string" ||
|
|
205
|
+
part.type === "image" && typeof part.mimeType === "string" && typeof part.byteLength === "number" && part.omitted === true));
|
|
206
|
+
}
|
|
207
|
+
function isJsonValue(value) {
|
|
208
|
+
if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean")
|
|
209
|
+
return true;
|
|
210
|
+
if (Array.isArray(value))
|
|
211
|
+
return value.every(isJsonValue);
|
|
212
|
+
return isRecord(value) && Object.values(value).every(isJsonValue);
|
|
213
|
+
}
|
|
214
|
+
function isRecord(value) {
|
|
215
|
+
return typeof value === "object" && value !== null;
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/worker/stream.ts"],"names":[],"mappings":"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"}
|