stellar-memory 0.5.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 (197) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +362 -0
  3. package/dist/api/routes/analytics.d.ts +15 -0
  4. package/dist/api/routes/analytics.js +131 -0
  5. package/dist/api/routes/analytics.js.map +1 -0
  6. package/dist/api/routes/conflicts.d.ts +12 -0
  7. package/dist/api/routes/conflicts.js +67 -0
  8. package/dist/api/routes/conflicts.js.map +1 -0
  9. package/dist/api/routes/consolidation.d.ts +11 -0
  10. package/dist/api/routes/consolidation.js +63 -0
  11. package/dist/api/routes/consolidation.js.map +1 -0
  12. package/dist/api/routes/constellation.d.ts +4 -0
  13. package/dist/api/routes/constellation.js +84 -0
  14. package/dist/api/routes/constellation.js.map +1 -0
  15. package/dist/api/routes/memories.d.ts +4 -0
  16. package/dist/api/routes/memories.js +219 -0
  17. package/dist/api/routes/memories.js.map +1 -0
  18. package/dist/api/routes/observations.d.ts +10 -0
  19. package/dist/api/routes/observations.js +42 -0
  20. package/dist/api/routes/observations.js.map +1 -0
  21. package/dist/api/routes/orbit.d.ts +4 -0
  22. package/dist/api/routes/orbit.js +71 -0
  23. package/dist/api/routes/orbit.js.map +1 -0
  24. package/dist/api/routes/projects.d.ts +15 -0
  25. package/dist/api/routes/projects.js +121 -0
  26. package/dist/api/routes/projects.js.map +1 -0
  27. package/dist/api/routes/scan.d.ts +4 -0
  28. package/dist/api/routes/scan.js +403 -0
  29. package/dist/api/routes/scan.js.map +1 -0
  30. package/dist/api/routes/sun.d.ts +4 -0
  31. package/dist/api/routes/sun.js +43 -0
  32. package/dist/api/routes/sun.js.map +1 -0
  33. package/dist/api/routes/system.d.ts +4 -0
  34. package/dist/api/routes/system.js +70 -0
  35. package/dist/api/routes/system.js.map +1 -0
  36. package/dist/api/routes/temporal.d.ts +13 -0
  37. package/dist/api/routes/temporal.js +82 -0
  38. package/dist/api/routes/temporal.js.map +1 -0
  39. package/dist/api/server.d.ts +2 -0
  40. package/dist/api/server.js +99 -0
  41. package/dist/api/server.js.map +1 -0
  42. package/dist/api/websocket.d.ts +53 -0
  43. package/dist/api/websocket.js +168 -0
  44. package/dist/api/websocket.js.map +1 -0
  45. package/dist/cli/index.d.ts +12 -0
  46. package/dist/cli/index.js +35 -0
  47. package/dist/cli/index.js.map +1 -0
  48. package/dist/cli/init.d.ts +10 -0
  49. package/dist/cli/init.js +163 -0
  50. package/dist/cli/init.js.map +1 -0
  51. package/dist/engine/analytics.d.ts +93 -0
  52. package/dist/engine/analytics.js +437 -0
  53. package/dist/engine/analytics.js.map +1 -0
  54. package/dist/engine/conflict.d.ts +54 -0
  55. package/dist/engine/conflict.js +322 -0
  56. package/dist/engine/conflict.js.map +1 -0
  57. package/dist/engine/consolidation.d.ts +83 -0
  58. package/dist/engine/consolidation.js +368 -0
  59. package/dist/engine/consolidation.js.map +1 -0
  60. package/dist/engine/constellation.d.ts +66 -0
  61. package/dist/engine/constellation.js +382 -0
  62. package/dist/engine/constellation.js.map +1 -0
  63. package/dist/engine/corona.d.ts +53 -0
  64. package/dist/engine/corona.js +181 -0
  65. package/dist/engine/corona.js.map +1 -0
  66. package/dist/engine/embedding.d.ts +44 -0
  67. package/dist/engine/embedding.js +168 -0
  68. package/dist/engine/embedding.js.map +1 -0
  69. package/dist/engine/gravity.d.ts +63 -0
  70. package/dist/engine/gravity.js +121 -0
  71. package/dist/engine/gravity.js.map +1 -0
  72. package/dist/engine/multiproject.d.ts +75 -0
  73. package/dist/engine/multiproject.js +241 -0
  74. package/dist/engine/multiproject.js.map +1 -0
  75. package/dist/engine/observation.d.ts +82 -0
  76. package/dist/engine/observation.js +357 -0
  77. package/dist/engine/observation.js.map +1 -0
  78. package/dist/engine/orbit.d.ts +91 -0
  79. package/dist/engine/orbit.js +249 -0
  80. package/dist/engine/orbit.js.map +1 -0
  81. package/dist/engine/planet.d.ts +64 -0
  82. package/dist/engine/planet.js +432 -0
  83. package/dist/engine/planet.js.map +1 -0
  84. package/dist/engine/procedural.d.ts +71 -0
  85. package/dist/engine/procedural.js +259 -0
  86. package/dist/engine/procedural.js.map +1 -0
  87. package/dist/engine/quality.d.ts +48 -0
  88. package/dist/engine/quality.js +245 -0
  89. package/dist/engine/quality.js.map +1 -0
  90. package/dist/engine/repository.d.ts +79 -0
  91. package/dist/engine/repository.js +13 -0
  92. package/dist/engine/repository.js.map +1 -0
  93. package/dist/engine/sun.d.ts +61 -0
  94. package/dist/engine/sun.js +240 -0
  95. package/dist/engine/sun.js.map +1 -0
  96. package/dist/engine/temporal.d.ts +67 -0
  97. package/dist/engine/temporal.js +283 -0
  98. package/dist/engine/temporal.js.map +1 -0
  99. package/dist/engine/types.d.ts +179 -0
  100. package/dist/engine/types.js +27 -0
  101. package/dist/engine/types.js.map +1 -0
  102. package/dist/index.d.ts +2 -0
  103. package/dist/index.js +60 -0
  104. package/dist/index.js.map +1 -0
  105. package/dist/mcp/connector-registry.d.ts +20 -0
  106. package/dist/mcp/connector-registry.js +35 -0
  107. package/dist/mcp/connector-registry.js.map +1 -0
  108. package/dist/mcp/server.d.ts +13 -0
  109. package/dist/mcp/server.js +242 -0
  110. package/dist/mcp/server.js.map +1 -0
  111. package/dist/mcp/tools/daemon-tool.d.ts +16 -0
  112. package/dist/mcp/tools/daemon-tool.js +58 -0
  113. package/dist/mcp/tools/daemon-tool.js.map +1 -0
  114. package/dist/mcp/tools/ingestion-tools.d.ts +20 -0
  115. package/dist/mcp/tools/ingestion-tools.js +34 -0
  116. package/dist/mcp/tools/ingestion-tools.js.map +1 -0
  117. package/dist/mcp/tools/memory-tools.d.ts +122 -0
  118. package/dist/mcp/tools/memory-tools.js +1037 -0
  119. package/dist/mcp/tools/memory-tools.js.map +1 -0
  120. package/dist/scanner/cloud/github.d.ts +34 -0
  121. package/dist/scanner/cloud/github.js +260 -0
  122. package/dist/scanner/cloud/github.js.map +1 -0
  123. package/dist/scanner/cloud/google-drive.d.ts +30 -0
  124. package/dist/scanner/cloud/google-drive.js +289 -0
  125. package/dist/scanner/cloud/google-drive.js.map +1 -0
  126. package/dist/scanner/cloud/notion.d.ts +33 -0
  127. package/dist/scanner/cloud/notion.js +231 -0
  128. package/dist/scanner/cloud/notion.js.map +1 -0
  129. package/dist/scanner/cloud/slack.d.ts +38 -0
  130. package/dist/scanner/cloud/slack.js +282 -0
  131. package/dist/scanner/cloud/slack.js.map +1 -0
  132. package/dist/scanner/cloud/types.d.ts +73 -0
  133. package/dist/scanner/cloud/types.js +9 -0
  134. package/dist/scanner/cloud/types.js.map +1 -0
  135. package/dist/scanner/index.d.ts +35 -0
  136. package/dist/scanner/index.js +420 -0
  137. package/dist/scanner/index.js.map +1 -0
  138. package/dist/scanner/local/filesystem.d.ts +33 -0
  139. package/dist/scanner/local/filesystem.js +203 -0
  140. package/dist/scanner/local/filesystem.js.map +1 -0
  141. package/dist/scanner/local/git.d.ts +24 -0
  142. package/dist/scanner/local/git.js +161 -0
  143. package/dist/scanner/local/git.js.map +1 -0
  144. package/dist/scanner/local/parsers/code.d.ts +3 -0
  145. package/dist/scanner/local/parsers/code.js +127 -0
  146. package/dist/scanner/local/parsers/code.js.map +1 -0
  147. package/dist/scanner/local/parsers/index.d.ts +11 -0
  148. package/dist/scanner/local/parsers/index.js +24 -0
  149. package/dist/scanner/local/parsers/index.js.map +1 -0
  150. package/dist/scanner/local/parsers/json-parser.d.ts +3 -0
  151. package/dist/scanner/local/parsers/json-parser.js +117 -0
  152. package/dist/scanner/local/parsers/json-parser.js.map +1 -0
  153. package/dist/scanner/local/parsers/markdown.d.ts +3 -0
  154. package/dist/scanner/local/parsers/markdown.js +120 -0
  155. package/dist/scanner/local/parsers/markdown.js.map +1 -0
  156. package/dist/scanner/local/parsers/text.d.ts +3 -0
  157. package/dist/scanner/local/parsers/text.js +41 -0
  158. package/dist/scanner/local/parsers/text.js.map +1 -0
  159. package/dist/scanner/metadata-scanner.d.ts +67 -0
  160. package/dist/scanner/metadata-scanner.js +356 -0
  161. package/dist/scanner/metadata-scanner.js.map +1 -0
  162. package/dist/scanner/types.d.ts +47 -0
  163. package/dist/scanner/types.js +19 -0
  164. package/dist/scanner/types.js.map +1 -0
  165. package/dist/service/daemon.d.ts +23 -0
  166. package/dist/service/daemon.js +105 -0
  167. package/dist/service/daemon.js.map +1 -0
  168. package/dist/service/scheduler.d.ts +73 -0
  169. package/dist/service/scheduler.js +281 -0
  170. package/dist/service/scheduler.js.map +1 -0
  171. package/dist/storage/database.d.ts +10 -0
  172. package/dist/storage/database.js +265 -0
  173. package/dist/storage/database.js.map +1 -0
  174. package/dist/storage/queries.d.ts +85 -0
  175. package/dist/storage/queries.js +865 -0
  176. package/dist/storage/queries.js.map +1 -0
  177. package/dist/storage/sqlite-repository.d.ts +32 -0
  178. package/dist/storage/sqlite-repository.js +68 -0
  179. package/dist/storage/sqlite-repository.js.map +1 -0
  180. package/dist/storage/vec.d.ts +62 -0
  181. package/dist/storage/vec.js +111 -0
  182. package/dist/storage/vec.js.map +1 -0
  183. package/dist/utils/config.d.ts +5 -0
  184. package/dist/utils/config.js +60 -0
  185. package/dist/utils/config.js.map +1 -0
  186. package/dist/utils/logger.d.ts +36 -0
  187. package/dist/utils/logger.js +86 -0
  188. package/dist/utils/logger.js.map +1 -0
  189. package/dist/utils/time.d.ts +21 -0
  190. package/dist/utils/time.js +42 -0
  191. package/dist/utils/time.js.map +1 -0
  192. package/dist/utils/tokenizer.d.ts +13 -0
  193. package/dist/utils/tokenizer.js +46 -0
  194. package/dist/utils/tokenizer.js.map +1 -0
  195. package/package.json +77 -0
  196. package/scripts/check-node.mjs +36 -0
  197. package/scripts/setup.mjs +157 -0
