@sentropic/h2a-runtime 0.85.25 → 0.87.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/cli-help-groups.d.ts +124 -0
- package/dist/cli-help-groups.d.ts.map +1 -0
- package/dist/cli-help-groups.js +297 -0
- package/dist/cli-help-groups.js.map +1 -0
- package/dist/enroll.d.ts.map +1 -1
- package/dist/enroll.js +40 -2
- package/dist/enroll.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +314 -27
- package/dist/index.js.map +1 -1
- package/dist/llm-gateway-runtime/accounts.d.ts.map +1 -1
- package/dist/llm-gateway-runtime/accounts.js +2 -6
- package/dist/llm-gateway-runtime/accounts.js.map +1 -1
- package/dist/llm-gateway-runtime/index.d.ts.map +1 -1
- package/dist/llm-gateway-runtime/index.js +9 -1
- package/dist/llm-gateway-runtime/index.js.map +1 -1
- package/dist/llm-gateway-runtime/model-catalog.d.ts +10 -3
- package/dist/llm-gateway-runtime/model-catalog.d.ts.map +1 -1
- package/dist/llm-gateway-runtime/model-catalog.js +49 -119
- package/dist/llm-gateway-runtime/model-catalog.js.map +1 -1
- package/dist/llm-gateway-runtime/proxy-anthropic.d.ts.map +1 -1
- package/dist/llm-gateway-runtime/proxy-anthropic.js +117 -24
- package/dist/llm-gateway-runtime/proxy-anthropic.js.map +1 -1
- package/dist/llm-gateway-runtime/proxy-gemini.d.ts.map +1 -1
- package/dist/llm-gateway-runtime/proxy-gemini.js +0 -2
- package/dist/llm-gateway-runtime/proxy-gemini.js.map +1 -1
- package/dist/llm-gateway-runtime/proxy-openai.d.ts +4 -7
- package/dist/llm-gateway-runtime/proxy-openai.d.ts.map +1 -1
- package/dist/llm-gateway-runtime/proxy-openai.js +18 -13
- package/dist/llm-gateway-runtime/proxy-openai.js.map +1 -1
- package/dist/llm-gateway-runtime/session-ledger.d.ts +34 -0
- package/dist/llm-gateway-runtime/session-ledger.d.ts.map +1 -1
- package/dist/llm-gateway-runtime/session-ledger.js +216 -6
- package/dist/llm-gateway-runtime/session-ledger.js.map +1 -1
- package/dist/llm-mesh.d.ts +3 -0
- package/dist/llm-mesh.d.ts.map +1 -1
- package/dist/llm-mesh.js +23 -0
- package/dist/llm-mesh.js.map +1 -1
- package/dist/protocol-local.d.ts +3 -0
- package/dist/protocol-local.d.ts.map +1 -1
- package/dist/protocol-local.js +7 -0
- package/dist/protocol-local.js.map +1 -1
- package/dist/registry.d.ts +53 -4
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +109 -6
- package/dist/registry.js.map +1 -1
- package/dist/restore.d.ts +75 -4
- package/dist/restore.d.ts.map +1 -1
- package/dist/restore.js +268 -24
- package/dist/restore.js.map +1 -1
- package/dist/session-class.d.ts +10 -0
- package/dist/session-class.d.ts.map +1 -0
- package/dist/session-class.js +11 -0
- package/dist/session-class.js.map +1 -0
- package/dist/status-projection.d.ts +97 -0
- package/dist/status-projection.d.ts.map +1 -0
- package/dist/status-projection.js +464 -0
- package/dist/status-projection.js.map +1 -0
- package/dist/tmux-name-migration.d.ts +52 -0
- package/dist/tmux-name-migration.d.ts.map +1 -0
- package/dist/tmux-name-migration.js +408 -0
- package/dist/tmux-name-migration.js.map +1 -0
- package/dist/tmux.d.ts +54 -1
- package/dist/tmux.d.ts.map +1 -1
- package/dist/tmux.js +232 -16
- package/dist/tmux.js.map +1 -1
- package/package.json +8 -4
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
import { projectRemoteAgents } from "./agents-projection.js";
|
|
2
|
+
import { loadRegistryWithDiagnostics, listJobs, listLive, localLsRows, } from "./registry.js";
|
|
3
|
+
import { currentTmuxSessionName, localSessionAgentPanePid, listLocalSessionsWithDiagnostics, readLaunchContext, } from "./tmux.js";
|
|
4
|
+
import { legacyClientSessionIdForMigratedSession } from "./tmux-name-migration.js";
|
|
5
|
+
function cleanDisplay(value, maxScalars = 256) {
|
|
6
|
+
const clean = value
|
|
7
|
+
.replace(/[\p{Cc}\p{Cf}\p{Cs}\u2028\u2029]/gu, " ")
|
|
8
|
+
.replace(/[#\[\]]/g, "")
|
|
9
|
+
.replace(/\s+/g, " ")
|
|
10
|
+
.trim();
|
|
11
|
+
const scalars = Array.from(clean);
|
|
12
|
+
return scalars.length > maxScalars
|
|
13
|
+
? `${scalars.slice(0, maxScalars).join("")}[cut]`
|
|
14
|
+
: clean;
|
|
15
|
+
}
|
|
16
|
+
function cleanGatewayModel(value) {
|
|
17
|
+
const clean = value
|
|
18
|
+
.replace(/[\p{Cc}\p{Cf}\p{Cs}\u2028\u2029]/gu, " ")
|
|
19
|
+
.replace(/[#\[\]]/g, "")
|
|
20
|
+
.replace(/\s+/g, " ")
|
|
21
|
+
.trim();
|
|
22
|
+
const scalars = Array.from(clean);
|
|
23
|
+
return {
|
|
24
|
+
value: scalars.slice(0, 256).join(""),
|
|
25
|
+
truncated: scalars.length > 256,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const GENERIC_ACCOUNT_LABEL = /^(?:raw\s+)?(?:api\s+key|bearer|oauth)$/i;
|
|
29
|
+
const ACTIVE_STALE_AFTER_MS = 5 * 60_000;
|
|
30
|
+
const RATE_LIMIT_WITHOUT_RETRY_STALE_AFTER_MS = 60_000;
|
|
31
|
+
function safeAccountLabel(account) {
|
|
32
|
+
const label = cleanDisplay(account.label);
|
|
33
|
+
return !label || GENERIC_ACCOUNT_LABEL.test(label)
|
|
34
|
+
? cleanDisplay(account.id)
|
|
35
|
+
: label;
|
|
36
|
+
}
|
|
37
|
+
function isPublicAccountDescriptor(value) {
|
|
38
|
+
if (!value || typeof value !== "object")
|
|
39
|
+
return false;
|
|
40
|
+
const account = value;
|
|
41
|
+
return (typeof account.id === "string" &&
|
|
42
|
+
typeof account.provider === "string" &&
|
|
43
|
+
typeof account.label === "string");
|
|
44
|
+
}
|
|
45
|
+
function isLedgerEntry(value) {
|
|
46
|
+
if (!value || typeof value !== "object")
|
|
47
|
+
return false;
|
|
48
|
+
const row = value;
|
|
49
|
+
return (typeof row.gatewaySessionId === "string" &&
|
|
50
|
+
typeof row.clientSessionId === "string" &&
|
|
51
|
+
(row.state === "idle" || row.state === "active" || row.state === "rate-limited") &&
|
|
52
|
+
typeof row.updatedAt === "string" &&
|
|
53
|
+
(row.detailsAmbiguous === undefined ||
|
|
54
|
+
typeof row.detailsAmbiguous === "boolean") &&
|
|
55
|
+
isPublicAccountDescriptor(row.account) &&
|
|
56
|
+
(row.lastRateLimit === undefined ||
|
|
57
|
+
(!!row.lastRateLimit &&
|
|
58
|
+
typeof row.lastRateLimit.at === "string" &&
|
|
59
|
+
isPublicAccountDescriptor(row.lastRateLimit.account))) &&
|
|
60
|
+
(row.lastFallback === undefined ||
|
|
61
|
+
(!!row.lastFallback &&
|
|
62
|
+
typeof row.lastFallback.at === "string" &&
|
|
63
|
+
isPublicAccountDescriptor(row.lastFallback.from) &&
|
|
64
|
+
isPublicAccountDescriptor(row.lastFallback.to))));
|
|
65
|
+
}
|
|
66
|
+
export function selectExactGatewayLedgerEntry(values, clientSessionId) {
|
|
67
|
+
return values
|
|
68
|
+
.filter(isLedgerEntry)
|
|
69
|
+
.filter((entry) => entry.clientSessionId === clientSessionId)
|
|
70
|
+
.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))[0];
|
|
71
|
+
}
|
|
72
|
+
export function gatewayFromLedger(entry, nowMs = Date.now()) {
|
|
73
|
+
const updatedAtMs = Date.parse(entry.updatedAt);
|
|
74
|
+
if (!Number.isFinite(updatedAtMs)) {
|
|
75
|
+
return {
|
|
76
|
+
state: "unknown",
|
|
77
|
+
clientSessionId: cleanDisplay(entry.clientSessionId),
|
|
78
|
+
reason: "gateway snapshot has an invalid update time",
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
if (entry.state === "active" &&
|
|
82
|
+
nowMs - updatedAtMs > ACTIVE_STALE_AFTER_MS) {
|
|
83
|
+
return {
|
|
84
|
+
state: "unknown",
|
|
85
|
+
clientSessionId: cleanDisplay(entry.clientSessionId),
|
|
86
|
+
updatedAt: entry.updatedAt,
|
|
87
|
+
reason: "gateway active snapshot is stale",
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
let retryAfter;
|
|
91
|
+
if (entry.state === "rate-limited") {
|
|
92
|
+
const rateLimitAt = entry.lastRateLimit
|
|
93
|
+
? Date.parse(entry.lastRateLimit.at)
|
|
94
|
+
: Number.NaN;
|
|
95
|
+
if (!Number.isFinite(rateLimitAt)) {
|
|
96
|
+
return {
|
|
97
|
+
state: "unknown",
|
|
98
|
+
clientSessionId: cleanDisplay(entry.clientSessionId),
|
|
99
|
+
updatedAt: entry.updatedAt,
|
|
100
|
+
reason: "gateway 429 snapshot has no valid rate-limit time",
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (entry.lastRateLimit?.retryAfterMs !== undefined) {
|
|
104
|
+
retryAfter = Math.max(0, rateLimitAt + entry.lastRateLimit.retryAfterMs - nowMs);
|
|
105
|
+
if (retryAfter === 0) {
|
|
106
|
+
return {
|
|
107
|
+
state: "unknown",
|
|
108
|
+
clientSessionId: cleanDisplay(entry.clientSessionId),
|
|
109
|
+
updatedAt: entry.updatedAt,
|
|
110
|
+
reason: "gateway 429 retry window has expired",
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else if (nowMs - updatedAtMs > RATE_LIMIT_WITHOUT_RETRY_STALE_AFTER_MS) {
|
|
115
|
+
return {
|
|
116
|
+
state: "unknown",
|
|
117
|
+
clientSessionId: cleanDisplay(entry.clientSessionId),
|
|
118
|
+
updatedAt: entry.updatedAt,
|
|
119
|
+
reason: "gateway 429 snapshot is stale",
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const requested = !entry.detailsAmbiguous && entry.requestedModel
|
|
124
|
+
? cleanGatewayModel(entry.requestedModel)
|
|
125
|
+
: undefined;
|
|
126
|
+
const upstream = !entry.detailsAmbiguous && entry.upstreamModel
|
|
127
|
+
? cleanGatewayModel(entry.upstreamModel)
|
|
128
|
+
: undefined;
|
|
129
|
+
return {
|
|
130
|
+
state: entry.state,
|
|
131
|
+
clientSessionId: cleanDisplay(entry.clientSessionId),
|
|
132
|
+
gatewaySessionId: cleanDisplay(entry.gatewaySessionId),
|
|
133
|
+
...(requested
|
|
134
|
+
? {
|
|
135
|
+
requestedModel: requested.value,
|
|
136
|
+
...(requested.truncated ? { requestedModelTruncated: true } : {}),
|
|
137
|
+
}
|
|
138
|
+
: {}),
|
|
139
|
+
...(upstream
|
|
140
|
+
? {
|
|
141
|
+
upstreamModel: upstream.value,
|
|
142
|
+
...(upstream.truncated ? { upstreamModelTruncated: true } : {}),
|
|
143
|
+
}
|
|
144
|
+
: {}),
|
|
145
|
+
...(!entry.detailsAmbiguous
|
|
146
|
+
? {
|
|
147
|
+
provider: cleanDisplay(entry.account.provider),
|
|
148
|
+
transport: entry.transport,
|
|
149
|
+
accountId: cleanDisplay(entry.account.id),
|
|
150
|
+
accountLabel: safeAccountLabel(entry.account),
|
|
151
|
+
}
|
|
152
|
+
: {}),
|
|
153
|
+
...(!entry.detailsAmbiguous && entry.lastFallback
|
|
154
|
+
? {
|
|
155
|
+
previousAccountLabel: safeAccountLabel(entry.lastFallback.from),
|
|
156
|
+
fallbackAccountLabel: safeAccountLabel(entry.lastFallback.to),
|
|
157
|
+
}
|
|
158
|
+
: {}),
|
|
159
|
+
...(retryAfter !== undefined ? { retryAfterMs: retryAfter } : {}),
|
|
160
|
+
updatedAt: entry.updatedAt,
|
|
161
|
+
...(entry.detailsAmbiguous
|
|
162
|
+
? { reason: "gateway route/account details are ambiguous after overlapping requests" }
|
|
163
|
+
: {}),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function localGatewayStatusUrl(baseUrl, clientSessionId) {
|
|
167
|
+
try {
|
|
168
|
+
const parsed = new URL(baseUrl);
|
|
169
|
+
if ((parsed.protocol !== "http:" && parsed.protocol !== "https:") ||
|
|
170
|
+
(parsed.hostname !== "localhost" && parsed.hostname !== "127.0.0.1") ||
|
|
171
|
+
parsed.username ||
|
|
172
|
+
parsed.password) {
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
return new URL(`/v1/status/client/${encodeURIComponent(clientSessionId)}`, parsed.origin).toString();
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return undefined;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
export function uniqueManagedWork(agents) {
|
|
182
|
+
const delegatedTmuxSessions = new Set(agents.flatMap((agent) => agent.kind === "delegated-job" && agent.tmuxSession
|
|
183
|
+
? [agent.tmuxSession]
|
|
184
|
+
: []));
|
|
185
|
+
return agents.filter((agent) => agent.kind !== "local-session" ||
|
|
186
|
+
!agent.tmuxSession ||
|
|
187
|
+
!delegatedTmuxSessions.has(agent.tmuxSession));
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Project only work that carries an explicit delegator identity AND the exact
|
|
191
|
+
* tmux session that made the request. Old background sessions and generic
|
|
192
|
+
* registry jobs cannot be attributed retrospectively, so they degrade J to
|
|
193
|
+
* UNKNOWN rather than being silently omitted or counted for the wrong owner.
|
|
194
|
+
*/
|
|
195
|
+
export function projectDelegatedExecutions(entries, registryKnown, tmuxSessions, delegatorTmuxSession, delegatorInstance, attestations = [], attestationsKnown = true, workerPidForTmuxSession = localSessionAgentPanePid) {
|
|
196
|
+
if (!registryKnown || !attestationsKnown || !delegatorTmuxSession || !delegatorInstance) {
|
|
197
|
+
return { executions: [], degraded: true };
|
|
198
|
+
}
|
|
199
|
+
const attestationByWorker = new Map();
|
|
200
|
+
const ambiguousWorkers = new Set();
|
|
201
|
+
for (const attestation of attestations) {
|
|
202
|
+
const existing = attestationByWorker.get(attestation.workerTmuxSession);
|
|
203
|
+
if (existing) {
|
|
204
|
+
ambiguousWorkers.add(attestation.workerTmuxSession);
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
attestationByWorker.set(attestation.workerTmuxSession, attestation);
|
|
208
|
+
}
|
|
209
|
+
const liveTmux = new Set(tmuxSessions.map((session) => session.name));
|
|
210
|
+
let degraded = false;
|
|
211
|
+
const executions = [];
|
|
212
|
+
for (const entry of entries) {
|
|
213
|
+
if (entry.sessionClass !== "background" && entry.role !== "job")
|
|
214
|
+
continue;
|
|
215
|
+
if (entry.jobState === "done")
|
|
216
|
+
continue;
|
|
217
|
+
const attestation = entry.tmuxSession && !ambiguousWorkers.has(entry.tmuxSession)
|
|
218
|
+
? attestationByWorker.get(entry.tmuxSession)
|
|
219
|
+
: undefined;
|
|
220
|
+
// Session names are reusable. A sidecar attestation establishes MCP origin
|
|
221
|
+
// only when it also binds to the pid that the runtime observed for this
|
|
222
|
+
// currently-live worker; otherwise it is stale/unverifiable evidence.
|
|
223
|
+
const requiresLivePaneProof = attestation !== undefined ||
|
|
224
|
+
(entry.delegationOrigin === "cli:h2a-delegate" &&
|
|
225
|
+
entry.jobState !== "pending" && entry.jobState !== "failed");
|
|
226
|
+
const liveWorkerPid = requiresLivePaneProof && entry.tmuxSession
|
|
227
|
+
? workerPidForTmuxSession(entry.tmuxSession)
|
|
228
|
+
: undefined;
|
|
229
|
+
const attestationMatchesWorker = attestation !== undefined &&
|
|
230
|
+
liveWorkerPid !== undefined && liveWorkerPid === attestation.workerPid;
|
|
231
|
+
// MCP provenance is authoritative only through the sidecar record. Older
|
|
232
|
+
// runtime rows that merely spell `mcp:h2a_run` have no trusted origin.
|
|
233
|
+
const inlineOrigin = entry.delegationOrigin === "cli:h2a-delegate"
|
|
234
|
+
? entry.delegationOrigin
|
|
235
|
+
: undefined;
|
|
236
|
+
const origin = attestationMatchesWorker ? attestation.origin : inlineOrigin;
|
|
237
|
+
const entryDelegatorInstance = attestationMatchesWorker
|
|
238
|
+
? attestation.delegatorInstance
|
|
239
|
+
: inlineOrigin ? entry.delegatorInstance : undefined;
|
|
240
|
+
const entryDelegatorTmuxSession = attestationMatchesWorker
|
|
241
|
+
? attestation.delegatorTmuxSession
|
|
242
|
+
: inlineOrigin ? entry.delegatorTmuxSession : undefined;
|
|
243
|
+
const hasProvenance = origin !== undefined &&
|
|
244
|
+
typeof entryDelegatorInstance === "string" &&
|
|
245
|
+
entryDelegatorInstance.length > 0 &&
|
|
246
|
+
typeof entryDelegatorTmuxSession === "string" &&
|
|
247
|
+
entryDelegatorTmuxSession.length > 0;
|
|
248
|
+
if (!hasProvenance) {
|
|
249
|
+
// It may belong to this owner, but the old record gives no authority to
|
|
250
|
+
// claim either zero or another owner's work.
|
|
251
|
+
degraded = true;
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
if (entryDelegatorTmuxSession !== delegatorTmuxSession ||
|
|
255
|
+
entryDelegatorInstance !== delegatorInstance)
|
|
256
|
+
continue;
|
|
257
|
+
if (entry.jobState === "failed") {
|
|
258
|
+
executions.push({
|
|
259
|
+
id: entry.id,
|
|
260
|
+
origin: origin,
|
|
261
|
+
delegatorInstance: entryDelegatorInstance,
|
|
262
|
+
delegatorTmuxSession: entryDelegatorTmuxSession,
|
|
263
|
+
tool: entry.tool,
|
|
264
|
+
state: "failed",
|
|
265
|
+
});
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
if (entry.jobState === "pending") {
|
|
269
|
+
// Queued work has a durable lifecycle row but no worker pane yet.
|
|
270
|
+
executions.push({
|
|
271
|
+
id: entry.id,
|
|
272
|
+
origin: origin,
|
|
273
|
+
delegatorInstance: entryDelegatorInstance,
|
|
274
|
+
delegatorTmuxSession: entryDelegatorTmuxSession,
|
|
275
|
+
tool: entry.tool,
|
|
276
|
+
state: "pending",
|
|
277
|
+
});
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
if (entry.kind !== "local-tmux" || !entry.tmuxSession || !liveTmux.has(entry.tmuxSession)) {
|
|
281
|
+
// The structured MCP launcher terminates its tmux session with the agent.
|
|
282
|
+
// A vanished row without a terminal result is unverifiable, not failed.
|
|
283
|
+
degraded = true;
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
// A tmux wrapper can outlive or replace an agent. For executable work, the
|
|
287
|
+
// recorded launch pid must still be the exact recorded agent pane pid.
|
|
288
|
+
if (entry.pid === undefined || liveWorkerPid !== entry.pid) {
|
|
289
|
+
degraded = true;
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
executions.push({
|
|
293
|
+
id: entry.id,
|
|
294
|
+
origin: origin,
|
|
295
|
+
delegatorInstance: entryDelegatorInstance,
|
|
296
|
+
delegatorTmuxSession: entryDelegatorTmuxSession,
|
|
297
|
+
tool: entry.tool,
|
|
298
|
+
state: entry.jobState === "throttled"
|
|
299
|
+
? entry.jobState
|
|
300
|
+
: "running",
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
return { executions, degraded };
|
|
304
|
+
}
|
|
305
|
+
async function readGatewayStatus(session, launchContext, options) {
|
|
306
|
+
if (!launchContext) {
|
|
307
|
+
return {
|
|
308
|
+
state: "unknown",
|
|
309
|
+
clientSessionId: session.name,
|
|
310
|
+
reason: "managed session has no recorded launch context",
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
if (launchContext.gateway === "off") {
|
|
314
|
+
return { state: "off", clientSessionId: session.name };
|
|
315
|
+
}
|
|
316
|
+
if (!launchContext.gatewayBaseUrl) {
|
|
317
|
+
return {
|
|
318
|
+
state: "unavailable",
|
|
319
|
+
clientSessionId: session.name,
|
|
320
|
+
reason: "gateway is on but no safe local status URL was recorded",
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
if (!localGatewayStatusUrl(launchContext.gatewayBaseUrl, session.name)) {
|
|
324
|
+
return {
|
|
325
|
+
state: "unavailable",
|
|
326
|
+
clientSessionId: session.name,
|
|
327
|
+
reason: "gateway status URL is not a safe local URL",
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
331
|
+
try {
|
|
332
|
+
const readExactClient = async (clientSessionId) => {
|
|
333
|
+
const url = localGatewayStatusUrl(launchContext.gatewayBaseUrl, clientSessionId);
|
|
334
|
+
if (!url)
|
|
335
|
+
throw new Error("unsafe gateway status URL");
|
|
336
|
+
const response = await fetchImpl(url, {
|
|
337
|
+
signal: AbortSignal.timeout(options.gatewayTimeoutMs ?? 400),
|
|
338
|
+
});
|
|
339
|
+
if (response.status === 404)
|
|
340
|
+
return undefined;
|
|
341
|
+
if (!response.ok)
|
|
342
|
+
throw new Error(`gateway status returned ${response.status}`);
|
|
343
|
+
const body = await response.json();
|
|
344
|
+
if (!isLedgerEntry(body))
|
|
345
|
+
throw new Error("gateway status returned an invalid snapshot");
|
|
346
|
+
return body;
|
|
347
|
+
};
|
|
348
|
+
const exactEntry = await readExactClient(session.name);
|
|
349
|
+
const legacyClientSessionId = exactEntry
|
|
350
|
+
? undefined
|
|
351
|
+
: legacyClientSessionIdForMigratedSession(session);
|
|
352
|
+
const entry = exactEntry ??
|
|
353
|
+
(legacyClientSessionId
|
|
354
|
+
? await readExactClient(legacyClientSessionId)
|
|
355
|
+
: undefined);
|
|
356
|
+
if (!entry) {
|
|
357
|
+
return {
|
|
358
|
+
state: "unknown",
|
|
359
|
+
clientSessionId: session.name,
|
|
360
|
+
reason: "gateway has no snapshot for this exact tmux session",
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
const projected = gatewayFromLedger(entry);
|
|
364
|
+
return legacyClientSessionId
|
|
365
|
+
? {
|
|
366
|
+
...projected,
|
|
367
|
+
reason: projected.reason ??
|
|
368
|
+
"gateway snapshot is correlated through the verified tmux rename journal",
|
|
369
|
+
}
|
|
370
|
+
: projected;
|
|
371
|
+
}
|
|
372
|
+
catch (error) {
|
|
373
|
+
return {
|
|
374
|
+
state: "unavailable",
|
|
375
|
+
clientSessionId: session.name,
|
|
376
|
+
reason: error instanceof Error && error.name === "TimeoutError"
|
|
377
|
+
? "gateway status timed out"
|
|
378
|
+
: "gateway status could not be read",
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
export async function projectStatusForH2a(options = {}) {
|
|
383
|
+
const warnings = [];
|
|
384
|
+
let sessions = [];
|
|
385
|
+
let rows = [];
|
|
386
|
+
let agents = [];
|
|
387
|
+
let registryEntries = [];
|
|
388
|
+
let registryKnown = false;
|
|
389
|
+
let degraded = false;
|
|
390
|
+
let tmuxKnown = true;
|
|
391
|
+
try {
|
|
392
|
+
const inventory = listLocalSessionsWithDiagnostics();
|
|
393
|
+
sessions = inventory.sessions;
|
|
394
|
+
tmuxKnown = inventory.known;
|
|
395
|
+
if (!tmuxKnown) {
|
|
396
|
+
degraded = true;
|
|
397
|
+
warnings.push(inventory.reason ?? "tmux inventory is unavailable");
|
|
398
|
+
}
|
|
399
|
+
if (options.includeDelegations !== false) {
|
|
400
|
+
const registry = loadRegistryWithDiagnostics();
|
|
401
|
+
registryEntries = registry.entries;
|
|
402
|
+
registryKnown = registry.known;
|
|
403
|
+
if (!registryKnown) {
|
|
404
|
+
warnings.push(registry.reason ?? "registry is unavailable");
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
// The bar's owner-scoped J signal does not consume the broad managed
|
|
408
|
+
// inventory. Keep this potentially expensive registry/job traversal for
|
|
409
|
+
// the explicit human detail view only.
|
|
410
|
+
if (options.includeManagedInventory !== false) {
|
|
411
|
+
const live = listLive();
|
|
412
|
+
rows = localLsRows(sessions, live);
|
|
413
|
+
agents = uniqueManagedWork(projectRemoteAgents({ jobs: listJobs(), localRows: rows }).agents);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
catch {
|
|
417
|
+
degraded = true;
|
|
418
|
+
warnings.push("managed runtime projection could not be read");
|
|
419
|
+
}
|
|
420
|
+
const requestedTmuxSession = options.tmuxSession ?? currentTmuxSessionName();
|
|
421
|
+
const exact = requestedTmuxSession
|
|
422
|
+
? sessions.find((session) => session.name === requestedTmuxSession)
|
|
423
|
+
: undefined;
|
|
424
|
+
const sessionState = requestedTmuxSession
|
|
425
|
+
? !tmuxKnown
|
|
426
|
+
? "unknown"
|
|
427
|
+
: exact
|
|
428
|
+
? "present"
|
|
429
|
+
: "absent"
|
|
430
|
+
: "unknown";
|
|
431
|
+
const launchContext = exact ? readLaunchContext(exact.name) : undefined;
|
|
432
|
+
const delegations = options.includeDelegations === false
|
|
433
|
+
? { executions: [], degraded: true }
|
|
434
|
+
: projectDelegatedExecutions(registryEntries, registryKnown, sessions, requestedTmuxSession, options.ownerInstance, options.delegationAttestations, options.delegationAttestationsKnown);
|
|
435
|
+
const gateway = exact
|
|
436
|
+
? options.includeGateway === false
|
|
437
|
+
? {
|
|
438
|
+
state: "unknown",
|
|
439
|
+
clientSessionId: exact.name,
|
|
440
|
+
reason: "gateway status was not requested",
|
|
441
|
+
}
|
|
442
|
+
: await readGatewayStatus(exact, launchContext, options)
|
|
443
|
+
: {
|
|
444
|
+
state: "unknown",
|
|
445
|
+
...(requestedTmuxSession
|
|
446
|
+
? { clientSessionId: requestedTmuxSession, reason: "no managed h2a tmux session" }
|
|
447
|
+
: { reason: "no exact tmux session requested" }),
|
|
448
|
+
};
|
|
449
|
+
return {
|
|
450
|
+
kind: "h2a-status-runtime",
|
|
451
|
+
version: 1,
|
|
452
|
+
session: {
|
|
453
|
+
state: sessionState,
|
|
454
|
+
...(requestedTmuxSession ? { tmuxSession: requestedTmuxSession } : {}),
|
|
455
|
+
...(exact ? { profile: exact.profile, path: exact.path } : {}),
|
|
456
|
+
...(launchContext ? { launchContext } : {}),
|
|
457
|
+
},
|
|
458
|
+
managed: { agents, rows, degraded, attentionComplete: false },
|
|
459
|
+
delegations,
|
|
460
|
+
gateway,
|
|
461
|
+
warnings,
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
//# sourceMappingURL=status-projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-projection.js","sourceRoot":"","sources":["../src/status-projection.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAA8B,MAAM,wBAAwB,CAAC;AACzF,OAAO,EACL,2BAA2B,EAC3B,QAAQ,EACR,QAAQ,EACR,WAAW,GAGZ,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,gCAAgC,EAChC,iBAAiB,GAElB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,uCAAuC,EAAE,MAAM,0BAA0B,CAAC;AAyFnF,SAAS,YAAY,CAAC,KAAa,EAAE,UAAU,GAAG,GAAG;IACnD,MAAM,KAAK,GAAG,KAAK;SAChB,OAAO,CAAC,oCAAoC,EAAE,GAAG,CAAC;SAClD,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;IACV,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,OAAO,CAAC,MAAM,GAAG,UAAU;QAChC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO;QACjD,CAAC,CAAC,KAAK,CAAC;AACZ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,MAAM,KAAK,GAAG,KAAK;SAChB,OAAO,CAAC,oCAAoC,EAAE,GAAG,CAAC;SAClD,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;IACV,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,SAAS,EAAE,OAAO,CAAC,MAAM,GAAG,GAAG;KAChC,CAAC;AACJ,CAAC;AAED,MAAM,qBAAqB,GAAG,0CAA0C,CAAC;AACzE,MAAM,qBAAqB,GAAG,CAAC,GAAG,MAAM,CAAC;AACzC,MAAM,uCAAuC,GAAG,MAAM,CAAC;AAEvD,SAAS,gBAAgB,CAAC,OAAgC;IACxD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO,CAAC,KAAK,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC;QAChD,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,CAAC,CAAC,KAAK,CAAC;AACZ,CAAC;AAED,SAAS,yBAAyB,CAChC,KAAc;IAEd,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,OAAO,GAAG,KAAyC,CAAC;IAC1D,OAAO,CACL,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ;QAC9B,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;QACpC,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAClC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,GAAG,GAAG,KAAoC,CAAC;IACjD,OAAO,CACL,OAAO,GAAG,CAAC,gBAAgB,KAAK,QAAQ;QACxC,OAAO,GAAG,CAAC,eAAe,KAAK,QAAQ;QACvC,CAAC,GAAG,CAAC,KAAK,KAAK,MAAM,IAAI,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,KAAK,cAAc,CAAC;QAChF,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ;QACjC,CAAC,GAAG,CAAC,gBAAgB,KAAK,SAAS;YACjC,OAAO,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC;QAC5C,yBAAyB,CAAC,GAAG,CAAC,OAAO,CAAC;QACtC,CAAC,GAAG,CAAC,aAAa,KAAK,SAAS;YAC9B,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa;gBAClB,OAAO,GAAG,CAAC,aAAa,CAAC,EAAE,KAAK,QAAQ;gBACxC,yBAAyB,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1D,CAAC,GAAG,CAAC,YAAY,KAAK,SAAS;YAC7B,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY;gBACjB,OAAO,GAAG,CAAC,YAAY,CAAC,EAAE,KAAK,QAAQ;gBACvC,yBAAyB,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC;gBAChD,yBAAyB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CACrD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,MAA0B,EAC1B,eAAuB;IAEvB,OAAO,MAAM;SACV,MAAM,CAAC,aAAa,CAAC;SACrB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,KAAK,eAAe,CAAC;SAC5D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,KAAyB,EACzB,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;IAElB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,eAAe,EAAE,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC;YACpD,MAAM,EAAE,6CAA6C;SACtD,CAAC;IACJ,CAAC;IACD,IACE,KAAK,CAAC,KAAK,KAAK,QAAQ;QACxB,KAAK,GAAG,WAAW,GAAG,qBAAqB,EAC3C,CAAC;QACD,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,eAAe,EAAE,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC;YACpD,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM,EAAE,kCAAkC;SAC3C,CAAC;IACJ,CAAC;IAED,IAAI,UAA8B,CAAC;IACnC,IAAI,KAAK,CAAC,KAAK,KAAK,cAAc,EAAE,CAAC;QACnC,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa;YACrC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;YACpC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAClC,OAAO;gBACL,KAAK,EAAE,SAAS;gBAChB,eAAe,EAAE,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC;gBACpD,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,MAAM,EAAE,mDAAmD;aAC5D,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,aAAa,EAAE,YAAY,KAAK,SAAS,EAAE,CAAC;YACpD,UAAU,GAAG,IAAI,CAAC,GAAG,CACnB,CAAC,EACD,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,YAAY,GAAG,KAAK,CACvD,CAAC;YACF,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO;oBACL,KAAK,EAAE,SAAS;oBAChB,eAAe,EAAE,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC;oBACpD,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,MAAM,EAAE,sCAAsC;iBAC/C,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,IACL,KAAK,GAAG,WAAW,GAAG,uCAAuC,EAC7D,CAAC;YACD,OAAO;gBACL,KAAK,EAAE,SAAS;gBAChB,eAAe,EAAE,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC;gBACpD,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,MAAM,EAAE,+BAA+B;aACxC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,cAAc;QAC/D,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,cAAc,CAAC;QACzC,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,aAAa;QAC7D,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,aAAa,CAAC;QACxC,CAAC,CAAC,SAAS,CAAC;IACd,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,eAAe,EAAE,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC;QACpD,gBAAgB,EAAE,YAAY,CAAC,KAAK,CAAC,gBAAgB,CAAC;QACtD,GAAG,CAAC,SAAS;YACX,CAAC,CAAC;gBACE,cAAc,EAAE,SAAS,CAAC,KAAK;gBAC/B,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClE;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,QAAQ;YACV,CAAC,CAAC;gBACE,aAAa,EAAE,QAAQ,CAAC,KAAK;gBAC7B,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChE;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,CAAC,KAAK,CAAC,gBAAgB;YACzB,CAAC,CAAC;gBACE,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAC9C,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzC,YAAY,EAAE,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;aAC9C;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,CAAC,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,YAAY;YAC/C,CAAC,CAAC;gBACE,oBAAoB,EAAE,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC;gBAC/D,oBAAoB,EAAE,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;aAC9D;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,GAAG,CAAC,KAAK,CAAC,gBAAgB;YACxB,CAAC,CAAC,EAAE,MAAM,EAAE,wEAAwE,EAAE;YACtF,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,OAAe,EACf,eAAuB;IAEvB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,IACE,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC;YAC7D,CAAC,MAAM,CAAC,QAAQ,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC;YACpE,MAAM,CAAC,QAAQ;YACf,MAAM,CAAC,QAAQ,EACf,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,GAAG,CACZ,qBAAqB,kBAAkB,CAAC,eAAe,CAAC,EAAE,EAC1D,MAAM,CAAC,MAAM,CACd,CAAC,QAAQ,EAAE,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAwC;IAExC,MAAM,qBAAqB,GAAG,IAAI,GAAG,CACnC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CACvB,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,WAAW;QACjD,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;QACrB,CAAC,CAAC,EAAE,CACP,CACF,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,IAAI,KAAK,eAAe;QAC9B,CAAC,KAAK,CAAC,WAAW;QAClB,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAChD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CACxC,OAAiC,EACjC,aAAsB,EACtB,YAAqC,EACrC,oBAAwC,EACxC,iBAAqC,EACrC,eAAyD,EAAE,EAC3D,iBAAiB,GAAG,IAAI,EACxB,0BACE,wBAAwB;IAE1B,IAAI,CAAC,aAAa,IAAI,CAAC,iBAAiB,IAAI,CAAC,oBAAoB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACxF,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5C,CAAC;IACD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAyC,CAAC;IAC7E,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC3C,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;QACxE,IAAI,QAAQ,EAAE,CAAC;YACb,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;YACpD,SAAS;QACX,CAAC;QACD,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,UAAU,GAA8B,EAAE,CAAC;IACjD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,YAAY,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;YAAE,SAAS;QAC1E,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM;YAAE,SAAS;QACxC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;YAC/E,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;YAC5C,CAAC,CAAC,SAAS,CAAC;QACd,2EAA2E;QAC3E,wEAAwE;QACxE,sEAAsE;QACtE,MAAM,qBAAqB,GAAG,WAAW,KAAK,SAAS;YACrD,CAAC,KAAK,CAAC,gBAAgB,KAAK,kBAAkB;gBAC5C,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QACjE,MAAM,aAAa,GAAG,qBAAqB,IAAI,KAAK,CAAC,WAAW;YAC9D,CAAC,CAAC,uBAAuB,CAAC,KAAK,CAAC,WAAW,CAAC;YAC5C,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,wBAAwB,GAAG,WAAW,KAAK,SAAS;YACxD,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,WAAW,CAAC,SAAS,CAAC;QACzE,yEAAyE;QACzE,uEAAuE;QACvE,MAAM,YAAY,GAAG,KAAK,CAAC,gBAAgB,KAAK,kBAAkB;YAChE,CAAC,CAAC,KAAK,CAAC,gBAAgB;YACxB,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,MAAM,GAAG,wBAAwB,CAAC,CAAC,CAAC,WAAY,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC;QAC7E,MAAM,sBAAsB,GAAG,wBAAwB;YACrD,CAAC,CAAC,WAAY,CAAC,iBAAiB;YAChC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;QACvD,MAAM,yBAAyB,GAAG,wBAAwB;YACxD,CAAC,CAAC,WAAY,CAAC,oBAAoB;YACnC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1D,MAAM,aAAa,GACjB,MAAM,KAAK,SAAS;YACpB,OAAO,sBAAsB,KAAK,QAAQ;YAC1C,sBAAsB,CAAC,MAAM,GAAG,CAAC;YACjC,OAAO,yBAAyB,KAAK,QAAQ;YAC7C,yBAAyB,CAAC,MAAM,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,wEAAwE;YACxE,6CAA6C;YAC7C,QAAQ,GAAG,IAAI,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IACE,yBAAyB,KAAK,oBAAoB;YAClD,sBAAsB,KAAK,iBAAiB;YAC5C,SAAS;QACX,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAChC,UAAU,CAAC,IAAI,CAAC;gBACd,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,MAAM,EAAE,MAAO;gBACf,iBAAiB,EAAE,sBAAuB;gBAC1C,oBAAoB,EAAE,yBAA0B;gBAChD,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACjC,kEAAkE;YAClE,UAAU,CAAC,IAAI,CAAC;gBACd,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,MAAM,EAAE,MAAO;gBACf,iBAAiB,EAAE,sBAAuB;gBAC1C,oBAAoB,EAAE,yBAA0B;gBAChD,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1F,0EAA0E;YAC1E,wEAAwE;YACxE,QAAQ,GAAG,IAAI,CAAC;YAChB,SAAS;QACX,CAAC;QACD,2EAA2E;QAC3E,uEAAuE;QACvE,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,aAAa,KAAK,KAAK,CAAC,GAAG,EAAE,CAAC;YAC3D,QAAQ,GAAG,IAAI,CAAC;YAChB,SAAS;QACX,CAAC;QACD,UAAU,CAAC,IAAI,CAAC;YACd,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,MAAM,EAAE,MAAO;YACf,iBAAiB,EAAE,sBAAuB;YAC1C,oBAAoB,EAAE,yBAA0B;YAChD,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,QAAQ,KAAK,WAAW;gBACnC,CAAC,CAAC,KAAK,CAAC,QAAQ;gBAChB,CAAC,CAAC,SAAS;SACd,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,OAAqB,EACrB,aAAwC,EACxC,OAAmC;IAEnC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,eAAe,EAAE,OAAO,CAAC,IAAI;YAC7B,MAAM,EAAE,gDAAgD;SACzD,CAAC;IACJ,CAAC;IACD,IAAI,aAAa,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IACzD,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;QAClC,OAAO;YACL,KAAK,EAAE,aAAa;YACpB,eAAe,EAAE,OAAO,CAAC,IAAI;YAC7B,MAAM,EAAE,yDAAyD;SAClE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACvE,OAAO;YACL,KAAK,EAAE,aAAa;YACpB,eAAe,EAAE,OAAO,CAAC,IAAI;YAC7B,MAAM,EAAE,4CAA4C;SACrD,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,KAAK,EAC3B,eAAuB,EACkB,EAAE;YAC3C,MAAM,GAAG,GAAG,qBAAqB,CAC/B,aAAa,CAAC,cAAe,EAC7B,eAAe,CAChB,CAAC;YACF,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YACvD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;gBACpC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,IAAI,GAAG,CAAC;aAC7D,CAAC,CAAC;YACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAO,SAAS,CAAC;YAC9C,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAChF,MAAM,IAAI,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACzF,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,qBAAqB,GAAG,UAAU;YACtC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,uCAAuC,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,UAAU;YACtB,CAAC,qBAAqB;gBACpB,CAAC,CAAC,MAAM,eAAe,CAAC,qBAAqB,CAAC;gBAC9C,CAAC,CAAC,SAAS,CAAC,CAAC;QACjB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;gBACL,KAAK,EAAE,SAAS;gBAChB,eAAe,EAAE,OAAO,CAAC,IAAI;gBAC7B,MAAM,EAAE,qDAAqD;aAC9D,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC3C,OAAO,qBAAqB;YAC1B,CAAC,CAAC;gBACE,GAAG,SAAS;gBACZ,MAAM,EAAE,SAAS,CAAC,MAAM;oBACtB,yEAAyE;aAC5E;YACH,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,KAAK,EAAE,aAAa;YACpB,eAAe,EAAE,OAAO,CAAC,IAAI;YAC7B,MAAM,EACJ,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;gBACrD,CAAC,CAAC,0BAA0B;gBAC5B,CAAC,CAAC,kCAAkC;SACzC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAAsC,EAAE;IAExC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,QAAQ,GAAmB,EAAE,CAAC;IAClC,IAAI,IAAI,GAAiB,EAAE,CAAC;IAC5B,IAAI,MAAM,GAA4B,EAAE,CAAC;IACzC,IAAI,eAAe,GAAoB,EAAE,CAAC;IAC1C,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,gCAAgC,EAAE,CAAC;QACrD,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;QAC9B,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,QAAQ,GAAG,IAAI,CAAC;YAChB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,+BAA+B,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,OAAO,CAAC,kBAAkB,KAAK,KAAK,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAG,2BAA2B,EAAE,CAAC;YAC/C,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC;YACnC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,yBAAyB,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QACD,qEAAqE;QACrE,wEAAwE;QACxE,uCAAuC;QACvC,IAAI,OAAO,CAAC,uBAAuB,KAAK,KAAK,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;YACxB,IAAI,GAAG,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACnC,MAAM,GAAG,iBAAiB,CACxB,mBAAmB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAClE,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,GAAG,IAAI,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,oBAAoB,GAAG,OAAO,CAAC,WAAW,IAAI,sBAAsB,EAAE,CAAC;IAC7E,MAAM,KAAK,GAAG,oBAAoB;QAChC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,oBAAoB,CAAC;QACnE,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,YAAY,GAAG,oBAAoB;QACvC,CAAC,CAAC,CAAC,SAAS;YACV,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,QAAQ;QACZ,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,MAAM,WAAW,GAAG,OAAO,CAAC,kBAAkB,KAAK,KAAK;QACtD,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;QACpC,CAAC,CAAC,0BAA0B,CACxB,eAAe,EACf,aAAa,EACb,QAAQ,EACR,oBAAoB,EACpB,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,sBAAsB,EAC9B,OAAO,CAAC,2BAA2B,CACpC,CAAC;IACN,MAAM,OAAO,GAAG,KAAK;QACnB,CAAC,CAAC,OAAO,CAAC,cAAc,KAAK,KAAK;YAChC,CAAC,CAAC;gBACE,KAAK,EAAE,SAAkB;gBACzB,eAAe,EAAE,KAAK,CAAC,IAAI;gBAC3B,MAAM,EAAE,kCAAkC;aAC3C;YACH,CAAC,CAAC,MAAM,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,CAAC;QAC1D,CAAC,CAAC;YACE,KAAK,EAAE,SAAkB;YACzB,GAAG,CAAC,oBAAoB;gBACtB,CAAC,CAAC,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,EAAE,6BAA6B,EAAE;gBAClF,CAAC,CAAC,EAAE,MAAM,EAAE,iCAAiC,EAAE,CAAC;SACnD,CAAC;IAEN,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,CAAC;QACV,OAAO,EAAE;YACP,KAAK,EAAE,YAAY;YACnB,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5C;QACD,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,EAAE,KAAK,EAAE;QAC7D,WAAW;QACX,OAAO;QACP,QAAQ;KACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type LocalSession } from "./tmux.js";
|
|
2
|
+
export type TmuxNameMigrationMode = "dry-run" | "apply" | "rollback";
|
|
3
|
+
export interface TmuxNameMigrationPlanEntry {
|
|
4
|
+
readonly tmuxSessionId: string;
|
|
5
|
+
readonly tmuxSessionCreatedAt: string;
|
|
6
|
+
readonly tmuxServerPid: string;
|
|
7
|
+
readonly tmuxSocketPath: string;
|
|
8
|
+
readonly oldName: string;
|
|
9
|
+
readonly newName: string;
|
|
10
|
+
readonly collision: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface TmuxNameMigrationJournalEntry {
|
|
13
|
+
tmuxSessionId: string;
|
|
14
|
+
tmuxSessionCreatedAt: string;
|
|
15
|
+
tmuxServerPid: string;
|
|
16
|
+
tmuxSocketPath: string;
|
|
17
|
+
readonly oldName: string;
|
|
18
|
+
readonly newName: string;
|
|
19
|
+
state: "planned" | "renamed" | "applied" | "rolled-back";
|
|
20
|
+
registryEntriesUpdated: number;
|
|
21
|
+
appliedAt?: string;
|
|
22
|
+
rolledBackAt?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface TmuxNameMigrationJournalV1 {
|
|
25
|
+
readonly version: 1;
|
|
26
|
+
readonly createdAt: string;
|
|
27
|
+
updatedAt: string;
|
|
28
|
+
entries: TmuxNameMigrationJournalEntry[];
|
|
29
|
+
}
|
|
30
|
+
export interface TmuxNameMigrationResult {
|
|
31
|
+
readonly mode: TmuxNameMigrationMode;
|
|
32
|
+
readonly changed: number;
|
|
33
|
+
readonly entries: readonly TmuxNameMigrationJournalEntry[];
|
|
34
|
+
readonly collisions: readonly TmuxNameMigrationPlanEntry[];
|
|
35
|
+
readonly warnings: readonly string[];
|
|
36
|
+
}
|
|
37
|
+
interface MigrationDependencies {
|
|
38
|
+
readonly listSessions: () => LocalSession[];
|
|
39
|
+
readonly renameSession: (oldName: string, newName: string) => boolean;
|
|
40
|
+
readonly updateRegistry: (oldName: string, newName: string) => number;
|
|
41
|
+
readonly readJournal: () => TmuxNameMigrationJournalV1 | undefined;
|
|
42
|
+
readonly writeJournal: (journal: TmuxNameMigrationJournalV1) => void;
|
|
43
|
+
readonly now: () => string;
|
|
44
|
+
}
|
|
45
|
+
export declare function tmuxNameMigrationJournalPath(): string;
|
|
46
|
+
export declare function planTmuxNameMigration(sessions: readonly LocalSession[]): TmuxNameMigrationPlanEntry[];
|
|
47
|
+
/** Resolve an old client id only when the live tmux identity proves a journalled rename. */
|
|
48
|
+
export declare function legacyClientSessionIdFromJournal(session: LocalSession, journal: TmuxNameMigrationJournalV1 | undefined): string | undefined;
|
|
49
|
+
export declare function legacyClientSessionIdForMigratedSession(session: LocalSession): string | undefined;
|
|
50
|
+
export declare function migrateTmuxNames(mode: TmuxNameMigrationMode, overrides?: Partial<MigrationDependencies>): TmuxNameMigrationResult;
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=tmux-name-migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tmux-name-migration.d.ts","sourceRoot":"","sources":["../src/tmux-name-migration.ts"],"names":[],"mappings":"AAcA,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,WAAW,CAAC;AAEnB,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AAErE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,6BAA6B;IAC5C,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC;IACzD,sBAAsB,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,6BAA6B,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,6BAA6B,EAAE,CAAC;IAC3D,QAAQ,CAAC,UAAU,EAAE,SAAS,0BAA0B,EAAE,CAAC;IAC3D,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,YAAY,EAAE,CAAC;IAC5C,QAAQ,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IACtE,QAAQ,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IACtE,QAAQ,CAAC,WAAW,EAAE,MAAM,0BAA0B,GAAG,SAAS,CAAC;IACnE,QAAQ,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,0BAA0B,KAAK,IAAI,CAAC;IACrE,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;CAC5B;AAED,wBAAgB,4BAA4B,IAAI,MAAM,CAErD;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,SAAS,YAAY,EAAE,GAChC,0BAA0B,EAAE,CAkB9B;AAmGD,4FAA4F;AAC5F,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,0BAA0B,GAAG,SAAS,GAC9C,MAAM,GAAG,SAAS,CAOpB;AAED,wBAAgB,uCAAuC,CACrD,OAAO,EAAE,YAAY,GACpB,MAAM,GAAG,SAAS,CAQpB;AAiCD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,qBAAqB,EAC3B,SAAS,GAAE,OAAO,CAAC,qBAAqB,CAAM,GAC7C,uBAAuB,CAqRzB"}
|