@leemour/max-cli 0.9.0 → 0.11.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 (302) hide show
  1. package/README.md +24 -3
  2. package/dist/backup.d.ts +28 -0
  3. package/dist/backup.d.ts.map +1 -0
  4. package/dist/backup.js +47 -0
  5. package/dist/backup.js.map +1 -0
  6. package/dist/cache/drivers/bun-sqlite.d.ts.map +1 -1
  7. package/dist/cache/drivers/node-sqlite.d.ts.map +1 -1
  8. package/dist/cache/index.d.ts.map +1 -1
  9. package/dist/cache/index.js +10 -4
  10. package/dist/cache/index.js.map +1 -1
  11. package/dist/cache/open.d.ts.map +1 -1
  12. package/dist/cache/schema.d.ts.map +1 -1
  13. package/dist/cache/store.d.ts +7 -0
  14. package/dist/cache/store.d.ts.map +1 -1
  15. package/dist/cache/store.js +8 -0
  16. package/dist/cache/store.js.map +1 -1
  17. package/dist/client.d.ts +73 -3
  18. package/dist/client.d.ts.map +1 -1
  19. package/dist/client.js +354 -66
  20. package/dist/client.js.map +1 -1
  21. package/dist/commands/backup.d.ts +3 -0
  22. package/dist/commands/backup.d.ts.map +1 -0
  23. package/dist/commands/backup.js +101 -0
  24. package/dist/commands/backup.js.map +1 -0
  25. package/dist/commands/body.d.ts.map +1 -1
  26. package/dist/commands/body.js.map +1 -1
  27. package/dist/commands/cache.d.ts.map +1 -1
  28. package/dist/commands/cache.js +6 -5
  29. package/dist/commands/cache.js.map +1 -1
  30. package/dist/commands/chats.js +2 -2
  31. package/dist/commands/chats.js.map +1 -1
  32. package/dist/commands/complete.d.ts.map +1 -1
  33. package/dist/commands/complete.js +28 -22
  34. package/dist/commands/complete.js.map +1 -1
  35. package/dist/commands/config.d.ts.map +1 -1
  36. package/dist/commands/config.js +5 -1
  37. package/dist/commands/config.js.map +1 -1
  38. package/dist/commands/contacts.d.ts.map +1 -1
  39. package/dist/commands/context.d.ts +4 -0
  40. package/dist/commands/context.d.ts.map +1 -1
  41. package/dist/commands/context.js +7 -15
  42. package/dist/commands/context.js.map +1 -1
  43. package/dist/commands/doctor.d.ts.map +1 -1
  44. package/dist/commands/doctor.js +136 -15
  45. package/dist/commands/doctor.js.map +1 -1
  46. package/dist/commands/folders.js.map +1 -1
  47. package/dist/commands/mcp.js +3 -3
  48. package/dist/commands/mcp.js.map +1 -1
  49. package/dist/commands/messages.d.ts.map +1 -1
  50. package/dist/commands/messages.js +6 -4
  51. package/dist/commands/messages.js.map +1 -1
  52. package/dist/commands/models.d.ts.map +1 -1
  53. package/dist/commands/models.js +29 -23
  54. package/dist/commands/models.js.map +1 -1
  55. package/dist/commands/paging.d.ts.map +1 -1
  56. package/dist/commands/recipients.d.ts.map +1 -1
  57. package/dist/commands/recipients.js +25 -17
  58. package/dist/commands/recipients.js.map +1 -1
  59. package/dist/commands/sends.d.ts.map +1 -1
  60. package/dist/commands/sends.js +8 -6
  61. package/dist/commands/sends.js.map +1 -1
  62. package/dist/commands/serve.d.ts +12 -0
  63. package/dist/commands/serve.d.ts.map +1 -1
  64. package/dist/commands/serve.js +10 -7
  65. package/dist/commands/serve.js.map +1 -1
  66. package/dist/commands/server.d.ts +7 -0
  67. package/dist/commands/server.d.ts.map +1 -0
  68. package/dist/commands/server.js +84 -0
  69. package/dist/commands/server.js.map +1 -0
  70. package/dist/commands/session.d.ts.map +1 -1
  71. package/dist/commands/session.js +10 -10
  72. package/dist/commands/session.js.map +1 -1
  73. package/dist/commands/skill.js.map +1 -1
  74. package/dist/commands/watch.d.ts +17 -0
  75. package/dist/commands/watch.d.ts.map +1 -1
  76. package/dist/commands/watch.js +73 -38
  77. package/dist/commands/watch.js.map +1 -1
  78. package/dist/config.d.ts +5 -3
  79. package/dist/config.d.ts.map +1 -1
  80. package/dist/config.js +19 -2
  81. package/dist/config.js.map +1 -1
  82. package/dist/deadline.d.ts.map +1 -1
  83. package/dist/diagnose.d.ts +17 -3
  84. package/dist/diagnose.d.ts.map +1 -1
  85. package/dist/diagnose.js +16 -4
  86. package/dist/diagnose.js.map +1 -1
  87. package/dist/domain/map.d.ts.map +1 -1
  88. package/dist/domain/map.js.map +1 -1
  89. package/dist/domain/models.d.ts +20 -0
  90. package/dist/domain/models.d.ts.map +1 -1
  91. package/dist/domain/models.js.map +1 -1
  92. package/dist/download.d.ts +22 -3
  93. package/dist/download.d.ts.map +1 -1
  94. package/dist/download.js +133 -27
  95. package/dist/download.js.map +1 -1
  96. package/dist/export.d.ts +10 -4
  97. package/dist/export.d.ts.map +1 -1
  98. package/dist/export.js +26 -18
  99. package/dist/export.js.map +1 -1
  100. package/dist/generated/client.generated.d.ts +10 -0
  101. package/dist/generated/client.generated.d.ts.map +1 -1
  102. package/dist/generated/client.generated.js +10 -0
  103. package/dist/generated/client.generated.js.map +1 -1
  104. package/dist/generated/opcodes.generated.d.ts +4 -0
  105. package/dist/generated/opcodes.generated.d.ts.map +1 -1
  106. package/dist/generated/opcodes.generated.js +4 -0
  107. package/dist/generated/opcodes.generated.js.map +1 -1
  108. package/dist/generated/operations.generated.d.ts +35 -1
  109. package/dist/generated/operations.generated.d.ts.map +1 -1
  110. package/dist/generated/operations.generated.js +8 -1
  111. package/dist/generated/operations.generated.js.map +1 -1
  112. package/dist/markdown.d.ts.map +1 -1
  113. package/dist/mcp/confirm.d.ts +19 -11
  114. package/dist/mcp/confirm.d.ts.map +1 -1
  115. package/dist/mcp/confirm.js +53 -29
  116. package/dist/mcp/confirm.js.map +1 -1
  117. package/dist/mcp/instructions.d.ts.map +1 -1
  118. package/dist/mcp/server.d.ts.map +1 -1
  119. package/dist/mcp/session.d.ts.map +1 -1
  120. package/dist/mcp/session.js.map +1 -1
  121. package/dist/mcp/tools.d.ts.map +1 -1
  122. package/dist/mcp/tools.js +9 -4
  123. package/dist/mcp/tools.js.map +1 -1
  124. package/dist/output.d.ts.map +1 -1
  125. package/dist/output.js +24 -2
  126. package/dist/output.js.map +1 -1
  127. package/dist/profile.d.ts.map +1 -1
  128. package/dist/program.d.ts.map +1 -1
  129. package/dist/program.js +55 -5
  130. package/dist/program.js.map +1 -1
  131. package/dist/protocol/connection.d.ts +2 -0
  132. package/dist/protocol/connection.d.ts.map +1 -1
  133. package/dist/protocol/connection.js +27 -5
  134. package/dist/protocol/connection.js.map +1 -1
  135. package/dist/protocol/frame.d.ts +2 -0
  136. package/dist/protocol/frame.d.ts.map +1 -1
  137. package/dist/protocol/frame.js +3 -1
  138. package/dist/protocol/frame.js.map +1 -1
  139. package/dist/protocol/lz4.d.ts.map +1 -1
  140. package/dist/protocol/lz4.js +8 -5
  141. package/dist/protocol/lz4.js.map +1 -1
  142. package/dist/rendering/messages.d.ts.map +1 -1
  143. package/dist/rendering/messages.js +9 -10
  144. package/dist/rendering/messages.js.map +1 -1
  145. package/dist/report.d.ts +43 -0
  146. package/dist/report.d.ts.map +1 -0
  147. package/dist/report.js +91 -0
  148. package/dist/report.js.map +1 -0
  149. package/dist/resolve.d.ts +4 -3
  150. package/dist/resolve.d.ts.map +1 -1
  151. package/dist/resolve.js +9 -10
  152. package/dist/resolve.js.map +1 -1
  153. package/dist/runs/events.d.ts +21 -1
  154. package/dist/runs/events.d.ts.map +1 -1
  155. package/dist/runs/events.js +14 -1
  156. package/dist/runs/events.js.map +1 -1
  157. package/dist/runs/recording.d.ts +12 -0
  158. package/dist/runs/recording.d.ts.map +1 -1
  159. package/dist/runs/recording.js +83 -22
  160. package/dist/runs/recording.js.map +1 -1
  161. package/dist/runs/run.d.ts +11 -0
  162. package/dist/runs/run.d.ts.map +1 -1
  163. package/dist/runs/run.js +8 -1
  164. package/dist/runs/run.js.map +1 -1
  165. package/dist/sends/guard.d.ts +35 -4
  166. package/dist/sends/guard.d.ts.map +1 -1
  167. package/dist/sends/guard.js +128 -28
  168. package/dist/sends/guard.js.map +1 -1
  169. package/dist/sends/journal.d.ts +17 -3
  170. package/dist/sends/journal.d.ts.map +1 -1
  171. package/dist/sends/journal.js +62 -2
  172. package/dist/sends/journal.js.map +1 -1
  173. package/dist/sends/permissions.d.ts.map +1 -1
  174. package/dist/sends/permissions.js.map +1 -1
  175. package/dist/sends/recipients.d.ts +3 -1
  176. package/dist/sends/recipients.d.ts.map +1 -1
  177. package/dist/sends/recipients.js +7 -2
  178. package/dist/sends/recipients.js.map +1 -1
  179. package/dist/server/lines.d.ts +8 -2
  180. package/dist/server/lines.d.ts.map +1 -1
  181. package/dist/server/lines.js +13 -2
  182. package/dist/server/lines.js.map +1 -1
  183. package/dist/server/server-connection.d.ts +9 -6
  184. package/dist/server/server-connection.d.ts.map +1 -1
  185. package/dist/server/server-connection.js +16 -7
  186. package/dist/server/server-connection.js.map +1 -1
  187. package/dist/server/server.d.ts +21 -4
  188. package/dist/server/server.d.ts.map +1 -1
  189. package/dist/server/server.js +154 -17
  190. package/dist/server/server.js.map +1 -1
  191. package/dist/server/start.d.ts +3 -1
  192. package/dist/server/start.d.ts.map +1 -1
  193. package/dist/server/start.js +6 -1
  194. package/dist/server/start.js.map +1 -1
  195. package/dist/server/subscribe.d.ts.map +1 -1
  196. package/dist/session/adopt.d.ts.map +1 -1
  197. package/dist/session/browser.d.ts.map +1 -1
  198. package/dist/session/browser.js.map +1 -1
  199. package/dist/session/handshake.d.ts +17 -3
  200. package/dist/session/handshake.d.ts.map +1 -1
  201. package/dist/session/handshake.js +11 -5
  202. package/dist/session/handshake.js.map +1 -1
  203. package/dist/session/login.d.ts.map +1 -1
  204. package/dist/session/prompt.d.ts.map +1 -1
  205. package/dist/session/prompt.js +7 -1
  206. package/dist/session/prompt.js.map +1 -1
  207. package/dist/session/qr-terminal.d.ts.map +1 -1
  208. package/dist/session/store.d.ts +18 -1
  209. package/dist/session/store.d.ts.map +1 -1
  210. package/dist/session/store.js +32 -1
  211. package/dist/session/store.js.map +1 -1
  212. package/dist/spec/check.d.ts.map +1 -1
  213. package/dist/spec/define.d.ts +12 -0
  214. package/dist/spec/define.d.ts.map +1 -1
  215. package/dist/spec/define.js.map +1 -1
  216. package/dist/spec/guards.d.ts +16 -0
  217. package/dist/spec/guards.d.ts.map +1 -0
  218. package/dist/spec/guards.js +30 -0
  219. package/dist/spec/guards.js.map +1 -0
  220. package/dist/spec/identity.d.ts +39 -6
  221. package/dist/spec/identity.d.ts.map +1 -1
  222. package/dist/spec/identity.js +41 -12
  223. package/dist/spec/identity.js.map +1 -1
  224. package/dist/spec/index.d.ts.map +1 -1
  225. package/dist/spec/index.js +8 -1
  226. package/dist/spec/index.js.map +1 -1
  227. package/dist/spec/operations/account.d.ts.map +1 -1
  228. package/dist/spec/operations/account.js +3 -0
  229. package/dist/spec/operations/account.js.map +1 -1
  230. package/dist/spec/operations/assets.d.ts +10 -0
  231. package/dist/spec/operations/assets.d.ts.map +1 -0
  232. package/dist/spec/operations/assets.js +20 -0
  233. package/dist/spec/operations/assets.js.map +1 -0
  234. package/dist/spec/operations/attachments.d.ts.map +1 -1
  235. package/dist/spec/operations/attachments.js +2 -0
  236. package/dist/spec/operations/attachments.js.map +1 -1
  237. package/dist/spec/operations/banners.d.ts +7 -0
  238. package/dist/spec/operations/banners.d.ts.map +1 -0
  239. package/dist/spec/operations/banners.js +16 -0
  240. package/dist/spec/operations/banners.js.map +1 -0
  241. package/dist/spec/operations/calls.d.ts +8 -0
  242. package/dist/spec/operations/calls.d.ts.map +1 -0
  243. package/dist/spec/operations/calls.js +18 -0
  244. package/dist/spec/operations/calls.js.map +1 -0
  245. package/dist/spec/operations/chats.d.ts +5 -3
  246. package/dist/spec/operations/chats.d.ts.map +1 -1
  247. package/dist/spec/operations/chats.js +58 -9
  248. package/dist/spec/operations/chats.js.map +1 -1
  249. package/dist/spec/operations/contacts.d.ts.map +1 -1
  250. package/dist/spec/operations/contacts.js +8 -0
  251. package/dist/spec/operations/contacts.js.map +1 -1
  252. package/dist/spec/operations/folders.d.ts.map +1 -1
  253. package/dist/spec/operations/folders.js +5 -0
  254. package/dist/spec/operations/folders.js.map +1 -1
  255. package/dist/spec/operations/login.d.ts.map +1 -1
  256. package/dist/spec/operations/login.js +6 -0
  257. package/dist/spec/operations/login.js.map +1 -1
  258. package/dist/spec/operations/messages.d.ts.map +1 -1
  259. package/dist/spec/operations/messages.js +50 -0
  260. package/dist/spec/operations/messages.js.map +1 -1
  261. package/dist/spec/operations/session.d.ts +28 -1
  262. package/dist/spec/operations/session.d.ts.map +1 -1
  263. package/dist/spec/operations/session.js +47 -1
  264. package/dist/spec/operations/session.js.map +1 -1
  265. package/dist/spec/operations/uploads.d.ts.map +1 -1
  266. package/dist/spec/operations/uploads.js +2 -0
  267. package/dist/spec/operations/uploads.js.map +1 -1
  268. package/dist/spec/scalars.d.ts.map +1 -1
  269. package/dist/transcribe/index.d.ts.map +1 -1
  270. package/dist/transcribe/index.js +4 -1
  271. package/dist/transcribe/index.js.map +1 -1
  272. package/dist/transcribe/install.d.ts +3 -1
  273. package/dist/transcribe/install.d.ts.map +1 -1
  274. package/dist/transcribe/install.js +24 -1
  275. package/dist/transcribe/install.js.map +1 -1
  276. package/dist/transcribe/models.d.ts.map +1 -1
  277. package/dist/transcribe/speech.d.ts.map +1 -1
  278. package/dist/transcribe/speech.js.map +1 -1
  279. package/dist/update.d.ts.map +1 -1
  280. package/dist/update.js.map +1 -1
  281. package/dist/upload.d.ts +3 -1
  282. package/dist/upload.d.ts.map +1 -1
  283. package/dist/upload.js +34 -4
  284. package/dist/upload.js.map +1 -1
  285. package/dist/version.d.ts +1 -1
  286. package/dist/version.d.ts.map +1 -1
  287. package/dist/version.js +1 -1
  288. package/dist/version.js.map +1 -1
  289. package/package.json +18 -15
  290. package/skills/max-cli/SKILL.md +12 -1
  291. package/dist/testing/mock-max.d.ts +0 -49
  292. package/dist/testing/mock-max.d.ts.map +0 -1
  293. package/dist/testing/mock-max.js +0 -80
  294. package/dist/testing/mock-max.js.map +0 -1
  295. package/dist/testing/sandbox.d.ts +0 -2
  296. package/dist/testing/sandbox.d.ts.map +0 -1
  297. package/dist/testing/sandbox.js +0 -36
  298. package/dist/testing/sandbox.js.map +0 -1
  299. package/dist/testing/unscripted.d.ts +0 -2
  300. package/dist/testing/unscripted.d.ts.map +0 -1
  301. package/dist/testing/unscripted.js +0 -18
  302. package/dist/testing/unscripted.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/runs/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/runs/run.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,30 @@
