@remnic/plugin-openclaw 1.0.46 → 1.0.47

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.
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  buildExtensionsBlockForConsolidation,
7
7
  runPostConsolidationMaterialize
8
- } from "./chunk-GXMAAGP2.js";
8
+ } from "./chunk-MWLY7VQX.js";
9
9
  import "./chunk-TH5FF5SC.js";
10
10
  import {
11
11
  resolveCausalTrajectoryStoreDir
@@ -21,9 +21,9 @@ import {
21
21
  FallbackLlmClient
22
22
  } from "./chunk-SWOYEQN2.js";
23
23
  import "./chunk-3A5ELHTT.js";
24
- import "./chunk-SDPTCSV7.js";
24
+ import "./chunk-YXDXRE6N.js";
25
25
  import "./chunk-QMUQV5NP.js";
26
- import "./chunk-IB4WJJF7.js";
26
+ import "./chunk-BQZ7JACP.js";
27
27
  import {
28
28
  log
29
29
  } from "./chunk-UFU5GGGA.js";
@@ -19,7 +19,7 @@ import {
19
19
  import {
20
20
  decryptMemoryDirToPlaintext,
21
21
  migrateMemoryDirToEncrypted
22
- } from "./chunk-IB4WJJF7.js";
22
+ } from "./chunk-BQZ7JACP.js";
23
23
  import {
24
24
  generateSalt
25
25
  } from "./chunk-YGGGUTG3.js";
@@ -1,13 +1,21 @@
1
1
  import {
2
+ AUTH_TAG_LENGTH,
3
+ ENVELOPE_HEADER_SIZE,
4
+ ENVELOPE_LAYOUT,
5
+ ENVELOPE_SALT_LENGTH,
6
+ ENVELOPE_VERSION,
7
+ IV_LENGTH,
2
8
  generateSalt,
3
9
  open,
4
10
  seal
5
11
  } from "./chunk-YGGGUTG3.js";
6
12
 
7
13
  // ../remnic-core/src/secure-store/secure-fs.ts
14
+ import { createCipheriv, randomBytes } from "crypto";
8
15
  import * as fsReadModule0 from "fs/promises";
9
16
  const lstat = fsReadModule0.lstat;
10
17
  const mkdir = fsReadModule0.mkdir;
18
+ const openFile = fsReadModule0.open;
11
19
  const fileReader = fsReadModule0["re"+"ad"+"Fi"+"le"];
12
20
  const readdir = fsReadModule0.readdir;
13
21
  const rename = fsReadModule0.rename;
@@ -69,6 +77,12 @@ function decryptFileBody(buf, key, aad) {
69
77
  );
70
78
  }
71
79
  }
