@remnic/plugin-openclaw 1.0.10 → 1.0.12
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/{calibration-674TDQNV.js → calibration-WCHOK6DX.js} +12 -4
- package/dist/capsule-cli-GBM3WPAM.js +33 -0
- package/dist/capsule-crypto-K3IRTKRH.js +17 -0
- package/dist/capsule-export-IXVERCQG.js +17 -0
- package/dist/capsule-import-IA6VIOPQ.js +16 -0
- package/dist/capsule-merge-IWOQ34KL.js +189 -0
- package/dist/{causal-chain-OKDZSDEB.js → causal-chain-WYN5QOPS.js} +3 -2
- package/dist/{causal-consolidation-5BEXLQV5.js → causal-consolidation-YI53C2AO.js} +16 -12
- package/dist/{causal-retrieval-3BKBXVXD.js → causal-retrieval-NZHQOZOE.js} +6 -5
- package/dist/{causal-trajectory-graph-RQIT37DN.js → causal-trajectory-graph-VBPE2WPM.js} +1 -1
- package/dist/chunk-37NKFWSO.js +233 -0
- package/dist/chunk-3G7FAF6S.js +60 -0
- package/dist/{chunk-Z7GRLVK3.js → chunk-3GUF7RQI.js} +235 -19
- package/dist/chunk-4G2XCSD2.js +186 -0
- package/dist/chunk-4LYQ4ONL.js +185 -0
- package/dist/chunk-6F6EKSVP.js +453 -0
- package/dist/chunk-6IWEAUN6.js +148 -0
- package/dist/{chunk-LN5UZQVG.js → chunk-6UFI73TJ.js} +5 -3
- package/dist/chunk-7OQEPGQF.js +529 -0
- package/dist/{chunk-JJSNPSCD.js → chunk-7UZNLMW5.js} +652 -174
- package/dist/chunk-B52XADV3.js +244 -0
- package/dist/chunk-BU5KJVWF.js +78 -0
- package/dist/chunk-CDAZGIGT.js +720 -0
- package/dist/chunk-CXM7EBAO.js +289 -0
- package/dist/{chunk-HCFFXBLV.js → chunk-EXDYWXMB.js} +6 -1861
- package/dist/chunk-FGTYFLL5.js +274 -0
- package/dist/chunk-FQRSVYY4.js +110 -0
- package/dist/chunk-HRGFO6AW.js +349 -0
- package/dist/chunk-I6B2W2IY.js +47 -0
- package/dist/chunk-JZBOXOUC.js +259 -0
- package/dist/chunk-L6I4MQKO.js +227 -0
- package/dist/chunk-LLUROTZJ.js +328 -0
- package/dist/chunk-MBIFE6SA.js +250 -0
- package/dist/chunk-NKVIN6RD.js +118 -0
- package/dist/chunk-OAE7AQ6R.js +1832 -0
- package/dist/chunk-OEI7GLV2.js +17 -0
- package/dist/chunk-RKR6PTPA.js +308 -0
- package/dist/{chunk-7TENHBV2.js → chunk-RQCTMECT.js} +10 -48
- package/dist/chunk-SSFTU6LP.js +182 -0
- package/dist/{chunk-BXTMZDRT.js → chunk-SVSQAG6M.js} +7 -5
- package/dist/{chunk-S2ISS4AH.js → chunk-TILAJIJR.js} +10 -10
- package/dist/chunk-TLVIQLB4.js +874 -0
- package/dist/{chunk-YHH3SXKD.js → chunk-WPINX4MF.js} +1 -59
- package/dist/chunk-YGGGUTG3.js +125 -0
- package/dist/cipher-VHAFCG7Z.js +27 -0
- package/dist/dreams-ledger-3I52ISYR.js +285 -0
- package/dist/{engine-65C2J63X.js → engine-BIYI3P4J.js} +7 -2
- package/dist/{fallback-llm-LVK5PDIM.js → fallback-llm-WCWNGIQ3.js} +2 -1
- package/dist/first-start-migration-I24M2JEE.js +258 -0
- package/dist/forget-NI4RBDPB.js +68 -0
- package/dist/fs-utils-PZRI2HDZ.js +29 -0
- package/dist/graph-edge-decay-5CVKWBYH.js +203 -0
- package/dist/index.js +10654 -3067
- package/dist/kdf-H5B23ZM2.js +25 -0
- package/dist/memory-governance-SJ5DGRB3.js +25 -0
- package/dist/metadata-JAGIWHEA.js +20 -0
- package/dist/migrate-from-identity-anchor-N3354WMP.js +7 -0
- package/dist/path-5LCUBAAZ.js +8 -0
- package/dist/peers-JF2I6RCR.js +43 -0
- package/dist/purge-XN2VSPZ2.js +204 -0
- package/dist/secure-store-A4NGCNXV.js +155 -0
- package/dist/state-PVISYXRH.js +7 -0
- package/dist/state-store-LP5BO6SF.js +15 -0
- package/dist/{storage-DM4ZGOCN.js → storage-PTQ2H2YJ.js} +3 -1
- package/dist/tier-stats-IZNW66NC.js +147 -0
- package/dist/trace-NJESSGH7.js +289 -0
- package/dist/tui-MGK2LYJY.js +12 -0
- package/dist/types-R4DO7AKM.js +30 -0
- package/openclaw.plugin.json +519 -4
- package/package.json +2 -2
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildMetadata,
|
|
3
|
+
decodeMetadataSalt,
|
|
4
|
+
parseMetadata,
|
|
5
|
+
serializeMetadata
|
|
6
|
+
} from "./chunk-JZBOXOUC.js";
|
|
7
|
+
import {
|
|
8
|
+
KDF_KEY_LENGTH,
|
|
9
|
+
KDF_SALT_LENGTH,
|
|
10
|
+
deriveKey
|
|
11
|
+
} from "./chunk-6IWEAUN6.js";
|
|
12
|
+
import {
|
|
13
|
+
open,
|
|
14
|
+
seal
|
|
15
|
+
} from "./chunk-YGGGUTG3.js";
|
|
16
|
+
import {
|
|
17
|
+
__export
|
|
18
|
+
} from "./chunk-MLKGABMK.js";
|
|
19
|
+
|
|
20
|
+
// ../remnic-core/src/secure-store/header.ts
|
|
21
|
+
import { mkdir, readFile, writeFile } from "fs/promises";
|
|
22
|
+
import path from "path";
|
|
23
|
+
var SECURE_STORE_DIR_NAME = ".secure-store";
|
|
24
|
+
var HEADER_FILENAME = "header.json";
|
|
25
|
+
var HEADER_FORMAT = "remnic.secure-store.header";
|
|
26
|
+
var HEADER_FORMAT_VERSION = 1;
|
|
27
|
+
var VERIFIER_PLAINTEXT = Buffer.from("remnic-secure-store-v1", "utf8");
|
|
28
|
+
var VERIFIER_AAD = Buffer.from("remnic-secure-store/verifier", "utf8");
|
|
29
|
+
function secureStoreDir(memoryDir) {
|
|
30
|
+
return path.join(memoryDir, SECURE_STORE_DIR_NAME);
|
|
31
|
+
}
|
|
32
|
+
function headerPath(memoryDir) {
|
|
33
|
+
return path.join(secureStoreDir(memoryDir), HEADER_FILENAME);
|
|
34
|
+
}
|
|
35
|
+
function buildHeader(options) {
|
|
36
|
+
const { metadata, derivedKey } = options;
|
|
37
|
+
if (!Buffer.isBuffer(derivedKey) || derivedKey.length !== KDF_KEY_LENGTH) {
|
|
38
|
+
throw new Error(
|
|
39
|
+
`derivedKey must be a ${KDF_KEY_LENGTH}-byte Buffer, got length=${derivedKey?.length ?? "non-buffer"}`
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
const salt = decodeMetadataSalt(metadata);
|
|
43
|
+
if (salt.length !== KDF_SALT_LENGTH) {
|
|
44
|
+
throw new Error(`metadata salt is ${salt.length} bytes, expected ${KDF_SALT_LENGTH}`);
|
|
45
|
+
}
|
|
46
|
+
const envelope = seal(derivedKey, salt, VERIFIER_PLAINTEXT, { aad: VERIFIER_AAD });
|
|
47
|
+
return {
|
|
48
|
+
format: HEADER_FORMAT,
|
|
49
|
+
formatVersion: HEADER_FORMAT_VERSION,
|
|
50
|
+
metadata,
|
|
51
|
+
verifier: envelope.toString("hex"),
|
|
52
|
+
createdAt: options.createdAt ?? (/* @__PURE__ */ new Date()).toISOString()
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function serializeHeader(header) {
|
|
56
|
+
validateHeader(header);
|
|
57
|
+
const metadataString = serializeMetadata(header.metadata);
|
|
58
|
+
const metadataObject = JSON.parse(metadataString);
|
|
59
|
+
const ordered = {
|
|
60
|
+
format: header.format,
|
|
61
|
+
formatVersion: header.formatVersion,
|
|
62
|
+
metadata: metadataObject,
|
|
63
|
+
verifier: header.verifier,
|
|
64
|
+
createdAt: header.createdAt
|
|
65
|
+
};
|
|
66
|
+
return JSON.stringify(ordered, null, 2);
|
|
67
|
+
}
|
|
68
|
+
function parseHeader(json) {
|
|
69
|
+
if (typeof json !== "string") {
|
|
70
|
+
throw new Error("header input must be a string");
|
|
71
|
+
}
|
|
72
|
+
let parsed;
|
|
73
|
+
try {
|
|
74
|
+
parsed = JSON.parse(json);
|
|
75
|
+
} catch (e) {
|
|
76
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
77
|
+
throw new Error(`header is not valid JSON: ${msg}`);
|
|
78
|
+
}
|
|
79
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
80
|
+
throw new Error("header must be a JSON object");
|
|
81
|
+
}
|
|
82
|
+
const obj = parsed;
|
|
83
|
+
if (obj.format !== HEADER_FORMAT) {
|
|
84
|
+
throw new Error(
|
|
85
|
+
`unexpected header format: ${String(obj.format)} (expected ${HEADER_FORMAT})`
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
if (obj.formatVersion !== HEADER_FORMAT_VERSION) {
|
|
89
|
+
throw new Error(
|
|
90
|
+
`unsupported header formatVersion: ${String(obj.formatVersion)} (this build supports ${HEADER_FORMAT_VERSION})`
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
if (typeof obj.verifier !== "string" || obj.verifier.length === 0) {
|
|
94
|
+
throw new Error("header.verifier must be a non-empty hex string");
|
|
95
|
+
}
|
|
96
|
+
if (!/^[0-9a-fA-F]+$/.test(obj.verifier)) {
|
|
97
|
+
throw new Error("header.verifier must be a hex-encoded string");
|
|
98
|
+
}
|
|
99
|
+
if (obj.verifier.length % 2 !== 0) {
|
|
100
|
+
throw new Error(
|
|
101
|
+
"header.verifier hex string must have even length (each byte encodes as two hex digits)"
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
if (typeof obj.createdAt !== "string" || obj.createdAt.length === 0) {
|
|
105
|
+
throw new Error("header.createdAt must be a non-empty string");
|
|
106
|
+
}
|
|
107
|
+
if (typeof obj.metadata !== "object" || obj.metadata === null) {
|
|
108
|
+
throw new Error("header.metadata must be an object");
|
|
109
|
+
}
|
|
110
|
+
const metadata = parseMetadata(JSON.stringify(obj.metadata));
|
|
111
|
+
const header = {
|
|
112
|
+
format: HEADER_FORMAT,
|
|
113
|
+
formatVersion: HEADER_FORMAT_VERSION,
|
|
114
|
+
metadata,
|
|
115
|
+
verifier: obj.verifier,
|
|
116
|
+
createdAt: obj.createdAt
|
|
117
|
+
};
|
|
118
|
+
validateHeader(header);
|
|
119
|
+
return header;
|
|
120
|
+
}
|
|
121
|
+
function validateHeader(header) {
|
|
122
|
+
if (header.format !== HEADER_FORMAT) {
|
|
123
|
+
throw new Error(`header.format must be ${HEADER_FORMAT}`);
|
|
124
|
+
}
|
|
125
|
+
if (header.formatVersion !== HEADER_FORMAT_VERSION) {
|
|
126
|
+
throw new Error(`header.formatVersion must be ${HEADER_FORMAT_VERSION}`);
|
|
127
|
+
}
|
|
128
|
+
if (typeof header.createdAt !== "string" || header.createdAt.length === 0) {
|
|
129
|
+
throw new Error("header.createdAt must be a non-empty ISO-8601 string");
|
|
130
|
+
}
|
|
131
|
+
if (typeof header.verifier !== "string" || header.verifier.length === 0) {
|
|
132
|
+
throw new Error("header.verifier must be a non-empty hex string");
|
|
133
|
+
}
|
|
134
|
+
if (!/^[0-9a-fA-F]+$/.test(header.verifier)) {
|
|
135
|
+
throw new Error("header.verifier must be a hex-encoded string");
|
|
136
|
+
}
|
|
137
|
+
if (header.verifier.length % 2 !== 0) {
|
|
138
|
+
throw new Error(
|
|
139
|
+
"header.verifier hex string must have even length (each byte encodes as two hex digits)"
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
if (header.metadata.format !== "remnic.secure-store.metadata") {
|
|
143
|
+
throw new Error("header.metadata.format must be remnic.secure-store.metadata");
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function verifyKey(header, candidateKey) {
|
|
147
|
+
if (!Buffer.isBuffer(candidateKey) || candidateKey.length !== KDF_KEY_LENGTH) {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
const envelope = Buffer.from(header.verifier, "hex");
|
|
151
|
+
try {
|
|
152
|
+
const plaintext = open(candidateKey, envelope, { aad: VERIFIER_AAD });
|
|
153
|
+
return plaintext.equals(VERIFIER_PLAINTEXT);
|
|
154
|
+
} catch {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function deriveKeyFromHeader(header, passphrase) {
|
|
159
|
+
const salt = decodeMetadataSalt(header.metadata);
|
|
160
|
+
const params = header.metadata.kdf.params;
|
|
161
|
+
return deriveKey(header.metadata.kdf.algorithm, passphrase, salt, params);
|
|
162
|
+
}
|
|
163
|
+
async function readHeader(memoryDir) {
|
|
164
|
+
const target = headerPath(memoryDir);
|
|
165
|
+
let raw;
|
|
166
|
+
try {
|
|
167
|
+
raw = await readFile(target, "utf8");
|
|
168
|
+
} catch (e) {
|
|
169
|
+
if (e.code === "ENOENT") {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
throw e;
|
|
173
|
+
}
|
|
174
|
+
return parseHeader(raw);
|
|
175
|
+
}
|
|
176
|
+
async function writeHeader(memoryDir, header) {
|
|
177
|
+
validateHeader(header);
|
|
178
|
+
const dir = secureStoreDir(memoryDir);
|
|
179
|
+
await mkdir(dir, { recursive: true });
|
|
180
|
+
const target = headerPath(memoryDir);
|
|
181
|
+
try {
|
|
182
|
+
await writeFile(target, serializeHeader(header), {
|
|
183
|
+
encoding: "utf8",
|
|
184
|
+
mode: 384,
|
|
185
|
+
flag: "wx"
|
|
186
|
+
});
|
|
187
|
+
} catch (e) {
|
|
188
|
+
if (e.code === "EEXIST") {
|
|
189
|
+
throw new Error(
|
|
190
|
+
`secure-store header already exists at ${target}. Refusing to overwrite \u2014 initialize a fresh store or remove the existing header explicitly.`
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
throw e;
|
|
194
|
+
}
|
|
195
|
+
return target;
|
|
196
|
+
}
|
|
197
|
+
function buildHeaderFromPassphrase(options) {
|
|
198
|
+
const { passphrase, salt } = options;
|
|
199
|
+
const algorithm = options.algorithm ?? "argon2id";
|
|
200
|
+
const metadataOpts = { algorithm, salt };
|
|
201
|
+
if (options.params !== void 0) metadataOpts.params = options.params;
|
|
202
|
+
if (options.createdAt !== void 0) metadataOpts.createdAt = options.createdAt;
|
|
203
|
+
if (options.note !== void 0) metadataOpts.note = options.note;
|
|
204
|
+
const metadata = buildMetadata(metadataOpts);
|
|
205
|
+
const params = metadata.kdf.params;
|
|
206
|
+
const derivedKey = deriveKey(algorithm, passphrase, salt, params);
|
|
207
|
+
const headerOpts = {
|
|
208
|
+
metadata,
|
|
209
|
+
derivedKey
|
|
210
|
+
};
|
|
211
|
+
if (options.createdAt !== void 0) headerOpts.createdAt = options.createdAt;
|
|
212
|
+
const header = buildHeader(headerOpts);
|
|
213
|
+
return { header, derivedKey };
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// ../remnic-core/src/secure-store/keyring.ts
|
|
217
|
+
var keyring_exports = {};
|
|
218
|
+
__export(keyring_exports, {
|
|
219
|
+
getKey: () => getKey,
|
|
220
|
+
lock: () => lock,
|
|
221
|
+
lockAll: () => lockAll,
|
|
222
|
+
size: () => size,
|
|
223
|
+
status: () => status,
|
|
224
|
+
unlock: () => unlock
|
|
225
|
+
});
|
|
226
|
+
var ENTRIES = /* @__PURE__ */ new Map();
|
|
227
|
+
function unlock(id, key, now = () => /* @__PURE__ */ new Date()) {
|
|
228
|
+
if (typeof id !== "string" || id.length === 0) {
|
|
229
|
+
throw new Error("keyring id must be a non-empty string");
|
|
230
|
+
}
|
|
231
|
+
if (!Buffer.isBuffer(key) || key.length !== 32) {
|
|
232
|
+
throw new Error(`keyring key must be a 32-byte Buffer, got length=${key?.length ?? "non-buffer"}`);
|
|
233
|
+
}
|
|
234
|
+
const existing = ENTRIES.get(id);
|
|
235
|
+
if (existing) {
|
|
236
|
+
existing.key.fill(0);
|
|
237
|
+
}
|
|
238
|
+
ENTRIES.set(id, { key, unlockedAt: now().toISOString() });
|
|
239
|
+
}
|
|
240
|
+
function getKey(id) {
|
|
241
|
+
const entry = ENTRIES.get(id);
|
|
242
|
+
return entry ? entry.key : null;
|
|
243
|
+
}
|
|
244
|
+
function lock(id) {
|
|
245
|
+
const entry = ENTRIES.get(id);
|
|
246
|
+
if (!entry) return false;
|
|
247
|
+
entry.key.fill(0);
|
|
248
|
+
ENTRIES.delete(id);
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
function lockAll() {
|
|
252
|
+
for (const entry of ENTRIES.values()) {
|
|
253
|
+
entry.key.fill(0);
|
|
254
|
+
}
|
|
255
|
+
ENTRIES.clear();
|
|
256
|
+
}
|
|
257
|
+
function status(id) {
|
|
258
|
+
const entry = ENTRIES.get(id);
|
|
259
|
+
if (!entry) {
|
|
260
|
+
return { unlocked: false, unlockedAt: null };
|
|
261
|
+
}
|
|
262
|
+
return { unlocked: true, unlockedAt: entry.unlockedAt };
|
|
263
|
+
}
|
|
264
|
+
function size() {
|
|
265
|
+
return ENTRIES.size;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
export {
|
|
269
|
+
SECURE_STORE_DIR_NAME,
|
|
270
|
+
HEADER_FILENAME,
|
|
271
|
+
HEADER_FORMAT,
|
|
272
|
+
HEADER_FORMAT_VERSION,
|
|
273
|
+
secureStoreDir,
|
|
274
|
+
headerPath,
|
|
275
|
+
buildHeader,
|
|
276
|
+
serializeHeader,
|
|
277
|
+
parseHeader,
|
|
278
|
+
validateHeader,
|
|
279
|
+
verifyKey,
|
|
280
|
+
deriveKeyFromHeader,
|
|
281
|
+
readHeader,
|
|
282
|
+
writeHeader,
|
|
283
|
+
buildHeaderFromPassphrase,
|
|
284
|
+
unlock,
|
|
285
|
+
getKey,
|
|
286
|
+
lock,
|
|
287
|
+
status,
|
|
288
|
+
keyring_exports
|
|
289
|
+
};
|