zcode-acp-server 0.14.2 → 0.17.1

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 (96) hide show
  1. package/README.md +109 -9
  2. package/README.zh-CN.md +91 -9
  3. package/dist/backend/index.d.ts +1 -0
  4. package/dist/backend/index.d.ts.map +1 -1
  5. package/dist/backend/index.js +1 -0
  6. package/dist/backend/index.js.map +1 -1
  7. package/dist/backend/sandbox.d.ts +160 -0
  8. package/dist/backend/sandbox.d.ts.map +1 -0
  9. package/dist/backend/sandbox.js +425 -0
  10. package/dist/backend/sandbox.js.map +1 -0
  11. package/dist/backend/types.d.ts +4 -0
  12. package/dist/backend/types.d.ts.map +1 -1
  13. package/dist/cli.d.ts +2 -0
  14. package/dist/cli.d.ts.map +1 -1
  15. package/dist/cli.js +10 -1
  16. package/dist/cli.js.map +1 -1
  17. package/dist/config/auto-compact.d.ts.map +1 -1
  18. package/dist/config/auto-compact.js +6 -4
  19. package/dist/config/auto-compact.js.map +1 -1
  20. package/dist/config/mcp-discovery.d.ts.map +1 -1
  21. package/dist/config/mcp-discovery.js +7 -5
  22. package/dist/config/mcp-discovery.js.map +1 -1
  23. package/dist/handlers/background-tasks.d.ts.map +1 -1
  24. package/dist/handlers/background-tasks.js +2 -2
  25. package/dist/handlers/background-tasks.js.map +1 -1
  26. package/dist/handlers/dispatch.d.ts.map +1 -1
  27. package/dist/handlers/dispatch.js +4 -4
  28. package/dist/handlers/dispatch.js.map +1 -1
  29. package/dist/handlers/replay.d.ts.map +1 -1
  30. package/dist/handlers/replay.js +11 -5
  31. package/dist/handlers/replay.js.map +1 -1
  32. package/dist/handlers/sandbox-allow.d.ts +71 -0
  33. package/dist/handlers/sandbox-allow.d.ts.map +1 -0
  34. package/dist/handlers/sandbox-allow.js +299 -0
  35. package/dist/handlers/sandbox-allow.js.map +1 -0
  36. package/dist/handlers/server-requests.d.ts.map +1 -1
  37. package/dist/handlers/server-requests.js +7 -5
  38. package/dist/handlers/server-requests.js.map +1 -1
  39. package/dist/handlers/session.d.ts +14 -1
  40. package/dist/handlers/session.d.ts.map +1 -1
  41. package/dist/handlers/session.js +245 -60
  42. package/dist/handlers/session.js.map +1 -1
  43. package/dist/handlers/slash.d.ts.map +1 -1
  44. package/dist/handlers/slash.js +15 -13
  45. package/dist/handlers/slash.js.map +1 -1
  46. package/dist/i18n.d.ts +111 -0
  47. package/dist/i18n.d.ts.map +1 -0
  48. package/dist/i18n.js +222 -0
  49. package/dist/i18n.js.map +1 -0
  50. package/dist/index.d.ts +18 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +114 -15
  53. package/dist/index.js.map +1 -1
  54. package/dist/interaction/adapter.d.ts.map +1 -1
  55. package/dist/interaction/adapter.js +10 -7
  56. package/dist/interaction/adapter.js.map +1 -1
  57. package/dist/remote/config.d.ts +7 -0
  58. package/dist/remote/config.d.ts.map +1 -1
  59. package/dist/remote/config.js +2 -0
  60. package/dist/remote/config.js.map +1 -1
  61. package/dist/remote/endpoint.d.ts.map +1 -1
  62. package/dist/remote/endpoint.js +66 -11
  63. package/dist/remote/endpoint.js.map +1 -1
  64. package/dist/remote/hub-server.d.ts +15 -0
  65. package/dist/remote/hub-server.d.ts.map +1 -1
  66. package/dist/remote/hub-server.js +205 -1
  67. package/dist/remote/hub-server.js.map +1 -1
  68. package/dist/repl/App.d.ts.map +1 -1
  69. package/dist/repl/App.js +3 -2
  70. package/dist/repl/App.js.map +1 -1
  71. package/dist/repl/model.d.ts +2 -0
  72. package/dist/repl/model.d.ts.map +1 -1
  73. package/dist/repl/model.js.map +1 -1
  74. package/dist/repl/run.d.ts.map +1 -1
  75. package/dist/repl/run.js +5 -0
  76. package/dist/repl/run.js.map +1 -1
  77. package/dist/server.d.ts +78 -1
  78. package/dist/server.d.ts.map +1 -1
  79. package/dist/server.js +114 -3
  80. package/dist/server.js.map +1 -1
  81. package/dist/tasks-index.d.ts +27 -0
  82. package/dist/tasks-index.d.ts.map +1 -1
  83. package/dist/tasks-index.js +72 -3
  84. package/dist/tasks-index.js.map +1 -1
  85. package/docs/ARCHITECTURE.md +19 -10
  86. package/docs/REMOTE-CLIENTS.md +43 -0
  87. package/docs/TROUBLESHOOTING.md +9 -3
  88. package/package.json +13 -12
  89. package/dist/remote/session-liveness.d.ts +0 -19
  90. package/dist/remote/session-liveness.d.ts.map +0 -1
  91. package/dist/remote/session-liveness.js +0 -70
  92. package/dist/remote/session-liveness.js.map +0 -1
  93. package/dist/repl/mouse.d.ts +0 -49
  94. package/dist/repl/mouse.d.ts.map +0 -1
  95. package/dist/repl/mouse.js +0 -165
  96. package/dist/repl/mouse.js.map +0 -1