80
+ function buildHeaderAad(salt) {
81
+ const out = Buffer.alloc(1 + ENVELOPE_SALT_LENGTH);
82
+ out.writeUInt8(ENVELOPE_VERSION, 0);
83
+ Buffer.from(salt).copy(out, 1);
84
+ return out;
85
+ }
72
86
  function filePathAad(filePath, memoryDir) {
73
87
  let rel = filePath;
74
88
  if (memoryDir && path.isAbsolute(filePath)) {
@@ -118,6 +132,62 @@ async function writeMaybeEncryptedFile(filePath, content, key, options = {}, mem
118
132
  await writeFile(filePath, data, { mode });
119
133
  }
120
134
  }
135
+ async function writeMaybeEncryptedFileFromChunks(filePath, chunks, key, options = {}, memoryDir) {
136
+ const { mode = 384, atomic = true } = options;
137
+ await mkdir(path.dirname(filePath), { recursive: true });
138
+ const writePath = atomic ? `${filePath}.tmp-${process.pid}-${Date.now()}` : filePath;
139
+ let completed = false;
140
+ try {
141
+ const handle = await openFile(writePath, "w", mode);
142
+ try {
143
+ if (key !== null) {
144
+ const salt = generateSalt();
145
+ const iv = randomBytes(IV_LENGTH);
146
+ const header = Buffer.alloc(MAGIC_HEADER_SIZE + ENVELOPE_HEADER_SIZE);
147
+ MAGIC_BYTES.copy(header, 0);
148
+ header.writeUInt8(FILE_FORMAT_VERSION, MAGIC_BYTES.length);
149
+ header.writeUInt8(FILE_FORMAT_FLAGS, MAGIC_BYTES.length + 1);
150
+ const envelopeOffset = MAGIC_HEADER_SIZE;
151
+ header.writeUInt8(ENVELOPE_VERSION, envelopeOffset + ENVELOPE_LAYOUT.version);
152
+ salt.copy(header, envelopeOffset + ENVELOPE_LAYOUT.salt);
153
+ iv.copy(header, envelopeOffset + ENVELOPE_LAYOUT.iv);
154
+ await handle.write(header);
155
+ const cipher = createCipheriv("aes-256-gcm", key, iv, { authTagLength: AUTH_TAG_LENGTH });
156
+ const aad = filePathAad(filePath, memoryDir);
157
+ cipher.setAAD(Buffer.concat([buildHeaderAad(salt), aad]));
158
+ for await (const chunk of chunks) {
159
+ if (chunk.length === 0) continue;
160
+ const encrypted = cipher.update(chunk);
161
+ if (encrypted.length > 0) await handle.write(encrypted);
162
+ }
163
+ const final = cipher.final();
164
+ if (final.length > 0) await handle.write(final);
165
+ const authTag = cipher.getAuthTag();
166
+ await handle.write(
167
+ authTag,
168
+ 0,
169
+ authTag.length,
170
+ MAGIC_HEADER_SIZE + ENVELOPE_LAYOUT.authTag
171
+ );
172
+ } else {
173
+ for await (const chunk of chunks) {
174
+ if (chunk.length > 0) await handle.write(chunk);
175
+ }
176
+ }
177
+ } finally {
178
+ await handle.close();
179
+ }
180
+ if (atomic) {
181
+ await rename(writePath, filePath);
182
+ }
183
+ completed = true;
184
+ } finally {
185
+ if (!completed && atomic) {
186
+ await unlink(writePath).catch(() => {
187
+ });
188
+ }
189
+ }
190
+ }
121
191
  async function migrateMemoryDirToEncrypted(dir, key, onBeforeEncrypt) {
122
192
  const result = { encrypted: 0, skipped: 0, errors: [] };
123
193
  const files = await collectEncryptableStorageFiles(dir);
@@ -313,6 +383,7 @@ export {
313
383
  readMaybeEncryptedFileBuffer,
314
384
  readMaybeEncryptedFile,
315
385
  writeMaybeEncryptedFile,
386
+ writeMaybeEncryptedFileFromChunks,
316
387
  migrateMemoryDirToEncrypted,
317
388
  decryptMemoryDirToPlaintext
318
389
  };
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-TH5FF5SC.js";
4
4
  import {
5
5
  StorageManager
6
- } from "./chunk-SDPTCSV7.js";
6
+ } from "./chunk-YXDXRE6N.js";
7
7
  import {
8
8
  log
9
9
  } from "./chunk-UFU5GGGA.js";
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-BZ4EYURA.js";
4
4
  import {
5
5
  StorageManager
6
- } from "./chunk-SDPTCSV7.js";
6
+ } from "./chunk-YXDXRE6N.js";
7
7
 
8
8
  // ../remnic-core/src/maintenance/memory-governance.ts
9
9
  import path from "path";
@@ -5,7 +5,7 @@ import {
5
5
  StorageManager,
6
6
  parseContinuityImprovementLoops,
7
7
  sanitizeMemoryContent
8
- } from "./chunk-SDPTCSV7.js";
8
+ } from "./chunk-YXDXRE6N.js";
9
9
  import {
10
10
  log
11
11
  } from "./chunk-UFU5GGGA.js";
