zcode-acp-server 0.46.7 → 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 (55) hide show
  1. package/README.md +1 -1
  2. package/dist/code-fingerprint.json +2 -2
  3. package/dist/remote/endpoint.d.ts.map +1 -1
  4. package/dist/remote/endpoint.js +6 -0
  5. package/dist/remote/endpoint.js.map +1 -1
  6. package/dist/remote/hub-server.d.ts.map +1 -1
  7. package/dist/remote/hub-server.js +102 -0
  8. package/dist/remote/hub-server.js.map +1 -1
  9. package/dist/remote/settings-endpoint.d.ts +45 -0
  10. package/dist/remote/settings-endpoint.d.ts.map +1 -0
  11. package/dist/remote/settings-endpoint.js +920 -0
  12. package/dist/remote/settings-endpoint.js.map +1 -0
  13. package/dist/settings/agents-config.d.ts +158 -0
  14. package/dist/settings/agents-config.d.ts.map +1 -0
  15. package/dist/settings/agents-config.js +598 -0
  16. package/dist/settings/agents-config.js.map +1 -0
  17. package/dist/settings/app-update.d.ts +193 -0
  18. package/dist/settings/app-update.d.ts.map +1 -0
  19. package/dist/settings/app-update.js +659 -0
  20. package/dist/settings/app-update.js.map +1 -0
  21. package/dist/settings/atomic-write.d.ts +106 -0
  22. package/dist/settings/atomic-write.d.ts.map +1 -0
  23. package/dist/settings/atomic-write.js +228 -0
  24. package/dist/settings/atomic-write.js.map +1 -0
  25. package/dist/settings/cli-config.d.ts +145 -0
  26. package/dist/settings/cli-config.d.ts.map +1 -0
  27. package/dist/settings/cli-config.js +320 -0
  28. package/dist/settings/cli-config.js.map +1 -0
  29. package/dist/settings/coding-plan.d.ts +106 -0
  30. package/dist/settings/coding-plan.d.ts.map +1 -0
  31. package/dist/settings/coding-plan.js +299 -0
  32. package/dist/settings/coding-plan.js.map +1 -0
  33. package/dist/settings/file-lock.d.ts +39 -0
  34. package/dist/settings/file-lock.d.ts.map +1 -0
  35. package/dist/settings/file-lock.js +282 -0
  36. package/dist/settings/file-lock.js.map +1 -0
  37. package/dist/settings/provider-config.d.ts +123 -0
  38. package/dist/settings/provider-config.d.ts.map +1 -0
  39. package/dist/settings/provider-config.js +311 -0
  40. package/dist/settings/provider-config.js.map +1 -0
  41. package/dist/settings/skills.d.ts +72 -0
  42. package/dist/settings/skills.d.ts.map +1 -0
  43. package/dist/settings/skills.js +245 -0
  44. package/dist/settings/skills.js.map +1 -0
  45. package/dist/settings/usage-stats.d.ts +74 -0
  46. package/dist/settings/usage-stats.d.ts.map +1 -0
  47. package/dist/settings/usage-stats.js +235 -0
  48. package/dist/settings/usage-stats.js.map +1 -0
  49. package/dist/utils.d.ts +14 -0
  50. package/dist/utils.d.ts.map +1 -1
  51. package/dist/utils.js +22 -0
  52. package/dist/utils.js.map +1 -1
  53. package/docs/ARCHITECTURE.md +65 -0
  54. package/docs/REMOTE-CLIENTS.md +252 -0
  55. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-update.js","sourceRoot":"","sources":["../../src/settings/app-update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Locked, validated, backed-up JSON writes for the app-owned config files.
