@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
@@ -1,32 +0,0 @@
1
- /**
2
- * Session 事件映射辅助。
3
- *
4
- * 关键点(中文)
5
- * - 把底层 AI SDK `UIMessageChunk` 归一到内部 `InternalUiChunkEvent`。
6
- * - 再把内部 chunk 事件转换为 `session.subscribe()` 可见的 Session 事件。
7
- */
8
- import type { UIMessageChunk } from "ai";
9
- import type { AgentSessionEvent } from "../types/sdk/AgentSessionEvent.js";
10
- import type { InternalUiChunkEvent } from "../types/sdk/InternalUiChunkEvent.js";
11
- /**
12
- * 把单个 UI chunk 映射为内部 chunk 事件。
13
- */
14
- export declare function mapUiMessageChunkToAgentEvent(chunk: UIMessageChunk): InternalUiChunkEvent | null;
15
- /**
16
- * 把内部 chunk 事件映射为 Session actor 事件。
17
- *
18
- * 关键点(中文)
19
- * - Session 级事件只保留 turn 维度所需的最小字段。
20
- * - `finish` 与通用 `error` 由 turn 生命周期统一表达,不在这里直接透出。
21
- */
22
- export declare function mapAgentEventToSessionEvent(params: {
23
- /**
24
- * 当前内部 chunk 事件。
25
- */
26
- event: InternalUiChunkEvent;
27
- /**
28
- * 当前 turn 标识。
29
- */
30
- turnId: string;
31
- }): AgentSessionEvent | null;
32
- //# sourceMappingURL=SessionEventMapper.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SessionEventMapper.d.ts","sourceRoot":"","sources":["../../src/session/SessionEventMapper.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AAEzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAmBhF;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,cAAc,GACpB,oBAAoB,GAAG,IAAI,CA4D7B;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD;;OAEG;IACH,KAAK,EAAE,oBAAoB,CAAC;IAC5B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,iBAAiB,GAAG,IAAI,CAkC3B"}
@@ -1,131 +0,0 @@
1
- /**
2
- * Session 事件映射辅助。
3
- *
4
- * 关键点(中文)
5
- * - 把底层 AI SDK `UIMessageChunk` 归一到内部 `InternalUiChunkEvent`。
6
- * - 再把内部 chunk 事件转换为 `session.subscribe()` 可见的 Session 事件。
7
- */
8
- function toJsonValue(value) {
9
- if (value === undefined)
10
- return null;
11
- if (value === null)
12
- return null;
13
- if (typeof value === "string" ||
14
- typeof value === "number" ||
15
- typeof value === "boolean") {
16
- return value;
17
- }
18
- try {
19
- return JSON.parse(JSON.stringify(value));
20
- }
21
- catch {
22
- return String(value);
23
- }
24
- }
25
- /**
26
- * 把单个 UI chunk 映射为内部 chunk 事件。
27
- */
28
- export function mapUiMessageChunkToAgentEvent(chunk) {
29
- switch (chunk.type) {
30
- case "text-delta":
31
- return {
32
- type: "text-delta",
33
- text: chunk.delta,
34
- };
35
- case "reasoning-delta":
36
- return {
37
- type: "reasoning-delta",
38
- text: chunk.delta,
39
- };
40
- case "tool-input-available":
41
- return {
42
- type: "tool-call",
43
- toolCallId: chunk.toolCallId,
44
- toolName: chunk.toolName,
45
- args: toJsonValue(chunk.input),
46
- };
47
- case "tool-output-available":
48
- return {
49
- type: "tool-result",
50
- toolCallId: chunk.toolCallId,
51
- toolName: "unknown",
52
- result: toJsonValue(chunk.output),
53
- };
54
- case "tool-output-error":
55
- return {
56
- type: "tool-error",
57
- toolCallId: chunk.toolCallId,
58
- toolName: "unknown",
59
- error: chunk.errorText,
60
- };
61
- case "tool-input-error":
62
- return {
63
- type: "tool-error",
64
- toolCallId: chunk.toolCallId,
65
- toolName: chunk.toolName,
66
- error: chunk.errorText,
67
- };
68
- case "finish":
69
- return {
70
- type: "finish",
71
- ...(typeof chunk.finishReason === "string"
72
- ? { finishReason: chunk.finishReason }
73
- : {}),
74
- };
75
- case "error":
76
- return {
77
- type: "error",
78
- error: chunk.errorText,
79
- };
80
- case "abort":
81
- return {
82
- type: "error",
83
- error: String(chunk.reason || "execution aborted"),
84
- };
85
- default:
86
- return null;
87
- }
88
- }
89
- /**
90
- * 把内部 chunk 事件映射为 Session actor 事件。
91
- *
92
- * 关键点(中文)
93
- * - Session 级事件只保留 turn 维度所需的最小字段。
94
- * - `finish` 与通用 `error` 由 turn 生命周期统一表达,不在这里直接透出。
95
- */
96
- export function mapAgentEventToSessionEvent(params) {
97
- const { event, turnId } = params;
98
- switch (event.type) {
99
- case "text-delta":
100
- return {
101
- type: "text-delta",
102
- turnId,
103
- text: event.text,
104
- };
105
- case "reasoning-delta":
106
- return {
107
- type: "reasoning-delta",
108
- turnId,
109
- text: event.text,
110
- };
111
- case "tool-call":
112
- return {
113
- type: "tool-call",
114
- turnId,
115
- toolCallId: event.toolCallId,
116
- toolName: event.toolName,
117
- args: event.args,
118
- };
119
- case "tool-result":
120
- return {
121
- type: "tool-result",
122
- turnId,
123
- toolCallId: event.toolCallId,
124
- toolName: event.toolName,
125
- result: event.result,
126
- };
127
- default:
128
- return null;
129
- }
130
- }
131
- //# sourceMappingURL=SessionEventMapper.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SessionEventMapper.js","sourceRoot":"","sources":["../../src/session/SessionEventMapper.ts"],"names":[],"mappings":"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"}
@@ -1,100 +0,0 @@
1
- /**
2
- * SDK 内部 UI chunk 事件类型定义。
3
- *
4
- * 关键点(中文)
5
- * - 这是 Session 事件映射器的内部中间态,不从包根入口导出。
6
- * - 它只负责承接底层 AI SDK `UIMessageChunk`,再转成 `AgentSessionEvent`。
7
- */
8
- import type { JsonValue } from "../../types/common/Json.js";
9
- /**
10
- * SDK 内部 UI chunk 事件。
11
- */
12
- export type InternalUiChunkEvent = {
13
- /**
14
- * 文本增量事件。
15
- */
16
- type: "text-delta";
17
- /**
18
- * 当前追加的文本片段。
19
- */
20
- text: string;
21
- } | {
22
- /**
23
- * reasoning 增量事件。
24
- */
25
- type: "reasoning-delta";
26
- /**
27
- * 当前追加的 reasoning 文本片段。
28
- */
29
- text: string;
30
- } | {
31
- /**
32
- * 工具调用可用事件。
33
- */
34
- type: "tool-call";
35
- /**
36
- * 当前工具调用唯一标识。
37
- */
38
- toolCallId: string;
39
- /**
40
- * 工具名称。
41
- */
42
- toolName: string;
43
- /**
44
- * 工具输入参数。
45
- */
46
- args: JsonValue;
47
- } | {
48
- /**
49
- * 工具调用结果事件。
50
- */
51
- type: "tool-result";
52
- /**
53
- * 当前工具调用唯一标识。
54
- */
55
- toolCallId: string;
56
- /**
57
- * 工具名称。
58
- */
59
- toolName: string;
60
- /**
61
- * 工具输出结果。
62
- */
63
- result: JsonValue;
64
- } | {
65
- /**
66
- * 工具调用失败事件。
67
- */
68
- type: "tool-error";
69
- /**
70
- * 当前工具调用唯一标识。
71
- */
72
- toolCallId: string;
73
- /**
74
- * 工具名称。
75
- */
76
- toolName: string;
77
- /**
78
- * 错误文本。
79
- */
80
- error: string;
81
- } | {
82
- /**
83
- * 运行结束事件。
84
- */
85
- type: "finish";
86
- /**
87
- * 最终完成原因(若底层可提供)。
88
- */
89
- finishReason?: string;
90
- } | {
91
- /**
92
- * 运行错误事件。
93
- */
94
- type: "error";
95
- /**
96
- * 错误文本。
97
- */
98
- error: string;
99
- };
100
- //# sourceMappingURL=InternalUiChunkEvent.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"InternalUiChunkEvent.d.ts","sourceRoot":"","sources":["../../../src/types/sdk/InternalUiChunkEvent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAC5B;IACE;;OAEG;IACH,IAAI,EAAE,YAAY,CAAC;IACnB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE;;OAEG;IACH,IAAI,EAAE,iBAAiB,CAAC;IACxB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE;;OAEG;IACH,IAAI,EAAE,WAAW,CAAC;IAClB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,IAAI,EAAE,SAAS,CAAC;CACjB,GACD;IACE;;OAEG;IACH,IAAI,EAAE,aAAa,CAAC;IACpB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,MAAM,EAAE,SAAS,CAAC;CACnB,GACD;IACE;;OAEG;IACH,IAAI,EAAE,YAAY,CAAC;IACnB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf,GACD;IACE;;OAEG;IACH,IAAI,EAAE,QAAQ,CAAC;IACf;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GACD;IACE;;OAEG;IACH,IAAI,EAAE,OAAO,CAAC;IACd;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf,CAAC"}
@@ -1,9 +0,0 @@
1
- /**
2
- * SDK 内部 UI chunk 事件类型定义。
3
- *
4
- * 关键点(中文)
5
- * - 这是 Session 事件映射器的内部中间态,不从包根入口导出。
6
- * - 它只负责承接底层 AI SDK `UIMessageChunk`,再转成 `AgentSessionEvent`。
7
- */
8
- export {};
9
- //# sourceMappingURL=InternalUiChunkEvent.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"InternalUiChunkEvent.js","sourceRoot":"","sources":["../../../src/types/sdk/InternalUiChunkEvent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -1,188 +0,0 @@
1
- /**
2
- * @file 验证 session.records 的 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.records 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.sessions.create({
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.records({
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.records({
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.records({
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.records({
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.records({
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
- });
@@ -1,148 +0,0 @@
1
- /**
2
- * Session 事件映射辅助。
3
- *
4
- * 关键点(中文)
5
- * - 把底层 AI SDK `UIMessageChunk` 归一到内部 `InternalUiChunkEvent`。
6
- * - 再把内部 chunk 事件转换为 `session.subscribe()` 可见的 Session 事件。
7
- */
8
-
9
- import type { UIMessageChunk } from "ai";
10
- import type { JsonValue } from "@/types/common/Json.js";
11
- import type { AgentSessionEvent } from "@/types/sdk/AgentSessionEvent.js";
12
- import type { InternalUiChunkEvent } from "@/types/sdk/InternalUiChunkEvent.js";
13
-
14
- function toJsonValue(value: unknown): JsonValue {
15
- if (value === undefined) return null;
16
- if (value === null) return null;
17
- if (
18
- typeof value === "string" ||
19
- typeof value === "number" ||
20
- typeof value === "boolean"
21
- ) {
22
- return value;
23
- }
24
- try {
25
- return JSON.parse(JSON.stringify(value)) as JsonValue;
26
- } catch {
27
- return String(value);
28
- }
29
- }
30
-
31
- /**
32
- * 把单个 UI chunk 映射为内部 chunk 事件。
33
- */
34
- export function mapUiMessageChunkToAgentEvent(
35
- chunk: UIMessageChunk,
36
- ): InternalUiChunkEvent | null {
37
- switch (chunk.type) {
38
- case "text-delta":
39
- return {
40
- type: "text-delta",
41
- text: chunk.delta,
42
- };
43
- case "reasoning-delta":
44
- return {
45
- type: "reasoning-delta",
46
- text: chunk.delta,
47
- };
48
- case "tool-input-available":
49
- return {
50
- type: "tool-call",
51
- toolCallId: chunk.toolCallId,
52
- toolName: chunk.toolName,
53
- args: toJsonValue(chunk.input),
54
- };
55
- case "tool-output-available":
56
- return {
57
- type: "tool-result",
58
- toolCallId: chunk.toolCallId,
59
- toolName: "unknown",
60
- result: toJsonValue(chunk.output),
61
- };
62
- case "tool-output-error":
63
- return {
64
- type: "tool-error",
65
- toolCallId: chunk.toolCallId,
66
- toolName: "unknown",
67
- error: chunk.errorText,
68
- };
69
- case "tool-input-error":
70
- return {
71
- type: "tool-error",
72
- toolCallId: chunk.toolCallId,
73
- toolName: chunk.toolName,
74
- error: chunk.errorText,
75
- };
76
- case "finish":
77
- return {
78
- type: "finish",
79
- ...(typeof chunk.finishReason === "string"
80
- ? { finishReason: chunk.finishReason }
81
- : {}),
82
- };
83
- case "error":
84
- return {
85
- type: "error",
86
- error: chunk.errorText,
87
- };
88
- case "abort":
89
- return {
90
- type: "error",
91
- error: String(chunk.reason || "execution aborted"),
92
- };
93
- default:
94
- return null;
95
- }
96
- }
97
-
98
- /**
99
- * 把内部 chunk 事件映射为 Session actor 事件。
100
- *
101
- * 关键点(中文)
102
- * - Session 级事件只保留 turn 维度所需的最小字段。
103
- * - `finish` 与通用 `error` 由 turn 生命周期统一表达,不在这里直接透出。
104
- */
105
- export function mapAgentEventToSessionEvent(params: {
106
- /**
107
- * 当前内部 chunk 事件。
108
- */
109
- event: InternalUiChunkEvent;
110
- /**
111
- * 当前 turn 标识。
112
- */
113
- turnId: string;
114
- }): AgentSessionEvent | null {
115
- const { event, turnId } = params;
116
- switch (event.type) {
117
- case "text-delta":
118
- return {
119
- type: "text-delta",
120
- turnId,
121
- text: event.text,
122
- };
123
- case "reasoning-delta":
124
- return {
125
- type: "reasoning-delta",
126
- turnId,
127
- text: event.text,
128
- };
129
- case "tool-call":
130
- return {
131
- type: "tool-call",
132
- turnId,
133
- toolCallId: event.toolCallId,
134
- toolName: event.toolName,
135
- args: event.args,
136
- };
137
- case "tool-result":
138
- return {
139
- type: "tool-result",
140
- turnId,
141
- toolCallId: event.toolCallId,
142
- toolName: event.toolName,
143
- result: event.result,
144
- };
145
- default:
146
- return null;
147
- }
148
- }