@runcore-sh/runcore 0.1.9 → 0.1.10

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 (63) hide show
  1. package/dist/cli.js +232 -11
  2. package/dist/cli.js.map +1 -1
  3. package/dist/files/deep-index.d.ts +59 -0
  4. package/dist/files/deep-index.d.ts.map +1 -0
  5. package/dist/files/deep-index.js +337 -0
  6. package/dist/files/deep-index.js.map +1 -0
  7. package/dist/files/import.d.ts +44 -0
  8. package/dist/files/import.d.ts.map +1 -0
  9. package/dist/files/import.js +213 -0
  10. package/dist/files/import.js.map +1 -0
  11. package/dist/files/index-local.d.ts +37 -0
  12. package/dist/files/index-local.d.ts.map +1 -0
  13. package/dist/files/index-local.js +198 -0
  14. package/dist/files/index-local.js.map +1 -0
  15. package/dist/nerve/state.d.ts +1 -1
  16. package/dist/nerve/state.d.ts.map +1 -1
  17. package/dist/nerve/state.js +1 -1
  18. package/dist/nerve/state.js.map +1 -1
  19. package/dist/posture/engine.d.ts +41 -0
  20. package/dist/posture/engine.d.ts.map +1 -0
  21. package/dist/posture/engine.js +217 -0
  22. package/dist/posture/engine.js.map +1 -0
  23. package/dist/posture/index.d.ts +11 -0
  24. package/dist/posture/index.d.ts.map +1 -0
  25. package/dist/posture/index.js +10 -0
  26. package/dist/posture/index.js.map +1 -0
  27. package/dist/posture/middleware.d.ts +30 -0
  28. package/dist/posture/middleware.d.ts.map +1 -0
  29. package/dist/posture/middleware.js +92 -0
  30. package/dist/posture/middleware.js.map +1 -0
  31. package/dist/posture/types.d.ts +61 -0
  32. package/dist/posture/types.d.ts.map +1 -0
  33. package/dist/posture/types.js +48 -0
  34. package/dist/posture/types.js.map +1 -0
  35. package/dist/server.d.ts +3 -1
  36. package/dist/server.d.ts.map +1 -1
  37. package/dist/server.js +191 -45
  38. package/dist/server.js.map +1 -1
  39. package/dist/tier/bond.d.ts +51 -0
  40. package/dist/tier/bond.d.ts.map +1 -0
  41. package/dist/tier/bond.js +154 -0
  42. package/dist/tier/bond.js.map +1 -0
  43. package/dist/tier/freeze.d.ts +21 -0
  44. package/dist/tier/freeze.d.ts.map +1 -0
  45. package/dist/tier/freeze.js +73 -0
  46. package/dist/tier/freeze.js.map +1 -0
  47. package/dist/tier/gate.d.ts +11 -0
  48. package/dist/tier/gate.d.ts.map +1 -0
  49. package/dist/tier/gate.js +25 -0
  50. package/dist/tier/gate.js.map +1 -0
  51. package/dist/tier/heartbeat.d.ts +22 -0
  52. package/dist/tier/heartbeat.d.ts.map +1 -0
  53. package/dist/tier/heartbeat.js +128 -0
  54. package/dist/tier/heartbeat.js.map +1 -0
  55. package/dist/tier/token.d.ts +22 -0
  56. package/dist/tier/token.d.ts.map +1 -0
  57. package/dist/tier/token.js +100 -0
  58. package/dist/tier/token.js.map +1 -0
  59. package/dist/tier/types.d.ts +44 -0
  60. package/dist/tier/types.d.ts.map +1 -0
  61. package/dist/tier/types.js +61 -0
  62. package/dist/tier/types.js.map +1 -0
  63. package/package.json +1 -1
