@leemour/max-cli 0.1.0 → 0.3.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 (109) hide show
  1. package/README.md +28 -12
  2. package/dist/cache/index.d.ts.map +1 -1
  3. package/dist/cache/index.js +3 -0
  4. package/dist/cache/index.js.map +1 -1
  5. package/dist/cache/schema.d.ts +13 -1
  6. package/dist/cache/schema.d.ts.map +1 -1
  7. package/dist/cache/schema.js +159 -8
  8. package/dist/cache/schema.js.map +1 -1
  9. package/dist/cache/store.d.ts +115 -4
  10. package/dist/cache/store.d.ts.map +1 -1
  11. package/dist/cache/store.js +248 -27
  12. package/dist/cache/store.js.map +1 -1
  13. package/dist/client.d.ts +91 -9
  14. package/dist/client.d.ts.map +1 -1
  15. package/dist/client.js +371 -33
  16. package/dist/client.js.map +1 -1
  17. package/dist/commands/chats.d.ts.map +1 -1
  18. package/dist/commands/chats.js +25 -8
  19. package/dist/commands/chats.js.map +1 -1
  20. package/dist/commands/contacts.d.ts.map +1 -1
  21. package/dist/commands/contacts.js +51 -5
  22. package/dist/commands/contacts.js.map +1 -1
  23. package/dist/commands/context.d.ts +4 -1
  24. package/dist/commands/context.d.ts.map +1 -1
  25. package/dist/commands/context.js +4 -2
  26. package/dist/commands/context.js.map +1 -1
  27. package/dist/commands/login.d.ts +15 -0
  28. package/dist/commands/login.d.ts.map +1 -0
  29. package/dist/commands/login.js +43 -0
  30. package/dist/commands/login.js.map +1 -0
  31. package/dist/commands/logout.d.ts +10 -0
  32. package/dist/commands/logout.d.ts.map +1 -0
  33. package/dist/commands/logout.js +22 -0
  34. package/dist/commands/logout.js.map +1 -0
  35. package/dist/commands/me.d.ts +3 -0
  36. package/dist/commands/me.d.ts.map +1 -0
  37. package/dist/commands/me.js +18 -0
  38. package/dist/commands/me.js.map +1 -0
  39. package/dist/commands/messages.d.ts.map +1 -1
  40. package/dist/commands/messages.js +82 -3
  41. package/dist/commands/messages.js.map +1 -1
  42. package/dist/commands/paging.d.ts +41 -0
  43. package/dist/commands/paging.d.ts.map +1 -0
  44. package/dist/commands/paging.js +54 -0
  45. package/dist/commands/paging.js.map +1 -0
  46. package/dist/commands/send.d.ts +10 -0
  47. package/dist/commands/send.d.ts.map +1 -0
  48. package/dist/commands/send.js +30 -0
  49. package/dist/commands/send.js.map +1 -0
  50. package/dist/commands/session.d.ts.map +1 -1
  51. package/dist/commands/session.js +3 -3
  52. package/dist/commands/session.js.map +1 -1
  53. package/dist/config.d.ts +16 -2
  54. package/dist/config.d.ts.map +1 -1
  55. package/dist/config.js +15 -1
  56. package/dist/config.js.map +1 -1
  57. package/dist/domain/map.d.ts +1 -0
  58. package/dist/domain/map.d.ts.map +1 -1
  59. package/dist/domain/map.js +44 -3
  60. package/dist/domain/map.js.map +1 -1
  61. package/dist/domain/models.d.ts +54 -0
  62. package/dist/domain/models.d.ts.map +1 -1
  63. package/dist/generated/operations.generated.d.ts +1 -0
  64. package/dist/generated/operations.generated.d.ts.map +1 -1
  65. package/dist/output.d.ts +7 -4
  66. package/dist/output.d.ts.map +1 -1
  67. package/dist/output.js +8 -11
  68. package/dist/output.js.map +1 -1
  69. package/dist/program.d.ts.map +1 -1
  70. package/dist/program.js +4 -2
  71. package/dist/program.js.map +1 -1
  72. package/dist/protocol/connection.d.ts +10 -0
  73. package/dist/protocol/connection.d.ts.map +1 -1
  74. package/dist/protocol/connection.js +11 -3
  75. package/dist/protocol/connection.js.map +1 -1
  76. package/dist/protocol/session.d.ts +54 -0
  77. package/dist/protocol/session.d.ts.map +1 -0
  78. package/dist/protocol/session.js +57 -0
  79. package/dist/protocol/session.js.map +1 -0
  80. package/dist/rendering/messages.d.ts +19 -0
  81. package/dist/rendering/messages.d.ts.map +1 -0
  82. package/dist/rendering/messages.js +137 -0
  83. package/dist/rendering/messages.js.map +1 -0
  84. package/dist/runs/events.d.ts +1 -1
  85. package/dist/runs/recording.d.ts +2 -2
  86. package/dist/runs/recording.d.ts.map +1 -1
  87. package/dist/runs/recording.js +3 -3
  88. package/dist/runs/recording.js.map +1 -1
  89. package/dist/session/adopt.d.ts +22 -0
  90. package/dist/session/adopt.d.ts.map +1 -0
  91. package/dist/session/adopt.js +29 -0
  92. package/dist/session/adopt.js.map +1 -0
  93. package/dist/session/handshake.d.ts +14 -1
  94. package/dist/session/handshake.d.ts.map +1 -1
  95. package/dist/session/handshake.js +5 -5
  96. package/dist/session/handshake.js.map +1 -1
  97. package/dist/spec/operations/auth.d.ts +42 -0
  98. package/dist/spec/operations/auth.d.ts.map +1 -0
  99. package/dist/spec/operations/session.d.ts +16 -0
  100. package/dist/spec/operations/session.d.ts.map +1 -1
  101. package/dist/spec/operations/session.js +21 -1
  102. package/dist/spec/operations/session.js.map +1 -1
  103. package/dist/testing/sandbox.d.ts +2 -0
  104. package/dist/testing/sandbox.d.ts.map +1 -0
  105. package/dist/testing/sandbox.js +24 -0
  106. package/dist/testing/sandbox.js.map +1 -0
  107. package/dist/version.d.ts +1 -1
  108. package/dist/version.js +1 -1
  109. package/package.json +9 -5
