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.
Files changed (188) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1387 -0
  3. package/dist/cli.d.ts +7 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +3753 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/index.d.ts +8 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +2267 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/lib/archive.d.ts +95 -0
  12. package/dist/lib/archive.d.ts.map +1 -0
  13. package/dist/lib/archive.js +311 -0
  14. package/dist/lib/archive.js.map +1 -0
  15. package/dist/lib/ask.d.ts +77 -0
  16. package/dist/lib/ask.d.ts.map +1 -0
  17. package/dist/lib/ask.js +316 -0
  18. package/dist/lib/ask.js.map +1 -0
  19. package/dist/lib/audit.d.ts +47 -0
  20. package/dist/lib/audit.d.ts.map +1 -0
  21. package/dist/lib/audit.js +136 -0
  22. package/dist/lib/audit.js.map +1 -0
  23. package/dist/lib/bootstrap.d.ts +56 -0
  24. package/dist/lib/bootstrap.d.ts.map +1 -0
  25. package/dist/lib/bootstrap.js +163 -0
  26. package/dist/lib/bootstrap.js.map +1 -0
  27. package/dist/lib/config.d.ts +239 -0
  28. package/dist/lib/config.d.ts.map +1 -0
  29. package/dist/lib/config.js +371 -0
  30. package/dist/lib/config.js.map +1 -0
  31. package/dist/lib/dashboard.d.ts +81 -0
  32. package/dist/lib/dashboard.d.ts.map +1 -0
  33. package/dist/lib/dashboard.js +314 -0
  34. package/dist/lib/dashboard.js.map +1 -0
  35. package/dist/lib/db.d.ts +182 -0
  36. package/dist/lib/db.d.ts.map +1 -0
  37. package/dist/lib/db.js +620 -0
  38. package/dist/lib/db.js.map +1 -0
  39. package/dist/lib/dbSearch.d.ts +65 -0
  40. package/dist/lib/dbSearch.d.ts.map +1 -0
  41. package/dist/lib/dbSearch.js +239 -0
  42. package/dist/lib/dbSearch.js.map +1 -0
  43. package/dist/lib/dbWrite.d.ts +56 -0
  44. package/dist/lib/dbWrite.d.ts.map +1 -0
  45. package/dist/lib/dbWrite.js +171 -0
  46. package/dist/lib/dbWrite.js.map +1 -0
  47. package/dist/lib/dream.d.ts +170 -0
  48. package/dist/lib/dream.d.ts.map +1 -0
  49. package/dist/lib/dream.js +706 -0
  50. package/dist/lib/dream.js.map +1 -0
  51. package/dist/lib/embeddings.d.ts +84 -0
  52. package/dist/lib/embeddings.d.ts.map +1 -0
  53. package/dist/lib/embeddings.js +226 -0
  54. package/dist/lib/embeddings.js.map +1 -0
  55. package/dist/lib/export.d.ts +92 -0
  56. package/dist/lib/export.d.ts.map +1 -0
  57. package/dist/lib/export.js +362 -0
  58. package/dist/lib/export.js.map +1 -0
  59. package/dist/lib/federated.d.ts +113 -0
  60. package/dist/lib/federated.d.ts.map +1 -0
  61. package/dist/lib/federated.js +346 -0
  62. package/dist/lib/federated.js.map +1 -0
  63. package/dist/lib/graph.d.ts +50 -0
  64. package/dist/lib/graph.d.ts.map +1 -0
  65. package/dist/lib/graph.js +118 -0
  66. package/dist/lib/graph.js.map +1 -0
  67. package/dist/lib/history.d.ts +39 -0
  68. package/dist/lib/history.d.ts.map +1 -0
  69. package/dist/lib/history.js +112 -0
  70. package/dist/lib/history.js.map +1 -0
  71. package/dist/lib/hybridSearch.d.ts +80 -0
  72. package/dist/lib/hybridSearch.d.ts.map +1 -0
  73. package/dist/lib/hybridSearch.js +296 -0
  74. package/dist/lib/hybridSearch.js.map +1 -0
  75. package/dist/lib/import.d.ts +52 -0
  76. package/dist/lib/import.d.ts.map +1 -0
  77. package/dist/lib/import.js +365 -0
  78. package/dist/lib/import.js.map +1 -0
  79. package/dist/lib/ingest.d.ts +51 -0
  80. package/dist/lib/ingest.d.ts.map +1 -0
  81. package/dist/lib/ingest.js +144 -0
  82. package/dist/lib/ingest.js.map +1 -0
  83. package/dist/lib/lensing.d.ts +35 -0
  84. package/dist/lib/lensing.d.ts.map +1 -0
  85. package/dist/lib/lensing.js +85 -0
  86. package/dist/lib/lensing.js.map +1 -0
  87. package/dist/lib/llm.d.ts +84 -0
  88. package/dist/lib/llm.d.ts.map +1 -0
  89. package/dist/lib/llm.js +386 -0
  90. package/dist/lib/llm.js.map +1 -0
  91. package/dist/lib/lock.d.ts +28 -0
  92. package/dist/lib/lock.d.ts.map +1 -0
  93. package/dist/lib/lock.js +145 -0
  94. package/dist/lib/lock.js.map +1 -0
  95. package/dist/lib/maintenance.d.ts +124 -0
  96. package/dist/lib/maintenance.d.ts.map +1 -0
  97. package/dist/lib/maintenance.js +587 -0
  98. package/dist/lib/maintenance.js.map +1 -0
  99. package/dist/lib/migrate.d.ts +19 -0
  100. package/dist/lib/migrate.d.ts.map +1 -0
  101. package/dist/lib/migrate.js +260 -0
  102. package/dist/lib/migrate.js.map +1 -0
  103. package/dist/lib/preferences.d.ts +49 -0
  104. package/dist/lib/preferences.d.ts.map +1 -0
  105. package/dist/lib/preferences.js +149 -0
  106. package/dist/lib/preferences.js.map +1 -0
  107. package/dist/lib/projectIdentity.d.ts +66 -0
  108. package/dist/lib/projectIdentity.d.ts.map +1 -0
  109. package/dist/lib/projectIdentity.js +148 -0
  110. package/dist/lib/projectIdentity.js.map +1 -0
  111. package/dist/lib/recall.d.ts +82 -0
  112. package/dist/lib/recall.d.ts.map +1 -0
  113. package/dist/lib/recall.js +289 -0
  114. package/dist/lib/recall.js.map +1 -0
  115. package/dist/lib/resolver.d.ts +116 -0
  116. package/dist/lib/resolver.d.ts.map +1 -0
  117. package/dist/lib/resolver.js +372 -0
  118. package/dist/lib/resolver.js.map +1 -0
  119. package/dist/lib/retry.d.ts +24 -0
  120. package/dist/lib/retry.d.ts.map +1 -0
  121. package/dist/lib/retry.js +60 -0
  122. package/dist/lib/retry.js.map +1 -0
  123. package/dist/lib/rulesGen.d.ts +51 -0
  124. package/dist/lib/rulesGen.d.ts.map +1 -0
  125. package/dist/lib/rulesGen.js +167 -0
  126. package/dist/lib/rulesGen.js.map +1 -0
  127. package/dist/lib/search.d.ts +51 -0
  128. package/dist/lib/search.d.ts.map +1 -0
  129. package/dist/lib/search.js +190 -0
  130. package/dist/lib/search.js.map +1 -0
  131. package/dist/lib/staticSearch.d.ts +70 -0
  132. package/dist/lib/staticSearch.d.ts.map +1 -0
  133. package/dist/lib/staticSearch.js +162 -0
  134. package/dist/lib/staticSearch.js.map +1 -0
  135. package/dist/lib/store.d.ts +79 -0
  136. package/dist/lib/store.d.ts.map +1 -0
  137. package/dist/lib/store.js +227 -0
  138. package/dist/lib/store.js.map +1 -0
  139. package/dist/lib/structuredIngest.d.ts +37 -0
  140. package/dist/lib/structuredIngest.d.ts.map +1 -0
  141. package/dist/lib/structuredIngest.js +208 -0
  142. package/dist/lib/structuredIngest.js.map +1 -0
  143. package/dist/lib/tags.d.ts +26 -0
  144. package/dist/lib/tags.d.ts.map +1 -0
  145. package/dist/lib/tags.js +109 -0
  146. package/dist/lib/tags.js.map +1 -0
  147. package/dist/lib/timeline.d.ts +34 -0
  148. package/dist/lib/timeline.d.ts.map +1 -0
  149. package/dist/lib/timeline.js +116 -0
  150. package/dist/lib/timeline.js.map +1 -0
  151. package/dist/lib/trace.d.ts +42 -0
  152. package/dist/lib/trace.d.ts.map +1 -0
  153. package/dist/lib/trace.js +338 -0
  154. package/dist/lib/trace.js.map +1 -0
  155. package/dist/lib/webIndex.d.ts +28 -0
  156. package/dist/lib/webIndex.d.ts.map +1 -0
  157. package/dist/lib/webIndex.js +208 -0
  158. package/dist/lib/webIndex.js.map +1 -0
  159. package/dist/lib/webIngest.d.ts +51 -0
  160. package/dist/lib/webIngest.d.ts.map +1 -0
  161. package/dist/lib/webIngest.js +533 -0
  162. package/dist/lib/webIngest.js.map +1 -0
  163. package/dist/lib/wikilinks.d.ts +63 -0
  164. package/dist/lib/wikilinks.d.ts.map +1 -0
  165. package/dist/lib/wikilinks.js +146 -0
  166. package/dist/lib/wikilinks.js.map +1 -0
  167. package/dist/sandbox/client.d.ts +82 -0
  168. package/dist/sandbox/client.d.ts.map +1 -0
  169. package/dist/sandbox/client.js +128 -0
  170. package/dist/sandbox/client.js.map +1 -0
  171. package/dist/sandbox/helper-template.d.ts +14 -0
  172. package/dist/sandbox/helper-template.d.ts.map +1 -0
  173. package/dist/sandbox/helper-template.js +285 -0
  174. package/dist/sandbox/helper-template.js.map +1 -0
  175. package/dist/sandbox/index.d.ts +10 -0
  176. package/dist/sandbox/index.d.ts.map +1 -0
  177. package/dist/sandbox/index.js +10 -0
  178. package/dist/sandbox/index.js.map +1 -0
  179. package/dist/sandbox/manager.d.ts +40 -0
  180. package/dist/sandbox/manager.d.ts.map +1 -0
  181. package/dist/sandbox/manager.js +220 -0
  182. package/dist/sandbox/manager.js.map +1 -0
  183. package/dist/sandbox/server.d.ts +44 -0
  184. package/dist/sandbox/server.d.ts.map +1 -0
  185. package/dist/sandbox/server.js +661 -0
  186. package/dist/sandbox/server.js.map +1 -0
  187. package/package.json +103 -0
  188. 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":"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"}
@@ -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"}