@ddtcorex/dsh-maestro-memory 1.0.1

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 (109) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/LICENSE +21 -0
  3. package/README.md +448 -0
  4. package/cordis.patch.yml +13 -0
  5. package/lib/client.js +756 -0
  6. package/lib/index.d.ts +10 -0
  7. package/lib/index.d.ts.map +1 -0
  8. package/lib/index.js +627 -0
  9. package/lib/index.js.map +1 -0
  10. package/lib/memory/batch.d.ts +44 -0
  11. package/lib/memory/batch.d.ts.map +1 -0
  12. package/lib/memory/batch.js +75 -0
  13. package/lib/memory/batch.js.map +1 -0
  14. package/lib/memory/feedback.d.ts +18 -0
  15. package/lib/memory/feedback.d.ts.map +1 -0
  16. package/lib/memory/feedback.js +29 -0
  17. package/lib/memory/feedback.js.map +1 -0
  18. package/lib/memory/store.d.ts +154 -0
  19. package/lib/memory/store.d.ts.map +1 -0
  20. package/lib/memory/store.js +606 -0
  21. package/lib/memory/store.js.map +1 -0
  22. package/lib/migration/cli.d.ts +18 -0
  23. package/lib/migration/cli.d.ts.map +1 -0
  24. package/lib/migration/cli.js +143 -0
  25. package/lib/migration/cli.js.map +1 -0
  26. package/lib/migration/fixture.d.ts +45 -0
  27. package/lib/migration/fixture.d.ts.map +1 -0
  28. package/lib/migration/fixture.js +177 -0
  29. package/lib/migration/fixture.js.map +1 -0
  30. package/lib/migration/service.d.ts +75 -0
  31. package/lib/migration/service.d.ts.map +1 -0
  32. package/lib/migration/service.js +713 -0
  33. package/lib/migration/service.js.map +1 -0
  34. package/lib/prompt/snapshot.d.ts +26 -0
  35. package/lib/prompt/snapshot.d.ts.map +1 -0
  36. package/lib/prompt/snapshot.js +74 -0
  37. package/lib/prompt/snapshot.js.map +1 -0
  38. package/lib/review/queue.d.ts +72 -0
  39. package/lib/review/queue.d.ts.map +1 -0
  40. package/lib/review/queue.js +306 -0
  41. package/lib/review/queue.js.map +1 -0
  42. package/lib/skills-browser.d.ts +67 -0
  43. package/lib/skills-browser.d.ts.map +1 -0
  44. package/lib/skills-browser.js +185 -0
  45. package/lib/skills-browser.js.map +1 -0
  46. package/lib/storage/atomic-store.d.ts +211 -0
  47. package/lib/storage/atomic-store.d.ts.map +1 -0
  48. package/lib/storage/atomic-store.js +582 -0
  49. package/lib/storage/atomic-store.js.map +1 -0
  50. package/lib/storage/layout.d.ts +81 -0
  51. package/lib/storage/layout.d.ts.map +1 -0
  52. package/lib/storage/layout.js +162 -0
  53. package/lib/storage/layout.js.map +1 -0
  54. package/lib/storage/legacy-format.d.ts +104 -0
  55. package/lib/storage/legacy-format.d.ts.map +1 -0
  56. package/lib/storage/legacy-format.js +262 -0
  57. package/lib/storage/legacy-format.js.map +1 -0
  58. package/lib/sync/config.d.ts +22 -0
  59. package/lib/sync/config.d.ts.map +1 -0
  60. package/lib/sync/config.js +57 -0
  61. package/lib/sync/config.js.map +1 -0
  62. package/lib/sync/git.d.ts +97 -0
  63. package/lib/sync/git.d.ts.map +1 -0
  64. package/lib/sync/git.js +282 -0
  65. package/lib/sync/git.js.map +1 -0
  66. package/lib/sync/index.d.ts +6 -0
  67. package/lib/sync/index.d.ts.map +1 -0
  68. package/lib/sync/index.js +6 -0
  69. package/lib/sync/index.js.map +1 -0
  70. package/lib/sync/layout.d.ts +15 -0
  71. package/lib/sync/layout.d.ts.map +1 -0
  72. package/lib/sync/layout.js +33 -0
  73. package/lib/sync/layout.js.map +1 -0
  74. package/lib/sync/merge.d.ts +42 -0
  75. package/lib/sync/merge.d.ts.map +1 -0
  76. package/lib/sync/merge.js +159 -0
  77. package/lib/sync/merge.js.map +1 -0
  78. package/lib/sync/service.d.ts +70 -0
  79. package/lib/sync/service.d.ts.map +1 -0
  80. package/lib/sync/service.js +508 -0
  81. package/lib/sync/service.js.map +1 -0
  82. package/lib/todo/store.d.ts +142 -0
  83. package/lib/todo/store.d.ts.map +1 -0
  84. package/lib/todo/store.js +452 -0
  85. package/lib/todo/store.js.map +1 -0
  86. package/lib/types/client/index.d.ts +7 -0
  87. package/lib/types/client/index.d.ts.map +1 -0
  88. package/package.json +63 -0
  89. package/src/client/index.tsx +994 -0
  90. package/src/host/index.ts +591 -0
  91. package/src/host/memory/batch.ts +107 -0
  92. package/src/host/memory/feedback.ts +36 -0
  93. package/src/host/memory/store.ts +650 -0
  94. package/src/host/migration/cli.ts +139 -0
  95. package/src/host/migration/fixture.ts +218 -0
  96. package/src/host/migration/service.ts +786 -0
  97. package/src/host/prompt/snapshot.ts +95 -0
  98. package/src/host/review/queue.ts +325 -0
  99. package/src/host/skills-browser.ts +191 -0
  100. package/src/host/storage/atomic-store.ts +605 -0
  101. package/src/host/storage/layout.ts +191 -0
  102. package/src/host/storage/legacy-format.ts +308 -0
  103. package/src/host/sync/config.ts +67 -0
  104. package/src/host/sync/git.ts +280 -0
  105. package/src/host/sync/index.ts +5 -0
  106. package/src/host/sync/layout.ts +39 -0
  107. package/src/host/sync/merge.ts +188 -0
  108. package/src/host/sync/service.ts +494 -0
  109. package/src/host/todo/store.ts +480 -0
