@downcity/agent 1.1.217 → 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 (147) hide show
  1. package/bin/agent/local/services/AgentSessions.d.ts.map +1 -1
  2. package/bin/agent/local/services/AgentSessions.js +1 -4
  3. package/bin/agent/local/services/AgentSessions.js.map +1 -1
  4. package/bin/agent/remote/RemoteSession.d.ts +9 -3
  5. package/bin/agent/remote/RemoteSession.d.ts.map +1 -1
  6. package/bin/agent/remote/RemoteSession.js +19 -4
  7. package/bin/agent/remote/RemoteSession.js.map +1 -1
  8. package/bin/agent/remote/RemoteTransport.d.ts +7 -3
  9. package/bin/agent/remote/RemoteTransport.d.ts.map +1 -1
  10. package/bin/agent/remote/transports/HttpRemoteAgentTransport.d.ts +5 -2
  11. package/bin/agent/remote/transports/HttpRemoteAgentTransport.d.ts.map +1 -1
  12. package/bin/agent/remote/transports/HttpRemoteAgentTransport.js +25 -11
  13. package/bin/agent/remote/transports/HttpRemoteAgentTransport.js.map +1 -1
  14. package/bin/agent/remote/transports/RpcRemoteAgentTransport.d.ts +5 -2
  15. package/bin/agent/remote/transports/RpcRemoteAgentTransport.d.ts.map +1 -1
  16. package/bin/agent/remote/transports/RpcRemoteAgentTransport.js +5 -2
  17. package/bin/agent/remote/transports/RpcRemoteAgentTransport.js.map +1 -1
  18. package/bin/executor/types/SessionRecords.d.ts +2 -0
  19. package/bin/executor/types/SessionRecords.d.ts.map +1 -1
  20. package/bin/executor/types/SessionRecords.js.map +1 -1
  21. package/bin/index.d.ts +5 -2
  22. package/bin/index.d.ts.map +1 -1
  23. package/bin/index.js +1 -0
  24. package/bin/index.js.map +1 -1
  25. package/bin/rpc/Client.d.ts +11 -4
  26. package/bin/rpc/Client.d.ts.map +1 -1
  27. package/bin/rpc/Client.js +14 -3
  28. package/bin/rpc/Client.js.map +1 -1
  29. package/bin/session/Session.d.ts +13 -3
  30. package/bin/session/Session.d.ts.map +1 -1
  31. package/bin/session/Session.js +47 -18
  32. package/bin/session/Session.js.map +1 -1
  33. package/bin/session/recorder/JsonlSessionMessageStore.d.ts +45 -0
  34. package/bin/session/recorder/JsonlSessionMessageStore.d.ts.map +1 -0
  35. package/bin/session/recorder/JsonlSessionMessageStore.js +127 -0
  36. package/bin/session/recorder/JsonlSessionMessageStore.js.map +1 -0
  37. package/bin/session/recorder/SessionMessageCodec.d.ts +20 -0
  38. package/bin/session/recorder/SessionMessageCodec.d.ts.map +1 -0
  39. package/bin/session/recorder/SessionMessageCodec.js +252 -0
  40. package/bin/session/recorder/SessionMessageCodec.js.map +1 -0
  41. package/bin/session/recorder/SessionMessageReducer.d.ts +12 -0
  42. package/bin/session/recorder/SessionMessageReducer.d.ts.map +1 -0
  43. package/bin/session/recorder/SessionMessageReducer.js +109 -0
  44. package/bin/session/recorder/SessionMessageReducer.js.map +1 -0
  45. package/bin/session/recorder/SessionRecorder.d.ts +177 -0
  46. package/bin/session/recorder/SessionRecorder.d.ts.map +1 -0
  47. package/bin/session/recorder/SessionRecorder.js +610 -0
  48. package/bin/session/recorder/SessionRecorder.js.map +1 -0
  49. package/bin/session/recorder/SessionRecorderCompaction.d.ts +18 -0
  50. package/bin/session/recorder/SessionRecorderCompaction.d.ts.map +1 -0
  51. package/bin/session/recorder/SessionRecorderCompaction.js +141 -0
  52. package/bin/session/recorder/SessionRecorderCompaction.js.map +1 -0
  53. package/bin/session/recorder/SessionRecorderHistoryStore.d.ts +66 -0
  54. package/bin/session/recorder/SessionRecorderHistoryStore.d.ts.map +1 -0
  55. package/bin/session/recorder/SessionRecorderHistoryStore.js +195 -0
  56. package/bin/session/recorder/SessionRecorderHistoryStore.js.map +1 -0
  57. package/bin/session/runtime/SessionMessageEventHub.d.ts +15 -0
  58. package/bin/session/runtime/SessionMessageEventHub.d.ts.map +1 -0
  59. package/bin/session/runtime/SessionMessageEventHub.js +28 -0
  60. package/bin/session/runtime/SessionMessageEventHub.js.map +1 -0
  61. package/bin/session/runtime/SessionPromptRuntime.d.ts +7 -13
  62. package/bin/session/runtime/SessionPromptRuntime.d.ts.map +1 -1
  63. package/bin/session/runtime/SessionPromptRuntime.js +13 -13
  64. package/bin/session/runtime/SessionPromptRuntime.js.map +1 -1
  65. package/bin/session/services/SessionStateService.d.ts +7 -3
  66. package/bin/session/services/SessionStateService.d.ts.map +1 -1
  67. package/bin/session/services/SessionStateService.js +132 -72
  68. package/bin/session/services/SessionStateService.js.map +1 -1
  69. package/bin/session/services/SessionTurnService.d.ts +4 -0
  70. package/bin/session/services/SessionTurnService.d.ts.map +1 -1
  71. package/bin/session/services/SessionTurnService.js +82 -52
  72. package/bin/session/services/SessionTurnService.js.map +1 -1
  73. package/bin/session/services/SessionViewService.d.ts +8 -3
  74. package/bin/session/services/SessionViewService.d.ts.map +1 -1
  75. package/bin/session/services/SessionViewService.js +10 -5
  76. package/bin/session/services/SessionViewService.js.map +1 -1
  77. package/bin/session/storage/Persistence.d.ts +6 -0
  78. package/bin/session/storage/Persistence.d.ts.map +1 -1
  79. package/bin/session/storage/Persistence.js +7 -0
  80. package/bin/session/storage/Persistence.js.map +1 -1
  81. package/bin/session/storage/RuntimeSessionPort.d.ts +3 -2
  82. package/bin/session/storage/RuntimeSessionPort.d.ts.map +1 -1
  83. package/bin/session/storage/RuntimeSessionPort.js.map +1 -1
  84. package/bin/types/agent/SessionActor.d.ts +10 -4
  85. package/bin/types/agent/SessionActor.d.ts.map +1 -1
  86. package/bin/types/rpc/RpcProtocol.d.ts +20 -6
  87. package/bin/types/rpc/RpcProtocol.d.ts.map +1 -1
  88. package/bin/types/runtime/agent/AgentContext.d.ts +4 -3
  89. package/bin/types/runtime/agent/AgentContext.d.ts.map +1 -1
  90. package/bin/types/runtime/agent/AgentContext.js.map +1 -1
  91. package/bin/types/sdk/AgentSessionEvent.d.ts +2 -1
  92. package/bin/types/sdk/AgentSessionEvent.d.ts.map +1 -1
  93. package/bin/types/session/SessionMessage.d.ts +217 -0
  94. package/bin/types/session/SessionMessage.d.ts.map +1 -0
  95. package/bin/types/session/SessionMessage.js +8 -0
  96. package/bin/types/session/SessionMessage.js.map +1 -0
  97. package/bin/types/session/SessionMessageMutation.d.ts +92 -0
  98. package/bin/types/session/SessionMessageMutation.d.ts.map +1 -0
  99. package/bin/types/session/SessionMessageMutation.js +21 -0
  100. package/bin/types/session/SessionMessageMutation.js.map +1 -0
  101. package/package.json +3 -3
  102. package/scripts/agent-env.test.mjs +4 -4
  103. package/scripts/session-action-message.test.mjs +98 -27
  104. package/scripts/session-list-title.test.mjs +6 -19
  105. package/scripts/session-prompt-runtime.test.mjs +4 -16
  106. package/scripts/session-recorder.test.mjs +245 -0
  107. package/scripts/session-title-event.test.mjs +10 -18
  108. package/src/agent/local/services/AgentSessions.ts +1 -3
  109. package/src/agent/remote/RemoteSession.ts +35 -7
  110. package/src/agent/remote/RemoteTransport.ts +17 -6
  111. package/src/agent/remote/transports/HttpRemoteAgentTransport.ts +45 -13
  112. package/src/agent/remote/transports/RpcRemoteAgentTransport.ts +19 -6
  113. package/src/executor/types/SessionRecords.ts +2 -0
  114. package/src/index.ts +23 -5
  115. package/src/rpc/Client.ts +29 -8
  116. package/src/session/Session.ts +65 -31
  117. package/src/session/recorder/JsonlSessionMessageStore.ts +162 -0
  118. package/src/session/recorder/SessionMessageCodec.ts +279 -0
  119. package/src/session/recorder/SessionMessageReducer.ts +155 -0
  120. package/src/session/recorder/SessionRecorder.ts +812 -0
  121. package/src/session/recorder/SessionRecorderCompaction.ts +187 -0
  122. package/src/session/recorder/SessionRecorderHistoryStore.ts +276 -0
  123. package/src/session/runtime/SessionMessageEventHub.ts +35 -0
  124. package/src/session/runtime/SessionPromptRuntime.ts +23 -24
  125. package/src/session/services/SessionStateService.ts +151 -80
  126. package/src/session/services/SessionTurnService.ts +88 -59
  127. package/src/session/services/SessionViewService.ts +25 -13
  128. package/src/session/storage/Persistence.ts +13 -0
  129. package/src/session/storage/RuntimeSessionPort.ts +6 -4
  130. package/src/types/agent/SessionActor.ts +26 -6
  131. package/src/types/rpc/RpcProtocol.ts +20 -6
  132. package/src/types/runtime/agent/AgentContext.ts +8 -2
  133. package/src/types/sdk/AgentSessionEvent.ts +2 -0
  134. package/src/types/session/SessionMessage.ts +247 -0
  135. package/src/types/session/SessionMessageMutation.ts +121 -0
  136. package/tsconfig.tsbuildinfo +1 -1
  137. package/bin/session/SessionEventMapper.d.ts +0 -32
  138. package/bin/session/SessionEventMapper.d.ts.map +0 -1
  139. package/bin/session/SessionEventMapper.js +0 -131
  140. package/bin/session/SessionEventMapper.js.map +0 -1
  141. package/bin/types/sdk/InternalUiChunkEvent.d.ts +0 -100
  142. package/bin/types/sdk/InternalUiChunkEvent.d.ts.map +0 -1
  143. package/bin/types/sdk/InternalUiChunkEvent.js +0 -9
  144. package/bin/types/sdk/InternalUiChunkEvent.js.map +0 -1
  145. package/scripts/session-history-archive.test.mjs +0 -188
  146. package/src/session/SessionEventMapper.ts +0 -148
  147. 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
- }