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.
- package/LICENSE +21 -0
- package/README.md +362 -0
- package/dist/api/routes/analytics.d.ts +15 -0
- package/dist/api/routes/analytics.js +131 -0
- package/dist/api/routes/analytics.js.map +1 -0
- package/dist/api/routes/conflicts.d.ts +12 -0
- package/dist/api/routes/conflicts.js +67 -0
- package/dist/api/routes/conflicts.js.map +1 -0
- package/dist/api/routes/consolidation.d.ts +11 -0
- package/dist/api/routes/consolidation.js +63 -0
- package/dist/api/routes/consolidation.js.map +1 -0
- package/dist/api/routes/constellation.d.ts +4 -0
- package/dist/api/routes/constellation.js +84 -0
- package/dist/api/routes/constellation.js.map +1 -0
- package/dist/api/routes/memories.d.ts +4 -0
- package/dist/api/routes/memories.js +219 -0
- package/dist/api/routes/memories.js.map +1 -0
- package/dist/api/routes/observations.d.ts +10 -0
- package/dist/api/routes/observations.js +42 -0
- package/dist/api/routes/observations.js.map +1 -0
- package/dist/api/routes/orbit.d.ts +4 -0
- package/dist/api/routes/orbit.js +71 -0
- package/dist/api/routes/orbit.js.map +1 -0
- package/dist/api/routes/projects.d.ts +15 -0
- package/dist/api/routes/projects.js +121 -0
- package/dist/api/routes/projects.js.map +1 -0
- package/dist/api/routes/scan.d.ts +4 -0
- package/dist/api/routes/scan.js +403 -0
- package/dist/api/routes/scan.js.map +1 -0
- package/dist/api/routes/sun.d.ts +4 -0
- package/dist/api/routes/sun.js +43 -0
- package/dist/api/routes/sun.js.map +1 -0
- package/dist/api/routes/system.d.ts +4 -0
- package/dist/api/routes/system.js +70 -0
- package/dist/api/routes/system.js.map +1 -0
- package/dist/api/routes/temporal.d.ts +13 -0
- package/dist/api/routes/temporal.js +82 -0
- package/dist/api/routes/temporal.js.map +1 -0
- package/dist/api/server.d.ts +2 -0
- package/dist/api/server.js +99 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/websocket.d.ts +53 -0
- package/dist/api/websocket.js +168 -0
- package/dist/api/websocket.js.map +1 -0
- package/dist/cli/index.d.ts +12 -0
- package/dist/cli/index.js +35 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +10 -0
- package/dist/cli/init.js +163 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/engine/analytics.d.ts +93 -0
- package/dist/engine/analytics.js +437 -0
- package/dist/engine/analytics.js.map +1 -0
- package/dist/engine/conflict.d.ts +54 -0
- package/dist/engine/conflict.js +322 -0
- package/dist/engine/conflict.js.map +1 -0
- package/dist/engine/consolidation.d.ts +83 -0
- package/dist/engine/consolidation.js +368 -0
- package/dist/engine/consolidation.js.map +1 -0
- package/dist/engine/constellation.d.ts +66 -0
- package/dist/engine/constellation.js +382 -0
- package/dist/engine/constellation.js.map +1 -0
- package/dist/engine/corona.d.ts +53 -0
- package/dist/engine/corona.js +181 -0
- package/dist/engine/corona.js.map +1 -0
- package/dist/engine/embedding.d.ts +44 -0
- package/dist/engine/embedding.js +168 -0
- package/dist/engine/embedding.js.map +1 -0
- package/dist/engine/gravity.d.ts +63 -0
- package/dist/engine/gravity.js +121 -0
- package/dist/engine/gravity.js.map +1 -0
- package/dist/engine/multiproject.d.ts +75 -0
- package/dist/engine/multiproject.js +241 -0
- package/dist/engine/multiproject.js.map +1 -0
- package/dist/engine/observation.d.ts +82 -0
- package/dist/engine/observation.js +357 -0
- package/dist/engine/observation.js.map +1 -0
- package/dist/engine/orbit.d.ts +91 -0
- package/dist/engine/orbit.js +249 -0
- package/dist/engine/orbit.js.map +1 -0
- package/dist/engine/planet.d.ts +64 -0
- package/dist/engine/planet.js +432 -0
- package/dist/engine/planet.js.map +1 -0
- package/dist/engine/procedural.d.ts +71 -0
- package/dist/engine/procedural.js +259 -0
- package/dist/engine/procedural.js.map +1 -0
- package/dist/engine/quality.d.ts +48 -0
- package/dist/engine/quality.js +245 -0
- package/dist/engine/quality.js.map +1 -0
- package/dist/engine/repository.d.ts +79 -0
- package/dist/engine/repository.js +13 -0
- package/dist/engine/repository.js.map +1 -0
- package/dist/engine/sun.d.ts +61 -0
- package/dist/engine/sun.js +240 -0
- package/dist/engine/sun.js.map +1 -0
- package/dist/engine/temporal.d.ts +67 -0
- package/dist/engine/temporal.js +283 -0
- package/dist/engine/temporal.js.map +1 -0
- package/dist/engine/types.d.ts +179 -0
- package/dist/engine/types.js +27 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/connector-registry.d.ts +20 -0
- package/dist/mcp/connector-registry.js +35 -0
- package/dist/mcp/connector-registry.js.map +1 -0
- package/dist/mcp/server.d.ts +13 -0
- package/dist/mcp/server.js +242 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/daemon-tool.d.ts +16 -0
- package/dist/mcp/tools/daemon-tool.js +58 -0
- package/dist/mcp/tools/daemon-tool.js.map +1 -0
- package/dist/mcp/tools/ingestion-tools.d.ts +20 -0
- package/dist/mcp/tools/ingestion-tools.js +34 -0
- package/dist/mcp/tools/ingestion-tools.js.map +1 -0
- package/dist/mcp/tools/memory-tools.d.ts +122 -0
- package/dist/mcp/tools/memory-tools.js +1037 -0
- package/dist/mcp/tools/memory-tools.js.map +1 -0
- package/dist/scanner/cloud/github.d.ts +34 -0
- package/dist/scanner/cloud/github.js +260 -0
- package/dist/scanner/cloud/github.js.map +1 -0
- package/dist/scanner/cloud/google-drive.d.ts +30 -0
- package/dist/scanner/cloud/google-drive.js +289 -0
- package/dist/scanner/cloud/google-drive.js.map +1 -0
- package/dist/scanner/cloud/notion.d.ts +33 -0
- package/dist/scanner/cloud/notion.js +231 -0
- package/dist/scanner/cloud/notion.js.map +1 -0
- package/dist/scanner/cloud/slack.d.ts +38 -0
- package/dist/scanner/cloud/slack.js +282 -0
- package/dist/scanner/cloud/slack.js.map +1 -0
- package/dist/scanner/cloud/types.d.ts +73 -0
- package/dist/scanner/cloud/types.js +9 -0
- package/dist/scanner/cloud/types.js.map +1 -0
- package/dist/scanner/index.d.ts +35 -0
- package/dist/scanner/index.js +420 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/local/filesystem.d.ts +33 -0
- package/dist/scanner/local/filesystem.js +203 -0
- package/dist/scanner/local/filesystem.js.map +1 -0
- package/dist/scanner/local/git.d.ts +24 -0
- package/dist/scanner/local/git.js +161 -0
- package/dist/scanner/local/git.js.map +1 -0
- package/dist/scanner/local/parsers/code.d.ts +3 -0
- package/dist/scanner/local/parsers/code.js +127 -0
- package/dist/scanner/local/parsers/code.js.map +1 -0
- package/dist/scanner/local/parsers/index.d.ts +11 -0
- package/dist/scanner/local/parsers/index.js +24 -0
- package/dist/scanner/local/parsers/index.js.map +1 -0
- package/dist/scanner/local/parsers/json-parser.d.ts +3 -0
- package/dist/scanner/local/parsers/json-parser.js +117 -0
- package/dist/scanner/local/parsers/json-parser.js.map +1 -0
- package/dist/scanner/local/parsers/markdown.d.ts +3 -0
- package/dist/scanner/local/parsers/markdown.js +120 -0
- package/dist/scanner/local/parsers/markdown.js.map +1 -0
- package/dist/scanner/local/parsers/text.d.ts +3 -0
- package/dist/scanner/local/parsers/text.js +41 -0
- package/dist/scanner/local/parsers/text.js.map +1 -0
- package/dist/scanner/metadata-scanner.d.ts +67 -0
- package/dist/scanner/metadata-scanner.js +356 -0
- package/dist/scanner/metadata-scanner.js.map +1 -0
- package/dist/scanner/types.d.ts +47 -0
- package/dist/scanner/types.js +19 -0
- package/dist/scanner/types.js.map +1 -0
- package/dist/service/daemon.d.ts +23 -0
- package/dist/service/daemon.js +105 -0
- package/dist/service/daemon.js.map +1 -0
- package/dist/service/scheduler.d.ts +73 -0
- package/dist/service/scheduler.js +281 -0
- package/dist/service/scheduler.js.map +1 -0
- package/dist/storage/database.d.ts +10 -0
- package/dist/storage/database.js +265 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/queries.d.ts +85 -0
- package/dist/storage/queries.js +865 -0
- package/dist/storage/queries.js.map +1 -0
- package/dist/storage/sqlite-repository.d.ts +32 -0
- package/dist/storage/sqlite-repository.js +68 -0
- package/dist/storage/sqlite-repository.js.map +1 -0
- package/dist/storage/vec.d.ts +62 -0
- package/dist/storage/vec.js +111 -0
- package/dist/storage/vec.js.map +1 -0
- package/dist/utils/config.d.ts +5 -0
- package/dist/utils/config.js +60 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +36 -0
- package/dist/utils/logger.js +86 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/time.d.ts +21 -0
- package/dist/utils/time.js +42 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/tokenizer.d.ts +13 -0
- package/dist/utils/tokenizer.js +46 -0
- package/dist/utils/tokenizer.js.map +1 -0
- package/package.json +77 -0
- package/scripts/check-node.mjs +36 -0
- 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":"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"}
|
|
@@ -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":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,cAAc,MAAM,sBAAsB,CAAC;AAClD,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,mBAAmB,MAAM,2BAA2B,CAAC;AAC5D,OAAO,cAAc,MAAM,sBAAsB,CAAC;AAClD,OAAO,eAAe,MAAM,uBAAuB,CAAC;AACpD,OAAO,cAAc,MAAM,sBAAsB,CAAC;AAClD,OAAO,eAAe,MAAM,uBAAuB,CAAC;AACpD,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAC1D,OAAO,mBAAmB,MAAM,2BAA2B,CAAC;AAE5D,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAE/D,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAC3B,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAE5B,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;AAEvB,mEAAmE;AACnE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;IACjB,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;QACjB,IAAI,8CAA8C,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAChE,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;CAC5D,CAAC,CAAC,CAAC;AAEJ,eAAe;AACf,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACnC,IAAI,EAAE,oBAAoB;IAC1B,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;CACzB,CAAC,CAAC,CAAC;AAEJ,UAAU;AACV,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;AAC3C,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AACjC,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;AACvC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AACnC,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;AACzC,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AACrC,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;AACrD,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;AAC3C,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;AAC7C,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;AAC3C,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;AAC7C,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,CAAC;AACnD,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;AAErD,8EAA8E;AAC9E,sDAAsD;AACtD,8EAA8E;AAE9E,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;AAE5D,IAAI,UAAU,EAAE,CAAC;IACf,wCAAwC;IACxC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAE/C,6DAA6D;IAC7D,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;QACjB,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,uBAAuB;AACvB,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;IAC3C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,IAAI,uBAAuB,EAAE,EAAE,GAAG,CAAC,CAAC;AACnF,CAAC,CAAC,CAAC;AAEH,MAAM;AACN,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAEpE,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;AAEnE,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;IACxD,OAAO,CAAC,GAAG,CAAC,+CAA+C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,uDAAuD,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;AACrF,CAAC,CAAC,CAAC;AAEH,yDAAyD;AACzD,qBAAqB,EAAE,CAAC;AACxB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC"}
|
|
@@ -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
|