unforgit 0.11.9 → 0.11.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -35,7 +35,7 @@ import {
35
35
  saveConfig,
36
36
  shouldImportMarkdownMemory,
37
37
  validateMemoryType
38
- } from "./chunk-ZAM372VB.js";
38
+ } from "./chunk-54ITDIXE.js";
39
39
 
40
40
  // src/index.ts
41
41
  import { Command as Command32 } from "commander";
@@ -2254,21 +2254,18 @@ var pullCommand = new Command17("pull").description("Pull remote memories to loc
2254
2254
  }
2255
2255
  const client = new RemoteClient(config.remote.url);
2256
2256
  logger.info(`Fetching from ${remote} (${config.remote.url})...`);
2257
- const response = await client.recall({
2258
- orgId,
2259
- repoId,
2260
- query: "*",
2261
- k: 1e3,
2262
- includeDeprecated: true
2263
- });
2264
- const remoteMemories = response.results;
2265
- if (remoteMemories.length === 0) {
2266
- logger.info("Already up to date (no memories on remote)");
2257
+ const [remoteMemories, remoteTombstones] = await Promise.all([
2258
+ client.syncPull(orgId, repoId),
2259
+ client.syncTombstones(orgId, repoId)
2260
+ ]);
2261
+ if (remoteMemories.length === 0 && remoteTombstones.length === 0) {
2262
+ logger.info("Already up to date (no remote changes)");
2267
2263
  return;
2268
2264
  }
2269
2265
  if (opts.dryRun) {
2270
2266
  let newCount = 0;
2271
2267
  let updateCount = 0;
2268
+ let deletionCount = 0;
2272
2269
  for (const remoteMem of remoteMemories) {
2273
2270
  const localMem = store.getById(remoteMem.id);
2274
2271
  if (!localMem) {
@@ -2277,41 +2274,33 @@ var pullCommand = new Command17("pull").description("Pull remote memories to loc
2277
2274
  updateCount++;
2278
2275
  }
2279
2276
  }
2277
+ for (const tombstone of remoteTombstones) {
2278
+ if (store.getById(tombstone.memoryId)) deletionCount++;
2279
+ }
2280
2280
  logger.info(`
2281
2281
  Would pull:`);
2282
2282
  logger.info(` ${newCount} new memories`);
2283
2283
  logger.info(` ${updateCount} updates`);
2284
+ logger.info(` ${deletionCount} deletions`);
2284
2285
  return;
2285
2286
  }
2286
2287
  let created = 0;
2287
2288
  let updated = 0;
2288
2289
  let skipped = 0;
2289
2290
  let conflicts = 0;
2291
+ let deleted = 0;
2292
+ for (const tombstone of remoteTombstones) {
2293
+ if (store.applyTombstone(tombstone)) deleted++;
2294
+ }
2290
2295
  for (const remoteMem of remoteMemories) {
2291
2296
  const localMem = store.getById(remoteMem.id);
2292
2297
  const remoteStatus = remoteMem.status ?? "active";
2293
2298
  if (!localMem) {
2294
- store.upsertFromRemote({
2295
- id: remoteMem.id,
2296
- orgId,
2297
- repoId,
2298
- scopeType: "repo",
2299
- memoryType: remoteMem.memoryType,
2300
- visibility: "repo",
2301
- status: remoteStatus,
2302
- text: remoteMem.text,
2303
- summary: remoteMem.summary,
2304
- tags: remoteMem.tags,
2305
- sourceRefs: remoteMem.sourceRefs,
2306
- supersedesId: remoteMem.supersedesId,
2307
- version: 1,
2308
- createdAt: /* @__PURE__ */ new Date(),
2309
- updatedAt: /* @__PURE__ */ new Date()
2310
- });
2299
+ store.upsertFromRemote({ ...remoteMem, status: remoteStatus });
2311
2300
  store.setSyncState({
2312
2301
  memoryId: remoteMem.id,
2313
- localVersion: 1,
2314
- remoteVersion: 1,
2302
+ localVersion: remoteMem.version,
2303
+ remoteVersion: remoteMem.version,
2315
2304
  lastPulledAt: /* @__PURE__ */ new Date(),
2316
2305
  syncStatus: "synced"
2317
2306
  });
@@ -2321,53 +2310,43 @@ Would pull:`);
2321
2310
  logger.progress(created + updated + skipped + conflicts, remoteMemories.length, "memories");
2322
2311
  } else {
2323
2312
  const syncState = store.getSyncState(remoteMem.id);
2324
- const localVersion = syncState?.localVersion ?? localMem.version;
2325
- const remoteVersion = syncState?.remoteVersion ?? 0;
2326
2313
  if (syncState?.syncStatus === "pending_push" && !opts.force) {
2327
2314
  conflicts++;
2328
- store.markAsConflict(remoteMem.id, remoteVersion + 1);
2315
+ store.markAsConflict(remoteMem.id, remoteMem.version);
2329
2316
  logger.info(` ${remoteMem.id.slice(0, 8)}... conflict (local has unpushed changes)`);
2330
2317
  logger.progress(created + updated + skipped + conflicts, remoteMemories.length, "memories");
2331
2318
  continue;
2332
2319
  }
2333
2320
  const statusChanged = localMem.status !== remoteStatus;
2334
- const textChanged = localMem.text !== remoteMem.text;
2335
- if (!textChanged && !statusChanged) {
2336
- skipped++;
2321
+ const result = store.upsertFromRemote(
2322
+ { ...remoteMem, status: remoteStatus },
2323
+ opts.force ? "remote_wins" : "last_write_wins"
2324
+ );
2325
+ if (result.conflict && result.action === "skipped") {
2326
+ conflicts++;
2327
+ store.markAsConflict(remoteMem.id, remoteMem.version);
2328
+ logger.info(` ${remoteMem.id.slice(0, 8)}... conflict (local is newer)`);
2337
2329
  logger.progress(created + updated + skipped + conflicts, remoteMemories.length, "memories");
2338
2330
  continue;
2339
2331
  }
2340
- if (opts.force || syncState?.syncStatus !== "pending_push") {
2341
- store.upsertFromRemote({
2342
- id: remoteMem.id,
2343
- orgId,
2344
- repoId,
2345
- scopeType: "repo",
2346
- memoryType: remoteMem.memoryType,
2347
- visibility: "repo",
2348
- status: remoteStatus,
2349
- text: remoteMem.text,
2350
- summary: remoteMem.summary,
2351
- tags: remoteMem.tags,
2352
- sourceRefs: remoteMem.sourceRefs,
2353
- supersedesId: remoteMem.supersedesId,
2354
- version: localVersion + 1,
2355
- createdAt: localMem.createdAt,
2356
- updatedAt: /* @__PURE__ */ new Date()
2357
- });
2358
- store.markAsPulled(remoteMem.id, localVersion + 1);
2359
- updated++;
2360
- const changeType = statusChanged && !textChanged ? "status updated" : "updated";
2361
- const statusNote = remoteStatus !== "active" ? ` [${remoteStatus}]` : "";
2362
- logger.info(` ${remoteMem.id.slice(0, 8)}... ${changeType}${statusNote}`);
2332
+ if (result.action === "skipped") {
2333
+ skipped++;
2363
2334
  logger.progress(created + updated + skipped + conflicts, remoteMemories.length, "memories");
2335
+ continue;
2364
2336
  }
2337
+ store.markAsPulled(remoteMem.id, remoteMem.version);
2338
+ updated++;
2339
+ const changeType = statusChanged ? "status updated" : "updated";
2340
+ const statusNote = remoteStatus !== "active" ? ` [${remoteStatus}]` : "";
2341
+ logger.info(` ${remoteMem.id.slice(0, 8)}... ${changeType}${statusNote}`);
2342
+ logger.progress(created + updated + skipped + conflicts, remoteMemories.length, "memories");
2365
2343
  }
2366
2344
  }
2367
2345
  logger.info("");
2368
2346
  logger.info(`Pull complete:`);
2369
2347
  if (created > 0) logger.info(` ${created} new memories`);
2370
2348
  if (updated > 0) logger.info(` ${updated} updates`);
2349
+ if (deleted > 0) logger.info(` ${deleted} deletions`);
2371
2350
  if (skipped > 0) logger.info(` ${skipped} already up to date`);
2372
2351
  if (conflicts > 0) {
2373
2352
  logger.info(` ${conflicts} conflicts (use --force to overwrite local)`);