@leemour/cli-messaging 0.146.0 → 0.148.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) hide show
  1. package/dist/background/index.d.ts +1 -1
  2. package/dist/background/index.d.ts.map +1 -1
  3. package/dist/background/index.js +1 -1
  4. package/dist/background/index.js.map +1 -1
  5. package/dist/background/lock.d.ts +6 -0
  6. package/dist/background/lock.d.ts.map +1 -1
  7. package/dist/background/lock.js +31 -1
  8. package/dist/background/lock.js.map +1 -1
  9. package/dist/background/units.d.ts +1 -0
  10. package/dist/background/units.d.ts.map +1 -1
  11. package/dist/background/units.js +9 -0
  12. package/dist/background/units.js.map +1 -1
  13. package/dist/cli/bot/people.js +1 -1
  14. package/dist/cli/bot/people.js.map +1 -1
  15. package/dist/cli/config-command.d.ts.map +1 -1
  16. package/dist/cli/config-command.js +17 -3
  17. package/dist/cli/config-command.js.map +1 -1
  18. package/dist/cli/index.d.ts +6 -1
  19. package/dist/cli/index.d.ts.map +1 -1
  20. package/dist/cli/index.js +5 -0
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/cli/messenger/backfill-command.d.ts.map +1 -1
  23. package/dist/cli/messenger/backfill-command.js +4 -0
  24. package/dist/cli/messenger/backfill-command.js.map +1 -1
  25. package/dist/cli/messenger/chats-command.d.ts.map +1 -1
  26. package/dist/cli/messenger/chats-command.js +2 -2
  27. package/dist/cli/messenger/chats-command.js.map +1 -1
  28. package/dist/cli/messenger/chats-members-command.d.ts.map +1 -1
  29. package/dist/cli/messenger/chats-members-command.js +35 -1
  30. package/dist/cli/messenger/chats-members-command.js.map +1 -1
  31. package/dist/cli/messenger/chats-stats-command.js +1 -1
  32. package/dist/cli/messenger/chats-stats-command.js.map +1 -1
  33. package/dist/cli/messenger/contacts-command.d.ts.map +1 -1
  34. package/dist/cli/messenger/contacts-command.js +45 -1
  35. package/dist/cli/messenger/contacts-command.js.map +1 -1
  36. package/dist/cli/messenger/context.d.ts +10 -1
  37. package/dist/cli/messenger/context.d.ts.map +1 -1
  38. package/dist/cli/messenger/context.js +21 -2
  39. package/dist/cli/messenger/context.js.map +1 -1
  40. package/dist/cli/messenger/conversations-command.d.ts.map +1 -1
  41. package/dist/cli/messenger/conversations-command.js +6 -20
  42. package/dist/cli/messenger/conversations-command.js.map +1 -1
  43. package/dist/cli/messenger/doctor-command.d.ts +14 -0
  44. package/dist/cli/messenger/doctor-command.d.ts.map +1 -1
  45. package/dist/cli/messenger/doctor-command.js +117 -6
  46. package/dist/cli/messenger/doctor-command.js.map +1 -1
  47. package/dist/cli/messenger/flood-command.d.ts +8 -0
  48. package/dist/cli/messenger/flood-command.d.ts.map +1 -0
  49. package/dist/cli/messenger/flood-command.js +31 -0
  50. package/dist/cli/messenger/flood-command.js.map +1 -0
  51. package/dist/cli/messenger/flooded.d.ts +12 -0
  52. package/dist/cli/messenger/flooded.d.ts.map +1 -0
  53. package/dist/cli/messenger/flooded.js +77 -0
  54. package/dist/cli/messenger/flooded.js.map +1 -0
  55. package/dist/cli/messenger/inbox.d.ts +1 -0
  56. package/dist/cli/messenger/inbox.d.ts.map +1 -1
  57. package/dist/cli/messenger/inbox.js +4 -3
  58. package/dist/cli/messenger/inbox.js.map +1 -1
  59. package/dist/cli/messenger/mcp-command.d.ts +12 -0
  60. package/dist/cli/messenger/mcp-command.d.ts.map +1 -1
  61. package/dist/cli/messenger/mcp-command.js +49 -3
  62. package/dist/cli/messenger/mcp-command.js.map +1 -1
  63. package/dist/cli/messenger/messages-search-command.d.ts +2 -0
  64. package/dist/cli/messenger/messages-search-command.d.ts.map +1 -1
  65. package/dist/cli/messenger/messages-search-command.js +49 -16
  66. package/dist/cli/messenger/messages-search-command.js.map +1 -1
  67. package/dist/cli/messenger/messages-stats-command.d.ts +2 -0
  68. package/dist/cli/messenger/messages-stats-command.d.ts.map +1 -1
  69. package/dist/cli/messenger/messages-stats-command.js +35 -11
  70. package/dist/cli/messenger/messages-stats-command.js.map +1 -1
  71. package/dist/cli/messenger/points.d.ts +2 -1
  72. package/dist/cli/messenger/points.d.ts.map +1 -1
  73. package/dist/cli/messenger/points.js +1 -0
  74. package/dist/cli/messenger/points.js.map +1 -1
  75. package/dist/cli/messenger/port.d.ts +25 -1
  76. package/dist/cli/messenger/port.d.ts.map +1 -1
  77. package/dist/cli/messenger/port.js.map +1 -1
  78. package/dist/cli/messenger/private-files.d.ts +25 -0
  79. package/dist/cli/messenger/private-files.d.ts.map +1 -0
  80. package/dist/cli/messenger/private-files.js +28 -0
  81. package/dist/cli/messenger/private-files.js.map +1 -0
  82. package/dist/cli/messenger/replies-command.d.ts +5 -0
  83. package/dist/cli/messenger/replies-command.d.ts.map +1 -0
  84. package/dist/cli/messenger/replies-command.js +78 -0
  85. package/dist/cli/messenger/replies-command.js.map +1 -0
  86. package/dist/cli/messenger/report.d.ts +5 -0
  87. package/dist/cli/messenger/report.d.ts.map +1 -1
  88. package/dist/cli/messenger/report.js +25 -7
  89. package/dist/cli/messenger/report.js.map +1 -1
  90. package/dist/cli/messenger/review.d.ts.map +1 -1
  91. package/dist/cli/messenger/review.js +5 -3
  92. package/dist/cli/messenger/review.js.map +1 -1
  93. package/dist/cli/messenger/searches-command.d.ts +5 -0
  94. package/dist/cli/messenger/searches-command.d.ts.map +1 -0
  95. package/dist/cli/messenger/searches-command.js +117 -0
  96. package/dist/cli/messenger/searches-command.js.map +1 -0
  97. package/dist/cli/messenger/serve-command.d.ts.map +1 -1
  98. package/dist/cli/messenger/serve-command.js +87 -8
  99. package/dist/cli/messenger/serve-command.js.map +1 -1
  100. package/dist/cli/messenger/server-command.d.ts.map +1 -1
  101. package/dist/cli/messenger/server-command.js +25 -2
  102. package/dist/cli/messenger/server-command.js.map +1 -1
  103. package/dist/cli/messenger/store-maintenance-command.d.ts.map +1 -1
  104. package/dist/cli/messenger/store-maintenance-command.js +105 -4
  105. package/dist/cli/messenger/store-maintenance-command.js.map +1 -1
  106. package/dist/cli/messenger/tags-command.d.ts +5 -0
  107. package/dist/cli/messenger/tags-command.d.ts.map +1 -0
  108. package/dist/cli/messenger/tags-command.js +76 -0
  109. package/dist/cli/messenger/tags-command.js.map +1 -0
  110. package/dist/cli/messenger/watch-command.d.ts +4 -1
  111. package/dist/cli/messenger/watch-command.d.ts.map +1 -1
  112. package/dist/cli/messenger/watch-command.js +2 -1
  113. package/dist/cli/messenger/watch-command.js.map +1 -1
  114. package/dist/cli/store-settings.d.ts +26 -0
  115. package/dist/cli/store-settings.d.ts.map +1 -0
  116. package/dist/cli/store-settings.js +59 -0
  117. package/dist/cli/store-settings.js.map +1 -0
  118. package/dist/domain/models.d.ts +11 -1
  119. package/dist/domain/models.d.ts.map +1 -1
  120. package/dist/domain/tags.d.ts +6 -0
  121. package/dist/domain/tags.d.ts.map +1 -0
  122. package/dist/domain/tags.js +15 -0
  123. package/dist/domain/tags.js.map +1 -0
  124. package/dist/index.d.ts +1 -0
  125. package/dist/index.d.ts.map +1 -1
  126. package/dist/index.js +1 -0
  127. package/dist/index.js.map +1 -1
  128. package/dist/kit/contract.d.ts.map +1 -1
  129. package/dist/kit/contract.js +6 -2
  130. package/dist/kit/contract.js.map +1 -1
  131. package/dist/mcp/personal.d.ts.map +1 -1
  132. package/dist/mcp/personal.js +2 -1
  133. package/dist/mcp/personal.js.map +1 -1
  134. package/dist/mcp/prompts.d.ts.map +1 -1
  135. package/dist/mcp/prompts.js +27 -8
  136. package/dist/mcp/prompts.js.map +1 -1
  137. package/dist/mcp/tool.d.ts +5 -0
  138. package/dist/mcp/tool.d.ts.map +1 -1
  139. package/dist/mcp/tool.js +12 -1
  140. package/dist/mcp/tool.js.map +1 -1
  141. package/dist/mcp/tools/chats.d.ts.map +1 -1
  142. package/dist/mcp/tools/chats.js +22 -4
  143. package/dist/mcp/tools/chats.js.map +1 -1
  144. package/dist/mcp/tools/contacts.d.ts.map +1 -1
  145. package/dist/mcp/tools/contacts.js +21 -1
  146. package/dist/mcp/tools/contacts.js.map +1 -1
  147. package/dist/mcp/tools/conversations.d.ts.map +1 -1
  148. package/dist/mcp/tools/conversations.js +2 -7
  149. package/dist/mcp/tools/conversations.js.map +1 -1
  150. package/dist/mcp/tools/inbox.d.ts +2 -0
  151. package/dist/mcp/tools/inbox.d.ts.map +1 -1
  152. package/dist/mcp/tools/inbox.js +27 -4
  153. package/dist/mcp/tools/inbox.js.map +1 -1
  154. package/dist/mcp/tools/messages.d.ts.map +1 -1
  155. package/dist/mcp/tools/messages.js +8 -2
  156. package/dist/mcp/tools/messages.js.map +1 -1
  157. package/dist/mcp/tools/review.d.ts.map +1 -1
  158. package/dist/mcp/tools/review.js +23 -2
  159. package/dist/mcp/tools/review.js.map +1 -1
  160. package/dist/mcp/tools/search.d.ts +6 -3
  161. package/dist/mcp/tools/search.d.ts.map +1 -1
  162. package/dist/mcp/tools/search.js +48 -11
  163. package/dist/mcp/tools/search.js.map +1 -1
  164. package/dist/mcp/tools/searches.d.ts +4 -0
  165. package/dist/mcp/tools/searches.d.ts.map +1 -0
  166. package/dist/mcp/tools/searches.js +77 -0
  167. package/dist/mcp/tools/searches.js.map +1 -0
  168. package/dist/mcp/tools/tags.d.ts +4 -0
  169. package/dist/mcp/tools/tags.d.ts.map +1 -0
  170. package/dist/mcp/tools/tags.js +57 -0
  171. package/dist/mcp/tools/tags.js.map +1 -0
  172. package/dist/mcp/tools.d.ts +2 -0
  173. package/dist/mcp/tools.d.ts.map +1 -1
  174. package/dist/mcp/tools.js +7 -0
  175. package/dist/mcp/tools.js.map +1 -1
  176. package/dist/replies/decide.d.ts +37 -0
  177. package/dist/replies/decide.d.ts.map +1 -0
  178. package/dist/replies/decide.js +112 -0
  179. package/dist/replies/decide.js.map +1 -0
  180. package/dist/replies/dry-run.d.ts +51 -0
  181. package/dist/replies/dry-run.d.ts.map +1 -0
  182. package/dist/replies/dry-run.js +116 -0
  183. package/dist/replies/dry-run.js.map +1 -0
  184. package/dist/replies/rules.d.ts +139 -0
  185. package/dist/replies/rules.d.ts.map +1 -0
  186. package/dist/replies/rules.js +128 -0
  187. package/dist/replies/rules.js.map +1 -0
  188. package/dist/replies/serve.d.ts +44 -0
  189. package/dist/replies/serve.d.ts.map +1 -0
  190. package/dist/replies/serve.js +70 -0
  191. package/dist/replies/serve.js.map +1 -0
  192. package/dist/replies/state.d.ts +36 -0
  193. package/dist/replies/state.d.ts.map +1 -0
  194. package/dist/replies/state.js +67 -0
  195. package/dist/replies/state.js.map +1 -0
  196. package/dist/search/lucene/automaton.d.ts +5 -0
  197. package/dist/search/lucene/automaton.d.ts.map +1 -1
  198. package/dist/search/lucene/automaton.js +116 -0
  199. package/dist/search/lucene/automaton.js.map +1 -1
  200. package/dist/search/lucene/parser.d.ts.map +1 -1
  201. package/dist/search/lucene/parser.js +6 -2
  202. package/dist/search/lucene/parser.js.map +1 -1
  203. package/dist/search/lucene/registry.d.ts +5 -5
  204. package/dist/search/lucene/registry.d.ts.map +1 -1
  205. package/dist/search/lucene/registry.js +12 -7
  206. package/dist/search/lucene/registry.js.map +1 -1
  207. package/dist/search/search.d.ts.map +1 -1
  208. package/dist/search/search.js +4 -3
  209. package/dist/search/search.js.map +1 -1
  210. package/dist/sends/flood.d.ts +57 -0
  211. package/dist/sends/flood.d.ts.map +1 -0
  212. package/dist/sends/flood.js +90 -0
  213. package/dist/sends/flood.js.map +1 -0
  214. package/dist/sends/guard.d.ts +4 -1
  215. package/dist/sends/guard.d.ts.map +1 -1
  216. package/dist/sends/guard.js +9 -1
  217. package/dist/sends/guard.js.map +1 -1
  218. package/dist/sends/index.d.ts +1 -0
  219. package/dist/sends/index.d.ts.map +1 -1
  220. package/dist/sends/index.js +1 -0
  221. package/dist/sends/index.js.map +1 -1
  222. package/dist/sends/journal.d.ts +2 -0
  223. package/dist/sends/journal.d.ts.map +1 -1
  224. package/dist/sends/journal.js.map +1 -1
  225. package/dist/sends/permissions.d.ts +1 -1
  226. package/dist/sends/permissions.d.ts.map +1 -1
  227. package/dist/sends/permissions.js +13 -1
  228. package/dist/sends/permissions.js.map +1 -1
  229. package/dist/services/archive.d.ts.map +1 -1
  230. package/dist/services/archive.js +4 -2
  231. package/dist/services/archive.js.map +1 -1
  232. package/dist/services/chat-stats.d.ts +3 -0
  233. package/dist/services/chat-stats.d.ts.map +1 -1
  234. package/dist/services/chat-stats.js +3 -0
  235. package/dist/services/chat-stats.js.map +1 -1
  236. package/dist/services/chats.d.ts +13 -3
  237. package/dist/services/chats.d.ts.map +1 -1
  238. package/dist/services/chats.js +63 -2
  239. package/dist/services/chats.js.map +1 -1
  240. package/dist/services/deps.d.ts +2 -0
  241. package/dist/services/deps.d.ts.map +1 -1
  242. package/dist/services/deps.js.map +1 -1
  243. package/dist/services/inbox.d.ts +0 -2
  244. package/dist/services/inbox.d.ts.map +1 -1
  245. package/dist/services/inbox.js +13 -8
  246. package/dist/services/inbox.js.map +1 -1
  247. package/dist/services/index.d.ts +8 -0
  248. package/dist/services/index.d.ts.map +1 -1
  249. package/dist/services/index.js +6 -0
  250. package/dist/services/index.js.map +1 -1
  251. package/dist/services/members-audit.d.ts +44 -0
  252. package/dist/services/members-audit.d.ts.map +1 -0
  253. package/dist/services/members-audit.js +111 -0
  254. package/dist/services/members-audit.js.map +1 -0
  255. package/dist/services/messages-search.d.ts +6 -4
  256. package/dist/services/messages-search.d.ts.map +1 -1
  257. package/dist/services/messages-search.js +24 -8
  258. package/dist/services/messages-search.js.map +1 -1
  259. package/dist/services/messages.d.ts +10 -3
  260. package/dist/services/messages.d.ts.map +1 -1
  261. package/dist/services/messages.js +48 -5
  262. package/dist/services/messages.js.map +1 -1
  263. package/dist/services/people.d.ts +7 -0
  264. package/dist/services/people.d.ts.map +1 -1
  265. package/dist/services/people.js +18 -0
  266. package/dist/services/people.js.map +1 -1
  267. package/dist/services/person-context.d.ts +69 -0
  268. package/dist/services/person-context.d.ts.map +1 -0
  269. package/dist/services/person-context.js +130 -0
  270. package/dist/services/person-context.js.map +1 -0
  271. package/dist/services/searches.d.ts +50 -0
  272. package/dist/services/searches.d.ts.map +1 -0
  273. package/dist/services/searches.js +127 -0
  274. package/dist/services/searches.js.map +1 -0
  275. package/dist/services/tags.d.ts +40 -0
  276. package/dist/services/tags.d.ts.map +1 -0
  277. package/dist/services/tags.js +56 -0
  278. package/dist/services/tags.js.map +1 -0
  279. package/dist/store/index.d.ts +1 -1
  280. package/dist/store/index.d.ts.map +1 -1
  281. package/dist/store/index.js.map +1 -1
  282. package/dist/store/normalize.d.ts +2 -0
  283. package/dist/store/normalize.d.ts.map +1 -1
  284. package/dist/store/normalize.js +7 -5
  285. package/dist/store/normalize.js.map +1 -1
  286. package/dist/store/repair.d.ts +55 -0
  287. package/dist/store/repair.d.ts.map +1 -0
  288. package/dist/store/repair.js +313 -0
  289. package/dist/store/repair.js.map +1 -0
  290. package/dist/store/sqlite/accounts.d.ts.map +1 -1
  291. package/dist/store/sqlite/accounts.js +3 -1
  292. package/dist/store/sqlite/accounts.js.map +1 -1
  293. package/dist/store/sqlite/chats.d.ts.map +1 -1
  294. package/dist/store/sqlite/chats.js +3 -1
  295. package/dist/store/sqlite/chats.js.map +1 -1
  296. package/dist/store/sqlite/completeness.d.ts +10 -1
  297. package/dist/store/sqlite/completeness.d.ts.map +1 -1
  298. package/dist/store/sqlite/completeness.js +15 -3
  299. package/dist/store/sqlite/completeness.js.map +1 -1
  300. package/dist/store/sqlite/drizzle/bun.js +1 -1
  301. package/dist/store/sqlite/drizzle/core.d.ts +1 -1
  302. package/dist/store/sqlite/drizzle/core.d.ts.map +1 -1
  303. package/dist/store/sqlite/drizzle/core.js +3 -1
  304. package/dist/store/sqlite/drizzle/core.js.map +1 -1
  305. package/dist/store/sqlite/drizzle/node.js +1 -1
  306. package/dist/store/sqlite/drizzle/{shared-WZFJ4TMA.js → shared-IZ6QGA7N.js} +2 -1
  307. package/dist/store/sqlite/lucene.d.ts.map +1 -1
  308. package/dist/store/sqlite/lucene.js +17 -3
  309. package/dist/store/sqlite/lucene.js.map +1 -1
  310. package/dist/store/sqlite/manifest.d.ts.map +1 -1
  311. package/dist/store/sqlite/manifest.js +6 -0
  312. package/dist/store/sqlite/manifest.js.map +1 -1
  313. package/dist/store/sqlite/migrations.generated.d.ts.map +1 -1
  314. package/dist/store/sqlite/migrations.generated.js +53 -0
  315. package/dist/store/sqlite/migrations.generated.js.map +1 -1
  316. package/dist/store/sqlite/person-links.d.ts +18 -0
  317. package/dist/store/sqlite/person-links.d.ts.map +1 -0
  318. package/dist/store/sqlite/person-links.js +122 -0
  319. package/dist/store/sqlite/person-links.js.map +1 -0
  320. package/dist/store/sqlite/roster.d.ts +57 -0
  321. package/dist/store/sqlite/roster.d.ts.map +1 -0
  322. package/dist/store/sqlite/roster.js +179 -0
  323. package/dist/store/sqlite/roster.js.map +1 -0
  324. package/dist/store/sqlite/schema.d.ts +753 -0
  325. package/dist/store/sqlite/schema.d.ts.map +1 -1
  326. package/dist/store/sqlite/schema.js +99 -0
  327. package/dist/store/sqlite/schema.js.map +1 -1
  328. package/dist/store/sqlite/search-index.d.ts +3 -0
  329. package/dist/store/sqlite/search-index.d.ts.map +1 -1
  330. package/dist/store/sqlite/search-index.js +8 -6
  331. package/dist/store/sqlite/search-index.js.map +1 -1
  332. package/dist/store/sqlite/search.d.ts +2 -0
  333. package/dist/store/sqlite/search.d.ts.map +1 -1
  334. package/dist/store/sqlite/search.js +5 -0
  335. package/dist/store/sqlite/search.js.map +1 -1
  336. package/dist/store/sqlite/searches.d.ts +35 -0
  337. package/dist/store/sqlite/searches.d.ts.map +1 -0
  338. package/dist/store/sqlite/searches.js +77 -0
  339. package/dist/store/sqlite/searches.js.map +1 -0
  340. package/dist/store/sqlite/stems.d.ts +61 -0
  341. package/dist/store/sqlite/stems.d.ts.map +1 -0
  342. package/dist/store/sqlite/stems.js +215 -0
  343. package/dist/store/sqlite/stems.js.map +1 -0
  344. package/dist/store/sqlite/tags.d.ts +38 -0
  345. package/dist/store/sqlite/tags.d.ts.map +1 -0
  346. package/dist/store/sqlite/tags.js +85 -0
  347. package/dist/store/sqlite/tags.js.map +1 -0
  348. package/dist/store/store.d.ts +99 -1
  349. package/dist/store/store.d.ts.map +1 -1
  350. package/dist/store/store.js +115 -2
  351. package/dist/store/store.js.map +1 -1
  352. package/package.json +1 -1
  353. package/parity.json +254 -30
  354. /package/dist/store/sqlite/drizzle/{shared-WZFJ4TMA.js.map → shared-IZ6QGA7N.js.map} +0 -0
