@wirecat/zoom-cli 0.55.0 → 0.57.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 (170) hide show
  1. package/README.md +4 -4
  2. package/dist/bin/zm.js +35 -5
  3. package/dist/bundle/all-profiles-EKHWTGOY.js +25 -0
  4. package/dist/bundle/answer-policy-KH2IFXPN.js +96 -0
  5. package/dist/bundle/anthropic-VL54IUGF.js +70 -0
  6. package/dist/bundle/bun-ADJVI4HY.js +169 -0
  7. package/dist/bundle/bun-sqlite-2SDA3YOT.js +69 -0
  8. package/dist/bundle/chunk-2IKY7VBH.js +9 -0
  9. package/dist/bundle/chunk-2WOGZDZG.js +431 -0
  10. package/dist/bundle/chunk-4R7HYNZS.js +73 -0
  11. package/dist/bundle/chunk-4VCA7QU3.js +538 -0
  12. package/dist/bundle/chunk-4YLS4YLS.js +29 -0
  13. package/dist/bundle/chunk-5D4AEUVA.js +24783 -0
  14. package/dist/bundle/chunk-5F7IOESV.js +281 -0
  15. package/dist/bundle/chunk-5QESMCQK.js +122 -0
  16. package/dist/bundle/chunk-6M6FJV5D.js +138 -0
  17. package/dist/bundle/chunk-6MX5T6AQ.js +17 -0
  18. package/dist/bundle/chunk-6P3YHT54.js +385 -0
  19. package/dist/bundle/chunk-7A6PZUDR.js +938 -0
  20. package/dist/bundle/chunk-7GUG6UZS.js +884 -0
  21. package/dist/bundle/chunk-7JZJMHQY.js +487 -0
  22. package/dist/bundle/chunk-A4ETXPMZ.js +98 -0
  23. package/dist/bundle/chunk-ADLS6FVG.js +24600 -0
  24. package/dist/bundle/chunk-AE4BOXH7.js +5292 -0
  25. package/dist/bundle/chunk-AN3GVZTU.js +76 -0
  26. package/dist/bundle/chunk-BAYNCCNM.js +215 -0
  27. package/dist/bundle/chunk-BW2WPOXP.js +166 -0
  28. package/dist/bundle/chunk-BW52AJ4R.js +3387 -0
  29. package/dist/bundle/chunk-CB5UTASG.js +18 -0
  30. package/dist/bundle/chunk-CLMXBW53.js +1028 -0
  31. package/dist/bundle/chunk-DCTXOMOR.js +35 -0
  32. package/dist/bundle/chunk-DFDN6AUB.js +21 -0
  33. package/dist/bundle/chunk-EOQFWJJD.js +1095 -0
  34. package/dist/bundle/chunk-G4R4ZIGD.js +3569 -0
  35. package/dist/bundle/chunk-G4VZDINN.js +161 -0
  36. package/dist/bundle/chunk-GARCOIB6.js +409 -0
  37. package/dist/bundle/chunk-GKMGS7G5.js +1938 -0
  38. package/dist/bundle/chunk-HCNMFFG3.js +82 -0
  39. package/dist/bundle/chunk-HG5KRV55.js +1970 -0
  40. package/dist/bundle/chunk-HKYLSIZ2.js +82 -0
  41. package/dist/bundle/chunk-HTQTIKWP.js +928 -0
  42. package/dist/bundle/chunk-I4VQDXFR.js +100 -0
  43. package/dist/bundle/chunk-ICSKEDPI.js +36139 -0
  44. package/dist/bundle/chunk-IP4OK7RQ.js +24 -0
  45. package/dist/bundle/chunk-IVQ6342B.js +2 -0
  46. package/dist/bundle/chunk-K72SEMYI.js +160 -0
  47. package/dist/bundle/chunk-LHRCJYFC.js +19 -0
  48. package/dist/bundle/chunk-LPTIQLDW.js +192 -0
  49. package/dist/bundle/chunk-LQ3T2ZIX.js +124 -0
  50. package/dist/bundle/chunk-LSVI3A5X.js +836 -0
  51. package/dist/bundle/chunk-LW2G4U6W.js +570 -0
  52. package/dist/bundle/chunk-LXB6ONWC.js +3517 -0
  53. package/dist/bundle/chunk-LY26NW3I.js +6848 -0
  54. package/dist/bundle/chunk-MAEFLDHG.js +6092 -0
  55. package/dist/bundle/chunk-MZH4GDR4.js +45 -0
  56. package/dist/bundle/chunk-NN5B24KP.js +1109 -0
  57. package/dist/bundle/chunk-NO7CJEYV.js +22 -0
  58. package/dist/bundle/chunk-NTDWAAGL.js +18435 -0
  59. package/dist/bundle/chunk-NW3X3G5X.js +264 -0
  60. package/dist/bundle/chunk-O66V2WHK.js +48 -0
  61. package/dist/bundle/chunk-OCGPZHXW.js +25 -0
  62. package/dist/bundle/chunk-OIHDCGV4.js +151 -0
  63. package/dist/bundle/chunk-OVSWVPXL.js +8190 -0
  64. package/dist/bundle/chunk-PIN5RZ3D.js +63 -0
  65. package/dist/bundle/chunk-QLIB3PEC.js +1146 -0
  66. package/dist/bundle/chunk-QTR6D5HT.js +58 -0
  67. package/dist/bundle/chunk-QUJPQMHJ.js +2315 -0
  68. package/dist/bundle/chunk-R3HPOCZD.js +188 -0
  69. package/dist/bundle/chunk-RMV4C2YL.js +482 -0
  70. package/dist/bundle/chunk-RRRBMQ2E.js +844 -0
  71. package/dist/bundle/chunk-S4S7E54J.js +60 -0
  72. package/dist/bundle/chunk-SB6WOSHG.js +1109 -0
  73. package/dist/bundle/chunk-SE75DPBY.js +31 -0
  74. package/dist/bundle/chunk-SQJ7EH2D.js +97 -0
  75. package/dist/bundle/chunk-TKCHUT2H.js +422 -0
  76. package/dist/bundle/chunk-TLQUKHEM.js +193 -0
  77. package/dist/bundle/chunk-TZ2MKETI.js +100 -0
  78. package/dist/bundle/chunk-UC44ZMQV.js +78 -0
  79. package/dist/bundle/chunk-UI5UTMSZ.js +275 -0
  80. package/dist/bundle/chunk-VPPYYWOH.js +630 -0
  81. package/dist/bundle/chunk-WJHK5D7Z.js +35612 -0
  82. package/dist/bundle/chunk-WQ24UC44.js +239 -0
  83. package/dist/bundle/chunk-X5DFDGWS.js +2 -0
  84. package/dist/bundle/chunk-Y5E2WNWB.js +35 -0
  85. package/dist/bundle/chunk-YB4DMKYX.js +119 -0
  86. package/dist/bundle/chunk-Z4TZ6TAF.js +288 -0
  87. package/dist/bundle/chunk-ZVVMGPBJ.js +50 -0
  88. package/dist/bundle/cli-72EQATJF.js +825 -0
  89. package/dist/bundle/command-contract-4MHSZUN3.js +38 -0
  90. package/dist/bundle/config-GFIJK6G2.js +79 -0
  91. package/dist/bundle/dist-IBNHCQXT.js +136 -0
  92. package/dist/bundle/dist-XUFQCJXW.js +7577 -0
  93. package/dist/bundle/echarts-RFTK737T.js +42501 -0
  94. package/dist/bundle/embed-7QYA2ZZE.js +35 -0
  95. package/dist/bundle/embedder-YNN6PCHG.js +108 -0
  96. package/dist/bundle/first-run-EVSRQKZJ.js +23 -0
  97. package/dist/bundle/first-screen-RG4GUKW7.js +36 -0
  98. package/dist/bundle/folders-JEPOMYM4.js +13 -0
  99. package/dist/bundle/instructions-FHNL7CMW.js +9 -0
  100. package/dist/bundle/main-NYGJXPH7.js +130 -0
  101. package/dist/bundle/mcp-IXFC2VVR.js +165 -0
  102. package/dist/bundle/mcp-VGSZDCKK.js +189 -0
  103. package/dist/bundle/mcp-XKP2PXLS.js +92 -0
  104. package/dist/bundle/meetings-IBPI4MM4.js +215 -0
  105. package/dist/bundle/node-P4E63KXA.js +2340 -0
  106. package/dist/bundle/node-TLZSIHIJ.js +21 -0
  107. package/dist/bundle/node-ZMCACJVS.js +176 -0
  108. package/dist/bundle/node-sqlite-ZNGOBA5Q.js +45 -0
  109. package/dist/bundle/oauth-Q6LKF7DB.js +17 -0
  110. package/dist/bundle/open-LJ332Y5O.js +19 -0
  111. package/dist/bundle/output-file-RYQZ3RTE.js +63 -0
  112. package/dist/bundle/process-ZPTLNVQS.js +91 -0
  113. package/dist/bundle/program-IBRQBQ6W.js +5845 -0
  114. package/dist/bundle/prompt-RT7GUUXH.js +12 -0
  115. package/dist/bundle/recognize-QXGE7YJH.js +190 -0
  116. package/dist/bundle/remote-FD4MZQV3.js +26 -0
  117. package/dist/bundle/rerank-V6AVV755.js +49 -0
  118. package/dist/bundle/run-log-RE2EI3UU.js +111 -0
  119. package/dist/bundle/serve-HIJTFAW7.js +19 -0
  120. package/dist/bundle/server-3QOXOYYL.js +53 -0
  121. package/dist/bundle/server-WLJCU7KK.js +812 -0
  122. package/dist/bundle/services-KC5KQFBS.js +330 -0
  123. package/dist/bundle/speech-5JOXLYDA.js +44 -0
  124. package/dist/bundle/state-PPGRB3T6.js +33 -0
  125. package/dist/bundle/store-LODVDPK3.js +141 -0
  126. package/dist/bundle/store-WB5BICTG.js +124 -0
  127. package/dist/bundle/store-connection-EG6Z5ITP.js +76 -0
  128. package/dist/bundle/store-maintenance-command-Q5WMFUZ2.js +54 -0
  129. package/dist/bundle/streaming-UGFFNOXL.js +15 -0
  130. package/dist/bundle/tokens-AF5CPY2F.js +17 -0
  131. package/dist/bundle/zm.js +8 -0
  132. package/dist/commands.js +2 -2
  133. package/dist/commands.js.map +1 -1
  134. package/dist/config-issues.d.ts.map +1 -1
  135. package/dist/config-issues.js +3 -0
  136. package/dist/config-issues.js.map +1 -1
  137. package/dist/config.d.ts +3 -0
  138. package/dist/config.d.ts.map +1 -1
  139. package/dist/config.js +23 -0
  140. package/dist/config.js.map +1 -1
  141. package/dist/contract-overrides.d.ts.map +1 -1
  142. package/dist/contract-overrides.js +34 -45
  143. package/dist/contract-overrides.js.map +1 -1
  144. package/dist/first-screen.js +1 -1
  145. package/dist/first-screen.js.map +1 -1
  146. package/dist/mcp-command.d.ts +5 -3
  147. package/dist/mcp-command.d.ts.map +1 -1
  148. package/dist/mcp-command.js +73 -15
  149. package/dist/mcp-command.js.map +1 -1
  150. package/dist/program-bindings.d.ts.map +1 -1
  151. package/dist/program-bindings.js +1 -0
  152. package/dist/program-bindings.js.map +1 -1
  153. package/dist/recording-archive.d.ts.map +1 -1
  154. package/dist/recording-archive.js +9 -4
  155. package/dist/recording-archive.js.map +1 -1
  156. package/dist/remote-http.d.ts +2 -0
  157. package/dist/remote-http.d.ts.map +1 -1
  158. package/dist/remote-http.js +21 -11
  159. package/dist/remote-http.js.map +1 -1
  160. package/dist/request-events.d.ts +12 -0
  161. package/dist/request-events.d.ts.map +1 -1
  162. package/dist/request-events.js +56 -4
  163. package/dist/request-events.js.map +1 -1
  164. package/dist/run.d.ts.map +1 -1
  165. package/dist/run.js +4 -1
  166. package/dist/run.js.map +1 -1
  167. package/dist/version.d.ts +1 -1
  168. package/dist/version.js +1 -1
  169. package/package.json +7 -5
  170. package/skills/zoom-cli/SKILL.md +3 -1
