@wirecat/cli-core 0.281.0 → 0.283.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 (126) hide show
  1. package/dist/analysis/settings.d.ts.map +1 -1
  2. package/dist/analysis/settings.js +1 -2
  3. package/dist/analysis/settings.js.map +1 -1
  4. package/dist/background/index.d.ts +0 -1
  5. package/dist/background/index.d.ts.map +1 -1
  6. package/dist/background/index.js +0 -1
  7. package/dist/background/index.js.map +1 -1
  8. package/dist/background/schedules.d.ts.map +1 -1
  9. package/dist/background/schedules.js +1 -2
  10. package/dist/background/schedules.js.map +1 -1
  11. package/dist/background/units.d.ts.map +1 -1
  12. package/dist/background/units.js +1 -3
  13. package/dist/background/units.js.map +1 -1
  14. package/dist/cli/bot/context.d.ts.map +1 -1
  15. package/dist/cli/bot/context.js +0 -2
  16. package/dist/cli/bot/context.js.map +1 -1
  17. package/dist/cli/config-command.d.ts.map +1 -1
  18. package/dist/cli/config-command.js +3 -33
  19. package/dist/cli/config-command.js.map +1 -1
  20. package/dist/cli/config-keys.d.ts +2 -29
  21. package/dist/cli/config-keys.d.ts.map +1 -1
  22. package/dist/cli/config-keys.js +5 -75
  23. package/dist/cli/config-keys.js.map +1 -1
  24. package/dist/cli/index.d.ts +1 -2
  25. package/dist/cli/index.d.ts.map +1 -1
  26. package/dist/cli/index.js +1 -2
  27. package/dist/cli/index.js.map +1 -1
  28. package/dist/cli/json-fields.d.ts.map +1 -1
  29. package/dist/cli/json-fields.js +8 -3
  30. package/dist/cli/json-fields.js.map +1 -1
  31. package/dist/cli/messenger/backfill-command.d.ts.map +1 -1
  32. package/dist/cli/messenger/backfill-command.js +19 -3
  33. package/dist/cli/messenger/backfill-command.js.map +1 -1
  34. package/dist/cli/result-fields.d.ts +0 -1
  35. package/dist/cli/result-fields.d.ts.map +1 -1
  36. package/dist/cli/result-fields.js +1 -5
  37. package/dist/cli/result-fields.js.map +1 -1
  38. package/dist/cli/settings.d.ts +5 -12
  39. package/dist/cli/settings.d.ts.map +1 -1
  40. package/dist/cli/settings.js +14 -43
  41. package/dist/cli/settings.js.map +1 -1
  42. package/dist/cli/skill-command.d.ts.map +1 -1
  43. package/dist/cli/skill-command.js +5 -10
  44. package/dist/cli/skill-command.js.map +1 -1
  45. package/dist/entities/index.d.ts +12 -0
  46. package/dist/entities/index.d.ts.map +1 -1
  47. package/dist/kit/index.d.ts +0 -1
  48. package/dist/kit/index.d.ts.map +1 -1
  49. package/dist/kit/index.js +0 -1
  50. package/dist/kit/index.js.map +1 -1
  51. package/dist/meetings/answers.d.ts +6 -0
  52. package/dist/meetings/answers.d.ts.map +1 -1
  53. package/dist/meetings/answers.js +16 -0
  54. package/dist/meetings/answers.js.map +1 -1
  55. package/dist/meetings/index.d.ts +1 -1
  56. package/dist/meetings/index.d.ts.map +1 -1
  57. package/dist/meetings/index.js.map +1 -1
  58. package/dist/meetings/mcp/search.d.ts +6 -0
  59. package/dist/meetings/mcp/search.d.ts.map +1 -1
  60. package/dist/meetings/project-evidence-answer.d.ts +6 -0
  61. package/dist/meetings/project-evidence-answer.d.ts.map +1 -1
  62. package/dist/meetings/store.d.ts +7 -0
  63. package/dist/meetings/store.d.ts.map +1 -1
  64. package/dist/models/settings.d.ts.map +1 -1
  65. package/dist/models/settings.js +2 -3
  66. package/dist/models/settings.js.map +1 -1
  67. package/dist/sends/guard.d.ts +4 -15
  68. package/dist/sends/guard.d.ts.map +1 -1
  69. package/dist/sends/guard.js +4 -21
  70. package/dist/sends/guard.js.map +1 -1
  71. package/dist/sends/index.d.ts +1 -1
  72. package/dist/sends/index.d.ts.map +1 -1
  73. package/dist/sends/index.js +1 -1
  74. package/dist/sends/index.js.map +1 -1
  75. package/dist/sends/permissions.d.ts +1 -5
  76. package/dist/sends/permissions.d.ts.map +1 -1
  77. package/dist/sends/permissions.js +4 -21
  78. package/dist/sends/permissions.js.map +1 -1
  79. package/dist/services/index.d.ts +1 -1
  80. package/dist/services/index.d.ts.map +1 -1
  81. package/dist/services/index.js +1 -1
  82. package/dist/services/index.js.map +1 -1
  83. package/dist/services/task-rules.d.ts +9 -1
  84. package/dist/services/task-rules.d.ts.map +1 -1
  85. package/dist/services/task-rules.js +22 -1
  86. package/dist/services/task-rules.js.map +1 -1
  87. package/dist/store/account-store.d.ts +1 -1
  88. package/dist/store/account-store.d.ts.map +1 -1
  89. package/dist/store/account-store.js +2 -0
  90. package/dist/store/account-store.js.map +1 -1
  91. package/dist/store/sqlite/email-index.d.ts.map +1 -1
  92. package/dist/store/sqlite/email-index.js +14 -3
  93. package/dist/store/sqlite/email-index.js.map +1 -1
  94. package/dist/store/sqlite/meeting-hit-search.d.ts.map +1 -1
  95. package/dist/store/sqlite/meeting-hit-search.js +16 -3
  96. package/dist/store/sqlite/meeting-hit-search.js.map +1 -1
  97. package/dist/store/sqlite/task-rule-stops.d.ts +5 -0
  98. package/dist/store/sqlite/task-rule-stops.d.ts.map +1 -0
  99. package/dist/store/sqlite/task-rule-stops.js +13 -0
  100. package/dist/store/sqlite/task-rule-stops.js.map +1 -0
  101. package/dist/store/store.d.ts +3 -0
  102. package/dist/store/store.d.ts.map +1 -1
  103. package/dist/store/store.js +3 -0
  104. package/dist/store/store.js.map +1 -1
  105. package/package.json +3 -3
  106. package/parity.json +81 -50
  107. package/dist/background/folders.d.ts +0 -16
  108. package/dist/background/folders.d.ts.map +0 -1
  109. package/dist/background/folders.js +0 -52
  110. package/dist/background/folders.js.map +0 -1
  111. package/dist/background/renamed-paths.d.ts +0 -3
  112. package/dist/background/renamed-paths.d.ts.map +0 -1
  113. package/dist/background/renamed-paths.js +0 -6
  114. package/dist/background/renamed-paths.js.map +0 -1
  115. package/dist/background/wirecat-folder.d.ts +0 -26
  116. package/dist/background/wirecat-folder.d.ts.map +0 -1
  117. package/dist/background/wirecat-folder.js +0 -339
  118. package/dist/background/wirecat-folder.js.map +0 -1
  119. package/dist/cli/permission-migration.d.ts +0 -16
  120. package/dist/cli/permission-migration.d.ts.map +0 -1
  121. package/dist/cli/permission-migration.js +0 -152
  122. package/dist/cli/permission-migration.js.map +0 -1
  123. package/dist/kit/mcp-commands-client.d.ts +0 -7
  124. package/dist/kit/mcp-commands-client.d.ts.map +0 -1
  125. package/dist/kit/mcp-commands-client.js +0 -50
  126. package/dist/kit/mcp-commands-client.js.map +0 -1