@@ -0,0 +1,508 @@
1
+ /**
2
+ * sync/service.ts — enable/disable/status/fetch/push/pull/resolve
3
+ * Disabled => zero Git activity (no spawn).
4
+ */
5
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, appendFileSync } from 'node:fs';
6
+ import { dirname, join } from 'node:path';
7
+ import { randomBytes } from 'node:crypto';
8
+ import { resolveMemoryRoot, maestroMetaDir } from "../storage/layout.js";
9
+ import { projectHash, projectKeyPath, projectMemoryPath, projectKeyArchivePath, projectTodoPath } from "../storage/layout.js";
10
+ import { parseEntries, serializeEntries } from "../storage/atomic-store.js";
11
+ import { parseTodoEntry, TODO_HEADER, ENTRY_DELIMITER } from "../storage/legacy-format.js";
12
+ import { readEntriesSync, writeEntriesAtomicSync } from "../storage/atomic-store.js";
13
+ import { syncBranchName, syncConflictsPath } from "./layout.js";
14
+ import { readConfig, writeConfig, clearConfig, readMeta, writeMeta, baseIdsFromMeta } from "./config.js";
15
+ import { mergeMemoryEntries, mergeTodoEntries } from "./merge.js";
16
+ import { MockGitAdapter } from "./git.js";
17
+ const TRACK_FILES = {
18
+ KEY: (root, cwd) => projectKeyPath(root, cwd),
19
+ MEMORY: (root, cwd) => projectMemoryPath(root, cwd),
20
+ 'KEY-archive': (root, cwd) => projectKeyArchivePath(root, cwd),
21
+ TODOS: (root, cwd) => projectTodoPath(root, cwd),
22
+ };
23
+ function ensureIdForMemoryEntries(entries) {
24
+ let changed = false;
25
+ const next = entries.map((e) => {
26
+ if (/^\[id:\s*[0-9a-f]{8}\]\s*/i.test(e))
27
+ return e;
28
+ changed = true;
29
+ const id = randomBytes(4).toString('hex');
30
+ return `[id:${id}] ${e}`;
31
+ });
32
+ return { entries: next, changed };
33
+ }
34
+ function readMemoryTrack(root, cwd, track) {
35
+ const fn = TRACK_FILES[track];
36
+ if (!fn)
37
+ return [];
38
+ const p = fn(root, cwd);
39
+ return readEntriesSync(p);
40
+ }
41
+ function writeMemoryTrack(root, cwd, track, entries) {
42
+ const fn = TRACK_FILES[track];
43
+ if (!fn)
44
+ throw new Error(`unknown track ${track}`);
45
+ const p = fn(root, cwd);
46
+ const res = writeEntriesAtomicSync(p, entries);
47
+ if (!res.ok)
48
+ throw new Error(res.error);
49
+ }
50
+ function readTodoTrackRaw(root, cwd) {
51
+ const p = projectTodoPath(root, cwd);
52
+ let text = '';
53
+ try {
54
+ text = readFileSync(p, 'utf8');
55
+ }
56
+ catch (e) {
57
+ if (e?.code === 'ENOENT')
58
+ return [];
59
+ throw e;
60
+ }
61
+ const body = text.replace(/^<!--[\s\S]*?-->\s*/, '').replace(/^\s*§\s*\n?/, '').trim();
62
+ if (body === '')
63
+ return [];
64
+ return body.split(ENTRY_DELIMITER).map((s) => s.trim()).filter(Boolean);
65
+ }
66
+ function todoIds(entries) {
67
+ const s = new Set();
68
+ for (const e of entries) {
69
+ const parsed = parseTodoEntry(e);
70
+ if (parsed?.id)
71
+ s.add(parsed.id.toLowerCase());
72
+ }
73
+ return s;
74
+ }
75
+ function extractId(entry) {
76
+ const m = /^\[id:\s*([0-9a-f]{8})\]\s*/i.exec(entry);
77
+ if (m)
78
+ return m[1].toLowerCase();
79
+ // for todos, id is inside first line
80
+ const pm = parseTodoEntry(entry);
81
+ if (pm?.id)
82
+ return pm.id.toLowerCase();
83
+ return null;
84
+ }
85
+ function isWriteBlockedSync(root) {
86
+ try {
87
+ const p = join(maestroMetaDir(root), 'write-block.json');
88
+ if (!existsSync(p))
89
+ return false;
90
+ const data = JSON.parse(readFileSync(p, 'utf8'));
91
+ return data.blocked === true;
92
+ }
93
+ catch {
94
+ return false;
95
+ }
96
+ }
97
+ export class SyncService {
98
+ memoryDir;
99
+ git;
100
+ constructor(memoryDir = null, git = new MockGitAdapter()) {
101
+ this.memoryDir = memoryDir;
102
+ this.git = git;
103
+ }
104
+ root() { return resolveMemoryRoot(this.memoryDir); }
105
+ hashFor(cwd) { return projectHash(cwd); }
106
+ // -------------------------------------------------------------------------
107
+ // enable
108
+ // -------------------------------------------------------------------------
109
+ enable(cwd, remoteUrl, branch) {
110
+ if (!cwd)
111
+ return { ok: false, error: 'cwd required' };
112
+ if (!remoteUrl || typeof remoteUrl !== 'string' || remoteUrl.trim() === '')
113
+ return { ok: false, error: 'remoteUrl required' };
114
+ const hash = this.hashFor(cwd);
115
+ const root = this.root();
116
+ const br = branch?.trim() || syncBranchName(hash);
117
+ const cfg = { enabled: true, remoteUrl: remoteUrl.trim(), branch: br };
118
+ writeConfig(root, hash, cfg);
119
+ // Adopt: ensure all synced entries have ids (KEY, MEMORY, KEY-archive). TODOS already have ids.
120
+ for (const track of ['KEY', 'MEMORY', 'KEY-archive']) {
121
+ const entries = readMemoryTrack(root, cwd, track);
122
+ const { entries: next, changed } = ensureIdForMemoryEntries(entries);
123
+ if (changed) {
124
+ writeMemoryTrack(root, cwd, track, next);
125
+ }
126
+ }
127
+ // For TODOS, ensure any entry missing id gets one? Usually not needed. Skip.
128
+ return { ok: true, hash };
129
+ }
130
+ disable(cwd) {
131
+ if (!cwd)
132
+ return { ok: false, error: 'cwd required' };
133
+ const hash = this.hashFor(cwd);
134
+ clearConfig(this.root(), hash);
135
+ return { ok: true };
136
+ }
137
+ isEnabled(cwd) {
138
+ const hash = this.hashFor(cwd);
139
+ return readConfig(this.root(), hash) !== null;
140
+ }
141
+ // -------------------------------------------------------------------------
142
+ // status
143
+ // -------------------------------------------------------------------------
144
+ status(cwd, reveal = false) {
145
+ const hash = this.hashFor(cwd);
146
+ const root = this.root();
147
+ const cfg = readConfig(root, hash);
148
+ if (!cfg) {
149
+ return { enabled: false, conflicts: [] };
150
+ }
151
+ const meta = readMeta(root, hash);
152
+ const conflicts = this.listConflicts(cwd);
153
+ const remoteRedacted = '***';
154
+ return {
155
+ enabled: true,
156
+ branch: cfg.branch,
157
+ remoteUrl: reveal ? cfg.remoteUrl : undefined,
158
+ remoteRedacted: reveal ? undefined : remoteRedacted,
159
+ lastSync: meta,
160
+ conflicts,
161
+ };
162
+ }
163
+ listConflicts(cwd) {
164
+ const hash = this.hashFor(cwd);
165
+ const p = syncConflictsPath(this.root(), hash);
166
+ if (!existsSync(p))
167
+ return [];
168
+ try {
169
+ const txt = readFileSync(p, 'utf8');
170
+ return txt.split('\n').filter(Boolean).map((l) => { try {
171
+ return JSON.parse(l);
172
+ }
173
+ catch {
174
+ return null;
175
+ } }).filter(Boolean);
176
+ }
177
+ catch {
178
+ return [];
179
+ }
180
+ }
181
+ writeConflicts(cwd, conflicts) {
182
+ const hash = this.hashFor(cwd);
183
+ const p = syncConflictsPath(this.root(), hash);
184
+ mkdirSync(dirname(p), { recursive: true });
185
+ const lines = conflicts.map((c) => JSON.stringify(c)).join('\n');
186
+ writeFileSync(p, lines ? lines + '\n' : '', 'utf8');
187
+ }
188
+ appendConflict(cwd, rec) {
189
+ const hash = this.hashFor(cwd);
190
+ const p = syncConflictsPath(this.root(), hash);
191
+ mkdirSync(dirname(p), { recursive: true });
192
+ appendFileSync(p, JSON.stringify(rec) + '\n', 'utf8');
193
+ }
194
+ // -------------------------------------------------------------------------
195
+ // internal helpers: collect local files as remote map
196
+ // -------------------------------------------------------------------------
197
+ localFiles(cwd) {
198
+ const root = this.root();
199
+ const out = {};
200
+ for (const track of ['KEY', 'MEMORY', 'KEY-archive']) {
201
+ const entries = readMemoryTrack(root, cwd, track);
202
+ out[track === 'KEY' ? 'KEY.md' : track === 'MEMORY' ? 'MEMORY.md' : 'KEY-archive.md'] = serializeEntries(entries);
203
+ }
204
+ // TODOS
205
+ const todoEntries = readTodoTrackRaw(root, cwd);
206
+ const todoText = todoEntries.length ? `${TODO_HEADER}\n§\n${todoEntries.join(ENTRY_DELIMITER)}\n` : `${TODO_HEADER}`;
207
+ out['TODOS.md'] = todoText;
208
+ return out;
209
+ }
210
+ writeLocalFiles(cwd, files) {
211
+ const root = this.root();
212
+ if (files['KEY.md'] !== undefined) {
213
+ const entries = parseEntries(files['KEY.md']);
214
+ writeMemoryTrack(root, cwd, 'KEY', entries);
215
+ }
216
+ if (files['MEMORY.md'] !== undefined) {
217
+ const entries = parseEntries(files['MEMORY.md']);
218
+ writeMemoryTrack(root, cwd, 'MEMORY', entries);
219
+ }
220
+ if (files['KEY-archive.md'] !== undefined) {
221
+ const entries = parseEntries(files['KEY-archive.md']);
222
+ writeMemoryTrack(root, cwd, 'KEY-archive', entries);
223
+ }
224
+ if (files['TODOS.md'] !== undefined) {
225
+ const text = files['TODOS.md'];
226
+ const body = text.replace(/^<!--[\s\S]*?-->\s*/, '').replace(/^\s*§\s*\n?/, '').trim();
227
+ const entries = body ? body.split(ENTRY_DELIMITER).map((s) => s.trim()).filter(Boolean) : [];
228
+ const p = projectTodoPath(root, cwd);
229
+ mkdirSync(dirname(p), { recursive: true });
230
+ const out = `${TODO_HEADER}${entries.length ? `\n§\n${entries.join(ENTRY_DELIMITER)}\n` : ''}`;
231
+ writeFileSync(p, out, 'utf8');
232
+ }
233
+ }
234
+ // -------------------------------------------------------------------------
235
+ // fetch (no local mutation)
236
+ // -------------------------------------------------------------------------
237
+ async fetch(cwd) {
238
+ const hash = this.hashFor(cwd);
239
+ const root = this.root();
240
+ if (isWriteBlockedSync(root))
241
+ return { ok: false, error: `write blocked: migration verify mismatch (see ${join(maestroMetaDir(root), 'write-block.json')})` };
242
+ const cfg = readConfig(root, hash);
243
+ if (!cfg)
244
+ return { ok: false, error: 'sync disabled for this project' };
245
+ // No local mutation, but we need to check remote
246
+ const fetchRes = await this.git.fetch(cfg.remoteUrl, cfg.branch);
247
+ if (!fetchRes.ok)
248
+ return { ok: false, error: fetchRes.error };
249
+ const remoteRes = await this.git.getRemoteFiles(cfg.remoteUrl, cfg.branch);
250
+ if (!remoteRes.ok)
251
+ return { ok: false, error: remoteRes.error };
252
+ const remoteFiles = remoteRes.files;
253
+ // compare local vs remote for conflict preview (do not write files)
254
+ const meta = readMeta(root, hash);
255
+ const conflicts = [];
256
+ for (const track of ['KEY', 'MEMORY', 'KEY-archive']) {
257
+ const fileKey = track === 'KEY' ? 'KEY.md' : track === 'MEMORY' ? 'MEMORY.md' : 'KEY-archive.md';
258
+ const localEntries = readMemoryTrack(root, cwd, track);
259
+ const remoteText = remoteFiles[fileKey] ?? '';
260
+ const remoteEntries = parseEntries(remoteText);
261
+ const baseIds = baseIdsFromMeta(meta, track);
262
+ const res = mergeMemoryEntries({ track, local: localEntries, remote: remoteEntries, baseIds });
263
+ for (const c of res.conflicts) {
264
+ conflicts.push({ track, id: c.id, localEntry: c.localEntry, remoteEntry: c.remoteEntry, reason: c.reason });
265
+ }
266
+ }
267
+ // TODOS
268
+ {
269
+ const localTodos = readTodoTrackRaw(root, cwd);
270
+ const remoteTodoText = remoteFiles['TODOS.md'] ?? '';
271
+ const remoteBody = remoteTodoText.replace(/^<!--[\s\S]*?-->\s*/, '').replace(/^\s*§\s*\n?/, '').trim();
272
+ const remoteTodos = remoteBody ? remoteBody.split(ENTRY_DELIMITER).map((s) => s.trim()).filter(Boolean) : [];
273
+ const metaIds = baseIdsFromMeta(meta, 'TODOS');
274
+ const res = mergeTodoEntries({ local: localTodos, remote: remoteTodos, baseIds: metaIds });
275
+ for (const c of res.conflicts)
276
+ conflicts.push({ track: 'TODOS', id: c.id, localEntry: c.localEntry, remoteEntry: c.remoteEntry, reason: c.reason });
277
+ }
278
+ const status = conflicts.length ? 'conflicts' : 'ok';
279
+ return { ok: true, conflicts, remoteFiles, status };
280
+ }
281
+ // -------------------------------------------------------------------------
282
+ // push (explicit)
283
+ // -------------------------------------------------------------------------
284
+ async push(cwd, message) {
285
+ const hash = this.hashFor(cwd);
286
+ const root = this.root();
287
+ if (isWriteBlockedSync(root))
288
+ return { ok: false, error: `write blocked: migration verify mismatch (see ${join(maestroMetaDir(root), 'write-block.json')})` };
289
+ const cfg = readConfig(root, hash);
290
+ if (!cfg)
291
+ return { ok: false, error: 'sync disabled for this project' };
292
+ // First fetch to check conflicts
293
+ const fetchRes = await this.git.fetch(cfg.remoteUrl, cfg.branch);
294
+ if (!fetchRes.ok)
295
+ return { ok: false, error: fetchRes.error };
296
+ const remoteRes = await this.git.getRemoteFiles(cfg.remoteUrl, cfg.branch);
297
+ if (!remoteRes.ok)
298
+ return { ok: false, error: remoteRes.error };
299
+ const remoteFiles = remoteRes.files;
300
+ const meta = readMeta(root, hash);
301
+ const allConflicts = [];
302
+ for (const track of ['KEY', 'MEMORY', 'KEY-archive']) {
303
+ const fileKey = track === 'KEY' ? 'KEY.md' : track === 'MEMORY' ? 'MEMORY.md' : 'KEY-archive.md';
304
+ const localEntries = readMemoryTrack(root, cwd, track);
305
+ const remoteEntries = parseEntries(remoteRes.files[fileKey] ?? '');
306
+ const res = mergeMemoryEntries({ track, local: localEntries, remote: remoteEntries, baseIds: baseIdsFromMeta(meta, track) });
307
+ allConflicts.push(...res.conflicts.map((c) => ({ track, id: c.id, localEntry: c.localEntry, remoteEntry: c.remoteEntry })));
308
+ }
309
+ {
310
+ const localTodos = readTodoTrackRaw(root, cwd);
311
+ const remoteTodos = (() => {
312
+ const txt = remoteRes.files['TODOS.md'] ?? '';
313
+ const body = txt.replace(/^<!--[\s\S]*?-->\s*/, '').replace(/^\s*§\s*\n?/, '').trim();
314
+ return body ? body.split(ENTRY_DELIMITER).map((s) => s.trim()).filter(Boolean) : [];
315
+ })();
316
+ const res = mergeTodoEntries({ local: localTodos, remote: remoteTodos, baseIds: baseIdsFromMeta(meta, 'TODOS') });
317
+ allConflicts.push(...res.conflicts.map((c) => ({ track: 'TODOS', id: c.id, localEntry: c.localEntry, remoteEntry: c.remoteEntry })));
318
+ }
319
+ if (allConflicts.length > 0) {
320
+ // persist conflicts for UI
321
+ this.writeConflicts(cwd, allConflicts.map((c) => ({ ...c, at: new Date().toISOString(), resolved: false })));
322
+ return { ok: false, error: 'conflicts exist, resolve first', conflicts: allConflicts };
323
+ }
324
+ // No conflicts -> push
325
+ const files = this.localFiles(cwd);
326
+ const msg = message ?? `maestro-memory sync: ${hash} — ${cwd.split('/').pop()} — ${new Date().toISOString()}`;
327
+ const pushRes = await this.git.push(cfg.remoteUrl, cfg.branch, files, msg);
328
+ if (!pushRes.ok)
329
+ return { ok: false, error: pushRes.error };
330
+ // Update meta snapshot
331
+ const entryIds = {};
332
+ for (const track of ['KEY', 'MEMORY', 'KEY-archive']) {
333
+ const entries = readMemoryTrack(root, cwd, track);
334
+ entryIds[track] = [...new Set(entries.map((e) => extractId(e)).filter(Boolean))].sort();
335
+ }
336
+ const todos = readTodoTrackRaw(root, cwd);
337
+ entryIds['TODOS'] = [...new Set(todos.map((e) => extractId(e)).filter(Boolean))].sort();
338
+ const newMeta = {
339
+ hash,
340
+ cwd,
341
+ branch: cfg.branch,
342
+ remoteUrl: cfg.remoteUrl,
343
+ pushedAt: new Date().toISOString(),
344
+ entryIds,
345
+ version: 1,
346
+ };
347
+ writeMeta(root, hash, newMeta);
348
+ // clear conflicts after successful push
349
+ this.writeConflicts(cwd, []);
350
+ return { ok: true, pushed: true, conflicts: [] };
351
+ }
352
+ // -------------------------------------------------------------------------
353
+ // pull (apply union merge)
354
+ // -------------------------------------------------------------------------
355
+ async pull(cwd) {
356
+ const hash = this.hashFor(cwd);
357
+ const root = this.root();
358
+ if (isWriteBlockedSync(root))
359
+ return { ok: false, error: `write blocked: migration verify mismatch (see ${join(maestroMetaDir(root), 'write-block.json')})` };
360
+ const cfg = readConfig(root, hash);
361
+ if (!cfg)
362
+ return { ok: false, error: 'sync disabled for this project' };
363
+ const fetchRes = await this.git.fetch(cfg.remoteUrl, cfg.branch);
364
+ if (!fetchRes.ok)
365
+ return { ok: false, error: fetchRes.error };
366
+ const remoteRes = await this.git.getRemoteFiles(cfg.remoteUrl, cfg.branch);
367
+ if (!remoteRes.ok)
368
+ return { ok: false, error: remoteRes.error };
369
+ const meta = readMeta(root, hash);
370
+ const allConflicts = [];
371
+ let didMerge = false;
372
+ for (const track of ['KEY', 'MEMORY', 'KEY-archive']) {
373
+ const fileKey = track === 'KEY' ? 'KEY.md' : track === 'MEMORY' ? 'MEMORY.md' : 'KEY-archive.md';
374
+ const localEntries = readMemoryTrack(root, cwd, track);
375
+ const remoteEntries = parseEntries(remoteRes.files[fileKey] ?? '');
376
+ const res = mergeMemoryEntries({ track, local: localEntries, remote: remoteEntries, baseIds: baseIdsFromMeta(meta, track) });
377
+ if (res.conflicts.length) {
378
+ allConflicts.push(...res.conflicts.map((c) => ({ track, id: c.id, localEntry: c.localEntry, remoteEntry: c.remoteEntry, reason: c.reason })));
379
+ }
380
+ // Write merged (local union plus non-conflicting remote)
381
+ if (res.merged.length !== localEntries.length || res.addedRemote.length > 0) {
382
+ writeMemoryTrack(root, cwd, track, res.merged);
383
+ didMerge = true;
384
+ }
385
+ }
386
+ // TODOS
387
+ {
388
+ const localTodos = readTodoTrackRaw(root, cwd);
389
+ const remoteTodos = (() => {
390
+ const txt = remoteRes.files['TODOS.md'] ?? '';
391
+ const body = txt.replace(/^<!--[\s\S]*?-->\s*/, '').replace(/^\s*§\s*\n?/, '').trim();
392
+ return body ? body.split(ENTRY_DELIMITER).map((s) => s.trim()).filter(Boolean) : [];
393
+ })();
394
+ const res = mergeTodoEntries({ local: localTodos, remote: remoteTodos, baseIds: baseIdsFromMeta(meta, 'TODOS') });
395
+ if (res.conflicts.length)
396
+ allConflicts.push(...res.conflicts.map((c) => ({ track: 'TODOS', id: c.id, localEntry: c.localEntry, remoteEntry: c.remoteEntry, reason: c.reason })));
397
+ if (res.merged.length !== localTodos.length || res.addedRemote.length > 0) {
398
+ // write todos
399
+ const p = projectTodoPath(root, cwd);
400
+ mkdirSync(dirname(p), { recursive: true });
401
+ const out = `${TODO_HEADER}${res.merged.length ? `\n§\n${res.merged.join(ENTRY_DELIMITER)}\n` : ''}`;
402
+ writeFileSync(p, out, 'utf8');
403
+ didMerge = true;
404
+ }
405
+ }
406
+ if (allConflicts.length > 0) {
407
+ this.writeConflicts(cwd, allConflicts.map((c) => ({ ...c, at: new Date().toISOString(), resolved: false })));
408
+ // Still considered merged with conflicts pending? Return ok with conflicts
409
+ return { ok: true, merged: didMerge, conflicts: allConflicts };
410
+ }
411
+ // No conflicts -> update meta to current snapshot
412
+ const entryIds = {};
413
+ for (const track of ['KEY', 'MEMORY', 'KEY-archive']) {
414
+ const entries = readMemoryTrack(root, cwd, track);
415
+ entryIds[track] = [...new Set(entries.map((e) => extractId(e)).filter(Boolean))].sort();
416
+ }
417
+ const todos = readTodoTrackRaw(root, cwd);
418
+ entryIds['TODOS'] = [...new Set(todos.map((e) => extractId(e)).filter(Boolean))].sort();
419
+ writeMeta(root, hash, {
420
+ hash,
421
+ cwd,
422
+ branch: cfg.branch,
423
+ remoteUrl: cfg.remoteUrl,
424
+ pushedAt: new Date().toISOString(),
425
+ entryIds,
426
+ version: 1,
427
+ });
428
+ this.writeConflicts(cwd, []);
429
+ return { ok: true, merged: didMerge, conflicts: [] };
430
+ }
431
+ // -------------------------------------------------------------------------
432
+ // resolve
433
+ // -------------------------------------------------------------------------
434
+ resolve(cwd, id, choice) {
435
+ if (!id)
436
+ return { ok: false, error: 'id required' };
437
+ if (!['local', 'remote', 'both'].includes(choice))
438
+ return { ok: false, error: 'invalid choice' };
439
+ const hash = this.hashFor(cwd);
440
+ const root = this.root();
441
+ const cfg = readConfig(root, hash);
442
+ if (!cfg)
443
+ return { ok: false, error: 'sync disabled' };
444
+ const conflicts = this.listConflicts(cwd);
445
+ const idx = conflicts.findIndex((c) => c.id.toLowerCase() === id.toLowerCase());
446
+ if (idx === -1)
447
+ return { ok: false, error: `no conflict with id ${id}` };
448
+ const rec = conflicts[idx];
449
+ const track = rec.track;
450
+ if (track === 'TODOS') {
451
+ const entries = readTodoTrackRaw(root, cwd);
452
+ const idLC = id.toLowerCase();
453
+ const localIdx = entries.findIndex((e) => (extractId(e) ?? '').toLowerCase() === idLC);
454
+ if (choice === 'local') {
455
+ // keep local, discard remote (do nothing)
456
+ }
457
+ else if (choice === 'remote') {
458
+ if (localIdx !== -1) {
459
+ // replace local entry with remoteEntry
460
+ entries[localIdx] = rec.remoteEntry;
461
+ const p = projectTodoPath(root, cwd);
462
+ writeFileSync(p, `${TODO_HEADER}${entries.length ? `\n§\n${entries.join(ENTRY_DELIMITER)}\n` : ''}`, 'utf8');
463
+ }
464
+ else {
465
+ // local missing, add remote
466
+ entries.push(rec.remoteEntry);
467
+ const p = projectTodoPath(root, cwd);
468
+ writeFileSync(p, `${TODO_HEADER}${entries.length ? `\n§\n${entries.join(ENTRY_DELIMITER)}\n` : ''}`, 'utf8');
469
+ }
470
+ }
471
+ else if (choice === 'both') {
472
+ // keep both: local stays, remote re-stamped with new id
473
+ const newId = randomBytes(4).toString('hex');
474
+ const remoteRestamped = String(rec.remoteEntry).replace(/\[id:\s*[0-9a-f]{8}\]/i, `[id: ${newId}]`);
475
+ entries.push(remoteRestamped);
476
+ const p = projectTodoPath(root, cwd);
477
+ writeFileSync(p, `${TODO_HEADER}${entries.length ? `\n§\n${entries.join(ENTRY_DELIMITER)}\n` : ''}`, 'utf8');
478
+ }
479
+ }
480
+ else {
481
+ const entries = readMemoryTrack(root, cwd, track);
482
+ const idLC = id.toLowerCase();
483
+ const localIdx = entries.findIndex((e) => (extractId(e) ?? '').toLowerCase() === idLC);
484
+ if (choice === 'local') {
485
+ // keep local unchanged
486
+ }
487
+ else if (choice === 'remote') {
488
+ if (localIdx !== -1)
489
+ entries[localIdx] = rec.remoteEntry;
490
+ else
491
+ entries.push(rec.remoteEntry);
492
+ writeMemoryTrack(root, cwd, track, entries);
493
+ }
494
+ else if (choice === 'both') {
495
+ const newId = randomBytes(4).toString('hex');
496
+ const remoteRestamped = String(rec.remoteEntry).replace(/\[id:\s*[0-9a-f]{8}\]/i, `[id: ${newId}]`);
497
+ // keep local, add restamped remote
498
+ entries.push(remoteRestamped);
499
+ writeMemoryTrack(root, cwd, track, entries);
500
+ }
501
+ }
502
+ // remove resolved conflict
503
+ conflicts.splice(idx, 1);
504
+ this.writeConflicts(cwd, conflicts);
505
+ return { ok: true };
506
+ }
507
+ }
508
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/host/sync/service.ts"],"names":[],"mappings":"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"}