@downcity/agent 1.1.216 → 1.1.222

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 (175) hide show
  1. package/bin/agent/local/Agent.d.ts +2 -0
  2. package/bin/agent/local/Agent.d.ts.map +1 -1
  3. package/bin/agent/local/Agent.js +6 -0
  4. package/bin/agent/local/Agent.js.map +1 -1
  5. package/bin/agent/local/services/AgentSessions.d.ts +6 -0
  6. package/bin/agent/local/services/AgentSessions.d.ts.map +1 -1
  7. package/bin/agent/local/services/AgentSessions.js +8 -1
  8. package/bin/agent/local/services/AgentSessions.js.map +1 -1
  9. package/bin/agent/remote/RemoteSession.d.ts +11 -7
  10. package/bin/agent/remote/RemoteSession.d.ts.map +1 -1
  11. package/bin/agent/remote/RemoteSession.js +36 -11
  12. package/bin/agent/remote/RemoteSession.js.map +1 -1
  13. package/bin/agent/remote/RemoteTransport.d.ts +9 -3
  14. package/bin/agent/remote/RemoteTransport.d.ts.map +1 -1
  15. package/bin/agent/remote/transports/HttpRemoteAgentTransport.d.ts +6 -2
  16. package/bin/agent/remote/transports/HttpRemoteAgentTransport.d.ts.map +1 -1
  17. package/bin/agent/remote/transports/HttpRemoteAgentTransport.js +38 -11
  18. package/bin/agent/remote/transports/HttpRemoteAgentTransport.js.map +1 -1
  19. package/bin/agent/remote/transports/RpcRemoteAgentTransport.d.ts +6 -2
  20. package/bin/agent/remote/transports/RpcRemoteAgentTransport.d.ts.map +1 -1
  21. package/bin/agent/remote/transports/RpcRemoteAgentTransport.js +8 -2
  22. package/bin/agent/remote/transports/RpcRemoteAgentTransport.js.map +1 -1
  23. package/bin/executor/types/SessionHistoryMeta.d.ts +2 -0
  24. package/bin/executor/types/SessionHistoryMeta.d.ts.map +1 -1
  25. package/bin/executor/types/SessionRecords.d.ts +2 -0
  26. package/bin/executor/types/SessionRecords.d.ts.map +1 -1
  27. package/bin/executor/types/SessionRecords.js.map +1 -1
  28. package/bin/index.d.ts +5 -2
  29. package/bin/index.d.ts.map +1 -1
  30. package/bin/index.js +1 -0
  31. package/bin/index.js.map +1 -1
  32. package/bin/rpc/Client.d.ts +18 -4
  33. package/bin/rpc/Client.d.ts.map +1 -1
  34. package/bin/rpc/Client.js +25 -3
  35. package/bin/rpc/Client.js.map +1 -1
  36. package/bin/session/Session.d.ts +13 -3
  37. package/bin/session/Session.d.ts.map +1 -1
  38. package/bin/session/Session.js +48 -18
  39. package/bin/session/Session.js.map +1 -1
  40. package/bin/session/browse/Browse.d.ts.map +1 -1
  41. package/bin/session/browse/Browse.js +3 -0
  42. package/bin/session/browse/Browse.js.map +1 -1
  43. package/bin/session/recorder/JsonlSessionMessageStore.d.ts +45 -0
  44. package/bin/session/recorder/JsonlSessionMessageStore.d.ts.map +1 -0
  45. package/bin/session/recorder/JsonlSessionMessageStore.js +127 -0
  46. package/bin/session/recorder/JsonlSessionMessageStore.js.map +1 -0
  47. package/bin/session/recorder/SessionMessageCodec.d.ts +20 -0
  48. package/bin/session/recorder/SessionMessageCodec.d.ts.map +1 -0
  49. package/bin/session/recorder/SessionMessageCodec.js +252 -0
  50. package/bin/session/recorder/SessionMessageCodec.js.map +1 -0
  51. package/bin/session/recorder/SessionMessageReducer.d.ts +12 -0
  52. package/bin/session/recorder/SessionMessageReducer.d.ts.map +1 -0
  53. package/bin/session/recorder/SessionMessageReducer.js +109 -0
  54. package/bin/session/recorder/SessionMessageReducer.js.map +1 -0
  55. package/bin/session/recorder/SessionRecorder.d.ts +177 -0
  56. package/bin/session/recorder/SessionRecorder.d.ts.map +1 -0
  57. package/bin/session/recorder/SessionRecorder.js +610 -0
  58. package/bin/session/recorder/SessionRecorder.js.map +1 -0
  59. package/bin/session/recorder/SessionRecorderCompaction.d.ts +18 -0
  60. package/bin/session/recorder/SessionRecorderCompaction.d.ts.map +1 -0
  61. package/bin/session/recorder/SessionRecorderCompaction.js +141 -0
  62. package/bin/session/recorder/SessionRecorderCompaction.js.map +1 -0
  63. package/bin/session/recorder/SessionRecorderHistoryStore.d.ts +66 -0
  64. package/bin/session/recorder/SessionRecorderHistoryStore.d.ts.map +1 -0
  65. package/bin/session/recorder/SessionRecorderHistoryStore.js +195 -0
  66. package/bin/session/recorder/SessionRecorderHistoryStore.js.map +1 -0
  67. package/bin/session/runtime/SessionMessageEventHub.d.ts +15 -0
  68. package/bin/session/runtime/SessionMessageEventHub.d.ts.map +1 -0
  69. package/bin/session/runtime/SessionMessageEventHub.js +28 -0
  70. package/bin/session/runtime/SessionMessageEventHub.js.map +1 -0
  71. package/bin/session/runtime/SessionPromptRuntime.d.ts +7 -13
  72. package/bin/session/runtime/SessionPromptRuntime.d.ts.map +1 -1
  73. package/bin/session/runtime/SessionPromptRuntime.js +13 -13
  74. package/bin/session/runtime/SessionPromptRuntime.js.map +1 -1
  75. package/bin/session/services/SessionStateService.d.ts +15 -3
  76. package/bin/session/services/SessionStateService.d.ts.map +1 -1
  77. package/bin/session/services/SessionStateService.js +165 -76
  78. package/bin/session/services/SessionStateService.js.map +1 -1
  79. package/bin/session/services/SessionTurnService.d.ts +4 -0
  80. package/bin/session/services/SessionTurnService.d.ts.map +1 -1
  81. package/bin/session/services/SessionTurnService.js +82 -52
  82. package/bin/session/services/SessionTurnService.js.map +1 -1
  83. package/bin/session/services/SessionViewService.d.ts +8 -3
  84. package/bin/session/services/SessionViewService.d.ts.map +1 -1
  85. package/bin/session/services/SessionViewService.js +13 -5
  86. package/bin/session/services/SessionViewService.js.map +1 -1
  87. package/bin/session/storage/Metadata.d.ts +2 -0
  88. package/bin/session/storage/Metadata.d.ts.map +1 -1
  89. package/bin/session/storage/Metadata.js +10 -0
  90. package/bin/session/storage/Metadata.js.map +1 -1
  91. package/bin/session/storage/Persistence.d.ts +6 -0
  92. package/bin/session/storage/Persistence.d.ts.map +1 -1
  93. package/bin/session/storage/Persistence.js +12 -0
  94. package/bin/session/storage/Persistence.js.map +1 -1
  95. package/bin/session/storage/RuntimeSessionPort.d.ts +3 -2
  96. package/bin/session/storage/RuntimeSessionPort.d.ts.map +1 -1
  97. package/bin/session/storage/RuntimeSessionPort.js.map +1 -1
  98. package/bin/types/agent/AgentOptions.d.ts +10 -0
  99. package/bin/types/agent/AgentOptions.d.ts.map +1 -1
  100. package/bin/types/agent/SessionActor.d.ts +12 -4
  101. package/bin/types/agent/SessionActor.d.ts.map +1 -1
  102. package/bin/types/agent/SessionTypes.d.ts +13 -1
  103. package/bin/types/agent/SessionTypes.d.ts.map +1 -1
  104. package/bin/types/rpc/RpcProtocol.d.ts +32 -6
  105. package/bin/types/rpc/RpcProtocol.d.ts.map +1 -1
  106. package/bin/types/runtime/agent/AgentContext.d.ts +4 -3
  107. package/bin/types/runtime/agent/AgentContext.d.ts.map +1 -1
  108. package/bin/types/runtime/agent/AgentContext.js.map +1 -1
  109. package/bin/types/sdk/AgentSessionEvent.d.ts +2 -1
  110. package/bin/types/sdk/AgentSessionEvent.d.ts.map +1 -1
  111. package/bin/types/session/SessionMessage.d.ts +217 -0
  112. package/bin/types/session/SessionMessage.d.ts.map +1 -0
  113. package/bin/types/session/SessionMessage.js +8 -0
  114. package/bin/types/session/SessionMessage.js.map +1 -0
  115. package/bin/types/session/SessionMessageMutation.d.ts +92 -0
  116. package/bin/types/session/SessionMessageMutation.d.ts.map +1 -0
  117. package/bin/types/session/SessionMessageMutation.js +21 -0
  118. package/bin/types/session/SessionMessageMutation.js.map +1 -0
  119. package/bin/types/session/SessionOptions.d.ts +3 -0
  120. package/bin/types/session/SessionOptions.d.ts.map +1 -1
  121. package/package.json +3 -3
  122. package/scripts/agent-env.test.mjs +4 -4
  123. package/scripts/remote-session-reconnect.test.mjs +33 -0
  124. package/scripts/session-action-message.test.mjs +148 -27
  125. package/scripts/session-list-title.test.mjs +6 -19
  126. package/scripts/session-prompt-runtime.test.mjs +4 -16
  127. package/scripts/session-recorder.test.mjs +245 -0
  128. package/scripts/session-title-event.test.mjs +10 -18
  129. package/src/agent/local/Agent.ts +6 -0
  130. package/src/agent/local/services/AgentSessions.ts +14 -1
  131. package/src/agent/remote/RemoteSession.ts +52 -16
  132. package/src/agent/remote/RemoteTransport.ts +20 -6
  133. package/src/agent/remote/transports/HttpRemoteAgentTransport.ts +67 -13
  134. package/src/agent/remote/transports/RpcRemoteAgentTransport.ts +27 -6
  135. package/src/executor/types/SessionHistoryMeta.ts +2 -0
  136. package/src/executor/types/SessionRecords.ts +2 -0
  137. package/src/index.ts +23 -5
  138. package/src/rpc/Client.ts +47 -8
  139. package/src/session/Session.ts +66 -31
  140. package/src/session/browse/Browse.ts +3 -0
  141. package/src/session/recorder/JsonlSessionMessageStore.ts +162 -0
  142. package/src/session/recorder/SessionMessageCodec.ts +279 -0
  143. package/src/session/recorder/SessionMessageReducer.ts +155 -0
  144. package/src/session/recorder/SessionRecorder.ts +812 -0
  145. package/src/session/recorder/SessionRecorderCompaction.ts +187 -0
  146. package/src/session/recorder/SessionRecorderHistoryStore.ts +276 -0
  147. package/src/session/runtime/SessionMessageEventHub.ts +35 -0
  148. package/src/session/runtime/SessionPromptRuntime.ts +23 -24
  149. package/src/session/services/SessionStateService.ts +189 -84
  150. package/src/session/services/SessionTurnService.ts +88 -59
  151. package/src/session/services/SessionViewService.ts +28 -13
  152. package/src/session/storage/Metadata.ts +13 -0
  153. package/src/session/storage/Persistence.ts +18 -0
  154. package/src/session/storage/RuntimeSessionPort.ts +6 -4
  155. package/src/types/agent/AgentOptions.ts +12 -0
  156. package/src/types/agent/SessionActor.ts +28 -5
  157. package/src/types/agent/SessionTypes.ts +13 -1
  158. package/src/types/rpc/RpcProtocol.ts +34 -6
  159. package/src/types/runtime/agent/AgentContext.ts +8 -2
  160. package/src/types/sdk/AgentSessionEvent.ts +2 -0
  161. package/src/types/session/SessionMessage.ts +247 -0
  162. package/src/types/session/SessionMessageMutation.ts +121 -0
  163. package/src/types/session/SessionOptions.ts +4 -0
  164. package/tsconfig.tsbuildinfo +1 -1
  165. package/bin/session/SessionEventMapper.d.ts +0 -32
  166. package/bin/session/SessionEventMapper.d.ts.map +0 -1
  167. package/bin/session/SessionEventMapper.js +0 -131
  168. package/bin/session/SessionEventMapper.js.map +0 -1
  169. package/bin/types/sdk/InternalUiChunkEvent.d.ts +0 -100
  170. package/bin/types/sdk/InternalUiChunkEvent.d.ts.map +0 -1
  171. package/bin/types/sdk/InternalUiChunkEvent.js +0 -9
  172. package/bin/types/sdk/InternalUiChunkEvent.js.map +0 -1
  173. package/scripts/session-history-archive.test.mjs +0 -188
  174. package/src/session/SessionEventMapper.ts +0 -148
  175. package/src/types/sdk/InternalUiChunkEvent.ts +0 -108
