gnosys 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1387 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +3753 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2267 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/archive.d.ts +95 -0
- package/dist/lib/archive.d.ts.map +1 -0
- package/dist/lib/archive.js +311 -0
- package/dist/lib/archive.js.map +1 -0
- package/dist/lib/ask.d.ts +77 -0
- package/dist/lib/ask.d.ts.map +1 -0
- package/dist/lib/ask.js +316 -0
- package/dist/lib/ask.js.map +1 -0
- package/dist/lib/audit.d.ts +47 -0
- package/dist/lib/audit.d.ts.map +1 -0
- package/dist/lib/audit.js +136 -0
- package/dist/lib/audit.js.map +1 -0
- package/dist/lib/bootstrap.d.ts +56 -0
- package/dist/lib/bootstrap.d.ts.map +1 -0
- package/dist/lib/bootstrap.js +163 -0
- package/dist/lib/bootstrap.js.map +1 -0
- package/dist/lib/config.d.ts +239 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +371 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/dashboard.d.ts +81 -0
- package/dist/lib/dashboard.d.ts.map +1 -0
- package/dist/lib/dashboard.js +314 -0
- package/dist/lib/dashboard.js.map +1 -0
- package/dist/lib/db.d.ts +182 -0
- package/dist/lib/db.d.ts.map +1 -0
- package/dist/lib/db.js +620 -0
- package/dist/lib/db.js.map +1 -0
- package/dist/lib/dbSearch.d.ts +65 -0
- package/dist/lib/dbSearch.d.ts.map +1 -0
- package/dist/lib/dbSearch.js +239 -0
- package/dist/lib/dbSearch.js.map +1 -0
- package/dist/lib/dbWrite.d.ts +56 -0
- package/dist/lib/dbWrite.d.ts.map +1 -0
- package/dist/lib/dbWrite.js +171 -0
- package/dist/lib/dbWrite.js.map +1 -0
- package/dist/lib/dream.d.ts +170 -0
- package/dist/lib/dream.d.ts.map +1 -0
- package/dist/lib/dream.js +706 -0
- package/dist/lib/dream.js.map +1 -0
- package/dist/lib/embeddings.d.ts +84 -0
- package/dist/lib/embeddings.d.ts.map +1 -0
- package/dist/lib/embeddings.js +226 -0
- package/dist/lib/embeddings.js.map +1 -0
- package/dist/lib/export.d.ts +92 -0
- package/dist/lib/export.d.ts.map +1 -0
- package/dist/lib/export.js +362 -0
- package/dist/lib/export.js.map +1 -0
- package/dist/lib/federated.d.ts +113 -0
- package/dist/lib/federated.d.ts.map +1 -0
- package/dist/lib/federated.js +346 -0
- package/dist/lib/federated.js.map +1 -0
- package/dist/lib/graph.d.ts +50 -0
- package/dist/lib/graph.d.ts.map +1 -0
- package/dist/lib/graph.js +118 -0
- package/dist/lib/graph.js.map +1 -0
- package/dist/lib/history.d.ts +39 -0
- package/dist/lib/history.d.ts.map +1 -0
- package/dist/lib/history.js +112 -0
- package/dist/lib/history.js.map +1 -0
- package/dist/lib/hybridSearch.d.ts +80 -0
- package/dist/lib/hybridSearch.d.ts.map +1 -0
- package/dist/lib/hybridSearch.js +296 -0
- package/dist/lib/hybridSearch.js.map +1 -0
- package/dist/lib/import.d.ts +52 -0
- package/dist/lib/import.d.ts.map +1 -0
- package/dist/lib/import.js +365 -0
- package/dist/lib/import.js.map +1 -0
- package/dist/lib/ingest.d.ts +51 -0
- package/dist/lib/ingest.d.ts.map +1 -0
- package/dist/lib/ingest.js +144 -0
- package/dist/lib/ingest.js.map +1 -0
- package/dist/lib/lensing.d.ts +35 -0
- package/dist/lib/lensing.d.ts.map +1 -0
- package/dist/lib/lensing.js +85 -0
- package/dist/lib/lensing.js.map +1 -0
- package/dist/lib/llm.d.ts +84 -0
- package/dist/lib/llm.d.ts.map +1 -0
- package/dist/lib/llm.js +386 -0
- package/dist/lib/llm.js.map +1 -0
- package/dist/lib/lock.d.ts +28 -0
- package/dist/lib/lock.d.ts.map +1 -0
- package/dist/lib/lock.js +145 -0
- package/dist/lib/lock.js.map +1 -0
- package/dist/lib/maintenance.d.ts +124 -0
- package/dist/lib/maintenance.d.ts.map +1 -0
- package/dist/lib/maintenance.js +587 -0
- package/dist/lib/maintenance.js.map +1 -0
- package/dist/lib/migrate.d.ts +19 -0
- package/dist/lib/migrate.d.ts.map +1 -0
- package/dist/lib/migrate.js +260 -0
- package/dist/lib/migrate.js.map +1 -0
- package/dist/lib/preferences.d.ts +49 -0
- package/dist/lib/preferences.d.ts.map +1 -0
- package/dist/lib/preferences.js +149 -0
- package/dist/lib/preferences.js.map +1 -0
- package/dist/lib/projectIdentity.d.ts +66 -0
- package/dist/lib/projectIdentity.d.ts.map +1 -0
- package/dist/lib/projectIdentity.js +148 -0
- package/dist/lib/projectIdentity.js.map +1 -0
- package/dist/lib/recall.d.ts +82 -0
- package/dist/lib/recall.d.ts.map +1 -0
- package/dist/lib/recall.js +289 -0
- package/dist/lib/recall.js.map +1 -0
- package/dist/lib/resolver.d.ts +116 -0
- package/dist/lib/resolver.d.ts.map +1 -0
- package/dist/lib/resolver.js +372 -0
- package/dist/lib/resolver.js.map +1 -0
- package/dist/lib/retry.d.ts +24 -0
- package/dist/lib/retry.d.ts.map +1 -0
- package/dist/lib/retry.js +60 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/rulesGen.d.ts +51 -0
- package/dist/lib/rulesGen.d.ts.map +1 -0
- package/dist/lib/rulesGen.js +167 -0
- package/dist/lib/rulesGen.js.map +1 -0
- package/dist/lib/search.d.ts +51 -0
- package/dist/lib/search.d.ts.map +1 -0
- package/dist/lib/search.js +190 -0
- package/dist/lib/search.js.map +1 -0
- package/dist/lib/staticSearch.d.ts +70 -0
- package/dist/lib/staticSearch.d.ts.map +1 -0
- package/dist/lib/staticSearch.js +162 -0
- package/dist/lib/staticSearch.js.map +1 -0
- package/dist/lib/store.d.ts +79 -0
- package/dist/lib/store.d.ts.map +1 -0
- package/dist/lib/store.js +227 -0
- package/dist/lib/store.js.map +1 -0
- package/dist/lib/structuredIngest.d.ts +37 -0
- package/dist/lib/structuredIngest.d.ts.map +1 -0
- package/dist/lib/structuredIngest.js +208 -0
- package/dist/lib/structuredIngest.js.map +1 -0
- package/dist/lib/tags.d.ts +26 -0
- package/dist/lib/tags.d.ts.map +1 -0
- package/dist/lib/tags.js +109 -0
- package/dist/lib/tags.js.map +1 -0
- package/dist/lib/timeline.d.ts +34 -0
- package/dist/lib/timeline.d.ts.map +1 -0
- package/dist/lib/timeline.js +116 -0
- package/dist/lib/timeline.js.map +1 -0
- package/dist/lib/trace.d.ts +42 -0
- package/dist/lib/trace.d.ts.map +1 -0
- package/dist/lib/trace.js +338 -0
- package/dist/lib/trace.js.map +1 -0
- package/dist/lib/webIndex.d.ts +28 -0
- package/dist/lib/webIndex.d.ts.map +1 -0
- package/dist/lib/webIndex.js +208 -0
- package/dist/lib/webIndex.js.map +1 -0
- package/dist/lib/webIngest.d.ts +51 -0
- package/dist/lib/webIngest.d.ts.map +1 -0
- package/dist/lib/webIngest.js +533 -0
- package/dist/lib/webIngest.js.map +1 -0
- package/dist/lib/wikilinks.d.ts +63 -0
- package/dist/lib/wikilinks.d.ts.map +1 -0
- package/dist/lib/wikilinks.js +146 -0
- package/dist/lib/wikilinks.js.map +1 -0
- package/dist/sandbox/client.d.ts +82 -0
- package/dist/sandbox/client.d.ts.map +1 -0
- package/dist/sandbox/client.js +128 -0
- package/dist/sandbox/client.js.map +1 -0
- package/dist/sandbox/helper-template.d.ts +14 -0
- package/dist/sandbox/helper-template.d.ts.map +1 -0
- package/dist/sandbox/helper-template.js +285 -0
- package/dist/sandbox/helper-template.js.map +1 -0
- package/dist/sandbox/index.d.ts +10 -0
- package/dist/sandbox/index.d.ts.map +1 -0
- package/dist/sandbox/index.js +10 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sandbox/manager.d.ts +40 -0
- package/dist/sandbox/manager.d.ts.map +1 -0
- package/dist/sandbox/manager.js +220 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/sandbox/server.d.ts +44 -0
- package/dist/sandbox/server.d.ts.map +1 -0
- package/dist/sandbox/server.js +661 -0
- package/dist/sandbox/server.js.map +1 -0
- package/package.json +103 -0
- package/prompts/synthesize.md +21 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Bulk Import — Structured data → atomic memories.
|
|
3
|
+
* Supports CSV, JSON, JSONL formats with LLM or structured ingestion modes.
|
|
4
|
+
* Shared core used by both the MCP tool and CLI command.
|
|
5
|
+
*/
|
|
6
|
+
import { parse as csvParse } from "csv-parse/sync";
|
|
7
|
+
import fs from "fs/promises";
|
|
8
|
+
// ─── URL Safety ──────────────────────────────────────────────────────────
|
|
9
|
+
function isSafeImportUrl(urlStr) {
|
|
10
|
+
try {
|
|
11
|
+
const url = new URL(urlStr);
|
|
12
|
+
if (url.protocol !== "http:" && url.protocol !== "https:")
|
|
13
|
+
return false;
|
|
14
|
+
const hostname = url.hostname;
|
|
15
|
+
if (hostname === "169.254.169.254" || hostname === "metadata.google.internal")
|
|
16
|
+
return false;
|
|
17
|
+
const ipv4Match = hostname.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
|
|
18
|
+
if (ipv4Match) {
|
|
19
|
+
const [, a, b] = ipv4Match.map(Number);
|
|
20
|
+
if (a === 10)
|
|
21
|
+
return false;
|
|
22
|
+
if (a === 172 && b >= 16 && b <= 31)
|
|
23
|
+
return false;
|
|
24
|
+
if (a === 192 && b === 168)
|
|
25
|
+
return false;
|
|
26
|
+
if (a === 169 && b === 254)
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// ─── Parsing ─────────────────────────────────────────────────────────────
|
|
36
|
+
async function loadData(data, format) {
|
|
37
|
+
let raw;
|
|
38
|
+
// Determine if data is a file path, URL, or inline
|
|
39
|
+
if (data.startsWith("http://") || data.startsWith("https://")) {
|
|
40
|
+
if (!isSafeImportUrl(data)) {
|
|
41
|
+
throw new Error(`Refusing to fetch unsafe URL: ${data}`);
|
|
42
|
+
}
|
|
43
|
+
const response = await fetch(data);
|
|
44
|
+
if (!response.ok) {
|
|
45
|
+
throw new Error(`Failed to fetch URL: ${response.status} ${response.statusText}`);
|
|
46
|
+
}
|
|
47
|
+
raw = await response.text();
|
|
48
|
+
}
|
|
49
|
+
else if (data.trim().startsWith("[") ||
|
|
50
|
+
data.trim().startsWith("{") ||
|
|
51
|
+
data.includes(",") && data.includes("\n") && format === "csv") {
|
|
52
|
+
// Inline data — use as-is
|
|
53
|
+
raw = data;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// File path
|
|
57
|
+
raw = await fs.readFile(data, "utf-8");
|
|
58
|
+
}
|
|
59
|
+
switch (format) {
|
|
60
|
+
case "csv":
|
|
61
|
+
return csvParse(raw, {
|
|
62
|
+
columns: true,
|
|
63
|
+
skip_empty_lines: true,
|
|
64
|
+
trim: true,
|
|
65
|
+
});
|
|
66
|
+
case "json": {
|
|
67
|
+
const parsed = JSON.parse(raw);
|
|
68
|
+
// Handle both arrays and objects with a data/foods/results array
|
|
69
|
+
if (Array.isArray(parsed))
|
|
70
|
+
return parsed;
|
|
71
|
+
// Common API response patterns
|
|
72
|
+
for (const key of ["data", "foods", "results", "items", "records", "vulnerabilities"]) {
|
|
73
|
+
if (Array.isArray(parsed[key]))
|
|
74
|
+
return parsed[key];
|
|
75
|
+
}
|
|
76
|
+
throw new Error("JSON must be an array or an object with a recognizable array field (data, foods, results, items, records, vulnerabilities)");
|
|
77
|
+
}
|
|
78
|
+
case "jsonl":
|
|
79
|
+
return raw
|
|
80
|
+
.split("\n")
|
|
81
|
+
.filter((line) => line.trim())
|
|
82
|
+
.map((line) => JSON.parse(line));
|
|
83
|
+
default:
|
|
84
|
+
throw new Error(`Unsupported format: ${format}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function validateMapping(mapping) {
|
|
88
|
+
const errors = [];
|
|
89
|
+
const validTargets = ["title", "category", "content", "tags", "relevance"];
|
|
90
|
+
const hasTitle = Object.values(mapping).includes("title");
|
|
91
|
+
if (!hasTitle) {
|
|
92
|
+
errors.push("Mapping must include a field mapped to 'title'");
|
|
93
|
+
}
|
|
94
|
+
for (const [src, dst] of Object.entries(mapping)) {
|
|
95
|
+
if (!validTargets.includes(dst)) {
|
|
96
|
+
errors.push(`Invalid mapping target "${dst}" for field "${src}". Valid: ${validTargets.join(", ")}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return errors;
|
|
100
|
+
}
|
|
101
|
+
function applyMapping(record, mapping) {
|
|
102
|
+
const mapped = {};
|
|
103
|
+
const mappedSourceFields = new Set(Object.keys(mapping));
|
|
104
|
+
const extraParts = [];
|
|
105
|
+
for (const [src, dst] of Object.entries(mapping)) {
|
|
106
|
+
const value = record[src];
|
|
107
|
+
if (value === undefined || value === null)
|
|
108
|
+
continue;
|
|
109
|
+
switch (dst) {
|
|
110
|
+
case "title":
|
|
111
|
+
mapped.title = String(value);
|
|
112
|
+
break;
|
|
113
|
+
case "category":
|
|
114
|
+
mapped.category = String(value)
|
|
115
|
+
.toLowerCase()
|
|
116
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
117
|
+
.replace(/^-|-$/g, "");
|
|
118
|
+
break;
|
|
119
|
+
case "content":
|
|
120
|
+
mapped.content = String(value);
|
|
121
|
+
break;
|
|
122
|
+
case "relevance":
|
|
123
|
+
mapped.relevance = String(value);
|
|
124
|
+
break;
|
|
125
|
+
case "tags":
|
|
126
|
+
// Accept comma-separated string or array
|
|
127
|
+
if (Array.isArray(value)) {
|
|
128
|
+
mapped.tags = { domain: value.map(String) };
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
mapped.tags = {
|
|
132
|
+
domain: String(value)
|
|
133
|
+
.split(",")
|
|
134
|
+
.map((t) => t.trim())
|
|
135
|
+
.filter(Boolean),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Collect unmapped fields as extra context for LLM
|
|
142
|
+
for (const [key, value] of Object.entries(record)) {
|
|
143
|
+
if (!mappedSourceFields.has(key) && value !== undefined && value !== null) {
|
|
144
|
+
const strVal = typeof value === "object" ? JSON.stringify(value) : String(value);
|
|
145
|
+
if (strVal.length > 0 && strVal !== "null") {
|
|
146
|
+
extraParts.push(`${key}: ${strVal}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
title: mapped.title || "Untitled",
|
|
152
|
+
category: mapped.category || "imported",
|
|
153
|
+
content: mapped.content || "",
|
|
154
|
+
tags: mapped.tags,
|
|
155
|
+
relevance: mapped.relevance,
|
|
156
|
+
extraContext: extraParts.join("\n"),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
// ─── Core Import ─────────────────────────────────────────────────────────
|
|
160
|
+
export async function performImport(store, ingestion, options) {
|
|
161
|
+
const startTime = Date.now();
|
|
162
|
+
const results = {
|
|
163
|
+
imported: [],
|
|
164
|
+
skipped: [],
|
|
165
|
+
failed: [],
|
|
166
|
+
totalProcessed: 0,
|
|
167
|
+
duration: 0,
|
|
168
|
+
};
|
|
169
|
+
const batchCommit = options.batchCommit !== false; // Default true
|
|
170
|
+
const concurrency = options.concurrency || 5;
|
|
171
|
+
const author = options.author || "ai";
|
|
172
|
+
const authority = options.authority || "imported";
|
|
173
|
+
// Phase 1: Parse data
|
|
174
|
+
options.onProgress?.({
|
|
175
|
+
processed: 0,
|
|
176
|
+
total: 0,
|
|
177
|
+
current: "Loading data...",
|
|
178
|
+
stage: "parsing",
|
|
179
|
+
});
|
|
180
|
+
let records = await loadData(options.data, options.format);
|
|
181
|
+
// Apply offset and limit
|
|
182
|
+
if (options.offset && options.offset > 0) {
|
|
183
|
+
records = records.slice(options.offset);
|
|
184
|
+
}
|
|
185
|
+
if (options.limit && options.limit > 0) {
|
|
186
|
+
records = records.slice(0, options.limit);
|
|
187
|
+
}
|
|
188
|
+
const total = records.length;
|
|
189
|
+
// Validate mapping
|
|
190
|
+
const mappingErrors = validateMapping(options.mapping);
|
|
191
|
+
if (mappingErrors.length > 0) {
|
|
192
|
+
throw new Error(`Invalid field mapping:\n${mappingErrors.join("\n")}`);
|
|
193
|
+
}
|
|
194
|
+
// Phase 2: Dedup
|
|
195
|
+
let existingTitles = new Set();
|
|
196
|
+
if (options.skipExisting) {
|
|
197
|
+
options.onProgress?.({
|
|
198
|
+
processed: 0,
|
|
199
|
+
total,
|
|
200
|
+
current: "Checking existing memories...",
|
|
201
|
+
stage: "deduplicating",
|
|
202
|
+
});
|
|
203
|
+
const existing = await store.getAllMemories();
|
|
204
|
+
existingTitles = new Set(existing.map((m) => m.frontmatter.title.toLowerCase()));
|
|
205
|
+
}
|
|
206
|
+
// Phase 3 & 4: Ingest + Write
|
|
207
|
+
if (options.mode === "llm" && !ingestion.isLLMAvailable) {
|
|
208
|
+
throw new Error("LLM mode requires a configured LLM provider. Set ANTHROPIC_API_KEY, configure Ollama, or use --mode structured.");
|
|
209
|
+
}
|
|
210
|
+
// Process in batches for LLM concurrency
|
|
211
|
+
for (let i = 0; i < records.length; i += concurrency) {
|
|
212
|
+
const batch = records.slice(i, Math.min(i + concurrency, records.length));
|
|
213
|
+
const batchPromises = batch.map(async (record, batchIdx) => {
|
|
214
|
+
const globalIdx = i + batchIdx;
|
|
215
|
+
const mapped = applyMapping(record, options.mapping);
|
|
216
|
+
// Dedup check
|
|
217
|
+
if (options.skipExisting &&
|
|
218
|
+
existingTitles.has(mapped.title.toLowerCase())) {
|
|
219
|
+
results.skipped.push(mapped.title);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
options.onProgress?.({
|
|
223
|
+
processed: globalIdx,
|
|
224
|
+
total,
|
|
225
|
+
current: mapped.title,
|
|
226
|
+
stage: "ingesting",
|
|
227
|
+
});
|
|
228
|
+
try {
|
|
229
|
+
let title;
|
|
230
|
+
let category;
|
|
231
|
+
let tags;
|
|
232
|
+
let relevance;
|
|
233
|
+
let content;
|
|
234
|
+
let confidence;
|
|
235
|
+
let filename;
|
|
236
|
+
if (options.mode === "llm") {
|
|
237
|
+
// Build rich text input for LLM
|
|
238
|
+
let rawInput = `Title: ${mapped.title}\nCategory: ${mapped.category}`;
|
|
239
|
+
if (mapped.content)
|
|
240
|
+
rawInput += `\n\n${mapped.content}`;
|
|
241
|
+
if (mapped.extraContext)
|
|
242
|
+
rawInput += `\n\nAdditional data:\n${mapped.extraContext}`;
|
|
243
|
+
const result = await ingestion.ingest(rawInput);
|
|
244
|
+
title = result.title;
|
|
245
|
+
category = result.category;
|
|
246
|
+
tags = result.tags;
|
|
247
|
+
relevance = result.relevance;
|
|
248
|
+
content = result.content;
|
|
249
|
+
confidence = result.confidence;
|
|
250
|
+
filename = result.filename;
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
// Structured mode — direct mapping
|
|
254
|
+
title = mapped.title;
|
|
255
|
+
category = mapped.category;
|
|
256
|
+
tags = mapped.tags || {};
|
|
257
|
+
relevance = mapped.relevance || "";
|
|
258
|
+
content = mapped.content || mapped.extraContext || title;
|
|
259
|
+
confidence = 0.8;
|
|
260
|
+
filename = title
|
|
261
|
+
.toLowerCase()
|
|
262
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
263
|
+
.replace(/^-|-$/g, "")
|
|
264
|
+
.substring(0, 60);
|
|
265
|
+
}
|
|
266
|
+
if (options.dryRun) {
|
|
267
|
+
results.imported.push({
|
|
268
|
+
title,
|
|
269
|
+
category,
|
|
270
|
+
path: `${category}/${filename}.md`,
|
|
271
|
+
});
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
// Write memory
|
|
275
|
+
const id = await store.generateId(category);
|
|
276
|
+
const today = new Date().toISOString().split("T")[0];
|
|
277
|
+
const frontmatter = {
|
|
278
|
+
id,
|
|
279
|
+
title,
|
|
280
|
+
category,
|
|
281
|
+
tags,
|
|
282
|
+
relevance,
|
|
283
|
+
author,
|
|
284
|
+
authority,
|
|
285
|
+
confidence,
|
|
286
|
+
created: today,
|
|
287
|
+
modified: today,
|
|
288
|
+
status: "active",
|
|
289
|
+
supersedes: null,
|
|
290
|
+
};
|
|
291
|
+
const fullContent = `# ${title}\n\n${content}`;
|
|
292
|
+
const relativePath = await store.writeMemory(category, `${filename}.md`, frontmatter, fullContent, { autoCommit: !batchCommit });
|
|
293
|
+
results.imported.push({ title, category, path: relativePath });
|
|
294
|
+
}
|
|
295
|
+
catch (err) {
|
|
296
|
+
results.failed.push({
|
|
297
|
+
record: mapped.title || `Record #${globalIdx}`,
|
|
298
|
+
error: err instanceof Error ? err.message : String(err),
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
// Wait for batch to complete
|
|
303
|
+
await Promise.all(batchPromises);
|
|
304
|
+
// Small delay between LLM batches to avoid rate limits
|
|
305
|
+
if (options.mode === "llm" &&
|
|
306
|
+
i + concurrency < records.length) {
|
|
307
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
results.totalProcessed = total;
|
|
311
|
+
// Phase 5: Batch commit
|
|
312
|
+
if (!options.dryRun && batchCommit && results.imported.length > 0) {
|
|
313
|
+
options.onProgress?.({
|
|
314
|
+
processed: total,
|
|
315
|
+
total,
|
|
316
|
+
current: "Committing...",
|
|
317
|
+
stage: "committing",
|
|
318
|
+
});
|
|
319
|
+
await store.batchCommit(`Bulk import: ${results.imported.length} memories from ${options.format} (${options.mode} mode)`);
|
|
320
|
+
}
|
|
321
|
+
results.duration = Date.now() - startTime;
|
|
322
|
+
return results;
|
|
323
|
+
}
|
|
324
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────
|
|
325
|
+
/**
|
|
326
|
+
* Format a human-readable summary of import results.
|
|
327
|
+
*/
|
|
328
|
+
export function formatImportSummary(result) {
|
|
329
|
+
const lines = [];
|
|
330
|
+
const durationSec = (result.duration / 1000).toFixed(1);
|
|
331
|
+
lines.push(`Import complete in ${durationSec}s`);
|
|
332
|
+
lines.push(` Imported: ${result.imported.length}`);
|
|
333
|
+
lines.push(` Skipped: ${result.skipped.length}`);
|
|
334
|
+
lines.push(` Failed: ${result.failed.length}`);
|
|
335
|
+
lines.push(` Total: ${result.totalProcessed}`);
|
|
336
|
+
if (result.failed.length > 0) {
|
|
337
|
+
lines.push("");
|
|
338
|
+
lines.push("Failures:");
|
|
339
|
+
for (const f of result.failed.slice(0, 10)) {
|
|
340
|
+
lines.push(` - ${f.record}: ${f.error}`);
|
|
341
|
+
}
|
|
342
|
+
if (result.failed.length > 10) {
|
|
343
|
+
lines.push(` ... and ${result.failed.length - 10} more`);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return lines.join("\n");
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Estimate import duration for smart threshold guidance.
|
|
350
|
+
*/
|
|
351
|
+
export function estimateDuration(recordCount, mode, concurrency = 5) {
|
|
352
|
+
if (mode === "structured") {
|
|
353
|
+
// ~50ms per record for structured
|
|
354
|
+
const seconds = Math.ceil((recordCount * 50) / 1000);
|
|
355
|
+
return seconds < 60 ? `~${seconds}s` : `~${Math.ceil(seconds / 60)}m`;
|
|
356
|
+
}
|
|
357
|
+
// LLM mode: ~1.5s per record with concurrency batching
|
|
358
|
+
const seconds = Math.ceil((recordCount * 1500) / concurrency / 1000);
|
|
359
|
+
if (seconds < 60)
|
|
360
|
+
return `~${seconds}s`;
|
|
361
|
+
if (seconds < 3600)
|
|
362
|
+
return `~${Math.ceil(seconds / 60)}m`;
|
|
363
|
+
return `~${(seconds / 3600).toFixed(1)}h`;
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/lib/import.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,MAAM,aAAa,CAAC;AAqC7B,4EAA4E;AAE5E,SAAS,eAAe,CAAC,MAAc;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACxE,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC9B,IAAI,QAAQ,KAAK,iBAAiB,IAAI,QAAQ,KAAK,0BAA0B;YAAE,OAAO,KAAK,CAAC;QAC5F,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACjE,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK,EAAE;gBAAE,OAAO,KAAK,CAAC;YAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;gBAAE,OAAO,KAAK,CAAC;YAClD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;gBAAE,OAAO,KAAK,CAAC;YACzC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;gBAAE,OAAO,KAAK,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,4EAA4E;AAE5E,KAAK,UAAU,QAAQ,CACrB,IAAY,EACZ,MAAgC;IAEhC,IAAI,GAAW,CAAC;IAEhB,mDAAmD;IACnD,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;SAAM,IACL,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAC3B,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,KAAK,KAAK,EAC7D,CAAC;QACD,0BAA0B;QAC1B,GAAG,GAAG,IAAI,CAAC;IACb,CAAC;SAAM,CAAC;QACN,YAAY;QACZ,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK;YACR,OAAO,QAAQ,CAAC,GAAG,EAAE;gBACnB,OAAO,EAAE,IAAI;gBACb,gBAAgB,EAAE,IAAI;gBACtB,IAAI,EAAE,IAAI;aACX,CAAC,CAAC;QAEL,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,iEAAiE;YACjE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,OAAO,MAAM,CAAC;YACzC,+BAA+B;YAC/B,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,CAAC,EAAE,CAAC;gBACtF,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;YACrD,CAAC;YACD,MAAM,IAAI,KAAK,CACb,4HAA4H,CAC7H,CAAC;QACJ,CAAC;QAED,KAAK,OAAO;YACV,OAAO,GAAG;iBACP,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBAC7B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAErC;YACE,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAaD,SAAS,eAAe,CAAC,OAA+B;IACtD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE1D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,2BAA2B,GAAG,gBAAgB,GAAG,aAAa,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvG,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CACnB,MAA+B,EAC/B,OAA+B;IAE/B,MAAM,MAAM,GAA0B,EAAE,CAAC;IACzC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACzD,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QAEpD,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,OAAO;gBACV,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC7B,MAAM;YACR,KAAK,UAAU;gBACb,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;qBAC5B,WAAW,EAAE;qBACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;qBAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACzB,MAAM;YACR,KAAK,SAAS;gBACZ,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM;YACR,KAAK,WAAW;gBACd,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBACjC,MAAM;YACR,KAAK,MAAM;gBACT,yCAAyC;gBACzC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,MAAM,CAAC,IAAI,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9C,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,GAAG;wBACZ,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC;6BAClB,KAAK,CAAC,GAAG,CAAC;6BACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;6BACpB,MAAM,CAAC,OAAO,CAAC;qBACnB,CAAC;gBACJ,CAAC;gBACD,MAAM;QACV,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAC1E,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC3C,UAAU,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,MAAM,EAAE,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,UAAU;QACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,UAAU;QACvC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;QAC7B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,YAAY,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,4EAA4E;AAE5E,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAkB,EAClB,SAA0B,EAC1B,OAAsB;IAEtB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAiB;QAC5B,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;QACV,cAAc,EAAE,CAAC;QACjB,QAAQ,EAAE,CAAC;KACZ,CAAC;IAEF,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC,CAAC,eAAe;IAClE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;IACtC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC;IAElD,sBAAsB;IACtB,OAAO,CAAC,UAAU,EAAE,CAAC;QACnB,SAAS,EAAE,CAAC;QACZ,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,iBAAiB;QAC1B,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,IAAI,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAE3D,yBAAyB;IACzB,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QACvC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAE7B,mBAAmB;IACnB,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,2BAA2B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,iBAAiB;IACjB,IAAI,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,OAAO,CAAC,UAAU,EAAE,CAAC;YACnB,SAAS,EAAE,CAAC;YACZ,KAAK;YACL,OAAO,EAAE,+BAA+B;YACxC,KAAK,EAAE,eAAe;SACvB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC;QAC9C,cAAc,GAAG,IAAI,GAAG,CACtB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CACvD,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CACb,iHAAiH,CAClH,CAAC;IACJ,CAAC;IAED,yCAAyC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CACzB,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAC1C,CAAC;QAEF,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;YACzD,MAAM,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC;YAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAErD,cAAc;YACd,IACE,OAAO,CAAC,YAAY;gBACpB,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAC9C,CAAC;gBACD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnC,OAAO;YACT,CAAC;YAED,OAAO,CAAC,UAAU,EAAE,CAAC;gBACnB,SAAS,EAAE,SAAS;gBACpB,KAAK;gBACL,OAAO,EAAE,MAAM,CAAC,KAAK;gBACrB,KAAK,EAAE,WAAW;aACnB,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,IAAI,KAAa,CAAC;gBAClB,IAAI,QAAgB,CAAC;gBACrB,IAAI,IAA8B,CAAC;gBACnC,IAAI,SAAiB,CAAC;gBACtB,IAAI,OAAe,CAAC;gBACpB,IAAI,UAAkB,CAAC;gBACvB,IAAI,QAAgB,CAAC;gBAErB,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;oBAC3B,gCAAgC;oBAChC,IAAI,QAAQ,GAAG,UAAU,MAAM,CAAC,KAAK,eAAe,MAAM,CAAC,QAAQ,EAAE,CAAC;oBACtE,IAAI,MAAM,CAAC,OAAO;wBAAE,QAAQ,IAAI,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;oBACxD,IAAI,MAAM,CAAC,YAAY;wBAAE,QAAQ,IAAI,yBAAyB,MAAM,CAAC,YAAY,EAAE,CAAC;oBAEpF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBAChD,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;oBACrB,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;oBAC3B,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;oBACnB,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;oBAC7B,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;oBACzB,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;oBAC/B,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACN,mCAAmC;oBACnC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;oBACrB,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;oBAC3B,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;oBACzB,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;oBACnC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,YAAY,IAAI,KAAK,CAAC;oBACzD,UAAU,GAAG,GAAG,CAAC;oBACjB,QAAQ,GAAG,KAAK;yBACb,WAAW,EAAE;yBACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;yBAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;yBACrB,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtB,CAAC;gBAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACnB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;wBACpB,KAAK;wBACL,QAAQ;wBACR,IAAI,EAAE,GAAG,QAAQ,IAAI,QAAQ,KAAK;qBACnC,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,eAAe;gBACf,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAC5C,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAErD,MAAM,WAAW,GAAsB;oBACrC,EAAE;oBACF,KAAK;oBACL,QAAQ;oBACR,IAAI;oBACJ,SAAS;oBACT,MAAM;oBACN,SAAS;oBACT,UAAU;oBACV,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,KAAK;oBACf,MAAM,EAAE,QAAiB;oBACzB,UAAU,EAAE,IAAI;iBACjB,CAAC;gBAEF,MAAM,WAAW,GAAG,KAAK,KAAK,OAAO,OAAO,EAAE,CAAC;gBAC/C,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,WAAW,CAC1C,QAAQ,EACR,GAAG,QAAQ,KAAK,EAChB,WAAW,EACX,WAAW,EACX,EAAE,UAAU,EAAE,CAAC,WAAW,EAAE,CAC7B,CAAC;gBAEF,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YACjE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;oBAClB,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,WAAW,SAAS,EAAE;oBAC9C,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,6BAA6B;QAC7B,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAEjC,uDAAuD;QACvD,IACE,OAAO,CAAC,IAAI,KAAK,KAAK;YACtB,CAAC,GAAG,WAAW,GAAG,OAAO,CAAC,MAAM,EAChC,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC;IAE/B,wBAAwB;IACxB,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO,CAAC,UAAU,EAAE,CAAC;YACnB,SAAS,EAAE,KAAK;YAChB,KAAK;YACL,OAAO,EAAE,eAAe;YACxB,KAAK,EAAE,YAAY;SACpB,CAAC,CAAC;QAEH,MAAM,KAAK,CAAC,WAAW,CACrB,gBAAgB,OAAO,CAAC,QAAQ,CAAC,MAAM,kBAAkB,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI,QAAQ,CACjG,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAC1C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,4EAA4E;AAE5E;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACtD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAExD,KAAK,CAAC,IAAI,CAAC,sBAAsB,WAAW,GAAG,CAAC,CAAC;IACjD,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACpD,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAClD,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;IAEnD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,WAAmB,EACnB,IAA0B,EAC1B,cAAsB,CAAC;IAEvB,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,kCAAkC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACrD,OAAO,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC;IACxE,CAAC;IAED,uDAAuD;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,CAAC;IACrE,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,IAAI,OAAO,GAAG,CAAC;IACxC,IAAI,OAAO,GAAG,IAAI;QAAE,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC;IAC1D,OAAO,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Smart Ingestion — Uses LLM to structure raw input into atomic memories.
|
|
3
|
+
* Accepts messy human input, produces clean markdown files with YAML frontmatter.
|
|
4
|
+
* Uses the LLM abstraction layer — works with Anthropic, Ollama, or any future provider.
|
|
5
|
+
*/
|
|
6
|
+
import { GnosysTagRegistry } from "./tags.js";
|
|
7
|
+
import { GnosysStore } from "./store.js";
|
|
8
|
+
import { GnosysConfig } from "./config.js";
|
|
9
|
+
interface IngestResult {
|
|
10
|
+
title: string;
|
|
11
|
+
category: string;
|
|
12
|
+
tags: Record<string, string[]>;
|
|
13
|
+
relevance: string;
|
|
14
|
+
content: string;
|
|
15
|
+
confidence: number;
|
|
16
|
+
filename: string;
|
|
17
|
+
proposedNewTags?: {
|
|
18
|
+
category: string;
|
|
19
|
+
tag: string;
|
|
20
|
+
}[];
|
|
21
|
+
}
|
|
22
|
+
export declare class GnosysIngestion {
|
|
23
|
+
private provider;
|
|
24
|
+
private tagRegistry;
|
|
25
|
+
private store;
|
|
26
|
+
private config;
|
|
27
|
+
constructor(store: GnosysStore, tagRegistry: GnosysTagRegistry, config?: GnosysConfig);
|
|
28
|
+
get isLLMAvailable(): boolean;
|
|
29
|
+
get providerName(): string;
|
|
30
|
+
/**
|
|
31
|
+
* Ingest raw text and structure it into an atomic memory.
|
|
32
|
+
* Uses LLM if available, otherwise requires structured input.
|
|
33
|
+
*/
|
|
34
|
+
ingest(rawInput: string): Promise<IngestResult>;
|
|
35
|
+
/**
|
|
36
|
+
* Create a memory from already-structured input (no LLM needed).
|
|
37
|
+
*/
|
|
38
|
+
createStructured(input: {
|
|
39
|
+
title: string;
|
|
40
|
+
category: string;
|
|
41
|
+
tags: Record<string, string[]>;
|
|
42
|
+
relevance?: string;
|
|
43
|
+
content: string;
|
|
44
|
+
author?: "human" | "ai" | "human+ai";
|
|
45
|
+
authority?: "declared" | "observed" | "imported" | "inferred";
|
|
46
|
+
confidence?: number;
|
|
47
|
+
}): IngestResult;
|
|
48
|
+
private slugify;
|
|
49
|
+
}
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=ingest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../src/lib/ingest.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,YAAY,EAAkB,MAAM,aAAa,CAAC;AAG3D,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACvD;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAAe;gBAEjB,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,YAAY;IAcrF,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED;;;OAGG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAmGrD;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE;QACtB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,UAAU,CAAC;QACrC,SAAS,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;QAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,YAAY;IAYhB,OAAO,CAAC,OAAO;CAOhB"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Smart Ingestion — Uses LLM to structure raw input into atomic memories.
|
|
3
|
+
* Accepts messy human input, produces clean markdown files with YAML frontmatter.
|
|
4
|
+
* Uses the LLM abstraction layer — works with Anthropic, Ollama, or any future provider.
|
|
5
|
+
*/
|
|
6
|
+
import { DEFAULT_CONFIG } from "./config.js";
|
|
7
|
+
import { getLLMProvider } from "./llm.js";
|
|
8
|
+
export class GnosysIngestion {
|
|
9
|
+
provider = null;
|
|
10
|
+
tagRegistry;
|
|
11
|
+
store;
|
|
12
|
+
config;
|
|
13
|
+
constructor(store, tagRegistry, config) {
|
|
14
|
+
this.store = store;
|
|
15
|
+
this.tagRegistry = tagRegistry;
|
|
16
|
+
this.config = config || DEFAULT_CONFIG;
|
|
17
|
+
// Initialize LLM provider via abstraction layer
|
|
18
|
+
try {
|
|
19
|
+
this.provider = getLLMProvider(this.config, "structuring");
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// Provider not available (e.g., no API key for Anthropic)
|
|
23
|
+
this.provider = null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
get isLLMAvailable() {
|
|
27
|
+
return this.provider !== null;
|
|
28
|
+
}
|
|
29
|
+
get providerName() {
|
|
30
|
+
return this.provider?.name || "none";
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Ingest raw text and structure it into an atomic memory.
|
|
34
|
+
* Uses LLM if available, otherwise requires structured input.
|
|
35
|
+
*/
|
|
36
|
+
async ingest(rawInput) {
|
|
37
|
+
if (!this.provider) {
|
|
38
|
+
const providerName = this.config.llm.defaultProvider;
|
|
39
|
+
throw new Error(providerName === "anthropic"
|
|
40
|
+
? "No ANTHROPIC_API_KEY set. Smart ingestion requires an LLM. " +
|
|
41
|
+
"Set the ANTHROPIC_API_KEY environment variable, switch to Ollama (gnosys config set provider ollama), or use gnosys_add_structured."
|
|
42
|
+
: `LLM provider "${providerName}" is not available. Check your configuration or use gnosys_add_structured.`);
|
|
43
|
+
}
|
|
44
|
+
const registry = this.tagRegistry.getRegistry();
|
|
45
|
+
const categories = await this.store.getCategories();
|
|
46
|
+
const systemPrompt = `You are Gnosys, a knowledge management system. Your job is to take raw, unstructured input and produce a structured atomic memory.
|
|
47
|
+
|
|
48
|
+
An atomic memory is ONE concept, decision, or piece of knowledge per file. If the input contains multiple concepts, focus on the primary one.
|
|
49
|
+
|
|
50
|
+
You must output valid JSON with these fields:
|
|
51
|
+
- title: A clear, concise title for this memory
|
|
52
|
+
- category: One of the existing categories or suggest a new one. Existing: ${categories.join(", ")}
|
|
53
|
+
- tags: An object with tag categories as keys and arrays of tags as values. Use ONLY tags from the registry below. If no existing tag fits, include a "proposed_new_tags" array.
|
|
54
|
+
- relevance: A keyword cloud (space-separated words, NOT sentences) describing every context where this memory would be useful. Include synonyms, related terms, abbreviations, and domain variations. Example: "auth authentication OAuth JWT login session tokens SSO identity credentials access-control permissions RBAC". Be generous — 15-30 keywords. This field powers discovery search.
|
|
55
|
+
- content: The memory content as clean markdown prose (NOT including the title as an H1 — that's added automatically)
|
|
56
|
+
- confidence: 0.0 to 1.0 — how confident you are this is a well-formed atomic memory
|
|
57
|
+
- filename: A kebab-case filename (without .md extension)
|
|
58
|
+
|
|
59
|
+
TAG REGISTRY:
|
|
60
|
+
${Object.entries(registry)
|
|
61
|
+
.map(([cat, tags]) => `${cat}: ${tags.join(", ")}`)
|
|
62
|
+
.join("\n")}
|
|
63
|
+
|
|
64
|
+
Rules:
|
|
65
|
+
1. One concept per memory. If the input is about multiple things, pick the most important one.
|
|
66
|
+
2. Use existing tags from the registry. Only propose new tags if nothing fits.
|
|
67
|
+
3. The content should be self-contained — someone reading just this file should understand the concept.
|
|
68
|
+
4. Be concise. Memories are meant to be quickly scanned, not deeply read.
|
|
69
|
+
5. Write in third person or neutral voice, not first person.
|
|
70
|
+
6. The relevance field is critical for discovery. Include all terms an agent might use to find this memory — think about what someone working on a related task would search for.`;
|
|
71
|
+
const text = await this.provider.generate(`Structure this into an atomic memory:\n\n${rawInput}`, { system: systemPrompt, maxTokens: 2000 });
|
|
72
|
+
// Parse JSON from response (handle markdown code blocks)
|
|
73
|
+
const jsonMatch = text.match(/```json\s*([\s\S]*?)```/) ||
|
|
74
|
+
text.match(/```\s*([\s\S]*?)```/) || [null, text];
|
|
75
|
+
const raw = JSON.parse(jsonMatch[1] || text);
|
|
76
|
+
// Sanitize parsed object — strip prototype-polluting keys
|
|
77
|
+
const parsed = {};
|
|
78
|
+
if (raw && typeof raw === "object") {
|
|
79
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
80
|
+
if (key === "__proto__" || key === "constructor" || key === "prototype")
|
|
81
|
+
continue;
|
|
82
|
+
parsed[key] = value;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Validate and clean up tags
|
|
86
|
+
const cleanTags = {};
|
|
87
|
+
const proposedNewTags = [];
|
|
88
|
+
if (parsed.tags && typeof parsed.tags === "object") {
|
|
89
|
+
for (const [cat, tags] of Object.entries(parsed.tags)) {
|
|
90
|
+
if (Array.isArray(tags)) {
|
|
91
|
+
const validTags = [];
|
|
92
|
+
for (const tag of tags) {
|
|
93
|
+
if (this.tagRegistry.hasTag(tag)) {
|
|
94
|
+
validTags.push(tag);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
proposedNewTags.push({ category: cat, tag });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (validTags.length > 0)
|
|
101
|
+
cleanTags[cat] = validTags;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Add any explicitly proposed new tags
|
|
106
|
+
if (parsed.proposed_new_tags) {
|
|
107
|
+
for (const item of parsed.proposed_new_tags) {
|
|
108
|
+
proposedNewTags.push(item);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
title: parsed.title || "Untitled Memory",
|
|
113
|
+
category: parsed.category || "uncategorized",
|
|
114
|
+
tags: cleanTags,
|
|
115
|
+
relevance: parsed.relevance || "",
|
|
116
|
+
content: parsed.content || rawInput,
|
|
117
|
+
confidence: parsed.confidence || 0.7,
|
|
118
|
+
filename: parsed.filename || this.slugify(parsed.title || "memory"),
|
|
119
|
+
proposedNewTags: proposedNewTags.length > 0 ? proposedNewTags : undefined,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Create a memory from already-structured input (no LLM needed).
|
|
124
|
+
*/
|
|
125
|
+
createStructured(input) {
|
|
126
|
+
return {
|
|
127
|
+
title: input.title,
|
|
128
|
+
category: input.category,
|
|
129
|
+
tags: input.tags,
|
|
130
|
+
relevance: input.relevance || "",
|
|
131
|
+
content: input.content,
|
|
132
|
+
confidence: input.confidence || 0.8,
|
|
133
|
+
filename: this.slugify(input.title),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
slugify(text) {
|
|
137
|
+
return text
|
|
138
|
+
.toLowerCase()
|
|
139
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
140
|
+
.replace(/^-|-$/g, "")
|
|
141
|
+
.substring(0, 60);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=ingest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/lib/ingest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Lensing — Filtered views of the memory store.
|
|
3
|
+
*
|
|
4
|
+
* A lens is a set of filter criteria applied to memories.
|
|
5
|
+
* Compound lenses combine multiple filters with AND/OR logic.
|
|
6
|
+
*/
|
|
7
|
+
import { Memory } from "./store.js";
|
|
8
|
+
export interface LensFilter {
|
|
9
|
+
category?: string;
|
|
10
|
+
tags?: string[];
|
|
11
|
+
tagMatchMode?: "any" | "all";
|
|
12
|
+
status?: ("active" | "archived" | "superseded")[];
|
|
13
|
+
author?: ("human" | "ai" | "human+ai")[];
|
|
14
|
+
authority?: ("declared" | "observed" | "imported" | "inferred")[];
|
|
15
|
+
minConfidence?: number;
|
|
16
|
+
maxConfidence?: number;
|
|
17
|
+
createdAfter?: string;
|
|
18
|
+
createdBefore?: string;
|
|
19
|
+
modifiedAfter?: string;
|
|
20
|
+
modifiedBefore?: string;
|
|
21
|
+
}
|
|
22
|
+
export type CompoundOperator = "AND" | "OR";
|
|
23
|
+
export interface CompoundLens {
|
|
24
|
+
filters: LensFilter[];
|
|
25
|
+
operator: CompoundOperator;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Apply a single lens filter to an array of memories.
|
|
29
|
+
*/
|
|
30
|
+
export declare function applyLens(memories: Memory[], lens: LensFilter): Memory[];
|
|
31
|
+
/**
|
|
32
|
+
* Apply a compound lens (multiple filters combined with AND/OR).
|
|
33
|
+
*/
|
|
34
|
+
export declare function applyCompoundLens(memories: Memory[], compound: CompoundLens): Memory[];
|
|
35
|
+
//# sourceMappingURL=lensing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lensing.d.ts","sourceRoot":"","sources":["../../src/lib/lensing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAC7B,MAAM,CAAC,EAAE,CAAC,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAC,EAAE,CAAC;IAClD,MAAM,CAAC,EAAE,CAAC,OAAO,GAAG,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC;IACzC,SAAS,CAAC,EAAE,CAAC,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC,EAAE,CAAC;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,IAAI,CAAC;AAE5C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,CAExE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAAE,EAClB,QAAQ,EAAE,YAAY,GACrB,MAAM,EAAE,CAcV"}
|