@epoch-agent/view 2.8.0 → 3.0.0

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/README.md CHANGED
@@ -21,6 +21,19 @@
21
21
  | `DIFF_CONTEXT_LINES` / `DIFF_MAX_LINES` | 折叠与截断的阈值(后者的口径见下) |
22
22
  | `HistoryItem*` / `ToolDisplayItem` 等类型 | item 的判别联合 |
23
23
 
24
+ ## 展示项的 `at`:那句话是什么时候说的(2026-10-27)
25
+
26
+ `HistoryItemBase` 上多了一格 `at?: number`(epoch 毫秒),和 `seq` 并列:`seq` 是
27
+ **锚点**(从哪儿开始),`at` 是**人读的那一半**(屏幕上那句 `8月25日 13:31`)。
28
+
29
+ - 它从 `StreamEventMeta.at` 进来(`applyStreamEvent` 的第三个参数),**只在新建项
30
+ 时落一次** —— 同 `seq`:追加进已有项时不覆盖,否则时间会跟着流式往后漂
31
+ - **TUI 一个都不传**(它吃裸事件,没有信封也没有那个形态),所以那边恒缺席
32
+ - **缺席时不补**:那是「不知道」,不是「现在」—— 宿主不许拿 `Date.now()` 兜底
33
+
34
+ 回放(`GET /messages`)那条路不经过 `applyStreamEvent`,它从
35
+ `WireReplayMessage.timestamp` 自己填一次(`web/src/state/replay.ts`)。
36
+
24
37
  ## 行级 diff 的两个口径(2026-10-09)
25
38
 
26
39
  | 事 | 口径 |
package/dist/index.d.ts CHANGED
@@ -23,6 +23,28 @@ import { WireSessionReference, WireFileReference, WireImageReference, EpochUserC
23
23
 
24
24
  interface HistoryItemBase {
25
25
  text?: string;
26
+ /**
27
+ * 这一项**是什么时候**的(epoch 毫秒,来自 `WireEnvelope.ts`)。2026-10-27 加。
28
+ *
29
+ * ## 只为一件事:把它印在屏幕上
30
+ *
31
+ * `seq` 回答「从哪儿开始」(锚点),这一个是**人读的那一半** —— 用户那一段话
32
+ * 底下那句话(`8月25日 13:31`),以及回合脚注右端那一格。两处都只认一个数,
33
+ * 而它必须在这一项**被造出来的那一刻**冻进来:事后再问「这句话是什么时候说的」
34
+ * 已经问不出来了(`history` 只存展示项,不存帧)。
35
+ *
36
+ * ## 三处它**没有值**(调用方必须当它可能不存在)
37
+ *
38
+ * 1. **TUI** —— 那边吃裸 `AgentEvent`,没有信封,也没有这个形态(同 `seq`);
39
+ * 2. **回放**(`GET /messages`)—— 走 `WireReplayMessage.timestamp` 另填一次,
40
+ * 不是「没有」;真的没有的是老版本宿主自己拼的项;
41
+ * 3. **一轮里由多帧合成的项**取的是**第一帧**(同 `seq` 的口径:要回答
42
+ * 「这项从哪开始的」,用最后一帧会让时间跟着流式往后漂)。
43
+ *
44
+ * ⚠️ **缺席时不许补一个「现在」**:老历史的时间是**不知道**,印一个刚读的
45
+ * 挂钟等于给一条两年前的记录盖上今天的日期 —— 那比不画贵得多。
46
+ */
47
+ at?: number;
26
48
  /**
27
49
  * 这一项**从哪一帧开始**的广播序号(`WireEnvelope.seq`)。
28
50
  *
@@ -277,6 +299,8 @@ interface StreamReduceResult {
277
299
  interface StreamEventMeta {
278
300
  /** `WireEnvelope.seq`。TUI 不传(它吃的是裸事件,没有信封) */
279
301
  seq?: number;
302
+ /** `WireEnvelope.ts`(epoch 毫秒)—— 屏幕上那个日期时间。TUI 同 `seq` */
303
+ at?: number;
280
304
  }
281
305
  /**
282
306
  * 把一个事件折叠进当前状态。纯函数:不改入参,返回新数组。
package/dist/index.js CHANGED
@@ -1,6 +1,9 @@
1
1
  // src/reducer.ts
2
2
  function anchor(meta) {
3
- return meta?.seq !== void 0 ? { seq: meta.seq } : {};
3
+ return {
4
+ ...meta?.seq !== void 0 ? { seq: meta.seq } : {},
5
+ ...meta?.at !== void 0 ? { at: meta.at } : {}
6
+ };
4
7
  }
5
8
  var LIVE_TAIL_LINES = 20;
6
9
  var LIVE_TAIL_CHARS = 4e3;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@epoch-agent/view",
3
- "version": "2.8.0",
3
+ "version": "3.0.0",
4
4
  "private": false,
5
5
  "description": "epoch-agent 展示层纯逻辑:AgentEvent → 可渲染 item,tui 与 web 共用",
6
6
  "repository": {
@@ -22,7 +22,7 @@
22
22
  "dist"
23
23
  ],
24
24
  "dependencies": {
25
- "@epoch-agent/protocol": "2.8.0"
25
+ "@epoch-agent/protocol": "3.0.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "tsup": "^8.3.6",