@wirecat/cli-memo 0.0.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/LICENSE +204 -0
  2. package/README.md +315 -0
  3. package/dist/answers/command.d.ts +35 -0
  4. package/dist/answers/command.d.ts.map +1 -0
  5. package/dist/answers/command.js +117 -0
  6. package/dist/answers/command.js.map +1 -0
  7. package/dist/app.d.ts +9 -0
  8. package/dist/app.d.ts.map +1 -0
  9. package/dist/app.js +10 -0
  10. package/dist/app.js.map +1 -0
  11. package/dist/bin/memo.d.ts +3 -0
  12. package/dist/bin/memo.d.ts.map +1 -0
  13. package/dist/bin/memo.js +14 -0
  14. package/dist/bin/memo.js.map +1 -0
  15. package/dist/config.d.ts +39 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +40 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/context/command.d.ts +6 -0
  20. package/dist/context/command.d.ts.map +1 -0
  21. package/dist/context/command.js +73 -0
  22. package/dist/context/command.js.map +1 -0
  23. package/dist/context/context.d.ts +28 -0
  24. package/dist/context/context.d.ts.map +1 -0
  25. package/dist/context/context.js +49 -0
  26. package/dist/context/context.js.map +1 -0
  27. package/dist/knowledge/command.d.ts +4 -0
  28. package/dist/knowledge/command.d.ts.map +1 -0
  29. package/dist/knowledge/command.js +158 -0
  30. package/dist/knowledge/command.js.map +1 -0
  31. package/dist/mail/command.d.ts +4 -0
  32. package/dist/mail/command.d.ts.map +1 -0
  33. package/dist/mail/command.js +61 -0
  34. package/dist/mail/command.js.map +1 -0
  35. package/dist/mail/gmail.d.ts +18 -0
  36. package/dist/mail/gmail.d.ts.map +1 -0
  37. package/dist/mail/gmail.js +103 -0
  38. package/dist/mail/gmail.js.map +1 -0
  39. package/dist/mail/himalaya.d.ts +4 -0
  40. package/dist/mail/himalaya.d.ts.map +1 -0
  41. package/dist/mail/himalaya.js +13 -0
  42. package/dist/mail/himalaya.js.map +1 -0
  43. package/dist/mail/import.d.ts +53 -0
  44. package/dist/mail/import.d.ts.map +1 -0
  45. package/dist/mail/import.js +170 -0
  46. package/dist/mail/import.js.map +1 -0
  47. package/dist/mail/parse.d.ts +21 -0
  48. package/dist/mail/parse.d.ts.map +1 -0
  49. package/dist/mail/parse.js +86 -0
  50. package/dist/mail/parse.js.map +1 -0
  51. package/dist/notes/about.d.ts +31 -0
  52. package/dist/notes/about.d.ts.map +1 -0
  53. package/dist/notes/about.js +69 -0
  54. package/dist/notes/about.js.map +1 -0
  55. package/dist/notes/bound.d.ts +24 -0
  56. package/dist/notes/bound.d.ts.map +1 -0
  57. package/dist/notes/bound.js +57 -0
  58. package/dist/notes/bound.js.map +1 -0
  59. package/dist/notes/command.d.ts +4 -0
  60. package/dist/notes/command.d.ts.map +1 -0
  61. package/dist/notes/command.js +222 -0
  62. package/dist/notes/command.js.map +1 -0
  63. package/dist/notes/dialects/common.d.ts +18 -0
  64. package/dist/notes/dialects/common.d.ts.map +1 -0
  65. package/dist/notes/dialects/common.js +79 -0
  66. package/dist/notes/dialects/common.js.map +1 -0
  67. package/dist/notes/dialects/index.d.ts +5 -0
  68. package/dist/notes/dialects/index.d.ts.map +1 -0
  69. package/dist/notes/dialects/index.js +6 -0
  70. package/dist/notes/dialects/index.js.map +1 -0
  71. package/dist/notes/dialects/markdown.d.ts +7 -0
  72. package/dist/notes/dialects/markdown.d.ts.map +1 -0
  73. package/dist/notes/dialects/markdown.js +51 -0
  74. package/dist/notes/dialects/markdown.js.map +1 -0
  75. package/dist/notes/dialects/obsidian.d.ts +6 -0
  76. package/dist/notes/dialects/obsidian.d.ts.map +1 -0
  77. package/dist/notes/dialects/obsidian.js +33 -0
  78. package/dist/notes/dialects/obsidian.js.map +1 -0
  79. package/dist/notes/dialects/types.d.ts +39 -0
  80. package/dist/notes/dialects/types.d.ts.map +1 -0
  81. package/dist/notes/dialects/types.js +2 -0
  82. package/dist/notes/dialects/types.js.map +1 -0
  83. package/dist/notes/embed.d.ts +51 -0
  84. package/dist/notes/embed.d.ts.map +1 -0
  85. package/dist/notes/embed.js +109 -0
  86. package/dist/notes/embed.js.map +1 -0
  87. package/dist/notes/export.d.ts +27 -0
  88. package/dist/notes/export.d.ts.map +1 -0
  89. package/dist/notes/export.js +76 -0
  90. package/dist/notes/export.js.map +1 -0
  91. package/dist/notes/files.d.ts +14 -0
  92. package/dist/notes/files.d.ts.map +1 -0
  93. package/dist/notes/files.js +77 -0
  94. package/dist/notes/files.js.map +1 -0
  95. package/dist/notes/folders-command.d.ts +4 -0
  96. package/dist/notes/folders-command.d.ts.map +1 -0
  97. package/dist/notes/folders-command.js +113 -0
  98. package/dist/notes/folders-command.js.map +1 -0
  99. package/dist/notes/folders.d.ts +27 -0
  100. package/dist/notes/folders.d.ts.map +1 -0
  101. package/dist/notes/folders.js +46 -0
  102. package/dist/notes/folders.js.map +1 -0
  103. package/dist/notes/import.d.ts +33 -0
  104. package/dist/notes/import.d.ts.map +1 -0
  105. package/dist/notes/import.js +183 -0
  106. package/dist/notes/import.js.map +1 -0
  107. package/dist/notes/internal.d.ts +17 -0
  108. package/dist/notes/internal.d.ts.map +1 -0
  109. package/dist/notes/internal.js +47 -0
  110. package/dist/notes/internal.js.map +1 -0
  111. package/dist/notes/links.d.ts +18 -0
  112. package/dist/notes/links.d.ts.map +1 -0
  113. package/dist/notes/links.js +44 -0
  114. package/dist/notes/links.js.map +1 -0
  115. package/dist/notes/renames.d.ts +11 -0
  116. package/dist/notes/renames.d.ts.map +1 -0
  117. package/dist/notes/renames.js +24 -0
  118. package/dist/notes/renames.js.map +1 -0
  119. package/dist/notes/search.d.ts +5 -0
  120. package/dist/notes/search.d.ts.map +1 -0
  121. package/dist/notes/search.js +20 -0
  122. package/dist/notes/search.js.map +1 -0
  123. package/dist/notes/state.d.ts +14 -0
  124. package/dist/notes/state.d.ts.map +1 -0
  125. package/dist/notes/state.js +21 -0
  126. package/dist/notes/state.js.map +1 -0
  127. package/dist/options.d.ts +4 -0
  128. package/dist/options.d.ts.map +1 -0
  129. package/dist/options.js +12 -0
  130. package/dist/options.js.map +1 -0
  131. package/dist/people/command.d.ts +5 -0
  132. package/dist/people/command.d.ts.map +1 -0
  133. package/dist/people/command.js +57 -0
  134. package/dist/people/command.js.map +1 -0
  135. package/dist/people/identity.d.ts +4 -0
  136. package/dist/people/identity.d.ts.map +1 -0
  137. package/dist/people/identity.js +13 -0
  138. package/dist/people/identity.js.map +1 -0
  139. package/dist/people/notes-map.d.ts +13 -0
  140. package/dist/people/notes-map.d.ts.map +1 -0
  141. package/dist/people/notes-map.js +49 -0
  142. package/dist/people/notes-map.js.map +1 -0
  143. package/dist/people/subject.d.ts +8 -0
  144. package/dist/people/subject.d.ts.map +1 -0
  145. package/dist/people/subject.js +19 -0
  146. package/dist/people/subject.js.map +1 -0
  147. package/dist/program.d.ts +7 -0
  148. package/dist/program.d.ts.map +1 -0
  149. package/dist/program.js +34 -0
  150. package/dist/program.js.map +1 -0
  151. package/dist/run/auto.d.ts +20 -0
  152. package/dist/run/auto.d.ts.map +1 -0
  153. package/dist/run/auto.js +139 -0
  154. package/dist/run/auto.js.map +1 -0
  155. package/dist/run/import.d.ts +18 -0
  156. package/dist/run/import.d.ts.map +1 -0
  157. package/dist/run/import.js +114 -0
  158. package/dist/run/import.js.map +1 -0
  159. package/dist/search/command.d.ts +38 -0
  160. package/dist/search/command.d.ts.map +1 -0
  161. package/dist/search/command.js +269 -0
  162. package/dist/search/command.js.map +1 -0
  163. package/dist/store/gone.d.ts +17 -0
  164. package/dist/store/gone.d.ts.map +1 -0
  165. package/dist/store/gone.js +52 -0
  166. package/dist/store/gone.js.map +1 -0
  167. package/dist/store/scope.d.ts +19 -0
  168. package/dist/store/scope.d.ts.map +1 -0
  169. package/dist/store/scope.js +34 -0
  170. package/dist/store/scope.js.map +1 -0
  171. package/dist/store/source-target.d.ts +18 -0
  172. package/dist/store/source-target.d.ts.map +1 -0
  173. package/dist/store/source-target.js +28 -0
  174. package/dist/store/source-target.js.map +1 -0
  175. package/dist/tags/command.d.ts +4 -0
  176. package/dist/tags/command.d.ts.map +1 -0
  177. package/dist/tags/command.js +166 -0
  178. package/dist/tags/command.js.map +1 -0
  179. package/dist/tasks/command.d.ts +4 -0
  180. package/dist/tasks/command.d.ts.map +1 -0
  181. package/dist/tasks/command.js +83 -0
  182. package/dist/tasks/command.js.map +1 -0
  183. package/dist/tasks/context.d.ts +16 -0
  184. package/dist/tasks/context.d.ts.map +1 -0
  185. package/dist/tasks/context.js +68 -0
  186. package/dist/tasks/context.js.map +1 -0
  187. package/dist/version.d.ts +2 -0
  188. package/dist/version.d.ts.map +1 -0
  189. package/dist/version.js +2 -0
  190. package/dist/version.js.map +1 -0
  191. package/package.json +48 -3
