@wirecat/mail-cli 0.0.0-stage → 0.1.1

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 (198) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/LICENSE +204 -0
  3. package/README.md +166 -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-52F5DWS5.js +27 -0
  20. package/dist/bundle/chunk-5BVIWP3S.js +71 -0
  21. package/dist/bundle/chunk-5D4AEUVA.js +24783 -0
  22. package/dist/bundle/chunk-5NYMNSSO.js +264 -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-HFUVURJG.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-JTJB26P3.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/folders.d.ts +3 -0
  122. package/dist/commands/folders.d.ts.map +1 -0
  123. package/dist/commands/folders.js +36 -0
  124. package/dist/commands/folders.js.map +1 -0
  125. package/dist/commands/login.d.ts +5 -0
  126. package/dist/commands/login.d.ts.map +1 -0
  127. package/dist/commands/login.js +21 -0
  128. package/dist/commands/login.js.map +1 -0
  129. package/dist/commands/mailbox.d.ts +16 -0
  130. package/dist/commands/mailbox.d.ts.map +1 -0
  131. package/dist/commands/mailbox.js +54 -0
  132. package/dist/commands/mailbox.js.map +1 -0
  133. package/dist/commands/session.d.ts +3 -0
  134. package/dist/commands/session.d.ts.map +1 -0
  135. package/dist/commands/session.js +211 -0
  136. package/dist/commands/session.js.map +1 -0
  137. package/dist/commands/status.d.ts +3 -0
  138. package/dist/commands/status.d.ts.map +1 -0
  139. package/dist/commands/status.js +89 -0
  140. package/dist/commands/status.js.map +1 -0
  141. package/dist/commands/sync.d.ts +3 -0
  142. package/dist/commands/sync.d.ts.map +1 -0
  143. package/dist/commands/sync.js +190 -0
  144. package/dist/commands/sync.js.map +1 -0
  145. package/dist/config.d.ts +190 -0
  146. package/dist/config.d.ts.map +1 -0
  147. package/dist/config.js +46 -0
  148. package/dist/config.js.map +1 -0
  149. package/dist/discovery.d.ts +42 -0
  150. package/dist/discovery.d.ts.map +1 -0
  151. package/dist/discovery.js +179 -0
  152. package/dist/discovery.js.map +1 -0
  153. package/dist/identity.d.ts +5 -0
  154. package/dist/identity.d.ts.map +1 -0
  155. package/dist/identity.js +16 -0
  156. package/dist/identity.js.map +1 -0
  157. package/dist/index.d.ts +3 -0
  158. package/dist/index.d.ts.map +1 -0
  159. package/dist/index.js +3 -0
  160. package/dist/index.js.map +1 -0
  161. package/dist/mail/imap-errors.d.ts +4 -0
  162. package/dist/mail/imap-errors.d.ts.map +1 -0
  163. package/dist/mail/imap-errors.js +41 -0
  164. package/dist/mail/imap-errors.js.map +1 -0
  165. package/dist/mail/imap-messages.d.ts +18 -0
  166. package/dist/mail/imap-messages.d.ts.map +1 -0
  167. package/dist/mail/imap-messages.js +66 -0
  168. package/dist/mail/imap-messages.js.map +1 -0
  169. package/dist/mail/imap.d.ts +67 -0
  170. package/dist/mail/imap.d.ts.map +1 -0
  171. package/dist/mail/imap.js +348 -0
  172. package/dist/mail/imap.js.map +1 -0
  173. package/dist/profile.d.ts +16 -0
  174. package/dist/profile.d.ts.map +1 -0
  175. package/dist/profile.js +31 -0
  176. package/dist/profile.js.map +1 -0
  177. package/dist/program.d.ts +6 -0
  178. package/dist/program.d.ts.map +1 -0
  179. package/dist/program.js +52 -0
  180. package/dist/program.js.map +1 -0
  181. package/dist/providers.d.ts +53 -0
  182. package/dist/providers.d.ts.map +1 -0
  183. package/dist/providers.js +106 -0
  184. package/dist/providers.js.map +1 -0
  185. package/dist/secret.d.ts +30 -0
  186. package/dist/secret.d.ts.map +1 -0
  187. package/dist/secret.js +68 -0
  188. package/dist/secret.js.map +1 -0
  189. package/dist/store.d.ts +12 -0
  190. package/dist/store.d.ts.map +1 -0
  191. package/dist/store.js +25 -0
  192. package/dist/store.js.map +1 -0
  193. package/dist/version.d.ts +2 -0
  194. package/dist/version.d.ts.map +1 -0
  195. package/dist/version.js +2 -0
  196. package/dist/version.js.map +1 -0
  197. package/package.json +83 -4
  198. package/skills/mail-cli/SKILL.md +27 -0
