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,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