@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.
Files changed (68) hide show
  1. package/dist/cli-help-groups.d.ts +124 -0
  2. package/dist/cli-help-groups.d.ts.map +1 -0
  3. package/dist/cli-help-groups.js +297 -0
  4. package/dist/cli-help-groups.js.map +1 -0
  5. package/dist/enroll.d.ts.map +1 -1
  6. package/dist/enroll.js +40 -2
  7. package/dist/enroll.js.map +1 -1
  8. package/dist/index.d.ts +4 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +314 -27
  11. package/dist/index.js.map +1 -1
  12. package/dist/llm-gateway-runtime/accounts.d.ts.map +1 -1
  13. package/dist/llm-gateway-runtime/accounts.js +2 -6
  14. package/dist/llm-gateway-runtime/accounts.js.map +1 -1
  15. package/dist/llm-gateway-runtime/index.d.ts.map +1 -1
  16. package/dist/llm-gateway-runtime/index.js +9 -1
  17. package/dist/llm-gateway-runtime/index.js.map +1 -1
  18. package/dist/llm-gateway-runtime/model-catalog.d.ts +10 -3
  19. package/dist/llm-gateway-runtime/model-catalog.d.ts.map +1 -1
  20. package/dist/llm-gateway-runtime/model-catalog.js +49 -119
  21. package/dist/llm-gateway-runtime/model-catalog.js.map +1 -1
  22. package/dist/llm-gateway-runtime/proxy-anthropic.d.ts.map +1 -1
  23. package/dist/llm-gateway-runtime/proxy-anthropic.js +117 -24
  24. package/dist/llm-gateway-runtime/proxy-anthropic.js.map +1 -1
  25. package/dist/llm-gateway-runtime/proxy-gemini.d.ts.map +1 -1
  26. package/dist/llm-gateway-runtime/proxy-gemini.js +0 -2
  27. package/dist/llm-gateway-runtime/proxy-gemini.js.map +1 -1
  28. package/dist/llm-gateway-runtime/proxy-openai.d.ts +4 -7
  29. package/dist/llm-gateway-runtime/proxy-openai.d.ts.map +1 -1
  30. package/dist/llm-gateway-runtime/proxy-openai.js +18 -13
  31. package/dist/llm-gateway-runtime/proxy-openai.js.map +1 -1
  32. package/dist/llm-gateway-runtime/session-ledger.d.ts +34 -0
  33. package/dist/llm-gateway-runtime/session-ledger.d.ts.map +1 -1
  34. package/dist/llm-gateway-runtime/session-ledger.js +216 -6
  35. package/dist/llm-gateway-runtime/session-ledger.js.map +1 -1
  36. package/dist/llm-mesh.d.ts +3 -0
  37. package/dist/llm-mesh.d.ts.map +1 -1
  38. package/dist/llm-mesh.js +23 -0
  39. package/dist/llm-mesh.js.map +1 -1
  40. package/dist/protocol-local.d.ts +3 -0
  41. package/dist/protocol-local.d.ts.map +1 -1
  42. package/dist/protocol-local.js +7 -0
  43. package/dist/protocol-local.js.map +1 -1
  44. package/dist/registry.d.ts +53 -4
  45. package/dist/registry.d.ts.map +1 -1
  46. package/dist/registry.js +109 -6
  47. package/dist/registry.js.map +1 -1
  48. package/dist/restore.d.ts +75 -4
  49. package/dist/restore.d.ts.map +1 -1
  50. package/dist/restore.js +268 -24
  51. package/dist/restore.js.map +1 -1
  52. package/dist/session-class.d.ts +10 -0
  53. package/dist/session-class.d.ts.map +1 -0
  54. package/dist/session-class.js +11 -0
  55. package/dist/session-class.js.map +1 -0
  56. package/dist/status-projection.d.ts +97 -0
  57. package/dist/status-projection.d.ts.map +1 -0
  58. package/dist/status-projection.js +464 -0
  59. package/dist/status-projection.js.map +1 -0
  60. package/dist/tmux-name-migration.d.ts +52 -0
  61. package/dist/tmux-name-migration.d.ts.map +1 -0
  62. package/dist/tmux-name-migration.js +408 -0
  63. package/dist/tmux-name-migration.js.map +1 -0
  64. package/dist/tmux.d.ts +54 -1
  65. package/dist/tmux.d.ts.map +1 -1
  66. package/dist/tmux.js +232 -16
  67. package/dist/tmux.js.map +1 -1
  68. 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":"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"}
@@ -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"}