@downcity/agent 1.1.165 → 1.1.168

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 (41) hide show
  1. package/bin/agent/remote/transports/HttpRemoteAgentTransport.d.ts.map +1 -1
  2. package/bin/agent/remote/transports/HttpRemoteAgentTransport.js +2 -0
  3. package/bin/agent/remote/transports/HttpRemoteAgentTransport.js.map +1 -1
  4. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.d.ts +1 -0
  5. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.d.ts.map +1 -1
  6. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.js +2 -1
  7. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.js.map +1 -1
  8. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.d.ts.map +1 -1
  9. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.js +2 -1
  10. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.js.map +1 -1
  11. package/bin/executor/types/SessionMessages.d.ts +2 -0
  12. package/bin/executor/types/SessionMessages.d.ts.map +1 -1
  13. package/bin/session/browse/Browse.d.ts +8 -0
  14. package/bin/session/browse/Browse.d.ts.map +1 -1
  15. package/bin/session/browse/Browse.js +58 -6
  16. package/bin/session/browse/Browse.js.map +1 -1
  17. package/bin/session/index.d.ts +2 -2
  18. package/bin/session/index.d.ts.map +1 -1
  19. package/bin/session/index.js +2 -2
  20. package/bin/session/index.js.map +1 -1
  21. package/bin/session/services/SessionViewService.d.ts.map +1 -1
  22. package/bin/session/services/SessionViewService.js +8 -4
  23. package/bin/session/services/SessionViewService.js.map +1 -1
  24. package/bin/session/storage/Paths.d.ts +8 -0
  25. package/bin/session/storage/Paths.d.ts.map +1 -1
  26. package/bin/session/storage/Paths.js +10 -0
  27. package/bin/session/storage/Paths.js.map +1 -1
  28. package/bin/types/agent/SessionTypes.d.ts +26 -2
  29. package/bin/types/agent/SessionTypes.d.ts.map +1 -1
  30. package/package.json +3 -3
  31. package/scripts/session-history-archive.test.mjs +188 -0
  32. package/src/agent/remote/transports/HttpRemoteAgentTransport.ts +1 -0
  33. package/src/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.ts +3 -2
  34. package/src/executor/store/history/jsonl/JsonlSessionHistoryStore.ts +2 -1
  35. package/src/executor/types/SessionMessages.ts +2 -0
  36. package/src/session/browse/Browse.ts +72 -6
  37. package/src/session/index.ts +2 -0
  38. package/src/session/services/SessionViewService.ts +16 -3
  39. package/src/session/storage/Paths.ts +19 -0
  40. package/src/types/agent/SessionTypes.ts +26 -2
  41. package/tsconfig.tsbuildinfo +1 -1
@@ -7,7 +7,7 @@
7
7
  * - 需要写入持久化状态的地方仍委托给 SessionStateService。
8
8
  */
9
9
  import { nanoid } from "nanoid";
10
- import { buildSessionHistoryPage, buildSessionInfo, ensureSessionTitle, readSessionMetadata, } from "../../session/index.js";
10
+ import { buildSessionHistoryPage, buildSessionInfo, getSdkAgentSessionArchiveFilePath, ensureSessionTitle, loadSessionArchiveMessagesFromPath, readSessionMetadata, } from "../../session/index.js";
11
11
  import { buildSessionSystemBlocks } from "../../session/SessionSystemBuilder.js";
12
12
  /**
13
13
  * 本地 Session 查询与派生视图服务。
@@ -77,7 +77,8 @@ export class SessionViewService {
77
77
  * 读取当前 session 历史分页。
78
78
  */
