@remnic/cli 9.55.0 → 9.57.0
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 +292 -139
- package/package.json +31 -31
package/dist/index.js
CHANGED
|
@@ -20,7 +20,7 @@ async function persistEnrichmentCandidate(storage, entityName, candidate) {
|
|
|
20
20
|
// src/index.ts
|
|
21
21
|
import fs15 from "fs";
|
|
22
22
|
import os3 from "os";
|
|
23
|
-
import
|
|
23
|
+
import path18 from "path";
|
|
24
24
|
import { createHash as createHash4 } from "crypto";
|
|
25
25
|
import * as childProcess2 from "child_process";
|
|
26
26
|
import { fileURLToPath as fileURLToPath5 } from "url";
|
|
@@ -6504,8 +6504,158 @@ async function cmdBenchCoding(args) {
|
|
|
6504
6504
|
if (result.exitCode !== 0) process.exitCode = result.exitCode;
|
|
6505
6505
|
}
|
|
6506
6506
|
|
|
6507
|
-
// src/bench-
|
|
6507
|
+
// src/bench-security-commands.ts
|
|
6508
6508
|
import path16 from "path";
|
|
6509
|
+
var DEFAULT_OUTPUT_DIR = path16.join(
|
|
6510
|
+
resolveHomeDir(),
|
|
6511
|
+
".remnic",
|
|
6512
|
+
"bench",
|
|
6513
|
+
"results",
|
|
6514
|
+
"h5-injection-suite"
|
|
6515
|
+
);
|
|
6516
|
+
var BENCH_SECURITY_USAGE = `Usage: remnic bench security injection-suite --seeds N [options]
|
|
6517
|
+
|
|
6518
|
+
H5 injection-suite runner. Resume, host-fault pause, multi-host claim
|
|
6519
|
+
leases, and --limit follow the H6 contract (issue #1963 / PR #2312).
|
|
6520
|
+
|
|
6521
|
+
Options:
|
|
6522
|
+
--seeds N Positive seed count (required)
|
|
6523
|
+
--variants-per-family N Variants per attack family (default: 25)
|
|
6524
|
+
--model-profile ID Profile label recorded on each row (default: local-dry)
|
|
6525
|
+
--executor local|ollama|openai-compat
|
|
6526
|
+
local = deterministic screen/fence (default)
|
|
6527
|
+
ollama = native /api/chat
|
|
6528
|
+
openai-compat = /v1/chat/completions
|
|
6529
|
+
--base-url URL Endpoint (default: http://127.0.0.1:11434)
|
|
6530
|
+
--model NAME Model id (default: qwen3.8-27b-64k:latest)
|
|
6531
|
+
--request-timeout-ms N Per-call timeout (default: 300000)
|
|
6532
|
+
--out DIR New run directory (default: ~/.remnic/bench/results/h5-injection-suite)
|
|
6533
|
+
--run DIR Existing run directory; implies --resume
|
|
6534
|
+
--resume Continue an existing run (required if DIR already has run.json)
|
|
6535
|
+
--limit N Execute at most N planned rows (dry-run / smoke)
|
|
6536
|
+
`;
|
|
6537
|
+
function parsePositiveInteger(raw, flag) {
|
|
6538
|
+
const value = Number(raw);
|
|
6539
|
+
if (!Number.isInteger(value) || value < 1) {
|
|
6540
|
+
throw new Error(`${flag} must be a positive integer`);
|
|
6541
|
+
}
|
|
6542
|
+
return value;
|
|
6543
|
+
}
|
|
6544
|
+
function parseBenchSecurityArgs(args) {
|
|
6545
|
+
if (args.length === 0 || args[0] === "--help" || args[0] === "-h") return { help: true };
|
|
6546
|
+
if (args[0] !== "injection-suite") {
|
|
6547
|
+
throw new Error(`unknown bench security subcommand ${args[0]}`);
|
|
6548
|
+
}
|
|
6549
|
+
let seeds;
|
|
6550
|
+
let variantsPerFamily = 25;
|
|
6551
|
+
let modelProfileId = "local-dry";
|
|
6552
|
+
let outputDir = DEFAULT_OUTPUT_DIR;
|
|
6553
|
+
let resume = false;
|
|
6554
|
+
let limit;
|
|
6555
|
+
let executor = "local";
|
|
6556
|
+
let baseUrl;
|
|
6557
|
+
let model;
|
|
6558
|
+
let requestTimeoutMs;
|
|
6559
|
+
for (let index = 1; index < args.length; index += 1) {
|
|
6560
|
+
const flag = args[index] ?? "";
|
|
6561
|
+
const next = args[index + 1];
|
|
6562
|
+
if (flag === "--seeds") {
|
|
6563
|
+
seeds = parsePositiveInteger(next, "--seeds");
|
|
6564
|
+
index += 1;
|
|
6565
|
+
} else if (flag === "--variants-per-family") {
|
|
6566
|
+
variantsPerFamily = parsePositiveInteger(next, "--variants-per-family");
|
|
6567
|
+
index += 1;
|
|
6568
|
+
} else if (flag === "--model-profile") {
|
|
6569
|
+
if (next === void 0 || next.startsWith("-")) throw new Error("missing value for --model-profile");
|
|
6570
|
+
modelProfileId = next;
|
|
6571
|
+
index += 1;
|
|
6572
|
+
} else if (flag === "--executor") {
|
|
6573
|
+
if (next !== "local" && next !== "ollama" && next !== "openai-compat") {
|
|
6574
|
+
throw new Error("--executor must be local, ollama, or openai-compat");
|
|
6575
|
+
}
|
|
6576
|
+
executor = next;
|
|
6577
|
+
index += 1;
|
|
6578
|
+
} else if (flag === "--base-url") {
|
|
6579
|
+
if (next === void 0 || next.startsWith("-")) throw new Error("missing value for --base-url");
|
|
6580
|
+
baseUrl = next;
|
|
6581
|
+
index += 1;
|
|
6582
|
+
} else if (flag === "--model") {
|
|
6583
|
+
if (next === void 0 || next.startsWith("-")) throw new Error("missing value for --model");
|
|
6584
|
+
model = next;
|
|
6585
|
+
index += 1;
|
|
6586
|
+
} else if (flag === "--request-timeout-ms") {
|
|
6587
|
+
requestTimeoutMs = parsePositiveInteger(next, "--request-timeout-ms");
|
|
6588
|
+
index += 1;
|
|
6589
|
+
} else if (flag === "--out") {
|
|
6590
|
+
if (next === void 0 || next.startsWith("-")) throw new Error("missing value for --out");
|
|
6591
|
+
outputDir = expandTilde(next);
|
|
6592
|
+
index += 1;
|
|
6593
|
+
} else if (flag === "--run") {
|
|
6594
|
+
if (next === void 0 || next.startsWith("-")) throw new Error("missing value for --run");
|
|
6595
|
+
outputDir = expandTilde(next);
|
|
6596
|
+
resume = true;
|
|
6597
|
+
index += 1;
|
|
6598
|
+
} else if (flag === "--resume") {
|
|
6599
|
+
resume = true;
|
|
6600
|
+
} else if (flag === "--limit") {
|
|
6601
|
+
limit = parsePositiveInteger(next, "--limit");
|
|
6602
|
+
index += 1;
|
|
6603
|
+
} else {
|
|
6604
|
+
throw new Error(`unknown option ${flag}`);
|
|
6605
|
+
}
|
|
6606
|
+
}
|
|
6607
|
+
if (seeds === void 0) throw new Error("injection-suite requires --seeds N");
|
|
6608
|
+
return {
|
|
6609
|
+
seeds,
|
|
6610
|
+
variantsPerFamily,
|
|
6611
|
+
modelProfileId,
|
|
6612
|
+
outputDir,
|
|
6613
|
+
resume,
|
|
6614
|
+
executor,
|
|
6615
|
+
...limit === void 0 ? {} : { limit },
|
|
6616
|
+
...baseUrl === void 0 ? {} : { baseUrl },
|
|
6617
|
+
...model === void 0 ? {} : { model },
|
|
6618
|
+
...requestTimeoutMs === void 0 ? {} : { requestTimeoutMs }
|
|
6619
|
+
};
|
|
6620
|
+
}
|
|
6621
|
+
async function cmdBenchSecurity(args) {
|
|
6622
|
+
try {
|
|
6623
|
+
const parsed = parseBenchSecurityArgs(args);
|
|
6624
|
+
if ("help" in parsed) {
|
|
6625
|
+
console.log(BENCH_SECURITY_USAGE);
|
|
6626
|
+
return;
|
|
6627
|
+
}
|
|
6628
|
+
const bench = await loadBenchModule();
|
|
6629
|
+
const run = bench.runInjectionSuiteCliCommand;
|
|
6630
|
+
if (typeof run !== "function") {
|
|
6631
|
+
throw new Error("Installed @remnic/bench is missing runInjectionSuiteCliCommand");
|
|
6632
|
+
}
|
|
6633
|
+
const result = await run({
|
|
6634
|
+
seeds: parsed.seeds,
|
|
6635
|
+
variantsPerFamily: parsed.variantsPerFamily,
|
|
6636
|
+
modelProfileId: parsed.modelProfileId,
|
|
6637
|
+
outputDir: parsed.outputDir,
|
|
6638
|
+
executor: parsed.executor,
|
|
6639
|
+
...parsed.resume ? { resume: true } : {},
|
|
6640
|
+
...parsed.limit === void 0 ? {} : { limit: parsed.limit },
|
|
6641
|
+
...parsed.baseUrl === void 0 ? {} : { baseUrl: parsed.baseUrl },
|
|
6642
|
+
...parsed.model === void 0 ? {} : { model: parsed.model },
|
|
6643
|
+
...parsed.requestTimeoutMs === void 0 ? {} : { requestTimeoutMs: parsed.requestTimeoutMs }
|
|
6644
|
+
});
|
|
6645
|
+
if (result.exitCode === 0) console.log(result.output);
|
|
6646
|
+
else console.error(result.output);
|
|
6647
|
+
if (result.exitCode !== 0) process.exitCode = result.exitCode;
|
|
6648
|
+
} catch (error) {
|
|
6649
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
6650
|
+
console.error(`${message}
|
|
6651
|
+
|
|
6652
|
+
${BENCH_SECURITY_USAGE}`);
|
|
6653
|
+
process.exitCode = 1;
|
|
6654
|
+
}
|
|
6655
|
+
}
|
|
6656
|
+
|
|
6657
|
+
// src/bench-research-commands.ts
|
|
6658
|
+
import path17 from "path";
|
|
6509
6659
|
function emit(result) {
|
|
6510
6660
|
if (result.output) {
|
|
6511
6661
|
console.log(result.output);
|
|
@@ -6523,7 +6673,7 @@ async function runBenchResearchCommand(parsed) {
|
|
|
6523
6673
|
emit(
|
|
6524
6674
|
await runAttributeCliCommand({
|
|
6525
6675
|
runRef: parsed.runRef,
|
|
6526
|
-
resultsDir: parsed.resultsDir ??
|
|
6676
|
+
resultsDir: parsed.resultsDir ?? path17.join(resolveHomeDir(), ".remnic", "bench", "results"),
|
|
6527
6677
|
memoryDir: parsed.memoryDir,
|
|
6528
6678
|
qmdPath: parsed.qmdPath,
|
|
6529
6679
|
collection: parsed.collection,
|
|
@@ -6552,8 +6702,8 @@ async function runBenchResearchCommand(parsed) {
|
|
|
6552
6702
|
|
|
6553
6703
|
// src/bench-usage.ts
|
|
6554
6704
|
function getBenchUsageText() {
|
|
6555
|
-
return `Usage: remnic bench <list|run|published|datasets|runs|compare|results|baseline|export|publish|ui|providers|judge-calibrate|attribute|drift-gen|coding> [options] [benchmark...]
|
|
6556
|
-
remnic benchmark <list|run|published|datasets|runs|compare|results|baseline|export|publish|ui|providers|judge-calibrate|check|report|attribute|drift-gen|coding> [options] [benchmark...]
|
|
6705
|
+
return `Usage: remnic bench <list|run|published|datasets|runs|compare|results|baseline|export|publish|ui|providers|judge-calibrate|attribute|drift-gen|coding|security> [options] [benchmark...]
|
|
6706
|
+
remnic benchmark <list|run|published|datasets|runs|compare|results|baseline|export|publish|ui|providers|judge-calibrate|check|report|attribute|drift-gen|coding|security> [options] [benchmark...]
|
|
6557
6707
|
|
|
6558
6708
|
Commands:
|
|
6559
6709
|
list List published benchmark packs
|
|
@@ -6591,6 +6741,8 @@ Commands:
|
|
|
6591
6741
|
coding H6 synthetic coding benchmark commands
|
|
6592
6742
|
Run \`remnic bench coding --help\` for repo generation,
|
|
6593
6743
|
repeated-failure runs, resume, and offline stats replay
|
|
6744
|
+
security H5 injection-suite runner (resume/pause/--limit)
|
|
6745
|
+
Run \`remnic bench security --help\`
|
|
6594
6746
|
check Legacy latency regression gate (compatibility)
|
|
6595
6747
|
attribute --run <id> [--results-dir <path>] [--memory-dir <path>] [--threshold <value>]
|
|
6596
6748
|
[--qmd <path> --collection <name>]
|
|
@@ -6793,15 +6945,15 @@ registerPublisher("omp", () => new LazyPluginPiPublisher("omp", (mod) => mod.Omp
|
|
|
6793
6945
|
function readCompatEnv(primary, legacy) {
|
|
6794
6946
|
return process.env[primary] ?? process.env[legacy];
|
|
6795
6947
|
}
|
|
6796
|
-
var PID_DIR =
|
|
6797
|
-
var LEGACY_PID_DIR =
|
|
6798
|
-
var PID_FILE =
|
|
6799
|
-
var LEGACY_PID_FILE =
|
|
6800
|
-
var LOG_FILE =
|
|
6801
|
-
var LEGACY_LOG_FILE =
|
|
6802
|
-
var CLI_MODULE_DIR =
|
|
6803
|
-
var CLI_REPO_ROOT =
|
|
6804
|
-
var EVAL_RUNNER_PATH =
|
|
6948
|
+
var PID_DIR = path18.join(resolveHomeDir(), ".remnic");
|
|
6949
|
+
var LEGACY_PID_DIR = path18.join(resolveHomeDir(), ".engram");
|
|
6950
|
+
var PID_FILE = path18.join(PID_DIR, "server.pid");
|
|
6951
|
+
var LEGACY_PID_FILE = path18.join(LEGACY_PID_DIR, "server.pid");
|
|
6952
|
+
var LOG_FILE = path18.join(PID_DIR, "server.log");
|
|
6953
|
+
var LEGACY_LOG_FILE = path18.join(LEGACY_PID_DIR, "server.log");
|
|
6954
|
+
var CLI_MODULE_DIR = path18.dirname(fileURLToPath5(import.meta.url));
|
|
6955
|
+
var CLI_REPO_ROOT = path18.resolve(CLI_MODULE_DIR, "../../..");
|
|
6956
|
+
var EVAL_RUNNER_PATH = path18.join(CLI_REPO_ROOT, "evals", "run.ts");
|
|
6805
6957
|
var OPENCLAW_GATEWAY_LABEL = "ai.openclaw.gateway";
|
|
6806
6958
|
var CLI_SUCCESS_EXIT_GRACE_MS = 5e3;
|
|
6807
6959
|
var CLI_OUTPUT_FLUSH_GRACE_MS = 250;
|
|
@@ -7021,8 +7173,8 @@ async function runBenchViaFallback(parsed, benchmarkId, runtimeProfile) {
|
|
|
7021
7173
|
process.exit(1);
|
|
7022
7174
|
}
|
|
7023
7175
|
const tsxCandidates = [
|
|
7024
|
-
|
|
7025
|
-
|
|
7176
|
+
path18.join(CLI_REPO_ROOT, "node_modules", ".bin", "tsx"),
|
|
7177
|
+
path18.join(CLI_REPO_ROOT, "packages", "remnic-cli", "node_modules", ".bin", "tsx")
|
|
7026
7178
|
];
|
|
7027
7179
|
const tsxCmd = tsxCandidates.find((candidate) => fs15.existsSync(candidate)) ?? "tsx";
|
|
7028
7180
|
const fallbackOutputDir = createFallbackBenchOutputDir(
|
|
@@ -7041,7 +7193,7 @@ async function runBenchViaFallback(parsed, benchmarkId, runtimeProfile) {
|
|
|
7041
7193
|
return resolveFallbackBenchResultPath(fallbackOutputDir);
|
|
7042
7194
|
}
|
|
7043
7195
|
function resolveBenchOutputDir() {
|
|
7044
|
-
return
|
|
7196
|
+
return path18.join(resolveHomeDir(), ".remnic", "bench", "results");
|
|
7045
7197
|
}
|
|
7046
7198
|
var DOWNLOADABLE_BENCHMARK_DATASETS = [
|
|
7047
7199
|
"ama-bench",
|
|
@@ -7086,8 +7238,8 @@ var MEMORY_AGENT_BENCH_SPLIT_FILENAMES = [
|
|
|
7086
7238
|
];
|
|
7087
7239
|
var MEMORY_AGENT_BENCH_ENTITY_MAPPING_CANDIDATES = [
|
|
7088
7240
|
"entity2id.json",
|
|
7089
|
-
|
|
7090
|
-
|
|
7241
|
+
path18.join("processed_data", "Recsys_Redial", "entity2id.json"),
|
|
7242
|
+
path18.join("Recsys_Redial", "entity2id.json")
|
|
7091
7243
|
];
|
|
7092
7244
|
var DOWNLOADED_DATASET_MARKERS = {
|
|
7093
7245
|
"ama-bench": { anyOf: ["open_end_qa_set.jsonl"] },
|
|
@@ -7162,7 +7314,7 @@ var PERSONAMEM_DATASET_FILE_CANDIDATES = [
|
|
|
7162
7314
|
"benchmark/benchmark.csv",
|
|
7163
7315
|
"benchmark.csv"
|
|
7164
7316
|
];
|
|
7165
|
-
var PERSONAMEM_COMPLETION_MARKER =
|
|
7317
|
+
var PERSONAMEM_COMPLETION_MARKER = path18.join(
|
|
7166
7318
|
"data",
|
|
7167
7319
|
"chat_history_32k",
|
|
7168
7320
|
".download-complete"
|
|
@@ -7170,10 +7322,10 @@ var PERSONAMEM_COMPLETION_MARKER = path17.join(
|
|
|
7170
7322
|
function resolveRealpathWithinDataset(datasetPath, relativePath) {
|
|
7171
7323
|
try {
|
|
7172
7324
|
const datasetRoot = fs15.realpathSync(datasetPath);
|
|
7173
|
-
const candidatePath =
|
|
7325
|
+
const candidatePath = path18.resolve(datasetRoot, relativePath);
|
|
7174
7326
|
const candidateRealPath = fs15.realpathSync(candidatePath);
|
|
7175
|
-
const relativeToRoot =
|
|
7176
|
-
if (relativeToRoot.startsWith("..") ||
|
|
7327
|
+
const relativeToRoot = path18.relative(datasetRoot, candidateRealPath);
|
|
7328
|
+
if (relativeToRoot.startsWith("..") || path18.isAbsolute(relativeToRoot)) {
|
|
7177
7329
|
return null;
|
|
7178
7330
|
}
|
|
7179
7331
|
return candidateRealPath;
|
|
@@ -7229,7 +7381,7 @@ function parseCsvRows(raw) {
|
|
|
7229
7381
|
}
|
|
7230
7382
|
function isPersonaMemDatasetComplete(datasetPath) {
|
|
7231
7383
|
try {
|
|
7232
|
-
const completionMarkerPath =
|
|
7384
|
+
const completionMarkerPath = path18.join(datasetPath, PERSONAMEM_COMPLETION_MARKER);
|
|
7233
7385
|
if (fs15.statSync(completionMarkerPath).isFile()) {
|
|
7234
7386
|
return true;
|
|
7235
7387
|
}
|
|
@@ -7237,7 +7389,7 @@ function isPersonaMemDatasetComplete(datasetPath) {
|
|
|
7237
7389
|
}
|
|
7238
7390
|
const datasetFile = PERSONAMEM_DATASET_FILE_CANDIDATES.find((candidate) => {
|
|
7239
7391
|
try {
|
|
7240
|
-
return fs15.statSync(
|
|
7392
|
+
return fs15.statSync(path18.join(datasetPath, candidate)).isFile();
|
|
7241
7393
|
} catch {
|
|
7242
7394
|
return false;
|
|
7243
7395
|
}
|
|
@@ -7246,7 +7398,7 @@ function isPersonaMemDatasetComplete(datasetPath) {
|
|
|
7246
7398
|
return false;
|
|
7247
7399
|
}
|
|
7248
7400
|
try {
|
|
7249
|
-
const rows = parseCsvRows(fs15.readFileSync(
|
|
7401
|
+
const rows = parseCsvRows(fs15.readFileSync(path18.join(datasetPath, datasetFile), "utf8"));
|
|
7250
7402
|
if (rows.length < 2) {
|
|
7251
7403
|
return false;
|
|
7252
7404
|
}
|
|
@@ -7269,14 +7421,14 @@ function isPersonaMemDatasetComplete(datasetPath) {
|
|
|
7269
7421
|
}
|
|
7270
7422
|
function hasDatasetFile(datasetPath, relativePath) {
|
|
7271
7423
|
try {
|
|
7272
|
-
return fs15.statSync(
|
|
7424
|
+
return fs15.statSync(path18.join(datasetPath, relativePath)).isFile();
|
|
7273
7425
|
} catch {
|
|
7274
7426
|
return false;
|
|
7275
7427
|
}
|
|
7276
7428
|
}
|
|
7277
7429
|
function hasMemoryAgentBenchEntityMapping(datasetPath) {
|
|
7278
|
-
const absoluteDatasetPath =
|
|
7279
|
-
const roots = [absoluteDatasetPath,
|
|
7430
|
+
const absoluteDatasetPath = path18.resolve(datasetPath);
|
|
7431
|
+
const roots = [absoluteDatasetPath, path18.dirname(absoluteDatasetPath)];
|
|
7280
7432
|
return hasDatasetFile(absoluteDatasetPath, "entity2id.json") || roots.some(
|
|
7281
7433
|
(root) => MEMORY_AGENT_BENCH_ENTITY_MAPPING_CANDIDATES.filter((relativePath) => relativePath !== "entity2id.json").some((relativePath) => hasDatasetFile(root, relativePath))
|
|
7282
7434
|
);
|
|
@@ -7287,7 +7439,7 @@ function memoryAgentBenchDatasetHasRecSysSamples(datasetPath) {
|
|
|
7287
7439
|
...MEMORY_AGENT_BENCH_SPLIT_FILENAMES
|
|
7288
7440
|
];
|
|
7289
7441
|
return candidateFilenames.some((filename) => {
|
|
7290
|
-
const filePath =
|
|
7442
|
+
const filePath = path18.join(datasetPath, filename);
|
|
7291
7443
|
try {
|
|
7292
7444
|
if (!fs15.statSync(filePath).isFile()) {
|
|
7293
7445
|
return false;
|
|
@@ -7326,7 +7478,7 @@ function isDatasetDownloaded(datasetPath, benchmarkId) {
|
|
|
7326
7478
|
if (marker.allOf) {
|
|
7327
7479
|
const hasAllRequiredFiles = marker.allOf.every((name) => {
|
|
7328
7480
|
try {
|
|
7329
|
-
return fs15.statSync(
|
|
7481
|
+
return fs15.statSync(path18.join(datasetPath, name)).isFile();
|
|
7330
7482
|
} catch {
|
|
7331
7483
|
return false;
|
|
7332
7484
|
}
|
|
@@ -7338,7 +7490,7 @@ function isDatasetDownloaded(datasetPath, benchmarkId) {
|
|
|
7338
7490
|
if (marker.anyOf) {
|
|
7339
7491
|
const hasMarkerFile = marker.anyOf.some((name) => {
|
|
7340
7492
|
try {
|
|
7341
|
-
return fs15.statSync(
|
|
7493
|
+
return fs15.statSync(path18.join(datasetPath, name)).isFile();
|
|
7342
7494
|
} catch {
|
|
7343
7495
|
return false;
|
|
7344
7496
|
}
|
|
@@ -7366,9 +7518,9 @@ function isDatasetDownloaded(datasetPath, benchmarkId) {
|
|
|
7366
7518
|
return false;
|
|
7367
7519
|
}
|
|
7368
7520
|
async function launchBenchUi(resultsDir) {
|
|
7369
|
-
const benchUiDir =
|
|
7521
|
+
const benchUiDir = path18.join(CLI_REPO_ROOT, "packages", "bench-ui");
|
|
7370
7522
|
const pnpmCmd = process.platform === "win32" ? "pnpm.cmd" : "pnpm";
|
|
7371
|
-
if (!fs15.existsSync(
|
|
7523
|
+
if (!fs15.existsSync(path18.join(benchUiDir, "package.json"))) {
|
|
7372
7524
|
console.error("ERROR: @remnic/bench-ui is not available in this checkout.");
|
|
7373
7525
|
process.exit(1);
|
|
7374
7526
|
}
|
|
@@ -7395,24 +7547,24 @@ async function launchBenchUi(resultsDir) {
|
|
|
7395
7547
|
});
|
|
7396
7548
|
}
|
|
7397
7549
|
function resolveRepoDatasetRoot() {
|
|
7398
|
-
const repoCandidate =
|
|
7550
|
+
const repoCandidate = path18.join(CLI_REPO_ROOT, "evals", "datasets");
|
|
7399
7551
|
if (isRepoCheckout()) {
|
|
7400
7552
|
return repoCandidate;
|
|
7401
7553
|
}
|
|
7402
|
-
return
|
|
7554
|
+
return path18.join(resolveHomeDir(), ".remnic", "bench", "datasets");
|
|
7403
7555
|
}
|
|
7404
7556
|
function listDownloadableBenchmarks() {
|
|
7405
7557
|
return [...DOWNLOADABLE_BENCHMARK_DATASETS];
|
|
7406
7558
|
}
|
|
7407
7559
|
function resolveDatasetDownloadScriptPath() {
|
|
7408
|
-
const bundled =
|
|
7560
|
+
const bundled = path18.join(CLI_MODULE_DIR, "assets", "download-datasets.sh");
|
|
7409
7561
|
if (fs15.existsSync(bundled)) {
|
|
7410
7562
|
return bundled;
|
|
7411
7563
|
}
|
|
7412
|
-
return
|
|
7564
|
+
return path18.join(CLI_REPO_ROOT, "evals", "scripts", "download-datasets.sh");
|
|
7413
7565
|
}
|
|
7414
7566
|
function isRepoCheckout() {
|
|
7415
|
-
return fs15.existsSync(
|
|
7567
|
+
return fs15.existsSync(path18.join(CLI_REPO_ROOT, "pnpm-workspace.yaml")) && fs15.existsSync(path18.join(CLI_REPO_ROOT, "evals", "scripts", "download-datasets.sh"));
|
|
7416
7568
|
}
|
|
7417
7569
|
function runDatasetDownloadScript(scriptPath, benchmarkId, datasetRoot, jsonMode) {
|
|
7418
7570
|
const stdio = jsonMode ? ["inherit", process.stderr, "inherit"] : "inherit";
|
|
@@ -7463,7 +7615,7 @@ function resolveBenchDatasetDir(benchmarkId, quick, datasetDirOverride) {
|
|
|
7463
7615
|
if (quick) {
|
|
7464
7616
|
return void 0;
|
|
7465
7617
|
}
|
|
7466
|
-
const datasetDir =
|
|
7618
|
+
const datasetDir = path18.join(resolveRepoDatasetRoot(), benchmarkId);
|
|
7467
7619
|
if (isDatasetDownloaded(datasetDir, benchmarkId)) {
|
|
7468
7620
|
return datasetDir;
|
|
7469
7621
|
}
|
|
@@ -7720,12 +7872,12 @@ async function exportBenchPackageResult(parsed) {
|
|
|
7720
7872
|
process.exit(1);
|
|
7721
7873
|
}
|
|
7722
7874
|
const result = await loadBenchmarkResult(summary.path);
|
|
7723
|
-
const reportCardProvenance = parsed.format === "html" ? await loadBenchmarkReportCardProvenance(
|
|
7875
|
+
const reportCardProvenance = parsed.format === "html" ? await loadBenchmarkReportCardProvenance(path18.dirname(summary.path), result.meta.id) : void 0;
|
|
7724
7876
|
const rendered = renderBenchmarkResultExport(result, parsed.format, {
|
|
7725
7877
|
...reportCardProvenance ? { reportCardProvenance } : {}
|
|
7726
7878
|
});
|
|
7727
7879
|
if (parsed.output) {
|
|
7728
|
-
fs15.mkdirSync(
|
|
7880
|
+
fs15.mkdirSync(path18.dirname(parsed.output), { recursive: true });
|
|
7729
7881
|
fs15.writeFileSync(parsed.output, rendered);
|
|
7730
7882
|
console.log(`Exported ${summary.id} as ${parsed.format} to ${parsed.output}`);
|
|
7731
7883
|
return;
|
|
@@ -7743,7 +7895,7 @@ async function manageBenchDatasets(parsed) {
|
|
|
7743
7895
|
process.exit(1);
|
|
7744
7896
|
}
|
|
7745
7897
|
const status = supported.map((benchmarkId) => {
|
|
7746
|
-
const datasetPath =
|
|
7898
|
+
const datasetPath = path18.join(datasetRoot, benchmarkId);
|
|
7747
7899
|
return {
|
|
7748
7900
|
benchmark: benchmarkId,
|
|
7749
7901
|
downloaded: isDatasetDownloaded(datasetPath, benchmarkId),
|
|
@@ -7781,7 +7933,7 @@ async function manageBenchDatasets(parsed) {
|
|
|
7781
7933
|
runDatasetDownloadScript(scriptPath, benchmarkId, datasetRoot, parsed.json === true);
|
|
7782
7934
|
downloaded.push({
|
|
7783
7935
|
benchmark: benchmarkId,
|
|
7784
|
-
path:
|
|
7936
|
+
path: path18.join(datasetRoot, benchmarkId)
|
|
7785
7937
|
});
|
|
7786
7938
|
}
|
|
7787
7939
|
if (parsed.json) {
|
|
@@ -7920,10 +8072,10 @@ async function calibrateBenchJudges(parsed, rawArgs) {
|
|
|
7920
8072
|
}
|
|
7921
8073
|
const bench = await loadBenchModule();
|
|
7922
8074
|
const resultsDir = expandTilde(
|
|
7923
|
-
parsed.resultsDir ??
|
|
8075
|
+
parsed.resultsDir ?? path18.join(resolveHomeDir(), ".remnic", "bench", "results")
|
|
7924
8076
|
);
|
|
7925
8077
|
const calibrationDir = expandTilde(
|
|
7926
|
-
parsed.calibrationDir ??
|
|
8078
|
+
parsed.calibrationDir ?? path18.join(resolveHomeDir(), ".remnic", "bench", "calibration")
|
|
7927
8079
|
);
|
|
7928
8080
|
const stored = await bench.listBenchmarkResults(resultsDir);
|
|
7929
8081
|
const allForBenchmark = stored.filter((entry) => entry.benchmark === benchmarkId);
|
|
@@ -8483,7 +8635,7 @@ async function loadPublishedPromotionHelpers() {
|
|
|
8483
8635
|
return {
|
|
8484
8636
|
async promoteArtifactsToPublished(args) {
|
|
8485
8637
|
const { mkdirSync, readFileSync: readFileSync4, writeFileSync } = await import("fs");
|
|
8486
|
-
const
|
|
8638
|
+
const path19 = await import("path");
|
|
8487
8639
|
mkdirSync(args.publishedOutDir, { recursive: true });
|
|
8488
8640
|
if (args.artifactPaths.length === 0) {
|
|
8489
8641
|
console.warn(
|
|
@@ -8500,13 +8652,13 @@ async function loadPublishedPromotionHelpers() {
|
|
|
8500
8652
|
const modelSlug = args.model.replace(/[^a-zA-Z0-9_.-]/g, "-");
|
|
8501
8653
|
const rawProfile = parsedObj.config?.runtimeProfile;
|
|
8502
8654
|
const profileSlug = typeof rawProfile === "string" && rawProfile.length > 0 ? `-${rawProfile.replace(/[^a-zA-Z0-9_.-]/g, "-")}` : "";
|
|
8503
|
-
const target =
|
|
8655
|
+
const target = path19.join(
|
|
8504
8656
|
args.publishedOutDir,
|
|
8505
8657
|
`${today}-${args.benchmarkId}-${modelSlug}${profileSlug}-${gitShaShort}.json`
|
|
8506
8658
|
);
|
|
8507
8659
|
writeFileSync(target, raw, "utf8");
|
|
8508
8660
|
console.log(
|
|
8509
|
-
`[bench published] Promoted ${
|
|
8661
|
+
`[bench published] Promoted ${path19.basename(artifactPath)} \u2192 ${target}`
|
|
8510
8662
|
);
|
|
8511
8663
|
}
|
|
8512
8664
|
void benchModule;
|
|
@@ -8613,7 +8765,7 @@ async function runBenchViaPackage(parsed, benchmarkId, runtimeProfile, benchStat
|
|
|
8613
8765
|
const previousCodexDiagnosticsDir = process.env[CODEX_CLI_BENCH_DIAGNOSTICS_DIR_ENV];
|
|
8614
8766
|
const previousCodexDiagnosticsMode = process.env[CODEX_CLI_BENCH_DIAGNOSTICS_MODE_ENV];
|
|
8615
8767
|
if (!previousCodexDiagnosticsDir) {
|
|
8616
|
-
process.env[CODEX_CLI_BENCH_DIAGNOSTICS_DIR_ENV] =
|
|
8768
|
+
process.env[CODEX_CLI_BENCH_DIAGNOSTICS_DIR_ENV] = path18.join(
|
|
8617
8769
|
outputDir,
|
|
8618
8770
|
"codex-cli-diagnostics"
|
|
8619
8771
|
);
|
|
@@ -8763,7 +8915,7 @@ async function preparePersistedJudgeCalibrationAttachment(benchModule, benchmark
|
|
|
8763
8915
|
);
|
|
8764
8916
|
}
|
|
8765
8917
|
const calibrationDir = expandTilde(
|
|
8766
|
-
calibrationBinding.calibrationDir ??
|
|
8918
|
+
calibrationBinding.calibrationDir ?? path18.join(resolveHomeDir(), ".remnic", "bench", "calibration")
|
|
8767
8919
|
);
|
|
8768
8920
|
const state = await benchModule.loadJudgeCalibrationState?.(benchmarkId, calibrationDir);
|
|
8769
8921
|
if (!state) {
|
|
@@ -9134,19 +9286,19 @@ function loadConvergeCommandConfig() {
|
|
|
9134
9286
|
return loadStandaloneConvergeCommandConfig();
|
|
9135
9287
|
}
|
|
9136
9288
|
function resolveConfigPath(cliPath) {
|
|
9137
|
-
if (cliPath) return
|
|
9289
|
+
if (cliPath) return path18.resolve(expandTilde(cliPath));
|
|
9138
9290
|
const envPath = readCompatEnv("REMNIC_CONFIG_PATH", "ENGRAM_CONFIG_PATH");
|
|
9139
|
-
if (envPath) return
|
|
9291
|
+
if (envPath) return path18.resolve(expandTilde(envPath));
|
|
9140
9292
|
const candidates = [
|
|
9141
|
-
|
|
9142
|
-
|
|
9143
|
-
|
|
9144
|
-
|
|
9293
|
+
path18.join(process.cwd(), "remnic.config.json"),
|
|
9294
|
+
path18.join(process.cwd(), "engram.config.json"),
|
|
9295
|
+
path18.join(resolveHomeDir(), ".config", "remnic", "config.json"),
|
|
9296
|
+
path18.join(resolveHomeDir(), ".config", "engram", "config.json")
|
|
9145
9297
|
];
|
|
9146
9298
|
for (const candidate of candidates) {
|
|
9147
9299
|
if (fs15.existsSync(candidate)) return candidate;
|
|
9148
9300
|
}
|
|
9149
|
-
return
|
|
9301
|
+
return path18.join(resolveHomeDir(), ".config", "remnic", "config.json");
|
|
9150
9302
|
}
|
|
9151
9303
|
function resolveExistingBenchRemnicConfigPath(cliPath) {
|
|
9152
9304
|
const configPath = resolveConfigPath(cliPath);
|
|
@@ -9260,7 +9412,7 @@ async function resolvePackageBenchRuntime(benchModule, parsed, runtimeProfile) {
|
|
|
9260
9412
|
);
|
|
9261
9413
|
}
|
|
9262
9414
|
function normalizeMemoryDirPath(memoryDir) {
|
|
9263
|
-
return
|
|
9415
|
+
return path18.resolve(expandTilde(memoryDir));
|
|
9264
9416
|
}
|
|
9265
9417
|
function resolveMemoryDir() {
|
|
9266
9418
|
const configMemoryDir = (() => {
|
|
@@ -9273,9 +9425,9 @@ function resolveMemoryDir() {
|
|
|
9273
9425
|
return normalizeMemoryDirPath(remnicCfg.memoryDir);
|
|
9274
9426
|
}
|
|
9275
9427
|
const home = resolveHomeDir();
|
|
9276
|
-
const standalonePath =
|
|
9277
|
-
const legacyStandalonePath =
|
|
9278
|
-
const openclawPath =
|
|
9428
|
+
const standalonePath = path18.join(home, ".remnic", "memory");
|
|
9429
|
+
const legacyStandalonePath = path18.join(home, ".engram", "memory");
|
|
9430
|
+
const openclawPath = path18.join(resolveOpenclawStateDir(), "workspace", "memory", "local");
|
|
9279
9431
|
if (fs15.existsSync(standalonePath)) return standalonePath;
|
|
9280
9432
|
if (fs15.existsSync(legacyStandalonePath)) return legacyStandalonePath;
|
|
9281
9433
|
return openclawPath;
|
|
@@ -9324,21 +9476,21 @@ function resolveFlagStrict(args, flag) {
|
|
|
9324
9476
|
var REMNIC_OPENCLAW_LEGACY_PLUGIN_ID = "openclaw-engram";
|
|
9325
9477
|
function resolveOpenclawStateDir() {
|
|
9326
9478
|
const configuredStateDir = process.env.OPENCLAW_STATE_DIR?.trim();
|
|
9327
|
-
return configuredStateDir ?
|
|
9479
|
+
return configuredStateDir ? path18.resolve(expandTilde(configuredStateDir)) : path18.join(resolveHomeDir(), ".openclaw");
|
|
9328
9480
|
}
|
|
9329
9481
|
var DEFAULT_OPENCLAW_CONFIG_PATHS_FOR_DOCTOR = [
|
|
9330
9482
|
process.env.OPENCLAW_CONFIG_PATH,
|
|
9331
9483
|
process.env.OPENCLAW_ENGRAM_CONFIG_PATH,
|
|
9332
|
-
|
|
9484
|
+
path18.join(resolveOpenclawStateDir(), "openclaw.json")
|
|
9333
9485
|
].filter(Boolean);
|
|
9334
9486
|
function resolveOpenclawConfigPath(cliPath) {
|
|
9335
|
-
if (cliPath) return
|
|
9487
|
+
if (cliPath) return path18.resolve(expandTilde(cliPath));
|
|
9336
9488
|
const envPath = process.env.OPENCLAW_CONFIG_PATH || process.env.OPENCLAW_ENGRAM_CONFIG_PATH;
|
|
9337
|
-
if (envPath) return
|
|
9489
|
+
if (envPath) return path18.resolve(expandTilde(envPath));
|
|
9338
9490
|
for (const candidate of DEFAULT_OPENCLAW_CONFIG_PATHS_FOR_DOCTOR) {
|
|
9339
9491
|
if (fs15.existsSync(candidate)) return candidate;
|
|
9340
9492
|
}
|
|
9341
|
-
return
|
|
9493
|
+
return path18.join(resolveOpenclawStateDir(), "openclaw.json");
|
|
9342
9494
|
}
|
|
9343
9495
|
function readOpenclawConfig(configPath) {
|
|
9344
9496
|
if (!fs15.existsSync(configPath)) return {};
|
|
@@ -9397,10 +9549,10 @@ function buildRemnicOpenclawHooksPolicy(legacyHooks, existingHooks) {
|
|
|
9397
9549
|
function resolveOpenclawInstallMemoryDir(args) {
|
|
9398
9550
|
const existingMemoryDir = (typeof args.existingNewEntryConfig.memoryDir === "string" ? args.existingNewEntryConfig.memoryDir : void 0) || (args.migrateLegacy && typeof args.legacyConfigToMerge.memoryDir === "string" ? args.legacyConfigToMerge.memoryDir : void 0);
|
|
9399
9551
|
if (args.requestedMemoryDir) {
|
|
9400
|
-
return
|
|
9552
|
+
return path18.resolve(expandTilde(args.requestedMemoryDir));
|
|
9401
9553
|
}
|
|
9402
9554
|
if (existingMemoryDir) {
|
|
9403
|
-
return
|
|
9555
|
+
return path18.resolve(expandTilde(existingMemoryDir));
|
|
9404
9556
|
}
|
|
9405
9557
|
return args.fallbackMemoryDir;
|
|
9406
9558
|
}
|
|
@@ -9418,21 +9570,21 @@ function resolveCurrentOpenclawMemoryDir(entries, slots, fallbackMemoryDir) {
|
|
|
9418
9570
|
if (!config || typeof config !== "object" || Array.isArray(config)) continue;
|
|
9419
9571
|
const memoryDir = config.memoryDir;
|
|
9420
9572
|
if (typeof memoryDir === "string" && memoryDir.trim().length > 0) {
|
|
9421
|
-
return
|
|
9573
|
+
return path18.resolve(expandTilde(memoryDir));
|
|
9422
9574
|
}
|
|
9423
9575
|
}
|
|
9424
9576
|
return fallbackMemoryDir;
|
|
9425
9577
|
}
|
|
9426
9578
|
function resolveOpenclawPluginDir(cliPath) {
|
|
9427
|
-
if (cliPath) return
|
|
9579
|
+
if (cliPath) return path18.resolve(expandTilde(cliPath));
|
|
9428
9580
|
return resolveOpenclawManagedPluginDir();
|
|
9429
9581
|
}
|
|
9430
9582
|
function resolveOpenclawManagedPluginDir() {
|
|
9431
|
-
return
|
|
9583
|
+
return path18.join(resolveOpenclawStateDir(), "extensions", REMNIC_OPENCLAW_PLUGIN_ID);
|
|
9432
9584
|
}
|
|
9433
9585
|
function resolveOpenclawLegacyPluginDir(cliPath) {
|
|
9434
|
-
if (cliPath) return
|
|
9435
|
-
return
|
|
9586
|
+
if (cliPath) return path18.resolve(expandTilde(cliPath));
|
|
9587
|
+
return path18.join(resolveOpenclawStateDir(), "extensions", REMNIC_OPENCLAW_LEGACY_PLUGIN_ID);
|
|
9436
9588
|
}
|
|
9437
9589
|
function formatOpenclawUpgradeStamp(now = /* @__PURE__ */ new Date()) {
|
|
9438
9590
|
const yyyy = now.getFullYear().toString();
|
|
@@ -9445,7 +9597,7 @@ function formatOpenclawUpgradeStamp(now = /* @__PURE__ */ new Date()) {
|
|
|
9445
9597
|
}
|
|
9446
9598
|
function backupPathIfPresent(sourcePath, backupPath) {
|
|
9447
9599
|
if (!fs15.existsSync(sourcePath)) return false;
|
|
9448
|
-
fs15.mkdirSync(
|
|
9600
|
+
fs15.mkdirSync(path18.dirname(backupPath), { recursive: true });
|
|
9449
9601
|
fs15.cpSync(sourcePath, backupPath, { recursive: true });
|
|
9450
9602
|
return true;
|
|
9451
9603
|
}
|
|
@@ -9464,7 +9616,7 @@ function restartOpenclawGateway() {
|
|
|
9464
9616
|
});
|
|
9465
9617
|
}
|
|
9466
9618
|
function cmdInit() {
|
|
9467
|
-
const configPath =
|
|
9619
|
+
const configPath = path18.join(process.cwd(), "remnic.config.json");
|
|
9468
9620
|
if (fs15.existsSync(configPath)) {
|
|
9469
9621
|
console.log(`Config already exists: ${configPath}`);
|
|
9470
9622
|
return;
|
|
@@ -9472,7 +9624,7 @@ function cmdInit() {
|
|
|
9472
9624
|
const template = {
|
|
9473
9625
|
remnic: {
|
|
9474
9626
|
openaiApiKey: "${OPENAI_API_KEY}",
|
|
9475
|
-
memoryDir:
|
|
9627
|
+
memoryDir: path18.join(process.cwd(), ".remnic", "memory"),
|
|
9476
9628
|
memoryOsPreset: "balanced"
|
|
9477
9629
|
},
|
|
9478
9630
|
server: {
|
|
@@ -9609,7 +9761,7 @@ function oauthResolveOperatorToken() {
|
|
|
9609
9761
|
}
|
|
9610
9762
|
return void 0;
|
|
9611
9763
|
}
|
|
9612
|
-
async function oauthFetch(method,
|
|
9764
|
+
async function oauthFetch(method, path19, token, body) {
|
|
9613
9765
|
const controller = new AbortController();
|
|
9614
9766
|
const timeoutId = setTimeout(() => controller.abort(), 5e3);
|
|
9615
9767
|
try {
|
|
@@ -9628,7 +9780,7 @@ async function oauthFetch(method, path18, token, body) {
|
|
|
9628
9780
|
if (body !== void 0) {
|
|
9629
9781
|
init.body = JSON.stringify(body);
|
|
9630
9782
|
}
|
|
9631
|
-
const response = await fetch(`${oauthResolveBaseUrl()}${
|
|
9783
|
+
const response = await fetch(`${oauthResolveBaseUrl()}${path19}`, init);
|
|
9632
9784
|
if (response.status === 401) {
|
|
9633
9785
|
throw new Error(
|
|
9634
9786
|
"operator token rejected by remnic-server (HTTP 401). Update `server.authToken` or `REMNIC_AUTH_TOKEN` to match the running daemon."
|
|
@@ -10183,7 +10335,7 @@ async function cmdVersions(rest) {
|
|
|
10183
10335
|
console.error("Usage: remnic versions list <page-path>");
|
|
10184
10336
|
process.exit(1);
|
|
10185
10337
|
}
|
|
10186
|
-
const absPath =
|
|
10338
|
+
const absPath = path18.resolve(pagePath);
|
|
10187
10339
|
const history = await listVersions(absPath, versioningConfig, memDir);
|
|
10188
10340
|
if (json) {
|
|
10189
10341
|
console.log(JSON.stringify(history, null, 2));
|
|
@@ -10208,7 +10360,7 @@ async function cmdVersions(rest) {
|
|
|
10208
10360
|
console.error("Usage: remnic versions show <page-path> <version-id>");
|
|
10209
10361
|
process.exit(1);
|
|
10210
10362
|
}
|
|
10211
|
-
const absPath =
|
|
10363
|
+
const absPath = path18.resolve(pagePath);
|
|
10212
10364
|
try {
|
|
10213
10365
|
const content = await getVersion(absPath, versionId, versioningConfig, memDir);
|
|
10214
10366
|
console.log(content);
|
|
@@ -10226,7 +10378,7 @@ async function cmdVersions(rest) {
|
|
|
10226
10378
|
console.error("Usage: remnic versions diff <page-path> <v1> <v2>");
|
|
10227
10379
|
process.exit(1);
|
|
10228
10380
|
}
|
|
10229
|
-
const absPath =
|
|
10381
|
+
const absPath = path18.resolve(pagePath);
|
|
10230
10382
|
try {
|
|
10231
10383
|
const diffOutput = await diffVersions(absPath, v1, v2, versioningConfig, memDir);
|
|
10232
10384
|
console.log(diffOutput);
|
|
@@ -10243,7 +10395,7 @@ async function cmdVersions(rest) {
|
|
|
10243
10395
|
console.error("Usage: remnic versions revert <page-path> <version-id>");
|
|
10244
10396
|
process.exit(1);
|
|
10245
10397
|
}
|
|
10246
|
-
const absPath =
|
|
10398
|
+
const absPath = path18.resolve(pagePath);
|
|
10247
10399
|
try {
|
|
10248
10400
|
const version = await revertToVersion(absPath, versionId, versioningConfig, void 0, memDir);
|
|
10249
10401
|
if (json) {
|
|
@@ -10283,7 +10435,7 @@ async function cmdEnrich(rest) {
|
|
|
10283
10435
|
const subcommand = rest[0];
|
|
10284
10436
|
if (subcommand === "audit") {
|
|
10285
10437
|
const memoryDir2 = expandTilde(config.memoryDir);
|
|
10286
|
-
const auditDir2 =
|
|
10438
|
+
const auditDir2 = path18.join(memoryDir2, "enrichment");
|
|
10287
10439
|
const sinceFlag = resolveFlag(rest.slice(1), "--since");
|
|
10288
10440
|
const entries = await readAuditLog(auditDir2, sinceFlag ?? void 0);
|
|
10289
10441
|
if (entries.length === 0) {
|
|
@@ -10408,7 +10560,7 @@ Registered providers:`);
|
|
|
10408
10560
|
return;
|
|
10409
10561
|
}
|
|
10410
10562
|
const memoryDir = expandTilde(config.memoryDir);
|
|
10411
|
-
const auditDir =
|
|
10563
|
+
const auditDir = path18.join(memoryDir, "enrichment");
|
|
10412
10564
|
let totalPersisted = 0;
|
|
10413
10565
|
for (const result of results) {
|
|
10414
10566
|
for (const candidate of result.acceptedCandidates) {
|
|
@@ -10599,7 +10751,7 @@ Root: ${root}`);
|
|
|
10599
10751
|
const validNames = new Set(extensions.map((e) => e.name));
|
|
10600
10752
|
let errors = 0;
|
|
10601
10753
|
for (const entry of entries) {
|
|
10602
|
-
const entryPath =
|
|
10754
|
+
const entryPath = path18.join(root, entry);
|
|
10603
10755
|
try {
|
|
10604
10756
|
if (!fs15.statSync(entryPath).isDirectory()) continue;
|
|
10605
10757
|
} catch {
|
|
@@ -10715,7 +10867,7 @@ async function cmdBriefing(rest) {
|
|
|
10715
10867
|
const saveDir = resolveBriefingSaveDir(config.briefing.saveDir);
|
|
10716
10868
|
fs15.mkdirSync(saveDir, { recursive: true });
|
|
10717
10869
|
const filename = briefingFilename(new Date(result.window.to), format);
|
|
10718
|
-
const filePath =
|
|
10870
|
+
const filePath = path18.join(saveDir, filename);
|
|
10719
10871
|
fs15.writeFileSync(filePath, payload + (payload.endsWith("\n") ? "" : "\n"));
|
|
10720
10872
|
console.error(`Saved briefing: ${filePath}`);
|
|
10721
10873
|
} catch (err) {
|
|
@@ -10871,7 +11023,7 @@ async function cmdDoctor() {
|
|
|
10871
11023
|
const rawMemoryDir = entryConfig?.memoryDir;
|
|
10872
11024
|
const configuredMemoryDir = typeof rawMemoryDir === "string" ? rawMemoryDir : void 0;
|
|
10873
11025
|
if (configuredMemoryDir) {
|
|
10874
|
-
const resolvedMemDir =
|
|
11026
|
+
const resolvedMemDir = path18.resolve(expandTilde(configuredMemoryDir));
|
|
10875
11027
|
let memDirOk = false;
|
|
10876
11028
|
let memDirDetail = `${resolvedMemDir} (not found)`;
|
|
10877
11029
|
let memDirRemediation = `Run \`remnic openclaw install --memory-dir "${resolvedMemDir}"\` to create the directory.`;
|
|
@@ -11071,7 +11223,7 @@ async function cmdMigrate(json, rollback) {
|
|
|
11071
11223
|
console.log(` Rollback: ${result.rollbackCommand}`);
|
|
11072
11224
|
}
|
|
11073
11225
|
function cmdOnboard(dirPath, json) {
|
|
11074
|
-
const directory =
|
|
11226
|
+
const directory = path18.resolve(dirPath || process.cwd());
|
|
11075
11227
|
const result = onboard({ directory });
|
|
11076
11228
|
if (json) {
|
|
11077
11229
|
console.log(JSON.stringify(result, null, 2));
|
|
@@ -11090,7 +11242,7 @@ Suggested namespace: ${result.plan.suggestedNamespace}`);
|
|
|
11090
11242
|
async function cmdCurate(targetPath, json) {
|
|
11091
11243
|
const memoryDir = resolveMemoryDir();
|
|
11092
11244
|
const result = await curate({
|
|
11093
|
-
targetPath:
|
|
11245
|
+
targetPath: path18.resolve(targetPath),
|
|
11094
11246
|
memoryDir,
|
|
11095
11247
|
source: "curation",
|
|
11096
11248
|
checkDuplicates: true,
|
|
@@ -11220,7 +11372,7 @@ async function cmdSync(action, rest, json) {
|
|
|
11220
11372
|
}
|
|
11221
11373
|
function localOfflineSourceId(memoryDir) {
|
|
11222
11374
|
const host = os3.hostname() || "unknown-host";
|
|
11223
|
-
const dirHash = createHash4("sha256").update(
|
|
11375
|
+
const dirHash = createHash4("sha256").update(path18.resolve(memoryDir)).digest("hex").slice(0, 16);
|
|
11224
11376
|
return `remnic-local:${host}:${dirHash}`;
|
|
11225
11377
|
}
|
|
11226
11378
|
function normalizeOfflineRemoteUrl(raw) {
|
|
@@ -11618,10 +11770,10 @@ var OFFLINE_SYNC_CONTENT_MISSING_RETRY_MAX = 3;
|
|
|
11618
11770
|
var OFFLINE_SYNC_CONTENT_MISSING_RETRY_DELAY_MS = 250;
|
|
11619
11771
|
var OfflineRemoteFileChangedError = class extends Error {
|
|
11620
11772
|
path;
|
|
11621
|
-
constructor(
|
|
11622
|
-
super(`remote file changed while fetching offline content: ${
|
|
11773
|
+
constructor(path19) {
|
|
11774
|
+
super(`remote file changed while fetching offline content: ${path19}`);
|
|
11623
11775
|
this.name = "OfflineRemoteFileChangedError";
|
|
11624
|
-
this.path =
|
|
11776
|
+
this.path = path19;
|
|
11625
11777
|
}
|
|
11626
11778
|
};
|
|
11627
11779
|
function isOfflineRemoteFileChangedError(error) {
|
|
@@ -11882,7 +12034,7 @@ async function pushOfflineFileContentFromChunkReader(args) {
|
|
|
11882
12034
|
}
|
|
11883
12035
|
const hash = createHash4("sha256");
|
|
11884
12036
|
const chunks = args.readFileChunks({
|
|
11885
|
-
root:
|
|
12037
|
+
root: path18.resolve(args.memoryDir),
|
|
11886
12038
|
path: args.file.path,
|
|
11887
12039
|
filePath,
|
|
11888
12040
|
chunkSize: OFFLINE_SYNC_FILE_CONTENT_UPLOAD_CHUNK_BYTES
|
|
@@ -12992,7 +13144,7 @@ Environment fallbacks:
|
|
|
12992
13144
|
REMNIC_OFFLINE_REMOTE_URL, REMNIC_OFFLINE_TOKEN, REMNIC_AUTH_TOKEN`);
|
|
12993
13145
|
return;
|
|
12994
13146
|
}
|
|
12995
|
-
const memoryDir =
|
|
13147
|
+
const memoryDir = path18.resolve(expandTilde(resolveRequiredValueFlag(rest, "--memory-dir") ?? resolveMemoryDir()));
|
|
12996
13148
|
const namespace = resolveRequiredValueFlag(rest, "--namespace");
|
|
12997
13149
|
const includeTranscripts = !hasFlag(rest, "--no-transcripts");
|
|
12998
13150
|
const stateOverride = resolveRequiredValueFlag(rest, "--state");
|
|
@@ -13012,7 +13164,7 @@ Environment fallbacks:
|
|
|
13012
13164
|
const needsRemote = action === "prepare" || action === "sync" || action === "watch";
|
|
13013
13165
|
const remoteUrl = needsRemote ? resolveOfflineRemoteUrl(rest) : resolveOptionalOfflineRemoteUrl(rest);
|
|
13014
13166
|
const token = needsRemote ? resolveOfflineToken(rest) : void 0;
|
|
13015
|
-
const statePath = statePathExplicit ?
|
|
13167
|
+
const statePath = statePathExplicit ? path18.resolve(expandTilde(stateOverride)) : remoteUrl !== void 0 ? defaultOfflineSyncStatePath(memoryDir, remoteUrl, namespace) : void 0;
|
|
13016
13168
|
if (action === "prepare") {
|
|
13017
13169
|
if (!remoteUrl || !token || !statePath) throw new Error("offline prepare requires remote URL and token");
|
|
13018
13170
|
fs15.mkdirSync(memoryDir, { recursive: true });
|
|
@@ -13194,11 +13346,11 @@ Environment fallbacks:
|
|
|
13194
13346
|
failures: result.largeFilePushFailures
|
|
13195
13347
|
});
|
|
13196
13348
|
largeFileFailureCounts = advanced.counts;
|
|
13197
|
-
for (const
|
|
13198
|
-
if (skippedLargeFiles.has(
|
|
13199
|
-
skippedLargeFiles.add(
|
|
13349
|
+
for (const path19 of advanced.newlySkipped) {
|
|
13350
|
+
if (skippedLargeFiles.has(path19)) continue;
|
|
13351
|
+
skippedLargeFiles.add(path19);
|
|
13200
13352
|
console.warn(
|
|
13201
|
-
`offline sync: permanently skipping ${
|
|
13353
|
+
`offline sync: permanently skipping ${path19} after ${OFFLINE_LARGE_FILE_SKIP_AFTER_FAILURES} failed large-file pushes for this watcher process (see issue #1786; use --exclude or offlineSyncExcludes to silence permanently)`
|
|
13202
13354
|
);
|
|
13203
13355
|
}
|
|
13204
13356
|
const pulled = result.pull ? result.pull.upserted + result.pull.deleted : 0;
|
|
@@ -13213,11 +13365,11 @@ Environment fallbacks:
|
|
|
13213
13365
|
failures: error.failures
|
|
13214
13366
|
});
|
|
13215
13367
|
largeFileFailureCounts = advanced.counts;
|
|
13216
|
-
for (const
|
|
13217
|
-
if (skippedLargeFiles.has(
|
|
13218
|
-
skippedLargeFiles.add(
|
|
13368
|
+
for (const path19 of advanced.newlySkipped) {
|
|
13369
|
+
if (skippedLargeFiles.has(path19)) continue;
|
|
13370
|
+
skippedLargeFiles.add(path19);
|
|
13219
13371
|
console.warn(
|
|
13220
|
-
`offline sync: permanently skipping ${
|
|
13372
|
+
`offline sync: permanently skipping ${path19} after ${OFFLINE_LARGE_FILE_SKIP_AFTER_FAILURES} failed large-file pushes for this watcher process (see issue #1786; use --exclude or offlineSyncExcludes to silence permanently)`
|
|
13221
13373
|
);
|
|
13222
13374
|
}
|
|
13223
13375
|
}
|
|
@@ -13358,7 +13510,7 @@ async function cmdConnectors(action, rest, json) {
|
|
|
13358
13510
|
const connectorDaemonUrl = typeof effectiveConnectorConfig.remnicDaemonUrl === "string" && effectiveConnectorConfig.remnicDaemonUrl.trim().length > 0 ? effectiveConnectorConfig.remnicDaemonUrl.trim() : void 0;
|
|
13359
13511
|
const pubResult = await pub.publish({
|
|
13360
13512
|
config: { memoryDir, namespace: connectorNamespace, daemonUrl: connectorDaemonUrl },
|
|
13361
|
-
skillsRoot:
|
|
13513
|
+
skillsRoot: path18.join(memoryDir, "skills"),
|
|
13362
13514
|
rollbackTokenEntry: preInstallTokenEntry,
|
|
13363
13515
|
log: { info: console.log, warn: console.warn, error: console.error }
|
|
13364
13516
|
});
|
|
@@ -13718,15 +13870,15 @@ async function cmdConnectorsMarketplace(subAction, rest, json) {
|
|
|
13718
13870
|
}
|
|
13719
13871
|
const manifest = generateMarketplaceManifest();
|
|
13720
13872
|
await writeMarketplaceManifest(outputDir, manifest);
|
|
13721
|
-
const outPath =
|
|
13873
|
+
const outPath = path18.join(outputDir, "marketplace.json");
|
|
13722
13874
|
if (json) {
|
|
13723
13875
|
console.log(JSON.stringify({ status: "generated", path: outPath }, null, 2));
|
|
13724
13876
|
} else {
|
|
13725
13877
|
console.log(`Generated marketplace.json at ${outPath}`);
|
|
13726
13878
|
}
|
|
13727
13879
|
} else if (subAction === "validate") {
|
|
13728
|
-
const targetPath = rest.filter((a) => !a.startsWith("--"))[0] ??
|
|
13729
|
-
const resolved =
|
|
13880
|
+
const targetPath = rest.filter((a) => !a.startsWith("--"))[0] ?? path18.join(process.cwd(), "marketplace.json");
|
|
13881
|
+
const resolved = path18.resolve(targetPath);
|
|
13730
13882
|
if (!fs15.existsSync(resolved)) {
|
|
13731
13883
|
console.error(`File not found: ${resolved}`);
|
|
13732
13884
|
process.exit(1);
|
|
@@ -14009,6 +14161,7 @@ async function cmdLegacyBenchmark(action, rest, json) {
|
|
|
14009
14161
|
}
|
|
14010
14162
|
async function cmdBench(rest) {
|
|
14011
14163
|
if (rest[0] === "coding") return cmdBenchCoding(rest.slice(1));
|
|
14164
|
+
if (rest[0] === "security") return cmdBenchSecurity(rest.slice(1));
|
|
14012
14165
|
if (rest[0] === "procedural-ablation") {
|
|
14013
14166
|
await cmdBenchProceduralAblation(rest.slice(1));
|
|
14014
14167
|
return;
|
|
@@ -14135,7 +14288,7 @@ async function cmdBench(rest) {
|
|
|
14135
14288
|
}
|
|
14136
14289
|
const completeCount = prevStatus.benchmarks.filter((b) => b.status === "complete").length;
|
|
14137
14290
|
const failedCount = prevStatus.benchmarks.filter((b) => b.status === "failed").length;
|
|
14138
|
-
printBenchStatusLine(parsed.json, `Resuming from: ${
|
|
14291
|
+
printBenchStatusLine(parsed.json, `Resuming from: ${path18.basename(latestStatusPath)}`);
|
|
14139
14292
|
printBenchStatusLine(parsed.json, ` Previous run: ${prevStatus.startedAt}`);
|
|
14140
14293
|
printBenchStatusLine(parsed.json, ` Benchmarks: ${prevStatus.benchmarks.length} total, ${completeCount} complete, ${failedCount} failed`);
|
|
14141
14294
|
const before = selectedBenchmarks.length;
|
|
@@ -14303,9 +14456,9 @@ Options:
|
|
|
14303
14456
|
);
|
|
14304
14457
|
process.exit(1);
|
|
14305
14458
|
} else {
|
|
14306
|
-
fixturePath =
|
|
14459
|
+
fixturePath = path18.resolve(expandTilde(fixturePathRaw));
|
|
14307
14460
|
}
|
|
14308
|
-
const outPath =
|
|
14461
|
+
const outPath = path18.resolve(expandTilde(outPathRaw));
|
|
14309
14462
|
const benchModule = await loadBenchModule();
|
|
14310
14463
|
const runner = benchModule.runProceduralAblationCli;
|
|
14311
14464
|
if (typeof runner !== "function") {
|
|
@@ -14324,7 +14477,7 @@ Options:
|
|
|
14324
14477
|
);
|
|
14325
14478
|
console.log(`wrote ${outPath}`);
|
|
14326
14479
|
}
|
|
14327
|
-
var LOGS_DIR =
|
|
14480
|
+
var LOGS_DIR = path18.join(PID_DIR, "logs");
|
|
14328
14481
|
var LAUNCHD_PLIST_PATHS = launchdPlistPaths(resolveHomeDir());
|
|
14329
14482
|
var [LAUNCHD_PLIST_PATH] = LAUNCHD_PLIST_PATHS;
|
|
14330
14483
|
var SYSTEMD_UNIT_PATHS = systemdUnitPaths(resolveHomeDir());
|
|
@@ -14401,7 +14554,7 @@ function selectLaunchdInspection(openclawPluginModeConfigured) {
|
|
|
14401
14554
|
for (const plistPath of LAUNCHD_PLIST_PATHS.slice(1)) {
|
|
14402
14555
|
const legacy = inspectLaunchdPlist(plistPath);
|
|
14403
14556
|
if (!legacy.installed) continue;
|
|
14404
|
-
const label =
|
|
14557
|
+
const label = path18.basename(plistPath, ".plist");
|
|
14405
14558
|
return legacy.ok ? {
|
|
14406
14559
|
...legacy,
|
|
14407
14560
|
warn: true,
|
|
@@ -14435,10 +14588,10 @@ function daemonInstall() {
|
|
|
14435
14588
|
const vars = { HOME: home, NODE_PATH: nodePath, REMNIC_SERVER_BIN: serverBin };
|
|
14436
14589
|
fs15.mkdirSync(LOGS_DIR, { recursive: true });
|
|
14437
14590
|
if (isMacOS()) {
|
|
14438
|
-
const templatePath =
|
|
14591
|
+
const templatePath = path18.resolve(import.meta.dirname, "../templates/launchd/ai.remnic.daemon.plist");
|
|
14439
14592
|
const template = fs15.readFileSync(templatePath, "utf8");
|
|
14440
14593
|
const plist = renderTemplate(template, vars);
|
|
14441
|
-
fs15.mkdirSync(
|
|
14594
|
+
fs15.mkdirSync(path18.dirname(LAUNCHD_PLIST_PATH), { recursive: true });
|
|
14442
14595
|
fs15.writeFileSync(LAUNCHD_PLIST_PATH, plist);
|
|
14443
14596
|
try {
|
|
14444
14597
|
launchdLoadPlist(LAUNCHD_PLIST_PATH);
|
|
@@ -14455,10 +14608,10 @@ function daemonInstall() {
|
|
|
14455
14608
|
console.log(` RunAtLoad: true, KeepAlive: true`);
|
|
14456
14609
|
console.log(` Logs: ${LOGS_DIR}/daemon.log`);
|
|
14457
14610
|
} else if (isLinux()) {
|
|
14458
|
-
const templatePath =
|
|
14611
|
+
const templatePath = path18.resolve(import.meta.dirname, "../templates/systemd/remnic.service");
|
|
14459
14612
|
const template = fs15.readFileSync(templatePath, "utf8");
|
|
14460
14613
|
const unit = renderTemplate(template, vars);
|
|
14461
|
-
fs15.mkdirSync(
|
|
14614
|
+
fs15.mkdirSync(path18.dirname(SYSTEMD_UNIT_PATH), { recursive: true });
|
|
14462
14615
|
fs15.writeFileSync(SYSTEMD_UNIT_PATH, unit);
|
|
14463
14616
|
try {
|
|
14464
14617
|
childProcess2.execSync("systemctl --user daemon-reload", { stdio: "pipe" });
|
|
@@ -14937,7 +15090,7 @@ Clean complete: cleaned=${result.cleaned}`
|
|
|
14937
15090
|
}
|
|
14938
15091
|
async function cmdOpenclawInstall(opts) {
|
|
14939
15092
|
const configPath = resolveOpenclawConfigPath(opts.configPath);
|
|
14940
|
-
const fallbackMemoryDir =
|
|
15093
|
+
const fallbackMemoryDir = path18.join(resolveOpenclawStateDir(), "workspace", "memory", "local");
|
|
14941
15094
|
console.log(`OpenClaw config: ${configPath}`);
|
|
14942
15095
|
const existingConfig = readOpenclawConfig(configPath);
|
|
14943
15096
|
const { plugins, entries, slots } = parseOpenclawPluginState(existingConfig, configPath);
|
|
@@ -15040,7 +15193,7 @@ Remove it first and re-run, or choose a different path with --memory-dir.`
|
|
|
15040
15193
|
fs15.mkdirSync(memoryDir, { recursive: true });
|
|
15041
15194
|
console.log(`Created memory directory: ${memoryDir}`);
|
|
15042
15195
|
}
|
|
15043
|
-
const configDir =
|
|
15196
|
+
const configDir = path18.dirname(configPath);
|
|
15044
15197
|
if (!fs15.existsSync(configDir)) {
|
|
15045
15198
|
fs15.mkdirSync(configDir, { recursive: true });
|
|
15046
15199
|
}
|
|
@@ -15069,12 +15222,12 @@ async function cmdOpenclawUpgrade(opts) {
|
|
|
15069
15222
|
const pluginDir = resolveOpenclawPluginDir(opts.pluginDir);
|
|
15070
15223
|
const managedTargetDir = resolveOpenclawManagedPluginDir();
|
|
15071
15224
|
const legacyPluginDirForBackup = opts.legacyPluginDirForBackup ? resolveOpenclawLegacyPluginDir(opts.legacyPluginDirForBackup) : void 0;
|
|
15072
|
-
const fallbackMemoryDir =
|
|
15225
|
+
const fallbackMemoryDir = path18.join(resolveOpenclawStateDir(), "workspace", "memory", "local");
|
|
15073
15226
|
const packageSpec = buildOpenclawManagedUpgradePackageSpec(opts.version);
|
|
15074
15227
|
const configExistedBefore = fs15.existsSync(configPath);
|
|
15075
15228
|
const existingConfig = readOpenclawConfig(configPath);
|
|
15076
15229
|
const { entries, slots } = parseOpenclawPluginState(existingConfig, configPath);
|
|
15077
|
-
const preservedMemoryDir = opts.memoryDir ?
|
|
15230
|
+
const preservedMemoryDir = opts.memoryDir ? path18.resolve(expandTilde(opts.memoryDir)) : resolveCurrentOpenclawMemoryDir(entries, slots, fallbackMemoryDir);
|
|
15078
15231
|
console.log(`OpenClaw config: ${configPath}`);
|
|
15079
15232
|
console.log(`Plugin dir: ${pluginDir}`);
|
|
15080
15233
|
if (legacyPluginDirForBackup) {
|
|
@@ -15082,7 +15235,7 @@ async function cmdOpenclawUpgrade(opts) {
|
|
|
15082
15235
|
}
|
|
15083
15236
|
console.log(`Memory dir: ${preservedMemoryDir}`);
|
|
15084
15237
|
console.log(`Package spec: ${packageSpec}`);
|
|
15085
|
-
console.log(`Backup root: ${
|
|
15238
|
+
console.log(`Backup root: ${path18.join(resolveOpenclawStateDir(), "backups")}`);
|
|
15086
15239
|
const plannedActions = [
|
|
15087
15240
|
`backup openclaw.json and the existing ${REMNIC_OPENCLAW_PLUGIN_ID} extension`,
|
|
15088
15241
|
...legacyPluginDirForBackup ? [`backup the existing ${REMNIC_OPENCLAW_LEGACY_PLUGIN_ID} extension without modifying it`] : [],
|
|
@@ -15120,9 +15273,9 @@ async function cmdOpenclawUpgrade(opts) {
|
|
|
15120
15273
|
assertDirectoryPathOrMissing(legacyPluginDirForBackup, "Legacy OpenClaw plugin dir");
|
|
15121
15274
|
}
|
|
15122
15275
|
const backupDir = createOpenclawUpgradeBackupDir();
|
|
15123
|
-
const configBackupPath =
|
|
15124
|
-
const pluginBackupDir =
|
|
15125
|
-
const legacyPluginBackupDir = legacyPluginDirForBackup ?
|
|
15276
|
+
const configBackupPath = path18.join(backupDir, "openclaw.json");
|
|
15277
|
+
const pluginBackupDir = path18.join(backupDir, "extensions", REMNIC_OPENCLAW_PLUGIN_ID);
|
|
15278
|
+
const legacyPluginBackupDir = legacyPluginDirForBackup ? path18.join(backupDir, "extensions", REMNIC_OPENCLAW_LEGACY_PLUGIN_ID) : void 0;
|
|
15126
15279
|
const backupNotes = [];
|
|
15127
15280
|
if (backupPathIfPresent(configPath, configBackupPath)) {
|
|
15128
15281
|
backupNotes.push(`+ Backed up config to ${configBackupPath}`);
|
|
@@ -15172,7 +15325,7 @@ async function cmdOpenclawUpgrade(opts) {
|
|
|
15172
15325
|
const managedRollbackDir = publishedInstallError ? publishedInstallError.managedRollbackDir : installResult?.managedRollbackDir;
|
|
15173
15326
|
const managedRollbackTargetDir = publishedInstallError?.managedRollbackTargetDir ?? installResult?.managedRollbackTargetDir ?? managedTargetDir;
|
|
15174
15327
|
const requiresHostManagedRestore = publishedInstallError?.requiresHostManagedRestore ?? installResult?.requiresHostManagedRestore ?? false;
|
|
15175
|
-
const managedRollbackSharesPluginDir = managedRollbackDir &&
|
|
15328
|
+
const managedRollbackSharesPluginDir = managedRollbackDir && path18.resolve(managedRollbackTargetDir) === path18.resolve(pluginDir);
|
|
15176
15329
|
const pluginRollbackDir = managedRollbackSharesPluginDir ? requiresHostManagedRestore ? rollbackDir : rollbackDir ?? managedRollbackDir : rollbackDir;
|
|
15177
15330
|
const shouldRestorePlugin = Boolean(
|
|
15178
15331
|
installResult && !requiresHostManagedRestore || pluginRollbackDir || publishedInstallError?.shouldRestoreBackup
|
|
@@ -15229,7 +15382,7 @@ async function cmdOpenclawUpgrade(opts) {
|
|
|
15229
15382
|
rollbackErrors.push(error);
|
|
15230
15383
|
}
|
|
15231
15384
|
if (pendingConfigRestoreError) rollbackErrors.push(pendingConfigRestoreError);
|
|
15232
|
-
if (managedRollbackDir &&
|
|
15385
|
+
if (managedRollbackDir && path18.resolve(managedRollbackTargetDir) !== path18.resolve(pluginDir) && !requiresHostManagedRestore) {
|
|
15233
15386
|
try {
|
|
15234
15387
|
rollbackNotes.push(
|
|
15235
15388
|
...rollbackOpenclawUpgrade({
|
|
@@ -15295,9 +15448,9 @@ async function cmdOpenclawMigrateEngram(opts) {
|
|
|
15295
15448
|
console.log(" - Re-apply any local source patches to the new package only after verifying the published build.");
|
|
15296
15449
|
}
|
|
15297
15450
|
function createOpenclawUpgradeBackupDir() {
|
|
15298
|
-
const backupsRoot =
|
|
15451
|
+
const backupsRoot = path18.join(resolveOpenclawStateDir(), "backups");
|
|
15299
15452
|
fs15.mkdirSync(backupsRoot, { recursive: true });
|
|
15300
|
-
return fs15.mkdtempSync(
|
|
15453
|
+
return fs15.mkdtempSync(path18.join(backupsRoot, `remnic-openclaw-upgrade-${formatOpenclawUpgradeStamp()}-`));
|
|
15301
15454
|
}
|
|
15302
15455
|
async function cmdTaxonomy(rest) {
|
|
15303
15456
|
initLogger3();
|
|
@@ -15339,8 +15492,8 @@ async function cmdTaxonomy(rest) {
|
|
|
15339
15492
|
const doc = generateResolverDocument(taxonomy);
|
|
15340
15493
|
console.log(doc);
|
|
15341
15494
|
if (config.taxonomyAutoGenResolver) {
|
|
15342
|
-
const resolverPath =
|
|
15343
|
-
fs15.mkdirSync(
|
|
15495
|
+
const resolverPath = path18.join(config.memoryDir, ".taxonomy", "RESOLVER.md");
|
|
15496
|
+
fs15.mkdirSync(path18.dirname(resolverPath), { recursive: true });
|
|
15344
15497
|
fs15.writeFileSync(resolverPath, doc);
|
|
15345
15498
|
console.error(`Written: ${resolverPath}`);
|
|
15346
15499
|
}
|
|
@@ -15386,7 +15539,7 @@ async function cmdTaxonomy(rest) {
|
|
|
15386
15539
|
console.log(`Added category "${id}" (${name}).`);
|
|
15387
15540
|
if (config.taxonomyAutoGenResolver) {
|
|
15388
15541
|
const doc = generateResolverDocument(taxonomy);
|
|
15389
|
-
const resolverPath =
|
|
15542
|
+
const resolverPath = path18.join(config.memoryDir, ".taxonomy", "RESOLVER.md");
|
|
15390
15543
|
fs15.writeFileSync(resolverPath, doc);
|
|
15391
15544
|
console.error(`Regenerated: ${resolverPath}`);
|
|
15392
15545
|
}
|
|
@@ -15417,7 +15570,7 @@ async function cmdTaxonomy(rest) {
|
|
|
15417
15570
|
console.log(`Removed category "${id}".`);
|
|
15418
15571
|
if (config.taxonomyAutoGenResolver) {
|
|
15419
15572
|
const doc = generateResolverDocument(taxonomy);
|
|
15420
|
-
const resolverPath =
|
|
15573
|
+
const resolverPath = path18.join(config.memoryDir, ".taxonomy", "RESOLVER.md");
|
|
15421
15574
|
fs15.writeFileSync(resolverPath, doc);
|
|
15422
15575
|
console.error(`Regenerated: ${resolverPath}`);
|
|
15423
15576
|
}
|
|
@@ -15699,7 +15852,7 @@ async function runTrainingExport(args, stdout = process.stdout) {
|
|
|
15699
15852
|
);
|
|
15700
15853
|
}
|
|
15701
15854
|
const formatted = adapter.formatRecords(records);
|
|
15702
|
-
const outDir =
|
|
15855
|
+
const outDir = path18.dirname(args.output);
|
|
15703
15856
|
fs15.mkdirSync(outDir, { recursive: true });
|
|
15704
15857
|
const tmpPath = `${args.output}.tmp-${process.pid}-${Date.now()}`;
|
|
15705
15858
|
fs15.writeFileSync(tmpPath, formatted, "utf-8");
|
|
@@ -15810,7 +15963,7 @@ async function main(argv = process.argv.slice(2)) {
|
|
|
15810
15963
|
case "tree": {
|
|
15811
15964
|
const subAction = rest[0];
|
|
15812
15965
|
const json = rest.includes("--json");
|
|
15813
|
-
const outputDir = resolveFlag(rest, "--output") ??
|
|
15966
|
+
const outputDir = resolveFlag(rest, "--output") ?? path18.join(process.cwd(), ".remnic", "context-tree");
|
|
15814
15967
|
const categoriesFlag = resolveFlag(rest, "--categories");
|
|
15815
15968
|
const categories = categoriesFlag ? categoriesFlag.split(",") : void 0;
|
|
15816
15969
|
const maxPerCategoryRaw = resolveFlag(rest, "--max-per-category");
|
|
@@ -15887,7 +16040,7 @@ async function main(argv = process.argv.slice(2)) {
|
|
|
15887
16040
|
console.error(`Context tree not found at ${treeDir}. Run 'remnic tree generate' first.`);
|
|
15888
16041
|
process.exit(1);
|
|
15889
16042
|
}
|
|
15890
|
-
const indexPath =
|
|
16043
|
+
const indexPath = path18.join(treeDir, "INDEX.md");
|
|
15891
16044
|
if (!fs15.existsSync(indexPath)) {
|
|
15892
16045
|
console.error(`INDEX.md missing in ${treeDir}. Tree may be corrupt \u2014 regenerate.`);
|
|
15893
16046
|
process.exit(1);
|
|
@@ -16358,9 +16511,9 @@ Usage:
|
|
|
16358
16511
|
remnic extensions <list|show|validate|reload> Manage memory extensions
|
|
16359
16512
|
remnic space <list|switch|create|delete|push|pull|share|promote|audit> Manage spaces
|
|
16360
16513
|
create accepts --parent <id> to set parent-child relationship
|
|
16361
|
-
remnic bench <list|run|published|datasets|runs|compare|results|baseline|export|publish|ui|providers|judge-calibrate|attribute|drift-gen|coding> [benchmark...] [--quick] [--all] [--dataset-dir <path>] [--results-dir <path>] [--baselines-dir <path>] [--threshold <value>] [--detail] [--format <json|csv|html>] [--output <path>] [--target remnic-ai] [--json]
|
|
16514
|
+
remnic bench <list|run|published|datasets|runs|compare|results|baseline|export|publish|ui|providers|judge-calibrate|attribute|drift-gen|coding|security> [benchmark...] [--quick] [--all] [--dataset-dir <path>] [--results-dir <path>] [--baselines-dir <path>] [--threshold <value>] [--detail] [--format <json|csv|html>] [--output <path>] [--target remnic-ai] [--json]
|
|
16362
16515
|
benchmark is kept as a compatibility alias. check/report remain under that alias.
|
|
16363
|
-
remnic benchmark <list|run|datasets|runs|compare|results|baseline|export|publish|ui|providers|check|report|attribute|drift-gen|coding> [queries...] [--explain] [--baseline=<path>] [--report=<path>]
|
|
16516
|
+
remnic benchmark <list|run|datasets|runs|compare|results|baseline|export|publish|ui|providers|check|report|attribute|drift-gen|coding|security> [queries...] [--explain] [--baseline=<path>] [--report=<path>]
|
|
16364
16517
|
remnic briefing [--since <window>] [--focus <filter>] [--save] [--format markdown|json]
|
|
16365
16518
|
Daily context briefing. Windows: yesterday, today, NNh, NNd, NNw.
|
|
16366
16519
|
Focus: person:<name>, project:<name>, topic:<name>.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remnic/cli",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.57.0",
|
|
4
4
|
"description": "CLI for Remnic memory — init, query, doctor, daemon management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -26,25 +26,25 @@
|
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"yaml": "^2.4.2",
|
|
29
|
-
"@remnic/plugin-pi": "^9.
|
|
30
|
-
"@remnic/server": "^9.
|
|
31
|
-
"@remnic/core": "^9.
|
|
29
|
+
"@remnic/plugin-pi": "^9.57.0",
|
|
30
|
+
"@remnic/server": "^9.57.0",
|
|
31
|
+
"@remnic/core": "^9.57.0"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
|
-
"@remnic/bench": "^9.
|
|
35
|
-
"@remnic/plugin-openclaw": "^9.
|
|
36
|
-
"@remnic/export-weclone": "^9.
|
|
37
|
-
"@remnic/import-weclone": "^9.
|
|
38
|
-
"@remnic/import-chatgpt": "^9.
|
|
39
|
-
"@remnic/import-claude": "^9.
|
|
40
|
-
"@remnic/import-gemini": "^9.
|
|
41
|
-
"@remnic/import-lossless-claw": "^9.
|
|
42
|
-
"@remnic/import-mem0": "^9.
|
|
43
|
-
"@remnic/import-supermemory": "^9.
|
|
44
|
-
"@remnic/connector-limitless": "^9.
|
|
45
|
-
"@remnic/connector-bee": "^9.
|
|
46
|
-
"@remnic/connector-omi": "^9.
|
|
47
|
-
"@remnic/capture-audio": "^9.
|
|
34
|
+
"@remnic/bench": "^9.57.0",
|
|
35
|
+
"@remnic/plugin-openclaw": "^9.57.0",
|
|
36
|
+
"@remnic/export-weclone": "^9.57.0",
|
|
37
|
+
"@remnic/import-weclone": "^9.57.0",
|
|
38
|
+
"@remnic/import-chatgpt": "^9.57.0",
|
|
39
|
+
"@remnic/import-claude": "^9.57.0",
|
|
40
|
+
"@remnic/import-gemini": "^9.57.0",
|
|
41
|
+
"@remnic/import-lossless-claw": "^9.57.0",
|
|
42
|
+
"@remnic/import-mem0": "^9.57.0",
|
|
43
|
+
"@remnic/import-supermemory": "^9.57.0",
|
|
44
|
+
"@remnic/connector-limitless": "^9.57.0",
|
|
45
|
+
"@remnic/connector-bee": "^9.57.0",
|
|
46
|
+
"@remnic/connector-omi": "^9.57.0",
|
|
47
|
+
"@remnic/capture-audio": "^9.57.0"
|
|
48
48
|
},
|
|
49
49
|
"peerDependenciesMeta": {
|
|
50
50
|
"@remnic/bench": {
|
|
@@ -93,19 +93,19 @@
|
|
|
93
93
|
"devDependencies": {
|
|
94
94
|
"tsup": "^8.5.1",
|
|
95
95
|
"typescript": "^5.9.3",
|
|
96
|
-
"@remnic/
|
|
97
|
-
"@remnic/
|
|
98
|
-
"@remnic/export-weclone": "9.
|
|
99
|
-
"@remnic/import-
|
|
100
|
-
"@remnic/import-
|
|
101
|
-
"@remnic/import-
|
|
102
|
-
"@remnic/import-gemini": "9.
|
|
103
|
-
"@remnic/import-
|
|
104
|
-
"@remnic/import-
|
|
105
|
-
"@remnic/connector-limitless": "9.
|
|
106
|
-
"@remnic/
|
|
107
|
-
"@remnic/
|
|
108
|
-
"@remnic/connector-omi": "9.
|
|
96
|
+
"@remnic/plugin-openclaw": "9.57.0",
|
|
97
|
+
"@remnic/bench": "9.57.0",
|
|
98
|
+
"@remnic/export-weclone": "9.57.0",
|
|
99
|
+
"@remnic/import-weclone": "9.57.0",
|
|
100
|
+
"@remnic/import-chatgpt": "9.57.0",
|
|
101
|
+
"@remnic/import-claude": "9.57.0",
|
|
102
|
+
"@remnic/import-gemini": "9.57.0",
|
|
103
|
+
"@remnic/import-supermemory": "9.57.0",
|
|
104
|
+
"@remnic/import-mem0": "9.57.0",
|
|
105
|
+
"@remnic/connector-limitless": "9.57.0",
|
|
106
|
+
"@remnic/import-lossless-claw": "9.57.0",
|
|
107
|
+
"@remnic/connector-bee": "9.57.0",
|
|
108
|
+
"@remnic/connector-omi": "9.57.0"
|
|
109
109
|
},
|
|
110
110
|
"license": "MIT",
|
|
111
111
|
"repository": {
|