@downcity/agent 1.1.222 → 1.1.224
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 +20 -11
- package/bin/session/recorder/SessionRecorder.d.ts.map +1 -1
- package/bin/session/recorder/SessionRecorder.js +148 -103
- 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 +100 -146
- 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 +183 -124
- 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
|
}
|
|
@@ -154,6 +162,7 @@ export declare class SessionAssistantMessageWriter {
|
|
|
154
162
|
fail(_error: unknown): Promise<void>;
|
|
155
163
|
private current_message;
|
|
156
164
|
private find_tool;
|
|
165
|
+
private next_part_sequence;
|
|
157
166
|
private upsert_tool;
|
|
158
167
|
private close;
|
|
159
168
|
}
|
|
@@ -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
|
-
};
|
|
194
|
-
}
|
|
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
187
|
};
|
|
210
188
|
}
|
|
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)
|
|
@@ -360,6 +390,7 @@ export class SessionAssistantMessageWriter {
|
|
|
360
390
|
case "reasoning-start":
|
|
361
391
|
await this.upsert_part({
|
|
362
392
|
part_id: `${chunk.type === "text-start" ? "text" : "reasoning"}:${chunk.id}`,
|
|
393
|
+
sequence: this.next_part_sequence(),
|
|
363
394
|
type: chunk.type === "text-start" ? "text" : "reasoning",
|
|
364
395
|
text: "",
|
|
365
396
|
state: "streaming",
|
|
@@ -397,7 +428,7 @@ export class SessionAssistantMessageWriter {
|
|
|
397
428
|
case "tool-input-available":
|
|
398
429
|
await this.upsert_tool(chunk.toolCallId, {
|
|
399
430
|
tool_name: chunk.toolName,
|
|
400
|
-
state: "
|
|
431
|
+
state: "ready",
|
|
401
432
|
input: to_json_value(chunk.input),
|
|
402
433
|
});
|
|
403
434
|
return;
|
|
@@ -442,6 +473,7 @@ export class SessionAssistantMessageWriter {
|
|
|
442
473
|
case "file":
|
|
443
474
|
await this.upsert_part({
|
|
444
475
|
part_id: `file:${generateId()}`,
|
|
476
|
+
sequence: this.next_part_sequence(),
|
|
445
477
|
type: "file",
|
|
446
478
|
media_type: chunk.mediaType,
|
|
447
479
|
url: chunk.url,
|
|
@@ -479,11 +511,15 @@ export class SessionAssistantMessageWriter {
|
|
|
479
511
|
find_tool(tool_call_id) {
|
|
480
512
|
return this.current_message().parts.find((part) => part.type === "tool" && part.tool_call_id === tool_call_id);
|
|
481
513
|
}
|
|
514
|
+
next_part_sequence() {
|
|
515
|
+
return this.current_message().parts.reduce((value, part) => Math.max(value, part.sequence + 1), 1);
|
|
516
|
+
}
|
|
482
517
|
async upsert_tool(tool_call_id, changes) {
|
|
483
518
|
const current = this.find_tool(tool_call_id);
|
|
484
519
|
await this.upsert_part({
|
|
485
520
|
...(current || {}),
|
|
486
521
|
part_id: `tool:${tool_call_id}`,
|
|
522
|
+
sequence: current?.sequence || this.next_part_sequence(),
|
|
487
523
|
type: "tool",
|
|
488
524
|
tool_call_id,
|
|
489
525
|
...changes,
|
|
@@ -565,6 +601,15 @@ function require_message(messages, message_id, type) {
|
|
|
565
601
|
}
|
|
566
602
|
return message;
|
|
567
603
|
}
|
|
604
|
+
function require_streaming_assistant(message) {
|
|
605
|
+
if (message.type !== "assistant") {
|
|
606
|
+
throw new Error(`Session Message is not assistant: ${message.message_id}`);
|
|
607
|
+
}
|
|
608
|
+
if (message.status !== "streaming") {
|
|
609
|
+
throw new Error(`Assistant Message is already closed: ${message.message_id}`);
|
|
610
|
+
}
|
|
611
|
+
return message;
|
|
612
|
+
}
|
|
568
613
|
function to_json_value(input) {
|
|
569
614
|
if (input === undefined || input === null)
|
|
570
615
|
return null;
|