@@ -0,0 +1,25 @@
1
+ export interface ModeProblem {
2
+ path: string;
3
+ mode: string;
4
+ want: string;
5
+ fix: string;
6
+ }
7
+ export type PrivateFiles = {
8
+ checked: false;
9
+ reason: string;
10
+ } | {
11
+ checked: true;
12
+ ok: boolean;
13
+ problems: ModeProblem[];
14
+ };
15
+ /**
16
+ * Whether anybody but the owner can read these files or enter these folders. Only `stat`, never an
17
+ * open: the session is among them. Read-only for the owner is fine, so only group and other bits count.
18
+ */
19
+ export declare const privateFiles: ({ files, dirs }: {
20
+ files: string[];
21
+ dirs: string[];
22
+ }, platform?: NodeJS.Platform) => PrivateFiles;
23
+ /** A SQLite database in write-ahead mode keeps its newest pages beside it. */
24
+ export declare const withSqliteSidecars: (path: string) => string[];
25
+ //# sourceMappingURL=private-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"private-files.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/private-files.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,MAAM,YAAY,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAA;CAAE,CAAA;AAIvH;;;GAGG;AACH,eAAO,MAAM,YAAY,oBACN;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,aAC1C,MAAM,CAAC,QAAQ,KACxB,YAaF,CAAA;AAED,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,SAAU,MAAM,KAAG,MAAM,EAA0C,CAAA"}
@@ -0,0 +1,28 @@
1
+ import { existsSync, statSync } from "node:fs";
2
+ const shellQuoted = (path) => `'${path.replaceAll("'", `'\\''`)}'`;
3
+ /**
4
+ * Whether anybody but the owner can read these files or enter these folders. Only `stat`, never an
5
+ * open: the session is among them. Read-only for the owner is fine, so only group and other bits count.
6
+ */
7
+ export const privateFiles = ({ files, dirs }, platform = process.platform) => {
8
+ if (platform === "win32")
9
+ return { checked: false, reason: "Windows has no Unix file modes" };
10
+ const problems = [];
11
+ const check = (path, want) => {
12
+ if (!existsSync(path))
13
+ return;
14
+ const mode = statSync(path).mode & 0o777;
15
+ if ((mode & 0o077) === 0)
16
+ return;
17
+ const octal = (value) => `0${value.toString(8)}`;
18
+ problems.push({ path, mode: octal(mode), want: octal(want), fix: `chmod ${want.toString(8)} ${shellQuoted(path)}` });
19
+ };
20
+ for (const file of files)
21
+ check(file, 0o600);
22
+ for (const dir of dirs)
23
+ check(dir, 0o700);
24
+ return { checked: true, ok: problems.length === 0, problems };
25
+ };
26
+ /** A SQLite database in write-ahead mode keeps its newest pages beside it. */
27
+ export const withSqliteSidecars = (path) => [path, `${path}-wal`, `${path}-shm`];
28
+ //# sourceMappingURL=private-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"private-files.js","sourceRoot":"","sources":["../../../src/cli/messenger/private-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAW9C,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAA;AAE1E;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,EAAE,KAAK,EAAE,IAAI,EAAuC,EACpD,QAAQ,GAAoB,OAAO,CAAC,QAAQ,EAC9B,EAAE;IAChB,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gCAAgC,EAAE,CAAA;IAC7F,MAAM,QAAQ,GAAkB,EAAE,CAAA;IAClC,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE;QAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAM;QAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,CAAA;QACxC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;YAAE,OAAM;QAChC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;QACxD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,SAAS,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IACtH,CAAC,CAAA;IACD,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IAC5C,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAA;AAC/D,CAAC,CAAA;AAED,8EAA8E;AAC9E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAY,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { Command } from "commander";
2
+ import { type Messenger } from "./context.js";
3
+ /** `replies`: rules that answer messages for the owner, from `serve`, and only to its test accounts (`NEED-601`). */
4
+ export declare const repliesCommand: (messenger: Messenger) => Command;
5
+ //# sourceMappingURL=replies-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replies-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/replies-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,cAAc,CAAA;AAE/D,qHAAqH;AACrH,eAAO,MAAM,cAAc,cAAe,SAAS,KAAG,OAoFrD,CAAA"}
@@ -0,0 +1,78 @@
1
+ import { Command } from "commander";
2
+ import { DRY_RUN_DAYS, dryRun } from "../../replies/dry-run.js";
3
+ import { readReplies, repliesPathFor } from "../../replies/rules.js";
4
+ import { paused, readRepliesState, repliesStatePathFor, writeRepliesState } from "../../replies/state.js";
5
+ import { levelFor } from "../../sends/permissions.js";
6
+ import { momentOf } from "../../services/moment.js";
7
+ import { messengerContext } from "./context.js";
8
+ /** `replies`: rules that answer messages for the owner, from `serve`, and only to its test accounts (`NEED-601`). */
9
+ export const repliesCommand = (messenger) => {
10
+ const replies = new Command("replies").description("rules that answer messages for you, kept in a file of this profile");
11
+ replies
12
+ .command("test")
13
+ .description("what the rules would have answered in the stored messages, to whom and why — sends nothing, " +
14
+ "changes nothing, never connects")
15
+ .argument("[rule]", "only this rule, by its id; every rule in file order if not given")
16
+ .option("--since-time <time>", `from this ISO 8601 time, or 2h / 1d ago; ${DRY_RUN_DAYS}d ago if not given`)
17
+ .action(async function (rule) {
18
+ const { sinceTime } = this.opts();
19
+ const context = messengerContext(this, messenger);
20
+ const { settings, renderer, format, streams, env } = context;
21
+ const since = momentOf(sinceTime ?? `${DRY_RUN_DAYS}d`, "--since-time");
22
+ const path = repliesPathFor(messenger.app, settings.profile, env);
23
+ const { rules, testers } = readReplies(path);
24
+ if (rules.length === 0) {
25
+ renderer.note(`no reply rules yet — they live in ${path}`);
26
+ }
27
+ const found = await context.withStore((store, account) => dryRun(store, account, rules, { since, testers, ...(rule === undefined ? {} : { only: rule }) }), { name: "replies test" });
28
+ if (found.botUnknown > 0) {
29
+ renderer.note(`${found.botUnknown} sender(s) not known as bot or person; taken as people`);
30
+ }
31
+ renderer.note(`only what this machine has stored from ${found.since} to ${found.until} was read`);
32
+ if (format !== "pretty") {
33
+ renderer.result(found);
34
+ return;
35
+ }
36
+ const lines = found.rules.flatMap(({ id, would, skipped }) => [
37
+ `${id}: would answer ${would.length}`,
38
+ ...would.map((one) => ` ${one.at} ${one.chatTitle ?? one.chatId} → ${one.to.name ?? one.to.id}: ${JSON.stringify(one.text)}`),
39
+ ...Object.entries(skipped)
40
+ .sort(([, a], [, b]) => b - a)
41
+ .map(([why, count]) => ` passed over ${count}: ${why}`),
42
+ ]);
43
+ streams.data(`${lines.join("\n")}\n`);
44
+ });
45
+ const switched = (on) => async function () {
46
+ const { settings, renderer, env } = messengerContext(this, messenger);
47
+ const path = repliesStatePathFor(messenger.app, settings.profile, env);
48
+ writeRepliesState(path, paused(readRepliesState(path), on));
49
+ renderer.note(on ? "reply rules paused — a running serve stops answering now" : "reply rules on again");
50
+ renderer.result({ paused: on });
51
+ };
52
+ replies
53
+ .command("pause")
54
+ .description("stop every reply rule of this profile at once, a running serve too; resume undoes it")
55
+ .action(switched(true));
56
+ replies.command("resume").description("let the reply rules answer again after pause").action(switched(false));
57
+ replies
58
+ .command("status")
59
+ .description("whether the rules may send, which are on, and who they may answer")
60
+ .action(async function () {
61
+ const { settings, renderer, env } = messengerContext(this, messenger);
62
+ const { rules, testers } = readReplies(repliesPathFor(messenger.app, settings.profile, env));
63
+ const state = readRepliesState(repliesStatePathFor(messenger.app, settings.profile, env));
64
+ const level = levelFor(settings.permissions ?? {}, "replies.send").level;
65
+ if (level !== "allow")
66
+ renderer.note(`replies.send is ${level}: serve sends nothing until it is allow`);
67
+ if (testers.length === 0)
68
+ renderer.note("no test accounts named in testers: serve answers nobody");
69
+ renderer.result({
70
+ paused: state.paused,
71
+ send: level,
72
+ testers: testers.length,
73
+ rules: rules.map(({ id, on }) => ({ id, on })),
74
+ });
75
+ });
76
+ return replies;
77
+ };
78
+ //# sourceMappingURL=replies-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replies-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/replies-command.ts"],"names":[],"mappings":"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"}
@@ -27,5 +27,10 @@ export declare const buildReport: ({ doctor, runsDir, runId, command, sends, now
27
27
  now?: Date;
28
28
  home: string | undefined;
29
29
  }) => Report;
30
+ /**
31
+ * Every field of a journal line that names a chat, a message or a write. A send's `operationId` is
32
+ * its `sendId`, so one left raw would undo the other's label.
33
+ */
34
+ export declare const SEND_ID_FIELDS: readonly ["chatId", "messageId", "replyTo", "threadId", "resultChatId", "sendId", "operationId", "parentOperationId", "reservation"];
30
35
  export declare const reportFileName: (app: string, now: Date) => string;
31
36
  //# sourceMappingURL=report.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/report.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAqB,KAAK,WAAW,EAAc,MAAM,gBAAgB,CAAA;AAIhF,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,6FAA6F;IAC7F,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,iFAAiF;IACjF,GAAG,EAAE;QAAE,QAAQ,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,GAAG,IAAI,CAAA;IACxE,yFAAyF;IACzF,KAAK,EAAE,SAAS,EAAE,CAAA;CACnB;AAeD;;;;GAIG;AACH,eAAO,MAAM,WAAW,2DAQrB;IACD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,GAAG,CAAC,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CACzB,KAAG,MAuBH,CAAA;AAED,eAAO,MAAM,cAAc,QAAS,MAAM,OAAO,IAAI,KAAG,MAIrB,CAAA"}
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/report.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAqB,KAAK,WAAW,EAAc,MAAM,gBAAgB,CAAA;AAIhF,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,6FAA6F;IAC7F,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,iFAAiF;IACjF,GAAG,EAAE;QAAE,QAAQ,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,GAAG,IAAI,CAAA;IACxE,yFAAyF;IACzF,KAAK,EAAE,SAAS,EAAE,CAAA;CACnB;AAeD;;;;GAIG;AACH,eAAO,MAAM,WAAW,2DAQrB;IACD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,GAAG,CAAC,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CACzB,KAAG,MAiBH,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,sIAUsB,CAAA;AAWjD,eAAO,MAAM,cAAc,QAAS,MAAM,OAAO,IAAI,KAAG,MAIrB,CAAA"}
@@ -33,16 +33,34 @@ export const buildReport = ({ doctor, runsDir, runId, command, sends, now = new
33
33
  ...(account?.remembered ? { account: { ...account, remembered: label(account.remembered) } } : {}),
34
34
  },
35
35
  run: chosen ? { metadata: chosen.metadata, events: readEvents(chosen.dir).map(eventOf(label)) } : null,
36
- sends: sends.slice(-RECENT_SENDS).map((entry) => ({
37
- ...entry,
38
- chatId: entry.chatId === null ? null : label(entry.chatId),
39
- ...(entry.messageId === undefined ? {} : { messageId: label(entry.messageId) }),
40
- ...(entry.replyTo === undefined ? {} : { replyTo: label(entry.replyTo) }),
41
- ...(entry.sendId === undefined ? {} : { sendId: label(entry.sendId) }),
42
- })),
36
+ sends: sends.slice(-RECENT_SENDS).map((entry) => labelled(entry, label)),
43
37
  };
44
38
  return JSON.parse(hideHome(JSON.stringify(report), home));
45
39
  };
40
+ /**
41
+ * Every field of a journal line that names a chat, a message or a write. A send's `operationId` is
42
+ * its `sendId`, so one left raw would undo the other's label.
43
+ */
44
+ export const SEND_ID_FIELDS = [
45
+ "chatId",
46
+ "messageId",
47
+ "replyTo",
48
+ "threadId",
49
+ "resultChatId",
50
+ "sendId",
51
+ "operationId",
52
+ "parentOperationId",
53
+ "reservation",
54
+ ];
55
+ const labelled = (entry, label) => {
56
+ const copy = { ...entry };
57
+ for (const field of SEND_ID_FIELDS) {
58
+ const value = copy[field];
59
+ if (value !== undefined && value !== null)
60
+ copy[field] = label(String(value));
61
+ }
62
+ return copy;
63
+ };
46
64
  export const reportFileName = (app, now) => `${app}-report-${now
47
65
  .toISOString()
48
66
  .replace(/[-:]/g, "")
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/cli/messenger/report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/cli/messenger/report.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/review.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AASnC,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,cAAc,CAAA;AAW/D,8CAA8C;AAC9C,eAAO,MAAM,eAAe,UAAW,OAAO,oBAA0B,MACY,CAAA;AAEpF;;;;GAIG;AACH,eAAO,MAAM,aAAa,cAAe,SAAS,KAAG,OAsG/C,CAAA"}
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/review.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AASnC,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,cAAc,CAAA;AAY/D,8CAA8C;AAC9C,eAAO,MAAM,eAAe,UAAW,OAAO,oBAA0B,MACY,CAAA;AAEpF;;;;GAIG;AACH,eAAO,MAAM,aAAa,cAAe,SAAS,KAAG,OAsG/C,CAAA"}
@@ -2,13 +2,14 @@ import { CliError } from "@leemour/cli-core";
2
2
  import { Command } from "commander";
3
3
  import { renderMessages } from "../../render/messages.js";
4
4
  import { CHAT_KINDS } from "../../services/chats.js";
5
- import { CHAT_WINDOW, kindsOf, REVIEW_DAYS, reviewStart, UNANSWERED_HOURS } from "../../services/inbox.js";
5
+ import { kindsOf, REVIEW_DAYS, reviewStart, UNANSWERED_HOURS } from "../../services/inbox.js";
6
6
  import { momentOf } from "../../services/moment.js";
7
7
  import { modelWith } from "../../speech/hearing.js";
8
8
  import { parseDuration } from "../settings.js";
9
9
  import { MARK_READ_OPTION, markShown, marksRead, NO_MARK_READ_OPTION } from "./catch-up.js";
10
10
  import { messengerContext } from "./context.js";
11
11
  import { heardItems, hearForCommand, hearingFields, MODEL_OPTION, spokenItems, TRANSCRIBE_OPTION, } from "./hearing-command.js";
12
+ import { PARTIAL_NOTE } from "./inbox.js";
12
13
  import { checkPoints } from "./points.js";
13
14
  /** `--unanswered` with no value is `true`. */
14
15
  export const unansweredHours = (value, flag = "--unanswered") => value === true ? UNANSWERED_HOURS : parseDuration(String(value), flag) / 3_600_000;
@@ -108,10 +109,11 @@ const notes = (found, command, fresh, note) => {
108
109
  note(`${chat.title ?? chat.id}: its admins are not known, so only your answers count`);
109
110
  }
110
111
  if (found.skipped.length > 0) {
111
- note(`not read — too many chats at once: ${found.skipped.map((chat) => chat.title ?? chat.id).join(", ")}`);
112
+ const names = found.skipped.map((chat) => chat.title ?? chat.id).join(", ");
113
+ note(`skipped ${found.skipped.length} chats — too many at once: ${names}`);
112
114
  }
113
115
  if (found.partial)
114
- note(`only the ${CHAT_WINDOW} newest chats were looked at; an older one may have more`);
116
+ note(PARTIAL_NOTE);
115
117
  if (found.quiet > 0)
116
118
  note(`${found.quiet} muted or archived chats left out — --all reads them`);
117
119
  if (found.unanswered) {
@@ -1 +1 @@
1
- {"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/cli/messenger/review.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/cli/messenger/review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Command } from "commander";
2
+ import { type Messenger } from "./context.js";
3
+ /** Saved searches and the history of `messages search` and `messages stats`, in the local store only. */
4
+ export declare const searchesCommand: (messenger: Messenger) => Command;
5
+ //# sourceMappingURL=searches-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searches-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/searches-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,OAAO,EAAE,KAAK,SAAS,EAAsC,MAAM,cAAc,CAAA;AAcjF,yGAAyG;AACzG,eAAO,MAAM,eAAe,cAAe,SAAS,KAAG,OAqGtD,CAAA"}
@@ -0,0 +1,117 @@
1
+ import { Command } from "commander";
2
+ import { listed, positiveCount } from "../paging.js";
3
+ import { messengerContext, refuseLocalWrite } from "./context.js";
4
+ import { languageOf, wholeCount } from "./messages-search-command.js";
5
+ import { groupingOf } from "./messages-stats-command.js";
6
+ const line = ({ id, name, command, params, runs, lastRunAt }) => [
7
+ id.padStart(5),
8
+ name ?? "-",
9
+ command,
10
+ JSON.stringify(params.text ?? params.ast ?? ""),
11
+ `${runs} runs`,
12
+ lastRunAt?.slice(0, 16).replace("T", " ") ?? "never run",
13
+ ].join(" ");
14
+ /** Saved searches and the history of `messages search` and `messages stats`, in the local store only. */
15
+ export const searchesCommand = (messenger) => {
16
+ const searches = new Command("searches").description("saved searches and the history of messages search and messages stats, kept in the local store; --saved runs one");
17
+ searches
18
+ .command("create")
19
+ .description("save a search under a name without running it; messages search --saved <name> runs it")
20
+ .argument("<name>", "up to 64 letters a–z, digits and hyphens, not only digits")
21
+ .argument("[query...]", "the query, as for messages search; none matches every stored message")
22
+ .option("--chat <chat>", `only this chat — the same as chat: in the query; ${messenger.chatArgument}`)
23
+ .option("--source <messenger>", "every account of this messenger held in the store; personal, bots or all — the same as in: in the query")
24
+ .option("--limit <n>", "how many", positiveCount("--limit"))
25
+ .option("--newest", "newest first instead of best first")
26
+ .option("--context <n>", "messages before and after each hit", wholeCount)
27
+ .option("--language <lucene|legacy>", "the query language: strict Lucene or legacy discovery", languageOf)
28
+ .option("--timezone <zone>", "the IANA timezone for calendar date boundaries")
29
+ .option("--regex", "the words are one regular expression, case-insensitive, tested against every stored text")
30
+ .option("--by <chat|sender|day|hour>", "what messages stats --saved counts by", groupingOf)
31
+ .option("--replace", "overwrite a saved search of the same name")
32
+ .action(async function (name, words) {
33
+ const context = messengerContext(this, messenger);
34
+ refuseLocalWrite(context, messenger.app.command, "searches.create");
35
+ const { replace, ...options } = this.opts();
36
+ const params = {
37
+ ...Object.fromEntries(Object.entries(options).filter(([, one]) => one !== undefined)),
38
+ ...(words.length ? { text: words.join(" ") } : {}),
39
+ };
40
+ const saved = await context.withServices((services) => services.searches.create(name, params, { replace: replace === true }));
41
+ if (context.format !== "pretty")
42
+ context.renderer.result(saved);
43
+ else
44
+ context.streams.data(`${line(saved)}\n`);
45
+ });
46
+ searches
47
+ .command("show")
48
+ .description("one saved search or earlier run: its query, options and how often it ran")
49
+ .argument("<name|id>", "a saved search's name, or the id of any row of searches history")
50
+ .action(async function (reference) {
51
+ const context = messengerContext(this, messenger);
52
+ context.renderer.result(await context.withServices((services) => services.searches.show(reference)));
53
+ });
54
+ searches
55
+ .command("list")
56
+ .description("the saved searches, by name")
57
+ .action(async function () {
58
+ const context = messengerContext(this, messenger);
59
+ const found = await context.withServices((services) => services.searches.list());
60
+ if (context.format === "jsonl")
61
+ context.renderer.stream(found);
62
+ else if (context.format !== "pretty")
63
+ context.renderer.result(listed(found));
64
+ else if (found.length === 0)
65
+ context.renderer.note("no saved searches — `searches create <name> <query>` saves one");
66
+ else
67
+ context.streams.data(`${found.map(line).join("\n")}\n`);
68
+ });
69
+ searches
70
+ .command("history")
71
+ .description("the searches and counts that ran, newest first — saved ones included; never their results")
72
+ .option("--limit <n>", "how many", positiveCount("--limit"))
73
+ .action(async function () {
74
+ const context = messengerContext(this, messenger);
75
+ const { limit } = context.settings;
76
+ const found = await context.withServices((services) => services.searches.history(limit));
77
+ if (context.format === "jsonl")
78
+ context.renderer.stream(found.items);
79
+ else if (context.format !== "pretty")
80
+ context.renderer.result({ ...found, page: 1, limit });
81
+ else {
82
+ if (found.items.length > 0)
83
+ context.streams.data(`${found.items.map(line).join("\n")}\n`);
84
+ else
85
+ context.renderer.note("no searches ran yet");
86
+ if (found.hasMore)
87
+ context.renderer.note(`more — \`searches history --limit ${limit * 2}\``);
88
+ }
89
+ });
90
+ searches
91
+ .command("delete")
92
+ .description("delete a saved search, or one run from the history")
93
+ .argument("<name|id>", "a saved search's name, or the id of any row of searches history")
94
+ .action(async function (reference) {
95
+ const context = messengerContext(this, messenger);
96
+ refuseLocalWrite(context, messenger.app.command, "searches.delete");
97
+ const deleted = await context.withServices((services) => services.searches.delete(reference));
98
+ if (context.format !== "pretty")
99
+ context.renderer.result(deleted);
100
+ else
101
+ context.streams.data(`deleted ${deleted.name ?? `run ${deleted.id}`}\n`);
102
+ });
103
+ searches
104
+ .command("clear")
105
+ .description("empty the history; saved searches stay")
106
+ .action(async function () {
107
+ const context = messengerContext(this, messenger);
108
+ refuseLocalWrite(context, messenger.app.command, "searches.clear");
109
+ const cleared = await context.withServices((services) => services.searches.clear());
110
+ if (context.format !== "pretty")
111
+ context.renderer.result(cleared);
112
+ else
113
+ context.streams.data(`${cleared.cleared} runs cleared\n`);
114
+ });
115
+ return searches;
116
+ };
117
+ //# sourceMappingURL=searches-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searches-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/searches-command.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"serve-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/serve-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,cAAc,CAAA;AAG/D,OAAO,EAAE,KAAK,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAEzF;;;;GAIG;AACH,eAAO,MAAM,YAAY,cAAe,SAAS,KAAG,OA0CnD,CAAA"}
1
+ {"version":3,"file":"serve-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/serve-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAYnC,OAAO,EAAE,KAAK,SAAS,EAA2C,MAAM,cAAc,CAAA;AAItF,OAAO,EAAE,KAAK,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAEzF;;;;GAIG;AACH,eAAO,MAAM,YAAY,cAAe,SAAS,KAAG,OAmDnD,CAAA"}
@@ -1,7 +1,15 @@
1
1
  import { CliError } from "@leemour/cli-core";
2
2
  import { Command } from "commander";
3
- import { holdLock, lockPath, readLock, releaseLock } from "../../background/lock.js";
4
- import { alive } from "../../background/processes.js";
3
+ import { holdLock, lockPath, releaseLock, takeLock } from "../../background/lock.js";
4
+ import { senderFacts } from "../../replies/dry-run.js";
5
+ import { repliesPathFor } from "../../replies/rules.js";
6
+ import { NO_RULES, replyTo } from "../../replies/serve.js";
7
+ import { repliesStatePathFor } from "../../replies/state.js";
8
+ import { levelFor } from "../../sends/permissions.js";
9
+ import { newSendId } from "../../sends/send-id.js";
10
+ import { onlineDeps } from "../../services/deps.js";
11
+ import { servicesFor } from "../../services/index.js";
12
+ import { recalledAccount } from "./accounts.js";
5
13
  import { messengerContext } from "./context.js";
6
14
  import { listenUntilStopped } from "./watch-command.js";
7
15
  export { lockPath, readLock, servingProfiles } from "../../background/lock.js";
@@ -17,34 +25,105 @@ export const serveCommand = (messenger) => {
17
25
  if (context.settings.offline)
18
26
  throw new CliError("validation_error", "serve listens live; --offline cannot");
19
27
  const path = lockPath(messenger.app, context.profile, context.env);
20
- const held = readLock(path);
21
- if (held && held.pid !== process.pid && alive(held.pid)) {
22
- throw new CliError("validation_error", `${messenger.app.command} serve is already running for profile ${context.profile} (PID ${held.pid}, since ${held.startedAt})`);
23
- }
24
28
  const startedAt = new Date().toISOString();
25
29
  const { version } = messenger.app;
26
- holdLock(path, { pid: process.pid, startedAt, version });
30
+ const held = takeLock(path, { pid: process.pid, startedAt, version });
31
+ if (held) {
32
+ throw new CliError("validation_error", `${messenger.app.command} serve is already running for profile ${context.profile} (PID ${held.pid}, since ${held.startedAt})`);
33
+ }
27
34
  // `server start` answers on this, not on the lock alone: a lock is written before the connection opens.
28
35
  const onReady = () => {
29
36
  holdLock(path, { pid: process.pid, startedAt, version, listeningAt: new Date().toISOString() });
30
37
  context.renderer.note(`listening for profile ${context.profile}, catching up on what arrived while it was down`);
31
38
  };
32
39
  const counts = {};
40
+ const rules = replying(context, messenger, Date.parse(startedAt));
33
41
  const count = (event) => {
34
42
  counts[event.event] = (counts[event.event] ?? 0) + 1;
43
+ if (event.event === "message")
44
+ rules.arrived(event.message);
35
45
  };
36
46
  try {
37
47
  await listenUntilStopped(this, context, messenger, count, {
38
48
  stop: new AbortController(),
39
49
  catchUp: true,
40
50
  onReady,
51
+ connected: rules.connected,
41
52
  });
42
53
  }
43
54
  finally {
55
+ await rules.settled();
44
56
  releaseLock(path);
45
57
  }
46
- context.renderer.result({ profile: context.profile, startedAt, stoppedAt: new Date().toISOString(), kept: counts });
58
+ context.renderer.result({
59
+ profile: context.profile,
60
+ startedAt,
61
+ stoppedAt: new Date().toISOString(),
62
+ kept: counts,
63
+ ...rules.summary(),
64
+ });
47
65
  });
48
66
  return command;
49
67
  };
68
+ /**
69
+ * The reply rules, one message at a time in the order they came: two at once would both read the
70
+ * limits before either counted its reply.
71
+ */
72
+ const replying = (context, messenger, since) => {
73
+ const { app, provider } = messenger;
74
+ const { profile, env, settings, renderer } = context;
75
+ let connection;
76
+ let queue = Promise.resolve();
77
+ const sent = {};
78
+ const skipped = {};
79
+ const chats = new Map();
80
+ const owner = recalledAccount(app, provider, profile, env)?.account ?? null;
81
+ const handle = async (message) => {
82
+ if (connection === undefined)
83
+ return;
84
+ const open = connection;
85
+ const answer = await replyTo({
86
+ rulesPath: repliesPathFor(app, profile, env),
87
+ statePath: repliesStatePathFor(app, profile, env),
88
+ provider,
89
+ owner: { id: owner },
90
+ since,
91
+ allowed: () => levelFor(settings.permissions ?? {}, "replies.send").level === "allow",
92
+ chatOf: (chat) => {
93
+ if (!chats.has(chat))
94
+ chats.set(chat, open.resolve(chat).then(({ id, kind }) => ({ id, kind })));
95
+ return chats.get(chat);
96
+ },
97
+ senderOf: (person) => context.withStore(async (store, account) => {
98
+ const { isContact, botOf } = await senderFacts(store, account);
99
+ return { isBot: (await botOf(person)) === true, isContact: isContact(person) };
100
+ }, { name: "serve replies" }),
101
+ send: (reply) => servicesFor(onlineDeps(messenger, open, context.guard, { profile, env })).messages.send({
102
+ chat: reply.chat,
103
+ text: reply.text,
104
+ sendId: reply.sendId,
105
+ key: "replies.send",
106
+ origin: reply.origin,
107
+ ...(reply.replyTo === undefined ? {} : { replyTo: reply.replyTo }),
108
+ }),
109
+ newSendId: () => open.newSendId?.() ?? newSendId(),
110
+ }, message);
111
+ if ("sent" in answer)
112
+ sent[answer.sent] = (sent[answer.sent] ?? 0) + 1;
113
+ else if (answer.skip !== NO_RULES)
114
+ skipped[answer.skip] = (skipped[answer.skip] ?? 0) + 1;
115
+ };
116
+ return {
117
+ connected: (open) => {
118
+ connection = open;
119
+ },
120
+ arrived: (message) => {
121
+ if (message.outgoing !== false)
122
+ return;
123
+ queue = queue.then(() => handle(message).catch((error) => renderer.warn(`a reply rule failed: ${error instanceof Error ? error.message : String(error)}`)));
124
+ },
125
+ settled: () => queue,
126
+ summary: () => Object.keys(sent).length === 0 && Object.keys(skipped).length === 0 ? {} : { replies: { sent, skipped } },
127
+ };
128
+ };
50
129
  //# sourceMappingURL=serve-command.js.map