79
79
  async history(input) {
80
- const [metadata, messages] = await Promise.all([
80
+ const archive_id = String(input?.archive_id || "").trim();
81
+ const [metadata, current_messages] = await Promise.all([
81
82
  readSessionMetadata({
82
83
  projectRoot: this.project_root,
83
84
  agentId: this.agent_id,
@@ -85,13 +86,16 @@ export class SessionViewService {
85
86
  }),
86
87
  this.history_store.list(),
87
88
  ]);
89
+ const page_messages = archive_id
90
+ ? await loadSessionArchiveMessagesFromPath(getSdkAgentSessionArchiveFilePath(this.project_root, this.agent_id, this.session_id, archive_id))
91
+ : current_messages;
88
92
  const session = await this.build_info({
89
93
  metadata,
90
- messages,
94
+ messages: current_messages,
91
95
  });
92
96
  return buildSessionHistoryPage({
93
97
  session,
94
- messages,
98
+ messages: page_messages,
95
99
  input,
96
100
  });
97
101
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SessionViewService.js","sourceRoot":"","sources":["../../../src/session/services/SessionViewService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SessionViewService.js","sourceRoot":"","sources":["../../../src/session/services/SessionViewService.ts"],"names":[],"mappings":"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"}
@@ -65,6 +65,14 @@ export declare function getSdkAgentSessionMetaPath(projectRoot: string, agentId:
65
65
  * 单个 session 的 archive 目录路径。
66
66
  */
67
67
  export declare function getSdkAgentSessionArchiveDirPath(projectRoot: string, agentId: string, sessionId: string): string;
68
+ /**
69
+ * 单个 session 的 compact archive JSON 文件路径。
70
+ *
71
+ * 关键点(中文)
72
+ * - `archiveId` 来自 compact summary metadata,不由调用方拼接扩展名。
73
+ * - 这里统一 encode,避免 archiveId 中的特殊字符影响文件路径。
74
+ */
75
+ export declare function getSdkAgentSessionArchiveFilePath(projectRoot: string, agentId: string, sessionId: string, archiveId: string): string;
68
76
  /**
69
77
  * 单个 session 的 inflight assistant 路径。
70
78
  *
@@ -1 +1 @@
1
- {"version":3,"file":"Paths.d.ts","sourceRoot":"","sources":["../../../src/session/storage/Paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,MAAM,CAER;AAED;;;;;;GAMG;AACH,wBAAgB,kCAAkC,CAChD,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAC/C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,yCAAyC,CACvD,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,sCAAsC,CACpD,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAChD,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAC/C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAC9C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR"}
1
+ {"version":3,"file":"Paths.d.ts","sourceRoot":"","sources":["../../../src/session/storage/Paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,MAAM,CAER;AAED;;;;;;GAMG;AACH,wBAAgB,kCAAkC,CAChD,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAC/C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,yCAAyC,CACvD,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,sCAAsC,CACpD,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAChD,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAC/C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAC9C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAC/C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR"}
@@ -94,6 +94,16 @@ export function getSdkAgentSessionMetaPath(projectRoot, agentId, sessionId) {
94
94
  export function getSdkAgentSessionArchiveDirPath(projectRoot, agentId, sessionId) {
95
95
  return path.join(getSdkAgentSessionMessagesDirPath(projectRoot, agentId, sessionId), "archive");
96
96
  }
97
+ /**
98
+ * 单个 session 的 compact archive JSON 文件路径。
99
+ *
100
+ * 关键点(中文)
101
+ * - `archiveId` 来自 compact summary metadata,不由调用方拼接扩展名。
102
+ * - 这里统一 encode,避免 archiveId 中的特殊字符影响文件路径。
103
+ */
104
+ export function getSdkAgentSessionArchiveFilePath(projectRoot, agentId, sessionId, archiveId) {
105
+ return path.join(getSdkAgentSessionArchiveDirPath(projectRoot, agentId, sessionId), `${encodeURIComponent(String(archiveId || "").trim())}.json`);
106
+ }
97
107
  /**
98
108
  * 单个 session 的 inflight assistant 路径。
99
109
  *
@@ -1 +1 @@
1
- {"version":3,"file":"Paths.js","sourceRoot":"","sources":["../../../src/session/storage/Paths.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Paths.js","sourceRoot":"","sources":["../../../src/session/storage/Paths.ts"],"names":[],"mappings":"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"}
@@ -250,6 +250,14 @@ export interface AgentSessionHistoryInput {
250
250
  limit?: number;
251
251
  /** 分页游标。 */
252
252
  cursor?: string;
253
+ /**
254
+ * 要读取的 compact archive 层 ID。
255
+ *
256
+ * 说明(中文)
257
+ * - 省略时读取当前 `messages.jsonl`。
258
+ * - 传入时读取 `messages/archive/<archive_id>.json` 中保存的上一层历史。
259
+ */
260
+ archive_id?: string;
253
261
  /**
254
262
  * 返回顺序。
255
263
  *
@@ -292,9 +300,25 @@ export interface AgentSessionHistoryPage {
292
300
  */
293
301
  total: number;
294
302
  /** 下一页游标。 */
295
- nextCursor?: string;
303
+ next_cursor?: string;
296
304
  /** 是否仍有更多数据。 */
297
- hasMore: boolean;
305
+ has_more: boolean;
306
+ /**
307
+ * 当前读取的 compact archive 层 ID。
308
+ *
309
+ * 说明(中文)
310
+ * - 省略表示当前页来自主历史 `messages.jsonl`。
311
+ * - 有值表示当前页来自指定 compact archive。
312
+ */
313
+ archive_id?: string;
314
+ /**
315
+ * 当前层更早一次 compact 对应的 archive ID。
316
+ *
317
+ * 关键点(中文)
318
+ * - compact summary 不会出现在 `items` 中。
319
+ * - 若当前层包含 compact summary,则这里暴露其 archive ID,供调用方继续 `session.history({ archive_id })`。
320
+ */
321
+ previous_archive_id?: string;
298
322
  }
299
323
  /**
300
324
  * Session fork 输入。
@@ -1 +1 @@
1
- {"version":3,"file":"SessionTypes.d.ts","sourceRoot":"","sources":["../../../src/types/agent/SessionTypes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SessionTypes.d.ts","sourceRoot":"","sources":["../../../src/types/agent/SessionTypes.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@downcity/agent",
3
- "version": "1.1.165",
3
+ "version": "1.1.168",
4
4
  "type": "module",
5
5
  "description": "Downcity Agent 运行时 — 单 Agent 执行壳与本机 RPC 能力",
6
6
  "main": "./bin/index.js",
@@ -17,8 +17,8 @@
17
17
  },
18
18
  "dependencies": {
19
19
  "@ai-sdk/openai-compatible": "^2.0.48",
20
- "@downcity/shell": "^0.1.39",
21
- "@downcity/type": "0.1.73",
20
+ "@downcity/shell": "^0.1.42",
21
+ "@downcity/type": "0.1.75",
22
22
  "ai": "^6.0.193",
23
23
  "commander": "^15.0.0",
24
24
  "dotenv": "^17.4.2",
@@ -0,0 +1,188 @@
1
+ /**
2
+ * @file 验证 session.history 的 compact archive 分层读取语义。
3
+ *
4
+ * 关键点(中文)
5
+ * - compact summary 是模型上下文消息,但不应作为用户可见 history item 返回。
6
+ * - 调用方通过 previous_archive_id 再传入 archive_id,读取上一层被覆盖历史。
7
+ * - history 分页字段使用 snake_case,保持 SDK 对外数据命名一致。
8
+ */
9
+
10
+ import test from "node:test";
11
+ import assert from "node:assert/strict";
12
+ import os from "node:os";
13
+ import path from "node:path";
14
+ import fs from "node:fs/promises";
15
+
16
+ import { Agent } from "../bin/index.js";
17
+
18
+ function user_message(session_id, index) {
19
+ return {
20
+ id: `u:${index}`,
21
+ role: "user",
22
+ metadata: {
23
+ v: 1,
24
+ ts: index,
25
+ sessionId: session_id,
26
+ source: "ingress",
27
+ },
28
+ parts: [{ type: "text", text: `user ${index}` }],
29
+ };
30
+ }
31
+
32
+ function assistant_message(session_id, index) {
33
+ return {
34
+ id: `a:${index}`,
35
+ role: "assistant",
36
+ metadata: {
37
+ v: 1,
38
+ ts: index,
39
+ sessionId: session_id,
40
+ source: "egress",
41
+ },
42
+ parts: [{ type: "text", text: `assistant ${index}` }],
43
+ };
44
+ }
45
+
46
+ function compact_summary(session_id, archive_id, text) {
47
+ return {
48
+ id: `summary:${archive_id}`,
49
+ role: "assistant",
50
+ metadata: {
51
+ v: 1,
52
+ ts: 1000,
53
+ sessionId: session_id,
54
+ source: "compact",
55
+ kind: "summary",
56
+ archiveId: archive_id,
57
+ sourceRange: {
58
+ fromId: "start",
59
+ toId: "end",
60
+ count: 2,
61
+ },
62
+ },
63
+ parts: [{ type: "text", text }],
64
+ };
65
+ }
66
+
67
+ async function write_jsonl(file_path, messages) {
68
+ await fs.mkdir(path.dirname(file_path), { recursive: true });
69
+ await fs.writeFile(
70
+ file_path,
71
+ messages.map((message) => JSON.stringify(message)).join("\n") + "\n",
72
+ "utf8",
73
+ );
74
+ }
75
+
76
+ async function write_archive(file_path, session_id, messages) {
77
+ await fs.mkdir(path.dirname(file_path), { recursive: true });
78
+ await fs.writeFile(
79
+ file_path,
80
+ JSON.stringify(
81
+ {
82
+ v: 1,
83
+ sessionId: session_id,
84
+ archivedAt: Date.now(),
85
+ messages,
86
+ },
87
+ null,
88
+ 2,
89
+ ),
90
+ "utf8",
91
+ );
92
+ }
93
+
94
+ test("session.history hides compact summary and reads archive layers by archive_id", async () => {
95
+ const agent_path = await fs.mkdtemp(
96
+ path.join(os.tmpdir(), "downcity-agent-history-archive-"),
97
+ );
98
+ const agent = new Agent({
99
+ id: "history_archive_agent",
100
+ path: agent_path,
101
+ });
102
+ const session = await agent.session_collection().create_session({
103
+ sessionId: "history_archive_session",
104
+ });
105
+
106
+ const messages_dir = path.join(
107
+ agent_path,
108
+ ".downcity",
109
+ "agents",
110
+ encodeURIComponent("history_archive_agent"),
111
+ "sessions",
112
+ encodeURIComponent(session.id),
113
+ "messages",
114
+ );
115
+ const messages_path = path.join(messages_dir, "messages.jsonl");
116
+ const archive_dir = path.join(messages_dir, "archive");
117
+
118
+ try {
119
+ await write_jsonl(messages_path, [
120
+ compact_summary(session.id, "compact-B", "summary B"),
121
+ user_message(session.id, 31),
122
+ assistant_message(session.id, 32),
123
+ ]);
124
+ await write_archive(path.join(archive_dir, "compact-B.json"), session.id, [
125
+ compact_summary(session.id, "compact-A", "summary A"),
126
+ user_message(session.id, 16),
127
+ assistant_message(session.id, 17),
128
+ ]);
129
+ await write_archive(path.join(archive_dir, "compact-A.json"), session.id, [
130
+ user_message(session.id, 1),
131
+ assistant_message(session.id, 2),
132
+ ]);
133
+
134
+ const current_page = await session.history({
135
+ limit: 1,
136
+ });
137
+ assert.equal(current_page.total, 2);
138
+ assert.equal(current_page.has_more, true);
139
+ assert.equal(current_page.next_cursor, "1");
140
+ assert.equal(current_page.archive_id, undefined);
141
+ assert.equal(current_page.previous_archive_id, "compact-B");
142
+ assert.deepEqual(
143
+ current_page.items.map((message) => message.id),
144
+ ["u:31"],
145
+ );
146
+
147
+ const next_current_page = await session.history({
148
+ cursor: current_page.next_cursor,
149
+ });
150
+ assert.equal(next_current_page.has_more, false);
151
+ assert.deepEqual(
152
+ next_current_page.items.map((message) => message.id),
153
+ ["a:32"],
154
+ );
155
+
156
+ const previous_page = await session.history({
157
+ archive_id: current_page.previous_archive_id,
158
+ });
159
+ assert.equal(previous_page.archive_id, "compact-B");
160
+ assert.equal(previous_page.previous_archive_id, "compact-A");
161
+ assert.equal(previous_page.total, 2);
162
+ assert.deepEqual(
163
+ previous_page.items.map((message) => message.id),
164
+ ["u:16", "a:17"],
165
+ );
166
+
167
+ const oldest_page = await session.history({
168
+ archive_id: previous_page.previous_archive_id,
169
+ });
170
+ assert.equal(oldest_page.archive_id, "compact-A");
171
+ assert.equal(oldest_page.previous_archive_id, undefined);
172
+ assert.deepEqual(
173
+ oldest_page.items.map((message) => message.id),
174
+ ["u:1", "a:2"],
175
+ );
176
+
177
+ const timeline_page = await session.history({
178
+ view: "timeline",
179
+ archive_id: "compact-B",
180
+ });
181
+ assert.deepEqual(
182
+ timeline_page.items.map((event) => event.text),
183
+ ["user 16", "assistant 17"],
184
+ );
185
+ } finally {
186
+ await agent.dispose();
187
+ }
188
+ });
@@ -191,6 +191,7 @@ export class HttpRemoteAgentTransport implements RemoteAgentTransport {
191
191
  const query = new URLSearchParams();
192
192
  if (input?.limit !== undefined) query.set("limit", String(input.limit));
193
193
  if (input?.cursor) query.set("cursor", input.cursor);
194
+ if (input?.archive_id) query.set("archive_id", input.archive_id);
194
195
  if (input?.order) query.set("order", input.order);
195
196
  if (input?.view) query.set("view", input.view);
196
197
  const payload = await read_http_json<{
@@ -39,6 +39,7 @@ type SessionCompactDeps = {
39
39
  loadAll: () => Promise<SessionMessageV1[]>;
40
40
  createSummaryMessage: (params: {
41
41
  text: string;
42
+ archiveId?: string;
42
43
  sourceRange?: SessionMetadataV1["sourceRange"];
43
44
  }) => SessionMessageV1;
44
45
  getArchiveDirPath: () => string;
@@ -141,13 +142,13 @@ export async function compactSessionMessagesIfNeeded(
141
142
 
142
143
  const fromId = String(older[0]?.id || "");
143
144
  const toId = String(older[older.length - 1]?.id || "");
145
+ const archiveId = `compact-${Date.now()}-${generateId()}`;
144
146
  const summaryMsg = deps.createSummaryMessage({
145
147
  text: summary,
148
+ archiveId,
146
149
  sourceRange: fromId && toId ? { fromId, toId, count: older.length } : undefined,
147
150
  });
148
151
 
149
- const archiveId = `compact-${Date.now()}-${generateId()}`;
150
-
151
152
  // phase 2:写入(短锁,且避免覆盖新追加)
152
153
  // - 以“当前最新 session messages”为准重算 currentOlder / currentKept,避免覆盖并发新消息。
153
154
  await deps.withWriteLock(async () => {
@@ -445,7 +445,7 @@ export class JsonlSessionHistoryStore implements SessionHistoryStore {
445
445
  sessionId: this.sessionId,
446
446
  withWriteLock: (fn) => this.withWriteLock(fn),
447
447
  loadAll: () => this.list(),
448
- createSummaryMessage: ({ text, sourceRange }) => ({
448
+ createSummaryMessage: ({ text, archiveId, sourceRange }) => ({
449
449
  id: `a:${this.sessionId}:${generateId()}`,
450
450
  role: "assistant",
451
451
  metadata: {
@@ -454,6 +454,7 @@ export class JsonlSessionHistoryStore implements SessionHistoryStore {
454
454
  sessionId: this.sessionId,
455
455
  source: "compact",
456
456
  kind: "summary",
457
+ ...(archiveId ? { archiveId } : {}),
457
458
  ...(sourceRange ? { sourceRange } : {}),
458
459
  },
459
460
  parts: [{ type: "text", text: String(text ?? "") }],
@@ -64,6 +64,8 @@ export type SessionMetadataV1 = {
64
64
  kind?: SessionMessageKind;
65
65
  /** 当前消息来自入站、出站还是 compact。 */
66
66
  source?: SessionMessageSource;
67
+ /** compact 摘要对应的 archive 文件 ID,用于用户历史按层读取更早消息。 */
68
+ archiveId?: string;
67
69
  /** compact 摘要所覆盖的原始消息范围。 */
68
70
  sourceRange?: SessionMessageSourceRangeV1;
69
71
  /**
@@ -83,6 +83,13 @@ type SessionBrowseBaseInput = {
83
83
  executing?: boolean;
84
84
  };
85
85
 
86
+ type SessionArchiveFileV1 = {
87
+ v?: unknown;
88
+ sessionId?: unknown;
89
+ archivedAt?: unknown;
90
+ messages?: unknown;
91
+ };
92
+
86
93
  function decodeMaybe(input: string): string {
87
94
  try {
88
95
  return decodeURIComponent(input);
@@ -122,6 +129,11 @@ function encodeCursor(offset: number): string | undefined {
122
129
  return String(Math.floor(offset));
123
130
  }
124
131
 
132
+ function normalizeArchiveId(input: unknown): string | undefined {
133
+ const value = String(input || "").trim();
134
+ return value || undefined;
135
+ }
136
+
125
137
  function stringifyForDisplay(input: unknown, maxChars = 2400): string {
126
138
  if (input === undefined) return "";
127
139
  if (input === null) return "null";
@@ -359,6 +371,53 @@ export async function loadSessionMessagesFromPath(
359
371
  return messages;
360
372
  }
361
373
 
374
+ /**
375
+ * 读取 compact archive 文件中的消息。
376
+ *
377
+ * 关键点(中文)
378
+ * - archive 是 compact 时被覆盖的“上一层历史”,不是当前运行态事实源。
379
+ * - 这里不读取 inflight,因为 archive 层永远是已完成的历史快照。
380
+ */
381
+ export async function loadSessionArchiveMessagesFromPath(
382
+ filePath: string,
383
+ ): Promise<SessionMessageV1[]> {
384
+ try {
385
+ const raw = (await fs.readJson(filePath)) as SessionArchiveFileV1 | null;
386
+ const items = Array.isArray(raw?.messages) ? raw.messages : [];
387
+ return items.filter((item): item is SessionMessageV1 => {
388
+ if (!item || typeof item !== "object") return false;
389
+ const candidate = item as Partial<SessionMessageV1>;
390
+ return (
391
+ (candidate.role === "user" || candidate.role === "assistant") &&
392
+ Array.isArray(candidate.parts)
393
+ );
394
+ });
395
+ } catch {
396
+ return [];
397
+ }
398
+ }
399
+
400
+ function isCompactSummaryMessage(message: SessionMessageV1): boolean {
401
+ const metadata = (message.metadata || null) as SessionMetadataV1 | null;
402
+ return metadata?.source === "compact" || metadata?.kind === "summary";
403
+ }
404
+
405
+ function resolvePreviousArchiveId(messages: SessionMessageV1[]): string | undefined {
406
+ for (const message of messages) {
407
+ if (!isCompactSummaryMessage(message)) continue;
408
+ const metadata = (message.metadata || null) as SessionMetadataV1 | null;
409
+ const archiveId = normalizeArchiveId(metadata?.archiveId);
410
+ if (archiveId) return archiveId;
411
+ }
412
+ return undefined;
413
+ }
414
+
415
+ function filterUserVisibleHistoryMessages(
416
+ messages: SessionMessageV1[],
417
+ ): SessionMessageV1[] {
418
+ return messages.filter((message) => !isCompactSummaryMessage(message));
419
+ }
420
+
362
421
  /**
363
422
  * 基于 metadata + messages 构建 SDK session 详情。
364
423
  */
@@ -409,9 +468,12 @@ export function buildSessionHistoryPage(params: {
409
468
  const order = params.input?.order || "asc";
410
469
  const limit = normalizeLimit(params.input?.limit, 50, 500);
411
470
  const cursor = normalizeCursor(params.input?.cursor);
471
+ const archive_id = normalizeArchiveId(params.input?.archive_id);
472
+ const previous_archive_id = resolvePreviousArchiveId(params.messages);
473
+ const visibleMessages = filterUserVisibleHistoryMessages(params.messages);
412
474
 
413
475
  if (view === "timeline") {
414
- const allEvents = params.messages.flatMap((message) => toSessionTimelineEvents(message));
476
+ const allEvents = visibleMessages.flatMap((message) => toSessionTimelineEvents(message));
415
477
  const orderedEvents = order === "desc" ? [...allEvents].reverse() : allEvents;
416
478
  const pageItems = orderedEvents.slice(cursor, cursor + limit);
417
479
  const nextOffset = cursor + pageItems.length;
@@ -421,14 +483,16 @@ export function buildSessionHistoryPage(params: {
421
483
  items: pageItems,
422
484
  total: orderedEvents.length,
423
485
  ...(nextOffset < orderedEvents.length
424
- ? { nextCursor: encodeCursor(nextOffset) }
486
+ ? { next_cursor: encodeCursor(nextOffset) }
425
487
  : {}),
426
- hasMore: nextOffset < orderedEvents.length,
488
+ has_more: nextOffset < orderedEvents.length,
489
+ ...(archive_id ? { archive_id } : {}),
490
+ ...(previous_archive_id ? { previous_archive_id } : {}),
427
491
  };
428
492
  }
429
493
 
430
494
  const orderedMessages =
431
- order === "desc" ? [...params.messages].reverse() : [...params.messages];
495
+ order === "desc" ? [...visibleMessages].reverse() : [...visibleMessages];
432
496
  const pageItems = orderedMessages.slice(cursor, cursor + limit);
433
497
  const nextOffset = cursor + pageItems.length;
434
498
  return {
@@ -437,9 +501,11 @@ export function buildSessionHistoryPage(params: {
437
501
  items: pageItems,
438
502
  total: orderedMessages.length,
439
503
  ...(nextOffset < orderedMessages.length
440
- ? { nextCursor: encodeCursor(nextOffset) }
504
+ ? { next_cursor: encodeCursor(nextOffset) }
441
505
  : {}),
442
- hasMore: nextOffset < orderedMessages.length,
506
+ has_more: nextOffset < orderedMessages.length,
507
+ ...(archive_id ? { archive_id } : {}),
508
+ ...(previous_archive_id ? { previous_archive_id } : {}),
443
509
  };
444
510
  }
445
511
 
@@ -16,6 +16,7 @@ export {
16
16
  getSdkAgentArchivedSessionMetaPath,
17
17
  getSdkAgentArchivedSessionsDirPath,
18
18
  getSdkAgentSessionArchiveDirPath,
19
+ getSdkAgentSessionArchiveFilePath,
19
20
  getSdkAgentSessionDirPath,
20
21
  getSdkAgentSessionInflightPath,
21
22
  getSdkAgentSessionMessagesDirPath,
@@ -49,6 +50,7 @@ export {
49
50
  buildSessionInfo,
50
51
  listArchivedAgentSessionSummaryPage,
51
52
  listAgentSessionSummaryPage,
53
+ loadSessionArchiveMessagesFromPath,
52
54
  loadSessionMessagesFromPath,
53
55
  resolveSessionMessagePreview,
54
56
  toSessionTimelineEvents,
@@ -11,7 +11,9 @@ import { nanoid } from "nanoid";
11
11
  import {
12
12
  buildSessionHistoryPage,
13
13
  buildSessionInfo,
14
+ getSdkAgentSessionArchiveFilePath,
14
15
  ensureSessionTitle,
16
+ loadSessionArchiveMessagesFromPath,
15
17
  readSessionMetadata,
16
18
  } from "@/session/index.js";
17
19
  import { buildSessionSystemBlocks } from "@/session/SessionSystemBuilder.js";
@@ -179,7 +181,8 @@ export class SessionViewService<TSession extends Pick<AgentSession, "set">> {
179
181
  async history(
180
182
  input?: AgentSessionHistoryInput,
181
183
  ): Promise<AgentSessionHistoryPage> {
182
- const [metadata, messages] = await Promise.all([
184
+ const archive_id = String(input?.archive_id || "").trim();
185
+ const [metadata, current_messages] = await Promise.all([
183
186
  readSessionMetadata({
184
187
  projectRoot: this.project_root,
185
188
  agentId: this.agent_id,
@@ -187,13 +190,23 @@ export class SessionViewService<TSession extends Pick<AgentSession, "set">> {
187
190
  }),
188
191
  this.history_store.list(),
189
192
  ]);
193
+ const page_messages = archive_id
194
+ ? await loadSessionArchiveMessagesFromPath(
195
+ getSdkAgentSessionArchiveFilePath(
196
+ this.project_root,
197
+ this.agent_id,
198
+ this.session_id,
199
+ archive_id,
200
+ ),
201
+ )
202
+ : current_messages;
190
203
  const session = await this.build_info({
191
204
  metadata,
192
- messages,
205
+ messages: current_messages,
193
206
  });
194
207
  return buildSessionHistoryPage({
195
208
  session,
196
- messages,
209
+ messages: page_messages,
197
210
  input,
198
211
  });
199
212
  }