1
+ import type { Settings } from "../config.js";
1
2
  import type { Id } from "../domain/models.js";
2
- import type { AccountAction, ChatAction, SendEntry, SendJournal, SendKind } from "./journal.js";
3
+ import { type AccountAction, type ChatAction, type SendEntry, SendJournal, type SendKind } from "./journal.js";
3
4
  import { type Permission } from "./permissions.js";
4
- import type { RecipientList } from "./recipients.js";
5
+ import { RecipientList } from "./recipients.js";
6
+ /** One write, as the guard is asked about it. `personIds` are checked and never journaled. */
7
+ export interface GuardRequest {
8
+ /** `null` for a chat that does not exist yet — joining or creating one — or for the account itself: no list can name either. */
9
+ chatId: Id | null;
10
+ kind?: SendKind;
11
+ action?: ChatAction | AccountAction;
12
+ /** Messages a deletion names, or people a chat change adds. */
13
+ count?: number;
14
+ cid?: number;
15
+ scheduledFor?: string;
16
+ notify?: boolean;
17
+ personIds?: Id[];
18
+ }
5
19
  /** What `MaxClient.messages.send` asks before it sends, and tells after — on every outcome. */
6
20
  export interface SendGuard {
7
- /** `null` for a chat that does not exist yet — joining or creating one — or for the account itself: no list can name either. */
8
- check(chatId: Id | null, kind?: SendKind, action?: ChatAction | AccountAction, count?: number): void;
21
+ /**
22
+ * Refuses, or lets the write through. One that counts toward the limit is also given a place in
23
+ * the journal under a lock, unless `reserve` is false — over `max serve` the server holds it.
24
+ */
25
+ check(request: GuardRequest, options?: {
26
+ reserve?: boolean;
27
+ }): void;
9
28
  record(entry: Omit<SendEntry, "at" | "profile">): void;
10
29
  }
