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,121 @@
1
+ /**
2
+ * routes/projects.ts — Multi-Project Galaxy API routes
3
+ *
4
+ * GET /api/projects — list all projects
5
+ * POST /api/projects — create a project
6
+ * GET /api/projects/:name/stats — detailed stats for a project
7
+ * POST /api/projects/switch — switch active project
8
+ * GET /api/projects/universal — list universal memories
9
+ * POST /api/projects/universal/:id — mark/unmark a memory as universal
10
+ * GET /api/projects/:name/candidates — detect universal candidates
11
+ */
12
+ import { Hono } from 'hono';
13
+ import { listAllProjects, createProject, getProjectStats, switchProject, getCurrentProject, markUniversal, getUniversalContext, detectUniversalCandidates, } from '../../engine/multiproject.js';
14
+ import { getUniversalMemories } from '../../storage/queries.js';
15
+ const app = new Hono();
16
+ // GET /api/projects — list all projects with stats
17
+ app.get('/', (c) => {
18
+ const projects = listAllProjects();
19
+ const current = getCurrentProject();
20
+ return c.json({ ok: true, data: projects, current_project: current });
21
+ });
22
+ // POST /api/projects — create a new project
23
+ app.post('/', async (c) => {
24
+ let body;
25
+ try {
26
+ body = await c.req.json();
27
+ }
28
+ catch {
29
+ return c.json({ ok: false, error: 'Invalid JSON body' }, 400);
30
+ }
31
+ const name = body.name;
32
+ if (!name || !name.trim()) {
33
+ return c.json({ ok: false, error: 'name is required' }, 400);
34
+ }
35
+ try {
36
+ const result = createProject(name.trim());
37
+ const status = result.created ? 201 : 200;
38
+ return c.json({ ok: true, data: result }, status);
39
+ }
40
+ catch (err) {
41
+ const message = err instanceof Error ? err.message : 'Create failed';
42
+ return c.json({ ok: false, error: message }, 400);
43
+ }
44
+ });
45
+ // POST /api/projects/switch — switch the active project at runtime
46
+ app.post('/switch', async (c) => {
47
+ let body;
48
+ try {
49
+ body = await c.req.json();
50
+ }
51
+ catch {
52
+ return c.json({ ok: false, error: 'Invalid JSON body' }, 400);
53
+ }
54
+ const project = body.project;
55
+ if (!project || !project.trim()) {
56
+ return c.json({ ok: false, error: 'project is required' }, 400);
57
+ }
58
+ try {
59
+ const result = switchProject(project.trim());
60
+ return c.json({ ok: true, data: result });
61
+ }
62
+ catch (err) {
63
+ const message = err instanceof Error ? err.message : 'Switch failed';
64
+ return c.json({ ok: false, error: message }, 400);
65
+ }
66
+ });
67
+ // GET /api/projects/universal — list all universal memories
68
+ app.get('/universal', (c) => {
69
+ const limitParam = c.req.query('limit');
70
+ const limit = limitParam ? parseInt(limitParam, 10) : 50;
71
+ const memories = getUniversalMemories(limit > 0 ? limit : 50);
72
+ return c.json({ ok: true, data: memories, total: memories.length });
73
+ });
74
+ // POST /api/projects/universal/:id — mark or unmark a memory as universal
75
+ app.post('/universal/:id', async (c) => {
76
+ const id = c.req.param('id');
77
+ let body = {};
78
+ try {
79
+ body = await c.req.json();
80
+ }
81
+ catch {
82
+ // Body optional — defaults to marking as universal
83
+ }
84
+ const isUniversal = body.is_universal !== false; // default true
85
+ try {
86
+ markUniversal(id, isUniversal);
87
+ return c.json({ ok: true, id, is_universal: isUniversal });
88
+ }
89
+ catch (err) {
90
+ const message = err instanceof Error ? err.message : 'Mark failed';
91
+ return c.json({ ok: false, error: message }, 500);
92
+ }
93
+ });
94
+ // GET /api/projects/:name/stats — detailed stats for one project
95
+ app.get('/:name/stats', (c) => {
96
+ const name = c.req.param('name');
97
+ try {
98
+ const stats = getProjectStats(name);
99
+ return c.json({ ok: true, data: stats, project: name });
100
+ }
101
+ catch (err) {
102
+ const message = err instanceof Error ? err.message : 'Stats failed';
103
+ return c.json({ ok: false, error: message }, 500);
104
+ }
105
+ });
106
+ // GET /api/projects/:name/universal — universal context for a project
107
+ app.get('/:name/universal', (c) => {
108
+ const name = c.req.param('name');
109
+ const limitParam = c.req.query('limit');
110
+ const limit = limitParam ? parseInt(limitParam, 10) : 20;
111
+ const memories = getUniversalContext(name, limit > 0 ? limit : 20);
112
+ return c.json({ ok: true, data: memories, project: name, total: memories.length });
113
+ });
114
+ // GET /api/projects/:name/candidates — detect universal candidates
115
+ app.get('/:name/candidates', (c) => {
116
+ const name = c.req.param('name');
117
+ const candidates = detectUniversalCandidates(name);
118
+ return c.json({ ok: true, data: candidates, project: name, total: candidates.length });
119
+ });
120
+ export default app;
121
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../../src/api/routes/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Hono } from 'hono';
2
+ export declare const scanRouter: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
3
+ export declare const sourcesRouter: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
4
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1,403 @@
1
+ import { Hono } from 'hono';
2
+ import { streamSSE } from 'hono/streaming';
3
+ import { homedir } from 'node:os';
4
+ import { StellarScanner, listDataSources, FULL_SCAN_EXTRA_EXCLUDES } from '../../scanner/index.js';
5
+ import { DEFAULT_SCAN_CONFIG } from '../../scanner/types.js';
6
+ import { scanMetadata, calculateFileImportance, categorizeImportance, formatSize, buildTags, } from '../../scanner/metadata-scanner.js';
7
+ import { importanceToDistance } from '../../engine/orbit.js';
8
+ import { insertMemory, getMemoryBySourcePath, updateMemoryOrbit } from '../../storage/queries.js';
9
+ import { getConfig } from '../../utils/config.js';
10
+ // ---------------------------------------------------------------------------
11
+ // Module-level active scan state (prevents concurrent scans)
12
+ // ---------------------------------------------------------------------------
13
+ let activeScan = null;
14
+ // ---------------------------------------------------------------------------
15
+ // POST /api/scan — trigger a one-shot directory scan (existing)
16
+ // ---------------------------------------------------------------------------
17
+ export const scanRouter = new Hono();
18
+ scanRouter.post('/', async (c) => {
19
+ let body;
20
+ try {
21
+ body = await c.req.json();
22
+ }
23
+ catch {
24
+ return c.json({ ok: false, error: 'Invalid JSON body' }, 400);
25
+ }
26
+ const path = body.path;
27
+ if (!path || !path.trim()) {
28
+ return c.json({ ok: false, error: 'path is required' }, 400);
29
+ }
30
+ const recursive = body.recursive !== false; // default: true
31
+ const git = body.git !== false; // default: true
32
+ const maxKb = body.max_kb;
33
+ const scannerConfig = {};
34
+ if (maxKb !== undefined && maxKb > 0) {
35
+ scannerConfig.maxFileSize = maxKb * 1024;
36
+ }
37
+ const scanner = new StellarScanner(scannerConfig);
38
+ try {
39
+ const result = await scanner.scanPath(path.trim(), {
40
+ recursive,
41
+ includeGit: git,
42
+ });
43
+ return c.json({ ok: true, data: result });
44
+ }
45
+ catch (err) {
46
+ const message = err instanceof Error ? err.message : 'Scan failed';
47
+ return c.json({ ok: false, error: message }, 500);
48
+ }
49
+ });
50
+ // ---------------------------------------------------------------------------
51
+ // POST /api/scan/full — SSE streaming full scan
52
+ // ---------------------------------------------------------------------------
53
+ scanRouter.post('/full', async (c) => {
54
+ // Prevent concurrent scans
55
+ if (activeScan) {
56
+ return c.json({ ok: false, error: 'A scan is already in progress' }, 409);
57
+ }
58
+ let body;
59
+ try {
60
+ body = await c.req.json();
61
+ }
62
+ catch {
63
+ return c.json({ ok: false, error: 'Invalid JSON body' }, 400);
64
+ }
65
+ const mode = body.mode ?? 'full';
66
+ const paths = body.paths ?? [];
67
+ const includeGit = body.includeGit !== false;
68
+ if (mode === 'folders' && paths.length === 0) {
69
+ return c.json({ ok: false, error: 'paths required when mode is "folders"' }, 400);
70
+ }
71
+ // Determine scan paths
72
+ const scanPaths = mode === 'full' ? [homedir()] : paths;
73
+ // Build scanner config with extra excludes for full scan
74
+ const excludePatterns = mode === 'full'
75
+ ? [...DEFAULT_SCAN_CONFIG.excludePatterns, ...FULL_SCAN_EXTRA_EXCLUDES]
76
+ : DEFAULT_SCAN_CONFIG.excludePatterns;
77
+ const scanner = new StellarScanner({ excludePatterns, paths: scanPaths });
78
+ // Set up abort controller
79
+ const abortController = new AbortController();
80
+ activeScan = {
81
+ abortController,
82
+ startedAt: Date.now(),
83
+ progress: {
84
+ scannedFiles: 0,
85
+ createdMemories: 0,
86
+ totalFiles: 0,
87
+ currentFile: '',
88
+ percentComplete: 0,
89
+ },
90
+ };
91
+ return streamSSE(c, async (stream) => {
92
+ let lastEmitMs = 0;
93
+ const THROTTLE_MS = 100;
94
+ // Send start event
95
+ await stream.writeSSE({
96
+ event: 'scan:start',
97
+ data: JSON.stringify({
98
+ mode,
99
+ paths: scanPaths,
100
+ estimatedScope: mode === 'full' ? 'home directory' : `${paths.length} folder(s)`,
101
+ }),
102
+ });
103
+ const onProgress = async (event) => {
104
+ if (!activeScan)
105
+ return;
106
+ // Update module-level progress
107
+ activeScan.progress.scannedFiles = event.scannedFiles ?? 0;
108
+ activeScan.progress.createdMemories = event.createdMemories ?? 0;
109
+ activeScan.progress.totalFiles = event.totalFiles ?? activeScan.progress.totalFiles;
110
+ activeScan.progress.currentFile = event.currentFile ?? '';
111
+ const total = activeScan.progress.totalFiles;
112
+ activeScan.progress.percentComplete = total > 0
113
+ ? Math.round(((event.scannedFiles ?? 0) / total) * 1000) / 10
114
+ : 0;
115
+ // Throttle SSE emissions
116
+ const now = Date.now();
117
+ if (event.phase === 'processing' && now - lastEmitMs < THROTTLE_MS)
118
+ return;
119
+ lastEmitMs = now;
120
+ try {
121
+ if (event.phase === 'collecting') {
122
+ await stream.writeSSE({
123
+ event: 'scan:progress',
124
+ data: JSON.stringify({ phase: 'collecting', path: event.path }),
125
+ });
126
+ }
127
+ else if (event.phase === 'collected') {
128
+ await stream.writeSSE({
129
+ event: 'scan:progress',
130
+ data: JSON.stringify({
131
+ phase: 'collected',
132
+ path: event.path,
133
+ totalFiles: event.totalFiles,
134
+ }),
135
+ });
136
+ }
137
+ else {
138
+ await stream.writeSSE({
139
+ event: 'scan:progress',
140
+ data: JSON.stringify({
141
+ scannedFiles: event.scannedFiles ?? 0,
142
+ createdMemories: event.createdMemories ?? 0,
143
+ totalFiles: activeScan.progress.totalFiles,
144
+ currentFile: event.currentFile ?? '',
145
+ percentComplete: activeScan.progress.percentComplete,
146
+ }),
147
+ });
148
+ }
149
+ }
150
+ catch {
151
+ // Stream closed by client — abort
152
+ abortController.abort();
153
+ }
154
+ };
155
+ try {
156
+ const result = await scanner.scanWithProgress({
157
+ paths: scanPaths,
158
+ includeGit,
159
+ onProgress,
160
+ abortSignal: abortController.signal,
161
+ });
162
+ if (abortController.signal.aborted) {
163
+ await stream.writeSSE({
164
+ event: 'scan:cancelled',
165
+ data: JSON.stringify({
166
+ totalScannedFiles: result.scannedFiles,
167
+ totalCreatedMemories: result.createdMemories,
168
+ durationMs: result.durationMs,
169
+ }),
170
+ });
171
+ }
172
+ else {
173
+ await stream.writeSSE({
174
+ event: 'scan:complete',
175
+ data: JSON.stringify({
176
+ totalScannedFiles: result.scannedFiles,
177
+ totalCreatedMemories: result.createdMemories,
178
+ totalSkippedFiles: result.skippedFiles,
179
+ totalErrorFiles: result.errorFiles,
180
+ durationMs: result.durationMs,
181
+ }),
182
+ });
183
+ }
184
+ }
185
+ catch (err) {
186
+ const message = err instanceof Error ? err.message : 'Scan failed';
187
+ try {
188
+ await stream.writeSSE({
189
+ event: 'scan:error',
190
+ data: JSON.stringify({ error: message, fatal: true }),
191
+ });
192
+ }
193
+ catch {
194
+ // Stream already closed
195
+ }
196
+ }
197
+ finally {
198
+ activeScan = null;
199
+ }
200
+ });
201
+ });
202
+ // ---------------------------------------------------------------------------
203
+ // POST /api/scan/meta — metadata-only fast scan (SSE streaming)
204
+ // ---------------------------------------------------------------------------
205
+ scanRouter.post('/meta', async (c) => {
206
+ // Prevent concurrent scans (shares lock with full scan)
207
+ if (activeScan) {
208
+ return c.json({ ok: false, error: 'A scan is already in progress' }, 409);
209
+ }
210
+ let body;
211
+ try {
212
+ body = await c.req.json();
213
+ }
214
+ catch {
215
+ return c.json({ ok: false, error: 'Invalid JSON body' }, 400);
216
+ }
217
+ const paths = body.paths ?? ['C:\\'];
218
+ // Set up abort controller
219
+ const abortController = new AbortController();
220
+ activeScan = {
221
+ abortController,
222
+ startedAt: Date.now(),
223
+ progress: {
224
+ scannedFiles: 0,
225
+ createdMemories: 0,
226
+ totalFiles: 0,
227
+ currentFile: '',
228
+ percentComplete: 0,
229
+ },
230
+ };
231
+ const config = getConfig();
232
+ return streamSSE(c, async (stream) => {
233
+ let lastEmitMs = 0;
234
+ const THROTTLE_MS = 50; // faster emission for metadata scan
235
+ let scannedFiles = 0;
236
+ let createdMemories = 0;
237
+ const startMs = Date.now();
238
+ // Send start event
239
+ await stream.writeSSE({
240
+ event: 'scan:start',
241
+ data: JSON.stringify({
242
+ mode: 'meta',
243
+ paths,
244
+ estimatedScope: `${paths.join(', ')} (metadata only)`,
245
+ }),
246
+ });
247
+ const scanConfig = {
248
+ paths,
249
+ abortSignal: abortController.signal,
250
+ };
251
+ try {
252
+ for await (const entry of scanMetadata(scanConfig)) {
253
+ if (abortController.signal.aborted)
254
+ break;
255
+ scannedFiles++;
256
+ // Calculate importance from metadata
257
+ const importance = calculateFileImportance(entry);
258
+ const distance = importanceToDistance(importance);
259
+ const category = categorizeImportance(importance);
260
+ const tags = buildTags(entry);
261
+ const mtime = new Date(entry.mtimeMs).toISOString();
262
+ // Update module-level progress
263
+ if (activeScan) {
264
+ activeScan.progress.scannedFiles = scannedFiles;
265
+ activeScan.progress.createdMemories = createdMemories;
266
+ activeScan.progress.currentFile = entry.path;
267
+ }
268
+ // Check for existing memory by source_path (dedup)
269
+ const existing = getMemoryBySourcePath(entry.path);
270
+ if (existing) {
271
+ // Update importance/distance if changed significantly
272
+ if (Math.abs(existing.importance - importance) > 0.01) {
273
+ const velocity = distance - existing.distance;
274
+ updateMemoryOrbit(existing.id, distance, importance, velocity);
275
+ }
276
+ }
277
+ else {
278
+ // Create new memory
279
+ insertMemory({
280
+ project: config.defaultProject,
281
+ content: entry.path,
282
+ summary: `${entry.name} (${formatSize(entry.size)}, ${mtime.slice(0, 10)})`,
283
+ type: 'context',
284
+ tags,
285
+ distance,
286
+ importance,
287
+ velocity: 0,
288
+ impact: importance, // use importance as impact for meta-scanned files
289
+ source: 'meta-scanner',
290
+ source_path: entry.path,
291
+ metadata: {
292
+ size: entry.size,
293
+ mtimeMs: entry.mtimeMs,
294
+ extension: entry.extension,
295
+ category,
296
+ },
297
+ });
298
+ createdMemories++;
299
+ }
300
+ // Throttle SSE emissions
301
+ const now = Date.now();
302
+ if (now - lastEmitMs >= THROTTLE_MS) {
303
+ lastEmitMs = now;
304
+ try {
305
+ await stream.writeSSE({
306
+ event: 'scan:progress',
307
+ data: JSON.stringify({
308
+ scannedFiles,
309
+ createdMemories,
310
+ totalFiles: 0, // unknown for streaming scan
311
+ currentFile: entry.path,
312
+ percentComplete: 0, // indeterminate
313
+ }),
314
+ });
315
+ }
316
+ catch {
317
+ // Stream closed by client — abort
318
+ abortController.abort();
319
+ }
320
+ }
321
+ }
322
+ const durationMs = Date.now() - startMs;
323
+ if (abortController.signal.aborted) {
324
+ await stream.writeSSE({
325
+ event: 'scan:cancelled',
326
+ data: JSON.stringify({
327
+ totalScannedFiles: scannedFiles,
328
+ totalCreatedMemories: createdMemories,
329
+ durationMs,
330
+ }),
331
+ });
332
+ }
333
+ else {
334
+ await stream.writeSSE({
335
+ event: 'scan:complete',
336
+ data: JSON.stringify({
337
+ totalScannedFiles: scannedFiles,
338
+ totalCreatedMemories: createdMemories,
339
+ totalSkippedFiles: 0,
340
+ totalErrorFiles: 0,
341
+ durationMs,
342
+ }),
343
+ });
344
+ }
345
+ }
346
+ catch (err) {
347
+ const message = err instanceof Error ? err.message : 'Meta scan failed';
348
+ try {
349
+ await stream.writeSSE({
350
+ event: 'scan:error',
351
+ data: JSON.stringify({ error: message, fatal: true }),
352
+ });
353
+ }
354
+ catch {
355
+ // Stream already closed
356
+ }
357
+ }
358
+ finally {
359
+ activeScan = null;
360
+ }
361
+ });
362
+ });
363
+ // ---------------------------------------------------------------------------
364
+ // GET /api/scan/status — check current scan status
365
+ // ---------------------------------------------------------------------------
366
+ scanRouter.get('/status', (c) => {
367
+ if (!activeScan) {
368
+ return c.json({ ok: true, data: { isScanning: false } });
369
+ }
370
+ return c.json({
371
+ ok: true,
372
+ data: {
373
+ isScanning: true,
374
+ startedAt: activeScan.startedAt,
375
+ progress: { ...activeScan.progress },
376
+ },
377
+ });
378
+ });
379
+ // ---------------------------------------------------------------------------
380
+ // POST /api/scan/cancel — cancel an in-progress scan
381
+ // ---------------------------------------------------------------------------
382
+ scanRouter.post('/cancel', (c) => {
383
+ if (!activeScan) {
384
+ return c.json({ ok: false, error: 'No scan in progress' }, 404);
385
+ }
386
+ activeScan.abortController.abort();
387
+ return c.json({ ok: true, message: 'Scan cancelled' });
388
+ });
389
+ // ---------------------------------------------------------------------------
390
+ // GET /api/sources — list all registered data sources
391
+ // ---------------------------------------------------------------------------
392
+ export const sourcesRouter = new Hono();
393
+ sourcesRouter.get('/', (c) => {
394
+ try {
395
+ const sources = listDataSources();
396
+ return c.json({ ok: true, data: sources, total: sources.length });
397
+ }
398
+ catch (err) {
399
+ const message = err instanceof Error ? err.message : 'Failed to list sources';
400
+ return c.json({ ok: false, error: message }, 500);
401
+ }
402
+ });
403
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/api/routes/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Hono } from 'hono';
2
+ declare const app: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
3
+ export default app;
4
+ //# sourceMappingURL=sun.d.ts.map
@@ -0,0 +1,43 @@
1
+ import { Hono } from 'hono';
2
+ import { getSunState } from '../../storage/queries.js';
3
+ import { commitToSun } from '../../engine/sun.js';
4
+ import { emitSunUpdated } from '../websocket.js';
5
+ const app = new Hono();
6
+ // GET /api/sun — current sun state
7
+ app.get('/', (c) => {
8
+ const project = c.req.query('project') ?? 'default';
9
+ const sun = getSunState(project);
10
+ if (!sun) {
11
+ return c.json({
12
+ ok: true,
13
+ data: null,
14
+ message: 'No sun state found. Use POST /api/sun/commit to initialize.',
15
+ });
16
+ }
17
+ return c.json({ ok: true, data: sun });
18
+ });
19
+ // POST /api/sun/commit — commit session state to sun
20
+ app.post('/commit', async (c) => {
21
+ let body;
22
+ try {
23
+ body = await c.req.json();
24
+ }
25
+ catch {
26
+ return c.json({ ok: false, error: 'Invalid JSON body' }, 400);
27
+ }
28
+ const project = body.project ?? 'default';
29
+ const current_work = body.current_work ?? '';
30
+ const decisions = body.decisions ?? [];
31
+ const next_steps = body.next_steps ?? [];
32
+ const errors = body.errors ?? [];
33
+ const context = body.context;
34
+ if (!current_work.trim()) {
35
+ return c.json({ ok: false, error: 'current_work is required' }, 400);
36
+ }
37
+ commitToSun(project, { current_work, decisions, next_steps, errors, context });
38
+ const updated = getSunState(project);
39
+ emitSunUpdated(project, updated);
40
+ return c.json({ ok: true, data: updated });
41
+ });
42
+ export default app;
43
+ //# sourceMappingURL=sun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sun.js","sourceRoot":"","sources":["../../../src/api/routes/sun.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;AAEvB,mCAAmC;AACnC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;IACjB,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;IACpD,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAEjC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,CAAC,IAAI,CAAC;YACZ,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,6DAA6D;SACvE,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,qDAAqD;AACrD,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC9B,IAAI,IAA6B,CAAC;IAClC,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,OAAO,GAAI,IAAI,CAAC,OAA8B,IAAI,SAAS,CAAC;IAClE,MAAM,YAAY,GAAI,IAAI,CAAC,YAAmC,IAAI,EAAE,CAAC;IACrE,MAAM,SAAS,GAAI,IAAI,CAAC,SAAkC,IAAI,EAAE,CAAC;IACjE,MAAM,UAAU,GAAI,IAAI,CAAC,UAAmC,IAAI,EAAE,CAAC;IACnE,MAAM,MAAM,GAAI,IAAI,CAAC,MAA+B,IAAI,EAAE,CAAC;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,OAA6B,CAAC;IAEnD,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;QACzB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,EAAE,GAAG,CAAC,CAAC;IACvE,CAAC;IAED,WAAW,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAE/E,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,eAAe,GAAG,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Hono } from 'hono';
2
+ declare const app: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
3
+ export default app;
4
+ //# sourceMappingURL=system.d.ts.map