zelari-code 2.15.0 → 2.16.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 (46) hide show
  1. package/dist/cli/companion/cors.js +52 -0
  2. package/dist/cli/companion/cors.js.map +1 -0
  3. package/dist/cli/companion/runManager.js +233 -1
  4. package/dist/cli/companion/runManager.js.map +1 -1
  5. package/dist/cli/companion/serve.js +21 -4
  6. package/dist/cli/companion/serve.js.map +1 -1
  7. package/dist/cli/extensions/extensionToolWiring.js +57 -0
  8. package/dist/cli/extensions/extensionToolWiring.js.map +1 -0
  9. package/dist/cli/extensions/loader.js +213 -0
  10. package/dist/cli/extensions/loader.js.map +1 -0
  11. package/dist/cli/extensions/sandboxedFs.js +69 -0
  12. package/dist/cli/extensions/sandboxedFs.js.map +1 -0
  13. package/dist/cli/headless/runOneTurn.js +783 -0
  14. package/dist/cli/headless/runOneTurn.js.map +1 -0
  15. package/dist/cli/kraken/completionGate.js +22 -5
  16. package/dist/cli/kraken/completionGate.js.map +1 -1
  17. package/dist/cli/lsp/manager.js +16 -0
  18. package/dist/cli/lsp/manager.js.map +1 -1
  19. package/dist/cli/main.bundled.js +17714 -15752
  20. package/dist/cli/main.bundled.js.map +4 -4
  21. package/dist/cli/main.js +20 -0
  22. package/dist/cli/main.js.map +1 -1
  23. package/dist/cli/runHeadless.js +5 -695
  24. package/dist/cli/runHeadless.js.map +1 -1
  25. package/dist/cli/safety/jails/darwin.js +87 -0
  26. package/dist/cli/safety/jails/darwin.js.map +1 -0
  27. package/dist/cli/safety/jails/linux.js +80 -0
  28. package/dist/cli/safety/jails/linux.js.map +1 -0
  29. package/dist/cli/safety/jails/win32.js +19 -0
  30. package/dist/cli/safety/jails/win32.js.map +1 -0
  31. package/dist/cli/safety/lifecycleHooks.js +33 -3
  32. package/dist/cli/safety/lifecycleHooks.js.map +1 -1
  33. package/dist/cli/safety/osJail.js +289 -0
  34. package/dist/cli/safety/osJail.js.map +1 -0
  35. package/dist/cli/safety/policyLoadMode.js.map +1 -1
  36. package/dist/cli/serve/harnessClient.js +150 -0
  37. package/dist/cli/serve/harnessClient.js.map +1 -0
  38. package/dist/cli/serve/harnessServer.js +333 -0
  39. package/dist/cli/serve/harnessServer.js.map +1 -0
  40. package/dist/cli/serve/sessionControl.js +67 -0
  41. package/dist/cli/serve/sessionControl.js.map +1 -0
  42. package/dist/cli/toolRegistry.js +338 -33
  43. package/dist/cli/toolRegistry.js.map +1 -1
  44. package/dist/cli/tools/execProcess.js +36 -15
  45. package/dist/cli/tools/execProcess.js.map +1 -1
  46. package/package.json +2 -2
