@sentropic/h2a-runtime 0.91.1 → 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.
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +16 -3
- package/dist/config.js.map +1 -1
- package/dist/conv-guard.d.ts +6 -1
- package/dist/conv-guard.d.ts.map +1 -1
- package/dist/conv-guard.js +33 -8
- package/dist/conv-guard.js.map +1 -1
- package/dist/enroll.d.ts.map +1 -1
- package/dist/enroll.js +12 -2
- package/dist/enroll.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +819 -155
- package/dist/index.js.map +1 -1
- package/dist/launch-layout.d.ts +74 -0
- package/dist/launch-layout.d.ts.map +1 -0
- package/dist/launch-layout.js +324 -0
- package/dist/launch-layout.js.map +1 -0
- package/dist/llm-gateway-runtime/index.d.ts +6 -0
- package/dist/llm-gateway-runtime/index.d.ts.map +1 -1
- package/dist/llm-gateway-runtime/index.js +134 -60
- package/dist/llm-gateway-runtime/index.js.map +1 -1
- package/dist/llm-gateway-runtime/session-ledger.d.ts +38 -55
- package/dist/llm-gateway-runtime/session-ledger.d.ts.map +1 -1
- package/dist/llm-gateway-runtime/session-ledger.js +102 -250
- package/dist/llm-gateway-runtime/session-ledger.js.map +1 -1
- package/dist/llm-gateway-runtime/sticky.d.ts +25 -52
- package/dist/llm-gateway-runtime/sticky.d.ts.map +1 -1
- package/dist/llm-gateway-runtime/sticky.js +36 -605
- package/dist/llm-gateway-runtime/sticky.js.map +1 -1
- package/dist/llm-mesh.d.ts +19 -72
- package/dist/llm-mesh.d.ts.map +1 -1
- package/dist/llm-mesh.js +42 -399
- package/dist/llm-mesh.js.map +1 -1
- package/dist/llm-routing-config.d.ts +28 -0
- package/dist/llm-routing-config.d.ts.map +1 -0
- package/dist/llm-routing-config.js +100 -0
- package/dist/llm-routing-config.js.map +1 -0
- package/dist/native-host.d.ts +146 -0
- package/dist/native-host.d.ts.map +1 -0
- package/dist/native-host.js +456 -0
- package/dist/native-host.js.map +1 -0
- package/dist/native-terminal/host.d.ts +317 -1
- package/dist/native-terminal/host.d.ts.map +1 -1
- package/dist/native-terminal/host.js +696 -3
- package/dist/native-terminal/host.js.map +1 -1
- package/dist/native-terminal/op.d.ts +5 -0
- package/dist/native-terminal/op.d.ts.map +1 -0
- package/dist/native-terminal/op.js +408 -0
- package/dist/native-terminal/op.js.map +1 -0
- package/dist/native-terminal/process.d.ts +2 -0
- package/dist/native-terminal/process.d.ts.map +1 -1
- package/dist/native-terminal/process.js +16 -2
- package/dist/native-terminal/process.js.map +1 -1
- package/dist/native-terminal/server.d.ts.map +1 -1
- package/dist/native-terminal/server.js +6 -2
- package/dist/native-terminal/server.js.map +1 -1
- package/dist/native-terminal/socket-path.d.ts +8 -0
- package/dist/native-terminal/socket-path.d.ts.map +1 -1
- package/dist/native-terminal/socket-path.js +31 -1
- package/dist/native-terminal/socket-path.js.map +1 -1
- package/dist/native-terminal/supervisor.d.ts +13 -0
- package/dist/native-terminal/supervisor.d.ts.map +1 -1
- package/dist/native-terminal/supervisor.js +45 -0
- package/dist/native-terminal/supervisor.js.map +1 -1
- package/dist/pty.d.ts +23 -0
- package/dist/pty.d.ts.map +1 -1
- package/dist/pty.js +35 -0
- package/dist/pty.js.map +1 -1
- package/dist/readiness.d.ts +7 -0
- package/dist/readiness.d.ts.map +1 -1
- package/dist/readiness.js +12 -9
- package/dist/readiness.js.map +1 -1
- package/dist/registry.d.ts +324 -2
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +659 -20
- package/dist/registry.js.map +1 -1
- package/dist/restore.d.ts +91 -32
- package/dist/restore.d.ts.map +1 -1
- package/dist/restore.js +226 -186
- package/dist/restore.js.map +1 -1
- package/dist/status-projection.d.ts.map +1 -1
- package/dist/tmux.d.ts +9 -6
- package/dist/tmux.d.ts.map +1 -1
- package/dist/tmux.js +34 -8
- package/dist/tmux.js.map +1 -1
- package/package.json +3 -3
- package/dist/llm-gateway-runtime/accounts.d.ts +0 -62
- package/dist/llm-gateway-runtime/accounts.d.ts.map +0 -1
- package/dist/llm-gateway-runtime/accounts.js +0 -323
- package/dist/llm-gateway-runtime/accounts.js.map +0 -1
- package/dist/llm-gateway-runtime/model-catalog.d.ts +0 -44
- package/dist/llm-gateway-runtime/model-catalog.d.ts.map +0 -1
- package/dist/llm-gateway-runtime/model-catalog.js +0 -191
- package/dist/llm-gateway-runtime/model-catalog.js.map +0 -1
- package/dist/llm-gateway-runtime/proxy-anthropic.d.ts +0 -3
- package/dist/llm-gateway-runtime/proxy-anthropic.d.ts.map +0 -1
- package/dist/llm-gateway-runtime/proxy-anthropic.js +0 -318
- package/dist/llm-gateway-runtime/proxy-anthropic.js.map +0 -1
- package/dist/llm-gateway-runtime/proxy-cloud-code.d.ts +0 -11
- package/dist/llm-gateway-runtime/proxy-cloud-code.d.ts.map +0 -1
- package/dist/llm-gateway-runtime/proxy-cloud-code.js +0 -215
- package/dist/llm-gateway-runtime/proxy-cloud-code.js.map +0 -1
- package/dist/llm-gateway-runtime/proxy-openai.d.ts +0 -118
- package/dist/llm-gateway-runtime/proxy-openai.d.ts.map +0 -1
- package/dist/llm-gateway-runtime/proxy-openai.js +0 -1305
- package/dist/llm-gateway-runtime/proxy-openai.js.map +0 -1
|
@@ -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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"}
|