@@ -0,0 +1,190 @@
1
+ import { type Settings } from "@wirecat/cli-core/cli";
2
+ import * as v from "valibot";
3
+ export interface Mailbox {
4
+ address?: string;
5
+ login?: string;
6
+ host?: string;
7
+ port?: number;
8
+ security?: "tls" | "starttls";
9
+ folders?: string[];
10
+ }
11
+ export declare const configuration: {
12
+ resolveSettings: (flags?: import("@wirecat/cli-core/cli").GlobalFlags, options?: import("@wirecat/cli-core/cli").ResolveOptions) => Settings & {
13
+ mailbox: Mailbox;
14
+ };
15
+ configuredProfiles: (options?: import("@wirecat/cli-core/cli").ResolveOptions) => string[];
16
+ changeSetting: (path: string, { profile, setting, value, kind, root }: {
17
+ profile: string | undefined;
18
+ setting: string;
19
+ value: string | undefined;
20
+ kind?: import("@wirecat/cli-core/cli").ProfileKind | undefined;
21
+ root?: boolean;
22
+ }) => unknown;
23
+ allSettings: string[];
24
+ defaultsOnlyKeys: string[];
25
+ schema: v.StrictObjectSchema<{
26
+ defaults: v.OptionalSchema<v.StrictObjectSchema<{
27
+ embedding_provider: ({
28
+ embeddingProvider: v.OptionalSchema<v.PicklistSchema<["local", "openai"], undefined>, undefined>;
29
+ embeddingModel: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
30
+ embeddingBaseUrl: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
31
+ embeddingDims: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 65536, undefined>]>, undefined>;
32
+ models: v.OptionalSchema<v.RecordSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>]>, v.StrictObjectSchema<{
33
+ readonly provider: v.OptionalSchema<v.PicklistSchema<["off", "openai", "anthropic"], undefined>, undefined>;
34
+ readonly model: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
35
+ readonly base_url: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
36
+ }, undefined>, undefined>, undefined>;
37
+ })["embeddingProvider"];
38
+ embedding_model: ({
39
+ embeddingProvider: v.OptionalSchema<v.PicklistSchema<["local", "openai"], undefined>, undefined>;
40
+ embeddingModel: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
41
+ embeddingBaseUrl: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
42
+ embeddingDims: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 65536, undefined>]>, undefined>;
43
+ models: v.OptionalSchema<v.RecordSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>]>, v.StrictObjectSchema<{
44
+ readonly provider: v.OptionalSchema<v.PicklistSchema<["off", "openai", "anthropic"], undefined>, undefined>;
45
+ readonly model: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
46
+ readonly base_url: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
47
+ }, undefined>, undefined>, undefined>;
48
+ })["embeddingModel"];
49
+ embedding_base_url: ({
50
+ embeddingProvider: v.OptionalSchema<v.PicklistSchema<["local", "openai"], undefined>, undefined>;
51
+ embeddingModel: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
52
+ embeddingBaseUrl: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
53
+ embeddingDims: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 65536, undefined>]>, undefined>;
54
+ models: v.OptionalSchema<v.RecordSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>]>, v.StrictObjectSchema<{
55
+ readonly provider: v.OptionalSchema<v.PicklistSchema<["off", "openai", "anthropic"], undefined>, undefined>;
56
+ readonly model: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
57
+ readonly base_url: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
58
+ }, undefined>, undefined>, undefined>;
59
+ })["embeddingBaseUrl"];
60
+ embedding_dims: ({
61
+ embeddingProvider: v.OptionalSchema<v.PicklistSchema<["local", "openai"], undefined>, undefined>;
62
+ embeddingModel: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
63
+ embeddingBaseUrl: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
64
+ embeddingDims: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 65536, undefined>]>, undefined>;
65
+ models: v.OptionalSchema<v.RecordSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>]>, v.StrictObjectSchema<{
66
+ readonly provider: v.OptionalSchema<v.PicklistSchema<["off", "openai", "anthropic"], undefined>, undefined>;
67
+ readonly model: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
68
+ readonly base_url: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
69
+ }, undefined>, undefined>, undefined>;
70
+ })["embeddingDims"];
71
+ models: ({
72
+ embeddingProvider: v.OptionalSchema<v.PicklistSchema<["local", "openai"], undefined>, undefined>;
73
+ embeddingModel: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
74
+ embeddingBaseUrl: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
75
+ embeddingDims: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 65536, undefined>]>, undefined>;
76
+ models: v.OptionalSchema<v.RecordSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>]>, v.StrictObjectSchema<{
77
+ readonly provider: v.OptionalSchema<v.PicklistSchema<["off", "openai", "anthropic"], undefined>, undefined>;
78
+ readonly model: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
79
+ readonly base_url: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
80
+ }, undefined>, undefined>, undefined>;
81
+ })["models"];
82
+ limit: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
83
+ timeout_ms: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
84
+ color: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
85
+ sender_colors: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
86
+ record: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
87
+ record_input: v.OptionalSchema<v.UnionSchema<[v.BooleanSchema<undefined>, v.LiteralSchema<"failed", undefined>], (issue: v.BaseIssue<unknown>) => string>, undefined>;
88
+ keep_runs_for_days: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
89
+ keep_successful_runs_for_days: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
90
+ runs_size_limit_mb: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
91
+ permissions: v.OptionalSchema<v.RecordSchema<v.GenericSchema<string>, v.PicklistSchema<readonly ["deny", "readonly", "ask", "allow"], (issue: v.PicklistIssue) => string>, (issue: v.BaseIssue<unknown>) => string>, undefined>;
92
+ sends_per_hour: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
93
+ requests_per_minute: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 0, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
94
+ transcribe_with: v.OptionalSchema<v.PicklistSchema<["auto", "messenger", "local"], (issue: v.BaseIssue<unknown>) => string>, undefined>;
95
+ speech_model: v.OptionalSchema<v.StringSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
96
+ search_catch_up: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
97
+ picture_search: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
98
+ search_reranker: v.OptionalSchema<v.PicklistSchema<[...string[], "off"], (issue: v.BaseIssue<unknown>) => string>, undefined>;
99
+ update_check: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
100
+ skill_hint: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
101
+ }, (issue: v.StrictObjectIssue) => string>, undefined>;
102
+ profiles: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StrictObjectSchema<{
103
+ embedding_provider: ({
104
+ embeddingProvider: v.OptionalSchema<v.PicklistSchema<["local", "openai"], undefined>, undefined>;
105
+ embeddingModel: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
106
+ embeddingBaseUrl: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
107
+ embeddingDims: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 65536, undefined>]>, undefined>;
108
+ models: v.OptionalSchema<v.RecordSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>]>, v.StrictObjectSchema<{
109
+ readonly provider: v.OptionalSchema<v.PicklistSchema<["off", "openai", "anthropic"], undefined>, undefined>;
110
+ readonly model: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
111
+ readonly base_url: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
112
+ }, undefined>, undefined>, undefined>;
113
+ })["embeddingProvider"];
114
+ embedding_model: ({
115
+ embeddingProvider: v.OptionalSchema<v.PicklistSchema<["local", "openai"], undefined>, undefined>;
116
+ embeddingModel: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
117
+ embeddingBaseUrl: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
118
+ embeddingDims: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 65536, undefined>]>, undefined>;
119
+ models: v.OptionalSchema<v.RecordSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>]>, v.StrictObjectSchema<{
120
+ readonly provider: v.OptionalSchema<v.PicklistSchema<["off", "openai", "anthropic"], undefined>, undefined>;
121
+ readonly model: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
122
+ readonly base_url: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
123
+ }, undefined>, undefined>, undefined>;
124
+ })["embeddingModel"];
125
+ embedding_base_url: ({
126
+ embeddingProvider: v.OptionalSchema<v.PicklistSchema<["local", "openai"], undefined>, undefined>;
127
+ embeddingModel: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
128
+ embeddingBaseUrl: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
129
+ embeddingDims: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 65536, undefined>]>, undefined>;
130
+ models: v.OptionalSchema<v.RecordSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>]>, v.StrictObjectSchema<{
131
+ readonly provider: v.OptionalSchema<v.PicklistSchema<["off", "openai", "anthropic"], undefined>, undefined>;
132
+ readonly model: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
133
+ readonly base_url: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
134
+ }, undefined>, undefined>, undefined>;
135
+ })["embeddingBaseUrl"];
136
+ embedding_dims: ({
137
+ embeddingProvider: v.OptionalSchema<v.PicklistSchema<["local", "openai"], undefined>, undefined>;
138
+ embeddingModel: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
139
+ embeddingBaseUrl: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
140
+ embeddingDims: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 65536, undefined>]>, undefined>;
141
+ models: v.OptionalSchema<v.RecordSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>]>, v.StrictObjectSchema<{
142
+ readonly provider: v.OptionalSchema<v.PicklistSchema<["off", "openai", "anthropic"], undefined>, undefined>;
143
+ readonly model: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
144
+ readonly base_url: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
145
+ }, undefined>, undefined>, undefined>;
146
+ })["embeddingDims"];
147
+ models: ({
148
+ embeddingProvider: v.OptionalSchema<v.PicklistSchema<["local", "openai"], undefined>, undefined>;
149
+ embeddingModel: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
150
+ embeddingBaseUrl: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
151
+ embeddingDims: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 65536, undefined>]>, undefined>;
152
+ models: v.OptionalSchema<v.RecordSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, undefined>]>, v.StrictObjectSchema<{
153
+ readonly provider: v.OptionalSchema<v.PicklistSchema<["off", "openai", "anthropic"], undefined>, undefined>;
154
+ readonly model: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 200, undefined>]>, undefined>;
155
+ readonly base_url: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.CheckAction<string, "use an HTTP/S endpoint without credentials, query or fragment">]>, undefined>;
156
+ }, undefined>, undefined>, undefined>;
157
+ })["models"];
158
+ limit: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
159
+ timeout_ms: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
160
+ color: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
161
+ sender_colors: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
162
+ record: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
163
+ record_input: v.OptionalSchema<v.UnionSchema<[v.BooleanSchema<undefined>, v.LiteralSchema<"failed", undefined>], (issue: v.BaseIssue<unknown>) => string>, undefined>;
164
+ keep_runs_for_days: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
165
+ keep_successful_runs_for_days: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
166
+ runs_size_limit_mb: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
167
+ permissions: v.OptionalSchema<v.RecordSchema<v.GenericSchema<string>, v.PicklistSchema<readonly ["deny", "readonly", "ask", "allow"], (issue: v.PicklistIssue) => string>, (issue: v.BaseIssue<unknown>) => string>, undefined>;
168
+ sends_per_hour: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 1, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
169
+ requests_per_minute: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<(issue: v.BaseIssue<unknown>) => string>, v.IntegerAction<number, (issue: v.BaseIssue<unknown>) => string>, v.MinValueAction<number, 0, (issue: v.BaseIssue<unknown>) => string>]>, undefined>;
170
+ transcribe_with: v.OptionalSchema<v.PicklistSchema<["auto", "messenger", "local"], (issue: v.BaseIssue<unknown>) => string>, undefined>;
171
+ speech_model: v.OptionalSchema<v.StringSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
172
+ search_catch_up: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
173
+ picture_search: v.OptionalSchema<v.BooleanSchema<(issue: v.BaseIssue<unknown>) => string>, undefined>;
174
+ search_reranker: v.OptionalSchema<v.PicklistSchema<[...string[], "off"], (issue: v.BaseIssue<unknown>) => string>, undefined>;
175
+ }, (issue: v.StrictObjectIssue) => string>, "has to be an object of profiles, by name">, {}>;
176
+ personal: v.OptionalSchema<v.StrictObjectSchema<{
177
+ readonly defaults: v.OptionalSchema<v.StrictObjectSchema<v.ObjectEntries, (issue: v.StrictObjectIssue) => string>, undefined>;
178
+ readonly profiles: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StrictObjectSchema<v.ObjectEntries, (issue: v.StrictObjectIssue) => string>, "has to be an object of profiles, by name">, undefined>;
179
+ }, (issue: v.StrictObjectIssue) => string>, undefined>;
180
+ bot: v.OptionalSchema<v.StrictObjectSchema<{
181
+ readonly defaults: v.OptionalSchema<v.StrictObjectSchema<v.ObjectEntries, (issue: v.StrictObjectIssue) => string>, undefined>;
182
+ readonly profiles: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StrictObjectSchema<v.ObjectEntries, (issue: v.StrictObjectIssue) => string>, "has to be an object of profiles, by name">, undefined>;
183
+ }, (issue: v.StrictObjectIssue) => string>, undefined>;
184
+ }, (issue: v.StrictObjectIssue) => string>;
185
+ permissions?: import("@wirecat/cli-core/cli").CommandPermissions | undefined;
186
+ };
187
+ export type MailSettings = Settings & {
188
+ mailbox: Mailbox;
189
+ };
190
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,QAAQ,EAAe,MAAM,uBAAuB,CAAA;AACtF,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAY5B,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,KAAK,GAAG,UAAU,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,eAAO,MAAM,aAAa;;iBAA0B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCzD,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAA"}
package/dist/config.js ADDED
@@ -0,0 +1,46 @@
1
+ import { commandPermissions, settingsFor } from "@wirecat/cli-core/cli";
2
+ import * as v from "valibot";
3
+ import { IDENTITY } from "./identity.js";
4
+ const PROFILE_ENTRIES = {
5
+ address: v.optional(v.string()),
6
+ login: v.optional(v.string()),
7
+ imap_host: v.optional(v.string()),
8
+ imap_port: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(65535))),
9
+ imap_security: v.optional(v.picklist(["tls", "starttls"])),
10
+ folders: v.optional(v.array(v.string())),
11
+ };
12
+ export const configuration = settingsFor(IDENTITY, {
13
+ permissions: commandPermissions(),
14
+ profile: PROFILE_ENTRIES,
15
+ resolve: ({ fromLayers }) => {
16
+ const pick = (key) => fromLayers(key, undefined);
17
+ const address = pick("address");
18
+ const login = pick("login");
19
+ const host = pick("imap_host");
20
+ const port = pick("imap_port");
21
+ const security = pick("imap_security");
22
+ const folders = pick("folders");
23
+ const defined = (key, value) => (value === undefined ? {} : { [key]: value });
24
+ return {
25
+ values: {
26
+ mailbox: {
27
+ ...defined("address", address.value),
28
+ ...defined("login", login.value),
29
+ ...defined("host", host.value),
30
+ ...defined("port", port.value),
31
+ ...defined("security", security.value),
32
+ ...defined("folders", folders.value),
33
+ },
34
+ },
35
+ sources: {
36
+ address: address.from,
37
+ login: login.from,
38
+ imap_host: host.from,
39
+ imap_port: port.from,
40
+ imap_security: security.from,
41
+ folders: folders.from,
42
+ },
43
+ };
44
+ },
45
+ });
46
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAiB,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACtF,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,MAAM,eAAe,GAAG;IACtB,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC/B,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC7B,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACjC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACxF,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IAC1D,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;CACzC,CAAA;AAWD,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAuB,QAAQ,EAAE;IACvE,WAAW,EAAE,kBAAkB,EAAE;IACjC,OAAO,EAAE,eAAe;IACxB,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,CAAI,GAAW,EAAE,EAAE,CAAC,UAAU,CAAgB,GAAG,EAAE,SAAS,CAAC,CAAA;QAC1E,MAAM,OAAO,GAAG,IAAI,CAAS,SAAS,CAAC,CAAA;QACvC,MAAM,KAAK,GAAG,IAAI,CAAS,OAAO,CAAC,CAAA;QACnC,MAAM,IAAI,GAAG,IAAI,CAAS,WAAW,CAAC,CAAA;QACtC,MAAM,IAAI,GAAG,IAAI,CAAS,WAAW,CAAC,CAAA;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAqB,eAAe,CAAC,CAAA;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAW,SAAS,CAAC,CAAA;QACzC,MAAM,OAAO,GAAG,CAAI,GAAW,EAAE,KAAoB,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;QACvG,OAAO;YACL,MAAM,EAAE;gBACN,OAAO,EAAE;oBACP,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC;oBACpC,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;oBAChC,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;oBAC9B,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;oBAC9B,GAAG,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC;oBACtC,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC;iBACrC;aACF;YACD,OAAO,EAAE;gBACP,OAAO,EAAE,OAAO,CAAC,IAAI;gBACrB,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,aAAa,EAAE,QAAQ,CAAC,IAAI;gBAC5B,OAAO,EAAE,OAAO,CAAC,IAAI;aACtB;SACF,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,42 @@
1
+ import { type Prepare } from "./providers.js";
2
+ export type Security = "tls" | "starttls";
3
+ export interface Endpoint {
4
+ host: string;
5
+ port: number;
6
+ security: Security;
7
+ }
8
+ export interface Discovery {
9
+ address: string;
10
+ provider: string;
11
+ imap: Endpoint;
12
+ /** What the server wants as the login name. */
13
+ login: string;
14
+ auth: "app-password" | "oauth";
15
+ found_by: "built-in" | "mx" | "ispdb" | "autoconfig";
16
+ note?: string;
17
+ prepare: Prepare;
18
+ }
19
+ export declare const ADDRESS: RegExp;
20
+ export declare const domainOf: (address: string) => string;
21
+ /** The steps for a saved profile: its address domain first, then its server host (a domain of its own on Yandex). */
22
+ export declare const prepareFor: (address: string, host: string) => {
23
+ provider: string;
24
+ prepare: Prepare;
25
+ };
26
+ /** The names `--provider` and the interactive choice accept, in table order. */
27
+ export declare const PROVIDER_NAMES: string[];
28
+ /** A built-in provider picked by name, for an address whose own domain says nothing about its host. */
29
+ export declare const discoverByName: (input: string, name: string) => Discovery;
30
+ export interface DiscoveryDeps {
31
+ fetch?: typeof fetch;
32
+ mx?: (domain: string) => Promise<string[]>;
33
+ signal?: AbortSignal;
34
+ }
35
+ /** The first IMAP server of a Mozilla autoconfig file; one that offers no encryption is ignored. */
36
+ export declare const parseAutoconfig: (xml: string, address: string) => Omit<Discovery, "found_by" | "provider" | "auth" | "prepare"> | undefined;
37
+ /**
38
+ * Built-in table by domain, then the MX record, then Thunderbird's ISPDB, then the domain's own autoconfig file.
39
+ * The result is only a proposal: `setup` shows it and the owner confirms.
40
+ */
41
+ export declare const discover: (input: string, deps?: DiscoveryDeps) => Promise<Discovery>;
42
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqC,KAAK,OAAO,EAAoB,MAAM,gBAAgB,CAAA;AAElG,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,UAAU,CAAA;AAEzC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,QAAQ,CAAA;IACd,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,cAAc,GAAG,OAAO,CAAA;IAC9B,QAAQ,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,GAAG,YAAY,CAAA;IACpD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;CACjB;AA8ED,eAAO,MAAM,OAAO,QAA+D,CAAA;AAEnF,eAAO,MAAM,QAAQ,YAAa,MAAM,KAAG,MAK1C,CAAA;AAqBD,qHAAqH;AACrH,eAAO,MAAM,UAAU,YAAa,MAAM,QAAQ,MAAM,KAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAM9F,CAAA;AAID,gFAAgF;AAChF,eAAO,MAAM,cAAc,EAAE,MAAM,EAA2C,CAAA;AAE9E,uGAAuG;AACvG,eAAO,MAAM,cAAc,UAAW,MAAM,QAAQ,MAAM,KAAG,SAS5D,CAAA;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IACpB,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAQD,oGAAoG;AACpG,eAAO,MAAM,eAAe,QACrB,MAAM,WACF,MAAM,KACd,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,SAelE,CAAA;AAaD;;;GAGG;AACH,eAAO,MAAM,QAAQ,UAAiB,MAAM,SAAQ,aAAa,KAAQ,OAAO,CAAC,SAAS,CA8BzF,CAAA"}
@@ -0,0 +1,179 @@
1
+ import { resolveMx } from "node:dns/promises";
2
+ import { CliError } from "@wirecat/cli-base";
3
+ import { GENERIC_PREPARE, PROVIDER_PREPARE } from "./providers.js";
4
+ const tls = (host) => ({ host, port: 993, security: "tls" });
5
+ const KNOWN = {
6
+ yandex: {
7
+ provider: "Yandex",
8
+ imap: tls("imap.yandex.com"),
9
+ auth: "app-password",
10
+ note: "turn on IMAP and app passwords in Yandex settings, then make a password of type Mail",
11
+ },
12
+ gmail: {
13
+ provider: "Gmail",
14
+ imap: tls("imap.gmail.com"),
15
+ auth: "app-password",
16
+ note: "needs 2-step verification and an app password; IMAP downloads are capped at 2500 MB a day",
17
+ },
18
+ icloud: {
19
+ provider: "iCloud",
20
+ imap: tls("imap.mail.me.com"),
21
+ auth: "app-password",
22
+ note: "needs an app-specific password",
23
+ },
24
+ mailru: {
25
+ provider: "Mail.ru",
26
+ imap: tls("imap.mail.ru"),
27
+ auth: "app-password",
28
+ note: "needs an app password for external programs",
29
+ },
30
+ fastmail: { provider: "Fastmail", imap: tls("imap.fastmail.com"), auth: "app-password" },
31
+ outlook: {
32
+ provider: "Outlook",
33
+ imap: tls("outlook.office365.com"),
34
+ auth: "oauth",
35
+ note: "Microsoft accepts only OAuth for IMAP; an app password cannot work, wait for OAuth sign-in",
36
+ },
37
+ };
38
+ const BY_DOMAIN = {
39
+ "yandex.ru": "yandex",
40
+ "yandex.com": "yandex",
41
+ "ya.ru": "yandex",
42
+ "yandex.by": "yandex",
43
+ "yandex.kz": "yandex",
44
+ "yandex.ua": "yandex",
45
+ "gmail.com": "gmail",
46
+ "googlemail.com": "gmail",
47
+ "icloud.com": "icloud",
48
+ "me.com": "icloud",
49
+ "mac.com": "icloud",
50
+ "mail.ru": "mailru",
51
+ "inbox.ru": "mailru",
52
+ "list.ru": "mailru",
53
+ "bk.ru": "mailru",
54
+ "internet.ru": "mailru",
55
+ "fastmail.com": "fastmail",
56
+ "fastmail.fm": "fastmail",
57
+ "outlook.com": "outlook",
58
+ "hotmail.com": "outlook",
59
+ "live.com": "outlook",
60
+ };
61
+ // A domain with its own name can still be hosted at one of these: its MX record says where.
62
+ const BY_MX = [
63
+ [/(^|\.)mx\.yandex\.(net|ru)$|(^|\.)yandex\.(net|ru)$/, "yandex"],
64
+ [/(^|\.)(aspmx\.l\.google\.com|googlemail\.com|google\.com)$/, "gmail"],
65
+ [/\.mail\.protection\.outlook\.com$/, "outlook"],
66
+ [/(^|\.)messagingengine\.com$/, "fastmail"],
67
+ [/(^|\.)mail\.ru$/, "mailru"],
68
+ ];
69
+ export const ADDRESS = /^[^\s@<>()[\]\\,;:"]+@([A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)+)$/;
70
+ export const domainOf = (address) => {
71
+ const domain = ADDRESS.exec(address.trim())?.[1];
72
+ if (!domain)
73
+ throw new CliError("validation_error", "give a full mail address, such as name@example.com", { param: "address" });
74
+ return domain.toLowerCase();
75
+ };
76
+ const isProviderKey = (name) => Object.hasOwn(KNOWN, name);
77
+ const KEYS = Object.keys(KNOWN).filter(isProviderKey);
78
+ const found = (address, key, found_by) => {
79
+ const known = KNOWN[key];
80
+ return {
81
+ address,
82
+ provider: known.provider,
83
+ imap: known.imap,
84
+ // Every provider in the table logs in with the full address.
85
+ login: address,
86
+ auth: known.auth,
87
+ found_by,
88
+ ...(known.note ? { note: known.note } : {}),
89
+ prepare: PROVIDER_PREPARE[key],
90
+ };
91
+ };
92
+ /** The steps for a saved profile: its address domain first, then its server host (a domain of its own on Yandex). */
93
+ export const prepareFor = (address, host) => {
94
+ const domain = address.split("@")[1]?.toLowerCase() ?? "";
95
+ const key = BY_DOMAIN[domain] ?? KEYS.find((name) => KNOWN[name].imap.host === host);
96
+ return key
97
+ ? { provider: KNOWN[key].provider, prepare: PROVIDER_PREPARE[key] }
98
+ : { provider: domain || "this", prepare: GENERIC_PREPARE };
99
+ };
100
+ const slug = (name) => name.toLowerCase().replace(/[^a-z0-9]/g, "");
101
+ /** The names `--provider` and the interactive choice accept, in table order. */
102
+ export const PROVIDER_NAMES = KEYS.map((key) => KNOWN[key].provider);
103
+ /** A built-in provider picked by name, for an address whose own domain says nothing about its host. */
104
+ export const discoverByName = (input, name) => {
105
+ const address = input.trim().toLowerCase();
106
+ domainOf(address);
107
+ const key = KEYS.find((candidate) => slug(candidate) === slug(name) || slug(KNOWN[candidate].provider) === slug(name));
108
+ if (!key)
109
+ throw new CliError("validation_error", `unknown provider ${name}; choose one of ${PROVIDER_NAMES.join(", ")}`, {
110
+ param: "provider",
111
+ });
112
+ return found(address, key, "built-in");
113
+ };
114
+ const defaultMx = async (domain) => (await resolveMx(domain)).map((record) => record.exchange);
115
+ const attribute = (block, name) => new RegExp(`<${name}>\\s*([^<]*?)\\s*</${name}>`, "i").exec(block)?.[1];
116
+ /** The first IMAP server of a Mozilla autoconfig file; one that offers no encryption is ignored. */
117
+ export const parseAutoconfig = (xml, address) => {
118
+ const servers = [...xml.matchAll(/<incomingServer\s+type="imap"[^>]*>([\s\S]*?)<\/incomingServer>/gi)];
119
+ for (const [, block = ""] of servers) {
120
+ const host = attribute(block, "hostname");
121
+ const port = Number(attribute(block, "port"));
122
+ const socket = attribute(block, "socketType")?.toUpperCase();
123
+ if (!host || !Number.isInteger(port) || !/^[A-Za-z0-9.-]+$/.test(host))
124
+ continue;
125
+ const security = socket === "SSL" ? "tls" : socket === "STARTTLS" ? "starttls" : undefined;
126
+ if (!security)
127
+ continue;
128
+ const user = attribute(block, "username") ?? "%EMAILADDRESS%";
129
+ const local = address.split("@")[0] ?? "";
130
+ const login = user.replace("%EMAILADDRESS%", address).replace("%EMAILLOCALPART%", local);
131
+ return { address, imap: { host, port, security }, login };
132
+ }
133
+ return undefined;
134
+ };
135
+ const ask = async (url, deps) => {
136
+ try {
137
+ const response = await (deps.fetch ?? fetch)(url, {
138
+ signal: AbortSignal.any([AbortSignal.timeout(8000), ...(deps.signal ? [deps.signal] : [])]),
139
+ });
140
+ return response.ok ? await response.text() : undefined;
141
+ }
142
+ catch {
143
+ return undefined;
144
+ }
145
+ };
146
+ /**
147
+ * Built-in table by domain, then the MX record, then Thunderbird's ISPDB, then the domain's own autoconfig file.
148
+ * The result is only a proposal: `setup` shows it and the owner confirms.
149
+ */
150
+ export const discover = async (input, deps = {}) => {
151
+ const address = input.trim().toLowerCase();
152
+ const domain = domainOf(address);
153
+ const key = BY_DOMAIN[domain];
154
+ if (key)
155
+ return found(address, key, "built-in");
156
+ try {
157
+ const exchanges = await (deps.mx ?? defaultMx)(domain);
158
+ for (const [pattern, name] of BY_MX)
159
+ if (exchanges.some((host) => pattern.test(host.toLowerCase())))
160
+ return found(address, name, "mx");
161
+ }
162
+ catch {
163
+ // No MX record, or no network: the file lookups below may still answer.
164
+ }
165
+ const sources = [
166
+ [`https://autoconfig.thunderbird.net/v1.1/${encodeURIComponent(domain)}`, "ispdb"],
167
+ [`https://autoconfig.${domain}/mail/config-v1.1.xml`, "autoconfig"],
168
+ ];
169
+ for (const [url, found_by] of sources) {
170
+ const xml = await ask(url, deps);
171
+ const parsed = xml ? parseAutoconfig(xml, address) : undefined;
172
+ if (parsed)
173
+ return { ...parsed, provider: domain, auth: "app-password", found_by, prepare: GENERIC_PREPARE };
174
+ }
175
+ throw new CliError("not_found", `no mail server found for ${domain}; pass --provider (${PROVIDER_NAMES.join(", ")}), or --host, --port and --security yourself`, {
176
+ param: "address",
177
+ });
178
+ };
179
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { AppIdentity } from "@wirecat/cli-core/cli";
2
+ export declare const PACKAGE = "@wirecat/mail-cli";
3
+ export declare const IDENTITY: AppIdentity;
4
+ export declare const SKILL: import("url").URL;
5
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGxD,eAAO,MAAM,OAAO,sBAAsB,CAAA;AAE1C,eAAO,MAAM,QAAQ,EAAE,WAWtB,CAAA;AAED,eAAO,MAAM,KAAK,mBAA0D,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { VERSION } from "./version.js";
2
+ export const PACKAGE = "@wirecat/mail-cli";
3
+ export const IDENTITY = {
4
+ command: "mail",
5
+ appName: "mail-cli",
6
+ envPrefix: "MAIL",
7
+ description: "read mail over IMAP into the shared store, with app passwords kept in the OS keyring",
8
+ version: VERSION,
9
+ issues: "https://github.com/WireCatLabs/mail-cli/issues/new",
10
+ messenger: false,
11
+ // One call to the source reads 60 messages on 4 connections: 5 to 12 s on Yandex 360 (cli-testing, performance/mail).
12
+ requestMs: 9_000,
13
+ contentLanguages: ["ru", "en"],
14
+ };
15
+ export const SKILL = new URL("../skills/mail-cli/SKILL.md", import.meta.url);
16
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,CAAC,MAAM,OAAO,GAAG,mBAAmB,CAAA;AAE1C,MAAM,CAAC,MAAM,QAAQ,GAAgB;IACnC,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,UAAU;IACnB,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,sFAAsF;IACnG,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,oDAAoD;IAC5D,SAAS,EAAE,KAAK;IAChB,sHAAsH;IACtH,SAAS,EAAE,KAAK;IAChB,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;CAC/B,CAAA;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,6BAA6B,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { IDENTITY } from "./identity.js";
2
+ export { createProgram, definition, run } from "./program.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { IDENTITY } from "./identity.js";
2
+ export { createProgram, definition, run } from "./program.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { CliError } from "@wirecat/cli-base";
2
+ /** The server's error text can quote mail or names, so only its codes reach the caller. */
3
+ export declare const mapImapError: (error: unknown) => CliError;
4
+ //# sourceMappingURL=imap-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imap-errors.d.ts","sourceRoot":"","sources":["../../src/mail/imap-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAK5C,2FAA2F;AAC3F,eAAO,MAAM,YAAY,UAAW,OAAO,KAAG,QAyD7C,CAAA"}
@@ -0,0 +1,41 @@
1
+ import { CliError } from "@wirecat/cli-base";
2
+ /** The raw error code (ECONNRESET, ETIMEDOUT) so a failed run can be diagnosed; never the server's text. */
3
+ const causeOf = (code) => (code && /^[A-Za-z0-9_.-]{1,40}$/.test(code) ? { cause_code: code } : {});
4
+ /** The server's error text can quote mail or names, so only its codes reach the caller. */
5
+ export const mapImapError = (error) => {
6
+ if (error instanceof CliError)
7
+ return error;
8
+ // imapflow throws plain Errors with extra fields it does not type, and tests hand in bare objects.
9
+ const e = error;
10
+ // imapflow strips `[CODE]` from responseText and sets serverResponseCode on some commands only; the code is
11
+ // always in the parsed response.
12
+ const responseCode = e.serverResponseCode ?? String(e.response?.attributes?.[0]?.section?.[0]?.value ?? "").toUpperCase();
13
+ if (e.authenticationFailed)
14
+ return new CliError("authentication_error", "the mail server refused the login; check the app password and that IMAP and app passwords are on in the account settings", { reason: "mail.login-refused" });
15
+ const throttled = e.code === "ETHROTTLE" || responseCode === "THROTTLED" || /throttl/i.test(e.responseText ?? "");
16
+ if (throttled)
17
+ return new CliError("rate_limited", "the mail server is limiting this account; wait and run the command again", {
18
+ retryable: true,
19
+ ...(typeof e.throttleReset === "number" ? { retry_after_ms: e.throttleReset } : {}),
20
+ });
21
+ if (e.code === "ETIMEDOUT" ||
22
+ e.code === "ETIMEOUT" ||
23
+ e.code === "ConnectionTimeout" ||
24
+ e.code === "GreetingTimeout" ||
25
+ e.code === "RequestTimeout" ||
26
+ e.code === "CONNECT_TIMEOUT" ||
27
+ e.code === "GREETING_TIMEOUT" ||
28
+ e.code === "UPGRADE_TIMEOUT" ||
29
+ e.code === "LockTimeout")
30
+ return new CliError("timeout", "the mail server did not answer in time", { retryable: true, ...causeOf(e.code) });
31
+ if (e.code &&
32
+ /^(ECONN|ENOTFOUND|EAI_|ENETUNREACH|EHOSTUNREACH|NoConnection|EPIPE|Closed|EConnectionClosed|UnexpectedTag|MissingTag|InvalidResponse|ResponseProcessingFailed|ParserError|PollFailed|TooManyResponses|NoMailboxSelected)/.test(e.code))
33
+ return new CliError("network_error", "cannot reach the mail server", { retryable: true, ...causeOf(e.code) });
34
+ if (responseCode === "UNAVAILABLE")
35
+ return new CliError("provider_unavailable", "the mail server cannot answer this request now", {
36
+ retryable: true,
37
+ ...causeOf(responseCode),
38
+ });
39
+ return new CliError("provider_error", `the mail server refused the request${e.responseStatus ? ` (${e.responseStatus})` : ""}`, causeOf(e.code ?? (responseCode || e.responseStatus)));
40
+ };
41
+ //# sourceMappingURL=imap-errors.js.map