@clawos-dev/clawd 0.2.228 → 0.2.229

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/cli.cjs CHANGED
@@ -7410,7 +7410,7 @@ var require_atomic_sleep = __commonJS({
7410
7410
  var require_sonic_boom = __commonJS({
7411
7411
  "../node_modules/.pnpm/sonic-boom@4.2.1/node_modules/sonic-boom/index.js"(exports2, module2) {
7412
7412
  "use strict";
7413
- var fs70 = require("fs");
7413
+ var fs71 = require("fs");
7414
7414
  var EventEmitter3 = require("events");
7415
7415
  var inherits = require("util").inherits;
7416
7416
  var path77 = require("path");
@@ -7467,20 +7467,20 @@ var require_sonic_boom = __commonJS({
7467
7467
  const mode = sonic.mode;
7468
7468
  if (sonic.sync) {
7469
7469
  try {
7470
- if (sonic.mkdir) fs70.mkdirSync(path77.dirname(file), { recursive: true });
7471
- const fd = fs70.openSync(file, flags, mode);
7470
+ if (sonic.mkdir) fs71.mkdirSync(path77.dirname(file), { recursive: true });
7471
+ const fd = fs71.openSync(file, flags, mode);
7472
7472
  fileOpened(null, fd);
7473
7473
  } catch (err) {
7474
7474
  fileOpened(err);
7475
7475
  throw err;
7476
7476
  }
7477
7477
  } else if (sonic.mkdir) {
7478
- fs70.mkdir(path77.dirname(file), { recursive: true }, (err) => {
7478
+ fs71.mkdir(path77.dirname(file), { recursive: true }, (err) => {
7479
7479
  if (err) return fileOpened(err);
7480
- fs70.open(file, flags, mode, fileOpened);
7480
+ fs71.open(file, flags, mode, fileOpened);
7481
7481
  });
7482
7482
  } else {
7483
- fs70.open(file, flags, mode, fileOpened);
7483
+ fs71.open(file, flags, mode, fileOpened);
7484
7484
  }
7485
7485
  }
7486
7486
  function SonicBoom(opts) {
@@ -7521,8 +7521,8 @@ var require_sonic_boom = __commonJS({
7521
7521
  this.flush = flushBuffer;
7522
7522
  this.flushSync = flushBufferSync;
7523
7523
  this._actualWrite = actualWriteBuffer;
7524
- fsWriteSync = () => fs70.writeSync(this.fd, this._writingBuf);
7525
- fsWrite = () => fs70.write(this.fd, this._writingBuf, this.release);
7524
+ fsWriteSync = () => fs71.writeSync(this.fd, this._writingBuf);
7525
+ fsWrite = () => fs71.write(this.fd, this._writingBuf, this.release);
7526
7526
  } else if (contentMode === void 0 || contentMode === kContentModeUtf8) {
7527
7527
  this._writingBuf = "";
7528
7528
  this.write = write;
@@ -7531,15 +7531,15 @@ var require_sonic_boom = __commonJS({
7531
7531
  this._actualWrite = actualWrite;
7532
7532
  fsWriteSync = () => {
7533
7533
  if (Buffer.isBuffer(this._writingBuf)) {
7534
- return fs70.writeSync(this.fd, this._writingBuf);
7534
+ return fs71.writeSync(this.fd, this._writingBuf);
7535
7535
  }
7536
- return fs70.writeSync(this.fd, this._writingBuf, "utf8");
7536
+ return fs71.writeSync(this.fd, this._writingBuf, "utf8");
7537
7537
  };
7538
7538
  fsWrite = () => {
7539
7539
  if (Buffer.isBuffer(this._writingBuf)) {
7540
- return fs70.write(this.fd, this._writingBuf, this.release);
7540
+ return fs71.write(this.fd, this._writingBuf, this.release);
7541
7541
  }
7542
- return fs70.write(this.fd, this._writingBuf, "utf8", this.release);
7542
+ return fs71.write(this.fd, this._writingBuf, "utf8", this.release);
7543
7543
  };
7544
7544
  } else {
7545
7545
  throw new Error(`SonicBoom supports "${kContentModeUtf8}" and "${kContentModeBuffer}", but passed ${contentMode}`);
@@ -7596,7 +7596,7 @@ var require_sonic_boom = __commonJS({
7596
7596
  }
7597
7597
  }
7598
7598
  if (this._fsync) {
7599
- fs70.fsyncSync(this.fd);
7599
+ fs71.fsyncSync(this.fd);
7600
7600
  }
7601
7601
  const len = this._len;
7602
7602
  if (this._reopening) {
@@ -7710,7 +7710,7 @@ var require_sonic_boom = __commonJS({
7710
7710
  const onDrain = () => {
7711
7711
  if (!this._fsync) {
7712
7712
  try {
7713
- fs70.fsync(this.fd, (err) => {
7713
+ fs71.fsync(this.fd, (err) => {
7714
7714
  this._flushPending = false;
7715
7715
  cb(err);
7716
7716
  });
@@ -7812,7 +7812,7 @@ var require_sonic_boom = __commonJS({
7812
7812
  const fd = this.fd;
7813
7813
  this.once("ready", () => {
7814
7814
  if (fd !== this.fd) {
7815
- fs70.close(fd, (err) => {
7815
+ fs71.close(fd, (err) => {
7816
7816
  if (err) {
7817
7817
  return this.emit("error", err);
7818
7818
  }
@@ -7861,7 +7861,7 @@ var require_sonic_boom = __commonJS({
7861
7861
  buf = this._bufs[0];
7862
7862
  }
7863
7863
  try {
7864
- const n = Buffer.isBuffer(buf) ? fs70.writeSync(this.fd, buf) : fs70.writeSync(this.fd, buf, "utf8");
7864
+ const n = Buffer.isBuffer(buf) ? fs71.writeSync(this.fd, buf) : fs71.writeSync(this.fd, buf, "utf8");
7865
7865
  const releasedBufObj = releaseWritingBuf(buf, this._len, n);
7866
7866
  buf = releasedBufObj.writingBuf;
7867
7867
  this._len = releasedBufObj.len;
@@ -7877,7 +7877,7 @@ var require_sonic_boom = __commonJS({
7877
7877
  }
7878
7878
  }
7879
7879
  try {
7880
- fs70.fsyncSync(this.fd);
7880
+ fs71.fsyncSync(this.fd);
7881
7881
  } catch {
7882
7882
  }
7883
7883
  }
@@ -7898,7 +7898,7 @@ var require_sonic_boom = __commonJS({
7898
7898
  buf = mergeBuf(this._bufs[0], this._lens[0]);
7899
7899
  }
7900
7900
  try {
7901
- const n = fs70.writeSync(this.fd, buf);
7901
+ const n = fs71.writeSync(this.fd, buf);
7902
7902
  buf = buf.subarray(n);
7903
7903
  this._len = Math.max(this._len - n, 0);
7904
7904
  if (buf.length <= 0) {
@@ -7926,13 +7926,13 @@ var require_sonic_boom = __commonJS({
7926
7926
  this._writingBuf = this._writingBuf.length ? this._writingBuf : this._bufs.shift() || "";
7927
7927
  if (this.sync) {
7928
7928
  try {
7929
- const written = Buffer.isBuffer(this._writingBuf) ? fs70.writeSync(this.fd, this._writingBuf) : fs70.writeSync(this.fd, this._writingBuf, "utf8");
7929
+ const written = Buffer.isBuffer(this._writingBuf) ? fs71.writeSync(this.fd, this._writingBuf) : fs71.writeSync(this.fd, this._writingBuf, "utf8");
7930
7930
  release(null, written);
7931
7931
  } catch (err) {
7932
7932
  release(err);
7933
7933
  }
7934
7934
  } else {
7935
- fs70.write(this.fd, this._writingBuf, release);
7935
+ fs71.write(this.fd, this._writingBuf, release);
7936
7936
  }
7937
7937
  }
7938
7938
  function actualWriteBuffer() {
@@ -7941,7 +7941,7 @@ var require_sonic_boom = __commonJS({
7941
7941
  this._writingBuf = this._writingBuf.length ? this._writingBuf : mergeBuf(this._bufs.shift(), this._lens.shift());
7942
7942
  if (this.sync) {
7943
7943
  try {
7944
- const written = fs70.writeSync(this.fd, this._writingBuf);
7944
+ const written = fs71.writeSync(this.fd, this._writingBuf);
7945
7945
  release(null, written);
7946
7946
  } catch (err) {
7947
7947
  release(err);
@@ -7950,7 +7950,7 @@ var require_sonic_boom = __commonJS({
7950
7950
  if (kCopyBuffer) {
7951
7951
  this._writingBuf = Buffer.from(this._writingBuf);
7952
7952
  }
7953
- fs70.write(this.fd, this._writingBuf, release);
7953
+ fs71.write(this.fd, this._writingBuf, release);
7954
7954
  }
7955
7955
  }
7956
7956
  function actualClose(sonic) {
@@ -7966,12 +7966,12 @@ var require_sonic_boom = __commonJS({
7966
7966
  sonic._lens = [];
7967
7967
  assert(typeof sonic.fd === "number", `sonic.fd must be a number, got ${typeof sonic.fd}`);
7968
7968
  try {
7969
- fs70.fsync(sonic.fd, closeWrapped);
7969
+ fs71.fsync(sonic.fd, closeWrapped);
7970
7970
  } catch {
7971
7971
  }
7972
7972
  function closeWrapped() {
7973
7973
  if (sonic.fd !== 1 && sonic.fd !== 2) {
7974
- fs70.close(sonic.fd, done);
7974
+ fs71.close(sonic.fd, done);
7975
7975
  } else {
7976
7976
  done();
7977
7977
  }
@@ -11364,7 +11364,7 @@ function newestSubagentMtimeMs(projectsRoot, cwd, toolSessionId) {
11364
11364
  const dir = import_node_path5.default.join(projectsRoot, cwdToHashDir(cwd), toolSessionId, "subagents");
11365
11365
  let entries;
11366
11366
  try {
11367
- entries = import_node_fs5.default.readdirSync(dir, { withFileTypes: true });
11367
+ entries = import_node_fs6.default.readdirSync(dir, { withFileTypes: true });
11368
11368
  } catch {
11369
11369
  return null;
11370
11370
  }
@@ -11373,7 +11373,7 @@ function newestSubagentMtimeMs(projectsRoot, cwd, toolSessionId) {
11373
11373
  if (!e.isFile()) continue;
11374
11374
  if (!e.name.startsWith("agent-") || !e.name.endsWith(".jsonl")) continue;
11375
11375
  try {
11376
- const m2 = import_node_fs5.default.statSync(import_node_path5.default.join(dir, e.name)).mtimeMs;
11376
+ const m2 = import_node_fs6.default.statSync(import_node_path5.default.join(dir, e.name)).mtimeMs;
11377
11377
  if (newest === null || m2 > newest) newest = m2;
11378
11378
  } catch {
11379
11379
  }
@@ -11387,7 +11387,7 @@ function hashDirToCwd(hash) {
11387
11387
  function findTranscriptByToolSessionId(projectsRoot, toolSessionId) {
11388
11388
  let entries;
11389
11389
  try {
11390
- entries = import_node_fs5.default.readdirSync(projectsRoot, { withFileTypes: true });
11390
+ entries = import_node_fs6.default.readdirSync(projectsRoot, { withFileTypes: true });
11391
11391
  } catch {
11392
11392
  return null;
11393
11393
  }
@@ -11396,7 +11396,7 @@ function findTranscriptByToolSessionId(projectsRoot, toolSessionId) {
11396
11396
  if (!ent.isDirectory()) continue;
11397
11397
  const candidate = import_node_path5.default.join(projectsRoot, ent.name, `${toolSessionId}.jsonl`);
11398
11398
  try {
11399
- const st = import_node_fs5.default.statSync(candidate);
11399
+ const st = import_node_fs6.default.statSync(candidate);
11400
11400
  if (!best || st.mtimeMs > best.mtime) best = { p: candidate, mtime: st.mtimeMs };
11401
11401
  } catch {
11402
11402
  }
@@ -11407,7 +11407,7 @@ function deriveCwdFromTranscript(filePath) {
11407
11407
  const dirName = import_node_path5.default.basename(import_node_path5.default.dirname(filePath));
11408
11408
  let raw;
11409
11409
  try {
11410
- raw = import_node_fs5.default.readFileSync(filePath, "utf8");
11410
+ raw = import_node_fs6.default.readFileSync(filePath, "utf8");
11411
11411
  } catch {
11412
11412
  return null;
11413
11413
  }
@@ -11425,7 +11425,7 @@ function deriveCwdFromTranscript(filePath) {
11425
11425
  }
11426
11426
  function safeStatMtime(p2) {
11427
11427
  try {
11428
- return import_node_fs5.default.statSync(p2).mtimeMs;
11428
+ return import_node_fs6.default.statSync(p2).mtimeMs;
11429
11429
  } catch {
11430
11430
  return 0;
11431
11431
  }
@@ -11433,7 +11433,7 @@ function safeStatMtime(p2) {
11433
11433
  function readJsonlLines(file) {
11434
11434
  let raw;
11435
11435
  try {
11436
- raw = import_node_fs5.default.readFileSync(file, "utf8");
11436
+ raw = import_node_fs6.default.readFileSync(file, "utf8");
11437
11437
  } catch (err) {
11438
11438
  if (err.code === "ENOENT") return [];
11439
11439
  throw err;
@@ -11664,7 +11664,7 @@ function attachmentDeferredToolsText(a) {
11664
11664
  function readBackupContent(fileHistoryRoot, toolSessionId, backupFileName) {
11665
11665
  if (backupFileName === null) return null;
11666
11666
  try {
11667
- return import_node_fs5.default.readFileSync(
11667
+ return import_node_fs6.default.readFileSync(
11668
11668
  import_node_path5.default.join(fileHistoryRoot, toolSessionId, backupFileName),
11669
11669
  "utf8"
11670
11670
  );
@@ -11674,17 +11674,17 @@ function readBackupContent(fileHistoryRoot, toolSessionId, backupFileName) {
11674
11674
  }
11675
11675
  function readCurrentContent(filePath) {
11676
11676
  try {
11677
- return import_node_fs5.default.readFileSync(filePath, "utf8");
11677
+ return import_node_fs6.default.readFileSync(filePath, "utf8");
11678
11678
  } catch (err) {
11679
11679
  if (err.code === "ENOENT") return null;
11680
11680
  return null;
11681
11681
  }
11682
11682
  }
11683
- var import_node_fs5, import_node_os3, import_node_path5, TASK_NOTIFICATION_RE, TASK_ID_RE, TOOL_USE_ID_RE, SLASH_COMMAND_RE, LOCAL_COMMAND_RE, SYSTEM_REMINDER_RE, OPENSPEC_BLOCK_RE, SKILL_HINT_RE, ATTACHMENT_SILENT_SUBTYPES, ClaudeHistoryReader;
11683
+ var import_node_fs6, import_node_os3, import_node_path5, TASK_NOTIFICATION_RE, TASK_ID_RE, TOOL_USE_ID_RE, SLASH_COMMAND_RE, LOCAL_COMMAND_RE, SYSTEM_REMINDER_RE, OPENSPEC_BLOCK_RE, SKILL_HINT_RE, ATTACHMENT_SILENT_SUBTYPES, ClaudeHistoryReader;
11684
11684
  var init_claude_history = __esm({
11685
11685
  "src/tools/claude-history.ts"() {
11686
11686
  "use strict";
11687
- import_node_fs5 = __toESM(require("fs"), 1);
11687
+ import_node_fs6 = __toESM(require("fs"), 1);
11688
11688
  import_node_os3 = __toESM(require("os"), 1);
11689
11689
  import_node_path5 = __toESM(require("path"), 1);
11690
11690
  init_lib();
@@ -11717,7 +11717,7 @@ var init_claude_history = __esm({
11717
11717
  async listProjects() {
11718
11718
  let entries;
11719
11719
  try {
11720
- entries = import_node_fs5.default.readdirSync(this.projectsRoot, { withFileTypes: true });
11720
+ entries = import_node_fs6.default.readdirSync(this.projectsRoot, { withFileTypes: true });
11721
11721
  } catch (err) {
11722
11722
  if (err.code === "ENOENT") return [];
11723
11723
  throw err;
@@ -11726,7 +11726,7 @@ var init_claude_history = __esm({
11726
11726
  for (const ent of entries) {
11727
11727
  if (!ent.isDirectory()) continue;
11728
11728
  const dir = import_node_path5.default.join(this.projectsRoot, ent.name);
11729
- const files = import_node_fs5.default.readdirSync(dir).filter((f) => f.endsWith(".jsonl"));
11729
+ const files = import_node_fs6.default.readdirSync(dir).filter((f) => f.endsWith(".jsonl"));
11730
11730
  const updatedAtMs = files.reduce((m2, f) => Math.max(m2, safeStatMtime(import_node_path5.default.join(dir, f))), 0);
11731
11731
  out.push({
11732
11732
  projectPath: hashDirToCwd(ent.name),
@@ -11742,7 +11742,7 @@ var init_claude_history = __esm({
11742
11742
  const dir = import_node_path5.default.join(this.projectsRoot, cwdToHashDir(args.projectPath));
11743
11743
  let files;
11744
11744
  try {
11745
- files = import_node_fs5.default.readdirSync(dir).filter((f) => f.endsWith(".jsonl"));
11745
+ files = import_node_fs6.default.readdirSync(dir).filter((f) => f.endsWith(".jsonl"));
11746
11746
  } catch (err) {
11747
11747
  if (err.code === "ENOENT") return [];
11748
11748
  throw err;
@@ -11849,7 +11849,7 @@ var init_claude_history = __esm({
11849
11849
  );
11850
11850
  let entries;
11851
11851
  try {
11852
- entries = import_node_fs5.default.readdirSync(dir, { withFileTypes: true });
11852
+ entries = import_node_fs6.default.readdirSync(dir, { withFileTypes: true });
11853
11853
  } catch (err) {
11854
11854
  if (err.code === "ENOENT") return null;
11855
11855
  return null;
@@ -11920,7 +11920,7 @@ var init_claude_history = __esm({
11920
11920
  );
11921
11921
  let exists = false;
11922
11922
  try {
11923
- exists = import_node_fs5.default.statSync(file).isFile();
11923
+ exists = import_node_fs6.default.statSync(file).isFile();
11924
11924
  } catch {
11925
11925
  return null;
11926
11926
  }
@@ -12096,13 +12096,13 @@ var init_claude_history = __esm({
12096
12096
  function probeViaWhich() {
12097
12097
  try {
12098
12098
  const out = (0, import_node_child_process2.execFileSync)("which", ["claude"], { encoding: "utf8" }).trim();
12099
- if (out && import_node_fs15.default.existsSync(out)) return out;
12099
+ if (out && import_node_fs16.default.existsSync(out)) return out;
12100
12100
  } catch {
12101
12101
  }
12102
12102
  return null;
12103
12103
  }
12104
12104
  async function probeClaude(env = process.env) {
12105
- if (env.CLAUDE_BIN && import_node_fs15.default.existsSync(env.CLAUDE_BIN)) {
12105
+ if (env.CLAUDE_BIN && import_node_fs16.default.existsSync(env.CLAUDE_BIN)) {
12106
12106
  return { available: true, path: env.CLAUDE_BIN };
12107
12107
  }
12108
12108
  const w2 = probeViaWhich();
@@ -12547,13 +12547,13 @@ function encodeClaudeStdin(text) {
12547
12547
  };
12548
12548
  return JSON.stringify(frame) + "\n";
12549
12549
  }
12550
- var import_node_child_process, import_node_child_process2, import_node_fs15, ATTACHMENT_SILENT_SUBTYPES2, unknownTypeHandler, ATTACHMENT_RE, IMAGE_EXT_MIME, CLAUDE_MODEL_IDS, CLAUDE_MODELS, _assertModelIdsAligned, CLAUDE_PERMISSION_MODES, CLAUDE_CAPABILITIES, ClaudeAdapter;
12550
+ var import_node_child_process, import_node_child_process2, import_node_fs16, ATTACHMENT_SILENT_SUBTYPES2, unknownTypeHandler, ATTACHMENT_RE, IMAGE_EXT_MIME, CLAUDE_MODEL_IDS, CLAUDE_MODELS, _assertModelIdsAligned, CLAUDE_PERMISSION_MODES, CLAUDE_CAPABILITIES, ClaudeAdapter;
12551
12551
  var init_claude = __esm({
12552
12552
  "src/tools/claude.ts"() {
12553
12553
  "use strict";
12554
12554
  import_node_child_process = require("child_process");
12555
12555
  import_node_child_process2 = require("child_process");
12556
- import_node_fs15 = __toESM(require("fs"), 1);
12556
+ import_node_fs16 = __toESM(require("fs"), 1);
12557
12557
  init_protocol();
12558
12558
  init_claude_history();
12559
12559
  init_tool_result_extra();
@@ -40310,8 +40310,8 @@ function startRunCaseRecorder(opts) {
40310
40310
  });
40311
40311
  const ensureStream = () => {
40312
40312
  if (stream) return stream;
40313
- import_node_fs52.default.mkdirSync(dir, { recursive: true });
40314
- stream = import_node_fs52.default.createWriteStream(opts.recordPath, { flags: "a" });
40313
+ import_node_fs53.default.mkdirSync(dir, { recursive: true });
40314
+ stream = import_node_fs53.default.createWriteStream(opts.recordPath, { flags: "a" });
40315
40315
  stream.on("close", () => closedResolve());
40316
40316
  return stream;
40317
40317
  };
@@ -40336,11 +40336,11 @@ function startRunCaseRecorder(opts) {
40336
40336
  };
40337
40337
  return { tap, close, closed };
40338
40338
  }
40339
- var import_node_fs52, import_node_path65;
40339
+ var import_node_fs53, import_node_path65;
40340
40340
  var init_recorder = __esm({
40341
40341
  "src/run-case/recorder.ts"() {
40342
40342
  "use strict";
40343
- import_node_fs52 = __toESM(require("fs"), 1);
40343
+ import_node_fs53 = __toESM(require("fs"), 1);
40344
40344
  import_node_path65 = __toESM(require("path"), 1);
40345
40345
  }
40346
40346
  });
@@ -40384,7 +40384,7 @@ var init_wire = __esm({
40384
40384
  // src/run-case/controller.ts
40385
40385
  async function runController(opts) {
40386
40386
  const now = opts.now ?? Date.now;
40387
- const cwd = opts.cwd ?? (0, import_node_fs53.mkdtempSync)(import_node_path66.default.join(import_node_os22.default.tmpdir(), "clawd-runcase-"));
40387
+ const cwd = opts.cwd ?? (0, import_node_fs54.mkdtempSync)(import_node_path66.default.join(import_node_os22.default.tmpdir(), "clawd-runcase-"));
40388
40388
  const ownsCwd = opts.cwd === void 0;
40389
40389
  const recorder = startRunCaseRecorder({ recordPath: opts.record, now });
40390
40390
  const spawnCtx = { cwd };
@@ -40545,17 +40545,17 @@ async function runController(opts) {
40545
40545
  if (sigintHandler) process.off("SIGINT", sigintHandler);
40546
40546
  if (ownsCwd) {
40547
40547
  try {
40548
- (0, import_node_fs53.rmSync)(cwd, { recursive: true, force: true });
40548
+ (0, import_node_fs54.rmSync)(cwd, { recursive: true, force: true });
40549
40549
  } catch {
40550
40550
  }
40551
40551
  }
40552
40552
  return exitCode ?? 0;
40553
40553
  }
40554
- var import_node_fs53, import_node_os22, import_node_path66;
40554
+ var import_node_fs54, import_node_os22, import_node_path66;
40555
40555
  var init_controller = __esm({
40556
40556
  "src/run-case/controller.ts"() {
40557
40557
  "use strict";
40558
- import_node_fs53 = require("fs");
40558
+ import_node_fs54 = require("fs");
40559
40559
  import_node_os22 = __toESM(require("os"), 1);
40560
40560
  import_node_path66 = __toESM(require("path"), 1);
40561
40561
  init_claude();
@@ -40952,7 +40952,7 @@ Env (advanced):
40952
40952
 
40953
40953
  // src/index.ts
40954
40954
  var import_node_path64 = __toESM(require("path"), 1);
40955
- var import_node_fs51 = __toESM(require("fs"), 1);
40955
+ var import_node_fs52 = __toESM(require("fs"), 1);
40956
40956
  var import_node_os21 = __toESM(require("os"), 1);
40957
40957
 
40958
40958
  // ../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid/dist/esm-node/stringify.js
@@ -41093,6 +41093,35 @@ function pinoLevelToString(n) {
41093
41093
  return null;
41094
41094
  }
41095
41095
 
41096
+ // src/log-size-cap.ts
41097
+ var import_node_fs3 = __toESM(require("fs"), 1);
41098
+ function truncateLogFileToTail(file, maxBytes, keepBytes) {
41099
+ let size;
41100
+ try {
41101
+ size = import_node_fs3.default.statSync(file).size;
41102
+ } catch {
41103
+ return;
41104
+ }
41105
+ if (size <= maxBytes) return;
41106
+ let fd;
41107
+ try {
41108
+ fd = import_node_fs3.default.openSync(file, "r");
41109
+ } catch {
41110
+ return;
41111
+ }
41112
+ try {
41113
+ const buf = Buffer.allocUnsafe(keepBytes);
41114
+ import_node_fs3.default.readSync(fd, buf, 0, keepBytes, size - keepBytes);
41115
+ import_node_fs3.default.writeFileSync(file, buf);
41116
+ } catch {
41117
+ } finally {
41118
+ try {
41119
+ import_node_fs3.default.closeSync(fd);
41120
+ } catch {
41121
+ }
41122
+ }
41123
+ }
41124
+
41096
41125
  // ../log-client/dist/index.js
41097
41126
  var DEFAULT_BATCH = {
41098
41127
  maxRecords: 100,
@@ -41373,7 +41402,7 @@ function buildRecord(input, identity, source, homeDir, now) {
41373
41402
  var path5 = __toESM(require("path"), 1);
41374
41403
 
41375
41404
  // src/session/store.ts
41376
- var import_node_fs3 = __toESM(require("fs"), 1);
41405
+ var import_node_fs4 = __toESM(require("fs"), 1);
41377
41406
  var import_node_path3 = __toESM(require("path"), 1);
41378
41407
  init_protocol();
41379
41408
 
@@ -41462,11 +41491,11 @@ var SessionStore = class {
41462
41491
  return import_node_path3.default.join(this.root, `${safeFileName(sessionId)}.json`);
41463
41492
  }
41464
41493
  ensureDir() {
41465
- import_node_fs3.default.mkdirSync(this.root, { recursive: true });
41494
+ import_node_fs4.default.mkdirSync(this.root, { recursive: true });
41466
41495
  }
41467
41496
  read(sessionId) {
41468
41497
  try {
41469
- const raw = import_node_fs3.default.readFileSync(this.filePath(sessionId), "utf8");
41498
+ const raw = import_node_fs4.default.readFileSync(this.filePath(sessionId), "utf8");
41470
41499
  const parsed = JSON.parse(raw);
41471
41500
  return SessionFileSchema.parse(parsed);
41472
41501
  } catch (err) {
@@ -41480,13 +41509,13 @@ var SessionStore = class {
41480
41509
  this.ensureDir();
41481
41510
  const target = this.filePath(validated.sessionId);
41482
41511
  const tmp = `${target}.tmp-${process.pid}-${Date.now()}`;
41483
- import_node_fs3.default.writeFileSync(tmp, JSON.stringify(validated, null, 2), { encoding: "utf8", mode: 384 });
41484
- import_node_fs3.default.renameSync(tmp, target);
41512
+ import_node_fs4.default.writeFileSync(tmp, JSON.stringify(validated, null, 2), { encoding: "utf8", mode: 384 });
41513
+ import_node_fs4.default.renameSync(tmp, target);
41485
41514
  return validated;
41486
41515
  }
41487
41516
  delete(sessionId) {
41488
41517
  try {
41489
- import_node_fs3.default.unlinkSync(this.filePath(sessionId));
41518
+ import_node_fs4.default.unlinkSync(this.filePath(sessionId));
41490
41519
  return true;
41491
41520
  } catch (err) {
41492
41521
  const code = err?.code;
@@ -41497,7 +41526,7 @@ var SessionStore = class {
41497
41526
  list() {
41498
41527
  let entries;
41499
41528
  try {
41500
- entries = import_node_fs3.default.readdirSync(this.root);
41529
+ entries = import_node_fs4.default.readdirSync(this.root);
41501
41530
  } catch (err) {
41502
41531
  const code = err?.code;
41503
41532
  if (code === "ENOENT") return [];
@@ -41509,7 +41538,7 @@ var SessionStore = class {
41509
41538
  if (name.includes(".tmp-")) continue;
41510
41539
  const full = import_node_path3.default.join(this.root, name);
41511
41540
  try {
41512
- const raw = import_node_fs3.default.readFileSync(full, "utf8");
41541
+ const raw = import_node_fs4.default.readFileSync(full, "utf8");
41513
41542
  const parsed = JSON.parse(raw);
41514
41543
  const validated = SessionFileSchema.parse(parsed);
41515
41544
  out.push(validated);
@@ -41582,7 +41611,7 @@ var SessionStoreFactory = class {
41582
41611
  };
41583
41612
 
41584
41613
  // src/session/manager.ts
41585
- var import_node_fs8 = __toESM(require("fs"), 1);
41614
+ var import_node_fs9 = __toESM(require("fs"), 1);
41586
41615
  var import_node_path9 = __toESM(require("path"), 1);
41587
41616
  var import_node_os5 = __toESM(require("os"), 1);
41588
41617
  init_protocol();
@@ -41674,13 +41703,13 @@ function composeGuestSandbox(base, userWorkDir, spawnCwd) {
41674
41703
  }
41675
41704
 
41676
41705
  // src/tools/owner-credentials.ts
41677
- var import_node_fs4 = __toESM(require("fs"), 1);
41706
+ var import_node_fs5 = __toESM(require("fs"), 1);
41678
41707
  var import_node_path4 = __toESM(require("path"), 1);
41679
41708
  function readOwnerCredentials(homeDir, logger) {
41680
41709
  const settingsPath = import_node_path4.default.join(homeDir, ".claude", "settings.json");
41681
41710
  let raw;
41682
41711
  try {
41683
- raw = import_node_fs4.default.readFileSync(settingsPath, "utf8");
41712
+ raw = import_node_fs5.default.readFileSync(settingsPath, "utf8");
41684
41713
  } catch (err) {
41685
41714
  const code = err.code;
41686
41715
  if (code === "ENOENT") return null;
@@ -42724,7 +42753,7 @@ init_permission_stdio();
42724
42753
  init_claude_history();
42725
42754
 
42726
42755
  // src/ipc-recorder.ts
42727
- var import_node_fs6 = __toESM(require("fs"), 1);
42756
+ var import_node_fs7 = __toESM(require("fs"), 1);
42728
42757
  var import_node_path6 = __toESM(require("path"), 1);
42729
42758
  function tsForFilename(ms) {
42730
42759
  return new Date(ms).toISOString().replace(/[:.]/g, "-");
@@ -42746,8 +42775,8 @@ function startRecorder(opts) {
42746
42775
  let exited = false;
42747
42776
  const ensureStream = () => {
42748
42777
  if (stream) return stream;
42749
- import_node_fs6.default.mkdirSync(dir, { recursive: true });
42750
- stream = import_node_fs6.default.createWriteStream(filePath, { flags: "a" });
42778
+ import_node_fs7.default.mkdirSync(dir, { recursive: true });
42779
+ stream = import_node_fs7.default.createWriteStream(filePath, { flags: "a" });
42751
42780
  stream.on("close", () => closedResolve());
42752
42781
  return stream;
42753
42782
  };
@@ -43215,7 +43244,7 @@ function extractEditPath(input) {
43215
43244
  }
43216
43245
 
43217
43246
  // src/debug/pty-probe.ts
43218
- var import_node_fs7 = __toESM(require("fs"), 1);
43247
+ var import_node_fs8 = __toESM(require("fs"), 1);
43219
43248
  var import_node_path8 = __toESM(require("path"), 1);
43220
43249
  var PROBE_DIR = "/tmp/clawd-probe";
43221
43250
  var EVENTS_FILE = import_node_path8.default.join(PROBE_DIR, "events.jsonl");
@@ -43223,7 +43252,7 @@ var inited = false;
43223
43252
  function ensureDir() {
43224
43253
  if (inited) return true;
43225
43254
  try {
43226
- import_node_fs7.default.mkdirSync(PROBE_DIR, { recursive: true });
43255
+ import_node_fs8.default.mkdirSync(PROBE_DIR, { recursive: true });
43227
43256
  inited = true;
43228
43257
  return true;
43229
43258
  } catch {
@@ -43234,7 +43263,7 @@ function probeEvent(event, data = {}) {
43234
43263
  try {
43235
43264
  if (!ensureDir()) return;
43236
43265
  const line = JSON.stringify({ ts: Date.now(), event, ...data }) + "\n";
43237
- import_node_fs7.default.appendFileSync(EVENTS_FILE, line);
43266
+ import_node_fs8.default.appendFileSync(EVENTS_FILE, line);
43238
43267
  } catch {
43239
43268
  }
43240
43269
  }
@@ -43242,7 +43271,7 @@ function probeDumpReplay(sessionId, payload) {
43242
43271
  try {
43243
43272
  if (!ensureDir()) return "";
43244
43273
  const file = import_node_path8.default.join(PROBE_DIR, `replay-${sessionId}-${Date.now()}.ans`);
43245
- import_node_fs7.default.writeFileSync(file, payload, "utf8");
43274
+ import_node_fs8.default.writeFileSync(file, payload, "utf8");
43246
43275
  return file;
43247
43276
  } catch {
43248
43277
  return "";
@@ -43490,7 +43519,7 @@ var SessionManager = class {
43490
43519
  const root = this.deps.storeFactory ? import_node_path9.default.join(this.deps.dataDir, "personas") : import_node_path9.default.join(this.deps.dataDir, "sessions");
43491
43520
  let entries;
43492
43521
  try {
43493
- entries = import_node_fs8.default.readdirSync(root, { withFileTypes: true });
43522
+ entries = import_node_fs9.default.readdirSync(root, { withFileTypes: true });
43494
43523
  } catch (err) {
43495
43524
  const code = err?.code;
43496
43525
  if (code === "ENOENT") return [];
@@ -43513,7 +43542,7 @@ var SessionManager = class {
43513
43542
  );
43514
43543
  let entries;
43515
43544
  try {
43516
- entries = import_node_fs8.default.readdirSync(root, { withFileTypes: true });
43545
+ entries = import_node_fs9.default.readdirSync(root, { withFileTypes: true });
43517
43546
  } catch (err) {
43518
43547
  const code = err?.code;
43519
43548
  if (code === "ENOENT") return [];
@@ -43632,7 +43661,7 @@ var SessionManager = class {
43632
43661
  callerDisplayName
43633
43662
  );
43634
43663
  if (subSessionMeta?.userWorkDir) {
43635
- import_node_fs8.default.mkdirSync(subSessionMeta.userWorkDir, { recursive: true });
43664
+ import_node_fs9.default.mkdirSync(subSessionMeta.userWorkDir, { recursive: true });
43636
43665
  }
43637
43666
  if (scope.kind === "persona" && scope.mode === "guest") {
43638
43667
  if (!this.deps.personaRoot || !subSessionMeta?.userWorkDir) {
@@ -43814,7 +43843,7 @@ var SessionManager = class {
43814
43843
  throw new ClawdError(ERROR_CODES.INVALID_CWD, "cwd required when ownerPersonaId is absent");
43815
43844
  }
43816
43845
  try {
43817
- const stat = import_node_fs8.default.statSync(cwd);
43846
+ const stat = import_node_fs9.default.statSync(cwd);
43818
43847
  if (!stat.isDirectory()) throw new Error("not dir");
43819
43848
  } catch {
43820
43849
  throw new ClawdError(ERROR_CODES.INVALID_CWD, `cwd not a directory: ${cwd}`);
@@ -44377,7 +44406,7 @@ var SessionManager = class {
44377
44406
  */
44378
44407
  createForScope(args) {
44379
44408
  try {
44380
- const stat = import_node_fs8.default.statSync(args.cwd);
44409
+ const stat = import_node_fs9.default.statSync(args.cwd);
44381
44410
  if (!stat.isDirectory()) throw new Error("not dir");
44382
44411
  } catch {
44383
44412
  throw new ClawdError(ERROR_CODES.INVALID_CWD, `cwd not a directory: ${args.cwd}`);
@@ -45182,13 +45211,13 @@ var SessionManager = class {
45182
45211
  };
45183
45212
 
45184
45213
  // src/persona/store.ts
45185
- var fs9 = __toESM(require("fs"), 1);
45214
+ var fs10 = __toESM(require("fs"), 1);
45186
45215
  var path12 = __toESM(require("path"), 1);
45187
45216
  init_protocol();
45188
45217
  var PersonaStore = class {
45189
45218
  constructor(root) {
45190
45219
  this.root = root;
45191
- fs9.mkdirSync(root, { recursive: true });
45220
+ fs10.mkdirSync(root, { recursive: true });
45192
45221
  }
45193
45222
  root;
45194
45223
  personaDir(personaId) {
@@ -45216,7 +45245,7 @@ var PersonaStore = class {
45216
45245
  }
45217
45246
  write(persona, personality) {
45218
45247
  const dir = this.personaDir(persona.personaId);
45219
- fs9.mkdirSync(path12.join(dir, ".clawd"), { recursive: true });
45248
+ fs10.mkdirSync(path12.join(dir, ".clawd"), { recursive: true });
45220
45249
  this.atomicWrite(this.claudeMdPath(persona.personaId), personality);
45221
45250
  this.atomicWrite(this.agentsMdPath(persona.personaId), personality);
45222
45251
  this.writeSandboxSettings(persona.personaId, buildGuestSettingsV1());
@@ -45235,9 +45264,9 @@ var PersonaStore = class {
45235
45264
  ensureAgentsMirror(personaId) {
45236
45265
  const claudeMd = this.claudeMdPath(personaId);
45237
45266
  const agentsMd = this.agentsMdPath(personaId);
45238
- if (!fs9.existsSync(claudeMd)) return false;
45239
- if (fs9.existsSync(agentsMd)) return false;
45240
- this.atomicWrite(agentsMd, fs9.readFileSync(claudeMd, "utf8"));
45267
+ if (!fs10.existsSync(claudeMd)) return false;
45268
+ if (fs10.existsSync(agentsMd)) return false;
45269
+ this.atomicWrite(agentsMd, fs10.readFileSync(claudeMd, "utf8"));
45241
45270
  return true;
45242
45271
  }
45243
45272
  /**
@@ -45266,9 +45295,9 @@ var PersonaStore = class {
45266
45295
  /** 读 codex-sandbox.json;不存在/损坏 → null。 */
45267
45296
  readCodexSandboxSettings(personaId) {
45268
45297
  const p2 = this.codexSandboxSettingsPath(personaId);
45269
- if (!fs9.existsSync(p2)) return null;
45298
+ if (!fs10.existsSync(p2)) return null;
45270
45299
  try {
45271
- return CodexSandboxSettingsSchema.parse(JSON.parse(fs9.readFileSync(p2, "utf8")));
45300
+ return CodexSandboxSettingsSchema.parse(JSON.parse(fs10.readFileSync(p2, "utf8")));
45272
45301
  } catch {
45273
45302
  return null;
45274
45303
  }
@@ -45276,7 +45305,7 @@ var PersonaStore = class {
45276
45305
  /** 覆盖写 codex-sandbox.json(seed/migrate 用)。 */
45277
45306
  writeCodexSandboxSettings(personaId, settings) {
45278
45307
  const dir = path12.join(this.personaDir(personaId), ".clawd");
45279
- fs9.mkdirSync(dir, { recursive: true });
45308
+ fs10.mkdirSync(dir, { recursive: true });
45280
45309
  this.atomicWrite(this.codexSandboxSettingsPath(personaId), JSON.stringify(settings, null, 2));
45281
45310
  }
45282
45311
  writeMeta(persona) {
@@ -45284,8 +45313,8 @@ var PersonaStore = class {
45284
45313
  }
45285
45314
  read(personaId) {
45286
45315
  const p2 = this.metaPath(personaId);
45287
- if (!fs9.existsSync(p2)) return null;
45288
- const raw = JSON.parse(fs9.readFileSync(p2, "utf8"));
45316
+ if (!fs10.existsSync(p2)) return null;
45317
+ const raw = JSON.parse(fs10.readFileSync(p2, "utf8"));
45289
45318
  if (raw && typeof raw === "object" && "tokenMap" in raw) {
45290
45319
  delete raw.tokenMap;
45291
45320
  this.atomicWrite(p2, JSON.stringify(raw, null, 2));
@@ -45293,13 +45322,13 @@ var PersonaStore = class {
45293
45322
  return PersonaFileSchema.parse(raw);
45294
45323
  }
45295
45324
  has(personaId) {
45296
- return fs9.existsSync(this.metaPath(personaId));
45325
+ return fs10.existsSync(this.metaPath(personaId));
45297
45326
  }
45298
45327
  readPersonality(personaId) {
45299
45328
  const claudeMd = this.claudeMdPath(personaId);
45300
- if (fs9.existsSync(claudeMd)) return fs9.readFileSync(claudeMd, "utf8");
45329
+ if (fs10.existsSync(claudeMd)) return fs10.readFileSync(claudeMd, "utf8");
45301
45330
  const agentsMd = this.agentsMdPath(personaId);
45302
- if (fs9.existsSync(agentsMd)) return fs9.readFileSync(agentsMd, "utf8");
45331
+ if (fs10.existsSync(agentsMd)) return fs10.readFileSync(agentsMd, "utf8");
45303
45332
  return null;
45304
45333
  }
45305
45334
  /**
@@ -45308,9 +45337,9 @@ var PersonaStore = class {
45308
45337
  */
45309
45338
  readSandboxSettings(personaId) {
45310
45339
  const p2 = this.sandboxSettingsPath(personaId);
45311
- if (!fs9.existsSync(p2)) return null;
45340
+ if (!fs10.existsSync(p2)) return null;
45312
45341
  try {
45313
- return JSON.parse(fs9.readFileSync(p2, "utf8"));
45342
+ return JSON.parse(fs10.readFileSync(p2, "utf8"));
45314
45343
  } catch {
45315
45344
  return null;
45316
45345
  }
@@ -45339,10 +45368,10 @@ var PersonaStore = class {
45339
45368
  */
45340
45369
  readEnabledPlugins(personaId) {
45341
45370
  const p2 = this.claudeSettingsPath(personaId);
45342
- if (!fs9.existsSync(p2)) return [];
45371
+ if (!fs10.existsSync(p2)) return [];
45343
45372
  let raw;
45344
45373
  try {
45345
- raw = JSON.parse(fs9.readFileSync(p2, "utf8"));
45374
+ raw = JSON.parse(fs10.readFileSync(p2, "utf8"));
45346
45375
  } catch {
45347
45376
  return [];
45348
45377
  }
@@ -45356,22 +45385,22 @@ var PersonaStore = class {
45356
45385
  return out;
45357
45386
  }
45358
45387
  list() {
45359
- if (!fs9.existsSync(this.root)) return [];
45360
- return fs9.readdirSync(this.root).filter((name) => {
45361
- return fs9.existsSync(path12.join(this.root, name, ".clawd", "persona.json"));
45388
+ if (!fs10.existsSync(this.root)) return [];
45389
+ return fs10.readdirSync(this.root).filter((name) => {
45390
+ return fs10.existsSync(path12.join(this.root, name, ".clawd", "persona.json"));
45362
45391
  });
45363
45392
  }
45364
45393
  remove(personaId) {
45365
45394
  const dir = this.personaDir(personaId);
45366
- if (fs9.existsSync(dir)) fs9.rmSync(dir, { recursive: true, force: true });
45395
+ if (fs10.existsSync(dir)) fs10.rmSync(dir, { recursive: true, force: true });
45367
45396
  }
45368
45397
  personaDirPath(personaId) {
45369
45398
  return this.personaDir(personaId);
45370
45399
  }
45371
45400
  atomicWrite(file, content) {
45372
45401
  const tmp = `${file}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`;
45373
- fs9.writeFileSync(tmp, content, { mode: 384 });
45374
- fs9.renameSync(tmp, file);
45402
+ fs10.writeFileSync(tmp, content, { mode: 384 });
45403
+ fs10.renameSync(tmp, file);
45375
45404
  }
45376
45405
  };
45377
45406
 
@@ -45417,7 +45446,7 @@ var PersonaRegistry = class {
45417
45446
  var import_node_crypto3 = __toESM(require("crypto"), 1);
45418
45447
 
45419
45448
  // src/skills/scanner.ts
45420
- var import_node_fs9 = __toESM(require("fs"), 1);
45449
+ var import_node_fs10 = __toESM(require("fs"), 1);
45421
45450
  var import_node_os6 = __toESM(require("os"), 1);
45422
45451
  var import_node_path10 = __toESM(require("path"), 1);
45423
45452
 
@@ -45528,7 +45557,7 @@ function parseDescription(content) {
45528
45557
  }
45529
45558
  function isDirLikeSync(p2) {
45530
45559
  try {
45531
- return import_node_fs9.default.statSync(p2).isDirectory();
45560
+ return import_node_fs10.default.statSync(p2).isDirectory();
45532
45561
  } catch {
45533
45562
  return false;
45534
45563
  }
@@ -45536,7 +45565,7 @@ function isDirLikeSync(p2) {
45536
45565
  function scanSkillDir(dir, source, seen, out, pluginName) {
45537
45566
  let entries;
45538
45567
  try {
45539
- entries = import_node_fs9.default.readdirSync(dir, { withFileTypes: true });
45568
+ entries = import_node_fs10.default.readdirSync(dir, { withFileTypes: true });
45540
45569
  } catch {
45541
45570
  return;
45542
45571
  }
@@ -45545,10 +45574,10 @@ function scanSkillDir(dir, source, seen, out, pluginName) {
45545
45574
  if (!ent.isDirectory() && !(ent.isSymbolicLink() && isDirLikeSync(entryPath))) continue;
45546
45575
  let content;
45547
45576
  try {
45548
- content = import_node_fs9.default.readFileSync(import_node_path10.default.join(entryPath, "SKILL.md"), "utf8");
45577
+ content = import_node_fs10.default.readFileSync(import_node_path10.default.join(entryPath, "SKILL.md"), "utf8");
45549
45578
  } catch {
45550
45579
  try {
45551
- content = import_node_fs9.default.readFileSync(import_node_path10.default.join(entryPath, "skill.md"), "utf8");
45580
+ content = import_node_fs10.default.readFileSync(import_node_path10.default.join(entryPath, "skill.md"), "utf8");
45552
45581
  } catch {
45553
45582
  continue;
45554
45583
  }
@@ -45572,7 +45601,7 @@ function listSkillsForDir(dir, source) {
45572
45601
  function scanCommandDir(dir, source, seen, out, pluginName) {
45573
45602
  let entries;
45574
45603
  try {
45575
- entries = import_node_fs9.default.readdirSync(dir, { withFileTypes: true });
45604
+ entries = import_node_fs10.default.readdirSync(dir, { withFileTypes: true });
45576
45605
  } catch {
45577
45606
  return;
45578
45607
  }
@@ -45582,7 +45611,7 @@ function scanCommandDir(dir, source, seen, out, pluginName) {
45582
45611
  const ns = ent.name;
45583
45612
  let subEntries;
45584
45613
  try {
45585
- subEntries = import_node_fs9.default.readdirSync(entryPath, { withFileTypes: true });
45614
+ subEntries = import_node_fs10.default.readdirSync(entryPath, { withFileTypes: true });
45586
45615
  } catch {
45587
45616
  continue;
45588
45617
  }
@@ -45591,7 +45620,7 @@ function scanCommandDir(dir, source, seen, out, pluginName) {
45591
45620
  const sePath = import_node_path10.default.join(entryPath, se.name);
45592
45621
  let content;
45593
45622
  try {
45594
- content = import_node_fs9.default.readFileSync(sePath, "utf8");
45623
+ content = import_node_fs10.default.readFileSync(sePath, "utf8");
45595
45624
  } catch {
45596
45625
  continue;
45597
45626
  }
@@ -45608,7 +45637,7 @@ function scanCommandDir(dir, source, seen, out, pluginName) {
45608
45637
  } else if (ent.name.endsWith(".md")) {
45609
45638
  let content;
45610
45639
  try {
45611
- content = import_node_fs9.default.readFileSync(entryPath, "utf8");
45640
+ content = import_node_fs10.default.readFileSync(entryPath, "utf8");
45612
45641
  } catch {
45613
45642
  continue;
45614
45643
  }
@@ -45627,7 +45656,7 @@ function readInstalledPlugins(home) {
45627
45656
  const file = import_node_path10.default.join(home, ".claude", "plugins", "installed_plugins.json");
45628
45657
  let raw;
45629
45658
  try {
45630
- raw = import_node_fs9.default.readFileSync(file, "utf8");
45659
+ raw = import_node_fs10.default.readFileSync(file, "utf8");
45631
45660
  } catch {
45632
45661
  return [];
45633
45662
  }
@@ -45788,7 +45817,7 @@ var PersonaManager = class {
45788
45817
  };
45789
45818
 
45790
45819
  // src/persona/seed.ts
45791
- var fs11 = __toESM(require("fs"), 1);
45820
+ var fs12 = __toESM(require("fs"), 1);
45792
45821
  var path14 = __toESM(require("path"), 1);
45793
45822
  var import_node_url = require("url");
45794
45823
  var import_meta = {};
@@ -45959,7 +45988,7 @@ function bundleSiblingFromArgv(argv1, sibling) {
45959
45988
  if (!argv1) return null;
45960
45989
  let real = argv1;
45961
45990
  try {
45962
- real = fs11.realpathSync(argv1);
45991
+ real = fs12.realpathSync(argv1);
45963
45992
  } catch {
45964
45993
  }
45965
45994
  return path14.resolve(path14.dirname(real), sibling);
@@ -45976,7 +46005,7 @@ function findDefaultsRoot(logger) {
45976
46005
  if (fromArgv) candidates.push(fromArgv);
45977
46006
  for (const c of candidates) {
45978
46007
  try {
45979
- if (fs11.statSync(c).isDirectory()) {
46008
+ if (fs12.statSync(c).isDirectory()) {
45980
46009
  logger?.info("persona.defaults-root.resolved", { root: c });
45981
46010
  return c;
45982
46011
  }
@@ -45994,7 +46023,7 @@ function seedDefaultPersonas(args) {
45994
46023
  continue;
45995
46024
  }
45996
46025
  const bundleDir = path14.join(args.defaultsRoot, entry.personaId);
45997
- if (!fs11.existsSync(bundleDir)) {
46026
+ if (!fs12.existsSync(bundleDir)) {
45998
46027
  args.logger.warn("persona.seed.skip", {
45999
46028
  personaId: entry.personaId,
46000
46029
  reason: "bundle-missing",
@@ -46003,7 +46032,7 @@ function seedDefaultPersonas(args) {
46003
46032
  continue;
46004
46033
  }
46005
46034
  const claudeMdPath = path14.join(bundleDir, "CLAUDE.md");
46006
- if (!fs11.existsSync(claudeMdPath)) {
46035
+ if (!fs12.existsSync(claudeMdPath)) {
46007
46036
  args.logger.warn("persona.seed.skip", {
46008
46037
  personaId: entry.personaId,
46009
46038
  reason: "no-CLAUDE.md",
@@ -46011,7 +46040,7 @@ function seedDefaultPersonas(args) {
46011
46040
  });
46012
46041
  continue;
46013
46042
  }
46014
- const personality = fs11.readFileSync(claudeMdPath, "utf8");
46043
+ const personality = fs12.readFileSync(claudeMdPath, "utf8");
46015
46044
  const now = Date.now();
46016
46045
  const persona = {
46017
46046
  personaId: entry.personaId,
@@ -46040,14 +46069,14 @@ function skipNodeModulesUnder(srcRoot) {
46040
46069
  return (src) => !path14.relative(srcRoot, src).split(path14.sep).includes("node_modules");
46041
46070
  }
46042
46071
  function copyBundleExtras(srcDir, dstDir) {
46043
- for (const entry of fs11.readdirSync(srcDir, { withFileTypes: true })) {
46072
+ for (const entry of fs12.readdirSync(srcDir, { withFileTypes: true })) {
46044
46073
  if (entry.name === "CLAUDE.md" || entry.name === ".clawd") continue;
46045
46074
  const srcPath = path14.join(srcDir, entry.name);
46046
46075
  const dstPath = path14.join(dstDir, entry.name);
46047
46076
  if (entry.isDirectory()) {
46048
- fs11.cpSync(srcPath, dstPath, { recursive: true, dereference: true, filter: skipNodeModulesUnder(srcPath) });
46077
+ fs12.cpSync(srcPath, dstPath, { recursive: true, dereference: true, filter: skipNodeModulesUnder(srcPath) });
46049
46078
  } else if (entry.isFile()) {
46050
- fs11.copyFileSync(srcPath, dstPath);
46079
+ fs12.copyFileSync(srcPath, dstPath);
46051
46080
  }
46052
46081
  }
46053
46082
  }
@@ -46056,15 +46085,15 @@ function refreshDaemonManagedDirs(args) {
46056
46085
  const entries = args.entries ?? DEFAULT_PERSONAS;
46057
46086
  for (const entry of entries) {
46058
46087
  const bundleDir = path14.join(args.defaultsRoot, entry.personaId);
46059
- if (!fs11.existsSync(bundleDir)) continue;
46088
+ if (!fs12.existsSync(bundleDir)) continue;
46060
46089
  const personaDir = args.store.personaDirPath(entry.personaId);
46061
- if (!fs11.existsSync(personaDir)) continue;
46090
+ if (!fs12.existsSync(personaDir)) continue;
46062
46091
  for (const relPath of DAEMON_MANAGED_PATHS) {
46063
46092
  const srcPath = path14.join(bundleDir, relPath);
46064
- if (!fs11.existsSync(srcPath)) continue;
46093
+ if (!fs12.existsSync(srcPath)) continue;
46065
46094
  const dstPath = path14.join(personaDir, relPath);
46066
46095
  try {
46067
- fs11.cpSync(srcPath, dstPath, { recursive: true, force: true, dereference: true, filter: skipNodeModulesUnder(srcPath) });
46096
+ fs12.cpSync(srcPath, dstPath, { recursive: true, force: true, dereference: true, filter: skipNodeModulesUnder(srcPath) });
46068
46097
  args.logger.info("persona.refresh.synced", {
46069
46098
  personaId: entry.personaId,
46070
46099
  path: relPath
@@ -46132,7 +46161,7 @@ function findDeployKitRoot(logger) {
46132
46161
  if (fromArgv) candidates.push(fromArgv);
46133
46162
  for (const c of candidates) {
46134
46163
  try {
46135
- if (fs11.statSync(c).isDirectory()) {
46164
+ if (fs12.statSync(c).isDirectory()) {
46136
46165
  logger?.info("persona.deploy-kit-root.resolved", { root: c });
46137
46166
  return c;
46138
46167
  }
@@ -46144,7 +46173,7 @@ function findDeployKitRoot(logger) {
46144
46173
  }
46145
46174
  function seedDeployKit(args) {
46146
46175
  const dst = path14.join(args.dataDir, "deploy-kit");
46147
- fs11.cpSync(args.deployKitBundleRoot, dst, {
46176
+ fs12.cpSync(args.deployKitBundleRoot, dst, {
46148
46177
  recursive: true,
46149
46178
  dereference: true,
46150
46179
  force: false,
@@ -46154,34 +46183,34 @@ function seedDeployKit(args) {
46154
46183
  }
46155
46184
  function refreshDeployKit(args) {
46156
46185
  const dst = path14.join(args.dataDir, "deploy-kit");
46157
- if (!fs11.existsSync(dst)) {
46186
+ if (!fs12.existsSync(dst)) {
46158
46187
  seedDeployKit(args);
46159
46188
  return;
46160
46189
  }
46161
46190
  for (const sub of ["scripts", "contract"]) {
46162
46191
  const s = path14.join(args.deployKitBundleRoot, sub);
46163
- if (fs11.existsSync(s)) {
46164
- fs11.cpSync(s, path14.join(dst, sub), { recursive: true, force: true, dereference: true });
46192
+ if (fs12.existsSync(s)) {
46193
+ fs12.cpSync(s, path14.join(dst, sub), { recursive: true, force: true, dereference: true });
46165
46194
  }
46166
46195
  }
46167
46196
  const secretsSrc = path14.join(args.deployKitBundleRoot, ".secrets");
46168
- if (fs11.existsSync(secretsSrc)) {
46169
- fs11.mkdirSync(path14.join(dst, ".secrets"), { recursive: true });
46170
- for (const f of fs11.readdirSync(secretsSrc)) {
46197
+ if (fs12.existsSync(secretsSrc)) {
46198
+ fs12.mkdirSync(path14.join(dst, ".secrets"), { recursive: true });
46199
+ for (const f of fs12.readdirSync(secretsSrc)) {
46171
46200
  if (f.endsWith(".local")) continue;
46172
- fs11.copyFileSync(path14.join(secretsSrc, f), path14.join(dst, ".secrets", f));
46201
+ fs12.copyFileSync(path14.join(secretsSrc, f), path14.join(dst, ".secrets", f));
46173
46202
  }
46174
46203
  }
46175
46204
  args.logger.info("deploy-kit.refresh.done", { dst });
46176
46205
  }
46177
46206
 
46178
46207
  // src/share-md-viewer/load.ts
46179
- var import_node_fs11 = __toESM(require("fs"), 1);
46208
+ var import_node_fs12 = __toESM(require("fs"), 1);
46180
46209
  var import_node_path11 = __toESM(require("path"), 1);
46181
46210
  var import_node_url2 = require("url");
46182
46211
 
46183
46212
  // src/share-md-viewer/asset-loader.ts
46184
- var import_node_fs10 = __toESM(require("fs"), 1);
46213
+ var import_node_fs11 = __toESM(require("fs"), 1);
46185
46214
  function htmlEscape(s) {
46186
46215
  return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
46187
46216
  }
@@ -46189,12 +46218,12 @@ function createViewerAssetLoader(opts) {
46189
46218
  let viewerTemplate;
46190
46219
  let errorTemplate;
46191
46220
  try {
46192
- viewerTemplate = import_node_fs10.default.readFileSync(opts.viewerHtmlPath, "utf8");
46221
+ viewerTemplate = import_node_fs11.default.readFileSync(opts.viewerHtmlPath, "utf8");
46193
46222
  } catch (err) {
46194
46223
  throw new Error(`viewer asset not found at ${opts.viewerHtmlPath}: ${err.message}`);
46195
46224
  }
46196
46225
  try {
46197
- errorTemplate = import_node_fs10.default.readFileSync(opts.errorHtmlPath, "utf8");
46226
+ errorTemplate = import_node_fs11.default.readFileSync(opts.errorHtmlPath, "utf8");
46198
46227
  } catch (err) {
46199
46228
  throw new Error(`viewer error asset not found at ${opts.errorHtmlPath}: ${err.message}`);
46200
46229
  }
@@ -46222,7 +46251,7 @@ function tryLoadViewerAssets(logger) {
46222
46251
  if (process.argv[1]) {
46223
46252
  let real = process.argv[1];
46224
46253
  try {
46225
- real = import_node_fs11.default.realpathSync(process.argv[1]);
46254
+ real = import_node_fs12.default.realpathSync(process.argv[1]);
46226
46255
  } catch {
46227
46256
  }
46228
46257
  candidates.push(import_node_path11.default.dirname(real));
@@ -46231,7 +46260,7 @@ function tryLoadViewerAssets(logger) {
46231
46260
  const viewerHtmlPath = import_node_path11.default.join(root, "share-md-viewer.html");
46232
46261
  const errorHtmlPath = import_node_path11.default.join(root, "share-md-viewer-error.html");
46233
46262
  try {
46234
- if (import_node_fs11.default.statSync(viewerHtmlPath).isFile() && import_node_fs11.default.statSync(errorHtmlPath).isFile()) {
46263
+ if (import_node_fs12.default.statSync(viewerHtmlPath).isFile() && import_node_fs12.default.statSync(errorHtmlPath).isFile()) {
46235
46264
  logger?.info("share-md-viewer.assets-root.resolved", { root });
46236
46265
  return createViewerAssetLoader({ viewerHtmlPath, errorHtmlPath });
46237
46266
  }
@@ -46246,17 +46275,17 @@ function tryLoadViewerAssets(logger) {
46246
46275
  }
46247
46276
 
46248
46277
  // src/share-ui/load.ts
46249
- var import_node_fs13 = __toESM(require("fs"), 1);
46278
+ var import_node_fs14 = __toESM(require("fs"), 1);
46250
46279
  var import_node_path13 = __toESM(require("path"), 1);
46251
46280
  var import_node_url3 = require("url");
46252
46281
 
46253
46282
  // src/share-ui/asset-loader.ts
46254
- var import_node_fs12 = __toESM(require("fs"), 1);
46283
+ var import_node_fs13 = __toESM(require("fs"), 1);
46255
46284
  var import_node_path12 = __toESM(require("path"), 1);
46256
46285
  function createShareUiAssetLoader(opts) {
46257
46286
  let indexHtml;
46258
46287
  try {
46259
- indexHtml = import_node_fs12.default.readFileSync(opts.indexHtmlPath, "utf8");
46288
+ indexHtml = import_node_fs13.default.readFileSync(opts.indexHtmlPath, "utf8");
46260
46289
  } catch (err) {
46261
46290
  throw new Error(`share-ui index.html not found at ${opts.indexHtmlPath}: ${err.message}`);
46262
46291
  }
@@ -46269,7 +46298,7 @@ function createShareUiAssetLoader(opts) {
46269
46298
  const resolved = import_node_path12.default.resolve(assetsDir, rel);
46270
46299
  if (resolved !== assetsDir && !resolved.startsWith(assetsDir + import_node_path12.default.sep)) return null;
46271
46300
  try {
46272
- if (import_node_fs12.default.statSync(resolved).isFile()) return resolved;
46301
+ if (import_node_fs13.default.statSync(resolved).isFile()) return resolved;
46273
46302
  } catch {
46274
46303
  }
46275
46304
  return null;
@@ -46283,7 +46312,7 @@ function bundleDirFromArgv(argv1) {
46283
46312
  if (!argv1) return null;
46284
46313
  let real = argv1;
46285
46314
  try {
46286
- real = import_node_fs13.default.realpathSync(argv1);
46315
+ real = import_node_fs14.default.realpathSync(argv1);
46287
46316
  } catch {
46288
46317
  }
46289
46318
  return import_node_path13.default.dirname(real);
@@ -46304,7 +46333,7 @@ function tryLoadShareUi(logger) {
46304
46333
  const indexHtmlPath = import_node_path13.default.join(shareUiDir, "guest.html");
46305
46334
  const assetsDir = import_node_path13.default.join(shareUiDir, "assets");
46306
46335
  try {
46307
- if (import_node_fs13.default.statSync(indexHtmlPath).isFile() && import_node_fs13.default.statSync(assetsDir).isDirectory()) {
46336
+ if (import_node_fs14.default.statSync(indexHtmlPath).isFile() && import_node_fs14.default.statSync(assetsDir).isDirectory()) {
46308
46337
  logger?.info("share-ui.assets-root.resolved", { root: shareUiDir });
46309
46338
  return createShareUiAssetLoader({ indexHtmlPath, assetsDir });
46310
46339
  }
@@ -46386,20 +46415,20 @@ function buildVisitorLogin(deps) {
46386
46415
  }
46387
46416
 
46388
46417
  // src/visitor/visitor-store.ts
46389
- var import_node_fs14 = __toESM(require("fs"), 1);
46418
+ var import_node_fs15 = __toESM(require("fs"), 1);
46390
46419
  var import_node_path14 = __toESM(require("path"), 1);
46391
46420
  function createVisitorStore(opts) {
46392
46421
  const file = import_node_path14.default.join(opts.dir, "visitors.json");
46393
46422
  const read = () => {
46394
46423
  try {
46395
- return JSON.parse(import_node_fs14.default.readFileSync(file, "utf8"));
46424
+ return JSON.parse(import_node_fs15.default.readFileSync(file, "utf8"));
46396
46425
  } catch {
46397
46426
  return [];
46398
46427
  }
46399
46428
  };
46400
46429
  const write = (rows) => {
46401
- import_node_fs14.default.mkdirSync(opts.dir, { recursive: true });
46402
- import_node_fs14.default.writeFileSync(file, JSON.stringify(rows, null, 2));
46430
+ import_node_fs15.default.mkdirSync(opts.dir, { recursive: true });
46431
+ import_node_fs15.default.writeFileSync(file, JSON.stringify(rows, null, 2));
46403
46432
  };
46404
46433
  return {
46405
46434
  upsert(r) {
@@ -46433,7 +46462,7 @@ init_claude();
46433
46462
 
46434
46463
  // src/tools/codex.ts
46435
46464
  var import_node_child_process4 = require("child_process");
46436
- var import_node_fs16 = __toESM(require("fs"), 1);
46465
+ var import_node_fs17 = __toESM(require("fs"), 1);
46437
46466
 
46438
46467
  // src/tools/codex-session.ts
46439
46468
  var import_node_child_process3 = require("child_process");
@@ -46866,10 +46895,10 @@ function sanitizeCodexModel(model) {
46866
46895
  return CODEX_MODELS.some((m2) => m2.id === model) ? model : void 0;
46867
46896
  }
46868
46897
  async function probeCodex(env = process.env) {
46869
- if (env.CODEX_BIN && import_node_fs16.default.existsSync(env.CODEX_BIN)) return { available: true, path: env.CODEX_BIN };
46898
+ if (env.CODEX_BIN && import_node_fs17.default.existsSync(env.CODEX_BIN)) return { available: true, path: env.CODEX_BIN };
46870
46899
  try {
46871
46900
  const out = (0, import_node_child_process4.execFileSync)("which", ["codex"], { encoding: "utf8" }).trim();
46872
- if (out && import_node_fs16.default.existsSync(out)) return { available: true, path: out };
46901
+ if (out && import_node_fs17.default.existsSync(out)) return { available: true, path: out };
46873
46902
  } catch {
46874
46903
  }
46875
46904
  return { available: false };
@@ -46915,7 +46944,7 @@ var CodexAdapter = class {
46915
46944
 
46916
46945
  // src/tools/claude-tui.ts
46917
46946
  var import_node_crypto5 = require("crypto");
46918
- var import_node_fs17 = __toESM(require("fs"), 1);
46947
+ var import_node_fs18 = __toESM(require("fs"), 1);
46919
46948
  var import_node_os7 = __toESM(require("os"), 1);
46920
46949
  var import_node_path15 = __toESM(require("path"), 1);
46921
46950
  var import_headless = __toESM(require_xterm_headless(), 1);
@@ -48161,7 +48190,7 @@ function jsonlExistsForCtx(ctx) {
48161
48190
  const home = import_node_os7.default.homedir();
48162
48191
  const file = import_node_path15.default.join(home, ".claude", "projects", cwdToHashDir(ctx.cwd), `${ctx.toolSessionId}.jsonl`);
48163
48192
  try {
48164
- return import_node_fs17.default.statSync(file).isFile();
48193
+ return import_node_fs18.default.statSync(file).isFile();
48165
48194
  } catch {
48166
48195
  return false;
48167
48196
  }
@@ -48230,7 +48259,7 @@ var PersonaDispatchManager = class {
48230
48259
  };
48231
48260
 
48232
48261
  // src/dispatch/mcp-config.ts
48233
- var import_node_fs18 = __toESM(require("fs"), 1);
48262
+ var import_node_fs19 = __toESM(require("fs"), 1);
48234
48263
  var import_node_path16 = __toESM(require("path"), 1);
48235
48264
  function dispatchMcpConfigPath(dataDir) {
48236
48265
  return import_node_path16.default.join(dataDir, "dispatch.mcp.json");
@@ -48248,13 +48277,13 @@ function writeDispatchMcpConfig(args) {
48248
48277
  }
48249
48278
  }
48250
48279
  };
48251
- import_node_fs18.default.mkdirSync(args.dataDir, { recursive: true });
48252
- import_node_fs18.default.writeFileSync(cfgPath, JSON.stringify(content, null, 2), "utf8");
48280
+ import_node_fs19.default.mkdirSync(args.dataDir, { recursive: true });
48281
+ import_node_fs19.default.writeFileSync(cfgPath, JSON.stringify(content, null, 2), "utf8");
48253
48282
  return cfgPath;
48254
48283
  }
48255
48284
 
48256
48285
  // src/ticket/mcp-config.ts
48257
- var import_node_fs19 = __toESM(require("fs"), 1);
48286
+ var import_node_fs20 = __toESM(require("fs"), 1);
48258
48287
  var import_node_path17 = __toESM(require("path"), 1);
48259
48288
  function ticketMcpConfigPath(dataDir) {
48260
48289
  return import_node_path17.default.join(dataDir, "ticket.mcp.json");
@@ -48277,13 +48306,13 @@ function writeTicketMcpConfig(args) {
48277
48306
  }
48278
48307
  }
48279
48308
  };
48280
- import_node_fs19.default.mkdirSync(args.dataDir, { recursive: true });
48281
- import_node_fs19.default.writeFileSync(cfgPath, JSON.stringify(content, null, 2), "utf8");
48309
+ import_node_fs20.default.mkdirSync(args.dataDir, { recursive: true });
48310
+ import_node_fs20.default.writeFileSync(cfgPath, JSON.stringify(content, null, 2), "utf8");
48282
48311
  return cfgPath;
48283
48312
  }
48284
48313
 
48285
48314
  // src/shift/mcp-config.ts
48286
- var import_node_fs20 = __toESM(require("fs"), 1);
48315
+ var import_node_fs21 = __toESM(require("fs"), 1);
48287
48316
  var import_node_path18 = __toESM(require("path"), 1);
48288
48317
  function shiftMcpConfigPath(dataDir) {
48289
48318
  return import_node_path18.default.join(dataDir, "shift.mcp.json");
@@ -48301,13 +48330,13 @@ async function writeShiftMcpConfig(args) {
48301
48330
  }
48302
48331
  }
48303
48332
  };
48304
- await import_node_fs20.default.promises.mkdir(args.dataDir, { recursive: true });
48305
- await import_node_fs20.default.promises.writeFile(cfgPath, JSON.stringify(content, null, 2), "utf8");
48333
+ await import_node_fs21.default.promises.mkdir(args.dataDir, { recursive: true });
48334
+ await import_node_fs21.default.promises.writeFile(cfgPath, JSON.stringify(content, null, 2), "utf8");
48306
48335
  return cfgPath;
48307
48336
  }
48308
48337
 
48309
48338
  // src/inbox/mcp-config.ts
48310
- var import_node_fs21 = __toESM(require("fs"), 1);
48339
+ var import_node_fs22 = __toESM(require("fs"), 1);
48311
48340
  var import_node_path19 = __toESM(require("path"), 1);
48312
48341
  function inboxMcpConfigPath(dataDir) {
48313
48342
  return import_node_path19.default.join(dataDir, "inbox.mcp.json");
@@ -48325,8 +48354,8 @@ async function writeInboxMcpConfig(args) {
48325
48354
  }
48326
48355
  }
48327
48356
  };
48328
- await import_node_fs21.default.promises.mkdir(args.dataDir, { recursive: true });
48329
- await import_node_fs21.default.promises.writeFile(cfgPath, JSON.stringify(content, null, 2), "utf8");
48357
+ await import_node_fs22.default.promises.mkdir(args.dataDir, { recursive: true });
48358
+ await import_node_fs22.default.promises.writeFile(cfgPath, JSON.stringify(content, null, 2), "utf8");
48330
48359
  return cfgPath;
48331
48360
  }
48332
48361
 
@@ -49311,7 +49340,7 @@ async function listCodexSkills(cwd, deps = {}) {
49311
49340
  }
49312
49341
 
49313
49342
  // src/workspace/browser.ts
49314
- var import_node_fs22 = __toESM(require("fs"), 1);
49343
+ var import_node_fs23 = __toESM(require("fs"), 1);
49315
49344
  var import_node_os8 = __toESM(require("os"), 1);
49316
49345
  var import_node_path21 = __toESM(require("path"), 1);
49317
49346
  init_protocol();
@@ -49327,7 +49356,7 @@ function resolveInsideCwd(cwd, subpath) {
49327
49356
  }
49328
49357
  function ensureCwd(cwd) {
49329
49358
  try {
49330
- const stat = import_node_fs22.default.statSync(cwd);
49359
+ const stat = import_node_fs23.default.statSync(cwd);
49331
49360
  if (!stat.isDirectory()) {
49332
49361
  throw new ClawdError(ERROR_CODES.INVALID_CWD, `not a directory: ${cwd}`);
49333
49362
  }
@@ -49341,7 +49370,7 @@ var WorkspaceBrowser = class {
49341
49370
  const cwd = args.cwd && args.cwd.length > 0 ? args.cwd : import_node_os8.default.homedir();
49342
49371
  ensureCwd(cwd);
49343
49372
  const full = resolveInsideCwd(cwd, args.path);
49344
- const dirents = import_node_fs22.default.readdirSync(full, { withFileTypes: true });
49373
+ const dirents = import_node_fs23.default.readdirSync(full, { withFileTypes: true });
49345
49374
  const entries = [];
49346
49375
  for (const d of dirents) {
49347
49376
  if (!args.showHidden && d.name.startsWith(".")) continue;
@@ -49351,7 +49380,7 @@ var WorkspaceBrowser = class {
49351
49380
  mtime: ""
49352
49381
  };
49353
49382
  try {
49354
- const st = import_node_fs22.default.statSync(import_node_path21.default.join(full, d.name));
49383
+ const st = import_node_fs23.default.statSync(import_node_path21.default.join(full, d.name));
49355
49384
  entry.mtime = new Date(st.mtimeMs).toISOString();
49356
49385
  if (d.isFile()) entry.size = st.size;
49357
49386
  } catch {
@@ -49367,14 +49396,14 @@ var WorkspaceBrowser = class {
49367
49396
  read(args) {
49368
49397
  ensureCwd(args.cwd);
49369
49398
  const full = resolveInsideCwd(args.cwd, args.path);
49370
- const st = import_node_fs22.default.statSync(full);
49399
+ const st = import_node_fs23.default.statSync(full);
49371
49400
  if (!st.isFile()) {
49372
49401
  throw new ClawdError(ERROR_CODES.INVALID_PATH, `not a file: ${args.path}`);
49373
49402
  }
49374
49403
  if (st.size > MAX_FILE_BYTES) {
49375
49404
  throw new ClawdError(ERROR_CODES.FILE_TOO_LARGE, `file > ${MAX_FILE_BYTES} bytes`);
49376
49405
  }
49377
- const buf = import_node_fs22.default.readFileSync(full);
49406
+ const buf = import_node_fs23.default.readFileSync(full);
49378
49407
  const isBinary = buf.includes(0);
49379
49408
  if (isBinary) {
49380
49409
  return {
@@ -49396,20 +49425,20 @@ var WorkspaceBrowser = class {
49396
49425
  };
49397
49426
 
49398
49427
  // src/skills/agents-scanner.ts
49399
- var import_node_fs23 = __toESM(require("fs"), 1);
49428
+ var import_node_fs24 = __toESM(require("fs"), 1);
49400
49429
  var import_node_os9 = __toESM(require("os"), 1);
49401
49430
  var import_node_path22 = __toESM(require("path"), 1);
49402
49431
  var DEFAULT_POLICY_DIR_DARWIN = "/Library/Application Support/ClaudeCode/.claude/agents";
49403
49432
  function isDirLikeSync2(p2) {
49404
49433
  try {
49405
- return import_node_fs23.default.statSync(p2).isDirectory();
49434
+ return import_node_fs24.default.statSync(p2).isDirectory();
49406
49435
  } catch {
49407
49436
  return false;
49408
49437
  }
49409
49438
  }
49410
49439
  function fileExistsSync(p2) {
49411
49440
  try {
49412
- return import_node_fs23.default.statSync(p2).isFile();
49441
+ return import_node_fs24.default.statSync(p2).isFile();
49413
49442
  } catch {
49414
49443
  return false;
49415
49444
  }
@@ -49417,7 +49446,7 @@ function fileExistsSync(p2) {
49417
49446
  function parseAgentFile(filePath) {
49418
49447
  let content;
49419
49448
  try {
49420
- content = import_node_fs23.default.readFileSync(filePath, "utf8");
49449
+ content = import_node_fs24.default.readFileSync(filePath, "utf8");
49421
49450
  } catch {
49422
49451
  return {};
49423
49452
  }
@@ -49430,7 +49459,7 @@ function parseAgentFile(filePath) {
49430
49459
  function scanAgentsDir(dir, source, seen, out) {
49431
49460
  let entries;
49432
49461
  try {
49433
- entries = import_node_fs23.default.readdirSync(dir, { withFileTypes: true });
49462
+ entries = import_node_fs24.default.readdirSync(dir, { withFileTypes: true });
49434
49463
  } catch {
49435
49464
  return;
49436
49465
  }
@@ -49457,7 +49486,7 @@ function scanPluginAgentsTree(root, pluginName, seen, out) {
49457
49486
  function walk2(dir, namespaces) {
49458
49487
  let entries;
49459
49488
  try {
49460
- entries = import_node_fs23.default.readdirSync(dir, { withFileTypes: true });
49489
+ entries = import_node_fs24.default.readdirSync(dir, { withFileTypes: true });
49461
49490
  } catch {
49462
49491
  return;
49463
49492
  }
@@ -49493,7 +49522,7 @@ function readInstalledPlugins2(home) {
49493
49522
  let raw = null;
49494
49523
  for (const candidate of [v2, v1]) {
49495
49524
  try {
49496
- raw = import_node_fs23.default.readFileSync(candidate, "utf8");
49525
+ raw = import_node_fs24.default.readFileSync(candidate, "utf8");
49497
49526
  break;
49498
49527
  } catch {
49499
49528
  }
@@ -49524,7 +49553,7 @@ function walkUpProjectAgentsDirs(startCwd, home, seen, out) {
49524
49553
  scanAgentsDir(import_node_path22.default.join(cur, ".claude", "agents"), "project", seen, out);
49525
49554
  let hasGit = false;
49526
49555
  try {
49527
- hasGit = import_node_fs23.default.existsSync(import_node_path22.default.join(cur, ".git"));
49556
+ hasGit = import_node_fs24.default.existsSync(import_node_path22.default.join(cur, ".git"));
49528
49557
  } catch {
49529
49558
  }
49530
49559
  if (hasGit) return;
@@ -49587,13 +49616,13 @@ var AgentsScanner = class {
49587
49616
  };
49588
49617
 
49589
49618
  // src/observer/session-observer.ts
49590
- var import_node_fs25 = __toESM(require("fs"), 1);
49619
+ var import_node_fs26 = __toESM(require("fs"), 1);
49591
49620
  var import_node_os11 = __toESM(require("os"), 1);
49592
49621
  var import_node_path24 = __toESM(require("path"), 1);
49593
49622
  init_claude_history();
49594
49623
 
49595
49624
  // src/observer/subagent-meta-observer.ts
49596
- var import_node_fs24 = __toESM(require("fs"), 1);
49625
+ var import_node_fs25 = __toESM(require("fs"), 1);
49597
49626
  var import_node_os10 = __toESM(require("os"), 1);
49598
49627
  var import_node_path23 = __toESM(require("path"), 1);
49599
49628
  init_claude_history();
@@ -49638,7 +49667,7 @@ var SubagentMetaObserver = class {
49638
49667
  attachWatcher(w2) {
49639
49668
  if (w2.watcher) return;
49640
49669
  try {
49641
- w2.watcher = import_node_fs24.default.watch(w2.dirPath, { persistent: false }, (_evt, name) => {
49670
+ w2.watcher = import_node_fs25.default.watch(w2.dirPath, { persistent: false }, (_evt, name) => {
49642
49671
  if (!name) return;
49643
49672
  const m2 = META_RE.exec(String(name));
49644
49673
  if (!m2) return;
@@ -49650,7 +49679,7 @@ var SubagentMetaObserver = class {
49650
49679
  scan(w2) {
49651
49680
  let entries;
49652
49681
  try {
49653
- entries = import_node_fs24.default.readdirSync(w2.dirPath);
49682
+ entries = import_node_fs25.default.readdirSync(w2.dirPath);
49654
49683
  } catch {
49655
49684
  return;
49656
49685
  }
@@ -49667,7 +49696,7 @@ var SubagentMetaObserver = class {
49667
49696
  const file = import_node_path23.default.join(w2.dirPath, name);
49668
49697
  let raw;
49669
49698
  try {
49670
- raw = import_node_fs24.default.readFileSync(file, "utf8");
49699
+ raw = import_node_fs25.default.readFileSync(file, "utf8");
49671
49700
  } catch {
49672
49701
  return;
49673
49702
  }
@@ -49731,7 +49760,7 @@ var SessionObserver = class {
49731
49760
  const filePath = this.resolveJsonlPath(args.cwd, args.toolSessionId, args.jsonlPath);
49732
49761
  let size = 0;
49733
49762
  try {
49734
- size = import_node_fs25.default.statSync(filePath).size;
49763
+ size = import_node_fs26.default.statSync(filePath).size;
49735
49764
  } catch {
49736
49765
  }
49737
49766
  const w2 = {
@@ -49744,16 +49773,16 @@ var SessionObserver = class {
49744
49773
  adapter: args.adapter,
49745
49774
  prevIsRejectSentinel: false,
49746
49775
  toolSessionId: args.toolSessionId,
49747
- sawFile: import_node_fs25.default.existsSync(filePath),
49776
+ sawFile: import_node_fs26.default.existsSync(filePath),
49748
49777
  lastRelocateScanMs: 0,
49749
49778
  pendingCwdDerive: false,
49750
49779
  lastDeriveMs: 0
49751
49780
  };
49752
49781
  try {
49753
- import_node_fs25.default.mkdirSync(import_node_path24.default.dirname(filePath), { recursive: true });
49782
+ import_node_fs26.default.mkdirSync(import_node_path24.default.dirname(filePath), { recursive: true });
49754
49783
  } catch {
49755
49784
  }
49756
- w2.watcher = import_node_fs25.default.watch(import_node_path24.default.dirname(filePath), { persistent: false }, (_event, changedName) => {
49785
+ w2.watcher = import_node_fs26.default.watch(import_node_path24.default.dirname(filePath), { persistent: false }, (_event, changedName) => {
49757
49786
  if (!changedName || !w2.filePath.endsWith(changedName)) return;
49758
49787
  this.poll(w2);
49759
49788
  });
@@ -49776,7 +49805,7 @@ var SessionObserver = class {
49776
49805
  // 异常静默吞,不阻塞 watcher 启动
49777
49806
  hydrateMetaTail(w2, maxLines = 200) {
49778
49807
  try {
49779
- const raw = import_node_fs25.default.readFileSync(w2.filePath, "utf8");
49808
+ const raw = import_node_fs26.default.readFileSync(w2.filePath, "utf8");
49780
49809
  if (!raw) return;
49781
49810
  const allLines = raw.split("\n").filter((l) => l.trim().length > 0);
49782
49811
  if (allLines.length === 0) return;
@@ -49800,7 +49829,7 @@ var SessionObserver = class {
49800
49829
  poll(w2) {
49801
49830
  let size = 0;
49802
49831
  try {
49803
- size = import_node_fs25.default.statSync(w2.filePath).size;
49832
+ size = import_node_fs26.default.statSync(w2.filePath).size;
49804
49833
  } catch {
49805
49834
  if (w2.sawFile) this.maybeRelocate(w2);
49806
49835
  return;
@@ -49811,11 +49840,11 @@ var SessionObserver = class {
49811
49840
  w2.buf = "";
49812
49841
  }
49813
49842
  if (size === w2.lastSize) return;
49814
- const fd = import_node_fs25.default.openSync(w2.filePath, "r");
49843
+ const fd = import_node_fs26.default.openSync(w2.filePath, "r");
49815
49844
  try {
49816
49845
  const len = size - w2.lastSize;
49817
49846
  const buf = Buffer.alloc(len);
49818
- import_node_fs25.default.readSync(fd, buf, 0, len, w2.lastSize);
49847
+ import_node_fs26.default.readSync(fd, buf, 0, len, w2.lastSize);
49819
49848
  w2.lastSize = size;
49820
49849
  w2.buf += buf.toString("utf8");
49821
49850
  let newlineIndex;
@@ -49838,7 +49867,7 @@ var SessionObserver = class {
49838
49867
  }
49839
49868
  }
49840
49869
  } finally {
49841
- import_node_fs25.default.closeSync(fd);
49870
+ import_node_fs26.default.closeSync(fd);
49842
49871
  }
49843
49872
  if (w2.pendingCwdDerive) this.maybeDeriveCwd(w2);
49844
49873
  }
@@ -49859,7 +49888,7 @@ var SessionObserver = class {
49859
49888
  }
49860
49889
  w2.filePath = found;
49861
49890
  try {
49862
- w2.watcher = import_node_fs25.default.watch(import_node_path24.default.dirname(found), { persistent: false }, (_event, changedName) => {
49891
+ w2.watcher = import_node_fs26.default.watch(import_node_path24.default.dirname(found), { persistent: false }, (_event, changedName) => {
49863
49892
  if (!changedName || !w2.filePath.endsWith(changedName)) return;
49864
49893
  this.poll(w2);
49865
49894
  });
@@ -50710,14 +50739,14 @@ async function authenticate(token, deps) {
50710
50739
  }
50711
50740
 
50712
50741
  // src/permission/capability-store.ts
50713
- var fs29 = __toESM(require("fs"), 1);
50742
+ var fs30 = __toESM(require("fs"), 1);
50714
50743
  var path29 = __toESM(require("path"), 1);
50715
50744
  var CAPABILITIES_FILE_NAME = "capabilities.json";
50716
50745
  var FILE_VERSION = 1;
50717
50746
  var CapabilityStore = class {
50718
50747
  constructor(dataDir) {
50719
50748
  this.dataDir = dataDir;
50720
- fs29.mkdirSync(dataDir, { recursive: true });
50749
+ fs30.mkdirSync(dataDir, { recursive: true });
50721
50750
  this.cache = this.readFromDisk();
50722
50751
  }
50723
50752
  dataDir;
@@ -50747,7 +50776,7 @@ var CapabilityStore = class {
50747
50776
  const file = this.filePath();
50748
50777
  let raw;
50749
50778
  try {
50750
- raw = fs29.readFileSync(file, "utf8");
50779
+ raw = fs30.readFileSync(file, "utf8");
50751
50780
  } catch (err) {
50752
50781
  if (err?.code === "ENOENT") return [];
50753
50782
  return [];
@@ -50775,10 +50804,10 @@ var CapabilityStore = class {
50775
50804
  }
50776
50805
  atomicWrite(file, content) {
50777
50806
  const tmp = `${file}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`;
50778
- fs29.writeFileSync(tmp, content, { mode: 384 });
50779
- fs29.renameSync(tmp, file);
50807
+ fs30.writeFileSync(tmp, content, { mode: 384 });
50808
+ fs30.renameSync(tmp, file);
50780
50809
  try {
50781
- fs29.chmodSync(file, 384);
50810
+ fs30.chmodSync(file, 384);
50782
50811
  } catch {
50783
50812
  }
50784
50813
  }
@@ -50871,14 +50900,14 @@ var CapabilityManager = class {
50871
50900
  };
50872
50901
 
50873
50902
  // src/permission/cleanup.ts
50874
- var fs30 = __toESM(require("fs"), 1);
50903
+ var fs31 = __toESM(require("fs"), 1);
50875
50904
  function cleanupGuestSessionsForCapability(cap, factory) {
50876
50905
  const removed = [];
50877
50906
  for (const g2 of cap.grants) {
50878
50907
  if (g2.resource.type !== "persona") continue;
50879
50908
  const dir = factory.vmGuestRoot(g2.resource.id, cap.id);
50880
50909
  try {
50881
- fs30.rmSync(dir, { recursive: true, force: true });
50910
+ fs31.rmSync(dir, { recursive: true, force: true });
50882
50911
  removed.push(dir);
50883
50912
  } catch {
50884
50913
  }
@@ -50887,13 +50916,13 @@ function cleanupGuestSessionsForCapability(cap, factory) {
50887
50916
  }
50888
50917
 
50889
50918
  // src/inbox/inbox-store.ts
50890
- var fs31 = __toESM(require("fs"), 1);
50919
+ var fs32 = __toESM(require("fs"), 1);
50891
50920
  var path30 = __toESM(require("path"), 1);
50892
50921
  var INBOX_SUBDIR = "inbox";
50893
50922
  var InboxStore = class {
50894
50923
  constructor(dataDir) {
50895
50924
  this.dataDir = dataDir;
50896
- fs31.mkdirSync(this.dirPath(), { recursive: true });
50925
+ fs32.mkdirSync(this.dirPath(), { recursive: true });
50897
50926
  }
50898
50927
  dataDir;
50899
50928
  /**
@@ -50905,7 +50934,7 @@ var InboxStore = class {
50905
50934
  const file = this.filePath(peerDeviceId);
50906
50935
  let raw;
50907
50936
  try {
50908
- raw = fs31.readFileSync(file, "utf8");
50937
+ raw = fs32.readFileSync(file, "utf8");
50909
50938
  } catch (err) {
50910
50939
  if (err?.code === "ENOENT") return [];
50911
50940
  return [];
@@ -50921,7 +50950,7 @@ var InboxStore = class {
50921
50950
  const dir = this.dirPath();
50922
50951
  let entries;
50923
50952
  try {
50924
- entries = fs31.readdirSync(dir);
50953
+ entries = fs32.readdirSync(dir);
50925
50954
  } catch (err) {
50926
50955
  if (err?.code === "ENOENT") return [];
50927
50956
  return [];
@@ -50937,9 +50966,9 @@ var InboxStore = class {
50937
50966
  if (existing.some((m2) => m2.id === message.id)) return;
50938
50967
  const file = this.filePath(message.peerDeviceId);
50939
50968
  const line = JSON.stringify(message) + "\n";
50940
- fs31.appendFileSync(file, line, { mode: 384 });
50969
+ fs32.appendFileSync(file, line, { mode: 384 });
50941
50970
  try {
50942
- fs31.chmodSync(file, 384);
50971
+ fs32.chmodSync(file, 384);
50943
50972
  } catch {
50944
50973
  }
50945
50974
  }
@@ -50969,7 +50998,7 @@ var InboxStore = class {
50969
50998
  removeByPeerDeviceId(peerDeviceId) {
50970
50999
  const file = this.filePath(peerDeviceId);
50971
51000
  try {
50972
- fs31.unlinkSync(file);
51001
+ fs32.unlinkSync(file);
50973
51002
  } catch (err) {
50974
51003
  if (err?.code === "ENOENT") return;
50975
51004
  }
@@ -50978,10 +51007,10 @@ var InboxStore = class {
50978
51007
  const file = this.filePath(peerDeviceId);
50979
51008
  const tmp = `${file}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`;
50980
51009
  const content = messages.map((m2) => JSON.stringify(m2)).join("\n") + (messages.length > 0 ? "\n" : "");
50981
- fs31.writeFileSync(tmp, content, { mode: 384 });
50982
- fs31.renameSync(tmp, file);
51010
+ fs32.writeFileSync(tmp, content, { mode: 384 });
51011
+ fs32.renameSync(tmp, file);
50983
51012
  try {
50984
- fs31.chmodSync(file, 384);
51013
+ fs32.chmodSync(file, 384);
50985
51014
  } catch {
50986
51015
  }
50987
51016
  }
@@ -51077,7 +51106,7 @@ var InboxManager = class {
51077
51106
  };
51078
51107
 
51079
51108
  // src/state/contact-store.ts
51080
- var fs32 = __toESM(require("fs"), 1);
51109
+ var fs33 = __toESM(require("fs"), 1);
51081
51110
  var path31 = __toESM(require("path"), 1);
51082
51111
  var FILE_NAME = "contacts.json";
51083
51112
  var ContactStore = class {
@@ -51091,7 +51120,7 @@ var ContactStore = class {
51091
51120
  const file = path31.join(this.dataDir, FILE_NAME);
51092
51121
  let raw;
51093
51122
  try {
51094
- raw = fs32.readFileSync(file, "utf8");
51123
+ raw = fs33.readFileSync(file, "utf8");
51095
51124
  } catch (err) {
51096
51125
  if (err?.code !== "ENOENT") this.renameBak(file);
51097
51126
  return;
@@ -51170,13 +51199,13 @@ var ContactStore = class {
51170
51199
  null,
51171
51200
  2
51172
51201
  );
51173
- fs32.mkdirSync(this.dataDir, { recursive: true });
51174
- fs32.writeFileSync(tmp, content, { mode: 384 });
51175
- fs32.renameSync(tmp, file);
51202
+ fs33.mkdirSync(this.dataDir, { recursive: true });
51203
+ fs33.writeFileSync(tmp, content, { mode: 384 });
51204
+ fs33.renameSync(tmp, file);
51176
51205
  }
51177
51206
  renameBak(file) {
51178
51207
  try {
51179
- fs32.renameSync(file, `${file}.bak`);
51208
+ fs33.renameSync(file, `${file}.bak`);
51180
51209
  } catch {
51181
51210
  }
51182
51211
  }
@@ -51330,7 +51359,7 @@ async function autoReverseContact(args) {
51330
51359
  }
51331
51360
 
51332
51361
  // src/migrations/2026-05-20-flatten-sessions.ts
51333
- var fs33 = __toESM(require("fs"), 1);
51362
+ var fs34 = __toESM(require("fs"), 1);
51334
51363
  var path32 = __toESM(require("path"), 1);
51335
51364
  var MIGRATION_FLAG_NAME = ".migration.v1.done";
51336
51365
  function migrateFlattenSessions(opts) {
@@ -51350,7 +51379,7 @@ function migrateFlattenSessions(opts) {
51350
51379
  if (!entry.endsWith(".json")) continue;
51351
51380
  const src = path32.join(defaultDir, entry);
51352
51381
  const dst = path32.join(sessionsDir, entry);
51353
- fs33.renameSync(src, dst);
51382
+ fs34.renameSync(src, dst);
51354
51383
  movedBare += 1;
51355
51384
  }
51356
51385
  rmdirIfEmpty(defaultDir);
@@ -51362,10 +51391,10 @@ function migrateFlattenSessions(opts) {
51362
51391
  const ownerSrc = path32.join(personaDir, "owner");
51363
51392
  if (existsSync3(ownerSrc) && isDir(ownerSrc)) {
51364
51393
  const ownerDst = path32.join(dataDir, "personas", pid, ".clawd", "sessions", "owner");
51365
- fs33.mkdirSync(ownerDst, { recursive: true });
51394
+ fs34.mkdirSync(ownerDst, { recursive: true });
51366
51395
  for (const file of readdirSafe(ownerSrc)) {
51367
51396
  if (!file.endsWith(".json")) continue;
51368
- fs33.renameSync(path32.join(ownerSrc, file), path32.join(ownerDst, file));
51397
+ fs34.renameSync(path32.join(ownerSrc, file), path32.join(ownerDst, file));
51369
51398
  movedVmOwner += 1;
51370
51399
  }
51371
51400
  rmdirIfEmpty(ownerSrc);
@@ -51373,18 +51402,18 @@ function migrateFlattenSessions(opts) {
51373
51402
  const listenerSrc = path32.join(personaDir, "listener");
51374
51403
  if (existsSync3(listenerSrc) && isDir(listenerSrc)) {
51375
51404
  const archiveDst = path32.join(dataDir, ".legacy", `listener-${pid}`);
51376
- fs33.mkdirSync(archiveDst, { recursive: true });
51405
+ fs34.mkdirSync(archiveDst, { recursive: true });
51377
51406
  for (const file of readdirSafe(listenerSrc)) {
51378
51407
  if (!file.endsWith(".json")) continue;
51379
- fs33.renameSync(path32.join(listenerSrc, file), path32.join(archiveDst, file));
51408
+ fs34.renameSync(path32.join(listenerSrc, file), path32.join(archiveDst, file));
51380
51409
  archivedListener += 1;
51381
51410
  }
51382
51411
  rmdirIfEmpty(listenerSrc);
51383
51412
  }
51384
51413
  rmdirIfEmpty(personaDir);
51385
51414
  }
51386
- fs33.mkdirSync(sessionsDir, { recursive: true });
51387
- fs33.writeFileSync(flagPath, JSON.stringify({ migratedAt: now() }, null, 2));
51415
+ fs34.mkdirSync(sessionsDir, { recursive: true });
51416
+ fs34.writeFileSync(flagPath, JSON.stringify({ migratedAt: now() }, null, 2));
51388
51417
  return {
51389
51418
  skipped: false,
51390
51419
  flagWritten: true,
@@ -51395,7 +51424,7 @@ function migrateFlattenSessions(opts) {
51395
51424
  }
51396
51425
  function existsSync3(p2) {
51397
51426
  try {
51398
- fs33.statSync(p2);
51427
+ fs34.statSync(p2);
51399
51428
  return true;
51400
51429
  } catch {
51401
51430
  return false;
@@ -51403,27 +51432,27 @@ function existsSync3(p2) {
51403
51432
  }
51404
51433
  function isDir(p2) {
51405
51434
  try {
51406
- return fs33.statSync(p2).isDirectory();
51435
+ return fs34.statSync(p2).isDirectory();
51407
51436
  } catch {
51408
51437
  return false;
51409
51438
  }
51410
51439
  }
51411
51440
  function readdirSafe(p2) {
51412
51441
  try {
51413
- return fs33.readdirSync(p2);
51442
+ return fs34.readdirSync(p2);
51414
51443
  } catch {
51415
51444
  return [];
51416
51445
  }
51417
51446
  }
51418
51447
  function rmdirIfEmpty(p2) {
51419
51448
  try {
51420
- fs33.rmdirSync(p2);
51449
+ fs34.rmdirSync(p2);
51421
51450
  } catch {
51422
51451
  }
51423
51452
  }
51424
51453
 
51425
51454
  // src/transport/http-router.ts
51426
- var import_node_fs27 = __toESM(require("fs"), 1);
51455
+ var import_node_fs28 = __toESM(require("fs"), 1);
51427
51456
  var import_node_path28 = __toESM(require("path"), 1);
51428
51457
 
51429
51458
  // src/attachment/mime.ts
@@ -51603,7 +51632,7 @@ function verifySignedUrl(secret, absPath, eRaw, s, now = Date.now) {
51603
51632
  }
51604
51633
 
51605
51634
  // src/attachment/upload.ts
51606
- var import_node_fs26 = __toESM(require("fs"), 1);
51635
+ var import_node_fs27 = __toESM(require("fs"), 1);
51607
51636
  var import_node_path26 = __toESM(require("path"), 1);
51608
51637
  var import_node_crypto8 = __toESM(require("crypto"), 1);
51609
51638
  var import_promises2 = require("stream/promises");
@@ -51625,7 +51654,7 @@ async function writeUploadedAttachment(args) {
51625
51654
  assertValidFileName(args.fileName);
51626
51655
  const attachmentsRoot = import_node_path26.default.join(args.sessionDir, ".attachments");
51627
51656
  try {
51628
- import_node_fs26.default.mkdirSync(attachmentsRoot, { recursive: true });
51657
+ import_node_fs27.default.mkdirSync(attachmentsRoot, { recursive: true });
51629
51658
  } catch (err) {
51630
51659
  throw new UploadError("STORAGE_ERROR", `mkdir failed: ${err.message}`);
51631
51660
  }
@@ -51646,18 +51675,18 @@ async function writeUploadedAttachment(args) {
51646
51675
  yield buf;
51647
51676
  }
51648
51677
  },
51649
- import_node_fs26.default.createWriteStream(tmpPath, { mode: 384 })
51678
+ import_node_fs27.default.createWriteStream(tmpPath, { mode: 384 })
51650
51679
  );
51651
51680
  } catch (err) {
51652
51681
  try {
51653
- import_node_fs26.default.unlinkSync(tmpPath);
51682
+ import_node_fs27.default.unlinkSync(tmpPath);
51654
51683
  } catch {
51655
51684
  }
51656
51685
  throw new UploadError("STORAGE_ERROR", `write failed: ${err.message}`);
51657
51686
  }
51658
51687
  if (actualSize !== args.contentLength) {
51659
51688
  try {
51660
- import_node_fs26.default.unlinkSync(tmpPath);
51689
+ import_node_fs27.default.unlinkSync(tmpPath);
51661
51690
  } catch {
51662
51691
  }
51663
51692
  throw new UploadError(
@@ -51670,24 +51699,24 @@ async function writeUploadedAttachment(args) {
51670
51699
  let finalFileName;
51671
51700
  let hashDirExists = false;
51672
51701
  try {
51673
- hashDirExists = import_node_fs26.default.statSync(hashDir).isDirectory();
51702
+ hashDirExists = import_node_fs27.default.statSync(hashDir).isDirectory();
51674
51703
  } catch {
51675
51704
  }
51676
51705
  if (hashDirExists) {
51677
- const existing = import_node_fs26.default.readdirSync(hashDir).filter((n) => !n.startsWith("."));
51706
+ const existing = import_node_fs27.default.readdirSync(hashDir).filter((n) => !n.startsWith("."));
51678
51707
  finalFileName = existing[0] ?? args.fileName;
51679
51708
  try {
51680
- import_node_fs26.default.unlinkSync(tmpPath);
51709
+ import_node_fs27.default.unlinkSync(tmpPath);
51681
51710
  } catch {
51682
51711
  }
51683
51712
  } else {
51684
51713
  try {
51685
- import_node_fs26.default.mkdirSync(hashDir, { recursive: true });
51714
+ import_node_fs27.default.mkdirSync(hashDir, { recursive: true });
51686
51715
  finalFileName = args.fileName;
51687
- import_node_fs26.default.renameSync(tmpPath, import_node_path26.default.join(hashDir, finalFileName));
51716
+ import_node_fs27.default.renameSync(tmpPath, import_node_path26.default.join(hashDir, finalFileName));
51688
51717
  } catch (err) {
51689
51718
  try {
51690
- import_node_fs26.default.unlinkSync(tmpPath);
51719
+ import_node_fs27.default.unlinkSync(tmpPath);
51691
51720
  } catch {
51692
51721
  }
51693
51722
  throw new UploadError("STORAGE_ERROR", `rename failed: ${err.message}`);
@@ -51967,7 +51996,7 @@ function createHttpRouter(deps) {
51967
51996
  }
51968
51997
  let buf;
51969
51998
  try {
51970
- buf = await import_node_fs27.default.promises.readFile(abs);
51999
+ buf = await import_node_fs28.default.promises.readFile(abs);
51971
52000
  } catch {
51972
52001
  sendJson(res, 404, { code: "NOT_FOUND", message: "asset not found" });
51973
52002
  return true;
@@ -52407,7 +52436,7 @@ function withCtx(ctx, body) {
52407
52436
  function streamFile(res, absPath, logger) {
52408
52437
  let stat;
52409
52438
  try {
52410
- stat = import_node_fs27.default.statSync(absPath);
52439
+ stat = import_node_fs28.default.statSync(absPath);
52411
52440
  } catch (err) {
52412
52441
  const code = err?.code;
52413
52442
  if (code === "ENOENT") {
@@ -52430,7 +52459,7 @@ function streamFile(res, absPath, logger) {
52430
52459
  // 防止浏览器把任意 mime 当 html 渲染
52431
52460
  "X-Content-Type-Options": "nosniff"
52432
52461
  });
52433
- const stream = import_node_fs27.default.createReadStream(absPath);
52462
+ const stream = import_node_fs28.default.createReadStream(absPath);
52434
52463
  stream.on("error", (err) => {
52435
52464
  logger?.warn("streamFile read error", { absPath, err: err.message });
52436
52465
  res.destroy();
@@ -52439,7 +52468,7 @@ function streamFile(res, absPath, logger) {
52439
52468
  }
52440
52469
 
52441
52470
  // src/attachment/gc.ts
52442
- var import_node_fs28 = __toESM(require("fs"), 1);
52471
+ var import_node_fs29 = __toESM(require("fs"), 1);
52443
52472
  var import_node_path29 = __toESM(require("path"), 1);
52444
52473
  var DEFAULT_TTL_MS = 30 * 24 * 3600 * 1e3;
52445
52474
  function runAttachmentGc(args) {
@@ -52462,7 +52491,7 @@ function runAttachmentGc(args) {
52462
52491
  const attRoot = import_node_path29.default.join(sessionDir, ".attachments");
52463
52492
  let hashDirs;
52464
52493
  try {
52465
- hashDirs = import_node_fs28.default.readdirSync(attRoot);
52494
+ hashDirs = import_node_fs29.default.readdirSync(attRoot);
52466
52495
  } catch (err) {
52467
52496
  if (err.code === "ENOENT") continue;
52468
52497
  args.logger?.warn("attachment gc: readdir failed", { attRoot, err: err.message });
@@ -52472,7 +52501,7 @@ function runAttachmentGc(args) {
52472
52501
  const hashDirAbs = import_node_path29.default.join(attRoot, hashDir);
52473
52502
  let files;
52474
52503
  try {
52475
- files = import_node_fs28.default.readdirSync(hashDirAbs);
52504
+ files = import_node_fs29.default.readdirSync(hashDirAbs);
52476
52505
  } catch {
52477
52506
  continue;
52478
52507
  }
@@ -52480,7 +52509,7 @@ function runAttachmentGc(args) {
52480
52509
  const file = import_node_path29.default.join(hashDirAbs, name);
52481
52510
  let stat;
52482
52511
  try {
52483
- stat = import_node_fs28.default.statSync(file);
52512
+ stat = import_node_fs29.default.statSync(file);
52484
52513
  } catch {
52485
52514
  continue;
52486
52515
  }
@@ -52489,25 +52518,25 @@ function runAttachmentGc(args) {
52489
52518
  if (age < ttlMs) continue;
52490
52519
  if (liveAbs.has(file)) continue;
52491
52520
  try {
52492
- import_node_fs28.default.unlinkSync(file);
52521
+ import_node_fs29.default.unlinkSync(file);
52493
52522
  } catch (err) {
52494
52523
  args.logger?.warn("attachment gc: unlink failed", { file, err: err.message });
52495
52524
  }
52496
52525
  }
52497
52526
  try {
52498
- if (import_node_fs28.default.readdirSync(hashDirAbs).length === 0) import_node_fs28.default.rmdirSync(hashDirAbs);
52527
+ if (import_node_fs29.default.readdirSync(hashDirAbs).length === 0) import_node_fs29.default.rmdirSync(hashDirAbs);
52499
52528
  } catch {
52500
52529
  }
52501
52530
  }
52502
52531
  try {
52503
- if (import_node_fs28.default.readdirSync(attRoot).length === 0) import_node_fs28.default.rmdirSync(attRoot);
52532
+ if (import_node_fs29.default.readdirSync(attRoot).length === 0) import_node_fs29.default.rmdirSync(attRoot);
52504
52533
  } catch {
52505
52534
  }
52506
52535
  }
52507
52536
  }
52508
52537
 
52509
52538
  // src/attachment/group.ts
52510
- var import_node_fs29 = __toESM(require("fs"), 1);
52539
+ var import_node_fs30 = __toESM(require("fs"), 1);
52511
52540
  var import_node_path30 = __toESM(require("path"), 1);
52512
52541
  var import_node_crypto9 = __toESM(require("crypto"), 1);
52513
52542
  init_protocol();
@@ -52533,7 +52562,7 @@ var GroupFileStore = class {
52533
52562
  readFile(scope, sessionId) {
52534
52563
  const file = this.filePath(scope, sessionId);
52535
52564
  try {
52536
- const raw = import_node_fs29.default.readFileSync(file, "utf8");
52565
+ const raw = import_node_fs30.default.readFileSync(file, "utf8");
52537
52566
  const parsed = JSON.parse(raw);
52538
52567
  if (!Array.isArray(parsed)) {
52539
52568
  this.logger?.warn("GroupFileStore.readFile: not an array; resetting session entries", {
@@ -52559,10 +52588,10 @@ var GroupFileStore = class {
52559
52588
  }
52560
52589
  writeFile(scope, sessionId, entries) {
52561
52590
  const file = this.filePath(scope, sessionId);
52562
- import_node_fs29.default.mkdirSync(import_node_path30.default.dirname(file), { recursive: true });
52591
+ import_node_fs30.default.mkdirSync(import_node_path30.default.dirname(file), { recursive: true });
52563
52592
  const tmp = `${file}.tmp-${process.pid}-${Date.now()}`;
52564
- import_node_fs29.default.writeFileSync(tmp, JSON.stringify(entries, null, 2), { mode: 384 });
52565
- import_node_fs29.default.renameSync(tmp, file);
52593
+ import_node_fs30.default.writeFileSync(tmp, JSON.stringify(entries, null, 2), { mode: 384 });
52594
+ import_node_fs30.default.renameSync(tmp, file);
52566
52595
  }
52567
52596
  /** 拉一份当前 session 的清单。读盘 → cache;之后调用复用 cache */
52568
52597
  list(scope, sessionId) {
@@ -52648,7 +52677,7 @@ var GroupFileStore = class {
52648
52677
  };
52649
52678
 
52650
52679
  // src/discovery/state-file.ts
52651
- var import_node_fs30 = __toESM(require("fs"), 1);
52680
+ var import_node_fs31 = __toESM(require("fs"), 1);
52652
52681
  var import_node_path31 = __toESM(require("path"), 1);
52653
52682
  function defaultStateFilePath(dataDir) {
52654
52683
  return import_node_path31.default.join(dataDir, "state.json");
@@ -52673,7 +52702,7 @@ var StateFileManager = class {
52673
52702
  }
52674
52703
  read() {
52675
52704
  try {
52676
- const raw = import_node_fs30.default.readFileSync(this.file, "utf8");
52705
+ const raw = import_node_fs31.default.readFileSync(this.file, "utf8");
52677
52706
  const parsed = JSON.parse(raw);
52678
52707
  return parsed;
52679
52708
  } catch {
@@ -52687,20 +52716,20 @@ var StateFileManager = class {
52687
52716
  return { status: "stale", existing };
52688
52717
  }
52689
52718
  write(state) {
52690
- import_node_fs30.default.mkdirSync(import_node_path31.default.dirname(this.file), { recursive: true });
52719
+ import_node_fs31.default.mkdirSync(import_node_path31.default.dirname(this.file), { recursive: true });
52691
52720
  const tmp = `${this.file}.tmp.${process.pid}.${Date.now()}`;
52692
- import_node_fs30.default.writeFileSync(tmp, JSON.stringify(state, null, 2), { mode: 384 });
52693
- import_node_fs30.default.renameSync(tmp, this.file);
52721
+ import_node_fs31.default.writeFileSync(tmp, JSON.stringify(state, null, 2), { mode: 384 });
52722
+ import_node_fs31.default.renameSync(tmp, this.file);
52694
52723
  if (process.platform !== "win32") {
52695
52724
  try {
52696
- import_node_fs30.default.chmodSync(this.file, 384);
52725
+ import_node_fs31.default.chmodSync(this.file, 384);
52697
52726
  } catch {
52698
52727
  }
52699
52728
  }
52700
52729
  }
52701
52730
  delete() {
52702
52731
  try {
52703
- import_node_fs30.default.unlinkSync(this.file);
52732
+ import_node_fs31.default.unlinkSync(this.file);
52704
52733
  } catch {
52705
52734
  }
52706
52735
  }
@@ -52714,13 +52743,13 @@ function readSpawnedByDesktopFromEnv(env = process.env) {
52714
52743
  }
52715
52744
 
52716
52745
  // src/tunnel/tunnel-manager.ts
52717
- var import_node_fs34 = __toESM(require("fs"), 1);
52746
+ var import_node_fs35 = __toESM(require("fs"), 1);
52718
52747
  var import_node_path35 = __toESM(require("path"), 1);
52719
52748
  var import_node_crypto10 = __toESM(require("crypto"), 1);
52720
52749
  var import_node_child_process9 = require("child_process");
52721
52750
 
52722
52751
  // src/tunnel/tunnel-store.ts
52723
- var import_node_fs31 = __toESM(require("fs"), 1);
52752
+ var import_node_fs32 = __toESM(require("fs"), 1);
52724
52753
  var import_node_path32 = __toESM(require("path"), 1);
52725
52754
  var TunnelStore = class {
52726
52755
  constructor(filePath) {
@@ -52729,7 +52758,7 @@ var TunnelStore = class {
52729
52758
  filePath;
52730
52759
  async get() {
52731
52760
  try {
52732
- const raw = await import_node_fs31.default.promises.readFile(this.filePath, "utf8");
52761
+ const raw = await import_node_fs32.default.promises.readFile(this.filePath, "utf8");
52733
52762
  const obj = JSON.parse(raw);
52734
52763
  if (!isPersistedTunnel(obj)) return null;
52735
52764
  return obj;
@@ -52741,21 +52770,21 @@ var TunnelStore = class {
52741
52770
  }
52742
52771
  async set(v2) {
52743
52772
  const dir = import_node_path32.default.dirname(this.filePath);
52744
- await import_node_fs31.default.promises.mkdir(dir, { recursive: true });
52773
+ await import_node_fs32.default.promises.mkdir(dir, { recursive: true });
52745
52774
  const data = JSON.stringify(v2, null, 2);
52746
52775
  const tmp = `${this.filePath}.tmp.${process.pid}.${Date.now()}`;
52747
- await import_node_fs31.default.promises.writeFile(tmp, data, { mode: 384 });
52776
+ await import_node_fs32.default.promises.writeFile(tmp, data, { mode: 384 });
52748
52777
  if (process.platform !== "win32") {
52749
52778
  try {
52750
- await import_node_fs31.default.promises.chmod(tmp, 384);
52779
+ await import_node_fs32.default.promises.chmod(tmp, 384);
52751
52780
  } catch {
52752
52781
  }
52753
52782
  }
52754
- await import_node_fs31.default.promises.rename(tmp, this.filePath);
52783
+ await import_node_fs32.default.promises.rename(tmp, this.filePath);
52755
52784
  }
52756
52785
  async clear() {
52757
52786
  try {
52758
- await import_node_fs31.default.promises.unlink(this.filePath);
52787
+ await import_node_fs32.default.promises.unlink(this.filePath);
52759
52788
  } catch (err) {
52760
52789
  const code = err?.code;
52761
52790
  if (code !== "ENOENT") throw err;
@@ -52850,7 +52879,7 @@ function escape(v2) {
52850
52879
  }
52851
52880
 
52852
52881
  // src/tunnel/frpc-binary.ts
52853
- var import_node_fs32 = __toESM(require("fs"), 1);
52882
+ var import_node_fs33 = __toESM(require("fs"), 1);
52854
52883
  var import_node_os13 = __toESM(require("os"), 1);
52855
52884
  var import_node_path33 = __toESM(require("path"), 1);
52856
52885
  var import_node_child_process7 = require("child_process");
@@ -52884,7 +52913,7 @@ function frpcDownloadUrl(version2, p2) {
52884
52913
  }
52885
52914
  async function ensureFrpcBinary(opts) {
52886
52915
  if (opts.override) {
52887
- if (!import_node_fs32.default.existsSync(opts.override)) {
52916
+ if (!import_node_fs33.default.existsSync(opts.override)) {
52888
52917
  throw new Error(`frpc binary not found at override path: ${opts.override}`);
52889
52918
  }
52890
52919
  return opts.override;
@@ -52892,10 +52921,10 @@ async function ensureFrpcBinary(opts) {
52892
52921
  const version2 = opts.version ?? FRPC_VERSION;
52893
52922
  const platform = opts.platform ?? detectPlatform();
52894
52923
  const binDir = import_node_path33.default.join(opts.dataDir, "bin");
52895
- import_node_fs32.default.mkdirSync(binDir, { recursive: true });
52924
+ import_node_fs33.default.mkdirSync(binDir, { recursive: true });
52896
52925
  cleanupStaleArtifacts(binDir);
52897
52926
  const stableBin = import_node_path33.default.join(binDir, "frpc");
52898
- if (import_node_fs32.default.existsSync(stableBin)) return stableBin;
52927
+ if (import_node_fs33.default.existsSync(stableBin)) return stableBin;
52899
52928
  const partialBin = `${stableBin}.partial`;
52900
52929
  const tarballPath = import_node_path33.default.join(binDir, `frp_${version2}_${platform.os}_${platform.arch}.tar.gz.partial`);
52901
52930
  try {
@@ -52906,8 +52935,8 @@ async function ensureFrpcBinary(opts) {
52906
52935
  } else {
52907
52936
  await extractFrpcFromTarball(tarballPath, binDir, version2, platform, partialBin);
52908
52937
  }
52909
- import_node_fs32.default.chmodSync(partialBin, 493);
52910
- import_node_fs32.default.renameSync(partialBin, stableBin);
52938
+ import_node_fs33.default.chmodSync(partialBin, 493);
52939
+ import_node_fs33.default.renameSync(partialBin, stableBin);
52911
52940
  } finally {
52912
52941
  safeUnlink(tarballPath);
52913
52942
  safeUnlink(partialBin);
@@ -52917,7 +52946,7 @@ async function ensureFrpcBinary(opts) {
52917
52946
  function cleanupStaleArtifacts(binDir) {
52918
52947
  let entries;
52919
52948
  try {
52920
- entries = import_node_fs32.default.readdirSync(binDir);
52949
+ entries = import_node_fs33.default.readdirSync(binDir);
52921
52950
  } catch {
52922
52951
  return;
52923
52952
  }
@@ -52925,7 +52954,7 @@ function cleanupStaleArtifacts(binDir) {
52925
52954
  if (name.endsWith(".partial") || name.startsWith("extract-")) {
52926
52955
  const full = import_node_path33.default.join(binDir, name);
52927
52956
  try {
52928
- import_node_fs32.default.rmSync(full, { recursive: true, force: true });
52957
+ import_node_fs33.default.rmSync(full, { recursive: true, force: true });
52929
52958
  } catch {
52930
52959
  }
52931
52960
  }
@@ -52933,7 +52962,7 @@ function cleanupStaleArtifacts(binDir) {
52933
52962
  }
52934
52963
  function safeUnlink(p2) {
52935
52964
  try {
52936
- import_node_fs32.default.unlinkSync(p2);
52965
+ import_node_fs33.default.unlinkSync(p2);
52937
52966
  } catch {
52938
52967
  }
52939
52968
  }
@@ -52944,13 +52973,13 @@ async function downloadToFile(url, dest, fetchImpl) {
52944
52973
  if (!res.ok || !res.body) {
52945
52974
  throw new Error(`download failed: ${res.status} ${res.statusText}`);
52946
52975
  }
52947
- const out = import_node_fs32.default.createWriteStream(dest);
52976
+ const out = import_node_fs33.default.createWriteStream(dest);
52948
52977
  const nodeStream = import_node_stream3.Readable.fromWeb(res.body);
52949
52978
  await (0, import_promises4.pipeline)(nodeStream, out);
52950
52979
  }
52951
52980
  async function extractFrpcFromTarball(tarball, binDir, version2, platform, destBin) {
52952
52981
  const work = import_node_path33.default.join(binDir, `extract-${process.pid}-${Date.now()}`);
52953
- import_node_fs32.default.mkdirSync(work, { recursive: true });
52982
+ import_node_fs33.default.mkdirSync(work, { recursive: true });
52954
52983
  try {
52955
52984
  await new Promise((resolve6, reject) => {
52956
52985
  const proc = (0, import_node_child_process7.spawn)("tar", ["xzf", tarball, "-C", work], { stdio: "pipe" });
@@ -52959,17 +52988,17 @@ async function extractFrpcFromTarball(tarball, binDir, version2, platform, destB
52959
52988
  });
52960
52989
  const dirName = `frp_${version2}_${platform.os}_${platform.arch}`;
52961
52990
  const src = import_node_path33.default.join(work, dirName, "frpc");
52962
- if (!import_node_fs32.default.existsSync(src)) {
52991
+ if (!import_node_fs33.default.existsSync(src)) {
52963
52992
  throw new Error(`frpc not found inside tarball at ${src}`);
52964
52993
  }
52965
- import_node_fs32.default.copyFileSync(src, destBin);
52994
+ import_node_fs33.default.copyFileSync(src, destBin);
52966
52995
  } finally {
52967
- import_node_fs32.default.rmSync(work, { recursive: true, force: true });
52996
+ import_node_fs33.default.rmSync(work, { recursive: true, force: true });
52968
52997
  }
52969
52998
  }
52970
52999
 
52971
53000
  // src/tunnel/frpc-process.ts
52972
- var import_node_fs33 = __toESM(require("fs"), 1);
53001
+ var import_node_fs34 = __toESM(require("fs"), 1);
52973
53002
  var import_node_path34 = __toESM(require("path"), 1);
52974
53003
  var import_node_child_process8 = require("child_process");
52975
53004
  function frpcPidFilePath(dataDir) {
@@ -52977,13 +53006,13 @@ function frpcPidFilePath(dataDir) {
52977
53006
  }
52978
53007
  function writeFrpcPid(dataDir, pid) {
52979
53008
  try {
52980
- import_node_fs33.default.writeFileSync(frpcPidFilePath(dataDir), String(pid), { mode: 384 });
53009
+ import_node_fs34.default.writeFileSync(frpcPidFilePath(dataDir), String(pid), { mode: 384 });
52981
53010
  } catch {
52982
53011
  }
52983
53012
  }
52984
53013
  function clearFrpcPid(dataDir) {
52985
53014
  try {
52986
- import_node_fs33.default.unlinkSync(frpcPidFilePath(dataDir));
53015
+ import_node_fs34.default.unlinkSync(frpcPidFilePath(dataDir));
52987
53016
  } catch {
52988
53017
  }
52989
53018
  }
@@ -52999,7 +53028,7 @@ function defaultIsPidAlive(pid) {
52999
53028
  }
53000
53029
  function defaultReadPidFile(file) {
53001
53030
  try {
53002
- return import_node_fs33.default.readFileSync(file, "utf8");
53031
+ return import_node_fs34.default.readFileSync(file, "utf8");
53003
53032
  } catch {
53004
53033
  return null;
53005
53034
  }
@@ -53039,7 +53068,7 @@ async function killStaleFrpc(deps) {
53039
53068
  }
53040
53069
  if (victims.size === 0) {
53041
53070
  try {
53042
- import_node_fs33.default.unlinkSync(pidFile);
53071
+ import_node_fs34.default.unlinkSync(pidFile);
53043
53072
  } catch {
53044
53073
  }
53045
53074
  return;
@@ -53050,7 +53079,7 @@ async function killStaleFrpc(deps) {
53050
53079
  }
53051
53080
  await sleep2(deps.reapWaitMs ?? 300);
53052
53081
  try {
53053
- import_node_fs33.default.unlinkSync(pidFile);
53082
+ import_node_fs34.default.unlinkSync(pidFile);
53054
53083
  } catch {
53055
53084
  }
53056
53085
  }
@@ -53225,14 +53254,14 @@ var TunnelManager = class {
53225
53254
  localPort,
53226
53255
  logLevel: "info"
53227
53256
  });
53228
- await import_node_fs34.default.promises.writeFile(tomlPath, toml, { mode: 384 });
53257
+ await import_node_fs35.default.promises.writeFile(tomlPath, toml, { mode: 384 });
53229
53258
  const proc = (this.deps.spawnImpl ?? import_node_child_process9.spawn)(frpcBin, ["-c", tomlPath], {
53230
53259
  stdio: ["ignore", "pipe", "pipe"]
53231
53260
  });
53232
53261
  const logDir = import_node_path35.default.join(this.deps.dataDir, "log");
53233
- import_node_fs34.default.mkdirSync(logDir, { recursive: true });
53262
+ import_node_fs35.default.mkdirSync(logDir, { recursive: true });
53234
53263
  const logFilePath = import_node_path35.default.join(logDir, "frpc.log");
53235
- const logStream = import_node_fs34.default.createWriteStream(logFilePath, { flags: "a", mode: 384 });
53264
+ const logStream = import_node_fs35.default.createWriteStream(logFilePath, { flags: "a", mode: 384 });
53236
53265
  logStream.on("error", () => {
53237
53266
  });
53238
53267
  const tee = (chunk) => {
@@ -53314,7 +53343,7 @@ async function waitForFrpcReady(proc, timeoutMs) {
53314
53343
  }
53315
53344
 
53316
53345
  // src/sshd/sshd-manager.ts
53317
- var import_node_fs38 = __toESM(require("fs"), 1);
53346
+ var import_node_fs39 = __toESM(require("fs"), 1);
53318
53347
  var import_node_path39 = __toESM(require("path"), 1);
53319
53348
  var import_node_child_process11 = require("child_process");
53320
53349
 
@@ -53340,7 +53369,7 @@ function buildSshdConfig(input) {
53340
53369
  }
53341
53370
 
53342
53371
  // src/sshd/sshd-process.ts
53343
- var import_node_fs35 = __toESM(require("fs"), 1);
53372
+ var import_node_fs36 = __toESM(require("fs"), 1);
53344
53373
  var import_node_path36 = __toESM(require("path"), 1);
53345
53374
  var import_node_child_process10 = require("child_process");
53346
53375
  function sshdPidFilePath(dataDir) {
@@ -53349,14 +53378,14 @@ function sshdPidFilePath(dataDir) {
53349
53378
  function writeSshdPid(dataDir, pid) {
53350
53379
  try {
53351
53380
  const p2 = sshdPidFilePath(dataDir);
53352
- import_node_fs35.default.mkdirSync(import_node_path36.default.dirname(p2), { recursive: true, mode: 448 });
53353
- import_node_fs35.default.writeFileSync(p2, String(pid), { mode: 384 });
53381
+ import_node_fs36.default.mkdirSync(import_node_path36.default.dirname(p2), { recursive: true, mode: 448 });
53382
+ import_node_fs36.default.writeFileSync(p2, String(pid), { mode: 384 });
53354
53383
  } catch {
53355
53384
  }
53356
53385
  }
53357
53386
  function clearSshdPid(dataDir) {
53358
53387
  try {
53359
- import_node_fs35.default.unlinkSync(sshdPidFilePath(dataDir));
53388
+ import_node_fs36.default.unlinkSync(sshdPidFilePath(dataDir));
53360
53389
  } catch {
53361
53390
  }
53362
53391
  }
@@ -53372,7 +53401,7 @@ function defaultIsPidAlive2(pid) {
53372
53401
  }
53373
53402
  function defaultReadPidFile2(file) {
53374
53403
  try {
53375
- return import_node_fs35.default.readFileSync(file, "utf8");
53404
+ return import_node_fs36.default.readFileSync(file, "utf8");
53376
53405
  } catch {
53377
53406
  return null;
53378
53407
  }
@@ -53412,7 +53441,7 @@ async function killStaleSshd(deps) {
53412
53441
  }
53413
53442
  if (victims.size === 0) {
53414
53443
  try {
53415
- import_node_fs35.default.unlinkSync(pidFile);
53444
+ import_node_fs36.default.unlinkSync(pidFile);
53416
53445
  } catch {
53417
53446
  }
53418
53447
  return;
@@ -53423,7 +53452,7 @@ async function killStaleSshd(deps) {
53423
53452
  }
53424
53453
  await sleep2(deps.reapWaitMs ?? 300);
53425
53454
  try {
53426
- import_node_fs35.default.unlinkSync(pidFile);
53455
+ import_node_fs36.default.unlinkSync(pidFile);
53427
53456
  } catch {
53428
53457
  }
53429
53458
  }
@@ -53456,7 +53485,7 @@ async function defaultScanSshdPidsByCmdline(configPath, logger) {
53456
53485
  }
53457
53486
 
53458
53487
  // src/sshd/jail-script.ts
53459
- var import_node_fs36 = __toESM(require("fs"), 1);
53488
+ var import_node_fs37 = __toESM(require("fs"), 1);
53460
53489
  var import_node_path37 = __toESM(require("path"), 1);
53461
53490
  var CLAWD_SSH_JAIL_SCRIPT = String.raw`#!/usr/bin/env bash
53462
53491
  # clawd-ssh-jail — SSH reverse access sandbox wrapper (managed by clawd; do not edit)
@@ -53595,14 +53624,14 @@ esac
53595
53624
  `;
53596
53625
  function ensureJailScript(dataDir) {
53597
53626
  const binDir = import_node_path37.default.join(dataDir, "bin");
53598
- import_node_fs36.default.mkdirSync(binDir, { recursive: true, mode: 493 });
53627
+ import_node_fs37.default.mkdirSync(binDir, { recursive: true, mode: 493 });
53599
53628
  const target = import_node_path37.default.join(binDir, "clawd-ssh-jail");
53600
- import_node_fs36.default.writeFileSync(target, CLAWD_SSH_JAIL_SCRIPT, { mode: 493 });
53629
+ import_node_fs37.default.writeFileSync(target, CLAWD_SSH_JAIL_SCRIPT, { mode: 493 });
53601
53630
  return target;
53602
53631
  }
53603
53632
 
53604
53633
  // src/sshd/clawd-shim.ts
53605
- var import_node_fs37 = __toESM(require("fs"), 1);
53634
+ var import_node_fs38 = __toESM(require("fs"), 1);
53606
53635
  var import_node_path38 = __toESM(require("path"), 1);
53607
53636
  function shellQuote(s) {
53608
53637
  return `'${s.replace(/'/g, "'\\''")}'`;
@@ -53619,9 +53648,9 @@ exec ${shellQuote(execPath)} ${shellQuote(cliPath)} "$@"
53619
53648
  }
53620
53649
  function ensureClawdShim(dataDir, execPath, cliPath) {
53621
53650
  const binDir = import_node_path38.default.join(dataDir, "bin");
53622
- import_node_fs37.default.mkdirSync(binDir, { recursive: true, mode: 493 });
53651
+ import_node_fs38.default.mkdirSync(binDir, { recursive: true, mode: 493 });
53623
53652
  const target = import_node_path38.default.join(binDir, "clawd");
53624
- import_node_fs37.default.writeFileSync(target, buildClawdShim(execPath, cliPath), { mode: 493 });
53653
+ import_node_fs38.default.writeFileSync(target, buildClawdShim(execPath, cliPath), { mode: 493 });
53625
53654
  return target;
53626
53655
  }
53627
53656
 
@@ -53648,17 +53677,17 @@ var SshdManager = class {
53648
53677
  ownPid: process.pid,
53649
53678
  logger
53650
53679
  });
53651
- import_node_fs38.default.mkdirSync(this.sshdDir, { recursive: true, mode: 448 });
53652
- import_node_fs38.default.mkdirSync(import_node_path39.default.join(this.sshdDir, "authorized_keys.d"), { recursive: true, mode: 448 });
53680
+ import_node_fs39.default.mkdirSync(this.sshdDir, { recursive: true, mode: 448 });
53681
+ import_node_fs39.default.mkdirSync(import_node_path39.default.join(this.sshdDir, "authorized_keys.d"), { recursive: true, mode: 448 });
53653
53682
  ensureJailScript(this.deps.dataDir);
53654
53683
  ensureClawdShim(this.deps.dataDir, process.execPath, process.argv[1] ?? "");
53655
53684
  const hostKeyPath = import_node_path39.default.join(this.sshdDir, "host_key");
53656
- if (!import_node_fs38.default.existsSync(hostKeyPath)) {
53685
+ if (!import_node_fs39.default.existsSync(hostKeyPath)) {
53657
53686
  await this.generateHostKey(hostKeyPath);
53658
53687
  }
53659
53688
  const akFile = import_node_path39.default.join(this.sshdDir, "authorized_keys.d", "clawd-contacts");
53660
- if (!import_node_fs38.default.existsSync(akFile)) {
53661
- import_node_fs38.default.writeFileSync(akFile, "", { mode: 384 });
53689
+ if (!import_node_fs39.default.existsSync(akFile)) {
53690
+ import_node_fs39.default.writeFileSync(akFile, "", { mode: 384 });
53662
53691
  }
53663
53692
  const configPath = import_node_path39.default.join(this.sshdDir, "sshd_config");
53664
53693
  const config = buildSshdConfig({
@@ -53668,14 +53697,14 @@ var SshdManager = class {
53668
53697
  authorizedKeysFile: akFile,
53669
53698
  pidFilePath: import_node_path39.default.join(this.sshdDir, "sshd.pid")
53670
53699
  });
53671
- import_node_fs38.default.writeFileSync(configPath, config, { mode: 384 });
53700
+ import_node_fs39.default.writeFileSync(configPath, config, { mode: 384 });
53672
53701
  const sshdBin = this.deps.sshdBin ?? "/usr/sbin/sshd";
53673
53702
  const proc = (this.deps.spawnImpl ?? import_node_child_process11.spawn)(sshdBin, ["-D", "-e", "-f", configPath], {
53674
53703
  stdio: ["ignore", "pipe", "pipe"]
53675
53704
  });
53676
53705
  const sshdLogDir = import_node_path39.default.join(this.deps.dataDir, "log");
53677
- import_node_fs38.default.mkdirSync(sshdLogDir, { recursive: true });
53678
- const logStream = import_node_fs38.default.createWriteStream(import_node_path39.default.join(sshdLogDir, "sshd.log"), {
53706
+ import_node_fs39.default.mkdirSync(sshdLogDir, { recursive: true });
53707
+ const logStream = import_node_fs39.default.createWriteStream(import_node_path39.default.join(sshdLogDir, "sshd.log"), {
53679
53708
  flags: "a",
53680
53709
  mode: 384
53681
53710
  });
@@ -53768,7 +53797,7 @@ ${tail}` : ready.error;
53768
53797
  p2.on("error", reject);
53769
53798
  });
53770
53799
  try {
53771
- import_node_fs38.default.chmodSync(hostKeyPath, 384);
53800
+ import_node_fs39.default.chmodSync(hostKeyPath, 384);
53772
53801
  } catch {
53773
53802
  }
53774
53803
  }
@@ -53811,7 +53840,7 @@ async function waitForSshdReady(proc, timeoutMs) {
53811
53840
  }
53812
53841
 
53813
53842
  // src/sshd/authorized-keys.ts
53814
- var import_node_fs39 = __toESM(require("fs"), 1);
53843
+ var import_node_fs40 = __toESM(require("fs"), 1);
53815
53844
  var import_node_path40 = __toESM(require("path"), 1);
53816
53845
  var JAIL_BIN_PATH_ENV = "CLAWD_JAIL_BIN_PATH";
53817
53846
  var AUTHORIZED_KEYS_FILE = "clawd-contacts";
@@ -53821,7 +53850,7 @@ function jailBinPath() {
53821
53850
  function rebuildAuthorizedKeys(store, sshdDir) {
53822
53851
  const akDir = import_node_path40.default.join(sshdDir, "authorized_keys.d");
53823
53852
  const target = import_node_path40.default.join(akDir, AUTHORIZED_KEYS_FILE);
53824
- import_node_fs39.default.mkdirSync(akDir, { recursive: true, mode: 448 });
53853
+ import_node_fs40.default.mkdirSync(akDir, { recursive: true, mode: 448 });
53825
53854
  const lines = ["# managed by clawd; do not edit", ""];
53826
53855
  for (const c of store.list()) {
53827
53856
  if (!c.sshAllowed) continue;
@@ -53835,25 +53864,25 @@ function rebuildAuthorizedKeys(store, sshdDir) {
53835
53864
  }
53836
53865
  const body = lines.join("\n") + "\n";
53837
53866
  const tmp = `${target}.tmp-${process.pid}-${Date.now()}`;
53838
- import_node_fs39.default.writeFileSync(tmp, body, { mode: 384 });
53839
- import_node_fs39.default.renameSync(tmp, target);
53867
+ import_node_fs40.default.writeFileSync(tmp, body, { mode: 384 });
53868
+ import_node_fs40.default.renameSync(tmp, target);
53840
53869
  }
53841
53870
  function readIssuedPubkey(sshdDir, deviceId) {
53842
53871
  const safeId = deviceId.replace(/[\/\\]/g, "_");
53843
53872
  const p2 = import_node_path40.default.join(sshdDir, "keys", `${safeId}.ed25519.pub`);
53844
53873
  try {
53845
- return import_node_fs39.default.readFileSync(p2, "utf8");
53874
+ return import_node_fs40.default.readFileSync(p2, "utf8");
53846
53875
  } catch {
53847
53876
  return null;
53848
53877
  }
53849
53878
  }
53850
53879
 
53851
53880
  // src/sshd/contact-key-puller.ts
53852
- var import_node_fs41 = __toESM(require("fs"), 1);
53881
+ var import_node_fs42 = __toESM(require("fs"), 1);
53853
53882
  var import_node_path42 = __toESM(require("path"), 1);
53854
53883
 
53855
53884
  // src/sshd/contact-ssh-log.ts
53856
- var import_node_fs40 = __toESM(require("fs"), 1);
53885
+ var import_node_fs41 = __toESM(require("fs"), 1);
53857
53886
  var import_node_path41 = __toESM(require("path"), 1);
53858
53887
  function createContactSshLog(dataDir) {
53859
53888
  const file = import_node_path41.default.join(dataDir, "log", "contact-ssh.log");
@@ -53869,8 +53898,8 @@ function createContactSshLog(dataDir) {
53869
53898
  }
53870
53899
  line += "\n";
53871
53900
  try {
53872
- import_node_fs40.default.mkdirSync(import_node_path41.default.dirname(file), { recursive: true });
53873
- import_node_fs40.default.appendFileSync(file, line, { mode: 384 });
53901
+ import_node_fs41.default.mkdirSync(import_node_path41.default.dirname(file), { recursive: true });
53902
+ import_node_fs41.default.appendFileSync(file, line, { mode: 384 });
53874
53903
  } catch {
53875
53904
  }
53876
53905
  }
@@ -53959,12 +53988,12 @@ async function pullContactSshKeyOnce(deps) {
53959
53988
  }
53960
53989
  function writeKeyFile(dataDir, deviceId, pem) {
53961
53990
  const p2 = safeContactKeyPath(dataDir, deviceId);
53962
- import_node_fs41.default.mkdirSync(import_node_path42.default.dirname(p2), { recursive: true, mode: 448 });
53963
- import_node_fs41.default.writeFileSync(p2, pem, { mode: 384 });
53991
+ import_node_fs42.default.mkdirSync(import_node_path42.default.dirname(p2), { recursive: true, mode: 448 });
53992
+ import_node_fs42.default.writeFileSync(p2, pem, { mode: 384 });
53964
53993
  }
53965
53994
  function removeKeyFile(dataDir, deviceId) {
53966
53995
  try {
53967
- import_node_fs41.default.unlinkSync(safeContactKeyPath(dataDir, deviceId));
53996
+ import_node_fs42.default.unlinkSync(safeContactKeyPath(dataDir, deviceId));
53968
53997
  return true;
53969
53998
  } catch {
53970
53999
  return false;
@@ -54299,7 +54328,7 @@ function deriveStableDeviceKey(opts = {}) {
54299
54328
  }
54300
54329
 
54301
54330
  // src/auth-store.ts
54302
- var import_node_fs42 = __toESM(require("fs"), 1);
54331
+ var import_node_fs43 = __toESM(require("fs"), 1);
54303
54332
  var import_node_path44 = __toESM(require("path"), 1);
54304
54333
  var import_node_crypto12 = __toESM(require("crypto"), 1);
54305
54334
  var AUTH_FILE_NAME = "auth.json";
@@ -54340,7 +54369,7 @@ function defaultGenerateOwnerPrincipalId() {
54340
54369
  }
54341
54370
  function readAuthFile(file) {
54342
54371
  try {
54343
- const raw = import_node_fs42.default.readFileSync(file, "utf8");
54372
+ const raw = import_node_fs43.default.readFileSync(file, "utf8");
54344
54373
  const parsed = JSON.parse(raw);
54345
54374
  if (typeof parsed?.token !== "string" || parsed.token.length === 0) {
54346
54375
  return null;
@@ -54360,16 +54389,16 @@ function readAuthFile(file) {
54360
54389
  }
54361
54390
  }
54362
54391
  function writeAuthFile(file, content) {
54363
- import_node_fs42.default.mkdirSync(import_node_path44.default.dirname(file), { recursive: true });
54364
- import_node_fs42.default.writeFileSync(file, JSON.stringify(content, null, 2), { mode: 384 });
54392
+ import_node_fs43.default.mkdirSync(import_node_path44.default.dirname(file), { recursive: true });
54393
+ import_node_fs43.default.writeFileSync(file, JSON.stringify(content, null, 2), { mode: 384 });
54365
54394
  try {
54366
- import_node_fs42.default.chmodSync(file, 384);
54395
+ import_node_fs43.default.chmodSync(file, 384);
54367
54396
  } catch {
54368
54397
  }
54369
54398
  }
54370
54399
 
54371
54400
  // src/owner-profile.ts
54372
- var import_node_fs43 = __toESM(require("fs"), 1);
54401
+ var import_node_fs44 = __toESM(require("fs"), 1);
54373
54402
  var import_node_os15 = __toESM(require("os"), 1);
54374
54403
  var import_node_path45 = __toESM(require("path"), 1);
54375
54404
  var PROFILE_FILENAME = "profile.json";
@@ -54378,7 +54407,7 @@ function loadOwnerDisplayName(dataDir) {
54378
54407
  const profilePath = import_node_path45.default.join(dataDir, PROFILE_FILENAME);
54379
54408
  let raw;
54380
54409
  try {
54381
- raw = import_node_fs43.default.readFileSync(profilePath, "utf8");
54410
+ raw = import_node_fs44.default.readFileSync(profilePath, "utf8");
54382
54411
  } catch {
54383
54412
  return fallback;
54384
54413
  }
@@ -54401,7 +54430,7 @@ function loadOwnerDisplayName(dataDir) {
54401
54430
  }
54402
54431
 
54403
54432
  // src/feishu-auth/owner-identity-store.ts
54404
- var import_node_fs44 = __toESM(require("fs"), 1);
54433
+ var import_node_fs45 = __toESM(require("fs"), 1);
54405
54434
  var import_node_path46 = __toESM(require("path"), 1);
54406
54435
  var OWNER_IDENTITY_FILE_NAME = "owner-identity.json";
54407
54436
  var OwnerIdentityStore = class {
@@ -54412,7 +54441,7 @@ var OwnerIdentityStore = class {
54412
54441
  read() {
54413
54442
  let raw;
54414
54443
  try {
54415
- raw = import_node_fs44.default.readFileSync(this.file, "utf8");
54444
+ raw = import_node_fs45.default.readFileSync(this.file, "utf8");
54416
54445
  } catch {
54417
54446
  return null;
54418
54447
  }
@@ -54440,16 +54469,16 @@ var OwnerIdentityStore = class {
54440
54469
  };
54441
54470
  }
54442
54471
  write(record) {
54443
- import_node_fs44.default.mkdirSync(import_node_path46.default.dirname(this.file), { recursive: true });
54444
- import_node_fs44.default.writeFileSync(this.file, JSON.stringify(record, null, 2), { mode: 384 });
54472
+ import_node_fs45.default.mkdirSync(import_node_path46.default.dirname(this.file), { recursive: true });
54473
+ import_node_fs45.default.writeFileSync(this.file, JSON.stringify(record, null, 2), { mode: 384 });
54445
54474
  try {
54446
- import_node_fs44.default.chmodSync(this.file, 384);
54475
+ import_node_fs45.default.chmodSync(this.file, 384);
54447
54476
  } catch {
54448
54477
  }
54449
54478
  }
54450
54479
  clear() {
54451
54480
  try {
54452
- import_node_fs44.default.unlinkSync(this.file);
54481
+ import_node_fs45.default.unlinkSync(this.file);
54453
54482
  } catch (err) {
54454
54483
  const code = err?.code;
54455
54484
  if (code !== "ENOENT") throw err;
@@ -54782,7 +54811,7 @@ function verifyConnectToken(args) {
54782
54811
  }
54783
54812
 
54784
54813
  // src/feishu-auth/server-key.ts
54785
- var fs54 = __toESM(require("fs"), 1);
54814
+ var fs55 = __toESM(require("fs"), 1);
54786
54815
  var path55 = __toESM(require("path"), 1);
54787
54816
  var FILE_NAME2 = "server-signing-key.json";
54788
54817
  var ServerKeyStore = class {
@@ -54796,7 +54825,7 @@ var ServerKeyStore = class {
54796
54825
  /** 读缓存的公钥;无缓存 / 损坏 → null(调用方决定是否触发拉取) */
54797
54826
  read() {
54798
54827
  try {
54799
- const raw = fs54.readFileSync(this.filePath(), "utf8");
54828
+ const raw = fs55.readFileSync(this.filePath(), "utf8");
54800
54829
  const parsed = JSON.parse(raw);
54801
54830
  if (typeof parsed.publicKeyPem === "string" && parsed.publicKeyPem.includes("PUBLIC KEY")) {
54802
54831
  return parsed.publicKeyPem;
@@ -54811,12 +54840,12 @@ var ServerKeyStore = class {
54811
54840
  publicKeyPem,
54812
54841
  fetchedAt: (/* @__PURE__ */ new Date()).toISOString()
54813
54842
  };
54814
- fs54.mkdirSync(this.dataDir, { recursive: true });
54815
- fs54.writeFileSync(this.filePath(), JSON.stringify(content, null, 2), { mode: 384 });
54843
+ fs55.mkdirSync(this.dataDir, { recursive: true });
54844
+ fs55.writeFileSync(this.filePath(), JSON.stringify(content, null, 2), { mode: 384 });
54816
54845
  }
54817
54846
  clear() {
54818
54847
  try {
54819
- fs54.unlinkSync(this.filePath());
54848
+ fs55.unlinkSync(this.filePath());
54820
54849
  } catch {
54821
54850
  }
54822
54851
  }
@@ -54829,12 +54858,12 @@ init_protocol();
54829
54858
  init_protocol();
54830
54859
 
54831
54860
  // src/session/fork.ts
54832
- var import_node_fs45 = __toESM(require("fs"), 1);
54861
+ var import_node_fs46 = __toESM(require("fs"), 1);
54833
54862
  var import_node_os16 = __toESM(require("os"), 1);
54834
54863
  var import_node_path47 = __toESM(require("path"), 1);
54835
54864
  init_claude_history();
54836
54865
  function readJsonlEntries(file) {
54837
- const raw = import_node_fs45.default.readFileSync(file, "utf8");
54866
+ const raw = import_node_fs46.default.readFileSync(file, "utf8");
54838
54867
  const out = [];
54839
54868
  for (const line of raw.split("\n")) {
54840
54869
  const t = line.trim();
@@ -54850,7 +54879,7 @@ function forkSession(input) {
54850
54879
  const baseDir = input.baseDir ?? import_node_path47.default.join(import_node_os16.default.homedir(), ".claude");
54851
54880
  let projectDir = import_node_path47.default.join(baseDir, "projects", cwdToHashDir(input.cwd));
54852
54881
  let sourceFile = import_node_path47.default.join(projectDir, `${input.toolSessionId}.jsonl`);
54853
- if (!import_node_fs45.default.existsSync(sourceFile)) {
54882
+ if (!import_node_fs46.default.existsSync(sourceFile)) {
54854
54883
  const found = findTranscriptByToolSessionId(
54855
54884
  import_node_path47.default.join(baseDir, "projects"),
54856
54885
  input.toolSessionId
@@ -54889,8 +54918,8 @@ function forkSession(input) {
54889
54918
  forkedLines.push(JSON.stringify(forked));
54890
54919
  }
54891
54920
  const forkedFilePath = import_node_path47.default.join(projectDir, `${forkedToolSessionId}.jsonl`);
54892
- import_node_fs45.default.mkdirSync(projectDir, { recursive: true });
54893
- import_node_fs45.default.writeFileSync(forkedFilePath, forkedLines.join("\n") + "\n", { mode: 384 });
54921
+ import_node_fs46.default.mkdirSync(projectDir, { recursive: true });
54922
+ import_node_fs46.default.writeFileSync(forkedFilePath, forkedLines.join("\n") + "\n", { mode: 384 });
54894
54923
  return { forkedToolSessionId, forkedFilePath };
54895
54924
  }
54896
54925
 
@@ -55524,14 +55553,14 @@ init_protocol();
55524
55553
 
55525
55554
  // src/workspace/git.ts
55526
55555
  var import_node_child_process12 = require("child_process");
55527
- var import_node_fs46 = __toESM(require("fs"), 1);
55556
+ var import_node_fs47 = __toESM(require("fs"), 1);
55528
55557
  var import_node_path48 = __toESM(require("path"), 1);
55529
55558
  var import_node_util = require("util");
55530
55559
  var pexec = (0, import_node_util.promisify)(import_node_child_process12.execFile);
55531
55560
  function normalizePath(p2) {
55532
55561
  const resolved = import_node_path48.default.resolve(p2);
55533
55562
  try {
55534
- return import_node_fs46.default.realpathSync(resolved);
55563
+ return import_node_fs47.default.realpathSync(resolved);
55535
55564
  } catch {
55536
55565
  return resolved;
55537
55566
  }
@@ -55942,7 +55971,7 @@ function buildContactHandlers(deps) {
55942
55971
  init_protocol();
55943
55972
 
55944
55973
  // src/sshd/key-issue.ts
55945
- var import_node_fs47 = __toESM(require("fs"), 1);
55974
+ var import_node_fs48 = __toESM(require("fs"), 1);
55946
55975
  var import_node_path49 = __toESM(require("path"), 1);
55947
55976
  var import_node_child_process13 = require("child_process");
55948
55977
  function safeDeviceId(deviceId) {
@@ -55951,13 +55980,13 @@ function safeDeviceId(deviceId) {
55951
55980
  async function issueContactSshKey(deviceId, sshdDir, opts = {}) {
55952
55981
  const safeId = safeDeviceId(deviceId);
55953
55982
  const keysDir = import_node_path49.default.join(sshdDir, "keys");
55954
- import_node_fs47.default.mkdirSync(keysDir, { recursive: true, mode: 448 });
55983
+ import_node_fs48.default.mkdirSync(keysDir, { recursive: true, mode: 448 });
55955
55984
  const privPath = import_node_path49.default.join(keysDir, `${safeId}.ed25519`);
55956
55985
  const pubPath = `${privPath}.pub`;
55957
- if (import_node_fs47.default.existsSync(privPath) && import_node_fs47.default.existsSync(pubPath)) {
55986
+ if (import_node_fs48.default.existsSync(privPath) && import_node_fs48.default.existsSync(pubPath)) {
55958
55987
  return {
55959
- privateKeyPem: import_node_fs47.default.readFileSync(privPath, "utf8"),
55960
- publicKeyLine: import_node_fs47.default.readFileSync(pubPath, "utf8").trim()
55988
+ privateKeyPem: import_node_fs48.default.readFileSync(privPath, "utf8"),
55989
+ publicKeyLine: import_node_fs48.default.readFileSync(pubPath, "utf8").trim()
55961
55990
  };
55962
55991
  }
55963
55992
  const bin = opts.keygenBin ?? "/usr/bin/ssh-keygen";
@@ -55971,16 +56000,16 @@ async function issueContactSshKey(deviceId, sshdDir, opts = {}) {
55971
56000
  p2.on("error", reject);
55972
56001
  });
55973
56002
  try {
55974
- import_node_fs47.default.chmodSync(privPath, 384);
56003
+ import_node_fs48.default.chmodSync(privPath, 384);
55975
56004
  } catch {
55976
56005
  }
55977
56006
  try {
55978
- import_node_fs47.default.chmodSync(pubPath, 420);
56007
+ import_node_fs48.default.chmodSync(pubPath, 420);
55979
56008
  } catch {
55980
56009
  }
55981
56010
  return {
55982
- privateKeyPem: import_node_fs47.default.readFileSync(privPath, "utf8"),
55983
- publicKeyLine: import_node_fs47.default.readFileSync(pubPath, "utf8").trim()
56011
+ privateKeyPem: import_node_fs48.default.readFileSync(privPath, "utf8"),
56012
+ publicKeyLine: import_node_fs48.default.readFileSync(pubPath, "utf8").trim()
55984
56013
  };
55985
56014
  }
55986
56015
 
@@ -57261,7 +57290,7 @@ function buildExtensionHandlers(deps) {
57261
57290
  }
57262
57291
 
57263
57292
  // src/app-builder/project-store.ts
57264
- var import_node_fs48 = require("fs");
57293
+ var import_node_fs49 = require("fs");
57265
57294
  var import_node_child_process14 = require("child_process");
57266
57295
  var import_node_path56 = require("path");
57267
57296
  init_protocol();
@@ -57289,7 +57318,7 @@ var ProjectStore = class {
57289
57318
  async list() {
57290
57319
  let entries;
57291
57320
  try {
57292
- entries = await import_node_fs48.promises.readdir(this.projectsRoot());
57321
+ entries = await import_node_fs49.promises.readdir(this.projectsRoot());
57293
57322
  } catch (err) {
57294
57323
  if (err.code === "ENOENT") return [];
57295
57324
  throw err;
@@ -57297,7 +57326,7 @@ var ProjectStore = class {
57297
57326
  const out = [];
57298
57327
  for (const name of entries) {
57299
57328
  try {
57300
- const raw = await import_node_fs48.promises.readFile(this.metaPath(name), "utf8");
57329
+ const raw = await import_node_fs49.promises.readFile(this.metaPath(name), "utf8");
57301
57330
  const json = JSON.parse(raw);
57302
57331
  let migrated = false;
57303
57332
  if (typeof json.devCommand !== "string" || json.devCommand.length === 0) {
@@ -57308,7 +57337,7 @@ var ProjectStore = class {
57308
57337
  if (parsed.success) {
57309
57338
  out.push(parsed.data);
57310
57339
  if (migrated) {
57311
- void import_node_fs48.promises.writeFile(this.metaPath(name), JSON.stringify(parsed.data, null, 2) + "\n", "utf8").catch(() => {
57340
+ void import_node_fs49.promises.writeFile(this.metaPath(name), JSON.stringify(parsed.data, null, 2) + "\n", "utf8").catch(() => {
57312
57341
  });
57313
57342
  }
57314
57343
  }
@@ -57352,8 +57381,8 @@ var ProjectStore = class {
57352
57381
  throw new Error(`invalid name "${name}": ${validated.error.message}`);
57353
57382
  }
57354
57383
  const dir = this.projectDir(name);
57355
- await import_node_fs48.promises.mkdir(dir, { recursive: true });
57356
- await import_node_fs48.promises.writeFile(this.metaPath(name), JSON.stringify(meta, null, 2) + "\n", "utf8");
57384
+ await import_node_fs49.promises.mkdir(dir, { recursive: true });
57385
+ await import_node_fs49.promises.writeFile(this.metaPath(name), JSON.stringify(meta, null, 2) + "\n", "utf8");
57357
57386
  return meta;
57358
57387
  }
57359
57388
  /**
@@ -57396,7 +57425,7 @@ var ProjectStore = class {
57396
57425
  }
57397
57426
  async delete(name) {
57398
57427
  const dir = this.projectDir(name);
57399
- await import_node_fs48.promises.rm(dir, { recursive: true, force: true });
57428
+ await import_node_fs49.promises.rm(dir, { recursive: true, force: true });
57400
57429
  }
57401
57430
  async updatePort(name, newPort) {
57402
57431
  if (newPort < PROJECT_PORT_MIN || newPort > PROJECT_PORT_MAX) {
@@ -57412,7 +57441,7 @@ var ProjectStore = class {
57412
57441
  throw new Error(`port ${newPort} already used / \u5DF2\u88AB project "${conflict.name}" \u5360\u7528`);
57413
57442
  }
57414
57443
  const updated = { ...target, port: newPort };
57415
- await import_node_fs48.promises.writeFile(this.metaPath(name), JSON.stringify(updated, null, 2) + "\n", "utf8");
57444
+ await import_node_fs49.promises.writeFile(this.metaPath(name), JSON.stringify(updated, null, 2) + "\n", "utf8");
57416
57445
  return updated;
57417
57446
  }
57418
57447
  /**
@@ -57429,7 +57458,7 @@ var ProjectStore = class {
57429
57458
  if (!validated.success) {
57430
57459
  throw new Error(`invalid prodUrl "${url}": ${validated.error.message}`);
57431
57460
  }
57432
- await import_node_fs48.promises.writeFile(this.metaPath(name), JSON.stringify(validated.data, null, 2) + "\n", "utf8");
57461
+ await import_node_fs49.promises.writeFile(this.metaPath(name), JSON.stringify(validated.data, null, 2) + "\n", "utf8");
57433
57462
  return validated.data;
57434
57463
  }
57435
57464
  /**
@@ -57450,7 +57479,7 @@ var ProjectStore = class {
57450
57479
  if (!validated.success) {
57451
57480
  throw new Error(`invalid publishJob: ${validated.error.message}`);
57452
57481
  }
57453
- await import_node_fs48.promises.writeFile(this.metaPath(name), JSON.stringify(validated.data, null, 2) + "\n", "utf8");
57482
+ await import_node_fs49.promises.writeFile(this.metaPath(name), JSON.stringify(validated.data, null, 2) + "\n", "utf8");
57454
57483
  return validated.data;
57455
57484
  }
57456
57485
  /** 清掉 .clawd-project.json.publishJob 字段。其他字段保持原样。 */
@@ -57465,7 +57494,7 @@ var ProjectStore = class {
57465
57494
  if (!validated.success) {
57466
57495
  throw new Error(`failed to clear publishJob: ${validated.error.message}`);
57467
57496
  }
57468
- await import_node_fs48.promises.writeFile(this.metaPath(name), JSON.stringify(validated.data, null, 2) + "\n", "utf8");
57497
+ await import_node_fs49.promises.writeFile(this.metaPath(name), JSON.stringify(validated.data, null, 2) + "\n", "utf8");
57469
57498
  return validated.data;
57470
57499
  }
57471
57500
  };
@@ -57586,7 +57615,7 @@ var PublishJobRegistry = class {
57586
57615
 
57587
57616
  // src/app-builder/publish-job-runner.ts
57588
57617
  var import_node_child_process16 = require("child_process");
57589
- var import_node_fs49 = require("fs");
57618
+ var import_node_fs50 = require("fs");
57590
57619
  var import_node_path57 = require("path");
57591
57620
 
57592
57621
  // src/app-builder/publish-stage-parser.ts
@@ -57622,7 +57651,7 @@ async function startPublishJob(deps, args) {
57622
57651
  const logPath = (0, import_node_path57.join)(projDir, ".publish.log");
57623
57652
  let logStream = null;
57624
57653
  try {
57625
- logStream = (0, import_node_fs49.createWriteStream)(logPath, { flags: "w" });
57654
+ logStream = (0, import_node_fs50.createWriteStream)(logPath, { flags: "w" });
57626
57655
  } catch {
57627
57656
  logStream = null;
57628
57657
  }
@@ -57880,7 +57909,7 @@ async function recoverInterruptedJobs(deps) {
57880
57909
  // src/handlers/app-builder.ts
57881
57910
  init_protocol();
57882
57911
  var import_node_path58 = require("path");
57883
- var import_node_fs50 = require("fs");
57912
+ var import_node_fs51 = require("fs");
57884
57913
  var APP_BUILDER_PERSONAS = ["persona-app-builder", "persona-dataclaw-builder"];
57885
57914
  var DEV_SERVER_READY_TIMEOUT_MS = 3e4;
57886
57915
  async function recoverInterruptedPublishJobs(store, logger) {
@@ -57961,7 +57990,7 @@ function buildAppBuilderHandlers(deps) {
57961
57990
  async function listAllUsersProjects() {
57962
57991
  if (!deps.usersRoot || !deps.getStore) return [];
57963
57992
  const getStore = deps.getStore;
57964
- const userIds = await import_node_fs50.promises.readdir(deps.usersRoot).catch(() => []);
57993
+ const userIds = await import_node_fs51.promises.readdir(deps.usersRoot).catch(() => []);
57965
57994
  const perUser = await Promise.all(
57966
57995
  userIds.map((uid) => getStore(uid).list().catch(() => []))
57967
57996
  );
@@ -59468,7 +59497,7 @@ async function startDaemon(config) {
59468
59497
  homeDir: import_node_os21.default.homedir()
59469
59498
  });
59470
59499
  const logDir = import_node_path64.default.join(config.dataDir, "log");
59471
- import_node_fs51.default.mkdirSync(logDir, { recursive: true });
59500
+ import_node_fs52.default.mkdirSync(logDir, { recursive: true });
59472
59501
  const logger = createLogger({
59473
59502
  level: config.logLevel,
59474
59503
  file: import_node_path64.default.join(logDir, "clawd.log"),
@@ -59482,6 +59511,24 @@ async function startDaemon(config) {
59482
59511
  logger.info("screen-idle probe logger enabled", {
59483
59512
  file: import_node_path64.default.join(logDir, "screen-idle-probe.log")
59484
59513
  });
59514
+ const CAP_TARGETS = [
59515
+ import_node_path64.default.join(logDir, "clawd.log"),
59516
+ import_node_path64.default.join(logDir, "screen-idle-probe.log")
59517
+ ];
59518
+ const LOG_CAP_MAX_BYTES = 10 * 1024 * 1024;
59519
+ const LOG_CAP_KEEP_BYTES = 5 * 1024 * 1024;
59520
+ const runLogCap = () => {
59521
+ for (const f of CAP_TARGETS) {
59522
+ try {
59523
+ truncateLogFileToTail(f, LOG_CAP_MAX_BYTES, LOG_CAP_KEEP_BYTES);
59524
+ } catch (e) {
59525
+ logger.warn("log-cap failed", { file: f, err: String(e) });
59526
+ }
59527
+ }
59528
+ };
59529
+ runLogCap();
59530
+ const logCapTimer = setInterval(runLogCap, 10 * 60 * 1e3);
59531
+ logCapTimer.unref();
59485
59532
  const stateMgr = new StateFileManager({ dataDir: config.dataDir });
59486
59533
  const pre = stateMgr.preflight();
59487
59534
  if (pre.status === "active") {
@@ -59648,7 +59695,7 @@ async function startDaemon(config) {
59648
59695
  import_node_path64.default.join(here, "..", "dist", "dispatch", "mcp-server.cjs")
59649
59696
  // dev tsx src/index → ../dist/dispatch/mcp-server.cjs
59650
59697
  ];
59651
- const dispatchServerScriptPath = dispatchServerCandidates.find((p2) => import_node_fs51.default.existsSync(p2));
59698
+ const dispatchServerScriptPath = dispatchServerCandidates.find((p2) => import_node_fs52.default.existsSync(p2));
59652
59699
  let dispatchMcpConfigPath2;
59653
59700
  if (dispatchServerScriptPath) {
59654
59701
  const dispatchLogPath = import_node_path64.default.join(logDir, "dispatch-mcp-server.log");
@@ -59671,7 +59718,7 @@ async function startDaemon(config) {
59671
59718
  import_node_path64.default.join(here, "ticket", "mcp-server.cjs"),
59672
59719
  import_node_path64.default.join(here, "..", "dist", "ticket", "mcp-server.cjs")
59673
59720
  ];
59674
- const ticketServerScriptPath = ticketServerCandidates.find((p2) => import_node_fs51.default.existsSync(p2));
59721
+ const ticketServerScriptPath = ticketServerCandidates.find((p2) => import_node_fs52.default.existsSync(p2));
59675
59722
  let ticketMcpConfigPath2;
59676
59723
  if (ticketServerScriptPath) {
59677
59724
  const ticketLogPath = import_node_path64.default.join(logDir, "ticket-mcp-server.log");
@@ -59696,7 +59743,7 @@ async function startDaemon(config) {
59696
59743
  import_node_path64.default.join(here, "shift", "mcp-server.cjs"),
59697
59744
  import_node_path64.default.join(here, "..", "dist", "shift", "mcp-server.cjs")
59698
59745
  ];
59699
- const shiftServerScriptPath = shiftServerCandidates.find((p2) => import_node_fs51.default.existsSync(p2));
59746
+ const shiftServerScriptPath = shiftServerCandidates.find((p2) => import_node_fs52.default.existsSync(p2));
59700
59747
  let shiftMcpConfigPath2;
59701
59748
  if (shiftServerScriptPath) {
59702
59749
  const shiftLogPath = import_node_path64.default.join(logDir, "shift-mcp-server.log");
@@ -59720,7 +59767,7 @@ async function startDaemon(config) {
59720
59767
  import_node_path64.default.join(here, "inbox", "mcp-server.cjs"),
59721
59768
  import_node_path64.default.join(here, "..", "dist", "inbox", "mcp-server.cjs")
59722
59769
  ];
59723
- const inboxServerScriptPath = inboxServerCandidates.find((p2) => import_node_fs51.default.existsSync(p2));
59770
+ const inboxServerScriptPath = inboxServerCandidates.find((p2) => import_node_fs52.default.existsSync(p2));
59724
59771
  let inboxMcpConfigPath2;
59725
59772
  if (inboxServerScriptPath) {
59726
59773
  const inboxLogPath = import_node_path64.default.join(logDir, "inbox-mcp-server.log");
@@ -59810,7 +59857,7 @@ async function startDaemon(config) {
59810
59857
  const absPath = import_node_path64.default.isAbsolute(input.relPath) ? input.relPath : import_node_path64.default.join(input.cwd, input.relPath);
59811
59858
  let size = 0;
59812
59859
  try {
59813
- size = import_node_fs51.default.statSync(absPath).size;
59860
+ size = import_node_fs52.default.statSync(absPath).size;
59814
59861
  } catch (err) {
59815
59862
  logger.warn("attachment.onFileEdit stat failed", {
59816
59863
  sessionId: input.sessionId,
@@ -59953,11 +60000,26 @@ async function startDaemon(config) {
59953
60000
  // deviceId 从 auth.json 稳定读;apiUrl 走同一份 clawosApi;apiKey 复用 CLAWD_TICKETS_API_KEY。
59954
60001
  // 失败即登录失败(fail-hard,login-flow.spec §upsert 失败)。
59955
60002
  getDeviceId: () => authFile.deviceId,
59956
- upsertBinding: (opts) => upsertDeviceBinding({
59957
- apiUrl: config.clawosApi ?? DEFAULT_CLAWOS_API,
59958
- apiKey: resolveClawdTicketsApiKey(),
59959
- ...opts
59960
- })
60003
+ upsertBinding: async (opts) => {
60004
+ try {
60005
+ await upsertDeviceBinding({
60006
+ apiUrl: config.clawosApi ?? DEFAULT_CLAWOS_API,
60007
+ apiKey: resolveClawdTicketsApiKey(),
60008
+ ...opts
60009
+ });
60010
+ logger.info("device-binding upsert succeeded", {
60011
+ deviceId: opts.deviceId,
60012
+ unionId: opts.unionId
60013
+ });
60014
+ } catch (err) {
60015
+ logger.warn("device-binding upsert failed", {
60016
+ deviceId: opts.deviceId,
60017
+ unionId: opts.unionId,
60018
+ error: err instanceof Error ? err.message : String(err)
60019
+ });
60020
+ throw err;
60021
+ }
60022
+ }
59961
60023
  });
59962
60024
  const visitorStore = createVisitorStore({ dir: config.dataDir });
59963
60025
  const exchangeVisitorToken = buildVisitorLogin({
@@ -60323,6 +60385,12 @@ async function startDaemon(config) {
60323
60385
  handleLoginCallback: async (params) => {
60324
60386
  const result = await loginFlow.handleCallback(params);
60325
60387
  if (result.ok) {
60388
+ logger.info("feishu-login succeeded", {
60389
+ deviceId: authFile.deviceId,
60390
+ ownerId: result.identity.ownerId,
60391
+ unionId: result.identity.unionId,
60392
+ displayName: result.identity.displayName
60393
+ });
60326
60394
  feishuActive = true;
60327
60395
  ownerId = result.identity.ownerId;
60328
60396
  ownerProvider = result.identity.provider;
@@ -60334,6 +60402,11 @@ async function startDaemon(config) {
60334
60402
  void reportDevice();
60335
60403
  void fetchServerKey();
60336
60404
  } else {
60405
+ logger.warn("feishu-login failed", {
60406
+ reason: result.reason,
60407
+ deviceId: authFile.deviceId,
60408
+ hasToken: Boolean(params.token)
60409
+ });
60337
60410
  wsServer?.broadcastToOwners({ type: "auth:login:failed", reason: result.reason });
60338
60411
  }
60339
60412
  return result;
@@ -60553,7 +60626,7 @@ ${bar}
60553
60626
  `);
60554
60627
  try {
60555
60628
  const connectPath = import_node_path64.default.join(config.dataDir, "connect.txt");
60556
- import_node_fs51.default.writeFileSync(connectPath, lines.join("\n") + "\n", { mode: 384 });
60629
+ import_node_fs52.default.writeFileSync(connectPath, lines.join("\n") + "\n", { mode: 384 });
60557
60630
  } catch {
60558
60631
  }
60559
60632
  } catch (err) {
@@ -60657,7 +60730,7 @@ ${bar}
60657
60730
  function migrateDropPersonsDir(dataDir) {
60658
60731
  const dir = import_node_path64.default.join(dataDir, "persons");
60659
60732
  try {
60660
- import_node_fs51.default.rmSync(dir, { recursive: true, force: true });
60733
+ import_node_fs52.default.rmSync(dir, { recursive: true, force: true });
60661
60734
  } catch {
60662
60735
  }
60663
60736
  }