@clawos-dev/clawd 0.2.611 → 0.2.612

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.
@@ -23892,6 +23892,8 @@ var HistoryReadArgs = external_exports.object({
23892
23892
  limit: external_exports.number().int().positive().max(5e3).optional(),
23893
23893
  /** 不传时走 tail 语义:daemon 返回最后 limit 条(offset = max(0, total - limit)) */
23894
23894
  offset: external_exports.number().int().nonnegative().optional(),
23895
+ /** 云历史分页快照标识;续页原样带回,避免多条链交错时混读。 */
23896
+ snapshotId: external_exports.string().uuid().optional(),
23895
23897
  /**
23896
23898
  * 瘦身投影(2026-07-18 android-tasks-tab 迭代,v2 语义):true = daemon 裁掉窄消费面客户端
23897
23899
  * (mobile)不渲染的大字段(input / output / raw / toolResultExtra / memories /
package/dist/cli.cjs CHANGED
@@ -8759,6 +8759,8 @@ var init_schemas = __esm({
8759
8759
  limit: external_exports.number().int().positive().max(5e3).optional(),
8760
8760
  /** 不传时走 tail 语义:daemon 返回最后 limit 条(offset = max(0, total - limit)) */
8761
8761
  offset: external_exports.number().int().nonnegative().optional(),
8762
+ /** 云历史分页快照标识;续页原样带回,避免多条链交错时混读。 */
8763
+ snapshotId: external_exports.string().uuid().optional(),
8762
8764
  /**
8763
8765
  * 瘦身投影(2026-07-18 android-tasks-tab 迭代,v2 语义):true = daemon 裁掉窄消费面客户端
8764
8766
  * (mobile)不渲染的大字段(input / output / raw / toolResultExtra / memories /
@@ -33103,7 +33105,7 @@ var require_websocket = __commonJS({
33103
33105
  var http2 = require("http");
33104
33106
  var net2 = require("net");
33105
33107
  var tls = require("tls");
33106
- var { randomBytes: randomBytes2, createHash: createHash3 } = require("crypto");
33108
+ var { randomBytes: randomBytes2, createHash: createHash4 } = require("crypto");
33107
33109
  var { Duplex, Readable: Readable4 } = require("stream");
33108
33110
  var { URL: URL2 } = require("url");
33109
33111
  var PerMessageDeflate2 = require_permessage_deflate();
@@ -33763,7 +33765,7 @@ var require_websocket = __commonJS({
33763
33765
  abortHandshake(websocket, socket, "Invalid Upgrade header");
33764
33766
  return;
33765
33767
  }
33766
- const digest = createHash3("sha1").update(key + GUID).digest("base64");
33768
+ const digest = createHash4("sha1").update(key + GUID).digest("base64");
33767
33769
  if (res.headers["sec-websocket-accept"] !== digest) {
33768
33770
  abortHandshake(websocket, socket, "Invalid Sec-WebSocket-Accept header");
33769
33771
  return;
@@ -34130,7 +34132,7 @@ var require_websocket_server = __commonJS({
34130
34132
  var EventEmitter2 = require("events");
34131
34133
  var http2 = require("http");
34132
34134
  var { Duplex } = require("stream");
34133
- var { createHash: createHash3 } = require("crypto");
34135
+ var { createHash: createHash4 } = require("crypto");
34134
34136
  var extension2 = require_extension();
34135
34137
  var PerMessageDeflate2 = require_permessage_deflate();
34136
34138
  var subprotocol2 = require_subprotocol();
@@ -34431,7 +34433,7 @@ var require_websocket_server = __commonJS({
34431
34433
  );
34432
34434
  }
34433
34435
  if (this._state > RUNNING) return abortHandshake(socket, 503);
34434
- const digest = createHash3("sha1").update(key + GUID).digest("base64");
34436
+ const digest = createHash4("sha1").update(key + GUID).digest("base64");
34435
34437
  const headers = [
34436
34438
  "HTTP/1.1 101 Switching Protocols",
34437
34439
  "Upgrade: websocket",
@@ -44796,7 +44798,7 @@ Env (advanced):
44796
44798
  var import_node_path84 = __toESM(require("path"), 1);
44797
44799
  var import_node_fs65 = __toESM(require("fs"), 1);
44798
44800
  var import_node_os31 = __toESM(require("os"), 1);
44799
- var import_node_crypto26 = require("crypto");
44801
+ var import_node_crypto27 = require("crypto");
44800
44802
  var import_node_url6 = require("url");
44801
44803
 
44802
44804
  // src/logger.ts
@@ -52155,7 +52157,7 @@ function walkRollouts(dir, visit) {
52155
52157
  }
52156
52158
  return true;
52157
52159
  }
52158
- async function withSubagentResults(parent, parentThreadId, loadChild, logger) {
52160
+ async function withSubagentResults(parent, parentThreadId, loadChild, logger, rethrowLoadError = false) {
52159
52161
  const messages = [];
52160
52162
  const started = new Map(parent.subagents.map((s2) => [s2.toolUseId, s2]));
52161
52163
  for (const m3 of parent.messages) {
@@ -52166,6 +52168,7 @@ async function withSubagentResults(parent, parentThreadId, loadChild, logger) {
52166
52168
  try {
52167
52169
  text = await loadChild(sub.agentId);
52168
52170
  } catch (error) {
52171
+ if (rethrowLoadError) throw error;
52169
52172
  logger?.warn("codex subagent rollout unreadable", { childThreadId: sub.agentId, message: error.message });
52170
52173
  continue;
52171
52174
  }
@@ -52345,6 +52348,73 @@ var CodexHistoryReader = class {
52345
52348
  }
52346
52349
  };
52347
52350
 
52351
+ // src/tools/cloud-history-pages.ts
52352
+ var import_node_crypto6 = require("crypto");
52353
+ var CloudHistoryPages = class _CloudHistoryPages {
52354
+ constructor(log) {
52355
+ this.log = log;
52356
+ }
52357
+ log;
52358
+ snapshots = [];
52359
+ firstReads = /* @__PURE__ */ new Map();
52360
+ static IDLE_MS = 5 * 6e4;
52361
+ async read(args, load) {
52362
+ const key = `${args.cwd}\0${args.toolSessionId}`;
52363
+ const now = Date.now();
52364
+ for (let i2 = this.snapshots.length - 1; i2 >= 0; i2--) {
52365
+ if (now - this.snapshots[i2].lastUsedAt > _CloudHistoryPages.IDLE_MS) this.snapshots.splice(i2, 1);
52366
+ }
52367
+ let first = args.offset === void 0;
52368
+ let cached;
52369
+ if (!first) {
52370
+ for (let i2 = this.snapshots.length - 1; i2 >= 0; i2--) {
52371
+ const candidate = this.snapshots[i2];
52372
+ if (candidate.key === key && (args.snapshotId ? candidate.id === args.snapshotId : candidate.nextOffset === args.offset)) {
52373
+ cached = candidate;
52374
+ break;
52375
+ }
52376
+ }
52377
+ }
52378
+ if (args.snapshotId && !cached) first = true;
52379
+ const pageArgs = first ? { limit: args.limit } : args;
52380
+ const threadHash = (0, import_node_crypto6.createHash)("sha256").update(key).digest("hex").slice(0, 12);
52381
+ let source = "central";
52382
+ let messages;
52383
+ try {
52384
+ if (cached) {
52385
+ source = "snapshot";
52386
+ messages = cached.messages;
52387
+ } else if (first) {
52388
+ let pending = this.firstReads.get(key);
52389
+ if (!pending) {
52390
+ pending = load();
52391
+ this.firstReads.set(key, pending);
52392
+ void pending.finally(() => {
52393
+ if (this.firstReads.get(key) === pending) this.firstReads.delete(key);
52394
+ }).catch(() => {
52395
+ });
52396
+ } else {
52397
+ source = "shared";
52398
+ }
52399
+ messages = await pending;
52400
+ } else {
52401
+ messages = await load();
52402
+ }
52403
+ } catch (error) {
52404
+ this.log?.({ threadHash, source, outcome: error.status === 429 ? "429" : "error" });
52405
+ throw error;
52406
+ }
52407
+ this.log?.({ threadHash, source, outcome: "success" });
52408
+ const page = pageMessages(messages, pageArgs);
52409
+ const snapshotId = cached?.id ?? (0, import_node_crypto6.randomUUID)();
52410
+ if (cached) this.snapshots.splice(this.snapshots.indexOf(cached), 1);
52411
+ if (page.offset > 0 && args.limit !== void 0) {
52412
+ this.snapshots.push({ key, id: snapshotId, messages, nextOffset: Math.max(0, page.offset - args.limit), lastUsedAt: now });
52413
+ }
52414
+ return { ...page, snapshotId };
52415
+ }
52416
+ };
52417
+
52348
52418
  // src/tools/codex-cloud-history.ts
52349
52419
  function personaIdFromCloudCwd(cwd) {
52350
52420
  const m3 = /\/p\/([^/?#]+)(?:[/?#]|$)/.exec(cwd);
@@ -52359,9 +52429,11 @@ var CloudCodexHistoryReader = class {
52359
52429
  constructor(client, logger) {
52360
52430
  this.client = client;
52361
52431
  this.logger = logger;
52432
+ this.pages = new CloudHistoryPages((meta) => logger?.info?.("cloud history page", meta));
52362
52433
  }
52363
52434
  client;
52364
52435
  logger;
52436
+ pages;
52365
52437
  async listProjects() {
52366
52438
  return [];
52367
52439
  }
@@ -52370,14 +52442,16 @@ var CloudCodexHistoryReader = class {
52370
52442
  return [];
52371
52443
  }
52372
52444
  async read(args) {
52373
- const parent = await this.fetchThread(args.toolSessionId);
52374
- const messages = await withSubagentResults(
52375
- parent,
52376
- args.toolSessionId,
52377
- (agentId) => this.client.fetchRollout(agentId),
52378
- this.logger
52379
- );
52380
- return pageMessages(messages, args);
52445
+ return this.pages.read(args, async () => {
52446
+ const parent = await this.fetchThread(args.toolSessionId);
52447
+ return withSubagentResults(
52448
+ parent,
52449
+ args.toolSessionId,
52450
+ (agentId) => this.client.fetchRollout(agentId),
52451
+ this.logger,
52452
+ true
52453
+ );
52454
+ });
52381
52455
  }
52382
52456
  async listSubagents(args) {
52383
52457
  return subagentSummaries(await this.fetchThread(args.toolSessionId));
@@ -52630,9 +52704,11 @@ var CloudPiHistoryReader = class {
52630
52704
  constructor(client, logger) {
52631
52705
  this.client = client;
52632
52706
  this.logger = logger;
52707
+ this.pages = new CloudHistoryPages((meta) => logger?.info?.("cloud history page", meta));
52633
52708
  }
52634
52709
  client;
52635
52710
  logger;
52711
+ pages;
52636
52712
  async listProjects() {
52637
52713
  return [];
52638
52714
  }
@@ -52641,11 +52717,13 @@ var CloudPiHistoryReader = class {
52641
52717
  return [];
52642
52718
  }
52643
52719
  async read(args) {
52644
- const text = await this.client.fetchRollout(args.toolSessionId);
52645
- if (text === null) throw new Error(`pi session not found for ${args.toolSessionId}`);
52646
- const parsed = parsePiSession(text);
52647
- if (!parsed.meta) this.logger?.warn("cloud pi session has no header line", { toolSessionId: args.toolSessionId });
52648
- return pageMessages(parsed.messages, args);
52720
+ return this.pages.read(args, async () => {
52721
+ const text = await this.client.fetchRollout(args.toolSessionId);
52722
+ if (text === null) throw new Error(`pi session not found for ${args.toolSessionId}`);
52723
+ const parsed = parsePiSession(text);
52724
+ if (!parsed.meta) this.logger?.warn("cloud pi session has no header line", { toolSessionId: args.toolSessionId });
52725
+ return parsed.messages;
52726
+ });
52649
52727
  }
52650
52728
  async listSubagents(_args) {
52651
52729
  return [];
@@ -52795,7 +52873,7 @@ async function centralGetThread(opts) {
52795
52873
  if (typeof body?.message === "string" && body.message) detail = `: ${body.message}`;
52796
52874
  } catch {
52797
52875
  }
52798
- throw new CentralClientError("API_ERROR", `central server HTTP ${res.status}${detail}`);
52876
+ throw new CentralClientError("API_ERROR", `central server HTTP ${res.status}${detail}`, void 0, res.status);
52799
52877
  }
52800
52878
  return await res.text();
52801
52879
  }
@@ -53074,7 +53152,7 @@ function tryLoadShareUi(logger) {
53074
53152
  }
53075
53153
 
53076
53154
  // src/visitor/visitor-token.ts
53077
- var import_node_crypto6 = __toESM(require("crypto"), 1);
53155
+ var import_node_crypto7 = __toESM(require("crypto"), 1);
53078
53156
 
53079
53157
  // ../protocol/src/index.ts
53080
53158
  init_runtime();
@@ -53082,7 +53160,7 @@ init_runtime();
53082
53160
  // src/visitor/visitor-token.ts
53083
53161
  var DOMAIN_PREFIX3 = "clawd-visitor-v1|";
53084
53162
  function hmac(secret, body) {
53085
- return import_node_crypto6.default.createHmac("sha256", secret).update(`${DOMAIN_PREFIX3}${body}`).digest("base64url");
53163
+ return import_node_crypto7.default.createHmac("sha256", secret).update(`${DOMAIN_PREFIX3}${body}`).digest("base64url");
53086
53164
  }
53087
53165
  function signVisitorToken(secret, payload) {
53088
53166
  const body = Buffer.from(JSON.stringify(payload)).toString("base64url");
@@ -53095,7 +53173,7 @@ function verifyVisitorToken(secret, token, now) {
53095
53173
  const sig = token.slice(dot + 1);
53096
53174
  const expected = hmac(secret, body);
53097
53175
  if (sig.length !== expected.length) return { ok: false, reason: "BAD_SIGNATURE" };
53098
- if (!import_node_crypto6.default.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) {
53176
+ if (!import_node_crypto7.default.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) {
53099
53177
  return { ok: false, reason: "BAD_SIGNATURE" };
53100
53178
  }
53101
53179
  let payload;
@@ -54618,7 +54696,7 @@ var CodexAdapter = class {
54618
54696
  };
54619
54697
 
54620
54698
  // src/tools/claude-tui.ts
54621
- var import_node_crypto7 = require("crypto");
54699
+ var import_node_crypto8 = require("crypto");
54622
54700
  var import_node_fs25 = __toESM(require("fs"), 1);
54623
54701
  var import_node_os10 = __toESM(require("os"), 1);
54624
54702
  var import_node_path24 = __toESM(require("path"), 1);
@@ -55506,7 +55584,7 @@ function observeScreenIdle(surface, opts) {
55506
55584
  };
55507
55585
  }
55508
55586
  function shortHash(s2) {
55509
- return (0, import_node_crypto7.createHash)("sha1").update(s2).digest("hex").slice(0, 8);
55587
+ return (0, import_node_crypto8.createHash)("sha1").update(s2).digest("hex").slice(0, 8);
55510
55588
  }
55511
55589
  function firstLineDiff(prev, next) {
55512
55590
  const p3 = prev.split("\n");
@@ -56637,7 +56715,7 @@ function resolveSourceJsonlPath(sourceFile, home) {
56637
56715
  // src/shift/store.ts
56638
56716
  var import_promises3 = __toESM(require("fs/promises"), 1);
56639
56717
  var import_node_path35 = __toESM(require("path"), 1);
56640
- var import_node_crypto8 = require("crypto");
56718
+ var import_node_crypto9 = require("crypto");
56641
56719
 
56642
56720
  // src/shift/schedule.ts
56643
56721
  var import_cron_parser = __toESM(require_dist(), 1);
@@ -56741,7 +56819,7 @@ function createShiftStore(deps) {
56741
56819
  const shift = {
56742
56820
  ...input,
56743
56821
  schedule,
56744
- id: (0, import_node_crypto8.randomUUID)(),
56822
+ id: (0, import_node_crypto9.randomUUID)(),
56745
56823
  createdAtMs: now,
56746
56824
  updatedAtMs: now,
56747
56825
  state: { nextRunAtMs },
@@ -57172,7 +57250,7 @@ function redactEvidence(evidence) {
57172
57250
  // src/deploy/deploy-file.ts
57173
57251
  var import_promises4 = __toESM(require("fs/promises"), 1);
57174
57252
  var import_node_path37 = __toESM(require("path"), 1);
57175
- var import_node_crypto9 = require("crypto");
57253
+ var import_node_crypto10 = require("crypto");
57176
57254
  init_zod();
57177
57255
  init_protocol();
57178
57256
 
@@ -57378,7 +57456,7 @@ async function restoreDeployFileRaw(dir, raw) {
57378
57456
  }
57379
57457
  var emptyScanFile = () => ({ version: 3, scans: [], releases: [] });
57380
57458
  var LEGACY_SCAN_ID = "legacy";
57381
- var newScanId = () => (0, import_node_crypto9.randomBytes)(4).toString("hex");
57459
+ var newScanId = () => (0, import_node_crypto10.randomBytes)(4).toString("hex");
57382
57460
  var z1 = DeployScanSchema.omit({ id: true, manifest: true }).extend({ releasedHead: DeployScanSchema.shape.head }).strict();
57383
57461
  function migrateV1(v1, manifest) {
57384
57462
  const { releasedHead, ...rest } = v1;
@@ -57516,7 +57594,7 @@ function requiredEnvNames(manifest) {
57516
57594
  }
57517
57595
 
57518
57596
  // src/deploy/artifact.ts
57519
- var import_node_crypto10 = require("crypto");
57597
+ var import_node_crypto11 = require("crypto");
57520
57598
  var import_node_fs34 = __toESM(require("fs"), 1);
57521
57599
  var import_node_os11 = __toESM(require("os"), 1);
57522
57600
  var import_node_path38 = __toESM(require("path"), 1);
@@ -57555,7 +57633,7 @@ function downloadArtifact(exec) {
57555
57633
  if (declared > ARTIFACT_MAX_BYTES) throw new Error(`\u8D44\u4EA7 ${declared} \u5B57\u8282\uFF0C\u8D85\u8FC7\u4E0A\u9650 ${ARTIFACT_MAX_BYTES}\uFF1A${url}`);
57556
57634
  const dir = await import_node_fs34.default.promises.mkdtemp(import_node_path38.default.join(import_node_os11.default.tmpdir(), "clawd-artifact-"));
57557
57635
  const file = import_node_path38.default.join(dir, "pkg");
57558
- const hash = (0, import_node_crypto10.createHash)("sha256");
57636
+ const hash = (0, import_node_crypto11.createHash)("sha256");
57559
57637
  let size = 0;
57560
57638
  const meter = new import_node_stream3.Transform({
57561
57639
  transform(chunk, _enc, cb) {
@@ -63904,7 +63982,7 @@ ${formatLarkSpeakerReminder(speaker)}`
63904
63982
  }
63905
63983
 
63906
63984
  // src/lark-bot-connector/envelope.ts
63907
- var import_node_crypto11 = require("crypto");
63985
+ var import_node_crypto12 = require("crypto");
63908
63986
  var LARK_ENVELOPE_PREFIX = "clawdlbe1";
63909
63987
  function verifyLarkEventEnvelope(args) {
63910
63988
  const { token, publicKeyPem } = args;
@@ -63923,7 +64001,7 @@ function verifyLarkEventEnvelope(args) {
63923
64001
  const data = Buffer.from(`${prefix}.${payloadB64}`, "utf8");
63924
64002
  let sigOk = false;
63925
64003
  try {
63926
- sigOk = (0, import_node_crypto11.verify)(null, data, publicKeyPem, Buffer.from(sigB64, "base64url"));
64004
+ sigOk = (0, import_node_crypto12.verify)(null, data, publicKeyPem, Buffer.from(sigB64, "base64url"));
63927
64005
  } catch {
63928
64006
  sigOk = false;
63929
64007
  }
@@ -65366,7 +65444,7 @@ var PiRpcClient = class {
65366
65444
 
65367
65445
  // src/tools/pi-session.ts
65368
65446
  var import_node_child_process11 = require("child_process");
65369
- var import_node_crypto12 = require("crypto");
65447
+ var import_node_crypto13 = require("crypto");
65370
65448
  var import_node_fs40 = __toESM(require("fs"), 1);
65371
65449
  var import_node_path44 = __toESM(require("path"), 1);
65372
65450
 
@@ -65639,7 +65717,7 @@ ${dirs.map((d2) => `- ${d2}`).join("\n")}`;
65639
65717
  }
65640
65718
  function createPiSession(ctx, sink, deps = {}) {
65641
65719
  const cmd = process.env.PI_BIN ?? "pi";
65642
- const sessionId = ctx.toolSessionId ?? (0, import_node_crypto12.randomUUID)();
65720
+ const sessionId = ctx.toolSessionId ?? (0, import_node_crypto13.randomUUID)();
65643
65721
  const skillsDir = import_node_path44.default.join(ctx.cwd, ".claude", "skills");
65644
65722
  const exists = deps.skillsDirExists ?? ((d2) => import_node_fs40.default.existsSync(d2));
65645
65723
  const args = buildPiArgs(ctx, {
@@ -65876,13 +65954,13 @@ var PiAdapter = class {
65876
65954
  };
65877
65955
 
65878
65956
  // src/tools/pi-cloud-session.ts
65879
- var import_node_crypto13 = require("crypto");
65957
+ var import_node_crypto14 = require("crypto");
65880
65958
  function cloudPiInstructions(ctx) {
65881
65959
  return [ctx.extraSystemPrompt, workDirPrompt(CLOUD_WORKSPACE_SLOT, ctx.personaMode ?? "owner")].filter((x2) => Boolean(x2)).join("\n\n");
65882
65960
  }
65883
65961
  function createCloudPiSession(ctx, sink, deps) {
65884
65962
  const personaId2 = personaIdFromCloudCwd(ctx.cwd);
65885
- const sessionId = ctx.toolSessionId ?? (0, import_node_crypto13.randomUUID)();
65963
+ const sessionId = ctx.toolSessionId ?? (0, import_node_crypto14.randomUUID)();
65886
65964
  let channel = null;
65887
65965
  let closed = false;
65888
65966
  let exited = false;
@@ -67039,7 +67117,7 @@ var wrapper_default = import_websocket.default;
67039
67117
 
67040
67118
  // src/transport/local-ws-server.ts
67041
67119
  var import_node_http = __toESM(require("http"), 1);
67042
- var import_node_crypto14 = require("crypto");
67120
+ var import_node_crypto15 = require("crypto");
67043
67121
  var LocalWsServer = class {
67044
67122
  constructor(opts) {
67045
67123
  this.opts = opts;
@@ -67256,7 +67334,7 @@ var LocalWsServer = class {
67256
67334
  }
67257
67335
  }
67258
67336
  onConnection(socket, remoteAddress) {
67259
- const id = (0, import_node_crypto14.randomUUID)();
67337
+ const id = (0, import_node_crypto15.randomUUID)();
67260
67338
  const subscribedSessions = /* @__PURE__ */ new Map();
67261
67339
  const handle = {
67262
67340
  id,
@@ -68221,7 +68299,7 @@ var import_node_path53 = __toESM(require("path"), 1);
68221
68299
  // src/attachment/upload.ts
68222
68300
  var import_node_fs47 = __toESM(require("fs"), 1);
68223
68301
  var import_node_path51 = __toESM(require("path"), 1);
68224
- var import_node_crypto15 = __toESM(require("crypto"), 1);
68302
+ var import_node_crypto16 = __toESM(require("crypto"), 1);
68225
68303
  var import_promises8 = require("stream/promises");
68226
68304
  var UploadError = class extends Error {
68227
68305
  constructor(code, message) {
@@ -68245,11 +68323,11 @@ async function writeUploadedAttachment(args) {
68245
68323
  } catch (err) {
68246
68324
  throw new UploadError("STORAGE_ERROR", `mkdir failed: ${err.message}`);
68247
68325
  }
68248
- const hasher = import_node_crypto15.default.createHash("sha256");
68326
+ const hasher = import_node_crypto16.default.createHash("sha256");
68249
68327
  let actualSize = 0;
68250
68328
  const tmpPath = import_node_path51.default.join(
68251
68329
  attachmentsRoot,
68252
- `.upload-${process.pid}-${Date.now()}-${import_node_crypto15.default.randomBytes(4).toString("hex")}`
68330
+ `.upload-${process.pid}-${Date.now()}-${import_node_crypto16.default.randomBytes(4).toString("hex")}`
68253
68331
  );
68254
68332
  try {
68255
68333
  await (0, import_promises8.pipeline)(
@@ -69100,7 +69178,7 @@ function runAttachmentGc(args) {
69100
69178
  // src/attachment/group.ts
69101
69179
  var import_node_fs50 = __toESM(require("fs"), 1);
69102
69180
  var import_node_path55 = __toESM(require("path"), 1);
69103
- var import_node_crypto16 = __toESM(require("crypto"), 1);
69181
+ var import_node_crypto17 = __toESM(require("crypto"), 1);
69104
69182
  init_protocol();
69105
69183
  var GroupFileStore = class {
69106
69184
  dataDir;
@@ -69189,7 +69267,7 @@ var GroupFileStore = class {
69189
69267
  entries[idx] = next;
69190
69268
  } else {
69191
69269
  next = {
69192
- id: `gf-${import_node_crypto16.default.randomBytes(6).toString("base64url")}`,
69270
+ id: `gf-${import_node_crypto17.default.randomBytes(6).toString("base64url")}`,
69193
69271
  relPath: input.relPath,
69194
69272
  from: input.from,
69195
69273
  label: input.label,
@@ -69335,7 +69413,7 @@ function readSpawnedByDesktopFromEnv(env = process.env) {
69335
69413
  // src/tunnel/tunnel-manager.ts
69336
69414
  var import_node_fs55 = __toESM(require("fs"), 1);
69337
69415
  var import_node_path60 = __toESM(require("path"), 1);
69338
- var import_node_crypto17 = __toESM(require("crypto"), 1);
69416
+ var import_node_crypto18 = __toESM(require("crypto"), 1);
69339
69417
  var import_node_child_process16 = require("child_process");
69340
69418
 
69341
69419
  // src/tunnel/tunnel-store.ts
@@ -69834,7 +69912,7 @@ var TunnelManager = class {
69834
69912
  override: this.deps.frpcBinaryOverride ?? void 0
69835
69913
  });
69836
69914
  const tomlPath = import_node_path60.default.join(this.deps.dataDir, "frpc.toml");
69837
- const proxyName = `clawd-${t2.subdomain}-${localPort}-${import_node_crypto17.default.randomBytes(3).toString("hex")}`;
69915
+ const proxyName = `clawd-${t2.subdomain}-${localPort}-${import_node_crypto18.default.randomBytes(3).toString("hex")}`;
69838
69916
  const toml = buildFrpcToml({
69839
69917
  serverAddr: t2.frpsHost,
69840
69918
  serverPort: t2.frpsPort,
@@ -69935,7 +70013,7 @@ async function waitForFrpcReady(proc, timeoutMs) {
69935
70013
  // src/tunnel/device-key.ts
69936
70014
  var import_node_os22 = __toESM(require("os"), 1);
69937
70015
  var import_node_path61 = __toESM(require("path"), 1);
69938
- var import_node_crypto18 = __toESM(require("crypto"), 1);
70016
+ var import_node_crypto19 = __toESM(require("crypto"), 1);
69939
70017
  var DERIVE_SALT = "clawd-tunnel-device-v1";
69940
70018
  function deriveStableDeviceKey(opts = {}) {
69941
70019
  const hostname = opts.hostname ?? import_node_os22.default.hostname();
@@ -69945,13 +70023,13 @@ function deriveStableDeviceKey(opts = {}) {
69945
70023
  const normalizedDataDir = opts.dataDir ? import_node_path61.default.resolve(opts.dataDir) : null;
69946
70024
  const isDefaultDir = normalizedDataDir == null || normalizedDataDir === defaultDataDir;
69947
70025
  const input = isDefaultDir ? `${hostname}::${uid}` : `${hostname}::${uid}::${normalizedDataDir}`;
69948
- return import_node_crypto18.default.createHmac("sha256", DERIVE_SALT).update(input).digest("hex").slice(0, 32);
70026
+ return import_node_crypto19.default.createHmac("sha256", DERIVE_SALT).update(input).digest("hex").slice(0, 32);
69949
70027
  }
69950
70028
 
69951
70029
  // src/auth-store.ts
69952
70030
  var import_node_fs56 = __toESM(require("fs"), 1);
69953
70031
  var import_node_path62 = __toESM(require("path"), 1);
69954
- var import_node_crypto19 = __toESM(require("crypto"), 1);
70032
+ var import_node_crypto20 = __toESM(require("crypto"), 1);
69955
70033
  var AUTH_FILE_NAME = "auth.json";
69956
70034
  function authFilePath(dataDir) {
69957
70035
  return import_node_path62.default.join(dataDir, AUTH_FILE_NAME);
@@ -69988,10 +70066,10 @@ function loadOrCreateTunnelDeviceKey(opts) {
69988
70066
  return tunnelDeviceKey;
69989
70067
  }
69990
70068
  function defaultGenerateToken() {
69991
- return import_node_crypto19.default.randomBytes(32).toString("base64url");
70069
+ return import_node_crypto20.default.randomBytes(32).toString("base64url");
69992
70070
  }
69993
70071
  function defaultGenerateOwnerPrincipalId() {
69994
- return `owner-${import_node_crypto19.default.randomUUID()}`;
70072
+ return `owner-${import_node_crypto20.default.randomUUID()}`;
69995
70073
  }
69996
70074
  function readAuthFile(file) {
69997
70075
  try {
@@ -70123,7 +70201,7 @@ var OwnerIdentityStore = class {
70123
70201
  };
70124
70202
 
70125
70203
  // src/feishu-auth/login-flow.ts
70126
- var import_node_crypto20 = __toESM(require("crypto"), 1);
70204
+ var import_node_crypto21 = __toESM(require("crypto"), 1);
70127
70205
  var STATE_TTL_MS = 5 * 60 * 1e3;
70128
70206
  var LoginFlow = class {
70129
70207
  constructor(deps) {
@@ -70132,7 +70210,7 @@ var LoginFlow = class {
70132
70210
  deps;
70133
70211
  pendingStates = /* @__PURE__ */ new Map();
70134
70212
  start() {
70135
- const state = import_node_crypto20.default.randomBytes(16).toString("base64url");
70213
+ const state = import_node_crypto21.default.randomBytes(16).toString("base64url");
70136
70214
  const now = (this.deps.now ?? Date.now)();
70137
70215
  this.pendingStates.set(state, now);
70138
70216
  this.gcExpired(now);
@@ -70663,7 +70741,7 @@ init_protocol();
70663
70741
  var import_node_fs59 = __toESM(require("fs"), 1);
70664
70742
  var import_node_os24 = __toESM(require("os"), 1);
70665
70743
  var import_node_path65 = __toESM(require("path"), 1);
70666
- var import_node_crypto21 = require("crypto");
70744
+ var import_node_crypto22 = require("crypto");
70667
70745
  init_claude_history();
70668
70746
  function readJsonlEntries(file) {
70669
70747
  const raw = import_node_fs59.default.readFileSync(file, "utf8");
@@ -70700,7 +70778,7 @@ function forkSession(input) {
70700
70778
  throw new Error(`fork: messageUuid not found in transcript: ${input.messageUuid}`);
70701
70779
  }
70702
70780
  const sliced = mainEntries.slice(0, targetIdx + 1);
70703
- const forkedToolSessionId = (0, import_node_crypto21.randomUUID)();
70781
+ const forkedToolSessionId = (0, import_node_crypto22.randomUUID)();
70704
70782
  let parentUuid = null;
70705
70783
  const forkedLines = [];
70706
70784
  for (const entry of sliced) {
@@ -71787,7 +71865,8 @@ function buildHistoryHandlers(deps) {
71787
71865
  cwd: f2.cwd,
71788
71866
  toolSessionId: f2.toolSessionId,
71789
71867
  limit: args.limit,
71790
- offset: args.offset
71868
+ offset: args.offset,
71869
+ snapshotId: args.snapshotId
71791
71870
  });
71792
71871
  } catch (err) {
71793
71872
  logger?.warn("chatflow.history.daemon.error", {
@@ -73487,7 +73566,7 @@ function computeMethodAccess(args) {
73487
73566
  }
73488
73567
 
73489
73568
  // src/version.ts
73490
- var version = "0.2.611".length > 0 ? "0.2.611" : "dev";
73569
+ var version = "0.2.612".length > 0 ? "0.2.612" : "dev";
73491
73570
 
73492
73571
  // src/cli-probe/probe.ts
73493
73572
  var fs83 = __toESM(require("fs"), 1);
@@ -73884,7 +73963,7 @@ init_protocol();
73884
73963
  // src/extension/bundle-zip.ts
73885
73964
  var import_promises12 = __toESM(require("fs/promises"), 1);
73886
73965
  var import_node_path73 = __toESM(require("path"), 1);
73887
- var import_node_crypto22 = __toESM(require("crypto"), 1);
73966
+ var import_node_crypto23 = __toESM(require("crypto"), 1);
73888
73967
  var import_jszip2 = __toESM(require_lib3(), 1);
73889
73968
  async function bundleExtensionDir(dir) {
73890
73969
  const entries = await listFilesSorted(dir);
@@ -73899,7 +73978,7 @@ async function bundleExtensionDir(dir) {
73899
73978
  compression: "DEFLATE",
73900
73979
  compressionOptions: { level: 6 }
73901
73980
  });
73902
- const sha256 = import_node_crypto22.default.createHash("sha256").update(buffer).digest("hex");
73981
+ const sha256 = import_node_crypto23.default.createHash("sha256").update(buffer).digest("hex");
73903
73982
  return { buffer, sha256 };
73904
73983
  }
73905
73984
  var FIXED_DATE = /* @__PURE__ */ new Date("2020-01-01T00:00:00.000Z");
@@ -73967,7 +74046,7 @@ function computePublishCheck(args) {
73967
74046
  var import_promises13 = __toESM(require("fs/promises"), 1);
73968
74047
  var import_node_path75 = __toESM(require("path"), 1);
73969
74048
  var import_node_os28 = __toESM(require("os"), 1);
73970
- var import_node_crypto23 = __toESM(require("crypto"), 1);
74049
+ var import_node_crypto24 = __toESM(require("crypto"), 1);
73971
74050
  var import_jszip3 = __toESM(require_lib3(), 1);
73972
74051
 
73973
74052
  // src/extension/paths.ts
@@ -73996,7 +74075,7 @@ var InstallError = class extends Error {
73996
74075
  };
73997
74076
  async function installFromChannel(args, deps) {
73998
74077
  const { channelRef, snapshotHash, bundleZip } = args;
73999
- const computed = import_node_crypto23.default.createHash("sha256").update(bundleZip).digest("hex");
74078
+ const computed = import_node_crypto24.default.createHash("sha256").update(bundleZip).digest("hex");
74000
74079
  if (computed !== snapshotHash) {
74001
74080
  throw new InstallError(
74002
74081
  "HASH_MISMATCH",
@@ -74088,7 +74167,7 @@ async function installFromChannel(args, deps) {
74088
74167
  var import_promises14 = __toESM(require("fs/promises"), 1);
74089
74168
  var import_node_path76 = __toESM(require("path"), 1);
74090
74169
  var import_node_os29 = __toESM(require("os"), 1);
74091
- var import_node_crypto24 = __toESM(require("crypto"), 1);
74170
+ var import_node_crypto25 = __toESM(require("crypto"), 1);
74092
74171
  var import_jszip4 = __toESM(require_lib3(), 1);
74093
74172
  var UpdateError = class extends Error {
74094
74173
  constructor(code, message) {
@@ -74126,7 +74205,7 @@ async function updateFromChannel(args, deps) {
74126
74205
  if (e instanceof UpdateError) throw e;
74127
74206
  throw e;
74128
74207
  }
74129
- const computed = import_node_crypto24.default.createHash("sha256").update(bundleZip).digest("hex");
74208
+ const computed = import_node_crypto25.default.createHash("sha256").update(bundleZip).digest("hex");
74130
74209
  if (computed !== snapshotHash) {
74131
74210
  throw new UpdateError(
74132
74211
  "HASH_MISMATCH",
@@ -75255,7 +75334,7 @@ async function uninstall(deps) {
75255
75334
  }
75256
75335
 
75257
75336
  // src/handlers/index.ts
75258
- var import_node_crypto25 = require("crypto");
75337
+ var import_node_crypto26 = require("crypto");
75259
75338
 
75260
75339
  // src/handlers/peer-exec.ts
75261
75340
  init_protocol();
@@ -75412,7 +75491,7 @@ function buildMethodHandlers(deps) {
75412
75491
  const c2 = deps.contactStore.get(deviceId);
75413
75492
  return c2 ? { deviceId: c2.deviceId, remoteUrl: c2.remoteUrl, connectToken: c2.connectToken } : null;
75414
75493
  },
75415
- genId: () => (0, import_node_crypto25.randomUUID)(),
75494
+ genId: () => (0, import_node_crypto26.randomUUID)(),
75416
75495
  now: () => Date.now(),
75417
75496
  forwardInboxPostToPeer,
75418
75497
  logger: deps.logger
@@ -76145,7 +76224,7 @@ async function startDaemon(config) {
76145
76224
  const channelStore = createChannelStore({
76146
76225
  filePath: import_node_path84.default.join(config.dataDir, "channels.json"),
76147
76226
  now: () => Date.now(),
76148
- genId: () => `ch-${(0, import_node_crypto26.randomUUID)().slice(0, 8)}`,
76227
+ genId: () => `ch-${(0, import_node_crypto27.randomUUID)().slice(0, 8)}`,
76149
76228
  onFlushError: (err) => logger.error("channel store flush failed", {
76150
76229
  reason: err instanceof Error ? err.message : String(err)
76151
76230
  })
@@ -76154,7 +76233,7 @@ async function startDaemon(config) {
76154
76233
  const topicStore = createTopicStore({
76155
76234
  filePath: import_node_path84.default.join(config.dataDir, "topics.json"),
76156
76235
  now: () => Date.now(),
76157
- genId: () => `tp-${(0, import_node_crypto26.randomUUID)().slice(0, 8)}`,
76236
+ genId: () => `tp-${(0, import_node_crypto27.randomUUID)().slice(0, 8)}`,
76158
76237
  onFlushError: (err) => logger.error("topic store flush failed", {
76159
76238
  reason: err instanceof Error ? err.message : String(err)
76160
76239
  })
@@ -76162,7 +76241,7 @@ async function startDaemon(config) {
76162
76241
  await topicStore.load();
76163
76242
  let deliverPendingRef;
76164
76243
  const personaDispatchManager = new PersonaDispatchManager({
76165
- genId: () => (0, import_node_crypto26.randomUUID)(),
76244
+ genId: () => (0, import_node_crypto27.randomUUID)(),
76166
76245
  store: dispatchStore,
76167
76246
  now: () => Date.now(),
76168
76247
  onCompleted: (sid) => deliverPendingRef?.(sid),