zcode-acp-server 0.46.6 → 0.47.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 (80) hide show
  1. package/README.md +1 -1
  2. package/dist/backend/listener.d.ts.map +1 -1
  3. package/dist/backend/listener.js +5 -1
  4. package/dist/backend/listener.js.map +1 -1
  5. package/dist/code-fingerprint.json +2 -2
  6. package/dist/config/auto-compact.d.ts.map +1 -1
  7. package/dist/config/auto-compact.js +4 -2
  8. package/dist/config/auto-compact.js.map +1 -1
  9. package/dist/config/model-cache.js +4 -1
  10. package/dist/config/model-cache.js.map +1 -1
  11. package/dist/config/options.js +4 -1
  12. package/dist/config/options.js.map +1 -1
  13. package/dist/goal-loop/driver.d.ts +14 -3
  14. package/dist/goal-loop/driver.d.ts.map +1 -1
  15. package/dist/goal-loop/driver.js +39 -17
  16. package/dist/goal-loop/driver.js.map +1 -1
  17. package/dist/handlers/replay.d.ts +39 -0
  18. package/dist/handlers/replay.d.ts.map +1 -1
  19. package/dist/handlers/replay.js +37 -1
  20. package/dist/handlers/replay.js.map +1 -1
  21. package/dist/handlers/session.d.ts.map +1 -1
  22. package/dist/handlers/session.js +53 -13
  23. package/dist/handlers/session.js.map +1 -1
  24. package/dist/remote/endpoint.d.ts.map +1 -1
  25. package/dist/remote/endpoint.js +6 -0
  26. package/dist/remote/endpoint.js.map +1 -1
  27. package/dist/remote/hub-server.d.ts.map +1 -1
  28. package/dist/remote/hub-server.js +102 -0
  29. package/dist/remote/hub-server.js.map +1 -1
  30. package/dist/remote/settings-endpoint.d.ts +45 -0
  31. package/dist/remote/settings-endpoint.d.ts.map +1 -0
  32. package/dist/remote/settings-endpoint.js +920 -0
  33. package/dist/remote/settings-endpoint.js.map +1 -0
  34. package/dist/settings/agents-config.d.ts +158 -0
  35. package/dist/settings/agents-config.d.ts.map +1 -0
  36. package/dist/settings/agents-config.js +598 -0
  37. package/dist/settings/agents-config.js.map +1 -0
  38. package/dist/settings/app-update.d.ts +193 -0
  39. package/dist/settings/app-update.d.ts.map +1 -0
  40. package/dist/settings/app-update.js +659 -0
  41. package/dist/settings/app-update.js.map +1 -0
  42. package/dist/settings/atomic-write.d.ts +106 -0
  43. package/dist/settings/atomic-write.d.ts.map +1 -0
  44. package/dist/settings/atomic-write.js +228 -0
  45. package/dist/settings/atomic-write.js.map +1 -0
  46. package/dist/settings/cli-config.d.ts +145 -0
  47. package/dist/settings/cli-config.d.ts.map +1 -0
  48. package/dist/settings/cli-config.js +320 -0
  49. package/dist/settings/cli-config.js.map +1 -0
  50. package/dist/settings/coding-plan.d.ts +106 -0
  51. package/dist/settings/coding-plan.d.ts.map +1 -0
  52. package/dist/settings/coding-plan.js +299 -0
  53. package/dist/settings/coding-plan.js.map +1 -0
  54. package/dist/settings/file-lock.d.ts +39 -0
  55. package/dist/settings/file-lock.d.ts.map +1 -0
  56. package/dist/settings/file-lock.js +282 -0
  57. package/dist/settings/file-lock.js.map +1 -0
  58. package/dist/settings/provider-config.d.ts +123 -0
  59. package/dist/settings/provider-config.d.ts.map +1 -0
  60. package/dist/settings/provider-config.js +311 -0
  61. package/dist/settings/provider-config.js.map +1 -0
  62. package/dist/settings/skills.d.ts +72 -0
  63. package/dist/settings/skills.d.ts.map +1 -0
  64. package/dist/settings/skills.js +245 -0
  65. package/dist/settings/skills.js.map +1 -0
  66. package/dist/settings/usage-stats.d.ts +74 -0
  67. package/dist/settings/usage-stats.d.ts.map +1 -0
  68. package/dist/settings/usage-stats.js +235 -0
  69. package/dist/settings/usage-stats.js.map +1 -0
  70. package/dist/translators/projection-differ.d.ts +12 -0
  71. package/dist/translators/projection-differ.d.ts.map +1 -1
  72. package/dist/translators/projection-differ.js +17 -0
  73. package/dist/translators/projection-differ.js.map +1 -1
  74. package/dist/utils.d.ts +14 -0
  75. package/dist/utils.d.ts.map +1 -1
  76. package/dist/utils.js +22 -0
  77. package/dist/utils.js.map +1 -1
  78. package/docs/ARCHITECTURE.md +65 -0
  79. package/docs/REMOTE-CLIENTS.md +252 -0
  80. package/package.json +1 -1