@@ -0,0 +1,337 @@
1
+ /**
2
+ * Deep indexing — background worker for thorough document understanding.
3
+ *
4
+ * Runs after the fast pass (index-local.ts) completes. Processes files
5
+ * through local Ollama at whatever pace the device allows.
6
+ *
7
+ * Pipeline:
8
+ * 1. Entity extraction — people, projects, dates, organizations
9
+ * 2. Theme discovery — recurring topics across documents
10
+ * 3. Cross-referencing — connections between imported docs and existing memory
11
+ * 4. Flags — documents needing human review (conflicts, outdated info)
12
+ *
13
+ * Results feed the nerve state:
14
+ * - Work dot goes green during processing
15
+ * - Joy dot goes green when patterns emerge
16
+ *
17
+ * All processing local. Membrane protects any outbound call.
18
+ */
19
+ import { readFile, writeFile } from "node:fs/promises";
20
+ import { join, resolve, extname } from "node:path";
21
+ import { existsSync } from "node:fs";
22
+ import { createLogger } from "../utils/logger.js";
23
+ const log = createLogger("deep-index");
24
+ const BRAIN_DIR = resolve(process.cwd(), "brain");
25
+ const DEEP_MANIFEST_PATH = join(BRAIN_DIR, ".core", "deep-index.json");
26
+ // ── State ────────────────────────────────────────────────────────────────────
27
+ let running = false;
28
+ let progress = { total: 0, done: 0, phase: "idle" };
29
+ export function getDeepIndexProgress() {
30
+ return { ...progress, running };
31
+ }
32
+ // ── Ollama helper ────────────────────────────────────────────────────────────
33
+ async function askOllama(prompt, system) {
34
+ const { streamChatLocal } = await import("../llm/ollama.js");
35
+ const chunks = [];
36
+ await new Promise((res, rej) => {
37
+ streamChatLocal({
38
+ messages: [
39
+ { role: "system", content: system },
40
+ { role: "user", content: prompt },
41
+ ],
42
+ model: "auto",
43
+ onToken: (t) => { chunks.push(t); },
44
+ onDone: () => res(),
45
+ onError: (e) => rej(e),
46
+ });
47
+ });
48
+ return chunks.join("");
49
+ }
50
+ // ── Load / Save ──────────────────────────────────────────────────────────────
51
+ async function loadDeepManifest() {
52
+ try {
53
+ const raw = await readFile(DEEP_MANIFEST_PATH, "utf-8");
54
+ return JSON.parse(raw);
55
+ }
56
+ catch {
57
+ return { deepIndexed: [], lastRun: "", entities: [], themes: [], crossRefs: [], flags: [] };
58
+ }
59
+ }
60
+ async function saveDeepManifest(manifest) {
61
+ await writeFile(DEEP_MANIFEST_PATH, JSON.stringify(manifest, null, 2), "utf-8");
62
+ }
63
+ // ── Entity extraction ────────────────────────────────────────────────────────
64
+ async function extractEntities(content, filePath) {
65
+ try {
66
+ const truncated = content.length > 3000 ? content.slice(0, 3000) : content;
67
+ const response = await askOllama(truncated, `Extract named entities from this document. Return one per line in format:
68
+ TYPE|NAME|CONTEXT
69
+ Where TYPE is person, org, project, date, place, or concept.
70
+ CONTEXT is the sentence where it appears (abbreviated).
71
+ Only return entities, nothing else. If none found, return NONE.`);
72
+ if (response.trim() === "NONE" || !response.trim())
73
+ return [];
74
+ return response.trim().split("\n")
75
+ .map(line => {
76
+ const parts = line.split("|").map(p => p.trim());
77
+ if (parts.length < 2)
78
+ return null;
79
+ const type = parts[0].toLowerCase();
80
+ if (!["person", "org", "project", "date", "place", "concept"].includes(type))
81
+ return null;
82
+ return {
83
+ name: parts[1],
84
+ type,
85
+ source: filePath,
86
+ context: parts[2] || "",
87
+ };
88
+ })
89
+ .filter((e) => e !== null);
90
+ }
91
+ catch {
92
+ return [];
93
+ }
94
+ }
95
+ // ── Theme discovery ──────────────────────────────────────────────────────────
96
+ async function discoverThemes(fileSummaries) {
97
+ if (fileSummaries.length < 2)
98
+ return [];
99
+ try {
100
+ const combined = fileSummaries
101
+ .map((f, i) => `[${i + 1}] ${f.path}: ${f.summary}`)
102
+ .join("\n");
103
+ const truncated = combined.length > 4000 ? combined.slice(0, 4000) : combined;
104
+ const response = await askOllama(truncated, `These are summaries of documents in a personal knowledge base. Identify 1-5 recurring themes.
105
+ For each theme, return one line:
106
+ THEME|CONFIDENCE|DOCUMENT_NUMBERS|ONE_SENTENCE_SUMMARY
107
+ CONFIDENCE is 0.0-1.0. DOCUMENT_NUMBERS are comma-separated [N] references.
108
+ Only return themes, nothing else. If no clear themes, return NONE.`);
109
+ if (response.trim() === "NONE" || !response.trim())
110
+ return [];
111
+ return response.trim().split("\n")
112
+ .map(line => {
113
+ const parts = line.split("|").map(p => p.trim());
114
+ if (parts.length < 3)
115
+ return null;
116
+ const confidence = parseFloat(parts[1]);
117
+ if (isNaN(confidence))
118
+ return null;
119
+ // Resolve document numbers to file paths
120
+ const docNums = parts[2].match(/\d+/g)?.map(n => parseInt(n) - 1) || [];
121
+ const sources = docNums
122
+ .filter(n => n >= 0 && n < fileSummaries.length)
123
+ .map(n => fileSummaries[n].path);
124
+ return {
125
+ label: parts[0],
126
+ confidence: Math.min(1, Math.max(0, confidence)),
127
+ sources,
128
+ summary: parts[3] || parts[0],
129
+ };
130
+ })
131
+ .filter((t) => t !== null);
132
+ }
133
+ catch {
134
+ return [];
135
+ }
136
+ }
137
+ // ── Cross-referencing ────────────────────────────────────────────────────────
138
+ async function findCrossRefs(fileSummaries) {
139
+ if (fileSummaries.length < 2)
140
+ return [];
141
+ try {
142
+ const combined = fileSummaries
143
+ .map((f, i) => `[${i + 1}] ${f.path}: ${f.summary}`)
144
+ .join("\n");
145
+ const truncated = combined.length > 4000 ? combined.slice(0, 4000) : combined;
146
+ const response = await askOllama(truncated, `These are summaries from a knowledge base. Find connections between documents.
147
+ For each connection, return one line:
148
+ SOURCE_NUM|TARGET_NUM|RELATIONSHIP|DETAIL
149
+ RELATIONSHIP is: mentions, extends, contradicts, or updates.
150
+ Only return connections, nothing else. Max 10. If none, return NONE.`);
151
+ if (response.trim() === "NONE" || !response.trim())
152
+ return [];
153
+ return response.trim().split("\n")
154
+ .slice(0, 10)
155
+ .map(line => {
156
+ const parts = line.split("|").map(p => p.trim());
157
+ if (parts.length < 3)
158
+ return null;
159
+ const src = parseInt(parts[0]) - 1;
160
+ const tgt = parseInt(parts[1]) - 1;
161
+ if (isNaN(src) || isNaN(tgt) || src < 0 || tgt < 0)
162
+ return null;
163
+ if (src >= fileSummaries.length || tgt >= fileSummaries.length)
164
+ return null;
165
+ return {
166
+ sourceFile: fileSummaries[src].path,
167
+ targetFile: fileSummaries[tgt].path,
168
+ relationship: parts[2],
169
+ detail: parts[3] || "",
170
+ };
171
+ })
172
+ .filter((r) => r !== null);
173
+ }
174
+ catch {
175
+ return [];
176
+ }
177
+ }
178
+ // ── Document flagging ────────────────────────────────────────────────────────
179
+ async function flagDocument(content, filePath) {
180
+ // Quick heuristic checks (no LLM needed)
181
+ const lines = content.split("\n");
182
+ // Check for old dates (more than 2 years ago)
183
+ const yearMatch = content.match(/\b(20[0-1]\d|19\d{2})\b/);
184
+ if (yearMatch) {
185
+ const year = parseInt(yearMatch[1]);
186
+ if (year < new Date().getFullYear() - 2) {
187
+ return { file: filePath, reason: `References year ${year} — may be outdated`, type: "outdated" };
188
+ }
189
+ }
190
+ // Check for TODO/FIXME/INCOMPLETE markers
191
+ if (/\b(TODO|FIXME|INCOMPLETE|DRAFT|WIP)\b/i.test(content)) {
192
+ return { file: filePath, reason: "Contains TODO/FIXME/DRAFT markers", type: "incomplete" };
193
+ }
194
+ return null;
195
+ }
196
+ // ── Main deep index ──────────────────────────────────────────────────────────
197
+ export async function runDeepIndex(options) {
198
+ if (running) {
199
+ log.info("Deep indexing already running — skipping");
200
+ return { entities: [], themes: [], crossRefs: [], flags: [], filesProcessed: 0 };
201
+ }
202
+ running = true;
203
+ const batchSize = options?.batchSize ?? 30;
204
+ try {
205
+ // Load manifests
206
+ const deepManifest = await loadDeepManifest();
207
+ const alreadyDeep = new Set(deepManifest.deepIndexed);
208
+ // Load import manifest for file list
209
+ const importManifestPath = join(BRAIN_DIR, ".core", "import-manifest.json");
210
+ if (!existsSync(importManifestPath)) {
211
+ return { entities: [], themes: [], crossRefs: [], flags: [], filesProcessed: 0 };
212
+ }
213
+ const importManifest = JSON.parse(await readFile(importManifestPath, "utf-8"));
214
+ const importedFiles = importManifest.files || [];
215
+ // Filter to unprocessed text files
216
+ const textExts = new Set([".md", ".txt", ".yaml", ".yml", ".json", ".csv"]);
217
+ const toProcess = importedFiles
218
+ .filter(f => !alreadyDeep.has(f.destination))
219
+ .filter(f => textExts.has(extname(f.destination).toLowerCase()))
220
+ .slice(0, batchSize);
221
+ if (toProcess.length === 0) {
222
+ running = false;
223
+ return { entities: [], themes: [], crossRefs: [], flags: [], filesProcessed: 0 };
224
+ }
225
+ progress = { total: toProcess.length, done: 0, phase: "entities" };
226
+ log.info(`Deep indexing ${toProcess.length} files...`);
227
+ // Notify nerve state
228
+ const { appendBrainLine } = await import("../lib/brain-io.js");
229
+ const notifPath = join(BRAIN_DIR, "operations", "notifications.jsonl");
230
+ await appendBrainLine(notifPath, JSON.stringify({
231
+ timestamp: new Date().toISOString(),
232
+ message: `Deep indexing started: ${toProcess.length} files`,
233
+ source: "deep-index",
234
+ }));
235
+ // Phase 1: Read files and extract entities
236
+ const allEntities = [];
237
+ const fileSummaries = [];
238
+ const allFlags = [];
239
+ for (const file of toProcess) {
240
+ const fullPath = join(BRAIN_DIR, file.destination);
241
+ if (!existsSync(fullPath)) {
242
+ deepManifest.deepIndexed.push(file.destination);
243
+ continue;
244
+ }
245
+ try {
246
+ const content = await readFile(fullPath, "utf-8");
247
+ if (!content.trim())
248
+ continue;
249
+ // Extract entities
250
+ const entities = await extractEntities(content, file.destination);
251
+ allEntities.push(...entities);
252
+ // Build summary for theme/cross-ref analysis
253
+ const firstLines = content.split("\n").filter(l => l.trim()).slice(0, 5).join(" ");
254
+ fileSummaries.push({
255
+ path: file.destination,
256
+ summary: firstLines.slice(0, 300),
257
+ });
258
+ // Flag checks
259
+ const flag = await flagDocument(content, file.destination);
260
+ if (flag)
261
+ allFlags.push(flag);
262
+ deepManifest.deepIndexed.push(file.destination);
263
+ progress.done++;
264
+ }
265
+ catch (err) {
266
+ log.warn(`Deep index failed for ${file.destination}: ${err instanceof Error ? err.message : String(err)}`);
267
+ }
268
+ }
269
+ // Phase 2: Theme discovery (across all files)
270
+ progress.phase = "themes";
271
+ const themes = await discoverThemes(fileSummaries);
272
+ // Phase 3: Cross-referencing
273
+ progress.phase = "cross-refs";
274
+ const crossRefs = await findCrossRefs(fileSummaries);
275
+ // Store results
276
+ deepManifest.entities.push(...allEntities);
277
+ deepManifest.themes = mergeThemes(deepManifest.themes, themes);
278
+ deepManifest.crossRefs.push(...crossRefs);
279
+ deepManifest.flags.push(...allFlags);
280
+ deepManifest.lastRun = new Date().toISOString();
281
+ await saveDeepManifest(deepManifest);
282
+ // Write entities to semantic memory
283
+ const semanticPath = join(BRAIN_DIR, "memory", "semantic.jsonl");
284
+ for (const entity of allEntities) {
285
+ await appendBrainLine(semanticPath, JSON.stringify({
286
+ id: `entity_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`,
287
+ type: "semantic",
288
+ content: `${entity.type}: ${entity.name} — ${entity.context}`,
289
+ meta: { source: entity.source, entityType: entity.type, importedFrom: "deep-index" },
290
+ createdAt: new Date().toISOString(),
291
+ }));
292
+ }
293
+ // Notify completion
294
+ const discoveryCount = themes.length + crossRefs.length;
295
+ await appendBrainLine(notifPath, JSON.stringify({
296
+ timestamp: new Date().toISOString(),
297
+ message: `Deep indexing complete: ${allEntities.length} entities, ${themes.length} themes, ${crossRefs.length} connections, ${allFlags.length} flags`,
298
+ source: "deep-index",
299
+ }));
300
+ if (discoveryCount > 0) {
301
+ log.info(`Deep index discoveries: ${themes.length} themes, ${crossRefs.length} cross-refs`);
302
+ }
303
+ progress = { total: 0, done: 0, phase: "idle" };
304
+ running = false;
305
+ return {
306
+ entities: allEntities,
307
+ themes,
308
+ crossRefs,
309
+ flags: allFlags,
310
+ filesProcessed: toProcess.length,
311
+ };
312
+ }
313
+ catch (err) {
314
+ running = false;
315
+ progress = { total: 0, done: 0, phase: "idle" };
316
+ log.error("Deep indexing failed", { error: err instanceof Error ? err.message : String(err) });
317
+ throw err;
318
+ }
319
+ }
320
+ /** Merge new themes with existing, deduplicating by label similarity. */
321
+ function mergeThemes(existing, incoming) {
322
+ const merged = [...existing];
323
+ for (const theme of incoming) {
324
+ const match = merged.find(t => t.label.toLowerCase() === theme.label.toLowerCase());
325
+ if (match) {
326
+ // Merge sources
327
+ const allSources = new Set([...match.sources, ...theme.sources]);
328
+ match.sources = Array.from(allSources);
329
+ match.confidence = Math.max(match.confidence, theme.confidence);
330
+ }
331
+ else {
332
+ merged.push(theme);
333
+ }
334
+ }
335
+ return merged;
336
+ }
337
+ //# sourceMappingURL=deep-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-index.js","sourceRoot":"","sources":["../../src/files/deep-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;AACvC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;AAgDlD,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAEvE,gFAAgF;AAEhF,IAAI,OAAO,GAAG,KAAK,CAAC;AACpB,IAAI,QAAQ,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAgB,EAAE,CAAC;AAE9D,MAAM,UAAU,oBAAoB;IAClC,OAAO,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,CAAC;AAClC,CAAC;AAED,gFAAgF;AAEhF,KAAK,UAAU,SAAS,CAAC,MAAc,EAAE,MAAc;IACrD,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,IAAI,OAAO,CAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACnC,eAAe,CAAC;YACd,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE;gBACnC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;aAClC;YACD,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE;YACnB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,gFAAgF;AAEhF,KAAK,UAAU,gBAAgB;IAC7B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC9F,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,QAAsB;IACpD,MAAM,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAClF,CAAC;AAED,gFAAgF;AAEhF,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,QAAgB;IAC9D,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC3E,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,SAAS,EACxC;;;;gEAI0D,CAC3D,CAAC;QAEF,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YAAE,OAAO,EAAE,CAAC;QAE9D,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;aAC/B,GAAG,CAAC,IAAI,CAAC,EAAE;YACV,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACjD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAoB,CAAC;YACtD,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC1F,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;gBACd,IAAI;gBACJ,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;aACxB,CAAC;QACJ,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,KAAK,UAAU,cAAc,CAC3B,aAAkD;IAElD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,aAAa;aAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aACnD,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAE9E,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,SAAS,EACxC;;;;mEAI6D,CAC9D,CAAC;QAEF,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YAAE,OAAO,EAAE,CAAC;QAE9D,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;aAC/B,GAAG,CAAC,IAAI,CAAC,EAAE;YACV,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACjD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClC,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,UAAU,CAAC;gBAAE,OAAO,IAAI,CAAC;YAEnC,yCAAyC;YACzC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACxE,MAAM,OAAO,GAAG,OAAO;iBACpB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC;iBAC/C,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAEnC,OAAO;gBACL,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;gBACf,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;gBAChD,OAAO;gBACP,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;aAC9B,CAAC;QACJ,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAc,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,KAAK,UAAU,aAAa,CAC1B,aAAkD;IAElD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,aAAa;aAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aACnD,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAE9E,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,SAAS,EACxC;;;;qEAI+D,CAChE,CAAC;QAEF,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YAAE,OAAO,EAAE,CAAC;QAE9D,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;aAC/B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;aACZ,GAAG,CAAC,IAAI,CAAC,EAAE;YACV,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACjD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YAChE,IAAI,GAAG,IAAI,aAAa,CAAC,MAAM,IAAI,GAAG,IAAI,aAAa,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YAE5E,OAAO;gBACL,UAAU,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI;gBACnC,UAAU,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI;gBACnC,YAAY,EAAE,KAAK,CAAC,CAAC,CAA6B;gBAClD,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;aACvB,CAAC;QACJ,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAiB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,QAAgB;IAC3D,yCAAyC;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,8CAA8C;IAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC3D,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC;YACxC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,mBAAmB,IAAI,oBAAoB,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QACnG,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,IAAI,wCAAwC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,mCAAmC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAC7F,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAElC;IACC,IAAI,OAAO,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACrD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;IACnF,CAAC;IAED,OAAO,GAAG,IAAI,CAAC;IACf,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,EAAE,CAAC;IAE3C,IAAI,CAAC;QACH,iBAAiB;QACjB,MAAM,YAAY,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAC9C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAEtD,qCAAqC;QACrC,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,sBAAsB,CAAC,CAAC;QAC5E,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;QACnF,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,CAAC;QAC/E,MAAM,aAAa,GAAgD,cAAc,CAAC,KAAK,IAAI,EAAE,CAAC;QAE9F,mCAAmC;QACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5E,MAAM,SAAS,GAAG,aAAa;aAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;aAC5C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;aAC/D,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAEvB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,GAAG,KAAK,CAAC;YAChB,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;QACnF,CAAC;QAED,QAAQ,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QACnE,GAAG,CAAC,IAAI,CAAC,iBAAiB,SAAS,CAAC,MAAM,WAAW,CAAC,CAAC;QAEvD,qBAAqB;QACrB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,qBAAqB,CAAC,CAAC;QACvE,MAAM,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;YAC9C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,0BAA0B,SAAS,CAAC,MAAM,QAAQ;YAC3D,MAAM,EAAE,YAAY;SACrB,CAAC,CAAC,CAAC;QAEJ,2CAA2C;QAC3C,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,aAAa,GAAwC,EAAE,CAAC;QAC9D,MAAM,QAAQ,GAAW,EAAE,CAAC;QAE5B,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACnD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1B,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAChD,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;oBAAE,SAAS;gBAE9B,mBAAmB;gBACnB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBAClE,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;gBAE9B,6CAA6C;gBAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnF,aAAa,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAE,IAAI,CAAC,WAAW;oBACtB,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;iBAClC,CAAC,CAAC;gBAEH,cAAc;gBACd,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC3D,IAAI,IAAI;oBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAE9B,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAChD,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,IAAI,CAAC,yBAAyB,IAAI,CAAC,WAAW,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7G,CAAC;QACH,CAAC;QAED,8CAA8C;QAC9C,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,CAAC;QAEnD,6BAA6B;QAC7B,QAAQ,CAAC,KAAK,GAAG,YAAY,CAAC;QAC9B,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;QAErD,gBAAgB;QAChB,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;QAC3C,YAAY,CAAC,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/D,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;QAC1C,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QACrC,YAAY,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAErC,oCAAoC;QACpC,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QACjE,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,MAAM,eAAe,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC;gBACjD,EAAE,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;gBACjF,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,OAAO,EAAE;gBAC7D,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE;gBACpF,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC,CAAC;QACN,CAAC;QAED,oBAAoB;QACpB,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QACxD,MAAM,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;YAC9C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,2BAA2B,WAAW,CAAC,MAAM,cAAc,MAAM,CAAC,MAAM,YAAY,SAAS,CAAC,MAAM,iBAAiB,QAAQ,CAAC,MAAM,QAAQ;YACrJ,MAAM,EAAE,YAAY;SACrB,CAAC,CAAC,CAAC;QAEJ,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,2BAA2B,MAAM,CAAC,MAAM,YAAY,SAAS,CAAC,MAAM,aAAa,CAAC,CAAC;QAC9F,CAAC;QAED,QAAQ,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAChD,OAAO,GAAG,KAAK,CAAC;QAEhB,OAAO;YACL,QAAQ,EAAE,WAAW;YACrB,MAAM;YACN,SAAS;YACT,KAAK,EAAE,QAAQ;YACf,cAAc,EAAE,SAAS,CAAC,MAAM;SACjC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,GAAG,KAAK,CAAC;QAChB,QAAQ,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAChD,GAAG,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/F,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,SAAS,WAAW,CAAC,QAAiB,EAAE,QAAiB;IACvD,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC5B,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CACpD,CAAC;QACF,IAAI,KAAK,EAAE,CAAC;YACV,gBAAgB;YAChB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YACjE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACvC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Brain import — scan external folders and map them to brain structure.
3
+ *
4
+ * Adapts whatever the user already has — Obsidian vaults, loose documents,
5
+ * project folders — into Core's brain layout. Copies, never moves.
6
+ * The source files stay untouched.
7
+ *
8
+ * Mapping rules:
9
+ * - Markdown files → brain/knowledge/notes/
10
+ * - Daily notes (YYYY-MM-DD.md pattern) → brain/memory/ (as experiences)
11
+ * - PDFs, research → brain/knowledge/research/
12
+ * - Images → brain/knowledge/assets/
13
+ * - Config/dotfiles → skipped
14
+ * - Templates → brain/content/templates/
15
+ * - Bookmarks, links → brain/knowledge/bookmarks/
16
+ * - Everything else readable → brain/knowledge/notes/
17
+ *
18
+ * After copying, generates a manifest (brain/.core/import-manifest.json)
19
+ * so Core knows what was imported and from where.
20
+ */
21
+ export interface ImportOptions {
22
+ /** Directories to scan */
23
+ sources: string[];
24
+ /** Brain root directory */
25
+ brainRoot: string;
26
+ /** Dry run — show what would be imported without copying */
27
+ dryRun?: boolean;
28
+ /** Max total files to import (safety limit) */
29
+ maxFiles?: number;
30
+ /** Max single file size in bytes */
31
+ maxFileSize?: number;
32
+ }
33
+ export interface ImportResult {
34
+ imported: number;
35
+ skipped: number;
36
+ categories: Record<string, number>;
37
+ files: {
38
+ source: string;
39
+ destination: string;
40
+ category: string;
41
+ }[];
42
+ }
43
+ export declare function importToBrain(options: ImportOptions): Promise<ImportResult>;
44
+ //# sourceMappingURL=import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/files/import.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AA0JH,MAAM,WAAW,aAAa;IAC5B,0BAA0B;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACpE;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAiGjF"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Brain import — scan external folders and map them to brain structure.
3
+ *
4
+ * Adapts whatever the user already has — Obsidian vaults, loose documents,
5
+ * project folders — into Core's brain layout. Copies, never moves.
6
+ * The source files stay untouched.
7
+ *
8
+ * Mapping rules:
9
+ * - Markdown files → brain/knowledge/notes/
10
+ * - Daily notes (YYYY-MM-DD.md pattern) → brain/memory/ (as experiences)
11
+ * - PDFs, research → brain/knowledge/research/
12
+ * - Images → brain/knowledge/assets/
13
+ * - Config/dotfiles → skipped
14
+ * - Templates → brain/content/templates/
15
+ * - Bookmarks, links → brain/knowledge/bookmarks/
16
+ * - Everything else readable → brain/knowledge/notes/
17
+ *
18
+ * After copying, generates a manifest (brain/.core/import-manifest.json)
19
+ * so Core knows what was imported and from where.
20
+ */
21
+ import { readdir, copyFile, mkdir, stat, writeFile } from "node:fs/promises";
22
+ import { join, extname, basename, relative, dirname } from "node:path";
23
+ import { existsSync } from "node:fs";
24
+ import { createLogger } from "../utils/logger.js";
25
+ const log = createLogger("import");
26
+ // ── File classification ─────────────────────────────────────────────────────
27
+ const SKIP_DIRS = new Set([
28
+ "node_modules", ".git", "dist", ".next", ".turbo", "__pycache__",
29
+ ".obsidian", ".trash", ".vscode", ".idea",
30
+ ]);
31
+ const SKIP_FILES = new Set([
32
+ ".DS_Store", "Thumbs.db", "desktop.ini", ".gitignore", ".env",
33
+ ]);
34
+ const DAILY_NOTE_PATTERN = /^\d{4}-\d{2}-\d{2}\.md$/;
35
+ const TEMPLATE_INDICATORS = ["template", "templates", "tmpl"];
36
+ function classifyFile(relPath, sourceRoot) {
37
+ const name = basename(relPath);
38
+ const ext = extname(name).toLowerCase();
39
+ const parts = relPath.split(/[/\\]/);
40
+ // Skip hidden and system files
41
+ if (SKIP_FILES.has(name))
42
+ return null;
43
+ if (name.startsWith("."))
44
+ return null;
45
+ if (parts.some(p => SKIP_DIRS.has(p)))
46
+ return null;
47
+ // Daily notes → memory experiences
48
+ if (DAILY_NOTE_PATTERN.test(name)) {
49
+ return {
50
+ sourcePath: join(sourceRoot, relPath),
51
+ relativePath: relPath,
52
+ destination: join("memory", "imported", name),
53
+ category: "daily",
54
+ };
55
+ }
56
+ // Templates folder
57
+ if (parts.some(p => TEMPLATE_INDICATORS.includes(p.toLowerCase()))) {
58
+ if (ext === ".md" || ext === ".txt") {
59
+ return {
60
+ sourcePath: join(sourceRoot, relPath),
61
+ relativePath: relPath,
62
+ destination: join("content", "templates", name),
63
+ category: "template",
64
+ };
65
+ }
66
+ }
67
+ // PDFs → research
68
+ if (ext === ".pdf") {
69
+ return {
70
+ sourcePath: join(sourceRoot, relPath),
71
+ relativePath: relPath,
72
+ destination: join("knowledge", "research", name),
73
+ category: "research",
74
+ };
75
+ }
76
+ // Images → assets
77
+ if ([".png", ".jpg", ".jpeg", ".gif", ".webp", ".svg"].includes(ext)) {
78
+ return {
79
+ sourcePath: join(sourceRoot, relPath),
80
+ relativePath: relPath,
81
+ destination: join("knowledge", "assets", name),
82
+ category: "asset",
83
+ };
84
+ }
85
+ // Bookmark files
86
+ if (name.toLowerCase().includes("bookmark") || ext === ".webloc" || ext === ".url") {
87
+ return {
88
+ sourcePath: join(sourceRoot, relPath),
89
+ relativePath: relPath,
90
+ destination: join("knowledge", "bookmarks", name),
91
+ category: "bookmark",
92
+ };
93
+ }
94
+ // Markdown and text → notes (preserve subfolder structure)
95
+ if ([".md", ".txt", ".yaml", ".yml"].includes(ext)) {
96
+ // Preserve one level of subfolder for organization
97
+ const subPath = parts.length > 1
98
+ ? join(parts.slice(0, -1).join("/"), name)
99
+ : name;
100
+ return {
101
+ sourcePath: join(sourceRoot, relPath),
102
+ relativePath: relPath,
103
+ destination: join("knowledge", "notes", subPath),
104
+ category: "note",
105
+ };
106
+ }
107
+ // Other readable files → notes
108
+ if ([".json", ".csv", ".toml", ".ini", ".xml"].includes(ext)) {
109
+ return {
110
+ sourcePath: join(sourceRoot, relPath),
111
+ relativePath: relPath,
112
+ destination: join("knowledge", "notes", name),
113
+ category: "note",
114
+ };
115
+ }
116
+ return null;
117
+ }
118
+ // ── Scan ─────────────────────────────────────────────────────────────────────
119
+ async function scanDirectory(dirPath) {
120
+ const results = [];
121
+ const entries = await readdir(dirPath, { recursive: true, withFileTypes: true });
122
+ for (const entry of entries) {
123
+ if (!entry.isFile())
124
+ continue;
125
+ const relPath = entry.parentPath
126
+ ? relative(dirPath, join(entry.parentPath, entry.name))
127
+ : entry.name;
128
+ const classified = classifyFile(relPath, dirPath);
129
+ if (classified)
130
+ results.push(classified);
131
+ }
132
+ return results;
133
+ }
134
+ export async function importToBrain(options) {
135
+ const { sources, brainRoot, dryRun = false, maxFiles = 500, maxFileSize = 10 * 1024 * 1024, // 10MB
136
+ } = options;
137
+ const brainDir = join(brainRoot, "brain");
138
+ const allFiles = [];
139
+ // Scan all source directories
140
+ for (const source of sources) {
141
+ const absSource = join(source); // resolve
142
+ const dirStat = await stat(absSource).catch(() => null);
143
+ if (!dirStat?.isDirectory()) {
144
+ log.warn(`Skipping ${source} — not a directory`);
145
+ continue;
146
+ }
147
+ log.info(`Scanning ${source}...`);
148
+ const files = await scanDirectory(absSource);
149
+ allFiles.push(...files);
150
+ }
151
+ if (allFiles.length === 0) {
152
+ return { imported: 0, skipped: 0, categories: {}, files: [] };
153
+ }
154
+ // Deduplicate by destination (first one wins)
155
+ const seen = new Set();
156
+ const unique = allFiles.filter(f => {
157
+ if (seen.has(f.destination))
158
+ return false;
159
+ seen.add(f.destination);
160
+ return true;
161
+ });
162
+ // Apply limits
163
+ const toImport = unique.slice(0, maxFiles);
164
+ const skipped = unique.length - toImport.length;
165
+ if (dryRun) {
166
+ const categories = {};
167
+ const files = toImport.map(f => {
168
+ categories[f.category] = (categories[f.category] || 0) + 1;
169
+ return { source: f.relativePath, destination: f.destination, category: f.category };
170
+ });
171
+ return { imported: toImport.length, skipped, categories, files };
172
+ }
173
+ // Copy files
174
+ const categories = {};
175
+ const importedFiles = [];
176
+ let imported = 0;
177
+ for (const file of toImport) {
178
+ try {
179
+ // Check file size
180
+ const fileStat = await stat(file.sourcePath);
181
+ if (fileStat.size > maxFileSize)
182
+ continue;
183
+ const destPath = join(brainDir, file.destination);
184
+ await mkdir(dirname(destPath), { recursive: true });
185
+ // Don't overwrite existing brain files
186
+ if (existsSync(destPath))
187
+ continue;
188
+ await copyFile(file.sourcePath, destPath);
189
+ categories[file.category] = (categories[file.category] || 0) + 1;
190
+ importedFiles.push({
191
+ source: file.relativePath,
192
+ destination: file.destination,
193
+ category: file.category,
194
+ });
195
+ imported++;
196
+ }
197
+ catch (err) {
198
+ log.warn(`Failed to import ${file.relativePath}: ${err instanceof Error ? err.message : String(err)}`);
199
+ }
200
+ }
201
+ // Write manifest
202
+ const manifest = {
203
+ importedAt: new Date().toISOString(),
204
+ sources,
205
+ files: importedFiles,
206
+ counts: categories,
207
+ };
208
+ const manifestDir = join(brainDir, ".core");
209
+ await mkdir(manifestDir, { recursive: true });
210
+ await writeFile(join(manifestDir, "import-manifest.json"), JSON.stringify(manifest, null, 2), "utf-8");
211
+ return { imported, skipped, categories, files: importedFiles };
212
+ }
213
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/files/import.ts"],"names":[],"mappings":"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"}