@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,186 @@
|
|
|
1
|
+
import { bridgeLog } from "../../logger.js";
|
|
2
|
+
const TERMINAL_EVENT_TYPES = new Set([
|
|
3
|
+
"done",
|
|
4
|
+
"failed",
|
|
5
|
+
"cancelled",
|
|
6
|
+
"recovery_required",
|
|
7
|
+
"rejected",
|
|
8
|
+
]);
|
|
9
|
+
/**
|
|
10
|
+
* A deliberately volatile HubStore adapter for protocol tests only.
|
|
11
|
+
*
|
|
12
|
+
* Registrations, offers, events, and acknowledgement state are held in Maps
|
|
13
|
+
* and arrays, so a process restart loses all of them. Production hosts must
|
|
14
|
+
* implement HubStore with their own durable storage.
|
|
15
|
+
*/
|
|
16
|
+
export class MemoryHubStore {
|
|
17
|
+
onPluginSyncAcknowledgement;
|
|
18
|
+
clients = new Map();
|
|
19
|
+
offers = [];
|
|
20
|
+
events = new Map();
|
|
21
|
+
seenEventSequences = new Map();
|
|
22
|
+
watermarks = new Map();
|
|
23
|
+
inventory = new Map();
|
|
24
|
+
nextConnectionKey = 1;
|
|
25
|
+
constructor(onPluginSyncAcknowledgement) {
|
|
26
|
+
this.onPluginSyncAcknowledgement = onPluginSyncAcknowledgement;
|
|
27
|
+
}
|
|
28
|
+
async registerClient(input) {
|
|
29
|
+
const existing = this.clients.get(input.clientId);
|
|
30
|
+
if (existing && !Object.is(existing.principal, input.principal)) {
|
|
31
|
+
throw new Error("client ownership conflict");
|
|
32
|
+
}
|
|
33
|
+
const client = existing ?? {
|
|
34
|
+
clientId: input.clientId,
|
|
35
|
+
connectionKey: `memory:${this.nextConnectionKey++}:${input.clientId}`,
|
|
36
|
+
principal: input.principal,
|
|
37
|
+
protocolVersion: input.protocolVersion,
|
|
38
|
+
lastSeen: Date.now(),
|
|
39
|
+
};
|
|
40
|
+
client.protocolVersion = input.protocolVersion;
|
|
41
|
+
client.lastSeen = Date.now();
|
|
42
|
+
this.clients.set(input.clientId, client);
|
|
43
|
+
bridgeLog.info("memory-hub", "test client registered", {
|
|
44
|
+
clientId: input.clientId,
|
|
45
|
+
});
|
|
46
|
+
return { clientId: client.clientId, connectionKey: client.connectionKey };
|
|
47
|
+
}
|
|
48
|
+
async heartbeat(input) {
|
|
49
|
+
const client = this.assertClient(input.principal, input.clientId);
|
|
50
|
+
client.lastSeen = Date.now();
|
|
51
|
+
}
|
|
52
|
+
async listPendingOffers(input) {
|
|
53
|
+
const client = this.assertClient(input.principal, input.clientId);
|
|
54
|
+
return this.offers
|
|
55
|
+
.filter((offer) => offer.connectionKey === client.connectionKey &&
|
|
56
|
+
Object.is(offer.principal, input.principal))
|
|
57
|
+
.map(({ principal: _principal, ...offer }) => offer);
|
|
58
|
+
}
|
|
59
|
+
async enqueueOffer(input) {
|
|
60
|
+
const client = this.ensureClient(input.principal, input.targetClientId);
|
|
61
|
+
const duplicate = this.offers.find((offer) => offer.connectionKey === client.connectionKey &&
|
|
62
|
+
offer.command.commandId === input.command.commandId);
|
|
63
|
+
if (duplicate)
|
|
64
|
+
return this.publicOffer(duplicate);
|
|
65
|
+
const offer = {
|
|
66
|
+
offerId: input.command.commandId,
|
|
67
|
+
targetClientId: input.targetClientId,
|
|
68
|
+
connectionKey: client.connectionKey,
|
|
69
|
+
command: input.command,
|
|
70
|
+
principal: input.principal,
|
|
71
|
+
};
|
|
72
|
+
this.offers.push(offer);
|
|
73
|
+
return this.publicOffer(offer);
|
|
74
|
+
}
|
|
75
|
+
async ingestEvents(input) {
|
|
76
|
+
this.assertClient(input.principal, input.clientId);
|
|
77
|
+
const result = {};
|
|
78
|
+
for (const event of input.events) {
|
|
79
|
+
const seen = this.seenEventSequences.get(event.executionId) ?? new Set();
|
|
80
|
+
this.seenEventSequences.set(event.executionId, seen);
|
|
81
|
+
const key = `${event.executionId}:${event.eventSeq}`;
|
|
82
|
+
if (!seen.has(event.eventSeq)) {
|
|
83
|
+
seen.add(event.eventSeq);
|
|
84
|
+
this.events.set(key, event);
|
|
85
|
+
}
|
|
86
|
+
let watermark = this.watermarks.get(event.executionId) ?? 0;
|
|
87
|
+
while (seen.has(watermark + 1))
|
|
88
|
+
watermark += 1;
|
|
89
|
+
this.watermarks.set(event.executionId, watermark);
|
|
90
|
+
result[event.executionId] = watermark;
|
|
91
|
+
if (event.eventSeq <= watermark && event.type === "received") {
|
|
92
|
+
this.offers = this.offers.filter((offer) => !(offer.connectionKey === this.clientKey(input.clientId) &&
|
|
93
|
+
offer.command.executionId === event.executionId &&
|
|
94
|
+
offer.command.kind !== "cancel"));
|
|
95
|
+
}
|
|
96
|
+
if (event.eventSeq <= watermark && TERMINAL_EVENT_TYPES.has(event.type)) {
|
|
97
|
+
this.offers = this.offers.filter((offer) => !(offer.connectionKey === this.clientKey(input.clientId) &&
|
|
98
|
+
offer.command.executionId === event.executionId &&
|
|
99
|
+
offer.command.kind === "cancel"));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
async acknowledgePluginSync(input) {
|
|
105
|
+
this.assertClient(input.principal, input.clientId);
|
|
106
|
+
this.onPluginSyncAcknowledgement?.(input.clientId, input.acknowledgement);
|
|
107
|
+
}
|
|
108
|
+
async recordInventory(input) {
|
|
109
|
+
this.assertClient(input.principal, input.clientId);
|
|
110
|
+
this.inventory.set(input.clientId, input.report);
|
|
111
|
+
bridgeLog.info("memory-hub", "test inventory recorded", {
|
|
112
|
+
clientId: input.clientId,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
async getInventory(input) {
|
|
116
|
+
this.assertClient(input.principal, input.clientId);
|
|
117
|
+
return this.inventory.get(input.clientId) ?? null;
|
|
118
|
+
}
|
|
119
|
+
listClients() {
|
|
120
|
+
return [...this.clients.values()].map(({ principal: _principal, ...client }) => ({
|
|
121
|
+
...client,
|
|
122
|
+
pendingOutboxCount: this.offers.filter((offer) => offer.connectionKey === client.connectionKey).length,
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
listEvents(executionId) {
|
|
126
|
+
return [...this.events.values()].filter((event) => !executionId || event.executionId === executionId);
|
|
127
|
+
}
|
|
128
|
+
snapshot() {
|
|
129
|
+
return {
|
|
130
|
+
clients: [...this.clients.values()].map((client) => ({ ...client })),
|
|
131
|
+
offers: this.offers.map((offer) => ({ ...offer })),
|
|
132
|
+
events: this.listEvents().map((event) => ({ ...event })),
|
|
133
|
+
seenEventSequences: [...this.seenEventSequences.entries()].map(([executionId, sequences]) => [executionId, [...sequences]]),
|
|
134
|
+
watermarks: Object.fromEntries(this.watermarks),
|
|
135
|
+
inventory: [...this.inventory.entries()].map(([clientId, report]) => [clientId, { ...report }]),
|
|
136
|
+
nextConnectionKey: this.nextConnectionKey,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
restore(snapshot) {
|
|
140
|
+
this.clients.clear();
|
|
141
|
+
snapshot.clients.forEach((client) => this.clients.set(client.clientId, { ...client }));
|
|
142
|
+
this.offers = snapshot.offers.map((offer) => ({ ...offer }));
|
|
143
|
+
this.events.clear();
|
|
144
|
+
snapshot.events.forEach((event) => this.events.set(`${event.executionId}:${event.eventSeq}`, { ...event }));
|
|
145
|
+
this.seenEventSequences.clear();
|
|
146
|
+
snapshot.seenEventSequences.forEach(([executionId, sequences]) => this.seenEventSequences.set(executionId, new Set(sequences)));
|
|
147
|
+
this.watermarks.clear();
|
|
148
|
+
Object.entries(snapshot.watermarks).forEach(([executionId, watermark]) => this.watermarks.set(executionId, watermark));
|
|
149
|
+
this.inventory.clear();
|
|
150
|
+
snapshot.inventory.forEach(([clientId, report]) => this.inventory.set(clientId, { ...report }));
|
|
151
|
+
this.nextConnectionKey = snapshot.nextConnectionKey;
|
|
152
|
+
}
|
|
153
|
+
ensureClient(principal, clientId) {
|
|
154
|
+
const existing = this.clients.get(clientId);
|
|
155
|
+
if (existing) {
|
|
156
|
+
if (!Object.is(existing.principal, principal))
|
|
157
|
+
throw new Error("client ownership conflict");
|
|
158
|
+
return existing;
|
|
159
|
+
}
|
|
160
|
+
const client = {
|
|
161
|
+
clientId,
|
|
162
|
+
connectionKey: `memory:${this.nextConnectionKey++}:${clientId}`,
|
|
163
|
+
principal,
|
|
164
|
+
protocolVersion: 2,
|
|
165
|
+
lastSeen: Date.now(),
|
|
166
|
+
};
|
|
167
|
+
this.clients.set(clientId, client);
|
|
168
|
+
return client;
|
|
169
|
+
}
|
|
170
|
+
assertClient(principal, clientId) {
|
|
171
|
+
const client = this.clients.get(clientId);
|
|
172
|
+
if (!client || !Object.is(client.principal, principal))
|
|
173
|
+
throw new Error("client ownership conflict");
|
|
174
|
+
return client;
|
|
175
|
+
}
|
|
176
|
+
clientKey(clientId) {
|
|
177
|
+
const client = this.clients.get(clientId);
|
|
178
|
+
if (!client)
|
|
179
|
+
throw new Error("unknown client");
|
|
180
|
+
return client.connectionKey;
|
|
181
|
+
}
|
|
182
|
+
publicOffer({ principal: _principal, ...offer }) {
|
|
183
|
+
return offer;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=memory-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../../src/hub/testkit/memory-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import type { IncomingMessage, Server, ServerResponse } from "node:http";
|
|
2
|
+
import type { Duplex } from "node:stream";
|
|
3
|
+
import type { ClientCommand, ClientEventBatch, ClientHello, HubEventAcknowledgement, InventoryReport, PluginConfig, PluginSyncAcknowledgement } from "../protocol/index.js";
|
|
4
|
+
/** Principal is opaque: the Hub never serializes it or derives it from client input. */
|
|
5
|
+
export type HubAuthorizer<Principal> = (token: string, request: IncomingMessage) => Promise<Principal | null>;
|
|
6
|
+
export interface HubClientRegistration<Principal> {
|
|
7
|
+
principal: Principal;
|
|
8
|
+
clientId: ClientHello["clientId"];
|
|
9
|
+
protocolVersion: ClientHello["protocolVersion"];
|
|
10
|
+
}
|
|
11
|
+
export interface HubClientRecord {
|
|
12
|
+
clientId: string;
|
|
13
|
+
/** Host-issued stable opaque key, unique per authorized owner/client pair. Never on wire. */
|
|
14
|
+
connectionKey: string;
|
|
15
|
+
}
|
|
16
|
+
export interface HubHeartbeat<Principal> {
|
|
17
|
+
principal: Principal;
|
|
18
|
+
clientId: string;
|
|
19
|
+
}
|
|
20
|
+
export interface HubOfferInput<Principal> {
|
|
21
|
+
principal: Principal;
|
|
22
|
+
targetClientId: string;
|
|
23
|
+
command: ClientCommand;
|
|
24
|
+
}
|
|
25
|
+
export interface StoredOffer {
|
|
26
|
+
offerId: string;
|
|
27
|
+
targetClientId: string;
|
|
28
|
+
/** Must match the target's registerClient key. Never on wire. */
|
|
29
|
+
connectionKey: string;
|
|
30
|
+
command: ClientCommand;
|
|
31
|
+
}
|
|
32
|
+
export interface HubOfferDelivery<Principal> {
|
|
33
|
+
principal: Principal;
|
|
34
|
+
clientId: string;
|
|
35
|
+
}
|
|
36
|
+
export interface HubEventBatch<Principal> {
|
|
37
|
+
principal: Principal;
|
|
38
|
+
clientId: string;
|
|
39
|
+
events: ClientEventBatch["events"];
|
|
40
|
+
}
|
|
41
|
+
export type HubEventIngestResult = HubEventAcknowledgement["watermarks"];
|
|
42
|
+
export interface HubPluginAcknowledgement<Principal> {
|
|
43
|
+
principal: Principal;
|
|
44
|
+
clientId: string;
|
|
45
|
+
acknowledgement: PluginSyncAcknowledgement;
|
|
46
|
+
}
|
|
47
|
+
export interface HubInventoryReport<Principal> {
|
|
48
|
+
principal: Principal;
|
|
49
|
+
clientId: string;
|
|
50
|
+
report: InventoryReport;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* All methods enforce host-owned authorization for principal/clientId.
|
|
54
|
+
* registerClient must reject ownership conflicts, even without a live socket.
|
|
55
|
+
* connectionKey stays stable across registration and enqueueOffer; the Hub
|
|
56
|
+
* cannot compare opaque principals to establish ownership.
|
|
57
|
+
*/
|
|
58
|
+
export interface HubStore<Principal> {
|
|
59
|
+
registerClient(input: HubClientRegistration<Principal>): Promise<HubClientRecord>;
|
|
60
|
+
heartbeat(input: HubHeartbeat<Principal>): Promise<void>;
|
|
61
|
+
/** Return only authorized unacknowledged offers, in durable delivery order. */
|
|
62
|
+
listPendingOffers(input: HubOfferDelivery<Principal>): Promise<StoredOffer[]>;
|
|
63
|
+
/** Commit before resolving and deduplicate immutable command identities. */
|
|
64
|
+
enqueueOffer(input: HubOfferInput<Principal>): Promise<StoredOffer>;
|
|
65
|
+
/**
|
|
66
|
+
* Deduplicate (executionId,eventSeq), persist events, return contiguous stored
|
|
67
|
+
* watermarks. Retire run offers on received, cancel offers on terminal events.
|
|
68
|
+
* Never acknowledge events before durable commit.
|
|
69
|
+
*/
|
|
70
|
+
ingestEvents(input: HubEventBatch<Principal>): Promise<HubEventIngestResult>;
|
|
71
|
+
acknowledgePluginSync(input: HubPluginAcknowledgement<Principal>): Promise<void>;
|
|
72
|
+
/** Persist the latest inventory report; ownership must be enforced here. */
|
|
73
|
+
recordInventory(input: HubInventoryReport<Principal>): Promise<void>;
|
|
74
|
+
/** Return the client's latest report, or null when the store has none. */
|
|
75
|
+
getInventory(input: {
|
|
76
|
+
principal: Principal;
|
|
77
|
+
clientId: string;
|
|
78
|
+
}): Promise<InventoryReport | null>;
|
|
79
|
+
}
|
|
80
|
+
export interface AgentHubOptions<Principal> {
|
|
81
|
+
authorize: HubAuthorizer<Principal>;
|
|
82
|
+
store: HubStore<Principal>;
|
|
83
|
+
/** Default /api/agent-hub/v2; absolute path without trailing slash. */
|
|
84
|
+
pathPrefix?: string;
|
|
85
|
+
maxPayloadBytes?: number;
|
|
86
|
+
}
|
|
87
|
+
export interface HubAttachOptions {
|
|
88
|
+
/** Supply the application's handler; attach to a server without request handlers. */
|
|
89
|
+
fallback?: (request: IncomingMessage, response: ServerResponse) => void;
|
|
90
|
+
onUnknownUpgrade?: (request: IncomingMessage, socket: Duplex, head: Buffer) => void;
|
|
91
|
+
}
|
|
92
|
+
export interface AgentHub<Principal> {
|
|
93
|
+
/** Attach once; the caller owns listen() and closing the HTTP server. */
|
|
94
|
+
attach(server: Server, options?: HubAttachOptions): void;
|
|
95
|
+
offer(input: HubOfferInput<Principal>): Promise<StoredOffer>;
|
|
96
|
+
/**
|
|
97
|
+
* Push desired plugin state to a connected client. Offline or unknown
|
|
98
|
+
* clients reject; hosts re-push on the client's next registration.
|
|
99
|
+
*/
|
|
100
|
+
syncPlugins(input: {
|
|
101
|
+
principal: Principal;
|
|
102
|
+
targetClientId: string;
|
|
103
|
+
revision: string;
|
|
104
|
+
plugins: PluginConfig[];
|
|
105
|
+
/** Ask the client to answer with an inventory.report. */
|
|
106
|
+
inventoryQuery?: boolean;
|
|
107
|
+
}): Promise<{
|
|
108
|
+
delivered: boolean;
|
|
109
|
+
}>;
|
|
110
|
+
/** Latest inventory report for a client; ownership is enforced in the store. */
|
|
111
|
+
getInventory(input: {
|
|
112
|
+
principal: Principal;
|
|
113
|
+
clientId: string;
|
|
114
|
+
}): Promise<InventoryReport | null>;
|
|
115
|
+
/** Detach handlers and close Hub sockets without closing the caller's server. */
|
|
116
|
+
close(): Promise<void>;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/hub/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/hub/types.ts"],"names":[],"mappings":""}
|
package/dist/hub.d.ts
CHANGED
|
@@ -1,83 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import type { ClientCommand, ClientEvent, PluginSyncAcknowledgement } from "./client/types.js";
|
|
4
|
-
export declare const HUB_HEARTBEAT_STALE_MS: number;
|
|
5
|
-
/** Compatibility-only HTTP registration record; it is not an executor. */
|
|
6
|
-
export type MemoryHubRuntime = {
|
|
7
|
-
runtimeId: string;
|
|
8
|
-
displayName: string;
|
|
9
|
-
protocolVersion: number;
|
|
10
|
-
registeredAt: number;
|
|
11
|
-
lastSeen: number;
|
|
12
|
-
};
|
|
13
|
-
export type MemoryHubClient = {
|
|
14
|
-
clientId: string;
|
|
15
|
-
protocolVersion: typeof AGENT_CLIENT_PROTOCOL_VERSION;
|
|
16
|
-
connectedAt: number;
|
|
17
|
-
lastSeen: number;
|
|
18
|
-
online: boolean;
|
|
19
|
-
pendingOutboxCount: number;
|
|
20
|
-
};
|
|
21
|
-
export type MemoryHubOptions = {
|
|
22
|
-
/** Shared Hub token; generated when omitted (read it from hub.token). */
|
|
23
|
-
token?: string;
|
|
24
|
-
/** Nodes silent longer than this are reported stale (default 90s). */
|
|
25
|
-
staleMs?: number;
|
|
26
|
-
/** Push hook for embedded-Hub audit events. */
|
|
27
|
-
onRuntimeEvents?: (runtimeId: string, events: HubRuntimeEvent[]) => void;
|
|
28
|
-
/** Push hook for compatibility registration events. */
|
|
29
|
-
onRegister?: (runtime: MemoryHubRuntime) => void;
|
|
30
|
-
/** Receives the strict v2 acknowledgement for a local plugin desired-state revision. */
|
|
31
|
-
onPluginSyncAcknowledgement?: (clientId: string, acknowledgement: PluginSyncAcknowledgement) => void;
|
|
32
|
-
/** Replace the process-wide client logger before the Hub starts. */
|
|
33
|
-
logger?: import("./logger.js").BridgeLogger;
|
|
34
|
-
/**
|
|
35
|
-
* Custom token check for HTTP + WS auth (for example a DB-backed per-user
|
|
36
|
-
* credential lookup). It may be asynchronous and is awaited at every gate.
|
|
37
|
-
*/
|
|
38
|
-
authorizeToken?: (candidate: string, req: http.IncomingMessage) => boolean | Promise<boolean>;
|
|
39
|
-
/** Max WS message bytes (default 1 MiB); guards the public exposure surface. */
|
|
40
|
-
maxPayloadBytes?: number;
|
|
41
|
-
};
|
|
42
|
-
/** A durable offer is retained until the Client reports the required state. */
|
|
43
|
-
type ClientOffer = {
|
|
44
|
-
offerId: string;
|
|
45
|
-
targetClientId: string;
|
|
46
|
-
command: ClientCommand;
|
|
47
|
-
};
|
|
48
|
-
export type MemoryHubSnapshot = {
|
|
49
|
-
runtimes: MemoryHubRuntime[];
|
|
50
|
-
watermark: Record<string, Record<string, number>>;
|
|
51
|
-
clients?: Omit<MemoryHubClient, "online" | "pendingOutboxCount">[];
|
|
52
|
-
offers?: ClientOffer[];
|
|
53
|
-
executionWatermarks?: Record<string, number>;
|
|
54
|
-
};
|
|
55
|
-
export type MemoryHub = ReturnType<typeof createMemoryHub>;
|
|
56
|
-
export declare function createMemoryHub(options?: MemoryHubOptions): {
|
|
57
|
-
token: string;
|
|
58
|
-
handle: (req: http.IncomingMessage, res: http.ServerResponse) => Promise<boolean>;
|
|
59
|
-
attach: (server: http.Server, opts?: {
|
|
60
|
-
fallback?: (req: http.IncomingMessage, res: http.ServerResponse) => void;
|
|
61
|
-
onUnknownUpgrade?: (req: http.IncomingMessage, socket: import("node:stream").Duplex, head: Buffer) => void;
|
|
62
|
-
authorizeToken?: (candidate: string, req: http.IncomingMessage) => boolean | Promise<boolean>;
|
|
63
|
-
}) => void;
|
|
64
|
-
start: (host?: string, port?: number) => Promise<{
|
|
65
|
-
port: number;
|
|
66
|
-
close: () => Promise<void>;
|
|
67
|
-
}>;
|
|
68
|
-
offer: (targetClientId: string, command: ClientCommand) => void;
|
|
69
|
-
receiveEvents: (clientId: string, events: ClientEvent[]) => Record<string, number>;
|
|
70
|
-
listRuntimes: () => Array<MemoryHubRuntime & {
|
|
71
|
-
online: boolean;
|
|
72
|
-
stale: boolean;
|
|
73
|
-
}>;
|
|
74
|
-
listClients: () => MemoryHubClient[];
|
|
75
|
-
events: (runtimeId: string) => HubRuntimeEvent[];
|
|
76
|
-
clientEvents: (executionId: string) => ClientEvent[];
|
|
77
|
-
watermark: () => MemoryHubSnapshot["watermark"];
|
|
78
|
-
snapshot: () => MemoryHubSnapshot;
|
|
79
|
-
restore: (state: MemoryHubSnapshot) => void;
|
|
80
|
-
stop: () => void;
|
|
81
|
-
};
|
|
82
|
-
export {};
|
|
1
|
+
/** @deprecated Import the production Hub from the package's /hub subpath. */
|
|
2
|
+
export * from "./hub/index.js";
|
|
83
3
|
//# sourceMappingURL=hub.d.ts.map
|
package/dist/hub.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hub.d.ts","sourceRoot":"","sources":["../src/hub.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hub.d.ts","sourceRoot":"","sources":["../src/hub.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,cAAc,gBAAgB,CAAC"}
|