@clawos-dev/clawd 0.2.228 → 0.2.230
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 +465 -392
- package/dist/share-md-viewer-error.html +1 -1
- package/dist/share-md-viewer.html +1 -1
- package/dist/share-ui/assets/guest-AOFHLDRS.css +32 -0
- package/dist/share-ui/assets/{guest-GE5c9hHw.js → guest-zlvwv8lq.js} +68 -68
- package/dist/share-ui/guest.html +2 -2
- package/package.json +1 -1
- package/dist/share-ui/assets/guest-CZnc3fAe.css +0 -32
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
|
|
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)
|
|
7471
|
-
const fd =
|
|
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
|
-
|
|
7478
|
+
fs71.mkdir(path77.dirname(file), { recursive: true }, (err) => {
|
|
7479
7479
|
if (err) return fileOpened(err);
|
|
7480
|
-
|
|
7480
|
+
fs71.open(file, flags, mode, fileOpened);
|
|
7481
7481
|
});
|
|
7482
7482
|
} else {
|
|
7483
|
-
|
|
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 = () =>
|
|
7525
|
-
fsWrite = () =>
|
|
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
|
|
7534
|
+
return fs71.writeSync(this.fd, this._writingBuf);
|
|
7535
7535
|
}
|
|
7536
|
-
return
|
|
7536
|
+
return fs71.writeSync(this.fd, this._writingBuf, "utf8");
|
|
7537
7537
|
};
|
|
7538
7538
|
fsWrite = () => {
|
|
7539
7539
|
if (Buffer.isBuffer(this._writingBuf)) {
|
|
7540
|
-
return
|
|
7540
|
+
return fs71.write(this.fd, this._writingBuf, this.release);
|
|
7541
7541
|
}
|
|
7542
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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) ?
|
|
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
|
-
|
|
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 =
|
|
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) ?
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 &&
|
|
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 &&
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
40314
|
-
stream =
|
|
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
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
41494
|
+
import_node_fs4.default.mkdirSync(this.root, { recursive: true });
|
|
41466
41495
|
}
|
|
41467
41496
|
read(sessionId) {
|
|
41468
41497
|
try {
|
|
41469
|
-
const raw =
|
|
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
|
-
|
|
41484
|
-
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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
|
-
|
|
42750
|
-
stream =
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 (!
|
|
45239
|
-
if (
|
|
45240
|
-
this.atomicWrite(agentsMd,
|
|
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 (!
|
|
45298
|
+
if (!fs10.existsSync(p2)) return null;
|
|
45270
45299
|
try {
|
|
45271
|
-
return CodexSandboxSettingsSchema.parse(JSON.parse(
|
|
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
|
-
|
|
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 (!
|
|
45288
|
-
const raw = JSON.parse(
|
|
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
|
|
45325
|
+
return fs10.existsSync(this.metaPath(personaId));
|
|
45297
45326
|
}
|
|
45298
45327
|
readPersonality(personaId) {
|
|
45299
45328
|
const claudeMd = this.claudeMdPath(personaId);
|
|
45300
|
-
if (
|
|
45329
|
+
if (fs10.existsSync(claudeMd)) return fs10.readFileSync(claudeMd, "utf8");
|
|
45301
45330
|
const agentsMd = this.agentsMdPath(personaId);
|
|
45302
|
-
if (
|
|
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 (!
|
|
45340
|
+
if (!fs10.existsSync(p2)) return null;
|
|
45312
45341
|
try {
|
|
45313
|
-
return JSON.parse(
|
|
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 (!
|
|
45371
|
+
if (!fs10.existsSync(p2)) return [];
|
|
45343
45372
|
let raw;
|
|
45344
45373
|
try {
|
|
45345
|
-
raw = JSON.parse(
|
|
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 (!
|
|
45360
|
-
return
|
|
45361
|
-
return
|
|
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 (
|
|
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
|
-
|
|
45374
|
-
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
45577
|
+
content = import_node_fs10.default.readFileSync(import_node_path10.default.join(entryPath, "SKILL.md"), "utf8");
|
|
45549
45578
|
} catch {
|
|
45550
45579
|
try {
|
|
45551
|
-
content =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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 (
|
|
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 (!
|
|
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 (!
|
|
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 =
|
|
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
|
|
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
|
-
|
|
46077
|
+
fs12.cpSync(srcPath, dstPath, { recursive: true, dereference: true, filter: skipNodeModulesUnder(srcPath) });
|
|
46049
46078
|
} else if (entry.isFile()) {
|
|
46050
|
-
|
|
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 (!
|
|
46088
|
+
if (!fs12.existsSync(bundleDir)) continue;
|
|
46060
46089
|
const personaDir = args.store.personaDirPath(entry.personaId);
|
|
46061
|
-
if (!
|
|
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 (!
|
|
46093
|
+
if (!fs12.existsSync(srcPath)) continue;
|
|
46065
46094
|
const dstPath = path14.join(personaDir, relPath);
|
|
46066
46095
|
try {
|
|
46067
|
-
|
|
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 (
|
|
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
|
-
|
|
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 (!
|
|
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 (
|
|
46164
|
-
|
|
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 (
|
|
46169
|
-
|
|
46170
|
-
for (const f of
|
|
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
|
-
|
|
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
|
|
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
|
|
46213
|
+
var import_node_fs11 = __toESM(require("fs"), 1);
|
|
46185
46214
|
function htmlEscape(s) {
|
|
46186
46215
|
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
46187
46216
|
}
|
|
@@ -46189,12 +46218,12 @@ function createViewerAssetLoader(opts) {
|
|
|
46189
46218
|
let viewerTemplate;
|
|
46190
46219
|
let errorTemplate;
|
|
46191
46220
|
try {
|
|
46192
|
-
viewerTemplate =
|
|
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 =
|
|
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 =
|
|
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 (
|
|
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
|
|
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
|
|
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 =
|
|
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 (
|
|
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 =
|
|
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 (
|
|
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
|
|
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(
|
|
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
|
-
|
|
46402
|
-
|
|
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
|
|
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 &&
|
|
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 &&
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
48252
|
-
|
|
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
|
|
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
|
-
|
|
48281
|
-
|
|
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
|
|
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
|
|
48305
|
-
await
|
|
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
|
|
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
|
|
48329
|
-
await
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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:
|
|
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
|
-
|
|
49782
|
+
import_node_fs26.default.mkdirSync(import_node_path24.default.dirname(filePath), { recursive: true });
|
|
49754
49783
|
} catch {
|
|
49755
49784
|
}
|
|
49756
|
-
w2.watcher =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
50779
|
-
|
|
50807
|
+
fs30.writeFileSync(tmp, content, { mode: 384 });
|
|
50808
|
+
fs30.renameSync(tmp, file);
|
|
50780
50809
|
try {
|
|
50781
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
50969
|
+
fs32.appendFileSync(file, line, { mode: 384 });
|
|
50941
50970
|
try {
|
|
50942
|
-
|
|
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
|
-
|
|
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
|
-
|
|
50982
|
-
|
|
51010
|
+
fs32.writeFileSync(tmp, content, { mode: 384 });
|
|
51011
|
+
fs32.renameSync(tmp, file);
|
|
50983
51012
|
try {
|
|
50984
|
-
|
|
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
|
|
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 =
|
|
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
|
-
|
|
51174
|
-
|
|
51175
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
51394
|
+
fs34.mkdirSync(ownerDst, { recursive: true });
|
|
51366
51395
|
for (const file of readdirSafe(ownerSrc)) {
|
|
51367
51396
|
if (!file.endsWith(".json")) continue;
|
|
51368
|
-
|
|
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
|
-
|
|
51405
|
+
fs34.mkdirSync(archiveDst, { recursive: true });
|
|
51377
51406
|
for (const file of readdirSafe(listenerSrc)) {
|
|
51378
51407
|
if (!file.endsWith(".json")) continue;
|
|
51379
|
-
|
|
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
|
-
|
|
51387
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
51442
|
+
return fs34.readdirSync(p2);
|
|
51414
51443
|
} catch {
|
|
51415
51444
|
return [];
|
|
51416
51445
|
}
|
|
51417
51446
|
}
|
|
51418
51447
|
function rmdirIfEmpty(p2) {
|
|
51419
51448
|
try {
|
|
51420
|
-
|
|
51449
|
+
fs34.rmdirSync(p2);
|
|
51421
51450
|
} catch {
|
|
51422
51451
|
}
|
|
51423
51452
|
}
|
|
51424
51453
|
|
|
51425
51454
|
// src/transport/http-router.ts
|
|
51426
|
-
var
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
51678
|
+
import_node_fs27.default.createWriteStream(tmpPath, { mode: 384 })
|
|
51650
51679
|
);
|
|
51651
51680
|
} catch (err) {
|
|
51652
51681
|
try {
|
|
51653
|
-
|
|
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
|
-
|
|
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 =
|
|
51702
|
+
hashDirExists = import_node_fs27.default.statSync(hashDir).isDirectory();
|
|
51674
51703
|
} catch {
|
|
51675
51704
|
}
|
|
51676
51705
|
if (hashDirExists) {
|
|
51677
|
-
const existing =
|
|
51706
|
+
const existing = import_node_fs27.default.readdirSync(hashDir).filter((n) => !n.startsWith("."));
|
|
51678
51707
|
finalFileName = existing[0] ?? args.fileName;
|
|
51679
51708
|
try {
|
|
51680
|
-
|
|
51709
|
+
import_node_fs27.default.unlinkSync(tmpPath);
|
|
51681
51710
|
} catch {
|
|
51682
51711
|
}
|
|
51683
51712
|
} else {
|
|
51684
51713
|
try {
|
|
51685
|
-
|
|
51714
|
+
import_node_fs27.default.mkdirSync(hashDir, { recursive: true });
|
|
51686
51715
|
finalFileName = args.fileName;
|
|
51687
|
-
|
|
51716
|
+
import_node_fs27.default.renameSync(tmpPath, import_node_path26.default.join(hashDir, finalFileName));
|
|
51688
51717
|
} catch (err) {
|
|
51689
51718
|
try {
|
|
51690
|
-
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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 (
|
|
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 (
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
52565
|
-
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
52693
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
52776
|
+
await import_node_fs32.default.promises.writeFile(tmp, data, { mode: 384 });
|
|
52748
52777
|
if (process.platform !== "win32") {
|
|
52749
52778
|
try {
|
|
52750
|
-
await
|
|
52779
|
+
await import_node_fs32.default.promises.chmod(tmp, 384);
|
|
52751
52780
|
} catch {
|
|
52752
52781
|
}
|
|
52753
52782
|
}
|
|
52754
|
-
await
|
|
52783
|
+
await import_node_fs32.default.promises.rename(tmp, this.filePath);
|
|
52755
52784
|
}
|
|
52756
52785
|
async clear() {
|
|
52757
52786
|
try {
|
|
52758
|
-
await
|
|
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
|
|
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 (!
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
52910
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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 (!
|
|
52991
|
+
if (!import_node_fs33.default.existsSync(src)) {
|
|
52963
52992
|
throw new Error(`frpc not found inside tarball at ${src}`);
|
|
52964
52993
|
}
|
|
52965
|
-
|
|
52994
|
+
import_node_fs33.default.copyFileSync(src, destBin);
|
|
52966
52995
|
} finally {
|
|
52967
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
53262
|
+
import_node_fs35.default.mkdirSync(logDir, { recursive: true });
|
|
53234
53263
|
const logFilePath = import_node_path35.default.join(logDir, "frpc.log");
|
|
53235
|
-
const logStream =
|
|
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
|
|
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
|
|
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
|
-
|
|
53353
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
53651
|
+
import_node_fs38.default.mkdirSync(binDir, { recursive: true, mode: 493 });
|
|
53623
53652
|
const target = import_node_path38.default.join(binDir, "clawd");
|
|
53624
|
-
|
|
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
|
-
|
|
53652
|
-
|
|
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 (!
|
|
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 (!
|
|
53661
|
-
|
|
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
|
-
|
|
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
|
-
|
|
53678
|
-
const logStream =
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
53839
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
53873
|
-
|
|
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
|
-
|
|
53963
|
-
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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
|
-
|
|
54364
|
-
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
-
|
|
54444
|
-
|
|
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
|
-
|
|
54475
|
+
import_node_fs45.default.chmodSync(this.file, 384);
|
|
54447
54476
|
} catch {
|
|
54448
54477
|
}
|
|
54449
54478
|
}
|
|
54450
54479
|
clear() {
|
|
54451
54480
|
try {
|
|
54452
|
-
|
|
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
|
|
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 =
|
|
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
|
-
|
|
54815
|
-
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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 (!
|
|
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
|
-
|
|
54893
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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 (
|
|
55986
|
+
if (import_node_fs48.default.existsSync(privPath) && import_node_fs48.default.existsSync(pubPath)) {
|
|
55958
55987
|
return {
|
|
55959
|
-
privateKeyPem:
|
|
55960
|
-
publicKeyLine:
|
|
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
|
-
|
|
56003
|
+
import_node_fs48.default.chmodSync(privPath, 384);
|
|
55975
56004
|
} catch {
|
|
55976
56005
|
}
|
|
55977
56006
|
try {
|
|
55978
|
-
|
|
56007
|
+
import_node_fs48.default.chmodSync(pubPath, 420);
|
|
55979
56008
|
} catch {
|
|
55980
56009
|
}
|
|
55981
56010
|
return {
|
|
55982
|
-
privateKeyPem:
|
|
55983
|
-
publicKeyLine:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
57356
|
-
await
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
-
|
|
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) =>
|
|
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) =>
|
|
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) =>
|
|
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) =>
|
|
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 =
|
|
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) =>
|
|
59957
|
-
|
|
59958
|
-
|
|
59959
|
-
|
|
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
|
-
|
|
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
|
-
|
|
60733
|
+
import_node_fs52.default.rmSync(dir, { recursive: true, force: true });
|
|
60661
60734
|
} catch {
|
|
60662
60735
|
}
|
|
60663
60736
|
}
|