@@ -0,0 +1,598 @@
1
+ /**
2
+ * Sub-agent configuration: the agent definitions plus the state file.
3
+ *
4
+ * Two stores, two different jobs:
5
+ *
6
+ * - `~/.zcode/agents/<name>.md` — the agent itself: YAML frontmatter plus a
7
+ * system-prompt body.
8
+ * - `~/.zcode/v2/agents-state.json` — enablement and model overrides. Built-in
9
+ * agents have no file at all, so their model override can ONLY live here.
10
+ *
11
+ * Scope of this module is deliberately narrow (ADR for the settings API):
12
+ * frontmatter fields the app's own form exposes as first-class inputs
13
+ * (`name`, `description`, `color`, `model`, `thoughtLevel`), plus create /
14
+ * delete / enable. The system-prompt body and the advanced lists (tools,
15
+ * skills, permissionMode, maxTurns, …) are NOT exposed — a body round-trip
16
+ * through JSON risks silent whitespace and escaping damage, and those fields
17
+ * are rare enough that editing the file directly is the better experience.
18
+ *
19
+ * Consequences of that split, which callers must know:
20
+ *
21
+ * - Creating an agent writes a minimal template body; a user who wants a real
22
+ * prompt edits the file (or the app opens it in an editor).
23
+ * - Editing an agent REWRITES its frontmatter from the parsed model, so any
24
+ * advanced field the user set by hand is preserved verbatim in the body of
25
+ * the file but its frontmatter keys are re-emitted in canonical order.
26
+ */
27
+ import { mkdir, readFile, readdir, rm, stat, writeFile } from "node:fs/promises";
28
+ import path from "node:path";
29
+ import { readJsonDocument, writeJsonAtomic, writeTextAtomic } from "./atomic-write.js";
30
+ import { zcodeAgentsDir, zcodeAgentsStatePath, zcodeHomeDir } from "../utils.js";
31
+ /** The eight colors the app's picker offers. */
32
+ export const AGENT_COLORS = [
33
+ "red",
34
+ "blue",
35
+ "green",
36
+ "yellow",
37
+ "purple",
38
+ "orange",
39
+ "pink",
40
+ "cyan",
41
+ ];
42
+ /** Agents the app ships and forbids editing. */
43
+ export const BUILT_IN_AGENTS = ["general-purpose", "Explore"];
44
+ /**
45
+ * A user-scope agent id is `user:<lowercased name>` — the spelling the state
46
+ * file's `disabledAgentIds` uses.
47
+ */
48
+ export function agentStateId(name) {
49
+ return `user:${name.toLowerCase()}`;
50
+ }
51
+ /** File name for an agent: lowercased name + `.md`. */
52
+ export function agentFileName(name) {
53
+ return `${name.toLowerCase()}.md`;
54
+ }
55
+ /** `^[a-zA-Z0-9-]+$`, 3–50 chars — the app's own name rule. */
56
+ const NAME_PATTERN = /^[a-zA-Z0-9-]+$/;
57
+ export function isValidAgentName(name) {
58
+ return name.length >= 3 && name.length <= 50 && NAME_PATTERN.test(name);
59
+ }
60
+ // ---------- state file ----------
61
+ /** Read the state file; absent → an empty document. */
62
+ export async function readAgentsState() {
63
+ const doc = await readJsonDocument(zcodeAgentsStatePath());
64
+ return (doc ?? {});
65
+ }
66
+ function validateAgentsState(doc) {
67
+ const disabled = doc["disabledAgentIds"];
68
+ if (disabled !== undefined && !Array.isArray(disabled)) {
69
+ return "disabledAgentIds must be an array";
70
+ }
71
+ for (const key of ["builtInModelSelectionOverrides", "pluginAgentModelSelectionOverrides"]) {
72
+ const value = doc[key];
73
+ if (value !== undefined &&
74
+ (typeof value !== "object" || value === null || Array.isArray(value))) {
75
+ return `${key} must be an object`;
76
+ }
77
+ }
78
+ return true;
79
+ }
80
+ async function saveAgentsState(mutator) {
81
+ const { doc } = await writeJsonAtomic(zcodeAgentsStatePath(), (current) => mutator(current), { validate: (d) => validateAgentsState(d) });
82
+ return doc;
83
+ }
84
+ /**
85
+ * Enable or disable a user-scope agent.
86
+ *
87
+ * Only `user:` agents can be disabled — built-ins have no disable record (the
88
+ * app's `attachEnabledState` ignores any other scope), and a plugin agent's
89
+ * enablement belongs to its plugin.
90
+ */
91
+ export async function setAgentEnabled(name, enabled) {
92
+ const key = agentStateId(name);
93
+ if (BUILT_IN_AGENTS.includes(name)) {
94
+ throw new Error(`${name} is a built-in agent and cannot be disabled`);
95
+ }
96
+ return saveAgentsState((doc) => {
97
+ const current = Array.isArray(doc.disabledAgentIds) ? [...doc.disabledAgentIds] : [];
98
+ const next = enabled ? current.filter((id) => id !== key) : [...new Set([...current, key])];
99
+ if (next.length === 0) {
100
+ const { disabledAgentIds: _dropped, ...rest } = doc;
101
+ return rest;
102
+ }
103
+ return { ...doc, disabledAgentIds: next };
104
+ });
105
+ }
106
+ /**
107
+ * Set a built-in agent's model override.
108
+ *
109
+ * This is the ONLY way a built-in agent's model can change: it has no markdown
110
+ * file, so the override lives in the state file. `undefined` clears it, which
111
+ * restores inheritance from the workspace default.
112
+ */
113
+ export async function setBuiltInAgentModel(name, selection) {
114
+ if (!BUILT_IN_AGENTS.includes(name)) {
115
+ throw new Error(`${name} is not a built-in agent`);
116
+ }
117
+ if (selection !== undefined) {
118
+ if (!selection.providerId || !selection.modelId) {
119
+ throw new Error("a model override needs both providerId and modelId");
120
+ }
121
+ }
122
+ return saveAgentsState((doc) => {
123
+ const current = { ...(doc.builtInModelSelectionOverrides ?? {}) };
124
+ if (selection === undefined)
125
+ delete current[name];
126
+ else
127
+ current[name] = selection;
128
+ const next = { ...doc };
129
+ if (Object.keys(current).length === 0)
130
+ delete next.builtInModelSelectionOverrides;
131
+ else
132
+ next.builtInModelSelectionOverrides = current;
133
+ return next;
134
+ });
135
+ }
136
+ // ---------- agent markdown ----------
137
+ /**
138
+ * Split a markdown file into its frontmatter block and body.
139
+ *
140
+ * Exported for the round-trip tests, which are the only place the parser and
141
+ * the serializer are exercised as a pair.
142
+ */
143
+ export function splitFrontmatter(content) {
144
+ const normalized = content.replace(/^\uFEFF/u, "").replace(/\r\n/g, "\n");
145
+ const lines = normalized.split("\n");
146
+ if (lines[0]?.trim() !== "---")
147
+ return null;
148
+ const end = lines.findIndex((line, i) => i > 0 && line.trim() === "---");
149
+ if (end < 0)
150
+ return null;
151
+ return { frontmatter: lines.slice(1, end).join("\n"), body: lines.slice(end + 1).join("\n") };
152
+ }
153
+ /**
154
+ * Parse frontmatter with the same loose semantics the runtime uses.
155
+ *
156
+ * YAML first, then line-level key/value with bracket-list support. The runtime * deliberately accepts non-strict frontmatter so a hand-written file still
157
+ * loads; reading with the same rules keeps a file the CLI accepted visible here
158
+ * instead of silently missing from the list.
159
+ */
160
+ export function parseFrontmatter(block) {
161
+ const values = {};
162
+ const lines = block.split(/\r?\n/u);
163
+ let pendingListKey;
164
+ for (const rawLine of lines) {
165
+ const line = rawLine.trimEnd();
166
+ if (!line.trim() || line.trimStart().startsWith("#"))
167
+ continue;
168
+ const listMatch = line.match(/^\s*-\s+(.*)$/u);
169
+ if (listMatch && pendingListKey) {
170
+ const existing = Array.isArray(values[pendingListKey])
171
+ ? values[pendingListKey]
172
+ : [];
173
+ values[pendingListKey] = [...existing, unquote(listMatch[1].trim())];
174
+ continue;
175
+ }
176
+ pendingListKey = undefined;
177
+ const kv = line.match(/^([A-Za-z][A-Za-z0-9_-]*)\s*:\s*(.*)$/u);
178
+ if (!kv)
179
+ continue;
180
+ const key = kv[1];
181
+ const raw = kv[2] ?? "";
182
+ if (raw.trim() === "") {
183
+ values[key] = [];
184
+ pendingListKey = key;
185
+ continue;
186
+ }
187
+ values[key] = parseScalar(raw.trim());
188
+ }
189
+ return values;
190
+ }
191
+ function parseScalar(raw) {
192
+ const value = stripComment(raw);
193
+ if (value === "true")
194
+ return true;
195
+ if (value === "false")
196
+ return false;
197
+ if (/^\d+$/u.test(value))
198
+ return Number(value);
199
+ if (value.startsWith("[") && value.endsWith("]")) {
200
+ return value
201
+ .slice(1, -1)
202
+ .split(",")
203
+ .map((s) => unquote(s.trim()))
204
+ .filter((s) => s !== "");
205
+ }
206
+ return unquote(value);
207
+ }
208
+ function stripComment(value) {
209
+ let quote;
210
+ for (let i = 0; i < value.length; i += 1) {
211
+ const char = value[i];
212
+ if ((char === '"' || char === "'") && value[i - 1] !== "\\") {
213
+ quote = quote === char ? undefined : (quote ?? char);
214
+ }
215
+ if (!quote && char === "#" && /\s/u.test(value[i - 1] ?? "")) {
216
+ return value.slice(0, i).trimEnd();
217
+ }
218
+ }
219
+ return value;
220
+ }
221
+ /**
222
+ * Strip surrounding quotes and undo the escapes the writer emits.
223
+ *
224
+ * `\n` → newline is required for round-tripping: a multi-line description is
225
+ * stored as an escaped scalar, and without this the value would come back as
226
+ * the two characters `\` and `n` instead of a line break — which then fails the
227
+ * writer's own round-trip check and blocks every edit.
228
+ */
229
+ function unquote(value) {
230
+ let out = value;
231
+ if (out.length >= 2) {
232
+ const first = out[0];
233
+ if ((first === '"' || first === "'") && out.endsWith(first))
234
+ out = out.slice(1, -1);
235
+ }
236
+ if (!value.startsWith('"'))
237
+ return out; // escapes only apply in double quotes
238
+ return out.replace(/\\n/gu, "\n").replace(/\\"/gu, '"').replace(/\\\\/gu, "\\");
239
+ }
240
+ function escapeYaml(value) {
241
+ // Backslash first, then the quote, then real newlines: the reader turns a
242
+ // literal `\n` sequence back into a newline, so a multi-line description must
243
+ // be stored escaped or the YAML block would break apart.
244
+ return value
245
+ .replace(/\\/gu, "\\\\")
246
+ .replace(/"/gu, '\\"')
247
+ .replace(/\r\n/gu, "\\n")
248
+ .replace(/\n/gu, "\\n")
249
+ .replace(/\r/gu, "\\n");
250
+ }
251
+ /**
252
+ * Serialize an agent file.
253
+ *
254
+ * Mirrors the app's writer: `name` and `description` are always quoted, scalars
255
+ * are emitted only when set, lists as YAML block sequences, and the body
256
+ * follows the closing `---`. Unknown frontmatter keys are re-emitted after the
257
+ * known ones so a hand-added field survives an edit.
258
+ */
259
+ export function serializeAgentMarkdown(frontmatter, body) {
260
+ const lines = [
261
+ `name: "${escapeYaml(frontmatter.name)}"`,
262
+ `description: "${escapeYaml(frontmatter.description)}"`,
263
+ ];
264
+ // Every key emitted explicitly above. Anything NOT in this set is an unknown
265
+ // field that rides along verbatim — leaving a known key out here would emit
266
+ // it twice.
267
+ const known = new Set([
268
+ "name",
269
+ "description",
270
+ "color",
271
+ "model",
272
+ "thoughtLevel",
273
+ "tools",
274
+ "disallowedTools",
275
+ "skills",
276
+ "permissionMode",
277
+ "maxTurns",
278
+ "background",
279
+ "injectAgentsMd",
280
+ ]);
281
+ const scalar = (key, value) => {
282
+ if (value === undefined || value === null)
283
+ return;
284
+ if (typeof value === "string")
285
+ lines.push(`${key}: "${escapeYaml(value)}"`);
286
+ else if (typeof value === "number" || typeof value === "boolean") {
287
+ lines.push(`${key}: ${value}`);
288
+ }
289
+ };
290
+ scalar("color", frontmatter.color);
291
+ scalar("model", frontmatter.model);
292
+ scalar("thoughtLevel", frontmatter.thoughtLevel);
293
+ const list = (key, value) => {
294
+ if (!Array.isArray(value) || value.length === 0)
295
+ return;
296
+ lines.push(`${key}:`);
297
+ for (const item of value)
298
+ lines.push(` - ${typeof item === "string" ? item : String(item)}`);
299
+ };
300
+ list("tools", frontmatter.tools);
301
+ list("disallowedTools", frontmatter.disallowedTools);
302
+ list("skills", frontmatter.skills);
303
+ scalar("permissionMode", frontmatter.permissionMode);
304
+ if (typeof frontmatter.maxTurns === "number")
305
+ lines.push(`maxTurns: ${frontmatter.maxTurns}`);
306
+ if (typeof frontmatter.background === "boolean") {
307
+ lines.push(`background: ${frontmatter.background ? "true" : "false"}`);
308
+ }
309
+ if (typeof frontmatter.injectAgentsMd === "boolean") {
310
+ lines.push(`injectAgentsMd: ${frontmatter.injectAgentsMd ? "true" : "false"}`);
311
+ }
312
+ // Unknown keys ride along verbatim — a field a newer app added must survive
313
+ // an edit made through this bridge.
314
+ for (const [key, value] of Object.entries(frontmatter)) {
315
+ if (known.has(key))
316
+ continue;
317
+ if (Array.isArray(value))
318
+ list(key, value);
319
+ else
320
+ scalar(key, value);
321
+ }
322
+ const trimmed = body.trim();
323
+ return `---\n${lines.join("\n")}\n---\n${trimmed ? `${trimmed}\n` : ""}`;
324
+ }
325
+ /** The minimal body a newly created agent starts with. */
326
+ const TEMPLATE_BODY = "You are a helpful assistant.\n";
327
+ /**
328
+ * Replace an agent file's bytes.
329
+ *
330
+ * Atomic + backed up: the round-trip check above has already proven the content
331
+ * parses, so the only remaining failure mode is a crash mid-write, and that must
332
+ * leave either the old file or the new one.
333
+ */
334
+ async function writeAgentFile(filePath, content) {
335
+ await writeTextAtomic(filePath, content);
336
+ }
337
+ async function listAgentFiles() {
338
+ const dir = zcodeAgentsDir();
339
+ let entries;
340
+ try {
341
+ entries = await readdir(dir);
342
+ }
343
+ catch {
344
+ return [];
345
+ }
346
+ const out = [];
347
+ for (const entry of entries) {
348
+ if (!entry.endsWith(".md") && !entry.endsWith(".markdown"))
349
+ continue;
350
+ try {
351
+ if ((await stat(path.join(dir, entry))).isFile())
352
+ out.push(entry);
353
+ }
354
+ catch {
355
+ /* vanished mid-scan */
356
+ }
357
+ }
358
+ return out.sort();
359
+ }
360
+ /**
361
+ * Every agent: the built-ins, then the user-scope markdown files, each with its
362
+ * enablement and model override resolved from the state file.
363
+ */
364
+ export async function listAgents() {
365
+ const state = await readAgentsState();
366
+ const disabled = new Set(state.disabledAgentIds ?? []);
367
+ const overrides = state.builtInModelSelectionOverrides ?? {};
368
+ const out = BUILT_IN_AGENTS.map((name) => ({
369
+ name,
370
+ fileName: "",
371
+ path: "",
372
+ frontmatter: { name, description: "" },
373
+ systemPrompt: "",
374
+ enabled: true,
375
+ readOnly: true,
376
+ ...(overrides[name] ? { modelSelection: overrides[name] } : {}),
377
+ }));
378
+ const dir = zcodeAgentsDir();
379
+ for (const fileName of await listAgentFiles()) {
380
+ const filePath = path.join(dir, fileName);
381
+ let content;
382
+ try {
383
+ content = await readFile(filePath, "utf8");
384
+ }
385
+ catch {
386
+ continue;
387
+ }
388
+ const split = splitFrontmatter(content);
389
+ if (!split)
390
+ continue; // no frontmatter — the runtime ignores it too
391
+ const fm = parseFrontmatter(split.frontmatter);
392
+ const name = typeof fm.name === "string" ? fm.name : "";
393
+ if (!name)
394
+ continue;
395
+ const id = agentStateId(name);
396
+ out.push({
397
+ name,
398
+ fileName,
399
+ path: filePath,
400
+ frontmatter: {
401
+ ...fm,
402
+ name,
403
+ description: typeof fm.description === "string" ? fm.description : "",
404
+ },
405
+ systemPrompt: split.body.trim(),
406
+ enabled: !disabled.has(id),
407
+ readOnly: false,
408
+ });
409
+ }
410
+ return out;
411
+ }
412
+ /** Resolve an agent file path, refusing anything that escapes the directory. */
413
+ function resolveAgentFile(name) {
414
+ if (!isValidAgentName(name)) {
415
+ throw new Error(`invalid agent name '${name}' — 3-50 characters of letters, digits and hyphens`);
416
+ }
417
+ const dir = zcodeAgentsDir();
418
+ const filePath = path.join(dir, agentFileName(name));
419
+ // Defense in depth: the name pattern already excludes separators, but a
420
+ // symlinked agents dir must not let a write land outside it.
421
+ const resolvedDir = path.resolve(dir);
422
+ const resolved = path.resolve(filePath);
423
+ if (path.dirname(resolved) !== resolvedDir) {
424
+ throw new Error(`agent path escapes the agents directory: ${name}`);
425
+ }
426
+ return filePath;
427
+ }
428
+ /**
429
+ * Create an agent file.
430
+ *
431
+ * Refuses to overwrite (the app's own create uses the `wx` flag for the same
432
+ * reason) and seeds a minimal body so the agent is immediately usable.
433
+ */
434
+ export async function createAgent(input) {
435
+ const filePath = resolveAgentFile(input.name);
436
+ if (input.description.trim() === "") {
437
+ throw new Error("description is required");
438
+ }
439
+ if (input.color !== undefined && !AGENT_COLORS.includes(input.color)) {
440
+ throw new Error(`color must be one of ${AGENT_COLORS.join(", ")}`);
441
+ }
442
+ await mkdir(path.dirname(filePath), { recursive: true });
443
+ const frontmatter = {
444
+ name: input.name,
445
+ description: input.description,
446
+ };
447
+ if (input.color !== undefined)
448
+ frontmatter.color = input.color;
449
+ if (input.model !== undefined)
450
+ frontmatter.model = input.model;
451
+ if (input.thoughtLevel !== undefined)
452
+ frontmatter.thoughtLevel = input.thoughtLevel;
453
+ const content = serializeAgentMarkdown(frontmatter, TEMPLATE_BODY);
454
+ try {
455
+ // Exclusive create: an existing agent must be edited, not replaced.
456
+ await writeFile(filePath, content, { encoding: "utf8", flag: "wx" });
457
+ }
458
+ catch (error) {
459
+ if (error?.code === "EEXIST") {
460
+ throw new Error(`agent '${input.name}' already exists`);
461
+ }
462
+ throw error;
463
+ }
464
+ return {
465
+ name: input.name,
466
+ fileName: agentFileName(input.name),
467
+ path: filePath,
468
+ frontmatter,
469
+ systemPrompt: TEMPLATE_BODY.trim(),
470
+ enabled: true,
471
+ readOnly: false,
472
+ };
473
+ }
474
+ /**
475
+ * Update an agent's editable frontmatter fields.
476
+ *
477
+ * Only the fields present in `patch` change; the body and every other
478
+ * frontmatter key are carried through from the file. `model`/`thoughtLevel`
479
+ * accept `null` to CLEAR the key (the app's "inherit" choice). Renaming is a
480
+ * delete + create, which is why it is NOT offered here — a rename would orphan
481
+ * the state file's disable record.
482
+ */
483
+ export async function updateAgent(name, patch) {
484
+ const filePath = resolveAgentFile(name);
485
+ let content;
486
+ try {
487
+ content = await readFile(filePath, "utf8");
488
+ }
489
+ catch (error) {
490
+ if (error?.code === "ENOENT") {
491
+ throw new Error(`agent '${name}' does not exist`);
492
+ }
493
+ throw error;
494
+ }
495
+ const split = splitFrontmatter(content);
496
+ if (!split)
497
+ throw new Error(`agent '${name}' has no frontmatter`);
498
+ const fm = parseFrontmatter(split.frontmatter);
499
+ if (patch.description !== undefined) {
500
+ if (patch.description.trim() === "")
501
+ throw new Error("description must not be empty");
502
+ fm.description = patch.description;
503
+ }
504
+ if (patch.color !== undefined) {
505
+ if (!AGENT_COLORS.includes(patch.color)) {
506
+ throw new Error(`color must be one of ${AGENT_COLORS.join(", ")}`);
507
+ }
508
+ fm.color = patch.color;
509
+ }
510
+ // An explicit null clears the key (the app's "inherit" choice).
511
+ const applyModel = (key, value) => {
512
+ if (value === undefined)
513
+ return;
514
+ if (value === null || value === "")
515
+ delete fm[key];
516
+ else
517
+ fm[key] = value;
518
+ };
519
+ applyModel("model", patch.model);
520
+ applyModel("thoughtLevel", patch.thoughtLevel);
521
+ const next = {
522
+ ...fm,
523
+ name: typeof fm.name === "string" ? fm.name : name,
524
+ description: typeof fm.description === "string" ? fm.description : "",
525
+ };
526
+ // Round-trip check: what we serialize must parse back to the same fields, or
527
+ // an escaping mistake would silently rewrite the user's agent. Every key is
528
+ // checked, not just the editable five — an unknown field (one the user added
529
+ // by hand, or a newer app version introduced) is exactly where a serialization
530
+ // bug would hide.
531
+ const written = serializeAgentMarkdown(next, split.body);
532
+ const reparsed = splitFrontmatter(written);
533
+ if (!reparsed)
534
+ throw new Error("serialized agent has no frontmatter");
535
+ const roundTrip = parseFrontmatter(reparsed.frontmatter);
536
+ for (const [key, before] of Object.entries(next)) {
537
+ const after = roundTrip[key];
538
+ if (before === undefined)
539
+ continue;
540
+ if (typeof before === "object")
541
+ continue; // lists compared by their own path
542
+ if (String(before) !== String(after ?? "")) {
543
+ throw new Error(`frontmatter round-trip failed for '${key}' — not writing`);
544
+ }
545
+ }
546
+ for (const key of ["tools", "disallowedTools", "skills"]) {
547
+ const before = next[key];
548
+ if (before === undefined)
549
+ continue;
550
+ const after = roundTrip[key];
551
+ const left = Array.isArray(before) ? before.join("\u0000") : "";
552
+ const right = Array.isArray(after) ? after.join("\u0000") : "";
553
+ if (left !== right) {
554
+ throw new Error(`frontmatter round-trip failed for '${key}' — not writing`);
555
+ }
556
+ }
557
+ await writeAgentFile(filePath, written);
558
+ return {
559
+ name: next.name,
560
+ fileName: agentFileName(name),
561
+ path: filePath,
562
+ frontmatter: next,
563
+ systemPrompt: split.body.trim(),
564
+ enabled: true,
565
+ readOnly: false,
566
+ };
567
+ }
568
+ /** Delete a user-scope agent file. */
569
+ export async function deleteAgent(name) {
570
+ const filePath = resolveAgentFile(name);
571
+ try {
572
+ await rm(filePath);
573
+ }
574
+ catch (error) {
575
+ if (error?.code === "ENOENT") {
576
+ throw new Error(`agent '${name}' does not exist`);
577
+ }
578
+ throw error;
579
+ }
580
+ // A deleted agent must not leave a disable record behind: re-creating it with
581
+ // the same name would otherwise come back disabled.
582
+ await saveAgentsState((doc) => {
583
+ const current = Array.isArray(doc.disabledAgentIds) ? doc.disabledAgentIds : [];
584
+ const next = current.filter((id) => id !== agentStateId(name));
585
+ if (next.length === current.length)
586
+ return doc;
587
+ if (next.length === 0) {
588
+ const { disabledAgentIds: _dropped, ...rest } = doc;
589
+ return rest;
590
+ }
591
+ return { ...doc, disabledAgentIds: next };
592
+ });
593
+ }
594
+ /** The ZCode data root, for tests and diagnostics. */
595
+ export function agentsRoot() {
596
+ return zcodeHomeDir();
597
+ }
598
+ //# sourceMappingURL=agents-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents-config.js","sourceRoot":"","sources":["../../src/settings/agents-config.ts"],"names":[],"mappings":"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"}