@wirecat/mail-cli 0.0.0-stage → 0.1.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 (226) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/LICENSE +204 -0
  3. package/README.md +141 -2
  4. package/dist/bin/mail.d.ts +3 -0
  5. package/dist/bin/mail.d.ts.map +1 -0
  6. package/dist/bin/mail.js +36 -0
  7. package/dist/bin/mail.js.map +1 -0
  8. package/dist/bundle/all-profiles-TKMBELRZ.js +286 -0
  9. package/dist/bundle/anthropic-7LMUAEIZ.js +72 -0
  10. package/dist/bundle/app-server-JGMIJDD4.js +229 -0
  11. package/dist/bundle/bun-XRO6XJHQ.js +169 -0
  12. package/dist/bundle/bun-sqlite-Z54LEHVM.js +71 -0
  13. package/dist/bundle/chunk-2LLNPNMB.js +24 -0
  14. package/dist/bundle/chunk-3E3WA2L6.js +1932 -0
  15. package/dist/bundle/chunk-3KEVLSNN.js +138 -0
  16. package/dist/bundle/chunk-3KOA73LS.js +3416 -0
  17. package/dist/bundle/chunk-4E7BN3TC.js +122 -0
  18. package/dist/bundle/chunk-4FEMINO2.js +409 -0
  19. package/dist/bundle/chunk-5BVIWP3S.js +71 -0
  20. package/dist/bundle/chunk-5D4AEUVA.js +24783 -0
  21. package/dist/bundle/chunk-5NYMNSSO.js +264 -0
  22. package/dist/bundle/chunk-5WGEUDE4.js +27 -0
  23. package/dist/bundle/chunk-6MAZWSC3.js +132 -0
  24. package/dist/bundle/chunk-75CWWETH.js +379 -0
  25. package/dist/bundle/chunk-7SXGLT6T.js +444 -0
  26. package/dist/bundle/chunk-BTQX2ZSZ.js +288 -0
  27. package/dist/bundle/chunk-CEW6KIFA.js +1193 -0
  28. package/dist/bundle/chunk-CH6RXYAX.js +82 -0
  29. package/dist/bundle/chunk-D72URWJE.js +532 -0
  30. package/dist/bundle/chunk-DFDN6AUB.js +21 -0
  31. package/dist/bundle/chunk-EOEDICIE.js +6848 -0
  32. package/dist/bundle/chunk-F6D6PJ34.js +100 -0
  33. package/dist/bundle/chunk-FDCGTODC.js +78 -0
  34. package/dist/bundle/chunk-FZ5FXIG6.js +18 -0
  35. package/dist/bundle/chunk-GAH7N7HO.js +8181 -0
  36. package/dist/bundle/chunk-GK4M2SUP.js +195 -0
  37. package/dist/bundle/chunk-GN62YOT5.js +161 -0
  38. package/dist/bundle/chunk-GQQJOH7A.js +7050 -0
  39. package/dist/bundle/chunk-GWDCKUBI.js +781 -0
  40. package/dist/bundle/chunk-HTQTIKWP.js +928 -0
  41. package/dist/bundle/chunk-IK5TH3O7.js +217 -0
  42. package/dist/bundle/chunk-J3QXTBD2.js +2742 -0
  43. package/dist/bundle/chunk-J6MSJLIW.js +45 -0
  44. package/dist/bundle/chunk-JBBZCTTF.js +76 -0
  45. package/dist/bundle/chunk-JVMVLITS.js +260 -0
  46. package/dist/bundle/chunk-K4FVKPDQ.js +525 -0
  47. package/dist/bundle/chunk-KHTO2Q6E.js +886 -0
  48. package/dist/bundle/chunk-KM7Q67Z3.js +63 -0
  49. package/dist/bundle/chunk-LQ37ALDJ.js +2416 -0
  50. package/dist/bundle/chunk-MNOIRJEO.js +2315 -0
  51. package/dist/bundle/chunk-MS53RALV.js +168 -0
  52. package/dist/bundle/chunk-NK7EB63L.js +36225 -0
  53. package/dist/bundle/chunk-NPGVOZVK.js +2 -0
  54. package/dist/bundle/chunk-OTUOZ33L.js +82 -0
  55. package/dist/bundle/chunk-P7P5MNAU.js +46 -0
  56. package/dist/bundle/chunk-QLEUNU6G.js +537 -0
  57. package/dist/bundle/chunk-QQB7WT7R.js +216 -0
  58. package/dist/bundle/chunk-QX7RCLRS.js +23 -0
  59. package/dist/bundle/chunk-T6464KYA.js +35130 -0
  60. package/dist/bundle/chunk-TE5U5OAM.js +73 -0
  61. package/dist/bundle/chunk-TI6VBZKJ.js +166 -0
  62. package/dist/bundle/chunk-TQFCPUIM.js +53 -0
  63. package/dist/bundle/chunk-TVREDYX4.js +3574 -0
  64. package/dist/bundle/chunk-TWPDVUBR.js +106 -0
  65. package/dist/bundle/chunk-TWTATDM7.js +461 -0
  66. package/dist/bundle/chunk-UH4DDRHA.js +2989 -0
  67. package/dist/bundle/chunk-VEIZZRQ5.js +630 -0
  68. package/dist/bundle/chunk-WLFLBWNH.js +54 -0
  69. package/dist/bundle/chunk-WXAXYJJ7.js +486 -0
  70. package/dist/bundle/chunk-XQUUANA2.js +24600 -0
  71. package/dist/bundle/chunk-Y5E2WNWB.js +35 -0
  72. package/dist/bundle/chunk-YO4CUH5E.js +33 -0
  73. package/dist/bundle/chunk-YPQQ5J4X.js +849 -0
  74. package/dist/bundle/chunk-Z34ICZA3.js +1028 -0
  75. package/dist/bundle/chunk-ZANYM66S.js +58 -0
  76. package/dist/bundle/chunk-ZD3WUGR2.js +142 -0
  77. package/dist/bundle/chunk-ZVVMGPBJ.js +50 -0
  78. package/dist/bundle/command-contract-WU434ZUL.js +34 -0
  79. package/dist/bundle/decode-YB3ZDTES.js +162 -0
  80. package/dist/bundle/dispatch-EUKKT3PD.js +411 -0
  81. package/dist/bundle/dist-A6GKSKFC.js +2072 -0
  82. package/dist/bundle/dist-X36THCOF.js +7577 -0
  83. package/dist/bundle/echarts-YNGCOYHW.js +42501 -0
  84. package/dist/bundle/embed-LWNHIRBQ.js +37 -0
  85. package/dist/bundle/embedder-2LYD3U37.js +110 -0
  86. package/dist/bundle/failure-OAIC5VAP.js +24 -0
  87. package/dist/bundle/first-run-N3HJKGU7.js +27 -0
  88. package/dist/bundle/first-screen-4U2DMV3G.js +32 -0
  89. package/dist/bundle/instructions-GJHHFV64.js +11 -0
  90. package/dist/bundle/mail.js +166 -0
  91. package/dist/bundle/mcp-L7SRVDRN.js +167 -0
  92. package/dist/bundle/node-GFOH6FKP.js +176 -0
  93. package/dist/bundle/node-KM3CUABH.js +2340 -0
  94. package/dist/bundle/node-TLZSIHIJ.js +21 -0
  95. package/dist/bundle/node-sqlite-NBXQXBIU.js +63 -0
  96. package/dist/bundle/oauth-56EFO5AQ.js +19 -0
  97. package/dist/bundle/open-2V7QZQJP.js +21 -0
  98. package/dist/bundle/openai-V3SVACVL.js +251 -0
  99. package/dist/bundle/process-XVDX4SPD.js +91 -0
  100. package/dist/bundle/program-ILID6EAT.js +35542 -0
  101. package/dist/bundle/prompt-YKWAI222.js +14 -0
  102. package/dist/bundle/recognize-PAR66KVM.js +25 -0
  103. package/dist/bundle/remote-CE43TKXC.js +28 -0
  104. package/dist/bundle/rerank-M7S7P2TW.js +51 -0
  105. package/dist/bundle/serve-ENPMIV6J.js +197 -0
  106. package/dist/bundle/server-JRTHUCVY.js +63 -0
  107. package/dist/bundle/server-MBEZLVKZ.js +189 -0
  108. package/dist/bundle/sqlite-runtime-HVGDHBJJ.js +18 -0
  109. package/dist/bundle/state-QZSOSKBD.js +35 -0
  110. package/dist/bundle/store-2BUX6LVX.js +124 -0
  111. package/dist/bundle/store-UJ7SNKXI.js +141 -0
  112. package/dist/bundle/store-maintenance-command-I7V5C44K.js +52 -0
  113. package/dist/commands/account.d.ts +3 -0
  114. package/dist/commands/account.d.ts.map +1 -0
  115. package/dist/commands/account.js +47 -0
  116. package/dist/commands/account.js.map +1 -0
  117. package/dist/commands/context.d.ts +41 -0
  118. package/dist/commands/context.d.ts.map +1 -0
  119. package/dist/commands/context.js +52 -0
  120. package/dist/commands/context.js.map +1 -0
  121. package/dist/commands/doctor.d.ts +77 -0
  122. package/dist/commands/doctor.d.ts.map +1 -0
  123. package/dist/commands/doctor.js +74 -0
  124. package/dist/commands/doctor.js.map +1 -0
  125. package/dist/commands/folders.d.ts +3 -0
  126. package/dist/commands/folders.d.ts.map +1 -0
  127. package/dist/commands/folders.js +36 -0
  128. package/dist/commands/folders.js.map +1 -0
  129. package/dist/commands/login.d.ts +5 -0
  130. package/dist/commands/login.d.ts.map +1 -0
  131. package/dist/commands/login.js +21 -0
  132. package/dist/commands/login.js.map +1 -0
  133. package/dist/commands/mailbox.d.ts +16 -0
  134. package/dist/commands/mailbox.d.ts.map +1 -0
  135. package/dist/commands/mailbox.js +54 -0
  136. package/dist/commands/mailbox.js.map +1 -0
  137. package/dist/commands/mcp.d.ts +3 -0
  138. package/dist/commands/mcp.d.ts.map +1 -0
  139. package/dist/commands/mcp.js +97 -0
  140. package/dist/commands/mcp.js.map +1 -0
  141. package/dist/commands/session.d.ts +3 -0
  142. package/dist/commands/session.d.ts.map +1 -0
  143. package/dist/commands/session.js +211 -0
  144. package/dist/commands/session.js.map +1 -0
  145. package/dist/commands/setup.d.ts +3 -0
  146. package/dist/commands/setup.d.ts.map +1 -0
  147. package/dist/commands/setup.js +156 -0
  148. package/dist/commands/setup.js.map +1 -0
  149. package/dist/commands/status.d.ts +3 -0
  150. package/dist/commands/status.d.ts.map +1 -0
  151. package/dist/commands/status.js +89 -0
  152. package/dist/commands/status.js.map +1 -0
  153. package/dist/commands/sync.d.ts +3 -0
  154. package/dist/commands/sync.d.ts.map +1 -0
  155. package/dist/commands/sync.js +190 -0
  156. package/dist/commands/sync.js.map +1 -0
  157. package/dist/config.d.ts +190 -0
  158. package/dist/config.d.ts.map +1 -0
  159. package/dist/config.js +46 -0
  160. package/dist/config.js.map +1 -0
  161. package/dist/discovery.d.ts +42 -0
  162. package/dist/discovery.d.ts.map +1 -0
  163. package/dist/discovery.js +179 -0
  164. package/dist/discovery.js.map +1 -0
  165. package/dist/identity.d.ts +5 -0
  166. package/dist/identity.d.ts.map +1 -0
  167. package/dist/identity.js +16 -0
  168. package/dist/identity.js.map +1 -0
  169. package/dist/index.d.ts +3 -0
  170. package/dist/index.d.ts.map +1 -0
  171. package/dist/index.js +3 -0
  172. package/dist/index.js.map +1 -0
  173. package/dist/mail/imap-errors.d.ts +4 -0
  174. package/dist/mail/imap-errors.d.ts.map +1 -0
  175. package/dist/mail/imap-errors.js +41 -0
  176. package/dist/mail/imap-errors.js.map +1 -0
  177. package/dist/mail/imap-messages.d.ts +18 -0
  178. package/dist/mail/imap-messages.d.ts.map +1 -0
  179. package/dist/mail/imap-messages.js +66 -0
  180. package/dist/mail/imap-messages.js.map +1 -0
  181. package/dist/mail/imap.d.ts +67 -0
  182. package/dist/mail/imap.d.ts.map +1 -0
  183. package/dist/mail/imap.js +348 -0
  184. package/dist/mail/imap.js.map +1 -0
  185. package/dist/mail/parse.d.ts +18 -0
  186. package/dist/mail/parse.d.ts.map +1 -0
  187. package/dist/mail/parse.js +31 -0
  188. package/dist/mail/parse.js.map +1 -0
  189. package/dist/mail/port.d.ts +50 -0
  190. package/dist/mail/port.d.ts.map +1 -0
  191. package/dist/mail/port.js +4 -0
  192. package/dist/mail/port.js.map +1 -0
  193. package/dist/mcp.d.ts +29 -0
  194. package/dist/mcp.d.ts.map +1 -0
  195. package/dist/mcp.js +98 -0
  196. package/dist/mcp.js.map +1 -0
  197. package/dist/profile.d.ts +16 -0
  198. package/dist/profile.d.ts.map +1 -0
  199. package/dist/profile.js +31 -0
  200. package/dist/profile.js.map +1 -0
  201. package/dist/program.d.ts +6 -0
  202. package/dist/program.d.ts.map +1 -0
  203. package/dist/program.js +52 -0
  204. package/dist/program.js.map +1 -0
  205. package/dist/providers.d.ts +53 -0
  206. package/dist/providers.d.ts.map +1 -0
  207. package/dist/providers.js +106 -0
  208. package/dist/providers.js.map +1 -0
  209. package/dist/secret.d.ts +30 -0
  210. package/dist/secret.d.ts.map +1 -0
  211. package/dist/secret.js +68 -0
  212. package/dist/secret.js.map +1 -0
  213. package/dist/store.d.ts +12 -0
  214. package/dist/store.d.ts.map +1 -0
  215. package/dist/store.js +25 -0
  216. package/dist/store.js.map +1 -0
  217. package/dist/sync.d.ts +26 -0
  218. package/dist/sync.d.ts.map +1 -0
  219. package/dist/sync.js +75 -0
  220. package/dist/sync.js.map +1 -0
  221. package/dist/version.d.ts +2 -0
  222. package/dist/version.d.ts.map +1 -0
  223. package/dist/version.js +2 -0
  224. package/dist/version.js.map +1 -0
  225. package/package.json +83 -4
  226. package/skills/mail-cli/SKILL.md +27 -0
