@remnic/cli 9.69.100 → 9.69.101

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 (2) hide show
  1. package/dist/index.js +116 -102
  2. package/package.json +32 -32
package/dist/index.js CHANGED
@@ -16392,6 +16392,17 @@ function advanceOfflineBaseFilesForSuccessfulPush(options) {
16392
16392
  return [...next.values()].sort((left, right) => left.path.localeCompare(right.path));
16393
16393
  }
16394
16394
  async function runOfflineSyncOnce(options) {
16395
+ const offlineStorage = await createConfiguredOfflineStorage(
16396
+ options.memoryDir,
16397
+ options.secureStoreEncryptOnWrite
16398
+ );
16399
+ try {
16400
+ return await runOfflineSyncOnceWithStorage(options, offlineStorage);
16401
+ } finally {
16402
+ await offlineStorage.storage.flushOfflineSyncDigestCache();
16403
+ }
16404
+ }
16405
+ async function runOfflineSyncOnceWithStorage(options, offlineStorage) {
16395
16406
  fs32.mkdirSync(options.memoryDir, { recursive: true });
16396
16407
  let activeStatePath = options.statePath;
16397
16408
  let priorState = await readOfflineSyncState(activeStatePath);
@@ -16430,10 +16441,6 @@ async function runOfflineSyncOnce(options) {
16430
16441
  }
16431
16442
  const baseFiles = priorState?.baseFiles ?? [];
16432
16443
  const baseCapturedAt = priorState ? new Date(priorState.lastSyncedAt) : void 0;
16433
- const offlineStorage = await createConfiguredOfflineStorage(
16434
- options.memoryDir,
16435
- options.secureStoreEncryptOnWrite
16436
- );
16437
16444
  const storageIo = await createOfflineStorageIo(options.memoryDir, offlineStorage);
16438
16445
  const syncBaseFiles = await filterOfflineSyncBaseFiles(options.memoryDir, baseFiles, storageIo.excludeFile);
16439
16446
  const localSourceId = localOfflineSourceId(options.memoryDir);
@@ -17111,84 +17118,87 @@ Environment fallbacks:
17111
17118
  statePath: existingState.statePath
17112
17119
  });
17113
17120
  }
