@downcity/agent 1.1.200 → 1.1.203

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 (228) hide show
  1. package/bin/agent/local/Agent.d.ts +3 -7
  2. package/bin/agent/local/Agent.d.ts.map +1 -1
  3. package/bin/agent/local/Agent.js +14 -19
  4. package/bin/agent/local/Agent.js.map +1 -1
  5. package/bin/agent/local/services/{AgentSessionManager.d.ts → AgentSessions.d.ts} +12 -17
  6. package/bin/agent/local/services/AgentSessions.d.ts.map +1 -0
  7. package/bin/agent/local/services/{AgentSessionManager.js → AgentSessions.js} +11 -26
  8. package/bin/agent/local/services/AgentSessions.js.map +1 -0
  9. package/bin/agent/remote/RemoteAgent.d.ts +2 -9
  10. package/bin/agent/remote/RemoteAgent.d.ts.map +1 -1
  11. package/bin/agent/remote/RemoteAgent.js +40 -22
  12. package/bin/agent/remote/RemoteAgent.js.map +1 -1
  13. package/bin/agent/remote/RemoteSession.d.ts +5 -5
  14. package/bin/agent/remote/RemoteSession.d.ts.map +1 -1
  15. package/bin/agent/remote/RemoteSession.js +5 -3
  16. package/bin/agent/remote/RemoteSession.js.map +1 -1
  17. package/bin/agent/remote/RemoteTransport.d.ts +2 -2
  18. package/bin/agent/remote/transports/HttpRemoteAgentTransport.d.ts +2 -2
  19. package/bin/agent/remote/transports/HttpRemoteAgentTransport.js +5 -5
  20. package/bin/agent/remote/transports/RpcRemoteAgentTransport.d.ts +2 -2
  21. package/bin/agent/remote/transports/RpcRemoteAgentTransport.js +2 -2
  22. package/bin/executor/Executor.d.ts +5 -5
  23. package/bin/executor/Executor.d.ts.map +1 -1
  24. package/bin/executor/Executor.js +22 -13
  25. package/bin/executor/Executor.js.map +1 -1
  26. package/bin/executor/SessionRunScope.d.ts +1 -1
  27. package/bin/executor/SessionRunScope.d.ts.map +1 -1
  28. package/bin/executor/composer/compaction/SessionCompactionComposer.d.ts +3 -3
  29. package/bin/executor/composer/compaction/SessionCompactionComposer.d.ts.map +1 -1
  30. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.d.ts +4 -5
  31. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.d.ts.map +1 -1
  32. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.js +56 -16
  33. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.js.map +1 -1
  34. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionFileOperations.d.ts +27 -0
  35. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionFileOperations.d.ts.map +1 -0
  36. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionFileOperations.js +181 -0
  37. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionFileOperations.js.map +1 -0
  38. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionPrompts.d.ts +45 -0
  39. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionPrompts.d.ts.map +1 -0
  40. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionPrompts.js +144 -0
  41. package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionPrompts.js.map +1 -0
  42. package/bin/executor/composer/context/LocalSessionContextComposer.d.ts +3 -3
  43. package/bin/executor/composer/context/LocalSessionContextComposer.d.ts.map +1 -1
  44. package/bin/executor/composer/context/SessionContextComposer.d.ts +3 -3
  45. package/bin/executor/composer/context/SessionContextComposer.d.ts.map +1 -1
  46. package/bin/executor/composer/history/SessionHistoryComposer.d.ts +2 -2
  47. package/bin/executor/composer/history/SessionHistoryComposer.d.ts.map +1 -1
  48. package/bin/executor/composer/history/SessionHistoryWriter.d.ts +5 -5
  49. package/bin/executor/composer/history/SessionHistoryWriter.d.ts.map +1 -1
  50. package/bin/executor/composer/history/SessionHistoryWriter.js +6 -6
  51. package/bin/executor/composer/history/SessionHistoryWriter.js.map +1 -1
  52. package/bin/executor/composer/history/jsonl/JsonlSessionHistoryComposer.d.ts +2 -2
  53. package/bin/executor/composer/history/jsonl/JsonlSessionHistoryComposer.d.ts.map +1 -1
  54. package/bin/executor/composer/history/jsonl/JsonlSessionHistoryComposer.js +5 -5
  55. package/bin/executor/composer/history/jsonl/JsonlSessionHistoryComposer.js.map +1 -1
  56. package/bin/executor/core-engine/CoreEngineMessageState.d.ts +5 -5
  57. package/bin/executor/core-engine/CoreEngineMessageState.d.ts.map +1 -1
  58. package/bin/executor/core-engine/CoreEngineMessageState.js.map +1 -1
  59. package/bin/executor/core-engine/CoreEngineRunner.js.map +1 -1
  60. package/bin/executor/core-engine/CoreEngineSignals.d.ts +4 -4
  61. package/bin/executor/core-engine/CoreEngineSignals.d.ts.map +1 -1
  62. package/bin/executor/core-engine/CoreEngineSignals.js.map +1 -1
  63. package/bin/executor/core-engine/CoreEngineUiStreamCollector.d.ts +3 -3
  64. package/bin/executor/core-engine/CoreEngineUiStreamCollector.d.ts.map +1 -1
  65. package/bin/executor/core-engine/CoreEngineUiStreamCollector.js.map +1 -1
  66. package/bin/executor/messages/AssistantResultPersistence.d.ts +5 -5
  67. package/bin/executor/messages/AssistantResultPersistence.d.ts.map +1 -1
  68. package/bin/executor/messages/AssistantResultPersistence.js +1 -1
  69. package/bin/executor/messages/AssistantResultPersistence.js.map +1 -1
  70. package/bin/executor/messages/SessionAttachmentMapper.d.ts +3 -3
  71. package/bin/executor/messages/SessionAttachmentMapper.d.ts.map +1 -1
  72. package/bin/executor/messages/SessionAttachmentMapper.js.map +1 -1
  73. package/bin/executor/messages/SessionMessageCodec.d.ts +4 -4
  74. package/bin/executor/messages/SessionMessageCodec.d.ts.map +1 -1
  75. package/bin/executor/messages/SessionMessageCodec.js +5 -5
  76. package/bin/executor/messages/SessionMessageCodec.js.map +1 -1
  77. package/bin/executor/messages/SessionMessageLog.d.ts +3 -3
  78. package/bin/executor/messages/SessionMessageLog.d.ts.map +1 -1
  79. package/bin/executor/messages/SessionMessageLog.js.map +1 -1
  80. package/bin/executor/messages/SessionStepEventMapper.d.ts +2 -2
  81. package/bin/executor/messages/SessionStepEventMapper.d.ts.map +1 -1
  82. package/bin/executor/messages/SessionStepEventMapper.js.map +1 -1
  83. package/bin/executor/messages/UserVisibleText.d.ts +3 -3
  84. package/bin/executor/messages/UserVisibleText.d.ts.map +1 -1
  85. package/bin/executor/messages/UserVisibleText.js +3 -3
  86. package/bin/executor/messages/UserVisibleText.js.map +1 -1
  87. package/bin/executor/services/ExecutorInflightService.d.ts +2 -2
  88. package/bin/executor/services/ExecutorInflightService.d.ts.map +1 -1
  89. package/bin/executor/services/ExecutorInflightService.js +4 -4
  90. package/bin/executor/services/ExecutorInflightService.js.map +1 -1
  91. package/bin/executor/store/history/SessionHistoryStore.d.ts +24 -21
  92. package/bin/executor/store/history/SessionHistoryStore.d.ts.map +1 -1
  93. package/bin/executor/store/history/SessionHistoryStore.js +3 -3
  94. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.d.ts +18 -19
  95. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.d.ts.map +1 -1
  96. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.js +33 -36
  97. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.js.map +1 -1
  98. package/bin/executor/tools/plugin/PluginToolDefinition.d.ts +1 -7
  99. package/bin/executor/tools/plugin/PluginToolDefinition.d.ts.map +1 -1
  100. package/bin/executor/tools/plugin/PluginToolSchemas.d.ts +4 -6
  101. package/bin/executor/tools/plugin/PluginToolSchemas.d.ts.map +1 -1
  102. package/bin/executor/tools/plugin/PluginToolSchemas.js +24 -10
  103. package/bin/executor/tools/plugin/PluginToolSchemas.js.map +1 -1
  104. package/bin/executor/types/{SessionMessages.d.ts → SessionRecords.d.ts} +53 -28
  105. package/bin/executor/types/SessionRecords.d.ts.map +1 -0
  106. package/bin/executor/types/SessionRecords.js +52 -0
  107. package/bin/executor/types/SessionRecords.js.map +1 -0
  108. package/bin/executor/types/SessionRun.d.ts +3 -3
  109. package/bin/executor/types/SessionRun.d.ts.map +1 -1
  110. package/bin/index.d.ts +1 -1
  111. package/bin/index.d.ts.map +1 -1
  112. package/bin/rpc/Client.d.ts +5 -5
  113. package/bin/rpc/Client.js +4 -4
  114. package/bin/session/Session.d.ts +6 -6
  115. package/bin/session/Session.d.ts.map +1 -1
  116. package/bin/session/Session.js +8 -8
  117. package/bin/session/Session.js.map +1 -1
  118. package/bin/session/SessionTitle.d.ts +2 -2
  119. package/bin/session/SessionTitle.d.ts.map +1 -1
  120. package/bin/session/SessionTitle.js +3 -3
  121. package/bin/session/SessionTitle.js.map +1 -1
  122. package/bin/session/browse/Browse.d.ts +12 -12
  123. package/bin/session/browse/Browse.d.ts.map +1 -1
  124. package/bin/session/browse/Browse.js +9 -9
  125. package/bin/session/browse/Browse.js.map +1 -1
  126. package/bin/session/index.d.ts +1 -1
  127. package/bin/session/index.js +1 -1
  128. package/bin/session/runtime/SessionPromptRuntime.d.ts +3 -3
  129. package/bin/session/runtime/SessionPromptRuntime.d.ts.map +1 -1
  130. package/bin/session/services/SessionStateService.d.ts +7 -8
  131. package/bin/session/services/SessionStateService.d.ts.map +1 -1
  132. package/bin/session/services/SessionStateService.js +24 -34
  133. package/bin/session/services/SessionStateService.js.map +1 -1
  134. package/bin/session/services/SessionViewService.d.ts +4 -4
  135. package/bin/session/services/SessionViewService.js +12 -12
  136. package/bin/session/services/SessionViewService.js.map +1 -1
  137. package/bin/session/storage/Persistence.d.ts +4 -4
  138. package/bin/session/storage/Persistence.d.ts.map +1 -1
  139. package/bin/session/storage/RuntimeSessionPort.d.ts +2 -2
  140. package/bin/session/storage/RuntimeSessionPort.d.ts.map +1 -1
  141. package/bin/session/storage/RuntimeSessionPort.js +4 -4
  142. package/bin/session/storage/RuntimeSessionPort.js.map +1 -1
  143. package/bin/types/agent/AgentTypes.d.ts +2 -2
  144. package/bin/types/agent/AgentTypes.d.ts.map +1 -1
  145. package/bin/types/agent/SessionActor.d.ts +11 -11
  146. package/bin/types/agent/SessionActor.d.ts.map +1 -1
  147. package/bin/types/agent/SessionTypes.d.ts +12 -12
  148. package/bin/types/agent/SessionTypes.d.ts.map +1 -1
  149. package/bin/types/executor/SessionRunContext.d.ts +2 -2
  150. package/bin/types/executor/SessionRunContext.d.ts.map +1 -1
  151. package/bin/types/rpc/RpcProtocol.d.ts +6 -6
  152. package/bin/types/runtime/agent/AgentContext.d.ts +7 -7
  153. package/bin/types/runtime/agent/AgentContext.d.ts.map +1 -1
  154. package/bin/types/sdk/AgentSessionAction.d.ts +8 -49
  155. package/bin/types/sdk/AgentSessionAction.d.ts.map +1 -1
  156. package/bin/types/sdk/AgentSessionAction.js +4 -4
  157. package/bin/types/sdk/AgentSessionTurn.d.ts +2 -2
  158. package/bin/types/sdk/AgentSessionTurn.d.ts.map +1 -1
  159. package/package.json +3 -3
  160. package/scripts/agent-ready.test.mjs +1 -1
  161. package/scripts/city-model-tool-loop.test.mjs +36 -4
  162. package/scripts/plugin-tool-bridge.test.mjs +13 -0
  163. package/scripts/session-action-message.test.mjs +71 -27
  164. package/scripts/session-compaction-prompts.test.mjs +97 -0
  165. package/scripts/session-history-archive.test.mjs +8 -8
  166. package/scripts/session-history-inflight.test.mjs +10 -10
  167. package/scripts/session-list-title.test.mjs +9 -9
  168. package/scripts/session-title-event.test.mjs +12 -10
  169. package/src/agent/local/Agent.ts +16 -22
  170. package/src/agent/local/services/{AgentSessionManager.ts → AgentSessions.ts} +16 -32
  171. package/src/agent/remote/RemoteAgent.ts +58 -23
  172. package/src/agent/remote/RemoteSession.ts +10 -8
  173. package/src/agent/remote/RemoteTransport.ts +5 -5
  174. package/src/agent/remote/transports/HttpRemoteAgentTransport.ts +10 -10
  175. package/src/agent/remote/transports/RpcRemoteAgentTransport.ts +6 -6
  176. package/src/executor/Executor.ts +30 -19
  177. package/src/executor/SessionRunScope.ts +1 -1
  178. package/src/executor/composer/compaction/SessionCompactionComposer.ts +3 -3
  179. package/src/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.ts +73 -29
  180. package/src/executor/composer/compaction/jsonl/JsonlSessionCompactionFileOperations.ts +197 -0
  181. package/src/executor/composer/compaction/jsonl/JsonlSessionCompactionPrompts.ts +162 -0
  182. package/src/executor/composer/context/LocalSessionContextComposer.ts +5 -5
  183. package/src/executor/composer/context/SessionContextComposer.ts +5 -5
  184. package/src/executor/composer/history/SessionHistoryComposer.ts +2 -2
  185. package/src/executor/composer/history/SessionHistoryWriter.ts +10 -10
  186. package/src/executor/composer/history/jsonl/JsonlSessionHistoryComposer.ts +13 -13
  187. package/src/executor/core-engine/CoreEngineMessageState.ts +8 -8
  188. package/src/executor/core-engine/CoreEngineRunner.ts +7 -7
  189. package/src/executor/core-engine/CoreEngineSignals.ts +7 -7
  190. package/src/executor/core-engine/CoreEngineUiStreamCollector.ts +5 -5
  191. package/src/executor/messages/AssistantResultPersistence.ts +8 -8
  192. package/src/executor/messages/SessionAttachmentMapper.ts +11 -11
  193. package/src/executor/messages/SessionMessageCodec.ts +10 -10
  194. package/src/executor/messages/SessionMessageLog.ts +3 -3
  195. package/src/executor/messages/SessionStepEventMapper.ts +5 -5
  196. package/src/executor/messages/UserVisibleText.ts +9 -9
  197. package/src/executor/services/ExecutorInflightService.ts +7 -7
  198. package/src/executor/store/history/SessionHistoryStore.ts +26 -23
  199. package/src/executor/store/history/jsonl/JsonlSessionHistoryStore.ts +58 -62
  200. package/src/executor/tools/plugin/PluginToolSchemas.ts +24 -10
  201. package/src/executor/types/{SessionMessages.ts → SessionRecords.ts} +71 -40
  202. package/src/executor/types/SessionRun.ts +5 -5
  203. package/src/index.ts +4 -4
  204. package/src/rpc/Client.ts +9 -9
  205. package/src/session/Session.ts +10 -10
  206. package/src/session/SessionTitle.ts +7 -7
  207. package/src/session/browse/Browse.ts +38 -38
  208. package/src/session/index.ts +1 -1
  209. package/src/session/runtime/SessionPromptRuntime.ts +6 -6
  210. package/src/session/services/SessionStateService.ts +40 -47
  211. package/src/session/services/SessionTurnService.ts +4 -4
  212. package/src/session/services/SessionViewService.ts +21 -21
  213. package/src/session/storage/Persistence.ts +6 -6
  214. package/src/session/storage/RuntimeSessionPort.ts +6 -6
  215. package/src/types/agent/AgentTypes.ts +4 -4
  216. package/src/types/agent/SessionActor.ts +12 -12
  217. package/src/types/agent/SessionTypes.ts +12 -12
  218. package/src/types/executor/SessionRunContext.ts +2 -2
  219. package/src/types/rpc/RpcProtocol.ts +6 -6
  220. package/src/types/runtime/agent/AgentContext.ts +8 -8
  221. package/src/types/sdk/AgentSessionAction.ts +12 -56
  222. package/src/types/sdk/AgentSessionTurn.ts +2 -2
  223. package/tsconfig.tsbuildinfo +1 -1
  224. package/bin/agent/local/services/AgentSessionManager.d.ts.map +0 -1
  225. package/bin/agent/local/services/AgentSessionManager.js.map +0 -1
  226. package/bin/executor/types/SessionMessages.d.ts.map +0 -1
  227. package/bin/executor/types/SessionMessages.js +0 -46
  228. package/bin/executor/types/SessionMessages.js.map +0 -1
