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,70 @@
1
+ import { Hono } from 'hono';
2
+ import { statSync } from 'node:fs';
3
+ import { getMemoriesByProject } from '../../storage/queries.js';
4
+ import { recalculateOrbits } from '../../engine/orbit.js';
5
+ import { getConfig } from '../../utils/config.js';
6
+ import { ORBIT_ZONES } from '../../engine/types.js';
7
+ import { emitOrbitRecalculated } from '../websocket.js';
8
+ const app = new Hono();
9
+ // GET /api/system/status — overall system status
10
+ app.get('/status', (c) => {
11
+ const project = c.req.query('project') ?? 'default';
12
+ const config = getConfig();
13
+ const memories = getMemoriesByProject(project);
14
+ let dbSizeBytes = 0;
15
+ try {
16
+ dbSizeBytes = statSync(config.dbPath).size;
17
+ }
18
+ catch {
19
+ // DB file may not be accessible in some environments
20
+ }
21
+ const zoneBreakdown = {};
22
+ for (const zone of Object.keys(ORBIT_ZONES)) {
23
+ const { min, max } = ORBIT_ZONES[zone];
24
+ zoneBreakdown[zone] = memories.filter((m) => m.distance >= min && m.distance < max).length;
25
+ }
26
+ return c.json({
27
+ ok: true,
28
+ data: {
29
+ project,
30
+ memory_count: memories.length,
31
+ db_size_bytes: dbSizeBytes,
32
+ db_path: config.dbPath,
33
+ zone_breakdown: zoneBreakdown,
34
+ },
35
+ });
36
+ });
37
+ // POST /api/system/orbit — trigger orbit recalculation
38
+ app.post('/orbit', (c) => {
39
+ const project = c.req.query('project') ?? 'default';
40
+ const config = getConfig();
41
+ const changes = recalculateOrbits(project, config);
42
+ emitOrbitRecalculated(project, { changes_count: changes.length });
43
+ return c.json({
44
+ ok: true,
45
+ changes_count: changes.length,
46
+ data: changes,
47
+ });
48
+ });
49
+ // GET /api/system/zones — per-zone statistics
50
+ app.get('/zones', (c) => {
51
+ const project = c.req.query('project') ?? 'default';
52
+ const memories = getMemoriesByProject(project);
53
+ const zones = Object.keys(ORBIT_ZONES).map((zone) => {
54
+ const { min, max, label } = ORBIT_ZONES[zone];
55
+ const zoneMemories = memories.filter((m) => m.distance >= min && m.distance < max);
56
+ return {
57
+ zone,
58
+ label,
59
+ min_au: min,
60
+ max_au: max,
61
+ count: zoneMemories.length,
62
+ avg_importance: zoneMemories.length > 0
63
+ ? zoneMemories.reduce((s, m) => s + m.importance, 0) / zoneMemories.length
64
+ : 0,
65
+ };
66
+ });
67
+ return c.json({ ok: true, data: zones, project });
68
+ });
69
+ export default app;
70
+ //# sourceMappingURL=system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../../../src/api/routes/system.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * routes/temporal.ts — Temporal Awareness API routes
3
+ *
4
+ * GET /api/temporal/at — getContextAtTime (query: timestamp, project)
5
+ * GET /api/temporal/chain/:id — getEvolutionChain
6
+ * GET /api/temporal/summary — getTemporalSummary
7
+ * POST /api/temporal/bounds/:id — setTemporalBounds
8
+ * POST /api/temporal/supersede — supersedeMemory (body: oldId, newId)
9
+ */
10
+ import { Hono } from 'hono';
11
+ declare const app: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
12
+ export default app;
13
+ //# sourceMappingURL=temporal.d.ts.map
@@ -0,0 +1,82 @@
1
+ /**
2
+ * routes/temporal.ts — Temporal Awareness API routes
3
+ *
4
+ * GET /api/temporal/at — getContextAtTime (query: timestamp, project)
5
+ * GET /api/temporal/chain/:id — getEvolutionChain
6
+ * GET /api/temporal/summary — getTemporalSummary
7
+ * POST /api/temporal/bounds/:id — setTemporalBounds
8
+ * POST /api/temporal/supersede — supersedeMemory (body: oldId, newId)
9
+ */
10
+ import { Hono } from 'hono';
11
+ import { getContextAtTime, getEvolutionChain, getTemporalSummary, setTemporalBounds, supersedeMemory, } from '../../engine/temporal.js';
12
+ const app = new Hono();
13
+ // GET /api/temporal/at?timestamp=ISO&project=default
14
+ app.get('/at', (c) => {
15
+ const project = c.req.query('project') ?? 'default';
16
+ const timestamp = c.req.query('timestamp');
17
+ if (!timestamp) {
18
+ return c.json({ ok: false, error: 'timestamp query parameter is required' }, 400);
19
+ }
20
+ try {
21
+ const data = getContextAtTime(project, timestamp);
22
+ return c.json({ ok: true, data, project, timestamp });
23
+ }
24
+ catch (err) {
25
+ const message = err instanceof Error ? err.message : 'Temporal query failed';
26
+ return c.json({ ok: false, error: message }, 500);
27
+ }
28
+ });
29
+ // GET /api/temporal/chain/:id
30
+ app.get('/chain/:id', (c) => {
31
+ const id = c.req.param('id');
32
+ try {
33
+ const data = getEvolutionChain(id);
34
+ return c.json({ ok: true, data, memoryId: id });
35
+ }
36
+ catch (err) {
37
+ const message = err instanceof Error ? err.message : 'Evolution chain failed';
38
+ return c.json({ ok: false, error: message }, 500);
39
+ }
40
+ });
41
+ // GET /api/temporal/summary?project=default
42
+ app.get('/summary', (c) => {
43
+ const project = c.req.query('project') ?? 'default';
44
+ try {
45
+ const text = getTemporalSummary(project);
46
+ return c.json({ ok: true, data: text, project });
47
+ }
48
+ catch (err) {
49
+ const message = err instanceof Error ? err.message : 'Temporal summary failed';
50
+ return c.json({ ok: false, error: message }, 500);
51
+ }
52
+ });
53
+ // POST /api/temporal/bounds/:id — body: { valid_from?, valid_until? }
54
+ app.post('/bounds/:id', async (c) => {
55
+ const id = c.req.param('id');
56
+ try {
57
+ const body = await c.req.json();
58
+ setTemporalBounds(id, body.valid_from, body.valid_until);
59
+ return c.json({ ok: true, id, valid_from: body.valid_from, valid_until: body.valid_until });
60
+ }
61
+ catch (err) {
62
+ const message = err instanceof Error ? err.message : 'Set bounds failed';
63
+ return c.json({ ok: false, error: message }, 500);
64
+ }
65
+ });
66
+ // POST /api/temporal/supersede — body: { oldId, newId }
67
+ app.post('/supersede', async (c) => {
68
+ try {
69
+ const body = await c.req.json();
70
+ if (!body.oldId || !body.newId) {
71
+ return c.json({ ok: false, error: 'oldId and newId are required' }, 400);
72
+ }
73
+ supersedeMemory(body.oldId, body.newId);
74
+ return c.json({ ok: true, oldId: body.oldId, newId: body.newId });
75
+ }
76
+ catch (err) {
77
+ const message = err instanceof Error ? err.message : 'Supersede failed';
78
+ return c.json({ ok: false, error: message }, 500);
79
+ }
80
+ });
81
+ export default app;
82
+ //# sourceMappingURL=temporal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporal.js","sourceRoot":"","sources":["../../../src/api/routes/temporal.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAElC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;AAEvB,qDAAqD;AACrD,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE;IACnB,MAAM,OAAO,GAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;IACtD,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAE3C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,uCAAuC,EAAE,EAAE,GAAG,CAAC,CAAC;IACpF,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAClD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;QAC7E,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;IACpD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,8BAA8B;AAC9B,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;IAC1B,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;QAC9E,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;IACpD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,4CAA4C;AAC5C,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC;QAC/E,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;IACpD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,sEAAsE;AACtE,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAClC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAmD,CAAC;QACjF,iBAAiB,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACzD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;QACzE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;IACpD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,wDAAwD;AACxD,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACjC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAsC,CAAC;QACpE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,8BAA8B,EAAE,EAAE,GAAG,CAAC,CAAC;QAC3E,CAAC;QACD,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;QACxE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;IACpD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,eAAe,GAAG,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1,99 @@
1
+ import { serve } from '@hono/node-server';
2
+ import { serveStatic } from '@hono/node-server/serve-static';
3
+ import { Hono } from 'hono';
4
+ import { cors } from 'hono/cors';
5
+ import { dirname, join, resolve } from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+ import { existsSync, readFileSync } from 'node:fs';
8
+ import { initDatabase } from '../storage/database.js';
9
+ import { getConfig } from '../utils/config.js';
10
+ import { createWebSocketServer, handleUpgrade } from './websocket.js';
11
+ import memoriesRouter from './routes/memories.js';
12
+ import sunRouter from './routes/sun.js';
13
+ import systemRouter from './routes/system.js';
14
+ import { scanRouter, sourcesRouter } from './routes/scan.js';
15
+ import orbitRouter from './routes/orbit.js';
16
+ import constellationRouter from './routes/constellation.js';
17
+ import projectsRouter from './routes/projects.js';
18
+ import analyticsRouter from './routes/analytics.js';
19
+ import temporalRouter from './routes/temporal.js';
20
+ import conflictsRouter from './routes/conflicts.js';
21
+ import observationsRouter from './routes/observations.js';
22
+ import consolidationRouter from './routes/consolidation.js';
23
+ const __dirname = dirname(fileURLToPath(import.meta.url));
24
+ const WEB_DIST = resolve(__dirname, '..', '..', 'web', 'dist');
25
+ // ---------------------------------------------------------------------------
26
+ // Bootstrap
27
+ // ---------------------------------------------------------------------------
28
+ const config = getConfig();
29
+ initDatabase(config.dbPath);
30
+ // ---------------------------------------------------------------------------
31
+ // Application
32
+ // ---------------------------------------------------------------------------
33
+ const app = new Hono();
34
+ // CORS — allow any localhost origin (Vite dev, Electron, any port)
35
+ app.use('/*', cors({
36
+ origin: (origin) => {
37
+ if (/^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/.test(origin)) {
38
+ return origin;
39
+ }
40
+ return undefined;
41
+ },
42
+ allowMethods: ['GET', 'POST', 'PATCH', 'DELETE', 'OPTIONS'],
43
+ }));
44
+ // Health check
45
+ app.get('/api/health', (c) => c.json({
46
+ name: 'stellar-memory-api',
47
+ version: '0.5.0',
48
+ status: 'ok',
49
+ uptime: process.uptime(),
50
+ }));
51
+ // Routers
52
+ app.route('/api/memories', memoriesRouter);
53
+ app.route('/api/sun', sunRouter);
54
+ app.route('/api/system', systemRouter);
55
+ app.route('/api/scan', scanRouter);
56
+ app.route('/api/sources', sourcesRouter);
57
+ app.route('/api/orbit', orbitRouter);
58
+ app.route('/api/constellation', constellationRouter);
59
+ app.route('/api/projects', projectsRouter);
60
+ app.route('/api/analytics', analyticsRouter);
61
+ app.route('/api/temporal', temporalRouter);
62
+ app.route('/api/conflicts', conflictsRouter);
63
+ app.route('/api/observations', observationsRouter);
64
+ app.route('/api/consolidation', consolidationRouter);
65
+ // ---------------------------------------------------------------------------
66
+ // Static web dashboard (serve web/dist/ if it exists)
67
+ // ---------------------------------------------------------------------------
68
+ const hasWebDist = existsSync(join(WEB_DIST, 'index.html'));
69
+ if (hasWebDist) {
70
+ // Serve static assets (JS, CSS, images)
71
+ app.use('/*', serveStatic({ root: WEB_DIST }));
72
+ // SPA fallback — non-API, non-asset routes return index.html
73
+ app.get('*', (c) => {
74
+ if (c.req.path.startsWith('/api/'))
75
+ return c.notFound();
76
+ const indexPath = join(WEB_DIST, 'index.html');
77
+ const html = readFileSync(indexPath, 'utf-8');
78
+ return c.html(html);
79
+ });
80
+ }
81
+ // Global error handler
82
+ app.onError((err, c) => {
83
+ console.error('[stellar-api] error:', err);
84
+ return c.json({ ok: false, error: err.message ?? 'Internal server error' }, 500);
85
+ });
86
+ // 404
87
+ app.notFound((c) => c.json({ ok: false, error: 'Not found' }, 404));
88
+ // ---------------------------------------------------------------------------
89
+ // Start
90
+ // ---------------------------------------------------------------------------
91
+ const port = parseInt(process.env.STELLAR_API_PORT ?? '21547', 10);
92
+ const server = serve({ fetch: app.fetch, port }, (info) => {
93
+ console.log(`[stellar-api] listening on http://localhost:${info.port}`);
94
+ console.log(`[stellar-api] WebSocket available at ws://localhost:${info.port}/ws`);
95
+ });
96
+ // Initialize WebSocket server and attach upgrade handler
97
+ createWebSocketServer();
98
+ server.on('upgrade', handleUpgrade);
99
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * WebSocket event bus for real-time dashboard updates.
3
+ *
4
+ * Uses Node.js built-in EventEmitter as the internal event bus.
5
+ * Broadcasts JSON events to all connected WebSocket clients.
6
+ */
7
+ import { EventEmitter } from 'node:events';
8
+ import { WebSocketServer } from 'ws';
9
+ import type { IncomingMessage } from 'node:http';
10
+ import type { Duplex } from 'node:stream';
11
+ export type WsEventType = 'memory:created' | 'memory:updated' | 'memory:deleted' | 'orbit:recalculated' | 'sun:updated' | 'system:status';
12
+ export interface WsEvent {
13
+ type: WsEventType;
14
+ project?: string;
15
+ data?: unknown;
16
+ timestamp: number;
17
+ }
18
+ declare class StellarEventBus extends EventEmitter {
19
+ emit(event: WsEventType, payload: Omit<WsEvent, 'type' | 'timestamp'>): boolean;
20
+ }
21
+ export declare const eventBus: StellarEventBus;
22
+ /**
23
+ * Create the WebSocketServer and wire it to the event bus.
24
+ * Call this once after the HTTP server is started.
25
+ */
26
+ export declare function createWebSocketServer(): WebSocketServer;
27
+ /**
28
+ * Handle HTTP upgrade request for the /ws path.
29
+ * Call this from the HTTP server's 'upgrade' event handler.
30
+ */
31
+ export declare function handleUpgrade(req: IncomingMessage, socket: Duplex, head: Buffer): void;
32
+ /**
33
+ * Emit a memory:created event.
34
+ */
35
+ export declare function emitMemoryCreated(project: string, data: unknown): void;
36
+ /**
37
+ * Emit a memory:updated event.
38
+ */
39
+ export declare function emitMemoryUpdated(project: string, data: unknown): void;
40
+ /**
41
+ * Emit a memory:deleted event.
42
+ */
43
+ export declare function emitMemoryDeleted(project: string, data: unknown): void;
44
+ /**
45
+ * Emit an orbit:recalculated event.
46
+ */
47
+ export declare function emitOrbitRecalculated(project: string, data: unknown): void;
48
+ /**
49
+ * Emit a sun:updated event.
50
+ */
51
+ export declare function emitSunUpdated(project: string, data: unknown): void;
52
+ export {};
53
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1,168 @@
1
+ /**
2
+ * WebSocket event bus for real-time dashboard updates.
3
+ *
4
+ * Uses Node.js built-in EventEmitter as the internal event bus.
5
+ * Broadcasts JSON events to all connected WebSocket clients.
6
+ */
7
+ import { EventEmitter } from 'node:events';
8
+ import { WebSocketServer, WebSocket } from 'ws';
9
+ // ---------------------------------------------------------------------------
10
+ // Internal event bus (singleton)
11
+ // ---------------------------------------------------------------------------
12
+ class StellarEventBus extends EventEmitter {
13
+ emit(event, payload) {
14
+ return super.emit(event, { type: event, timestamp: Date.now(), ...payload });
15
+ }
16
+ }
17
+ export const eventBus = new StellarEventBus();
18
+ // ---------------------------------------------------------------------------
19
+ // WebSocket server
20
+ // ---------------------------------------------------------------------------
21
+ const HEARTBEAT_INTERVAL_MS = 30_000;
22
+ const CLIENT_TIMEOUT_MS = 60_000;
23
+ let wss = null;
24
+ /**
25
+ * Create the WebSocketServer and wire it to the event bus.
26
+ * Call this once after the HTTP server is started.
27
+ */
28
+ export function createWebSocketServer() {
29
+ wss = new WebSocketServer({ noServer: true });
30
+ // Forward all bus events to connected clients
31
+ const EVENTS = [
32
+ 'memory:created',
33
+ 'memory:updated',
34
+ 'memory:deleted',
35
+ 'orbit:recalculated',
36
+ 'sun:updated',
37
+ 'system:status',
38
+ ];
39
+ for (const eventType of EVENTS) {
40
+ eventBus.on(eventType, (payload) => {
41
+ broadcast(payload);
42
+ });
43
+ }
44
+ wss.on('connection', (ws) => {
45
+ const client = ws;
46
+ client.isAlive = true;
47
+ client.lastPong = Date.now();
48
+ // Send welcome message
49
+ safeSend(client, {
50
+ type: 'system:status',
51
+ data: { connected: true, message: 'Connected to Stellar Memory WebSocket' },
52
+ timestamp: Date.now(),
53
+ });
54
+ client.on('pong', () => {
55
+ client.isAlive = true;
56
+ client.lastPong = Date.now();
57
+ });
58
+ client.on('message', (data) => {
59
+ // Handle ping from client
60
+ try {
61
+ const msg = JSON.parse(data.toString());
62
+ if (msg.type === 'ping') {
63
+ safeSend(client, { type: 'system:status', data: { pong: true }, timestamp: Date.now() });
64
+ }
65
+ }
66
+ catch {
67
+ // Ignore malformed messages
68
+ }
69
+ });
70
+ client.on('error', () => {
71
+ // Swallow errors — client will be cleaned up on next heartbeat
72
+ });
73
+ });
74
+ // Heartbeat: detect dead connections
75
+ const heartbeat = setInterval(() => {
76
+ if (!wss)
77
+ return;
78
+ const now = Date.now();
79
+ wss.clients.forEach((ws) => {
80
+ const client = ws;
81
+ if (!client.isAlive || now - client.lastPong > CLIENT_TIMEOUT_MS) {
82
+ client.terminate();
83
+ return;
84
+ }
85
+ client.isAlive = false;
86
+ client.ping();
87
+ });
88
+ }, HEARTBEAT_INTERVAL_MS);
89
+ wss.on('close', () => {
90
+ clearInterval(heartbeat);
91
+ });
92
+ return wss;
93
+ }
94
+ /**
95
+ * Handle HTTP upgrade request for the /ws path.
96
+ * Call this from the HTTP server's 'upgrade' event handler.
97
+ */
98
+ export function handleUpgrade(req, socket, head) {
99
+ if (!wss)
100
+ return;
101
+ const url = req.url ?? '';
102
+ if (url === '/ws' || url.startsWith('/ws?')) {
103
+ wss.handleUpgrade(req, socket, head, (ws) => {
104
+ wss.emit('connection', ws, req);
105
+ });
106
+ }
107
+ else {
108
+ socket.destroy();
109
+ }
110
+ }
111
+ // ---------------------------------------------------------------------------
112
+ // Helpers
113
+ // ---------------------------------------------------------------------------
114
+ function broadcast(payload) {
115
+ if (!wss)
116
+ return;
117
+ const msg = JSON.stringify(payload);
118
+ wss.clients.forEach((ws) => {
119
+ if (ws.readyState === WebSocket.OPEN) {
120
+ ws.send(msg, (err) => {
121
+ if (err) {
122
+ // Ignore send errors — client will be cleaned up by heartbeat
123
+ }
124
+ });
125
+ }
126
+ });
127
+ }
128
+ function safeSend(ws, payload) {
129
+ if (ws.readyState === WebSocket.OPEN) {
130
+ try {
131
+ ws.send(JSON.stringify(payload));
132
+ }
133
+ catch {
134
+ // Ignore
135
+ }
136
+ }
137
+ }
138
+ /**
139
+ * Emit a memory:created event.
140
+ */
141
+ export function emitMemoryCreated(project, data) {
142
+ eventBus.emit('memory:created', { project, data });
143
+ }
144
+ /**
145
+ * Emit a memory:updated event.
146
+ */
147
+ export function emitMemoryUpdated(project, data) {
148
+ eventBus.emit('memory:updated', { project, data });
149
+ }
150
+ /**
151
+ * Emit a memory:deleted event.
152
+ */
153
+ export function emitMemoryDeleted(project, data) {
154
+ eventBus.emit('memory:deleted', { project, data });
155
+ }
156
+ /**
157
+ * Emit an orbit:recalculated event.
158
+ */
159
+ export function emitOrbitRecalculated(project, data) {
160
+ eventBus.emit('orbit:recalculated', { project, data });
161
+ }
162
+ /**
163
+ * Emit a sun:updated event.
164
+ */
165
+ export function emitSunUpdated(project, data) {
166
+ eventBus.emit('sun:updated', { project, data });
167
+ }
168
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/api/websocket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Stellar Memory CLI entry point.
4
+ *
5
+ * Routes between:
6
+ * - `stellar-memory` → MCP server (stdio transport, default)
7
+ * - `stellar-memory init` → Setup wizard
8
+ * - `stellar-memory setup` → Download embedding model only
9
+ * - `stellar-memory api` → Start REST API server
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Stellar Memory CLI entry point.
4
+ *
5
+ * Routes between:
6
+ * - `stellar-memory` → MCP server (stdio transport, default)
7
+ * - `stellar-memory init` → Setup wizard
8
+ * - `stellar-memory setup` → Download embedding model only
9
+ * - `stellar-memory api` → Start REST API server
10
+ */
11
+ const command = process.argv[2];
12
+ switch (command) {
13
+ case 'init':
14
+ await import('./init.js');
15
+ break;
16
+ case 'setup': {
17
+ // Re-use the setup script
18
+ const { resolve, dirname } = await import('node:path');
19
+ const { fileURLToPath } = await import('node:url');
20
+ const { spawnSync } = await import('node:child_process');
21
+ const __dirname = dirname(fileURLToPath(import.meta.url));
22
+ const setupPath = resolve(__dirname, '..', 'scripts', 'setup.mjs');
23
+ const result = spawnSync('node', [setupPath], { stdio: 'inherit', shell: true });
24
+ process.exit(result.status ?? 1);
25
+ }
26
+ case 'api':
27
+ await import('../api/server.js');
28
+ break;
29
+ default:
30
+ // No subcommand or unknown → start MCP server (stdio)
31
+ await import('../index.js');
32
+ break;
33
+ }
34
+ export {};
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,QAAQ,OAAO,EAAE,CAAC;IAChB,KAAK,MAAM;QACT,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAC1B,MAAM;IAER,KAAK,OAAO,CAAC,CAAC,CAAC;QACb,0BAA0B;QAC1B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,KAAK;QACR,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACjC,MAAM;IAER;QACE,sDAAsD;QACtD,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAC5B,MAAM;AACV,CAAC"}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * stellar-memory init — One-command setup for Stellar Memory MCP server.
4
+ *
5
+ * Usage:
6
+ * npx stellar-memory init # Configure Claude Code + download model
7
+ * npx stellar-memory init --skip-model # Skip embedding model download
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=init.d.ts.map