17114
- const storageIo = await createOfflineStorageIo(
17115
- memoryDir,
17116
- await createConfiguredOfflineStorage(memoryDir, config.secureStoreEncryptOnWrite)
17117
- );
17118
- const currentSnapshot = await buildOfflineSyncSnapshotFromBase2({
17119
- root: memoryDir,
17120
- sourceId: "local",
17121
- includeContent: false,
17122
- includeTranscripts,
17123
- readFile: storageIo.readFile,
17124
- readFileDigest: storageIo.readFileDigest,
17125
- excludeNodeLocalState: false
17126
- });
17127
- const stagedTransport = await stageGenerationMembersForApply({
17128
- memoryDir,
17129
- remoteUrl,
17130
- token,
17131
- namespace: resolvedNamespace,
17132
- includeTranscripts,
17133
- incomingFiles: remoteSnapshotMetadata.files,
17134
- currentFiles: currentSnapshot.files,
17135
- minBytes: OFFLINE_SYNC_DIRECT_HYDRATE_MIN_BYTES,
17136
- secureStoreEncryptOnWrite: config.secureStoreEncryptOnWrite,
17137
- hydrateFileContent: hydrateOfflineFileContent
17138
- });
17139
- let remoteSnapshot;
17140
- let pull;
17121
+ const configuredStorage = await createConfiguredOfflineStorage(memoryDir, config.secureStoreEncryptOnWrite);
17122
+ const storageIo = await createOfflineStorageIo(memoryDir, configuredStorage);
17123
+ let stagedTransport;
17141
17124
  try {
17142
- remoteSnapshot = await hydrateOfflineSnapshotContent({
17125
+ const currentSnapshot = await buildOfflineSyncSnapshotFromBase2({
17126
+ root: memoryDir,
17127
+ sourceId: "local",
17128
+ includeContent: false,
17129
+ includeTranscripts,
17130
+ readFile: storageIo.readFile,
17131
+ readFileDigest: storageIo.readFileDigest,
17132
+ excludeNodeLocalState: false
17133
+ });
17134
+ stagedTransport = await stageGenerationMembersForApply({
17135
+ memoryDir,
17143
17136
  remoteUrl,
17144
17137
  token,
17145
17138
  namespace: resolvedNamespace,
17146
17139
  includeTranscripts,
17147
- snapshot: remoteSnapshotMetadata,
17148
- baseFiles: existingState?.state.baseFiles ?? [],
17140
+ incomingFiles: remoteSnapshotMetadata.files,
17149
17141
  currentFiles: currentSnapshot.files,
17150
- skipContentPaths: stagedTransport.stagedPaths
17142
+ minBytes: OFFLINE_SYNC_DIRECT_HYDRATE_MIN_BYTES,
17143
+ secureStoreEncryptOnWrite: config.secureStoreEncryptOnWrite,
17144
+ hydrateFileContent: hydrateOfflineFileContent
17151
17145
  });
17152
- pull = await applyOfflineSyncSnapshot({
17153
- root: memoryDir,
17146
+ let remoteSnapshot;
17147
+ let pull;
17148
+ try {
17149
+ remoteSnapshot = await hydrateOfflineSnapshotContent({
17150
+ remoteUrl,
17151
+ token,
17152
+ namespace: resolvedNamespace,
17153
+ includeTranscripts,
17154
+ snapshot: remoteSnapshotMetadata,
17155
+ baseFiles: existingState?.state.baseFiles ?? [],
17156
+ currentFiles: currentSnapshot.files,
17157
+ skipContentPaths: stagedTransport.stagedPaths
17158
+ });
17159
+ pull = await applyOfflineSyncSnapshot({
17160
+ root: memoryDir,
17161
+ snapshot: remoteSnapshot,
17162
+ baseFiles: existingState?.state.baseFiles ?? [],
17163
+ readFile: storageIo.readFile,
17164
+ readFileDigest: storageIo.readFileDigest,
17165
+ writeFile: storageIo.writeFile,
17166
+ writeStagingFile: storageIo.writeStagingFile,
17167
+ readStagingFile: storageIo.readStagingFile,
17168
+ deleteFile: storageIo.deleteFile,
17169
+ recordDeletionRevision: storageIo.recordDeletionRevision,
17170
+ readIncomingFile: stagedTransport.readIncomingFile
17171
+ });
17172
+ } finally {
17173
+ await stagedTransport.cleanup();
17174
+ }
17175
+ const state = offlineSyncStateFromSnapshot({
17176
+ remoteId: remoteUrl,
17177
+ namespace: resolvedNamespace,
17154
17178
  snapshot: remoteSnapshot,
17155
- baseFiles: existingState?.state.baseFiles ?? [],
17156
- readFile: storageIo.readFile,
17157
- readFileDigest: storageIo.readFileDigest,
17158
- writeFile: storageIo.writeFile,
17159
- writeStagingFile: storageIo.writeStagingFile,
17160
- readStagingFile: storageIo.readStagingFile,
17161
- deleteFile: storageIo.deleteFile,
17162
- recordDeletionRevision: storageIo.recordDeletionRevision,
17163
- readIncomingFile: stagedTransport.readIncomingFile
17179
+ baseFiles: pull.nextBaseFiles
17164
17180
  });
17181
+ for (const pathToWrite of stateWritePaths) {
17182
+ await writeOfflineSyncState(pathToWrite, state);
17183
+ }
17184
+ if (json) {
17185
+ console.log(JSON.stringify({
17186
+ statePath: activeStatePath,
17187
+ namespace: resolvedNamespace,
17188
+ remoteFiles: remoteSnapshot.files.length,
17189
+ pull: offlinePullJsonSummary(pull)
17190
+ }, null, 2));
17191
+ } else {
17192
+ console.log(`Offline cache prepared: ${memoryDir}`);
17193
+ console.log(`Namespace: ${resolvedNamespace ?? "(default)"}`);
17194
+ console.log(`Remote files: ${remoteSnapshot.files.length}`);
17195
+ console.log(`Pulled: ${pull.upserted} upserted, ${pull.deleted} deleted, ${pull.conflicts.length} conflicts`);
17196
+ console.log(`State: ${activeStatePath}`);
17197
+ }
17198
+ return;
17165
17199
  } finally {
17166
- await stagedTransport.cleanup();
17200
+ await configuredStorage.storage.flushOfflineSyncDigestCache();
17167
17201
  }
17168
- const state = offlineSyncStateFromSnapshot({
17169
- remoteId: remoteUrl,
17170
- namespace: resolvedNamespace,
17171
- snapshot: remoteSnapshot,
17172
- baseFiles: pull.nextBaseFiles
17173
- });
17174
- for (const pathToWrite of stateWritePaths) {
17175
- await writeOfflineSyncState(pathToWrite, state);
17176
- }
17177
- if (json) {
17178
- console.log(JSON.stringify({
17179
- statePath: activeStatePath,
17180
- namespace: resolvedNamespace,
17181
- remoteFiles: remoteSnapshot.files.length,
17182
- pull: offlinePullJsonSummary(pull)
17183
- }, null, 2));
17184
- } else {
17185
- console.log(`Offline cache prepared: ${memoryDir}`);
17186
- console.log(`Namespace: ${resolvedNamespace ?? "(default)"}`);
17187
- console.log(`Remote files: ${remoteSnapshot.files.length}`);
17188
- console.log(`Pulled: ${pull.upserted} upserted, ${pull.deleted} deleted, ${pull.conflicts.length} conflicts`);
17189
- console.log(`State: ${activeStatePath}`);
17190
- }
17191
- return;
17192
17202
  }
17193
17203
  if (action === "sync") {
17194
17204
  if (!remoteUrl || !token || !statePath) throw new Error("offline sync requires remote URL and token");
@@ -17237,39 +17247,43 @@ Environment fallbacks:
17237
17247
  }
17238
17248
  const configuredStorage = await createConfiguredOfflineStorage(memoryDir, config.secureStoreEncryptOnWrite);
17239
17249
  const storageIo = await createOfflineStorageIo(memoryDir, configuredStorage);
17240
- await drainOfflineSyncImpressions(memoryDir, impressionRotation);
17241
- await drainPendingLifecycleForOfflineSync(
17242
- memoryDir,
17243
- async (ledgerPath) => (await createOfflineStorageForPath(
17250
+ try {
17251
+ await drainOfflineSyncImpressions(memoryDir, impressionRotation);
17252
+ await drainPendingLifecycleForOfflineSync(
17244
17253
  memoryDir,
17245
- ledgerPath,
17246
- configuredStorage,
17247
- config.secureStoreEncryptOnWrite ?? true
17248
- )).drainPendingMemoryLifecycleEventsForSyncAt(ledgerPath)
17249
- );
17250
- const summary = await summarizeOfflineSyncPendingChanges({
17251
- root: memoryDir,
17252
- sourceId: localOfflineSourceId(memoryDir),
17253
- baseFiles: state?.baseFiles ?? [],
17254
- baseCapturedAt: state ? new Date(state.lastSyncedAt) : void 0,
17255
- includeTranscripts,
17256
- readFile: storageIo.readFile,
17257
- readFileDigest: storageIo.readFileDigest,
17258
- userExcludeRegexps
17259
- });
17260
- if (json) {
17261
- console.log(JSON.stringify({
17262
- statePath: statePath ?? null,
17263
- state: offlineStateJsonSummary(state),
17264
- pending: summary
17265
- }, null, 2));
17266
- } else {
17267
- console.log(`Offline state: ${state ? "ready" : "not prepared"}`);
17268
- console.log(`State: ${statePath ?? "(not selected; pass --state or --remote-url to inspect a prepared remote state)"}`);
17269
- if (state) console.log(`Last synced: ${state.lastSyncedAt}`);
17270
- console.log(`Pending local changes: ${summary.total} (${summary.upserts} upserts, ${summary.deletes} deletes)`);
17254
+ async (ledgerPath) => (await createOfflineStorageForPath(
17255
+ memoryDir,
17256
+ ledgerPath,
17257
+ configuredStorage,
17258
+ config.secureStoreEncryptOnWrite ?? true
17259
+ )).drainPendingMemoryLifecycleEventsForSyncAt(ledgerPath)
17260
+ );
17261
+ const summary = await summarizeOfflineSyncPendingChanges({
17262
+ root: memoryDir,
17263
+ sourceId: localOfflineSourceId(memoryDir),
17264
+ baseFiles: state?.baseFiles ?? [],
17265
+ baseCapturedAt: state ? new Date(state.lastSyncedAt) : void 0,
17266
+ includeTranscripts,
17267
+ readFile: storageIo.readFile,
17268
+ readFileDigest: storageIo.readFileDigest,
17269
+ userExcludeRegexps
17270
+ });
17271
+ if (json) {
17272
+ console.log(JSON.stringify({
17273
+ statePath: statePath ?? null,
17274
+ state: offlineStateJsonSummary(state),
17275
+ pending: summary
17276
+ }, null, 2));
17277
+ } else {
17278
+ console.log(`Offline state: ${state ? "ready" : "not prepared"}`);
17279
+ console.log(`State: ${statePath ?? "(not selected; pass --state or --remote-url to inspect a prepared remote state)"}`);
17280
+ if (state) console.log(`Last synced: ${state.lastSyncedAt}`);
17281
+ console.log(`Pending local changes: ${summary.total} (${summary.upserts} upserts, ${summary.deletes} deletes)`);
17282
+ }
17283
+ return;
17284
+ } finally {
17285
+ await configuredStorage.storage.flushOfflineSyncDigestCache();
17271
17286
  }
17272
- return;
17273
17287
  }
17274
17288
  if (action === "watch") {
17275
17289
  if (!remoteUrl || !token || !statePath) throw new Error("offline watch requires remote URL and token");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/cli",
3
- "version": "9.69.100",
3
+ "version": "9.69.101",
4
4
  "description": "CLI for Remnic memory — init, query, doctor, daemon management",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -26,26 +26,26 @@
26
26
  },
27
27
  "dependencies": {
28
28
  "yaml": "^2.4.2",
29
- "@remnic/plugin-pi": "^9.69.100",
30
- "@remnic/server": "^9.69.100",
31
- "@remnic/core": "^9.69.100"
29
+ "@remnic/plugin-pi": "^9.69.101",
30
+ "@remnic/server": "^9.69.101",
31
+ "@remnic/core": "^9.69.101"
32
32
  },
33
33
  "peerDependencies": {
34
- "@remnic/bench": "^9.69.100",
35
- "@remnic/plugin-openclaw": "^9.69.100",
36
- "@remnic/export-weclone": "^9.69.100",
37
- "@remnic/import-weclone": "^9.69.100",
38
- "@remnic/import-chatgpt": "^9.69.100",
39
- "@remnic/import-claude": "^9.69.100",
40
- "@remnic/import-gemini": "^9.69.100",
41
- "@remnic/import-lossless-claw": "^9.69.100",
42
- "@remnic/import-mem0": "^9.69.100",
43
- "@remnic/import-supermemory": "^9.69.100",
44
- "@remnic/import-okf": "^9.69.100",
45
- "@remnic/connector-limitless": "^9.69.100",
46
- "@remnic/connector-bee": "^9.69.100",
47
- "@remnic/connector-omi": "^9.69.100",
48
- "@remnic/capture-audio": "^9.69.100"
34
+ "@remnic/bench": "^9.69.101",
35
+ "@remnic/plugin-openclaw": "^9.69.101",
36
+ "@remnic/export-weclone": "^9.69.101",
37
+ "@remnic/import-weclone": "^9.69.101",
38
+ "@remnic/import-chatgpt": "^9.69.101",
39
+ "@remnic/import-claude": "^9.69.101",
40
+ "@remnic/import-gemini": "^9.69.101",
41
+ "@remnic/import-lossless-claw": "^9.69.101",
42
+ "@remnic/import-mem0": "^9.69.101",
43
+ "@remnic/import-supermemory": "^9.69.101",
44
+ "@remnic/import-okf": "^9.69.101",
45
+ "@remnic/connector-limitless": "^9.69.101",
46
+ "@remnic/connector-bee": "^9.69.101",
47
+ "@remnic/connector-omi": "^9.69.101",
48
+ "@remnic/capture-audio": "^9.69.101"
49
49
  },
50
50
  "peerDependenciesMeta": {
51
51
  "@remnic/bench": {
@@ -97,19 +97,19 @@
97
97
  "devDependencies": {
98
98
  "tsup": "^8.5.1",
99
99
  "typescript": "^5.9.3",
100
- "@remnic/bench": "9.69.100",
101
- "@remnic/plugin-openclaw": "9.69.100",
102
- "@remnic/import-weclone": "9.69.100",
103
- "@remnic/export-weclone": "9.69.100",
104
- "@remnic/import-chatgpt": "9.69.100",
105
- "@remnic/import-claude": "9.69.100",
106
- "@remnic/import-lossless-claw": "9.69.100",
107
- "@remnic/import-gemini": "9.69.100",
108
- "@remnic/connector-limitless": "9.69.100",
109
- "@remnic/import-supermemory": "9.69.100",
110
- "@remnic/connector-bee": "9.69.100",
111
- "@remnic/import-mem0": "9.69.100",
112
- "@remnic/connector-omi": "9.69.100"
100
+ "@remnic/bench": "9.69.101",
101
+ "@remnic/plugin-openclaw": "9.69.101",
102
+ "@remnic/export-weclone": "9.69.101",
103
+ "@remnic/import-weclone": "9.69.101",
104
+ "@remnic/import-chatgpt": "9.69.101",
105
+ "@remnic/import-claude": "9.69.101",
106
+ "@remnic/import-lossless-claw": "9.69.101",
107
+ "@remnic/import-mem0": "9.69.101",
108
+ "@remnic/import-supermemory": "9.69.101",
109
+ "@remnic/import-gemini": "9.69.101",
110
+ "@remnic/connector-limitless": "9.69.101",
111
+ "@remnic/connector-bee": "9.69.101",
112
+ "@remnic/connector-omi": "9.69.101"
113
113
  },
114
114
  "license": "MIT",
115
115
  "repository": {