@downcity/agent 1.1.222 → 1.1.226
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.
- package/bin/agent/local/Agent.d.ts +1 -34
- package/bin/agent/local/Agent.d.ts.map +1 -1
- package/bin/agent/local/Agent.js +1 -44
- package/bin/agent/local/Agent.js.map +1 -1
- package/bin/agent/local/services/AgentAssemblyService.d.ts.map +1 -1
- package/bin/agent/local/services/AgentAssemblyService.js +35 -2
- package/bin/agent/local/services/AgentAssemblyService.js.map +1 -1
- package/bin/agent/local/services/AgentSessions.d.ts +6 -0
- package/bin/agent/local/services/AgentSessions.d.ts.map +1 -1
- package/bin/agent/local/services/AgentSessions.js +42 -0
- package/bin/agent/local/services/AgentSessions.js.map +1 -1
- package/bin/agent/remote/RemoteAgent.d.ts +1 -35
- package/bin/agent/remote/RemoteAgent.d.ts.map +1 -1
- package/bin/agent/remote/RemoteAgent.js +1 -37
- package/bin/agent/remote/RemoteAgent.js.map +1 -1
- package/bin/agent/remote/RemoteSession.d.ts +24 -45
- package/bin/agent/remote/RemoteSession.d.ts.map +1 -1
- package/bin/agent/remote/RemoteSession.js +74 -121
- package/bin/agent/remote/RemoteSession.js.map +1 -1
- package/bin/agent/remote/RemoteTransport.d.ts +11 -27
- package/bin/agent/remote/RemoteTransport.d.ts.map +1 -1
- package/bin/agent/remote/transports/HttpRemoteAgentTransport.d.ts +7 -21
- package/bin/agent/remote/transports/HttpRemoteAgentTransport.d.ts.map +1 -1
- package/bin/agent/remote/transports/HttpRemoteAgentTransport.js +11 -47
- package/bin/agent/remote/transports/HttpRemoteAgentTransport.js.map +1 -1
- package/bin/agent/remote/transports/RpcRemoteAgentTransport.d.ts +7 -20
- package/bin/agent/remote/transports/RpcRemoteAgentTransport.d.ts.map +1 -1
- package/bin/agent/remote/transports/RpcRemoteAgentTransport.js +8 -17
- package/bin/agent/remote/transports/RpcRemoteAgentTransport.js.map +1 -1
- package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.js +2 -2
- package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.js.map +1 -1
- package/bin/executor/types/SessionHistoryPaths.d.ts +1 -1
- package/bin/index.d.ts +3 -3
- package/bin/index.d.ts.map +1 -1
- package/bin/index.js +1 -1
- package/bin/index.js.map +1 -1
- package/bin/rpc/Client.d.ts +7 -36
- package/bin/rpc/Client.d.ts.map +1 -1
- package/bin/rpc/Client.js +28 -78
- package/bin/rpc/Client.js.map +1 -1
- package/bin/session/Session.d.ts +16 -8
- package/bin/session/Session.d.ts.map +1 -1
- package/bin/session/Session.js +66 -21
- package/bin/session/Session.js.map +1 -1
- package/bin/session/browse/Browse.d.ts.map +1 -1
- package/bin/session/browse/Browse.js +49 -18
- package/bin/session/browse/Browse.js.map +1 -1
- package/bin/session/recorder/JsonlSessionMessageStore.d.ts +30 -24
- package/bin/session/recorder/JsonlSessionMessageStore.d.ts.map +1 -1
- package/bin/session/recorder/JsonlSessionMessageStore.js +163 -59
- package/bin/session/recorder/JsonlSessionMessageStore.js.map +1 -1
- package/bin/session/recorder/SessionMessageCodec.d.ts.map +1 -1
- package/bin/session/recorder/SessionMessageCodec.js +6 -1
- package/bin/session/recorder/SessionMessageCodec.js.map +1 -1
- package/bin/session/recorder/SessionRecorder.d.ts +23 -11
- package/bin/session/recorder/SessionRecorder.d.ts.map +1 -1
- package/bin/session/recorder/SessionRecorder.js +187 -112
- package/bin/session/recorder/SessionRecorder.js.map +1 -1
- package/bin/session/recorder/SessionRecorderCompaction.d.ts.map +1 -1
- package/bin/session/recorder/SessionRecorderCompaction.js +1 -0
- package/bin/session/recorder/SessionRecorderCompaction.js.map +1 -1
- package/bin/session/recorder/SessionRecorderHistoryStore.d.ts +5 -5
- package/bin/session/recorder/SessionRecorderHistoryStore.d.ts.map +1 -1
- package/bin/session/recorder/SessionRecorderHistoryStore.js +5 -5
- package/bin/session/recorder/SessionRecorderHistoryStore.js.map +1 -1
- package/bin/session/runtime/SessionEventHub.d.ts +12 -5
- package/bin/session/runtime/SessionEventHub.d.ts.map +1 -1
- package/bin/session/runtime/SessionEventHub.js +11 -6
- package/bin/session/runtime/SessionEventHub.js.map +1 -1
- package/bin/session/runtime/SessionPromptRuntime.d.ts +2 -2
- package/bin/session/runtime/SessionPromptRuntime.d.ts.map +1 -1
- package/bin/session/runtime/SessionPromptRuntime.js +35 -17
- package/bin/session/runtime/SessionPromptRuntime.js.map +1 -1
- package/bin/session/services/SessionStateService.d.ts +2 -2
- package/bin/session/services/SessionStateService.d.ts.map +1 -1
- package/bin/session/services/SessionStateService.js +6 -2
- package/bin/session/services/SessionStateService.js.map +1 -1
- package/bin/session/services/SessionTurnService.d.ts +2 -7
- package/bin/session/services/SessionTurnService.d.ts.map +1 -1
- package/bin/session/services/SessionTurnService.js +2 -8
- package/bin/session/services/SessionTurnService.js.map +1 -1
- package/bin/session/storage/Paths.d.ts +1 -1
- package/bin/session/storage/Paths.d.ts.map +1 -1
- package/bin/session/storage/Paths.js +2 -2
- package/bin/session/storage/Paths.js.map +1 -1
- package/bin/session/storage/RuntimeSessionPort.d.ts +3 -4
- package/bin/session/storage/RuntimeSessionPort.d.ts.map +1 -1
- package/bin/session/storage/RuntimeSessionPort.js +2 -2
- package/bin/session/storage/RuntimeSessionPort.js.map +1 -1
- package/bin/types/agent/SessionActor.d.ts +11 -7
- package/bin/types/agent/SessionActor.d.ts.map +1 -1
- package/bin/types/rpc/RpcProtocol.d.ts +35 -62
- package/bin/types/rpc/RpcProtocol.d.ts.map +1 -1
- package/bin/types/runtime/agent/AgentContext.d.ts +4 -4
- package/bin/types/runtime/agent/AgentContext.d.ts.map +1 -1
- package/bin/types/runtime/agent/AgentContext.js.map +1 -1
- package/bin/types/session/SessionApproval.d.ts +97 -0
- package/bin/types/session/SessionApproval.d.ts.map +1 -0
- package/bin/types/session/SessionApproval.js +7 -0
- package/bin/types/session/SessionApproval.js.map +1 -0
- package/bin/types/session/SessionMessage.d.ts +10 -4
- package/bin/types/session/SessionMessage.d.ts.map +1 -1
- package/bin/types/session/SessionMutation.d.ts +116 -0
- package/bin/types/session/SessionMutation.d.ts.map +1 -0
- package/bin/types/session/SessionMutation.js +19 -0
- package/bin/types/session/SessionMutation.js.map +1 -0
- package/bin/types/session/SessionOptions.d.ts +9 -0
- package/bin/types/session/SessionOptions.d.ts.map +1 -1
- package/package.json +3 -3
- package/scripts/remote-session-reconnect.test.mjs +7 -3
- package/scripts/session-history-inflight.test.mjs +2 -2
- package/scripts/session-prompt-runtime.test.mjs +3 -3
- package/scripts/session-recorder.test.mjs +141 -140
- package/src/agent/local/Agent.ts +1 -55
- package/src/agent/local/services/AgentAssemblyService.ts +39 -3
- package/src/agent/local/services/AgentSessions.ts +47 -0
- package/src/agent/remote/RemoteAgent.ts +1 -54
- package/src/agent/remote/RemoteSession.ts +105 -163
- package/src/agent/remote/RemoteTransport.ts +23 -34
- package/src/agent/remote/transports/HttpRemoteAgentTransport.ts +33 -90
- package/src/agent/remote/transports/RpcRemoteAgentTransport.ts +22 -39
- package/src/executor/store/history/jsonl/JsonlSessionHistoryStore.ts +2 -2
- package/src/executor/types/SessionHistoryPaths.ts +1 -1
- package/src/index.ts +20 -12
- package/src/rpc/Client.ts +48 -106
- package/src/session/Session.ts +91 -34
- package/src/session/browse/Browse.ts +51 -22
- package/src/session/recorder/JsonlSessionMessageStore.ts +170 -86
- package/src/session/recorder/SessionMessageCodec.ts +6 -1
- package/src/session/recorder/SessionRecorder.ts +228 -134
- package/src/session/recorder/SessionRecorderCompaction.ts +1 -0
- package/src/session/recorder/SessionRecorderHistoryStore.ts +5 -5
- package/src/session/runtime/SessionEventHub.ts +25 -12
- package/src/session/runtime/SessionPromptRuntime.ts +37 -19
- package/src/session/services/SessionStateService.ts +8 -6
- package/src/session/services/SessionTurnService.ts +3 -14
- package/src/session/storage/Paths.ts +2 -2
- package/src/session/storage/RuntimeSessionPort.ts +8 -11
- package/src/types/agent/SessionActor.ts +23 -20
- package/src/types/rpc/RpcProtocol.ts +34 -71
- package/src/types/runtime/agent/AgentContext.ts +7 -11
- package/src/types/session/SessionApproval.ts +108 -0
- package/src/types/session/SessionMessage.ts +10 -4
- package/src/types/session/SessionMutation.ts +141 -0
- package/src/types/session/SessionOptions.ts +25 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/bin/session/recorder/SessionMessageReducer.d.ts +0 -12
- package/bin/session/recorder/SessionMessageReducer.d.ts.map +0 -1
- package/bin/session/recorder/SessionMessageReducer.js +0 -109
- package/bin/session/recorder/SessionMessageReducer.js.map +0 -1
- package/bin/session/runtime/SessionMessageEventHub.d.ts +0 -15
- package/bin/session/runtime/SessionMessageEventHub.d.ts.map +0 -1
- package/bin/session/runtime/SessionMessageEventHub.js +0 -28
- package/bin/session/runtime/SessionMessageEventHub.js.map +0 -1
- package/bin/types/sdk/AgentSessionEvent.d.ts +0 -303
- package/bin/types/sdk/AgentSessionEvent.d.ts.map +0 -1
- package/bin/types/sdk/AgentSessionEvent.js +0 -9
- package/bin/types/sdk/AgentSessionEvent.js.map +0 -1
- package/bin/types/session/SessionMessageMutation.d.ts +0 -92
- package/bin/types/session/SessionMessageMutation.d.ts.map +0 -1
- package/bin/types/session/SessionMessageMutation.js +0 -21
- package/bin/types/session/SessionMessageMutation.js.map +0 -1
- package/src/session/recorder/SessionMessageReducer.ts +0 -155
- package/src/session/runtime/SessionMessageEventHub.ts +0 -35
- package/src/types/sdk/AgentSessionEvent.ts +0 -372
- package/src/types/session/SessionMessageMutation.ts +0 -121
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionMessageCodec.d.ts","sourceRoot":"","sources":["../../../src/session/recorder/SessionMessageCodec.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EACV,uBAAuB,EACvB,2BAA2B,EAC3B,cAAc,EAEd,sBAAsB,EACvB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EACV,sBAAsB,EAEvB,MAAM,oCAAoC,CAAC;AAE5C,qDAAqD;AACrD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,cAAc,GACtB,sBAAsB,GAAG,IAAI,CAmC/B;AAED,iDAAiD;AACjD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAC3C,sBAAsB,EAAE,CAgC1B;AAED,oDAAoD;AACpD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAC3C,2BAA2B,EAAE,
|
|
1
|
+
{"version":3,"file":"SessionMessageCodec.d.ts","sourceRoot":"","sources":["../../../src/session/recorder/SessionMessageCodec.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EACV,uBAAuB,EACvB,2BAA2B,EAC3B,cAAc,EAEd,sBAAsB,EACvB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EACV,sBAAsB,EAEvB,MAAM,oCAAoC,CAAC;AAE5C,qDAAqD;AACrD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,cAAc,GACtB,sBAAsB,GAAG,IAAI,CAmC/B;AAED,iDAAiD;AACjD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAC3C,sBAAsB,EAAE,CAgC1B;AAED,oDAAoD;AACpD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAC3C,2BAA2B,EAAE,CA2D/B;AAED,oCAAoC;AACpC,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,uBAAuB,GAAG,IAAI,GAAG,SAAS,GAClD,MAAM,CAMR"}
|
|
@@ -89,6 +89,7 @@ export function from_ui_assistant_parts(parts) {
|
|
|
89
89
|
if (type === "text" || type === "reasoning") {
|
|
90
90
|
return [{
|
|
91
91
|
part_id: `${type}:${index + 1}`,
|
|
92
|
+
sequence: index + 1,
|
|
92
93
|
type: type,
|
|
93
94
|
text: String(candidate.text || ""),
|
|
94
95
|
state: "done",
|
|
@@ -97,6 +98,7 @@ export function from_ui_assistant_parts(parts) {
|
|
|
97
98
|
if (type === "file") {
|
|
98
99
|
return [{
|
|
99
100
|
part_id: `file:${index + 1}`,
|
|
101
|
+
sequence: index + 1,
|
|
100
102
|
type: "file",
|
|
101
103
|
url: String(candidate.url || ""),
|
|
102
104
|
media_type: String(candidate.mediaType || "application/octet-stream"),
|
|
@@ -107,6 +109,7 @@ export function from_ui_assistant_parts(parts) {
|
|
|
107
109
|
const state = String(candidate.state || "");
|
|
108
110
|
return [{
|
|
109
111
|
part_id: String(candidate.toolCallId || `tool:${index + 1}`),
|
|
112
|
+
sequence: index + 1,
|
|
110
113
|
type: "tool",
|
|
111
114
|
tool_call_id: String(candidate.toolCallId || `tool:${index + 1}`),
|
|
112
115
|
tool_name: String(candidate.toolName || "").trim() ||
|
|
@@ -120,7 +123,9 @@ export function from_ui_assistant_parts(parts) {
|
|
|
120
123
|
? "approval-required"
|
|
121
124
|
: state === "input-streaming"
|
|
122
125
|
? "input-streaming"
|
|
123
|
-
: "
|
|
126
|
+
: state === "input-available"
|
|
127
|
+
? "ready"
|
|
128
|
+
: "running",
|
|
124
129
|
...(candidate.input !== undefined
|
|
125
130
|
? { input: to_json_value(candidate.input) }
|
|
126
131
|
: {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionMessageCodec.js","sourceRoot":"","sources":["../../../src/session/recorder/SessionMessageCodec.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"SessionMessageCodec.js","sourceRoot":"","sources":["../../../src/session/recorder/SessionMessageCodec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SessionRecorder:Session Message 的唯一持久化与发布入口。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 完整 Message 与 Assistant 草稿先持久化,成功后再发布实时 Mutation。
|
|
5
5
|
*/
|
|
6
6
|
import type { UIMessage, UIMessageChunk } from "ai";
|
|
7
7
|
import { JsonlSessionMessageStore } from "../../session/recorder/JsonlSessionMessageStore.js";
|
|
8
8
|
import type { JsonObject } from "../../types/common/Json.js";
|
|
9
9
|
import type { ListSessionMessagesInput, SessionActionMessage, SessionAssistantMessage, SessionAssistantMessagePart, SessionErrorMessage, SessionMessage, SessionMessagePage, SessionUserMessage, SessionUserMessagePart } from "../../types/session/SessionMessage.js";
|
|
10
|
-
import type {
|
|
10
|
+
import type { SessionMutation } from "../../types/session/SessionMutation.js";
|
|
11
11
|
/** SessionRecorder 构造参数。 */
|
|
12
12
|
export interface SessionRecorderOptions {
|
|
13
13
|
/** 当前 Session 标识。 */
|
|
14
14
|
session_id: string;
|
|
15
|
-
/**
|
|
15
|
+
/** Message 快照 store。 */
|
|
16
16
|
store: JsonlSessionMessageStore;
|
|
17
|
-
/** Mutation
|
|
18
|
-
publish: (mutation:
|
|
17
|
+
/** 持久化成功后的实时 Mutation 发布函数。 */
|
|
18
|
+
publish: (mutation: SessionMutation) => void;
|
|
19
19
|
}
|
|
20
20
|
/** User Message 创建参数。 */
|
|
21
21
|
export interface AppendSessionUserMessageInput {
|
|
@@ -91,11 +91,10 @@ export declare class SessionRecorder {
|
|
|
91
91
|
readonly session_id: string;
|
|
92
92
|
private readonly store;
|
|
93
93
|
private readonly publish;
|
|
94
|
-
private readonly subscribers;
|
|
95
94
|
private readonly messages_by_id;
|
|
96
95
|
private initialized;
|
|
97
96
|
constructor(options: SessionRecorderOptions);
|
|
98
|
-
/**
|
|
97
|
+
/** 恢复已有 Message,并收口进程中断遗留的运行状态。 */
|
|
99
98
|
initialize(): Promise<void>;
|
|
100
99
|
/** 同步读取当前内存 Message。 */
|
|
101
100
|
get_message(message_id: string): SessionMessage | undefined;
|
|
@@ -117,10 +116,6 @@ export declare class SessionRecorder {
|
|
|
117
116
|
append_error_message(input: AppendSessionErrorMessageInput): Promise<SessionErrorMessage>;
|
|
118
117
|
/** 读取折叠后的 Message snapshot。 */
|
|
119
118
|
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
119
|
/** 向当前 Session 导入 fork 来源 Message,并重新分配全部身份和顺序。 */
|
|
125
120
|
import_messages(messages: SessionMessage[]): Promise<void>;
|
|
126
121
|
/** @internal 写入 Assistant 原始文本 delta。 */
|
|
@@ -129,8 +124,21 @@ export declare class SessionRecorder {
|
|
|
129
124
|
update_assistant_part(message_id: string, part: SessionAssistantMessagePart): Promise<void>;
|
|
130
125
|
/** @internal 收口 Assistant Message。 */
|
|
131
126
|
complete_assistant_message(message_id: string, status: "completed" | "stopped" | "failed"): Promise<void>;
|
|
127
|
+
/** @internal 将 Shell Runtime 审批请求更新到当前 Tool Part。 */
|
|
128
|
+
require_tool_approval(input: {
|
|
129
|
+
tool_call_id: string;
|
|
130
|
+
approval_id: string;
|
|
131
|
+
}): Promise<void>;
|
|
132
|
+
/** @internal 将审批结果更新到当前 Tool Part。 */
|
|
133
|
+
resolve_tool_approval(input: {
|
|
134
|
+
tool_call_id: string;
|
|
135
|
+
approval_id: string;
|
|
136
|
+
decision: "approved" | "denied" | "expired";
|
|
137
|
+
}): Promise<void>;
|
|
132
138
|
private create_message;
|
|
139
|
+
private find_streaming_tool;
|
|
133
140
|
private build_message_mutation;
|
|
141
|
+
private accept_message;
|
|
134
142
|
private accept_mutation;
|
|
135
143
|
private ensure_initialized;
|
|
136
144
|
}
|
|
@@ -138,6 +146,7 @@ export declare class SessionRecorder {
|
|
|
138
146
|
export declare class SessionAssistantMessageWriter {
|
|
139
147
|
readonly message_id: string;
|
|
140
148
|
private readonly recorder;
|
|
149
|
+
private readonly pending_text_parts;
|
|
141
150
|
private closed;
|
|
142
151
|
constructor(recorder: SessionRecorder, message_id: string);
|
|
143
152
|
/** 应用一个原始 AI SDK UI chunk。 */
|
|
@@ -154,6 +163,9 @@ export declare class SessionAssistantMessageWriter {
|
|
|
154
163
|
fail(_error: unknown): Promise<void>;
|
|
155
164
|
private current_message;
|
|
156
165
|
private find_tool;
|
|
166
|
+
private next_part_sequence;
|
|
167
|
+
/** 在首个有效 Delta 到达时才固定文本 Part 的真实顺序。 */
|
|
168
|
+
private ensure_text_part;
|
|
157
169
|
private upsert_tool;
|
|
158
170
|
private close;
|
|
159
171
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionRecorder.d.ts","sourceRoot":"","sources":["../../../src/session/recorder/SessionRecorder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AAEpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gDAAgD,CAAC;
|
|
1
|
+
{"version":3,"file":"SessionRecorder.d.ts","sourceRoot":"","sources":["../../../src/session/recorder/SessionRecorder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SessionRecorder:Session Message 的唯一持久化与发布入口。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 完整 Message 与 Assistant 草稿先持久化,成功后再发布实时 Mutation。
|
|
5
5
|
*/
|
|
6
6
|
import { generateId } from "../../utils/Id.js";
|
|
7
|
-
import { reduce_session_message } from "../../session/recorder/SessionMessageReducer.js";
|
|
8
7
|
/** 唯一 Session Message 写入服务。 */
|
|
9
8
|
export class SessionRecorder {
|
|
10
9
|
session_id;
|
|
11
10
|
store;
|
|
12
11
|
publish;
|
|
13
|
-
subscribers = new Set();
|
|
14
12
|
messages_by_id = new Map();
|
|
15
13
|
initialized = false;
|
|
16
14
|
constructor(options) {
|
|
@@ -20,7 +18,7 @@ export class SessionRecorder {
|
|
|
20
18
|
if (!this.session_id)
|
|
21
19
|
throw new Error("SessionRecorder requires session_id");
|
|
22
20
|
}
|
|
23
|
-
/**
|
|
21
|
+
/** 恢复已有 Message,并收口进程中断遗留的运行状态。 */
|
|
24
22
|
async initialize() {
|
|
25
23
|
if (this.initialized)
|
|
26
24
|
return;
|
|
@@ -83,7 +81,7 @@ export class SessionRecorder {
|
|
|
83
81
|
...(input.summary_through_message_id
|
|
84
82
|
? { summary_through_message_id: input.summary_through_message_id }
|
|
85
83
|
: {}),
|
|
86
|
-
})));
|
|
84
|
+
}), true));
|
|
87
85
|
return new SessionAssistantMessageWriter(this, message.message_id);
|
|
88
86
|
}
|
|
89
87
|
/** 直接写入一条已完成 Assistant Message。 */
|
|
@@ -126,10 +124,10 @@ export class SessionRecorder {
|
|
|
126
124
|
}
|
|
127
125
|
/** 更新 Action 状态,同时保持 message_id 与 sequence 不变。 */
|
|
128
126
|
async update_action_message(message_id, status, changes) {
|
|
129
|
-
const
|
|
127
|
+
const message = await this.store.append_message((state) => {
|
|
130
128
|
const current = require_message(state.messages, message_id, "action");
|
|
131
129
|
const created_at = Date.now();
|
|
132
|
-
|
|
130
|
+
return {
|
|
133
131
|
...current,
|
|
134
132
|
status,
|
|
135
133
|
...(changes?.title ? { title: changes.title } : {}),
|
|
@@ -140,10 +138,9 @@ export class SessionRecorder {
|
|
|
140
138
|
revision: current.revision + 1,
|
|
141
139
|
updated_at: created_at,
|
|
142
140
|
};
|
|
143
|
-
return this.build_message_mutation(state.commit_sequence, message);
|
|
144
141
|
});
|
|
145
|
-
this.
|
|
146
|
-
return
|
|
142
|
+
this.accept_message(message);
|
|
143
|
+
return message;
|
|
147
144
|
}
|
|
148
145
|
/** 创建用户可见 Error Message。 */
|
|
149
146
|
async append_error_message(input) {
|
|
@@ -166,8 +163,6 @@ export class SessionRecorder {
|
|
|
166
163
|
/** 读取折叠后的 Message snapshot。 */
|
|
167
164
|
async list_messages(input) {
|
|
168
165
|
await this.ensure_initialized();
|
|
169
|
-
const mutations = await this.store.list_mutations();
|
|
170
|
-
const latest_commit_sequence = mutations[mutations.length - 1]?.commit_sequence || 0;
|
|
171
166
|
const include_internal = input?.include_internal === true;
|
|
172
167
|
const through_sequence = Number.isFinite(input?.through_sequence)
|
|
173
168
|
? Number(input?.through_sequence)
|
|
@@ -189,30 +184,8 @@ export class SessionRecorder {
|
|
|
189
184
|
total: all.length,
|
|
190
185
|
...(next_offset < all.length ? { next_cursor: encode_cursor(next_offset) } : {}),
|
|
191
186
|
has_more: next_offset < all.length,
|
|
192
|
-
latest_commit_sequence,
|
|
193
187
|
};
|
|
194
188
|
}
|
|
195
|
-
/** 从指定 commit_sequence 增量读取 Mutation。 */
|
|
196
|
-
async list_message_changes(input) {
|
|
197
|
-
await this.ensure_initialized();
|
|
198
|
-
const after = Math.max(0, Math.floor(input.after_commit_sequence || 0));
|
|
199
|
-
const limit = normalize_limit(input.limit, 200, 1000);
|
|
200
|
-
const all = await this.store.list_mutations();
|
|
201
|
-
const matching = all.filter((item) => item.commit_sequence > after);
|
|
202
|
-
const items = matching.slice(0, limit);
|
|
203
|
-
const latest_commit_sequence = all[all.length - 1]?.commit_sequence || 0;
|
|
204
|
-
return {
|
|
205
|
-
items,
|
|
206
|
-
has_more: matching.length > items.length,
|
|
207
|
-
next_commit_sequence: items[items.length - 1]?.commit_sequence || after,
|
|
208
|
-
latest_commit_sequence,
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
/** 订阅已成功持久化的未来 Mutation。 */
|
|
212
|
-
subscribe(subscriber) {
|
|
213
|
-
this.subscribers.add(subscriber);
|
|
214
|
-
return () => this.subscribers.delete(subscriber);
|
|
215
|
-
}
|
|
216
189
|
/** 向当前 Session 导入 fork 来源 Message,并重新分配全部身份和顺序。 */
|
|
217
190
|
async import_messages(messages) {
|
|
218
191
|
const turn_ids = new Map();
|
|
@@ -243,76 +216,140 @@ export class SessionRecorder {
|
|
|
243
216
|
async append_assistant_delta(message_id, part_id, type, delta) {
|
|
244
217
|
if (!delta)
|
|
245
218
|
return;
|
|
246
|
-
const
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
219
|
+
const current = require_message([...this.messages_by_id.values()], message_id, "assistant");
|
|
220
|
+
require_streaming_assistant(current);
|
|
221
|
+
const part = current.parts.find((item) => item.part_id === part_id);
|
|
222
|
+
if (!part || (part.type !== "text" && part.type !== "reasoning")) {
|
|
223
|
+
throw new Error(`Delta target Part does not exist: ${part_id}`);
|
|
224
|
+
}
|
|
225
|
+
if (part.type !== type)
|
|
226
|
+
throw new Error(`Delta type changed for Part: ${part_id}`);
|
|
227
|
+
const created_at = Date.now();
|
|
228
|
+
const message = {
|
|
229
|
+
...current,
|
|
230
|
+
revision: current.revision + 1,
|
|
231
|
+
updated_at: created_at,
|
|
232
|
+
parts: current.parts.map((item) => item.part_id === part_id && (item.type === "text" || item.type === "reasoning")
|
|
233
|
+
? { ...item, text: item.text + delta }
|
|
234
|
+
: item),
|
|
235
|
+
};
|
|
236
|
+
await this.store.write_assistant_message(message);
|
|
237
|
+
this.accept_mutation({
|
|
238
|
+
mutation_id: generateId(),
|
|
239
|
+
variant: "delta",
|
|
240
|
+
type,
|
|
241
|
+
message_id,
|
|
242
|
+
revision: message.revision,
|
|
243
|
+
session_id: this.session_id,
|
|
244
|
+
turn_id: message.turn_id,
|
|
245
|
+
created_at,
|
|
246
|
+
part_id,
|
|
247
|
+
delta,
|
|
248
|
+
}, message);
|
|
263
249
|
}
|
|
264
250
|
/** @internal 写入 Assistant 完整 part。 */
|
|
265
251
|
async update_assistant_part(message_id, part) {
|
|
266
|
-
const
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
part:
|
|
280
|
-
|
|
281
|
-
}
|
|
282
|
-
this.
|
|
252
|
+
const current = require_message([...this.messages_by_id.values()], message_id, "assistant");
|
|
253
|
+
require_streaming_assistant(current);
|
|
254
|
+
const existing = current.parts.find((item) => item.part_id === part.part_id);
|
|
255
|
+
if (existing && existing.sequence !== part.sequence) {
|
|
256
|
+
throw new Error(`Assistant Part sequence changed: ${part.part_id}`);
|
|
257
|
+
}
|
|
258
|
+
const created_at = Date.now();
|
|
259
|
+
const next_part = structuredClone(part);
|
|
260
|
+
const message = {
|
|
261
|
+
...current,
|
|
262
|
+
revision: current.revision + 1,
|
|
263
|
+
updated_at: created_at,
|
|
264
|
+
parts: (existing
|
|
265
|
+
? current.parts.map((item) => item.part_id === part.part_id ? next_part : item)
|
|
266
|
+
: [...current.parts, next_part]).sort((left, right) => left.sequence - right.sequence),
|
|
267
|
+
};
|
|
268
|
+
await this.store.write_assistant_message(message);
|
|
269
|
+
this.accept_mutation({
|
|
270
|
+
mutation_id: generateId(),
|
|
271
|
+
variant: "part",
|
|
272
|
+
type: next_part.type,
|
|
273
|
+
message_id,
|
|
274
|
+
revision: message.revision,
|
|
275
|
+
session_id: this.session_id,
|
|
276
|
+
turn_id: message.turn_id,
|
|
277
|
+
created_at,
|
|
278
|
+
part_id: next_part.part_id,
|
|
279
|
+
part: next_part,
|
|
280
|
+
}, message);
|
|
283
281
|
}
|
|
284
282
|
/** @internal 收口 Assistant Message。 */
|
|
285
283
|
async complete_assistant_message(message_id, status) {
|
|
286
|
-
const
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
284
|
+
const current = require_message([...this.messages_by_id.values()], message_id, "assistant");
|
|
285
|
+
require_streaming_assistant(current);
|
|
286
|
+
const created_at = Date.now();
|
|
287
|
+
const message = {
|
|
288
|
+
...current,
|
|
289
|
+
revision: current.revision + 1,
|
|
290
|
+
status,
|
|
291
|
+
updated_at: created_at,
|
|
292
|
+
parts: current.parts.map((part) => part.type === "text" || part.type === "reasoning"
|
|
293
|
+
? { ...part, state: "done" }
|
|
294
|
+
: part),
|
|
295
|
+
};
|
|
296
|
+
await this.store.finalize_assistant_message(message);
|
|
297
|
+
this.accept_message(message);
|
|
298
|
+
}
|
|
299
|
+
/** @internal 将 Shell Runtime 审批请求更新到当前 Tool Part。 */
|
|
300
|
+
async require_tool_approval(input) {
|
|
301
|
+
const tool = this.find_streaming_tool(input.tool_call_id);
|
|
302
|
+
await this.update_assistant_part(tool.message_id, {
|
|
303
|
+
...tool.part,
|
|
304
|
+
state: "approval-required",
|
|
305
|
+
approval_id: input.approval_id,
|
|
299
306
|
});
|
|
300
|
-
this.accept_mutation(mutation);
|
|
301
307
|
}
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
308
|
+
/** @internal 将审批结果更新到当前 Tool Part。 */
|
|
309
|
+
async resolve_tool_approval(input) {
|
|
310
|
+
const tool = this.find_streaming_tool(input.tool_call_id);
|
|
311
|
+
if (tool.part.approval_id && tool.part.approval_id !== input.approval_id) {
|
|
312
|
+
throw new Error(`Tool approval identity mismatch: ${input.approval_id}`);
|
|
313
|
+
}
|
|
314
|
+
await this.update_assistant_part(tool.message_id, {
|
|
315
|
+
...tool.part,
|
|
316
|
+
state: input.decision === "approved" ? "running" : "failed",
|
|
317
|
+
...(input.decision === "approved"
|
|
318
|
+
? {}
|
|
319
|
+
: { error: input.decision === "expired" ? "Approval expired" : "Approval denied" }),
|
|
306
320
|
});
|
|
307
|
-
this.accept_mutation(mutation);
|
|
308
|
-
return mutation.message;
|
|
309
321
|
}
|
|
310
|
-
|
|
322
|
+
async create_message(factory, draft = false) {
|
|
323
|
+
if (draft) {
|
|
324
|
+
const message = await this.store.create_assistant_message((state) => {
|
|
325
|
+
const candidate = factory(state.message_sequence, Date.now());
|
|
326
|
+
if (candidate.type !== "assistant" || candidate.status !== "streaming") {
|
|
327
|
+
throw new Error("Draft Message must be a streaming Assistant");
|
|
328
|
+
}
|
|
329
|
+
return candidate;
|
|
330
|
+
});
|
|
331
|
+
this.accept_message(message);
|
|
332
|
+
return message;
|
|
333
|
+
}
|
|
334
|
+
const message = await this.store.append_message((state) => factory(state.message_sequence, Date.now()));
|
|
335
|
+
this.accept_message(message);
|
|
336
|
+
return message;
|
|
337
|
+
}
|
|
338
|
+
find_streaming_tool(tool_call_id) {
|
|
339
|
+
for (const message of this.messages_by_id.values()) {
|
|
340
|
+
if (message.type !== "assistant" || message.status !== "streaming")
|
|
341
|
+
continue;
|
|
342
|
+
const part = message.parts.find((item) => item.type === "tool" && item.tool_call_id === tool_call_id);
|
|
343
|
+
if (part)
|
|
344
|
+
return { message_id: message.message_id, part };
|
|
345
|
+
}
|
|
346
|
+
throw new Error(`Streaming Tool Part not found: ${tool_call_id}`);
|
|
347
|
+
}
|
|
348
|
+
build_message_mutation(message) {
|
|
311
349
|
return {
|
|
312
350
|
mutation_id: generateId(),
|
|
313
351
|
variant: "message",
|
|
314
352
|
type: message.type,
|
|
315
|
-
commit_sequence,
|
|
316
353
|
message_id: message.message_id,
|
|
317
354
|
sequence: message.sequence,
|
|
318
355
|
revision: message.revision,
|
|
@@ -322,19 +359,12 @@ export class SessionRecorder {
|
|
|
322
359
|
message,
|
|
323
360
|
};
|
|
324
361
|
}
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
362
|
+
accept_message(message) {
|
|
363
|
+
this.accept_mutation(this.build_message_mutation(message), message);
|
|
364
|
+
}
|
|
365
|
+
accept_mutation(mutation, message) {
|
|
366
|
+
this.messages_by_id.set(message.message_id, structuredClone(message));
|
|
329
367
|
this.publish(mutation);
|
|
330
|
-
for (const subscriber of this.subscribers) {
|
|
331
|
-
try {
|
|
332
|
-
subscriber(mutation);
|
|
333
|
-
}
|
|
334
|
-
catch {
|
|
335
|
-
// 单个订阅者异常不能影响已经完成的提交。
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
368
|
}
|
|
339
369
|
async ensure_initialized() {
|
|
340
370
|
if (!this.initialized)
|
|
@@ -345,6 +375,7 @@ export class SessionRecorder {
|
|
|
345
375
|
export class SessionAssistantMessageWriter {
|
|
346
376
|
message_id;
|
|
347
377
|
recorder;
|
|
378
|
+
pending_text_parts = new Map();
|
|
348
379
|
closed = false;
|
|
349
380
|
constructor(recorder, message_id) {
|
|
350
381
|
this.recorder = recorder;
|
|
@@ -357,18 +388,22 @@ export class SessionAssistantMessageWriter {
|
|
|
357
388
|
const current = this.current_message();
|
|
358
389
|
switch (chunk.type) {
|
|
359
390
|
case "text-start":
|
|
360
|
-
case "reasoning-start":
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
});
|
|
391
|
+
case "reasoning-start": {
|
|
392
|
+
const type = chunk.type === "text-start" ? "text" : "reasoning";
|
|
393
|
+
const part_id = `${type}:${chunk.id}`;
|
|
394
|
+
if (!current.parts.some((part) => part.part_id === part_id)) {
|
|
395
|
+
this.pending_text_parts.set(part_id, type);
|
|
396
|
+
}
|
|
367
397
|
return;
|
|
398
|
+
}
|
|
368
399
|
case "text-delta":
|
|
369
|
-
case "reasoning-delta":
|
|
370
|
-
|
|
400
|
+
case "reasoning-delta": {
|
|
401
|
+
const type = chunk.type === "text-delta" ? "text" : "reasoning";
|
|
402
|
+
const part_id = `${type}:${chunk.id}`;
|
|
403
|
+
await this.ensure_text_part(part_id, type);
|
|
404
|
+
await this.recorder.append_assistant_delta(this.message_id, part_id, type, chunk.delta);
|
|
371
405
|
return;
|
|
406
|
+
}
|
|
372
407
|
case "text-end":
|
|
373
408
|
case "reasoning-end": {
|
|
374
409
|
const part_id = `${chunk.type === "text-end" ? "text" : "reasoning"}:${chunk.id}`;
|
|
@@ -376,6 +411,9 @@ export class SessionAssistantMessageWriter {
|
|
|
376
411
|
if (part?.type === "text" || part?.type === "reasoning") {
|
|
377
412
|
await this.upsert_part({ ...part, state: "done" });
|
|
378
413
|
}
|
|
414
|
+
else {
|
|
415
|
+
this.pending_text_parts.delete(part_id);
|
|
416
|
+
}
|
|
379
417
|
return;
|
|
380
418
|
}
|
|
381
419
|
case "tool-input-start":
|
|
@@ -397,7 +435,7 @@ export class SessionAssistantMessageWriter {
|
|
|
397
435
|
case "tool-input-available":
|
|
398
436
|
await this.upsert_tool(chunk.toolCallId, {
|
|
399
437
|
tool_name: chunk.toolName,
|
|
400
|
-
state: "
|
|
438
|
+
state: "ready",
|
|
401
439
|
input: to_json_value(chunk.input),
|
|
402
440
|
});
|
|
403
441
|
return;
|
|
@@ -442,6 +480,7 @@ export class SessionAssistantMessageWriter {
|
|
|
442
480
|
case "file":
|
|
443
481
|
await this.upsert_part({
|
|
444
482
|
part_id: `file:${generateId()}`,
|
|
483
|
+
sequence: this.next_part_sequence(),
|
|
445
484
|
type: "file",
|
|
446
485
|
media_type: chunk.mediaType,
|
|
447
486
|
url: chunk.url,
|
|
@@ -479,11 +518,37 @@ export class SessionAssistantMessageWriter {
|
|
|
479
518
|
find_tool(tool_call_id) {
|
|
480
519
|
return this.current_message().parts.find((part) => part.type === "tool" && part.tool_call_id === tool_call_id);
|
|
481
520
|
}
|
|
521
|
+
next_part_sequence() {
|
|
522
|
+
return this.current_message().parts.reduce((value, part) => Math.max(value, part.sequence + 1), 1);
|
|
523
|
+
}
|
|
524
|
+
/** 在首个有效 Delta 到达时才固定文本 Part 的真实顺序。 */
|
|
525
|
+
async ensure_text_part(part_id, type) {
|
|
526
|
+
const existing = this.current_message().parts.find((part) => part.part_id === part_id);
|
|
527
|
+
if (existing) {
|
|
528
|
+
if (existing.type !== type) {
|
|
529
|
+
throw new Error(`Assistant Part type changed: ${part_id}`);
|
|
530
|
+
}
|
|
531
|
+
return;
|
|
532
|
+
}
|
|
533
|
+
const pending_type = this.pending_text_parts.get(part_id);
|
|
534
|
+
if (pending_type && pending_type !== type) {
|
|
535
|
+
throw new Error(`Assistant pending Part type changed: ${part_id}`);
|
|
536
|
+
}
|
|
537
|
+
await this.upsert_part({
|
|
538
|
+
part_id,
|
|
539
|
+
sequence: this.next_part_sequence(),
|
|
540
|
+
type,
|
|
541
|
+
text: "",
|
|
542
|
+
state: "streaming",
|
|
543
|
+
});
|
|
544
|
+
this.pending_text_parts.delete(part_id);
|
|
545
|
+
}
|
|
482
546
|
async upsert_tool(tool_call_id, changes) {
|
|
483
547
|
const current = this.find_tool(tool_call_id);
|
|
484
548
|
await this.upsert_part({
|
|
485
549
|
...(current || {}),
|
|
486
550
|
part_id: `tool:${tool_call_id}`,
|
|
551
|
+
sequence: current?.sequence || this.next_part_sequence(),
|
|
487
552
|
type: "tool",
|
|
488
553
|
tool_call_id,
|
|
489
554
|
...changes,
|
|
@@ -492,6 +557,7 @@ export class SessionAssistantMessageWriter {
|
|
|
492
557
|
async close(status) {
|
|
493
558
|
if (this.closed)
|
|
494
559
|
return;
|
|
560
|
+
this.pending_text_parts.clear();
|
|
495
561
|
await this.recorder.complete_assistant_message(this.message_id, status);
|
|
496
562
|
this.closed = true;
|
|
497
563
|
}
|
|
@@ -565,6 +631,15 @@ function require_message(messages, message_id, type) {
|
|
|
565
631
|
}
|
|
566
632
|
return message;
|
|
567
633
|
}
|
|
634
|
+
function require_streaming_assistant(message) {
|
|
635
|
+
if (message.type !== "assistant") {
|
|
636
|
+
throw new Error(`Session Message is not assistant: ${message.message_id}`);
|
|
637
|
+
}
|
|
638
|
+
if (message.status !== "streaming") {
|
|
639
|
+
throw new Error(`Assistant Message is already closed: ${message.message_id}`);
|
|
640
|
+
}
|
|
641
|
+
return message;
|
|
642
|
+
}
|
|
568
643
|
function to_json_value(input) {
|
|
569
644
|
if (input === undefined || input === null)
|
|
570
645
|
return null;
|