@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.
Files changed (2) hide show
  1. package/dist/index.js +292 -139
  2. 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 path17 from "path";
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-research-commands.ts
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 ?? path16.join(resolveHomeDir(), ".remnic", "bench", "results"),
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 = path17.join(resolveHomeDir(), ".remnic");
6797
- var LEGACY_PID_DIR = path17.join(resolveHomeDir(), ".engram");
6798
- var PID_FILE = path17.join(PID_DIR, "server.pid");
6799
- var LEGACY_PID_FILE = path17.join(LEGACY_PID_DIR, "server.pid");
6800
- var LOG_FILE = path17.join(PID_DIR, "server.log");
6801
- var LEGACY_LOG_FILE = path17.join(LEGACY_PID_DIR, "server.log");
6802
- var CLI_MODULE_DIR = path17.dirname(fileURLToPath5(import.meta.url));
6803
- var CLI_REPO_ROOT = path17.resolve(CLI_MODULE_DIR, "../../..");
6804
- var EVAL_RUNNER_PATH = path17.join(CLI_REPO_ROOT, "evals", "run.ts");
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
- path17.join(CLI_REPO_ROOT, "node_modules", ".bin", "tsx"),
7025
- path17.join(CLI_REPO_ROOT, "packages", "remnic-cli", "node_modules", ".bin", "tsx")
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 path17.join(resolveHomeDir(), ".remnic", "bench", "results");
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
- path17.join("processed_data", "Recsys_Redial", "entity2id.json"),
7090
- path17.join("Recsys_Redial", "entity2id.json")
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 = path17.join(
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 = path17.resolve(datasetRoot, relativePath);
7325
+ const candidatePath = path18.resolve(datasetRoot, relativePath);
7174
7326
  const candidateRealPath = fs15.realpathSync(candidatePath);
7175
- const relativeToRoot = path17.relative(datasetRoot, candidateRealPath);
7176
- if (relativeToRoot.startsWith("..") || path17.isAbsolute(relativeToRoot)) {
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 = path17.join(datasetPath, PERSONAMEM_COMPLETION_MARKER);
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(path17.join(datasetPath, candidate)).isFile();
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(path17.join(datasetPath, datasetFile), "utf8"));
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(path17.join(datasetPath, relativePath)).isFile();
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 = path17.resolve(datasetPath);
7279
- const roots = [absoluteDatasetPath, path17.dirname(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 = path17.join(datasetPath, filename);
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(path17.join(datasetPath, name)).isFile();
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(path17.join(datasetPath, name)).isFile();
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 = path17.join(CLI_REPO_ROOT, "packages", "bench-ui");
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(path17.join(benchUiDir, "package.json"))) {
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 = path17.join(CLI_REPO_ROOT, "evals", "datasets");
7550
+ const repoCandidate = path18.join(CLI_REPO_ROOT, "evals", "datasets");
7399
7551
  if (isRepoCheckout()) {
7400
7552
  return repoCandidate;
7401
7553
  }
7402
- return path17.join(resolveHomeDir(), ".remnic", "bench", "datasets");
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 = path17.join(CLI_MODULE_DIR, "assets", "download-datasets.sh");
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 path17.join(CLI_REPO_ROOT, "evals", "scripts", "download-datasets.sh");
7564
+ return path18.join(CLI_REPO_ROOT, "evals", "scripts", "download-datasets.sh");
7413
7565
  }
7414
7566
  function isRepoCheckout() {
7415
- return fs15.existsSync(path17.join(CLI_REPO_ROOT, "pnpm-workspace.yaml")) && fs15.existsSync(path17.join(CLI_REPO_ROOT, "evals", "scripts", "download-datasets.sh"));
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 = path17.join(resolveRepoDatasetRoot(), benchmarkId);
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(path17.dirname(summary.path), result.meta.id) : void 0;
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(path17.dirname(parsed.output), { recursive: true });
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 = path17.join(datasetRoot, benchmarkId);
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: path17.join(datasetRoot, benchmarkId)
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 ?? path17.join(resolveHomeDir(), ".remnic", "bench", "results")
8075
+ parsed.resultsDir ?? path18.join(resolveHomeDir(), ".remnic", "bench", "results")
7924
8076
  );
7925
8077
  const calibrationDir = expandTilde(
7926
- parsed.calibrationDir ?? path17.join(resolveHomeDir(), ".remnic", "bench", "calibration")
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 path18 = await import("path");
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 = path18.join(
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 ${path18.basename(artifactPath)} \u2192 ${target}`
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] = path17.join(
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 ?? path17.join(resolveHomeDir(), ".remnic", "bench", "calibration")
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 path17.resolve(expandTilde(cliPath));
9289
+ if (cliPath) return path18.resolve(expandTilde(cliPath));
9138
9290
  const envPath = readCompatEnv("REMNIC_CONFIG_PATH", "ENGRAM_CONFIG_PATH");
9139
- if (envPath) return path17.resolve(expandTilde(envPath));
9291
+ if (envPath) return path18.resolve(expandTilde(envPath));
9140
9292
  const candidates = [
9141
- path17.join(process.cwd(), "remnic.config.json"),
9142
- path17.join(process.cwd(), "engram.config.json"),
9143
- path17.join(resolveHomeDir(), ".config", "remnic", "config.json"),
9144
- path17.join(resolveHomeDir(), ".config", "engram", "config.json")
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 path17.join(resolveHomeDir(), ".config", "remnic", "config.json");
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 path17.resolve(expandTilde(memoryDir));
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 = path17.join(home, ".remnic", "memory");
9277
- const legacyStandalonePath = path17.join(home, ".engram", "memory");
9278
- const openclawPath = path17.join(resolveOpenclawStateDir(), "workspace", "memory", "local");
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 ? path17.resolve(expandTilde(configuredStateDir)) : path17.join(resolveHomeDir(), ".openclaw");
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
- path17.join(resolveOpenclawStateDir(), "openclaw.json")
9484
+ path18.join(resolveOpenclawStateDir(), "openclaw.json")
9333
9485
  ].filter(Boolean);
9334
9486
  function resolveOpenclawConfigPath(cliPath) {
9335
- if (cliPath) return path17.resolve(expandTilde(cliPath));
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 path17.resolve(expandTilde(envPath));
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 path17.join(resolveOpenclawStateDir(), "openclaw.json");
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 path17.resolve(expandTilde(args.requestedMemoryDir));
9552
+ return path18.resolve(expandTilde(args.requestedMemoryDir));
9401
9553
  }
9402
9554
  if (existingMemoryDir) {
9403
- return path17.resolve(expandTilde(existingMemoryDir));
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 path17.resolve(expandTilde(memoryDir));
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 path17.resolve(expandTilde(cliPath));
9579
+ if (cliPath) return path18.resolve(expandTilde(cliPath));
9428
9580
  return resolveOpenclawManagedPluginDir();
9429
9581
  }
9430
9582
  function resolveOpenclawManagedPluginDir() {
9431
- return path17.join(resolveOpenclawStateDir(), "extensions", REMNIC_OPENCLAW_PLUGIN_ID);
9583
+ return path18.join(resolveOpenclawStateDir(), "extensions", REMNIC_OPENCLAW_PLUGIN_ID);
9432
9584
  }
9433
9585
  function resolveOpenclawLegacyPluginDir(cliPath) {
9434
- if (cliPath) return path17.resolve(expandTilde(cliPath));
9435
- return path17.join(resolveOpenclawStateDir(), "extensions", REMNIC_OPENCLAW_LEGACY_PLUGIN_ID);
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(path17.dirname(backupPath), { recursive: true });
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 = path17.join(process.cwd(), "remnic.config.json");
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: path17.join(process.cwd(), ".remnic", "memory"),
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, path18, token, body) {
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()}${path18}`, init);
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 = path17.resolve(pagePath);
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 = path17.resolve(pagePath);
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 = path17.resolve(pagePath);
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 = path17.resolve(pagePath);
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 = path17.join(memoryDir2, "enrichment");
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 = path17.join(memoryDir, "enrichment");
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 = path17.join(root, entry);
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 = path17.join(saveDir, filename);
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 = path17.resolve(expandTilde(configuredMemoryDir));
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 = path17.resolve(dirPath || process.cwd());
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: path17.resolve(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(path17.resolve(memoryDir)).digest("hex").slice(0, 16);
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(path18) {
11622
- super(`remote file changed while fetching offline content: ${path18}`);
11773
+ constructor(path19) {
11774
+ super(`remote file changed while fetching offline content: ${path19}`);
11623
11775
  this.name = "OfflineRemoteFileChangedError";
11624
- this.path = path18;
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: path17.resolve(args.memoryDir),
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 = path17.resolve(expandTilde(resolveRequiredValueFlag(rest, "--memory-dir") ?? resolveMemoryDir()));
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 ? path17.resolve(expandTilde(stateOverride)) : remoteUrl !== void 0 ? defaultOfflineSyncStatePath(memoryDir, remoteUrl, namespace) : void 0;
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 path18 of advanced.newlySkipped) {
13198
- if (skippedLargeFiles.has(path18)) continue;
13199
- skippedLargeFiles.add(path18);
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 ${path18} 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)`
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 path18 of advanced.newlySkipped) {
13217
- if (skippedLargeFiles.has(path18)) continue;
13218
- skippedLargeFiles.add(path18);
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 ${path18} 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)`
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: path17.join(memoryDir, "skills"),
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 = path17.join(outputDir, "marketplace.json");
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] ?? path17.join(process.cwd(), "marketplace.json");
13729
- const resolved = path17.resolve(targetPath);
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: ${path17.basename(latestStatusPath)}`);
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 = path17.resolve(expandTilde(fixturePathRaw));
14459
+ fixturePath = path18.resolve(expandTilde(fixturePathRaw));
14307
14460
  }
14308
- const outPath = path17.resolve(expandTilde(outPathRaw));
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 = path17.join(PID_DIR, "logs");
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 = path17.basename(plistPath, ".plist");
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 = path17.resolve(import.meta.dirname, "../templates/launchd/ai.remnic.daemon.plist");
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(path17.dirname(LAUNCHD_PLIST_PATH), { recursive: true });
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 = path17.resolve(import.meta.dirname, "../templates/systemd/remnic.service");
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(path17.dirname(SYSTEMD_UNIT_PATH), { recursive: true });
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 = path17.join(resolveOpenclawStateDir(), "workspace", "memory", "local");
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 = path17.dirname(configPath);
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 = path17.join(resolveOpenclawStateDir(), "workspace", "memory", "local");
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 ? path17.resolve(expandTilde(opts.memoryDir)) : resolveCurrentOpenclawMemoryDir(entries, slots, fallbackMemoryDir);
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: ${path17.join(resolveOpenclawStateDir(), "backups")}`);
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 = path17.join(backupDir, "openclaw.json");
15124
- const pluginBackupDir = path17.join(backupDir, "extensions", REMNIC_OPENCLAW_PLUGIN_ID);
15125
- const legacyPluginBackupDir = legacyPluginDirForBackup ? path17.join(backupDir, "extensions", REMNIC_OPENCLAW_LEGACY_PLUGIN_ID) : void 0;
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 && path17.resolve(managedRollbackTargetDir) === path17.resolve(pluginDir);
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 && path17.resolve(managedRollbackTargetDir) !== path17.resolve(pluginDir) && !requiresHostManagedRestore) {
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 = path17.join(resolveOpenclawStateDir(), "backups");
15451
+ const backupsRoot = path18.join(resolveOpenclawStateDir(), "backups");
15299
15452
  fs15.mkdirSync(backupsRoot, { recursive: true });
15300
- return fs15.mkdtempSync(path17.join(backupsRoot, `remnic-openclaw-upgrade-${formatOpenclawUpgradeStamp()}-`));
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 = path17.join(config.memoryDir, ".taxonomy", "RESOLVER.md");
15343
- fs15.mkdirSync(path17.dirname(resolverPath), { recursive: true });
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 = path17.join(config.memoryDir, ".taxonomy", "RESOLVER.md");
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 = path17.join(config.memoryDir, ".taxonomy", "RESOLVER.md");
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 = path17.dirname(args.output);
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") ?? path17.join(process.cwd(), ".remnic", "context-tree");
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 = path17.join(treeDir, "INDEX.md");
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.55.0",
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.55.0",
30
- "@remnic/server": "^9.55.0",
31
- "@remnic/core": "^9.55.0"
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.55.0",
35
- "@remnic/plugin-openclaw": "^9.55.0",
36
- "@remnic/export-weclone": "^9.55.0",
37
- "@remnic/import-weclone": "^9.55.0",
38
- "@remnic/import-chatgpt": "^9.55.0",
39
- "@remnic/import-claude": "^9.55.0",
40
- "@remnic/import-gemini": "^9.55.0",
41
- "@remnic/import-lossless-claw": "^9.55.0",
42
- "@remnic/import-mem0": "^9.55.0",
43
- "@remnic/import-supermemory": "^9.55.0",
44
- "@remnic/connector-limitless": "^9.55.0",
45
- "@remnic/connector-bee": "^9.55.0",
46
- "@remnic/connector-omi": "^9.55.0",
47
- "@remnic/capture-audio": "^9.55.0"
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/bench": "9.55.0",
97
- "@remnic/plugin-openclaw": "9.55.0",
98
- "@remnic/export-weclone": "9.55.0",
99
- "@remnic/import-claude": "9.55.0",
100
- "@remnic/import-weclone": "9.55.0",
101
- "@remnic/import-lossless-claw": "9.55.0",
102
- "@remnic/import-gemini": "9.55.0",
103
- "@remnic/import-mem0": "9.55.0",
104
- "@remnic/import-supermemory": "9.55.0",
105
- "@remnic/connector-limitless": "9.55.0",
106
- "@remnic/connector-bee": "9.55.0",
107
- "@remnic/import-chatgpt": "9.55.0",
108
- "@remnic/connector-omi": "9.55.0"
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": {