@@ -0,0 +1,425 @@
1
+ /**
2
+ * Seatbelt sandbox for the zcode backend subprocess (ADR-0011).
3
+ *
4
+ * The backend runs every Bash/Edit/Write tool with the user's full
5
+ * privileges; one careless command destroys real data. The bridge wraps the
6
+ * single backend spawn point with a generated `sandbox-exec` profile using a
7
+ * writes-only restriction model: reads and process execution stay open, file
8
+ * writes are denied everywhere except an explicit whitelist. Children inherit
9
+ * the sandbox, so one wrap covers the backend, its tool subprocesses, and
10
+ * model workers — deletion (rm/mv/truncate) is a write-class syscall, so it
11
+ * is stopped by the write denial regardless of which binary performs it
12
+ * (name-banning executables would be trivially bypassed and is deliberately
13
+ * not done).
14
+ *
15
+ * Arming is dual-switch (see sandboxActive): ZCODE_ACP_SANDBOX=1 forces it
16
+ * globally, or a workspace opts in via `enabled: true` in its own
17
+ * .zcode/acp/sandbox.json — the template is auto-created with enabled:false,
18
+ * so opting in is always an explicit user edit.
19
+ *
20
+ * Whitelist (frozen at spawn, rebuilt on backend restart):
21
+ * - workspace roots of all live sessions (union of server.sessionCwds)
22
+ * - `~/.zcode*` (the backend's own sessions/db/logs — not agent privilege;
23
+ * denying it breaks session/create itself)
24
+ * - system temp + regenerable cache dirs (zero-value targets, constant
25
+ * toolchain traffic)
26
+ * - each project's `.zcode/acp/sandbox.json` `allow` list
27
+ * - bridge-lifetime once-allows granted via the dynamic allow flow
28
+ *
29
+ * `<workspace>/.zcode/acp/` is a DENY island inside every allowed workspace:
30
+ * the sandbox forbids writes there while the bridge — outside the sandbox —
31
+ * persists "always allow" entries on the user's behalf. The agent cannot
32
+ * edit its own allowlist.
33
+ *
34
+ * macOS-only: Seatbelt is a macOS facility. Setting the env elsewhere warns
35
+ * once and runs unsandboxed (see sandboxActive()).
36
+ */
37
+ import { lstatSync, mkdirSync, mkdtempSync, readFileSync, realpathSync, rmSync, writeFileSync, } from "node:fs";
38
+ import os from "node:os";
39
+ import path from "node:path";
40
+ import process from "node:process";
41
+ import { log, warn } from "../utils.js";
42
+ /** The one and only env switch. Every other knob is project config. */
43
+ export const SANDBOX_ENV = "ZCODE_ACP_SANDBOX";
44
+ /** Regenerable cache dirs trusted as default-writable (ADR-0011). */
45
+ const DEFAULT_CACHE_DIRS = [
46
+ "~/Library/Caches",
47
+ "~/.cache",
48
+ "~/.npm",
49
+ "~/Library/pnpm",
50
+ "~/.node-gyp",
51
+ ];
52
+ /** Backend state roots that must stay writable for the bridge to function. */
53
+ const ZCODE_STATE_DIRS = ["~/.zcode", "~/.zcode-beta", "~/.zcode-plugin"];
54
+ /** Path of the per-project sandbox config inside a workspace root. */
55
+ export function sandboxConfigPath(workspaceRoot) {
56
+ return path.join(workspaceRoot, ".zcode", "acp", "sandbox.json");
57
+ }
58
+ /** Roots whose template auto-creation already failed — warn once, not per call. */
59
+ const templateFailedRoots = new Set();
60
+ /** Config issues already warned — once per root(+issue), not per read. */
61
+ const warnedConfigIssues = new Set();
62
+ /**
63
+ * Last enabled value successfully parsed per config file. A config that
64
+ * becomes unreadable (EACCES/ENOTDIR) or VANISHES after parsing enabled:true
65
+ * must fail closed: the sandboxed agent can produce all of those from inside
66
+ * the sandbox (chmod 0000 `.zcode`, replace `.zcode` with a file, rename it
67
+ * away) — falling back to the disabled template would silently disarm.
68
+ */
69
+ const lastEnabledSeen = new Map();
70
+ function defaultConfig(enabled) {
71
+ return { enabled, allow: [], deny: [], strictGit: false };
72
+ }
73
+ /**
74
+ * The config file must be a REGULAR file whose real location is exactly
75
+ * <root>/.zcode/acp/sandbox.json. A symlinked or hardlinked-away config
76
+ * pierces the deny island: the agent writes the link target inside the
77
+ * allowed workspace and thereby edits its own allowlist. Missing files are
78
+ * fine — that is the auto-create path.
79
+ */
80
+ function configIntegrityOk(workspaceRoot, file) {
81
+ try {
82
+ const st = lstatSync(file);
83
+ if (!st.isFile() || st.nlink > 1)
84
+ return false;
85
+ return realpathSync(file) === sandboxConfigPath(resolveReal(workspaceRoot));
86
+ }
87
+ catch {
88
+ return true; // missing (or unreadable parents) → template path
89
+ }
90
+ }
91
+ /**
92
+ * Read the project sandbox config, auto-creating the template (enabled:
93
+ * false) on first touch so the user finds the file and can flip the switch —
94
+ * the PRESENCE of the file is never the switch, only `enabled` is, so the
95
+ * auto-create cannot arm anything by itself. A malformed or non-object file
96
+ * falls back to enabled:true WITHOUT rewriting it: corruption must fail
97
+ * CLOSED (the user opted in; losing that to a half-saved file would silently
98
+ * disarm), and clobbering the user's mid-edit bytes with a template would be
99
+ * worse than the transient read. A symlinked/hardlinked config is treated
100
+ * the same way (armed, persistence disabled) — see configIntegrityOk. So is
101
+ * a config that was armed and then became unreadable or disappeared — only
102
+ * the agent could do that from inside the sandbox.
103
+ */
104
+ export function readSandboxConfig(workspaceRoot) {
105
+ const file = sandboxConfigPath(workspaceRoot);
106
+ if (!configIntegrityOk(workspaceRoot, file)) {
107
+ if (!warnedConfigIssues.has(file)) {
108
+ warnedConfigIssues.add(file);
109
+ warn(`sandbox: ${file} is symlinked/hardlinked outside the deny island — reading as armed; fix the link (persistence stays disabled until then)`);
110
+ }
111
+ return defaultConfig(true);
112
+ }
113
+ let text;
114
+ try {
115
+ text = readFileSync(file, "utf8");
116
+ }
117
+ catch (e) {
118
+ const code = e.code;
119
+ // ENOENT on a never-armed project is the normal pre-template state.
120
+ // Everything else — EACCES/ENOTDIR (agent tampered with `.zcode`), or a
121
+ // miss on a config this bridge already read as armed — fails closed.
122
+ if (code === "ENOENT" && lastEnabledSeen.get(file) !== true) {
123
+ // Write the discovery template (best-effort; a read-only workspace
124
+ // just never gets one — the sandbox can still be env-armed).
125
+ if (!templateFailedRoots.has(workspaceRoot)) {
126
+ try {
127
+ mkdirSync(path.dirname(file), { recursive: true });
128
+ writeFileSync(file, JSON.stringify(defaultConfig(false), null, 2) + "\n");
129
+ }
130
+ catch (err) {
131
+ templateFailedRoots.add(workspaceRoot);
132
+ warn(`sandbox: could not create ${file}: ${err instanceof Error ? err.message : String(err)}`);
133
+ }
134
+ }
135
+ return defaultConfig(false);
136
+ }
137
+ const issue = code ?? "vanished";
138
+ if (!warnedConfigIssues.has(`${file}:${issue}`)) {
139
+ warnedConfigIssues.add(`${file}:${issue}`);
140
+ warn(`sandbox: ${file} unreadable (${issue}) — reading as armed`);
141
+ }
142
+ return defaultConfig(true);
143
+ }
144
+ let parsed;
145
+ try {
146
+ parsed = JSON.parse(text);
147
+ }
148
+ catch {
149
+ lastEnabledSeen.set(file, true);
150
+ return defaultConfig(true);
151
+ }
152
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
153
+ lastEnabledSeen.set(file, true);
154
+ return defaultConfig(true);
155
+ }
156
+ const cfg = parsed;
157
+ const allow = Array.isArray(cfg.allow) ? cfg.allow.filter((p) => typeof p === "string") : [];
158
+ const deny = Array.isArray(cfg.deny) ? cfg.deny.filter((p) => typeof p === "string") : [];
159
+ // Relative (or `~user`) entries would silently anchor to the BRIDGE's cwd —
160
+ // a committed config must speak in absolute paths or `~/` only.
161
+ const absoluteAllow = allow.filter((p) => p.startsWith("/") || p.startsWith("~/"));
162
+ const absoluteDeny = deny.filter((p) => p.startsWith("/") || p.startsWith("~/"));
163
+ if (absoluteAllow.length !== allow.length && !warnedConfigIssues.has(`${file}:relative`)) {
164
+ warnedConfigIssues.add(`${file}:relative`);
165
+ warn(`sandbox: dropped ${allow.length - absoluteAllow.length} non-absolute allow entries in ${file}`);
166
+ }
167
+ if (absoluteDeny.length !== deny.length && !warnedConfigIssues.has(`${file}:relative-deny`)) {
168
+ warnedConfigIssues.add(`${file}:relative-deny`);
169
+ warn(`sandbox: dropped ${deny.length - absoluteDeny.length} non-absolute deny entries in ${file}`);
170
+ }
171
+ lastEnabledSeen.set(file, cfg.enabled === true);
172
+ return {
173
+ enabled: cfg.enabled === true,
174
+ allow: absoluteAllow,
175
+ deny: absoluteDeny,
176
+ strictGit: cfg.strictGit === true,
177
+ };
178
+ }
179
+ /**
180
+ * Bridge-side persistence for "always allow" (the deny island keeps the
181
+ * agent from writing this file itself). Round-trips the whole config so the
182
+ * enabled flag survives the write. Dedupes by exact string. Returns false
183
+ * when persistence is impossible (symlinked config, unwritable path) — the
184
+ * caller then downgrades to a bridge-lifetime once-allow.
185
+ */
186
+ export function appendSandboxAllow(workspaceRoot, allowedPath) {
187
+ const file = sandboxConfigPath(workspaceRoot);
188
+ if (!configIntegrityOk(workspaceRoot, file)) {
189
+ warn(`sandbox: refusing to persist through a symlinked/hardlinked ${file}`);
190
+ return false;
191
+ }
192
+ const cfg = readSandboxConfig(workspaceRoot);
193
+ if (cfg.allow.includes(allowedPath))
194
+ return true;
195
+ cfg.allow.push(allowedPath);
196
+ try {
197
+ mkdirSync(path.dirname(file), { recursive: true });
198
+ writeFileSync(file, JSON.stringify({ enabled: cfg.enabled, allow: cfg.allow, deny: cfg.deny, strictGit: cfg.strictGit }, null, 2) + "\n");
199
+ log(`sandbox: allowlisted ${allowedPath} in ${file}`);
200
+ return true;
201
+ }
202
+ catch (e) {
203
+ warn(`sandbox: could not persist allowlist: ${e instanceof Error ? e.message : String(e)}`);
204
+ return false;
205
+ }
206
+ }
207
+ /**
208
+ * Bridge-side persistence for the popup's "永不放行" choice — the visible
209
+ * counterpart of appendSandboxAllow: a denied path is RECORDED in the
210
+ * config (never hidden in bridge memory), so the ask never resurfaces for
211
+ * it and the user can review or undo the decision by editing the file.
212
+ */
213
+ export function appendSandboxDeny(workspaceRoot, deniedPath) {
214
+ const file = sandboxConfigPath(workspaceRoot);
215
+ if (!configIntegrityOk(workspaceRoot, file)) {
216
+ warn(`sandbox: refusing to persist through a symlinked/hardlinked ${file}`);
217
+ return false;
218
+ }
219
+ const cfg = readSandboxConfig(workspaceRoot);
220
+ if (cfg.deny.includes(deniedPath))
221
+ return true;
222
+ cfg.deny.push(deniedPath);
223
+ try {
224
+ mkdirSync(path.dirname(file), { recursive: true });
225
+ writeFileSync(file, JSON.stringify({ enabled: cfg.enabled, allow: cfg.allow, deny: cfg.deny, strictGit: cfg.strictGit }, null, 2) + "\n");
226
+ log(`sandbox: denylisted ${deniedPath} in ${file}`);
227
+ return true;
228
+ }
229
+ catch (e) {
230
+ warn(`sandbox: could not persist denylist: ${e instanceof Error ? e.message : String(e)}`);
231
+ return false;
232
+ }
233
+ }
234
+ /** Expand a leading `~` to the real home dir. */
235
+ function expandHome(p) {
236
+ return p.startsWith("~/") ? path.join(os.homedir(), p.slice(2)) : p;
237
+ }
238
+ /**
239
+ * Resolve a path to its filesystem truth. Seatbelt matches real paths, so a
240
+ * symlinked prefix (/tmp → /private/tmp) would silently fail to match —
241
+ * resolve what exists and append the (possibly not-yet-created) remainder.
242
+ */
243
+ export function resolveReal(p) {
244
+ const expanded = expandHome(p);
245
+ try {
246
+ return realpathSync(expanded);
247
+ }
248
+ catch {
249
+ // Deepest existing ancestor + remainder, so not-yet-created cache dirs
250
+ // still land on their real location once created under a real parent.
251
+ let dir = expanded;
252
+ const tail = [];
253
+ for (;;) {
254
+ const parent = path.dirname(dir);
255
+ if (parent === dir)
256
+ return expanded;
257
+ tail.unshift(path.basename(dir));
258
+ dir = parent;
259
+ try {
260
+ const real = realpathSync(dir);
261
+ return path.join(real, ...tail);
262
+ }
263
+ catch {
264
+ // keep walking up
265
+ }
266
+ }
267
+ }
268
+ }
269
+ /** Escape a path into an SBPL string literal. */
270
+ function sb(p) {
271
+ return `"${p.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
272
+ }
273
+ /**
274
+ * Build the SBPL profile text. SBPL resolves overlapping rules by LAST
275
+ * match (verified empirically: an allow emitted after a deny re-permits the
276
+ * write), so the layout is: base deny-all, then every allow, then the deny
277
+ * carve-outs (island, strictGit) LAST so nothing can override them.
278
+ */
279
+ export function buildSandboxProfile(input) {
280
+ const allows = [];
281
+ const denies = [];
282
+ for (const ws of input.workspaces) {
283
+ // Resolve here too (idempotent): direct callers may pass symlinked
284
+ // roots (/tmp → /private/tmp) that would silently fail subpath match.
285
+ const root = resolveReal(ws.root);
286
+ allows.push(`(allow file-write* (subpath ${sb(root)}))`);
287
+ // Deny island: the sandbox config lives INSIDE the writable workspace —
288
+ // without this carve-out the agent could grant itself permissions.
289
+ denies.push(`(deny file-write* (subpath ${sb(path.join(root, ".zcode", "acp"))}))`);
290
+ if (ws.config.strictGit) {
291
+ denies.push(`(deny file-write* (subpath ${sb(path.join(root, ".git"))}))`);
292
+ }
293
+ for (const allowed of ws.config.allow) {
294
+ allows.push(`(allow file-write* (subpath ${sb(resolveReal(allowed))}))`);
295
+ }
296
+ }
297
+ for (const p of [...ZCODE_STATE_DIRS, ...DEFAULT_CACHE_DIRS]) {
298
+ allows.push(`(allow file-write* (subpath ${sb(resolveReal(p))}))`);
299
+ }
300
+ for (const allowed of input.extraAllow) {
301
+ allows.push(`(allow file-write* (subpath ${sb(resolveReal(allowed))}))`);
302
+ }
303
+ allows.push(`(allow file-write* (subpath ${sb(resolveReal(process.env.TMPDIR ?? os.tmpdir()))}))`);
304
+ // /dev/null: git and idiom-level shell redirects write here constantly —
305
+ // without this allow, `git commit` and every `2>/dev/null` fail with
306
+ // "could not open '/dev/null'" (observed in review probes).
307
+ allows.push(`(allow file-write-data (literal "/dev/null"))`);
308
+ if (input.profileDir) {
309
+ denies.push(`(deny file-write* (subpath ${sb(input.profileDir)}))`);
310
+ }
311
+ return (["(version 1)", "(allow default)", "(deny file-write*)", ...allows, ...denies].join("\n") + "\n");
312
+ }
313
+ /** Resolved arm input for the CURRENT spawn: union of all live workspaces. */
314
+ export function collectSandboxWorkspaces(cwdRoots) {
315
+ const seen = new Set();
316
+ const workspaces = [];
317
+ const extraAllow = [];
318
+ for (const root of cwdRoots) {
319
+ const real = resolveReal(root);
320
+ if (seen.has(real))
321
+ continue;
322
+ seen.add(real);
323
+ const config = readSandboxConfig(real);
324
+ workspaces.push({ root: real, config });
325
+ // Allowlists from OTHER workspaces still apply when they share this
326
+ // backend: the agent may hop projects in one bridge lifetime.
327
+ for (const allowed of config.allow)
328
+ extraAllow.push(allowed);
329
+ }
330
+ // A workspace's own allow entries are emitted with its block above; drop
331
+ // them from extraAllow so they don't appear twice (harmless, but noisy).
332
+ const own = new Set(workspaces.flatMap((ws) => ws.config.allow.map(resolveReal)));
333
+ return {
334
+ workspaces,
335
+ extraAllow: [...new Set(extraAllow.map(resolveReal))].filter((p) => !own.has(p)),
336
+ };
337
+ }
338
+ let envDecision = null;
339
+ let platformWarned = false;
340
+ /** Raw env request, uncached — the non-macOS warn must fire even when the cached darwin decision is false. */
341
+ function envWanted() {
342
+ const raw = process.env[SANDBOX_ENV];
343
+ return raw === "1" || raw === "true";
344
+ }
345
+ /** Env arm decision (env wanted AND darwin), cached — env can't change mid-run. */
346
+ function sandboxEnvOn() {
347
+ if (envDecision === null)
348
+ envDecision = envWanted() && process.platform === "darwin";
349
+ return envDecision;
350
+ }
351
+ /**
352
+ * The project-level switch: `enabled: true` inside the workspace's sandbox
353
+ * config (auto-created on first touch, template ships false). Reading also
354
+ * materializes the template for discovery. Once the sandbox is armed the
355
+ * deny island keeps the agent from flipping the switch back off.
356
+ */
357
+ export function projectSandboxEnabled(workspaceRoot) {
358
+ return readSandboxConfig(workspaceRoot).enabled;
359
+ }
360
+ /**
361
+ * Whether the sandbox should arm for this bridge: ZCODE_ACP_SANDBOX=1
362
+ * (global, cached) OR any given workspace root opted in via
363
+ * sandbox.json `enabled` (project switch, re-checked per call so a flip
364
+ * mid-run is seen). macOS-only: elsewhere a requested sandbox warns once and
365
+ * runs unsandboxed.
366
+ */
367
+ export function sandboxActive(roots = [process.cwd()]) {
368
+ if (sandboxEnvOn())
369
+ return true;
370
+ const wanted = envWanted() || [...roots].some(projectSandboxEnabled);
371
+ if (!wanted)
372
+ return false;
373
+ if (process.platform !== "darwin") {
374
+ if (!platformWarned) {
375
+ platformWarned = true;
376
+ warn(`sandbox: requested (${SANDBOX_ENV}=1 or project config) but Seatbelt is macOS-only — running WITHOUT sandbox`);
377
+ }
378
+ return false;
379
+ }
380
+ return true;
381
+ }
382
+ /** Test hook: reset cached decisions and warn-once sets. */
383
+ export function resetSandboxDecisionForTest() {
384
+ envDecision = null;
385
+ platformWarned = false;
386
+ templateFailedRoots.clear();
387
+ warnedConfigIssues.clear();
388
+ lastEnabledSeen.clear();
389
+ }
390
+ /** Previous respawn's profile dir — removed once superseded (its backend is dead). */
391
+ let lastProfileDir = null;
392
+ /**
393
+ * Arm a backend argv: build the profile into a FRESH unpredictable dir and
394
+ * wrap with sandbox-exec. The dir sits DIRECTLY under $HOME with a
395
+ * `.zcode-acp-sbx-` prefix — OUTSIDE every whitelisted path (it is a SIBLING
396
+ * of `~/.zcode`, not inside it). That location is the load-bearing defense:
397
+ * $TMPDIR and the cache dirs are agent-writable, and a PRIOR sandboxed
398
+ * generation (a setsid survivor of the old process group) keeps its own
399
+ * profile's allows — so a profile placed there could be raced, symlinked,
400
+ * FIFO'd, or occupied no matter how fresh its name (reproduced across
401
+ * generations even with mkdtemp + O_EXCL + a self-deny, which each generation
402
+ * only applies to its own dir). The agent can also kill the backend at will
403
+ * (signals are not file-writes) to control respawn timing; with the profile
404
+ * unreachable from ANY generation, that primitive buys nothing. O_EXCL ("wx")
405
+ * additionally refuses pre-placed symlinks from a pre-arming process, and
406
+ * the profile still self-denies its own dir last (defense in depth for the
407
+ * workspace-root-is-$HOME edge, where home itself is writable).
408
+ */
409
+ export function armSandboxArgv(argv, input) {
410
+ const dir = mkdtempSync(path.join(os.homedir(), ".zcode-acp-sbx-"));
411
+ const file = path.join(dir, "profile.sb");
412
+ writeFileSync(file, buildSandboxProfile({ ...input, profileDir: dir }), { flag: "wx" });
413
+ if (lastProfileDir && lastProfileDir !== dir) {
414
+ try {
415
+ rmSync(lastProfileDir, { recursive: true, force: true });
416
+ }
417
+ catch {
418
+ // best-effort cleanup of a superseded profile
419
+ }
420
+ }
421
+ lastProfileDir = dir;
422
+ log(`sandbox: backend wrapped with sandbox-exec (profile: ${file})`);
423
+ return ["sandbox-exec", "-f", file, ...argv];
424
+ }
425
+ //# sourceMappingURL=sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/backend/sandbox.ts"],"names":[],"mappings":"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"}
@@ -71,6 +71,10 @@ export interface ZcodeProjection {
71
71
  contextUsed?: number;
72
72
  contextWindow?: number;
73
73
  totalTokenCount?: number;
74
+ /** Turns completed in this session (observed in app-server projections). */
75
+ turnCount?: number;
76
+ /** Id of the turn the projection considers current, if any. */
77
+ currentTurnId?: string;
74
78
  }
75
79
  export interface ZcodeMessage {
76
80
  info: {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/backend/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/backend/types.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts CHANGED
@@ -18,6 +18,8 @@ export type Invocation = {
18
18
  explicit: boolean;
19
19
  } | {
20
20
  kind: "server";
21
+ } | {
22
+ kind: "serve";
21
23
  } | {
22
24
  kind: "hub";
23
25
  } | {
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG;AAWH,sFAAsF;AACtF,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CAkBxF"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG;AAWH,sFAAsF;AACtF,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CAoBxF"}
package/dist/cli.js CHANGED
@@ -14,7 +14,7 @@ import { basename } from "node:path";
14
14
  import process from "node:process";
15
15
  import { main as runHub } from "./bin/hub.js";
16
16
  import { main as runQuota } from "./bin/quota.js";
17
- import { main as runServer } from "./index.js";
17
+ import { main as runServer, runHeadless } from "./index.js";
18
18
  import { runRepl } from "./repl/run.js";
19
19
  import { AGENT_INFO } from "./utils.js";
20
20
  /**
@@ -38,6 +38,8 @@ export function resolveInvocation(invokedAs, argv) {
38
38
  switch (sub) {
39
39
  case "server":
40
40
  return { kind: "server" };
41
+ case "serve":
42
+ return { kind: "serve" };
41
43
  case "hub":
42
44
  return { kind: "hub" };
43
45
  case "quota":
@@ -58,6 +60,10 @@ Commands:
58
60
  -i <sec>, -d detail, -p plain, provider glm|go.
59
61
  hub Run the remote-access hub daemon (was zcode-acp-hub;
60
62
  usually auto-spawned by bridges, rarely run by hand).
63
+ serve Headless bridge for remote session-create (ADR-0014):
64
+ no stdio editor, lives for remote WS clients until idle.
65
+ Normally spawned by the hub, not run by hand (needs
66
+ ZCODE_ACP_REMOTE=1 + ZCODE_ACP_REMOTE_TOKEN).
61
67
  server The editor-facing ACP bridge over stdio (was
62
68
  zcode-acp-server; editors normally launch it via the bin
63
69
  alias without this subcommand).
@@ -96,6 +102,9 @@ async function main() {
96
102
  case "server":
97
103
  await runServer();
98
104
  return;
105
+ case "serve":
106
+ await runHeadless();
107
+ return;
99
108
  case "hub":
100
109
  await runHub();
101
110
  return;
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"auto-compact.d.ts","sourceRoot":"","sources":["../../src/config/auto-compact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,KAAK,GAAG,MAAM,0BAA0B,CAAC;AAGrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAInD,qFAAqF;AACrF,wBAAgB,oBAAoB,IAAI,MAAM,CAG7C;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,cAAc,EACtB,EAAE,EAAE,GAAG,CAAC,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CA2Df"}
1
+ {"version":3,"file":"auto-compact.d.ts","sourceRoot":"","sources":["../../src/config/auto-compact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,KAAK,GAAG,MAAM,0BAA0B,CAAC;AAIrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAInD,qFAAqF;AACrF,wBAAgB,oBAAoB,IAAI,MAAM,CAG7C;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,cAAc,EACtB,EAAE,EAAE,GAAG,CAAC,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAuDf"}
@@ -12,6 +12,7 @@
12
12
  */
13
13
  import { randomUUID } from "node:crypto";
14
14
  import { compact } from "../handlers/extensions.js";
15
+ import { messages } from "../i18n.js";
15
16
  import { log, warn } from "../utils.js";
16
17
  import { sendTextChunk } from "../handlers/io.js";
17
18
  /** ENV: `ZCODE_ACP_AUTO_COMPACT_THRESHOLD` — absolute token count (0 = disabled). */
@@ -47,20 +48,21 @@ export async function maybeAutoCompact(server, cx, acpSid, zcodeSid) {
47
48
  if (used < threshold)
48
49
  return;
49
50
  log(`auto-compact: contextUsed=${used} >= threshold=${threshold}, compacting…`);
50
- await sendTextChunk(cx, acpSid, `🔄 auto-compact: context usage ${used.toLocaleString()} ≥ threshold ${threshold.toLocaleString()}, compressing…`, msgId);
51
+ const m = messages();
52
+ await sendTextChunk(cx, acpSid, m.autoCompactStart(used.toLocaleString(), threshold.toLocaleString()), msgId);
51
53
  // compact() handles: session/compact → waitForTurnIdle → emitInitialUsage.
52
54
  const result = (await compact(server, { sessionId: acpSid }, cx));
53
55
  if (result.__lockTimeout) {
54
- await sendTextChunk(cx, acpSid, "⚠ auto-compact timed out (300s) — backend may still be processing", msgId);
56
+ await sendTextChunk(cx, acpSid, m.autoCompactTimeout, msgId);
55
57
  }
56
58
  else {
57
- await sendTextChunk(cx, acpSid, "✓ auto-compact: context compressed", msgId);
59
+ await sendTextChunk(cx, acpSid, m.autoCompactDone, msgId);
58
60
  }
59
61
  log("auto-compact: done");
60
62
  }
61
63
  catch (e) {
62
64
  warn(`auto-compact: compact failed (${e instanceof Error ? e.message : String(e)})`);
63
- await sendTextChunk(cx, acpSid, `⚠ auto-compact failed: ${e instanceof Error ? e.message : String(e)}`, msgId);
65
+ await sendTextChunk(cx, acpSid, messages().autoCompactFailed(e instanceof Error ? e.message : String(e)), msgId);
64
66
  // Best-effort: never break the prompt response.
65
67
  }
66
68
  }
@@ -1 +1 @@
1
- {"version":3,"file":"auto-compact.js","sourceRoot":"","sources":["../../src/config/auto-compact.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auto-compact.js","sourceRoot":"","sources":["../../src/config/auto-compact.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-discovery.d.ts","sourceRoot":"","sources":["../../src/config/mcp-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,iDAAiD;AACjD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAsBD;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,aAAa,EAAE,CAmFhD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CA2BjE"}
1
+ {"version":3,"file":"mcp-discovery.d.ts","sourceRoot":"","sources":["../../src/config/mcp-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,iDAAiD;AACjD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAsBD;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,aAAa,EAAE,CAmFhD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CA4BjE"}