agl 40.5.1 → 40.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/changelog.md +10 -0
- package/dist_serve/bundle.js +1 -1
- package/dist_serve/bundle.js.map +2 -2
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.aglhome.d.ts +5 -0
- package/dist_ts/classes.aglhome.js +2 -1
- package/dist_ts/classes.authstore.js +5 -1
- package/dist_ts/classes.controller.js +11 -2
- package/dist_ts/classes.inferencegateway.d.ts +35 -1
- package/dist_ts/classes.inferencegateway.js +86 -26
- package/dist_ts/classes.inferenceservice.d.ts +4 -2
- package/dist_ts/classes.inferenceservice.js +5 -4
- package/dist_ts/classes.proxycontrol.d.ts +58 -4
- package/dist_ts/classes.proxycontrol.js +23 -44
- package/dist_ts/classes.proxycontrolclient.d.ts +15 -5
- package/dist_ts/classes.proxycontrolclient.js +67 -17
- package/dist_ts/classes.proxydaemon.d.ts +22 -3
- package/dist_ts/classes.proxydaemon.js +73 -12
- package/dist_ts/classes.proxyleaseholder.d.ts +43 -14
- package/dist_ts/classes.proxyleaseholder.js +66 -22
- package/dist_ts/classes.proxystore.d.ts +9 -0
- package/dist_ts/classes.proxystore.js +15 -7
- package/dist_ts/classes.workercallerbindings.d.ts +66 -0
- package/dist_ts/classes.workercallerbindings.js +211 -0
- package/dist_ts/classes.workercallers.d.ts +63 -2
- package/dist_ts/classes.workercallers.js +430 -65
- package/dist_ts/fleet/classes.workerlaunches.d.ts +12 -5
- package/dist_ts/fleet/classes.workerlaunches.js +25 -19
- package/dist_ts/fleet/classes.workers.d.ts +17 -0
- package/dist_ts/fleet/classes.workers.js +74 -1
- package/dist_ts/functions.inferencecli.d.ts +3 -2
- package/dist_ts/functions.inferencecli.js +67 -5
- package/dist_ts/functions.inferencecliarguments.d.ts +6 -2
- package/dist_ts/functions.inferencecliarguments.js +29 -2
- package/dist_ts/functions.inferencelaunch.d.ts +24 -0
- package/dist_ts/functions.inferencelaunch.js +42 -2
- package/dist_ts/functions.proxycontract.d.ts +11 -0
- package/dist_ts/functions.proxycontract.js +12 -1
- package/dist_ts/functions.proxysocket.d.ts +6 -0
- package/dist_ts/functions.proxysocket.js +46 -0
- package/dist_ts/functions.workerprocessproof.d.ts +6 -0
- package/dist_ts/functions.workerprocessproof.js +28 -4
- package/dist_ts_interfaces/workercallers.d.ts +43 -4
- package/package.json +1 -1
- package/readme.md +102 -13
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.aglhome.ts +6 -0
- package/ts/classes.authstore.ts +4 -0
- package/ts/classes.controller.ts +10 -1
- package/ts/classes.inferencegateway.ts +104 -23
- package/ts/classes.inferenceservice.ts +6 -3
- package/ts/classes.proxycontrol.ts +76 -39
- package/ts/classes.proxycontrolclient.ts +72 -20
- package/ts/classes.proxydaemon.ts +85 -15
- package/ts/classes.proxyleaseholder.ts +84 -28
- package/ts/classes.proxystore.ts +16 -5
- package/ts/classes.workercallerbindings.ts +147 -0
- package/ts/classes.workercallers.ts +410 -59
- package/ts/fleet/classes.workerlaunches.ts +23 -15
- package/ts/fleet/classes.workers.ts +51 -1
- package/ts/functions.inferencecli.ts +61 -7
- package/ts/functions.inferencecliarguments.ts +32 -1
- package/ts/functions.inferencelaunch.ts +49 -2
- package/ts/functions.proxycontract.ts +12 -0
- package/ts/functions.proxysocket.ts +39 -0
- package/ts/functions.workerprocessproof.ts +27 -4
- package/ts_interfaces/workercallers.ts +32 -4
- package/ts_web/00_commitinfo_data.ts +1 -1
|
@@ -15,6 +15,11 @@ export interface IAglProxyDaemonOptions {
|
|
|
15
15
|
limits?: IInferenceGatewayLimits;
|
|
16
16
|
/** How long a lease kept across a restart waits for its holder; `proxyLeaseReclaimWindowMs` unless a test shortens it. */
|
|
17
17
|
leaseReclaimWindowMs?: number;
|
|
18
|
+
/**
|
|
19
|
+
* The confined listener's socket, alone in its directory (`IAGLHomePaths.proxyConfinedSocket`); unset, the proxy has no
|
|
20
|
+
* confined listener and refuses confined runs.
|
|
21
|
+
*/
|
|
22
|
+
confinedSocketPath?: string;
|
|
18
23
|
}
|
|
19
24
|
/**
|
|
20
25
|
* How long a restarted proxy serves a lease an earlier run issued before its holder takes it back, counted from the
|
|
@@ -23,9 +28,10 @@ export interface IAglProxyDaemonOptions {
|
|
|
23
28
|
*/
|
|
24
29
|
export declare const proxyLeaseReclaimWindowMs = 60000;
|
|
25
30
|
/**
|
|
26
|
-
* The permanent proxy: one loopback listener, one credential per client,
|
|
27
|
-
* a client its credential
|
|
28
|
-
*
|
|
31
|
+
* The permanent proxy: one loopback listener, one credential per client, a confined listener for Claude Code in
|
|
32
|
+
* containers, and a private control socket that hands a client its credential, a child a lease and a confined run its
|
|
33
|
+
* credential. The control socket is claimed first; it is the proof that no other proxy runs for this AGL home, so the
|
|
34
|
+
* proxy's database is opened by this process alone.
|
|
29
35
|
*/
|
|
30
36
|
export declare class AglProxyDaemon {
|
|
31
37
|
private readonly options;
|
|
@@ -77,6 +83,19 @@ export declare class AglProxyDaemon {
|
|
|
77
83
|
* an unknown credential from an expired or a held one. The credential is looked up by its SHA-256 digest: a match
|
|
78
84
|
* proves the caller holds the credential the lease was issued with.
|
|
79
85
|
*/
|
|
86
|
+
/**
|
|
87
|
+
* A confined run's credential (see `IReq_AglProxyConfined`): a lease of the Claude pool that continues the confined
|
|
88
|
+
* client's sessions and is accepted on the confined listener alone. It is kept, as its digest, before it is handed out,
|
|
89
|
+
* and ends when its holder's connection closes or the operator ends it (`confinedEnd`). No model list is read for it:
|
|
90
|
+
* Claude Code reads the pool's models through the confined listener, and the pool is judged at each request.
|
|
91
|
+
*/
|
|
92
|
+
private confined;
|
|
93
|
+
/**
|
|
94
|
+
* Ends a confined run's credential at once, held or waiting for its holder: the gateway refuses it from now on, and
|
|
95
|
+
* its requests in flight end. The holder's connection is closed with the reason, so it stops its container instead of
|
|
96
|
+
* taking the credential back.
|
|
97
|
+
*/
|
|
98
|
+
private confinedEnd;
|
|
80
99
|
private reclaim;
|
|
81
100
|
/**
|
|
82
101
|
* Serves the leases an earlier run kept, each until its holder takes it back or its reclaim window ends. A request
|
|
@@ -3,7 +3,7 @@ import { commitinfo } from './00_commitinfo_data.js';
|
|
|
3
3
|
import { InferenceService } from './classes.inferenceservice.js';
|
|
4
4
|
import { inferenceGatewayCredentialDigest } from './classes.inferencegateway.js';
|
|
5
5
|
import { InferenceRoutingError } from './classes.inferencerouter.js';
|
|
6
|
-
import { proxyClientNamePattern } from './functions.proxycontract.js';
|
|
6
|
+
import { aglProxyConfinedClient, aglProxyConfinedOrigin, proxyClientNamePattern } from './functions.proxycontract.js';
|
|
7
7
|
import { AglProxyControlRefusal, AglProxyControlServer } from './classes.proxycontrol.js';
|
|
8
8
|
import { ProxyStore } from './classes.proxystore.js';
|
|
9
9
|
import { prepareProxyCredentialDirectory, proxyCredentialFile, removeProxyCredentialFile, writeProxyCredentialFile } from './functions.proxycredentialfile.js';
|
|
@@ -18,10 +18,15 @@ export const proxyLeaseReclaimWindowMs = 60_000;
|
|
|
18
18
|
* act on -- `account_needs_login` asks for a sign-in, not for the proxy.
|
|
19
19
|
*/
|
|
20
20
|
const catalogRefusal = (errorArg) => new AglProxyControlRefusal(errorArg instanceof Error ? errorArg.message : 'No model catalog is available.', errorArg instanceof InferenceRoutingError ? errorArg.code : undefined);
|
|
21
|
+
/** The policy of every confined run's credential: the Claude pool, unrestricted, as Claude Code's own lease. */
|
|
22
|
+
const confinedPolicy = Object.freeze({ provider: 'anthropic' });
|
|
23
|
+
/** A confined run's id, as the operator names it: the first 12 hex characters of its credential's digest. */
|
|
24
|
+
const confinedRunId = (digestArg) => digestArg.slice(0, 12);
|
|
21
25
|
/**
|
|
22
|
-
* The permanent proxy: one loopback listener, one credential per client,
|
|
23
|
-
* a client its credential
|
|
24
|
-
*
|
|
26
|
+
* The permanent proxy: one loopback listener, one credential per client, a confined listener for Claude Code in
|
|
27
|
+
* containers, and a private control socket that hands a client its credential, a child a lease and a confined run its
|
|
28
|
+
* credential. The control socket is claimed first; it is the proof that no other proxy runs for this AGL home, so the
|
|
29
|
+
* proxy's database is opened by this process alone.
|
|
25
30
|
*/
|
|
26
31
|
export class AglProxyDaemon {
|
|
27
32
|
options;
|
|
@@ -65,7 +70,8 @@ export class AglProxyDaemon {
|
|
|
65
70
|
port: this.options.port, signatureKey: identity.signatureKey, affinity: this.store.affinity(),
|
|
66
71
|
placements: this.store.placements(), usageLedger: this.usage, spendStore: this.store.spend(),
|
|
67
72
|
...(this.options.providerFetch ? { providerFetch: this.options.providerFetch } : {}),
|
|
68
|
-
...(this.options.limits ? { limits: this.options.limits } : {})
|
|
73
|
+
...(this.options.limits ? { limits: this.options.limits } : {}),
|
|
74
|
+
...(this.options.confinedSocketPath === undefined ? {} : { confinedSocketPath: this.options.confinedSocketPath }) });
|
|
69
75
|
const baseUrl = await this.service.start(signal);
|
|
70
76
|
const deliveries = new Set(await this.store.fileDeliveries());
|
|
71
77
|
for (const credential of await this.store.credentials()) {
|
|
@@ -88,6 +94,8 @@ export class AglProxyDaemon {
|
|
|
88
94
|
catalog: (requestArg, connectionArg) => this.catalog(requestArg, connectionArg),
|
|
89
95
|
lease: (requestArg, connectionArg) => this.lease(requestArg.policy, requestArg.client, connectionArg),
|
|
90
96
|
reclaim: async (requestArg, connectionArg) => this.reclaim(requestArg.token, connectionArg),
|
|
97
|
+
confined: (connectionArg) => this.confined(connectionArg),
|
|
98
|
+
confinedEnd: async (requestArg) => this.confinedEnd(requestArg.id),
|
|
91
99
|
usage: async (requestArg, connectionArg) => 'since' in requestArg ? this.usage.changes(requestArg)
|
|
92
100
|
: await this.usage.snapshot(requestArg, connectionArg.signal),
|
|
93
101
|
});
|
|
@@ -104,7 +112,11 @@ export class AglProxyDaemon {
|
|
|
104
112
|
}),
|
|
105
113
|
leases: status.leases, inFlight: status.inFlight, limits: status.limits, authority: status.authority,
|
|
106
114
|
accounts: status.accounts, usageObservations: status.usageObservations, nextPlacement: status.nextPlacement,
|
|
107
|
-
recentPlacements: status.recentPlacements,
|
|
115
|
+
recentPlacements: status.recentPlacements, confinedSocketPath: this.options.confinedSocketPath ?? null,
|
|
116
|
+
confinedRuns: [...this.leases].filter(([, heldArg]) => heldArg.route === 'confined')
|
|
117
|
+
.sort(([, left], [, right]) => left.createdAt.getTime() - right.createdAt.getTime())
|
|
118
|
+
.map(([digestArg, heldArg]) => ({ id: confinedRunId(digestArg), createdAt: heldArg.createdAt.toISOString(),
|
|
119
|
+
held: heldArg.reclaimTimer === undefined })),
|
|
108
120
|
};
|
|
109
121
|
}
|
|
110
122
|
/** Stops a running or starting proxy: a start in flight ends at its next step, then everything it opened closes. */
|
|
@@ -238,11 +250,11 @@ export class AglProxyDaemon {
|
|
|
238
250
|
catch (errorArg) {
|
|
239
251
|
throw new AglProxyControlRefusal(errorArg instanceof Error ? errorArg.message : 'The lease could not be opened.');
|
|
240
252
|
}
|
|
241
|
-
const held = { grant: lease };
|
|
253
|
+
const held = { grant: lease, route: 'loopback', createdAt: new Date(), holder: connectionArg };
|
|
242
254
|
this.leases.set(lease.digest, held);
|
|
243
255
|
try {
|
|
244
256
|
await this.trackLeaseWrite(this.store.recordLease({ digest: lease.digest, client: clientArg, policy: policyArg,
|
|
245
|
-
createdAt:
|
|
257
|
+
createdAt: held.createdAt, route: 'loopback' }));
|
|
246
258
|
}
|
|
247
259
|
catch (errorArg) {
|
|
248
260
|
this.endLease(lease.digest, held);
|
|
@@ -268,6 +280,52 @@ export class AglProxyDaemon {
|
|
|
268
280
|
* an unknown credential from an expired or a held one. The credential is looked up by its SHA-256 digest: a match
|
|
269
281
|
* proves the caller holds the credential the lease was issued with.
|
|
270
282
|
*/
|
|
283
|
+
/**
|
|
284
|
+
* A confined run's credential (see `IReq_AglProxyConfined`): a lease of the Claude pool that continues the confined
|
|
285
|
+
* client's sessions and is accepted on the confined listener alone. It is kept, as its digest, before it is handed out,
|
|
286
|
+
* and ends when its holder's connection closes or the operator ends it (`confinedEnd`). No model list is read for it:
|
|
287
|
+
* Claude Code reads the pool's models through the confined listener, and the pool is judged at each request.
|
|
288
|
+
*/
|
|
289
|
+
async confined(connectionArg) {
|
|
290
|
+
const socketPath = this.options.confinedSocketPath;
|
|
291
|
+
if (socketPath === undefined)
|
|
292
|
+
throw new AglProxyControlRefusal('This AGL proxy has no confined listener.');
|
|
293
|
+
let lease;
|
|
294
|
+
try {
|
|
295
|
+
lease = await this.service.open(confinedPolicy, { sessionScope: aglProxyConfinedClient, route: 'confined' });
|
|
296
|
+
}
|
|
297
|
+
catch (errorArg) {
|
|
298
|
+
throw new AglProxyControlRefusal(errorArg instanceof Error ? errorArg.message : 'The confined credential could not be issued.');
|
|
299
|
+
}
|
|
300
|
+
const held = { grant: lease, route: 'confined', createdAt: new Date(), holder: connectionArg };
|
|
301
|
+
this.leases.set(lease.digest, held);
|
|
302
|
+
try {
|
|
303
|
+
await this.trackLeaseWrite(this.store.recordLease({ digest: lease.digest, client: aglProxyConfinedClient,
|
|
304
|
+
policy: confinedPolicy, createdAt: held.createdAt, route: 'confined' }));
|
|
305
|
+
}
|
|
306
|
+
catch (errorArg) {
|
|
307
|
+
this.endLease(lease.digest, held);
|
|
308
|
+
throw new AglProxyControlRefusal(errorArg instanceof Error ? errorArg.message : 'The confined credential could not be recorded.');
|
|
309
|
+
}
|
|
310
|
+
connectionArg.onClose(() => this.endLease(lease.digest, held));
|
|
311
|
+
return { id: confinedRunId(lease.digest), token: lease.token, socketPath, baseUrl: aglProxyConfinedOrigin };
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Ends a confined run's credential at once, held or waiting for its holder: the gateway refuses it from now on, and
|
|
315
|
+
* its requests in flight end. The holder's connection is closed with the reason, so it stops its container instead of
|
|
316
|
+
* taking the credential back.
|
|
317
|
+
*/
|
|
318
|
+
confinedEnd(idArg) {
|
|
319
|
+
const matches = [...this.leases].filter(([digestArg, heldArg]) => heldArg.route === 'confined'
|
|
320
|
+
&& confinedRunId(digestArg) === idArg);
|
|
321
|
+
if (matches.length !== 1)
|
|
322
|
+
throw new AglProxyControlRefusal(`The AGL proxy serves no confined run ${idArg}.`);
|
|
323
|
+
const [[digest, held]] = matches;
|
|
324
|
+
const holder = held.holder;
|
|
325
|
+
this.endLease(digest, held);
|
|
326
|
+
holder?.end(`The operator ended confined run ${idArg} (\`agl proxy confined end\`).`);
|
|
327
|
+
return { id: idArg };
|
|
328
|
+
}
|
|
271
329
|
async reclaim(tokenArg, connectionArg) {
|
|
272
330
|
const digest = inferenceGatewayCredentialDigest(tokenArg);
|
|
273
331
|
const held = this.leases.get(digest);
|
|
@@ -285,8 +343,10 @@ export class AglProxyDaemon {
|
|
|
285
343
|
this.endLease(digest, held);
|
|
286
344
|
throw new AglProxyControlRefusal(errorArg instanceof Error ? errorArg.message : 'The lease could not be taken back.');
|
|
287
345
|
}
|
|
346
|
+
held.holder = connectionArg;
|
|
288
347
|
connectionArg.onClose(() => this.endLease(digest, held));
|
|
289
|
-
return { baseUrl:
|
|
348
|
+
return held.route === 'confined' ? { baseUrl: aglProxyConfinedOrigin, socketPath: this.options.confinedSocketPath }
|
|
349
|
+
: { baseUrl: held.grant.baseUrl };
|
|
290
350
|
}
|
|
291
351
|
/**
|
|
292
352
|
* Serves the leases an earlier run kept, each until its holder takes it back or its reclaim window ends. A request
|
|
@@ -314,7 +374,7 @@ export class AglProxyDaemon {
|
|
|
314
374
|
try {
|
|
315
375
|
if (!kept.orphanedAt)
|
|
316
376
|
await this.store.recordLeaseOrphaned(kept.digest, orphanedAt);
|
|
317
|
-
grant = await service.restore(kept.policy, { digest: kept.digest, sessionScope: kept.client });
|
|
377
|
+
grant = await service.restore(kept.policy, { digest: kept.digest, sessionScope: kept.client, route: kept.route });
|
|
318
378
|
}
|
|
319
379
|
catch (errorArg) {
|
|
320
380
|
// A lease the gateway no longer admits (its policy or limits changed) cannot be served; it ends here.
|
|
@@ -322,7 +382,7 @@ export class AglProxyDaemon {
|
|
|
322
382
|
await this.forgetLease(kept.digest);
|
|
323
383
|
continue;
|
|
324
384
|
}
|
|
325
|
-
const held = { grant };
|
|
385
|
+
const held = { grant, route: kept.route, createdAt: kept.createdAt };
|
|
326
386
|
held.reclaimTimer = setTimeout(() => this.endLease(kept.digest, held), Math.max(0, deadline - Date.now()));
|
|
327
387
|
this.leases.set(kept.digest, held);
|
|
328
388
|
}
|
|
@@ -335,6 +395,7 @@ export class AglProxyDaemon {
|
|
|
335
395
|
if (this.abort.signal.aborted || this.leases.get(digestArg) !== heldArg)
|
|
336
396
|
return;
|
|
337
397
|
clearTimeout(heldArg.reclaimTimer);
|
|
398
|
+
heldArg.holder = undefined;
|
|
338
399
|
this.leases.delete(digestArg);
|
|
339
400
|
heldArg.grant.close();
|
|
340
401
|
void this.forgetLease(digestArg);
|
|
@@ -363,4 +424,4 @@ export class AglProxyDaemon {
|
|
|
363
424
|
process.stderr.write(`AGL proxy lease ${digestArg.slice(0, 12)} ${whatArg}: ${reason}\n`);
|
|
364
425
|
}
|
|
365
426
|
}
|
|
366
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5wcm94eWRhZW1vbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NsYXNzZXMucHJveHlkYWVtb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXJELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQ0FBZ0MsRUFDVCxNQUFNLCtCQUErQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxxQkFBcUIsRUFBZ0MsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsc0JBQXNCLEVBQ0UsTUFBTSw4QkFBOEIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUscUJBQXFCLEVBQ0csTUFBTSwyQkFBMkIsQ0FBQztBQUMzRixPQUFPLEVBQUUsVUFBVSxFQUEwQixNQUFNLHlCQUF5QixDQUFDO0FBRTdFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxtQkFBbUIsRUFBRSx5QkFBeUIsRUFDdEYsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQWlCdkU7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQztBQUVoRDs7O0dBR0c7QUFDSCxNQUFNLGNBQWMsR0FBRyxDQUFDLFFBQWlCLEVBQTBCLEVBQUUsQ0FBQyxJQUFJLHNCQUFzQixDQUM5RixRQUFRLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0MsRUFDL0UsUUFBUSxZQUFZLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQ3RFLENBQUM7QUFpQkY7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBa0JJLE9B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
|
|
427
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5wcm94eWRhZW1vbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NsYXNzZXMucHJveHlkYWVtb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXJELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQ0FBZ0MsRUFDb0IsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRyxPQUFPLEVBQUUscUJBQXFCLEVBQWdDLE1BQU0sOEJBQThCLENBQUM7QUFDbkcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUM5QyxNQUFNLDhCQUE4QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxxQkFBcUIsRUFFeEIsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUEwQixNQUFNLHlCQUF5QixDQUFDO0FBRTdFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxtQkFBbUIsRUFBRSx5QkFBeUIsRUFDdEYsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQXNCdkU7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQztBQUVoRDs7O0dBR0c7QUFDSCxNQUFNLGNBQWMsR0FBRyxDQUFDLFFBQWlCLEVBQTBCLEVBQUUsQ0FBQyxJQUFJLHNCQUFzQixDQUM5RixRQUFRLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0MsRUFDL0UsUUFBUSxZQUFZLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQ3RFLENBQUM7QUFFRixnSEFBZ0g7QUFD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
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { IInferenceRoutingPolicy } from './classes.inferencerouter.js';
|
|
2
|
-
import type { TAglProxyLeaseCatalog } from './classes.proxycontrol.js';
|
|
2
|
+
import type { IReq_AglProxyReclaim, TAglProxyLeaseCatalog } from './classes.proxycontrol.js';
|
|
3
|
+
import { AglProxyControlClient, type IAglProxyLeaseConnection } from './classes.proxycontrolclient.js';
|
|
3
4
|
/** The delays between attempts to take a lease back from a restarting proxy; the last one repeats. */
|
|
4
5
|
export declare const proxyLeaseReclaimDelaysMs: readonly number[];
|
|
5
6
|
/**
|
|
@@ -13,36 +14,42 @@ export type TAglProxyLeaseState = 'held' | 'reclaiming' | 'lost' | 'closed';
|
|
|
13
14
|
export declare class AglProxyLeaseLostError extends Error {
|
|
14
15
|
constructor(messageArg: string);
|
|
15
16
|
}
|
|
16
|
-
|
|
17
|
+
/** How a holder reaches its proxy and how long it keeps trying to take its lease back. */
|
|
18
|
+
export interface IAglProxyHolderOptions {
|
|
17
19
|
socketPath: string;
|
|
20
|
+
reclaimDelaysMs?: readonly number[];
|
|
21
|
+
reclaimDeadlineMs?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface IAglProxyLeaseHolderOptions extends IAglProxyHolderOptions {
|
|
18
24
|
policy: IInferenceRoutingPolicy;
|
|
19
25
|
/** The proxy client whose sessions the lease continues (see `IReq_AglProxyLease`). */
|
|
20
26
|
client: string;
|
|
21
|
-
reclaimDelaysMs?: readonly number[];
|
|
22
|
-
reclaimDeadlineMs?: number;
|
|
23
27
|
}
|
|
24
28
|
/**
|
|
25
|
-
* A proxy
|
|
26
|
-
* connection; when that connection closes without the holder closing it -- the proxy
|
|
27
|
-
* holder reconnects with a bounded backoff and takes the same
|
|
28
|
-
* with
|
|
29
|
-
* time, is lost for good: `lost` settles with the reason, for the holder to
|
|
29
|
+
* A proxy credential its holder keeps for as long as it needs it: a lease, or a confined run's credential. It lives as
|
|
30
|
+
* long as the holder's control connection; when that connection closes without the holder closing it -- the proxy
|
|
31
|
+
* stopped or restarted -- the holder reconnects with a bounded backoff and takes the same credential back, so the child
|
|
32
|
+
* configured with it keeps working. A credential the proxy refuses to hand back, one the proxy ended itself (it says
|
|
33
|
+
* why), or a proxy that does not come back in time, is lost for good: `lost` settles with the reason, for the holder to
|
|
34
|
+
* show rather than leave its child failing.
|
|
30
35
|
*/
|
|
31
|
-
|
|
36
|
+
declare class AglProxyHeldCredential {
|
|
32
37
|
private readonly control;
|
|
33
38
|
private readonly options;
|
|
34
|
-
/** Takes a new lease of the proxy on `socketPathArg`. */
|
|
35
|
-
static take(optionsArg: IAglProxyLeaseHolderOptions, signalArg: AbortSignal): Promise<AglProxyLeaseHolder>;
|
|
36
39
|
readonly baseUrl: string;
|
|
37
40
|
readonly token: string;
|
|
38
|
-
readonly catalog: TAglProxyLeaseCatalog;
|
|
39
41
|
/** Settles with the reason once the lease is lost for good; never for a lease its holder closes. */
|
|
40
42
|
readonly lost: Promise<AglProxyLeaseLostError>;
|
|
41
43
|
private stateValue;
|
|
42
44
|
private connection;
|
|
43
45
|
private readonly abort;
|
|
44
46
|
private readonly resolveLost;
|
|
45
|
-
|
|
47
|
+
protected constructor(control: AglProxyControlClient, issuedArg: {
|
|
48
|
+
baseUrl: string;
|
|
49
|
+
token: string;
|
|
50
|
+
} & IAglProxyLeaseConnection, options: IAglProxyHolderOptions);
|
|
51
|
+
/** Why a credential taken back cannot continue where its child was configured, or `undefined` when it can. */
|
|
52
|
+
protected relocation(reclaimedArg: IReq_AglProxyReclaim['response']): string | undefined;
|
|
46
53
|
get state(): TAglProxyLeaseState;
|
|
47
54
|
/** Ends the lease: the proxy forgets it and its credential stops working. A reclaim in progress stops. */
|
|
48
55
|
close(): void;
|
|
@@ -50,3 +57,25 @@ export declare class AglProxyLeaseHolder {
|
|
|
50
57
|
private reclaim;
|
|
51
58
|
private lose;
|
|
52
59
|
}
|
|
60
|
+
/** A proxy lease for one child, with the pool's models as the proxy read them when it issued the lease. */
|
|
61
|
+
export declare class AglProxyLeaseHolder extends AglProxyHeldCredential {
|
|
62
|
+
/** Takes a new lease of the proxy on `socketPathArg`. */
|
|
63
|
+
static take(optionsArg: IAglProxyLeaseHolderOptions, signalArg: AbortSignal): Promise<AglProxyLeaseHolder>;
|
|
64
|
+
readonly catalog: TAglProxyLeaseCatalog;
|
|
65
|
+
private constructor();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* A confined run's credential (see `IReq_AglProxyConfined`), held for as long as its container runs. It is configured
|
|
69
|
+
* with the confined listener's socket, so one taken back on another socket cannot continue.
|
|
70
|
+
*/
|
|
71
|
+
export declare class AglProxyConfinedHolder extends AglProxyHeldCredential {
|
|
72
|
+
/** Takes a new confined run's credential of the proxy on `optionsArg.socketPath`, its control socket. */
|
|
73
|
+
static take(optionsArg: IAglProxyHolderOptions, signalArg: AbortSignal): Promise<AglProxyConfinedHolder>;
|
|
74
|
+
/** The run's id, as `agl proxy confined end` and `agl proxy status` name it. */
|
|
75
|
+
readonly id: string;
|
|
76
|
+
/** The confined listener's socket, on the host. */
|
|
77
|
+
readonly confinedSocketPath: string;
|
|
78
|
+
private constructor();
|
|
79
|
+
protected relocation(reclaimedArg: IReq_AglProxyReclaim['response']): string | undefined;
|
|
80
|
+
}
|
|
81
|
+
export {};
|
|
@@ -15,40 +15,38 @@ export class AglProxyLeaseLostError extends Error {
|
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
|
-
* A proxy
|
|
19
|
-
* connection; when that connection closes without the holder closing it -- the proxy
|
|
20
|
-
* holder reconnects with a bounded backoff and takes the same
|
|
21
|
-
* with
|
|
22
|
-
* time, is lost for good: `lost` settles with the reason, for the holder to
|
|
18
|
+
* A proxy credential its holder keeps for as long as it needs it: a lease, or a confined run's credential. It lives as
|
|
19
|
+
* long as the holder's control connection; when that connection closes without the holder closing it -- the proxy
|
|
20
|
+
* stopped or restarted -- the holder reconnects with a bounded backoff and takes the same credential back, so the child
|
|
21
|
+
* configured with it keeps working. A credential the proxy refuses to hand back, one the proxy ended itself (it says
|
|
22
|
+
* why), or a proxy that does not come back in time, is lost for good: `lost` settles with the reason, for the holder to
|
|
23
|
+
* show rather than leave its child failing.
|
|
23
24
|
*/
|
|
24
|
-
|
|
25
|
+
class AglProxyHeldCredential {
|
|
25
26
|
control;
|
|
26
27
|
options;
|
|
27
|
-
/** Takes a new lease of the proxy on `socketPathArg`. */
|
|
28
|
-
static async take(optionsArg, signalArg) {
|
|
29
|
-
const control = new AglProxyControlClient(optionsArg.socketPath);
|
|
30
|
-
const lease = await control.lease(optionsArg.policy, optionsArg.client, signalArg);
|
|
31
|
-
return new AglProxyLeaseHolder(control, lease, optionsArg);
|
|
32
|
-
}
|
|
33
28
|
baseUrl;
|
|
34
29
|
token;
|
|
35
|
-
catalog;
|
|
36
30
|
/** Settles with the reason once the lease is lost for good; never for a lease its holder closes. */
|
|
37
31
|
lost;
|
|
38
32
|
stateValue = 'held';
|
|
39
33
|
connection;
|
|
40
34
|
abort = new AbortController();
|
|
41
35
|
resolveLost;
|
|
42
|
-
constructor(control,
|
|
36
|
+
constructor(control, issuedArg, options) {
|
|
43
37
|
this.control = control;
|
|
44
38
|
this.options = options;
|
|
45
|
-
this.baseUrl =
|
|
46
|
-
this.token =
|
|
47
|
-
this.catalog = leaseArg.catalog;
|
|
39
|
+
this.baseUrl = issuedArg.baseUrl;
|
|
40
|
+
this.token = issuedArg.token;
|
|
48
41
|
const lost = Promise.withResolvers();
|
|
49
42
|
this.lost = lost.promise;
|
|
50
43
|
this.resolveLost = lost.resolve;
|
|
51
|
-
this.watch(
|
|
44
|
+
this.watch(issuedArg);
|
|
45
|
+
}
|
|
46
|
+
/** Why a credential taken back cannot continue where its child was configured, or `undefined` when it can. */
|
|
47
|
+
relocation(reclaimedArg) {
|
|
48
|
+
return reclaimedArg.baseUrl === this.baseUrl ? undefined
|
|
49
|
+
: `The AGL proxy restarted at ${reclaimedArg.baseUrl} instead of ${this.baseUrl}, where this lease is configured.`;
|
|
52
50
|
}
|
|
53
51
|
get state() {
|
|
54
52
|
return this.stateValue;
|
|
@@ -63,9 +61,14 @@ export class AglProxyLeaseHolder {
|
|
|
63
61
|
}
|
|
64
62
|
watch(connectionArg) {
|
|
65
63
|
this.connection = connectionArg;
|
|
66
|
-
void connectionArg.closed.then(() => {
|
|
64
|
+
void connectionArg.closed.then((endedArg) => {
|
|
67
65
|
if (this.connection !== connectionArg || this.stateValue !== 'held')
|
|
68
66
|
return;
|
|
67
|
+
// The proxy ended the credential itself and said why: there is nothing to take back.
|
|
68
|
+
if (endedArg !== undefined) {
|
|
69
|
+
this.lose(endedArg);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
69
72
|
this.stateValue = 'reclaiming';
|
|
70
73
|
void this.reclaim();
|
|
71
74
|
});
|
|
@@ -94,9 +97,10 @@ export class AglProxyLeaseHolder {
|
|
|
94
97
|
reclaimed.close();
|
|
95
98
|
return;
|
|
96
99
|
}
|
|
97
|
-
|
|
100
|
+
const relocation = this.relocation(reclaimed);
|
|
101
|
+
if (relocation !== undefined) {
|
|
98
102
|
reclaimed.close();
|
|
99
|
-
this.lose(
|
|
103
|
+
this.lose(relocation);
|
|
100
104
|
return;
|
|
101
105
|
}
|
|
102
106
|
this.stateValue = 'held';
|
|
@@ -120,4 +124,44 @@ export class AglProxyLeaseHolder {
|
|
|
120
124
|
this.resolveLost(new AglProxyLeaseLostError(messageArg));
|
|
121
125
|
}
|
|
122
126
|
}
|
|
123
|
-
|
|
127
|
+
/** A proxy lease for one child, with the pool's models as the proxy read them when it issued the lease. */
|
|
128
|
+
export class AglProxyLeaseHolder extends AglProxyHeldCredential {
|
|
129
|
+
/** Takes a new lease of the proxy on `socketPathArg`. */
|
|
130
|
+
static async take(optionsArg, signalArg) {
|
|
131
|
+
const control = new AglProxyControlClient(optionsArg.socketPath);
|
|
132
|
+
const lease = await control.lease(optionsArg.policy, optionsArg.client, signalArg);
|
|
133
|
+
return new AglProxyLeaseHolder(control, lease, optionsArg);
|
|
134
|
+
}
|
|
135
|
+
catalog;
|
|
136
|
+
constructor(controlArg, leaseArg, optionsArg) {
|
|
137
|
+
super(controlArg, leaseArg, optionsArg);
|
|
138
|
+
this.catalog = leaseArg.catalog;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* A confined run's credential (see `IReq_AglProxyConfined`), held for as long as its container runs. It is configured
|
|
143
|
+
* with the confined listener's socket, so one taken back on another socket cannot continue.
|
|
144
|
+
*/
|
|
145
|
+
export class AglProxyConfinedHolder extends AglProxyHeldCredential {
|
|
146
|
+
/** Takes a new confined run's credential of the proxy on `optionsArg.socketPath`, its control socket. */
|
|
147
|
+
static async take(optionsArg, signalArg) {
|
|
148
|
+
const control = new AglProxyControlClient(optionsArg.socketPath);
|
|
149
|
+
const grant = await control.confined(signalArg);
|
|
150
|
+
return new AglProxyConfinedHolder(control, grant, optionsArg);
|
|
151
|
+
}
|
|
152
|
+
/** The run's id, as `agl proxy confined end` and `agl proxy status` name it. */
|
|
153
|
+
id;
|
|
154
|
+
/** The confined listener's socket, on the host. */
|
|
155
|
+
confinedSocketPath;
|
|
156
|
+
constructor(controlArg, grantArg, optionsArg) {
|
|
157
|
+
super(controlArg, grantArg, optionsArg);
|
|
158
|
+
this.id = grantArg.id;
|
|
159
|
+
this.confinedSocketPath = grantArg.socketPath;
|
|
160
|
+
}
|
|
161
|
+
relocation(reclaimedArg) {
|
|
162
|
+
return reclaimedArg.socketPath === this.confinedSocketPath ? undefined
|
|
163
|
+
: `The AGL proxy restarted with its confined listener at ${reclaimedArg.socketPath ?? 'none'} instead of `
|
|
164
|
+
+ `${this.confinedSocketPath}, which this run's container has mounted.`;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5wcm94eWxlYXNlaG9sZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY2xhc3Nlcy5wcm94eWxlYXNlaG9sZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBR3hDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBaUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUU3SCxzR0FBc0c7QUFDdEcsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMzRzs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxPQUFPLENBQUM7QUFLbkQsbUhBQW1IO0FBQ25ILE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxLQUFLO0lBQy9DLFlBQVksVUFBa0I7UUFDNUIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsd0JBQXdCLENBQUM7SUFDdkMsQ0FBQztDQUNGO0FBZUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sc0JBQXNCO0lBV1AsT0FBTztJQUVQLE9BQU87SUFaVixPQUFPLENBQVM7SUFDaEIsS0FBSyxDQUFTO0lBQzlCLG9HQUFvRztJQUNwRixJQUFJLENBQWtDO0lBQzlDLFVBQVUsR0FBd0IsTUFBTSxDQUFDO0lBQ3pDLFVBQVUsQ0FBNEI7SUFDN0IsS0FBSyxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFDOUIsV0FBVyxDQUE2QztJQUV6RSxZQUNtQixPQUE4QixFQUMvQyxTQUF3RSxFQUN2RCxPQUErQjt1QkFGL0IsT0FBTzt1QkFFUCxPQUFPO1FBRXhCLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQztRQUNqQyxJQUFJ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
|
|
@@ -3,6 +3,7 @@ import { InferenceAffinityStore } from './classes.inferenceaffinity.js';
|
|
|
3
3
|
import { InferencePlacementStore } from './classes.inferenceplacement.js';
|
|
4
4
|
import { InferenceUsageStore } from './classes.inferenceusage.js';
|
|
5
5
|
import { InferenceSpendStore } from './classes.inferencespend.js';
|
|
6
|
+
import { type TInferenceGatewayRoute } from './classes.inferencegateway.js';
|
|
6
7
|
import type { IInferenceRoutingPolicy } from './classes.inferencerouter.js';
|
|
7
8
|
import { type TInferenceCredential, type TInferenceProvider, type TProxyCredentialDelivery } from './functions.proxycontract.js';
|
|
8
9
|
/** Seals a client credential for this user and machine; only its ciphertext is stored. */
|
|
@@ -80,6 +81,11 @@ export interface IProxyLeaseDocument {
|
|
|
80
81
|
* until its holder takes it back, which removes it. Absent while a holder has the lease.
|
|
81
82
|
*/
|
|
82
83
|
orphanedAt?: Date;
|
|
84
|
+
/**
|
|
85
|
+
* `confined` for a confined run's credential, accepted on the confined listener alone, with the Claude pool's policy
|
|
86
|
+
* and the confined client's sessions; absent for a lease of the loopback listener.
|
|
87
|
+
*/
|
|
88
|
+
route?: 'confined';
|
|
83
89
|
}
|
|
84
90
|
export declare class ProxyLeaseModel extends plugins.nosqldb.SmartDataDbDoc<ProxyLeaseModel, IProxyLeaseDocument> {
|
|
85
91
|
static exact: plugins.nosqldb.TExact<ProxyLeaseModel>;
|
|
@@ -88,6 +94,7 @@ export declare class ProxyLeaseModel extends plugins.nosqldb.SmartDataDbDoc<Prox
|
|
|
88
94
|
policy: IProxyLeasePolicyDocument;
|
|
89
95
|
createdAt: Date;
|
|
90
96
|
orphanedAt?: Date;
|
|
97
|
+
route?: 'confined';
|
|
91
98
|
}
|
|
92
99
|
export interface IProxyStoreOptions {
|
|
93
100
|
/** The proxy's own NoSQLDB storage root; no other process opens it. */
|
|
@@ -114,6 +121,8 @@ export interface IProxyLease {
|
|
|
114
121
|
createdAt: Date;
|
|
115
122
|
/** See `IProxyLeaseDocument.orphanedAt`. */
|
|
116
123
|
orphanedAt?: Date;
|
|
124
|
+
/** The listener the lease's credential is accepted on; see `IProxyLeaseDocument.route`. */
|
|
125
|
+
route: TInferenceGatewayRoute;
|
|
117
126
|
}
|
|
118
127
|
/**
|
|
119
128
|
* The proxy's own persistence: its identity, its sealed client credentials and its session routing, in an
|