@clawos-dev/clawd 0.2.29 → 0.2.30

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.
Files changed (2) hide show
  1. package/dist/cli.cjs +92 -8
  2. package/package.json +1 -1
package/dist/cli.cjs CHANGED
@@ -8583,7 +8583,7 @@ var init_zod = __esm({
8583
8583
  });
8584
8584
 
8585
8585
  // ../protocol/src/persona-schemas.ts
8586
- var PersonaTokenEntrySchema, PersonaFileSchema, PersonaHelloFrameSchema, PersonaSendFrameSchema, PersonaResetFrameSchema, PersonaPingFrameSchema, PersonaReadyFrameSchema, PersonaHistoryEventFrameSchema, PersonaHistoryDoneFrameSchema, PersonaEventFrameSchema, PersonaErrorFrameSchema, PersonaPongFrameSchema, PersonaClientFrameSchema, PersonaServerFrameSchema, PersonaCreateArgsSchema, PersonaIdArgsSchema, PersonaUpdateArgsSchema, PersonaIssueTokenArgsSchema, PersonaRevokeTokenArgsSchema, PersonaAppendOwnerMessageArgsSchema;
8586
+ var PersonaTokenEntrySchema, PersonaFileSchema, PersonaHelloFrameSchema, PersonaSendFrameSchema, PersonaResetFrameSchema, PersonaPingFrameSchema, PersonaReadyFrameSchema, PersonaHistoryEventFrameSchema, PersonaHistoryDoneFrameSchema, PersonaEventFrameSchema, PersonaErrorFrameSchema, PersonaPongFrameSchema, PersonaHistoryPageRequestFrameSchema, PersonaHistoryPageFrameSchema, PersonaClientFrameSchema, PersonaServerFrameSchema, PersonaCreateArgsSchema, PersonaIdArgsSchema, PersonaUpdateArgsSchema, PersonaIssueTokenArgsSchema, PersonaRevokeTokenArgsSchema, PersonaAppendOwnerMessageArgsSchema;
8587
8587
  var init_persona_schemas = __esm({
8588
8588
  "../protocol/src/persona-schemas.ts"() {
8589
8589
  "use strict";
@@ -8628,7 +8628,9 @@ var init_persona_schemas = __esm({
8628
8628
  event: external_exports.unknown()
8629
8629
  });
8630
8630
  PersonaHistoryDoneFrameSchema = external_exports.object({
8631
- kind: external_exports.literal("history-done")
8631
+ kind: external_exports.literal("history-done"),
8632
+ offset: external_exports.number().int().nonnegative(),
8633
+ total: external_exports.number().int().nonnegative()
8632
8634
  });
8633
8635
  PersonaEventFrameSchema = external_exports.object({
8634
8636
  kind: external_exports.literal("event"),
@@ -8648,11 +8650,25 @@ var init_persona_schemas = __esm({
8648
8650
  PersonaPongFrameSchema = external_exports.object({
8649
8651
  kind: external_exports.literal("pong")
8650
8652
  });
8653
+ PersonaHistoryPageRequestFrameSchema = external_exports.object({
8654
+ kind: external_exports.literal("history-page-request"),
8655
+ requestId: external_exports.string().min(1),
8656
+ limit: external_exports.number().int().positive(),
8657
+ offset: external_exports.number().int().nonnegative()
8658
+ });
8659
+ PersonaHistoryPageFrameSchema = external_exports.object({
8660
+ kind: external_exports.literal("history-page"),
8661
+ requestId: external_exports.string().min(1),
8662
+ events: external_exports.array(external_exports.unknown()),
8663
+ offset: external_exports.number().int().nonnegative(),
8664
+ total: external_exports.number().int().nonnegative()
8665
+ });
8651
8666
  PersonaClientFrameSchema = external_exports.discriminatedUnion("kind", [
8652
8667
  PersonaHelloFrameSchema,
8653
8668
  PersonaSendFrameSchema,
8654
8669
  PersonaResetFrameSchema,
8655
- PersonaPingFrameSchema
8670
+ PersonaPingFrameSchema,
8671
+ PersonaHistoryPageRequestFrameSchema
8656
8672
  ]);
8657
8673
  PersonaServerFrameSchema = external_exports.discriminatedUnion("kind", [
8658
8674
  PersonaReadyFrameSchema,
@@ -8660,7 +8676,8 @@ var init_persona_schemas = __esm({
8660
8676
  PersonaHistoryDoneFrameSchema,
8661
8677
  PersonaEventFrameSchema,
8662
8678
  PersonaErrorFrameSchema,
8663
- PersonaPongFrameSchema
8679
+ PersonaPongFrameSchema,
8680
+ PersonaHistoryPageFrameSchema
8664
8681
  ]);
8665
8682
  PersonaCreateArgsSchema = external_exports.object({
8666
8683
  label: external_exports.string().min(1),
@@ -17238,6 +17255,32 @@ var SessionManager = class {
17238
17255
  const runner = this.ensureRunnerFor(file, agentId);
17239
17256
  return runner.getState().buffer.map((e) => e.event);
17240
17257
  }
17258
+ /**
17259
+ * persona-bound transport 用:基于 readHistoryEvents 的 buffer 切片视图,支持分页。
17260
+ *
17261
+ * Why a new method instead of reusing `history:read` RPC handler:
17262
+ * - `history:read` 走 HandlerDeps.history.read(),读 CC 写盘的 jsonl 文件
17263
+ * - 本方法走 reducer buffer(与实时 `subscribe` 同一数据源)
17264
+ * 两条路径数据形态、时序、字段不同,不能共享 helper。persona-bound 客户端必须
17265
+ * 走 buffer 路径,才能保证首屏回放和实时帧无 gap、无重复。
17266
+ *
17267
+ * Why not 改 readHistoryEvents 加 limit/offset:现有 readHistoryEvents 的语义是
17268
+ * "返回 buffer 全部",被其它路径(rewind uuid 转译等)依赖;保留它不动,新加分页方法。
17269
+ *
17270
+ * 切片语义:clip 安全边界,response.offset 保留请求值便于客户端识别越界请求。
17271
+ * - offset >= total → events: [], offset: 请求值, total: 当前 buffer 长度
17272
+ * - offset + limit > total → 返回 tail [offset, total),长度 = total - offset
17273
+ * - 正常 → 返回 [offset, offset + limit)
17274
+ *
17275
+ * SESSION_NOT_FOUND 行为继承 readHistoryEvents(store.read 返回 null 即抛)。
17276
+ */
17277
+ readHistoryPage(sessionId, agentId, limit, offset) {
17278
+ const all = this.readHistoryEvents(sessionId, agentId);
17279
+ const total = all.length;
17280
+ const start = Math.min(offset, total);
17281
+ const end = Math.min(start + limit, total);
17282
+ return { events: all.slice(start, end), offset, total };
17283
+ }
17241
17284
  /**
17242
17285
  * persona-bound transport 用:订阅 sub-session 实时 ParsedEvent。
17243
17286
  * 返回 unsubscribe;不破坏现有 wire 广播路径——routeFromRunner 同时 fan-out 到
@@ -18469,20 +18512,31 @@ var PersonaBoundHandler = class {
18469
18512
  send({ kind: "event", event });
18470
18513
  }
18471
18514
  );
18515
+ const FIRST_PAGE_SIZE = 50;
18516
+ let firstPageOffset = 0;
18517
+ let firstPageTotal = 0;
18472
18518
  try {
18473
- const history = this.deps.sessionManager.readHistoryEvents(
18519
+ const page = this.deps.sessionManager.readHistoryPage(
18474
18520
  subSessionFile.sessionId,
18475
- personaId
18521
+ personaId,
18522
+ FIRST_PAGE_SIZE,
18523
+ 0
18476
18524
  );
18477
- for (const event of history) {
18525
+ for (const event of page.events) {
18478
18526
  send({ kind: "history-event", event });
18479
18527
  }
18528
+ firstPageOffset = page.events.length;
18529
+ firstPageTotal = page.total;
18480
18530
  } catch (err) {
18481
18531
  this.deps.logger.warn(
18482
18532
  `persona history read failed: ${err.message}`
18483
18533
  );
18484
18534
  }
18485
- send({ kind: "history-done" });
18535
+ send({
18536
+ kind: "history-done",
18537
+ offset: firstPageOffset,
18538
+ total: firstPageTotal
18539
+ });
18486
18540
  return;
18487
18541
  }
18488
18542
  switch (frame.kind) {
@@ -18519,6 +18573,36 @@ var PersonaBoundHandler = class {
18519
18573
  case "ping":
18520
18574
  send({ kind: "pong" });
18521
18575
  return;
18576
+ case "history-page-request": {
18577
+ try {
18578
+ const page = this.deps.sessionManager.readHistoryPage(
18579
+ scope.subSessionId,
18580
+ scope.personaId,
18581
+ frame.limit,
18582
+ frame.offset
18583
+ );
18584
+ send({
18585
+ kind: "history-page",
18586
+ requestId: frame.requestId,
18587
+ events: page.events,
18588
+ offset: frame.offset,
18589
+ // 请求值原样回传,便于 client 识别越界
18590
+ total: page.total
18591
+ });
18592
+ } catch (err) {
18593
+ this.deps.logger.warn(
18594
+ `persona history-page-request failed: ${err.message}`
18595
+ );
18596
+ send({
18597
+ kind: "history-page",
18598
+ requestId: frame.requestId,
18599
+ events: [],
18600
+ offset: frame.offset,
18601
+ total: 0
18602
+ });
18603
+ }
18604
+ return;
18605
+ }
18522
18606
  }
18523
18607
  });
18524
18608
  ws.on("close", () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clawos-dev/clawd",
3
- "version": "0.2.29",
3
+ "version": "0.2.30",
4
4
  "description": "Standalone clawd daemon — Claude Code (and future Codex) session server over WebSocket",
5
5
  "type": "module",
6
6
  "license": "MIT",