@@ -8,7 +8,15 @@
8
8
  */
9
9
 
10
10
  import type {
11
- AgentSessionCollection,
11
+ AgentArchiveSessionInput,
12
+ AgentArchiveSessionsInput,
13
+ AgentArchiveSessionResult,
14
+ AgentArchiveSessionsResult,
15
+ AgentCleanArchiveResult,
16
+ AgentCreateSessionInput,
17
+ AgentListSessionsInput,
18
+ AgentSessionSummaryPage,
19
+ AgentSessions,
12
20
  RemoteAgentPluginActionInput,
13
21
  RemoteAgentPluginActionResult,
14
22
  RemoteAgentOptions,
@@ -30,6 +38,8 @@ import { create_remote_agent_transport } from "@/agent/remote/TransportFactory.j
30
38
  * RemoteAgent:远程 Agent 客户端。
31
39
  */
32
40
  export class RemoteAgent {
41
+ readonly sessions: AgentSessions<RemoteAgentSession>;
42
+
33
43
  private readonly transport: RemoteAgentTransport;
34
44
 
35
45
  constructor(options: RemoteAgentOptions) {
@@ -38,6 +48,7 @@ export class RemoteAgent {
38
48
  throw new Error("RemoteAgent requires a non-empty url");
39
49
  }
40
50
  this.transport = create_remote_agent_transport(url, options.token);
51
+ this.sessions = new RemoteAgentSessions(this.transport);
41
52
  }
42
53
 
43
54
  /**
@@ -121,27 +132,51 @@ export class RemoteAgent {
121
132
  await this.transport.close?.();
122
133
  }
123
134
 
124
- /**
125
- * 返回当前远程 session collection 入口。
126
- *
127
- * 关键点(中文)
128
- * - `RemoteAgentTransport` 只负责协议传输,不直接等价于 `AgentSessionCollection`。
129
- * - 这里把 transport 包装为 `AgentSessionCollection`,`create_session` / `get_session` 返回 `RemoteSession` 实例。
130
- */
131
- session_collection(): AgentSessionCollection {
132
- return {
133
- create_session: async (input) => {
134
- const info = await this.transport.create_session(input);
135
- return new RemoteSession(this.transport, info);
136
- },
137
- get_session: async (session_id) => {
138
- const info = await this.transport.get_info(session_id);
139
- return new RemoteSession(this.transport, info);
140
- },
141
- list_sessions: async (input) => await this.transport.list_sessions(input),
142
- archive_session: async (input) => await this.transport.archive_session(input),
143
- archive_sessions: async (input) => await this.transport.archive_sessions(input),
144
- clean_archive: async () => await this.transport.clean_archive(),
145
- };
135
+ }
136
+
137
+ /**
138
+ * 远程 Agent session 集合入口。
139
+ *
140
+ * 关键点(中文)
141
+ * - `RemoteAgentTransport` 只负责协议传输,不直接暴露为用户 SDK API。
142
+ * - 这里把远程传输包装成和本地 `agent.sessions` 一致的方法命名。
143
+ */
144
+ class RemoteAgentSessions implements AgentSessions<RemoteAgentSession> {
145
+ private readonly transport: RemoteAgentTransport;
146
+
147
+ constructor(transport: RemoteAgentTransport) {
148
+ this.transport = transport;
149
+ }
150
+
151
+ /** 新建一个远程 session。 */
152
+ async create(input?: AgentCreateSessionInput): Promise<RemoteAgentSession> {
153
+ const info = await this.transport.create_session(input);
154
+ return new RemoteSession(this.transport, info);
155
+ }
156
+
157
+ /** 获取一个远程 session。 */
158
+ async get(session_id: string): Promise<RemoteAgentSession> {
159
+ const info = await this.transport.get_info(session_id);
160
+ return new RemoteSession(this.transport, info);
161
+ }
162
+
163
+ /** 列出远程 session 摘要页。 */
164
+ async list(input?: AgentListSessionsInput): Promise<AgentSessionSummaryPage> {
165
+ return await this.transport.list_sessions(input);
166
+ }
167
+
168
+ /** 归档一个远程 session。 */
169
+ async archive(input: AgentArchiveSessionInput): Promise<AgentArchiveSessionResult> {
170
+ return await this.transport.archive_session(input);
171
+ }
172
+
173
+ /** 列出远程已归档 session。 */
174
+ async archived(input?: AgentArchiveSessionsInput): Promise<AgentArchiveSessionsResult> {
175
+ return await this.transport.archive_sessions(input);
176
+ }
177
+
178
+ /** 永久清空远程已归档 session。 */
179
+ async clean_archive(): Promise<AgentCleanArchiveResult> {
180
+ return await this.transport.clean_archive();
146
181
  }
147
182
  }
@@ -7,14 +7,14 @@
7
7
  */
8
8
 
9
9
  import type {
10
- AgentSession,
11
10
  AgentSessionConfigSnapshot,
12
11
  AgentSessionForkInput,
13
- AgentSessionHistoryInput,
14
- AgentSessionHistoryPage,
12
+ AgentSessionRecordsInput,
13
+ AgentSessionRecordsPage,
15
14
  AgentSessionInfo,
16
15
  AgentSessionSetInput,
17
16
  AgentSessionSystemSnapshot,
17
+ RemoteAgentSession,
18
18
  } from "@/types/agent/AgentTypes.js";
19
19
  import { isAgentSessionPromptInputEmpty } from "@/types/sdk/AgentSessionPrompt.js";
20
20
  import type { AgentSessionStopResult } from "@/types/sdk/AgentSessionStop.js";
@@ -53,7 +53,7 @@ type RemoteTurnLifecycle = {
53
53
  /**
54
54
  * 远程 Session 客户端。
55
55
  */
56
- export class RemoteSession implements AgentSession {
56
+ export class RemoteSession implements RemoteAgentSession {
57
57
  readonly id: string;
58
58
  readonly agentId: string;
59
59
  readonly config: AgentSessionConfigSnapshot;
@@ -87,7 +87,7 @@ export class RemoteSession implements AgentSession {
87
87
  /**
88
88
  * 读取当前远程 session 详情。
89
89
  */
90
- async getInfo(): Promise<AgentSessionInfo> {
90
+ async get_info(): Promise<AgentSessionInfo> {
91
91
  return await this.transport.get_info(this.id);
92
92
  }
93
93
 
@@ -135,8 +135,8 @@ export class RemoteSession implements AgentSession {
135
135
  /**
136
136
  * 读取远程消息历史。
137
137
  */
138
- async history(input?: AgentSessionHistoryInput): Promise<AgentSessionHistoryPage> {
139
- return await this.transport.history(this.id, input);
138
+ async records(input?: AgentSessionRecordsInput): Promise<AgentSessionRecordsPage> {
139
+ return await this.transport.records(this.id, input);
140
140
  }
141
141
 
142
142
  /**
@@ -149,7 +149,7 @@ export class RemoteSession implements AgentSession {
149
149
  /**
150
150
  * 分叉远程 session。
151
151
  */
152
- async fork(input?: AgentSessionForkInput | string): Promise<AgentSession> {
152
+ async fork(input?: AgentSessionForkInput | string): Promise<RemoteAgentSession> {
153
153
  const info = await this.transport.fork(this.id, input);
154
154
  return new RemoteSession(this.transport, info);
155
155
  }
@@ -296,6 +296,8 @@ function extract_turn_id(event: AgentSessionEvent): string | null {
296
296
  case "assistant-step":
297
297
  case "turn-finish":
298
298
  return event.turnId;
299
+ case "action":
300
+ return event.metadata.turnId || null;
299
301
  default:
300
302
  return null;
301
303
  }
@@ -15,8 +15,8 @@ import type {
15
15
  AgentArchiveSessionsResult,
16
16
  AgentCleanArchiveResult,
17
17
  AgentSessionForkInput,
18
- AgentSessionHistoryInput,
19
- AgentSessionHistoryPage,
18
+ AgentSessionRecordsInput,
19
+ AgentSessionRecordsPage,
20
20
  AgentSessionInfo,
21
21
  AgentSessionSummaryPage,
22
22
  AgentSessionSystemSnapshot,
@@ -63,10 +63,10 @@ export type RemoteSessionTransport = {
63
63
  on_event: (event: AgentSessionEvent) => void;
64
64
  }): Promise<TransportSubscription>;
65
65
  /** 读取 history。 */
66
- history(
66
+ records(
67
67
  session_id: string,
68
- input?: AgentSessionHistoryInput,
69
- ): Promise<AgentSessionHistoryPage>;
68
+ input?: AgentSessionRecordsInput,
69
+ ): Promise<AgentSessionRecordsPage>;
70
70
  /** 读取 system snapshot。 */
71
71
  system(session_id: string): Promise<AgentSessionSystemSnapshot>;
72
72
  /** 分叉 session。 */
@@ -15,8 +15,8 @@ import type {
15
15
  AgentArchiveSessionsResult,
16
16
  AgentCleanArchiveResult,
17
17
  AgentSessionForkInput,
18
- AgentSessionHistoryInput,
19
- AgentSessionHistoryPage,
18
+ AgentSessionRecordsInput,
19
+ AgentSessionRecordsPage,
20
20
  AgentSessionInfo,
21
21
  AgentSessionSummaryPage,
22
22
  AgentSessionSystemSnapshot,
@@ -184,10 +184,10 @@ export class HttpRemoteAgentTransport implements RemoteAgentTransport {
184
184
  };
185
185
  }
186
186
 
187
- async history(
187
+ async records(
188
188
  session_id: string,
189
- input?: AgentSessionHistoryInput,
190
- ): Promise<AgentSessionHistoryPage> {
189
+ input?: AgentSessionRecordsInput,
190
+ ): Promise<AgentSessionRecordsPage> {
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);
@@ -197,19 +197,19 @@ export class HttpRemoteAgentTransport implements RemoteAgentTransport {
197
197
  const payload = await read_http_json<{
198
198
  success?: boolean;
199
199
  error?: string;
200
- history?: AgentSessionHistoryPage;
200
+ records?: AgentSessionRecordsPage;
201
201
  }>(
202
- `${this.base_url}/api/sdk/sessions/${encodeURIComponent(session_id)}/history${
202
+ `${this.base_url}/api/sdk/sessions/${encodeURIComponent(session_id)}/records${
203
203
  query.size > 0 ? `?${query.toString()}` : ""
204
204
  }`,
205
205
  {
206
206
  headers: this.headers(),
207
207
  },
208
208
  );
209
- if (!payload.success || !payload.history || !Array.isArray(payload.history.items)) {
210
- throw new Error(String(payload.error || "Remote session history failed"));
209
+ if (!payload.success || !payload.records || !Array.isArray(payload.records.items)) {
210
+ throw new Error(String(payload.error || "Remote session records failed"));
211
211
  }
212
- return payload.history;
212
+ return payload.records;
213
213
  }
214
214
 
215
215
  async system(session_id: string): Promise<AgentSessionSystemSnapshot> {
@@ -15,8 +15,8 @@ import type {
15
15
  AgentArchiveSessionsResult,
16
16
  AgentCleanArchiveResult,
17
17
  AgentSessionForkInput,
18
- AgentSessionHistoryInput,
19
- AgentSessionHistoryPage,
18
+ AgentSessionRecordsInput,
19
+ AgentSessionRecordsPage,
20
20
  AgentSessionInfo,
21
21
  AgentSessionSummaryPage,
22
22
  AgentSessionSystemSnapshot,
@@ -89,11 +89,11 @@ export class RpcRemoteAgentTransport implements RemoteAgentTransport {
89
89
  };
90
90
  }
91
91
 
92
- async history(
92
+ async records(
93
93
  session_id: string,
94
- input?: AgentSessionHistoryInput,
95
- ): Promise<AgentSessionHistoryPage> {
96
- return await this.client.get_session_history({
94
+ input?: AgentSessionRecordsInput,
95
+ ): Promise<AgentSessionRecordsPage> {
96
+ return await this.client.get_session_records({
97
97
  session_id,
98
98
  input,
99
99
  });
@@ -25,10 +25,13 @@ import { ExecutorRecoveryPolicy } from "@executor/services/ExecutorRecoveryPolic
25
25
  import { generateId } from "@/utils/Id.js";
26
26
  import type { Logger } from "@/utils/logger/Logger.js";
27
27
  import type { JsonObject } from "@/types/common/Json.js";
28
- import type { SessionMessageV1 } from "@/executor/types/SessionMessages.js";
28
+ import type {
29
+ SessionActionRecordV1,
30
+ SessionRecordV1,
31
+ } from "@/executor/types/SessionRecords.js";
32
+ import { to_session_action_record } from "@/executor/types/SessionRecords.js";
29
33
  import type { SessionExecutor } from "@/executor/types/SessionExecutor.js";
30
34
  import type { SessionRunContext } from "@/types/executor/SessionRunContext.js";
31
- import type { AgentSessionActionRecord } from "@/types/sdk/AgentSessionAction.js";
32
35
  import type {
33
36
  SessionExecuteInput,
34
37
  SessionRunResult,
@@ -212,23 +215,23 @@ export class Executor implements SessionExecutor {
212
215
  /**
213
216
  * 追加一条 user 消息。
214
217
  */
215
- async appendUserMessage(params: {
216
- message?: SessionMessageV1 | null;
218
+ async append_user_message(params: {
219
+ message?: SessionRecordV1 | null;
217
220
  text?: string;
218
221
  extra?: JsonObject;
219
222
  }): Promise<void> {
220
- await this.historyWriter.appendUserMessage(params);
223
+ await this.historyWriter.append_user_message(params);
221
224
  }
222
225
 
223
226
  /**
224
227
  * 追加一条 assistant 消息。
225
228
  */
226
- async appendAssistantMessage(params: {
227
- message?: SessionMessageV1 | null;
229
+ async append_assistant_message(params: {
230
+ message?: SessionRecordV1 | null;
228
231
  fallbackText?: string;
229
232
  extra?: JsonObject;
230
233
  }): Promise<void> {
231
- await this.historyWriter.appendAssistantMessage(params);
234
+ await this.historyWriter.append_assistant_message(params);
232
235
  }
233
236
 
234
237
  /**
@@ -372,7 +375,7 @@ export class Executor implements SessionExecutor {
372
375
  }
373
376
 
374
377
  const emit_compaction_action = async (
375
- action: AgentSessionActionRecord,
378
+ action: SessionActionRecordV1,
376
379
  ): Promise<void> => {
377
380
  if (action.state === "running") {
378
381
  compaction_action_id = action.id;
@@ -389,13 +392,18 @@ export class Executor implements SessionExecutor {
389
392
  });
390
393
  } catch (error) {
391
394
  await this.emitAction(run_context, {
395
+ type: "action",
392
396
  id:
393
397
  compaction_action_id ||
394
398
  `compacting:${this.sessionId}:failed:${Date.now()}:${generateId()}`,
395
- title: "Session history compact failed",
399
+ title: "Session records compact failed",
396
400
  description: error instanceof Error ? error.message : String(error),
397
401
  state: "failed",
398
- visible: false,
402
+ metadata: {
403
+ v: 1,
404
+ ts: Date.now(),
405
+ sessionId: this.sessionId,
406
+ },
399
407
  });
400
408
  // 压缩失败不阻断主流程,继续使用当前历史消息执行。
401
409
  }
@@ -514,21 +522,24 @@ export class Executor implements SessionExecutor {
514
522
  */
515
523
  private async emitAction(
516
524
  run_context: SessionRunContext,
517
- action: AgentSessionActionRecord,
525
+ action: SessionActionRecordV1,
518
526
  ): Promise<void> {
519
527
  if (typeof run_context.onActionCallback !== "function") return;
520
528
  const action_id =
521
529
  String(action.id || "").trim() ||
522
530
  `action:${this.sessionId}:${Date.now()}:${generateId()}`;
523
- await run_context.onActionCallback({
524
- type: "action",
525
- sessionId: run_context.sessionId || this.sessionId,
531
+ const event = to_session_action_record({
526
532
  ...action,
527
533
  id: action_id,
528
- ...(run_context.turnId && !action.turnId
529
- ? { turnId: run_context.turnId }
530
- : {}),
531
- });
534
+ metadata: {
535
+ ...action.metadata,
536
+ sessionId: run_context.sessionId || this.sessionId,
537
+ ...(run_context.turnId && !action.metadata.turnId
538
+ ? { turnId: run_context.turnId }
539
+ : {}),
540
+ },
541
+ }, run_context.sessionId || this.sessionId);
542
+ await run_context.onActionCallback(event);
532
543
  }
533
544
 
534
545
  /**
@@ -1,6 +1,6 @@
1
1
  import { AsyncLocalStorage } from "node:async_hooks";
2
2
  import type { FileUIPart } from "ai";
3
- import type { SessionUserMessageV1 } from "@/executor/types/SessionMessages.js";
3
+ import type { SessionUserMessageV1 } from "@/executor/types/SessionRecords.js";
4
4
  import type { SessionRunContext } from "@/types/executor/SessionRunContext.js";
5
5
 
6
6
  /**
@@ -8,7 +8,7 @@
8
8
 
9
9
  import type { LanguageModel, SystemModelMessage } from "ai";
10
10
  import type { SessionHistoryStore } from "@/executor/store/history/SessionHistoryStore.js";
11
- import type { AgentSessionActionRecord } from "@/types/sdk/AgentSessionAction.js";
11
+ import type { SessionActionRecordV1 } from "@/executor/types/SessionRecords.js";
12
12
 
13
13
  /**
14
14
  * compaction Composer 执行输入。
@@ -39,9 +39,9 @@ export type SessionCompactionInput = {
39
39
  *
40
40
  * 说明(中文)
41
41
  * - 默认 compaction Composer 可在真正开始压缩时发布 action。
42
- * - 回调由上层 Session 负责转成订阅事件与 action message
42
+ * - 回调由上层 Session 负责转成订阅事件与 action record
43
43
  */
44
- onAction?: (action: AgentSessionActionRecord) => Promise<void>;
44
+ onAction?: (action: SessionActionRecordV1) => Promise<void>;
45
45
  };
46
46
 
47
47
  /**
@@ -18,16 +18,22 @@ import {
18
18
  import { generateId } from "@/utils/Id.js";
19
19
  import { getLogger } from "@/utils/logger/Logger.js";
20
20
  import type {
21
- SessionMessageV1,
21
+ SessionActionRecordV1,
22
+ SessionRecordV1,
22
23
  SessionMetadataV1,
23
- SessionModelMessageV1,
24
- } from "@/executor/types/SessionMessages.js";
24
+ SessionMessageRecordV1,
25
+ } from "@/executor/types/SessionRecords.js";
25
26
  import {
26
- isSessionActionMessage,
27
- isSessionModelMessage,
28
- } from "@/executor/types/SessionMessages.js";
27
+ is_session_message_record,
28
+ } from "@/executor/types/SessionRecords.js";
29
29
  import type { SessionHistoryMetaV1 } from "@/executor/types/SessionHistoryMeta.js";
30
- import type { AgentSessionActionRecord } from "@/types/sdk/AgentSessionAction.js";
30
+ import {
31
+ append_session_compaction_file_operations,
32
+ build_initial_session_compaction_prompt,
33
+ build_update_session_compaction_prompt,
34
+ SESSION_COMPACTION_SYSTEM_PROMPT,
35
+ } from "@executor/composer/compaction/jsonl/JsonlSessionCompactionPrompts.js";
36
+ import { format_session_compaction_file_operations } from "@executor/composer/compaction/jsonl/JsonlSessionCompactionFileOperations.js";
31
37
 
32
38
  export type SessionCompactParams = {
33
39
  model: LanguageModel;
@@ -36,19 +42,19 @@ export type SessionCompactParams = {
36
42
  maxInputTokensApprox: number;
37
43
  archiveOnCompact: boolean;
38
44
  compactRatio: number;
39
- onAction?: (action: AgentSessionActionRecord) => Promise<void>;
45
+ onAction?: (action: SessionActionRecordV1) => Promise<void>;
40
46
  };
41
47
 
42
48
  type SessionCompactDeps = {
43
49
  rootPath: string;
44
50
  sessionId: string;
45
51
  withWriteLock: <T>(fn: () => Promise<T>) => Promise<T>;
46
- loadAll: () => Promise<SessionMessageV1[]>;
52
+ loadAll: () => Promise<SessionRecordV1[]>;
47
53
  createSummaryMessage: (params: {
48
54
  text: string;
49
55
  archiveId?: string;
50
56
  sourceRange?: SessionMetadataV1["sourceRange"];
51
- }) => SessionMessageV1;
57
+ }) => SessionRecordV1;
52
58
  getArchiveDirPath: () => string;
53
59
  getMessagesFilePath: () => string;
54
60
  readMetaUnsafe: () => Promise<SessionHistoryMetaV1>;
@@ -71,12 +77,18 @@ export async function compactSessionMessagesIfNeeded(
71
77
  let action_started = false;
72
78
 
73
79
  const publish_action = async (
74
- action: Omit<AgentSessionActionRecord, "id">,
80
+ action: Omit<SessionActionRecordV1, "type" | "id" | "metadata">,
75
81
  ): Promise<void> => {
76
82
  if (typeof params.onAction !== "function") return;
77
83
  await params.onAction({
84
+ type: "action",
78
85
  id: action_id,
79
86
  ...action,
87
+ metadata: {
88
+ v: 1,
89
+ ts: Date.now(),
90
+ sessionId: deps.sessionId,
91
+ },
80
92
  });
81
93
  };
82
94
 
@@ -84,10 +96,10 @@ export async function compactSessionMessagesIfNeeded(
84
96
  // phase 1:snapshot(短锁)
85
97
  // - 仅负责拿一致性快照,不做耗时的模型调用。
86
98
  // - 目的是把锁持有时间降到最低。
87
- let snapshot: SessionModelMessageV1[] = [];
99
+ let snapshot: SessionMessageRecordV1[] = [];
88
100
  let snapshotTailId = "";
89
101
  await deps.withWriteLock(async () => {
90
- snapshot = (await deps.loadAll()).filter(isSessionModelMessage);
102
+ snapshot = (await deps.loadAll()).filter(is_session_message_record);
91
103
  snapshotTailId =
92
104
  snapshot.length > 0
93
105
  ? String(snapshot[snapshot.length - 1].id || "")
@@ -121,16 +133,27 @@ export async function compactSessionMessagesIfNeeded(
121
133
 
122
134
  action_started = true;
123
135
  await publish_action({
124
- title: "Compacting session history",
136
+ title: "Compacting session records",
125
137
  state: "running",
126
138
  });
127
139
 
128
- const olderTextAll = extractPlainTextFromMessages(older);
140
+ const previous_summary = extract_existing_compaction_summary(older[0]);
141
+ const conversation_messages = previous_summary ? older.slice(1) : older;
142
+ const olderTextAll = extractPlainTextFromMessages(conversation_messages);
129
143
  const maxOlderChars = 24_000;
130
144
  const olderText =
131
145
  olderTextAll.length > maxOlderChars
132
146
  ? "(注意:更早历史过长,已截断保留末尾)\n" + olderTextAll.slice(-maxOlderChars)
133
147
  : olderTextAll;
148
+ const prompt = previous_summary
149
+ ? build_update_session_compaction_prompt({
150
+ previous_summary,
151
+ new_conversation_text: olderText || "(none)",
152
+ })
153
+ : build_initial_session_compaction_prompt({
154
+ conversation_text: olderText || "(none)",
155
+ });
156
+ const file_operations_xml = format_session_compaction_file_operations(older);
134
157
 
135
158
  // phase 1.5:生成摘要(不持锁)
136
159
  // - 这一步最耗时,必须在锁外执行,避免阻塞 append。
@@ -141,18 +164,15 @@ export async function compactSessionMessagesIfNeeded(
141
164
  system: [
142
165
  {
143
166
  role: "system",
144
- content:
145
- "你是对话压缩助手。请把更早的对话历史压缩成“可持续复用”的工作摘要。\n" +
146
- "要求:\n" +
147
- "- 输出中文\n" +
148
- "- 不要复述无关细节,不要输出工具原始日志\n" +
149
- "- 必须包含:已确认事实/用户偏好约束/已做决策/未完成事项\n" +
150
- "- 使用 Markdown 列表,控制在 300~800 字",
167
+ content: SESSION_COMPACTION_SYSTEM_PROMPT,
151
168
  },
152
169
  ],
153
- prompt: `请压缩以下更早历史(按 user/assistant 交替记录):\n\n${olderText}`,
170
+ prompt,
171
+ });
172
+ summary = append_session_compaction_file_operations({
173
+ summary: String(r.text || "").trim(),
174
+ file_operations_xml,
154
175
  });
155
- summary = String(r.text || "").trim();
156
176
  } catch (e) {
157
177
  await logger.log(
158
178
  "warn",
@@ -162,9 +182,12 @@ export async function compactSessionMessagesIfNeeded(
162
182
  error: String(e),
163
183
  },
164
184
  );
165
- summary = "(系统自动压缩:摘要生成失败,已丢弃更早历史,仅保留最近对话。)";
185
+ summary = append_session_compaction_file_operations({
186
+ summary: "(系统自动压缩:摘要生成失败,已丢弃更早历史,仅保留最近对话。)",
187
+ file_operations_xml,
188
+ });
166
189
  await publish_action({
167
- title: "Compacting session history",
190
+ title: "Compacting session records",
168
191
  description: "Summary generation failed; using a fallback summary.",
169
192
  state: "running",
170
193
  });
@@ -190,7 +213,7 @@ export async function compactSessionMessagesIfNeeded(
190
213
  void snapshotTailId;
191
214
 
192
215
  const current_model_messages = current.filter(
193
- isSessionModelMessage,
216
+ is_session_message_record,
194
217
  );
195
218
  const currentCompactCount = resolveCompactCount(
196
219
  current_model_messages.length,
@@ -243,7 +266,7 @@ export async function compactSessionMessagesIfNeeded(
243
266
 
244
267
  if (action_started) {
245
268
  await publish_action({
246
- title: "Session history compacted",
269
+ title: "Session records compacted",
247
270
  description: `Compacted ${String(older.length)} earlier messages into ${archiveId}.`,
248
271
  state: "completed",
249
272
  });
@@ -297,7 +320,7 @@ function estimateTokensApproxFromText(text: string): number {
297
320
  * - 统一把 user / assistant 内容线性化,作为 compact 摘要输入。
298
321
  * - tool 原始结构不会原样输出,避免把噪声日志喂给摘要模型。
299
322
  */
300
- function extractPlainTextFromMessages(messages: SessionModelMessageV1[]): string {
323
+ function extractPlainTextFromMessages(messages: SessionMessageRecordV1[]): string {
301
324
  const lines: string[] = [];
302
325
  for (const m of messages) {
303
326
  if (!m || typeof m !== "object") continue;
@@ -310,3 +333,24 @@ function extractPlainTextFromMessages(messages: SessionModelMessageV1[]): string
310
333
  }
311
334
  return lines.join("\n");
312
335
  }
336
+
337
+ /**
338
+ * 从已有 compact summary 消息中提取旧摘要。
339
+ *
340
+ * 关键点(中文)
341
+ * - 旧摘要通常位于 messages.jsonl 第一条,后续 compact 应基于它迭代更新。
342
+ * - 只识别 compact 生成的 summary,避免误把普通 assistant 文本当作旧摘要。
343
+ */
344
+ function extract_existing_compaction_summary(
345
+ message: SessionMessageRecordV1 | undefined,
346
+ ): string {
347
+ if (!message || typeof message !== "object") return "";
348
+ const metadata = message.metadata;
349
+ if (metadata?.source !== "compact" || metadata.kind !== "summary") return "";
350
+ const parts = Array.isArray(message.parts) ? message.parts : [];
351
+ return parts
352
+ .filter(isTextUIPart)
353
+ .map((part) => String(part.text ?? ""))
354
+ .join("\n")
355
+ .trim();
356
+ }