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,19 @@
|
|
|
1
|
+
export const DEFAULT_SCAN_CONFIG = {
|
|
2
|
+
paths: [],
|
|
3
|
+
excludePatterns: [
|
|
4
|
+
'node_modules', '.git', '.svn', 'dist', 'build', '.next',
|
|
5
|
+
'__pycache__', '.venv', 'venv', '.cache', 'coverage', '.nyc_output',
|
|
6
|
+
'*.min.js', '*.min.css', '*.lock', 'package-lock.json', 'yarn.lock',
|
|
7
|
+
'pnpm-lock.yaml',
|
|
8
|
+
],
|
|
9
|
+
fileExtensions: [
|
|
10
|
+
'.md', '.mdx', '.txt', '.log',
|
|
11
|
+
'.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
|
|
12
|
+
'.py', '.java', '.go', '.rs', '.c', '.cpp', '.h',
|
|
13
|
+
'.json', '.jsonl', '.yaml', '.yml', '.toml',
|
|
14
|
+
'.sh', '.bash', '.zsh',
|
|
15
|
+
],
|
|
16
|
+
maxFileSize: 1_048_576, // 1 MB
|
|
17
|
+
watchMode: false,
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/scanner/types.ts"],"names":[],"mappings":"AA+BA,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,KAAK,EAAE,EAAE;IACT,eAAe,EAAE;QACf,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;QACxD,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa;QACnE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,mBAAmB,EAAE,WAAW;QACnE,gBAAgB;KACjB;IACD,cAAc,EAAE;QACd,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;QAC7B,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;QAC5C,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI;QAChD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO;QAC3C,KAAK,EAAE,OAAO,EAAE,MAAM;KACvB;IACD,WAAW,EAAE,SAAS,EAAE,OAAO;IAC/B,SAAS,EAAE,KAAK;CACjB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* service/daemon.ts — Stellar Memory background daemon.
|
|
3
|
+
*
|
|
4
|
+
* Entry point when running `npm run daemon`.
|
|
5
|
+
*
|
|
6
|
+
* Responsibilities:
|
|
7
|
+
* - Initialise the SQLite database
|
|
8
|
+
* - Create the scheduler with default intervals
|
|
9
|
+
* - Handle SIGTERM / SIGINT for graceful shutdown
|
|
10
|
+
* - Expose status via exit code (0 = clean, 1 = error)
|
|
11
|
+
*/
|
|
12
|
+
import { type DaemonStatus } from './scheduler.js';
|
|
13
|
+
export declare class StellarDaemon {
|
|
14
|
+
private scheduler;
|
|
15
|
+
private isRunning;
|
|
16
|
+
private startedAt;
|
|
17
|
+
constructor();
|
|
18
|
+
start(): Promise<void>;
|
|
19
|
+
stop(): Promise<void>;
|
|
20
|
+
status(): DaemonStatus;
|
|
21
|
+
}
|
|
22
|
+
export type { DaemonStatus };
|
|
23
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* service/daemon.ts — Stellar Memory background daemon.
|
|
3
|
+
*
|
|
4
|
+
* Entry point when running `npm run daemon`.
|
|
5
|
+
*
|
|
6
|
+
* Responsibilities:
|
|
7
|
+
* - Initialise the SQLite database
|
|
8
|
+
* - Create the scheduler with default intervals
|
|
9
|
+
* - Handle SIGTERM / SIGINT for graceful shutdown
|
|
10
|
+
* - Expose status via exit code (0 = clean, 1 = error)
|
|
11
|
+
*/
|
|
12
|
+
import { initDatabase } from '../storage/database.js';
|
|
13
|
+
import { getConfig } from '../utils/config.js';
|
|
14
|
+
import { createLogger } from '../utils/logger.js';
|
|
15
|
+
import { StellarScheduler, DEFAULT_SCHEDULE_CONFIG, } from './scheduler.js';
|
|
16
|
+
const log = createLogger('daemon');
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// StellarDaemon
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
export class StellarDaemon {
|
|
21
|
+
scheduler;
|
|
22
|
+
isRunning = false;
|
|
23
|
+
startedAt = null;
|
|
24
|
+
constructor() {
|
|
25
|
+
this.scheduler = new StellarScheduler(DEFAULT_SCHEDULE_CONFIG);
|
|
26
|
+
}
|
|
27
|
+
async start() {
|
|
28
|
+
if (this.isRunning) {
|
|
29
|
+
log.warn('Daemon already running');
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const config = getConfig();
|
|
33
|
+
log.info('Stellar Memory daemon starting', {
|
|
34
|
+
project: config.defaultProject,
|
|
35
|
+
db: config.dbPath,
|
|
36
|
+
});
|
|
37
|
+
initDatabase(config.dbPath);
|
|
38
|
+
this.scheduler.start();
|
|
39
|
+
this.isRunning = true;
|
|
40
|
+
this.startedAt = new Date();
|
|
41
|
+
log.info('Stellar Memory daemon started');
|
|
42
|
+
}
|
|
43
|
+
async stop() {
|
|
44
|
+
if (!this.isRunning)
|
|
45
|
+
return;
|
|
46
|
+
log.info('Stellar Memory daemon stopping — waiting for in-progress tasks');
|
|
47
|
+
this.scheduler.stop();
|
|
48
|
+
this.isRunning = false;
|
|
49
|
+
log.info('Stellar Memory daemon stopped cleanly');
|
|
50
|
+
}
|
|
51
|
+
status() {
|
|
52
|
+
return {
|
|
53
|
+
isRunning: this.isRunning,
|
|
54
|
+
startedAt: this.startedAt,
|
|
55
|
+
tasks: this.scheduler.getStatus(),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// printStatus — human-readable daemon status table to stderr
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
function printStatus(status) {
|
|
63
|
+
const tasks = status.tasks;
|
|
64
|
+
const lines = [
|
|
65
|
+
`[stellar-daemon] Running: ${status.isRunning}`,
|
|
66
|
+
status.startedAt ? `[stellar-daemon] Started: ${status.startedAt.toISOString()}` : '',
|
|
67
|
+
'[stellar-daemon] Tasks:',
|
|
68
|
+
...Object.entries(tasks).map(([name, t]) => {
|
|
69
|
+
const last = t.lastRunAt ? t.lastRunAt.toISOString() : 'never';
|
|
70
|
+
const dur = t.lastDuration !== null ? `${t.lastDuration}ms` : '—';
|
|
71
|
+
const err = t.lastError ? ` ERR: ${t.lastError}` : '';
|
|
72
|
+
return ` ${name.padEnd(22)} runs=${t.runCount} last=${last} dur=${dur}${err}`;
|
|
73
|
+
}),
|
|
74
|
+
].filter(Boolean);
|
|
75
|
+
for (const line of lines) {
|
|
76
|
+
process.stderr.write(line + '\n');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
// main — run the daemon as a standalone process
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
async function main() {
|
|
83
|
+
const daemon = new StellarDaemon();
|
|
84
|
+
// Graceful shutdown handlers
|
|
85
|
+
const shutdown = async (signal) => {
|
|
86
|
+
log.info(`Received ${signal} — shutting down gracefully`);
|
|
87
|
+
await daemon.stop();
|
|
88
|
+
process.exit(0);
|
|
89
|
+
};
|
|
90
|
+
process.on('SIGTERM', () => void shutdown('SIGTERM'));
|
|
91
|
+
process.on('SIGINT', () => void shutdown('SIGINT'));
|
|
92
|
+
// Print status every 5 minutes to stderr for observability
|
|
93
|
+
const statusInterval = setInterval(() => {
|
|
94
|
+
printStatus(daemon.status());
|
|
95
|
+
}, 5 * 60 * 1000);
|
|
96
|
+
if (statusInterval.unref)
|
|
97
|
+
statusInterval.unref();
|
|
98
|
+
await daemon.start();
|
|
99
|
+
printStatus(daemon.status());
|
|
100
|
+
}
|
|
101
|
+
main().catch(err => {
|
|
102
|
+
console.error('[stellar-daemon] Fatal error:', err);
|
|
103
|
+
process.exit(1);
|
|
104
|
+
});
|
|
105
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/service/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* service/scheduler.ts — Stellar Memory background scheduler.
|
|
3
|
+
*
|
|
4
|
+
* Manages recurring tasks using setInterval (no external queue needed —
|
|
5
|
+
* the process is long-lived and single-tenant).
|
|
6
|
+
*
|
|
7
|
+
* Tasks:
|
|
8
|
+
* - recalculateOrbits : apply orbital physics (decay + gravity)
|
|
9
|
+
* - scanLocalFiles : run the local file scanner on registered sources
|
|
10
|
+
* - scoreMemoryQuality : score quality of all memories
|
|
11
|
+
* - cleanupForgottenZone : soft-delete memories in Forgotten zone older than threshold
|
|
12
|
+
*
|
|
13
|
+
* Design decisions:
|
|
14
|
+
* - Each task runs in isolation; a failure in one does not affect others.
|
|
15
|
+
* - On start() all timers fire once immediately (offset 0) then on schedule.
|
|
16
|
+
* - runNow() lets callers trigger any task out-of-band (e.g. from an MCP tool).
|
|
17
|
+
* - Graceful stop() waits for any in-progress task to finish before clearing.
|
|
18
|
+
*/
|
|
19
|
+
export interface ScheduleConfig {
|
|
20
|
+
/** Orbital physics recalculation period (ms). Default: 1 hour */
|
|
21
|
+
orbitRecalcInterval: number;
|
|
22
|
+
/** Local file scan period (ms). Default: 30 minutes */
|
|
23
|
+
localScanInterval: number;
|
|
24
|
+
/** Oort cloud cleanup period (ms). Default: 24 hours */
|
|
25
|
+
cleanupInterval: number;
|
|
26
|
+
/** Quality scoring period (ms). Default: 4 hours */
|
|
27
|
+
qualityScoringInterval: number;
|
|
28
|
+
/** Memory consolidation period (ms). Default: 6 hours */
|
|
29
|
+
consolidationInterval: number;
|
|
30
|
+
/** Procedural pattern detection period (ms). Default: 12 hours */
|
|
31
|
+
proceduralDetectionInterval: number;
|
|
32
|
+
/** Project name used for orbit recalc and cleanup. Default: config.defaultProject */
|
|
33
|
+
project?: string;
|
|
34
|
+
/** How old (in days) an Oort memory must be before it is cleaned up. Default: 30 days */
|
|
35
|
+
oortCleanupAgeDays?: number;
|
|
36
|
+
}
|
|
37
|
+
export declare const DEFAULT_SCHEDULE_CONFIG: ScheduleConfig;
|
|
38
|
+
export type ScheduledTask = 'recalculateOrbits' | 'scanLocalFiles' | 'cleanupForgottenZone' | 'scoreMemoryQuality' | 'runConsolidation' | 'detectProceduralPatterns';
|
|
39
|
+
export interface DaemonStatus {
|
|
40
|
+
isRunning: boolean;
|
|
41
|
+
startedAt: Date | null;
|
|
42
|
+
tasks: Record<ScheduledTask, TaskStatus>;
|
|
43
|
+
}
|
|
44
|
+
export interface TaskStatus {
|
|
45
|
+
lastRunAt: Date | null;
|
|
46
|
+
lastDuration: number | null;
|
|
47
|
+
lastError: string | null;
|
|
48
|
+
runCount: number;
|
|
49
|
+
isRunning: boolean;
|
|
50
|
+
}
|
|
51
|
+
export declare class StellarScheduler {
|
|
52
|
+
private readonly config;
|
|
53
|
+
private timers;
|
|
54
|
+
private running;
|
|
55
|
+
private taskStatus;
|
|
56
|
+
constructor(config?: Partial<ScheduleConfig>);
|
|
57
|
+
start(): void;
|
|
58
|
+
stop(): void;
|
|
59
|
+
/** Run a specific task immediately (out-of-band). */
|
|
60
|
+
runNow(task: ScheduledTask): Promise<void>;
|
|
61
|
+
/** Returns a snapshot of the current status for all tasks. */
|
|
62
|
+
getStatus(): Record<ScheduledTask, TaskStatus>;
|
|
63
|
+
private schedule;
|
|
64
|
+
private executeTask;
|
|
65
|
+
private getTaskFn;
|
|
66
|
+
private recalculateOrbits;
|
|
67
|
+
private scanLocalFiles;
|
|
68
|
+
private cleanupForgottenZone;
|
|
69
|
+
private scoreMemoryQuality;
|
|
70
|
+
private runConsolidationTask;
|
|
71
|
+
private detectProceduralPatterns;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* service/scheduler.ts — Stellar Memory background scheduler.
|
|
3
|
+
*
|
|
4
|
+
* Manages recurring tasks using setInterval (no external queue needed —
|
|
5
|
+
* the process is long-lived and single-tenant).
|
|
6
|
+
*
|
|
7
|
+
* Tasks:
|
|
8
|
+
* - recalculateOrbits : apply orbital physics (decay + gravity)
|
|
9
|
+
* - scanLocalFiles : run the local file scanner on registered sources
|
|
10
|
+
* - scoreMemoryQuality : score quality of all memories
|
|
11
|
+
* - cleanupForgottenZone : soft-delete memories in Forgotten zone older than threshold
|
|
12
|
+
*
|
|
13
|
+
* Design decisions:
|
|
14
|
+
* - Each task runs in isolation; a failure in one does not affect others.
|
|
15
|
+
* - On start() all timers fire once immediately (offset 0) then on schedule.
|
|
16
|
+
* - runNow() lets callers trigger any task out-of-band (e.g. from an MCP tool).
|
|
17
|
+
* - Graceful stop() waits for any in-progress task to finish before clearing.
|
|
18
|
+
*/
|
|
19
|
+
import { createLogger } from '../utils/logger.js';
|
|
20
|
+
import { recalculateOrbits } from '../engine/orbit.js';
|
|
21
|
+
import { getConfig } from '../utils/config.js';
|
|
22
|
+
import { getMemoriesInZone, softDeleteMemory, getAllDataSources, getMemoriesByProject } from '../storage/queries.js';
|
|
23
|
+
import { StellarScanner } from '../scanner/index.js';
|
|
24
|
+
import { scoreAllMemories } from '../engine/quality.js';
|
|
25
|
+
import { runConsolidation } from '../engine/consolidation.js';
|
|
26
|
+
import { detectProceduralPattern, createProceduralMemory, getProceduralMemories } from '../engine/procedural.js';
|
|
27
|
+
const log = createLogger('scheduler');
|
|
28
|
+
export const DEFAULT_SCHEDULE_CONFIG = {
|
|
29
|
+
orbitRecalcInterval: 60 * 60 * 1000, // 1 hour
|
|
30
|
+
localScanInterval: 30 * 60 * 1000, // 30 min
|
|
31
|
+
cleanupInterval: 24 * 60 * 60 * 1000, // 24 hours
|
|
32
|
+
qualityScoringInterval: 4 * 60 * 60 * 1000, // 4 hours
|
|
33
|
+
consolidationInterval: 6 * 60 * 60 * 1000, // 6 hours
|
|
34
|
+
proceduralDetectionInterval: 12 * 60 * 60 * 1000, // 12 hours
|
|
35
|
+
oortCleanupAgeDays: 30,
|
|
36
|
+
};
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// StellarScheduler
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
export class StellarScheduler {
|
|
41
|
+
config;
|
|
42
|
+
timers = new Map();
|
|
43
|
+
running = false;
|
|
44
|
+
taskStatus;
|
|
45
|
+
constructor(config = {}) {
|
|
46
|
+
this.config = {
|
|
47
|
+
...DEFAULT_SCHEDULE_CONFIG,
|
|
48
|
+
oortCleanupAgeDays: 30,
|
|
49
|
+
project: getConfig().defaultProject,
|
|
50
|
+
...config,
|
|
51
|
+
};
|
|
52
|
+
this.taskStatus = {
|
|
53
|
+
recalculateOrbits: makeBlankStatus(),
|
|
54
|
+
scanLocalFiles: makeBlankStatus(),
|
|
55
|
+
cleanupForgottenZone: makeBlankStatus(),
|
|
56
|
+
scoreMemoryQuality: makeBlankStatus(),
|
|
57
|
+
runConsolidation: makeBlankStatus(),
|
|
58
|
+
detectProceduralPatterns: makeBlankStatus(),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// -------------------------------------------------------------------------
|
|
62
|
+
// start / stop
|
|
63
|
+
// -------------------------------------------------------------------------
|
|
64
|
+
start() {
|
|
65
|
+
if (this.running) {
|
|
66
|
+
log.warn('Scheduler already running — ignoring duplicate start()');
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
this.running = true;
|
|
70
|
+
log.info('Scheduler starting', {
|
|
71
|
+
project: this.config.project,
|
|
72
|
+
orbitRecalcInterval: this.config.orbitRecalcInterval,
|
|
73
|
+
localScanInterval: this.config.localScanInterval,
|
|
74
|
+
cleanupInterval: this.config.cleanupInterval,
|
|
75
|
+
});
|
|
76
|
+
this.schedule('recalculateOrbits', this.config.orbitRecalcInterval, () => this.recalculateOrbits());
|
|
77
|
+
this.schedule('scanLocalFiles', this.config.localScanInterval, () => this.scanLocalFiles());
|
|
78
|
+
this.schedule('cleanupForgottenZone', this.config.cleanupInterval, () => this.cleanupForgottenZone());
|
|
79
|
+
this.schedule('scoreMemoryQuality', this.config.qualityScoringInterval, () => this.scoreMemoryQuality());
|
|
80
|
+
this.schedule('runConsolidation', this.config.consolidationInterval, () => this.runConsolidationTask());
|
|
81
|
+
this.schedule('detectProceduralPatterns', this.config.proceduralDetectionInterval, () => this.detectProceduralPatterns());
|
|
82
|
+
}
|
|
83
|
+
stop() {
|
|
84
|
+
if (!this.running)
|
|
85
|
+
return;
|
|
86
|
+
this.running = false;
|
|
87
|
+
for (const [task, timer] of this.timers) {
|
|
88
|
+
clearInterval(timer);
|
|
89
|
+
log.debug('Cleared timer', { task });
|
|
90
|
+
}
|
|
91
|
+
this.timers.clear();
|
|
92
|
+
log.info('Scheduler stopped');
|
|
93
|
+
}
|
|
94
|
+
/** Run a specific task immediately (out-of-band). */
|
|
95
|
+
async runNow(task) {
|
|
96
|
+
log.info('Running task out-of-band', { task });
|
|
97
|
+
await this.executeTask(task, this.getTaskFn(task));
|
|
98
|
+
}
|
|
99
|
+
/** Returns a snapshot of the current status for all tasks. */
|
|
100
|
+
getStatus() {
|
|
101
|
+
return { ...this.taskStatus };
|
|
102
|
+
}
|
|
103
|
+
// -------------------------------------------------------------------------
|
|
104
|
+
// Private — scheduling infrastructure
|
|
105
|
+
// -------------------------------------------------------------------------
|
|
106
|
+
schedule(name, intervalMs, fn) {
|
|
107
|
+
// Fire once immediately (async — do not block start())
|
|
108
|
+
void this.executeTask(name, fn);
|
|
109
|
+
const timer = setInterval(() => void this.executeTask(name, fn), intervalMs);
|
|
110
|
+
// Allow Node.js to exit even if the timer is still pending
|
|
111
|
+
if (timer.unref)
|
|
112
|
+
timer.unref();
|
|
113
|
+
this.timers.set(name, timer);
|
|
114
|
+
log.debug('Scheduled task', { task: name, intervalMs });
|
|
115
|
+
}
|
|
116
|
+
async executeTask(name, fn) {
|
|
117
|
+
if (this.taskStatus[name].isRunning) {
|
|
118
|
+
log.warn('Task already running — skipping', { task: name });
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
this.taskStatus[name].isRunning = true;
|
|
122
|
+
const start = Date.now();
|
|
123
|
+
try {
|
|
124
|
+
await fn();
|
|
125
|
+
const duration = Date.now() - start;
|
|
126
|
+
this.taskStatus[name] = {
|
|
127
|
+
...this.taskStatus[name],
|
|
128
|
+
lastRunAt: new Date(),
|
|
129
|
+
lastDuration: duration,
|
|
130
|
+
lastError: null,
|
|
131
|
+
runCount: this.taskStatus[name].runCount + 1,
|
|
132
|
+
isRunning: false,
|
|
133
|
+
};
|
|
134
|
+
log.info('Task completed', { task: name, durationMs: duration });
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
const duration = Date.now() - start;
|
|
138
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
139
|
+
this.taskStatus[name] = {
|
|
140
|
+
...this.taskStatus[name],
|
|
141
|
+
lastRunAt: new Date(),
|
|
142
|
+
lastDuration: duration,
|
|
143
|
+
lastError: message,
|
|
144
|
+
runCount: this.taskStatus[name].runCount + 1,
|
|
145
|
+
isRunning: false,
|
|
146
|
+
};
|
|
147
|
+
log.error('Task failed', err instanceof Error ? err : new Error(message), { task: name });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
getTaskFn(task) {
|
|
151
|
+
switch (task) {
|
|
152
|
+
case 'recalculateOrbits': return () => this.recalculateOrbits();
|
|
153
|
+
case 'scanLocalFiles': return () => this.scanLocalFiles();
|
|
154
|
+
case 'cleanupForgottenZone': return () => this.cleanupForgottenZone();
|
|
155
|
+
case 'scoreMemoryQuality': return () => this.scoreMemoryQuality();
|
|
156
|
+
case 'runConsolidation': return () => this.runConsolidationTask();
|
|
157
|
+
case 'detectProceduralPatterns': return () => this.detectProceduralPatterns();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// -------------------------------------------------------------------------
|
|
161
|
+
// Scheduled task implementations
|
|
162
|
+
// -------------------------------------------------------------------------
|
|
163
|
+
async recalculateOrbits() {
|
|
164
|
+
const config = getConfig();
|
|
165
|
+
const changes = recalculateOrbits(this.config.project, config);
|
|
166
|
+
log.info('Orbit recalculation complete', {
|
|
167
|
+
project: this.config.project,
|
|
168
|
+
changes: changes.length,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
async scanLocalFiles() {
|
|
172
|
+
const sources = getAllDataSources();
|
|
173
|
+
const localSources = sources.filter((ds) => ds.type === 'local' && ds.status !== 'error');
|
|
174
|
+
if (localSources.length === 0) {
|
|
175
|
+
log.debug('No local data sources registered — skipping scan');
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
log.info('Local file scan triggered', { sources: localSources.length });
|
|
179
|
+
for (const ds of localSources) {
|
|
180
|
+
try {
|
|
181
|
+
const scanner = new StellarScanner({ paths: [ds.path] });
|
|
182
|
+
const result = await scanner.scan();
|
|
183
|
+
log.info('Local scan complete', {
|
|
184
|
+
path: ds.path,
|
|
185
|
+
created: result.createdMemories,
|
|
186
|
+
skipped: result.skippedFiles,
|
|
187
|
+
errors: result.errorFiles,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
// Failure in one source must not prevent others from being scanned
|
|
192
|
+
log.error(`Local scan failed for ${ds.path}`, err instanceof Error ? err : new Error(String(err)));
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
async cleanupForgottenZone() {
|
|
197
|
+
const oortMemories = getMemoriesInZone(this.config.project, 'forgotten');
|
|
198
|
+
const cutoff = new Date(Date.now() - this.config.oortCleanupAgeDays * 24 * 60 * 60 * 1000);
|
|
199
|
+
let removed = 0;
|
|
200
|
+
for (const memory of oortMemories) {
|
|
201
|
+
const lastTouched = memory.last_accessed_at
|
|
202
|
+
? new Date(memory.last_accessed_at)
|
|
203
|
+
: new Date(memory.created_at);
|
|
204
|
+
if (lastTouched < cutoff) {
|
|
205
|
+
softDeleteMemory(memory.id);
|
|
206
|
+
removed++;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
log.info('Oort cloud cleanup complete', {
|
|
210
|
+
project: this.config.project,
|
|
211
|
+
inspected: oortMemories.length,
|
|
212
|
+
removed,
|
|
213
|
+
cutoffDays: this.config.oortCleanupAgeDays,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
async scoreMemoryQuality() {
|
|
217
|
+
const result = scoreAllMemories(this.config.project);
|
|
218
|
+
log.info('Quality scoring complete', {
|
|
219
|
+
project: this.config.project,
|
|
220
|
+
scored: result.scored,
|
|
221
|
+
avgQuality: result.avgQuality.toFixed(3),
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
async runConsolidationTask() {
|
|
225
|
+
const result = await runConsolidation(this.config.project);
|
|
226
|
+
log.info('Consolidation pass complete', {
|
|
227
|
+
project: this.config.project,
|
|
228
|
+
groupsFound: result.groupsFound,
|
|
229
|
+
memoriesConsolidated: result.memoriesConsolidated,
|
|
230
|
+
newMemoriesCreated: result.newMemoriesCreated,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
async detectProceduralPatterns() {
|
|
234
|
+
const memories = getMemoriesByProject(this.config.project);
|
|
235
|
+
const patterns = detectProceduralPattern(memories, this.config.project);
|
|
236
|
+
// Get existing procedural memories to avoid duplicates
|
|
237
|
+
const existing = getProceduralMemories(this.config.project);
|
|
238
|
+
const existingRules = new Set(existing.map(m => {
|
|
239
|
+
const match = m.content.match(/^Rule:\s*(.+?)(\n|$)/);
|
|
240
|
+
return match ? match[1].trim().toLowerCase() : m.summary.toLowerCase();
|
|
241
|
+
}));
|
|
242
|
+
let created = 0;
|
|
243
|
+
for (const pattern of patterns) {
|
|
244
|
+
const ruleKey = pattern.suggestedRule.toLowerCase();
|
|
245
|
+
if (existingRules.has(ruleKey))
|
|
246
|
+
continue;
|
|
247
|
+
const evidence = memories
|
|
248
|
+
.filter(m => m.tags.some(t => pattern.pattern.includes(`"${t}"`)))
|
|
249
|
+
.map(m => m.summary);
|
|
250
|
+
try {
|
|
251
|
+
createProceduralMemory(pattern.suggestedRule, evidence, this.config.project);
|
|
252
|
+
existingRules.add(ruleKey);
|
|
253
|
+
created++;
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
log.warn('Failed to create procedural memory', {
|
|
257
|
+
pattern: pattern.pattern,
|
|
258
|
+
error: String(err),
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
log.info('Procedural pattern detection complete', {
|
|
263
|
+
project: this.config.project,
|
|
264
|
+
patternsFound: patterns.length,
|
|
265
|
+
rulesCreated: created,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// ---------------------------------------------------------------------------
|
|
270
|
+
// Helpers
|
|
271
|
+
// ---------------------------------------------------------------------------
|
|
272
|
+
function makeBlankStatus() {
|
|
273
|
+
return {
|
|
274
|
+
lastRunAt: null,
|
|
275
|
+
lastDuration: null,
|
|
276
|
+
lastError: null,
|
|
277
|
+
runCount: 0,
|
|
278
|
+
isRunning: false,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/service/scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
export declare function initDatabase(dbPath: string): DatabaseSync;
|
|
3
|
+
export declare function getDatabase(): DatabaseSync;
|
|
4
|
+
/**
|
|
5
|
+
* Run `fn` inside a SQLite transaction.
|
|
6
|
+
* Commits on success, rolls back and re-throws on any error.
|
|
7
|
+
*/
|
|
8
|
+
export declare function withTransaction<T>(fn: () => T): T;
|
|
9
|
+
export declare function resetDatabase(): void;
|
|
10
|
+
//# sourceMappingURL=database.d.ts.map
|