@clawos-dev/clawd 0.2.340 → 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 total = messages.length;
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: messages.slice(offset, offset + limit), total, offset };
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 import_node_crypto3 = __toESM(require("crypto"), 1);
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 import_node_crypto3.default.createHmac("sha256", secret).update(`${DOMAIN_PREFIX}${body}`).digest("base64url");
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 (!import_node_crypto3.default.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) {
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 import_node_crypto4 = require("crypto");
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, import_node_crypto4.createHash)("sha1").update(s).digest("hex").slice(0, 8);
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 import_node_crypto5 = require("crypto");
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, import_node_crypto5.randomUUID)(),
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 import_node_crypto6 = require("crypto");
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, import_node_crypto6.verify)(null, data, publicKeyPem, Buffer.from(sigB64, "base64url"));
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 crypto4 = __toESM(require("crypto"), 1);
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 = crypto4.randomUUID();
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 import_node_crypto7 = __toESM(require("crypto"), 1);
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 import_node_crypto7.default.createHmac(HMAC_ALGO, secret).update(msg).digest();
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 (!import_node_crypto7.default.timingSafeEqual(provided, expected)) {
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 import_node_crypto8 = __toESM(require("crypto"), 1);
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 = import_node_crypto8.default.createHash("sha256");
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()}-${import_node_crypto8.default.randomBytes(4).toString("hex")}`
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 import_node_crypto9 = __toESM(require("crypto"), 1);
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-${import_node_crypto9.default.randomBytes(6).toString("base64url")}`,
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 import_node_crypto10 = __toESM(require("crypto"), 1);
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}-${import_node_crypto10.default.randomBytes(3).toString("hex")}`;
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 import_node_crypto11 = __toESM(require("crypto"), 1);
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 import_node_crypto11.default.createHmac("sha256", DERIVE_SALT).update(input).digest("hex").slice(0, 32);
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 import_node_crypto12 = __toESM(require("crypto"), 1);
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 import_node_crypto12.default.randomBytes(32).toString("base64url");
57582
+ return import_node_crypto13.default.randomBytes(32).toString("base64url");
57508
57583
  }
57509
57584
  function defaultGenerateOwnerPrincipalId() {
57510
- return `owner-${import_node_crypto12.default.randomUUID()}`;
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 import_node_crypto13 = __toESM(require("crypto"), 1);
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 = import_node_crypto13.default.randomBytes(16).toString("base64url");
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 crypto12 = __toESM(require("crypto"), 1);
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 = crypto12.verify(
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.340".length > 0 ? "0.2.340" : "dev";
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 import_node_crypto14 = __toESM(require("crypto"), 1);
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 = import_node_crypto14.default.createHash("sha256").update(buffer).digest("hex");
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 import_node_crypto15 = __toESM(require("crypto"), 1);
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 = import_node_crypto15.default.createHash("sha256").update(bundleZip).digest("hex");
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 import_node_crypto16 = __toESM(require("crypto"), 1);
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 = import_node_crypto16.default.createHash("sha256").update(bundleZip).digest("hex");
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 import_node_crypto17 = require("crypto");
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, import_node_crypto17.randomUUID)()}`;
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 import_node_crypto18 = require("crypto");
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, import_node_crypto18.randomUUID)(),
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);