@@ -0,0 +1,2 @@
1
+ import { createRequire as __bundleRequire } from "node:module";
2
+ const require = __bundleRequire(import.meta.url);
@@ -0,0 +1,82 @@
1
+ import { createRequire as __bundleRequire } from "node:module";
2
+ const require = __bundleRequire(import.meta.url);
3
+ import {
4
+ MAX_SECRET_INPUT,
5
+ bufferedInput,
6
+ inputPolicy
7
+ } from "./chunk-CH6RXYAX.js";
8
+ import {
9
+ CliError
10
+ } from "./chunk-5BVIWP3S.js";
11
+ import {
12
+ __name
13
+ } from "./chunk-ZVVMGPBJ.js";
14
+
15
+ // node_modules/.pnpm/@wirecat+cli-core@0.507.0_@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_type_d5beb0101c7a90701cc33879a5be8d28/node_modules/@wirecat/cli-core/dist/terminal/prompt.js
16
+ import { createInterface } from "node:readline";
17
+ import { Writable } from "node:stream";
18
+ var readSecret = /* @__PURE__ */ __name(async (prompt, { input = process.stdin, output = process.stderr, echo = false, signal: givenSignal } = {}) => {
19
+ const policy = inputPolicy(input);
20
+ const signals = [givenSignal, policy.signal].filter((one) => one !== void 0);
21
+ const signal = signals.length ? AbortSignal.any(signals) : void 0;
22
+ const cancelled = /* @__PURE__ */ __name(() => new CliError("cancelled", "cancelled \u2014 nothing was stored"), "cancelled");
23
+ if (signal?.aborted)
24
+ throw cancelled();
25
+ if (input.isTTY && policy.noInput)
26
+ throw new CliError("validation_error", "interactive input is disabled \u2014 provide the input through a pipe", {
27
+ reason: "input.required"
28
+ });
29
+ if (!input.isTTY) {
30
+ return (await bufferedInput(input, {
31
+ maxBytes: Math.min(policy.maxBytes ?? MAX_SECRET_INPUT, MAX_SECRET_INPUT),
32
+ ...signal ? { signal } : {}
33
+ })).toString("utf8").trim();
34
+ }
35
+ let muted = false;
36
+ const shim = new Writable({
37
+ write(chunk, _encoding, done) {
38
+ if (!muted)
39
+ output.write(chunk);
40
+ done();
41
+ }
42
+ });
43
+ const reader = createInterface({ input, output: shim, terminal: true });
44
+ const abort = /* @__PURE__ */ __name(() => reader.close(), "abort");
45
+ let bytes = 0;
46
+ let inputFailure;
47
+ const data = /* @__PURE__ */ __name((chunk) => {
48
+ bytes += Buffer.byteLength(chunk);
49
+ if (bytes > Math.min(policy.maxBytes ?? MAX_SECRET_INPUT, MAX_SECRET_INPUT)) {
50
+ inputFailure = new CliError("validation_error", "secret input exceeds its byte limit", {
51
+ reason: "input.too-large",
52
+ retryable: false
53
+ });
54
+ reader.close();
55
+ }
56
+ }, "data");
57
+ const inputError = /* @__PURE__ */ __name((error) => {
58
+ inputFailure = error;
59
+ reader.close();
60
+ }, "inputError");
61
+ input.on("data", data).on("error", inputError);
62
+ try {
63
+ const answer = await new Promise((resolve, reject) => {
64
+ const cancel = /* @__PURE__ */ __name(() => reject(inputFailure ?? cancelled()), "cancel");
65
+ reader.once("SIGINT", cancel);
66
+ reader.once("close", cancel);
67
+ signal?.addEventListener("abort", abort, { once: true });
68
+ reader.question(prompt, resolve);
69
+ muted = !echo;
70
+ });
71
+ return answer.trim();
72
+ } finally {
73
+ input.off("data", data).off("error", inputError);
74
+ signal?.removeEventListener("abort", abort);
75
+ reader.close();
76
+ output.write("\n");
77
+ }
78
+ }, "readSecret");
79
+
80
+ export {
81
+ readSecret
82
+ };
@@ -0,0 +1,46 @@
1
+ import { createRequire as __bundleRequire } from "node:module";
2
+ const require = __bundleRequire(import.meta.url);
3
+ import {
4
+ __name
5
+ } from "./chunk-ZVVMGPBJ.js";
6
+
7
+ // node_modules/.pnpm/@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_typescript@7.0.2_vitest@5.0.5/node_modules/@wirecat/cli-base/dist/executable.js
8
+ import { existsSync } from "node:fs";
9
+ import { win32 } from "node:path";
10
+ var variable = /* @__PURE__ */ __name((env, name) => Object.entries(env).find(([key]) => key.toUpperCase() === name)?.[1], "variable");
11
+ var executableOnPath = /* @__PURE__ */ __name((command, env, platform = process.platform, exists = existsSync) => {
12
+ if (platform !== "win32" || win32.isAbsolute(command))
13
+ return command;
14
+ if (/[\\/]/.test(command))
15
+ return command;
16
+ const extensions = win32.extname(command) ? [""] : (variable(env, "PATHEXT") ?? ".EXE;.COM;.CMD;.BAT").split(";").filter((ext) => /^\.[a-z0-9]+$/i.test(ext));
17
+ for (const entry of (variable(env, "PATH") ?? "").split(";")) {
18
+ const directory = entry.replace(/^"(.*)"$/, "$1");
19
+ for (const extension of extensions) {
20
+ const candidate = win32.join(directory, command + extension);
21
+ if (exists(candidate))
22
+ return candidate;
23
+ }
24
+ }
25
+ return command;
26
+ }, "executableOnPath");
27
+ var executableEnvironment = /* @__PURE__ */ __name((env, platform = process.platform) => {
28
+ if (platform !== "win32")
29
+ return env;
30
+ const configured = variable(env, "COMSPEC");
31
+ const system = variable(env, "SYSTEMROOT");
32
+ const shell = configured ? configured : system && win32.isAbsolute(system) ? win32.join(system, "System32", "cmd.exe") : void 0;
33
+ if (!shell)
34
+ return env;
35
+ const result = { ...env };
36
+ for (const key of Object.keys(result))
37
+ if (key.toUpperCase() === "COMSPEC")
38
+ delete result[key];
39
+ result.comspec = shell;
40
+ return result;
41
+ }, "executableEnvironment");
42
+
43
+ export {
44
+ executableOnPath,
45
+ executableEnvironment
46
+ };
@@ -0,0 +1,537 @@
1
+ import { createRequire as __bundleRequire } from "node:module";
2
+ const require = __bundleRequire(import.meta.url);
3
+ import {
4
+ createRenderer,
5
+ fieldsOf,
6
+ processStreams,
7
+ projectFields
8
+ } from "./chunk-J3QXTBD2.js";
9
+ import {
10
+ CliError,
11
+ singleLine
12
+ } from "./chunk-5BVIWP3S.js";
13
+ import {
14
+ __name
15
+ } from "./chunk-ZVVMGPBJ.js";
16
+
17
+ // node_modules/.pnpm/@wirecat+cli-core@0.507.0_@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_type_d5beb0101c7a90701cc33879a5be8d28/node_modules/@wirecat/cli-core/dist/sends/permissions.js
18
+ var LEVELS = ["deny", "readonly", "ask", "allow"];
19
+ var DANGEROUS = /* @__PURE__ */ new Set(["messages.delete", "bot.messages.delete", "topics.delete", "chats.delete", "chats.clear"]);
20
+ var skipFlagFor = /* @__PURE__ */ __name((key) => DANGEROUS.has(key) ? "--allow-dangerous" : "--yes", "skipFlagFor");
21
+ var DEFAULT_PERMISSIONS = {
22
+ "messages.delete": "ask",
23
+ "account.sessions.end": "ask",
24
+ "bot.messages.delete": "ask",
25
+ "topics.enable": "ask",
26
+ "topics.delete": "ask",
27
+ "chats.delete": "ask",
28
+ "chats.clear": "ask",
29
+ // NEED-568: a rule writes to people with nobody typing a command; it waits for the owner's own allow.
30
+ "replies.send": "deny",
31
+ // NEED-1662: an agent that changes settings, schedules or recipients could lift its own limits; the owner opts in.
32
+ "mcp.authority": "deny",
33
+ // NEED-1663: writes no level stopped before, so MCP could not offer them; over MCP `ask` goes ahead.
34
+ "store.backup": "ask",
35
+ "store.restore": "ask",
36
+ "store.migrate": "ask",
37
+ "store.repair": "ask",
38
+ "store.reset": "ask",
39
+ "store.clear": "ask",
40
+ "store.decrypt": "ask",
41
+ "store.copies.delete": "ask",
42
+ "server.start": "ask",
43
+ "server.stop": "ask",
44
+ "server.restart": "ask",
45
+ "models.download": "ask",
46
+ "images.models.download": "ask",
47
+ "schedule.run": "ask",
48
+ "schedule.exec": "ask",
49
+ "doctor.reports.create": "ask"
50
+ };
51
+ var KEYED_UNDER_HOUSEKEEPING = new Set(Object.keys(DEFAULT_PERMISSIONS).filter((key) => /^(store|server|models|images|schedule|doctor)\./.test(key)));
52
+ var AUTHORITY_KEY = "mcp.authority";
53
+ var authorityAllowed = /* @__PURE__ */ __name((levels) => {
54
+ const { level } = levelFor(levels, AUTHORITY_KEY);
55
+ return level === "allow" || level === "ask";
56
+ }, "authorityAllowed");
57
+ var BOT_API_KEY = "bot.api";
58
+ var isBotApi = /* @__PURE__ */ __name((path) => path[0] === "bot" && path[1] === "api", "isBotApi");
59
+ var botApiAllowed = /* @__PURE__ */ __name((levels) => {
60
+ const { level } = levelFor(levels, BOT_API_KEY, { ...DEFAULT_PERMISSIONS, [BOT_API_KEY]: "deny" });
61
+ return level === "allow" || level === "ask";
62
+ }, "botApiAllowed");
63
+ var RESOURCES = [
64
+ "messages",
65
+ "drafts",
66
+ "reactions",
67
+ "polls",
68
+ "topics",
69
+ "chats",
70
+ "contacts",
71
+ "account",
72
+ "bot",
73
+ "conversations",
74
+ "tags",
75
+ "mentions",
76
+ "search",
77
+ "searches",
78
+ "tasks",
79
+ "replies",
80
+ "attachments",
81
+ "stats",
82
+ "store",
83
+ "metadata",
84
+ "mcp",
85
+ "server",
86
+ "models",
87
+ "schedule",
88
+ "doctor",
89
+ "images"
90
+ ];
91
+ var layerPermissions = /* @__PURE__ */ __name((layers) => {
92
+ const levels = {};
93
+ const sources = {};
94
+ for (const [from, layer] of layers) {
95
+ const nearer = Object.keys(levels);
96
+ for (const [key, level] of Object.entries(layer ?? {})) {
97
+ if (nearer.some((named2) => key === named2 || key.startsWith(`${named2}.`)))
98
+ continue;
99
+ levels[key] = level;
100
+ sources[key] = from;
101
+ }
102
+ }
103
+ return { levels, sources };
104
+ }, "layerPermissions");
105
+ var CEILING_KEY = "*";
106
+ var ALLOWED = { level: "allow", key: null };
107
+ var ORDER = { deny: 0, readonly: 1, ask: 2, allow: 3 };
108
+ var nearest = /* @__PURE__ */ __name((levels, key) => {
109
+ for (let parts = key.split("."); parts.length > 0; parts = parts.slice(0, -1)) {
110
+ const named2 = parts.join(".");
111
+ const level = levels[named2];
112
+ if (level)
113
+ return { level, key: named2, depth: parts.length };
114
+ }
115
+ return void 0;
116
+ }, "nearest");
117
+ var levelFor = /* @__PURE__ */ __name((permissions, key, defaults = DEFAULT_PERMISSIONS) => {
118
+ const found = profileLevel(permissions, key, defaults);
119
+ const ceiling = permissions[CEILING_KEY];
120
+ return ceiling && ORDER[ceiling] < ORDER[found.level] ? { level: ceiling, key: CEILING_KEY } : found;
121
+ }, "levelFor");
122
+ var profileLevel = /* @__PURE__ */ __name((permissions, key, defaults) => {
123
+ const own = nearest(permissions, key);
124
+ const builtIn = nearest(defaults, key);
125
+ if (!builtIn || own && own.depth >= builtIn.depth)
126
+ return own ? { level: own.level, key: own.key } : ALLOWED;
127
+ if (!own || ORDER[builtIn.level] <= ORDER[own.level])
128
+ return { level: builtIn.level, key: builtIn.key };
129
+ return { level: own.level, key: own.key };
130
+ }, "profileLevel");
131
+ var CHAT_KEYS = {
132
+ settings: "chats.update",
133
+ "requests.accept": "chats.requests.confirm",
134
+ "requests.decline": "chats.requests.reject",
135
+ "link.create": "chats.links.create",
136
+ "link.reset": "chats.links.reset",
137
+ "link.revoke": "chats.links.remove",
138
+ "link.update": "chats.links.update"
139
+ };
140
+ var ACCOUNT_KEYS = {
141
+ "contact-add": "contacts.add",
142
+ "contact-remove": "contacts.remove",
143
+ "contact-import": "contacts.import",
144
+ "contact-rename": "contacts.rename",
145
+ "contact-block": "contacts.block",
146
+ "contact-unblock": "contacts.unblock",
147
+ profile: "account.update",
148
+ "folder-create": "chats.folders.create",
149
+ "folder-update": "chats.folders.update",
150
+ "folder-delete": "chats.folders.delete",
151
+ "folder-order": "chats.folders.order",
152
+ "folder-join": "chats.folders.join",
153
+ "sessions-end": "account.sessions.end",
154
+ "chat-mute": "chats.mute",
155
+ "chat-unmute": "chats.unmute",
156
+ "chat-archive": "chats.archive",
157
+ "chat-unarchive": "chats.unarchive",
158
+ "chat-pin": "chats.pin",
159
+ "chat-unpin": "chats.unpin",
160
+ "chat-mark-unread": "chats.mark-unread",
161
+ "message-star": "messages.star",
162
+ "message-unstar": "messages.unstar",
163
+ privacy: "account.privacy.set"
164
+ };
165
+ var KIND_KEYS = {
166
+ message: "messages.send",
167
+ forward: "messages.forward",
168
+ edit: "messages.edit",
169
+ pin: "messages.pin",
170
+ reaction: "reactions",
171
+ read: "chats.mark-read",
172
+ delete: "messages.delete"
173
+ };
174
+ var keyForWrite = /* @__PURE__ */ __name((kind, action) => {
175
+ if (kind === "chat")
176
+ return CHAT_KEYS[action] ?? `chats.${action ?? "update"}`;
177
+ if (kind === "account") {
178
+ const key = ACCOUNT_KEYS[action];
179
+ if (!key)
180
+ throw new Error(`an account change without a known action: ${action}`);
181
+ return key;
182
+ }
183
+ return KIND_KEYS[kind];
184
+ }, "keyForWrite");
185
+ var writeOfKey = /* @__PURE__ */ __name((key) => {
186
+ const account = Object.entries(ACCOUNT_KEYS).find(([, named2]) => named2 === key)?.[0];
187
+ if (account)
188
+ return { kind: "account", action: account };
189
+ const kind = Object.entries(KIND_KEYS).find(([, named2]) => named2 === key || key.startsWith(`${named2}.`))?.[0];
190
+ if (kind)
191
+ return { kind };
192
+ if (key === "messages.unpin")
193
+ return { kind: "pin" };
194
+ if (key.startsWith("chats.")) {
195
+ const action = Object.entries(CHAT_KEYS).find(([, named2]) => named2 === key)?.[0] ?? key.slice("chats.".length);
196
+ return { kind: "chat", action };
197
+ }
198
+ return {};
199
+ }, "writeOfKey");
200
+ var NAMED_WRITE_KEYS = [
201
+ "drafts",
202
+ "store.gaps.repair",
203
+ "messages.sync-first",
204
+ "messages.server-search",
205
+ "messages.press",
206
+ "chats.start",
207
+ "chats.app",
208
+ "stats.messages.counters.sync",
209
+ "stats.messages.show.sync-first",
210
+ "stats.messages.top.sync-first",
211
+ "stats.contacts.top.sync-first",
212
+ "account.sessions.list",
213
+ "attachments.extract",
214
+ "attachments.move",
215
+ "attachments.update",
216
+ "bot.callbacks.answer",
217
+ "bot.chats.action",
218
+ "bot.chats.admins.add",
219
+ "bot.chats.admins.remove",
220
+ "bot.chats.leave",
221
+ "bot.chats.members.remove",
222
+ "bot.chats.moderate",
223
+ "bot.messages.delete",
224
+ "bot.messages.edit",
225
+ "bot.messages.pin",
226
+ "bot.messages.send",
227
+ "bot.messages.unpin",
228
+ "chats.admins.add",
229
+ "chats.admins.remove",
230
+ "chats.links.create",
231
+ "chats.links.reset",
232
+ "chats.links.remove",
233
+ "chats.links.update",
234
+ "chats.members.add",
235
+ "chats.members.remove",
236
+ "chats.moderate",
237
+ "conversations.embeddings",
238
+ "conversations.links",
239
+ "polls.close",
240
+ "polls.create",
241
+ "polls.vote",
242
+ "searches.clear",
243
+ "searches.create",
244
+ "searches.delete",
245
+ "contacts.aliases.set",
246
+ "contacts.aliases.remove",
247
+ "contacts.notes.add",
248
+ "contacts.notes.edit",
249
+ "contacts.notes.remove",
250
+ "tags.rebuild",
251
+ "metadata.sync",
252
+ "mentions.rebuild",
253
+ "mentions.confirm",
254
+ "mentions.reject",
255
+ "tags.add",
256
+ "tags.remove",
257
+ "tasks.add",
258
+ "tasks.claim",
259
+ "tasks.close",
260
+ "tasks.duplicates.defer",
261
+ "tasks.duplicates.reject",
262
+ "tasks.link",
263
+ "tasks.merge",
264
+ "tasks.update",
265
+ "tasks.release",
266
+ "tasks.scan",
267
+ "tasks.unmerge",
268
+ "topics.create",
269
+ "topics.edit",
270
+ "topics.enable"
271
+ ];
272
+ var WRITE_KEYS = [
273
+ .../* @__PURE__ */ new Set([
274
+ ...NAMED_WRITE_KEYS,
275
+ ...Object.keys(DEFAULT_PERMISSIONS),
276
+ ...Object.values(KIND_KEYS),
277
+ ...Object.values(ACCOUNT_KEYS),
278
+ ...Object.values(CHAT_KEYS)
279
+ ])
280
+ ];
281
+ var HOUSEKEEPING = /* @__PURE__ */ new Set([
282
+ "help",
283
+ "guide",
284
+ "config",
285
+ "session",
286
+ "doctor",
287
+ "commands",
288
+ "complete",
289
+ "upgrade",
290
+ "skill",
291
+ "models",
292
+ "server",
293
+ // What a schedule runs is checked by its own key when it runs; an agent runs read-only.
294
+ "schedule",
295
+ "runs",
296
+ "sends",
297
+ "recipients",
298
+ "flood",
299
+ "mcp",
300
+ // Its commands read the rules or flip the pause switch; what a rule sends is checked as `replies.send`.
301
+ "replies"
302
+ ]);
303
+ var BOT_HOUSEKEEPING = /* @__PURE__ */ new Set(["auth", "list", "sends", "recipients", "mcp"]);
304
+ var STORE_MAINTENANCE = /* @__PURE__ */ new Set(["info", "check", "copies"]);
305
+ var SHOW_MESSAGES = /* @__PURE__ */ new Set(["inbox", "review", "watch", "serve", "store", "conversations", "projects"]);
306
+ var readKeysForCommand = /* @__PURE__ */ __name((path) => {
307
+ if (path[0] === "bot")
308
+ return readKeysForCommand(path.slice(1)).map((key2) => `bot.${key2}`);
309
+ const key = keyForCommand(path);
310
+ if (!key)
311
+ return [];
312
+ if (path[0] === "attachments" && path[1] === "download")
313
+ return [key, "messages", "chats"];
314
+ if (path[0] === "attachments" && (path[1] === "extract" || path[1] === "show"))
315
+ return [key, "messages"];
316
+ if (path[0] === "store" && path[1] === "gaps" && path[2] === "repair")
317
+ return [key, "messages"];
318
+ if (path[0] === "store" && ["reset", "clear", "decrypt"].includes(path[1] ?? ""))
319
+ return [key, "messages"];
320
+ if (path[0] === "search") {
321
+ if (path[1] === "notes")
322
+ return [key];
323
+ if (path[1] === "topics")
324
+ return [key, "topics"];
325
+ if (path[1] === "conversations")
326
+ return [key, "messages", "conversations"];
327
+ return [key, "messages"];
328
+ }
329
+ if (path[0] !== "stats")
330
+ return [key];
331
+ const resource = path[1] === "charts" ? "chats" : path[1];
332
+ return [
333
+ .../* @__PURE__ */ new Set([
334
+ key,
335
+ "messages",
336
+ ...["chats", "contacts", "tasks"].includes(resource ?? "") ? [resource] : []
337
+ ])
338
+ ];
339
+ }, "readKeysForCommand");
340
+ var keyForCommand = /* @__PURE__ */ __name((path) => {
341
+ if (path.length === 0)
342
+ return null;
343
+ const [top, next] = path;
344
+ if (top === "bot") {
345
+ if (next === void 0 || BOT_HOUSEKEEPING.has(next))
346
+ return null;
347
+ const inner = keyForCommand(path.slice(1));
348
+ return `bot.${inner ?? path.slice(1).join(".")}`;
349
+ }
350
+ if (KEYED_UNDER_HOUSEKEEPING.has(path.join(".")))
351
+ return path.join(".");
352
+ if (top === void 0 || HOUSEKEEPING.has(top) || top === "search" && next === "runs")
353
+ return null;
354
+ if (top === "images" && next === "models")
355
+ return null;
356
+ if (top === "attachments" && (next === "check" || next === "jobs"))
357
+ return null;
358
+ if (top === "attachments" && next === "download")
359
+ return "messages";
360
+ if (top === "store" && next !== void 0 && STORE_MAINTENANCE.has(next))
361
+ return null;
362
+ if (top === "conversations" && next === "links")
363
+ return path[2] === "rebuild" ? "conversations.links.rebuild" : "conversations.links";
364
+ if (top === "conversations" && (next === "embeddings" || next === "embed") || top === "images" && next === "embed" || top === "conversations" && next === "rebuild")
365
+ return "conversations.embeddings";
366
+ if (top === "attachments" && next === "list" || top === "chats" && next === "documents")
367
+ return "messages";
368
+ if (top === "mentions")
369
+ return next === "rebuild" || next === "confirm" || next === "reject" ? `mentions.${next}` : "messages";
370
+ if (top === "store" && (next === "gaps" || next === "jobs"))
371
+ return path.join(".");
372
+ if (SHOW_MESSAGES.has(top) || top === "contacts" && (next === "context" || next === "prepare" || next === "events"))
373
+ return "messages";
374
+ if (RESOURCES.includes(top))
375
+ return path.join(".");
376
+ return void 0;
377
+ }, "keyForCommand");
378
+ var RESOURCE_KEY = new RegExp(`^(${RESOURCES.join("|")})(\\.[a-z][a-z-]*)*$`);
379
+ var COMMAND_PATH_KEY = /^[a-z][a-z-]*(\.[a-zA-Z][a-zA-Z-]*)*$/;
380
+ var permissionOverrides = /* @__PURE__ */ __name((entries = [], shape = RESOURCE_KEY) => {
381
+ const levels = {};
382
+ const example = shape === RESOURCE_KEY ? "messages.send=allow" : "api=readonly";
383
+ for (const entry of entries) {
384
+ const [key = "", level = "", extra] = entry.split("=");
385
+ if (!shape.test(key) || !LEVELS.includes(level) || extra !== void 0)
386
+ throw new CliError("validation_error", `--permission takes a command path and level, e.g. ${example} (deny, readonly, ask, allow)`);
387
+ levels[key] = level;
388
+ }
389
+ return levels;
390
+ }, "permissionOverrides");
391
+ var assertOverridesTighten = /* @__PURE__ */ __name((overrides, profile, defaults = DEFAULT_PERMISSIONS) => {
392
+ for (const [key, level] of Object.entries(overrides)) {
393
+ const under = Object.keys(profile).filter((named2) => named2.startsWith(`${key}.`));
394
+ const lifted = [key, ...under].find((named2) => ORDER[level] > ORDER[levelFor(profile, named2, defaults).level]);
395
+ if (lifted !== void 0)
396
+ 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 });
397
+ }
398
+ }, "assertOverridesTighten");
399
+ var assertRetentionEvidenceRead = /* @__PURE__ */ __name((permissions) => {
400
+ for (const permission of ["stats.chats.retention", "chats"]) {
401
+ if (levelFor(permissions, permission).level === "deny")
402
+ throw new CliError("permission_error", `profile denies ${permission}`, { permission });
403
+ }
404
+ }, "assertRetentionEvidenceRead");
405
+
406
+ // node_modules/.pnpm/@wirecat+cli-core@0.507.0_@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_type_d5beb0101c7a90701cc33879a5be8d28/node_modules/@wirecat/cli-core/dist/cli/result-fields.js
407
+ var named = /* @__PURE__ */ __name((work) => {
408
+ try {
409
+ return work();
410
+ } catch (error) {
411
+ if (error instanceof CliError && error.code === "validation_error")
412
+ throw new CliError("validation_error", "--json takes comma-separated field paths, for example --json=id,text", {
413
+ param: "--json"
414
+ });
415
+ throw error;
416
+ }
417
+ }, "named");
418
+ var fieldsOf2 = /* @__PURE__ */ __name((value) => named(() => fieldsOf(value)), "fieldsOf");
419
+ var projectCommands = /* @__PURE__ */ __name((commands, fields) => commands.map((command) => ({
420
+ ...projectFields(command, fields),
421
+ path: command.path,
422
+ name: command.name,
423
+ origin: command.origin,
424
+ effects: command.effects,
425
+ commands: projectCommands(command.commands, fields)
426
+ })), "projectCommands");
427
+ var projectFields2 = /* @__PURE__ */ __name((value, fields) => named(() => {
428
+ if (value && typeof value === "object" && "cli" in value && typeof value.cli === "string" && "contract" in value && "commands" in value && Array.isArray(value.commands))
429
+ return { ...value, commands: projectCommands(value.commands, fields) };
430
+ return projectFields(value, fields);
431
+ }), "projectFields");
432
+
433
+ // node_modules/.pnpm/@wirecat+cli-core@0.507.0_@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_type_d5beb0101c7a90701cc33879a5be8d28/node_modules/@wirecat/cli-core/dist/output-detail.js
434
+ var RARELY_SET = ["editedAt", "replyTo", "forwardedFrom", "reactions"];
435
+ var BRIEF = ["locator", "chatTitle", "timestamp", "senderName", "excerpt", "score"];
436
+ var isHit = /* @__PURE__ */ __name((value) => typeof value === "object" && value !== null && typeof value.locator === "string" && typeof value.text === "string", "isHit");
437
+ var shaped = /* @__PURE__ */ __name((hit, detail) => {
438
+ if (detail === "brief")
439
+ return Object.fromEntries(BRIEF.flatMap((key) => hit[key] === void 0 || hit[key] === null ? [] : [[key, hit[key]]]));
440
+ const { text, providerMetadata, ...rest } = hit;
441
+ for (const key of RARELY_SET)
442
+ if (rest[key] === null)
443
+ delete rest[key];
444
+ const metadata = rest.email ? void 0 : providerMetadata;
445
+ return {
446
+ ...rest,
447
+ ...typeof rest.excerpt === "string" ? {} : { text },
448
+ ...metadata === void 0 ? {} : { providerMetadata: metadata }
449
+ };
450
+ }, "shaped");
451
+ var atDetail = /* @__PURE__ */ __name((value, detail = "default") => {
452
+ if (detail === "full")
453
+ return value;
454
+ if (Array.isArray(value))
455
+ return value.map((item) => isHit(item) ? shaped(item, detail) : item);
456
+ if (isHit(value))
457
+ return shaped(value, detail);
458
+ if (typeof value === "object" && value !== null && Array.isArray(value.items))
459
+ return { ...value, items: atDetail(value.items, detail) };
460
+ return value;
461
+ }, "atDetail");
462
+
463
+ // node_modules/.pnpm/@wirecat+cli-core@0.507.0_@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_type_d5beb0101c7a90701cc33879a5be8d28/node_modules/@wirecat/cli-core/dist/output.js
464
+ var resolveOutput = /* @__PURE__ */ __name(({ json, jsonl, quiet, streams = processStreams, tty, color, fields, hitDetail, env = process.env, capture } = {}) => {
465
+ const interactive = tty ?? process.stdout.isTTY === true;
466
+ const format = jsonl ? "jsonl" : json || !interactive ? "json" : "pretty";
467
+ const painted = format === "pretty" && (color ?? (env.NO_COLOR === void 0 && env.TERM !== "dumb" && !env.CI));
468
+ const printing = createRenderer({ format, color: painted, streams });
469
+ const rendered = capture ? { ...printing, result: capture, stream: /* @__PURE__ */ __name((items) => capture([...items]), "stream") } : printing;
470
+ const level = hitDetail ?? (fields === void 0 ? "default" : "full");
471
+ const standard = format === "pretty" ? rendered : {
472
+ ...rendered,
473
+ result: /* @__PURE__ */ __name((value) => rendered.result(atDetail(value, level)), "result"),
474
+ stream: /* @__PURE__ */ __name((items) => rendered.stream(atDetail([...items], level)), "stream")
475
+ };
476
+ const created = standard;
477
+ const paths = fields === void 0 ? void 0 : fieldsOf2(fields);
478
+ const renderer = format === "pretty" ? oneLineFields(created) : paths ? {
479
+ ...created,
480
+ result: /* @__PURE__ */ __name((value) => created.result(projectFields2(value, paths)), "result"),
481
+ stream: /* @__PURE__ */ __name((items) => created.stream([...items].map((item) => projectFields2(item, paths))), "stream")
482
+ } : created;
483
+ return { format, color: painted, streams, renderer: quiet ? silence(renderer) : renderer };
484
+ }, "resolveOutput");
485
+ var MULTI_LINE = /* @__PURE__ */ new Set(["text", "description"]);
486
+ var oneLineFields = /* @__PURE__ */ __name((renderer) => ({
487
+ ...renderer,
488
+ result: /* @__PURE__ */ __name((value) => renderer.result(oneLine(value)), "result"),
489
+ stream: /* @__PURE__ */ __name((items) => renderer.stream([...items].map((item) => oneLine(item))), "stream")
490
+ }), "oneLineFields");
491
+ var oneLine = /* @__PURE__ */ __name((value, key) => {
492
+ if (typeof value === "string")
493
+ return key !== void 0 && MULTI_LINE.has(key) ? value : singleLine(value);
494
+ if (Array.isArray(value))
495
+ return value.map((item) => oneLine(item, key));
496
+ if (value !== null && typeof value === "object" && Object.getPrototypeOf(value) === Object.prototype) {
497
+ return Object.fromEntries(Object.entries(value).map(([field, item]) => [field, oneLine(item, field)]));
498
+ }
499
+ return value;
500
+ }, "oneLine");
501
+ var silence = /* @__PURE__ */ __name((renderer) => ({
502
+ ...renderer,
503
+ note: /* @__PURE__ */ __name(() => {
504
+ }, "note"),
505
+ success: /* @__PURE__ */ __name(() => {
506
+ }, "success"),
507
+ warn: /* @__PURE__ */ __name(() => {
508
+ }, "warn")
509
+ }), "silence");
510
+
511
+ export {
512
+ LEVELS,
513
+ skipFlagFor,
514
+ DEFAULT_PERMISSIONS,
515
+ AUTHORITY_KEY,
516
+ authorityAllowed,
517
+ BOT_API_KEY,
518
+ isBotApi,
519
+ botApiAllowed,
520
+ RESOURCES,
521
+ layerPermissions,
522
+ CEILING_KEY,
523
+ levelFor,
524
+ keyForWrite,
525
+ writeOfKey,
526
+ WRITE_KEYS,
527
+ readKeysForCommand,
528
+ keyForCommand,
529
+ RESOURCE_KEY,
530
+ COMMAND_PATH_KEY,
531
+ permissionOverrides,
532
+ assertOverridesTighten,
533
+ assertRetentionEvidenceRead,
534
+ fieldsOf2 as fieldsOf,
535
+ projectFields2 as projectFields,
536
+ resolveOutput
537
+ };