@chendpoc/pi-memory 0.1.11 → 0.1.13

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 (177) hide show
  1. package/README.md +88 -16
  2. package/dist/cache/memoryCaches.d.ts +32 -0
  3. package/dist/cache/memoryCaches.d.ts.map +1 -0
  4. package/dist/cache/memoryCaches.js +59 -0
  5. package/dist/cache/memoryCaches.js.map +1 -0
  6. package/dist/cli.js +123 -0
  7. package/dist/cli.js.map +1 -1
  8. package/dist/config.d.ts +28 -0
  9. package/dist/config.d.ts.map +1 -1
  10. package/dist/config.js +37 -1
  11. package/dist/config.js.map +1 -1
  12. package/dist/consolidation/enqueue.d.ts +33 -0
  13. package/dist/consolidation/enqueue.d.ts.map +1 -0
  14. package/dist/consolidation/enqueue.js +145 -0
  15. package/dist/consolidation/enqueue.js.map +1 -0
  16. package/dist/consolidation/index.d.ts +19 -0
  17. package/dist/consolidation/index.d.ts.map +1 -0
  18. package/dist/consolidation/index.js +15 -0
  19. package/dist/consolidation/index.js.map +1 -0
  20. package/dist/consolidation/lock.d.ts +5 -0
  21. package/dist/consolidation/lock.d.ts.map +1 -0
  22. package/dist/consolidation/lock.js +33 -0
  23. package/dist/consolidation/lock.js.map +1 -0
  24. package/dist/consolidation/log.d.ts +8 -0
  25. package/dist/consolidation/log.d.ts.map +1 -0
  26. package/dist/consolidation/log.js +32 -0
  27. package/dist/consolidation/log.js.map +1 -0
  28. package/dist/consolidation/memoryIndex.d.ts +18 -0
  29. package/dist/consolidation/memoryIndex.d.ts.map +1 -0
  30. package/dist/consolidation/memoryIndex.js +100 -0
  31. package/dist/consolidation/memoryIndex.js.map +1 -0
  32. package/dist/consolidation/phase2/runPhase2.d.ts +23 -0
  33. package/dist/consolidation/phase2/runPhase2.d.ts.map +1 -0
  34. package/dist/consolidation/phase2/runPhase2.js +196 -0
  35. package/dist/consolidation/phase2/runPhase2.js.map +1 -0
  36. package/dist/consolidation/scheduler/launchd.d.ts +5 -0
  37. package/dist/consolidation/scheduler/launchd.d.ts.map +1 -0
  38. package/dist/consolidation/scheduler/launchd.js +54 -0
  39. package/dist/consolidation/scheduler/launchd.js.map +1 -0
  40. package/dist/consolidation/scheduler/runConsolidate.d.ts +26 -0
  41. package/dist/consolidation/scheduler/runConsolidate.d.ts.map +1 -0
  42. package/dist/consolidation/scheduler/runConsolidate.js +83 -0
  43. package/dist/consolidation/scheduler/runConsolidate.js.map +1 -0
  44. package/dist/consolidation/scheduler/setupSchedule.d.ts +3 -0
  45. package/dist/consolidation/scheduler/setupSchedule.d.ts.map +1 -0
  46. package/dist/consolidation/scheduler/setupSchedule.js +79 -0
  47. package/dist/consolidation/scheduler/setupSchedule.js.map +1 -0
  48. package/dist/consolidation/scheduler/systemd.d.ts +9 -0
  49. package/dist/consolidation/scheduler/systemd.d.ts.map +1 -0
  50. package/dist/consolidation/scheduler/systemd.js +57 -0
  51. package/dist/consolidation/scheduler/systemd.js.map +1 -0
  52. package/dist/consolidation/scheduler/types.d.ts +24 -0
  53. package/dist/consolidation/scheduler/types.d.ts.map +1 -0
  54. package/dist/consolidation/scheduler/types.js +2 -0
  55. package/dist/consolidation/scheduler/types.js.map +1 -0
  56. package/dist/consolidation/scope.d.ts +12 -0
  57. package/dist/consolidation/scope.d.ts.map +1 -0
  58. package/dist/consolidation/scope.js +51 -0
  59. package/dist/consolidation/scope.js.map +1 -0
  60. package/dist/consolidation/stage1/deltaExtract.d.ts +3 -0
  61. package/dist/consolidation/stage1/deltaExtract.d.ts.map +1 -0
  62. package/dist/consolidation/stage1/deltaExtract.js +19 -0
  63. package/dist/consolidation/stage1/deltaExtract.js.map +1 -0
  64. package/dist/consolidation/stage1/drainQueue.d.ts +21 -0
  65. package/dist/consolidation/stage1/drainQueue.d.ts.map +1 -0
  66. package/dist/consolidation/stage1/drainQueue.js +113 -0
  67. package/dist/consolidation/stage1/drainQueue.js.map +1 -0
  68. package/dist/consolidation/stage1/extractSession.d.ts +6 -0
  69. package/dist/consolidation/stage1/extractSession.d.ts.map +1 -0
  70. package/dist/consolidation/stage1/extractSession.js +47 -0
  71. package/dist/consolidation/stage1/extractSession.js.map +1 -0
  72. package/dist/consolidation/stage1/store.d.ts +45 -0
  73. package/dist/consolidation/stage1/store.d.ts.map +1 -0
  74. package/dist/consolidation/stage1/store.js +297 -0
  75. package/dist/consolidation/stage1/store.js.map +1 -0
  76. package/dist/consolidation/types.d.ts +49 -0
  77. package/dist/consolidation/types.d.ts.map +1 -0
  78. package/dist/consolidation/types.js +2 -0
  79. package/dist/consolidation/types.js.map +1 -0
  80. package/dist/fallback/llmRerank.d.ts.map +1 -1
  81. package/dist/fallback/llmRerank.js +9 -1
  82. package/dist/fallback/llmRerank.js.map +1 -1
  83. package/dist/fallback/sessionIndex.d.ts.map +1 -1
  84. package/dist/fallback/sessionIndex.js +15 -63
  85. package/dist/fallback/sessionIndex.js.map +1 -1
  86. package/dist/index.d.ts +4 -3
  87. package/dist/index.d.ts.map +1 -1
  88. package/dist/index.js +4 -3
  89. package/dist/index.js.map +1 -1
  90. package/dist/local/graphQuery.d.ts +10 -0
  91. package/dist/local/graphQuery.d.ts.map +1 -1
  92. package/dist/local/graphQuery.js +25 -0
  93. package/dist/local/graphQuery.js.map +1 -1
  94. package/dist/pi-extension.d.ts.map +1 -1
  95. package/dist/pi-extension.js +356 -22
  96. package/dist/pi-extension.js.map +1 -1
  97. package/dist/preflight/detectIntents.d.ts.map +1 -1
  98. package/dist/preflight/detectIntents.js +7 -0
  99. package/dist/preflight/detectIntents.js.map +1 -1
  100. package/dist/preflight/hook.d.ts +18 -0
  101. package/dist/preflight/hook.d.ts.map +1 -1
  102. package/dist/preflight/hook.js +52 -7
  103. package/dist/preflight/hook.js.map +1 -1
  104. package/dist/preflight/render.d.ts +16 -2
  105. package/dist/preflight/render.d.ts.map +1 -1
  106. package/dist/preflight/render.js +24 -4
  107. package/dist/preflight/render.js.map +1 -1
  108. package/dist/service.d.ts +16 -0
  109. package/dist/service.d.ts.map +1 -1
  110. package/dist/service.js +57 -0
  111. package/dist/service.js.map +1 -1
  112. package/dist/session/activeBranch.d.ts +17 -0
  113. package/dist/session/activeBranch.d.ts.map +1 -0
  114. package/dist/session/activeBranch.js +251 -0
  115. package/dist/session/activeBranch.js.map +1 -0
  116. package/dist/settings.d.ts +5 -2
  117. package/dist/settings.d.ts.map +1 -1
  118. package/dist/settings.js +18 -1
  119. package/dist/settings.js.map +1 -1
  120. package/dist/tools/memoryAppend.d.ts +14 -4
  121. package/dist/tools/memoryAppend.d.ts.map +1 -1
  122. package/dist/tools/memoryAppend.js +46 -7
  123. package/dist/tools/memoryAppend.js.map +1 -1
  124. package/dist/tools/memoryRecall.d.ts +2 -2
  125. package/dist/tools/memoryRecall.d.ts.map +1 -1
  126. package/dist/tools/memoryRecall.js +35 -9
  127. package/dist/tools/memoryRecall.js.map +1 -1
  128. package/dist/trainer/extractFacts.d.ts +1 -1
  129. package/dist/trainer/index.d.ts +1 -1
  130. package/dist/trainer/index.d.ts.map +1 -1
  131. package/dist/trainer/index.js +1 -1
  132. package/dist/trainer/index.js.map +1 -1
  133. package/dist/trainer/scheduler.d.ts +2 -0
  134. package/dist/trainer/scheduler.d.ts.map +1 -1
  135. package/dist/trainer/scheduler.js +1 -0
  136. package/dist/trainer/scheduler.js.map +1 -1
  137. package/dist/trainer/sessionLoader.d.ts +3 -0
  138. package/dist/trainer/sessionLoader.d.ts.map +1 -1
  139. package/dist/trainer/sessionLoader.js +37 -74
  140. package/dist/trainer/sessionLoader.js.map +1 -1
  141. package/package.json +17 -4
  142. package/src/cache/memoryCaches.ts +72 -0
  143. package/src/cli.ts +144 -0
  144. package/src/config.ts +89 -1
  145. package/src/consolidation/enqueue.ts +205 -0
  146. package/src/consolidation/index.ts +90 -0
  147. package/src/consolidation/lock.ts +41 -0
  148. package/src/consolidation/log.ts +43 -0
  149. package/src/consolidation/memoryIndex.ts +127 -0
  150. package/src/consolidation/phase2/runPhase2.ts +255 -0
  151. package/src/consolidation/scheduler/launchd.ts +62 -0
  152. package/src/consolidation/scheduler/runConsolidate.ts +115 -0
  153. package/src/consolidation/scheduler/setupSchedule.ts +106 -0
  154. package/src/consolidation/scheduler/systemd.ts +78 -0
  155. package/src/consolidation/scheduler/types.ts +27 -0
  156. package/src/consolidation/scope.ts +58 -0
  157. package/src/consolidation/stage1/deltaExtract.ts +29 -0
  158. package/src/consolidation/stage1/drainQueue.ts +143 -0
  159. package/src/consolidation/stage1/extractSession.ts +58 -0
  160. package/src/consolidation/stage1/store.ts +411 -0
  161. package/src/consolidation/types.ts +52 -0
  162. package/src/fallback/llmRerank.ts +8 -1
  163. package/src/fallback/sessionIndex.ts +14 -51
  164. package/src/index.ts +8 -0
  165. package/src/local/graphQuery.ts +24 -0
  166. package/src/pi-extension.ts +393 -28
  167. package/src/preflight/detectIntents.ts +6 -0
  168. package/src/preflight/hook.ts +84 -7
  169. package/src/preflight/render.ts +35 -3
  170. package/src/service.ts +57 -0
  171. package/src/session/activeBranch.ts +294 -0
  172. package/src/settings.ts +37 -2
  173. package/src/tools/memoryAppend.ts +60 -7
  174. package/src/tools/memoryRecall.ts +33 -9
  175. package/src/trainer/index.ts +1 -1
  176. package/src/trainer/scheduler.ts +3 -0
  177. package/src/trainer/sessionLoader.ts +38 -87