11
30
  export interface SendGuardOptions {
@@ -28,4 +47,16 @@ export interface SendGuardOptions {
28
47
  * (`docs/security.md`).
29
48
  */
30
49
  export declare const sendGuard: ({ profile, readOnly, readOnlyFrom, allow, allowFrom, sendsPerHour, journal, recipients, warn, now, }: SendGuardOptions) => SendGuard;
50
+ /**
51
+ * The guard a profile's configuration asks for — the command's, and `max serve`'s for every write
52
+ * it forwards. Built per request in the server, so `config set readOnly true` needs no restart.
53
+ */
54
+ export declare const guardFor: (settings: Settings, warn: (message: string) => void) => SendGuard;
55
+ /**
56
+ * Over `max serve`, the server journals what it forwards, with the outcome it saw; the command
57
+ * writes only the refusals of its own check, which never reached the server.
58
+ */
59
+ export declare const sharedJournal: (guard: SendGuard, wire: {
60
+ readonly journals: boolean;
61
+ } | undefined) => SendGuard;
31
62
  //# sourceMappingURL=guard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/sends/guard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC/F,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,kBAAkB,CAAA;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAIpD,+FAA+F;AAC/F,MAAM,WAAW,SAAS;IACxB,gIAAgI;IAChI,KAAK,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpG,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,SAAS,CAAC,GAAG,IAAI,CAAA;CACvD;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,OAAO,CAAA;IACjB,mEAAmE;IACnE,YAAY,EAAE,MAAM,CAAA;IACpB,qEAAqE;IACrE,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,WAAW,CAAA;IACpB,UAAU,EAAE,aAAa,CAAA;IACzB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAaD;;;;GAIG;AACH,eAAO,MAAM,SAAS,GAAI,sGAWvB,gBAAgB,KAAG,SA8EpB,CAAA"}
1
+ {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/sends/guard.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,WAAW,EACX,KAAK,QAAQ,EAEd,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,kBAAkB,CAAA;AACjE,OAAO,EAAE,aAAa,EAAqB,MAAM,iBAAiB,CAAA;AAIlE,8FAA8F;AAC9F,MAAM,WAAW,YAAY;IAC3B,gIAAgI;IAChI,MAAM,EAAE,EAAE,GAAG,IAAI,CAAA;IACjB,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,MAAM,CAAC,EAAE,UAAU,GAAG,aAAa,CAAA;IACnC,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,EAAE,EAAE,CAAA;CACjB;AAED,+FAA+F;AAC/F,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAA;IACnE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,SAAS,CAAC,GAAG,IAAI,CAAA;CACvD;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,OAAO,CAAA;IACjB,mEAAmE;IACnE,YAAY,EAAE,MAAM,CAAA;IACpB,qEAAqE;IACrE,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,WAAW,CAAA;IACpB,UAAU,EAAE,aAAa,CAAA;IACzB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AA8BD;;;;GAIG;AACH,eAAO,MAAM,SAAS,yGAWnB,gBAAgB,KAAG,SA2IrB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,aAAc,QAAQ,QAAQ,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,KAAG,SAU3E,CAAA;AAEJ;;;GAGG;AACH,eAAO,MAAM,aAAa,UAAW,SAAS,QAAQ;IAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,KAAG,SAUxF,CAAA"}
@@ -1,21 +1,38 @@
1
+ import { randomUUID } from "node:crypto";
1
2
  import { CliError } from "@leemour/cli-core";
3
+ import { SendJournal, sendsPathFor, } from "./journal.js";
2
4
  import { permissionFor } from "./permissions.js";
5
+ import { RecipientList, recipientsPathFor } from "./recipients.js";
3
6
  const HOUR_MS = 60 * 60 * 1000;
4
7
  /**
5
- * What puts a new message in somebody's chat (`NEED-168`). A reaction, an edit, a quiet pin or a
6
- * change to a chat wakes nobody up; creating a group does — the people in it are told. A deletion
7
- * wakes nobody either, but many at once is what a ban for automation looks like, so each deleted
8
- * message counts as one (`MAX-47`).
8
+ * What puts something in front of somebody (`NEED-168`, widened by `NEED-282`). A message, a
9
+ * forward, an edit, a pin that notifies, a new group and people added to one all do. A reaction,
10
+ * a quiet pin or a change of title wakes nobody. A deletion wakes nobody either, but many at once
11
+ * is what a ban for automation looks like (`MAX-47`).
9
12
  */
10
- const countsTowardLimit = ({ kind = "message", action }) => kind === "message" || kind === "forward" || kind === "delete" || action === "create";
11
- const weightOf = (entry) => (entry.kind === "delete" ? (entry.count ?? 1) : 1);
13
+ const countsTowardLimit = ({ kind = "message", action, notify }) => kind === "message" ||
14
+ kind === "forward" ||
15
+ kind === "edit" ||
16
+ kind === "delete" ||
17
+ (kind === "pin" && notify === true) ||
18
+ action === "create" ||
19
+ action === "members.add";
20
+ /** Each deleted message, and each person added to a group, counts as one. */
21
+ const weightOf = ({ kind, action, count, people }) => kind === "delete"
22
+ ? (count ?? 1)
23
+ : action === "create" || action === "members.add"
24
+ ? Math.max(1, people ?? count ?? 1)
25
+ : 1;
26
+ /** A scheduled message counts in the hour MAX sends it. */
27
+ const timeOf = (entry) => Date.parse(entry.scheduledFor ?? entry.at);
12
28
  /**
13
29
  * These stop a model that was talked into sending by a message it read. They do **not** stop an
14
30
  * agent that edits the configuration itself — that needs a boundary outside this process
15
31
  * (`docs/security.md`).
16
32
  */
17
- export const sendGuard = ({ profile, readOnly, readOnlyFrom, allow, allowFrom = "default", sendsPerHour, journal, recipients, warn, now = () => new Date(), }) => ({
18
- check: (chatId, kind = "message", action, count = 1) => {
33
+ export const sendGuard = ({ profile, readOnly, readOnlyFrom, allow, allowFrom = "default", sendsPerHour, journal, recipients, warn, now = () => new Date(), }) => {
34
+ let reservation;
35
+ const permitted = ({ chatId, kind = "message", action, personIds }) => {
19
36
  if (readOnly) {
20
37
  throw new CliError("permission_error", `profile ${profile} is read-only (readOnly, from the ${readOnlyFrom}) — it cannot send, react, change chats or change the account`);
21
38
  }
@@ -30,19 +47,37 @@ export const sendGuard = ({ profile, readOnly, readOnlyFrom, allow, allowFrom =
30
47
  throw new CliError("confirmation_required", `chat ${chatId} is not on the recipient list of profile ${profile} — ` +
31
48
  `the owner adds it with \`max ${profile} recipients add ${chatId}\``, { chatId });
32
49
  }
33
- if (!countsTowardLimit({ kind, action }))
34
- return;
50
+ // Adding somebody to a group writes to them as surely as a message does.
51
+ const strangers = allowed ? (personIds ?? []).filter((id) => !allowed.some((chat) => chat.partnerId === id)) : [];
52
+ if (strangers.length > 0) {
53
+ throw new CliError("confirmation_required", `${strangers.join(", ")} ${strangers.length === 1 ? "is" : "are"} not on the recipient list of profile ${profile} — ` +
54
+ `the owner adds the one-to-one chat with each person (\`max ${profile} recipients add <chat>\`); ` +
55
+ "a chat added to the list earlier is added again to be recognised", { personIds: strangers });
56
+ }
57
+ };
58
+ const withinLimit = (request, entries) => {
59
+ const { chatId, cid } = request;
60
+ const asked = { ...request, people: request.personIds?.length ?? request.count };
61
+ const count = weightOf(asked);
35
62
  if (count > sendsPerHour) {
36
63
  throw new CliError("rate_limited", `${count} at once is more than the hourly limit of profile ${profile} (sendsPerHour ${sendsPerHour}) — ` +
37
64
  "do fewer at a time");
38
65
  }
39
- const since = now().getTime() - HOUR_MS;
40
- const recent = journal
41
- .entries()
66
+ const at = request.scheduledFor ? Date.parse(request.scheduledFor) : now().getTime();
67
+ const counted = entries
42
68
  .filter(countsTowardLimit)
43
- .filter((entry) => entry.outcome === "sent" || entry.outcome === "outcome_unknown")
44
- .map((entry) => ({ time: Date.parse(entry.at), weight: weightOf(entry) }))
45
- .filter(({ time }) => time > since)
69
+ .filter((entry) => entry.outcome === "sent" || entry.outcome === "outcome_unknown" || entry.outcome === "reserved")
70
+ .filter((entry) => Math.abs(timeOf(entry) - at) < HOUR_MS);
71
+ // A retry of a send whose outcome was unknown repeats its `cid` in the same chat, and MAX
72
+ // delivers one message for both. Only that: a `cid` that was sent, or another chat, is a new send.
73
+ const unsure = (entry) => entry.outcome === "outcome_unknown";
74
+ const same = (a, b) => a.cid !== undefined && a.cid === b.cid && a.chatId === b.chatId;
75
+ const last = [...counted].reverse().find((entry) => same(entry, { chatId, cid }));
76
+ if (cid !== undefined && last && unsure(last))
77
+ return false;
78
+ const recent = counted
79
+ .filter((entry, index) => !(unsure(entry) && counted.slice(index + 1).some((later) => same(later, entry))))
80
+ .map((entry) => ({ time: timeOf(entry), weight: weightOf(entry) }))
46
81
  .sort((a, b) => a.time - b.time);
47
82
  const used = recent.reduce((sum, { weight }) => sum + weight, 0);
48
83
  if (used + count > sendsPerHour) {
@@ -55,19 +90,84 @@ export const sendGuard = ({ profile, readOnly, readOnlyFrom, allow, allowFrom =
55
90
  });
56
91
  const nextMs = (opening?.time ?? 0) + HOUR_MS;
57
92
  const next = new Date(nextMs).toISOString();
58
- throw new CliError("rate_limited", `profile ${profile} has sent ${used} messages in the last hour, and its limit is ` +
93
+ throw new CliError("rate_limited", `profile ${profile} has sent ${used} messages in the hour around ${new Date(at).toISOString()}, and its limit is ` +
59
94
  `${sendsPerHour} (sendsPerHour) — the next send is possible at ${next}`, { retryAfterMs: nextMs - now().getTime(), retryAt: next });
60
95
  }
61
- },
62
- // After a send, a failure to write here must not become the command's answer: the message is
63
- // already with a person, and an error would invite the caller to send it again.
64
- record: (entry) => {
65
- try {
66
- journal.append({ at: now().toISOString(), profile, ...entry });
67
- }
68
- catch (error) {
69
- warn(`this send is not in the send journal: ${error instanceof Error ? error.message : String(error)}`);
70
- }
71
- },
96
+ return true;
97
+ };
98
+ return {
99
+ check: (request, { reserve = true } = {}) => {
100
+ permitted(request);
101
+ const asked = { ...request, people: request.personIds?.length ?? request.count };
102
+ if (!countsTowardLimit(asked))
103
+ return;
104
+ if (!reserve) {
105
+ withinLimit(request, journal.entries());
106
+ return;
107
+ }
108
+ journal.locked(() => {
109
+ if (!withinLimit(request, journal.entries()))
110
+ return;
111
+ const id = randomUUID();
112
+ const { chatId, kind, action, cid, scheduledFor, notify } = request;
113
+ journal.append({
114
+ at: now().toISOString(),
115
+ profile,
116
+ chatId,
117
+ outcome: "reserved",
118
+ reservation: id,
119
+ ...(kind ? { kind } : {}),
120
+ ...(action ? { action } : {}),
121
+ ...(asked.people === undefined ? {} : kind === "delete" ? { count: asked.people } : { people: asked.people }),
122
+ ...(cid === undefined ? {} : { cid }),
123
+ ...(scheduledFor ? { scheduledFor } : {}),
124
+ ...(notify === undefined ? {} : { notify }),
125
+ });
126
+ reservation = id;
127
+ });
128
+ },
129
+ // After a send, a failure to write here must not become the command's answer: the message is
130
+ // already with a person, and an error would invite the caller to send it again.
131
+ record: (entry) => {
132
+ const { personIds: _, ...kept } = entry;
133
+ const settles = entry.outcome === "refused" ? undefined : reservation;
134
+ reservation = undefined;
135
+ try {
136
+ journal.append({ at: now().toISOString(), profile, ...kept, ...(settles ? { reservation: settles } : {}) });
137
+ }
138
+ catch (error) {
139
+ warn(`this send is not in the send journal: ${error instanceof Error ? error.message : String(error)}`);
140
+ }
141
+ },
142
+ };
143
+ };
144
+ /**
145
+ * The guard a profile's configuration asks for — the command's, and `max serve`'s for every write
146
+ * it forwards. Built per request in the server, so `config set readOnly true` needs no restart.
147
+ */
148
+ export const guardFor = (settings, warn) => sendGuard({
149
+ profile: settings.profile,
150
+ readOnly: settings.readOnly,
151
+ readOnlyFrom: settings.sources.readOnly,
152
+ ...(settings.allow ? { allow: settings.allow, allowFrom: settings.sources.allow } : {}),
153
+ sendsPerHour: settings.sendsPerHour,
154
+ journal: new SendJournal(sendsPathFor(settings.profile)),
155
+ recipients: new RecipientList(recipientsPathFor(settings.profile)),
156
+ warn,
72
157
  });
158
+ /**
159
+ * Over `max serve`, the server journals what it forwards, with the outcome it saw; the command
160
+ * writes only the refusals of its own check, which never reached the server.
161
+ */
162
+ export const sharedJournal = (guard, wire) => wire
163
+ ? {
164
+ // The check comes before the connection, when `journals` cannot tell yet; the server
165
+ // reserves under its own lock, and a command that falls back to its own socket goes unreserved.
166
+ check: (request) => guard.check(request, { reserve: false }),
167
+ record: (entry) => {
168
+ if (entry.outcome === "refused" || !wire.journals)
169
+ guard.record(entry);
170
+ },
171
+ }
172
+ : guard;
73
173
  //# sourceMappingURL=guard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/sends/guard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/sends/guard.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { Id } from "../domain/models.js";
2
- export type SendOutcome = "sent" | "outcome_unknown" | "refused" | "failed";
2
+ /** `reserved` holds a place under the hourly limit while the write is on its way; its outcome follows. */
3
+ export type SendOutcome = "sent" | "outcome_unknown" | "refused" | "failed" | "reserved";
3
4
  /** Absent in the journal means a message: that is every line written before reactions were guarded. */
4
5
  export type SendKind = "message" | "reaction" | "edit" | "forward" | "pin" | "read" | "delete" | "chat" | "account";
5
6
  /** What a `chat` entry did. Never a title, a description or a link — only which action. */
@@ -28,8 +29,12 @@ export interface SendEntry {
28
29
  kind: "photo" | "file";
29
30
  bytes: number;
30
31
  }[];
31
- /** When MAX will send it; the entry is written when it was queued, and the guard counted it then. */
32
+ /** When MAX will send it; it counts toward the limit of that hour, not of the hour it was queued. */
32
33
  scheduledFor?: string;
34
+ /** Whether a pin told the members. */
35
+ notify?: boolean;
36
+ /** Pairs an outcome with the `reserved` line it settles. */
37
+ reservation?: string;
33
38
  errorCode?: string;
34
39
  }
35
40
  /**
@@ -38,10 +43,19 @@ export interface SendEntry {
38
43
  */
39
44
  export declare const sendsPathFor: (profile: string, env?: NodeJS.ProcessEnv) => string;
40
45
  export declare class SendJournal {
46
+ #private;
41
47
  readonly path: string;
42
48
  constructor(path: string);
49
+ /**
50
+ * Runs `body` with the journal to itself, across processes: two sends at the limit must not both
51
+ * read "one left". A lock file opened with `wx`, because `flock` is not there on Windows.
52
+ */
53
+ locked<T>(body: () => T): T;
43
54
  append(entry: SendEntry): void;
44
- /** Oldest first. A line that does not parse is skipped: a torn last write must not block sending. */
55
+ /**
56
+ * Oldest first, each reservation folded into its outcome; one with no outcome yet is in flight,
57
+ * or its process died. A line that does not parse is skipped: a torn last write must not block sending.
58
+ */
45
59
  entries(): SendEntry[];
46
60
  }
47
61
  //# sourceMappingURL=journal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../../src/sends/journal.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAA;AAE7C,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,iBAAiB,GAAG,SAAS,GAAG,QAAQ,CAAA;AAE3E,uGAAuG;AACvG,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAA;AAEnH,2FAA2F;AAC3F,MAAM,MAAM,UAAU,GAClB,QAAQ,GACR,MAAM,GACN,OAAO,GACP,aAAa,GACb,gBAAgB,GAChB,YAAY,GACZ,eAAe,GACf,QAAQ,GACR,UAAU,GACV,iBAAiB,GACjB,kBAAkB,GAClB,YAAY,CAAA;AAEhB,oGAAoG;AACpG,MAAM,MAAM,aAAa,GACrB,aAAa,GACb,gBAAgB,GAChB,gBAAgB,GAChB,SAAS,GACT,eAAe,GACf,eAAe,GACf,eAAe,GACf,cAAc,CAAA;AAElB,iEAAiE;AACjE,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,oHAAoH;IACpH,MAAM,EAAE,EAAE,GAAG,IAAI,CAAA;IACjB,OAAO,EAAE,WAAW,CAAA;IACpB,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,MAAM,CAAC,EAAE,UAAU,GAAG,aAAa,CAAA;IACnC,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,EAAE,CAAA;IACd,0FAA0F;IAC1F,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,+DAA+D;IAC/D,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACzD,qGAAqG;IACrG,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,EAAE,MAAK,MAAM,CAAC,UAAwB,KAAG,MACc,CAAA;AAEnG,qBAAa,WAAW;IACV,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;IAEjC,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAK9B,qGAAqG;IACrG,OAAO,IAAI,SAAS,EAAE;CAkBvB"}
1
+ {"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../../src/sends/journal.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAA;AAE7C,0GAA0G;AAC1G,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,iBAAiB,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAA;AAExF,uGAAuG;AACvG,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAA;AAEnH,2FAA2F;AAC3F,MAAM,MAAM,UAAU,GAClB,QAAQ,GACR,MAAM,GACN,OAAO,GACP,aAAa,GACb,gBAAgB,GAChB,YAAY,GACZ,eAAe,GACf,QAAQ,GACR,UAAU,GACV,iBAAiB,GACjB,kBAAkB,GAClB,YAAY,CAAA;AAEhB,oGAAoG;AACpG,MAAM,MAAM,aAAa,GACrB,aAAa,GACb,gBAAgB,GAChB,gBAAgB,GAChB,SAAS,GACT,eAAe,GACf,eAAe,GACf,eAAe,GACf,cAAc,CAAA;AAElB,iEAAiE;AACjE,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,oHAAoH;IACpH,MAAM,EAAE,EAAE,GAAG,IAAI,CAAA;IACjB,OAAO,EAAE,WAAW,CAAA;IACpB,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,MAAM,CAAC,EAAE,UAAU,GAAG,aAAa,CAAA;IACnC,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,EAAE,CAAA;IACd,0FAA0F;IAC1F,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,+DAA+D;IAC/D,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACzD,qGAAqG;IACrG,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,sCAAsC;IACtC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,YAAa,MAAM,QAAO,MAAM,CAAC,UAAU,KAAiB,MACc,CAAA;AAOnG,qBAAa,WAAW;;IACV,QAAQ,CAAC,IAAI,EAAE,MAAM;IAAjC,YAAqB,IAAI,EAAE,MAAM,EAAI;IAErC;;;OAGG;IACH,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CA4B1B;IAED,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAG7B;IAED;;;OAGG;IACH,OAAO,IAAI,SAAS,EAAE,CAMrB;CAoBF"}
@@ -1,4 +1,4 @@
1
- import { appendFileSync, mkdirSync, readFileSync } from "node:fs";
1
+ import { appendFileSync, closeSync, mkdirSync, openSync, readFileSync, statSync, unlinkSync } from "node:fs";
2
2
  import { dirname, join } from "node:path";
3
3
  import { resolvePaths } from "@leemour/cli-core";
4
4
  /**
@@ -6,17 +6,69 @@ import { resolvePaths } from "@leemour/cli-core";
6
6
  * `max cache clear` cannot erase what was sent in the owner's name (the reason of `NEED-51`).
7
7
  */
8
8
  export const sendsPathFor = (profile, env = process.env) => join(resolvePaths({ appName: "max-cli", prefix: "MAX", env }).state, "sends", `${profile}.jsonl`);
9
+ const LOCK_WAIT_MS = 5_000;
10
+ /** Longer than any check and append takes; a lock this old was left by a process that died holding it. */
11
+ const LOCK_STALE_MS = 30_000;
12
+ const pause = new Int32Array(new SharedArrayBuffer(4));
9
13
  export class SendJournal {
10
14
  path;
11
15
  constructor(path) {
12
16
  this.path = path;
13
17
  }
18
+ /**
19
+ * Runs `body` with the journal to itself, across processes: two sends at the limit must not both
20
+ * read "one left". A lock file opened with `wx`, because `flock` is not there on Windows.
21
+ */
22
+ locked(body) {
23
+ mkdirSync(dirname(this.path), { recursive: true, mode: 0o700 });
24
+ const lock = `${this.path}.lock`;
25
+ const deadline = Date.now() + LOCK_WAIT_MS;
26
+ for (;;) {
27
+ try {
28
+ closeSync(openSync(lock, "wx", 0o600));
29
+ break;
30
+ }
31
+ catch (error) {
32
+ if (error.code !== "EEXIST")
33
+ throw error;
34
+ if (Date.now() - lockTime(lock) > LOCK_STALE_MS) {
35
+ try {
36
+ unlinkSync(lock);
37
+ }
38
+ catch { }
39
+ continue;
40
+ }
41
+ if (Date.now() > deadline)
42
+ throw new Error(`the send journal stayed locked for ${LOCK_WAIT_MS / 1000}s (${lock})`);
43
+ Atomics.wait(pause, 0, 0, 20);
44
+ }
45
+ }
46
+ try {
47
+ return body();
48
+ }
49
+ finally {
50
+ try {
51
+ unlinkSync(lock);
52
+ }
53
+ catch { }
54
+ }
55
+ }
14
56
  append(entry) {
15
57
  mkdirSync(dirname(this.path), { recursive: true, mode: 0o700 });
16
58
  appendFileSync(this.path, `${JSON.stringify(entry)}\n`, { mode: 0o600 });
17
59
  }
18
- /** Oldest first. A line that does not parse is skipped: a torn last write must not block sending. */
60
+ /**
61
+ * Oldest first, each reservation folded into its outcome; one with no outcome yet is in flight,
62
+ * or its process died. A line that does not parse is skipped: a torn last write must not block sending.
63
+ */
19
64
  entries() {
65
+ const lines = this.#lines();
66
+ const settled = new Set(lines.filter((entry) => entry.outcome !== "reserved").map((entry) => entry.reservation));
67
+ return lines
68
+ .filter((entry) => entry.outcome !== "reserved" || !settled.has(entry.reservation))
69
+ .map(({ reservation, ...entry }) => (entry.outcome === "reserved" ? { ...entry, reservation } : entry));
70
+ }
71
+ #lines() {
20
72
  let text;
21
73
  try {
22
74
  text = readFileSync(this.path, "utf8");
@@ -37,4 +89,12 @@ export class SendJournal {
37
89
  });
38
90
  }
39
91
  }
92
+ const lockTime = (lock) => {
93
+ try {
94
+ return statSync(lock).mtimeMs;
95
+ }
96
+ catch {
97
+ return Date.now();
98
+ }
99
+ };
40
100
  //# sourceMappingURL=journal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"journal.js","sourceRoot":"","sources":["../../src/sends/journal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AA0DhD;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAe,EAAE,MAAyB,OAAO,CAAC,GAAG,EAAU,EAAE,CAC5F,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,QAAQ,CAAC,CAAA;AAEnG,MAAM,OAAO,WAAW;IACD;IAArB,YAAqB,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAErC,MAAM,CAAC,KAAgB;QACrB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC/D,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAC1E,CAAC;IAED,qGAAqG;IACrG,OAAO;QACL,IAAI,IAAY,CAAA;QAChB,IAAI,CAAC;YACH,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAA;QACX,CAAC;QACD,OAAO,IAAI;aACR,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;aACpC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAChB,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC,CAAA;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,CAAA;YACX,CAAC;QACH,CAAC,CAAC,CAAA;IACN,CAAC;CACF"}
1
+ {"version":3,"file":"journal.js","sourceRoot":"","sources":["../../src/sends/journal.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/sends/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,cAAc,CAAA;AAE3D;;;;;GAKG;AACH,eAAO,MAAM,WAAW,mIAad,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAarD,eAAO,MAAM,aAAa,GAAI,MAAM,QAAQ,EAAE,SAAS,MAAM,KAAG,UAc/D,CAAA"}
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/sends/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,cAAc,CAAA;AAE3D;;;;;GAKG;AACH,eAAO,MAAM,WAAW,YACtB,MAAM,EACN,SAAS,EACT,UAAU,EACV,MAAM,EACN,KAAK,EACL,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,SAAS,EACT,SAAS,EACT,UAAU,CACF,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAarD,eAAO,MAAM,aAAa,SAAU,QAAQ,WAAW,MAAM,KAAG,UAc/D,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/sends/permissions.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM;IACN,SAAS;IACT,UAAU;IACV,MAAM;IACN,KAAK;IACL,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,SAAS;IACT,SAAS;IACT,UAAU;CACF,CAAA;AAIV,MAAM,OAAO,GAAsC;IACjD,aAAa,EAAE,UAAU;IACzB,gBAAgB,EAAE,UAAU;IAC5B,gBAAgB,EAAE,UAAU;IAC5B,OAAO,EAAE,SAAS;IAClB,eAAe,EAAE,SAAS;IAC1B,eAAe,EAAE,SAAS;IAC1B,eAAe,EAAE,SAAS;IAC1B,cAAc,EAAE,UAAU;CAC3B,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAc,EAAE,MAAe,EAAc,EAAE;IAC3E,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,MAAM,CAAA;QACf,KAAK,MAAM;YACT,OAAO,QAAQ,CAAA;QACjB,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,UAAU,GAAG,OAAO,CAAC,MAAuB,CAAC,CAAA;YACnD,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,MAAM,EAAE,CAAC,CAAA;YACvF,OAAO,UAAU,CAAA;QACnB,CAAC;QACD;YACE,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/sends/permissions.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM;IACN,SAAS;IACT,UAAU;IACV,MAAM;IACN,KAAK;IACL,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,SAAS;IACT,SAAS;IACT,UAAU;CACF,CAAA;AAIV,MAAM,OAAO,GAAsC;IACjD,aAAa,EAAE,UAAU;IACzB,gBAAgB,EAAE,UAAU;IAC5B,gBAAgB,EAAE,UAAU;IAC5B,OAAO,EAAE,SAAS;IAClB,eAAe,EAAE,SAAS;IAC1B,eAAe,EAAE,SAAS;IAC1B,eAAe,EAAE,SAAS;IAC1B,cAAc,EAAE,UAAU;CAC3B,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAc,EAAE,MAAe,EAAc,EAAE;IAC3E,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,MAAM,CAAA;QACf,KAAK,MAAM;YACT,OAAO,QAAQ,CAAA;QACjB,KAAK,SAAS,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,OAAO,CAAC,MAAuB,CAAC,CAAA;YACnD,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,MAAM,EAAE,CAAC,CAAA;YACvF,OAAO,UAAU,CAAA;QACnB,CAAC;QACD;YACE,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC,CAAA"}
@@ -2,6 +2,8 @@ import type { Id } from "../domain/models.js";
2
2
  export interface Recipient {
3
3
  id: Id;
4
4
  title: string | null;
5
+ /** The other person, for a one-to-one chat: who may be put in a group when the list is on. */
6
+ partnerId?: Id;
5
7
  addedAt: string;
6
8
  }
7
9
  /**
@@ -19,7 +21,7 @@ export declare class RecipientList {
19
21
  constructor(path: string);
20
22
  /** `undefined` when the list is off. A file that cannot be read refuses rather than opening up. */
21
23
  read(): Recipient[] | undefined;
22
- /** Whether it was new. */
24
+ /** Whether it was new. Adding one again fills in a partner an older entry was stored without. */
23
25
  add(recipient: Recipient): boolean;
24
26
  /** The id or the title as it was stored; `undefined` when neither matched. */
25
27
  remove(reference: string): Recipient | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"recipients.d.ts","sourceRoot":"","sources":["../../src/sends/recipients.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAA;AAE7C,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,EAAE,CAAA;IACN,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,SAAS,MAAM,EAAE,MAAK,MAAM,CAAC,UAAwB,KAAG,MACsB,CAAA;AAEhH;;;GAGG;AACH,qBAAa,aAAa;;IACZ,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;IAEjC,mGAAmG;IACnG,IAAI,IAAI,SAAS,EAAE,GAAG,SAAS;IAe/B,0BAA0B;IAC1B,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;IAOlC,8EAA8E;IAC9E,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAUhD,4CAA4C;IAC5C,GAAG,IAAI,OAAO;CASf"}
1
+ {"version":3,"file":"recipients.d.ts","sourceRoot":"","sources":["../../src/sends/recipients.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAA;AAE7C,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,EAAE,CAAA;IACN,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,8FAA8F;IAC9F,SAAS,CAAC,EAAE,EAAE,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,YAAa,MAAM,QAAO,MAAM,CAAC,UAAU,KAAiB,MACsB,CAAA;AAEhH;;;GAGG;AACH,qBAAa,aAAa;;IACZ,QAAQ,CAAC,IAAI,EAAE,MAAM;IAAjC,YAAqB,IAAI,EAAE,MAAM,EAAI;IAErC,mGAAmG;IACnG,IAAI,IAAI,SAAS,EAAE,GAAG,SAAS,CAa9B;IAED,iGAAiG;IACjG,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAWjC;IAED,8EAA8E;IAC9E,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAQ/C;IAED,4CAA4C;IAC5C,GAAG,IAAI,OAAO,CAIb;CAKF"}
@@ -30,11 +30,16 @@ export class RecipientList {
30
30
  "fix the file or turn the list off with `max recipients off`");
31
31
  }
32
32
  }
33
- /** Whether it was new. */
33
+ /** Whether it was new. Adding one again fills in a partner an older entry was stored without. */
34
34
  add(recipient) {
35
35
  const chats = this.read() ?? [];
36
- if (chats.some((chat) => chat.id === recipient.id))
36
+ const known = chats.find((chat) => chat.id === recipient.id);
37
+ if (known) {
38
+ if (recipient.partnerId && !known.partnerId) {
39
+ this.#write(chats.map((chat) => (chat === known ? { ...known, partnerId: recipient.partnerId } : chat)));
40
+ }
37
41
  return false;
42
+ }
38
43
  this.#write([...chats, recipient]);
39
44
  return true;
40
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"recipients.js","sourceRoot":"","sources":["../../src/sends/recipients.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recipients.js","sourceRoot":"","sources":["../../src/sends/recipients.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,12 @@
8
8
  */
9
9
  export declare const toLine: (value: unknown) => string;
10
10
  export declare const fromLine: (line: string) => Record<string, unknown>;
11
- /** Calls `onLine` for each complete line `data` finishes, keeping the rest for next time. */
12
- export declare const lineReader: (onLine: (line: string) => void) => (data: Buffer | string) => void;
11
+ /**
12
+ * Calls `onLine` for each complete line `data` finishes, keeping the rest for next time. With
13
+ * `maxLength`, a line that grows past it calls `onTooLong` instead and nothing more is read.
14
+ */
15
+ export declare const lineReader: (onLine: (line: string) => void, { maxLength, onTooLong }?: {
16
+ maxLength?: number;
17
+ onTooLong?: () => void;
18
+ }) => (data: Buffer | string) => void;
13
19
  //# sourceMappingURL=lines.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lines.d.ts","sourceRoot":"","sources":["../../src/server/lines.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM,GAAI,OAAO,OAAO,KAAG,MACiE,CAAA;AAEzG,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAG/B,CAAA;AAU/B,6FAA6F;AAC7F,eAAO,MAAM,UAAU,GAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,MAE/C,MAAM,MAAM,GAAG,MAAM,SAU9B,CAAA"}
1
+ {"version":3,"file":"lines.d.ts","sourceRoot":"","sources":["../../src/server/lines.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM,UAAW,OAAO,KAAG,MACiE,CAAA;AAEzG,eAAO,MAAM,QAAQ,SAAU,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAG/B,CAAA;AAU/B;;;GAGG;AACH,eAAO,MAAM,UAAU,WACb,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,6BACkC;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,YAIhG,MAAM,GAAG,MAAM,SAgB9B,CAAA"}
@@ -16,10 +16,16 @@ const isTagged = (item) => typeof item === "object" &&
16
16
  item !== null &&
17
17
  Object.keys(item).length === 1 &&
18
18
  typeof item[BIGINT] === "string";
19
- /** Calls `onLine` for each complete line `data` finishes, keeping the rest for next time. */
20
- export const lineReader = (onLine) => {
19
+ /**
20
+ * Calls `onLine` for each complete line `data` finishes, keeping the rest for next time. With
21
+ * `maxLength`, a line that grows past it calls `onTooLong` instead and nothing more is read.
22
+ */
23
+ export const lineReader = (onLine, { maxLength = Number.POSITIVE_INFINITY, onTooLong = () => { } } = {}) => {
21
24
  let buffered = "";
25
+ let stopped = false;
22
26
  return (data) => {
27
+ if (stopped)
28
+ return;
23
29
  buffered += String(data);
24
30
  let end = buffered.indexOf("\n");
25
31
  while (end >= 0) {
@@ -29,6 +35,11 @@ export const lineReader = (onLine) => {
29
35
  onLine(line);
30
36
  end = buffered.indexOf("\n");
31
37
  }
38
+ if (buffered.length > maxLength) {
39
+ stopped = true;
40
+ buffered = "";
41
+ onTooLong();
42
+ }
32
43
  };
33
44
  };
34
45
  //# sourceMappingURL=lines.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lines.js","sourceRoot":"","sources":["../../src/server/lines.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAEzE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAc,EAAU,EAAE,CAC/C,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAA;AAEzG,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAA2B,EAAE,CAChE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;IACvE,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CAC9F,CAA4B,CAAA;AAE/B,MAAM,MAAM,GAAG,SAAS,CAAA;AAExB,MAAM,QAAQ,GAAG,CAAC,IAAa,EAAgC,EAAE,CAC/D,OAAO,IAAI,KAAK,QAAQ;IACxB,IAAI,KAAK,IAAI;IACb,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;IAC9B,OAAQ,IAAgC,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAA;AAE/D,6FAA6F;AAC7F,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAA8B,EAAE,EAAE;IAC3D,IAAI,QAAQ,GAAG,EAAE,CAAA;IACjB,OAAO,CAAC,IAAqB,EAAE,EAAE;QAC/B,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,CAAA;QACxB,IAAI,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAChC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YACnC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;YAClC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;gBAAE,MAAM,CAAC,IAAI,CAAC,CAAA;YACpC,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"lines.js","sourceRoot":"","sources":["../../src/server/lines.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAEzE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAc,EAAU,EAAE,CAC/C,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAA;AAEzG,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAA2B,EAAE,CAChE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;IACvE,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CAC9F,CAA4B,CAAA;AAE/B,MAAM,MAAM,GAAG,SAAS,CAAA;AAExB,MAAM,QAAQ,GAAG,CAAC,IAAa,EAAgC,EAAE,CAC/D,OAAO,IAAI,KAAK,QAAQ;IACxB,IAAI,KAAK,IAAI;IACb,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;IAC9B,OAAQ,IAAgC,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAA;AAE/D;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,MAA8B,EAC9B,EAAE,SAAS,GAAG,MAAM,CAAC,iBAAiB,EAAE,SAAS,GAAG,GAAG,EAAE,GAAE,CAAC,EAAE,GAAmD,EAAE,EACnH,EAAE;IACF,IAAI,QAAQ,GAAG,EAAE,CAAA;IACjB,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,OAAO,CAAC,IAAqB,EAAE,EAAE;QAC/B,IAAI,OAAO;YAAE,OAAM;QACnB,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,CAAA;QACxB,IAAI,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAChC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YACnC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;YAClC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;gBAAE,MAAM,CAAC,IAAI,CAAC,CAAA;YACpC,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC9B,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAChC,OAAO,GAAG,IAAI,CAAA;YACd,QAAQ,GAAG,EAAE,CAAA;YACb,SAAS,EAAE,CAAA;QACb,CAAC;IACH,CAAC,CAAA;AACH,CAAC,CAAA"}