@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,222 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { CliError, createRenderer } from "@wirecat/cli-core";
3
+ import { openStore } from "@wirecat/cli-messaging/store";
4
+ import { InvalidArgumentError } from "commander";
5
+ import { loadConfig } from "../config.js";
6
+ import { positive } from "../options.js";
7
+ import { importNotesMap } from "../people/notes-map.js";
8
+ import { subjectOf } from "../people/subject.js";
9
+ import { aboutText, notesAbout } from "./about.js";
10
+ import { boundFolders, folderOfFile } from "./bound.js";
11
+ import { DIALECTS } from "./dialects/index.js";
12
+ import { embedNoteChunks } from "./embed.js";
13
+ import { folderNotes, importNotes } from "./import.js";
14
+ import { exportInternal, exportTarget, internalNotes } from "./internal.js";
15
+ import { loadFolderState } from "./state.js";
16
+ const formatOf = (value) => {
17
+ if (!DIALECTS.includes(value))
18
+ throw new InvalidArgumentError(`choose ${DIALECTS.join(", ")}`);
19
+ return value;
20
+ };
21
+ const sourceOf = (value) => {
22
+ if (value !== "file" && value !== "internal")
23
+ throw new InvalidArgumentError("choose file or internal");
24
+ return value;
25
+ };
26
+ const importText = (results) => results
27
+ .map((result) => `${result.folder}: ${result.notes} notes, ${result.changed} changed, ${result.renamed} moved, ${result.deleted} gone` +
28
+ (result.deletionsSkipped === undefined ? "" : `\nDeletions skipped: ${result.deletionsSkipped}`))
29
+ .join("\n");
30
+ const textOf = (options, given) => {
31
+ const sources = [given, options.text, options.file].filter((value) => value !== undefined);
32
+ if (sources.length !== 1)
33
+ throw new CliError("validation_error", "give the text once: as an argument, --text or --file");
34
+ if (options.file !== undefined)
35
+ return readFileSync(options.file === "-" ? 0 : options.file, "utf8");
36
+ return sources[0];
37
+ };
38
+ /** `note:<id>`, or a file inside a configured folder. */
39
+ const noteOf = async (store, env, reference) => {
40
+ if (reference.startsWith("note:"))
41
+ return store.notes.note(reference.slice("note:".length));
42
+ const { folder, path } = folderOfFile(await boundFolders(store, env, { strict: false }), reference);
43
+ const found = (await folderNotes(store, folder.id)).find((note) => note.path === path);
44
+ if (!found)
45
+ throw new CliError("not_found", `${reference} is not imported — memo notes import`);
46
+ return found;
47
+ };
48
+ export const notesCommand = (program, streams, env) => {
49
+ const print = (json, value, text) => {
50
+ if (json)
51
+ createRenderer({ format: "json", color: false, streams }).result(value);
52
+ else
53
+ streams.data(`${text}\n`);
54
+ };
55
+ const withStore = async (work) => {
56
+ const store = await openStore({ env });
57
+ try {
58
+ await importNotesMap(store, env, await boundFolders(store, env, { strict: false }));
59
+ return await work(store);
60
+ }
61
+ finally {
62
+ await store.close();
63
+ }
64
+ };
65
+ const notes = program
66
+ .command("notes")
67
+ .description("Notes: files from your folders, and notes you write here about messages, people and projects");
68
+ notes
69
+ .command("import")
70
+ .description("Bring the folders' notes, their links and tags into the shared store — only what changed")
71
+ .option("--folder <path-or-id...>", "only these configured folders")
72
+ .option("--ignore <path...>", "files or folders inside them to skip, added to notes.ignore — a path or a glob")
73
+ .option("--no-embed", "skip embedding the notes for search by meaning this run")
74
+ .option("--json", "print JSON")
75
+ .action(async (options) => {
76
+ const results = await withStore(async (store) => {
77
+ const config = loadConfig(env).notes;
78
+ const folders = await boundFolders(store, env, options.folder === undefined ? {} : { only: options.folder });
79
+ if (folders.length === 0)
80
+ throw new CliError("configuration_error", "no folders of notes — memo folders add <path>");
81
+ const ignore = [...(config?.ignore ?? []), ...(options.ignore ?? [])];
82
+ const imported = [];
83
+ for (const folder of folders)
84
+ imported.push(await importNotes(store, folder, { ignore, env }));
85
+ await importNotesMap(store, env, folders);
86
+ const embedded = await embedNoteChunks(store, { embed: options.embed && config?.embed !== false, env });
87
+ if (embedded.notEmbedded !== undefined)
88
+ streams.diagnostic(`Not searchable by meaning: ${embedded.notEmbedded}\n`);
89
+ else if (embedded.left)
90
+ streams.diagnostic(`${embedded.chunks} chunks embedded; run again to embed the rest\n`);
91
+ return imported;
92
+ });
93
+ print(options.json, results, importText(results));
94
+ });
95
+ notes
96
+ .command("about")
97
+ .description("Notes about a person, project or note, and the notes that link them — through links, never a name in plain text")
98
+ .argument("<subject>", "<messenger>:<name or id>, person:<uid>, entity:<id> or note:<id>")
99
+ .option("--limit <n>", "most notes of each kind", positive, 20)
100
+ .option("--json", "print JSON")
101
+ .action(async (subject, options) => {
102
+ const answer = await withStore(async (store) => notesAbout(store, await subjectOf(store, subject), options.limit));
103
+ print(options.json, answer, aboutText(answer));
104
+ });
105
+ notes
106
+ .command("show")
107
+ .description("One note: its text, tags, what it links and what links it")
108
+ .argument("<note>", "note:<id>, or a file in a configured folder")
109
+ .option("--json", "print JSON")
110
+ .action(async (reference, options) => {
111
+ const answer = await withStore(async (store) => {
112
+ const note = await noteOf(store, env, reference);
113
+ const ref = `note:${note.id}`;
114
+ const labels = await store.notes.noteTags(note.id);
115
+ return {
116
+ ...note,
117
+ ref,
118
+ tags: labels.map(({ tag }) => tag),
119
+ labels,
120
+ links: await store.notes.links({ from: ref }),
121
+ backlinks: await store.notes.links({ to: ref }),
122
+ provenance: note.folderId === null
123
+ ? null
124
+ : (loadFolderState(env, note.folderId)?.documents[note.path] ?? null),
125
+ };
126
+ });
127
+ print(options.json, answer, answer.text);
128
+ });
129
+ notes
130
+ .command("list")
131
+ .description("Notes, newest first")
132
+ .option("--about <subject>", "only notes about this: <messenger>:<name or id> or a typed reference")
133
+ .option("--source <source>", "file or internal", sourceOf)
134
+ .option("--search <text>", "only notes holding this text, as written")
135
+ .option("--offset <n>", "skip this many", Number, 0)
136
+ .option("--limit <n>", "most notes, at most 500", positive, 20)
137
+ .option("--json", "print JSON")
138
+ .action(async (options) => {
139
+ const page = await withStore(async (store) => store.notes.notes({
140
+ limit: options.limit,
141
+ offset: options.offset,
142
+ ...(options.about === undefined ? {} : { about: (await subjectOf(store, options.about)).ref }),
143
+ ...(options.source === undefined ? {} : { source: options.source }),
144
+ ...(options.search === undefined ? {} : { search: options.search }),
145
+ }));
146
+ print(options.json, page, page.items
147
+ .map((note) => `${note.id} ${note.source} ${note.path ?? note.title ?? note.text.split("\n")[0]}`)
148
+ .join("\n") || "No notes.");
149
+ });
150
+ notes
151
+ .command("add")
152
+ .description("Write a note of your own about messages, people, projects or other notes")
153
+ .argument("[text]", "the note; or --text, or --file")
154
+ .option("--text <text>", "the note")
155
+ .option("--file <path>", "read the note from a file; - reads stdin")
156
+ .option("--title <title>", "a title")
157
+ .option("--about <subject...>", "what it is about: <messenger>:<name or id>, msg:, chat:, person:, entity:, task:, note:")
158
+ .option("--export [dir]", "also write it as a file — to this folder, or notes.export.dir")
159
+ .option("--format <format>", `the file's format: ${DIALECTS.join(", ")}`, formatOf)
160
+ .option("--json", "print JSON")
161
+ .action(async (given, options) => {
162
+ const body = textOf(options, given);
163
+ const answer = await withStore(async (store) => {
164
+ const about = await Promise.all((options.about ?? []).map(async (subject) => (await subjectOf(store, subject)).ref));
165
+ const note = await store.notes.addNote({
166
+ text: body,
167
+ about,
168
+ ...(options.title === undefined ? {} : { title: options.title }),
169
+ });
170
+ if (options.export === undefined)
171
+ return { note };
172
+ const target = exportTarget(loadConfig(env), options.export, options.format);
173
+ return { note, exported: await exportInternal(store, { ...target, notes: [note] }) };
174
+ });
175
+ print(options.json, answer, answer.note.id);
176
+ });
177
+ notes
178
+ .command("edit")
179
+ .description("Change a note you wrote here; a file's note is edited in its file")
180
+ .argument("<id>", "the note's id")
181
+ .requiredOption("--revision <n>", "its current revision, so an edit made meanwhile is not lost", positive)
182
+ .option("--text <text>", "the new text")
183
+ .option("--file <path>", "read the new text from a file; - reads stdin")
184
+ .option("--export [dir]", "also rewrite its file — in this folder, or notes.export.dir")
185
+ .option("--format <format>", `the file's format: ${DIALECTS.join(", ")}`, formatOf)
186
+ .option("--json", "print JSON")
187
+ .action(async (id, options) => {
188
+ const body = textOf(options);
189
+ const answer = await withStore(async (store) => {
190
+ const note = await store.notes.editNote(id.replace(/^note:/, ""), body, options.revision);
191
+ if (options.export === undefined)
192
+ return { note };
193
+ const target = exportTarget(loadConfig(env), options.export, options.format);
194
+ return { note, exported: await exportInternal(store, { ...target, notes: [note] }) };
195
+ });
196
+ print(options.json, answer, `${answer.note.id} revision ${answer.note.revision}`);
197
+ });
198
+ notes
199
+ .command("remove")
200
+ .description("Delete a note you wrote here; a file it was exported to stays")
201
+ .argument("<id>", "the note's id")
202
+ .option("--json", "print JSON")
203
+ .action(async (id, options) => {
204
+ const answer = await withStore((store) => store.notes.removeNote(id.replace(/^note:/, "")));
205
+ print(options.json, answer, `${answer.id} removed`);
206
+ });
207
+ notes
208
+ .command("export")
209
+ .description("Write the notes you wrote here as files, never overwriting one you edited")
210
+ .option("--to <dir>", "the folder to write to (default: notes.export.dir)")
211
+ .option("--format <format>", `the files' format: ${DIALECTS.join(", ")}`, formatOf)
212
+ .option("--json", "print JSON")
213
+ .action(async (options) => {
214
+ const target = exportTarget(loadConfig(env), options.to, options.format);
215
+ const result = await withStore(async (store) => exportInternal(store, { ...target, notes: await internalNotes(store) }));
216
+ print(options.json, result, [
217
+ `${result.dir}: ${result.written.length} written, ${result.unchanged.length} unchanged`,
218
+ ...result.edited.map(({ path }) => `Edited since export, left as it is: ${path}`),
219
+ ].join("\n"));
220
+ });
221
+ };
222
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/notes/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { NoteForExport, NoteLink, ParsedNote } from "./types.js";
2
+ export declare const isReference: (target: string) => boolean;
3
+ export declare const splitFrontMatter: (text: string) => {
4
+ frontMatter: Record<string, unknown>;
5
+ body: string;
6
+ };
7
+ export declare const frontMatterAliases: (frontMatter: Record<string, unknown>) => string[];
8
+ export declare const frontMatterTags: (frontMatter: Record<string, unknown>) => string[];
9
+ /** Code says what a reader typed into a fence, not what the note links to or is tagged with. */
10
+ export declare const withoutCode: (body: string) => string;
11
+ export declare const titleOf: (frontMatter: Record<string, unknown>, body: string, path: string) => string;
12
+ export declare const dropNoteExtension: (target: string) => string;
13
+ /** `msg:…` written in the text with no link syntax around it. */
14
+ export declare const bareReferences: (body: string) => NoteLink[];
15
+ export declare const dedupe: (links: NoteLink[]) => NoteLink[];
16
+ export declare const parsedNote: (frontMatter: Record<string, unknown>, body: string, path: string, links: NoteLink[], inlineTags?: string[]) => ParsedNote;
17
+ export declare const renderNote: (note: NoteForExport, link: (link: NoteLink) => string) => string;
18
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/notes/dialects/common.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAOrE,eAAO,MAAM,WAAW,WAAY,MAAM,KAAG,OAAiC,CAAA;AAE9E,eAAO,MAAM,gBAAgB,SAAU,MAAM,KAAG;IAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAWnG,CAAA;AAYD,eAAO,MAAM,kBAAkB,gBAAiB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,EAG/E,CAAA;AAED,eAAO,MAAM,eAAe,gBAAiB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,EACK,CAAA;AAElF,gGAAgG;AAChG,eAAO,MAAM,WAAW,SAAU,MAAM,KAAG,MAC2C,CAAA;AAEtF,eAAO,MAAM,OAAO,gBAAiB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,MAAM,QAAQ,MAAM,KAAG,MAI1F,CAAA;AAED,eAAO,MAAM,iBAAiB,WAAY,MAAM,KAAG,MAAiD,CAAA;AAEpG,iEAAiE;AACjE,eAAO,MAAM,cAAc,SAAU,MAAM,KAAG,QAAQ,EAKjD,CAAA;AAEL,eAAO,MAAM,MAAM,UAAW,QAAQ,EAAE,KAAG,QAAQ,EAUlD,CAAA;AAED,eAAO,MAAM,UAAU,gBACR,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAC9B,MAAM,QACN,MAAM,SACL,QAAQ,EAAE,eACL,MAAM,EAAE,KACnB,UAMD,CAAA;AAEF,eAAO,MAAM,UAAU,SAAU,aAAa,QAAQ,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,KAAG,MASlF,CAAA"}
@@ -0,0 +1,79 @@
1
+ import { posix } from "node:path";
2
+ import { parse, stringify } from "yaml";
3
+ const FRONT_MATTER = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/;
4
+ const REFERENCE = /^(msg|note|person|entity|task|chat|contact):\S+$/;
5
+ const BARE_REFERENCE = /(?<![\w/:])((?:msg|note|person|entity|task|chat|contact):[^\s<>()[\]"'`]+)/g;
6
+ const MAX_LINKS = 200;
7
+ export const isReference = (target) => REFERENCE.test(target);
8
+ export const splitFrontMatter = (text) => {
9
+ const match = FRONT_MATTER.exec(text);
10
+ if (!match)
11
+ return { frontMatter: {}, body: text };
12
+ let data;
13
+ try {
14
+ data = parse(match[1] ?? "");
15
+ }
16
+ catch {
17
+ data = null;
18
+ }
19
+ const frontMatter = data !== null && typeof data === "object" && !Array.isArray(data) ? data : {};
20
+ return { frontMatter: frontMatter, body: text.slice(match[0].length) };
21
+ };
22
+ const strings = (value) => typeof value === "string"
23
+ ? value
24
+ .split(/[,\s]+/)
25
+ .map((item) => item.trim())
26
+ .filter(Boolean)
27
+ : Array.isArray(value)
28
+ ? value.filter((item) => typeof item === "string").map((item) => item.trim())
29
+ : [];
30
+ export const frontMatterAliases = (frontMatter) => {
31
+ const value = frontMatter.aliases ?? frontMatter.alias;
32
+ return typeof value === "string" ? [value.trim()] : strings(value);
33
+ };
34
+ export const frontMatterTags = (frontMatter) => strings(frontMatter.tags ?? frontMatter.tag).map((tag) => tag.replace(/^#/, ""));
35
+ /** Code says what a reader typed into a fence, not what the note links to or is tagged with. */
36
+ export const withoutCode = (body) => body.replace(/^(```|~~~)[^\n]*\n[\s\S]*?^\1[^\n]*$/gm, "").replace(/`[^`\n]*`/g, "");
37
+ export const titleOf = (frontMatter, body, path) => {
38
+ if (typeof frontMatter.title === "string" && frontMatter.title.trim())
39
+ return frontMatter.title.trim();
40
+ const heading = /^#\s+(.+?)\s*#*\s*$/m.exec(withoutCode(body))?.[1];
41
+ return heading ?? posix.basename(path.replace(/\\/g, "/")).replace(/\.[^./]+$/, "");
42
+ };
43
+ export const dropNoteExtension = (target) => target.replace(/\.(md|markdown)$/i, "");
44
+ /** `msg:…` written in the text with no link syntax around it. */
45
+ export const bareReferences = (body) => [...body.matchAll(BARE_REFERENCE)].map((match) => ({
46
+ target: (match[1] ?? "").replace(/[.,;:!?]+$/, ""),
47
+ anchor: null,
48
+ label: null,
49
+ }));
50
+ export const dedupe = (links) => {
51
+ const seen = new Set();
52
+ return links
53
+ .filter((link) => {
54
+ const key = `${link.target}\u0000${link.anchor ?? ""}\u0000${link.label ?? ""}`;
55
+ if (seen.has(key))
56
+ return false;
57
+ seen.add(key);
58
+ return true;
59
+ })
60
+ .slice(0, MAX_LINKS);
61
+ };
62
+ export const parsedNote = (frontMatter, body, path, links, inlineTags = []) => ({
63
+ title: titleOf(frontMatter, body, path),
64
+ aliases: frontMatterAliases(frontMatter),
65
+ tags: [...new Set([...frontMatterTags(frontMatter), ...inlineTags])],
66
+ links: dedupe(links),
67
+ frontMatter,
68
+ });
69
+ export const renderNote = (note, link) => {
70
+ const frontMatter = {
71
+ ...note.frontMatter,
72
+ ...(note.aliases.length ? { aliases: note.aliases } : {}),
73
+ ...(note.tags.length ? { tags: note.tags } : {}),
74
+ };
75
+ const head = Object.keys(frontMatter).length ? `---\n${stringify(frontMatter).trimEnd()}\n---\n` : "";
76
+ const links = note.links.length ? `\n\n${note.links.map((item) => `- ${link(item)}`).join("\n")}` : "";
77
+ return `${head}# ${note.title}\n\n${note.text.trimEnd()}${links}\n`;
78
+ };
79
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/notes/dialects/common.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { DialectName, NoteDialect } from "./types.js";
2
+ export declare const dialectOf: (name?: DialectName) => NoteDialect;
3
+ export type { DialectName, NoteDialect, NoteForExport, NoteLink, ParsedNote } from "./types.js";
4
+ export { DIALECTS } from "./types.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/notes/dialects/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAI1D,eAAO,MAAM,SAAS,UAAU,WAAW,KAAgB,WAA4B,CAAA;AAEvF,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC/F,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { markdown } from "./markdown.js";
2
+ import { obsidian } from "./obsidian.js";
3
+ const BY_NAME = { obsidian, markdown };
4
+ export const dialectOf = (name = "obsidian") => BY_NAME[name];
5
+ export { DIALECTS } from "./types.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/notes/dialects/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAGxC,MAAM,OAAO,GAAqC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;AAExE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAI,GAAgB,UAAU,EAAe,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAGvF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,7 @@
1
+ import type { NoteDialect, NoteLink } from "./types.js";
2
+ /** `[label](path.md#Heading)` and `[label](person:…)`; web links are not notes and are left out. */
3
+ export declare const markdownLinks: (body: string) => NoteLink[];
4
+ export declare const stripMarkdownLinks: (body: string) => string;
5
+ export declare const markdownLink: (link: NoteLink) => string;
6
+ export declare const markdown: NoteDialect;
7
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../src/notes/dialects/markdown.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AA4BvD,oGAAoG;AACpG,eAAO,MAAM,aAAa,SAAU,MAAM,KAAG,QAAQ,EAGC,CAAA;AAEtD,eAAO,MAAM,kBAAkB,SAAU,MAAM,KAAG,MAAiC,CAAA;AAKnF,eAAO,MAAM,YAAY,SAAU,QAAQ,KAAG,MAK7C,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,WAQtB,CAAA"}
@@ -0,0 +1,51 @@
1
+ import { NOTE_EXTENSIONS } from "../files.js";
2
+ import { bareReferences, dropNoteExtension, isReference, parsedNote, renderNote, splitFrontMatter, withoutCode, } from "./common.js";
3
+ const LINK = /(?<!!)\[([^\]\n]*)\]\(\s*(<[^>\n]+>|[^)\s]+)(?:\s+"[^"\n]*")?\s*\)/g;
4
+ const SCHEME = /^[a-z][a-z0-9+.-]*:/i;
5
+ const decode = (value) => {
6
+ try {
7
+ return decodeURIComponent(value);
8
+ }
9
+ catch {
10
+ return value;
11
+ }
12
+ };
13
+ const linkOf = (label, destination) => {
14
+ const angled = destination.startsWith("<") && destination.endsWith(">");
15
+ const raw = angled ? destination.slice(1, -1) : destination;
16
+ if (isReference(raw))
17
+ return { target: raw, anchor: null, label: label.trim() || null };
18
+ if (SCHEME.test(raw))
19
+ return null;
20
+ const hash = raw.indexOf("#");
21
+ const path = hash < 0 ? raw : raw.slice(0, hash);
22
+ const fragment = hash < 0 ? null : raw.slice(hash + 1);
23
+ return {
24
+ target: dropNoteExtension(angled ? path : decode(path)).trim(),
25
+ anchor: fragment === null ? null : `#${angled ? fragment : decode(fragment)}`,
26
+ label: label.trim() || null,
27
+ };
28
+ };
29
+ /** `[label](path.md#Heading)` and `[label](person:…)`; web links are not notes and are left out. */
30
+ export const markdownLinks = (body) => [...withoutCode(body).matchAll(LINK)]
31
+ .map((match) => linkOf(match[1] ?? "", match[2] ?? ""))
32
+ .filter((link) => link !== null);
33
+ export const stripMarkdownLinks = (body) => body.replace(LINK, " ");
34
+ const hasOwnExtension = (target) => NOTE_EXTENSIONS.some((extension) => target.toLowerCase().endsWith(extension));
35
+ export const markdownLink = (link) => {
36
+ if (isReference(link.target))
37
+ return `[${link.label ?? link.target}](${link.target})`;
38
+ const file = hasOwnExtension(link.target) ? link.target : `${link.target}.md`;
39
+ const label = link.label ?? link.target.split("/").pop() ?? link.target;
40
+ return `[${label}](<${file}${link.anchor ?? ""}>)`;
41
+ };
42
+ export const markdown = {
43
+ name: "markdown",
44
+ parse(text, path) {
45
+ const { frontMatter, body } = splitFrontMatter(text);
46
+ const links = markdownLinks(body);
47
+ return parsedNote(frontMatter, body, path, [...links, ...bareReferences(withoutCode(stripMarkdownLinks(body)))]);
48
+ },
49
+ render: (note) => renderNote(note, markdownLink),
50
+ };
51
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/notes/dialects/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { NoteDialect, NoteLink } from "./types.js";
2
+ export declare const wikiLinks: (body: string) => NoteLink[];
3
+ /** Obsidian reads `#tag` anywhere in the text except code, links and headings. */
4
+ export declare const inlineTags: (body: string) => string[];
5
+ export declare const obsidian: NoteDialect;
6
+ //# sourceMappingURL=obsidian.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsidian.d.ts","sourceRoot":"","sources":["../../../src/notes/dialects/obsidian.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAKvD,eAAO,MAAM,SAAS,SAAU,MAAM,KAAG,QAAQ,EAW7C,CAAA;AAEJ,kFAAkF;AAClF,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,MAAM,EAI/C,CAAA;AAOD,eAAO,MAAM,QAAQ,EAAE,WActB,CAAA"}
@@ -0,0 +1,33 @@
1
+ import { bareReferences, dropNoteExtension, isReference, parsedNote, renderNote, splitFrontMatter, withoutCode, } from "./common.js";
2
+ import { markdownLink, markdownLinks, stripMarkdownLinks } from "./markdown.js";
3
+ const WIKI = /!?\[\[([^\]|\n]+)(?:\|([^\]\n]*))?\]\]/g;
4
+ const TAG = /(?<![\p{L}\p{N}_#&/])#([\p{L}_][\p{L}\p{N}_/-]*)/gu;
5
+ export const wikiLinks = (body) => [...withoutCode(body).matchAll(WIKI)].map((match) => {
6
+ const raw = (match[1] ?? "").trim();
7
+ const label = match[2]?.trim() || null;
8
+ if (isReference(raw))
9
+ return { target: raw, anchor: null, label };
10
+ const split = raw.search(/[#^]/);
11
+ return {
12
+ target: dropNoteExtension(split < 0 ? raw : raw.slice(0, split)).trim(),
13
+ anchor: split < 0 ? null : raw.slice(split),
14
+ label,
15
+ };
16
+ });
17
+ /** Obsidian reads `#tag` anywhere in the text except code, links and headings. */
18
+ export const inlineTags = (body) => [
19
+ ...new Set([...stripMarkdownLinks(withoutCode(body).replace(WIKI, " ")).matchAll(TAG)].map((match) => match[1] ?? "")),
20
+ ];
21
+ const wikiLink = (link) => isReference(link.target)
22
+ ? markdownLink(link)
23
+ : `[[${link.target}${link.anchor ?? ""}${link.label ? `|${link.label}` : ""}]]`;
24
+ export const obsidian = {
25
+ name: "obsidian",
26
+ parse(text, path) {
27
+ const { frontMatter, body } = splitFrontMatter(text);
28
+ const rest = stripMarkdownLinks(withoutCode(body).replace(WIKI, " "));
29
+ return parsedNote(frontMatter, body, path, [...wikiLinks(body), ...markdownLinks(body), ...bareReferences(rest)], inlineTags(body));
30
+ },
31
+ render: (note) => renderNote(note, wikiLink),
32
+ };
33
+ //# sourceMappingURL=obsidian.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsidian.js","sourceRoot":"","sources":["../../../src/notes/dialects/obsidian.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * What a note says, in no editor's syntax. A dialect turns a file into this and back; nothing above
3
+ * the dialect ever sees `[[…]]` or `[…](…)`.
4
+ */
5
+ export interface NoteLink {
6
+ /**
7
+ * A note as written, extension dropped (`People/Rin`, `../Rin`), or a typed reference
8
+ * (`person:…`, `msg:…`) when the link names a record instead of a file.
9
+ */
10
+ target: string;
11
+ /** `#Heading` or `#^block`, when the link points inside the note. */
12
+ anchor: string | null;
13
+ label: string | null;
14
+ }
15
+ export interface ParsedNote {
16
+ title: string;
17
+ aliases: string[];
18
+ /** As written, without `#`; a nested Obsidian tag keeps its `/`. */
19
+ tags: string[];
20
+ links: NoteLink[];
21
+ frontMatter: Record<string, unknown>;
22
+ }
23
+ export interface NoteForExport {
24
+ title: string;
25
+ text: string;
26
+ aliases: string[];
27
+ tags: string[];
28
+ /** Links the text does not already carry; written after it. */
29
+ links: NoteLink[];
30
+ frontMatter: Record<string, unknown>;
31
+ }
32
+ export declare const DIALECTS: readonly ["obsidian", "markdown"];
33
+ export type DialectName = (typeof DIALECTS)[number];
34
+ export interface NoteDialect {
35
+ name: DialectName;
36
+ parse(text: string, path: string): ParsedNote;
37
+ render(note: NoteForExport): string;
38
+ }
39
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/notes/dialects/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAA;IACd,qEAAqE;IACrE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,oEAAoE;IACpE,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,+DAA+D;IAC/D,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED,eAAO,MAAM,QAAQ,YAAI,UAAU,EAAE,UAAU,CAAU,CAAA;AACzD,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAA;AAEnD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAA;IACjB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAA;IAC7C,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAAA;CACpC"}
@@ -0,0 +1,2 @@
1
+ export const DIALECTS = ["obsidian", "markdown"];
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/notes/dialects/types.ts"],"names":[],"mappings":"AAkCA,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,UAAU,EAAE,UAAU,CAAU,CAAA"}
@@ -0,0 +1,51 @@
1
+ import type { AccountKey, MessageStore } from "@wirecat/cli-messaging/store";
2
+ /** About three chunks a second with e5-small on this laptop (2026-10-06): a run stays near three minutes, under a five-minute timer, and the next resumes. */
3
+ export declare const EMBED_PER_RUN = 600;
4
+ export interface NotesEmbedded {
5
+ chats: number;
6
+ chunks: number;
7
+ /** Chunks left for the next run, when the run's bound stopped it. */
8
+ left: boolean;
9
+ /** Why nothing was embedded, when nothing could be. */
10
+ notEmbedded?: string;
11
+ pendingChats?: string[];
12
+ }
13
+ /**
14
+ * Builds each chat's conversations (one per note) — what search by words and by meaning both read — and,
15
+ * unless `embed` is off, embeds the chunks that have no vector yet. Chunks are
16
+ * keyed by their text's hash, so an unchanged note is never embedded twice. A missing model is reported,
17
+ * never downloaded.
18
+ */
19
+ export declare const embedNotes: (store: MessageStore, key: AccountKey, chats: string[], { maxChunks, embed, env, }?: {
20
+ maxChunks?: number;
21
+ embed?: boolean;
22
+ env?: NodeJS.ProcessEnv;
23
+ }) => Promise<NotesEmbedded>;
24
+ /**
25
+ * Embeds what changed since the last run, and whatever an earlier run left. The folders waiting are kept in
26
+ * the store's sync state, so a run stopped by its bound, or a missing model, picks up next time; the first run
27
+ * after embedding exists takes every folder already stored.
28
+ */
29
+ export declare const embedChanged: (store: MessageStore, key: AccountKey, changed: string[], options?: {
30
+ maxChunks?: number;
31
+ maxChats?: number;
32
+ embed?: boolean;
33
+ env?: NodeJS.ProcessEnv;
34
+ }) => Promise<NotesEmbedded>;
35
+ export interface NoteChunksEmbedded {
36
+ chunks: number;
37
+ /** Chunks left for the next run, when the run's bound stopped it. */
38
+ left: boolean;
39
+ /** Why nothing was embedded, when nothing could be. */
40
+ notEmbedded?: string;
41
+ }
42
+ /**
43
+ * Embeds the notes' chunks that have no vector yet, for search by meaning. Bounded like mail, so a
44
+ * timer run stays short and the next continues. A missing model is reported, never downloaded.
45
+ */
46
+ export declare const embedNoteChunks: (store: MessageStore, { maxChunks, embed, env, }?: {
47
+ maxChunks?: number;
48
+ embed?: boolean;
49
+ env?: NodeJS.ProcessEnv;
50
+ }) => Promise<NoteChunksEmbedded>;
51
+ //# sourceMappingURL=embed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.d.ts","sourceRoot":"","sources":["../../src/notes/embed.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAG5E,8JAA8J;AAC9J,eAAO,MAAM,aAAa,MAAM,CAAA;AAEhC,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,qEAAqE;IACrE,IAAI,EAAE,OAAO,CAAA;IACb,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CACxB;AAKD;;;;;GAKG;AACH,eAAO,MAAM,UAAU,UACd,YAAY,OACd,UAAU,SACR,MAAM,EAAE,+BAKZ;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KAClE,OAAO,CAAC,aAAa,CA4CvB,CAAA;AAID;;;;GAIG;AACH,eAAO,MAAM,YAAY,UAChB,YAAY,OACd,UAAU,WACN,MAAM,EAAE,YACR;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KAC3F,OAAO,CAAC,aAAa,CAoBvB,CAAA;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,qEAAqE;IACrE,IAAI,EAAE,OAAO,CAAA;IACb,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,UACnB,YAAY,+BAKhB;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KAClE,OAAO,CAAC,kBAAkB,CAa5B,CAAA"}