@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.
- package/dist/cli.js +232 -11
- package/dist/cli.js.map +1 -1
- package/dist/files/deep-index.d.ts +59 -0
- package/dist/files/deep-index.d.ts.map +1 -0
- package/dist/files/deep-index.js +337 -0
- package/dist/files/deep-index.js.map +1 -0
- package/dist/files/import.d.ts +44 -0
- package/dist/files/import.d.ts.map +1 -0
- package/dist/files/import.js +213 -0
- package/dist/files/import.js.map +1 -0
- package/dist/files/index-local.d.ts +37 -0
- package/dist/files/index-local.d.ts.map +1 -0
- package/dist/files/index-local.js +198 -0
- package/dist/files/index-local.js.map +1 -0
- package/dist/nerve/state.d.ts +1 -1
- package/dist/nerve/state.d.ts.map +1 -1
- package/dist/nerve/state.js +1 -1
- package/dist/nerve/state.js.map +1 -1
- package/dist/posture/engine.d.ts +41 -0
- package/dist/posture/engine.d.ts.map +1 -0
- package/dist/posture/engine.js +217 -0
- package/dist/posture/engine.js.map +1 -0
- package/dist/posture/index.d.ts +11 -0
- package/dist/posture/index.d.ts.map +1 -0
- package/dist/posture/index.js +10 -0
- package/dist/posture/index.js.map +1 -0
- package/dist/posture/middleware.d.ts +30 -0
- package/dist/posture/middleware.d.ts.map +1 -0
- package/dist/posture/middleware.js +92 -0
- package/dist/posture/middleware.js.map +1 -0
- package/dist/posture/types.d.ts +61 -0
- package/dist/posture/types.d.ts.map +1 -0
- package/dist/posture/types.js +48 -0
- package/dist/posture/types.js.map +1 -0
- package/dist/server.d.ts +3 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +191 -45
- package/dist/server.js.map +1 -1
- package/dist/tier/bond.d.ts +51 -0
- package/dist/tier/bond.d.ts.map +1 -0
- package/dist/tier/bond.js +154 -0
- package/dist/tier/bond.js.map +1 -0
- package/dist/tier/freeze.d.ts +21 -0
- package/dist/tier/freeze.d.ts.map +1 -0
- package/dist/tier/freeze.js +73 -0
- package/dist/tier/freeze.js.map +1 -0
- package/dist/tier/gate.d.ts +11 -0
- package/dist/tier/gate.d.ts.map +1 -0
- package/dist/tier/gate.js +25 -0
- package/dist/tier/gate.js.map +1 -0
- package/dist/tier/heartbeat.d.ts +22 -0
- package/dist/tier/heartbeat.d.ts.map +1 -0
- package/dist/tier/heartbeat.js +128 -0
- package/dist/tier/heartbeat.js.map +1 -0
- package/dist/tier/token.d.ts +22 -0
- package/dist/tier/token.d.ts.map +1 -0
- package/dist/tier/token.js +100 -0
- package/dist/tier/token.js.map +1 -0
- package/dist/tier/types.d.ts +44 -0
- package/dist/tier/types.d.ts.map +1 -0
- package/dist/tier/types.js +61 -0
- package/dist/tier/types.js.map +1 -0
- 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":"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"}
|
|
@@ -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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"}
|