3
+ *
4
+ * Four invariants, in order (ADR-0026):
5
+ *
6
+ * 1. **Cross-process mutual exclusion.** Every write holds ZCode's own file
7
+ * lock, so a settings write never discards a change the desktop app is
8
+ * making at the same moment.
9
+ * 2. **Read-modify-write, never rewrite.** The mutator receives the parsed
10
+ * current document and returns the next one, so keys this module knows
11
+ * nothing about survive byte-for-byte. The same file carries skills, MCP,
12
+ * hooks, plugins and agent-runtime settings owned by different writers.
13
+ * 3. **Self-validation before the bytes land.** `validate(encode(next))`
14
+ * must succeed; a candidate that cannot round-trip is refused, because the
15
+ * failure mode otherwise is the backend silently degrading to an empty
16
+ * overlay while the user watches their models disappear.
17
+ * 4. **Backup then atomic rename.** The previous content is copied to
18
+ * `<file>.bak-<timestamp>` (newest 5 kept) before a temp file is renamed
19
+ * over the target. A crash mid-write leaves either the old file or the new
20
+ * one, never a torn document.
21
+ *
22
+ * A corrupt existing file REFUSES the write instead of being treated as `{}`:
23
+ * silently rewriting a damaged document from an empty base would destroy
24
+ * whatever is still recoverable in it.
25
+ *
26
+ * Scope of invariant 1, precisely: ZCode takes this lock for
27
+ * `provider_config.json`, `credentials.json` and the builtin-provider config,
28
+ * so those three are genuinely mutually excluded against a running desktop app.
29
+ * `cli/config.json` is NOT locked by the app's own writer (it does a bare
30
+ * temp+rename), so for that file the lock only excludes other BRIDGE
31
+ * processes — concurrent edits still lose one side's change, exactly as they
32
+ * do between the app's own multiple processes. Invariants 2-4 hold everywhere.
33
+ */
34
+ import { type FileLockOptions } from "./file-lock.js";
35
+ /** How many timestamped backups to keep per file. */
36
+ export declare const BACKUP_KEEP = 5;
37
+ /** Serialization for the config files this module owns: 2-space, trailing newline. */
38
+ export declare function encodeJson(value: unknown): string;
39
+ /**
40
+ * Read + parse a config file.
41
+ *
42
+ * @returns the parsed document, or `null` when the file is absent.
43
+ * @throws when the file exists but is not a JSON object — the caller must
44
+ * refuse the write rather than base it on an empty document.
45
+ */
46
+ export declare function readJsonDocument(file: string): Promise<Record<string, unknown> | null>;
47
+ export interface WriteJsonOptions extends FileLockOptions {
48
+ /**
49
+ * Serializer for the bytes that land on disk. Defaults to
50
+ * {@link encodeJson} (2-space + trailing newline); pass a custom one for
51
+ * files whose canonical form differs.
52
+ */
53
+ encode?: (doc: Record<string, unknown>) => string;
54
+ /**
55
+ * Round-trip check on the candidate document. Return `false` (or throw) to
56
+ * refuse the write; nothing is backed up or renamed in that case.
57
+ */
58
+ validate?: (doc: Record<string, unknown>) => boolean | string;
59
+ /** Skip the pre-write backup (used by the restore path, which re-backs-up). */
60
+ skipBackup?: boolean;
61
+ }
62
+ export interface WriteJsonResult {
63
+ /** The document actually written. */
64
+ doc: Record<string, unknown>;
65
+ /** Backup path taken before the write, when one existed. */
66
+ backup?: string;
67
+ }
68
+ /**
69
+ * Read-modify-write one config file under the file lock.
70
+ *
71
+ * @param mutator receives the parsed current document (an empty object when
72
+ * the file is absent) and returns the next document. Returning the same
73
+ * reference is a no-op that still validates and writes.
74
+ * @throws on a corrupt existing file, a failed validation, or a lock timeout.
75
+ */
76
+ export declare function writeJsonAtomic(file: string, mutator: (current: Record<string, unknown>) => Record<string, unknown> | Promise<Record<string, unknown>>, options?: WriteJsonOptions): Promise<WriteJsonResult>;
77
+ /**
78
+ * Write a non-JSON text file (agent markdown) atomically.
79
+ *
80
+ * The config files are JSON and go through `writeJsonAtomic`; agent markdown is
81
+ * a different format but has the same crash-safety requirement — a plain
82
+ * `writeFile` truncates in place, so a crash mid-write leaves a torn file with
83
+ * no backup to recover from. Same shape as the JSON path minus the JSON encode
84
+ * and validation: backup, temp file in the same directory, rename.
85
+ *
86
+ * No file lock: ZCode's own writer for `~/.zcode/agents/*.md` does not take the
87
+ * config lock, so taking it here would buy mutual exclusion only against other
88
+ * bridge processes while adding contention the app never has.
89
+ */
90
+ export declare function writeTextAtomic(file: string, content: string, options?: {
91
+ skipBackup?: boolean;
92
+ }): Promise<void>;
93
+ /** List the backups currently held for a config file, newest first. */
94
+ export declare function listBackups(file: string): Promise<Array<{
95
+ path: string;
96
+ createdAt: string;
97
+ }>>;
98
+ /**
99
+ * Rebuild an ISO timestamp from the flattened backup stamp.
100
+ *
101
+ * `new Date().toISOString()` yields `2026-09-22T14:10:00.000Z`; the backup name
102
+ * flattens `:` and `.` to `-`, giving `2026-09-22T14-10-00-000Z`. The date half
103
+ * keeps its dashes, so only the trailing four segments are restored.
104
+ */
105
+ export declare function backupStampToIso(stamp: string): string;
106
+ //# sourceMappingURL=atomic-write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-write.d.ts","sourceRoot":"","sources":["../../src/settings/atomic-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAKH,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGpE,qDAAqD;AACrD,eAAO,MAAM,WAAW,IAAI,CAAC;AAE7B,sFAAsF;AACtF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEjD;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAoB5F;AA4DD,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD;;;;OAIG;IACH,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;IAClD;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,GAAG,MAAM,CAAC;IAC9D,+EAA+E;IAC/E,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CACP,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAC/D,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CA2C1B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GACrC,OAAO,CAAC,IAAI,CAAC,CAef;AAMD,uEAAuE;AACvE,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAUrD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAItD"}
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Locked, validated, backed-up JSON writes for the app-owned config files.
3
+ *
4
+ * Four invariants, in order (ADR-0026):
5
+ *
6
+ * 1. **Cross-process mutual exclusion.** Every write holds ZCode's own file
7
+ * lock, so a settings write never discards a change the desktop app is
8
+ * making at the same moment.
9
+ * 2. **Read-modify-write, never rewrite.** The mutator receives the parsed
10
+ * current document and returns the next one, so keys this module knows
11
+ * nothing about survive byte-for-byte. The same file carries skills, MCP,
12
+ * hooks, plugins and agent-runtime settings owned by different writers.
13
+ * 3. **Self-validation before the bytes land.** `validate(encode(next))`
14
+ * must succeed; a candidate that cannot round-trip is refused, because the
15
+ * failure mode otherwise is the backend silently degrading to an empty
16
+ * overlay while the user watches their models disappear.
17
+ * 4. **Backup then atomic rename.** The previous content is copied to
18
+ * `<file>.bak-<timestamp>` (newest 5 kept) before a temp file is renamed
19
+ * over the target. A crash mid-write leaves either the old file or the new
20
+ * one, never a torn document.
21
+ *
22
+ * A corrupt existing file REFUSES the write instead of being treated as `{}`:
23
+ * silently rewriting a damaged document from an empty base would destroy
24
+ * whatever is still recoverable in it.
25
+ *
26
+ * Scope of invariant 1, precisely: ZCode takes this lock for
27
+ * `provider_config.json`, `credentials.json` and the builtin-provider config,
28
+ * so those three are genuinely mutually excluded against a running desktop app.
29
+ * `cli/config.json` is NOT locked by the app's own writer (it does a bare
30
+ * temp+rename), so for that file the lock only excludes other BRIDGE
31
+ * processes — concurrent edits still lose one side's change, exactly as they
32
+ * do between the app's own multiple processes. Invariants 2-4 hold everywhere.
33
+ */
34
+ import { mkdir, readFile, readdir, rename, rm, writeFile } from "node:fs/promises";
35
+ import { dirname, join } from "node:path";
36
+ import { withFileLock } from "./file-lock.js";
37
+ import { warn } from "../utils.js";
38
+ /** How many timestamped backups to keep per file. */
39
+ export const BACKUP_KEEP = 5;
40
+ /** Serialization for the config files this module owns: 2-space, trailing newline. */
41
+ export function encodeJson(value) {
42
+ return `${JSON.stringify(value, null, 2)}\n`;
43
+ }
44
+ /**
45
+ * Read + parse a config file.
46
+ *
47
+ * @returns the parsed document, or `null` when the file is absent.
48
+ * @throws when the file exists but is not a JSON object — the caller must
49
+ * refuse the write rather than base it on an empty document.
50
+ */
51
+ export async function readJsonDocument(file) {
52
+ let raw;
53
+ try {
54
+ raw = await readFile(file, "utf8");
55
+ }
56
+ catch (error) {
57
+ if (error?.code === "ENOENT")
58
+ return null;
59
+ throw error;
60
+ }
61
+ let parsed;
62
+ try {
63
+ parsed = JSON.parse(raw);
64
+ }
65
+ catch (error) {
66
+ throw new Error(`${file} is not valid JSON — refusing to write (${error instanceof Error ? error.message : String(error)})`);
67
+ }
68
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
69
+ throw new Error(`${file} is not a JSON object — refusing to write`);
70
+ }
71
+ return parsed;
72
+ }
73
+ /**
74
+ * Scan a directory for `<basename>.bak-*` entries, newest first.
75
+ *
76
+ * `readdir` yields bare file names, so the prefix must be the BASENAME — an
77
+ * absolute-path prefix never matches and the rotation silently keeps
78
+ * everything. The stamp is a flattened ISO timestamp, whose lexicographic
79
+ * order equals chronological order, so a string sort is the date sort.
80
+ */
81
+ async function scanBackups(file) {
82
+ const dir = dirname(file);
83
+ const prefix = `${basename(file)}.bak-`;
84
+ let entries;
85
+ try {
86
+ entries = await readdir(dir);
87
+ }
88
+ catch {
89
+ return []; // directory vanished — nothing to scan
90
+ }
91
+ return entries
92
+ .filter((name) => name.startsWith(prefix))
93
+ .map((name) => ({ name, path: join(dir, name) }))
94
+ .sort((a, b) => (a.name < b.name ? 1 : -1)); // newest first
95
+ }
96
+ /** Rotate `<file>.bak-<ts>` copies down to {@link BACKUP_KEEP} newest. */
97
+ async function pruneBackups(file) {
98
+ const backups = await scanBackups(file);
99
+ for (const stale of backups.slice(BACKUP_KEEP)) {
100
+ await rm(stale.path, { force: true }).catch(() => { });
101
+ }
102
+ }
103
+ /**
104
+ * Copy the current content aside before it is replaced.
105
+ *
106
+ * @returns the backup path, or undefined when there was nothing to back up or
107
+ * the copy failed (a failed backup never blocks the write itself).
108
+ */
109
+ async function backupCurrent(file) {
110
+ let raw;
111
+ try {
112
+ raw = await readFile(file, "utf8");
113
+ }
114
+ catch {
115
+ return undefined; // absent (or unreadable) — nothing worth backing up
116
+ }
117
+ const stamp = new Date().toISOString().replace(/[:.]/g, "-");
118
+ const backupPath = `${file}.bak-${stamp}`;
119
+ try {
120
+ await writeFile(backupPath, raw, { encoding: "utf8", mode: 0o600 });
121
+ await pruneBackups(file);
122
+ return backupPath;
123
+ }
124
+ catch (error) {
125
+ warn(`settings: backup of ${file} failed: ${error instanceof Error ? error.message : String(error)}`);
126
+ return undefined;
127
+ }
128
+ }
129
+ /**
130
+ * Read-modify-write one config file under the file lock.
131
+ *
132
+ * @param mutator receives the parsed current document (an empty object when
133
+ * the file is absent) and returns the next document. Returning the same
134
+ * reference is a no-op that still validates and writes.
135
+ * @throws on a corrupt existing file, a failed validation, or a lock timeout.
136
+ */
137
+ export async function writeJsonAtomic(file, mutator, options = {}) {
138
+ return withFileLock(file, async () => {
139
+ const current = await readJsonDocument(file);
140
+ const next = await mutator(current ?? {});
141
+ const encoded = (options.encode ?? encodeJson)(next);
142
+ if (options.validate) {
143
+ const verdict = options.validate(next);
144
+ if (verdict !== true) {
145
+ throw new Error(typeof verdict === "string"
146
+ ? `refusing to write ${file}: ${verdict}`
147
+ : `refusing to write ${file}: validation failed`);
148
+ }
149
+ }
150
+ // Re-parse the encoded bytes: what lands on disk must decode back to the
151
+ // same document, otherwise the writer and the reader disagree about the
152
+ // file's meaning.
153
+ const reparsed = JSON.parse(encoded);
154
+ if (typeof reparsed !== "object" || reparsed === null || Array.isArray(reparsed)) {
155
+ throw new Error(`refusing to write ${file}: encoded document is not an object`);
156
+ }
157
+ const backup = options.skipBackup ? undefined : await backupCurrent(file);
158
+ const dir = dirname(file);
159
+ await mkdir(dir, { recursive: true });
160
+ const temp = join(dir, `.${basename(file)}.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);
161
+ try {
162
+ await writeFile(temp, encoded, { encoding: "utf8", mode: 0o600 });
163
+ await rename(temp, file);
164
+ }
165
+ catch (error) {
166
+ await rm(temp, { force: true }).catch(() => { });
167
+ throw error;
168
+ }
169
+ return { doc: next, ...(backup !== undefined ? { backup } : {}) };
170
+ }, options);
171
+ }
172
+ /**
173
+ * Write a non-JSON text file (agent markdown) atomically.
174
+ *
175
+ * The config files are JSON and go through `writeJsonAtomic`; agent markdown is
176
+ * a different format but has the same crash-safety requirement — a plain
177
+ * `writeFile` truncates in place, so a crash mid-write leaves a torn file with
178
+ * no backup to recover from. Same shape as the JSON path minus the JSON encode
179
+ * and validation: backup, temp file in the same directory, rename.
180
+ *
181
+ * No file lock: ZCode's own writer for `~/.zcode/agents/*.md` does not take the
182
+ * config lock, so taking it here would buy mutual exclusion only against other
183
+ * bridge processes while adding contention the app never has.
184
+ */
185
+ export async function writeTextAtomic(file, content, options = {}) {
186
+ if (!options.skipBackup)
187
+ await backupCurrent(file);
188
+ const dir = dirname(file);
189
+ await mkdir(dir, { recursive: true });
190
+ const temp = join(dir, `.${basename(file)}.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);
191
+ try {
192
+ await writeFile(temp, content, { encoding: "utf8", mode: 0o600 });
193
+ await rename(temp, file);
194
+ }
195
+ catch (error) {
196
+ await rm(temp, { force: true }).catch(() => { });
197
+ throw error;
198
+ }
199
+ }
200
+ function basename(file) {
201
+ return file.split(/[\\/]/).pop() ?? file;
202
+ }
203
+ /** List the backups currently held for a config file, newest first. */
204
+ export async function listBackups(file) {
205
+ const prefix = `${basename(file)}.bak-`;
206
+ return (await scanBackups(file)).map(({ name, path: backupPath }) => ({
207
+ path: backupPath,
208
+ // The stamp is the ISO time with ':' and '.' flattened. Only the TIME part
209
+ // used those separators — the date uses '-' natively — so rebuilding by
210
+ // replacing every '-' would corrupt the date (`2026:09:22T…`). Restore the
211
+ // time segments only.
212
+ createdAt: backupStampToIso(name.slice(prefix.length)),
213
+ }));
214
+ }
215
+ /**
216
+ * Rebuild an ISO timestamp from the flattened backup stamp.
217
+ *
218
+ * `new Date().toISOString()` yields `2026-09-22T14:10:00.000Z`; the backup name
219
+ * flattens `:` and `.` to `-`, giving `2026-09-22T14-10-00-000Z`. The date half
220
+ * keeps its dashes, so only the trailing four segments are restored.
221
+ */
222
+ export function backupStampToIso(stamp) {
223
+ const match = /^(.*T)(\d+)-(\d+)-(\d+)-(\d+)Z$/u.exec(stamp);
224
+ if (!match)
225
+ return stamp;
226
+ return `${match[1]}${match[2]}:${match[3]}:${match[4]}.${match[5]}Z`;
227
+ }
228
+ //# sourceMappingURL=atomic-write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-write.js","sourceRoot":"","sources":["../../src/settings/atomic-write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Read/write for the ZCode CLI config (`~/.zcode/cli/config.json`).
3
+ *
4
+ * ONE file, four independent owners: skills enablement, MCP servers, hooks, and
5
+ * plugins. Every writer is therefore a read-modify-write that preserves keys it
6
+ * does not recognise — the file also carries agent-runtime settings owned by
7
+ * the backend, and rewriting from a partial model would silently delete them.
8
+ *
9
+ * The enable/disable spellings are not symmetric, and getting them wrong makes
10
+ * a toggle look broken while the file is technically valid:
11
+ *
12
+ * - **skills**: key = the SKILL.md absolute path, value `{enable: false}`.
13
+ * `enable: true` is the DEFAULT and must DELETE the key — writing `true`
14
+ * leaves a permanent override that shadows later enablement changes.
15
+ * - **MCP**: `enabled: false` inside the server object. Same rule: `true`
16
+ * deletes the key (and a legacy `enable` key is migrated on the way).
17
+ * - **hooks**: a whole different shape — a nested tree under `hooks`, gated by
18
+ * a top-level `hooks.enabled: true`. WITHOUT that flag every hook in the file
19
+ * is inert, which is the single most common way a hand-written config does
20
+ * nothing.
21
+ * - **plugins**: `enabledPlugins` / `suppressedBuiltins` maps keyed by
22
+ * `<name>@<marketplace>`.
23
+ *
24
+ * None of these are hot-reloaded by the agent: `cli/config.json` is read once
25
+ * at agent start (MCP servers are frozen into the runtime config), except the
26
+ * skills enablement map which the host re-reads live. Writes therefore report
27
+ * `needs-restart` for MCP and hooks, `immediate` for skills.
28
+ */
29
+ /** The seven hook events the schema accepts, in its own order. */
30
+ export declare const HOOK_EVENT_NAMES: readonly ["SessionStart", "UserPromptSubmit", "PreToolUse", "PermissionRequest", "PostToolUse", "PostToolUseFailure", "Stop"];
31
+ export type HookEventName = (typeof HOOK_EVENT_NAMES)[number];
32
+ /** One hook entry. Passthrough in the schema — unknown keys are preserved. */
33
+ export interface HookEntry {
34
+ type: "command" | "process";
35
+ command: string;
36
+ enabled?: boolean;
37
+ async?: boolean;
38
+ shell?: true | string;
39
+ /** Seconds (only meaningful for `type: "command"`). */
40
+ timeout?: number;
41
+ /** Milliseconds; wins over `timeout` when both are present. */
42
+ timeoutMs?: number;
43
+ args?: string[];
44
+ statusMessage?: string;
45
+ [key: string]: unknown;
46
+ }
47
+ /** One matcher group under an event. STRICT in the schema — no unknown keys. */
48
+ export interface HookMatcher {
49
+ matcher?: string;
50
+ hooks: HookEntry[];
51
+ }
52
+ export interface HooksConfig {
53
+ enabled?: boolean;
54
+ timeoutMs?: number;
55
+ maxOutputBytes?: number;
56
+ events?: Partial<Record<HookEventName, HookMatcher[]>>;
57
+ }
58
+ export interface McpServerConfig {
59
+ type?: string;
60
+ url?: string;
61
+ command?: string;
62
+ args?: string[];
63
+ env?: Record<string, string>;
64
+ headers?: Record<string, string>;
65
+ enabled?: boolean;
66
+ [key: string]: unknown;
67
+ }
68
+ export interface CliConfigFile {
69
+ skills?: Record<string, {
70
+ enable?: boolean;
71
+ }>;
72
+ mcp?: {
73
+ servers?: Record<string, McpServerConfig>;
74
+ };
75
+ hooks?: HooksConfig;
76
+ plugins?: {
77
+ enabled?: boolean;
78
+ dirs?: string[];
79
+ enabledPlugins?: Record<string, boolean>;
80
+ suppressedBuiltins?: string[];
81
+ [key: string]: unknown;
82
+ };
83
+ [key: string]: unknown;
84
+ }
85
+ /**
86
+ * Read the CLI config.
87
+ *
88
+ * @throws when the file exists but is malformed. Unlike the app's skills
89
+ * writer (which silently reads damage as `{}` and would then rewrite
90
+ * the file from an empty base), this refuses — the caller surfaces an
91
+ * error instead of destroying what is left of the document.
92
+ */
93
+ export declare function readCliConfig(): Promise<CliConfigFile>;
94
+ /** Structural check for the parts of the file this module owns. */
95
+ export declare function validateCliConfig(doc: Record<string, unknown>): boolean | string;
96
+ /**
97
+ * Set a skill's enabled state.
98
+ *
99
+ * `enable: true` REMOVES the override rather than writing `true` — enabled is
100
+ * the default state, and a stored `true` is a permanent pin that would shadow
101
+ * the file's real state.
102
+ */
103
+ export declare function setSkillEnabled(skillPath: string, enable: boolean): Promise<CliConfigFile>;
104
+ /**
105
+ * Create or update an MCP server.
106
+ *
107
+ * `enabled: true` deletes the flag (and a legacy `enable` key) instead of
108
+ * storing it; only a DISABLE is worth persisting.
109
+ */
110
+ export declare function upsertMcpServer(name: string, server: McpServerConfig): Promise<CliConfigFile>;
111
+ /** Enable or disable an existing MCP server. */
112
+ export declare function setMcpServerEnabled(name: string, enabled: boolean): Promise<CliConfigFile>;
113
+ export declare function removeMcpServer(name: string): Promise<CliConfigFile>;
114
+ /**
115
+ * Read the hooks tree. Returns the raw config; an absent file yields `{}`.
116
+ *
117
+ * Note the returned `enabled` flag: hooks are inert unless the top-level flag
118
+ * is `true`, so callers must surface it rather than inferring it.
119
+ */
120
+ export declare function readHooks(): Promise<HooksConfig>;
121
+ /**
122
+ * Set the global hooks switch.
123
+ *
124
+ * A file full of hooks with `enabled` absent runs NOTHING — the runtime root
125
+ * defaults to disabled. This is the one field that turns the whole tree on.
126
+ */
127
+ export declare function setHooksEnabled(enabled: boolean): Promise<CliConfigFile>;
128
+ /**
129
+ * Edit ONE existing hook entry in place.
130
+ *
131
+ * Deliberately not a create path: the matcher list is an array of arrays, and
132
+ * an insert shifts every later index, so a remote "add a hook" call races with
133
+ * any concurrent edit of the same event. Editing an existing entry's
134
+ * command/timeout/enabled covers the real use case (temporarily disable one,
135
+ * tweak a command) without that hazard.
136
+ *
137
+ * Unknown keys on the hook object are preserved: the schema is `.passthrough()`
138
+ * precisely so extensions can ride along.
139
+ */
140
+ export declare function updateHookEntry(event: HookEventName, matcherIndex: number, hookIndex: number, patch: Partial<Pick<HookEntry, "command" | "enabled" | "timeoutMs" | "timeout">>): Promise<CliConfigFile>;
141
+ /** Enable or disable a plugin by its `<name>@<marketplace>` key. */
142
+ export declare function setPluginEnabled(pluginKey: string, enabled: boolean): Promise<CliConfigFile>;
143
+ /** Raw text for the settings snapshot. Absent → null. */
144
+ export declare function readCliConfigRaw(): Promise<string | null>;
145
+ //# sourceMappingURL=cli-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-config.d.ts","sourceRoot":"","sources":["../../src/settings/cli-config.ts"],"names":[],"mappings":"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"}