@@ -1,339 +0,0 @@
1
- import { execFileSync } from "node:child_process";
2
- import { createHash } from "node:crypto";
3
- import { closeSync, constants, copyFileSync, cpSync, existsSync, fsyncSync, linkSync, mkdirSync, openSync, readdirSync, readlinkSync, readSync, renameSync, rmSync, statSync, unlinkSync, } from "node:fs";
4
- import { dirname, join, relative } from "node:path";
5
- import { CliError, resolvePaths } from "@wirecat/cli-base";
6
- import { wirecatDirectory } from "../store/path.js";
7
- import { readLock, releaseLock, takeLock } from "./lock.js";
8
- import { alive } from "./processes.js";
9
- // lsof misses a serve between writes: its lock is written and closed again.
10
- export const liveServes = (dir) => {
11
- const serve = join(dir, "serve");
12
- if (!existsSync(serve))
13
- return [];
14
- return readdirSync(serve)
15
- .filter((name) => name.endsWith(".lock"))
16
- .flatMap((name) => {
17
- const pid = readLock(join(serve, name))?.pid;
18
- return pid !== undefined && alive(pid) ? [`pid ${pid} (serve, ${dir})`] : [];
19
- });
20
- };
21
- /** Errors that leave the owner's store in a state no command should run on: they stop the command. */
22
- class Stop extends CliError {
23
- constructor(message) {
24
- super("configuration_error", message);
25
- }
26
- }
27
- const conflict = (pairs) => new Stop(`two different copies of the store: ${pairs.map(([from, to]) => `${from} and ${to}`).join("; ")} — ` +
28
- "nothing was moved or changed; keep one of each pair and run again");
29
- const STORE = "wirecat.db";
30
- const PARTIAL = ".partial-";
31
- const SIDECARS = [`${STORE}-wal`, `${STORE}-shm`];
32
- const isStoreFile = (name) => !name.includes(PARTIAL) &&
33
- (name === STORE ||
34
- SIDECARS.includes(name) ||
35
- name.startsWith(`${STORE}.backup-`) ||
36
- name.startsWith(`${STORE}.before-restore-`));
37
- // The db goes last: while it is still in the old folder the move is unfinished, and the next start resumes it.
38
- const dbLast = (names) => [...names].sort((a, b) => Number(a === STORE) - Number(b === STORE));
39
- const storeFiles = (directory) => existsSync(directory) ? dbLast(readdirSync(directory).filter(isStoreFile)) : [];
40
- const digest = (path) => {
41
- const hash = createHash("sha256");
42
- const fd = openSync(path, "r");
43
- const buffer = Buffer.allocUnsafe(1 << 20);
44
- try {
45
- for (let read = readSync(fd, buffer); read > 0; read = readSync(fd, buffer))
46
- hash.update(buffer.subarray(0, read));
47
- }
48
- finally {
49
- closeSync(fd);
50
- }
51
- return hash.digest("hex");
52
- };
53
- const sameFile = (a, b) => {
54
- const [x, y] = [statSync(a, { bigint: true }), statSync(b, { bigint: true })];
55
- if (x.dev === y.dev && x.ino === y.ino)
56
- return true;
57
- return x.size === y.size && digest(a) === digest(b);
58
- };
59
- const filesUnder = (root) => readdirSync(root, { recursive: true, withFileTypes: true })
60
- .filter((entry) => entry.isFile())
61
- .map((entry) => relative(root, join(entry.parentPath, entry.name)))
62
- .sort();
63
- const sameTree = (a, b) => {
64
- const [left, right] = [filesUnder(a), filesUnder(b)];
65
- return left.join("\n") === right.join("\n") && left.every((file) => sameFile(join(a, file), join(b, file)));
66
- };
67
- const flush = (path, mode = "r+") => {
68
- const fd = openSync(path, mode);
69
- try {
70
- fsyncSync(fd);
71
- }
72
- finally {
73
- closeSync(fd);
74
- }
75
- };
76
- // Windows cannot open a folder to flush it; NTFS orders the rename on its own.
77
- const flushFolder = (path) => {
78
- try {
79
- flush(path, "r");
80
- }
81
- catch { }
82
- };
83
- const errno = (error) => error.code;
84
- const copyAcross = (from, to) => {
85
- const partial = `${to}${PARTIAL}${process.pid}`;
86
- copyFileSync(from, partial, constants.COPYFILE_EXCL);
87
- try {
88
- flush(partial);
89
- if (!sameFile(from, partial))
90
- throw new Error(`the copy of ${from} at ${partial} came out different`);
91
- linkSync(partial, to);
92
- }
93
- catch (error) {
94
- if (errno(error) === "EEXIST")
95
- throw conflict([[from, to]]);
96
- throw error;
97
- }
98
- finally {
99
- rmSync(partial, { force: true });
100
- }
101
- flushFolder(dirname(to));
102
- unlinkSync(from);
103
- };
104
- /**
105
- * `link` then `unlink`, because `rename` replaces a file already at `to` and `link` refuses to. A crash
106
- * between the two leaves one file under both names, which the next start recognises and finishes.
107
- */
108
- export const moveFile = (from, to) => {
109
- try {
110
- linkSync(from, to);
111
- }
112
- catch (error) {
113
- const code = errno(error);
114
- if (code === "EEXIST")
115
- throw conflict([[from, to]]);
116
- if (code === "EXDEV")
117
- return copyAcross(from, to);
118
- if (!["EPERM", "ENOTSUP", "EOPNOTSUPP", "ENOSYS"].includes(code ?? ""))
119
- throw error;
120
- if (existsSync(to))
121
- throw conflict([[from, to]]);
122
- renameSync(from, to);
123
- return;
124
- }
125
- unlinkSync(from);
126
- };
127
- const moveTree = (from, to) => {
128
- if (existsSync(to))
129
- return;
130
- try {
131
- renameSync(from, to);
132
- return;
133
- }
134
- catch (error) {
135
- if (errno(error) !== "EXDEV")
136
- throw error;
137
- }
138
- const partial = `${to}${PARTIAL}${process.pid}`;
139
- try {
140
- cpSync(from, partial, { recursive: true, force: false, errorOnExist: true });
141
- for (const file of filesUnder(partial))
142
- flush(join(partial, file));
143
- if (!sameTree(from, partial))
144
- throw new Error(`the copy of ${from} at ${partial} came out different`);
145
- if (existsSync(to))
146
- return;
147
- renameSync(partial, to);
148
- }
149
- finally {
150
- rmSync(partial, { recursive: true, force: true });
151
- }
152
- flushFolder(dirname(to));
153
- rmSync(from, { recursive: true, force: true });
154
- };
155
- /** A db without its wal loses writes, so a failure part-way puts back what already moved. */
156
- const moveAll = (names, from, to, move) => {
157
- const done = [];
158
- try {
159
- for (const name of names) {
160
- move(join(from, name), join(to, name));
161
- done.push(name);
162
- }
163
- }
164
- catch (error) {
165
- if (error instanceof Stop)
166
- throw error;
167
- const stuck = [];
168
- for (const name of done.reverse()) {
169
- try {
170
- move(join(to, name), join(from, name));
171
- }
172
- catch {
173
- stuck.push(join(to, name));
174
- }
175
- }
176
- if (stuck.length > 0)
177
- throw new Stop(`${error.message}; and could not put back ${stuck.join(", ")} — they are in ${to}, the rest is in ${from}`);
178
- throw error;
179
- }
180
- };
181
- const pidsOf = (listed) => listed
182
- .split("\n")
183
- .filter((pid) => pid && pid !== String(process.pid))
184
- .map((pid) => `pid ${pid}`);
185
- /** Processes with a store file open: another tool's serve, mcp or job is not in any lock this one checks. */
186
- const storeHolders = (oldState, platform) => {
187
- if (platform === "darwin") {
188
- try {
189
- const out = execFileSync("/usr/sbin/lsof", ["-t", "+D", oldState], {
190
- encoding: "utf8",
191
- stdio: ["ignore", "pipe", "ignore"],
192
- });
193
- return pidsOf(out);
194
- }
195
- catch (error) {
196
- // lsof exits 1 when nothing is open; any other failure means it could not look, so nothing moves.
197
- const failure = error;
198
- return failure.status === 1 ? pidsOf(failure.stdout ?? "") : ["lsof could not check"];
199
- }
200
- }
201
- if (platform !== "linux")
202
- return [];
203
- const holders = [];
204
- let pids = [];
205
- try {
206
- pids = readdirSync("/proc").filter((name) => /^\d+$/.test(name) && Number(name) !== process.pid);
207
- }
208
- catch {
209
- return ["/proc could not be read"];
210
- }
211
- for (const pid of pids) {
212
- try {
213
- for (const fd of readdirSync(`/proc/${pid}/fd`)) {
214
- let target;
215
- try {
216
- target = readlinkSync(`/proc/${pid}/fd/${fd}`);
217
- }
218
- catch {
219
- continue;
220
- }
221
- if (target.startsWith(join(oldState, STORE))) {
222
- holders.push(`pid ${pid} (${target})`);
223
- break;
224
- }
225
- }
226
- }
227
- catch { }
228
- }
229
- return holders;
230
- };
231
- const LOCK_WAIT_MS = 60_000;
232
- const waitForLock = (path, waitMs) => {
233
- const until = Date.now() + waitMs;
234
- for (;;) {
235
- const held = takeLock(path, { pid: process.pid, startedAt: new Date().toISOString() });
236
- if (!held)
237
- return;
238
- if (Date.now() >= until)
239
- throw new Stop(`pid ${held.pid} is moving the store into ${dirname(path)} — run again once it finishes`);
240
- Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 200);
241
- }
242
- };
243
- let keptStore;
244
- /** The old store this run keeps using: a unit written now must not pin it, or the move never happens. */
245
- export const keptOldStore = () => keptStore;
246
- const keepOld = (env, path) => {
247
- env.MESSAGING_STORE = path;
248
- keptStore = path;
249
- };
250
- /**
251
- * Brings the store and the models, which lived in `cli-messaging`'s and `cli-common`'s folders, into the
252
- * WireCat folder. Never over a file already there, never when an override says where they are, and never
253
- * while something has the old store open: that run keeps using the old file. Two different stores stop
254
- * the command rather than pick one.
255
- */
256
- export const migrateToWirecatFolder = (app, options = {}) => {
257
- const { env = process.env, platform = process.platform, move = moveFile, lockWaitMs = LOCK_WAIT_MS } = options;
258
- const holdersOf = options.holders ?? ((dir) => storeHolders(dir, platform));
259
- const warn = options.warn ?? ((line) => process.stderr.write(`${line}\n`));
260
- if (env.MESSAGING_STORE || env.WIRECAT_STATE_DIR)
261
- return;
262
- const target = wirecatDirectory(env);
263
- const oldState = resolvePaths({ appName: "cli-messaging", prefix: "MESSAGING", env }).state;
264
- const oldDb = join(oldState, STORE);
265
- // A store under MESSAGING_STATE_DIR stays where the override put it; a test sandbox's must never reach home.
266
- const storeOverridden = env.MESSAGING_STATE_DIR !== undefined;
267
- if (storeOverridden && existsSync(oldDb))
268
- keepOld(env, oldDb);
269
- const oldModels = env.CLI_COMMON_CACHE_DIR
270
- ? undefined
271
- : join(resolvePaths({ appName: "cli-common", prefix: "CLI_COMMON", env }).cache, "models");
272
- const modelsToMove = oldModels !== undefined && existsSync(oldModels) && !existsSync(join(target, "models"));
273
- if ((storeOverridden || storeFiles(oldState).length === 0) && !modelsToMove)
274
- return;
275
- mkdirSync(target, { recursive: true, mode: 0o700 });
276
- const lock = join(target, ".moving.lock");
277
- waitForLock(lock, lockWaitMs);
278
- try {
279
- for (const name of readdirSync(target).filter((entry) => /^(wirecat\.db.*|models)\.partial-\d+$/.test(entry)))
280
- rmSync(join(target, name), { recursive: true, force: true });
281
- try {
282
- if (!storeOverridden)
283
- moveStore(app, oldState, target, env, holdersOf, move, warn);
284
- }
285
- catch (error) {
286
- if (error instanceof Stop)
287
- throw error;
288
- if (existsSync(oldDb) && !existsSync(join(target, STORE)))
289
- keepOld(env, oldDb);
290
- warn(`${app.command}: could not move the store to ${target} — ${error.message}`);
291
- }
292
- try {
293
- if (oldModels && existsSync(oldModels))
294
- moveTree(oldModels, join(target, "models"));
295
- }
296
- catch (error) {
297
- warn(`${app.command}: could not move the models to ${target} — ${error.message}`);
298
- }
299
- }
300
- finally {
301
- releaseLock(lock);
302
- }
303
- };
304
- const moveStore = (app, oldState, target, env, holdersOf, move, warn) => {
305
- const all = storeFiles(oldState);
306
- const names = all.includes(STORE) ? all : all.filter((name) => !SIDECARS.includes(name));
307
- const pending = [];
308
- const finished = [];
309
- const conflicts = [];
310
- for (const name of names) {
311
- const [from, to] = [join(oldState, name), join(target, name)];
312
- if (!existsSync(to))
313
- pending.push(name);
314
- else if (sameFile(from, to))
315
- finished.push(name);
316
- else
317
- conflicts.push([from, to]);
318
- }
319
- if (conflicts.length > 0)
320
- throw conflict(conflicts);
321
- // A wal or shm is only valid beside its own db: without the db moving, they stay where they are.
322
- const moving = pending.includes(STORE) ? pending : pending.filter((name) => !SIDECARS.includes(name));
323
- if (moving.length === 0 && finished.length === 0)
324
- return;
325
- const serving = [
326
- ...[oldState, resolvePaths({ appName: app.appName, prefix: app.envPrefix, env }).state].flatMap(liveServes),
327
- ...holdersOf(oldState),
328
- ];
329
- if (serving.length > 0) {
330
- if (existsSync(join(oldState, STORE)))
331
- keepOld(env, join(oldState, STORE));
332
- warn(`${app.command}: something has the store open (${serving.join(", ")}) — the store moves to ${target} on a run after it stops`);
333
- return;
334
- }
335
- moveAll(moving, oldState, target, move);
336
- for (const name of dbLast(finished))
337
- unlinkSync(join(oldState, name));
338
- };
339
- //# sourceMappingURL=wirecat-folder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wirecat-folder.js","sourceRoot":"","sources":["../../src/background/wirecat-folder.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- import { type Level } from "../sends/permissions.js";
2
- import type { Config } from "./settings.js";
3
- type Levels = Record<string, Level>;
4
- export interface PermissionMigration {
5
- config: Config;
6
- changed: boolean;
7
- changes: {
8
- scope: string;
9
- removed: string[];
10
- permissions: Levels;
11
- }[];
12
- }
13
- export declare const migratePermissionConfig: (input: Config) => PermissionMigration;
14
- export declare const hasPermissionConfig: (input: Config) => boolean;
15
- export {};
16
- //# sourceMappingURL=permission-migration.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"permission-migration.d.ts","sourceRoot":"","sources":["../../src/cli/permission-migration.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,KAAK,EAMX,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,eAAe,CAAA;AAGxD,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAInC,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CACrE;AAwHD,eAAO,MAAM,uBAAuB,UAAW,MAAM,KAAG,mBAqCvD,CAAA;AAED,eAAO,MAAM,mBAAmB,UAAW,MAAM,KAAG,OAC8B,CAAA"}
@@ -1,152 +0,0 @@
1
- import { CliError } from "@wirecat/cli-base";
2
- import { fromOldSettings, LEVELS, layerPermissions, levelFor, PERMISSIONS, RESOURCES, } from "../sends/permissions.js";
3
- const LEGACY = ["read_only", "readOnly", "allow", "mcpTools"];
4
- const KINDS = ["personal", "bot"];
5
- const scopes = (config) => new Map([
6
- ...(config.defaults ? [["defaults", config.defaults]] : []),
7
- ...Object.entries(config.profiles).map(([name, scope]) => [`profiles.${name}`, scope]),
8
- ...KINDS.flatMap((kind) => [
9
- ...(config[kind]?.defaults ? [[`${kind}.defaults`, config[kind]?.defaults]] : []),
10
- ...Object.entries(config[kind]?.profiles ?? {}).map(([name, scope]) => [`${kind}.profiles.${name}`, scope]),
11
- ]),
12
- ]);
13
- const levels = (scope) => (scope?.permissions ?? {});
14
- const effective = (config, kind, profile) => {
15
- const own = (profiles) => profile === undefined || !Object.hasOwn(profiles ?? {}, profile) ? undefined : profiles?.[profile];
16
- const layers = [
17
- own(config[kind]?.profiles),
18
- own(config.profiles),
19
- config[kind]?.defaults,
20
- config.defaults,
21
- ];
22
- const nearest = (key) => layers.findIndex((scope) => scope?.[key] !== undefined);
23
- const readOnlyKey = layers.some((scope) => scope?.read_only !== undefined) ? "read_only" : "readOnly";
24
- const readOnly = layers[nearest(readOnlyKey)]?.[readOnlyKey] === true;
25
- const allow = layers[nearest("allow")]?.allow;
26
- const old = fromOldSettings(readOnly, allow, { bot: kind === "bot" });
27
- const oldAt = nearest(readOnly ? readOnlyKey : "allow");
28
- return layerPermissions(layers.flatMap((scope, at) => [
29
- ["", levels(scope)],
30
- ...(at === oldAt ? [["", old]] : []),
31
- ])).levels;
32
- };
33
- /** Input is a schema-validated configuration; legacy fields are checked before any transformation. */
34
- const migrateLegacyPermissionConfig = (input) => {
35
- const before = scopes(input);
36
- for (const [name, scope] of before) {
37
- for (const key of ["read_only", "readOnly"])
38
- if (scope[key] !== undefined && typeof scope[key] !== "boolean")
39
- throw invalid(`${name}.${key} must be true or false`);
40
- if (scope.allow !== undefined &&
41
- (!Array.isArray(scope.allow) || !scope.allow.every((word) => PERMISSIONS.includes(word))))
42
- throw invalid(`${name}.allow must be a list of known actions`);
43
- if (scope.mcpTools !== undefined &&
44
- (!Array.isArray(scope.mcpTools) || !scope.mcpTools.every((word) => typeof word === "string")))
45
- throw invalid(`${name}.mcpTools must be a list`);
46
- if (scope.permissions !== undefined &&
47
- (scope.permissions === null ||
48
- typeof scope.permissions !== "object" ||
49
- Array.isArray(scope.permissions) ||
50
- !Object.values(scope.permissions).every((level) => LEVELS.includes(level))))
51
- throw invalid(`${name}.permissions must contain permission levels`);
52
- }
53
- if (![...before.values()].some((scope) => LEGACY.some((key) => Object.hasOwn(scope, key))))
54
- return { config: input, changed: false, changes: [] };
55
- const next = structuredClone(input);
56
- for (const scope of scopes(next).values())
57
- for (const key of LEGACY)
58
- delete scope[key];
59
- const names = [
60
- ...new Set([...Object.keys(input.profiles), ...KINDS.flatMap((kind) => Object.keys(input[kind]?.profiles ?? {}))]),
61
- ].sort();
62
- const allMaps = KINDS.flatMap((kind) => [
63
- effective(input, kind),
64
- ...names.map((name) => effective(input, kind, name)),
65
- ]);
66
- const keys = [...new Set([...RESOURCES, ...allMaps.flatMap((map) => Object.keys(map))])].sort((a, b) => a.split(".").length - b.split(".").length || a.localeCompare(b));
67
- const root = {
68
- ...effective({ profiles: {}, defaults: input.defaults }, "personal"),
69
- ...effective({ profiles: {}, defaults: input.defaults }, "bot"),
70
- };
71
- next.defaults ??= {};
72
- next.defaults.permissions = root;
73
- const restore = (kind, name) => {
74
- const wanted = effective(input, kind, name);
75
- for (const key of keys.filter((key) => kind === "bot" ? key === "bot" || key.startsWith("bot.") : key !== "bot" && !key.startsWith("bot."))) {
76
- const target = levelFor(wanted, key).level;
77
- if (levelFor(effective(next, kind, name), key).level === target)
78
- continue;
79
- next[kind] ??= {};
80
- const section = next[kind];
81
- let scope;
82
- if (name === undefined) {
83
- section.defaults ??= {};
84
- scope = section.defaults;
85
- }
86
- else {
87
- scope = Object.hasOwn(section.profiles ?? {}, name) ? (section.profiles?.[name] ?? {}) : {};
88
- section.profiles = { ...section.profiles, [name]: scope };
89
- }
90
- scope.permissions = { ...levels(scope), [key]: target };
91
- }
92
- };
93
- // A replacement allow-list must not inherit a permitted child from translated broader defaults.
94
- for (const kind of KINDS) {
95
- restore(kind);
96
- for (const name of names)
97
- restore(kind, name);
98
- }
99
- const after = scopes(next);
100
- const changes = [...new Set([...before.keys(), ...after.keys()])].flatMap((scope) => {
101
- const removed = LEGACY.filter((key) => Object.hasOwn(before.get(scope) ?? {}, key));
102
- const permissions = levels(after.get(scope));
103
- return removed.length > 0 || JSON.stringify(levels(before.get(scope))) !== JSON.stringify(permissions)
104
- ? [{ scope, removed, permissions }]
105
- : [];
106
- });
107
- return { config: next, changed: true, changes };
108
- };
109
- const invalid = (message) => new CliError("configuration_error", message);
110
- export const migratePermissionConfig = (input) => {
111
- const renamed = structuredClone(input);
112
- const changes = [];
113
- const replacements = {
114
- "messages.stats": "stats.messages.show",
115
- "chats.stats": "stats.chats.show",
116
- "tasks.stats": "stats.tasks.show",
117
- "messages.search": "search.messages",
118
- "conversations.search": "search.conversations",
119
- "topics.search": "search.topics",
120
- };
121
- for (const [name, scope] of scopes(renamed)) {
122
- if (!scope.permissions || typeof scope.permissions !== "object" || Array.isArray(scope.permissions))
123
- continue;
124
- const permissions = scope.permissions;
125
- let changed = false;
126
- for (const prefix of ["", "bot."]) {
127
- for (const [from, to] of Object.entries(replacements)) {
128
- const source = `${prefix}${from}`;
129
- for (const old of Object.keys(permissions)) {
130
- if (old !== source && !old.startsWith(`${source}.`))
131
- continue;
132
- const next = `${prefix}${to}${old.slice(source.length)}`;
133
- if (Object.hasOwn(permissions, next) && permissions[next] !== permissions[old])
134
- throw invalid(`${name}.permissions has conflicting ${old} and ${next} — keep one level before migrating`);
135
- permissions[next] = permissions[old];
136
- delete permissions[old];
137
- changed = true;
138
- }
139
- }
140
- }
141
- if (changed)
142
- changes.push({ scope: name, removed: [], permissions: { ...permissions } });
143
- }
144
- const legacy = migrateLegacyPermissionConfig(renamed);
145
- return {
146
- config: legacy.config,
147
- changed: changes.length > 0 || legacy.changed,
148
- changes: [...changes, ...legacy.changes],
149
- };
150
- };
151
- export const hasPermissionConfig = (input) => [...scopes(input).values()].some((scope) => Object.hasOwn(scope, "permissions"));
152
- //# sourceMappingURL=permission-migration.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"permission-migration.js","sourceRoot":"","sources":["../../src/cli/permission-migration.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- import type { Client } from "@modelcontextprotocol/client";
2
- /**
3
- * A client that still speaks one tool per command — `chat_messages_list` — over the three the server
4
- * lists, so a test written against a command's own tool now drives `chat_read` / `chat_write`.
5
- */
6
- export declare const commandsClient: <C extends Pick<Client, "callTool" | "listTools">>(client: C, app: string) => C;
7
- //# sourceMappingURL=mcp-commands-client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-commands-client.d.ts","sourceRoot":"","sources":["../../src/kit/mcp-commands-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AAQ1D;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,MAAM,KAAG,CA+CzG,CAAA"}
@@ -1,50 +0,0 @@
1
- import { commandOf } from "../mcp/surface.js";
2
- const SURFACE = ["tools_search", "read", "write"];
3
- /**
4
- * A client that still speaks one tool per command — `chat_messages_list` — over the three the server
5
- * lists, so a test written against a command's own tool now drives `chat_read` / `chat_write`.
6
- */
7
- export const commandsClient = (client, app) => {
8
- const text = async (call) => {
9
- const result = await client.callTool(call);
10
- const [first] = result.content;
11
- return JSON.parse(first?.text ?? "null");
12
- };
13
- const describe = async (command) => {
14
- const { items } = await text({ name: `${app}_tools_search`, arguments: { query: command } });
15
- const found = items.find((item) => item.command === command);
16
- return found
17
- ? {
18
- name: `${app}_${command.replaceAll(/[ -]/g, "_")}`,
19
- title: found.title,
20
- inputSchema: found.arguments,
21
- annotations: { readOnlyHint: !found.writes },
22
- }
23
- : undefined;
24
- };
25
- return new Proxy(client, {
26
- get(target, property, receiver) {
27
- if (property === "listTools")
28
- return async () => {
29
- const { items } = await text({ name: `${app}_tools_search`, arguments: {} });
30
- const tools = await Promise.all(items.map(({ command }) => describe(command)));
31
- return { tools: tools.filter(Boolean) };
32
- };
33
- if (property === "callTool")
34
- return async (call, ...rest) => {
35
- const key = call.name.slice(app.length + 1);
36
- if (!call.name.startsWith(`${app}_`) || SURFACE.includes(key))
37
- return target.callTool(call, ...rest);
38
- const command = commandOf(key);
39
- const found = await describe(command);
40
- return target.callTool({
41
- ...call,
42
- name: `${app}_${found?.annotations.readOnlyHint === false ? "write" : "read"}`,
43
- arguments: { command, arguments: call.arguments ?? {} },
44
- }, ...rest);
45
- };
46
- return Reflect.get(target, property, receiver);
47
- },
48
- });
49
- };
50
- //# sourceMappingURL=mcp-commands-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-commands-client.js","sourceRoot":"","sources":["../../src/kit/mcp-commands-client.ts"],"names":[],"mappings":"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"}