@@ -0,0 +1,120 @@
1
+ import { basename, extname } from 'node:path';
2
+ /**
3
+ * Minimal YAML frontmatter parser.
4
+ * Handles the common subset: key: value pairs (strings, numbers, booleans, arrays).
5
+ * Does not depend on any external yaml library.
6
+ */
7
+ function parseFrontmatter(raw) {
8
+ const FM_RE = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/;
9
+ const match = FM_RE.exec(raw.trimStart());
10
+ if (!match)
11
+ return { meta: {}, body: raw };
12
+ const yamlBlock = match[1];
13
+ const body = match[2] ?? '';
14
+ const meta = {};
15
+ for (const line of yamlBlock.split('\n')) {
16
+ const kv = /^(\w[\w-]*):\s*(.*)$/.exec(line.trim());
17
+ if (!kv)
18
+ continue;
19
+ const [, key, val] = kv;
20
+ const trimmed = val.trim();
21
+ if (trimmed === 'true') {
22
+ meta[key] = true;
23
+ }
24
+ else if (trimmed === 'false') {
25
+ meta[key] = false;
26
+ }
27
+ else if (/^-?\d+(\.\d+)?$/.test(trimmed)) {
28
+ meta[key] = Number(trimmed);
29
+ }
30
+ else if (trimmed.startsWith('[') && trimmed.endsWith(']')) {
31
+ // Simple inline array: [a, b, c]
32
+ meta[key] = trimmed
33
+ .slice(1, -1)
34
+ .split(',')
35
+ .map((s) => s.trim().replace(/^["']|["']$/g, ''))
36
+ .filter(Boolean);
37
+ }
38
+ else {
39
+ meta[key] = trimmed.replace(/^["']|["']$/g, '');
40
+ }
41
+ }
42
+ return { meta, body };
43
+ }
44
+ /** Extract the first ATX heading (# Title) or use filename. */
45
+ function extractTitle(body, filePath) {
46
+ const headingMatch = /^#{1,3}\s+(.+)$/m.exec(body);
47
+ if (headingMatch)
48
+ return headingMatch[1].trim();
49
+ return basename(filePath, extname(filePath));
50
+ }
51
+ /** Build a short summary from the first non-heading paragraph (max 160 chars). */
52
+ function extractSummary(body, title) {
53
+ const lines = body
54
+ .split('\n')
55
+ .map((l) => l.trim())
56
+ .filter((l) => l && !l.startsWith('#') && !l.startsWith('---'));
57
+ const first = lines.find((l) => l.length > 10) ?? title;
58
+ return first.length > 160 ? first.slice(0, 157) + '...' : first;
59
+ }
60
+ /** Infer MemoryType from frontmatter or file name. */
61
+ function inferType(meta, filePath) {
62
+ const typeVal = meta['type']?.toLowerCase();
63
+ const validTypes = ['decision', 'observation', 'task', 'context', 'error', 'milestone'];
64
+ if (typeVal && validTypes.includes(typeVal))
65
+ return typeVal;
66
+ const lower = filePath.toLowerCase();
67
+ if (lower.includes('adr') || lower.includes('decision'))
68
+ return 'decision';
69
+ if (lower.includes('todo') || lower.includes('task'))
70
+ return 'task';
71
+ if (lower.includes('error') || lower.includes('bug'))
72
+ return 'error';
73
+ if (lower.includes('changelog') || lower.includes('release'))
74
+ return 'milestone';
75
+ return 'context';
76
+ }
77
+ /** Derive tags from frontmatter, file extension, and path segments. */
78
+ function buildTags(meta, filePath) {
79
+ const tags = ['markdown'];
80
+ const fmTags = meta['tags'] ?? meta['keywords'];
81
+ if (Array.isArray(fmTags)) {
82
+ for (const t of fmTags) {
83
+ if (typeof t === 'string' && t.trim())
84
+ tags.push(t.trim().toLowerCase());
85
+ }
86
+ }
87
+ // Add directory-level context as tags (skip generic names)
88
+ const parts = filePath.replace(/\\/g, '/').split('/');
89
+ const interesting = parts.slice(-4, -1);
90
+ for (const part of interesting) {
91
+ if (part && part !== '.' && !part.includes(':')) {
92
+ tags.push(part.toLowerCase());
93
+ }
94
+ }
95
+ return [...new Set(tags)];
96
+ }
97
+ // ---------------------------------------------------------------------------
98
+ export const markdownParser = {
99
+ extensions: ['.md', '.mdx'],
100
+ parse(filePath, rawContent) {
101
+ const { meta, body } = parseFrontmatter(rawContent);
102
+ const title = meta['title'] ?? extractTitle(body, filePath);
103
+ const summary = meta['summary'] ?? meta['description'] ?? extractSummary(body, title);
104
+ const type = inferType(meta, filePath);
105
+ const tags = buildTags(meta, filePath);
106
+ return {
107
+ title,
108
+ summary,
109
+ content: rawContent,
110
+ type,
111
+ tags,
112
+ metadata: {
113
+ ...meta,
114
+ filePath,
115
+ wordCount: body.split(/\s+/).filter(Boolean).length,
116
+ },
117
+ };
118
+ },
119
+ };
120
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../../src/scanner/local/parsers/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAI9C;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,KAAK,GAAG,6CAA6C,CAAC;IAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAE3C,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,IAAI,GAA4B,EAAE,CAAC;IAEzC,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,EAAE,GAAG,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,EAAE;YAAE,SAAS;QAClB,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAE3B,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACnB,CAAC;aAAM,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YAC/B,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,CAAC;aAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5D,iCAAiC;YACjC,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO;iBAChB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;iBACZ,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;iBAChD,MAAM,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,+DAA+D;AAC/D,SAAS,YAAY,CAAC,IAAY,EAAE,QAAgB;IAClD,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,OAAO,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,kFAAkF;AAClF,SAAS,cAAc,CAAC,IAAY,EAAE,KAAa;IACjD,MAAM,KAAK,GAAG,IAAI;SACf,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAElE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC;IACxD,OAAO,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAClE,CAAC;AAED,sDAAsD;AACtD,SAAS,SAAS,CAAC,IAA6B,EAAE,QAAgB;IAChE,MAAM,OAAO,GAAI,IAAI,CAAC,MAAM,CAAwB,EAAE,WAAW,EAAE,CAAC;IACpE,MAAM,UAAU,GAAiB,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACtG,IAAI,OAAO,IAAK,UAAuB,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAqB,CAAC;IAExF,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAC3E,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAM,OAAO,MAAM,CAAC;IACxE,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAM,OAAO,OAAO,CAAC;IACzE,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,WAAW,CAAC;IACjF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,uEAAuE;AACvE,SAAS,SAAS,CAAC,IAA6B,EAAE,QAAgB;IAChE,MAAM,IAAI,GAAa,CAAC,UAAU,CAAC,CAAC;IAEpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,8EAA8E;AAE9E,MAAM,CAAC,MAAM,cAAc,GAAe;IACxC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;IAE3B,KAAK,CAAC,QAAgB,EAAE,UAAkB;QACxC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,KAAK,GAAM,IAAI,CAAC,OAAO,CAAwB,IAAI,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtF,MAAM,OAAO,GAAI,IAAI,CAAC,SAAS,CAAwB,IAAK,IAAI,CAAC,aAAa,CAAwB,IAAI,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACtI,MAAM,IAAI,GAAM,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAM,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAE1C,OAAO;YACL,KAAK;YACL,OAAO;YACP,OAAO,EAAE,UAAU;YACnB,IAAI;YACJ,IAAI;YACJ,QAAQ,EAAE;gBACR,GAAG,IAAI;gBACP,QAAQ;gBACR,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM;aACpD;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FileParser } from '../../types.js';
2
+ export declare const textParser: FileParser;
3
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1,41 @@
1
+ import { basename, extname } from 'node:path';
2
+ function inferType(filePath) {
3
+ const lower = filePath.toLowerCase();
4
+ if (lower.endsWith('.log') || lower.includes('error') || lower.includes('crash'))
5
+ return 'error';
6
+ return 'observation';
7
+ }
8
+ function buildTags(filePath, ext) {
9
+ const tags = [ext.replace('.', '') || 'text'];
10
+ const parts = filePath.replace(/\\/g, '/').split('/');
11
+ const interesting = parts.slice(-4, -1);
12
+ for (const part of interesting) {
13
+ if (part && part !== '.' && !part.includes(':')) {
14
+ tags.push(part.toLowerCase());
15
+ }
16
+ }
17
+ return [...new Set(tags)];
18
+ }
19
+ export const textParser = {
20
+ extensions: ['.txt', '.log'],
21
+ parse(filePath, content) {
22
+ const ext = extname(filePath).toLowerCase();
23
+ const title = basename(filePath, ext);
24
+ // Use first non-empty line as summary (max 160 chars)
25
+ const firstLine = content.split('\n').map((l) => l.trim()).find((l) => l.length > 0) ?? title;
26
+ const summary = firstLine.length > 160 ? firstLine.slice(0, 157) + '...' : firstLine;
27
+ return {
28
+ title,
29
+ summary,
30
+ content,
31
+ type: inferType(filePath),
32
+ tags: buildTags(filePath, ext),
33
+ metadata: {
34
+ filePath,
35
+ lineCount: content.split('\n').length,
36
+ wordCount: content.split(/\s+/).filter(Boolean).length,
37
+ },
38
+ };
39
+ },
40
+ };
41
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../../../src/scanner/local/parsers/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAI9C,SAAS,SAAS,CAAC,QAAgB;IACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACjG,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAE,GAAW;IAC9C,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAe;IACpC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IAE5B,KAAK,CAAC,QAAgB,EAAE,OAAe;QACrC,MAAM,GAAG,GAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAEtC,sDAAsD;QACtD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC;QAC9F,MAAM,OAAO,GAAK,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAEvF,OAAO;YACL,KAAK;YACL,OAAO;YACP,OAAO;YACP,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC;YACzB,IAAI,EAAE,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC;YAC9B,QAAQ,EAAE;gBACR,QAAQ;gBACR,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM;gBACrC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM;aACvD;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * metadata-scanner.ts — Fast file scanner using only fs.stat() metadata.
3
+ *
4
+ * Scans directories without reading file contents. Calculates importance
5
+ * based on recency, file type, path location, and size. Designed to handle
6
+ * an entire drive (C:\) in seconds rather than hours.
7
+ */
8
+ export interface FileMetaEntry {
9
+ path: string;
10
+ name: string;
11
+ extension: string;
12
+ size: number;
13
+ mtimeMs: number;
14
+ isDirectory: boolean;
15
+ }
16
+ export interface MetaScanConfig {
17
+ /** Root paths to scan (default: ['C:\\']) */
18
+ paths: string[];
19
+ /** Maximum directory depth (default: Infinity) */
20
+ maxDepth?: number;
21
+ /** AbortSignal to cancel scan */
22
+ abortSignal?: AbortSignal;
23
+ }
24
+ export type MetaScanCategory = 'core' | 'active' | 'archive' | 'forgotten';
25
+ export declare const CODE_EXTENSIONS: Set<string>;
26
+ export declare const DOC_EXTENSIONS: Set<string>;
27
+ export declare const CONFIG_EXTENSIONS: Set<string>;
28
+ export declare const DATA_EXTENSIONS: Set<string>;
29
+ export declare const IMAGE_EXTENSIONS: Set<string>;
30
+ export declare const ARCHIVE_EXTENSIONS: Set<string>;
31
+ export declare const BINARY_EXTENSIONS: Set<string>;
32
+ export declare const MEDIA_EXTENSIONS: Set<string>;
33
+ /** Directories to completely skip (never enter) */
34
+ export declare const SYSTEM_EXCLUDE_DIRS: Set<string>;
35
+ /** Path segments that indicate game directories */
36
+ export declare const GAME_DIR_PATTERNS: string[];
37
+ /**
38
+ * Calculate file importance (0.0–1.0) from metadata alone.
39
+ *
40
+ * Scoring factors:
41
+ * - recencyBonus: 0.00–0.35 (how recently modified)
42
+ * - typeBonus: 0.00–0.25 (file type category)
43
+ * - pathBonus: 0.00–0.20 (user work directory)
44
+ * - sizePenalty: 0.00–-0.50 (very large files penalized)
45
+ * - blacklist: forces 0.05 for game/system paths
46
+ */
47
+ export declare function calculateFileImportance(entry: FileMetaEntry, nowMs?: number): number;
48
+ /**
49
+ * Classify a file into a category based on importance.
50
+ */
51
+ export declare function categorizeImportance(importance: number): MetaScanCategory;
52
+ /**
53
+ * Build a human-readable size string.
54
+ */
55
+ export declare function formatSize(bytes: number): string;
56
+ /**
57
+ * Async generator that yields FileMetaEntry for every file found.
58
+ *
59
+ * Uses opendir() for streaming and stat() for metadata.
60
+ * Never calls readFile(). Memory-efficient for 100k+ files.
61
+ */
62
+ export declare function scanMetadata(config: MetaScanConfig): AsyncGenerator<FileMetaEntry>;
63
+ /**
64
+ * Build tags array from file metadata.
65
+ */
66
+ export declare function buildTags(entry: FileMetaEntry): string[];
67
+ //# sourceMappingURL=metadata-scanner.d.ts.map
@@ -0,0 +1,356 @@
1
+ /**
2
+ * metadata-scanner.ts — Fast file scanner using only fs.stat() metadata.
3
+ *
4
+ * Scans directories without reading file contents. Calculates importance
5
+ * based on recency, file type, path location, and size. Designed to handle
6
+ * an entire drive (C:\) in seconds rather than hours.
7
+ */
8
+ import { opendir, stat } from 'node:fs/promises';
9
+ import { extname, basename, dirname, resolve } from 'node:path';
10
+ // ---------------------------------------------------------------------------
11
+ // Classification sets
12
+ // ---------------------------------------------------------------------------
13
+ export const CODE_EXTENSIONS = new Set([
14
+ '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
15
+ '.py', '.pyw',
16
+ '.java', '.kt', '.kts',
17
+ '.go',
18
+ '.rs',
19
+ '.c', '.cpp', '.cc', '.cxx', '.h', '.hpp',
20
+ '.cs',
21
+ '.rb',
22
+ '.php',
23
+ '.swift',
24
+ '.scala',
25
+ '.lua',
26
+ '.sh', '.bash', '.zsh', '.ps1',
27
+ '.sql',
28
+ '.r', '.R',
29
+ '.dart',
30
+ '.vue', '.svelte',
31
+ ]);
32
+ export const DOC_EXTENSIONS = new Set([
33
+ '.docx', '.doc', '.xlsx', '.xls', '.pptx', '.ppt',
34
+ '.pdf', '.txt', '.md', '.mdx', '.rst', '.rtf',
35
+ '.odt', '.ods', '.odp',
36
+ '.csv', '.tsv',
37
+ '.tex', '.latex',
38
+ ]);
39
+ export const CONFIG_EXTENSIONS = new Set([
40
+ '.env', '.json', '.yaml', '.yml', '.toml', '.ini', '.cfg',
41
+ '.xml', '.conf', '.config', '.properties',
42
+ '.editorconfig', '.gitignore', '.gitattributes',
43
+ '.eslintrc', '.prettierrc', '.babelrc',
44
+ ]);
45
+ export const DATA_EXTENSIONS = new Set([
46
+ '.csv', '.sql', '.db', '.sqlite', '.sqlite3',
47
+ '.parquet', '.avro', '.json', '.jsonl', '.ndjson',
48
+ '.xls', '.xlsx',
49
+ ]);
50
+ export const IMAGE_EXTENSIONS = new Set([
51
+ '.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp',
52
+ '.bmp', '.ico', '.tiff', '.tif',
53
+ '.psd', '.ai', '.sketch', '.fig', '.xd',
54
+ ]);
55
+ export const ARCHIVE_EXTENSIONS = new Set([
56
+ '.zip', '.tar', '.gz', '.tgz', '.bz2', '.xz',
57
+ '.7z', '.rar', '.cab',
58
+ ]);
59
+ export const BINARY_EXTENSIONS = new Set([
60
+ '.exe', '.dll', '.sys', '.msi', '.msp', '.msm',
61
+ '.ocx', '.drv', '.cpl', '.scr',
62
+ '.so', '.dylib', '.a', '.lib', '.obj', '.o',
63
+ '.bin', '.dat', '.iso', '.img', '.vmdk', '.vhd',
64
+ '.wasm',
65
+ ]);
66
+ export const MEDIA_EXTENSIONS = new Set([
67
+ '.mp3', '.mp4', '.avi', '.mkv', '.mov', '.wmv',
68
+ '.flac', '.wav', '.ogg', '.aac', '.m4a',
69
+ '.webm', '.flv', '.m4v',
70
+ ]);
71
+ // ---------------------------------------------------------------------------
72
+ // Directory exclusion / classification patterns
73
+ // ---------------------------------------------------------------------------
74
+ /** Directories to completely skip (never enter) */
75
+ export const SYSTEM_EXCLUDE_DIRS = new Set([
76
+ '$recycle.bin',
77
+ 'system volume information',
78
+ 'pagefile.sys',
79
+ 'hiberfil.sys',
80
+ 'swapfile.sys',
81
+ 'dumpstack.log',
82
+ 'dumpstack.log.tmp',
83
+ 'recovery',
84
+ 'msocache',
85
+ '$windows.~bt',
86
+ '$windows.~ws',
87
+ 'config.msi',
88
+ ]);
89
+ /** Additional dir names to exclude (deep caches / generated content) */
90
+ const CACHE_EXCLUDE_DIRS = new Set([
91
+ 'node_modules',
92
+ '.git',
93
+ '__pycache__',
94
+ '.cache',
95
+ '.npm',
96
+ '.yarn',
97
+ '.pnpm-store',
98
+ '.cargo',
99
+ '.rustup',
100
+ '.gradle',
101
+ '.m2',
102
+ '.nuget',
103
+ 'packages',
104
+ 'obj',
105
+ 'bin',
106
+ '.next',
107
+ '.turbo',
108
+ 'dist',
109
+ 'build',
110
+ '.tox',
111
+ '.venv',
112
+ 'venv',
113
+ 'env',
114
+ '.mypy_cache',
115
+ '.pytest_cache',
116
+ '.ruff_cache',
117
+ 'coverage',
118
+ '.nyc_output',
119
+ ]);
120
+ /** Path segments that indicate game directories */
121
+ export const GAME_DIR_PATTERNS = [
122
+ 'steam', 'steamapps', 'epic games', 'riot games',
123
+ 'ubisoft', 'origin', 'gog galaxy', 'battlenet',
124
+ 'ea games', 'rockstar games',
125
+ ];
126
+ /** Path segments that indicate system directories */
127
+ const SYSTEM_PATH_SEGMENTS = [
128
+ 'windows', 'program files', 'program files (x86)',
129
+ 'programdata', 'appdata\\local\\temp',
130
+ 'winsxs', 'assembly',
131
+ ];
132
+ /** Path segments that indicate user work directories */
133
+ const USER_WORK_SEGMENTS = [
134
+ 'documents', 'desktop', 'projects', 'source', 'repos',
135
+ 'workspace', 'dev', 'code', 'src', 'work',
136
+ 'downloads',
137
+ ];
138
+ // ---------------------------------------------------------------------------
139
+ // Importance calculation
140
+ // ---------------------------------------------------------------------------
141
+ const MS_PER_DAY = 86_400_000;
142
+ function daysSince(mtimeMs, nowMs) {
143
+ return Math.max(0, (nowMs - mtimeMs) / MS_PER_DAY);
144
+ }
145
+ /**
146
+ * Determine if a path is inside a game directory.
147
+ */
148
+ function isGamePath(lowerPath) {
149
+ return GAME_DIR_PATTERNS.some((p) => lowerPath.includes(p));
150
+ }
151
+ /**
152
+ * Determine if a path is inside a system directory.
153
+ */
154
+ function isSystemPath(lowerPath) {
155
+ return SYSTEM_PATH_SEGMENTS.some((p) => lowerPath.includes(p));
156
+ }
157
+ /**
158
+ * Determine if a path is inside a user work directory.
159
+ */
160
+ function isUserWorkPath(lowerPath) {
161
+ // Must be under Users/<username>/...
162
+ const usersMatch = /[/\\]users[/\\][^/\\]+[/\\]/i.test(lowerPath);
163
+ if (!usersMatch)
164
+ return false;
165
+ return USER_WORK_SEGMENTS.some((seg) => lowerPath.includes(seg));
166
+ }
167
+ /**
168
+ * Calculate file importance (0.0–1.0) from metadata alone.
169
+ *
170
+ * Scoring factors:
171
+ * - recencyBonus: 0.00–0.35 (how recently modified)
172
+ * - typeBonus: 0.00–0.25 (file type category)
173
+ * - pathBonus: 0.00–0.20 (user work directory)
174
+ * - sizePenalty: 0.00–-0.50 (very large files penalized)
175
+ * - blacklist: forces 0.05 for game/system paths
176
+ */
177
+ export function calculateFileImportance(entry, nowMs) {
178
+ const now = nowMs ?? Date.now();
179
+ const lowerPath = entry.path.toLowerCase().replace(/\\/g, '/');
180
+ const ext = entry.extension.toLowerCase();
181
+ // ── Blacklist: game/system → forced low importance ──
182
+ if (isGamePath(lowerPath) || isSystemPath(lowerPath)) {
183
+ return 0.05;
184
+ }
185
+ // ── Recency bonus (0.00 – 0.35) ──
186
+ const days = daysSince(entry.mtimeMs, now);
187
+ let recencyBonus;
188
+ if (days <= 7)
189
+ recencyBonus = 0.35;
190
+ else if (days <= 30)
191
+ recencyBonus = 0.20;
192
+ else if (days <= 90)
193
+ recencyBonus = 0.10;
194
+ else
195
+ recencyBonus = 0.0;
196
+ // ── Type bonus (0.00 – 0.25) ──
197
+ let typeBonus;
198
+ if (CODE_EXTENSIONS.has(ext) || CONFIG_EXTENSIONS.has(ext)) {
199
+ typeBonus = 0.25;
200
+ }
201
+ else if (DOC_EXTENSIONS.has(ext)) {
202
+ typeBonus = 0.25;
203
+ }
204
+ else if (DATA_EXTENSIONS.has(ext) || IMAGE_EXTENSIONS.has(ext)) {
205
+ typeBonus = 0.10;
206
+ }
207
+ else if (ARCHIVE_EXTENSIONS.has(ext)) {
208
+ typeBonus = 0.05;
209
+ }
210
+ else if (BINARY_EXTENSIONS.has(ext) || MEDIA_EXTENSIONS.has(ext)) {
211
+ typeBonus = 0.0;
212
+ }
213
+ else {
214
+ // Unknown extension — small baseline
215
+ typeBonus = 0.05;
216
+ }
217
+ // ── Path bonus (0.00 – 0.20) ──
218
+ const pathBonus = isUserWorkPath(lowerPath) ? 0.20 : 0.0;
219
+ // ── Size penalty (0.00 – -0.50) ──
220
+ const sizeMB = entry.size / (1024 * 1024);
221
+ let sizePenalty;
222
+ if (sizeMB >= 500)
223
+ sizePenalty = -0.50;
224
+ else if (sizeMB >= 100)
225
+ sizePenalty = -0.30;
226
+ else if (sizeMB >= 50)
227
+ sizePenalty = -0.10;
228
+ else
229
+ sizePenalty = 0.0;
230
+ const raw = recencyBonus + typeBonus + pathBonus + sizePenalty;
231
+ return Math.min(1.0, Math.max(0.0, raw));
232
+ }
233
+ /**
234
+ * Classify a file into a category based on importance.
235
+ */
236
+ export function categorizeImportance(importance) {
237
+ if (importance >= 0.45)
238
+ return 'core';
239
+ if (importance >= 0.25)
240
+ return 'active';
241
+ if (importance >= 0.10)
242
+ return 'archive';
243
+ return 'forgotten';
244
+ }
245
+ /**
246
+ * Build a human-readable size string.
247
+ */
248
+ export function formatSize(bytes) {
249
+ if (bytes < 1024)
250
+ return `${bytes} B`;
251
+ if (bytes < 1024 * 1024)
252
+ return `${(bytes / 1024).toFixed(1)} KB`;
253
+ if (bytes < 1024 * 1024 * 1024)
254
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
255
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;
256
+ }
257
+ // ---------------------------------------------------------------------------
258
+ // Directory scanner (streaming, no file reads)
259
+ // ---------------------------------------------------------------------------
260
+ function shouldExcludeDir(name) {
261
+ const lower = name.toLowerCase();
262
+ return SYSTEM_EXCLUDE_DIRS.has(lower) || CACHE_EXCLUDE_DIRS.has(lower);
263
+ }
264
+ /**
265
+ * Async generator that yields FileMetaEntry for every file found.
266
+ *
267
+ * Uses opendir() for streaming and stat() for metadata.
268
+ * Never calls readFile(). Memory-efficient for 100k+ files.
269
+ */
270
+ export async function* scanMetadata(config) {
271
+ const maxDepth = config.maxDepth ?? Infinity;
272
+ async function* walkDir(dirPath, depth) {
273
+ if (depth > maxDepth)
274
+ return;
275
+ if (config.abortSignal?.aborted)
276
+ return;
277
+ let dir;
278
+ try {
279
+ dir = await opendir(dirPath);
280
+ }
281
+ catch {
282
+ // Permission denied, not a directory, etc. — skip silently.
283
+ return;
284
+ }
285
+ try {
286
+ for await (const dirent of dir) {
287
+ if (config.abortSignal?.aborted)
288
+ return;
289
+ const entryName = dirent.name;
290
+ const entryPath = resolve(dirPath, entryName);
291
+ if (dirent.isDirectory()) {
292
+ if (shouldExcludeDir(entryName))
293
+ continue;
294
+ yield* walkDir(entryPath, depth + 1);
295
+ }
296
+ else if (dirent.isFile()) {
297
+ try {
298
+ const st = await stat(entryPath);
299
+ yield {
300
+ path: entryPath,
301
+ name: entryName,
302
+ extension: extname(entryName).toLowerCase(),
303
+ size: st.size,
304
+ mtimeMs: st.mtimeMs,
305
+ isDirectory: false,
306
+ };
307
+ }
308
+ catch {
309
+ // stat failed (e.g. broken symlink) — skip
310
+ }
311
+ }
312
+ }
313
+ }
314
+ catch {
315
+ // readdir iteration error — skip
316
+ }
317
+ }
318
+ for (const rootPath of config.paths) {
319
+ yield* walkDir(resolve(rootPath), 0);
320
+ }
321
+ }
322
+ /**
323
+ * Build tags array from file metadata.
324
+ */
325
+ export function buildTags(entry) {
326
+ const tags = [];
327
+ // Extension tag (without dot)
328
+ if (entry.extension) {
329
+ tags.push(entry.extension.slice(1));
330
+ }
331
+ // Parent folder name
332
+ const parentDir = basename(dirname(entry.path));
333
+ if (parentDir && parentDir !== '.' && parentDir !== entry.name) {
334
+ tags.push(parentDir);
335
+ }
336
+ // Category tag
337
+ const ext = entry.extension.toLowerCase();
338
+ if (CODE_EXTENSIONS.has(ext))
339
+ tags.push('code');
340
+ else if (DOC_EXTENSIONS.has(ext))
341
+ tags.push('document');
342
+ else if (CONFIG_EXTENSIONS.has(ext))
343
+ tags.push('config');
344
+ else if (DATA_EXTENSIONS.has(ext))
345
+ tags.push('data');
346
+ else if (IMAGE_EXTENSIONS.has(ext))
347
+ tags.push('image');
348
+ else if (MEDIA_EXTENSIONS.has(ext))
349
+ tags.push('media');
350
+ else if (BINARY_EXTENSIONS.has(ext))
351
+ tags.push('binary');
352
+ else if (ARCHIVE_EXTENSIONS.has(ext))
353
+ tags.push('archive');
354
+ return tags;
355
+ }
356
+ //# sourceMappingURL=metadata-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-scanner.js","sourceRoot":"","sources":["../../src/scanner/metadata-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { MemoryType } from '../engine/types.js';
2
+ export interface DataSource {
3
+ id: string;
4
+ path: string;
5
+ type: 'local' | 'cloud';
6
+ status: 'active' | 'paused' | 'error';
7
+ last_scanned_at: string | null;
8
+ file_count: number;
9
+ total_size: number;
10
+ config: ScanConfig;
11
+ created_at: string;
12
+ updated_at: string;
13
+ }
14
+ export interface ScanConfig {
15
+ paths: string[];
16
+ excludePatterns: string[];
17
+ fileExtensions: string[];
18
+ maxFileSize: number;
19
+ watchMode: boolean;
20
+ }
21
+ export declare const DEFAULT_SCAN_CONFIG: ScanConfig;
22
+ export interface ParsedContent {
23
+ title: string;
24
+ summary: string;
25
+ content: string;
26
+ type: MemoryType;
27
+ tags: string[];
28
+ metadata: Record<string, unknown>;
29
+ }
30
+ export interface FileParser {
31
+ extensions: string[];
32
+ parse(filePath: string, content: string): ParsedContent;
33
+ }
34
+ export interface FileEntry {
35
+ path: string;
36
+ size: number;
37
+ mtimeMs: number;
38
+ extension: string;
39
+ }
40
+ export interface ScanResult {
41
+ scannedFiles: number;
42
+ createdMemories: number;
43
+ skippedFiles: number;
44
+ errorFiles: number;
45
+ durationMs: number;
46
+ }
47
+ //# sourceMappingURL=types.d.ts.map