@sentropic/h2a-runtime 0.92.0 → 0.93.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 (63) hide show
  1. package/dist/conv-guard.d.ts +6 -1
  2. package/dist/conv-guard.d.ts.map +1 -1
  3. package/dist/conv-guard.js +33 -8
  4. package/dist/conv-guard.js.map +1 -1
  5. package/dist/enroll.d.ts.map +1 -1
  6. package/dist/enroll.js +12 -2
  7. package/dist/enroll.js.map +1 -1
  8. package/dist/index.d.ts +3 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +743 -97
  11. package/dist/index.js.map +1 -1
  12. package/dist/launch-layout.d.ts +74 -0
  13. package/dist/launch-layout.d.ts.map +1 -0
  14. package/dist/launch-layout.js +324 -0
  15. package/dist/launch-layout.js.map +1 -0
  16. package/dist/native-host.d.ts +146 -0
  17. package/dist/native-host.d.ts.map +1 -0
  18. package/dist/native-host.js +456 -0
  19. package/dist/native-host.js.map +1 -0
  20. package/dist/native-terminal/host.d.ts +317 -1
  21. package/dist/native-terminal/host.d.ts.map +1 -1
  22. package/dist/native-terminal/host.js +696 -3
  23. package/dist/native-terminal/host.js.map +1 -1
  24. package/dist/native-terminal/op.d.ts +5 -0
  25. package/dist/native-terminal/op.d.ts.map +1 -0
  26. package/dist/native-terminal/op.js +408 -0
  27. package/dist/native-terminal/op.js.map +1 -0
  28. package/dist/native-terminal/process.d.ts +2 -0
  29. package/dist/native-terminal/process.d.ts.map +1 -1
  30. package/dist/native-terminal/process.js +16 -2
  31. package/dist/native-terminal/process.js.map +1 -1
  32. package/dist/native-terminal/server.d.ts.map +1 -1
  33. package/dist/native-terminal/server.js +6 -2
  34. package/dist/native-terminal/server.js.map +1 -1
  35. package/dist/native-terminal/socket-path.d.ts +8 -0
  36. package/dist/native-terminal/socket-path.d.ts.map +1 -1
  37. package/dist/native-terminal/socket-path.js +31 -1
  38. package/dist/native-terminal/socket-path.js.map +1 -1
  39. package/dist/native-terminal/supervisor.d.ts +13 -0
  40. package/dist/native-terminal/supervisor.d.ts.map +1 -1
  41. package/dist/native-terminal/supervisor.js +45 -0
  42. package/dist/native-terminal/supervisor.js.map +1 -1
  43. package/dist/pty.d.ts +23 -0
  44. package/dist/pty.d.ts.map +1 -1
  45. package/dist/pty.js +35 -0
  46. package/dist/pty.js.map +1 -1
  47. package/dist/readiness.d.ts +7 -0
  48. package/dist/readiness.d.ts.map +1 -1
  49. package/dist/readiness.js +12 -9
  50. package/dist/readiness.js.map +1 -1
  51. package/dist/registry.d.ts +317 -2
  52. package/dist/registry.d.ts.map +1 -1
  53. package/dist/registry.js +622 -19
  54. package/dist/registry.js.map +1 -1
  55. package/dist/restore.d.ts +91 -32
  56. package/dist/restore.d.ts.map +1 -1
  57. package/dist/restore.js +226 -186
  58. package/dist/restore.js.map +1 -1
  59. package/dist/tmux.d.ts +2 -1
  60. package/dist/tmux.d.ts.map +1 -1
  61. package/dist/tmux.js +1 -1
  62. package/dist/tmux.js.map +1 -1
  63. package/package.json +1 -1