@@ -293,7 +293,7 @@ var CompoundingEngine = class {
293
293
  let promotionCandidates = this.config.compoundingSemanticEnabled ? this.derivePromotionCandidates(outcomeSummary, mistakes.registry, rubrics) : [];
294
294
  if (this.config.cmcConsolidationEnabled) {
295
295
  try {
296
- const { deriveCausalPromotionCandidates, materializeAfterCausalConsolidation } = await import("./causal-consolidation-6XK2QX6F.js");
296
+ const { deriveCausalPromotionCandidates, materializeAfterCausalConsolidation } = await import("./causal-consolidation-V533DIGW.js");
297
297
  const causalCandidates = await deriveCausalPromotionCandidates({
298
298
  memoryDir: this.config.memoryDir,
299
299
  causalTrajectoryStoreDir: this.config.causalTrajectoryStoreDir,
@@ -6,8 +6,9 @@ import {
6
6
  isEncryptedFile,
7
7
  readMaybeEncryptedFile,
8
8
  readMaybeEncryptedFileBuffer,
9
- writeMaybeEncryptedFile
10
- } from "./chunk-IB4WJJF7.js";
9
+ writeMaybeEncryptedFile,
10
+ writeMaybeEncryptedFileFromChunks
11
+ } from "./chunk-BQZ7JACP.js";
11
12
  import {
12
13
  log
13
14
  } from "./chunk-UFU5GGGA.js";
@@ -3254,6 +3255,15 @@ var StorageManager = class _StorageManager {
3254
3255
  await writeMaybeEncryptedFile(target, content, this.resolveWriteKey(), {}, this.baseDir);
3255
3256
  await this.invalidateAfterOfflineSyncMutation(target);
3256
3257
  }
3258
+ async writeOfflineSyncStagingFile(filePath, content) {
3259
+ const target = this.assertManagedStoragePath(filePath, "storage.writeOfflineSyncStagingFile");
3260
+ await writeMaybeEncryptedFile(target, content, this.resolveWriteKey(), {}, this.baseDir);
3261
+ }
3262
+ async writeOfflineSyncFileChunks(filePath, chunks) {
3263
+ const target = this.assertManagedStoragePath(filePath, "storage.writeOfflineSyncFileChunks");
3264
+ await writeMaybeEncryptedFileFromChunks(target, chunks, this.resolveWriteKey(), {}, this.baseDir);
3265
+ await this.invalidateAfterOfflineSyncMutation(target);
3266
+ }
3257
3267
  async deleteOfflineSyncFile(filePath) {
3258
3268
  const target = this.assertManagedStoragePath(filePath, "storage.deleteOfflineSyncFile");
3259
3269
  await unlink(target).catch((error) => {
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  CompoundingEngine,
3
3
  defaultTierMigrationCycleBudget
4
- } from "./chunk-EPX44ITH.js";
4
+ } from "./chunk-QVTGUY3H.js";
5
5
  import "./chunk-4XDQ3KEC.js";
6
- import "./chunk-SDPTCSV7.js";
6
+ import "./chunk-YXDXRE6N.js";
7
7
  import "./chunk-QMUQV5NP.js";
8
- import "./chunk-IB4WJJF7.js";
8
+ import "./chunk-BQZ7JACP.js";
9
9
  import "./chunk-UFU5GGGA.js";
10
10
  import "./chunk-YGGGUTG3.js";
11
11
  import "./chunk-EH4AXGRO.js";
package/dist/index.js CHANGED
@@ -11,32 +11,32 @@ import "./chunk-ZS6VABML.js";
11
11
  import "./chunk-QQXJODFL.js";
12
12
  import "./chunk-BU5KJVWF.js";
13
13
  import "./chunk-LZCGPRHS.js";
14
- import "./chunk-J3EKUNTG.js";
14
+ import "./chunk-PSAPZGDX.js";
15
15
  import "./chunk-BZ4EYURA.js";
16
16
  import "./chunk-W6EEFUCJ.js";
17
17
  import "./chunk-7JOLBJJ5.js";
18
18
  import "./chunk-JC3FCKYL.js";
19
19
  import "./chunk-YJYZMLD5.js";
20
20
  import "./chunk-IO5WWY6A.js";
21
- import "./chunk-GXMAAGP2.js";
21
+ import "./chunk-MWLY7VQX.js";
22
22
  import "./chunk-TH5FF5SC.js";
23
23
  import "./chunk-3IKMUNW5.js";
24
24
  import "./chunk-3G7FAF6S.js";
25
25
  import "./chunk-25J4PXDH.js";
26
- import "./chunk-EPX44ITH.js";
26
+ import "./chunk-QVTGUY3H.js";
27
27
  import {
28
28
  external_exports
29
29
  } from "./chunk-4XDQ3KEC.js";
30
- import "./chunk-Q7COZSFU.js";
30
+ import "./chunk-2RQU6GVD.js";
31
31
  import "./chunk-MXFJXUHC.js";
32
32
  import "./chunk-JZBOXOUC.js";
33
33
  import "./chunk-6IWEAUN6.js";
34
34
  import "./chunk-SWOYEQN2.js";
35
35
  import "./chunk-3A5ELHTT.js";
36
36
  import "./chunk-5ZW5XJQ6.js";
37
- import "./chunk-SDPTCSV7.js";
37
+ import "./chunk-YXDXRE6N.js";
38
38
  import "./chunk-QMUQV5NP.js";
39
- import "./chunk-IB4WJJF7.js";
39
+ import "./chunk-BQZ7JACP.js";
40
40
  import "./chunk-UFU5GGGA.js";
41
41
  import "./chunk-YGGGUTG3.js";
42
42
  import "./chunk-NUWDSTP7.js";
@@ -6648,11 +6648,13 @@ const open5 = fsReadModule27.open;
6648
6648
  const readdir19 = fsReadModule27.readdir;
6649
6649
  const fileReader29 = fsReadModule27["re"+"ad"+"Fi"+"le"];
6650
6650
  const rename5 = fsReadModule27.rename;
6651
+ const rm8 = fsReadModule27.rm;
6651
6652
  const stat14 = fsReadModule27.stat;
6652
6653
  const unlink9 = fsReadModule27.unlink;
6653
6654
  const writeFile31 = fsReadModule27.writeFile;
6654
6655
  import path48 from "path";
6655
6656
  var OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES = 64 * 1024 * 1024;
6657
+ var OFFLINE_SYNC_UPLOAD_STAGING_MAX_AGE_MS = 24 * 60 * 60 * 1e3;
6656
6658
 
6657
6659
  // ../remnic-core/src/action-confidence.ts
6658
6660
  var ACTION_CONFIDENCE_RISK_CATEGORIES = [
@@ -7373,7 +7375,7 @@ const writeFile32 = fsReadModule33.writeFile;
7373
7375
 
7374
7376
  // ../remnic-core/src/transfer/backup.ts
7375
7377
  import path69 from "path";
7376
- import { mkdir as mkdir37, readdir as readdir21, rm as rm8, unlink as unlink10, writeFile as writeFile33 } from "fs/promises";
7378
+ import { mkdir as mkdir37, readdir as readdir21, rm as rm9, unlink as unlink10, writeFile as writeFile33 } from "fs/promises";
7377
7379
  import { gzipSync } from "zlib";
7378
7380
 
7379
7381
  // ../remnic-core/src/transfer/export-sqlite.ts
@@ -7413,7 +7415,7 @@ import { mkdir as mkdir42, rename as rename6, stat as stat17, writeFile as write
7413
7415
 
7414
7416
  // ../remnic-core/src/maintenance/rebuild-memory-projection.ts
7415
7417
  import path77 from "path";
7416
- import { mkdir as mkdir43, rename as rename7, rm as rm9, stat as stat18 } from "fs/promises";
7418
+ import { mkdir as mkdir43, rename as rename7, rm as rm10, stat as stat18 } from "fs/promises";
7417
7419
 
7418
7420
  // ../remnic-core/src/maintenance/rebuild-observations.ts
7419
7421
  import path79 from "path";
@@ -6,11 +6,11 @@ import {
6
6
  readMemoryGovernanceRunArtifact,
7
7
  restoreMemoryGovernanceRun,
8
8
  runMemoryGovernance
9
- } from "./chunk-J3EKUNTG.js";
9
+ } from "./chunk-PSAPZGDX.js";
10
10
  import "./chunk-BZ4EYURA.js";
11
- import "./chunk-SDPTCSV7.js";
11
+ import "./chunk-YXDXRE6N.js";
12
12
  import "./chunk-QMUQV5NP.js";
13
- import "./chunk-IB4WJJF7.js";
13
+ import "./chunk-BQZ7JACP.js";
14
14
  import "./chunk-UFU5GGGA.js";
15
15
  import "./chunk-YGGGUTG3.js";
16
16
  import "./chunk-I2KLQ2HA.js";
@@ -13,7 +13,7 @@ import {
13
13
  runSecureStoreMigrate,
14
14
  runSecureStoreStatus,
15
15
  runSecureStoreUnlock
16
- } from "./chunk-Q7COZSFU.js";
16
+ } from "./chunk-2RQU6GVD.js";
17
17
  import {
18
18
  HEADER_FILENAME,
19
19
  HEADER_FORMAT,
@@ -66,7 +66,7 @@ import {
66
66
  migrateMemoryDirToEncrypted,
67
67
  readMaybeEncryptedFile,
68
68
  writeMaybeEncryptedFile
69
- } from "./chunk-IB4WJJF7.js";
69
+ } from "./chunk-BQZ7JACP.js";
70
70
  import {
71
71
  AES_KEY_LENGTH,
72
72
  AUTH_TAG_LENGTH,
@@ -8,9 +8,9 @@ import {
8
8
  normalizeEntityName,
9
9
  parseEntityFile,
10
10
  serializeEntityFile
11
- } from "./chunk-SDPTCSV7.js";
11
+ } from "./chunk-YXDXRE6N.js";
12
12
  import "./chunk-QMUQV5NP.js";
13
- import "./chunk-IB4WJJF7.js";
13
+ import "./chunk-BQZ7JACP.js";
14
14
  import "./chunk-UFU5GGGA.js";
15
15
  import "./chunk-YGGGUTG3.js";
16
16
  import "./chunk-I2KLQ2HA.js";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "openclaw-remnic",
3
3
  "name": "Remnic OpenClaw Plugin",
4
- "version": "1.0.46",
4
+ "version": "1.0.47",
5
5
  "kind": "memory",
6
6
  "description": "Local semantic memory for OpenClaw with bundled Remnic core runtime. Requires plugins.slots.memory set to this plugin id for hooks to fire.",
7
7
  "setup": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/plugin-openclaw",
3
- "version": "1.0.46",
3
+ "version": "1.0.47",
4
4
  "description": "OpenClaw adapter for Remnic memory with bundled @remnic/core runtime",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -71,7 +71,7 @@
71
71
  },
72
72
  "dependencies": {
73
73
  "openai": "^6.0.0",
74
- "@remnic/core": "^1.1.22"
74
+ "@remnic/core": "^1.1.23"
75
75
  },
76
76
  "peerDependencies": {
77
77
  "openclaw": ">=2026.5.16-beta.1"