@sentropic/h2a-runtime 0.88.0 → 0.89.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/attach.d.ts +21 -0
- package/dist/attach.d.ts.map +1 -1
- package/dist/attach.js +69 -1
- package/dist/attach.js.map +1 -1
- package/dist/file-lock.d.ts +34 -0
- package/dist/file-lock.d.ts.map +1 -0
- package/dist/file-lock.js +96 -0
- package/dist/file-lock.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +289 -18
- 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 +3 -0
- package/dist/llm-gateway-runtime/accounts.js.map +1 -1
- package/dist/llm-gateway-runtime/proxy-anthropic.d.ts.map +1 -1
- package/dist/llm-gateway-runtime/proxy-anthropic.js +24 -0
- package/dist/llm-gateway-runtime/proxy-anthropic.js.map +1 -1
- package/dist/llm-gateway-runtime/proxy-openai.d.ts.map +1 -1
- package/dist/llm-gateway-runtime/proxy-openai.js +53 -2
- package/dist/llm-gateway-runtime/proxy-openai.js.map +1 -1
- package/dist/proc-cpu.d.ts +55 -0
- package/dist/proc-cpu.d.ts.map +1 -0
- package/dist/proc-cpu.js +133 -0
- package/dist/proc-cpu.js.map +1 -0
- package/dist/prompt-delivery.d.ts +159 -0
- package/dist/prompt-delivery.d.ts.map +1 -0
- package/dist/prompt-delivery.js +469 -0
- package/dist/prompt-delivery.js.map +1 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +7 -69
- package/dist/registry.js.map +1 -1
- package/dist/restore.d.ts +20 -4
- package/dist/restore.d.ts.map +1 -1
- package/dist/restore.js +26 -4
- package/dist/restore.js.map +1 -1
- package/dist/session-lease.d.ts +266 -0
- package/dist/session-lease.d.ts.map +1 -0
- package/dist/session-lease.js +342 -0
- package/dist/session-lease.js.map +1 -0
- package/dist/tmux.d.ts +77 -2
- package/dist/tmux.d.ts.map +1 -1
- package/dist/tmux.js +269 -23
- package/dist/tmux.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MACHINE-SCOPED session lease store.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS. Nine subcontractor sessions, verifiably FINISHED, held 4 325
|
|
5
|
+
* minutes of concurrency slot for 61.4 minutes of real work (ratio 1:70). The
|
|
6
|
+
* pool stood at 15 of 12 — over cap, with zero of them working. It was never
|
|
7
|
+
* scarce; it was hoarded.
|
|
8
|
+
*
|
|
9
|
+
* THE DISTINCTION THAT DECIDES THE DESIGN: those sessions were not DEAD, they
|
|
10
|
+
* were FINISHED — a live process that no longer works (the composer back on its
|
|
11
|
+
* placeholder, "Worked for X" on screen). Death and inactivity are DISJOINT
|
|
12
|
+
* modes. A lock released on process death would have freed NONE of them, and
|
|
13
|
+
* neither does `sweepStaleJobs` (delegate.ts), which skips anything `isJobLive`.
|
|
14
|
+
* This store covers INACTIVITY: a finished-but-alive session stops beating, so
|
|
15
|
+
* `now − heartbeatAt > ttlMs` declares it abandoned after 30 minutes instead of
|
|
16
|
+
* 994.
|
|
17
|
+
*
|
|
18
|
+
* THE PATTERN IS `packages/track/src/lease/store.ts`; the LOCATION is not.
|
|
19
|
+
* Track's store is REPO-scoped (`.track/leases.json`). The concurrency pool is
|
|
20
|
+
* MACHINE-scoped: sessions from h2a-Impots, h2a-geo, h2a-immo, h2a-kog and
|
|
21
|
+
* h2a-openerp all consume it, so a lease filed in one repo's `.track/` cannot
|
|
22
|
+
* arbitrate a resource several repos contend for. It also would make pool
|
|
23
|
+
* correctness depend on repo identity, which DERIVES. So the file sits beside
|
|
24
|
+
* `registry.json` in the h2a config dir — the same machine-scoped home the
|
|
25
|
+
* session registry already uses, under NO `.track/` and under no repo.
|
|
26
|
+
*
|
|
27
|
+
* WHAT IS BORROWED FROM TRACK, VERBATIM IN SPIRIT:
|
|
28
|
+
* - abandonment is CLOCKLESS, COMPUTED BY THE READER: the caller injects `now`
|
|
29
|
+
* and a lease is abandoned iff `now − heartbeatAt > ttlMs`. The store holds
|
|
30
|
+
* no clock of its own — `now` is a REQUIRED constructor dependency here
|
|
31
|
+
* (stricter than track, which defaults it), so no code path can stamp a
|
|
32
|
+
* timestamp from an implicit clock;
|
|
33
|
+
* - one ACTIVE lease per subject (here: per session id);
|
|
34
|
+
* - each acquisition mints a fresh, unguessable `token`; only the holder
|
|
35
|
+
* presenting the matching token may heartbeat, observe or release.
|
|
36
|
+
*
|
|
37
|
+
* WHAT THE TOKEN DOES AND DOES NOT GUARANTEE. It is a GENERATION guard, not a
|
|
38
|
+
* secret: it is persisted in the same file, so any local process that can read
|
|
39
|
+
* the store can read it. What it structurally prevents is a stale holder — one
|
|
40
|
+
* that slept through its own abandonment — renewing or releasing the lease that
|
|
41
|
+
* REPLACED its own. That property is enforced by the code and tested; secrecy
|
|
42
|
+
* against a local reader is not claimed.
|
|
43
|
+
*/
|
|
44
|
+
import { randomBytes } from "node:crypto";
|
|
45
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
46
|
+
import { dirname, join } from "node:path";
|
|
47
|
+
import { resolveConfigDir } from "./config.js";
|
|
48
|
+
import { withFileLock } from "./file-lock.js";
|
|
49
|
+
/**
|
|
50
|
+
* Default lease TTL. 30 minutes, the same figure track settled on: long enough
|
|
51
|
+
* that a session pausing between two tool calls is never mistaken for finished,
|
|
52
|
+
* short enough that a finished-but-alive session frees its slot within one
|
|
53
|
+
* working bout instead of the 994 minutes measured on the worst hoarder.
|
|
54
|
+
*/
|
|
55
|
+
export const DEFAULT_SESSION_LEASE_TTL_MS = 30 * 60_000;
|
|
56
|
+
/**
|
|
57
|
+
* The CPU rate (ms of CPU per second of wall clock, over a pane's whole process
|
|
58
|
+
* TREE) at or above which a session counts as WORKING and its lease is beaten.
|
|
59
|
+
*
|
|
60
|
+
* MEASURED on this workstation, 2026-07-30: 64 panes across 59 tmux sessions,
|
|
61
|
+
* one 150 s window, same /proc arithmetic as `proc-cpu.ts`, each pane classified
|
|
62
|
+
* by what its TUI showed at BOTH ends of the window:
|
|
63
|
+
*
|
|
64
|
+
* idle-but-alive n=59 median 12 ms/s p95 23 ms/s max 53 ms/s
|
|
65
|
+
* working n=2 142 and 146 ms/s
|
|
66
|
+
*
|
|
67
|
+
* 75 ms/s sits in the empty band between the two: above EVERY idle sample
|
|
68
|
+
* observed, well under the working ones. What the measurement does NOT
|
|
69
|
+
* establish, and this comment will not pretend it does: the working mode rests
|
|
70
|
+
* on two panes, and a session that works while burning little CPU — one long
|
|
71
|
+
* network wait, one tool call every ten minutes — reads as finished-but-alive
|
|
72
|
+
* here. That is survivable only because the decision this constant drives is
|
|
73
|
+
* whether to BEAT, never whether to kill: a session judged idle is merely
|
|
74
|
+
* PROPOSED for reclamation to a human or conductor, who can still see it.
|
|
75
|
+
*/
|
|
76
|
+
export const DEFAULT_WORKING_CPU_MS_PER_SECOND = 75;
|
|
77
|
+
/** Rejected lease operation (wrong token, absent lease, subject already held). */
|
|
78
|
+
export class SessionLeaseError extends Error {
|
|
79
|
+
constructor(message) {
|
|
80
|
+
super(message);
|
|
81
|
+
this.name = "SessionLeaseError";
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Is `lease` abandoned at `now`? PURE and CLOCKLESS: abandoned iff
|
|
86
|
+
* `now − heartbeatAt > ttlMs`. The single abandonment predicate — reused by the
|
|
87
|
+
* acquire guard, by the reclaim report, and by callers deciding what to show.
|
|
88
|
+
*/
|
|
89
|
+
export function isSessionLeaseAbandoned(lease, now) {
|
|
90
|
+
return Date.parse(now) - Date.parse(lease.heartbeatAt) > lease.ttlMs;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* CPU rate (ms of CPU per second of wall clock) between the lease's last
|
|
94
|
+
* observation and `cpuMsNow` taken at `now`. Undefined when there is no prior
|
|
95
|
+
* sample, when the elapsed window is not positive, or when the counter went
|
|
96
|
+
* BACKWARDS (the pane's tree was replaced — a relaunch, or PID reuse): a
|
|
97
|
+
* negative delta is not a rate, and must never be read as "idle". PURE.
|
|
98
|
+
*/
|
|
99
|
+
export function cpuRateMsPerSecond(lease, cpuMsNow, now) {
|
|
100
|
+
const previous = lease.sample;
|
|
101
|
+
if (previous === undefined)
|
|
102
|
+
return undefined;
|
|
103
|
+
const elapsedMs = Date.parse(now) - Date.parse(previous.sampledAt);
|
|
104
|
+
if (!Number.isFinite(elapsedMs) || elapsedMs <= 0)
|
|
105
|
+
return undefined;
|
|
106
|
+
const deltaMs = cpuMsNow - previous.cpuMs;
|
|
107
|
+
if (deltaMs < 0)
|
|
108
|
+
return undefined;
|
|
109
|
+
return (deltaMs / elapsedMs) * 1000;
|
|
110
|
+
}
|
|
111
|
+
export function decideSessionBeat(input) {
|
|
112
|
+
if (input.cpuMsNow === undefined) {
|
|
113
|
+
return { action: "unknown", reason: "no-cpu-reading" };
|
|
114
|
+
}
|
|
115
|
+
const rate = cpuRateMsPerSecond(input.lease, input.cpuMsNow, input.now);
|
|
116
|
+
if (rate === undefined) {
|
|
117
|
+
return { action: "observe", reason: "no-baseline" };
|
|
118
|
+
}
|
|
119
|
+
const bar = input.workingRateMsPerSecond ?? DEFAULT_WORKING_CPU_MS_PER_SECOND;
|
|
120
|
+
return rate >= bar
|
|
121
|
+
? { action: "beat", rateMsPerSecond: rate, reason: "working" }
|
|
122
|
+
: { action: "observe", rateMsPerSecond: rate, reason: "under-threshold" };
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* The abandoned leases at `now`, as PROPOSALS. This function proposes; it never
|
|
126
|
+
* executes and never signals a process. A lease still inside its TTL — i.e. one
|
|
127
|
+
* that still beats — is structurally excluded: the only filter is
|
|
128
|
+
* `isSessionLeaseAbandoned`, so a beating session can never appear here. PURE.
|
|
129
|
+
*/
|
|
130
|
+
export function reclaimProposals(leases, now) {
|
|
131
|
+
const nowMs = Date.parse(now);
|
|
132
|
+
return leases
|
|
133
|
+
.filter((lease) => isSessionLeaseAbandoned(lease, now))
|
|
134
|
+
.map((lease) => {
|
|
135
|
+
const idleMs = nowMs - Date.parse(lease.heartbeatAt);
|
|
136
|
+
const proposal = {
|
|
137
|
+
sessionId: lease.sessionId,
|
|
138
|
+
holder: lease.holder,
|
|
139
|
+
idleMs,
|
|
140
|
+
ttlMs: lease.ttlMs,
|
|
141
|
+
heartbeatAt: lease.heartbeatAt,
|
|
142
|
+
};
|
|
143
|
+
return proposal;
|
|
144
|
+
})
|
|
145
|
+
.sort((a, b) => b.idleMs - a.idleMs);
|
|
146
|
+
}
|
|
147
|
+
export function planLeaseSupervision(leases, sessions) {
|
|
148
|
+
const byId = new Map(sessions.map((session) => [session.id, session]));
|
|
149
|
+
return leases.map((lease) => {
|
|
150
|
+
const session = byId.get(lease.sessionId);
|
|
151
|
+
if (session === undefined) {
|
|
152
|
+
return { sessionId: lease.sessionId, action: "leave", reason: "unregistered" };
|
|
153
|
+
}
|
|
154
|
+
if (session.jobState === "done" || session.jobState === "failed") {
|
|
155
|
+
return { sessionId: lease.sessionId, action: "release", reason: "terminal" };
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
sessionId: lease.sessionId,
|
|
159
|
+
action: "probe",
|
|
160
|
+
...(session.tmuxSession !== undefined ? { tmuxSession: session.tmuxSession } : {}),
|
|
161
|
+
};
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
/** Machine-scoped path of the session-lease side-store (beside `registry.json`). */
|
|
165
|
+
export function resolveSessionLeasePath() {
|
|
166
|
+
return join(resolveConfigDir(), "session-leases.json");
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* The session-lease side-store. Every mutation runs under the store's OWN
|
|
170
|
+
* lockfile (never the registry's) and is written atomically (tmp + rename).
|
|
171
|
+
*
|
|
172
|
+
* `now` is a REQUIRED dependency: the store stamps `acquiredAt`/`heartbeatAt`/
|
|
173
|
+
* `expiresAt` from it, and holds no clock of its own. Abandonment is still the
|
|
174
|
+
* READER's call — `abandoned(now)` takes the instant explicitly, with no default.
|
|
175
|
+
*/
|
|
176
|
+
export class SessionLeaseStore {
|
|
177
|
+
leasesPath;
|
|
178
|
+
clock;
|
|
179
|
+
newId;
|
|
180
|
+
constructor(leasesPath, deps) {
|
|
181
|
+
this.leasesPath = leasesPath;
|
|
182
|
+
this.clock = deps.now;
|
|
183
|
+
this.newId = deps.newId ?? (() => randomBytes(12).toString("hex"));
|
|
184
|
+
}
|
|
185
|
+
/** Every recorded lease (live OR abandoned — liveness is the reader's call). */
|
|
186
|
+
readAll() {
|
|
187
|
+
return readLeaseFile(this.leasesPath);
|
|
188
|
+
}
|
|
189
|
+
/** The lease recorded for a session, live or abandoned, if any. */
|
|
190
|
+
forSession(sessionId) {
|
|
191
|
+
return this.readAll().find((lease) => lease.sessionId === sessionId);
|
|
192
|
+
}
|
|
193
|
+
/** The leases abandoned at `now` (explicit instant — the store adds no clock). */
|
|
194
|
+
abandoned(now) {
|
|
195
|
+
return this.readAll().filter((lease) => isSessionLeaseAbandoned(lease, now));
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Take the slot for `sessionId`. Rejects when a LIVE lease already covers it
|
|
199
|
+
* (one active lease per session). An ABANDONED prior lease does not block: the
|
|
200
|
+
* new acquisition replaces it and mints a FRESH token, so the previous holder
|
|
201
|
+
* can never beat or release what replaced its lease. An initial `cpuMs`
|
|
202
|
+
* baseline may be supplied so the first supervising pass can compute a rate.
|
|
203
|
+
*/
|
|
204
|
+
acquire(input) {
|
|
205
|
+
return withFileLock(this.leasesPath, () => {
|
|
206
|
+
const all = readLeaseFile(this.leasesPath);
|
|
207
|
+
const now = this.clock();
|
|
208
|
+
const existing = all.find((lease) => lease.sessionId === input.sessionId);
|
|
209
|
+
if (existing !== undefined && !isSessionLeaseAbandoned(existing, now)) {
|
|
210
|
+
throw new SessionLeaseError(`session-lease: ${input.sessionId} is already held by ${existing.holder} (one active lease per session)`);
|
|
211
|
+
}
|
|
212
|
+
const ttlMs = input.ttlMs ?? DEFAULT_SESSION_LEASE_TTL_MS;
|
|
213
|
+
const lease = {
|
|
214
|
+
leaseId: this.newId(),
|
|
215
|
+
sessionId: input.sessionId,
|
|
216
|
+
holder: input.holder,
|
|
217
|
+
...(input.workspace !== undefined ? { workspace: input.workspace } : {}),
|
|
218
|
+
acquiredAt: now,
|
|
219
|
+
heartbeatAt: now,
|
|
220
|
+
expiresAt: new Date(Date.parse(now) + ttlMs).toISOString(),
|
|
221
|
+
ttlMs,
|
|
222
|
+
token: this.newId(),
|
|
223
|
+
...(input.cpuMs !== undefined
|
|
224
|
+
? { sample: { cpuMs: input.cpuMs, sampledAt: now } }
|
|
225
|
+
: {}),
|
|
226
|
+
};
|
|
227
|
+
const next = all.filter((l) => l.sessionId !== input.sessionId);
|
|
228
|
+
next.push(lease);
|
|
229
|
+
writeLeaseFile(this.leasesPath, next);
|
|
230
|
+
return lease;
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Renew a lease — the holder's assertion that the session is WORKING. Only the
|
|
235
|
+
* matching token is accepted. Resets the reader's abandonment window and, when
|
|
236
|
+
* `cpuMs` is supplied, records the reading the assertion was based on.
|
|
237
|
+
*/
|
|
238
|
+
heartbeat(input) {
|
|
239
|
+
return this.mutate(input.sessionId, input.token, "heartbeat", (lease) => {
|
|
240
|
+
const now = this.clock();
|
|
241
|
+
return {
|
|
242
|
+
...lease,
|
|
243
|
+
heartbeatAt: now,
|
|
244
|
+
expiresAt: new Date(Date.parse(now) + lease.ttlMs).toISOString(),
|
|
245
|
+
...(input.cpuMs !== undefined
|
|
246
|
+
? { sample: { cpuMs: input.cpuMs, sampledAt: now } }
|
|
247
|
+
: {}),
|
|
248
|
+
};
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Record a CPU reading WITHOUT renewing the lease.
|
|
253
|
+
*
|
|
254
|
+
* This is what keeps the abandonment clock honest. A session that worked hard
|
|
255
|
+
* and then finished would, on the next pass, still show a high AVERAGE rate
|
|
256
|
+
* since its last beat and win itself another renewal it no longer deserves.
|
|
257
|
+
* Observing separates the two acts: the baseline moves, the TTL does not.
|
|
258
|
+
*/
|
|
259
|
+
observe(input) {
|
|
260
|
+
return this.mutate(input.sessionId, input.token, "observe", (lease) => ({
|
|
261
|
+
...lease,
|
|
262
|
+
sample: { cpuMs: input.cpuMs, sampledAt: this.clock() },
|
|
263
|
+
}));
|
|
264
|
+
}
|
|
265
|
+
/** Give the slot back. Only the matching token is accepted. */
|
|
266
|
+
release(input) {
|
|
267
|
+
withFileLock(this.leasesPath, () => {
|
|
268
|
+
const all = readLeaseFile(this.leasesPath);
|
|
269
|
+
const idx = all.findIndex((lease) => lease.sessionId === input.sessionId);
|
|
270
|
+
if (idx === -1) {
|
|
271
|
+
throw new SessionLeaseError(`session-lease: no lease to release for ${input.sessionId}`);
|
|
272
|
+
}
|
|
273
|
+
if (all[idx].token !== input.token) {
|
|
274
|
+
throw new SessionLeaseError(`session-lease: release token mismatch for ${input.sessionId} — only the holder may release`);
|
|
275
|
+
}
|
|
276
|
+
all.splice(idx, 1);
|
|
277
|
+
writeLeaseFile(this.leasesPath, all);
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
/** Shared token-guarded read-modify-write for `heartbeat` and `observe`. */
|
|
281
|
+
mutate(sessionId, token, verb, apply) {
|
|
282
|
+
return withFileLock(this.leasesPath, () => {
|
|
283
|
+
const all = readLeaseFile(this.leasesPath);
|
|
284
|
+
const idx = all.findIndex((lease) => lease.sessionId === sessionId);
|
|
285
|
+
if (idx === -1) {
|
|
286
|
+
throw new SessionLeaseError(`session-lease: no lease to ${verb} for ${sessionId}`);
|
|
287
|
+
}
|
|
288
|
+
const lease = all[idx];
|
|
289
|
+
if (lease.token !== token) {
|
|
290
|
+
throw new SessionLeaseError(`session-lease: ${verb} token mismatch for ${sessionId} — only the holder may ${verb}`);
|
|
291
|
+
}
|
|
292
|
+
const next = apply(lease);
|
|
293
|
+
all[idx] = next;
|
|
294
|
+
writeLeaseFile(this.leasesPath, all);
|
|
295
|
+
return next;
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/** Shape guard — a torn or hand-edited row must not poison the whole store. */
|
|
300
|
+
function isSessionLease(value) {
|
|
301
|
+
if (typeof value !== "object" || value === null)
|
|
302
|
+
return false;
|
|
303
|
+
const lease = value;
|
|
304
|
+
return (typeof lease.leaseId === "string" &&
|
|
305
|
+
typeof lease.sessionId === "string" &&
|
|
306
|
+
typeof lease.holder === "string" &&
|
|
307
|
+
typeof lease.acquiredAt === "string" &&
|
|
308
|
+
typeof lease.heartbeatAt === "string" &&
|
|
309
|
+
typeof lease.token === "string" &&
|
|
310
|
+
typeof lease.ttlMs === "number");
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Read + parse the store. A missing, empty or garbled file degrades to `[]` —
|
|
314
|
+
* the side-store is advisory, and a read must never throw into a launch path.
|
|
315
|
+
* The consequence is stated plainly: a corrupt store forgets every lease, which
|
|
316
|
+
* makes slots look FREE (admits work), never held.
|
|
317
|
+
*/
|
|
318
|
+
function readLeaseFile(leasesPath) {
|
|
319
|
+
if (!existsSync(leasesPath))
|
|
320
|
+
return [];
|
|
321
|
+
try {
|
|
322
|
+
const raw = readFileSync(leasesPath, "utf8").trim();
|
|
323
|
+
if (raw === "")
|
|
324
|
+
return [];
|
|
325
|
+
const parsed = JSON.parse(raw);
|
|
326
|
+
const leases = parsed?.leases;
|
|
327
|
+
if (!Array.isArray(leases))
|
|
328
|
+
return [];
|
|
329
|
+
return leases.filter(isSessionLease);
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
return [];
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
/** Atomic write: tmp file in the same dir, then rename (as the registry does). */
|
|
336
|
+
function writeLeaseFile(leasesPath, leases) {
|
|
337
|
+
mkdirSync(dirname(leasesPath), { recursive: true });
|
|
338
|
+
const tmp = `${leasesPath}.tmp.${process.pid}`;
|
|
339
|
+
writeFileSync(tmp, `${JSON.stringify({ version: 1, leases }, null, 2)}\n`, "utf8");
|
|
340
|
+
renameSync(tmp, leasesPath);
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=session-lease.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-lease.js","sourceRoot":"","sources":["../src/session-lease.ts"],"names":[],"mappings":"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"}
|
package/dist/tmux.d.ts
CHANGED
|
@@ -176,7 +176,44 @@ export type ManagedLaunchMetadata = {
|
|
|
176
176
|
terminateOnAgentExit?: boolean;
|
|
177
177
|
/** Refuse an existing name instead of reusing it (structured launch contract). */
|
|
178
178
|
refuseExisting?: boolean;
|
|
179
|
+
/**
|
|
180
|
+
* Keep a real, fixed-size PTY client attached while the pane is remotely
|
|
181
|
+
* driven. Required before an initial TUI prompt can be delivered reliably.
|
|
182
|
+
*/
|
|
183
|
+
attachedTerminal?: boolean;
|
|
184
|
+
};
|
|
185
|
+
/** Fixed PTY geometry for a non-human tmux client. */
|
|
186
|
+
export declare const HEADLESS_TERMINAL_SIZE: {
|
|
187
|
+
readonly cols: 160;
|
|
188
|
+
readonly rows: 48;
|
|
189
|
+
};
|
|
190
|
+
export type HeadlessTerminalResult = {
|
|
191
|
+
readonly state: "already-attached";
|
|
192
|
+
readonly attachedClients: number;
|
|
193
|
+
} | {
|
|
194
|
+
readonly state: "headless-attached";
|
|
195
|
+
readonly attachedClients: number;
|
|
196
|
+
readonly cols: number;
|
|
197
|
+
readonly rows: number;
|
|
198
|
+
} | {
|
|
199
|
+
readonly state: "unavailable";
|
|
200
|
+
readonly reason: string;
|
|
201
|
+
};
|
|
202
|
+
export type EnsureHeadlessTerminalOptions = {
|
|
203
|
+
/** How long to wait for tmux to observe the new client. */
|
|
204
|
+
readonly timeoutMs?: number;
|
|
205
|
+
/** Poll cadence while the script-owned client starts. */
|
|
206
|
+
readonly pollMs?: number;
|
|
179
207
|
};
|
|
208
|
+
/**
|
|
209
|
+
* Give a detached tmux session a genuine terminal, without taking over the
|
|
210
|
+
* launcher terminal. `script` allocates a PTY and an intentionally idle pipe
|
|
211
|
+
* keeps its stdin open; without that pipe `script` receives EOF from a
|
|
212
|
+
* headless launcher and the tmux client immediately detaches. A pipe or `tmux
|
|
213
|
+
* send-keys` alone is not a terminal, and both Codex and Claude can drop their
|
|
214
|
+
* initial composer input when started that way.
|
|
215
|
+
*/
|
|
216
|
+
export declare function ensureHeadlessTerminal(session: string, options?: EnsureHeadlessTerminalOptions): HeadlessTerminalResult;
|
|
180
217
|
/**
|
|
181
218
|
* Pure builder for the global tmux options applied at every run/attach. Split
|
|
182
219
|
* out of `ensureScrollConfig` so the option set (scroll/clipboard AND the
|
|
@@ -410,10 +447,48 @@ export declare function sessionAttached(name: string): boolean;
|
|
|
410
447
|
* Paste a LITERAL line into a session's main pane, then submit it with a real
|
|
411
448
|
* Enter key event. Content reaches `tmux load-buffer -` on stdin, then a named
|
|
412
449
|
* buffer is pasted: arbitrary text is never interpreted by a shell and never
|
|
413
|
-
* appears in a process argv. Enter is a separate key-name event. Used
|
|
414
|
-
*
|
|
450
|
+
* appears in a process argv. Enter is a separate key-name event. Used for
|
|
451
|
+
* interactive throttle nudges (single lines).
|
|
415
452
|
*/
|
|
416
453
|
export declare function sendKeysLiteral(name: string, keys: string): boolean;
|
|
454
|
+
/**
|
|
455
|
+
* Paste text as ONE block, WITHOUT submitting it.
|
|
456
|
+
*
|
|
457
|
+
* `-p` wraps the payload in bracketed-paste markers. Measured 2026-07-29 on
|
|
458
|
+
* Claude Code 2.1.220: without `-p`, a multi-line brief is submitted line by
|
|
459
|
+
* line — line 1 left as its own request while line 2 stayed in the composer.
|
|
460
|
+
* With `-p` the whole block lands as a single entry that one Enter submits.
|
|
461
|
+
*/
|
|
462
|
+
export declare function pasteLiteralBlock(name: string, keys: string): boolean;
|
|
463
|
+
/** Submit whatever the composer currently holds (one real Enter key event). */
|
|
464
|
+
export declare function submitPane(name: string): boolean;
|
|
465
|
+
/**
|
|
466
|
+
* Best-effort composer wipe. Ctrl-U only kills to the start of the CURRENT
|
|
467
|
+
* line, so a multi-line composer needs several — measured: one C-u left a
|
|
468
|
+
* multi-line brief in place, and retrying the paste then STACKED copies.
|
|
469
|
+
* Delivery never depends on this succeeding; it types only once.
|
|
470
|
+
*/
|
|
471
|
+
export declare function clearPaneComposer(name: string): boolean;
|
|
472
|
+
/**
|
|
473
|
+
* VISIBLE text of one pane, or undefined when tmux cannot be read — unlike
|
|
474
|
+
* `capturePane`, which flattens a failure into "". Delivery needs the
|
|
475
|
+
* difference: an unreadable pane is not an empty one.
|
|
476
|
+
*/
|
|
477
|
+
export declare function capturePaneVisible(pane: string): string | undefined;
|
|
478
|
+
/**
|
|
479
|
+
* CPU time (ms) of the process tree behind a pane — the liveness signal used to
|
|
480
|
+
* tell a working agent from one parked on its placeholder.
|
|
481
|
+
*/
|
|
482
|
+
export declare function paneTreeCpuMs(pane: string): number | undefined;
|
|
483
|
+
/**
|
|
484
|
+
* The pid actually doing the work behind a pane.
|
|
485
|
+
*
|
|
486
|
+
* The pane's own pid is the launch WRAPPER: measured 2026-07-29, it reported 0s
|
|
487
|
+
* of CPU after 37s while its `codex` child had burned 13s. Anything that judges
|
|
488
|
+
* a lane by the reported pid alone — a supervisor, a status bar, a conductor —
|
|
489
|
+
* is reading the wrong process, and gets a false answer in both directions.
|
|
490
|
+
*/
|
|
491
|
+
export declare function paneWorkerPid(pane: string): number | undefined;
|
|
417
492
|
/**
|
|
418
493
|
* Attach the real terminal straight into the Pod's tmux session via
|
|
419
494
|
* `kubectl exec -it`. The local terminal talks to tmux directly (no WS proxy),
|
package/dist/tmux.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tmux.d.ts","sourceRoot":"","sources":["../src/tmux.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"tmux.d.ts","sourceRoot":"","sources":["../src/tmux.ts"],"names":[],"mappings":"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"}
|