@@ -0,0 +1,196 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ async function readFileOptional(filePath) {
4
+ try {
5
+ return await fs.readFile(filePath, "utf8");
6
+ }
7
+ catch {
8
+ return "";
9
+ }
10
+ }
11
+ function stripScopeComment(line) {
12
+ return line.replace(/<!--\s*scope:[^>]+-->/g, "").trim();
13
+ }
14
+ function normalizedLine(line) {
15
+ return stripScopeComment(line).replace(/\s+/g, " ").toLowerCase();
16
+ }
17
+ function targetForRow(row, opts) {
18
+ if (row.scope.startsWith("project:")) {
19
+ const hash = row.scope.slice("project:".length);
20
+ return path.join(opts.bundleRoot, "projects", hash, "MEMORY.md");
21
+ }
22
+ return opts.memoryMdPath;
23
+ }
24
+ function targetForScope(scope, opts) {
25
+ if (scope.startsWith("project:")) {
26
+ const hash = scope.slice("project:".length);
27
+ return path.join(opts.bundleRoot, "projects", hash, "MEMORY.md");
28
+ }
29
+ return opts.memoryMdPath;
30
+ }
31
+ function rowsToMemoryLines(row) {
32
+ const body = row.raw_memory.trim() || row.rollout_summary.trim();
33
+ if (!body)
34
+ return [];
35
+ return body
36
+ .split("\n")
37
+ .map((line) => line.trim())
38
+ .filter(Boolean)
39
+ .map((line) => {
40
+ const bullet = line.startsWith("- ") ? line : `- ${line}`;
41
+ return `${bullet} <!-- scope:${row.scope} -->`;
42
+ });
43
+ }
44
+ async function backupMemoryFile(filePath) {
45
+ const existing = await readFileOptional(filePath);
46
+ if (!existing)
47
+ return false;
48
+ const stamp = new Date().toISOString().replace(/[:.]/g, "-");
49
+ await fs.copyFile(filePath, `${filePath}.${stamp}.bak`);
50
+ return true;
51
+ }
52
+ async function appendDedup(filePath, lines, dryRun) {
53
+ if (lines.length === 0)
54
+ return { appended: 0, skipped: 0, backup: false };
55
+ const existing = await readFileOptional(filePath);
56
+ const seen = new Set(existing
57
+ .split("\n")
58
+ .map(normalizedLine)
59
+ .filter(Boolean));
60
+ const nextLines = [];
61
+ let skipped = 0;
62
+ for (const line of lines) {
63
+ const key = normalizedLine(line);
64
+ if (seen.has(key)) {
65
+ skipped++;
66
+ continue;
67
+ }
68
+ seen.add(key);
69
+ nextLines.push(line);
70
+ }
71
+ if (dryRun || nextLines.length === 0) {
72
+ return { appended: nextLines.length, skipped, backup: false };
73
+ }
74
+ await fs.mkdir(path.dirname(filePath), { recursive: true, mode: 0o700 });
75
+ const backup = await backupMemoryFile(filePath);
76
+ const prefix = existing.trim() ? "\n" : "# Memory\n\n";
77
+ await fs.appendFile(filePath, `${prefix}${nextLines.join("\n")}\n`, {
78
+ encoding: "utf8",
79
+ mode: 0o600,
80
+ });
81
+ return { appended: nextLines.length, skipped, backup };
82
+ }
83
+ async function migrateProjectScopedLines(opts) {
84
+ const globalText = await readFileOptional(opts.memoryMdPath);
85
+ if (!globalText.trim())
86
+ return { migrated: 0, targets: [] };
87
+ const keep = [];
88
+ const byTarget = new Map();
89
+ for (const line of globalText.split("\n")) {
90
+ const scope = line.match(/<!--\s*scope:(project:[a-f0-9]{12})\s*-->/i)?.[1];
91
+ if (!scope) {
92
+ keep.push(line);
93
+ continue;
94
+ }
95
+ const target = targetForScope(scope, opts);
96
+ byTarget.set(target, [...(byTarget.get(target) ?? []), line]);
97
+ }
98
+ const migrated = Array.from(byTarget.values()).reduce((sum, lines) => sum + lines.length, 0);
99
+ if (opts.dryRun || migrated === 0) {
100
+ return { migrated, targets: Array.from(byTarget.keys()) };
101
+ }
102
+ await backupMemoryFile(opts.memoryMdPath);
103
+ await fs.writeFile(opts.memoryMdPath, `${keep.join("\n").trim()}\n`, "utf8");
104
+ for (const [target, lines] of byTarget) {
105
+ await appendDedup(target, lines, false);
106
+ }
107
+ return { migrated, targets: Array.from(byTarget.keys()) };
108
+ }
109
+ async function pruneLinesFromTargets(rows, opts) {
110
+ if (rows.length === 0)
111
+ return 0;
112
+ const staleKeys = new Set();
113
+ for (const row of rows) {
114
+ for (const line of rowsToMemoryLines(row))
115
+ staleKeys.add(normalizedLine(line));
116
+ }
117
+ if (staleKeys.size === 0)
118
+ return 0;
119
+ const targets = new Set([
120
+ opts.memoryMdPath,
121
+ ...rows.map((row) => targetForRow(row, opts)),
122
+ ]);
123
+ let pruned = 0;
124
+ for (const target of targets) {
125
+ const existing = await readFileOptional(target);
126
+ if (!existing.trim())
127
+ continue;
128
+ const kept = [];
129
+ let targetPruned = 0;
130
+ for (const line of existing.split("\n")) {
131
+ if (staleKeys.has(normalizedLine(line))) {
132
+ pruned++;
133
+ targetPruned++;
134
+ continue;
135
+ }
136
+ kept.push(line);
137
+ }
138
+ if (!opts.dryRun && targetPruned > 0) {
139
+ await backupMemoryFile(target);
140
+ await fs.writeFile(target, `${kept.join("\n").trim()}\n`, "utf8");
141
+ }
142
+ }
143
+ return pruned;
144
+ }
145
+ async function syncWorkspace(rows, bundleRoot, dryRun) {
146
+ if (dryRun)
147
+ return;
148
+ const workspace = path.join(bundleRoot, "workspace");
149
+ const summaries = path.join(workspace, "rollout_summaries");
150
+ await fs.mkdir(summaries, { recursive: true, mode: 0o700 });
151
+ const raw = rows
152
+ .map((row) => `## ${row.session_id}\n\n${row.raw_memory || row.rollout_summary}`)
153
+ .join("\n\n");
154
+ await fs.writeFile(path.join(workspace, "raw_memories.md"), `${raw}\n`, "utf8");
155
+ for (const row of rows) {
156
+ await fs.writeFile(path.join(summaries, `${row.session_id}.md`), `${row.rollout_summary || row.raw_memory}\n`, "utf8");
157
+ }
158
+ }
159
+ export async function runPhase2(store, opts) {
160
+ const dryRun = opts.dryRun ?? false;
161
+ const rows = store.listUnselectedStage1(opts.topN);
162
+ const migration = await migrateProjectScopedLines(opts);
163
+ const grouped = new Map();
164
+ for (const row of rows) {
165
+ const target = targetForRow(row, opts);
166
+ const lines = rowsToMemoryLines(row);
167
+ grouped.set(target, [...(grouped.get(target) ?? []), ...lines]);
168
+ }
169
+ const report = {
170
+ stage1Selected: rows.length,
171
+ appended: 0,
172
+ skippedDedup: 0,
173
+ backupsCreated: 0,
174
+ topicsUpdated: 0,
175
+ migratedProjectLines: migration.migrated,
176
+ prunedLines: 0,
177
+ dryRun,
178
+ targets: Array.from(new Set([...grouped.keys(), ...migration.targets])),
179
+ };
180
+ for (const [target, lines] of grouped) {
181
+ const result = await appendDedup(target, lines, dryRun);
182
+ report.appended += result.appended;
183
+ report.skippedDedup += result.skipped;
184
+ if (result.backup)
185
+ report.backupsCreated++;
186
+ }
187
+ await syncWorkspace(rows, opts.bundleRoot, dryRun);
188
+ if (opts.maxUnusedDays && opts.maxUnusedDays > 0) {
189
+ const cutoff = new Date(Date.now() - opts.maxUnusedDays * 24 * 60 * 60 * 1000).toISOString();
190
+ report.prunedLines = await pruneLinesFromTargets(store.listStage1OlderThan(cutoff), opts);
191
+ }
192
+ if (!dryRun)
193
+ store.markStage1Selected(rows.map((row) => row.session_id));
194
+ return report;
195
+ }
196
+ //# sourceMappingURL=runPhase2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runPhase2.js","sourceRoot":"","sources":["../../../src/consolidation/phase2/runPhase2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ScheduleOptions } from "./types.js";
2
+ export declare const LAUNCHD_LABEL = "dev.pi.memory-consolidate";
3
+ export declare function launchdPlistPath(): string;
4
+ export declare function buildLaunchdPlist(opts: ScheduleOptions): string;
5
+ //# sourceMappingURL=launchd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchd.d.ts","sourceRoot":"","sources":["../../../src/consolidation/scheduler/launchd.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,eAAO,MAAM,aAAa,8BAA8B,CAAC;AAoBzD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAgC/D"}
@@ -0,0 +1,54 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ export const LAUNCHD_LABEL = "dev.pi.memory-consolidate";
4
+ const PLIST_FILE = `${LAUNCHD_LABEL}.plist`;
5
+ function commandArgs(opts) {
6
+ if (opts.commandPath) {
7
+ return [opts.commandPath, "consolidate"];
8
+ }
9
+ if (opts.npxPath) {
10
+ return [opts.npxPath, "pi-memory", "consolidate"];
11
+ }
12
+ return ["pi-memory", "consolidate"];
13
+ }
14
+ function escapeXml(value) {
15
+ return value
16
+ .replaceAll("&", "&amp;")
17
+ .replaceAll("<", "&lt;")
18
+ .replaceAll(">", "&gt;");
19
+ }
20
+ export function launchdPlistPath() {
21
+ return path.join(os.homedir(), "Library", "LaunchAgents", PLIST_FILE);
22
+ }
23
+ export function buildLaunchdPlist(opts) {
24
+ const args = commandArgs(opts);
25
+ const argumentsXml = args
26
+ .map((arg) => ` <string>${escapeXml(arg)}</string>`)
27
+ .join("\n");
28
+ return [
29
+ `<?xml version="1.0" encoding="UTF-8"?>`,
30
+ `<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">`,
31
+ `<plist version="1.0">`,
32
+ `<dict>`,
33
+ ` <key>Label</key>`,
34
+ ` <string>${LAUNCHD_LABEL}</string>`,
35
+ ` <key>ProgramArguments</key>`,
36
+ ` <array>`,
37
+ `${argumentsXml}`,
38
+ ` </array>`,
39
+ ` <key>StandardOutPath</key>`,
40
+ ` <string>${escapeXml(opts.logPath)}</string>`,
41
+ ` <key>StandardErrorPath</key>`,
42
+ ` <string>${escapeXml(opts.logPath)}</string>`,
43
+ ` <key>StartCalendarInterval</key>`,
44
+ ` <dict>`,
45
+ ` <key>Hour</key>`,
46
+ ` <integer>${opts.hour}</integer>`,
47
+ ` <key>Minute</key>`,
48
+ ` <integer>${opts.minute}</integer>`,
49
+ ` </dict>`,
50
+ `</dict>`,
51
+ `</plist>`,
52
+ ].join("\n");
53
+ }
54
+ //# sourceMappingURL=launchd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchd.js","sourceRoot":"","sources":["../../../src/consolidation/scheduler/launchd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,CAAC,MAAM,aAAa,GAAG,2BAA2B,CAAC;AACzD,MAAM,UAAU,GAAG,GAAG,aAAa,QAAQ,CAAC;AAE5C,SAAS,WAAW,CAAC,IAAqB;IACxC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK;SACT,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAqB;IACrD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAE/B,MAAM,YAAY,GAAG,IAAI;SACtB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC;SACtD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;QACL,wCAAwC;QACxC,wGAAwG;QACxG,uBAAuB;QACvB,QAAQ;QACR,oBAAoB;QACpB,aAAa,aAAa,WAAW;QACrC,+BAA+B;QAC/B,WAAW;QACX,GAAG,YAAY,EAAE;QACjB,YAAY;QACZ,8BAA8B;QAC9B,aAAa,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW;QAC/C,gCAAgC;QAChC,aAAa,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW;QAC/C,oCAAoC;QACpC,UAAU;QACV,qBAAqB;QACrB,gBAAgB,IAAI,CAAC,IAAI,YAAY;QACrC,uBAAuB;QACvB,gBAAgB,IAAI,CAAC,MAAM,YAAY;QACvC,WAAW;QACX,SAAS;QACT,UAAU;KACX,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { MemoryConfig } from "../../config.js";
2
+ import { type Phase2Report } from "../phase2/runPhase2.js";
3
+ import { type DrainQueueReport } from "../stage1/drainQueue.js";
4
+ export interface ConsolidateOptions {
5
+ config: MemoryConfig;
6
+ dbPath?: string;
7
+ dryRun?: boolean;
8
+ phase1Only?: boolean;
9
+ phase2Only?: boolean;
10
+ }
11
+ export interface ConsolidateReport {
12
+ dryRun: boolean;
13
+ dbPath: string;
14
+ drain?: DrainQueueReport;
15
+ train?: {
16
+ sessionsProcessed: number;
17
+ entityCount: number;
18
+ relationCount: number;
19
+ eventCount: number;
20
+ dryRun: boolean;
21
+ };
22
+ phase2?: Phase2Report;
23
+ }
24
+ export declare function defaultConsolidationDbPath(cfg: MemoryConfig): string;
25
+ export declare function runConsolidate(opts: ConsolidateOptions): Promise<ConsolidateReport>;
26
+ //# sourceMappingURL=runConsolidate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runConsolidate.d.ts","sourceRoot":"","sources":["../../../src/consolidation/scheduler/runConsolidate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIpD,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG5E,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,KAAK,CAAC,EAAE;QACN,iBAAiB,EAAE,MAAM,CAAC;QAC1B,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;IACF,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAEpE;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,iBAAiB,CAAC,CA4E5B"}
@@ -0,0 +1,83 @@
1
+ import path from "node:path";
2
+ import { trainBundle } from "../../trainer/index.js";
3
+ import { withFileLock } from "../lock.js";
4
+ import { appendConsolidationLog } from "../log.js";
5
+ import { runPhase2 } from "../phase2/runPhase2.js";
6
+ import { drainQueue } from "../stage1/drainQueue.js";
7
+ import { openConsolidationStore } from "../stage1/store.js";
8
+ export function defaultConsolidationDbPath(cfg) {
9
+ return path.join(cfg.bundleRoot, "memories.sqlite");
10
+ }
11
+ export async function runConsolidate(opts) {
12
+ const cfg = opts.config;
13
+ const dbPath = opts.dbPath ?? defaultConsolidationDbPath(cfg);
14
+ const dryRun = opts.dryRun ?? false;
15
+ const lockPath = path.join(cfg.bundleRoot, ".consolidation.lock");
16
+ const logPath = cfg.consolidation.schedule.log_path;
17
+ return withFileLock(lockPath, async () => {
18
+ const store = openConsolidationStore(dbPath);
19
+ if (!store) {
20
+ throw new Error("better-sqlite3 unavailable; cannot open consolidation store");
21
+ }
22
+ try {
23
+ const report = { dryRun, dbPath };
24
+ if (!opts.phase2Only) {
25
+ report.drain = await drainQueue(store, { dryRun });
26
+ await appendConsolidationLog(logPath, {
27
+ phase: "phase1",
28
+ sessions_processed: report.drain.sessionsProcessed,
29
+ sessions_skipped: report.drain.sessionsSkipped,
30
+ sessions_failed: report.drain.sessionsFailed,
31
+ stage1_new_rows: report.drain.stage1NewRows,
32
+ dry_run: dryRun,
33
+ });
34
+ const trainResult = await trainBundle({
35
+ sessionsDir: cfg.sessionsDir,
36
+ bundleRoot: cfg.bundleRoot,
37
+ dryRun,
38
+ full: false,
39
+ });
40
+ report.train = {
41
+ sessionsProcessed: trainResult.sessionsProcessed,
42
+ entityCount: trainResult.entityCount,
43
+ relationCount: trainResult.relationCount,
44
+ eventCount: trainResult.eventCount,
45
+ dryRun: trainResult.dryRun,
46
+ };
47
+ await appendConsolidationLog(logPath, {
48
+ phase: "graph_train",
49
+ sessions_processed: trainResult.sessionsProcessed,
50
+ entities: trainResult.entityCount,
51
+ relations: trainResult.relationCount,
52
+ events: trainResult.eventCount,
53
+ dry_run: dryRun,
54
+ });
55
+ }
56
+ if (!opts.phase1Only) {
57
+ const memoryMdPath = cfg.memoryMdPaths[0] ?? path.join(cfg.bundleRoot, "MEMORY.md");
58
+ report.phase2 = await runPhase2(store, {
59
+ memoryMdPath,
60
+ bundleRoot: cfg.bundleRoot,
61
+ topN: cfg.consolidation.phase2_top_n,
62
+ dryRun,
63
+ maxLines: cfg.consolidation.memory_index_max_lines,
64
+ maxBytes: cfg.consolidation.memory_index_max_bytes,
65
+ maxUnusedDays: cfg.consolidation.max_unused_days,
66
+ });
67
+ await appendConsolidationLog(logPath, {
68
+ phase: "phase2",
69
+ stage1_selected: report.phase2.stage1Selected,
70
+ appended: report.phase2.appended,
71
+ skipped_dedup: report.phase2.skippedDedup,
72
+ backups_created: report.phase2.backupsCreated,
73
+ dry_run: dryRun,
74
+ });
75
+ }
76
+ return report;
77
+ }
78
+ finally {
79
+ store.close();
80
+ }
81
+ });
82
+ }
83
+ //# sourceMappingURL=runConsolidate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runConsolidate.js","sourceRoot":"","sources":["../../../src/consolidation/scheduler/runConsolidate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type SetupScheduleResult, type ScheduleOptions, type SchedulePlatform } from "./types.js";
2
+ export declare function setupSchedule(opts: ScheduleOptions, platform: SchedulePlatform): Promise<SetupScheduleResult>;
3
+ //# sourceMappingURL=setupSchedule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupSchedule.d.ts","sourceRoot":"","sources":["../../../src/consolidation/scheduler/setupSchedule.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,KAAK,mBAAmB,EAGxB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,YAAY,CAAC;AAqDpB,wBAAsB,aAAa,CACjC,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,mBAAmB,CAAC,CAiC9B"}
@@ -0,0 +1,79 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { buildLaunchdPlist, launchdPlistPath } from "./launchd.js";
4
+ import { buildSystemdService, buildSystemdTimer, systemdServicePath, systemdTimerPath, } from "./systemd.js";
5
+ async function exists(filePath) {
6
+ try {
7
+ await fs.access(filePath);
8
+ return true;
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ }
14
+ async function ensureDir(filePath) {
15
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
16
+ }
17
+ async function writeIfNeeded(filePath, content, dryRun) {
18
+ if (dryRun)
19
+ return;
20
+ await ensureDir(filePath);
21
+ await fs.writeFile(filePath, content, "utf8");
22
+ }
23
+ async function removeFileIfExists(filePath, dryRun) {
24
+ if (dryRun)
25
+ return;
26
+ try {
27
+ await fs.rm(filePath, { force: true });
28
+ }
29
+ catch {
30
+ // Ignore cleanup failures for idempotency.
31
+ }
32
+ }
33
+ function setupPlan(platform, opts) {
34
+ if (platform === "darwin") {
35
+ return [{ path: launchdPlistPath(), content: buildLaunchdPlist(opts) }];
36
+ }
37
+ return [
38
+ { path: systemdServicePath(), content: buildSystemdService(opts) },
39
+ { path: systemdTimerPath(), content: buildSystemdTimer(opts) },
40
+ ];
41
+ }
42
+ function resolveAction(opts) {
43
+ if (opts.status)
44
+ return "status";
45
+ if (opts.remove)
46
+ return "remove";
47
+ return "write";
48
+ }
49
+ export async function setupSchedule(opts, platform) {
50
+ const dryRun = Boolean(opts.dryRun);
51
+ const action = resolveAction(opts);
52
+ const filesToProcess = setupPlan(platform, opts);
53
+ const files = [];
54
+ if (action === "status") {
55
+ for (const file of filesToProcess) {
56
+ files.push({ path: file.path, exists: await exists(file.path) });
57
+ }
58
+ return { platform, action, files, dryRun };
59
+ }
60
+ if (action === "remove") {
61
+ for (const file of filesToProcess) {
62
+ await removeFileIfExists(file.path, dryRun);
63
+ }
64
+ for (const file of filesToProcess) {
65
+ files.push({ path: file.path, exists: await exists(file.path) });
66
+ }
67
+ return { platform, action, files, dryRun };
68
+ }
69
+ for (const file of filesToProcess) {
70
+ await writeIfNeeded(file.path, file.content, dryRun);
71
+ files.push({
72
+ path: file.path,
73
+ exists: await exists(file.path),
74
+ content: file.content,
75
+ });
76
+ }
77
+ return { platform, action, files, dryRun };
78
+ }
79
+ //# sourceMappingURL=setupSchedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupSchedule.js","sourceRoot":"","sources":["../../../src/consolidation/scheduler/setupSchedule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ScheduleOptions } from "./types.js";
2
+ export declare const SYSTEMD_UNIT_NAME = "dev.pi.memory-consolidate";
3
+ export declare const SYSTEMD_SERVICE_FILE = "dev.pi.memory-consolidate.service";
4
+ export declare const SYSTEMD_TIMER_FILE = "dev.pi.memory-consolidate.timer";
5
+ export declare function systemdServicePath(): string;
6
+ export declare function systemdTimerPath(): string;
7
+ export declare function buildSystemdService(opts: ScheduleOptions): string;
8
+ export declare function buildSystemdTimer(opts: ScheduleOptions): string;
9
+ //# sourceMappingURL=systemd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemd.d.ts","sourceRoot":"","sources":["../../../src/consolidation/scheduler/systemd.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,eAAO,MAAM,iBAAiB,8BAA8B,CAAC;AAC7D,eAAO,MAAM,oBAAoB,sCAAiC,CAAC;AACnE,eAAO,MAAM,kBAAkB,oCAA+B,CAAC;AAoB/D,wBAAgB,kBAAkB,IAAI,MAAM,CAQ3C;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAQzC;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAYjE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAgB/D"}
@@ -0,0 +1,57 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ export const SYSTEMD_UNIT_NAME = "dev.pi.memory-consolidate";
4
+ export const SYSTEMD_SERVICE_FILE = `${SYSTEMD_UNIT_NAME}.service`;
5
+ export const SYSTEMD_TIMER_FILE = `${SYSTEMD_UNIT_NAME}.timer`;
6
+ function commandArgs(opts) {
7
+ if (opts.commandPath) {
8
+ return [opts.commandPath, "consolidate"];
9
+ }
10
+ if (opts.npxPath) {
11
+ return [opts.npxPath, "pi-memory", "consolidate"];
12
+ }
13
+ return ["pi-memory", "consolidate"];
14
+ }
15
+ function pad2(value, max) {
16
+ return String(Math.max(0, Math.min(max, Math.trunc(value)))).padStart(2, "0");
17
+ }
18
+ function buildExecStart(opts) {
19
+ return commandArgs(opts).join(" ");
20
+ }
21
+ export function systemdServicePath() {
22
+ return path.join(os.homedir(), ".config", "systemd", "user", SYSTEMD_SERVICE_FILE);
23
+ }
24
+ export function systemdTimerPath() {
25
+ return path.join(os.homedir(), ".config", "systemd", "user", SYSTEMD_TIMER_FILE);
26
+ }
27
+ export function buildSystemdService(opts) {
28
+ return [
29
+ `[Unit]`,
30
+ `Description=Pi Memory Consolidation`,
31
+ ``,
32
+ `[Service]`,
33
+ `Type=oneshot`,
34
+ `ExecStart=${buildExecStart(opts)}`,
35
+ `StandardOutput=append:${opts.logPath}`,
36
+ `StandardError=append:${opts.logPath}`,
37
+ ``,
38
+ ].join("\n");
39
+ }
40
+ export function buildSystemdTimer(opts) {
41
+ const minute = pad2(opts.minute, 59);
42
+ const hour = pad2(opts.hour, 23);
43
+ return [
44
+ `[Unit]`,
45
+ `Description=Runs Pi memory consolidation on a daily schedule`,
46
+ ``,
47
+ `[Timer]`,
48
+ `Persistent=true`,
49
+ `OnCalendar=*-*-* ${hour}:${minute}:00`,
50
+ `Unit=${SYSTEMD_UNIT_NAME}.service`,
51
+ ``,
52
+ `[Install]`,
53
+ `WantedBy=timers.target`,
54
+ ``,
55
+ ].join("\n");
56
+ }
57
+ //# sourceMappingURL=systemd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemd.js","sourceRoot":"","sources":["../../../src/consolidation/scheduler/systemd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,CAAC,MAAM,iBAAiB,GAAG,2BAA2B,CAAC;AAC7D,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,iBAAiB,UAAU,CAAC;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,iBAAiB,QAAQ,CAAC;AAE/D,SAAS,WAAW,CAAC,IAAqB;IACxC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,IAAI,CAAC,KAAa,EAAE,GAAW;IACtC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,cAAc,CAAC,IAAqB;IAC3C,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CACd,EAAE,CAAC,OAAO,EAAE,EACZ,SAAS,EACT,SAAS,EACT,MAAM,EACN,oBAAoB,CACrB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,IAAI,CACd,EAAE,CAAC,OAAO,EAAE,EACZ,SAAS,EACT,SAAS,EACT,MAAM,EACN,kBAAkB,CACnB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAqB;IACvD,OAAO;QACL,QAAQ;QACR,qCAAqC;QACrC,EAAE;QACF,WAAW;QACX,cAAc;QACd,aAAa,cAAc,CAAC,IAAI,CAAC,EAAE;QACnC,yBAAyB,IAAI,CAAC,OAAO,EAAE;QACvC,wBAAwB,IAAI,CAAC,OAAO,EAAE;QACtC,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAqB;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjC,OAAO;QACL,QAAQ;QACR,8DAA8D;QAC9D,EAAE;QACF,SAAS;QACT,iBAAiB;QACjB,oBAAoB,IAAI,IAAI,MAAM,KAAK;QACvC,QAAQ,iBAAiB,UAAU;QACnC,EAAE;QACF,WAAW;QACX,wBAAwB;QACxB,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,24 @@
1
+ export type SchedulePlatform = "darwin" | "linux";
2
+ export interface ScheduleOptions {
3
+ hour: number;
4
+ minute: number;
5
+ logPath: string;
6
+ commandPath?: string;
7
+ npxPath?: string;
8
+ dryRun?: boolean;
9
+ remove?: boolean;
10
+ status?: boolean;
11
+ }
12
+ export type ScheduleAction = "write" | "remove" | "status";
13
+ export interface ScheduledFile {
14
+ path: string;
15
+ exists: boolean;
16
+ content?: string;
17
+ }
18
+ export interface SetupScheduleResult {
19
+ platform: SchedulePlatform;
20
+ action: ScheduleAction;
21
+ files: ScheduledFile[];
22
+ dryRun: boolean;
23
+ }
24
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/consolidation/scheduler/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,OAAO,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/consolidation/scheduler/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ export type MemoryScope = "global" | `project:${string}`;
2
+ export declare function projectHash(input: string): string;
3
+ export declare function projectScope(projectHashValue: string | null | undefined): MemoryScope;
4
+ export declare function parseScopeComment(line: string): MemoryScope | null;
5
+ export declare function lineMatchesScope(line: string, allowedScopes: readonly MemoryScope[] | undefined): boolean;
6
+ export declare function findGitRoot(startDir: string | null | undefined): string | null;
7
+ export declare function scopeForCwd(cwd: string | null | undefined): {
8
+ gitRoot: string | null;
9
+ projectHash: string | null;
10
+ scopes: MemoryScope[];
11
+ };
12
+ //# sourceMappingURL=scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/consolidation/scope.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,WAAW,MAAM,EAAE,CAAC;AAIzD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,YAAY,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,CAErF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAMlE;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,SAAS,WAAW,EAAE,GAAG,SAAS,GAChD,OAAO,CAKT;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAS9E;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG;IAC3D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAQA"}