@@ -0,0 +1,31 @@
1
+ import { createRequire as __bundleRequire } from "node:module";
2
+ const require = __bundleRequire(import.meta.url);
3
+ import {
4
+ CliError,
5
+ finite,
6
+ getDotPath,
7
+ maxValue,
8
+ minValue,
9
+ number,
10
+ optional,
11
+ pipe,
12
+ safeParse
13
+ } from "./chunk-AE4BOXH7.js";
14
+ import {
15
+ __name
16
+ } from "./chunk-ZVVMGPBJ.js";
17
+
18
+ // node_modules/.pnpm/@wirecat+cli-core@0.469.0_@wirecat+cli-base@0.65.0_commander@15.0.0_typescript@7.0.2_vi_80b586dbc8b099637a6e461856c2ee6b/node_modules/@wirecat/cli-core/dist/models/options.js
19
+ var checkedOptions = /* @__PURE__ */ __name((provider, schema, options) => {
20
+ const parsed = safeParse(schema, options);
21
+ if (!parsed.success) {
22
+ throw new CliError("validation_error", `${provider} option ${getDotPath(parsed.issues[0]) ?? "options"} is unknown or has the wrong type`);
23
+ }
24
+ return parsed.output;
25
+ }, "checkedOptions");
26
+ var range = /* @__PURE__ */ __name((min, max) => optional(pipe(number(), finite(), minValue(min), maxValue(max))), "range");
27
+
28
+ export {
29
+ checkedOptions,
30
+ range
31
+ };
@@ -0,0 +1,97 @@
1
+ import { createRequire as __bundleRequire } from "node:module";
2
+ const require = __bundleRequire(import.meta.url);
3
+ import {
4
+ checkCancelled
5
+ } from "./chunk-A4ETXPMZ.js";
6
+ import {
7
+ CliError,
8
+ createOutputBuffer
9
+ } from "./chunk-AE4BOXH7.js";
10
+ import {
11
+ __name
12
+ } from "./chunk-ZVVMGPBJ.js";
13
+
14
+ // dist/streaming.js
15
+ var writeStream = /* @__PURE__ */ __name((stream, text, signal) => {
16
+ checkCancelled(signal);
17
+ return new Promise((resolve, reject) => {
18
+ let settled = false;
19
+ let returned = false;
20
+ let callbackDone = false;
21
+ let needsDrain = false;
22
+ let drained = false;
23
+ let callbackFailed = false;
24
+ let errorObserved = false;
25
+ const outputError = /* @__PURE__ */ __name(() => new CliError("configuration_error", "could not write command output"), "outputError");
26
+ const removeGuard = /* @__PURE__ */ __name(() => stream.removeListener("error", failed), "removeGuard");
27
+ const done = /* @__PURE__ */ __name((error) => {
28
+ if (settled)
29
+ return;
30
+ settled = true;
31
+ stream.removeListener("drain", onDrain);
32
+ signal.removeEventListener("abort", aborted);
33
+ if (callbackDone && (!callbackFailed || errorObserved))
34
+ removeGuard();
35
+ if (error)
36
+ reject(error);
37
+ else
38
+ resolve();
39
+ }, "done");
40
+ const finish = /* @__PURE__ */ __name(() => {
41
+ if (returned && callbackDone && (!needsDrain || drained))
42
+ done();
43
+ }, "finish");
44
+ const onDrain = /* @__PURE__ */ __name(() => {
45
+ drained = true;
46
+ finish();
47
+ }, "onDrain");
48
+ const failed = /* @__PURE__ */ __name(() => {
49
+ errorObserved = true;
50
+ done(outputError());
51
+ if (callbackDone)
52
+ removeGuard();
53
+ }, "failed");
54
+ const aborted = /* @__PURE__ */ __name(() => {
55
+ try {
56
+ checkCancelled(signal);
57
+ } catch (error) {
58
+ done(error);
59
+ }
60
+ }, "aborted");
61
+ signal.addEventListener("abort", aborted, { once: true });
62
+ stream.on("error", failed);
63
+ stream.on("drain", onDrain);
64
+ try {
65
+ needsDrain = !stream.write(text, (error) => {
66
+ callbackDone = true;
67
+ callbackFailed = Boolean(error);
68
+ if (error)
69
+ done(outputError());
70
+ else
71
+ finish();
72
+ if (settled && (!callbackFailed || errorObserved))
73
+ removeGuard();
74
+ });
75
+ returned = true;
76
+ finish();
77
+ } catch {
78
+ callbackDone = true;
79
+ errorObserved = true;
80
+ done(outputError());
81
+ }
82
+ });
83
+ }, "writeStream");
84
+ var emitReceipt = /* @__PURE__ */ __name(async (text, maxOutputBytes, write) => {
85
+ const output = createOutputBuffer({ maxOutputBytes });
86
+ output.data(text);
87
+ let serialized = "";
88
+ output.flush((chunk) => {
89
+ serialized += chunk;
90
+ });
91
+ await write(serialized);
92
+ }, "emitReceipt");
93
+
94
+ export {
95
+ writeStream,
96
+ emitReceipt
97
+ };
@@ -0,0 +1,422 @@
1
+ import { createRequire as __bundleRequire } from "node:module";
2
+ const require = __bundleRequire(import.meta.url);
3
+ import {
4
+ CliError
5
+ } from "./chunk-AE4BOXH7.js";
6
+ import {
7
+ __name
8
+ } from "./chunk-ZVVMGPBJ.js";
9
+
10
+ // node_modules/.pnpm/@wirecat+cli-core@0.469.0_@wirecat+cli-base@0.65.0_commander@15.0.0_typescript@7.0.2_vi_80b586dbc8b099637a6e461856c2ee6b/node_modules/@wirecat/cli-core/dist/sends/permissions.js
11
+ var LEVELS = ["deny", "readonly", "ask", "allow"];
12
+ var DANGEROUS = /* @__PURE__ */ new Set(["messages.delete", "bot.messages.delete", "topics.delete", "chats.delete", "chats.clear"]);
13
+ var skipFlagFor = /* @__PURE__ */ __name((key) => DANGEROUS.has(key) ? "--allow-dangerous" : "--yes", "skipFlagFor");
14
+ var DEFAULT_PERMISSIONS = {
15
+ "messages.delete": "ask",
16
+ "account.sessions.end": "ask",
17
+ "bot.messages.delete": "ask",
18
+ "topics.enable": "ask",
19
+ "topics.delete": "ask",
20
+ "chats.delete": "ask",
21
+ "chats.clear": "ask",
22
+ // NEED-568: a rule writes to people with nobody typing a command; it waits for the owner's own allow.
23
+ "replies.send": "deny",
24
+ // NEED-1662: an agent that changes settings, schedules or recipients could lift its own limits; the owner opts in.
25
+ "mcp.authority": "deny",
26
+ // NEED-1663: writes no level stopped before, so MCP could not offer them; over MCP `ask` goes ahead.
27
+ "store.backup": "ask",
28
+ "store.restore": "ask",
29
+ "store.migrate": "ask",
30
+ "store.repair": "ask",
31
+ "store.reset": "ask",
32
+ "store.clear": "ask",
33
+ "store.decrypt": "ask",
34
+ "store.copies.delete": "ask",
35
+ "server.start": "ask",
36
+ "server.stop": "ask",
37
+ "server.restart": "ask",
38
+ "models.download": "ask",
39
+ "images.models.download": "ask",
40
+ "schedule.run": "ask",
41
+ "schedule.exec": "ask",
42
+ "doctor.reports.create": "ask"
43
+ };
44
+ var KEYED_UNDER_HOUSEKEEPING = new Set(Object.keys(DEFAULT_PERMISSIONS).filter((key) => /^(store|server|models|images|schedule|doctor)\./.test(key)));
45
+ var AUTHORITY_KEY = "mcp.authority";
46
+ var authorityAllowed = /* @__PURE__ */ __name((levels) => {
47
+ const { level } = levelFor(levels, AUTHORITY_KEY);
48
+ return level === "allow" || level === "ask";
49
+ }, "authorityAllowed");
50
+ var BOT_API_KEY = "bot.api";
51
+ var isBotApi = /* @__PURE__ */ __name((path) => path[0] === "bot" && path[1] === "api", "isBotApi");
52
+ var botApiAllowed = /* @__PURE__ */ __name((levels) => {
53
+ const { level } = levelFor(levels, BOT_API_KEY, { ...DEFAULT_PERMISSIONS, [BOT_API_KEY]: "deny" });
54
+ return level === "allow" || level === "ask";
55
+ }, "botApiAllowed");
56
+ var RESOURCES = [
57
+ "messages",
58
+ "drafts",
59
+ "reactions",
60
+ "polls",
61
+ "topics",
62
+ "chats",
63
+ "contacts",
64
+ "account",
65
+ "bot",
66
+ "conversations",
67
+ "tags",
68
+ "mentions",
69
+ "search",
70
+ "searches",
71
+ "tasks",
72
+ "replies",
73
+ "attachments",
74
+ "stats",
75
+ "store",
76
+ "metadata",
77
+ "mcp",
78
+ "server",
79
+ "models",
80
+ "schedule",
81
+ "doctor",
82
+ "images"
83
+ ];
84
+ var layerPermissions = /* @__PURE__ */ __name((layers) => {
85
+ const levels = {};
86
+ const sources = {};
87
+ for (const [from, layer] of layers) {
88
+ const nearer = Object.keys(levels);
89
+ for (const [key, level] of Object.entries(layer ?? {})) {
90
+ if (nearer.some((named) => key === named || key.startsWith(`${named}.`)))
91
+ continue;
92
+ levels[key] = level;
93
+ sources[key] = from;
94
+ }
95
+ }
96
+ return { levels, sources };
97
+ }, "layerPermissions");
98
+ var CEILING_KEY = "*";
99
+ var ALLOWED = { level: "allow", key: null };
100
+ var ORDER = { deny: 0, readonly: 1, ask: 2, allow: 3 };
101
+ var nearest = /* @__PURE__ */ __name((levels, key) => {
102
+ for (let parts = key.split("."); parts.length > 0; parts = parts.slice(0, -1)) {
103
+ const named = parts.join(".");
104
+ const level = levels[named];
105
+ if (level)
106
+ return { level, key: named, depth: parts.length };
107
+ }
108
+ return void 0;
109
+ }, "nearest");
110
+ var levelFor = /* @__PURE__ */ __name((permissions, key, defaults = DEFAULT_PERMISSIONS) => {
111
+ const found = profileLevel(permissions, key, defaults);
112
+ const ceiling = permissions[CEILING_KEY];
113
+ return ceiling && ORDER[ceiling] < ORDER[found.level] ? { level: ceiling, key: CEILING_KEY } : found;
114
+ }, "levelFor");
115
+ var profileLevel = /* @__PURE__ */ __name((permissions, key, defaults) => {
116
+ const own = nearest(permissions, key);
117
+ const builtIn = nearest(defaults, key);
118
+ if (!builtIn || own && own.depth >= builtIn.depth)
119
+ return own ? { level: own.level, key: own.key } : ALLOWED;
120
+ if (!own || ORDER[builtIn.level] <= ORDER[own.level])
121
+ return { level: builtIn.level, key: builtIn.key };
122
+ return { level: own.level, key: own.key };
123
+ }, "profileLevel");
124
+ var CHAT_KEYS = {
125
+ settings: "chats.update",
126
+ "requests.accept": "chats.requests.confirm",
127
+ "requests.decline": "chats.requests.reject",
128
+ "link.create": "chats.links.create",
129
+ "link.reset": "chats.links.reset",
130
+ "link.revoke": "chats.links.remove",
131
+ "link.update": "chats.links.update"
132
+ };
133
+ var ACCOUNT_KEYS = {
134
+ "contact-add": "contacts.add",
135
+ "contact-remove": "contacts.remove",
136
+ "contact-import": "contacts.import",
137
+ "contact-rename": "contacts.rename",
138
+ "contact-block": "contacts.block",
139
+ "contact-unblock": "contacts.unblock",
140
+ profile: "account.update",
141
+ "folder-create": "chats.folders.create",
142
+ "folder-update": "chats.folders.update",
143
+ "folder-delete": "chats.folders.delete",
144
+ "folder-order": "chats.folders.order",
145
+ "folder-join": "chats.folders.join",
146
+ "sessions-end": "account.sessions.end",
147
+ "chat-mute": "chats.mute",
148
+ "chat-unmute": "chats.unmute",
149
+ "chat-archive": "chats.archive",
150
+ "chat-unarchive": "chats.unarchive",
151
+ "chat-pin": "chats.pin",
152
+ "chat-unpin": "chats.unpin",
153
+ "chat-mark-unread": "chats.mark-unread",
154
+ "message-star": "messages.star",
155
+ "message-unstar": "messages.unstar",
156
+ privacy: "account.privacy.set"
157
+ };
158
+ var KIND_KEYS = {
159
+ message: "messages.send",
160
+ forward: "messages.forward",
161
+ edit: "messages.edit",
162
+ pin: "messages.pin",
163
+ reaction: "reactions",
164
+ read: "chats.mark-read",
165
+ delete: "messages.delete"
166
+ };
167
+ var keyForWrite = /* @__PURE__ */ __name((kind, action) => {
168
+ if (kind === "chat")
169
+ return CHAT_KEYS[action] ?? `chats.${action ?? "update"}`;
170
+ if (kind === "account") {
171
+ const key = ACCOUNT_KEYS[action];
172
+ if (!key)
173
+ throw new Error(`an account change without a known action: ${action}`);
174
+ return key;
175
+ }
176
+ return KIND_KEYS[kind];
177
+ }, "keyForWrite");
178
+ var writeOfKey = /* @__PURE__ */ __name((key) => {
179
+ const account = Object.entries(ACCOUNT_KEYS).find(([, named]) => named === key)?.[0];
180
+ if (account)
181
+ return { kind: "account", action: account };
182
+ const kind = Object.entries(KIND_KEYS).find(([, named]) => named === key || key.startsWith(`${named}.`))?.[0];
183
+ if (kind)
184
+ return { kind };
185
+ if (key === "messages.unpin")
186
+ return { kind: "pin" };
187
+ if (key.startsWith("chats.")) {
188
+ const action = Object.entries(CHAT_KEYS).find(([, named]) => named === key)?.[0] ?? key.slice("chats.".length);
189
+ return { kind: "chat", action };
190
+ }
191
+ return {};
192
+ }, "writeOfKey");
193
+ var NAMED_WRITE_KEYS = [
194
+ "drafts",
195
+ "store.gaps.repair",
196
+ "messages.sync-first",
197
+ "messages.server-search",
198
+ "messages.press",
199
+ "chats.start",
200
+ "chats.app",
201
+ "stats.messages.counters.sync",
202
+ "stats.messages.show.sync-first",
203
+ "stats.messages.top.sync-first",
204
+ "stats.contacts.top.sync-first",
205
+ "account.sessions.list",
206
+ "attachments.extract",
207
+ "attachments.move",
208
+ "attachments.update",
209
+ "bot.callbacks.answer",
210
+ "bot.chats.action",
211
+ "bot.chats.admins.add",
212
+ "bot.chats.admins.remove",
213
+ "bot.chats.leave",
214
+ "bot.chats.members.remove",
215
+ "bot.chats.moderate",
216
+ "bot.messages.delete",
217
+ "bot.messages.edit",
218
+ "bot.messages.pin",
219
+ "bot.messages.send",
220
+ "bot.messages.unpin",
221
+ "chats.admins.add",
222
+ "chats.admins.remove",
223
+ "chats.links.create",
224
+ "chats.links.reset",
225
+ "chats.links.remove",
226
+ "chats.links.update",
227
+ "chats.members.add",
228
+ "chats.members.remove",
229
+ "chats.moderate",
230
+ "conversations.embeddings",
231
+ "conversations.links",
232
+ "polls.close",
233
+ "polls.create",
234
+ "polls.vote",
235
+ "searches.clear",
236
+ "searches.create",
237
+ "searches.delete",
238
+ "contacts.aliases.set",
239
+ "contacts.aliases.remove",
240
+ "contacts.notes.add",
241
+ "contacts.notes.edit",
242
+ "contacts.notes.remove",
243
+ "tags.rebuild",
244
+ "metadata.sync",
245
+ "mentions.rebuild",
246
+ "mentions.confirm",
247
+ "mentions.reject",
248
+ "tags.add",
249
+ "tags.remove",
250
+ "tasks.add",
251
+ "tasks.claim",
252
+ "tasks.close",
253
+ "tasks.duplicates.defer",
254
+ "tasks.duplicates.reject",
255
+ "tasks.link",
256
+ "tasks.merge",
257
+ "tasks.update",
258
+ "tasks.release",
259
+ "tasks.scan",
260
+ "tasks.unmerge",
261
+ "topics.create",
262
+ "topics.edit",
263
+ "topics.enable"
264
+ ];
265
+ var WRITE_KEYS = [
266
+ .../* @__PURE__ */ new Set([
267
+ ...NAMED_WRITE_KEYS,
268
+ ...Object.keys(DEFAULT_PERMISSIONS),
269
+ ...Object.values(KIND_KEYS),
270
+ ...Object.values(ACCOUNT_KEYS),
271
+ ...Object.values(CHAT_KEYS)
272
+ ])
273
+ ];
274
+ var HOUSEKEEPING = /* @__PURE__ */ new Set([
275
+ "help",
276
+ "guide",
277
+ "config",
278
+ "session",
279
+ "doctor",
280
+ "commands",
281
+ "complete",
282
+ "upgrade",
283
+ "skill",
284
+ "models",
285
+ "server",
286
+ // What a schedule runs is checked by its own key when it runs; an agent runs read-only.
287
+ "schedule",
288
+ "runs",
289
+ "sends",
290
+ "recipients",
291
+ "flood",
292
+ "mcp",
293
+ // Its commands read the rules or flip the pause switch; what a rule sends is checked as `replies.send`.
294
+ "replies"
295
+ ]);
296
+ var BOT_HOUSEKEEPING = /* @__PURE__ */ new Set(["auth", "list", "sends", "recipients", "mcp"]);
297
+ var STORE_MAINTENANCE = /* @__PURE__ */ new Set(["info", "check", "copies"]);
298
+ var SHOW_MESSAGES = /* @__PURE__ */ new Set(["inbox", "review", "watch", "serve", "store", "conversations"]);
299
+ var readKeysForCommand = /* @__PURE__ */ __name((path) => {
300
+ if (path[0] === "bot")
301
+ return readKeysForCommand(path.slice(1)).map((key2) => `bot.${key2}`);
302
+ const key = keyForCommand(path);
303
+ if (!key)
304
+ return [];
305
+ if (path[0] === "attachments" && path[1] === "download")
306
+ return [key, "messages", "chats"];
307
+ if (path[0] === "attachments" && (path[1] === "extract" || path[1] === "show"))
308
+ return [key, "messages"];
309
+ if (path[0] === "store" && path[1] === "gaps" && path[2] === "repair")
310
+ return [key, "messages"];
311
+ if (path[0] === "store" && ["reset", "clear", "decrypt"].includes(path[1] ?? ""))
312
+ return [key, "messages"];
313
+ if (path[0] === "search") {
314
+ if (path[1] === "notes")
315
+ return [key];
316
+ if (path[1] === "topics")
317
+ return [key, "topics"];
318
+ if (path[1] === "conversations")
319
+ return [key, "messages", "conversations"];
320
+ return [key, "messages"];
321
+ }
322
+ if (path[0] !== "stats")
323
+ return [key];
324
+ const resource = path[1] === "charts" ? "chats" : path[1];
325
+ return [
326
+ .../* @__PURE__ */ new Set([
327
+ key,
328
+ "messages",
329
+ ...["chats", "contacts", "tasks"].includes(resource ?? "") ? [resource] : []
330
+ ])
331
+ ];
332
+ }, "readKeysForCommand");
333
+ var keyForCommand = /* @__PURE__ */ __name((path) => {
334
+ if (path.length === 0)
335
+ return null;
336
+ const [top, next] = path;
337
+ if (top === "bot") {
338
+ if (next === void 0 || BOT_HOUSEKEEPING.has(next))
339
+ return null;
340
+ const inner = keyForCommand(path.slice(1));
341
+ return `bot.${inner ?? path.slice(1).join(".")}`;
342
+ }
343
+ if (KEYED_UNDER_HOUSEKEEPING.has(path.join(".")))
344
+ return path.join(".");
345
+ if (top === void 0 || HOUSEKEEPING.has(top) || top === "search" && next === "runs")
346
+ return null;
347
+ if (top === "images" && next === "models")
348
+ return null;
349
+ if (top === "attachments" && (next === "check" || next === "jobs"))
350
+ return null;
351
+ if (top === "attachments" && next === "download")
352
+ return "messages";
353
+ if (top === "store" && next !== void 0 && STORE_MAINTENANCE.has(next))
354
+ return null;
355
+ if (top === "conversations" && next === "links")
356
+ return path[2] === "rebuild" ? "conversations.links.rebuild" : "conversations.links";
357
+ if (top === "conversations" && (next === "embeddings" || next === "embed") || top === "images" && next === "embed" || top === "conversations" && next === "rebuild")
358
+ return "conversations.embeddings";
359
+ if (top === "attachments" && next === "list" || top === "chats" && next === "documents")
360
+ return "messages";
361
+ if (top === "mentions")
362
+ return next === "rebuild" || next === "confirm" || next === "reject" ? `mentions.${next}` : "messages";
363
+ if (top === "store" && (next === "gaps" || next === "jobs"))
364
+ return path.join(".");
365
+ if (SHOW_MESSAGES.has(top) || top === "contacts" && (next === "context" || next === "prepare" || next === "events"))
366
+ return "messages";
367
+ if (RESOURCES.includes(top))
368
+ return path.join(".");
369
+ return void 0;
370
+ }, "keyForCommand");
371
+ var RESOURCE_KEY = new RegExp(`^(${RESOURCES.join("|")})(\\.[a-z][a-z-]*)*$`);
372
+ var COMMAND_PATH_KEY = /^[a-z][a-z-]*(\.[a-zA-Z][a-zA-Z-]*)*$/;
373
+ var permissionOverrides = /* @__PURE__ */ __name((entries = [], shape = RESOURCE_KEY) => {
374
+ const levels = {};
375
+ const example = shape === RESOURCE_KEY ? "messages.send=allow" : "api=readonly";
376
+ for (const entry of entries) {
377
+ const [key = "", level = "", extra] = entry.split("=");
378
+ if (!shape.test(key) || !LEVELS.includes(level) || extra !== void 0)
379
+ throw new CliError("validation_error", `--permission takes a command path and level, e.g. ${example} (deny, readonly, ask, allow)`);
380
+ levels[key] = level;
381
+ }
382
+ return levels;
383
+ }, "permissionOverrides");
384
+ var assertOverridesTighten = /* @__PURE__ */ __name((overrides, profile, defaults = DEFAULT_PERMISSIONS) => {
385
+ for (const [key, level] of Object.entries(overrides)) {
386
+ const under = Object.keys(profile).filter((named) => named.startsWith(`${key}.`));
387
+ const lifted = [key, ...under].find((named) => ORDER[level] > ORDER[levelFor(profile, named, defaults).level]);
388
+ if (lifted !== void 0)
389
+ throw new CliError("validation_error", `--permission ${key}=${level} would loosen ${lifted} from ${levelFor(profile, lifted, defaults).level}; it only tightens \u2014 change the profile's permissions to loosen it`, { key, lifted });
390
+ }
391
+ }, "assertOverridesTighten");
392
+ var assertRetentionEvidenceRead = /* @__PURE__ */ __name((permissions) => {
393
+ for (const permission of ["stats.chats.retention", "chats"]) {
394
+ if (levelFor(permissions, permission).level === "deny")
395
+ throw new CliError("permission_error", `profile denies ${permission}`, { permission });
396
+ }
397
+ }, "assertRetentionEvidenceRead");
398
+
399
+ export {
400
+ LEVELS,
401
+ skipFlagFor,
402
+ DEFAULT_PERMISSIONS,
403
+ AUTHORITY_KEY,
404
+ authorityAllowed,
405
+ BOT_API_KEY,
406
+ isBotApi,
407
+ botApiAllowed,
408
+ RESOURCES,
409
+ layerPermissions,
410
+ CEILING_KEY,
411
+ levelFor,
412
+ keyForWrite,
413
+ writeOfKey,
414
+ WRITE_KEYS,
415
+ readKeysForCommand,
416
+ keyForCommand,
417
+ RESOURCE_KEY,
418
+ COMMAND_PATH_KEY,
419
+ permissionOverrides,
420
+ assertOverridesTighten,
421
+ assertRetentionEvidenceRead
422
+ };