@@ -0,0 +1,289 @@
1
+ /**
2
+ * osJail — Pilastro A (HARNESS-10 t28): OS-level process jail for the CLI
3
+ * execution surface (`exec_process` + the CLI `bash` path).
4
+ *
5
+ * WHAT IT IS
6
+ * ONE choke-point, {@link spawnJailed}, through which EVERY CLI spawn of
7
+ * the exec tools must flow (grep-gated by scripts/verify-os-jail.mjs).
8
+ * The {@link JailSpec} is derived from the SAME decision inputs the
9
+ * permission layer already used — sandboxPath root + resourceClaims
10
+ * network claims — there is deliberately NO second policy engine here.
11
+ *
12
+ * HONESTY CONTRACT (P3 — no fake containment, no jail-by-prompt)
13
+ * Pure Node CANNOT create restricted tokens (win32) or landlock rulesets
14
+ * (linux) without native modules, which this repo bans. Each backend in
15
+ * ./jails/ therefore probes HONESTLY and reports `unavailable` when it
16
+ * cannot actually contain the child:
17
+ * - darwin : sandbox-exec (Seatbelt) profile as argv prefix
18
+ * - linux : bubblewrap (bwrap) argv wrapper — landlock needs syscalls
19
+ * Node does not expose, so without bwrap there is NO backend
20
+ * - win32 : restricted token + low integrity + Job Object needs native
21
+ * APIs → the backend declares itself UNAVAILABLE in this task
22
+ * Golden rule: backend missing + ZELARI_OS_JAIL=required ⇒ the tool is
23
+ * DENIED (typed `[jail]` error) — NEVER warn/skip/upgrade-to-advisory.
24
+ * The advisory fail-open is ALWAYS VISIBLE: console.error + audit entry +
25
+ * a warning on the tool result. Silence would be a fake guarantee.
26
+ *
27
+ * MODE RESOLUTION (same pattern as safety/lifecycleHooks.resolveHookFailureMode)
28
+ * 1. ZELARI_OS_JAIL=off|advisory|required (exact match, case/space
29
+ * -insensitive; any other value is IGNORED — a typo never weakens the jail)
30
+ * 2. default: `required` on strict surfaces (headless/mission/CI — see
31
+ * policyLoadMode) WHEN the platform backend probes available, otherwise
32
+ * VISIBLE advisory; `advisory` on the interactive TUI.
33
+ *
34
+ * A stub backend may be injected via {@link setJailBackendForTests} — that
35
+ * seam is for TESTS ONLY and is never set by production code paths.
36
+ *
37
+ * Out of scope (declared, not hidden): persistent LSP language servers
38
+ * (src/cli/lsp/manager.ts) and lifecycle hooks (packages/core LifecycleHookRunner,
39
+ * which core cannot route through a CLI module) do NOT pass through this jail.
40
+ *
41
+ * @since v2.17.0 (HARNESS-10 t28)
42
+ */
43
+ import { spawn } from 'node:child_process';
44
+ import { homedir, tmpdir } from 'node:os';
45
+ import path from 'node:path';
46
+ import { activePolicyLoadMode } from './policyLoadMode.js';
47
+ import { darwinBackend } from './jails/darwin.js';
48
+ import { linuxBackend } from './jails/linux.js';
49
+ import { win32Backend } from './jails/win32.js';
50
+ // ── Mode resolution (resolveHookFailureMode pattern) ─────────────────────
51
+ /** Env override accepted by resolveJailMode. */
52
+ export const OS_JAIL_ENV = 'ZELARI_OS_JAIL';
53
+ /**
54
+ * Pure mode resolution. Exactly `off` / `advisory` / `required` (case/space
55
+ * -insensitive) wins; ANY other value is ignored and falls through to the
56
+ * surface default — strict policy ⇒ required, permissive ⇒ advisory. Same
57
+ * shape as safety/lifecycleHooks.resolveHookFailureMode (t22), one more
58
+ * consumer of the SAME policy load mode, not a second switch.
59
+ */
60
+ export function resolveJailMode(override, env = process.env) {
61
+ const v = override?.trim().toLowerCase();
62
+ if (v === 'off')
63
+ return 'off';
64
+ if (v === 'advisory')
65
+ return 'advisory';
66
+ if (v === 'required')
67
+ return 'required';
68
+ if (activePolicyLoadMode(env) !== 'strict')
69
+ return 'advisory';
70
+ // Strict surfaces want a REAL jail — but the backend must exist. Defaulting
71
+ // to `required` on a platform with no honest backend (win32 today, linux
72
+ // without bwrap) would DENY every exec tool call there. The honest default
73
+ // is VISIBLE advisory (triple notice); `required` stays enforceable — and
74
+ // DENIES on a missing backend — when set explicitly via ZELARI_OS_JAIL.
75
+ return probeJailBackend().available ? 'required' : 'advisory';
76
+ }
77
+ /** Resolve the ACTIVE jail mode from env (injectable so tests never mutate process.env). */
78
+ export function activeJailMode(env = process.env) {
79
+ return resolveJailMode(env[OS_JAIL_ENV], env);
80
+ }
81
+ // ── Backends ─────────────────────────────────────────────────────────────
82
+ function platformBackend(platform = process.platform) {
83
+ switch (platform) {
84
+ case 'darwin':
85
+ return darwinBackend;
86
+ case 'linux':
87
+ return linuxBackend;
88
+ default:
89
+ // win32 (and anything else): the honest-unavailable restricted-token stub.
90
+ return win32Backend;
91
+ }
92
+ }
93
+ let testBackend = null; // TEST-ONLY injection, never production.
94
+ let probeCache = null;
95
+ /** Current backend: the injected test stub wins, otherwise the platform's. */
96
+ function currentBackend(platform = process.platform) {
97
+ return testBackend ?? platformBackend(platform);
98
+ }
99
+ /**
100
+ * Probe the active backend (memoized for the real platform probe; the test
101
+ * stub is probed fresh every call so tests can flip availability freely).
102
+ */
103
+ export function probeJailBackend(platform = process.platform) {
104
+ if (testBackend)
105
+ return testBackend.probe();
106
+ if (!probeCache || probeCache.platform !== platform) {
107
+ probeCache = { platform, result: platformBackend(platform).probe() };
108
+ }
109
+ return probeCache.result;
110
+ }
111
+ /**
112
+ * TEST-ONLY: inject a jail backend (or `null` to restore the platform one).
113
+ * Production code must never call this — a stub is NEVER active by default.
114
+ */
115
+ export function setJailBackendForTests(backend) {
116
+ testBackend = backend;
117
+ probeCache = null;
118
+ }
119
+ // ── JailSpec construction (same decision inputs — no second policy engine) ──
120
+ /** Spec-mandated default allowlist: today's exec tools inherited ALL of process.env. */
121
+ export const BASE_ENV_ALLOWLIST = [
122
+ 'PATH', 'HOME', 'USER', 'LANG', 'CI', 'TERM', 'NO_COLOR',
123
+ ];
124
+ /**
125
+ * win32 additions WITHOUT which a jailed shell cannot even start (SystemRoot
126
+ * missing makes many Windows binaries fail outright); `MSYSTEM` is what the
127
+ * Git Bash branch of the bash tool sets. Documented default, still a tiny
128
+ * fraction of process.env.
129
+ */
130
+ const WIN32_ENV_ALLOWLIST = [
131
+ 'PATH', 'Path', 'HOMEDRIVE', 'HOMEPATH', 'SystemRoot', 'SystemDrive', 'ComSpec',
132
+ 'PATHEXT', 'TEMP', 'TMP', 'APPDATA', 'LOCALAPPDATA', 'USERPROFILE', 'USERNAME',
133
+ 'MSYSTEM', 'PROGRAMFILES', 'ProgramFiles', 'ProgramData', 'OS',
134
+ 'NUMBER_OF_PROCESSORS', 'PROCESSOR_ARCHITECTURE', 'WINDIR',
135
+ ];
136
+ export function defaultEnvAllowlist(platform = process.platform) {
137
+ return platform === 'win32' ? [...BASE_ENV_ALLOWLIST, ...WIN32_ENV_ALLOWLIST] : BASE_ENV_ALLOWLIST;
138
+ }
139
+ /** Writable = root + tmpdir + ~/.zelari-code (deduped, case-folded on win32). */
140
+ export function defaultWritable(root, home = homedir(), tmp = tmpdir(), platform = process.platform) {
141
+ // All three entries go through the same resolution so that dedup is
142
+ // host-independent: a win32 case-folded collapse must hold on any host
143
+ // (path.resolve is identity for already-absolute native paths).
144
+ const raw = [path.resolve(root), path.resolve(tmp), path.join(home, '.zelari-code')];
145
+ const out = [];
146
+ for (const p of raw) {
147
+ const key = platform === 'win32' ? p.toLowerCase() : p;
148
+ if (!out.some((q) => (platform === 'win32' ? q.toLowerCase() : q) === key))
149
+ out.push(p);
150
+ }
151
+ return out;
152
+ }
153
+ /**
154
+ * Build a JailSpec. `network` defaults to the conservative deny; pass the
155
+ * result of {@link networkSpecFromClaimHosts} to honor the claims decision.
156
+ */
157
+ export function buildJailSpec(opts) {
158
+ return {
159
+ root: path.resolve(opts.root),
160
+ network: opts.network ?? { mode: 'deny' },
161
+ envAllowlist: opts.envAllowlist ?? defaultEnvAllowlist(),
162
+ writable: opts.writable ?? defaultWritable(opts.root),
163
+ };
164
+ }
165
+ /**
166
+ * Pure bridge from the EXISTING claims engine (resourceClaims): hosts whose
167
+ * layered claim verdict was `allow` become the allow-list; anything else
168
+ * (no claims / ask / deny) stays conservative `deny`.
169
+ */
170
+ export function networkSpecFromClaimHosts(allowedHosts) {
171
+ if (!allowedHosts || allowedHosts.length === 0)
172
+ return { mode: 'deny' };
173
+ return { mode: 'allow-list', hosts: [...new Set(allowedHosts)] };
174
+ }
175
+ /**
176
+ * Env sanitation for a jailed child: keep ONLY allowlisted variables
177
+ * (case-insensitive on win32, preserving the original key casing) and always
178
+ * propagate the CI fast-fail flag. Pure — `env` is never mutated.
179
+ */
180
+ export function sanitizeEnv(env, allowlist, platform = process.platform) {
181
+ const wanted = new Set(allowlist.map((k) => (platform === 'win32' ? k.toLowerCase() : k)));
182
+ const out = {};
183
+ for (const [k, v] of Object.entries(env)) {
184
+ if (v === undefined)
185
+ continue;
186
+ const key = platform === 'win32' ? k.toLowerCase() : k;
187
+ if (wanted.has(key))
188
+ out[k] = v;
189
+ }
190
+ return out;
191
+ }
192
+ /** Canonical deny reason (golden rule) shared by preflight and spawn paths. */
193
+ export function jailDenyReason(probe, mode) {
194
+ return (`OS jail backend unavailable (${probe.backend}: ${probe.reason}) with ZELARI_OS_JAIL=${mode} — ` +
195
+ 'execution is DENIED instead of running unjailed (t28 golden rule: missing backend + required ⇒ deny, never warn/skip). ' +
196
+ 'Set ZELARI_OS_JAIL=advisory (visible fail-open) or =off to explicitly allow unjailed execution.');
197
+ }
198
+ /** Canonical advisory notice — the fail-open must be SEEN, never silent. */
199
+ export function jailAdvisoryNotice(probe) {
200
+ return (`advisory: OS jail backend unavailable (${probe.backend}: ${probe.reason}) — ` +
201
+ 'this process will run UNJAILED (visible fail-open). Set ZELARI_OS_JAIL=required to deny instead.');
202
+ }
203
+ /**
204
+ * Pure decision of WHAT a spawn may do under the current jail mode:
205
+ * required + backend missing ⇒ deny (typed `[jail]`, no spawn at all);
206
+ * advisory + backend missing ⇒ unjailed spawn + notice (visible fail-open);
207
+ * backend available ⇒ wrapped argv + sanitized env;
208
+ * off ⇒ today's plain behavior, untouched.
209
+ * When the jail is active (mode != off) the env is sanitized EVEN on the
210
+ * fail-open path — env allowlisting is ours, not the kernel's.
211
+ */
212
+ export function decideJailSpawn(spec, input) {
213
+ const mode = input.mode ?? activeJailMode();
214
+ const merged = { ...(input.env ?? process.env), ...(input.envExtras ?? {}) };
215
+ if (mode === 'off')
216
+ return { action: 'spawn-plain', env: merged };
217
+ const probe = probeJailBackend();
218
+ if (!probe.available) {
219
+ if (mode === 'required')
220
+ return { action: 'deny', reason: jailDenyReason(probe, mode) };
221
+ return { action: 'spawn-plain', env: sanitizeEnv(merged, spec.envAllowlist), notice: jailAdvisoryNotice(probe) };
222
+ }
223
+ const wrapped = currentBackend().wrap(spec, input.program, input.argv);
224
+ return {
225
+ action: 'spawn-jailed',
226
+ probe,
227
+ program: wrapped.program,
228
+ argv: wrapped.argv,
229
+ env: sanitizeEnv(merged, spec.envAllowlist),
230
+ };
231
+ }
232
+ /**
233
+ * THE spawn choke-point for the CLI exec surface (exec_process + CLI bash
234
+ * via the core seam). The only place in those paths that touches
235
+ * child_process.spawn. Always `shell:false`, stdin closed; deny reasons are
236
+ * prefixed `[jail]` so callers surface a typed tool error.
237
+ */
238
+ export function spawnJailed(spec, req) {
239
+ const decision = decideJailSpawn(spec, {
240
+ program: req.program,
241
+ argv: req.argv,
242
+ env: req.env,
243
+ envExtras: req.envExtras,
244
+ });
245
+ if (decision.action === 'deny') {
246
+ return { outcome: 'denied', reason: `[jail] ${decision.reason}` };
247
+ }
248
+ const notice = decision.action === 'spawn-plain' ? decision.notice : undefined;
249
+ if (notice) {
250
+ // P3: fail-open is visible. Console first (chip-style line), then the sink.
251
+ console.error(`[os-jail] ${notice}`);
252
+ req.onNotice?.(notice);
253
+ }
254
+ const jailed = decision.action === 'spawn-jailed';
255
+ const program = jailed ? decision.program : req.program;
256
+ const argv = jailed ? decision.argv : [...req.argv];
257
+ try {
258
+ const child = spawn(program, argv, {
259
+ cwd: req.cwd,
260
+ signal: req.signal,
261
+ shell: false,
262
+ env: decision.env,
263
+ stdio: ['ignore', 'pipe', 'pipe'], // non-interactive by construction
264
+ });
265
+ return {
266
+ outcome: 'spawned',
267
+ child,
268
+ backend: jailed ? decision.probe.backend : 'none',
269
+ jailed,
270
+ ...(notice ? { notice } : {}),
271
+ };
272
+ }
273
+ catch (err) {
274
+ return { outcome: 'failed', reason: err instanceof Error ? err.message : String(err) };
275
+ }
276
+ }
277
+ /**
278
+ * Availability snapshot for preflight call sites (the bash wrapper): what
279
+ * mode is active and whether a backend exists. `off` short-circuits to a
280
+ * neutral probe without touching the backend.
281
+ */
282
+ export function jailAvailability(env = process.env) {
283
+ const mode = activeJailMode(env);
284
+ const probe = mode === 'off'
285
+ ? { backend: 'none', available: false, reason: 'jail disabled (ZELARI_OS_JAIL=off)' }
286
+ : probeJailBackend();
287
+ return { mode, probe };
288
+ }
289
+ //# sourceMappingURL=osJail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"osJail.js","sourceRoot":"","sources":["../../../src/cli/safety/osJail.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"policyLoadMode.js","sourceRoot":"","sources":["../../../src/cli/safety/policyLoadMode.ts"],"names":[],"mappings":"AAqBA,sDAAsD;AACtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,yBAAyB,CAAC;AAE9D,oFAAoF;AACpF,MAAM,CAAC,MAAM,wBAAwB,GAAG,oBAAoB,CAAC;AAE7D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAWvC,SAAS,YAAY,CAAC,CAAqB;IACzC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAiC;IACrE,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/C,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACpC,IAAI,CAAC,KAAK,YAAY;QAAE,OAAO,YAAY,CAAC;IAC5C,yEAAyE;IACzE,sEAAsE;IACtE,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACjF,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC5C,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,4EAA4E;AAC5E,wEAAwE;AACxE,wEAAwE;AAExE,IAAI,aAAa,GAAsB,KAAK,CAAC;AAE7C,6EAA6E;AAC7E,MAAM,UAAU,0BAA0B,CAAC,OAA0B;IACnE,aAAa,GAAG,OAAO,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,uBAAuB;IACrC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACvE,OAAO,qBAAqB,CAAC;QAC3B,OAAO,EAAE,aAAa;QACtB,QAAQ,EAAE,GAAG,CAAC,oBAAoB,CAAC;QACnC,EAAE,EAAE,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;KACpD,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"policyLoadMode.js","sourceRoot":"","sources":["../../../src/cli/safety/policyLoadMode.ts"],"names":[],"mappings":"AA4BA,sDAAsD;AACtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,yBAAyB,CAAC;AAE9D,oFAAoF;AACpF,MAAM,CAAC,MAAM,wBAAwB,GAAG,oBAAoB,CAAC;AAE7D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAWvC,SAAS,YAAY,CAAC,CAAqB;IACzC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAiC;IACrE,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/C,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACpC,IAAI,CAAC,KAAK,YAAY;QAAE,OAAO,YAAY,CAAC;IAC5C,yEAAyE;IACzE,sEAAsE;IACtE,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACjF,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC5C,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,4EAA4E;AAC5E,wEAAwE;AACxE,wEAAwE;AAExE,IAAI,aAAa,GAAsB,KAAK,CAAC;AAE7C,6EAA6E;AAC7E,MAAM,UAAU,0BAA0B,CAAC,OAA0B;IACnE,aAAa,GAAG,OAAO,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,uBAAuB;IACrC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACvE,OAAO,qBAAqB,CAAC;QAC3B,OAAO,EAAE,aAAa;QACtB,QAAQ,EAAE,GAAG,CAAC,oBAAoB,CAAC;QACnC,EAAE,EAAE,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;KACpD,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * harnessClient — minimal NDJSON client for the harness App Server wire
3
+ * protocol (t32, Pilastro B residuo; see harnessServer.ts for the server
4
+ * contract). Shared seam for Node hosts: the companion RunManager client
5
+ * mode (ZELARI_HARNESS_SERVER=1) drives it today.
6
+ *
7
+ * Wire rules (protocol v2, unchanged):
8
+ * requests carry `id`; responses answer with the same `id` + ok/result |
9
+ * error; unsolicited server lines carry `type` (protocol_info handshake,
10
+ * BrainEvents, §24 control acks) and are demultiplexed to `onEvent`.
11
+ *
12
+ * Transports are pluggable:
13
+ * - createInProcessHarnessTransport(): boots a real startHarnessServer
14
+ * over a PassThrough pair — same NDJSON bytes, ZERO child processes
15
+ * (tests and embedders);
16
+ * - a stdio transport to `--serve-harness` (RunManager builds one) keeps
17
+ * full BrainEvent fidelity for long-lived deployments.
18
+ */
19
+ import { createInterface } from 'node:readline';
20
+ import { PassThrough } from 'node:stream';
21
+ import { startHarnessServer } from './harnessServer.js';
22
+ /** Typed protocol error — `code` mirrors the server error codes. */
23
+ export class HarnessClientError extends Error {
24
+ code;
25
+ constructor(code, message) {
26
+ super(message);
27
+ this.code = code;
28
+ this.name = 'HarnessClientError';
29
+ }
30
+ }
31
+ export class HarnessClient {
32
+ transport;
33
+ onEvent;
34
+ nextId = 1;
35
+ pending = new Map();
36
+ closed = false;
37
+ constructor(transport,
38
+ /** Unsolicited server events (protocol_info, BrainEvents, control acks). */
39
+ onEvent) {
40
+ this.transport = transport;
41
+ this.onEvent = onEvent;
42
+ transport.onLine((line) => this.handleLine(line));
43
+ }
44
+ handleLine(line) {
45
+ const trimmed = line.trim();
46
+ if (trimmed.length === 0)
47
+ return;
48
+ let envelope;
49
+ try {
50
+ envelope = JSON.parse(trimmed);
51
+ }
52
+ catch {
53
+ return; // a malformed server line is never a client crash
54
+ }
55
+ const id = envelope['id'];
56
+ if (id !== undefined && id !== null && this.pending.has(id)) {
57
+ const pendingRequest = this.pending.get(id);
58
+ this.pending.delete(id);
59
+ if (envelope['ok'] === true) {
60
+ pendingRequest.resolve(envelope['result']);
61
+ }
62
+ else {
63
+ const error = envelope['error'];
64
+ pendingRequest.reject(new HarnessClientError(error?.code ?? 'method_failed', error?.message ?? 'harness request failed'));
65
+ }
66
+ return;
67
+ }
68
+ this.onEvent?.(envelope);
69
+ }
70
+ /** One request/response roundtrip; rejects with HarnessClientError on !ok. */
71
+ request(method, params = {}) {
72
+ if (this.closed) {
73
+ return Promise.reject(new HarnessClientError('transport_closed', 'harness client is closed'));
74
+ }
75
+ const id = this.nextId++;
76
+ return new Promise((resolve, reject) => {
77
+ this.pending.set(id, { resolve, reject });
78
+ this.transport.write(JSON.stringify({ id, method, params }));
79
+ });
80
+ }
81
+ async createSession(workspaceRoot) {
82
+ const result = (await this.request('session.create', { workspaceRoot }));
83
+ return result.sessionId;
84
+ }
85
+ /** `run.turn` — resolves with the final turn result ({exitCode, …}). */
86
+ async runTurn(sessionId, input) {
87
+ return (await this.request('run.turn', {
88
+ sessionId,
89
+ ...input,
90
+ }));
91
+ }
92
+ /** Session-scoped steer (§24: resolves on ACCEPTANCE, not application). */
93
+ async steer(sessionId, text, controlId) {
94
+ const params = { sessionId, text };
95
+ if (controlId !== undefined)
96
+ params['controlId'] = controlId;
97
+ return (await this.request('session.steer', params));
98
+ }
99
+ async cancel(sessionId, reason) {
100
+ const params = { sessionId };
101
+ if (reason !== undefined)
102
+ params['reason'] = reason;
103
+ return (await this.request('session.cancel', params));
104
+ }
105
+ async disposeSession(sessionId) {
106
+ await this.request('session.dispose', { sessionId });
107
+ }
108
+ /** Rejects every pending request, then tears the transport down. */
109
+ async close() {
110
+ if (this.closed)
111
+ return;
112
+ this.closed = true;
113
+ for (const pendingRequest of this.pending.values()) {
114
+ pendingRequest.reject(new HarnessClientError('transport_closed', 'harness client closed'));
115
+ }
116
+ this.pending.clear();
117
+ await this.transport.close();
118
+ }
119
+ }
120
+ /**
121
+ * In-process transport: a real startHarnessServer over a PassThrough pair.
122
+ * Zero child processes — same wire bytes as the stdio deployment, and the
123
+ * kernel guarantees still hold (close() awaits server.dispose(), which
124
+ * drains pending completion-proof writes before services die).
125
+ */
126
+ export function createInProcessHarnessTransport(options = {}) {
127
+ const clientToServer = new PassThrough();
128
+ const serverToClient = new PassThrough();
129
+ const started = startHarnessServer({
130
+ io: { input: clientToServer, output: serverToClient },
131
+ ...options,
132
+ });
133
+ const transport = {
134
+ write(line) {
135
+ try {
136
+ clientToServer.write(line + '\n');
137
+ }
138
+ catch {
139
+ /* server side gone — in-flight requests surface as transport_closed */
140
+ }
141
+ },
142
+ onLine(listener) {
143
+ const rl = createInterface({ input: serverToClient });
144
+ rl.on('line', listener);
145
+ },
146
+ close: () => started.close(),
147
+ };
148
+ return { transport, server: started.server, close: () => started.close() };
149
+ }
150
+ //# sourceMappingURL=harnessClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harnessClient.js","sourceRoot":"","sources":["../../../src/cli/serve/harnessClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAkC,MAAM,oBAAoB,CAAC;AAYxF,oEAAoE;AACpE,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEhC;IADX,YACW,IAAY,EACrB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,SAAI,GAAJ,IAAI,CAAQ;QAIrB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAOD,MAAM,OAAO,aAAa;IAML;IAEA;IAPX,MAAM,GAAG,CAAC,CAAC;IACF,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IACrD,MAAM,GAAG,KAAK,CAAC;IAEvB,YACmB,SAA2B;IAC5C,4EAA4E;IAC3D,OAAkD;QAFlD,cAAS,GAAT,SAAS,CAAkB;QAE3B,YAAO,GAAP,OAAO,CAA2C;QAEnE,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACpD,CAAC;IAEO,UAAU,CAAC,IAAY;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACjC,IAAI,QAAiC,CAAC;QACtC,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,kDAAkD;QAC5D,CAAC;QACD,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAY,CAAC,EAAE,CAAC;YACtE,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAY,CAAE,CAAC;YACvD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAY,CAAC,CAAC;YAClC,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC5B,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAoD,CAAC;gBACnF,cAAc,CAAC,MAAM,CACnB,IAAI,kBAAkB,CACpB,KAAK,EAAE,IAAI,IAAI,eAAe,EAC9B,KAAK,EAAE,OAAO,IAAI,wBAAwB,CAC3C,CACF,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAED,8EAA8E;IAC9E,OAAO,CAAC,MAAc,EAAE,SAAkC,EAAE;QAC1D,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,kBAAkB,CAAC,kBAAkB,EAAE,0BAA0B,CAAC,CACvE,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,aAAqB;QACvC,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,aAAa,EAAE,CAAC,CAEtE,CAAC;QACF,OAAO,MAAM,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,wEAAwE;IACxE,KAAK,CAAC,OAAO,CACX,SAAiB,EACjB,KAA8B;QAE9B,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;YACrC,SAAS;YACT,GAAG,KAAK;SACT,CAAC,CAAmD,CAAC;IACxD,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,KAAK,CACT,SAAiB,EACjB,IAAY,EACZ,SAAkB;QAElB,MAAM,MAAM,GAA4B,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC5D,IAAI,SAAS,KAAK,SAAS;YAAE,MAAM,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC;QAC7D,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAA4B,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,MAAe;QAC7C,MAAM,MAAM,GAA4B,EAAE,SAAS,EAAE,CAAC;QACtD,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;QACpD,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAA4B,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,SAAiB;QACpC,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,KAAK,MAAM,cAAc,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACnD,cAAc,CAAC,MAAM,CACnB,IAAI,kBAAkB,CAAC,kBAAkB,EAAE,uBAAuB,CAAC,CACpE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,+BAA+B,CAC7C,UAAqC,EAAE;IAEvC,MAAM,cAAc,GAAG,IAAI,WAAW,EAAE,CAAC;IACzC,MAAM,cAAc,GAAG,IAAI,WAAW,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,kBAAkB,CAAC;QACjC,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE;QACrD,GAAG,OAAO;KACX,CAAC,CAAC;IACH,MAAM,SAAS,GAAqB;QAClC,KAAK,CAAC,IAAY;YAChB,IAAI,CAAC;gBACH,cAAc,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC;gBACP,uEAAuE;YACzE,CAAC;QACH,CAAC;QACD,MAAM,CAAC,QAAgC;YACrC,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;YACtD,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC1B,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE;KAC7B,CAAC;IACF,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AAC7E,CAAC"}