@allin-ai/agent-client 0.1.0 → 0.2.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 +75 -42
- package/dist/cli/commands.d.ts +9 -0
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +244 -7
- package/dist/cli/commands.js.map +1 -1
- package/dist/client/index.d.ts +7 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +6 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/state-store.d.ts +1 -1
- package/dist/client/state-store.d.ts.map +1 -1
- package/dist/client/state-store.js +1 -1
- package/dist/client/state-store.js.map +1 -1
- package/dist/client/supervisor.d.ts +37 -1
- package/dist/client/supervisor.d.ts.map +1 -1
- package/dist/client/supervisor.js +159 -10
- package/dist/client/supervisor.js.map +1 -1
- package/dist/client/transport.d.ts +5 -1
- package/dist/client/transport.d.ts.map +1 -1
- package/dist/client/types.d.ts +6 -64
- package/dist/client/types.d.ts.map +1 -1
- package/dist/client/types.js +9 -12
- package/dist/client/types.js.map +1 -1
- package/dist/client/wire.d.ts +2 -31
- package/dist/client/wire.d.ts.map +1 -1
- package/dist/client/wire.js +2 -301
- package/dist/client/wire.js.map +1 -1
- package/dist/client/ws-transport.d.ts +5 -1
- package/dist/client/ws-transport.d.ts.map +1 -1
- package/dist/client/ws-transport.js +30 -6
- package/dist/client/ws-transport.js.map +1 -1
- package/dist/config.d.ts +10 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +30 -1
- package/dist/config.js.map +1 -1
- package/dist/control.d.ts +6 -0
- package/dist/control.d.ts.map +1 -1
- package/dist/control.js +25 -0
- package/dist/control.js.map +1 -1
- package/dist/demo/index.d.ts +3 -0
- package/dist/demo/index.d.ts.map +1 -0
- package/dist/demo/index.js +2 -0
- package/dist/demo/index.js.map +1 -0
- package/dist/demo/observable-store.d.ts +55 -0
- package/dist/demo/observable-store.d.ts.map +1 -0
- package/dist/demo/observable-store.js +88 -0
- package/dist/demo/observable-store.js.map +1 -0
- package/dist/demo/projection.d.ts +23 -0
- package/dist/demo/projection.d.ts.map +1 -0
- package/dist/demo/projection.js +47 -0
- package/dist/demo/projection.js.map +1 -0
- package/dist/demo/site.d.ts +30 -0
- package/dist/demo/site.d.ts.map +1 -0
- package/dist/demo/site.js +330 -0
- package/dist/demo/site.js.map +1 -0
- package/dist/demo/static.d.ts +5 -0
- package/dist/demo/static.d.ts.map +1 -0
- package/dist/demo/static.js +53 -0
- package/dist/demo/static.js.map +1 -0
- package/dist/demo/token-registry.d.ts +20 -0
- package/dist/demo/token-registry.d.ts.map +1 -0
- package/dist/demo/token-registry.js +34 -0
- package/dist/demo/token-registry.js.map +1 -0
- package/dist/demo/types.d.ts +8 -0
- package/dist/demo/types.d.ts.map +1 -0
- package/dist/demo/types.js +2 -0
- package/dist/demo/types.js.map +1 -0
- package/dist/hub/agent-hub.d.ts +4 -0
- package/dist/hub/agent-hub.d.ts.map +1 -0
- package/dist/hub/agent-hub.js +352 -0
- package/dist/hub/agent-hub.js.map +1 -0
- package/dist/hub/index.d.ts +3 -0
- package/dist/hub/index.d.ts.map +1 -0
- package/dist/hub/index.js +2 -0
- package/dist/hub/index.js.map +1 -0
- package/dist/hub/testkit/index.d.ts +4 -0
- package/dist/hub/testkit/index.d.ts.map +1 -0
- package/dist/hub/testkit/index.js +4 -0
- package/dist/hub/testkit/index.js.map +1 -0
- package/dist/hub/testkit/memory-hub.d.ts +23 -0
- package/dist/hub/testkit/memory-hub.d.ts.map +1 -0
- package/dist/hub/testkit/memory-hub.js +33 -0
- package/dist/hub/testkit/memory-hub.js.map +1 -0
- package/dist/hub/testkit/memory-store.d.ts +62 -0
- package/dist/hub/testkit/memory-store.d.ts.map +1 -0
- package/dist/hub/testkit/memory-store.js +186 -0
- package/dist/hub/testkit/memory-store.js.map +1 -0
- package/dist/hub/types.d.ts +118 -0
- package/dist/hub/types.d.ts.map +1 -0
- package/dist/hub/types.js +2 -0
- package/dist/hub/types.js.map +1 -0
- package/dist/hub.d.ts +2 -82
- package/dist/hub.d.ts.map +1 -1
- package/dist/hub.js +2 -411
- package/dist/hub.js.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/login.d.ts +22 -0
- package/dist/login.d.ts.map +1 -0
- package/dist/login.js +94 -0
- package/dist/login.js.map +1 -0
- package/dist/protocol/index.d.ts +3 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +3 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/types.d.ts +111 -0
- package/dist/protocol/types.d.ts.map +1 -0
- package/dist/protocol/types.js +13 -0
- package/dist/protocol/types.js.map +1 -0
- package/dist/protocol/wire.d.ts +25 -0
- package/dist/protocol/wire.d.ts.map +1 -0
- package/dist/protocol/wire.js +337 -0
- package/dist/protocol/wire.js.map +1 -0
- package/dist/runtime/claude.d.ts +32 -9
- package/dist/runtime/claude.d.ts.map +1 -1
- package/dist/runtime/claude.js +18 -2
- package/dist/runtime/claude.js.map +1 -1
- package/dist/runtime/codex.d.ts +12 -0
- package/dist/runtime/codex.d.ts.map +1 -1
- package/dist/runtime/codex.js +31 -6
- package/dist/runtime/codex.js.map +1 -1
- package/dist/runtime/index.d.ts +4 -4
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +1 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/pi.d.ts +25 -2
- package/dist/runtime/pi.d.ts.map +1 -1
- package/dist/runtime/pi.js +20 -3
- package/dist/runtime/pi.js.map +1 -1
- package/dist/runtime/registry.d.ts +9 -4
- package/dist/runtime/registry.d.ts.map +1 -1
- package/dist/runtime/registry.js +7 -7
- package/dist/runtime/registry.js.map +1 -1
- package/dist/runtime/runner-child.js +48 -4
- package/dist/runtime/runner-child.js.map +1 -1
- package/dist/wire.d.ts +2 -23
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +2 -6
- package/dist/wire.js.map +1 -1
- package/package.json +145 -34
- package/web/app.js +253 -0
- package/web/index.html +421 -0
- package/web/login.html +85 -0
- package/web/style.css +484 -0
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
import { WebSocket, WebSocketServer } from "ws";
|
|
2
|
+
import { parseClientCommand, parseClientEventBatch, parseClientHello, parseHubDownlink, parseHubEventAcknowledgement, parseInventoryReport, parsePluginSyncAcknowledgement, } from "../protocol/index.js";
|
|
3
|
+
import { bridgeLog } from "../logger.js";
|
|
4
|
+
/** Protocol orchestration only: durable state and ownership belong to the host Store. */
|
|
5
|
+
export function createAgentHub(options) {
|
|
6
|
+
const pathPrefix = options.pathPrefix ?? "/api/agent-hub/v2";
|
|
7
|
+
if (!pathPrefix.startsWith("/") ||
|
|
8
|
+
pathPrefix.endsWith("/") ||
|
|
9
|
+
/[?#\\\s]/.test(pathPrefix) ||
|
|
10
|
+
new URL(pathPrefix, "http://hub.invalid").pathname !== pathPrefix) {
|
|
11
|
+
throw new TypeError("pathPrefix must be an absolute path with no trailing slash, query or fragment");
|
|
12
|
+
}
|
|
13
|
+
const wsPath = `${pathPrefix}/ws`;
|
|
14
|
+
const store = options.store;
|
|
15
|
+
// Keys are issued by the host; Principal stays opaque even for routing.
|
|
16
|
+
const sockets = new Map();
|
|
17
|
+
// Transport resources only; these sockets are not yet owned by WebSocketServer.
|
|
18
|
+
const pendingUpgrades = new Set();
|
|
19
|
+
const wss = new WebSocketServer({
|
|
20
|
+
noServer: true,
|
|
21
|
+
maxPayload: options.maxPayloadBytes ?? 1_048_576,
|
|
22
|
+
});
|
|
23
|
+
let attached;
|
|
24
|
+
let attachOptions = {};
|
|
25
|
+
let closed = false;
|
|
26
|
+
let closePromise;
|
|
27
|
+
function url(request) {
|
|
28
|
+
try {
|
|
29
|
+
return new URL(request.url ?? "/", "http://hub.invalid");
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function authorize(request, requestUrl) {
|
|
36
|
+
const token = request.headers.authorization?.replace(/^Bearer\s+/i, "") ??
|
|
37
|
+
requestUrl.searchParams.get("token") ??
|
|
38
|
+
"";
|
|
39
|
+
try {
|
|
40
|
+
return await options.authorize(token, request);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async function httpRequest(request, response, requestUrl) {
|
|
47
|
+
const principal = await authorize(request, requestUrl);
|
|
48
|
+
response.writeHead(principal === null ? 401 : 426, {
|
|
49
|
+
"Content-Type": "application/json",
|
|
50
|
+
...(principal === null ? {} : { Upgrade: "websocket" }),
|
|
51
|
+
});
|
|
52
|
+
response.end(JSON.stringify({
|
|
53
|
+
error: principal === null ? "unauthorized" : "websocket_required",
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
function onRequest(request, response) {
|
|
57
|
+
const requestUrl = url(request);
|
|
58
|
+
if (!requestUrl) {
|
|
59
|
+
response.writeHead(400);
|
|
60
|
+
response.end();
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (requestUrl.pathname !== wsPath) {
|
|
64
|
+
if (attachOptions.fallback)
|
|
65
|
+
attachOptions.fallback(request, response);
|
|
66
|
+
else {
|
|
67
|
+
response.writeHead(404);
|
|
68
|
+
response.end();
|
|
69
|
+
}
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
void httpRequest(request, response, requestUrl);
|
|
73
|
+
}
|
|
74
|
+
function active(connection) {
|
|
75
|
+
return (!closed &&
|
|
76
|
+
connection.socket.readyState === WebSocket.OPEN &&
|
|
77
|
+
sockets.get(connection.connectionKey) === connection);
|
|
78
|
+
}
|
|
79
|
+
async function deliver(connection) {
|
|
80
|
+
const offers = await store.listPendingOffers({
|
|
81
|
+
principal: connection.principal,
|
|
82
|
+
clientId: connection.clientId,
|
|
83
|
+
});
|
|
84
|
+
for (const offer of offers) {
|
|
85
|
+
if (!active(connection))
|
|
86
|
+
return;
|
|
87
|
+
if (offer.connectionKey !== connection.connectionKey ||
|
|
88
|
+
offer.targetClientId !== connection.clientId) {
|
|
89
|
+
throw new Error("Store returned an offer for another connection");
|
|
90
|
+
}
|
|
91
|
+
const command = parseClientCommand(offer.command);
|
|
92
|
+
if (!command)
|
|
93
|
+
throw new Error("Store returned an invalid command");
|
|
94
|
+
connection.socket.send(JSON.stringify({ type: "task.offer", command }));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function connect(socket, principal) {
|
|
98
|
+
let connection;
|
|
99
|
+
// Only in-flight work is queued here; no event/offer history is retained.
|
|
100
|
+
let tail = Promise.resolve();
|
|
101
|
+
function queue(work) {
|
|
102
|
+
tail = tail
|
|
103
|
+
.then(async () => {
|
|
104
|
+
if (closed || socket.readyState !== WebSocket.OPEN)
|
|
105
|
+
return;
|
|
106
|
+
if (connection && !active(connection))
|
|
107
|
+
return;
|
|
108
|
+
await work();
|
|
109
|
+
})
|
|
110
|
+
.catch(() => {
|
|
111
|
+
socket.close(1011, "Hub store failure");
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
socket.on("message", (raw) => queue(async () => {
|
|
115
|
+
let message;
|
|
116
|
+
try {
|
|
117
|
+
message = JSON.parse((Array.isArray(raw)
|
|
118
|
+
? Buffer.concat(raw)
|
|
119
|
+
: Buffer.from(raw)).toString("utf8"));
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
socket.close(1008, "invalid message");
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (!connection) {
|
|
126
|
+
const hello = parseClientHello(message);
|
|
127
|
+
if (!hello) {
|
|
128
|
+
socket.close(1008, "client.hello required");
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
let record;
|
|
132
|
+
try {
|
|
133
|
+
record = await store.registerClient({
|
|
134
|
+
principal,
|
|
135
|
+
clientId: hello.clientId,
|
|
136
|
+
protocolVersion: hello.protocolVersion,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
socket.close(1008, "client registration rejected");
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (record.clientId !== hello.clientId ||
|
|
144
|
+
typeof record.connectionKey !== "string" ||
|
|
145
|
+
!record.connectionKey.trim()) {
|
|
146
|
+
socket.close(1008, "client ownership conflict");
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (closed || socket.readyState !== WebSocket.OPEN)
|
|
150
|
+
return;
|
|
151
|
+
const prior = sockets.get(record.connectionKey);
|
|
152
|
+
if (prior && prior.clientId !== record.clientId) {
|
|
153
|
+
socket.close(1008, "client ownership conflict");
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
connection = {
|
|
157
|
+
clientId: record.clientId,
|
|
158
|
+
connectionKey: record.connectionKey,
|
|
159
|
+
principal,
|
|
160
|
+
socket,
|
|
161
|
+
};
|
|
162
|
+
sockets.set(record.connectionKey, connection);
|
|
163
|
+
prior?.socket.close(1000, "superseded connection");
|
|
164
|
+
await deliver(connection);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const acknowledgement = parsePluginSyncAcknowledgement(message);
|
|
168
|
+
if (acknowledgement) {
|
|
169
|
+
await store.acknowledgePluginSync({
|
|
170
|
+
principal,
|
|
171
|
+
clientId: connection.clientId,
|
|
172
|
+
acknowledgement,
|
|
173
|
+
});
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const inventory = parseInventoryReport(message);
|
|
177
|
+
if (inventory) {
|
|
178
|
+
await store.recordInventory({
|
|
179
|
+
principal,
|
|
180
|
+
clientId: connection.clientId,
|
|
181
|
+
report: inventory,
|
|
182
|
+
});
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const events = parseClientEventBatch(message);
|
|
186
|
+
if (!events) {
|
|
187
|
+
// Forward compatibility: a newer client may send message types this
|
|
188
|
+
// Hub does not know. Dropping the socket would break mixed-version
|
|
189
|
+
// fleets, so unknown frames are logged and ignored.
|
|
190
|
+
bridgeLog.warn("agent-hub", "Ignoring unknown client message", {
|
|
191
|
+
type: message.type,
|
|
192
|
+
});
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const watermarks = await store.ingestEvents({
|
|
196
|
+
principal,
|
|
197
|
+
clientId: connection.clientId,
|
|
198
|
+
events,
|
|
199
|
+
});
|
|
200
|
+
const ack = parseHubEventAcknowledgement({
|
|
201
|
+
type: "event.ack",
|
|
202
|
+
watermarks,
|
|
203
|
+
});
|
|
204
|
+
if (!ack)
|
|
205
|
+
throw new Error("Store returned invalid event watermarks");
|
|
206
|
+
if (active(connection))
|
|
207
|
+
socket.send(JSON.stringify(ack));
|
|
208
|
+
}));
|
|
209
|
+
// v2 has no JSON heartbeat frame. WS control frames preserve its wire contract.
|
|
210
|
+
function heartbeat() {
|
|
211
|
+
queue(async () => {
|
|
212
|
+
if (!connection) {
|
|
213
|
+
socket.close(1008, "client.hello required");
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
await store.heartbeat({ principal, clientId: connection.clientId });
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
socket.on("ping", heartbeat);
|
|
220
|
+
socket.on("pong", heartbeat);
|
|
221
|
+
socket.on("error", () => socket.terminate());
|
|
222
|
+
socket.on("close", () => {
|
|
223
|
+
if (connection && sockets.get(connection.connectionKey) === connection)
|
|
224
|
+
sockets.delete(connection.connectionKey);
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
async function upgrade(request, socket, head, requestUrl) {
|
|
228
|
+
const principal = await authorize(request, requestUrl);
|
|
229
|
+
if (closed || socket.destroyed) {
|
|
230
|
+
socket.destroy();
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (principal === null) {
|
|
234
|
+
socket.end("HTTP/1.1 401 Unauthorized\r\nConnection: close\r\nContent-Length: 0\r\n\r\n");
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
wss.handleUpgrade(request, socket, head, (ws) => connect(ws, principal));
|
|
238
|
+
}
|
|
239
|
+
function onUpgrade(request, socket, head) {
|
|
240
|
+
const requestUrl = url(request);
|
|
241
|
+
if (!requestUrl) {
|
|
242
|
+
socket.destroy();
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
if (requestUrl.pathname !== wsPath) {
|
|
246
|
+
if (attachOptions.onUnknownUpgrade) {
|
|
247
|
+
attachOptions.onUnknownUpgrade(request, socket, head);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
socket.destroy();
|
|
251
|
+
}
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
pendingUpgrades.add(socket);
|
|
255
|
+
const forget = () => {
|
|
256
|
+
pendingUpgrades.delete(socket);
|
|
257
|
+
};
|
|
258
|
+
const failed = () => {
|
|
259
|
+
socket.destroy();
|
|
260
|
+
};
|
|
261
|
+
socket.once("close", forget);
|
|
262
|
+
socket.once("error", failed);
|
|
263
|
+
void upgrade(request, socket, head, requestUrl)
|
|
264
|
+
.catch(() => socket.destroy())
|
|
265
|
+
.finally(() => {
|
|
266
|
+
pendingUpgrades.delete(socket);
|
|
267
|
+
socket.off("close", forget);
|
|
268
|
+
socket.off("error", failed);
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
return {
|
|
272
|
+
attach(server, opts = {}) {
|
|
273
|
+
if (closed || attached)
|
|
274
|
+
throw new Error("AgentHub can only attach once before close");
|
|
275
|
+
attached = server;
|
|
276
|
+
attachOptions = opts;
|
|
277
|
+
server.on("request", onRequest);
|
|
278
|
+
server.on("upgrade", onUpgrade);
|
|
279
|
+
},
|
|
280
|
+
async offer(input) {
|
|
281
|
+
if (closed)
|
|
282
|
+
throw new Error("AgentHub is closed");
|
|
283
|
+
const command = parseClientCommand(input.command);
|
|
284
|
+
if (!command || !input.targetClientId.trim())
|
|
285
|
+
throw new TypeError("Invalid offer");
|
|
286
|
+
const stored = await store.enqueueOffer({
|
|
287
|
+
principal: input.principal,
|
|
288
|
+
targetClientId: input.targetClientId,
|
|
289
|
+
command,
|
|
290
|
+
});
|
|
291
|
+
const connection = sockets.get(stored.connectionKey);
|
|
292
|
+
if (connection && active(connection)) {
|
|
293
|
+
try {
|
|
294
|
+
await deliver(connection);
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
connection.socket.close(1011, "Hub store failure");
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return stored;
|
|
301
|
+
},
|
|
302
|
+
syncPlugins(input) {
|
|
303
|
+
if (closed)
|
|
304
|
+
throw new Error("AgentHub is closed");
|
|
305
|
+
if (!input.targetClientId.trim() || !input.revision.trim()) {
|
|
306
|
+
throw new TypeError("Invalid plugin sync");
|
|
307
|
+
}
|
|
308
|
+
// Protocol round-trip keeps the desired state wire-shaped.
|
|
309
|
+
const downlink = parseHubDownlink({
|
|
310
|
+
type: "plugin.sync",
|
|
311
|
+
revision: input.revision,
|
|
312
|
+
plugins: input.plugins,
|
|
313
|
+
...(input.inventoryQuery ? { inventoryQuery: true } : {}),
|
|
314
|
+
});
|
|
315
|
+
if (!downlink || downlink.type !== "plugin.sync") {
|
|
316
|
+
throw new TypeError("Invalid plugin sync");
|
|
317
|
+
}
|
|
318
|
+
let connected = null;
|
|
319
|
+
for (const connection of sockets.values()) {
|
|
320
|
+
if (connection.clientId === input.targetClientId &&
|
|
321
|
+
Object.is(connection.principal, input.principal)) {
|
|
322
|
+
connected = connection;
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
if (!connected || !active(connected))
|
|
327
|
+
return Promise.resolve({ delivered: false });
|
|
328
|
+
connected.socket.send(JSON.stringify(downlink));
|
|
329
|
+
return Promise.resolve({ delivered: true });
|
|
330
|
+
},
|
|
331
|
+
getInventory(input) {
|
|
332
|
+
// Ownership validation lives in the store, consistent with recordInventory.
|
|
333
|
+
return store.getInventory(input);
|
|
334
|
+
},
|
|
335
|
+
close() {
|
|
336
|
+
if (closePromise)
|
|
337
|
+
return closePromise;
|
|
338
|
+
closed = true;
|
|
339
|
+
attached?.off("request", onRequest);
|
|
340
|
+
attached?.off("upgrade", onUpgrade);
|
|
341
|
+
for (const socket of pendingUpgrades)
|
|
342
|
+
socket.destroy();
|
|
343
|
+
pendingUpgrades.clear();
|
|
344
|
+
for (const socket of wss.clients)
|
|
345
|
+
socket.terminate();
|
|
346
|
+
sockets.clear();
|
|
347
|
+
closePromise = new Promise((resolve) => wss.close(() => resolve()));
|
|
348
|
+
return closePromise;
|
|
349
|
+
},
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=agent-hub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-hub.js","sourceRoot":"","sources":["../../src/hub/agent-hub.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { createAgentHub } from "./agent-hub.js";
|
|
2
|
+
export type { AgentHub, AgentHubOptions, HubAttachOptions, HubAuthorizer, HubClientRecord, HubClientRegistration, HubEventBatch, HubEventIngestResult, HubHeartbeat, HubInventoryReport, HubOfferDelivery, HubOfferInput, HubPluginAcknowledgement, HubStore, StoredOffer, } from "./types.js";
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hub/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,YAAY,EACV,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,wBAAwB,EACxB,QAAQ,EACR,WAAW,GACZ,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hub/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** @internal Test-only volatile Hub helpers. Never use these in a deployed host. */
|
|
2
|
+
export { createMemoryHub, type CreateMemoryHubOptions, type MemoryHub, } from "./memory-hub.js";
|
|
3
|
+
export { MemoryHubStore, type MemoryHubClient, type MemoryHubSnapshot, } from "./memory-store.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hub/testkit/index.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,OAAO,EACL,eAAe,EACf,KAAK,sBAAsB,EAC3B,KAAK,SAAS,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hub/testkit/index.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,OAAO,EACL,eAAe,GAGhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,cAAc,GAGf,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { IncomingMessage } from "node:http";
|
|
2
|
+
import type { AgentHub, AgentHubOptions, HubAuthorizer } from "../types.js";
|
|
3
|
+
import { MemoryHubStore, type MemoryHubSnapshot } from "./memory-store.js";
|
|
4
|
+
export type CreateMemoryHubOptions<Principal = string> = Omit<Partial<AgentHubOptions<Principal>>, "store" | "authorize"> & {
|
|
5
|
+
/** Test-only default credential; generated when omitted. */
|
|
6
|
+
token?: string;
|
|
7
|
+
/** Test-only shorthand that maps an accepted token to that string principal. */
|
|
8
|
+
authorizeToken?: (candidate: string, request: IncomingMessage) => boolean | Promise<boolean>;
|
|
9
|
+
authorize?: HubAuthorizer<Principal>;
|
|
10
|
+
onPluginSyncAcknowledgement?: (clientId: string, acknowledgement: import("../../protocol/index.js").PluginSyncAcknowledgement) => void;
|
|
11
|
+
};
|
|
12
|
+
export type MemoryHub<Principal> = AgentHub<Principal> & {
|
|
13
|
+
/** Test-only, volatile adapter; process restart loses every stored value. */
|
|
14
|
+
readonly store: MemoryHubStore<Principal>;
|
|
15
|
+
readonly token: string;
|
|
16
|
+
listClients: () => ReturnType<MemoryHubStore<Principal>["listClients"]>;
|
|
17
|
+
listEvents: (executionId?: string) => ReturnType<MemoryHubStore<Principal>["listEvents"]>;
|
|
18
|
+
snapshot: () => MemoryHubSnapshot<Principal>;
|
|
19
|
+
restore: (snapshot: MemoryHubSnapshot<Principal>) => void;
|
|
20
|
+
};
|
|
21
|
+
/** @internal Test-only Hub composition. It never owns or starts an HTTP listener. */
|
|
22
|
+
export declare function createMemoryHub<Principal = string>(options?: CreateMemoryHubOptions<Principal>): MemoryHub<Principal>;
|
|
23
|
+
//# sourceMappingURL=memory-hub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-hub.d.ts","sourceRoot":"","sources":["../../../src/hub/testkit/memory-hub.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3E,MAAM,MAAM,sBAAsB,CAAC,SAAS,GAAG,MAAM,IAAI,IAAI,CAC3D,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,EACnC,OAAO,GAAG,WAAW,CACtB,GAAG;IACF,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,cAAc,CAAC,EAAE,CACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,eAAe,KACrB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACrC,2BAA2B,CAAC,EAAE,CAC5B,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,OAAO,yBAAyB,EAAE,yBAAyB,KACzE,IAAI,CAAC;CACX,CAAC;AAEF,MAAM,MAAM,SAAS,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG;IACvD,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;IACxE,UAAU,EAAE,CACV,WAAW,CAAC,EAAE,MAAM,KACjB,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IACzD,QAAQ,EAAE,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC7C,OAAO,EAAE,CAAC,QAAQ,EAAE,iBAAiB,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;CAC3D,CAAC;AAEF,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,SAAS,GAAG,MAAM,EAChD,OAAO,GAAE,sBAAsB,CAAC,SAAS,CAAM,GAC9C,SAAS,CAAC,SAAS,CAAC,CA8BtB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { createAgentHub } from "../agent-hub.js";
|
|
3
|
+
import { MemoryHubStore } from "./memory-store.js";
|
|
4
|
+
/** @internal Test-only Hub composition. It never owns or starts an HTTP listener. */
|
|
5
|
+
export function createMemoryHub(options = {}) {
|
|
6
|
+
const token = options.token ?? `memory-hub-${randomUUID()}`;
|
|
7
|
+
const store = new MemoryHubStore(options.onPluginSyncAcknowledgement);
|
|
8
|
+
const authorize = options.authorize ??
|
|
9
|
+
(async (candidate, request) => {
|
|
10
|
+
if (options.authorizeToken) {
|
|
11
|
+
return (await options.authorizeToken(candidate, request))
|
|
12
|
+
? candidate
|
|
13
|
+
: null;
|
|
14
|
+
}
|
|
15
|
+
return candidate === token ? candidate : null;
|
|
16
|
+
});
|
|
17
|
+
const hub = createAgentHub({
|
|
18
|
+
authorize,
|
|
19
|
+
store,
|
|
20
|
+
pathPrefix: options.pathPrefix,
|
|
21
|
+
maxPayloadBytes: options.maxPayloadBytes,
|
|
22
|
+
});
|
|
23
|
+
return {
|
|
24
|
+
...hub,
|
|
25
|
+
token,
|
|
26
|
+
store,
|
|
27
|
+
listClients: () => store.listClients(),
|
|
28
|
+
listEvents: (executionId) => store.listEvents(executionId),
|
|
29
|
+
snapshot: () => store.snapshot(),
|
|
30
|
+
restore: (snapshot) => store.restore(snapshot),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=memory-hub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-hub.js","sourceRoot":"","sources":["../../../src/hub/testkit/memory-hub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,cAAc,EAA0B,MAAM,mBAAmB,CAAC;AAgC3E,qFAAqF;AACrF,MAAM,UAAU,eAAe,CAC7B,UAA6C,EAAE;IAE/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,cAAc,UAAU,EAAE,EAAE,CAAC;IAC5D,MAAM,KAAK,GAAG,IAAI,cAAc,CAC9B,OAAO,CAAC,2BAA2B,CACpC,CAAC;IACF,MAAM,SAAS,GACb,OAAO,CAAC,SAAS;QACjB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;YAC5B,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBAC3B,OAAO,CAAC,MAAM,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBACvD,CAAC,CAAE,SAAuB;oBAC1B,CAAC,CAAC,IAAI,CAAC;YACX,CAAC;YACD,OAAO,SAAS,KAAK,KAAK,CAAC,CAAC,CAAE,SAAuB,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,MAAM,GAAG,GAAG,cAAc,CAAC;QACzB,SAAS;QACT,KAAK;QACL,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,eAAe,EAAE,OAAO,CAAC,eAAe;KACzC,CAAC,CAAC;IACH,OAAO;QACL,GAAG,GAAG;QACN,KAAK;QACL,KAAK;QACL,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE;QACtC,UAAU,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC;QAC1D,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE;QAChC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;KAC/C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { ClientEvent, InventoryReport, PluginSyncAcknowledgement } from "../../protocol/index.js";
|
|
2
|
+
import type { HubClientRecord, HubClientRegistration, HubEventBatch, HubEventIngestResult, HubHeartbeat, HubInventoryReport, HubOfferDelivery, HubOfferInput, HubPluginAcknowledgement, HubStore, StoredOffer } from "../types.js";
|
|
3
|
+
type MemoryClient<Principal> = HubClientRecord & {
|
|
4
|
+
principal: Principal;
|
|
5
|
+
protocolVersion: number;
|
|
6
|
+
lastSeen: number;
|
|
7
|
+
};
|
|
8
|
+
type MemoryOffer<Principal> = StoredOffer & {
|
|
9
|
+
principal: Principal;
|
|
10
|
+
};
|
|
11
|
+
export type MemoryHubSnapshot<Principal> = {
|
|
12
|
+
/** Test-only process memory. It is intentionally lost on process restart. */
|
|
13
|
+
clients: Array<MemoryClient<Principal>>;
|
|
14
|
+
offers: Array<MemoryOffer<Principal>>;
|
|
15
|
+
events: ClientEvent[];
|
|
16
|
+
seenEventSequences: Array<[string, number[]]>;
|
|
17
|
+
watermarks: Record<string, number>;
|
|
18
|
+
inventory: Array<[string, InventoryReport]>;
|
|
19
|
+
nextConnectionKey: number;
|
|
20
|
+
};
|
|
21
|
+
export type MemoryHubClient = Omit<MemoryClient<unknown>, "principal"> & {
|
|
22
|
+
pendingOutboxCount: number;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* A deliberately volatile HubStore adapter for protocol tests only.
|
|
26
|
+
*
|
|
27
|
+
* Registrations, offers, events, and acknowledgement state are held in Maps
|
|
28
|
+
* and arrays, so a process restart loses all of them. Production hosts must
|
|
29
|
+
* implement HubStore with their own durable storage.
|
|
30
|
+
*/
|
|
31
|
+
export declare class MemoryHubStore<Principal> implements HubStore<Principal> {
|
|
32
|
+
private readonly onPluginSyncAcknowledgement?;
|
|
33
|
+
private readonly clients;
|
|
34
|
+
private offers;
|
|
35
|
+
private readonly events;
|
|
36
|
+
private readonly seenEventSequences;
|
|
37
|
+
private readonly watermarks;
|
|
38
|
+
private readonly inventory;
|
|
39
|
+
private nextConnectionKey;
|
|
40
|
+
constructor(onPluginSyncAcknowledgement?: ((clientId: string, acknowledgement: PluginSyncAcknowledgement) => void) | undefined);
|
|
41
|
+
registerClient(input: HubClientRegistration<Principal>): Promise<HubClientRecord>;
|
|
42
|
+
heartbeat(input: HubHeartbeat<Principal>): Promise<void>;
|
|
43
|
+
listPendingOffers(input: HubOfferDelivery<Principal>): Promise<StoredOffer[]>;
|
|
44
|
+
enqueueOffer(input: HubOfferInput<Principal>): Promise<StoredOffer>;
|
|
45
|
+
ingestEvents(input: HubEventBatch<Principal>): Promise<HubEventIngestResult>;
|
|
46
|
+
acknowledgePluginSync(input: HubPluginAcknowledgement<Principal>): Promise<void>;
|
|
47
|
+
recordInventory(input: HubInventoryReport<Principal>): Promise<void>;
|
|
48
|
+
getInventory(input: {
|
|
49
|
+
principal: Principal;
|
|
50
|
+
clientId: string;
|
|
51
|
+
}): Promise<InventoryReport | null>;
|
|
52
|
+
listClients(): MemoryHubClient[];
|
|
53
|
+
listEvents(executionId?: string): ClientEvent[];
|
|
54
|
+
snapshot(): MemoryHubSnapshot<Principal>;
|
|
55
|
+
restore(snapshot: MemoryHubSnapshot<Principal>): void;
|
|
56
|
+
private ensureClient;
|
|
57
|
+
private assertClient;
|
|
58
|
+
private clientKey;
|
|
59
|
+
private publicOffer;
|
|
60
|
+
}
|
|
61
|
+
export {};
|
|
62
|
+
//# sourceMappingURL=memory-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../../../src/hub/testkit/memory-store.ts"],"names":[],"mappings":"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"}
|