@@ -0,0 +1,269 @@
1
+ import { CliError, createRenderer } from "@wirecat/cli-core";
2
+ import { parseLocator } from "@wirecat/cli-messaging";
3
+ import { parseLucene, searchAll, searchNotes, searchNotesQuery, searchStore, } from "@wirecat/cli-messaging/services";
4
+ import { openStore } from "@wirecat/cli-messaging/store";
5
+ import { InvalidArgumentError } from "commander";
6
+ import { APP } from "../app.js";
7
+ import { boundFolders } from "../notes/bound.js";
8
+ import { searchText } from "../notes/search.js";
9
+ import { positive } from "../options.js";
10
+ import { selectAccount } from "../store/scope.js";
11
+ import { taskPage } from "../tasks/context.js";
12
+ export const unifiedSearch = async (store, query, options) => {
13
+ const limit = options.limit ?? 20, offset = options.offset ?? 0;
14
+ if (!Number.isInteger(limit) || limit < 1 || limit > 100 || !Number.isInteger(offset) || offset < 0 || offset > 1000)
15
+ throw new CliError("validation_error", "limit takes 1–100; offset takes 0–1000");
16
+ if ((!options.keys.length && !options.notes) || options.keys.length > 50)
17
+ throw new CliError("validation_error", "select 1–50 accounts, or notes");
18
+ const answer = options.keys.length
19
+ ? await searchStore(store, options.keys[0], {
20
+ text: query,
21
+ language: "lucene",
22
+ accounts: options.keys,
23
+ limit: Math.min(2000, offset + limit + 1),
24
+ newest: true,
25
+ })
26
+ : { items: [], hasMore: false };
27
+ const items = answer.items.map((hit) => {
28
+ const key = parseLocator(hit.locator);
29
+ return {
30
+ kind: key.provider === "email" ? "email" : "message",
31
+ locator: hit.locator,
32
+ provider: key.provider,
33
+ account: key.account,
34
+ timestamp: hit.timestamp,
35
+ text: hit.text.slice(0, 2000),
36
+ match: "structured-words",
37
+ };
38
+ });
39
+ const matched = new Set(items.map((hit) => hit.locator));
40
+ const coverage = [];
41
+ let incomplete = answer.hasMore;
42
+ const noteItem = (note, match) => ({
43
+ kind: "note",
44
+ locator: `note:${note.id}`,
45
+ provider: "notes",
46
+ account: note.folderId ?? "internal",
47
+ timestamp: note.updatedAt,
48
+ text: note.text.slice(0, 2000),
49
+ match,
50
+ });
51
+ if (options.notes) {
52
+ try {
53
+ const notes = await searchNotesQuery(store, { text: query, limit: Math.min(500, offset + limit + 1) });
54
+ incomplete ||= notes.hasMore;
55
+ items.push(...notes.items.map(({ note }) => noteItem(note, "structured-words")));
56
+ coverage.push({ notes: "searched" });
57
+ }
58
+ catch (error) {
59
+ // A field only messages have (`from:`, `after:`) is refused by notes; the messages still answer.
60
+ if (!(error instanceof CliError) || error.code !== "validation_error" || !options.keys.length)
61
+ throw error;
62
+ coverage.push({ notes: `not searched: ${error.message}` });
63
+ incomplete = true;
64
+ }
65
+ }
66
+ if (options.noteText !== undefined) {
67
+ const notes = await store.notes.notes({
68
+ source: "internal",
69
+ search: options.noteText,
70
+ limit: Math.min(500, offset + limit + 1),
71
+ });
72
+ incomplete ||= notes.hasMore;
73
+ items.push(...notes.items.map((note) => noteItem(note, "note-text")));
74
+ }
75
+ for (const item of items)
76
+ matched.add(item.locator);
77
+ for (const key of options.keys) {
78
+ const taskResults = await taskPage(store, key, {
79
+ state: "open",
80
+ sources: [...matched],
81
+ limit: Math.min(500, offset + limit + 1),
82
+ });
83
+ incomplete ||= taskResults.hasMore;
84
+ for (const task of taskResults.items) {
85
+ if (matched.has(task.source))
86
+ items.push({
87
+ kind: "task",
88
+ locator: `task:${task.id}`,
89
+ ...key,
90
+ timestamp: task.createdAt.toISOString(),
91
+ text: task.kind,
92
+ source: task.source,
93
+ match: "task-source",
94
+ });
95
+ }
96
+ coverage.push({
97
+ ...key,
98
+ mail: key.provider === "email" ? ((await store.syncState(key, "mail_coverage"))?.value ?? null) : undefined,
99
+ archives: await store.chatCompleteness(key, (await store.chats(key, { limit: 500 })).items.map((chat) => chat.id)),
100
+ });
101
+ }
102
+ items.sort((a, b) => b.timestamp.localeCompare(a.timestamp) || a.kind.localeCompare(b.kind) || a.locator.localeCompare(b.locator));
103
+ const unique = [...new Map(items.map((item) => [item.locator, item])).values()];
104
+ const hasMore = unique.length > offset + limit;
105
+ return {
106
+ query,
107
+ items: unique.slice(offset, offset + limit),
108
+ hasMore,
109
+ ...(hasMore && offset + limit <= 1000 ? { nextOffset: offset + limit } : {}),
110
+ incomplete: incomplete || (hasMore && offset + limit > 1000),
111
+ accounts: options.keys,
112
+ coverage,
113
+ };
114
+ };
115
+ /** Notes are no account's: `--all` takes them with every account, `--provider notes` alone. */
116
+ export const searchAccounts = async (store, options) => {
117
+ if (options.all && (options.provider !== undefined || options.account !== undefined))
118
+ throw new CliError("validation_error", "use --all alone or select one provider/account");
119
+ if (options.provider === "notes")
120
+ return { keys: [], notes: true };
121
+ const messengers = (await store.accounts()).filter(({ provider }) => provider !== "notes");
122
+ return options.all ? { keys: messengers, notes: true } : { keys: [await selectAccount(store, options)], notes: false };
123
+ };
124
+ const onlyOf = (value) => {
125
+ const selected = value.split(",").map((part) => part.trim());
126
+ if (!selected.length || selected.some((part) => !["messages", "mail", "notes"].includes(part)))
127
+ throw new InvalidArgumentError("choose messages,mail,notes, separated by commas");
128
+ return [...new Set(selected)];
129
+ };
130
+ const noteType = (value) => {
131
+ if (value !== "file" && value !== "internal")
132
+ throw new InvalidArgumentError("choose file or internal");
133
+ return value;
134
+ };
135
+ const messageType = (value) => {
136
+ if (value !== "text" && value !== "voice" && value !== "file")
137
+ throw new InvalidArgumentError("choose text, voice or file");
138
+ return value;
139
+ };
140
+ const hasSource = (node) => node.kind === "predicate"
141
+ ? node.field === "in"
142
+ : node.clauses.some(({ occur, node }) => occur !== "mustNot" && hasSource(node));
143
+ const searchFolderIds = async (store, env, selected) => {
144
+ const known = new Set((await store.notes.folders()).map(({ id }) => id));
145
+ const paths = selected.filter((value) => !known.has(value));
146
+ const bound = paths.length ? await boundFolders(store, env, { only: paths }) : [];
147
+ return [...new Set([...selected.filter((value) => known.has(value)), ...bound.map(({ id }) => id)])];
148
+ };
149
+ export const searchCommand = (program, streams, env) => {
150
+ const group = program.command("search").description("Search stored messages, mail and notes; start with search all");
151
+ const withStore = async (work) => {
152
+ const store = await openStore({ env });
153
+ try {
154
+ return await work(store);
155
+ }
156
+ finally {
157
+ await store.close();
158
+ }
159
+ };
160
+ const print = (json, answer, text) => {
161
+ if (json)
162
+ createRenderer({ format: "json", color: false, streams }).result(answer);
163
+ else
164
+ streams.data(`${text}\n`);
165
+ };
166
+ const queryOptions = (leaf) => leaf
167
+ .argument("<query...>", "words, phrases, Boolean operators and field queries")
168
+ .option("--limit <n>", "most results, at most 100", (value) => {
169
+ const limit = positive(value);
170
+ if (limit > 100)
171
+ throw new InvalidArgumentError("at most 100");
172
+ return limit;
173
+ }, 20)
174
+ .option("--exact", "words as written; skip meaning search")
175
+ .option("--timezone <zone>", "IANA timezone for calendar date boundaries")
176
+ .option("--json", "print JSON");
177
+ queryOptions(group.command("all").description("Messages, mail and notes, ranked together by the shared search service"))
178
+ .option("--only <resources>", "messages,mail,notes, separated by commas", onlyOf)
179
+ .action(async (words, options) => {
180
+ const answer = await withStore(async (store) => {
181
+ const accounts = await store.accounts();
182
+ const key = accounts.find(({ provider }) => provider !== "notes") ?? {
183
+ provider: "notes",
184
+ account: "internal",
185
+ };
186
+ const found = await searchAll(store, key, {
187
+ text: words.join(" "),
188
+ limit: options.limit,
189
+ env,
190
+ ...(options.only === undefined ? {} : { only: options.only }),
191
+ ...(options.exact ? { exact: true } : {}),
192
+ ...(options.timezone === undefined ? {} : { timezone: options.timezone }),
193
+ }, { app: APP });
194
+ const tasks = [];
195
+ let tasksIncomplete = false;
196
+ const sources = found.items.map((item) => item.ref);
197
+ for (const account of accounts) {
198
+ const page = await taskPage(store, account, { state: "open", sources, limit: Math.min(options.limit, 500) });
199
+ tasks.push(...page.items);
200
+ tasksIncomplete ||= page.hasMore;
201
+ }
202
+ return {
203
+ ...found,
204
+ tasks: tasks.slice(0, options.limit),
205
+ tasksIncomplete: tasksIncomplete || tasks.length > options.limit,
206
+ };
207
+ });
208
+ if (!options.json) {
209
+ for (const skipped of answer.skipped)
210
+ streams.diagnostic(`${skipped.resource} not searched: ${skipped.reason}\n`);
211
+ if (answer.notes?.meaningSkipped)
212
+ streams.diagnostic(`Notes by words only: ${answer.notes.meaningSkipped}\n`);
213
+ }
214
+ print(options.json, answer, [
215
+ ...answer.items.map((item) => `${item.kind} ${item.ref}\n ${item.text}`),
216
+ ...answer.tasks.map((task) => `task task:${task.id} ${task.kind} ${task.source}`),
217
+ ].join("\n"));
218
+ });
219
+ for (const kind of ["messages", "mail"]) {
220
+ const leaf = queryOptions(group.command(kind).description(kind === "mail" ? "Imported emails only" : "Stored messenger messages only"));
221
+ if (kind === "messages")
222
+ leaf.option("--type <type>", "text, voice or file", messageType);
223
+ leaf.action(async (words, options) => {
224
+ const answer = await withStore(async (store) => {
225
+ const accounts = (await store.accounts()).filter(({ provider }) => provider !== "notes" && (kind === "mail" ? provider === "email" : provider !== "email"));
226
+ if (!accounts.length)
227
+ throw new CliError("not_found", kind === "mail" ? "no imported mail; run memo mail import" : "no stored messenger messages");
228
+ return searchStore(store, accounts[0], {
229
+ text: options.type === undefined
230
+ ? words.join(" ")
231
+ : `(${words.join(" ")}) AND ${{ text: "NOT has:attachment", voice: "has:voice", file: "has:file" }[options.type]}`,
232
+ language: "lucene",
233
+ kind,
234
+ ...(kind === "messages" && !hasSource(parseLucene(words.join(" ")).root)
235
+ ? { source: "all" }
236
+ : {}),
237
+ limit: options.limit,
238
+ ...(options.exact ? { exact: true } : {}),
239
+ ...(options.timezone === undefined ? {} : { timezone: options.timezone }),
240
+ }, { app: APP });
241
+ });
242
+ print(options.json, answer, answer.items.map((item) => `${item.locator}\n ${item.text}`).join("\n"));
243
+ });
244
+ }
245
+ queryOptions(group.command("notes").description("Native notes by words and, with the local model, meaning"))
246
+ .option("--type <type>", "file or internal", noteType)
247
+ .option("--tag <tag>", "only notes with this tag")
248
+ .option("--filter <query>", "another query every note must match")
249
+ .option("--folder <path-or-id...>", "only these folders")
250
+ .option("--offset <n>", "continue from nextOffset", Number, 0)
251
+ .action(async (words, options) => {
252
+ const answer = await withStore(async (store) => searchNotes(store, words.join(" "), {
253
+ limit: options.limit,
254
+ offset: options.offset,
255
+ env,
256
+ command: "memo",
257
+ ...(options.type === undefined ? {} : { source: options.type }),
258
+ ...(options.tag === undefined ? {} : { tag: options.tag }),
259
+ ...(options.filter === undefined ? {} : { filter: options.filter }),
260
+ ...(options.folder === undefined ? {} : { folderIds: await searchFolderIds(store, env, options.folder) }),
261
+ ...(options.exact ? { exact: true } : {}),
262
+ ...(options.timezone === undefined ? {} : { timezone: options.timezone }),
263
+ }));
264
+ if (answer.meaningSkipped && !options.json)
265
+ streams.diagnostic(`Searched by words only: ${answer.meaningSkipped}\n`);
266
+ print(options.json, answer, searchText(answer));
267
+ });
268
+ };
269
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/search/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { AccountKey, MessageStore } from "@wirecat/cli-messaging/store";
2
+ export interface Gone {
3
+ deleted: number;
4
+ /** Why stored entries missing at the source were left alone, when they were. */
5
+ skipped?: string;
6
+ }
7
+ /**
8
+ * What the store holds of this account, from `since` on, and the source no longer lists, was deleted
9
+ * there: its text goes. Wrongly dropping text cannot be undone and a missed deletion is caught on the
10
+ * next run, so an unusually large share missing is refused rather than applied — an unmounted folder or
11
+ * a half-answered listing looks exactly like that.
12
+ */
13
+ export declare const dropMissing: (store: MessageStore, key: AccountKey, present: Set<string>, since?: string, eligible?: (entry: {
14
+ chatId: string;
15
+ id: string;
16
+ }) => Promise<boolean>) => Promise<Gone>;
17
+ //# sourceMappingURL=gone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gone.d.ts","sourceRoot":"","sources":["../../src/store/gone.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAM5E,MAAM,WAAW,IAAI;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,UACf,YAAY,OACd,UAAU,WACN,GAAG,CAAC,MAAM,CAAC,UACZ,MAAM,aACH,CAAC,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC,OAAO,CAAC,KACrE,OAAO,CAAC,IAAI,CAiCd,CAAA"}
@@ -0,0 +1,52 @@
1
+ const PAGE = 500;
2
+ const MAX_DELETED_SHARE = 0.2;
3
+ const MIN_DELETIONS_CAPPED = 5;
4
+ /**
5
+ * What the store holds of this account, from `since` on, and the source no longer lists, was deleted
6
+ * there: its text goes. Wrongly dropping text cannot be undone and a missed deletion is caught on the
7
+ * next run, so an unusually large share missing is refused rather than applied — an unmounted folder or
8
+ * a half-answered listing looks exactly like that.
9
+ */
10
+ export const dropMissing = async (store, key, present, since, eligible) => {
11
+ const stored = [];
12
+ for (let offset = 0;; offset += PAGE) {
13
+ const chats = await store.chats(key, { limit: PAGE, offset });
14
+ for (const chat of chats.items) {
15
+ if (since !== undefined && chat.lastMessageAt !== null && chat.lastMessageAt < since)
16
+ continue;
17
+ for (let before;;) {
18
+ const page = await store.messages(key, chat.id, {
19
+ limit: PAGE,
20
+ ...(since === undefined ? {} : { since }),
21
+ ...(before === undefined ? {} : { before }),
22
+ });
23
+ stored.push(...page.items.map(({ id }) => ({ chatId: chat.id, id })));
24
+ before = page.items[0]?.id;
25
+ if (!page.hasMore || before === undefined)
26
+ break;
27
+ }
28
+ }
29
+ if (!chats.hasMore)
30
+ break;
31
+ }
32
+ const candidates = [];
33
+ for (const entry of stored)
34
+ if (eligible === undefined || (await eligible(entry)))
35
+ candidates.push(entry);
36
+ const gone = candidates.filter(({ id }) => !present.has(id));
37
+ if (gone.length === 0)
38
+ return { deleted: 0 };
39
+ if (gone.length >= MIN_DELETIONS_CAPPED && gone.length > candidates.length * MAX_DELETED_SHARE)
40
+ return {
41
+ deleted: 0,
42
+ skipped: `${gone.length} of ${candidates.length} stored entries are missing at the source — too many to trust; nothing deleted`,
43
+ };
44
+ const byChat = new Map();
45
+ for (const { chatId, id } of gone)
46
+ byChat.set(chatId, [...(byChat.get(chatId) ?? []), id]);
47
+ let deleted = 0;
48
+ for (const [chatId, ids] of byChat)
49
+ deleted += await store.markDeleted(key, ids, { chatId });
50
+ return { deleted };
51
+ };
52
+ //# sourceMappingURL=gone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gone.js","sourceRoot":"","sources":["../../src/store/gone.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { AccountKey, KnowledgeTarget, MessageStore } from "@wirecat/cli-messaging/store";
2
+ export interface AccountScope {
3
+ provider?: string;
4
+ account?: string;
5
+ }
6
+ export interface TargetInput extends AccountScope {
7
+ message?: string;
8
+ chat?: string;
9
+ contact?: string;
10
+ person?: string;
11
+ task?: string;
12
+ entity?: string;
13
+ }
14
+ export declare const selectAccount: (store: MessageStore, scope: AccountScope) => Promise<AccountKey>;
15
+ export declare const selectTarget: (store: MessageStore, input: TargetInput) => Promise<{
16
+ key: AccountKey;
17
+ target: KnowledgeTarget;
18
+ }>;
19
+ //# sourceMappingURL=scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/store/scope.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAE7F,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AACD,MAAM,WAAW,WAAY,SAAQ,YAAY;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,eAAO,MAAM,aAAa,UAAiB,YAAY,SAAS,YAAY,KAAG,OAAO,CAAC,UAAU,CAchG,CAAA;AAED,eAAO,MAAM,YAAY,UAChB,YAAY,SACZ,WAAW,KACjB,OAAO,CAAC;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAsBtD,CAAA"}
@@ -0,0 +1,34 @@
1
+ import { CliError } from "@wirecat/cli-core";
2
+ import { parseLocator } from "@wirecat/cli-messaging";
3
+ export const selectAccount = async (store, scope) => {
4
+ if (!scope.provider)
5
+ throw new CliError("validation_error", "select --provider and, when several accounts exist, --account");
6
+ const matches = (await store.accounts()).filter((key) => key.provider === scope.provider && (scope.account === undefined || key.account === scope.account));
7
+ if (matches.length !== 1)
8
+ throw new CliError(matches.length ? "validation_error" : "not_found", matches.length
9
+ ? "several accounts match; select --account explicitly"
10
+ : `the store holds no ${scope.provider} account matching this selection`);
11
+ return matches[0];
12
+ };
13
+ export const selectTarget = async (store, input) => {
14
+ const choices = ["message", "chat", "contact", "person", "task", "entity"];
15
+ const selected = choices.filter((name) => input[name] !== undefined);
16
+ if (selected.length !== 1)
17
+ throw new CliError("validation_error", "select exactly one of --message, --chat, --contact, --person, --task or --entity");
18
+ const type = selected[0];
19
+ if (type === "message") {
20
+ const locator = input.message;
21
+ let parsed;
22
+ try {
23
+ parsed = parseLocator(locator);
24
+ }
25
+ catch {
26
+ throw new CliError("validation_error", "give a valid msg: source locator");
27
+ }
28
+ if ((input.provider && parsed.provider !== input.provider) || (input.account && parsed.account !== input.account))
29
+ throw new CliError("validation_error", "locator and selected account disagree");
30
+ return { key: { provider: parsed.provider, account: parsed.account }, target: { type, locator } };
31
+ }
32
+ return { key: await selectAccount(store, input), target: { type, id: input[type] } };
33
+ };
34
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/store/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAgBrD,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,KAAmB,EAAE,KAAmB,EAAuB,EAAE;IACnG,IAAI,CAAC,KAAK,CAAC,QAAQ;QACjB,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,+DAA+D,CAAC,CAAA;IACzG,MAAM,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAC7C,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,CAC3G,CAAA;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QACtB,MAAM,IAAI,QAAQ,CAChB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,WAAW,EACjD,OAAO,CAAC,MAAM;YACZ,CAAC,CAAC,qDAAqD;YACvD,CAAC,CAAC,sBAAsB,KAAK,CAAC,QAAQ,kCAAkC,CAC3E,CAAA;IACH,OAAO,OAAO,CAAC,CAAC,CAAe,CAAA;AACjC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,KAAmB,EACnB,KAAkB,EACqC,EAAE;IACzD,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAU,CAAA;IACnF,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAA;IACpE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QACvB,MAAM,IAAI,QAAQ,CAChB,kBAAkB,EAClB,kFAAkF,CACnF,CAAA;IACH,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAA6B,CAAA;IACpD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAiB,CAAA;QACvC,IAAI,MAAuC,CAAA;QAC3C,IAAI,CAAC;YACH,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,kCAAkC,CAAC,CAAA;QAC5E,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC;YAC/G,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,uCAAuC,CAAC,CAAA;QACjF,OAAO,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAA;IACnG,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,CAAW,EAAE,EAAE,CAAA;AAChG,CAAC,CAAA"}
@@ -0,0 +1,18 @@
1
+ import type { AccountKey, TagTarget } from "@wirecat/cli-messaging/store";
2
+ export interface SourceScope {
3
+ provider?: string;
4
+ account?: string;
5
+ }
6
+ export interface SourceTargetInput extends SourceScope {
7
+ message?: string;
8
+ chat?: string;
9
+ }
10
+ export interface SourceTarget {
11
+ key: AccountKey;
12
+ target: Exclude<TagTarget, {
13
+ type: "contact";
14
+ }>;
15
+ locator?: string;
16
+ }
17
+ export declare const sourceTarget: ({ message, chat, provider, account }: SourceTargetInput) => SourceTarget;
18
+ //# sourceMappingURL=source-target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-target.d.ts","sourceRoot":"","sources":["../../src/store/source-target.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAEzE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,UAAU,CAAA;IACf,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE;QAAE,IAAI,EAAE,SAAS,CAAA;KAAE,CAAC,CAAA;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,eAAO,MAAM,YAAY,yCAA0C,iBAAiB,KAAG,YAyBtF,CAAA"}
@@ -0,0 +1,28 @@
1
+ import { CliError } from "@wirecat/cli-core";
2
+ import { formatLocator, parseLocator } from "@wirecat/cli-messaging";
3
+ export const sourceTarget = ({ message, chat, provider, account }) => {
4
+ if (message !== undefined) {
5
+ if (chat !== undefined || provider !== undefined || account !== undefined)
6
+ throw new CliError("validation_error", "a message locator names its account and chat — use --message alone");
7
+ let parsed;
8
+ try {
9
+ parsed = parseLocator(message);
10
+ }
11
+ catch (error) {
12
+ if (error instanceof URIError)
13
+ throw new CliError("validation_error", "invalid percent encoding in the locator");
14
+ throw error;
15
+ }
16
+ return {
17
+ key: { provider: parsed.provider, account: parsed.account },
18
+ target: { type: "message", chatId: parsed.chat, messageId: parsed.message },
19
+ locator: formatLocator(parsed),
20
+ };
21
+ }
22
+ if (chat === undefined || provider === undefined || account === undefined)
23
+ throw new CliError("validation_error", "name --message <locator>, or --chat <id> with --provider <provider> and --account <account>");
24
+ if (!chat.trim() || !provider.trim() || !account.trim())
25
+ throw new CliError("validation_error", "the provider, account and chat id must not be empty");
26
+ return { key: { provider, account }, target: { type: "chat", chatId: chat } };
27
+ };
28
+ //# sourceMappingURL=source-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-target.js","sourceRoot":"","sources":["../../src/store/source-target.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAmBpE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAqB,EAAgB,EAAE;IACpG,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,IAAI,IAAI,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;YACvE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,oEAAoE,CAAC,CAAA;QAC9G,IAAI,MAAuC,CAAA;QAC3C,IAAI,CAAC;YACH,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,QAAQ;gBAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,yCAAyC,CAAC,CAAA;YAChH,MAAM,KAAK,CAAA;QACb,CAAC;QACD,OAAO;YACL,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE;YAC3D,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE;YAC3E,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC;SAC/B,CAAA;IACH,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;QACvE,MAAM,IAAI,QAAQ,CAChB,kBAAkB,EAClB,6FAA6F,CAC9F,CAAA;IACH,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;QACrD,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,qDAAqD,CAAC,CAAA;IAC/F,OAAO,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAA;AAC/E,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { type Streams } from "@wirecat/cli-core";
2
+ import { type Command } from "commander";
3
+ export declare const tagsCommand: (program: Command, streams: Streams, env: NodeJS.ProcessEnv) => void;
4
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/tags/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAG1E,OAAO,EAAE,KAAK,OAAO,EAAwB,MAAM,WAAW,CAAA;AA+E9D,eAAO,MAAM,WAAW,YAAa,OAAO,WAAW,OAAO,OAAO,MAAM,CAAC,UAAU,KAAG,IAiJxF,CAAA"}