@@ -1,6 +1,43 @@
1
1
  import { migrate } from "./schema.js";
2
2
  export const openStore = ({ database, now = () => Date.now() }) => {
3
3
  migrate(database);
4
+ /**
5
+ * **What the person typed is data, not a query.** FTS5 reads its argument as an expression, so
6
+ * `O'Brien` is a syntax error, `a-b` is a column that does not exist and a bare `"` never
7
+ * terminates — a chat whose name has an apostrophe would take the command down with it.
8
+ *
9
+ * Wrapping in double quotes makes the whole thing one literal phrase, and doubling any quote
10
+ * inside keeps it that way. This is the only place a MATCH argument is built; nowhere else
11
+ * concatenates one.
12
+ */
13
+ const phrase = (query) => `"${query.replace(/"/g, '""')}"`;
14
+ /**
15
+ * The `WHERE` for a chat listing, built once and handed to both the page and its count.
16
+ *
17
+ * ⚠ They have to come from the same function. A page that filters and a count that does not is
18
+ * a `hasMore` that lies, and it lies quietly — the reader simply never sees the last page.
19
+ */
20
+ const chatWhere = ({ query, kind }) => {
21
+ const clauses = [];
22
+ const values = [];
23
+ if (query !== undefined) {
24
+ clauses.push("c.rowid IN (SELECT rowid FROM chats_fts WHERE chats_fts MATCH ?)");
25
+ values.push(phrase(query));
26
+ }
27
+ if (kind !== undefined) {
28
+ clauses.push("c.kind = ?");
29
+ values.push(kind);
30
+ }
31
+ return { sql: clauses.length === 0 ? "" : ` WHERE ${clauses.join(" AND ")}`, values };
32
+ };
33
+ const peopleWhere = ({ query }) => {
34
+ if (query === undefined)
35
+ return { sql: "", values: [] };
36
+ return {
37
+ sql: " AND p.rowid IN (SELECT rowid FROM people_fts WHERE people_fts MATCH ?)",
38
+ values: [phrase(query)],
39
+ };
40
+ };
4
41
  const markFetched = database.prepare("INSERT INTO fetched (kind, at) VALUES (?, ?) ON CONFLICT(kind) DO UPDATE SET at = excluded.at");
5
42
  const fetchedAt = database.prepare("SELECT at FROM fetched WHERE kind = ?");
6
43
  const isFresh = (kind, freshForMs) => {
@@ -14,11 +51,86 @@ export const openStore = ({ database, now = () => Date.now() }) => {
14
51
  title = excluded.title, kind = excluded.kind, unread_count = excluded.unread_count,
15
52
  last_message_at = excluded.last_message_at, participants_count = excluded.participants_count,
16
53
  fetched_at = excluded.fetched_at, generation = chats.generation + 1`);
17
- const putContact = database.prepare(`
18
- INSERT INTO contacts (id, name, username, description, fetched_at) VALUES (?, ?, ?, ?, ?)
54
+ /**
55
+ * **`COALESCE`, not assignment, for the three names.** The same person arrives from several
56
+ * places — the login, `CONTACT_INFO`, a group's participant list — and not all of them carry a
57
+ * description or a username. Overwriting with what the latest one happened to omit would blank
58
+ * a name we already had, which is the one thing this table exists to prevent.
59
+ */
60
+ const putPerson = database.prepare(`
61
+ INSERT INTO people (id, name, username, description, last_messaged_at, source, fetched_at)
62
+ VALUES (?, ?, ?, ?, NULL, ?, ?)
19
63
  ON CONFLICT(id) DO UPDATE SET
20
- name = excluded.name, username = excluded.username,
21
- description = excluded.description, fetched_at = excluded.fetched_at`);
64
+ name = coalesce(excluded.name, people.name),
65
+ username = coalesce(excluded.username, people.username),
66
+ description = coalesce(excluded.description, people.description),
67
+ source = excluded.source, fetched_at = excluded.fetched_at`);
68
+ const toContact = (row) => ({
69
+ id: String(row.id),
70
+ name: row.name === null ? null : String(row.name),
71
+ username: row.username === null ? null : String(row.username),
72
+ description: row.description === null ? null : String(row.description),
73
+ lastMessagedAt: row.last_messaged_at === null ? null : new Date(Number(row.last_messaged_at)).toISOString(),
74
+ });
75
+ /**
76
+ * `NULLS LAST` spelled out as a sort key rather than as syntax: it arrived in SQLite 3.30 and
77
+ * this runs on whatever `node:sqlite` and `bun:sqlite` were built against.
78
+ */
79
+ const ORDER = {
80
+ recent: "p.last_messaged_at IS NULL, p.last_messaged_at DESC, p.name IS NULL, p.name",
81
+ name: "p.name IS NULL, p.name",
82
+ };
83
+ /** People a *dialog* exists with. The join is the definition of "contact" (`NEED-105`). */
84
+ const CONTACTS_FROM = `
85
+ FROM people p
86
+ JOIN chat_members m ON m.person_id = p.id
87
+ JOIN chats c ON c.id = m.chat_id AND c.kind = 'dialog'`;
88
+ /**
89
+ * The default order, derived from the dialogs rather than accumulated as they arrive.
90
+ *
91
+ * It has to be a recompute rather than "raise it as each chat lands": a person's row often does
92
+ * not exist yet when their chat does, because the login names six people and the other sixteen
93
+ * come back from a request sent afterwards. An `UPDATE` at that moment reaches nobody.
94
+ *
95
+ * Derived from what we hold, so it is correct however the writes interleave, and cheap — one
96
+ * indexed join over the people who are in a dialog, once per write rather than per listing.
97
+ */
98
+ const refreshRecency = () => {
99
+ database.exec(`
100
+ UPDATE people SET last_messaged_at = (
101
+ SELECT MAX(c.last_message_at) FROM chat_members m
102
+ JOIN chats c ON c.id = m.chat_id AND c.kind = 'dialog'
103
+ WHERE m.person_id = people.id
104
+ )
105
+ WHERE id IN (
106
+ SELECT m.person_id FROM chat_members m
107
+ JOIN chats c ON c.id = m.chat_id AND c.kind = 'dialog'
108
+ )`);
109
+ };
110
+ const upsertPeople = (people, source, at) => {
111
+ for (const person of people) {
112
+ if (!person.id)
113
+ continue;
114
+ putPerson.run(person.id, person.name, person.username, person.description, source, at);
115
+ }
116
+ };
117
+ /**
118
+ * SQLite has no nested transactions and this is the only writer that needs one, so a plain
119
+ * `BEGIN` is enough. The rollback is what item 4 of the plan turns on: a marker saved over rows
120
+ * that were never written makes the next login ask for changes since data we do not have, and
121
+ * nothing downstream ever notices.
122
+ */
123
+ const inTransaction = (body) => {
124
+ database.exec("BEGIN");
125
+ try {
126
+ body();
127
+ database.exec("COMMIT");
128
+ }
129
+ catch (error) {
130
+ database.exec("ROLLBACK");
131
+ throw error;
132
+ }
133
+ };
22
134
  /**
23
135
  * **Compares MAX's clock, never ours.** `update_time` is what MAX sets on an edit and is `NULL`
24
136
  * on a message nobody has changed (measured 2026-09-20).
@@ -33,11 +145,12 @@ export const openStore = ({ database, now = () => Date.now() }) => {
33
145
  * the point of it.
34
146
  */
35
147
  const putMessage = database.prepare(`
36
- INSERT INTO messages (chat_id, id, sender_id, sender_name, time, update_time, text, outgoing, attachments, fetched_at)
37
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
148
+ INSERT INTO messages (chat_id, id, sender_id, sender_name, time, update_time, text, outgoing, attachments, link, fetched_at)
149
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
38
150
  ON CONFLICT(chat_id, id) DO UPDATE SET
39
151
  sender_name = excluded.sender_name, update_time = excluded.update_time, text = excluded.text,
40
- outgoing = excluded.outgoing, attachments = excluded.attachments, fetched_at = excluded.fetched_at
152
+ outgoing = excluded.outgoing, attachments = excluded.attachments, link = excluded.link,
153
+ fetched_at = excluded.fetched_at
41
154
  WHERE coalesce(excluded.update_time, 0) >= coalesce(messages.update_time, 0)`);
42
155
  const toChat = (row) => ({
43
156
  id: String(row.id),
@@ -57,6 +170,11 @@ export const openStore = ({ database, now = () => Date.now() }) => {
57
170
  text: String(row.text),
58
171
  outgoing: row.outgoing === null ? null : row.outgoing === 1,
59
172
  attachments: JSON.parse(String(row.attachments)),
173
+ replyTo: null,
174
+ forwardedFrom: null,
175
+ ...(row.link === null || row.link === undefined
176
+ ? {}
177
+ : JSON.parse(String(row.link))),
60
178
  });
61
179
  const epoch = (iso) => (iso === null ? null : new Date(iso).getTime());
62
180
  return {
@@ -66,6 +184,18 @@ export const openStore = ({ database, now = () => Date.now() }) => {
66
184
  return undefined;
67
185
  return database.prepare("SELECT * FROM chats ORDER BY last_message_at DESC").all().map(toChat);
68
186
  },
187
+ page: ({ limit, offset, query, kind }) => {
188
+ const where = chatWhere({ query, kind });
189
+ return database
190
+ .prepare(`SELECT c.* FROM chats c${where.sql} ORDER BY c.last_message_at DESC LIMIT ? OFFSET ?`)
191
+ .all(...where.values, limit, offset)
192
+ .map(toChat);
193
+ },
194
+ count: ({ query, kind } = {}) => {
195
+ const where = chatWhere({ query, kind });
196
+ const row = database.prepare(`SELECT COUNT(*) AS n FROM chats c${where.sql}`).get(...where.values);
197
+ return Number(row?.n ?? 0);
198
+ },
69
199
  write: (chats) => {
70
200
  const at = now();
71
201
  for (const chat of chats) {
@@ -74,27 +204,73 @@ export const openStore = ({ database, now = () => Date.now() }) => {
74
204
  markFetched.run("chats", at);
75
205
  },
76
206
  },
77
- contacts: {
78
- read: (freshForMs) => {
79
- if (!isFresh("contacts", freshForMs))
80
- return undefined;
207
+ people: {
208
+ contacts: ({ order, limit, offset, query }) => {
209
+ const where = peopleWhere({ query });
81
210
  return database
82
- .prepare("SELECT * FROM contacts ORDER BY name")
83
- .all()
84
- .map((row) => ({
85
- id: String(row.id),
86
- name: row.name === null ? null : String(row.name),
87
- username: row.username === null ? null : String(row.username),
88
- description: row.description === null ? null : String(row.description),
89
- }));
211
+ .prepare(`SELECT DISTINCT p.* ${CONTACTS_FROM}${where.sql} ORDER BY ${ORDER[order]} LIMIT ? OFFSET ?`)
212
+ .all(...where.values, limit, offset)
213
+ .map(toContact);
90
214
  },
91
- write: (contacts) => {
92
- const at = now();
93
- for (const contact of contacts) {
94
- putContact.run(contact.id, contact.name, contact.username, contact.description, at);
95
- }
96
- markFetched.run("contacts", at);
215
+ countContacts: ({ query } = {}) => {
216
+ const where = peopleWhere({ query });
217
+ const row = database
218
+ .prepare(`SELECT COUNT(DISTINCT p.id) AS n ${CONTACTS_FROM}${where.sql}`)
219
+ .get(...where.values);
220
+ return Number(row?.n ?? 0);
97
221
  },
222
+ page: ({ order, limit, offset }) => database
223
+ .prepare(`SELECT p.* FROM people p ORDER BY ${ORDER[order]} LIMIT ? OFFSET ?`)
224
+ .all(limit, offset)
225
+ .map(toContact),
226
+ upsert: (people, source) => upsertPeople(people, source, now()),
227
+ refreshRecency,
228
+ count: () => Number(database.prepare("SELECT COUNT(*) AS n FROM people").get()?.n ?? 0),
229
+ chatsWith: (personId) => database
230
+ .prepare("SELECT chat_id FROM chat_members WHERE person_id = ?")
231
+ .all(personId)
232
+ .map((row) => String(row.chat_id)),
233
+ },
234
+ syncMarker: () => database.prepare("SELECT marker FROM sync_marker WHERE id = 1").get()
235
+ ?.marker,
236
+ mergeDelta: ({ chats, people, members, marker }) => {
237
+ const at = now();
238
+ const summary = { known: 0, added: 0, changed: 0 };
239
+ inTransaction(() => {
240
+ const known = database.prepare("SELECT 1 FROM people WHERE id = ?");
241
+ for (const person of people) {
242
+ if (!person.id)
243
+ continue;
244
+ if (known.get(person.id))
245
+ summary.changed += 1;
246
+ else
247
+ summary.added += 1;
248
+ }
249
+ for (const chat of chats) {
250
+ putChat.run(chat.id, chat.title, chat.kind, chat.unreadCount, epoch(chat.lastMessageAt), chat.participantsCount, at);
251
+ }
252
+ upsertPeople(people, "login", at);
253
+ // Replaced per chat, never globally: MAX restates a chat's whole membership whenever it
254
+ // sends that chat, so a member missing from it has left — while a *person* missing from a
255
+ // delta is merely unchanged, which after the first login is every person we know.
256
+ for (const [chatId, personIds] of members) {
257
+ database.prepare("DELETE FROM chat_members WHERE chat_id = ?").run(chatId);
258
+ for (const personId of personIds) {
259
+ database
260
+ .prepare("INSERT OR IGNORE INTO chat_members (chat_id, person_id) VALUES (?, ?)")
261
+ .run(chatId, personId);
262
+ }
263
+ }
264
+ refreshRecency();
265
+ database
266
+ .prepare("INSERT INTO sync_marker (id, marker) VALUES (1, ?) ON CONFLICT(id) DO UPDATE SET marker = excluded.marker")
267
+ .run(marker);
268
+ summary.known = Number(database.prepare("SELECT COUNT(*) AS n FROM people").get()?.n ?? 0);
269
+ });
270
+ return summary;
271
+ },
272
+ forgetSyncMarker: () => {
273
+ database.exec("DELETE FROM sync_marker");
98
274
  },
99
275
  messages: {
100
276
  read: (chatId, limit, freshForMs) => {
@@ -117,7 +293,9 @@ export const openStore = ({ database, now = () => Date.now() }) => {
117
293
  return;
118
294
  const at = now();
119
295
  for (const message of messages) {
120
- putMessage.run(chatId, message.id, message.senderId, message.senderName, epoch(message.timestamp) ?? 0, epoch(message.editedAt), message.text, message.outgoing === null ? null : Number(message.outgoing), JSON.stringify(message.attachments), at);
296
+ putMessage.run(chatId, message.id, message.senderId, message.senderName, epoch(message.timestamp) ?? 0, epoch(message.editedAt), message.text, message.outgoing === null ? null : Number(message.outgoing), JSON.stringify(message.attachments), message.replyTo || message.forwardedFrom
297
+ ? JSON.stringify({ replyTo: message.replyTo, forwardedFrom: message.forwardedFrom })
298
+ : null, at);
121
299
  }
122
300
  const times = messages.map((message) => epoch(message.timestamp) ?? 0);
123
301
  database
@@ -129,6 +307,40 @@ export const openStore = ({ database, now = () => Date.now() }) => {
129
307
  invalidate: (chatId) => {
130
308
  database.prepare("DELETE FROM fetched WHERE kind = ?").run(`messages:${chatId}`);
131
309
  },
310
+ search: ({ query, chatId, limit, offset }) => {
311
+ const values = [phrase(query)];
312
+ let sql = `SELECT m.*, c.title AS chat_title FROM messages_fts f
313
+ JOIN messages m ON m.rowid = f.rowid
314
+ LEFT JOIN chats c ON c.id = m.chat_id
315
+ WHERE messages_fts MATCH ?`;
316
+ if (chatId !== undefined) {
317
+ sql += " AND m.chat_id = ?";
318
+ values.push(chatId);
319
+ }
320
+ sql += " ORDER BY m.time DESC LIMIT ? OFFSET ?";
321
+ values.push(limit, offset);
322
+ return database
323
+ .prepare(sql)
324
+ .all(...values)
325
+ .map((row) => ({
326
+ ...toMessage(row),
327
+ chatTitle: row.chat_title === null || row.chat_title === undefined ? null : String(row.chat_title),
328
+ }));
329
+ },
330
+ countSearch: ({ query, chatId }) => {
331
+ const values = [phrase(query)];
332
+ let sql = `SELECT COUNT(*) AS n FROM messages_fts f JOIN messages m ON m.rowid = f.rowid
333
+ WHERE messages_fts MATCH ?`;
334
+ if (chatId !== undefined) {
335
+ sql += " AND m.chat_id = ?";
336
+ values.push(chatId);
337
+ }
338
+ return Number(database.prepare(sql).get(...values)?.n ?? 0);
339
+ },
340
+ timeOf: (id) => {
341
+ const row = database.prepare("SELECT time FROM messages WHERE id = ? LIMIT 1").get(id);
342
+ return row?.time === undefined ? undefined : Number(row.time);
343
+ },
132
344
  },
133
345
  claim: (chatId, anchor, holder, forMs) => {
134
346
  const at = now();
@@ -143,7 +355,16 @@ export const openStore = ({ database, now = () => Date.now() }) => {
143
355
  database.prepare("DELETE FROM fetch_lease WHERE chat_id = ? AND anchor = ?").run(chatId, anchor);
144
356
  },
145
357
  clear: () => {
146
- for (const table of ["messages", "chats", "contacts", "ranges", "fetched", "fetch_lease"]) {
358
+ for (const table of [
359
+ "messages",
360
+ "chats",
361
+ "people",
362
+ "chat_members",
363
+ "sync_marker",
364
+ "ranges",
365
+ "fetched",
366
+ "fetch_lease",
367
+ ]) {
147
368
  database.exec(`DELETE FROM ${table}`);
148
369
  }
149
370
  },
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AA8IrC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,EAAgB,EAAc,EAAE;IAC1F,OAAO,CAAC,QAAQ,CAAC,CAAA;IAEjB;;;;;;;;OAQG;IACH,MAAM,MAAM,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAA;IAE1E;;;;;OAKG;IACH,MAAM,SAAS,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAuC,EAAE,EAAE;QACzE,MAAM,OAAO,GAAa,EAAE,CAAA;QAC5B,MAAM,MAAM,GAAwB,EAAE,CAAA;QAEtC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAA;YAChF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QAC5B,CAAC;QACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YAC1B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnB,CAAC;QAED,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,CAAA;IACvF,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,CAAC,EAAE,KAAK,EAAsB,EAAE,EAAE;QACpD,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAyB,EAAE,CAAA;QAC9E,OAAO;YACL,GAAG,EAAE,yEAAyE;YAC9E,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAwB;SAC/C,CAAA;IACH,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAClC,+FAA+F,CAChG,CAAA;IACD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAA;IAE3E,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,UAAkB,EAAW,EAAE;QAC5D,MAAM,EAAE,GAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAiC,EAAE,EAAE,CAAA;QACnE,OAAO,EAAE,KAAK,SAAS,IAAI,GAAG,EAAE,GAAG,EAAE,IAAI,UAAU,CAAA;IACrD,CAAC,CAAA;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;;;;;;0EAMuC,CAAC,CAAA;IAEzE;;;;;OAKG;IACH,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC;;;;;;;iEAO4B,CAAC,CAAA;IAEhE,MAAM,SAAS,GAAG,CAAC,GAA4B,EAAW,EAAE,CAAC,CAAC;QAC5D,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QACjD,QAAQ,EAAE,GAAG,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC7D,WAAW,EAAE,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;QACtE,cAAc,EAAE,GAAG,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,EAAE;KAC5G,CAAC,CAAA;IAEF;;;OAGG;IACH,MAAM,KAAK,GAAgC;QACzC,MAAM,EAAE,6EAA6E;QACrF,IAAI,EAAE,wBAAwB;KAC/B,CAAA;IAED,2FAA2F;IAC3F,MAAM,aAAa,GAAG;;;oEAG4C,CAAA;IAElE;;;;;;;;;OASG;IACH,MAAM,cAAc,GAAG,GAAS,EAAE;QAChC,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;QASV,CAAC,CAAA;IACP,CAAC,CAAA;IAED,MAAM,YAAY,GAAG,CAAC,MAAiB,EAAE,MAAoB,EAAE,EAAU,EAAQ,EAAE;QACjF,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,EAAE;gBAAE,SAAQ;YACxB,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;QACxF,CAAC;IACH,CAAC,CAAA;IAED;;;;;OAKG;IACH,MAAM,aAAa,GAAG,CAAC,IAAgB,EAAQ,EAAE;QAC/C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACtB,IAAI,CAAC;YACH,IAAI,EAAE,CAAA;YACN,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACzB,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC,CAAA;IAED;;;;;;;;;;;;OAYG;IACH,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC;;;;;;;iFAO2C,CAAC,CAAA;IAEhF,MAAM,MAAM,GAAG,CAAC,GAA4B,EAAQ,EAAE,CAAC,CAAC;QACtD,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,KAAK,EAAE,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QACpD,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAiB;QACtC,WAAW,EAAE,GAAG,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;QACxE,aAAa,EAAE,GAAG,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,EAAE;QACxG,iBAAiB,EAAE,GAAG,CAAC,kBAAkB,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC;KAC3F,CAAC,CAAA;IAEF,MAAM,SAAS,GAAG,CAAC,GAA4B,EAAW,EAAE,CAAC,CAAC;QAC5D,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC3B,QAAQ,EAAE,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;QAC/D,UAAU,EAAE,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;QACrE,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;QACnD,QAAQ,EAAE,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE;QAC3F,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC;QAC3D,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAA2B;QAC1E,OAAO,EAAE,IAAI;QACb,aAAa,EAAE,IAAI;QACnB,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;YAC7C,CAAC,CAAC,EAAE;YACJ,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAgD,CAAC;KAClF,CAAC,CAAA;IAEF,MAAM,KAAK,GAAG,CAAC,GAAkB,EAAiB,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;IAEpG,OAAO;QACL,KAAK,EAAE;YACL,IAAI,EAAE,CAAC,UAAU,EAAE,EAAE;gBACnB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC;oBAAE,OAAO,SAAS,CAAA;gBACnD,OAAO,QAAQ,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YAChG,CAAC;YACD,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;gBACvC,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;gBACxC,OAAO,QAAQ;qBACZ,OAAO,CAAC,0BAA0B,KAAK,CAAC,GAAG,mDAAmD,CAAC;qBAC/F,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;qBACnC,GAAG,CAAC,MAAM,CAAC,CAAA;YAChB,CAAC;YAED,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE;gBAC9B,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;gBACxC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,oCAAoC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAA;gBAClG,OAAO,MAAM,CAAE,GAAsB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;YAChD,CAAC;YAED,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;gBACf,MAAM,EAAE,GAAG,GAAG,EAAE,CAAA;gBAChB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,WAAW,EAChB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EACzB,IAAI,CAAC,iBAAiB,EACtB,EAAE,CACH,CAAA;gBACH,CAAC;gBACD,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;YAC9B,CAAC;SACF;QAED,MAAM,EAAE;YACN,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC5C,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;gBACpC,OAAO,QAAQ;qBACZ,OAAO,CAAC,uBAAuB,aAAa,GAAG,KAAK,CAAC,GAAG,aAAa,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC;qBACrG,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;qBACnC,GAAG,CAAC,SAAS,CAAC,CAAA;YACnB,CAAC;YAED,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;gBAChC,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;gBACpC,MAAM,GAAG,GAAG,QAAQ;qBACjB,OAAO,CAAC,oCAAoC,aAAa,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;qBACxE,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAA;gBACvB,OAAO,MAAM,CAAE,GAAsB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;YAChD,CAAC;YAED,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CACjC,QAAQ;iBACL,OAAO,CAAC,qCAAqC,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC;iBAC7E,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;iBAClB,GAAG,CAAC,SAAS,CAAC;YAEnB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;YAE/D,cAAc;YAEd,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAE,QAAQ,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,EAAqB,EAAE,CAAC,IAAI,CAAC,CAAC;YAE3G,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE,CACtB,QAAQ;iBACL,OAAO,CAAC,sDAAsD,CAAC;iBAC/D,GAAG,CAAC,QAAQ,CAAC;iBACb,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SACvC;QAED,UAAU,EAAE,GAAG,EAAE,CACd,QAAQ,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,EAAsC;YACxG,EAAE,MAAM;QAEZ,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;YACjD,MAAM,EAAE,GAAG,GAAG,EAAE,CAAA;YAChB,MAAM,OAAO,GAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAA;YAE/D,aAAa,CAAC,GAAG,EAAE;gBACjB,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAA;gBACnE,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;oBAC5B,IAAI,CAAC,MAAM,CAAC,EAAE;wBAAE,SAAQ;oBACxB,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;wBAAE,OAAO,CAAC,OAAO,IAAI,CAAC,CAAA;;wBACzC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAA;gBACzB,CAAC;gBAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,WAAW,EAChB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EACzB,IAAI,CAAC,iBAAiB,EACtB,EAAE,CACH,CAAA;gBACH,CAAC;gBAED,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;gBAEjC,wFAAwF;gBACxF,0FAA0F;gBAC1F,kFAAkF;gBAClF,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,OAAO,EAAE,CAAC;oBAC1C,QAAQ,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;oBAC1E,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;wBACjC,QAAQ;6BACL,OAAO,CAAC,uEAAuE,CAAC;6BAChF,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;oBAC1B,CAAC;gBACH,CAAC;gBAED,cAAc,EAAE,CAAA;gBAEhB,QAAQ;qBACL,OAAO,CACN,2GAA2G,CAC5G;qBACA,GAAG,CAAC,MAAM,CAAC,CAAA;gBAEd,OAAO,CAAC,KAAK,GAAG,MAAM,CAAE,QAAQ,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,EAAqB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;YAChH,CAAC,CAAC,CAAA;YAEF,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,gBAAgB,EAAE,GAAG,EAAE;YACrB,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;QAC1C,CAAC;QAED,QAAQ,EAAE;YACR,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;gBAClC,IAAI,CAAC,OAAO,CAAC,YAAY,MAAM,EAAE,EAAE,UAAU,CAAC;oBAAE,OAAO,SAAS,CAAA;gBAChE,MAAM,IAAI,GAAG,QAAQ;qBAClB,OAAO,CAAC,qEAAqE,CAAC;qBAC9E,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;gBAErB,0FAA0F;gBAC1F,2EAA2E;gBAC3E,MAAM,KAAK,GAAG,QAAQ;qBACnB,OAAO,CAAC,4EAA4E,CAAC;qBACrF,GAAG,CAAC,MAAM,CAAC,CAAA;gBACd,IAAI,CAAC,KAAK;oBAAE,OAAO,SAAS,CAAA;gBAE5B,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAA;YACtC,CAAC;YACD,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;gBAC1B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAM;gBACjC,MAAM,EAAE,GAAG,GAAG,EAAE,CAAA;gBAChB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,UAAU,CAAC,GAAG,CACZ,MAAM,EACN,OAAO,CAAC,EAAE,EACV,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,UAAU,EAClB,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,EAC7B,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EACvB,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAC3D,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,EACnC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,aAAa;wBACtC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;wBACpF,CAAC,CAAC,IAAI,EACR,EAAE,CACH,CAAA;gBACH,CAAC;gBAED,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;gBACtE,QAAQ;qBACL,OAAO,CACN;2GAC+F,CAChG;qBACA,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAA;gBACtD,WAAW,CAAC,GAAG,CAAC,YAAY,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;YAC3C,CAAC;YACD,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE;gBACrB,QAAQ,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,CAAC,YAAY,MAAM,EAAE,CAAC,CAAA;YAClF,CAAC;YACD,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;gBAC3C,MAAM,MAAM,GAAwB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;gBACnD,IAAI,GAAG,GAAG;;;+CAG6B,CAAA;gBACvC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,GAAG,IAAI,oBAAoB,CAAA;oBAC3B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBACrB,CAAC;gBACD,GAAG,IAAI,wCAAwC,CAAA;gBAC/C,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;gBAE1B,OAAO,QAAQ;qBACZ,OAAO,CAAC,GAAG,CAAC;qBACZ,GAAG,CAAC,GAAG,MAAM,CAAC;qBACd,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBACb,GAAG,SAAS,CAAC,GAAG,CAAC;oBACjB,SAAS,EAAE,GAAG,CAAC,UAAU,KAAK,IAAI,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;iBACnG,CAAC,CAAC,CAAA;YACP,CAAC;YAED,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;gBACjC,MAAM,MAAM,GAAwB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;gBACnD,IAAI,GAAG,GAAG;+CAC6B,CAAA;gBACvC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,GAAG,IAAI,oBAAoB,CAAA;oBAC3B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBACrB,CAAC;gBACD,OAAO,MAAM,CAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAoB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;YACjF,CAAC;YAED,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE;gBACb,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,CAAC,EAAE,CAExE,CAAA;gBACb,OAAO,GAAG,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC/D,CAAC;SACF;QAED,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;YACvC,MAAM,EAAE,GAAG,GAAG,EAAE,CAAA;YAChB,OAAO,CACL,QAAQ;iBACL,OAAO,CACN;;;iDAGqC,CACtC;iBACA,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,CAAC,CAC7D,CAAA;QACH,CAAC;QAED,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;YAC1B,QAAQ,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAClG,CAAC;QAED,KAAK,EAAE,GAAG,EAAE;YACV,KAAK,MAAM,KAAK,IAAI;gBAClB,UAAU;gBACV,OAAO;gBACP,QAAQ;gBACR,cAAc;gBACd,aAAa;gBACb,QAAQ;gBACR,SAAS;gBACT,aAAa;aACd,EAAE,CAAC;gBACF,QAAQ,CAAC,IAAI,CAAC,eAAe,KAAK,EAAE,CAAC,CAAA;YACvC,CAAC;QACH,CAAC;QAED,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE;KAC9B,CAAA;AACH,CAAC,CAAA"}
package/dist/client.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import type { CacheStore } from "./cache/store.js";
2
- import type { Chat, Contact, Id, Message, Profile } from "./domain/models.js";
1
+ import type { CacheStore, PersonOrder, SyncSummary } from "./cache/store.js";
2
+ import type { Chat, ChatKind, Contact, Id, Message, MessageHit, Page, Profile } from "./domain/models.js";
3
3
  import { Connection } from "./protocol/connection.js";
4
4
  import { type DiagnosticEvent } from "./runs/events.js";
5
5
  import type { SessionStore } from "./session/store.js";
@@ -57,7 +57,7 @@ export declare class MaxClient {
57
57
  * time, and the name is filled in. Without this, `max chats` shows a column of blanks for
58
58
  * exactly the chats a person recognises by name.
59
59
  */
60
- list: (limit?: number) => Promise<Chat[]>;
60
+ list: (options?: PageRequest) => Promise<Page<Chat>>;
61
61
  /**
62
62
  * Turns what the person typed into a chat id.
63
63
  *
@@ -68,11 +68,79 @@ export declare class MaxClient {
68
68
  resolve: (reference: string) => Promise<Id>;
69
69
  };
70
70
  readonly contacts: {
71
- /** The people this account has a one-to-one chat with, named. */
72
- list: () => Promise<Contact[]>;
71
+ /**
72
+ * The people this account has a one-to-one chat with, named, newest conversation first.
73
+ *
74
+ * **It answers from the store**, which the login has just brought up to date (`#mergeLogin`),
75
+ * so the order and the paging happen in SQL over every person we know rather than over the
76
+ * handful this particular login mentioned. A delta carries almost nothing after the first run;
77
+ * rendering the response instead of the store would show an empty list on the second command.
78
+ *
79
+ * ⚠ **A group member is not in this answer** and nothing marks them as excluded: the query
80
+ * asks for people a *dialog* exists with, and they are outside it (`NEED-105`). They are in
81
+ * the store, with the chats they share with us, for the commands that will want them.
82
+ */
83
+ list: (options?: PageRequest) => Promise<Page<Contact>>;
84
+ /**
85
+ * **Start again from zero**: forget the marker, so this login asks for the whole collection
86
+ * rather than for what changed, and name everybody it mentions.
87
+ *
88
+ * It is a repair tool, not the way contacts arrive. The delta rides on the login every command
89
+ * already performs, so there is nothing to schedule and no budget to spend — what this is for
90
+ * is a store that has drifted, or a full re-take after a schema rebuild threw the rows away.
91
+ * It is also the only thing that could ever prune somebody MAX has stopped returning, which is
92
+ * the second reason it exists.
93
+ */
94
+ sync: () => Promise<SyncSummary & {
95
+ full: true;
96
+ }>;
73
97
  };
74
98
  readonly messages: {
75
- list: (chatId: Id, limit?: number) => Promise<Message[]>;
99
+ /**
100
+ * **Searches what this machine has read, and never asks MAX.**
101
+ *
102
+ * MAX has no search operation in our registry — nine opcodes, none of them a query — so there
103
+ * is nothing to ask. That makes this the one read that is local by nature rather than by
104
+ * choice, and it is the opposite of the rule every other read follows (`df6792a`: the record
105
+ * does not answer a read).
106
+ *
107
+ * ⚠ **So it finds what has been read, not what exists.** A chat nobody has opened contributes
108
+ * nothing, and there is no way for the answer to know that. The command says so on stderr
109
+ * rather than leaving the reader to infer it from a short list, and `max messages list <chat>`
110
+ * is what fills the gap.
111
+ *
112
+ * It opens no connection at all, which also means it costs no login (`RISK-2`).
113
+ */
114
+ search: (query: string, options?: {
115
+ chatId?: Id;
116
+ limit?: number;
117
+ offset?: number;
118
+ }) => Promise<Page<MessageHit>>;
119
+ /**
120
+ * **Paged backwards through time, not by page number.** MAX's history is already anchored —
121
+ * it takes a moment and answers with what came before it — so `--before` is exact where a page
122
+ * number over a live conversation would repeat and skip rows.
123
+ *
124
+ * `hasMore` here is a claim about the copy we hold, never about the chat: a full page back is
125
+ * the only evidence there is that another page exists.
126
+ */
127
+ list: (chatId: Id, options?: {
128
+ limit?: number;
129
+ before?: number;
130
+ }) => Promise<Page<Message>>;
131
+ /**
132
+ * Turns what `--before` was given into a moment.
133
+ *
134
+ * **ISO 8601 is a time; a bare integer is a message id.** Both a millisecond timestamp and a
135
+ * message id are runs of digits — 13 and 18 of them on this account — and deciding between
136
+ * them by length is a trap that fires the first time either changes size. So the rule is what
137
+ * the string looks like, not how big it is.
138
+ *
139
+ * An id we have never stored is exactly what a deleted message looks like, because it is gone
140
+ * from the history MAX returns too. That is a refusal naming the way round it rather than a
141
+ * guess: read as milliseconds, an 18-digit id points six hundred million years from now.
142
+ */
143
+ before: (reference: string) => number;
76
144
  /**
77
145
  * Sends one message, retrying **only with the same `cid`**.
78
146
  *
@@ -84,7 +152,7 @@ export declare class MaxClient {
84
152
  * So one retry, same `cid`, and nothing beyond that. What is still unmeasured is how long the
85
153
  * server remembers a `cid`; the two probes were seconds apart. If the retry also fails the
86
154
  * answer is `outcome_unknown` — never failed, never sent — and it names the `cid`, because
87
- * `max send --cid <n>` can then repeat the attempt without risking a second message.
155
+ * `max messages send … --cid <n>` can then repeat the attempt without risking a second message.
88
156
  */
89
157
  send: (chatId: Id, text: string, options?: {
90
158
  cid?: number;
@@ -92,12 +160,26 @@ export declare class MaxClient {
92
160
  }) => Promise<Message>;
93
161
  };
94
162
  /**
95
- * Opens the connection and logs in with the stored token.
163
+ * Opens the connection and logs in with the stored token, or with one offered for trial.
96
164
  *
97
165
  * The login response carries the profile, the chats, the contacts and recent messages, so most
98
166
  * commands need no further request — measured against MAX on 2026-09-19.
167
+ *
168
+ * **A candidate token is tried and not stored**, which is what lets `adoptToken` write to the
169
+ * keyring only after MAX has accepted it. Nothing here writes a token; see `session/adopt.ts`.
99
170
  */
100
- connect(): Promise<void>;
171
+ connect({ token: candidate }?: {
172
+ token?: string;
173
+ }): Promise<void>;
101
174
  close(): Promise<void>;
102
175
  }
176
+ /** What every listing takes. Absent means "the caller did not say", never a number chosen here. */
177
+ export interface PageRequest {
178
+ order?: PersonOrder;
179
+ limit?: number;
180
+ offset?: number;
181
+ /** Part of a name. Refused below three characters — see `checkedQuery`. */
182
+ query?: string;
183
+ kind?: ChatKind;
184
+ }
103
185
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAG7E,OAAO,EAAE,UAAU,EAAiB,MAAM,0BAA0B,CAAA;AAEpE,OAAO,EAAY,KAAK,eAAe,EAAS,MAAM,kBAAkB,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGtD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,YAAY,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kEAAkE;IAClE,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB;;;OAGG;IACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,gFAAgF;IAChF,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAA;CAC1C;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,SAAS;;gBAaR,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,OAAe,EAAE,MAAM,EAAE,EAAE,gBAAgB;IASpG,QAAQ,CAAC,OAAO;kBACN,OAAO;MAChB;IAED,QAAQ,CAAC,KAAK;QACZ;;;;;;;WAOG;uBACkB,MAAM,KAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAuB7C;;;;;;WAMG;6BACwB,MAAM,KAAG,OAAO,CAAC,EAAE,CAAC;MAgBhD;IAED,QAAQ,CAAC,QAAQ;QACf,iEAAiE;oBACjD,OAAO,CAAC,OAAO,EAAE,CAAC;MASnC;IAED,QAAQ,CAAC,QAAQ;uBACM,EAAE,qBAAe,OAAO,CAAC,OAAO,EAAE,CAAC;QA0BxD;;;;;;;;;;;;WAYG;uBACkB,EAAE,QAAQ,MAAM,YAAW;YAAE,GAAG,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,OAAO,CAAA;SAAE,KAAQ,OAAO,CAAC,OAAO,CAAC;MAuC3G;IAED;;;;;OAKG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAyJ7B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}