@@ -0,0 +1,456 @@
1
+ /**
2
+ * Native-PTY-backed session management — the tmux.ts twin for sessions hosted
3
+ * by the native terminal host (native-terminal/*) instead of a tmux server.
4
+ *
5
+ * Shape contract: every function here is SYNCHRONOUS and tmux-shaped, so the
6
+ * session verbs in index.ts can branch between hosts without changing their
7
+ * own structure. The async unix-socket protocol is bridged by shelling out to
8
+ * the compiled one-shot entrypoint (native-terminal/op.js), exactly the way
9
+ * tmux.ts shells out to the `tmux` binary. The native host process itself is
10
+ * the long-lived "server" (the tmux-server twin): it is spawned on first use,
11
+ * survives CLI exits, and owns every PTY.
12
+ *
13
+ * Sessions reuse the h2a-<slug> naming contract from tmux.ts so slugs,
14
+ * addressing and registry entries stay uniform across hosts.
15
+ */
16
+ import { spawnSync } from "node:child_process";
17
+ import { existsSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
18
+ import { tmpdir } from "node:os";
19
+ import { basename, dirname, join } from "node:path";
20
+ import { fileURLToPath } from "node:url";
21
+ import { nativePtyRequirements } from "./pty.js";
22
+ import { HEADLESS_TERMINAL_SIZE, HEADLESS_WRAPPER, LOCAL_WRAPPER, STRUCTURED_LOCAL_WRAPPER, localRelaunchCommand, localSessionName, procReaderDeps, slugify, } from "./tmux.js";
23
+ import { readProcessTreeCpuMs, readWorkerPid } from "./proc-cpu.js";
24
+ import { sleepSync } from "./prompt-delivery.js";
25
+ import { SESSION_CLASS_ENV } from "./session-class.js";
26
+ const OP_TIMEOUT_MS = 15_000;
27
+ /**
28
+ * Which host runs a NEW session's terminal. The native PTY host is the
29
+ * default; `--tmux` (per command) or H2A_SESSION_HOST=tmux (fleet-wide safety
30
+ * valve) selects tmux. Existing sessions are NEVER re-routed here — verbs that
31
+ * act on a recorded session honor its registry kind instead.
32
+ */
33
+ export function resolveSessionHostKind(opts, env = process.env) {
34
+ if (opts.tmux === true)
35
+ return "local-tmux";
36
+ if ((env["H2A_SESSION_HOST"] ?? "").toLowerCase() === "tmux") {
37
+ return "local-tmux";
38
+ }
39
+ return "native";
40
+ }
41
+ /** Companion native session that hosts the h2a MCP sidecar for `name`. */
42
+ export function nativeSidecarName(name) {
43
+ return `${name}.h2a`;
44
+ }
45
+ function opEntryPath() {
46
+ const here = dirname(fileURLToPath(import.meta.url));
47
+ const sibling = join(here, "native-terminal", "op.js");
48
+ if (existsSync(sibling))
49
+ return sibling;
50
+ // Under vitest this module executes from src/, where only op.ts lives — the
51
+ // runnable entrypoint is the COMPILED twin in dist/. Production always runs
52
+ // from dist/ and takes the first branch (its sibling op.js exists), so this
53
+ // fallback is reachable only from a src/ execution context. When neither
54
+ // exists, return the sibling path so the spawn fails with the same loud
55
+ // MODULE_NOT_FOUND as before (an unbuilt tree must not fail silently).
56
+ if (basename(here) === "src") {
57
+ const built = join(dirname(here), "dist", "native-terminal", "op.js");
58
+ if (existsSync(built))
59
+ return built;
60
+ }
61
+ return sibling;
62
+ }
63
+ /** node-pty loadable + containment binaries present. Pure preflight. */
64
+ export function nativeHostAvailable() {
65
+ return nativePtyRequirements();
66
+ }
67
+ function runOp(args, options = {}) {
68
+ const r = spawnSync(process.execPath, [opEntryPath(), ...args], {
69
+ encoding: "utf8",
70
+ stdio: ["ignore", "pipe", "pipe"],
71
+ timeout: OP_TIMEOUT_MS,
72
+ });
73
+ if (r.error) {
74
+ throw new Error(`native host operation ${args.join(" ")} failed: ${r.error.message}`, { cause: r.error });
75
+ }
76
+ const status = r.status ?? 1;
77
+ if (status !== 0 && options.allowFailure !== true) {
78
+ const detail = (r.stderr ?? "").trim() || (r.stdout ?? "").trim();
79
+ throw new Error(`native host operation ${args[0]} failed: ${detail}`);
80
+ }
81
+ let payload;
82
+ const stdout = (r.stdout ?? "").trim();
83
+ if (stdout.length > 0) {
84
+ try {
85
+ payload = JSON.parse(stdout.split("\n").pop());
86
+ }
87
+ catch {
88
+ payload = undefined;
89
+ }
90
+ }
91
+ return { status, payload };
92
+ }
93
+ /** Spawn-or-adopt the per-user host; returns its identity. */
94
+ export function ensureNativeHost() {
95
+ const { payload } = runOp(["ensure-host"]);
96
+ const record = payload;
97
+ if (!record || typeof record.hostPid !== "number" || typeof record.socketPath !== "string") {
98
+ throw new Error("native host did not report a valid identity");
99
+ }
100
+ return { hostPid: record.hostPid, socketPath: record.socketPath };
101
+ }
102
+ export function listNativeSessions() {
103
+ const { payload } = runOp(["list"]);
104
+ const record = payload;
105
+ return record?.sessions ?? [];
106
+ }
107
+ export function nativeSessionState(name) {
108
+ let result;
109
+ try {
110
+ result = runOp(["probe", "--id", name], { allowFailure: true });
111
+ }
112
+ catch (error) {
113
+ // Spawn-level failure (timeout, ENOMEM, …): nothing was proven.
114
+ return {
115
+ state: "unknown",
116
+ reason: error instanceof Error ? error.message : String(error),
117
+ };
118
+ }
119
+ const record = result.payload;
120
+ if (result.status !== 0 || record === undefined) {
121
+ return { state: "unknown", reason: "native probe op returned no verdict" };
122
+ }
123
+ if ((record.verdict === "live" || record.verdict === "dead") && record.state) {
124
+ return { state: "found", session: record.state };
125
+ }
126
+ if (record.verdict === "dead")
127
+ return { state: "absent" };
128
+ return {
129
+ state: "unknown",
130
+ reason: record.reason ?? "native probe op returned no verdict",
131
+ };
132
+ }
133
+ /**
134
+ * 3-state liveness (F2): `true` / `false` are POSITIVE verdicts; "unknown"
135
+ * is a probe failure that destructive paths must refuse on. Never throws.
136
+ */
137
+ export function nativeSessionLiveness(name) {
138
+ const probe = nativeSessionState(name);
139
+ if (probe.state === "found")
140
+ return probe.session.status === "running";
141
+ if (probe.state === "absent")
142
+ return false;
143
+ return "unknown";
144
+ }
145
+ export function nativeSessionPid(name) {
146
+ // A pid is a read, not an act: absent AND unknown both yield undefined
147
+ // (there is no pid to report either way); acts must not key off this.
148
+ const probe = nativeSessionState(name);
149
+ return probe.state === "found" && probe.session.status !== "exited"
150
+ ? probe.session.pid
151
+ : undefined;
152
+ }
153
+ /**
154
+ * startLocalSession twin. Runs the SAME bash wrapper contract as the tmux
155
+ * path (LOCAL_WRAPPER drop-to-shell / STRUCTURED_LOCAL_WRAPPER exec-only), so
156
+ * agent exit semantics are identical across hosts.
157
+ */
158
+ export function startNativeSession(profile, command, cwd, args = [], label, metadata = {}) {
159
+ const slug = slugify(label ?? cwd);
160
+ const name = localSessionName(slug);
161
+ const existing = nativeSessionState(name);
162
+ if (existing.state === "unknown") {
163
+ // An unprovable host state must never be read as absence: creating here
164
+ // could fabricate a twin over a live session (fail closed).
165
+ throw new Error(`native session ${slug}: host state is unknown (${existing.reason}); refusing to create over an unprovable session`);
166
+ }
167
+ if (existing.state === "found" && existing.session.status !== "exited") {
168
+ if (metadata.refuseExisting) {
169
+ throw new Error(`native session ${slug} already exists; no agent was started`);
170
+ }
171
+ return { name, slug, pid: existing.session.pid };
172
+ }
173
+ const agentCommand = metadata.terminateOnAgentExit
174
+ ? ["/bin/bash", "-lc", STRUCTURED_LOCAL_WRAPPER, command, ...args]
175
+ : [
176
+ "/bin/bash",
177
+ "-lc",
178
+ LOCAL_WRAPPER,
179
+ localRelaunchCommand(profile, cwd, label, metadata.resumeId ? ["--resume", metadata.resumeId] : []),
180
+ command,
181
+ ...args,
182
+ ];
183
+ const env = {};
184
+ for (const [key, value] of Object.entries(process.env)) {
185
+ if (value !== undefined)
186
+ env[key] = value;
187
+ }
188
+ env["TERM"] = "xterm-256color";
189
+ if (metadata.sessionClass !== undefined) {
190
+ env[SESSION_CLASS_ENV] = metadata.sessionClass;
191
+ }
192
+ // Env goes through a file: it can exceed argv limits and must not leak into
193
+ // process listings.
194
+ const envDir = mkdtempSync(join(tmpdir(), "h2a-native-env-"));
195
+ const envFile = join(envDir, "env.json");
196
+ try {
197
+ writeFileSync(envFile, JSON.stringify(env), { mode: 0o600 });
198
+ const { payload } = runOp([
199
+ "create",
200
+ "--id",
201
+ name,
202
+ "--cwd",
203
+ cwd,
204
+ "--cols",
205
+ String(HEADLESS_TERMINAL_SIZE.cols),
206
+ "--rows",
207
+ String(HEADLESS_TERMINAL_SIZE.rows),
208
+ "--env-file",
209
+ envFile,
210
+ "--",
211
+ ...agentCommand,
212
+ ]);
213
+ const state = payload;
214
+ if (!state || typeof state.pid !== "number") {
215
+ throw new Error(`native host did not return a session state for ${slug}`);
216
+ }
217
+ return { name, slug, pid: state.pid };
218
+ }
219
+ finally {
220
+ rmSync(envDir, { recursive: true, force: true });
221
+ }
222
+ }
223
+ /** sendKeysLiteral twin: raw keystrokes, no interpretation. */
224
+ export function nativeSendKeysLiteral(name, text) {
225
+ const { status } = runOp(["write", "--id", name, "--b64", Buffer.from(text, "utf8").toString("base64")], { allowFailure: true });
226
+ return status === 0;
227
+ }
228
+ /** paste-buffer -p twin: the text lands as ONE bracketed block. */
229
+ export function nativePasteBlock(name, text) {
230
+ const { status } = runOp(["paste", "--id", name, "--b64", Buffer.from(text, "utf8").toString("base64")], { allowFailure: true });
231
+ return status === 0;
232
+ }
233
+ /** The Enter that submits a composed block. */
234
+ export function nativeSendEnter(name) {
235
+ const { status } = runOp(["enter", "--id", name], { allowFailure: true });
236
+ return status === 0;
237
+ }
238
+ /**
239
+ * capturePane twin. IMPORTANT semantic difference: tmux returns the RENDERED
240
+ * screen; this returns the ANSI-stripped tail of the output stream. For probe
241
+ * matching (prompt echo, modal text) the stream tail carries the same visible
242
+ * text — full-screen-repaint TUIs re-emit their frame into the tail.
243
+ */
244
+ export function nativeCapture(name, bytes = 16_384) {
245
+ const { status, payload } = runOp(["capture", "--id", name, "--bytes", String(bytes)], { allowFailure: true });
246
+ if (status !== 0)
247
+ return undefined;
248
+ const record = payload;
249
+ return typeof record?.text === "string" ? record.text : undefined;
250
+ }
251
+ /** kill-session twin: SIGTERM with SIGKILL escalation inside the op. */
252
+ export function killNativeSession(name) {
253
+ const { status } = runOp(["kill", "--id", name], { allowFailure: true });
254
+ return status === 0;
255
+ }
256
+ /**
257
+ * Kill a session AND its h2a sidecar companion (the tmux twin gets this for
258
+ * free because the sidecar is a window inside the killed session).
259
+ */
260
+ export function killNativeSessionTree(name) {
261
+ const killed = killNativeSession(name);
262
+ // Best-effort companion cleanup: only a POSITIVELY-found sidecar is
263
+ // killed; absent needs nothing and unknown proves nothing to act on.
264
+ if (nativeSessionState(nativeSidecarName(name)).state === "found") {
265
+ killNativeSession(nativeSidecarName(name));
266
+ }
267
+ return killed;
268
+ }
269
+ /**
270
+ * startHeadlessSession twin: run-once agent under HEADLESS_WRAPPER, writing
271
+ * result.json + output.log, session ends when the wrapper finishes. The
272
+ * prompt rides a 0600 file consumed and unlinked by the wrapper — identical
273
+ * contract to the tmux path.
274
+ */
275
+ export function startNativeHeadlessSession(profile, command, cwd, args, resultJson, outputLog, label, promptInput, refuseExisting = false, sessionClass) {
276
+ const slug = slugify(label);
277
+ const name = localSessionName(slug);
278
+ const existing = nativeSessionState(name);
279
+ if (existing.state === "unknown") {
280
+ // Same fail-closed rule as startNativeSession: an unprovable host state
281
+ // is never permission to create a possible twin.
282
+ throw new Error(`native session ${slug}: host state is unknown (${existing.reason}); refusing to create over an unprovable session`);
283
+ }
284
+ if (existing.state === "found" && existing.session.status !== "exited") {
285
+ if (refuseExisting) {
286
+ throw new Error(`native session ${slug} already exists; no agent was started`);
287
+ }
288
+ return { name, slug, pid: existing.session.pid };
289
+ }
290
+ const promptFile = promptInput === undefined ? "" : `${resultJson}.prompt`;
291
+ if (promptInput !== undefined) {
292
+ writeFileSync(promptFile, promptInput, {
293
+ encoding: "utf8",
294
+ mode: 0o600,
295
+ flag: "wx",
296
+ });
297
+ }
298
+ const agentCommand = [
299
+ "/bin/bash",
300
+ "-lc",
301
+ HEADLESS_WRAPPER,
302
+ resultJson,
303
+ outputLog,
304
+ promptFile,
305
+ command,
306
+ ...args,
307
+ ];
308
+ const env = {};
309
+ for (const [key, value] of Object.entries(process.env)) {
310
+ if (value !== undefined)
311
+ env[key] = value;
312
+ }
313
+ env["TERM"] = "xterm-256color";
314
+ if (sessionClass !== undefined)
315
+ env[SESSION_CLASS_ENV] = sessionClass;
316
+ const envDir = mkdtempSync(join(tmpdir(), "h2a-native-env-"));
317
+ const envFile = join(envDir, "env.json");
318
+ try {
319
+ writeFileSync(envFile, JSON.stringify(env), { mode: 0o600 });
320
+ const { payload } = runOp([
321
+ "create",
322
+ "--id",
323
+ name,
324
+ "--cwd",
325
+ cwd,
326
+ "--cols",
327
+ String(HEADLESS_TERMINAL_SIZE.cols),
328
+ "--rows",
329
+ String(HEADLESS_TERMINAL_SIZE.rows),
330
+ "--env-file",
331
+ envFile,
332
+ "--",
333
+ ...agentCommand,
334
+ ]);
335
+ const state = payload;
336
+ if (!state || typeof state.pid !== "number") {
337
+ throw new Error(`native host did not return a session state for ${slug}`);
338
+ }
339
+ return { name, slug, pid: state.pid, ...(promptFile ? { promptFile } : {}) };
340
+ }
341
+ finally {
342
+ rmSync(envDir, { recursive: true, force: true });
343
+ }
344
+ }
345
+ /**
346
+ * startH2aWindow twin: the h2a MCP sidecar runs in a COMPANION native session
347
+ * (`<name>.h2a`) instead of a tmux window. Lifecycle: killNativeSessionTree
348
+ * stops it with its main session.
349
+ */
350
+ export function startNativeH2aSidecar(name, cwd, h2aCommand, options = {}) {
351
+ const sidecar = nativeSidecarName(name);
352
+ const existing = nativeSessionState(sidecar);
353
+ if (existing.state === "unknown") {
354
+ // Unprovable sidecar state: report failure without creating a possible
355
+ // twin (the caller treats false as "sidecar unavailable").
356
+ return false;
357
+ }
358
+ if (existing.state === "found" && existing.session.status === "running") {
359
+ return true;
360
+ }
361
+ const env = {};
362
+ for (const [key, value] of Object.entries(process.env)) {
363
+ if (value !== undefined)
364
+ env[key] = value;
365
+ }
366
+ env["TERM"] = "xterm-256color";
367
+ const envDir = mkdtempSync(join(tmpdir(), "h2a-native-env-"));
368
+ const envFile = join(envDir, "env.json");
369
+ try {
370
+ writeFileSync(envFile, JSON.stringify(env), { mode: 0o600 });
371
+ runOp([
372
+ "create",
373
+ "--id",
374
+ sidecar,
375
+ "--cwd",
376
+ cwd,
377
+ "--cols",
378
+ "120",
379
+ "--rows",
380
+ "30",
381
+ "--env-file",
382
+ envFile,
383
+ "--",
384
+ "/bin/bash",
385
+ "-lc",
386
+ h2aCommand,
387
+ ]);
388
+ }
389
+ catch {
390
+ return false;
391
+ }
392
+ finally {
393
+ rmSync(envDir, { recursive: true, force: true });
394
+ }
395
+ if (options.verified) {
396
+ // The sidecar must still be alive once it had time to crash on startup.
397
+ // An "unknown" probe mid-loop is transient: keep waiting; the FINAL
398
+ // check below only reports success on a POSITIVE running verdict.
399
+ const deadline = Date.now() + 2_000;
400
+ while (Date.now() < deadline) {
401
+ const state = nativeSessionState(sidecar);
402
+ if (state.state === "absent" ||
403
+ (state.state === "found" && state.session.status === "exited")) {
404
+ return false;
405
+ }
406
+ sleepSync(200);
407
+ }
408
+ }
409
+ const state = nativeSessionState(sidecar);
410
+ return state.state === "found" && state.session.status === "running";
411
+ }
412
+ /**
413
+ * Foreground interactive attach on the CURRENT terminal (tmux attach twin).
414
+ * Blocks until the session exits or the user detaches with Ctrl-\.
415
+ */
416
+ export function attachNativeSession(name) {
417
+ const r = spawnSync(process.execPath, [opEntryPath(), "attach", "--id", name], {
418
+ stdio: "inherit",
419
+ });
420
+ return r.status ?? 1;
421
+ }
422
+ /** clearPaneComposer twin: C-u wipes the composer line (best-effort). */
423
+ export function nativeClearComposer(name) {
424
+ return nativeSendKeysLiteral(name, "");
425
+ }
426
+ /** paneTreeCpuMs twin, keyed by session name instead of tmux pane. */
427
+ export function nativeTreeCpuMs(name) {
428
+ const pid = nativeSessionPid(name);
429
+ if (pid === undefined)
430
+ return undefined;
431
+ return readProcessTreeCpuMs(pid, procReaderDeps());
432
+ }
433
+ /** paneWorkerPid twin: the pid actually doing the work under the wrapper. */
434
+ export function nativeWorkerPid(name) {
435
+ const pid = nativeSessionPid(name);
436
+ if (pid === undefined)
437
+ return undefined;
438
+ return readWorkerPid(pid, procReaderDeps());
439
+ }
440
+ /**
441
+ * PromptDeliveryDeps for a native session — deliverInitialPrompt() runs the
442
+ * SAME measured protocol as on tmux; only the transport differs. The "pane"
443
+ * key given to deliverInitialPrompt must be the session NAME.
444
+ */
445
+ export function nativePromptDeliveryDeps(sleep) {
446
+ return {
447
+ capturePane: (name) => nativeCapture(name),
448
+ clearComposer: (name) => nativeClearComposer(name),
449
+ pasteBlock: (name, text) => nativePasteBlock(name, text),
450
+ submit: (name) => nativeSendEnter(name),
451
+ cpuMs: (name) => nativeTreeCpuMs(name),
452
+ sleep,
453
+ now: () => Date.now(),
454
+ };
455
+ }
456
+ //# sourceMappingURL=native-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-host.js","sourceRoot":"","sources":["../src/native-host.ts"],"names":[],"mappings":"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"}