@clawos-dev/clawd 0.2.341 → 0.2.342
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.cjs
CHANGED
|
@@ -13935,6 +13935,49 @@ function isUserPlainTextLine(obj) {
|
|
|
13935
13935
|
const part = content[0];
|
|
13936
13936
|
return part?.type === "text";
|
|
13937
13937
|
}
|
|
13938
|
+
function injectTurnBoundaries(messages) {
|
|
13939
|
+
if (messages.some((m2) => m2.kind === "turn-end")) return messages;
|
|
13940
|
+
const out = [];
|
|
13941
|
+
let contentSeen = false;
|
|
13942
|
+
for (const m2 of messages) {
|
|
13943
|
+
if (m2.isSidechain) {
|
|
13944
|
+
out.push(m2);
|
|
13945
|
+
continue;
|
|
13946
|
+
}
|
|
13947
|
+
if (m2.kind === "turn-end") {
|
|
13948
|
+
contentSeen = false;
|
|
13949
|
+
out.push(m2);
|
|
13950
|
+
continue;
|
|
13951
|
+
}
|
|
13952
|
+
if (m2.kind === "user-text" && m2.meta === void 0 && contentSeen) {
|
|
13953
|
+
out.push({ kind: "turn-end" });
|
|
13954
|
+
contentSeen = false;
|
|
13955
|
+
}
|
|
13956
|
+
if (m2.kind === "assistant-text" || m2.kind === "tool_call" || m2.kind === "tool_result") {
|
|
13957
|
+
contentSeen = true;
|
|
13958
|
+
}
|
|
13959
|
+
out.push(m2);
|
|
13960
|
+
}
|
|
13961
|
+
return out;
|
|
13962
|
+
}
|
|
13963
|
+
function appendTurnDurationRowToJsonl(args) {
|
|
13964
|
+
const base = args.baseDir ?? import_node_path5.default.join(import_node_os3.default.homedir(), ".claude");
|
|
13965
|
+
const file = import_node_path5.default.join(
|
|
13966
|
+
base,
|
|
13967
|
+
"projects",
|
|
13968
|
+
cwdToHashDir(args.cwd),
|
|
13969
|
+
`${args.toolSessionId}.jsonl`
|
|
13970
|
+
);
|
|
13971
|
+
if (!import_node_fs6.default.existsSync(file)) return;
|
|
13972
|
+
const row = {
|
|
13973
|
+
type: "system",
|
|
13974
|
+
subtype: "turn_duration",
|
|
13975
|
+
...args.durationMs !== void 0 ? { durationMs: args.durationMs } : {},
|
|
13976
|
+
uuid: `clawd-td-${import_node_crypto3.default.randomUUID()}`,
|
|
13977
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
13978
|
+
};
|
|
13979
|
+
import_node_fs6.default.appendFileSync(file, JSON.stringify(row) + "\n");
|
|
13980
|
+
}
|
|
13938
13981
|
function messageFromJsonl(obj) {
|
|
13939
13982
|
if (!obj || typeof obj !== "object") return null;
|
|
13940
13983
|
const o = obj;
|
|
@@ -14134,10 +14177,11 @@ function readCurrentContent(filePath) {
|
|
|
14134
14177
|
return null;
|
|
14135
14178
|
}
|
|
14136
14179
|
}
|
|
14137
|
-
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;
|
|
14180
|
+
var import_node_crypto3, 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;
|
|
14138
14181
|
var init_claude_history = __esm({
|
|
14139
14182
|
"src/tools/claude-history.ts"() {
|
|
14140
14183
|
"use strict";
|
|
14184
|
+
import_node_crypto3 = __toESM(require("crypto"), 1);
|
|
14141
14185
|
import_node_fs6 = __toESM(require("fs"), 1);
|
|
14142
14186
|
import_node_os3 = __toESM(require("os"), 1);
|
|
14143
14187
|
import_node_path5 = __toESM(require("path"), 1);
|
|
@@ -14292,10 +14336,11 @@ var init_claude_history = __esm({
|
|
|
14292
14336
|
const msg = messageFromJsonl(line);
|
|
14293
14337
|
if (msg) messages.push(msg);
|
|
14294
14338
|
}
|
|
14295
|
-
const
|
|
14339
|
+
const withBoundaries = injectTurnBoundaries(messages);
|
|
14340
|
+
const total = withBoundaries.length;
|
|
14296
14341
|
const limit = args.limit ?? total;
|
|
14297
14342
|
const offset = args.offset !== void 0 ? Math.min(Math.max(0, args.offset), total) : Math.max(0, total - limit);
|
|
14298
|
-
return { messages:
|
|
14343
|
+
return { messages: withBoundaries.slice(offset, offset + limit), total, offset };
|
|
14299
14344
|
}
|
|
14300
14345
|
// CC 子 agent(Agent / Task tool 派发)的对话写在独立文件:
|
|
14301
14346
|
// <projectsRoot>/<cwdHash>/<toolSessionId>/subagents/agent-<agentId>.jsonl
|
|
@@ -15122,6 +15167,12 @@ var init_claude = __esm({
|
|
|
15122
15167
|
this.probeCache = res;
|
|
15123
15168
|
return res;
|
|
15124
15169
|
}
|
|
15170
|
+
// turn 边界持久化(方向 A):SDK 模式 CC 不写 turn_duration 行,daemon 在 turn_end
|
|
15171
|
+
// 时经 runner 调这里补写,历史回放两种模式统一走 jsonl 真源。实现在 claude-history
|
|
15172
|
+
// (路径解析与读取侧同源)。
|
|
15173
|
+
appendTurnDurationRow(args) {
|
|
15174
|
+
appendTurnDurationRowToJsonl(args);
|
|
15175
|
+
}
|
|
15125
15176
|
async capabilities() {
|
|
15126
15177
|
return CLAUDE_CAPABILITIES;
|
|
15127
15178
|
}
|
|
@@ -44699,6 +44750,16 @@ function pushEventToBufferInPlace(next, event, deps) {
|
|
|
44699
44750
|
}
|
|
44700
44751
|
if (next.freshSpawn) next.freshSpawn = false;
|
|
44701
44752
|
const effects = [emitSessionEvent(next.file.sessionId, withSeq)];
|
|
44753
|
+
if (isTurnEnd) {
|
|
44754
|
+
const te = withSeq;
|
|
44755
|
+
const tool = next.file.tool ?? "claude";
|
|
44756
|
+
if (tool === "claude" && (deps.mode !== "tui" || te.reason === "interrupted")) {
|
|
44757
|
+
effects.push({
|
|
44758
|
+
kind: "append-turn-duration",
|
|
44759
|
+
...te.durationMs !== void 0 ? { durationMs: te.durationMs } : {}
|
|
44760
|
+
});
|
|
44761
|
+
}
|
|
44762
|
+
}
|
|
44702
44763
|
if (isUserText || isTurnEnd) {
|
|
44703
44764
|
next.file = { ...next.file, updatedAt: nowIso(deps) };
|
|
44704
44765
|
effects.push({ kind: "persist-file", file: next.file });
|
|
@@ -45608,6 +45669,20 @@ var SessionRunner = class {
|
|
|
45608
45669
|
this.hooks.logger?.error("persist-file failed", { err: err.message });
|
|
45609
45670
|
}
|
|
45610
45671
|
break;
|
|
45672
|
+
case "append-turn-duration": {
|
|
45673
|
+
const f = this.state.file;
|
|
45674
|
+
if (!f.toolSessionId) break;
|
|
45675
|
+
try {
|
|
45676
|
+
this.hooks.adapter.appendTurnDurationRow?.({
|
|
45677
|
+
cwd: f.cwd,
|
|
45678
|
+
toolSessionId: f.toolSessionId,
|
|
45679
|
+
...effect.durationMs !== void 0 ? { durationMs: effect.durationMs } : {}
|
|
45680
|
+
});
|
|
45681
|
+
} catch (err) {
|
|
45682
|
+
this.hooks.logger?.warn("append-turn-duration failed", { err: err.message });
|
|
45683
|
+
}
|
|
45684
|
+
break;
|
|
45685
|
+
}
|
|
45611
45686
|
case "delete-file":
|
|
45612
45687
|
try {
|
|
45613
45688
|
this.hooks.store.delete(this.state.file.sessionId);
|
|
@@ -49307,7 +49382,7 @@ function tryLoadShareUi(logger) {
|
|
|
49307
49382
|
}
|
|
49308
49383
|
|
|
49309
49384
|
// src/visitor/visitor-token.ts
|
|
49310
|
-
var
|
|
49385
|
+
var import_node_crypto4 = __toESM(require("crypto"), 1);
|
|
49311
49386
|
|
|
49312
49387
|
// ../protocol/src/index.ts
|
|
49313
49388
|
init_runtime();
|
|
@@ -49315,7 +49390,7 @@ init_runtime();
|
|
|
49315
49390
|
// src/visitor/visitor-token.ts
|
|
49316
49391
|
var DOMAIN_PREFIX = "clawd-visitor-v1|";
|
|
49317
49392
|
function hmac(secret, body) {
|
|
49318
|
-
return
|
|
49393
|
+
return import_node_crypto4.default.createHmac("sha256", secret).update(`${DOMAIN_PREFIX}${body}`).digest("base64url");
|
|
49319
49394
|
}
|
|
49320
49395
|
function signVisitorToken(secret, payload) {
|
|
49321
49396
|
const body = Buffer.from(JSON.stringify(payload)).toString("base64url");
|
|
@@ -49328,7 +49403,7 @@ function verifyVisitorToken(secret, token, now) {
|
|
|
49328
49403
|
const sig = token.slice(dot + 1);
|
|
49329
49404
|
const expected = hmac(secret, body);
|
|
49330
49405
|
if (sig.length !== expected.length) return { ok: false, reason: "BAD_SIGNATURE" };
|
|
49331
|
-
if (!
|
|
49406
|
+
if (!import_node_crypto4.default.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) {
|
|
49332
49407
|
return { ok: false, reason: "BAD_SIGNATURE" };
|
|
49333
49408
|
}
|
|
49334
49409
|
let payload;
|
|
@@ -50149,7 +50224,7 @@ var CodexAdapter = class {
|
|
|
50149
50224
|
};
|
|
50150
50225
|
|
|
50151
50226
|
// src/tools/claude-tui.ts
|
|
50152
|
-
var
|
|
50227
|
+
var import_node_crypto5 = require("crypto");
|
|
50153
50228
|
var import_node_fs19 = __toESM(require("fs"), 1);
|
|
50154
50229
|
var import_node_os7 = __toESM(require("os"), 1);
|
|
50155
50230
|
var import_node_path17 = __toESM(require("path"), 1);
|
|
@@ -51037,7 +51112,7 @@ function observeScreenIdle(surface, opts) {
|
|
|
51037
51112
|
};
|
|
51038
51113
|
}
|
|
51039
51114
|
function shortHash(s) {
|
|
51040
|
-
return (0,
|
|
51115
|
+
return (0, import_node_crypto5.createHash)("sha1").update(s).digest("hex").slice(0, 8);
|
|
51041
51116
|
}
|
|
51042
51117
|
function firstLineDiff(prev, next) {
|
|
51043
51118
|
const p2 = prev.split("\n");
|
|
@@ -51753,7 +51828,7 @@ function resolveSourceJsonlPath(sourceFile, home) {
|
|
|
51753
51828
|
// src/shift/store.ts
|
|
51754
51829
|
var import_promises2 = __toESM(require("fs/promises"), 1);
|
|
51755
51830
|
var import_node_path26 = __toESM(require("path"), 1);
|
|
51756
|
-
var
|
|
51831
|
+
var import_node_crypto6 = require("crypto");
|
|
51757
51832
|
|
|
51758
51833
|
// src/shift/schedule.ts
|
|
51759
51834
|
var import_cron_parser = __toESM(require_dist(), 1);
|
|
@@ -51857,7 +51932,7 @@ function createShiftStore(deps) {
|
|
|
51857
51932
|
const shift = {
|
|
51858
51933
|
...input,
|
|
51859
51934
|
schedule,
|
|
51860
|
-
id: (0,
|
|
51935
|
+
id: (0, import_node_crypto6.randomUUID)(),
|
|
51861
51936
|
createdAtMs: now,
|
|
51862
51937
|
updatedAtMs: now,
|
|
51863
51938
|
state: { nextRunAtMs },
|
|
@@ -52944,7 +53019,7 @@ ${formatLarkSpeakerReminder(speaker)}`
|
|
|
52944
53019
|
}
|
|
52945
53020
|
|
|
52946
53021
|
// src/lark-bot-connector/envelope.ts
|
|
52947
|
-
var
|
|
53022
|
+
var import_node_crypto7 = require("crypto");
|
|
52948
53023
|
var LARK_ENVELOPE_PREFIX = "clawdlbe1";
|
|
52949
53024
|
function verifyLarkEventEnvelope(args) {
|
|
52950
53025
|
const { token, publicKeyPem } = args;
|
|
@@ -52963,7 +53038,7 @@ function verifyLarkEventEnvelope(args) {
|
|
|
52963
53038
|
const data = Buffer.from(`${prefix}.${payloadB64}`, "utf8");
|
|
52964
53039
|
let sigOk = false;
|
|
52965
53040
|
try {
|
|
52966
|
-
sigOk = (0,
|
|
53041
|
+
sigOk = (0, import_node_crypto7.verify)(null, data, publicKeyPem, Buffer.from(sigB64, "base64url"));
|
|
52967
53042
|
} catch {
|
|
52968
53043
|
sigOk = false;
|
|
52969
53044
|
}
|
|
@@ -55412,7 +55487,7 @@ var ContactStore = class {
|
|
|
55412
55487
|
};
|
|
55413
55488
|
|
|
55414
55489
|
// src/contact/connect-remote.ts
|
|
55415
|
-
var
|
|
55490
|
+
var crypto5 = __toESM(require("crypto"), 1);
|
|
55416
55491
|
init_protocol();
|
|
55417
55492
|
var HANDSHAKE_TIMEOUT_MS = 5e3;
|
|
55418
55493
|
var RPC_TIMEOUT_MS = 5e3;
|
|
@@ -55467,7 +55542,7 @@ async function connectRemote(args) {
|
|
|
55467
55542
|
ws.once("close", onClose);
|
|
55468
55543
|
});
|
|
55469
55544
|
function call(method, payload) {
|
|
55470
|
-
const requestId =
|
|
55545
|
+
const requestId = crypto5.randomUUID();
|
|
55471
55546
|
return new Promise((resolve6, reject) => {
|
|
55472
55547
|
const onMessage = (raw) => {
|
|
55473
55548
|
let f;
|
|
@@ -55724,7 +55799,7 @@ function lookupMime(filePathOrName) {
|
|
|
55724
55799
|
}
|
|
55725
55800
|
|
|
55726
55801
|
// src/attachment/sign-url.ts
|
|
55727
|
-
var
|
|
55802
|
+
var import_node_crypto8 = __toESM(require("crypto"), 1);
|
|
55728
55803
|
var HMAC_ALGO = "sha256";
|
|
55729
55804
|
function base64urlEncode(buf) {
|
|
55730
55805
|
const b2 = typeof buf === "string" ? Buffer.from(buf, "utf8") : buf;
|
|
@@ -55742,7 +55817,7 @@ function decodeAbsPathFromUrl(encoded) {
|
|
|
55742
55817
|
var DOMAIN_PREFIX2 = "clawd-attach-v1|";
|
|
55743
55818
|
function computeSig(secret, absPath, e) {
|
|
55744
55819
|
const msg = e === null ? `${DOMAIN_PREFIX2}${absPath}` : `${DOMAIN_PREFIX2}${absPath}|${e}`;
|
|
55745
|
-
return
|
|
55820
|
+
return import_node_crypto8.default.createHmac(HMAC_ALGO, secret).update(msg).digest();
|
|
55746
55821
|
}
|
|
55747
55822
|
function signUrlParts(secret, absPath, ttlSeconds, now = Date.now) {
|
|
55748
55823
|
const e = ttlSeconds === null ? null : Math.floor(now() / 1e3) + ttlSeconds;
|
|
@@ -55777,7 +55852,7 @@ function verifySignedUrl(secret, absPath, eRaw, s, now = Date.now) {
|
|
|
55777
55852
|
if (provided.length !== expected.length) {
|
|
55778
55853
|
return { ok: false, code: "BAD_SIG" };
|
|
55779
55854
|
}
|
|
55780
|
-
if (!
|
|
55855
|
+
if (!import_node_crypto8.default.timingSafeEqual(provided, expected)) {
|
|
55781
55856
|
return { ok: false, code: "BAD_SIG" };
|
|
55782
55857
|
}
|
|
55783
55858
|
if (e !== null && now() / 1e3 > e) {
|
|
@@ -55789,7 +55864,7 @@ function verifySignedUrl(secret, absPath, eRaw, s, now = Date.now) {
|
|
|
55789
55864
|
// src/attachment/upload.ts
|
|
55790
55865
|
var import_node_fs32 = __toESM(require("fs"), 1);
|
|
55791
55866
|
var import_node_path35 = __toESM(require("path"), 1);
|
|
55792
|
-
var
|
|
55867
|
+
var import_node_crypto9 = __toESM(require("crypto"), 1);
|
|
55793
55868
|
var import_promises4 = require("stream/promises");
|
|
55794
55869
|
var UploadError = class extends Error {
|
|
55795
55870
|
constructor(code, message) {
|
|
@@ -55813,11 +55888,11 @@ async function writeUploadedAttachment(args) {
|
|
|
55813
55888
|
} catch (err) {
|
|
55814
55889
|
throw new UploadError("STORAGE_ERROR", `mkdir failed: ${err.message}`);
|
|
55815
55890
|
}
|
|
55816
|
-
const hasher =
|
|
55891
|
+
const hasher = import_node_crypto9.default.createHash("sha256");
|
|
55817
55892
|
let actualSize = 0;
|
|
55818
55893
|
const tmpPath = import_node_path35.default.join(
|
|
55819
55894
|
attachmentsRoot,
|
|
55820
|
-
`.upload-${process.pid}-${Date.now()}-${
|
|
55895
|
+
`.upload-${process.pid}-${Date.now()}-${import_node_crypto9.default.randomBytes(4).toString("hex")}`
|
|
55821
55896
|
);
|
|
55822
55897
|
try {
|
|
55823
55898
|
await (0, import_promises4.pipeline)(
|
|
@@ -56653,7 +56728,7 @@ function runAttachmentGc(args) {
|
|
|
56653
56728
|
// src/attachment/group.ts
|
|
56654
56729
|
var import_node_fs35 = __toESM(require("fs"), 1);
|
|
56655
56730
|
var import_node_path39 = __toESM(require("path"), 1);
|
|
56656
|
-
var
|
|
56731
|
+
var import_node_crypto10 = __toESM(require("crypto"), 1);
|
|
56657
56732
|
init_protocol();
|
|
56658
56733
|
var GroupFileStore = class {
|
|
56659
56734
|
dataDir;
|
|
@@ -56742,7 +56817,7 @@ var GroupFileStore = class {
|
|
|
56742
56817
|
entries[idx] = next;
|
|
56743
56818
|
} else {
|
|
56744
56819
|
next = {
|
|
56745
|
-
id: `gf-${
|
|
56820
|
+
id: `gf-${import_node_crypto10.default.randomBytes(6).toString("base64url")}`,
|
|
56746
56821
|
relPath: input.relPath,
|
|
56747
56822
|
from: input.from,
|
|
56748
56823
|
label: input.label,
|
|
@@ -56860,7 +56935,7 @@ function readSpawnedByDesktopFromEnv(env = process.env) {
|
|
|
56860
56935
|
// src/tunnel/tunnel-manager.ts
|
|
56861
56936
|
var import_node_fs40 = __toESM(require("fs"), 1);
|
|
56862
56937
|
var import_node_path44 = __toESM(require("path"), 1);
|
|
56863
|
-
var
|
|
56938
|
+
var import_node_crypto11 = __toESM(require("crypto"), 1);
|
|
56864
56939
|
var import_node_child_process10 = require("child_process");
|
|
56865
56940
|
|
|
56866
56941
|
// src/tunnel/tunnel-store.ts
|
|
@@ -57359,7 +57434,7 @@ var TunnelManager = class {
|
|
|
57359
57434
|
override: this.deps.frpcBinaryOverride ?? void 0
|
|
57360
57435
|
});
|
|
57361
57436
|
const tomlPath = import_node_path44.default.join(this.deps.dataDir, "frpc.toml");
|
|
57362
|
-
const proxyName = `clawd-${t.subdomain}-${localPort}-${
|
|
57437
|
+
const proxyName = `clawd-${t.subdomain}-${localPort}-${import_node_crypto11.default.randomBytes(3).toString("hex")}`;
|
|
57363
57438
|
const toml = buildFrpcToml({
|
|
57364
57439
|
serverAddr: t.frpsHost,
|
|
57365
57440
|
serverPort: t.frpsPort,
|
|
@@ -57460,7 +57535,7 @@ async function waitForFrpcReady(proc, timeoutMs) {
|
|
|
57460
57535
|
// src/tunnel/device-key.ts
|
|
57461
57536
|
var import_node_os14 = __toESM(require("os"), 1);
|
|
57462
57537
|
var import_node_path45 = __toESM(require("path"), 1);
|
|
57463
|
-
var
|
|
57538
|
+
var import_node_crypto12 = __toESM(require("crypto"), 1);
|
|
57464
57539
|
var DERIVE_SALT = "clawd-tunnel-device-v1";
|
|
57465
57540
|
function deriveStableDeviceKey(opts = {}) {
|
|
57466
57541
|
const hostname = opts.hostname ?? import_node_os14.default.hostname();
|
|
@@ -57470,13 +57545,13 @@ function deriveStableDeviceKey(opts = {}) {
|
|
|
57470
57545
|
const normalizedDataDir = opts.dataDir ? import_node_path45.default.resolve(opts.dataDir) : null;
|
|
57471
57546
|
const isDefaultDir = normalizedDataDir == null || normalizedDataDir === defaultDataDir;
|
|
57472
57547
|
const input = isDefaultDir ? `${hostname}::${uid}` : `${hostname}::${uid}::${normalizedDataDir}`;
|
|
57473
|
-
return
|
|
57548
|
+
return import_node_crypto12.default.createHmac("sha256", DERIVE_SALT).update(input).digest("hex").slice(0, 32);
|
|
57474
57549
|
}
|
|
57475
57550
|
|
|
57476
57551
|
// src/auth-store.ts
|
|
57477
57552
|
var import_node_fs41 = __toESM(require("fs"), 1);
|
|
57478
57553
|
var import_node_path46 = __toESM(require("path"), 1);
|
|
57479
|
-
var
|
|
57554
|
+
var import_node_crypto13 = __toESM(require("crypto"), 1);
|
|
57480
57555
|
var AUTH_FILE_NAME = "auth.json";
|
|
57481
57556
|
function authFilePath(dataDir) {
|
|
57482
57557
|
return import_node_path46.default.join(dataDir, AUTH_FILE_NAME);
|
|
@@ -57504,10 +57579,10 @@ function loadOrCreateAuthFile(opts) {
|
|
|
57504
57579
|
return next;
|
|
57505
57580
|
}
|
|
57506
57581
|
function defaultGenerateToken() {
|
|
57507
|
-
return
|
|
57582
|
+
return import_node_crypto13.default.randomBytes(32).toString("base64url");
|
|
57508
57583
|
}
|
|
57509
57584
|
function defaultGenerateOwnerPrincipalId() {
|
|
57510
|
-
return `owner-${
|
|
57585
|
+
return `owner-${import_node_crypto13.default.randomUUID()}`;
|
|
57511
57586
|
}
|
|
57512
57587
|
function readAuthFile(file) {
|
|
57513
57588
|
try {
|
|
@@ -57639,7 +57714,7 @@ var OwnerIdentityStore = class {
|
|
|
57639
57714
|
};
|
|
57640
57715
|
|
|
57641
57716
|
// src/feishu-auth/login-flow.ts
|
|
57642
|
-
var
|
|
57717
|
+
var import_node_crypto14 = __toESM(require("crypto"), 1);
|
|
57643
57718
|
var STATE_TTL_MS = 5 * 60 * 1e3;
|
|
57644
57719
|
var LoginFlow = class {
|
|
57645
57720
|
constructor(deps) {
|
|
@@ -57648,7 +57723,7 @@ var LoginFlow = class {
|
|
|
57648
57723
|
deps;
|
|
57649
57724
|
pendingStates = /* @__PURE__ */ new Map();
|
|
57650
57725
|
start() {
|
|
57651
|
-
const state =
|
|
57726
|
+
const state = import_node_crypto14.default.randomBytes(16).toString("base64url");
|
|
57652
57727
|
const now = (this.deps.now ?? Date.now)();
|
|
57653
57728
|
this.pendingStates.set(state, now);
|
|
57654
57729
|
this.gcExpired(now);
|
|
@@ -57914,7 +57989,7 @@ async function upsertDeviceBinding(opts) {
|
|
|
57914
57989
|
}
|
|
57915
57990
|
|
|
57916
57991
|
// src/feishu-auth/verify-token.ts
|
|
57917
|
-
var
|
|
57992
|
+
var crypto13 = __toESM(require("crypto"), 1);
|
|
57918
57993
|
var CONNECT_TOKEN_PREFIX = "clawdtk1";
|
|
57919
57994
|
function verifyConnectToken(args) {
|
|
57920
57995
|
const now = args.nowSeconds ?? Math.floor(Date.now() / 1e3);
|
|
@@ -57926,7 +58001,7 @@ function verifyConnectToken(args) {
|
|
|
57926
58001
|
const data = `${prefix}.${payloadB64}`;
|
|
57927
58002
|
let signatureValid = false;
|
|
57928
58003
|
try {
|
|
57929
|
-
signatureValid =
|
|
58004
|
+
signatureValid = crypto13.verify(
|
|
57930
58005
|
null,
|
|
57931
58006
|
Buffer.from(data, "utf8"),
|
|
57932
58007
|
args.publicKeyPem,
|
|
@@ -60150,7 +60225,7 @@ function computeMethodAccess(args) {
|
|
|
60150
60225
|
}
|
|
60151
60226
|
|
|
60152
60227
|
// src/version.ts
|
|
60153
|
-
var version = "0.2.
|
|
60228
|
+
var version = "0.2.342".length > 0 ? "0.2.342" : "dev";
|
|
60154
60229
|
|
|
60155
60230
|
// src/cli-probe/probe.ts
|
|
60156
60231
|
var fs59 = __toESM(require("fs"), 1);
|
|
@@ -60533,7 +60608,7 @@ init_protocol();
|
|
|
60533
60608
|
// src/extension/bundle-zip.ts
|
|
60534
60609
|
var import_promises8 = __toESM(require("fs/promises"), 1);
|
|
60535
60610
|
var import_node_path54 = __toESM(require("path"), 1);
|
|
60536
|
-
var
|
|
60611
|
+
var import_node_crypto15 = __toESM(require("crypto"), 1);
|
|
60537
60612
|
var import_jszip2 = __toESM(require_lib3(), 1);
|
|
60538
60613
|
async function bundleExtensionDir(dir) {
|
|
60539
60614
|
const entries = await listFilesSorted(dir);
|
|
@@ -60548,7 +60623,7 @@ async function bundleExtensionDir(dir) {
|
|
|
60548
60623
|
compression: "DEFLATE",
|
|
60549
60624
|
compressionOptions: { level: 6 }
|
|
60550
60625
|
});
|
|
60551
|
-
const sha256 =
|
|
60626
|
+
const sha256 = import_node_crypto15.default.createHash("sha256").update(buffer).digest("hex");
|
|
60552
60627
|
return { buffer, sha256 };
|
|
60553
60628
|
}
|
|
60554
60629
|
var FIXED_DATE = /* @__PURE__ */ new Date("2020-01-01T00:00:00.000Z");
|
|
@@ -60616,7 +60691,7 @@ function computePublishCheck(args) {
|
|
|
60616
60691
|
var import_promises9 = __toESM(require("fs/promises"), 1);
|
|
60617
60692
|
var import_node_path56 = __toESM(require("path"), 1);
|
|
60618
60693
|
var import_node_os20 = __toESM(require("os"), 1);
|
|
60619
|
-
var
|
|
60694
|
+
var import_node_crypto16 = __toESM(require("crypto"), 1);
|
|
60620
60695
|
var import_jszip3 = __toESM(require_lib3(), 1);
|
|
60621
60696
|
|
|
60622
60697
|
// src/extension/paths.ts
|
|
@@ -60645,7 +60720,7 @@ var InstallError = class extends Error {
|
|
|
60645
60720
|
};
|
|
60646
60721
|
async function installFromChannel(args, deps) {
|
|
60647
60722
|
const { channelRef, snapshotHash, bundleZip } = args;
|
|
60648
|
-
const computed =
|
|
60723
|
+
const computed = import_node_crypto16.default.createHash("sha256").update(bundleZip).digest("hex");
|
|
60649
60724
|
if (computed !== snapshotHash) {
|
|
60650
60725
|
throw new InstallError(
|
|
60651
60726
|
"HASH_MISMATCH",
|
|
@@ -60737,7 +60812,7 @@ async function installFromChannel(args, deps) {
|
|
|
60737
60812
|
var import_promises10 = __toESM(require("fs/promises"), 1);
|
|
60738
60813
|
var import_node_path57 = __toESM(require("path"), 1);
|
|
60739
60814
|
var import_node_os21 = __toESM(require("os"), 1);
|
|
60740
|
-
var
|
|
60815
|
+
var import_node_crypto17 = __toESM(require("crypto"), 1);
|
|
60741
60816
|
var import_jszip4 = __toESM(require_lib3(), 1);
|
|
60742
60817
|
var UpdateError = class extends Error {
|
|
60743
60818
|
constructor(code, message) {
|
|
@@ -60775,7 +60850,7 @@ async function updateFromChannel(args, deps) {
|
|
|
60775
60850
|
if (e instanceof UpdateError) throw e;
|
|
60776
60851
|
throw e;
|
|
60777
60852
|
}
|
|
60778
|
-
const computed =
|
|
60853
|
+
const computed = import_node_crypto17.default.createHash("sha256").update(bundleZip).digest("hex");
|
|
60779
60854
|
if (computed !== snapshotHash) {
|
|
60780
60855
|
throw new UpdateError(
|
|
60781
60856
|
"HASH_MISMATCH",
|
|
@@ -61441,7 +61516,7 @@ function listPidsOnPort(port) {
|
|
|
61441
61516
|
}
|
|
61442
61517
|
|
|
61443
61518
|
// src/app-builder/publish-registry.ts
|
|
61444
|
-
var
|
|
61519
|
+
var import_node_crypto18 = require("crypto");
|
|
61445
61520
|
var PublishJobRegistry = class {
|
|
61446
61521
|
jobs = /* @__PURE__ */ new Map();
|
|
61447
61522
|
has(name) {
|
|
@@ -61458,7 +61533,7 @@ var PublishJobRegistry = class {
|
|
|
61458
61533
|
if (this.jobs.has(args.name)) {
|
|
61459
61534
|
throw new Error(`already publishing: ${args.name}`);
|
|
61460
61535
|
}
|
|
61461
|
-
const jobId = args.jobId ?? `job-${(0,
|
|
61536
|
+
const jobId = args.jobId ?? `job-${(0, import_node_crypto18.randomUUID)()}`;
|
|
61462
61537
|
this.jobs.set(args.name, {
|
|
61463
61538
|
jobId,
|
|
61464
61539
|
name: args.name,
|
|
@@ -62645,7 +62720,7 @@ async function uninstall(deps) {
|
|
|
62645
62720
|
}
|
|
62646
62721
|
|
|
62647
62722
|
// src/handlers/index.ts
|
|
62648
|
-
var
|
|
62723
|
+
var import_node_crypto19 = require("crypto");
|
|
62649
62724
|
|
|
62650
62725
|
// src/handlers/peer-exec.ts
|
|
62651
62726
|
init_protocol();
|
|
@@ -62800,7 +62875,7 @@ function buildMethodHandlers(deps) {
|
|
|
62800
62875
|
const c = deps.contactStore.get(deviceId);
|
|
62801
62876
|
return c ? { deviceId: c.deviceId, remoteUrl: c.remoteUrl, connectToken: c.connectToken } : null;
|
|
62802
62877
|
},
|
|
62803
|
-
genId: () => (0,
|
|
62878
|
+
genId: () => (0, import_node_crypto19.randomUUID)(),
|
|
62804
62879
|
now: () => Date.now(),
|
|
62805
62880
|
forwardInboxPostToPeer,
|
|
62806
62881
|
logger: deps.logger
|
|
@@ -23637,6 +23637,7 @@ var VisitorRecordSchema = external_exports.object({
|
|
|
23637
23637
|
var VisitorListResultSchema = external_exports.object({ visitors: external_exports.array(VisitorRecordSchema) });
|
|
23638
23638
|
|
|
23639
23639
|
// src/tools/claude-history.ts
|
|
23640
|
+
var import_node_crypto = __toESM(require("crypto"), 1);
|
|
23640
23641
|
var import_node_fs = __toESM(require("fs"), 1);
|
|
23641
23642
|
var import_node_os = __toESM(require("os"), 1);
|
|
23642
23643
|
var import_node_path = __toESM(require("path"), 1);
|