@@ -0,0 +1,252 @@
1
+ /**
2
+ * SessionMessage 与 AI SDK UIMessage 的内部投影转换。
3
+ *
4
+ * 关键点(中文)
5
+ * - SessionMessage 是唯一持久化事实;UIMessage 只在 Executor/Composer 边界临时构造。
6
+ * - action/error 不转换为模型消息。
7
+ * - part_id 只服务 Session Message identity,不传入模型协议。
8
+ */
9
+ /** 把 Session Message 投影成 Executor 可消费的 UIMessage。 */
10
+ export function to_executor_ui_message(message) {
11
+ if (message.type !== "user" && message.type !== "assistant")
12
+ return null;
13
+ const metadata = {
14
+ v: 1,
15
+ ts: message.updated_at,
16
+ sessionId: message.session_id,
17
+ turnId: message.turn_id,
18
+ source: message.type === "user"
19
+ ? "ingress"
20
+ : message.kind === "summary"
21
+ ? "compact"
22
+ : "egress",
23
+ kind: message.type === "assistant" && message.kind === "summary"
24
+ ? "summary"
25
+ : "normal",
26
+ extra: {
27
+ sequence: message.sequence,
28
+ revision: message.revision,
29
+ visibility: message.visibility,
30
+ ...(message.type === "user"
31
+ ? { inputType: message.input_type }
32
+ : { segmentIndex: message.segment_index, status: message.status }),
33
+ },
34
+ };
35
+ return {
36
+ id: message.message_id,
37
+ role: message.type,
38
+ metadata,
39
+ parts: message.type === "user"
40
+ ? to_ui_user_parts(message.parts)
41
+ : to_ui_assistant_parts(message.parts),
42
+ };
43
+ }
44
+ /** 把 AI SDK user parts 转换成可持久化 Session parts。 */
45
+ export function from_ui_user_parts(parts) {
46
+ if (!Array.isArray(parts))
47
+ return [];
48
+ return parts.flatMap((part, index) => {
49
+ if (!part || typeof part !== "object")
50
+ return [];
51
+ const candidate = part;
52
+ if (candidate.type === "text") {
53
+ return [{
54
+ part_id: `user-text:${index + 1}`,
55
+ type: "text",
56
+ text: String(candidate.text || ""),
57
+ state: "done",
58
+ }];
59
+ }
60
+ if (candidate.type === "file") {
61
+ return [{
62
+ part_id: `user-file:${index + 1}`,
63
+ type: "file",
64
+ url: String(candidate.url || ""),
65
+ media_type: String(candidate.mediaType || "application/octet-stream"),
66
+ ...(candidate.filename ? { filename: String(candidate.filename) } : {}),
67
+ }];
68
+ }
69
+ if (String(candidate.type || "").startsWith("data-")) {
70
+ return [{
71
+ part_id: `user-data:${index + 1}`,
72
+ type: "data",
73
+ data_type: String(candidate.type),
74
+ data: to_json_value(candidate.data),
75
+ }];
76
+ }
77
+ return [];
78
+ });
79
+ }
80
+ /** 把最终 AI SDK assistant parts 转换成 Session parts。 */
81
+ export function from_ui_assistant_parts(parts) {
82
+ if (!Array.isArray(parts))
83
+ return [];
84
+ return parts.flatMap((part, index) => {
85
+ if (!part || typeof part !== "object")
86
+ return [];
87
+ const candidate = part;
88
+ const type = String(candidate.type || "");
89
+ if (type === "text" || type === "reasoning") {
90
+ return [{
91
+ part_id: `${type}:${index + 1}`,
92
+ type: type,
93
+ text: String(candidate.text || ""),
94
+ state: "done",
95
+ }];
96
+ }
97
+ if (type === "file") {
98
+ return [{
99
+ part_id: `file:${index + 1}`,
100
+ type: "file",
101
+ url: String(candidate.url || ""),
102
+ media_type: String(candidate.mediaType || "application/octet-stream"),
103
+ ...(candidate.filename ? { filename: String(candidate.filename) } : {}),
104
+ }];
105
+ }
106
+ if (type === "dynamic-tool" || type.startsWith("tool-")) {
107
+ const state = String(candidate.state || "");
108
+ return [{
109
+ part_id: String(candidate.toolCallId || `tool:${index + 1}`),
110
+ type: "tool",
111
+ tool_call_id: String(candidate.toolCallId || `tool:${index + 1}`),
112
+ tool_name: String(candidate.toolName || "").trim() ||
113
+ type.replace(/^tool-/, "") ||
114
+ "unknown",
115
+ state: state === "output-available"
116
+ ? "completed"
117
+ : state === "output-error" || state === "output-denied"
118
+ ? "failed"
119
+ : state === "approval-requested"
120
+ ? "approval-required"
121
+ : state === "input-streaming"
122
+ ? "input-streaming"
123
+ : "running",
124
+ ...(candidate.input !== undefined
125
+ ? { input: to_json_value(candidate.input) }
126
+ : {}),
127
+ ...(candidate.output !== undefined
128
+ ? { output: to_json_value(candidate.output) }
129
+ : {}),
130
+ ...(candidate.errorText ? { error: String(candidate.errorText) } : {}),
131
+ }];
132
+ }
133
+ return [];
134
+ });
135
+ }
136
+ /** 提取 Assistant Message 的最终可见文本。 */
137
+ export function extract_session_assistant_text(message) {
138
+ if (!message)
139
+ return "";
140
+ return message.parts
141
+ .flatMap((part) => part.type === "text" ? [part.text] : [])
142
+ .join("")
143
+ .trim();
144
+ }
145
+ function to_ui_user_parts(parts) {
146
+ return parts.map((part) => {
147
+ if (part.type === "text") {
148
+ return { type: "text", text: part.text, state: part.state };
149
+ }
150
+ if (part.type === "file") {
151
+ return {
152
+ type: "file",
153
+ url: part.url,
154
+ mediaType: part.media_type,
155
+ ...(part.filename ? { filename: part.filename } : {}),
156
+ };
157
+ }
158
+ return {
159
+ type: part.data_type,
160
+ data: part.data,
161
+ };
162
+ });
163
+ }
164
+ function to_ui_assistant_parts(parts) {
165
+ return parts.map((part) => {
166
+ if (part.type === "text" || part.type === "reasoning") {
167
+ return { type: part.type, text: part.text, state: part.state };
168
+ }
169
+ if (part.type === "file") {
170
+ return {
171
+ type: "file",
172
+ url: part.url,
173
+ mediaType: part.media_type,
174
+ ...(part.filename ? { filename: part.filename } : {}),
175
+ };
176
+ }
177
+ if (part.type === "data") {
178
+ return {
179
+ type: part.data_type,
180
+ data: part.data,
181
+ };
182
+ }
183
+ if (!("tool_call_id" in part)) {
184
+ throw new Error(`Unsupported Assistant part: ${part.type}`);
185
+ }
186
+ const input = part.input ?? parse_json(part.input_text);
187
+ if (part.state === "completed") {
188
+ return {
189
+ type: "dynamic-tool",
190
+ toolName: part.tool_name,
191
+ toolCallId: part.tool_call_id,
192
+ state: "output-available",
193
+ input,
194
+ output: part.output,
195
+ };
196
+ }
197
+ if (part.state === "failed") {
198
+ return {
199
+ type: "dynamic-tool",
200
+ toolName: part.tool_name,
201
+ toolCallId: part.tool_call_id,
202
+ state: "output-error",
203
+ input,
204
+ errorText: part.error || "Tool failed",
205
+ };
206
+ }
207
+ if (part.state === "approval-required") {
208
+ return {
209
+ type: "dynamic-tool",
210
+ toolName: part.tool_name,
211
+ toolCallId: part.tool_call_id,
212
+ state: "approval-requested",
213
+ input,
214
+ approval: { id: part.approval_id || `approval:${part.tool_call_id}` },
215
+ };
216
+ }
217
+ return {
218
+ type: "dynamic-tool",
219
+ toolName: part.tool_name,
220
+ toolCallId: part.tool_call_id,
221
+ state: part.state === "input-streaming" ? "input-streaming" : "input-available",
222
+ input,
223
+ };
224
+ });
225
+ }
226
+ function parse_json(input) {
227
+ const value = String(input || "").trim();
228
+ if (!value)
229
+ return {};
230
+ try {
231
+ return JSON.parse(value);
232
+ }
233
+ catch {
234
+ return value;
235
+ }
236
+ }
237
+ function to_json_value(input) {
238
+ if (input === undefined || input === null)
239
+ return null;
240
+ if (typeof input === "string" ||
241
+ typeof input === "number" ||
242
+ typeof input === "boolean") {
243
+ return input;
244
+ }
245
+ try {
246
+ return JSON.parse(JSON.stringify(input));
247
+ }
248
+ catch {
249
+ return String(input);
250
+ }
251
+ }
252
+ //# sourceMappingURL=SessionMessageCodec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionMessageCodec.js","sourceRoot":"","sources":["../../../src/session/recorder/SessionMessageCodec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Session Message Mutation reducer。
3
+ *
4
+ * 历史重放与实时消费者共享 message、part、delta 三种归并语义。
5
+ */
6
+ import type { SessionMessage } from "../../types/session/SessionMessage.js";
7
+ import type { SessionMessageMutation } from "../../types/session/SessionMessageMutation.js";
8
+ /** 将单条 Mutation 应用到已有 Message。 */
9
+ export declare function reduce_session_message(current_message: SessionMessage | undefined, mutation: SessionMessageMutation): SessionMessage;
10
+ /** 按 commit_sequence 重放 Mutation,恢复线性 Message snapshot。 */
11
+ export declare function reduce_session_messages(mutations: SessionMessageMutation[]): SessionMessage[];
12
+ //# sourceMappingURL=SessionMessageReducer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionMessageReducer.d.ts","sourceRoot":"","sources":["../../../src/session/recorder/SessionMessageReducer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAA2B,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACjG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AAExF,kCAAkC;AAClC,wBAAgB,sBAAsB,CACpC,eAAe,EAAE,cAAc,GAAG,SAAS,EAC3C,QAAQ,EAAE,sBAAsB,GAC/B,cAAc,CAkDhB;AAED,2DAA2D;AAC3D,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,sBAAsB,EAAE,GAClC,cAAc,EAAE,CAmBlB"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Session Message Mutation reducer。
3
+ *
4
+ * 历史重放与实时消费者共享 message、part、delta 三种归并语义。
5
+ */
6
+ /** 将单条 Mutation 应用到已有 Message。 */
7
+ export function reduce_session_message(current_message, mutation) {
8
+ if (mutation.variant === "message") {
9
+ validate_message_snapshot(current_message, mutation);
10
+ return structuredClone(mutation.message);
11
+ }
12
+ if (!current_message) {
13
+ throw new Error(`Session Message does not exist: ${mutation.message_id}`);
14
+ }
15
+ validate_next_revision(current_message, mutation);
16
+ const assistant = require_streaming_assistant(current_message);
17
+ if (mutation.variant === "part") {
18
+ if (mutation.part.part_id !== mutation.part_id) {
19
+ throw new Error(`Part Mutation identity mismatch: ${mutation.part_id}`);
20
+ }
21
+ if (mutation.part.type !== mutation.type) {
22
+ throw new Error(`Part Mutation type mismatch: ${mutation.part_id}`);
23
+ }
24
+ const exists = assistant.parts.some((part) => part.part_id === mutation.part_id);
25
+ const parts = exists
26
+ ? assistant.parts.map((part) => part.part_id === mutation.part_id
27
+ ? structuredClone(mutation.part)
28
+ : part)
29
+ : [...assistant.parts, structuredClone(mutation.part)];
30
+ return with_revision(assistant, mutation, { parts });
31
+ }
32
+ const existing_part = assistant.parts.find((part) => part.part_id === mutation.part_id);
33
+ if (!existing_part ||
34
+ (existing_part.type !== "text" && existing_part.type !== "reasoning")) {
35
+ throw new Error(`Delta target Part does not exist: ${mutation.part_id}`);
36
+ }
37
+ if (existing_part.type !== mutation.type) {
38
+ throw new Error(`Delta type changed for Part: ${mutation.part_id}`);
39
+ }
40
+ const parts = assistant.parts.map((part) => part.part_id === mutation.part_id &&
41
+ (part.type === "text" || part.type === "reasoning")
42
+ ? { ...part, text: part.text + mutation.delta }
43
+ : part);
44
+ return with_revision(assistant, mutation, { parts });
45
+ }
46
+ /** 按 commit_sequence 重放 Mutation,恢复线性 Message snapshot。 */
47
+ export function reduce_session_messages(mutations) {
48
+ const messages = new Map();
49
+ const ordered = [...mutations].sort((left, right) => left.commit_sequence - right.commit_sequence);
50
+ let previous_commit_sequence = 0;
51
+ for (const mutation of ordered) {
52
+ if (mutation.commit_sequence <= previous_commit_sequence) {
53
+ throw new Error(`Duplicate commit_sequence: ${String(mutation.commit_sequence)}`);
54
+ }
55
+ messages.set(mutation.message_id, reduce_session_message(messages.get(mutation.message_id), mutation));
56
+ previous_commit_sequence = mutation.commit_sequence;
57
+ }
58
+ return [...messages.values()].sort((left, right) => left.sequence - right.sequence);
59
+ }
60
+ function validate_message_snapshot(current_message, mutation) {
61
+ if (mutation.message.message_id !== mutation.message_id) {
62
+ throw new Error(`Message Mutation identity mismatch: ${mutation.message_id}`);
63
+ }
64
+ if (mutation.message.type !== mutation.type) {
65
+ throw new Error(`Message Mutation type mismatch: ${mutation.message_id}`);
66
+ }
67
+ if (mutation.message.sequence !== mutation.sequence) {
68
+ throw new Error(`Message Mutation sequence mismatch: ${mutation.message_id}`);
69
+ }
70
+ if (mutation.message.revision !== mutation.revision) {
71
+ throw new Error(`Message Mutation revision mismatch: ${mutation.message_id}`);
72
+ }
73
+ if (!current_message) {
74
+ if (mutation.revision !== 1) {
75
+ throw new Error(`New Message revision must be 1: ${mutation.message_id}`);
76
+ }
77
+ return;
78
+ }
79
+ validate_next_revision(current_message, mutation);
80
+ if (current_message.type !== mutation.type) {
81
+ throw new Error(`Message type changed: ${mutation.message_id}`);
82
+ }
83
+ if (current_message.sequence !== mutation.sequence) {
84
+ throw new Error(`Message sequence changed: ${mutation.message_id}`);
85
+ }
86
+ }
87
+ function validate_next_revision(current_message, mutation) {
88
+ if (mutation.revision !== current_message.revision + 1) {
89
+ throw new Error(`Invalid Message revision for ${mutation.message_id}: expected ${String(current_message.revision + 1)}, received ${String(mutation.revision)}`);
90
+ }
91
+ }
92
+ function require_streaming_assistant(message) {
93
+ if (message.type !== "assistant") {
94
+ throw new Error(`Session Message is not assistant: ${message.message_id}`);
95
+ }
96
+ if (message.status !== "streaming") {
97
+ throw new Error(`Assistant Message is already closed: ${message.message_id}`);
98
+ }
99
+ return message;
100
+ }
101
+ function with_revision(message, mutation, changes) {
102
+ return {
103
+ ...message,
104
+ ...changes,
105
+ revision: mutation.revision,
106
+ updated_at: mutation.created_at,
107
+ };
108
+ }
109
+ //# sourceMappingURL=SessionMessageReducer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionMessageReducer.js","sourceRoot":"","sources":["../../../src/session/recorder/SessionMessageReducer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * SessionRecorder:Session Message 的唯一持久化与发布入口。
3
+ *
4
+ * Mutation 先写入单一 messages.jsonl,成功后更新内存 snapshot,最后发布同一个对象。
5
+ */
6
+ import type { UIMessage, UIMessageChunk } from "ai";
7
+ import { JsonlSessionMessageStore } from "../../session/recorder/JsonlSessionMessageStore.js";
8
+ import type { JsonObject } from "../../types/common/Json.js";
9
+ import type { ListSessionMessagesInput, SessionActionMessage, SessionAssistantMessage, SessionAssistantMessagePart, SessionErrorMessage, SessionMessage, SessionMessagePage, SessionUserMessage, SessionUserMessagePart } from "../../types/session/SessionMessage.js";
10
+ import type { ListSessionMessageChangesInput, SessionMessageMutation, SessionMessageMutationPage, SessionMessageMutationSubscriber, SessionMessageMutationUnsubscribe } from "../../types/session/SessionMessageMutation.js";
11
+ /** SessionRecorder 构造参数。 */
12
+ export interface SessionRecorderOptions {
13
+ /** 当前 Session 标识。 */
14
+ session_id: string;
15
+ /** 单一 JSONL Mutation store。 */
16
+ store: JsonlSessionMessageStore;
17
+ /** Mutation 成功提交后的发布函数。 */
18
+ publish: (mutation: SessionMessageMutation) => void;
19
+ }
20
+ /** User Message 创建参数。 */
21
+ export interface AppendSessionUserMessageInput {
22
+ /** 当前输入所属 turn。 */
23
+ turn_id: string;
24
+ /** 普通 prompt 或 steering 输入。 */
25
+ input_type: "prompt" | "steer";
26
+ /** User 结构化 parts。 */
27
+ parts: SessionUserMessagePart[];
28
+ /** 可选指定 Message ID,通常由 Recorder 生成。 */
29
+ message_id?: string;
30
+ /** 默认展示范围。 */
31
+ visibility?: "visible" | "internal";
32
+ }
33
+ /** Assistant Message 创建参数。 */
34
+ export interface OpenSessionAssistantMessageInput {
35
+ /** 当前 assistant 所属 turn。 */
36
+ turn_id: string;
37
+ /** 当前 assistant 在 turn 内的 segment 序号。 */
38
+ segment_index: number;
39
+ /** 普通 assistant 或 compact summary。 */
40
+ kind?: "normal" | "summary";
41
+ /** 默认展示范围。 */
42
+ visibility?: "visible" | "internal";
43
+ /** 可选指定 Message ID。 */
44
+ message_id?: string;
45
+ /** Summary 已覆盖到的来源 Message。 */
46
+ summary_through_message_id?: string;
47
+ }
48
+ /** 已完成 Assistant Message 直接写入参数。 */
49
+ export interface AppendCompletedAssistantMessageInput {
50
+ /** Assistant 所属 turn。 */
51
+ turn_id?: string;
52
+ /** Assistant 完整 parts。 */
53
+ parts: SessionAssistantMessagePart[];
54
+ /** 普通 assistant 或 compact summary。 */
55
+ kind?: "normal" | "summary";
56
+ /** 默认展示范围。 */
57
+ visibility?: "visible" | "internal";
58
+ /** Summary 已覆盖到的来源 Message。 */
59
+ summary_through_message_id?: string;
60
+ }
61
+ /** Action Message 创建参数。 */
62
+ export interface OpenSessionActionMessageInput {
63
+ /** 可选稳定 Message ID;业务 action 生命周期使用该值定位。 */
64
+ message_id?: string;
65
+ /** Action 所属 turn。 */
66
+ turn_id?: string;
67
+ /** Action 业务类型。 */
68
+ action_type: string;
69
+ /** Action 标题。 */
70
+ title: string;
71
+ /** Action 描述。 */
72
+ description?: string;
73
+ /** Action 附加数据。 */
74
+ data?: JsonObject;
75
+ }
76
+ /** Error Message 创建参数。 */
77
+ export interface AppendSessionErrorMessageInput {
78
+ /** 错误影响范围。 */
79
+ scope: "session" | "turn";
80
+ /** 错误所属 turn。 */
81
+ turn_id?: string;
82
+ /** 稳定错误码。 */
83
+ code: string;
84
+ /** 用户可见错误文本。 */
85
+ message: string;
86
+ /** 是否允许恢复。 */
87
+ recoverable: boolean;
88
+ }
89
+ /** 唯一 Session Message 写入服务。 */
90
+ export declare class SessionRecorder {
91
+ readonly session_id: string;
92
+ private readonly store;
93
+ private readonly publish;
94
+ private readonly subscribers;
95
+ private readonly messages_by_id;
96
+ private initialized;
97
+ constructor(options: SessionRecorderOptions);
98
+ /** 重放已有 Mutation,并收口进程中断遗留的运行状态。 */
99
+ initialize(): Promise<void>;
100
+ /** 同步读取当前内存 Message。 */
101
+ get_message(message_id: string): SessionMessage | undefined;
102
+ /** 追加普通 prompt 或 steering User Message。 */
103
+ append_user_message(input: AppendSessionUserMessageInput): Promise<SessionUserMessage>;
104
+ /** 创建可持续接收 chunk 的 Assistant segment。 */
105
+ open_assistant_message(input: OpenSessionAssistantMessageInput): Promise<SessionAssistantMessageWriter>;
106
+ /** 直接写入一条已完成 Assistant Message。 */
107
+ append_completed_assistant_message(input: AppendCompletedAssistantMessageInput): Promise<SessionAssistantMessage>;
108
+ /** 创建 running Action Message。 */
109
+ open_action_message(input: OpenSessionActionMessageInput): Promise<SessionActionMessageWriter>;
110
+ /** 更新 Action 状态,同时保持 message_id 与 sequence 不变。 */
111
+ update_action_message(message_id: string, status: "running" | "completed" | "failed", changes?: {
112
+ title?: string;
113
+ description?: string;
114
+ data?: JsonObject;
115
+ }): Promise<SessionActionMessage>;
116
+ /** 创建用户可见 Error Message。 */
117
+ append_error_message(input: AppendSessionErrorMessageInput): Promise<SessionErrorMessage>;
118
+ /** 读取折叠后的 Message snapshot。 */
119
+ list_messages(input?: ListSessionMessagesInput): Promise<SessionMessagePage>;
120
+ /** 从指定 commit_sequence 增量读取 Mutation。 */
121
+ list_message_changes(input: ListSessionMessageChangesInput): Promise<SessionMessageMutationPage>;
122
+ /** 订阅已成功持久化的未来 Mutation。 */
123
+ subscribe(subscriber: SessionMessageMutationSubscriber): SessionMessageMutationUnsubscribe;
124
+ /** 向当前 Session 导入 fork 来源 Message,并重新分配全部身份和顺序。 */
125
+ import_messages(messages: SessionMessage[]): Promise<void>;
126
+ /** @internal 写入 Assistant 原始文本 delta。 */
127
+ append_assistant_delta(message_id: string, part_id: string, type: "text" | "reasoning", delta: string): Promise<void>;
128
+ /** @internal 写入 Assistant 完整 part。 */
129
+ update_assistant_part(message_id: string, part: SessionAssistantMessagePart): Promise<void>;
130
+ /** @internal 收口 Assistant Message。 */
131
+ complete_assistant_message(message_id: string, status: "completed" | "stopped" | "failed"): Promise<void>;
132
+ private create_message;
133
+ private build_message_mutation;
134
+ private accept_mutation;
135
+ private ensure_initialized;
136
+ }
137
+ /** 单个 Assistant segment 的流式 writer。 */
138
+ export declare class SessionAssistantMessageWriter {
139
+ readonly message_id: string;
140
+ private readonly recorder;
141
+ private closed;
142
+ constructor(recorder: SessionRecorder, message_id: string);
143
+ /** 应用一个原始 AI SDK UI chunk。 */
144
+ apply_chunk(chunk: UIMessageChunk): Promise<void>;
145
+ /** 写入一个完整 Assistant part。 */
146
+ upsert_part(part: SessionAssistantMessagePart): Promise<void>;
147
+ /** 当前实现逐 chunk 等待落盘,因此 flush 在返回时天然完成。 */
148
+ flush(): Promise<void>;
149
+ /** 正常完成当前 assistant segment。 */
150
+ complete(): Promise<void>;
151
+ /** 停止当前 assistant segment,并保留已有 parts。 */
152
+ stop(): Promise<void>;
153
+ /** 以失败状态关闭当前 assistant segment。 */
154
+ fail(_error: unknown): Promise<void>;
155
+ private current_message;
156
+ private find_tool;
157
+ private upsert_tool;
158
+ private close;
159
+ }
160
+ /** 单个 Action Message 的生命周期 writer。 */
161
+ export declare class SessionActionMessageWriter {
162
+ readonly message_id: string;
163
+ private readonly recorder;
164
+ private closed;
165
+ constructor(recorder: SessionRecorder, message_id: string);
166
+ /** 把 Action 更新为 completed。 */
167
+ complete(input?: {
168
+ title?: string;
169
+ description?: string;
170
+ data?: JsonObject;
171
+ }): Promise<void>;
172
+ /** 把 Action 更新为 failed。 */
173
+ fail(error: unknown): Promise<void>;
174
+ }
175
+ /** 把 AI SDK User parts 归一为 canonical User parts。 */
176
+ export declare function normalize_session_user_parts(parts: UIMessage["parts"] | null | undefined): SessionUserMessagePart[];
177
+ //# sourceMappingURL=SessionRecorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionRecorder.d.ts","sourceRoot":"","sources":["../../../src/session/recorder/SessionRecorder.ts"],"names":[],"mappings":"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"}