@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,886 @@
1
+ import { createRequire as __bundleRequire } from "node:module";
2
+ const require = __bundleRequire(import.meta.url);
3
+ import {
4
+ storePath
5
+ } from "./chunk-FZ5FXIG6.js";
6
+ import {
7
+ resolvePaths
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/store/shared-config.js
18
+ import { mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from "node:fs";
19
+ import { dirname, join, resolve } from "node:path";
20
+
21
+ // 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/domain/task-categories.js
22
+ var DEFAULT_TASK_CATEGORIES = [
23
+ {
24
+ name: "taxes",
25
+ meaning: "tax returns, the accountant, the tax office",
26
+ triggers: {
27
+ en: ["tax", "taxes", "accountant", "vat", "hmrc"],
28
+ ru: ["\u043D\u0430\u043B\u043E\u0433", "\u043D\u0430\u043B\u043E\u0433\u043E\u0432\u0430\u044F", "\u0434\u0435\u043A\u043B\u0430\u0440\u0430\u0446\u0438\u044F", "\u0431\u0443\u0445\u0433\u0430\u043B\u0442\u0435\u0440", "\u043D\u0434\u0444\u043B", "\u0438\u0444\u043D\u0441", "\u0432\u044B\u0447\u0435\u0442"],
29
+ es: ["impuesto", "impuestos", "hacienda", "iva", "irpf", "gestor", "gestor\xEDa"]
30
+ }
31
+ },
32
+ {
33
+ name: "investments",
34
+ meaning: "stocks, funds, crypto, a broker",
35
+ triggers: {
36
+ en: [
37
+ "invest",
38
+ "investment",
39
+ "investments",
40
+ "stocks",
41
+ "broker",
42
+ "brokerage",
43
+ "portfolio",
44
+ "crypto",
45
+ "etf",
46
+ "dividend",
47
+ "dividends"
48
+ ],
49
+ ru: ["\u0438\u043D\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u0438", "\u0438\u043D\u0432\u0435\u0441\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C", "\u0431\u0440\u043E\u043A\u0435\u0440", "\u043E\u0431\u043B\u0438\u0433\u0430\u0446\u0438\u0438", "\u043F\u043E\u0440\u0442\u0444\u0435\u043B\u044C", "\u043A\u0440\u0438\u043F\u0442\u0430", "\u043A\u0440\u0438\u043F\u0442\u043E\u0432\u0430\u043B\u044E\u0442\u0430", "\u0434\u0438\u0432\u0438\u0434\u0435\u043D\u0434\u044B"],
50
+ es: ["inversi\xF3n", "invertir", "br\xF3ker", "dividendos", "cripto", "bolsa"]
51
+ }
52
+ },
53
+ {
54
+ name: "subscriptions",
55
+ meaning: "a service subscription to start, cancel or renew",
56
+ triggers: {
57
+ en: ["subscription", "subscriptions", "subscribe", "unsubscribe", "renewal", "membership", "trial"],
58
+ ru: ["\u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0430", "\u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443", "\u0430\u0431\u043E\u043D\u0435\u043D\u0442\u0441\u043A\u0430\u044F", "\u0430\u0431\u043E\u043D\u0435\u043C\u0435\u043D\u0442", "\u043F\u0440\u043E\u0434\u043B\u0435\u043D\u0438\u0435"],
59
+ es: ["suscripci\xF3n", "suscribirse", "renovaci\xF3n", "membres\xEDa"]
60
+ }
61
+ },
62
+ {
63
+ name: "bills",
64
+ meaning: "a recurring bill: utilities, phone, internet",
65
+ triggers: {
66
+ en: ["utility", "utilities", "electricity", "heating"],
67
+ ru: ["\u043A\u043E\u043C\u043C\u0443\u043D\u0430\u043B\u043A\u0430", "\u043A\u043E\u043C\u043C\u0443\u043D\u0430\u043B\u044C\u043D\u044B\u0435", "\u044D\u043B\u0435\u043A\u0442\u0440\u0438\u0447\u0435\u0441\u0442\u0432\u043E", "\u0433\u0430\u0437", "\u043A\u0432\u0438\u0442\u0430\u043D\u0446\u0438\u044F", "\u043F\u043E\u043A\u0430\u0437\u0430\u043D\u0438\u044F"],
68
+ es: ["recibo", "recibos", "suministro", "suministros", "electricidad"]
69
+ }
70
+ },
71
+ {
72
+ name: "donations",
73
+ meaning: "a donation, a fundraiser, a charity",
74
+ triggers: {
75
+ en: ["donate", "donation", "donations", "charity", "fundraiser", "crowdfunding", "patreon"],
76
+ ru: ["\u043F\u043E\u0436\u0435\u0440\u0442\u0432\u043E\u0432\u0430\u043D\u0438\u0435", "\u043F\u043E\u0436\u0435\u0440\u0442\u0432\u043E\u0432\u0430\u0442\u044C", "\u0431\u043B\u0430\u0433\u043E\u0442\u0432\u043E\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C", "\u0434\u043E\u043D\u0430\u0442", "\u0444\u043E\u043D\u0434"],
77
+ es: ["donaci\xF3n", "donar", "ben\xE9fico", "beneficencia", "ong"]
78
+ }
79
+ },
80
+ {
81
+ name: "insurance",
82
+ meaning: "an insurance policy or claim",
83
+ triggers: {
84
+ en: ["insurance", "insurer", "insured", "coverage"],
85
+ ru: ["\u0441\u0442\u0440\u0430\u0445\u043E\u0432\u043A\u0430", "\u0441\u0442\u0440\u0430\u0445\u043E\u0432\u0430\u044F", "\u0441\u0442\u0440\u0430\u0445\u043E\u0432\u0430\u043D\u0438\u0435", "\u043F\u043E\u043B\u0438\u0441", "\u043E\u0441\u0430\u0433\u043E", "\u043A\u0430\u0441\u043A\u043E", "\u0434\u043C\u0441"],
86
+ es: ["aseguradora", "p\xF3liza", "siniestro", "mutua"]
87
+ }
88
+ },
89
+ {
90
+ name: "bank",
91
+ meaning: "cards, bank accounts, wire transfers, a bank's request",
92
+ triggers: {
93
+ en: ["bank", "banking", "card", "iban", "swift", "wire", "overdraft"],
94
+ ru: ["\u0431\u0430\u043D\u043A", "\u043A\u0430\u0440\u0442\u0430", "\u043A\u0430\u0440\u0442\u0443", "\u0440\u0435\u043A\u0432\u0438\u0437\u0438\u0442\u044B", "\u0432\u044B\u043F\u0438\u0441\u043A\u0430", "iban", "swift"],
95
+ es: ["banco", "tarjeta", "iban", "swift"]
96
+ }
97
+ },
98
+ {
99
+ name: "civic",
100
+ meaning: "voting, a petition, a census, jury duty, the local council",
101
+ triggers: {
102
+ en: ["vote", "voting", "election", "elections", "petition", "census", "jury", "ballot"],
103
+ ru: ["\u0432\u044B\u0431\u043E\u0440\u044B", "\u0433\u043E\u043B\u043E\u0441\u043E\u0432\u0430\u043D\u0438\u0435", "\u043F\u0440\u043E\u0433\u043E\u043B\u043E\u0441\u043E\u0432\u0430\u0442\u044C", "\u043F\u0435\u0442\u0438\u0446\u0438\u044F", "\u043F\u0435\u0440\u0435\u043F\u0438\u0441\u044C", "\u0434\u0435\u043F\u0443\u0442\u0430\u0442"],
104
+ es: ["elecciones", "votar", "votaci\xF3n", "censo", "refer\xE9ndum"]
105
+ }
106
+ },
107
+ {
108
+ name: "government",
109
+ meaning: "a visa, residence, a permit, an appointment at a public office",
110
+ triggers: {
111
+ en: ["visa", "residence", "permit", "embassy", "consulate", "passport", "citizenship", "nie"],
112
+ ru: [
113
+ "\u0432\u0438\u0437\u0430",
114
+ "\u0432\u043D\u0436",
115
+ "\u0433\u0440\u0430\u0436\u0434\u0430\u043D\u0441\u0442\u0432\u043E",
116
+ "\u043F\u043E\u0441\u043E\u043B\u044C\u0441\u0442\u0432\u043E",
117
+ "\u043A\u043E\u043D\u0441\u0443\u043B\u044C\u0441\u0442\u0432\u043E",
118
+ "\u0433\u043E\u0441\u0443\u0441\u043B\u0443\u0433\u0438",
119
+ "\u043C\u0444\u0446",
120
+ "\u043F\u0430\u0441\u043F\u043E\u0440\u0442",
121
+ "\u0437\u0430\u0433\u0440\u0430\u043D\u043F\u0430\u0441\u043F\u043E\u0440\u0442",
122
+ "\u043F\u0440\u043E\u043F\u0438\u0441\u043A\u0430"
123
+ ],
124
+ es: [
125
+ "visado",
126
+ "residencia",
127
+ "extranjer\xEDa",
128
+ "empadronamiento",
129
+ "padr\xF3n",
130
+ "ayuntamiento",
131
+ "consulado",
132
+ "embajada",
133
+ "pasaporte",
134
+ "nie"
135
+ ]
136
+ }
137
+ },
138
+ {
139
+ name: "legal",
140
+ meaning: "a lawyer, a notary, a court or a dispute",
141
+ triggers: {
142
+ en: ["lawyer", "attorney", "notary", "court", "lawsuit", "dispute", "legal"],
143
+ ru: ["\u044E\u0440\u0438\u0441\u0442", "\u0430\u0434\u0432\u043E\u043A\u0430\u0442", "\u043D\u043E\u0442\u0430\u0440\u0438\u0443\u0441", "\u0438\u0441\u043A", "\u043F\u0440\u0435\u0442\u0435\u043D\u0437\u0438\u044F", "\u0434\u043E\u0432\u0435\u0440\u0435\u043D\u043D\u043E\u0441\u0442\u044C", "\u0441\u0443\u0434\u0435\u0431\u043D\u044B\u0439"],
144
+ es: ["abogado", "notario", "juzgado", "demanda", "tribunal", "litigio"]
145
+ }
146
+ },
147
+ {
148
+ name: "hiring",
149
+ meaning: "candidates, interviews, job offers",
150
+ triggers: {
151
+ en: ["candidate", "candidates", "interview", "hire", "hiring", "recruiter", "vacancy", "resume", "cv"],
152
+ ru: ["\u043A\u0430\u043D\u0434\u0438\u0434\u0430\u0442", "\u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043E\u0432\u0430\u043D\u0438\u0435", "\u0432\u0430\u043A\u0430\u043D\u0441\u0438\u044F", "\u0440\u0435\u0437\u044E\u043C\u0435", "\u043E\u0444\u0444\u0435\u0440", "\u043D\u0430\u0439\u043C", "\u0440\u0435\u043A\u0440\u0443\u0442\u0435\u0440"],
153
+ es: ["candidato", "entrevista", "vacante", "curr\xEDculum", "contrataci\xF3n"]
154
+ }
155
+ },
156
+ {
157
+ name: "sales",
158
+ meaning: "leads, deals, quotes",
159
+ triggers: {
160
+ en: ["quote", "pipeline", "prospect", "crm", "sales"],
161
+ ru: ["\u043B\u0438\u0434", "\u043B\u0438\u0434\u044B", "\u0441\u0434\u0435\u043B\u043A\u0430", "\u043F\u0440\u043E\u0434\u0430\u0436\u0438", "\u043A\u043E\u043C\u043C\u0435\u0440\u0447\u0435\u0441\u043A\u043E\u0435"],
162
+ es: ["venta", "ventas", "presupuesto"]
163
+ }
164
+ },
165
+ {
166
+ name: "partners",
167
+ meaning: "a partnership or an integration with another company",
168
+ triggers: {
169
+ en: ["partner", "partners", "partnership", "integration", "affiliate", "reseller"],
170
+ ru: ["\u043F\u0430\u0440\u0442\u043D\u0451\u0440", "\u043F\u0430\u0440\u0442\u043D\u0451\u0440\u044B", "\u043F\u0430\u0440\u0442\u043D\u0451\u0440\u0441\u0442\u0432\u043E", "\u0438\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044F"],
171
+ es: ["socio", "alianza", "integraci\xF3n", "colaboraci\xF3n"]
172
+ }
173
+ },
174
+ {
175
+ name: "support",
176
+ meaning: "a user's or customer's problem to solve",
177
+ triggers: {
178
+ en: ["support", "complaint", "helpdesk", "outage"],
179
+ ru: ["\u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u0430", "\u0436\u0430\u043B\u043E\u0431\u0430", "\u043E\u0431\u0440\u0430\u0449\u0435\u043D\u0438\u0435", "\u0442\u0438\u043A\u0435\u0442"],
180
+ es: ["soporte", "incidencia", "queja", "reclamaci\xF3n"]
181
+ }
182
+ },
183
+ {
184
+ name: "security",
185
+ meaning: "a hacked account, a scam, 2FA, a leak or breach",
186
+ triggers: {
187
+ en: ["hacked", "hack", "scam", "phishing", "breach", "2fa", "malware", "fraud", "spam"],
188
+ ru: ["\u0432\u0437\u043B\u043E\u043C", "\u0432\u0437\u043B\u043E\u043C\u0430\u043B\u0438", "\u043C\u043E\u0448\u0435\u043D\u043D\u0438\u043A\u0438", "\u043C\u043E\u0448\u0435\u043D\u043D\u0438\u0447\u0435\u0441\u0442\u0432\u043E", "\u0444\u0438\u0448\u0438\u043D\u0433", "\u0443\u0442\u0435\u0447\u043A\u0430", "\u0441\u043F\u0430\u043C"],
189
+ es: ["hackeado", "estafa", "fraude", "phishing", "suplantaci\xF3n"]
190
+ }
191
+ },
192
+ {
193
+ name: "access",
194
+ meaning: "a login, password, key, invite or permission to give or get",
195
+ triggers: {
196
+ en: ["access", "password", "credentials", "invite", "permission", "key", "keys", "token", "vpn"],
197
+ ru: ["\u0434\u043E\u0441\u0442\u0443\u043F", "\u043F\u0430\u0440\u043E\u043B\u044C", "\u043B\u043E\u0433\u0438\u043D", "\u043A\u043B\u044E\u0447", "\u043A\u043B\u044E\u0447\u0438", "\u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435", "\u0430\u043A\u043A\u0430\u0443\u043D\u0442"],
198
+ es: ["acceso", "contrase\xF1a", "llave", "llaves", "clave", "invitaci\xF3n", "permiso"]
199
+ }
200
+ },
201
+ {
202
+ name: "tech",
203
+ meaning: "code, servers, bugs, builds, deploys",
204
+ triggers: {
205
+ en: [
206
+ "bug",
207
+ "deploy",
208
+ "deployment",
209
+ "server",
210
+ "build",
211
+ "code",
212
+ "merge",
213
+ "crash",
214
+ "flaky",
215
+ "database",
216
+ "api",
217
+ "release",
218
+ "prod"
219
+ ],
220
+ ru: ["\u0431\u0430\u0433", "\u0434\u0435\u043F\u043B\u043E\u0439", "\u0441\u0435\u0440\u0432\u0435\u0440", "\u0441\u0431\u043E\u0440\u043A\u0430", "\u043A\u043E\u0434", "\u043F\u0443\u043B\u0440\u0435\u043A\u0432\u0435\u0441\u0442", "\u043F\u0440\u043E\u0434", "\u0440\u0435\u043B\u0438\u0437"],
221
+ es: ["fallo", "servidor", "despliegue", "c\xF3digo"]
222
+ }
223
+ },
224
+ {
225
+ name: "media",
226
+ meaning: "the press, a journalist, a podcast or an interview for the media",
227
+ triggers: {
228
+ en: ["press", "journalist", "podcast", "media"],
229
+ ru: ["\u0436\u0443\u0440\u043D\u0430\u043B\u0438\u0441\u0442", "\u043F\u0440\u0435\u0441\u0441\u0430", "\u0441\u043C\u0438", "\u043F\u043E\u0434\u043A\u0430\u0441\u0442", "\u0438\u043D\u0442\u0435\u0440\u0432\u044C\u044E", "\u0440\u0435\u0434\u0430\u043A\u0446\u0438\u044F"],
230
+ es: ["prensa", "periodista", "podcast", "entrevistarte"]
231
+ }
232
+ },
233
+ {
234
+ name: "marketing",
235
+ meaning: "campaigns, ads, SEO, newsletters, social media",
236
+ triggers: {
237
+ en: ["marketing", "campaign", "ads", "advertising", "seo", "promo", "newsletter", "instagram"],
238
+ ru: ["\u043C\u0430\u0440\u043A\u0435\u0442\u0438\u043D\u0433", "\u0440\u0435\u043A\u043B\u0430\u043C\u0430", "\u0440\u0435\u043A\u043B\u0430\u043C\u0443", "\u0442\u0430\u0440\u0433\u0435\u0442", "\u043A\u0430\u043C\u043F\u0430\u043D\u0438\u044F", "\u0440\u0430\u0441\u0441\u044B\u043B\u043A\u0430", "\u043F\u0440\u043E\u0434\u0432\u0438\u0436\u0435\u043D\u0438\u0435"],
239
+ es: ["marketing", "campa\xF1a", "publicidad", "anuncio", "anuncios", "bolet\xEDn"]
240
+ }
241
+ },
242
+ {
243
+ name: "design",
244
+ meaning: "UI, mockups, a logo or a brand to design or review",
245
+ triggers: {
246
+ en: ["design", "designer", "mockup", "mockups", "logo", "brand", "branding", "figma", "wireframe", "ui", "ux"],
247
+ ru: ["\u0434\u0438\u0437\u0430\u0439\u043D", "\u0434\u0438\u0437\u0430\u0439\u043D\u0435\u0440", "\u043C\u0430\u043A\u0435\u0442", "\u043C\u0430\u043A\u0435\u0442\u044B", "\u043B\u043E\u0433\u043E\u0442\u0438\u043F", "\u0444\u0438\u0433\u043C\u0430", "\u0431\u0440\u0435\u043D\u0434\u0438\u043D\u0433"],
248
+ es: ["dise\xF1o", "dise\xF1ador", "logotipo", "maqueta", "marca"]
249
+ }
250
+ },
251
+ {
252
+ name: "research",
253
+ meaning: "research, a survey, an analysis or a benchmark",
254
+ triggers: {
255
+ en: ["research", "survey", "benchmark", "analysis", "experiment", "dataset"],
256
+ ru: ["\u0438\u0441\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u043D\u0438\u0435", "\u043E\u043F\u0440\u043E\u0441", "\u0431\u0435\u043D\u0447\u043C\u0430\u0440\u043A", "\u044D\u043A\u0441\u043F\u0435\u0440\u0438\u043C\u0435\u043D\u0442", "\u0434\u0430\u0442\u0430\u0441\u0435\u0442"],
257
+ es: ["investigaci\xF3n", "encuesta", "experimento"]
258
+ }
259
+ },
260
+ {
261
+ name: "content",
262
+ meaning: "posts, articles, videos to write, film or review",
263
+ triggers: {
264
+ en: ["article", "blog", "video", "draft", "copywriting"],
265
+ ru: ["\u043F\u043E\u0441\u0442", "\u0431\u043B\u043E\u0433", "\u0432\u0438\u0434\u0435\u043E", "\u0440\u043E\u043B\u0438\u043A", "\u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A"],
266
+ es: ["art\xEDculo", "publicaci\xF3n", "v\xEDdeo", "video", "borrador"]
267
+ }
268
+ },
269
+ {
270
+ name: "vendors",
271
+ meaning: "a supplier, contractor or agency you pay for a service",
272
+ triggers: {
273
+ en: ["vendor", "vendors", "supplier", "suppliers", "contractor", "freelancer", "agency", "outsourcing"],
274
+ ru: ["\u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A", "\u043F\u043E\u0434\u0440\u044F\u0434\u0447\u0438\u043A", "\u0444\u0440\u0438\u043B\u0430\u043D\u0441\u0435\u0440", "\u0430\u0433\u0435\u043D\u0442\u0441\u0442\u0432\u043E", "\u0438\u0441\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C"],
275
+ es: ["proveedor", "proveedores", "contratista", "agencia"]
276
+ }
277
+ },
278
+ {
279
+ name: "car",
280
+ meaning: "the car: repairs, parking, fines, inspection",
281
+ triggers: {
282
+ en: ["car", "parking", "mechanic", "garage", "tyres", "tires", "mot"],
283
+ ru: ["\u043C\u0430\u0448\u0438\u043D\u0430", "\u0430\u0432\u0442\u043E", "\u043F\u0430\u0440\u043A\u043E\u0432\u043A\u0430", "\u0448\u0442\u0440\u0430\u0444", "\u0433\u0438\u0431\u0434\u0434", "\u0448\u0438\u043D\u043E\u043C\u043E\u043D\u0442\u0430\u0436", "\u0442\u0435\u0445\u043E\u0441\u043C\u043E\u0442\u0440"],
284
+ es: ["coche", "aparcamiento", "multa", "taller", "itv", "neum\xE1ticos"]
285
+ }
286
+ },
287
+ {
288
+ name: "travel",
289
+ meaning: "flights, trains, hotels, trips",
290
+ triggers: {
291
+ en: ["flight", "flights", "hotel", "airport", "trip", "train", "airbnb", "boarding"],
292
+ ru: ["\u0440\u0435\u0439\u0441", "\u043F\u0435\u0440\u0435\u043B\u0451\u0442", "\u0441\u0430\u043C\u043E\u043B\u0451\u0442", "\u0433\u043E\u0441\u0442\u0438\u043D\u0438\u0446\u0430", "\u043E\u0442\u0435\u043B\u044C", "\u0430\u044D\u0440\u043E\u043F\u043E\u0440\u0442", "\u043F\u043E\u0435\u0437\u0434", "\u043F\u043E\u0435\u0437\u0434\u043A\u0430", "\u043A\u043E\u043C\u0430\u043D\u0434\u0438\u0440\u043E\u0432\u043A\u0430"],
293
+ es: ["vuelo", "vuelos", "hotel", "aeropuerto", "viaje", "tren"]
294
+ }
295
+ },
296
+ {
297
+ name: "pets",
298
+ meaning: "a pet: the vet, food, a sitter, walks",
299
+ triggers: {
300
+ en: ["pet", "pets", "vet", "dog", "cat", "puppy", "kitten", "grooming"],
301
+ ru: ["\u0432\u0435\u0442\u0435\u0440\u0438\u043D\u0430\u0440", "\u0432\u0435\u0442\u043A\u043B\u0438\u043D\u0438\u043A\u0430", "\u0441\u043E\u0431\u0430\u043A\u0430", "\u0441\u043E\u0431\u0430\u043A\u0443", "\u043A\u043E\u0448\u043A\u0430", "\u043A\u043E\u0442", "\u0449\u0435\u043D\u043E\u043A", "\u043A\u043E\u0442\u0451\u043D\u043E\u043A", "\u0433\u0440\u0443\u043C\u0438\u043D\u0433"],
302
+ es: ["veterinario", "perro", "gato", "mascota", "cachorro"]
303
+ }
304
+ },
305
+ {
306
+ name: "fitness",
307
+ meaning: "the gym, training, a sport",
308
+ triggers: {
309
+ en: ["gym", "workout", "trainer", "yoga", "pilates", "fitness", "marathon", "swimming"],
310
+ ru: ["\u0441\u043F\u043E\u0440\u0442\u0437\u0430\u043B", "\u0442\u0440\u0435\u043D\u0438\u0440\u043E\u0432\u043A\u0430", "\u0442\u0440\u0435\u043D\u0435\u0440", "\u0439\u043E\u0433\u0430", "\u0444\u0438\u0442\u043D\u0435\u0441", "\u0431\u0430\u0441\u0441\u0435\u0439\u043D", "\u043F\u0440\u043E\u0431\u0435\u0436\u043A\u0430"],
311
+ es: ["gimnasio", "entrenador", "entrenamiento", "yoga", "pilates", "piscina"]
312
+ }
313
+ },
314
+ {
315
+ name: "beauty",
316
+ meaning: "a haircut, nails, cosmetics, a salon",
317
+ triggers: {
318
+ en: ["haircut", "hairdresser", "barber", "salon", "manicure", "nails", "cosmetics", "spa"],
319
+ ru: ["\u043F\u0430\u0440\u0438\u043A\u043C\u0430\u0445\u0435\u0440", "\u0441\u0442\u0440\u0438\u0436\u043A\u0430", "\u043C\u0430\u043D\u0438\u043A\u044E\u0440", "\u043A\u043E\u0441\u043C\u0435\u0442\u043E\u043B\u043E\u0433", "\u0431\u0430\u0440\u0431\u0435\u0440\u0448\u043E\u043F", "\u0441\u0430\u043B\u043E\u043D", "\u043A\u043E\u0441\u043C\u0435\u0442\u0438\u043A\u0430"],
320
+ es: ["peluquer\xEDa", "peluquero", "manicura", "u\xF1as", "est\xE9tica", "cosm\xE9tica"]
321
+ }
322
+ },
323
+ {
324
+ name: "health",
325
+ meaning: "doctors, prescriptions, medicines",
326
+ triggers: {
327
+ en: ["doctor", "dentist", "clinic", "hospital", "prescription", "pharmacy", "medicine", "medicines", "vitamins"],
328
+ ru: [
329
+ "\u0432\u0440\u0430\u0447",
330
+ "\u0441\u0442\u043E\u043C\u0430\u0442\u043E\u043B\u043E\u0433",
331
+ "\u043E\u043A\u0443\u043B\u0438\u0441\u0442",
332
+ "\u043A\u0430\u0440\u0434\u0438\u043E\u043B\u043E\u0433",
333
+ "\u0431\u043E\u043B\u044C\u043D\u0438\u0446\u0430",
334
+ "\u043F\u043E\u043B\u0438\u043A\u043B\u0438\u043D\u0438\u043A\u0430",
335
+ "\u043B\u0435\u043A\u0430\u0440\u0441\u0442\u0432\u043E",
336
+ "\u043B\u0435\u043A\u0430\u0440\u0441\u0442\u0432\u0430",
337
+ "\u0440\u0435\u0446\u0435\u043F\u0442",
338
+ "\u0430\u043F\u0442\u0435\u043A\u0430",
339
+ "\u0430\u043D\u0430\u043B\u0438\u0437\u044B",
340
+ "\u0432\u0438\u0442\u0430\u043C\u0438\u043D\u044B"
341
+ ],
342
+ es: ["m\xE9dico", "dentista", "cl\xEDnica", "hospital", "receta", "farmacia", "medicamento"]
343
+ }
344
+ },
345
+ {
346
+ name: "education",
347
+ meaning: "courses, books, languages, studies at school or university",
348
+ triggers: {
349
+ en: ["course", "lesson", "tutor", "university", "exam", "homework", "study"],
350
+ ru: ["\u043A\u0443\u0440\u0441\u044B", "\u0443\u0440\u043E\u043A", "\u0440\u0435\u043F\u0435\u0442\u0438\u0442\u043E\u0440", "\u0443\u043D\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442", "\u044D\u043A\u0437\u0430\u043C\u0435\u043D", "\u0443\u0447\u0451\u0431\u0430", "\u043B\u0435\u043A\u0446\u0438\u044F", "\u043A\u043D\u0438\u0433\u0430"],
351
+ es: ["curso", "universidad", "examen", "libro", "idioma"]
352
+ }
353
+ },
354
+ {
355
+ name: "celebrations",
356
+ meaning: "a birthday, wedding, anniversary or holiday to plan or mark",
357
+ triggers: {
358
+ en: ["birthday", "anniversary", "christmas", "celebration", "celebrate"],
359
+ ru: ["\u0440\u043E\u0436\u0434\u0435\u043D\u0438\u044F", "\u0441\u0432\u0430\u0434\u044C\u0431\u0430", "\u044E\u0431\u0438\u043B\u0435\u0439", "\u0433\u043E\u0434\u043E\u0432\u0449\u0438\u043D\u0430", "\u043F\u0440\u0430\u0437\u0434\u043D\u0438\u043A", "\u043F\u0440\u0430\u0437\u0434\u043D\u043E\u0432\u0430\u0442\u044C"],
360
+ es: ["cumplea\xF1os", "boda", "aniversario", "navidad", "celebrar", "celebraci\xF3n"]
361
+ }
362
+ },
363
+ {
364
+ name: "childcare",
365
+ meaning: "a nanny, a babysitter, kindergarten, kids' clubs",
366
+ triggers: {
367
+ en: ["nanny", "babysitter", "babysitting", "kindergarten", "daycare", "nursery"],
368
+ ru: ["\u043D\u044F\u043D\u044F", "\u0441\u0430\u0434\u0438\u043A", "\u0434\u0435\u0442\u0441\u0430\u0434", "\u043A\u0440\u0443\u0436\u043E\u043A", "\u043F\u0440\u043E\u0434\u043B\u0451\u043D\u043A\u0430"],
369
+ es: ["ni\xF1era", "guarder\xEDa", "canguro", "extraescolares"]
370
+ }
371
+ },
372
+ {
373
+ name: "elder-care",
374
+ meaning: "care for an older relative: a carer, a care home",
375
+ triggers: {
376
+ en: ["carer", "caregiver", "eldercare", "elderly"],
377
+ ru: ["\u0441\u0438\u0434\u0435\u043B\u043A\u0430", "\u043F\u0430\u043D\u0441\u0438\u043E\u043D\u0430\u0442", "\u043F\u043E\u0436\u0438\u043B\u043E\u0439", "\u043F\u043E\u0436\u0438\u043B\u044B\u0445"],
378
+ es: ["cuidadora", "cuidador", "geri\xE1trico", "mayores"]
379
+ }
380
+ },
381
+ {
382
+ name: "family",
383
+ meaning: "kids, school, parents and relatives",
384
+ triggers: {
385
+ en: [
386
+ "mum",
387
+ "mom",
388
+ "dad",
389
+ "kids",
390
+ "kid",
391
+ "school",
392
+ "grandma",
393
+ "grandpa",
394
+ "wife",
395
+ "husband",
396
+ "daughter",
397
+ "parents"
398
+ ],
399
+ ru: [
400
+ "\u043C\u0430\u043C\u0430",
401
+ "\u043F\u0430\u043F\u0430",
402
+ "\u0431\u0430\u0431\u0443\u0448\u043A\u0430",
403
+ "\u0434\u0435\u0434\u0443\u0448\u043A\u0430",
404
+ "\u0434\u0435\u0442\u0438",
405
+ "\u0440\u0435\u0431\u0451\u043D\u043E\u043A",
406
+ "\u0441\u044B\u043D",
407
+ "\u0434\u043E\u0447\u044C",
408
+ "\u043C\u0443\u0436",
409
+ "\u0436\u0435\u043D\u0430",
410
+ "\u0448\u043A\u043E\u043B\u0430",
411
+ "\u0443\u0447\u0438\u0442\u0435\u043B\u044C",
412
+ "\u043A\u043B\u0430\u0441\u0441",
413
+ "\u0440\u043E\u0434\u0438\u0442\u0435\u043B\u0438",
414
+ "\u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0435",
415
+ "\u0434\u043D\u0435\u0432\u043D\u0438\u043A",
416
+ "\u0442\u0451\u0442\u044F"
417
+ ],
418
+ es: ["mam\xE1", "pap\xE1", "hijos", "hijo", "hija", "colegio", "abuela", "abuelo", "padres", "ni\xF1os"]
419
+ }
420
+ },
421
+ {
422
+ name: "real-estate",
423
+ meaning: "buying, selling or letting a property; a mortgage",
424
+ triggers: {
425
+ en: ["mortgage", "property", "realtor", "tenant", "tenants"],
426
+ ru: ["\u0438\u043F\u043E\u0442\u0435\u043A\u0430", "\u043D\u0435\u0434\u0432\u0438\u0436\u0438\u043C\u043E\u0441\u0442\u044C", "\u0440\u0438\u0435\u043B\u0442\u043E\u0440", "\u0440\u0438\u044D\u043B\u0442\u043E\u0440", "\u0430\u0440\u0435\u043D\u0434\u0430\u0442\u043E\u0440", "\u0430\u0440\u0435\u043D\u0434\u0430\u0442\u043E\u0440\u044B"],
427
+ es: ["hipoteca", "inmobiliaria", "inmueble", "compraventa", "tasaci\xF3n", "inquilino"]
428
+ }
429
+ },
430
+ {
431
+ name: "moving",
432
+ meaning: "moving house: movers, boxes, a new address",
433
+ triggers: {
434
+ en: ["movers", "relocation", "relocate", "removals"],
435
+ ru: ["\u043F\u0435\u0440\u0435\u0435\u0437\u0434", "\u043F\u0435\u0440\u0435\u0435\u0445\u0430\u0442\u044C", "\u043F\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u0435\u043C", "\u0433\u0440\u0443\u0437\u0447\u0438\u043A\u0438"],
436
+ es: ["mudanza", "mudarse", "mudanzas"]
437
+ }
438
+ },
439
+ {
440
+ name: "home",
441
+ meaning: "the flat: repairs, rent, the landlord, neighbours",
442
+ triggers: {
443
+ en: [
444
+ "flat",
445
+ "apartment",
446
+ "landlord",
447
+ "rent",
448
+ "plumber",
449
+ "leak",
450
+ "electrician",
451
+ "neighbours",
452
+ "boiler",
453
+ "intercom",
454
+ "repair"
455
+ ],
456
+ ru: [
457
+ "\u043A\u0432\u0430\u0440\u0442\u0438\u0440\u0430",
458
+ "\u0430\u0440\u0435\u043D\u0434\u0430",
459
+ "\u0440\u0435\u043C\u043E\u043D\u0442",
460
+ "\u0441\u0430\u043D\u0442\u0435\u0445\u043D\u0438\u043A",
461
+ "\u043F\u0440\u043E\u0442\u0435\u0447\u043A\u0430",
462
+ "\u044D\u043B\u0435\u043A\u0442\u0440\u0438\u043A",
463
+ "\u0441\u043E\u0441\u0435\u0434\u0438",
464
+ "\u043F\u043E\u0434\u044A\u0435\u0437\u0434",
465
+ "\u0434\u043E\u043C\u043E\u0444\u043E\u043D",
466
+ "\u043F\u043E\u0434\u0432\u0430\u043B",
467
+ "\u0447\u0435\u0440\u0434\u0430\u043A",
468
+ "\u044D\u0442\u0430\u0436",
469
+ "\u043A\u043E\u0440\u0438\u0434\u043E\u0440",
470
+ "\u0436\u0438\u043B\u044C\u0446\u044B"
471
+ ],
472
+ es: ["piso", "alquiler", "casero", "fontanero", "aver\xEDa", "vecinos", "portal", "reforma", "calefacci\xF3n"]
473
+ }
474
+ },
475
+ {
476
+ name: "delivery",
477
+ meaning: "a parcel, order or courier to send, track or collect",
478
+ triggers: {
479
+ en: ["delivery", "deliver", "parcel", "package", "shipment", "ship", "courier", "tracking", "pickup", "order"],
480
+ ru: ["\u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0430", "\u043F\u043E\u0441\u044B\u043B\u043A\u0430", "\u043A\u0443\u0440\u044C\u0435\u0440", "\u0442\u0440\u0435\u043A", "\u0432\u044B\u0434\u0430\u0447\u0438", "\u0441\u0434\u044D\u043A", "\u043E\u0437\u043E\u043D", "\u0437\u0430\u043A\u0430\u0437"],
481
+ es: ["entrega", "paquete", "env\xEDo", "pedido", "mensajero", "repartidor", "correos"]
482
+ }
483
+ },
484
+ {
485
+ name: "devices",
486
+ meaning: "a phone, laptop or gadget to buy, fix or set up",
487
+ triggers: {
488
+ en: ["laptop", "iphone", "smartphone", "printer", "router", "charger", "headphones", "macbook", "gadget"],
489
+ ru: ["\u043D\u043E\u0443\u0442\u0431\u0443\u043A", "\u0441\u043C\u0430\u0440\u0442\u0444\u043E\u043D", "\u0430\u0439\u0444\u043E\u043D", "\u043F\u0440\u0438\u043D\u0442\u0435\u0440", "\u0440\u043E\u0443\u0442\u0435\u0440", "\u0437\u0430\u0440\u044F\u0434\u043A\u0430", "\u043D\u0430\u0443\u0448\u043D\u0438\u043A\u0438", "\u043C\u0430\u043A\u0431\u0443\u043A", "\u0433\u0430\u0434\u0436\u0435\u0442"],
490
+ es: ["port\xE1til", "impresora", "cargador", "auriculares", "router", "smartphone"]
491
+ }
492
+ },
493
+ {
494
+ name: "food",
495
+ meaning: "groceries, cooking, a restaurant",
496
+ triggers: {
497
+ en: ["groceries", "restaurant", "cook", "cooking", "recipe", "takeaway"],
498
+ ru: ["\u043F\u0440\u043E\u0434\u0443\u043A\u0442\u044B", "\u0440\u0435\u0441\u0442\u043E\u0440\u0430\u043D", "\u0441\u0442\u043E\u043B\u0438\u043A", "\u0433\u043E\u0442\u043E\u0432\u0438\u0442\u044C", "\u043A\u0443\u043B\u0438\u043D\u0430\u0440\u0438\u044F"],
499
+ es: ["restaurante", "comida", "cocinar", "mercadona"]
500
+ }
501
+ },
502
+ {
503
+ name: "shopping",
504
+ meaning: "things to buy",
505
+ triggers: {
506
+ en: ["buy", "purchase", "shop", "shopping"],
507
+ ru: ["\u043A\u0443\u043F\u0438\u0442\u044C", "\u043F\u043E\u043A\u0443\u043F\u043A\u0430", "\u043C\u0430\u0433\u0430\u0437\u0438\u043D"],
508
+ es: ["comprar", "compra", "tienda", "supermercado"]
509
+ }
510
+ },
511
+ {
512
+ name: "hobbies",
513
+ meaning: "a hobby: music, photography, crafts, a game you play",
514
+ triggers: {
515
+ en: ["hobby", "guitar", "piano", "photography", "painting", "knitting", "fishing", "chess"],
516
+ ru: ["\u0445\u043E\u0431\u0431\u0438", "\u0433\u0438\u0442\u0430\u0440\u0430", "\u0444\u043E\u0440\u0442\u0435\u043F\u0438\u0430\u043D\u043E", "\u0440\u0438\u0441\u043E\u0432\u0430\u043D\u0438\u0435", "\u0444\u043E\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u044F", "\u0440\u044B\u0431\u0430\u043B\u043A\u0430", "\u0448\u0430\u0445\u043C\u0430\u0442\u044B"],
517
+ es: ["afici\xF3n", "guitarra", "piano", "fotograf\xEDa", "pintura", "pesca", "ajedrez"]
518
+ }
519
+ },
520
+ {
521
+ name: "entertainment",
522
+ meaning: "films, series, concerts, games, shows",
523
+ triggers: {
524
+ en: ["film", "movie", "cinema", "series", "concert", "game", "theatre", "theater", "netflix"],
525
+ ru: ["\u0444\u0438\u043B\u044C\u043C", "\u0441\u0435\u0440\u0438\u0430\u043B", "\u043A\u043E\u043D\u0446\u0435\u0440\u0442", "\u0438\u0433\u0440\u0430", "\u0442\u0435\u0430\u0442\u0440", "\u0441\u043F\u0435\u043A\u0442\u0430\u043A\u043B\u044C", "\u043C\u0430\u0442\u0447", "\u043A\u0438\u043D\u043E\u0442\u0435\u0430\u0442\u0440"],
526
+ es: ["pel\xEDcula", "cine", "serie", "concierto", "juego", "teatro"]
527
+ }
528
+ },
529
+ {
530
+ name: "events",
531
+ meaning: "an event, tickets, a venue, an RSVP",
532
+ triggers: {
533
+ en: ["event", "tickets", "ticket", "rsvp", "venue", "conference", "festival", "party", "reservation"],
534
+ ru: ["\u043C\u0435\u0440\u043E\u043F\u0440\u0438\u044F\u0442\u0438\u0435", "\u0431\u0438\u043B\u0435\u0442\u044B", "\u043A\u043E\u043D\u0444\u0435\u0440\u0435\u043D\u0446\u0438\u044F", "\u0444\u0435\u0441\u0442\u0438\u0432\u0430\u043B\u044C", "\u0432\u0435\u0447\u0435\u0440\u0438\u043D\u043A\u0430"],
535
+ es: ["evento", "entradas", "fiesta", "congreso", "conferencia"]
536
+ }
537
+ },
538
+ {
539
+ name: "religion",
540
+ meaning: "church, a service, a religious holiday or rite",
541
+ triggers: {
542
+ en: ["church", "mosque", "synagogue", "temple", "prayer", "priest", "baptism"],
543
+ ru: ["\u0446\u0435\u0440\u043A\u043E\u0432\u044C", "\u0445\u0440\u0430\u043C", "\u0431\u0430\u0442\u044E\u0448\u043A\u0430", "\u043C\u043E\u043B\u0438\u0442\u0432\u0430", "\u043A\u0440\u0435\u0449\u0435\u043D\u0438\u0435", "\u043B\u0438\u0442\u0443\u0440\u0433\u0438\u044F"],
544
+ es: ["iglesia", "misa", "parroquia", "bautizo", "sacerdote"]
545
+ }
546
+ },
547
+ {
548
+ name: "community",
549
+ meaning: "a group or club you run or help: members, moderation, admin work",
550
+ triggers: {
551
+ en: ["community", "club", "members", "volunteer", "moderator"],
552
+ ru: ["\u0441\u043E\u043E\u0431\u0449\u0435\u0441\u0442\u0432\u043E", "\u043A\u043B\u0443\u0431", "\u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0438", "\u043C\u043E\u0434\u0435\u0440\u0430\u0446\u0438\u044F", "\u0432\u043E\u043B\u043E\u043D\u0442\u0451\u0440"],
553
+ es: ["comunidad", "voluntario", "miembros"]
554
+ }
555
+ },
556
+ {
557
+ name: "intro",
558
+ meaning: "introduce people, or ask for an introduction",
559
+ triggers: {
560
+ en: ["intro", "introduce", "introduction", "referral"],
561
+ ru: ["\u043F\u043E\u0437\u043D\u0430\u043A\u043E\u043C\u0438\u0442\u044C", "\u043F\u043E\u0437\u043D\u0430\u043A\u043E\u043C\u044C", "\u0437\u043D\u0430\u043A\u043E\u043C\u0441\u0442\u0432\u043E"],
562
+ es: ["presentarte", "presentaros"]
563
+ }
564
+ },
565
+ {
566
+ name: "money",
567
+ meaning: "pay, invoice, refund, a price or a debt",
568
+ triggers: {
569
+ en: [
570
+ "pay",
571
+ "payment",
572
+ "invoice",
573
+ "refund",
574
+ "price",
575
+ "money",
576
+ "transfer",
577
+ "debt",
578
+ "owe",
579
+ "cost",
580
+ "reimburse",
581
+ "expenses"
582
+ ],
583
+ ru: [
584
+ "\u043E\u043F\u043B\u0430\u0442\u0430",
585
+ "\u043E\u043F\u043B\u0430\u0442\u0438\u0442\u044C",
586
+ "\u043F\u043B\u0430\u0442\u0451\u0436",
587
+ "\u0441\u0447\u0451\u0442",
588
+ "\u0434\u0435\u043D\u044C\u0433\u0438",
589
+ "\u043F\u0435\u0440\u0435\u0432\u043E\u0434",
590
+ "\u043F\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438",
591
+ "\u0434\u043E\u043B\u0433",
592
+ "\u0446\u0435\u043D\u0430",
593
+ "\u0441\u0442\u043E\u0438\u043C\u043E\u0441\u0442\u044C",
594
+ "\u0432\u043E\u0437\u0432\u0440\u0430\u0442",
595
+ "\u0432\u0435\u0440\u043D\u0443\u0442\u044C",
596
+ "\u0441\u043A\u0438\u043D\u0443\u0442\u044C\u0441\u044F"
597
+ ],
598
+ es: ["pagar", "pago", "factura", "dinero", "transferencia", "deuda", "precio", "reembolso", "cobrar"]
599
+ }
600
+ },
601
+ {
602
+ name: "documents",
603
+ meaning: "a contract, scan, form or signature to send or receive",
604
+ triggers: {
605
+ en: [
606
+ "document",
607
+ "documents",
608
+ "contract",
609
+ "scan",
610
+ "sign",
611
+ "signature",
612
+ "form",
613
+ "certificate",
614
+ "pdf",
615
+ "agreement",
616
+ "nda"
617
+ ],
618
+ ru: ["\u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442", "\u0434\u043E\u0433\u043E\u0432\u043E\u0440", "\u0441\u043A\u0430\u043D", "\u043F\u043E\u0434\u043F\u0438\u0441\u0430\u0442\u044C", "\u043F\u043E\u0434\u043F\u0438\u0441\u044C", "\u0430\u043D\u043A\u0435\u0442\u0430", "\u0441\u043F\u0440\u0430\u0432\u043A\u0430", "\u0430\u043A\u0442", "\u0441\u043E\u0433\u043B\u0430\u0441\u0438\u0435", "\u043F\u0440\u043E\u0442\u043E\u043A\u043E\u043B"],
619
+ es: ["documento", "contrato", "escaneo", "firmar", "firma", "formulario", "certificado"]
620
+ }
621
+ },
622
+ {
623
+ name: "admin",
624
+ meaning: "office admin: supplies, errands, paperwork with no closer area",
625
+ triggers: {
626
+ en: ["admin", "paperwork", "errand", "errands", "stationery", "supplies"],
627
+ ru: ["\u043A\u0430\u043D\u0446\u0435\u043B\u044F\u0440\u0438\u044F", "\u043A\u0430\u043D\u0446\u0442\u043E\u0432\u0430\u0440\u044B", "\u043F\u043E\u0440\u0443\u0447\u0435\u043D\u0438\u0435", "\u0431\u0443\u043C\u0430\u0436\u043A\u0438"],
628
+ es: ["papeleo", "recado", "recados", "gestiones"]
629
+ }
630
+ },
631
+ {
632
+ name: "meeting",
633
+ meaning: "a call, meeting or appointment to arrange or attend",
634
+ triggers: {
635
+ en: ["meeting", "meet", "call", "appointment", "schedule", "zoom", "reschedule", "agenda", "sync", "standup"],
636
+ ru: ["\u0432\u0441\u0442\u0440\u0435\u0447\u0430", "\u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044C\u0441\u044F", "\u0441\u043E\u0437\u0432\u043E\u043D", "\u0441\u043E\u0437\u0432\u043E\u043D\u0438\u0442\u044C\u0441\u044F", "\u0437\u0432\u043E\u043D\u043E\u043A", "\u043F\u043E\u0437\u0432\u043E\u043D\u0438\u0442\u044C", "\u0441\u043E\u0431\u0440\u0430\u043D\u0438\u0435"],
637
+ es: ["reuni\xF3n", "reunirse", "llamada", "cita", "agenda", "videollamada"]
638
+ }
639
+ },
640
+ {
641
+ name: "clients",
642
+ meaning: "a client's request, a proposal, a client follow-up",
643
+ triggers: {
644
+ en: ["client", "clients", "customer", "proposal"],
645
+ ru: ["\u043A\u043B\u0438\u0435\u043D\u0442", "\u0437\u0430\u043A\u0430\u0437\u0447\u0438\u043A"],
646
+ es: ["cliente", "propuesta"]
647
+ }
648
+ },
649
+ {
650
+ name: "projects",
651
+ meaning: "deliverables, deadlines, launches",
652
+ triggers: {
653
+ en: ["project", "deadline", "launch", "milestone", "deliverable", "roadmap", "sprint"],
654
+ ru: ["\u043F\u0440\u043E\u0435\u043A\u0442", "\u0434\u0435\u0434\u043B\u0430\u0439\u043D", "\u0437\u0430\u043F\u0443\u0441\u043A", "\u0441\u043F\u0440\u0438\u043D\u0442"],
655
+ es: ["proyecto", "lanzamiento", "plazo"]
656
+ }
657
+ },
658
+ {
659
+ name: "team",
660
+ meaning: "colleagues, reviews, one-to-ones, time off",
661
+ triggers: {
662
+ en: ["team", "colleague", "colleagues", "vacation", "onboarding", "manager"],
663
+ ru: ["\u043A\u043E\u043C\u0430\u043D\u0434\u0430", "\u043A\u043E\u043B\u043B\u0435\u0433\u0430", "\u043A\u043E\u043B\u043B\u0435\u0433\u0438", "\u043E\u0442\u043F\u0443\u0441\u043A", "\u043E\u043D\u0431\u043E\u0440\u0434\u0438\u043D\u0433", "\u0440\u0443\u043A\u043E\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C"],
664
+ es: ["equipo", "compa\xF1ero", "vacaciones"]
665
+ }
666
+ },
667
+ {
668
+ name: "follow-up",
669
+ meaning: "you wait for someone: chase them",
670
+ triggers: {
671
+ en: ["remind", "reminder", "chase", "nudge", "followup"],
672
+ ru: ["\u043D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u044E", "\u043D\u0430\u043F\u043E\u043C\u043D\u0438\u0442\u044C", "\u043D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u0435", "\u043F\u0438\u043D\u0433"],
673
+ es: ["recordatorio", "recordar"]
674
+ }
675
+ },
676
+ {
677
+ name: "reply",
678
+ meaning: "someone waits for your answer",
679
+ triggers: {
680
+ en: ["reply", "respond", "answer"],
681
+ ru: ["\u043E\u0442\u0432\u0435\u0442\u044C", "\u043E\u0442\u0432\u0435\u0442\u0438\u0442\u044C", "\u043E\u0442\u0432\u0435\u0442"],
682
+ es: ["responder", "respuesta", "contestar", "contesta"]
683
+ }
684
+ },
685
+ {
686
+ name: "work",
687
+ meaning: "a job task with no closer category",
688
+ triggers: {
689
+ en: ["work", "job", "office", "task"],
690
+ ru: ["\u0440\u0430\u0431\u043E\u0442\u0430", "\u043E\u0444\u0438\u0441", "\u0437\u0430\u0434\u0430\u0447\u0430", "\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0438\u043A"],
691
+ es: ["trabajo", "oficina", "tarea", "jefe"]
692
+ }
693
+ },
694
+ {
695
+ name: "personal",
696
+ meaning: "friends, gifts, favours",
697
+ triggers: {
698
+ en: ["friend", "friends", "gift", "favour", "favor"],
699
+ ru: ["\u043F\u043E\u0434\u0440\u0443\u0433\u0430", "\u043F\u043E\u0434\u0430\u0440\u043E\u043A", "\u043F\u0440\u043E\u0441\u044C\u0431\u0430", "\u0434\u0440\u0443\u0437\u044C\u044F"],
700
+ es: ["amigo", "amiga", "regalo", "favor"]
701
+ }
702
+ },
703
+ { name: "other", meaning: "none of the above", triggers: { en: [], ru: [], es: [] } }
704
+ ];
705
+ var FALLBACK_CATEGORY = "other";
706
+ var unlistedNote = /* @__PURE__ */ __name((unlisted, tool) => unlisted.map(({ name, open, total }) => `${total} task${total === 1 ? "" : "s"} (${open} open) still use ${name}, which is not in the list: ${tool} tasks list category:${name} shows them, ${tool} tasks update <id> --category <name> moves one`), "unlistedNote");
707
+ var LANGUAGES = ["en", "ru", "es"];
708
+ var NAME = /^[a-z][a-z0-9-]{0,29}$/;
709
+ var MAX_CATEGORIES = 80;
710
+ var parseTaskCategory = /* @__PURE__ */ __name((name, value) => {
711
+ const named = name.trim().toLowerCase();
712
+ if (!NAME.test(named))
713
+ throw new CliError("validation_error", `a category name is a lower-case word of letters, digits and -, up to 30 \u2014 not "${singleLine(name)}"`);
714
+ const [meaning = "", words = ""] = value.split("|", 2).map((part) => part.trim());
715
+ if (!meaning || meaning.length > 200)
716
+ throw new CliError("validation_error", 'a category takes "<meaning> | <trigger words, comma-separated>", the meaning up to 200 characters');
717
+ const triggers = { en: [], ru: [], es: [] };
718
+ for (const typed of words.split(",").map((word) => word.trim()).filter(Boolean)) {
719
+ const tagged = /^(en|ru|es):\s*(.+)$/i.exec(typed);
720
+ const word = (tagged?.[2] ?? typed).toLowerCase();
721
+ const language = tagged?.[1]?.toLowerCase() ?? (new RegExp("\\p{Script=Cyrillic}", "u").test(word) ? "ru" : "en");
722
+ if (!triggers[language].includes(word))
723
+ triggers[language].push(word.slice(0, 60));
724
+ }
725
+ if (Object.values(triggers).flat().length > 100)
726
+ throw new CliError("validation_error", "a category takes up to 100 trigger words");
727
+ return { name: named, meaning, triggers };
728
+ }, "parseTaskCategory");
729
+ var withTaskCategory = /* @__PURE__ */ __name((list, name, value) => {
730
+ const named = name.trim().toLowerCase();
731
+ if (value === void 0) {
732
+ if (named === FALLBACK_CATEGORY)
733
+ throw new CliError("validation_error", `${FALLBACK_CATEGORY} stays: a rule picks it when no trigger word matches`);
734
+ if (!list.some((one) => one.name === named))
735
+ throw new CliError("not_found", `no task category ${singleLine(named)} \u2014 tasks categories lists them`);
736
+ return list.filter((one) => one.name !== named);
737
+ }
738
+ const category = parseTaskCategory(named, value);
739
+ if (list.some((one) => one.name === named))
740
+ return list.map((one) => one.name === named ? category : one);
741
+ if (list.length >= MAX_CATEGORIES)
742
+ throw new CliError("validation_error", `the category list takes up to ${MAX_CATEGORIES} categories`);
743
+ const fallback = list.findIndex((one) => one.name === FALLBACK_CATEGORY);
744
+ return fallback < 0 ? [...list, category] : [...list.slice(0, fallback), category, ...list.slice(fallback)];
745
+ }, "withTaskCategory");
746
+ var taskCategoryValue = /* @__PURE__ */ __name(({ meaning, triggers }) => {
747
+ const words = LANGUAGES.flatMap((language) => triggers[language].map((word) => `${language}:${word}`));
748
+ return words.length === 0 ? meaning : `${meaning} | ${words.join(", ")}`;
749
+ }, "taskCategoryValue");
750
+ var wordsOf = /* @__PURE__ */ __name((words) => Array.isArray(words) ? words.map(String) : [], "wordsOf");
751
+ var storedTaskCategories = /* @__PURE__ */ __name((json) => {
752
+ try {
753
+ const parsed = JSON.parse(json);
754
+ if (!Array.isArray(parsed))
755
+ return void 0;
756
+ const list = parsed.map((one) => {
757
+ const { name, meaning, triggers } = one;
758
+ if (typeof name !== "string" || typeof meaning !== "string" || typeof triggers !== "object")
759
+ throw new Error();
760
+ return {
761
+ name,
762
+ meaning,
763
+ triggers: {
764
+ en: wordsOf(triggers.en),
765
+ ru: wordsOf(triggers.ru),
766
+ es: wordsOf(triggers.es)
767
+ }
768
+ };
769
+ });
770
+ return list.some((one) => one.name === FALLBACK_CATEGORY) ? list : void 0;
771
+ } catch {
772
+ return void 0;
773
+ }
774
+ }, "storedTaskCategories");
775
+
776
+ // 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/store/shared-config.js
777
+ var SECTION = "task_categories";
778
+ var sharedConfigPath = /* @__PURE__ */ __name((store, env = process.env) => {
779
+ const paths = resolvePaths({ appName: "WireCat", prefix: "WIRECAT", env });
780
+ if (env.WIRECAT_CONFIG_DIR)
781
+ return join(paths.config, "config.json");
782
+ return resolve(store) === resolve(storePath({ ...env, MESSAGING_STORE: void 0 })) ? join(paths.config, "config.json") : join(dirname(store), "config.json");
783
+ }, "sharedConfigPath");
784
+ var readJson = /* @__PURE__ */ __name((path) => {
785
+ let text;
786
+ try {
787
+ text = readFileSync(path, "utf8");
788
+ } catch (error) {
789
+ if (error.code === "ENOENT")
790
+ return void 0;
791
+ throw error;
792
+ }
793
+ let parsed;
794
+ try {
795
+ parsed = JSON.parse(text);
796
+ } catch (error) {
797
+ throw new CliError("configuration_error", `${path} is not valid JSON: ${error.message}`);
798
+ }
799
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed))
800
+ throw new CliError("configuration_error", `${path} must hold a JSON object`);
801
+ return parsed;
802
+ }, "readJson");
803
+ var readTaskCategoryEdits = /* @__PURE__ */ __name((path) => {
804
+ const section = readSharedSection(path, SECTION);
805
+ if (section === void 0)
806
+ return void 0;
807
+ if (section === null || typeof section !== "object" || Array.isArray(section))
808
+ throw new CliError("configuration_error", `${path}: ${SECTION} must be an object of "<name>": "<meaning> | <words>"`);
809
+ for (const [name, value] of Object.entries(section))
810
+ if (value !== null && typeof value !== "string")
811
+ throw new CliError("configuration_error", `${path}: ${SECTION}.${name} takes "<meaning> | <words>", or null to drop the category`);
812
+ return section;
813
+ }, "readTaskCategoryEdits");
814
+ var applyTaskCategoryEdits = /* @__PURE__ */ __name((base, edits, path) => Object.entries(edits).reduce((list, [name, value]) => {
815
+ if (value === null && !list.some((one) => one.name === name.trim().toLowerCase()))
816
+ return list;
817
+ try {
818
+ return withTaskCategory(list, name, value ?? void 0);
819
+ } catch (error) {
820
+ if (error instanceof CliError)
821
+ throw new CliError("configuration_error", `${path}: ${error.message}`);
822
+ throw error;
823
+ }
824
+ }, base), "applyTaskCategoryEdits");
825
+ var editsFrom = /* @__PURE__ */ __name((list) => {
826
+ const edits = {};
827
+ const kept = new Map(list.map((one) => [one.name, one]));
828
+ for (const one of DEFAULT_TASK_CATEGORIES)
829
+ if (!kept.has(one.name) && one.name !== FALLBACK_CATEGORY)
830
+ edits[one.name] = null;
831
+ for (const one of list) {
832
+ const value = taskCategoryValue(one);
833
+ const before = DEFAULT_TASK_CATEGORIES.find(({ name }) => name === one.name);
834
+ if (!before || taskCategoryValue(before) !== value)
835
+ edits[one.name] = value;
836
+ }
837
+ return edits;
838
+ }, "editsFrom");
839
+ var readSharedSection = /* @__PURE__ */ __name((path, section) => readJson(path)?.[section], "readSharedSection");
840
+ var writeSharedSection = /* @__PURE__ */ __name((path, section, value) => {
841
+ const file = readJson(path) ?? {};
842
+ if (value === void 0)
843
+ delete file[section];
844
+ else
845
+ file[section] = value;
846
+ mkdirSync(dirname(path), { recursive: true, mode: 448 });
847
+ const temporary = `${path}.${process.pid}.tmp`;
848
+ writeFileSync(temporary, `${JSON.stringify(file, null, 2)}
849
+ `, { mode: 384 });
850
+ renameSync(temporary, path);
851
+ }, "writeSharedSection");
852
+ var writeTaskCategoryEdits = /* @__PURE__ */ __name((path, edits) => writeSharedSection(path, SECTION, edits === void 0 || Object.keys(edits).length === 0 ? void 0 : edits), "writeTaskCategoryEdits");
853
+ var taskCategoriesReader = /* @__PURE__ */ __name((path) => {
854
+ let seen;
855
+ return (base) => {
856
+ let stamp = "none";
857
+ try {
858
+ const { mtimeMs, size } = statSync(path);
859
+ stamp = `${mtimeMs}:${size}`;
860
+ } catch {
861
+ }
862
+ if (seen?.stamp === stamp && seen.base === base)
863
+ return seen.list;
864
+ const edits = readTaskCategoryEdits(path);
865
+ const list = edits ? applyTaskCategoryEdits(base, edits, path) : base;
866
+ seen = { stamp, base, list };
867
+ return list;
868
+ };
869
+ }, "taskCategoriesReader");
870
+
871
+ export {
872
+ DEFAULT_TASK_CATEGORIES,
873
+ FALLBACK_CATEGORY,
874
+ unlistedNote,
875
+ withTaskCategory,
876
+ taskCategoryValue,
877
+ storedTaskCategories,
878
+ sharedConfigPath,
879
+ readTaskCategoryEdits,
880
+ applyTaskCategoryEdits,
881
+ editsFrom,
882
+ readSharedSection,
883
+ writeSharedSection,
884
+ writeTaskCategoryEdits,
885
+ taskCategoriesReader
886
+ };