@sentropic/h2a-runtime 0.91.0 → 0.92.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/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +16 -3
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +79 -58
- package/dist/index.js.map +1 -1
- package/dist/llm-gateway-runtime/index.d.ts +6 -0
- package/dist/llm-gateway-runtime/index.d.ts.map +1 -1
- package/dist/llm-gateway-runtime/index.js +134 -60
- package/dist/llm-gateway-runtime/index.js.map +1 -1
- package/dist/llm-gateway-runtime/session-ledger.d.ts +38 -55
- package/dist/llm-gateway-runtime/session-ledger.d.ts.map +1 -1
- package/dist/llm-gateway-runtime/session-ledger.js +102 -250
- package/dist/llm-gateway-runtime/session-ledger.js.map +1 -1
- package/dist/llm-gateway-runtime/sticky.d.ts +25 -52
- package/dist/llm-gateway-runtime/sticky.d.ts.map +1 -1
- package/dist/llm-gateway-runtime/sticky.js +36 -605
- package/dist/llm-gateway-runtime/sticky.js.map +1 -1
- package/dist/llm-mesh.d.ts +19 -72
- package/dist/llm-mesh.d.ts.map +1 -1
- package/dist/llm-mesh.js +42 -399
- package/dist/llm-mesh.js.map +1 -1
- package/dist/llm-routing-config.d.ts +28 -0
- package/dist/llm-routing-config.d.ts.map +1 -0
- package/dist/llm-routing-config.js +100 -0
- package/dist/llm-routing-config.js.map +1 -0
- package/dist/native-terminal/client.d.ts +23 -0
- package/dist/native-terminal/client.d.ts.map +1 -0
- package/dist/native-terminal/client.js +203 -0
- package/dist/native-terminal/client.js.map +1 -0
- package/dist/native-terminal/host.d.ts +78 -0
- package/dist/native-terminal/host.d.ts.map +1 -0
- package/dist/native-terminal/host.js +275 -0
- package/dist/native-terminal/host.js.map +1 -0
- package/dist/native-terminal/process.d.ts +11 -0
- package/dist/native-terminal/process.d.ts.map +1 -0
- package/dist/native-terminal/process.js +137 -0
- package/dist/native-terminal/process.js.map +1 -0
- package/dist/native-terminal/protocol.d.ts +57 -0
- package/dist/native-terminal/protocol.d.ts.map +1 -0
- package/dist/native-terminal/protocol.js +102 -0
- package/dist/native-terminal/protocol.js.map +1 -0
- package/dist/native-terminal/replay-buffer.d.ts +26 -0
- package/dist/native-terminal/replay-buffer.d.ts.map +1 -0
- package/dist/native-terminal/replay-buffer.js +84 -0
- package/dist/native-terminal/replay-buffer.js.map +1 -0
- package/dist/native-terminal/server.d.ts +13 -0
- package/dist/native-terminal/server.d.ts.map +1 -0
- package/dist/native-terminal/server.js +555 -0
- package/dist/native-terminal/server.js.map +1 -0
- package/dist/native-terminal/socket-path.d.ts +8 -0
- package/dist/native-terminal/socket-path.d.ts.map +1 -0
- package/dist/native-terminal/socket-path.js +41 -0
- package/dist/native-terminal/socket-path.js.map +1 -0
- package/dist/native-terminal/supervisor.d.ts +26 -0
- package/dist/native-terminal/supervisor.d.ts.map +1 -0
- package/dist/native-terminal/supervisor.js +273 -0
- package/dist/native-terminal/supervisor.js.map +1 -0
- package/dist/pty.d.ts +1 -0
- package/dist/pty.d.ts.map +1 -1
- package/dist/pty.js +78 -2
- package/dist/pty.js.map +1 -1
- package/dist/registry.d.ts +7 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +37 -1
- package/dist/registry.js.map +1 -1
- package/dist/status-projection.d.ts.map +1 -1
- package/dist/tmux.d.ts +7 -5
- package/dist/tmux.d.ts.map +1 -1
- package/dist/tmux.js +33 -7
- package/dist/tmux.js.map +1 -1
- package/package.json +3 -3
- package/dist/llm-gateway-runtime/accounts.d.ts +0 -62
- package/dist/llm-gateway-runtime/accounts.d.ts.map +0 -1
- package/dist/llm-gateway-runtime/accounts.js +0 -323
- package/dist/llm-gateway-runtime/accounts.js.map +0 -1
- package/dist/llm-gateway-runtime/model-catalog.d.ts +0 -44
- package/dist/llm-gateway-runtime/model-catalog.d.ts.map +0 -1
- package/dist/llm-gateway-runtime/model-catalog.js +0 -191
- package/dist/llm-gateway-runtime/model-catalog.js.map +0 -1
- package/dist/llm-gateway-runtime/proxy-anthropic.d.ts +0 -3
- package/dist/llm-gateway-runtime/proxy-anthropic.d.ts.map +0 -1
- package/dist/llm-gateway-runtime/proxy-anthropic.js +0 -318
- package/dist/llm-gateway-runtime/proxy-anthropic.js.map +0 -1
- package/dist/llm-gateway-runtime/proxy-cloud-code.d.ts +0 -11
- package/dist/llm-gateway-runtime/proxy-cloud-code.d.ts.map +0 -1
- package/dist/llm-gateway-runtime/proxy-cloud-code.js +0 -215
- package/dist/llm-gateway-runtime/proxy-cloud-code.js.map +0 -1
- package/dist/llm-gateway-runtime/proxy-openai.d.ts +0 -118
- package/dist/llm-gateway-runtime/proxy-openai.d.ts.map +0 -1
- package/dist/llm-gateway-runtime/proxy-openai.js +0 -1305
- package/dist/llm-gateway-runtime/proxy-openai.js.map +0 -1
|
@@ -1,272 +1,124 @@
|
|
|
1
|
-
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
function refreshFreshestClientIndex(clientSessionId) {
|
|
24
|
-
const ids = _ledgerByClientSessionId.get(clientSessionId);
|
|
25
|
-
if (!ids || ids.size === 0) {
|
|
26
|
-
_freshestGatewayByClientSessionId.delete(clientSessionId);
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
let freshest;
|
|
30
|
-
let tied = false;
|
|
31
|
-
for (const id of ids) {
|
|
32
|
-
const entry = _ledger.get(id);
|
|
33
|
-
if (!entry)
|
|
34
|
-
continue;
|
|
35
|
-
if (!freshest || entry.updatedAt > freshest.updatedAt) {
|
|
36
|
-
freshest = entry;
|
|
37
|
-
tied = false;
|
|
38
|
-
}
|
|
39
|
-
else if (entry.updatedAt === freshest.updatedAt) {
|
|
40
|
-
tied = true;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
_freshestGatewayByClientSessionId.set(clientSessionId, !freshest || tied ? undefined : freshest.gatewaySessionId);
|
|
44
|
-
}
|
|
45
|
-
function setLedgerEntry(entry) {
|
|
46
|
-
_ledger.set(entry.gatewaySessionId, entry);
|
|
47
|
-
refreshFreshestClientIndex(entry.clientSessionId);
|
|
48
|
-
}
|
|
49
|
-
function timestamp(now = new Date()) {
|
|
50
|
-
return now.toISOString();
|
|
51
|
-
}
|
|
52
|
-
function routeFields(route) {
|
|
53
|
-
if (!route)
|
|
54
|
-
return {};
|
|
55
|
-
return {
|
|
56
|
-
...(route.requestedModel ? { requestedModel: route.requestedModel } : {}),
|
|
57
|
-
...(route.catalogModelId ? { modelId: route.catalogModelId } : {}),
|
|
58
|
-
...(route.upstreamModel ? { upstreamModel: route.upstreamModel } : {}),
|
|
59
|
-
routePolicy: route.routingPolicy,
|
|
60
|
-
routeReason: route.routeReason,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
function existingRouteFields(entry) {
|
|
64
|
-
if (!entry)
|
|
65
|
-
return {};
|
|
66
|
-
return {
|
|
67
|
-
...(entry.requestedModel ? { requestedModel: entry.requestedModel } : {}),
|
|
68
|
-
...(entry.modelId ? { modelId: entry.modelId } : {}),
|
|
69
|
-
...(entry.upstreamModel ? { upstreamModel: entry.upstreamModel } : {}),
|
|
70
|
-
...(entry.routePolicy ? { routePolicy: entry.routePolicy } : {}),
|
|
71
|
-
...(entry.routeReason ? { routeReason: entry.routeReason } : {}),
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
export function upsertSessionLedger(input) {
|
|
75
|
-
const now = timestamp(input.now);
|
|
76
|
-
const existing = _ledger.get(input.gatewaySessionId);
|
|
77
|
-
const workspaceId = input.workspaceId ?? existing?.workspaceId;
|
|
78
|
-
const profile = input.profile ?? existing?.profile;
|
|
79
|
-
const account = publicAccountDescriptor(input.account);
|
|
80
|
-
const entry = {
|
|
81
|
-
gatewaySessionId: input.gatewaySessionId,
|
|
82
|
-
clientSessionId: input.clientSessionId ??
|
|
83
|
-
existing?.clientSessionId ??
|
|
84
|
-
input.gatewaySessionId,
|
|
85
|
-
...(workspaceId ? { workspaceId } : {}),
|
|
86
|
-
...(profile ? { profile } : {}),
|
|
87
|
-
account,
|
|
88
|
-
transport: upstreamTransportForAccount(input.account),
|
|
89
|
-
state: existing?.state ?? "idle",
|
|
90
|
-
// Acquiring (or re-acquiring) a gateway session only selects a possible
|
|
91
|
-
// route. It is not evidence that a request using that route left the
|
|
92
|
-
// gateway. Route fields are written exclusively by the dispatch lifecycle.
|
|
93
|
-
...existingRouteFields(existing),
|
|
94
|
-
createdAt: existing?.createdAt ?? now,
|
|
95
|
-
lastUsedAt: now,
|
|
96
|
-
updatedAt: now,
|
|
97
|
-
requestCount: existing?.requestCount ?? 0,
|
|
98
|
-
inFlightRequests: existing?.inFlightRequests ?? 0,
|
|
99
|
-
detailsAmbiguous: existing?.detailsAmbiguous ?? false,
|
|
100
|
-
...(existing?.lastRateLimit
|
|
101
|
-
? { lastRateLimit: existing.lastRateLimit }
|
|
102
|
-
: {}),
|
|
103
|
-
...(existing?.lastFallback ? { lastFallback: existing.lastFallback } : {}),
|
|
104
|
-
};
|
|
105
|
-
_ledger.set(entry.gatewaySessionId, entry);
|
|
106
|
-
if (existing && existing.clientSessionId !== entry.clientSessionId &&
|
|
107
|
-
_ledgerByClientSessionId.has(existing.clientSessionId)) {
|
|
108
|
-
removeClientIndex(existing.clientSessionId, entry.gatewaySessionId);
|
|
109
|
-
}
|
|
110
|
-
addClientIndex(entry.clientSessionId, entry.gatewaySessionId);
|
|
111
|
-
refreshFreshestClientIndex(entry.clientSessionId);
|
|
112
|
-
if (existing && existing.clientSessionId !== entry.clientSessionId) {
|
|
113
|
-
refreshFreshestClientIndex(existing.clientSessionId);
|
|
114
|
-
}
|
|
115
|
-
return entry;
|
|
116
|
-
}
|
|
117
|
-
export function recordSessionRequest(gatewaySessionId, route, now = new Date()) {
|
|
118
|
-
if (!gatewaySessionId)
|
|
119
|
-
return undefined;
|
|
120
|
-
const existing = _ledger.get(gatewaySessionId);
|
|
121
|
-
if (!existing)
|
|
122
|
-
return undefined;
|
|
123
|
-
const withoutRoute = { ...existing };
|
|
124
|
-
delete withoutRoute.requestedModel;
|
|
125
|
-
delete withoutRoute.modelId;
|
|
126
|
-
delete withoutRoute.upstreamModel;
|
|
127
|
-
delete withoutRoute.routePolicy;
|
|
128
|
-
delete withoutRoute.routeReason;
|
|
129
|
-
delete withoutRoute.lastFallback;
|
|
130
|
-
const detailsAmbiguous = existing.inFlightRequests > 0;
|
|
1
|
+
const ledger = new Map();
|
|
2
|
+
const byClientSession = new Map();
|
|
3
|
+
const plansByCandidate = new Map();
|
|
4
|
+
const unselectedAccount = (provider = "mesh") => ({
|
|
5
|
+
id: "unselected",
|
|
6
|
+
provider,
|
|
7
|
+
label: "unselected",
|
|
8
|
+
});
|
|
9
|
+
const accountFromDiagnostic = (diagnostic) => ({
|
|
10
|
+
id: diagnostic.diagnosticAccountRef,
|
|
11
|
+
provider: diagnostic.actualProviderId,
|
|
12
|
+
label: diagnostic.diagnosticAccountRef,
|
|
13
|
+
});
|
|
14
|
+
export function recordRoutePlan(session, input, plan, now = new Date()) {
|
|
15
|
+
const diagnostics = new Map(plan.diagnostics.map((value) => [value.candidateRef, value]));
|
|
16
|
+
const request = { session, input, plan, diagnostics };
|
|
17
|
+
for (const candidateRef of plan.candidateRefs)
|
|
18
|
+
plansByCandidate.set(candidateRef, request);
|
|
19
|
+
const at = now.toISOString();
|
|
20
|
+
const existing = ledger.get(session.sessionId);
|
|
21
|
+
const first = plan.diagnostics[0];
|
|
22
|
+
const detailsAmbiguous = (existing?.inFlightRequests ?? 0) > 0;
|
|
131
23
|
const entry = {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
detailsAmbiguous,
|
|
140
|
-
};
|
|
141
|
-
setLedgerEntry(entry);
|
|
142
|
-
return entry;
|
|
143
|
-
}
|
|
144
|
-
export function recordSessionActive(gatewaySessionId, route, now = new Date()) {
|
|
145
|
-
if (!gatewaySessionId)
|
|
146
|
-
return undefined;
|
|
147
|
-
const existing = _ledger.get(gatewaySessionId);
|
|
148
|
-
if (!existing)
|
|
149
|
-
return undefined;
|
|
150
|
-
const entry = {
|
|
151
|
-
...existing,
|
|
152
|
-
...(existing.detailsAmbiguous ? {} : routeFields(route)),
|
|
153
|
-
state: "active",
|
|
154
|
-
lastUsedAt: timestamp(now),
|
|
155
|
-
updatedAt: timestamp(now),
|
|
156
|
-
};
|
|
157
|
-
setLedgerEntry(entry);
|
|
158
|
-
return entry;
|
|
159
|
-
}
|
|
160
|
-
export function recordSessionIdle(gatewaySessionId, route, now = new Date()) {
|
|
161
|
-
if (!gatewaySessionId)
|
|
162
|
-
return undefined;
|
|
163
|
-
const existing = _ledger.get(gatewaySessionId);
|
|
164
|
-
if (!existing)
|
|
165
|
-
return undefined;
|
|
166
|
-
const inFlightRequests = Math.max(0, existing.inFlightRequests - 1);
|
|
167
|
-
const entry = {
|
|
168
|
-
...existing,
|
|
169
|
-
...(existing.detailsAmbiguous ? {} : routeFields(route)),
|
|
170
|
-
state: inFlightRequests > 0 ? "active" : "idle",
|
|
171
|
-
lastUsedAt: timestamp(now),
|
|
172
|
-
updatedAt: timestamp(now),
|
|
173
|
-
inFlightRequests,
|
|
174
|
-
};
|
|
175
|
-
setLedgerEntry(entry);
|
|
176
|
-
return entry;
|
|
177
|
-
}
|
|
178
|
-
export function recordSessionFallback(gatewaySessionId, from, to, route, now = new Date()) {
|
|
179
|
-
if (!gatewaySessionId)
|
|
180
|
-
return undefined;
|
|
181
|
-
const existing = _ledger.get(gatewaySessionId);
|
|
182
|
-
if (!existing)
|
|
183
|
-
return undefined;
|
|
184
|
-
const at = timestamp(now);
|
|
185
|
-
const entry = {
|
|
186
|
-
...existing,
|
|
187
|
-
// The caller passes a route only after its first actual dispatch. A
|
|
188
|
-
// rebind may then retain that already-observed route while it updates the
|
|
189
|
-
// account, but cannot manufacture a new one.
|
|
190
|
-
...(existing.detailsAmbiguous || !route ? {} : routeFields(route)),
|
|
191
|
-
account: publicAccountDescriptor(to),
|
|
192
|
-
transport: upstreamTransportForAccount(to),
|
|
24
|
+
gatewaySessionId: session.sessionId,
|
|
25
|
+
clientSessionId: session.clientSessionId,
|
|
26
|
+
...(session.workspaceId ? { workspaceId: session.workspaceId } : {}),
|
|
27
|
+
...(session.profile ? { profile: session.profile } : {}),
|
|
28
|
+
account: detailsAmbiguous || !first
|
|
29
|
+
? unselectedAccount()
|
|
30
|
+
: accountFromDiagnostic(first),
|
|
31
|
+
transport: detailsAmbiguous || !first ? "mesh" : first.actualTransportProviderId,
|
|
193
32
|
state: "active",
|
|
33
|
+
...(detailsAmbiguous ? {} : {
|
|
34
|
+
requestedModel: input.requestedModel,
|
|
35
|
+
...(first ? {
|
|
36
|
+
modelId: first.actualModelId,
|
|
37
|
+
upstreamModel: first.actualModelId,
|
|
38
|
+
routeReason: first.reason,
|
|
39
|
+
} : {}),
|
|
40
|
+
routePolicy: plan.policy.strategy.kind,
|
|
41
|
+
}),
|
|
42
|
+
createdAt: existing?.createdAt ?? at,
|
|
194
43
|
lastUsedAt: at,
|
|
195
44
|
updatedAt: at,
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
from: publicAccountDescriptor(from),
|
|
202
|
-
to: publicAccountDescriptor(to),
|
|
203
|
-
},
|
|
204
|
-
}),
|
|
205
|
-
};
|
|
206
|
-
setLedgerEntry(entry);
|
|
207
|
-
return entry;
|
|
208
|
-
}
|
|
209
|
-
export function recordSessionRateLimited(gatewaySessionId, account, options = {}) {
|
|
210
|
-
if (!gatewaySessionId)
|
|
211
|
-
return undefined;
|
|
212
|
-
const existing = _ledger.get(gatewaySessionId);
|
|
213
|
-
if (!existing)
|
|
214
|
-
return undefined;
|
|
215
|
-
const now = timestamp(options.now);
|
|
216
|
-
const rateLimit = {
|
|
217
|
-
at: now,
|
|
218
|
-
account: publicAccountDescriptor(account),
|
|
219
|
-
...(options.retryAfterMs !== undefined
|
|
220
|
-
? { retryAfterMs: options.retryAfterMs }
|
|
221
|
-
: {}),
|
|
222
|
-
};
|
|
223
|
-
const entry = {
|
|
224
|
-
...existing,
|
|
225
|
-
...(existing.detailsAmbiguous || !options.route
|
|
226
|
-
? {}
|
|
227
|
-
: routeFields(options.route)),
|
|
228
|
-
state: existing.inFlightRequests > 1 ? "active" : "rate-limited",
|
|
229
|
-
lastUsedAt: now,
|
|
230
|
-
updatedAt: now,
|
|
231
|
-
lastRateLimit: rateLimit,
|
|
45
|
+
requestCount: (existing?.requestCount ?? 0) + 1,
|
|
46
|
+
inFlightRequests: (existing?.inFlightRequests ?? 0) + 1,
|
|
47
|
+
detailsAmbiguous,
|
|
48
|
+
...(existing?.lastRateLimit ? { lastRateLimit: existing.lastRateLimit } : {}),
|
|
49
|
+
...(existing?.lastFallback ? { lastFallback: existing.lastFallback } : {}),
|
|
232
50
|
};
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
const existing =
|
|
51
|
+
ledger.set(session.sessionId, entry);
|
|
52
|
+
byClientSession.set(session.clientSessionId, session.sessionId);
|
|
53
|
+
}
|
|
54
|
+
export function recordRouteSettlement(settlement, now = new Date()) {
|
|
55
|
+
const lastAttempt = settlement.attempts.at(-1);
|
|
56
|
+
const planned = lastAttempt ? plansByCandidate.get(lastAttempt.candidateRef) : undefined;
|
|
57
|
+
const sessionId = planned?.session.sessionId ?? settlement.cost.principalId;
|
|
58
|
+
const existing = ledger.get(sessionId);
|
|
241
59
|
if (!existing)
|
|
242
|
-
return
|
|
60
|
+
return;
|
|
61
|
+
const diagnostic = lastAttempt ? planned?.diagnostics.get(lastAttempt.candidateRef) : undefined;
|
|
62
|
+
const at = now.toISOString();
|
|
243
63
|
const inFlightRequests = Math.max(0, existing.inFlightRequests - 1);
|
|
244
|
-
const
|
|
64
|
+
const rateLimited = lastAttempt?.outcome === "rate-limited";
|
|
65
|
+
const detailsAmbiguous = inFlightRequests > 0;
|
|
66
|
+
const account = diagnostic ? accountFromDiagnostic(diagnostic) : existing.account;
|
|
67
|
+
const firstAttempt = settlement.attempts[0];
|
|
68
|
+
const firstDiagnostic = firstAttempt
|
|
69
|
+
? planned?.diagnostics.get(firstAttempt.candidateRef)
|
|
70
|
+
: undefined;
|
|
71
|
+
const fallback = firstDiagnostic && diagnostic
|
|
72
|
+
&& firstDiagnostic.candidateRef !== diagnostic.candidateRef
|
|
73
|
+
? {
|
|
74
|
+
at,
|
|
75
|
+
from: accountFromDiagnostic(firstDiagnostic),
|
|
76
|
+
to: account,
|
|
77
|
+
}
|
|
78
|
+
: undefined;
|
|
245
79
|
const entry = {
|
|
246
80
|
...existing,
|
|
247
|
-
|
|
248
|
-
|
|
81
|
+
account: detailsAmbiguous ? unselectedAccount() : account,
|
|
82
|
+
transport: detailsAmbiguous
|
|
83
|
+
? "mesh"
|
|
84
|
+
: diagnostic?.actualTransportProviderId ?? existing.transport,
|
|
85
|
+
state: inFlightRequests > 0 ? "active" : rateLimited ? "rate-limited" : "idle",
|
|
86
|
+
...(detailsAmbiguous ? {} : {
|
|
87
|
+
requestedModel: settlement.requestedModel,
|
|
88
|
+
...(diagnostic ? {
|
|
89
|
+
modelId: diagnostic.actualModelId,
|
|
90
|
+
upstreamModel: diagnostic.actualModelId,
|
|
91
|
+
routeReason: diagnostic.reason,
|
|
92
|
+
} : {}),
|
|
93
|
+
}),
|
|
249
94
|
lastUsedAt: at,
|
|
250
95
|
updatedAt: at,
|
|
251
96
|
inFlightRequests,
|
|
97
|
+
detailsAmbiguous,
|
|
98
|
+
...(rateLimited ? {
|
|
99
|
+
lastRateLimit: { at, account },
|
|
100
|
+
} : {}),
|
|
101
|
+
...(fallback ? { lastFallback: fallback } : {}),
|
|
252
102
|
};
|
|
253
|
-
|
|
254
|
-
|
|
103
|
+
ledger.set(sessionId, entry);
|
|
104
|
+
if (planned) {
|
|
105
|
+
for (const candidateRef of planned.plan.candidateRefs)
|
|
106
|
+
plansByCandidate.delete(candidateRef);
|
|
107
|
+
}
|
|
255
108
|
}
|
|
256
109
|
export function listSessionLedger() {
|
|
257
|
-
return [...
|
|
110
|
+
return [...ledger.values()].sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
258
111
|
}
|
|
259
|
-
export function getSessionLedgerEntry(
|
|
260
|
-
return
|
|
112
|
+
export function getSessionLedgerEntry(sessionId) {
|
|
113
|
+
return ledger.get(sessionId);
|
|
261
114
|
}
|
|
262
|
-
/** O(1) lookup for the exact client/tmux session status endpoint. */
|
|
263
115
|
export function getSessionLedgerEntryForClient(clientSessionId) {
|
|
264
|
-
const
|
|
265
|
-
return
|
|
116
|
+
const sessionId = byClientSession.get(clientSessionId);
|
|
117
|
+
return sessionId ? ledger.get(sessionId) : undefined;
|
|
266
118
|
}
|
|
267
119
|
export function resetSessionLedger() {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
120
|
+
ledger.clear();
|
|
121
|
+
byClientSession.clear();
|
|
122
|
+
plansByCandidate.clear();
|
|
271
123
|
}
|
|
272
124
|
//# sourceMappingURL=session-ledger.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-ledger.js","sourceRoot":"","sources":["../../src/llm-gateway-runtime/session-ledger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-ledger.js","sourceRoot":"","sources":["../../src/llm-gateway-runtime/session-ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,58 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
readonly targetProviderId: string;
|
|
9
|
-
readonly modelId?: string;
|
|
10
|
-
readonly workspaceId?: string;
|
|
11
|
-
readonly affinityKey?: string;
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
export declare function readSticky(): Promise<Record<string, string>>;
|
|
15
|
-
export declare function writeSticky(sessionId: string, accountId: string | undefined, requiredTransport?: GatewayUpstreamTransport, transportConstraints?: SessionTransportConstraints): Promise<void>;
|
|
1
|
+
/**
|
|
2
|
+
* Local gateway bearer registry.
|
|
3
|
+
*
|
|
4
|
+
* H2A owns only minting and forwarding this opaque, process-local bearer. It
|
|
5
|
+
* contains no provider credential, account binding, route, model or affinity.
|
|
6
|
+
* Mesh owns every one of those concerns after caller authentication.
|
|
7
|
+
*/
|
|
16
8
|
export interface SessionEntry {
|
|
17
|
-
sessionId: string;
|
|
18
|
-
gatewayToken: string;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
requiredTransport?: GatewayUpstreamTransport;
|
|
24
|
-
transportConstraints?: SessionTransportConstraints;
|
|
25
|
-
}
|
|
26
|
-
export declare function gatewayTokenForSession(sessionId: string): string;
|
|
27
|
-
export declare function sessionCount(): number;
|
|
28
|
-
export declare function lookupToken(gatewayToken: string): Promise<SessionEntry | undefined>;
|
|
29
|
-
export declare function rebindGatewaySession(gatewayToken: string, account: AccountDescriptor, route?: RoutingTarget): Promise<SessionEntry | undefined>;
|
|
30
|
-
export interface SessionResult {
|
|
31
|
-
gatewayToken: string;
|
|
32
|
-
accountId: string;
|
|
33
|
-
requestedModel?: string;
|
|
34
|
-
modelId?: string;
|
|
35
|
-
upstreamModel?: string;
|
|
36
|
-
reasoningEffort?: string;
|
|
37
|
-
provider: string;
|
|
38
|
-
authType: "api-key" | "bearer";
|
|
39
|
-
transport: GatewayUpstreamTransport;
|
|
40
|
-
routePolicy?: string;
|
|
41
|
-
routeReason?: string;
|
|
9
|
+
readonly sessionId: string;
|
|
10
|
+
readonly gatewayToken: string;
|
|
11
|
+
readonly clientSessionId: string;
|
|
12
|
+
readonly workspaceId?: string;
|
|
13
|
+
readonly profile?: string;
|
|
14
|
+
readonly createdAt: string;
|
|
42
15
|
}
|
|
43
16
|
export interface AcquireSessionOptions {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
17
|
+
readonly clientSessionId?: string;
|
|
18
|
+
readonly workspaceId?: string;
|
|
19
|
+
readonly profile?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface SessionResult {
|
|
22
|
+
readonly gatewayToken: string;
|
|
23
|
+
readonly sessionId: string;
|
|
24
|
+
readonly clientSessionId: string;
|
|
51
25
|
}
|
|
52
|
-
/**
|
|
53
|
-
* Acquire or re-acquire a session for a given sessionId.
|
|
54
|
-
* Idempotent: the same sessionId always maps to the same accountId and token.
|
|
55
|
-
* The token is derived from LLM_GATEWAY_TOKEN_SEED + sessionId, never persisted.
|
|
56
|
-
*/
|
|
57
26
|
export declare function acquireSession(sessionId: string, options?: AcquireSessionOptions): Promise<SessionResult>;
|
|
27
|
+
export declare function lookupToken(gatewayToken: string): Promise<SessionEntry | undefined>;
|
|
28
|
+
export declare function lookupSessionById(sessionId: string): SessionEntry | undefined;
|
|
29
|
+
export declare function sessionCount(): number;
|
|
30
|
+
export declare function resetSessions(): void;
|
|
58
31
|
//# sourceMappingURL=sticky.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sticky.d.ts","sourceRoot":"","sources":["../../src/llm-gateway-runtime/sticky.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sticky.d.ts","sourceRoot":"","sources":["../../src/llm-gateway-runtime/sticky.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAOD,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,aAAa,CAAC,CA8BxB;AAED,wBAAsB,WAAW,CAC/B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAEnC;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAG7E;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAGpC"}
|