@downcity/agent 1.1.217 → 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 +43 -4
- 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 +26 -41
- package/bin/agent/remote/RemoteSession.d.ts.map +1 -1
- package/bin/agent/remote/RemoteSession.js +75 -107
- package/bin/agent/remote/RemoteSession.js.map +1 -1
- package/bin/agent/remote/RemoteTransport.d.ts +15 -27
- package/bin/agent/remote/RemoteTransport.d.ts.map +1 -1
- package/bin/agent/remote/transports/HttpRemoteAgentTransport.d.ts +10 -21
- package/bin/agent/remote/transports/HttpRemoteAgentTransport.d.ts.map +1 -1
- package/bin/agent/remote/transports/HttpRemoteAgentTransport.js +24 -46
- package/bin/agent/remote/transports/HttpRemoteAgentTransport.js.map +1 -1
- package/bin/agent/remote/transports/RpcRemoteAgentTransport.d.ts +10 -20
- package/bin/agent/remote/transports/RpcRemoteAgentTransport.d.ts.map +1 -1
- package/bin/agent/remote/transports/RpcRemoteAgentTransport.js +10 -16
- 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/executor/types/SessionRecords.d.ts +2 -0
- package/bin/executor/types/SessionRecords.d.ts.map +1 -1
- package/bin/executor/types/SessionRecords.js.map +1 -1
- package/bin/index.d.ts +6 -3
- package/bin/index.d.ts.map +1 -1
- package/bin/index.js +1 -0
- package/bin/index.js.map +1 -1
- package/bin/rpc/Client.d.ts +12 -34
- package/bin/rpc/Client.d.ts.map +1 -1
- package/bin/rpc/Client.js +31 -70
- package/bin/rpc/Client.js.map +1 -1
- package/bin/session/Session.d.ts +22 -4
- package/bin/session/Session.d.ts.map +1 -1
- package/bin/session/Session.js +95 -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 +51 -0
- package/bin/session/recorder/JsonlSessionMessageStore.d.ts.map +1 -0
- package/bin/session/recorder/JsonlSessionMessageStore.js +231 -0
- package/bin/session/recorder/JsonlSessionMessageStore.js.map +1 -0
- package/bin/session/recorder/SessionMessageCodec.d.ts +20 -0
- package/bin/session/recorder/SessionMessageCodec.d.ts.map +1 -0
- package/bin/session/recorder/SessionMessageCodec.js +257 -0
- package/bin/session/recorder/SessionMessageCodec.js.map +1 -0
- package/bin/session/recorder/SessionRecorder.d.ts +186 -0
- package/bin/session/recorder/SessionRecorder.d.ts.map +1 -0
- package/bin/session/recorder/SessionRecorder.js +655 -0
- package/bin/session/recorder/SessionRecorder.js.map +1 -0
- package/bin/session/recorder/SessionRecorderCompaction.d.ts +18 -0
- package/bin/session/recorder/SessionRecorderCompaction.d.ts.map +1 -0
- package/bin/session/recorder/SessionRecorderCompaction.js +142 -0
- package/bin/session/recorder/SessionRecorderCompaction.js.map +1 -0
- package/bin/session/recorder/SessionRecorderHistoryStore.d.ts +66 -0
- package/bin/session/recorder/SessionRecorderHistoryStore.d.ts.map +1 -0
- package/bin/session/recorder/SessionRecorderHistoryStore.js +195 -0
- package/bin/session/recorder/SessionRecorderHistoryStore.js.map +1 -0
- 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 +9 -15
- package/bin/session/runtime/SessionPromptRuntime.d.ts.map +1 -1
- package/bin/session/runtime/SessionPromptRuntime.js +48 -30
- package/bin/session/runtime/SessionPromptRuntime.js.map +1 -1
- package/bin/session/services/SessionStateService.d.ts +9 -5
- package/bin/session/services/SessionStateService.d.ts.map +1 -1
- package/bin/session/services/SessionStateService.js +138 -74
- package/bin/session/services/SessionStateService.js.map +1 -1
- package/bin/session/services/SessionTurnService.d.ts +6 -7
- package/bin/session/services/SessionTurnService.d.ts.map +1 -1
- package/bin/session/services/SessionTurnService.js +84 -60
- package/bin/session/services/SessionTurnService.js.map +1 -1
- package/bin/session/services/SessionViewService.d.ts +8 -3
- package/bin/session/services/SessionViewService.d.ts.map +1 -1
- package/bin/session/services/SessionViewService.js +10 -5
- package/bin/session/services/SessionViewService.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/Persistence.d.ts +6 -0
- package/bin/session/storage/Persistence.d.ts.map +1 -1
- package/bin/session/storage/Persistence.js +7 -0
- package/bin/session/storage/Persistence.js.map +1 -1
- package/bin/session/storage/RuntimeSessionPort.d.ts +3 -3
- 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 +15 -5
- package/bin/types/agent/SessionActor.d.ts.map +1 -1
- package/bin/types/rpc/RpcProtocol.d.ts +48 -61
- package/bin/types/rpc/RpcProtocol.d.ts.map +1 -1
- package/bin/types/runtime/agent/AgentContext.d.ts +5 -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 +223 -0
- package/bin/types/session/SessionMessage.d.ts.map +1 -0
- package/bin/types/session/SessionMessage.js +8 -0
- package/bin/types/session/SessionMessage.js.map +1 -0
- 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/agent-env.test.mjs +4 -4
- package/scripts/remote-session-reconnect.test.mjs +7 -3
- package/scripts/session-action-message.test.mjs +98 -27
- package/scripts/session-history-inflight.test.mjs +2 -2
- package/scripts/session-list-title.test.mjs +6 -19
- package/scripts/session-prompt-runtime.test.mjs +7 -19
- package/scripts/session-recorder.test.mjs +199 -0
- package/scripts/session-title-event.test.mjs +10 -18
- package/src/agent/local/Agent.ts +1 -55
- package/src/agent/local/services/AgentAssemblyService.ts +39 -3
- package/src/agent/local/services/AgentSessions.ts +48 -3
- package/src/agent/remote/RemoteAgent.ts +1 -54
- package/src/agent/remote/RemoteSession.ts +106 -136
- package/src/agent/remote/RemoteTransport.ts +30 -30
- package/src/agent/remote/transports/HttpRemoteAgentTransport.ts +52 -77
- package/src/agent/remote/transports/RpcRemoteAgentTransport.ts +30 -34
- package/src/executor/store/history/jsonl/JsonlSessionHistoryStore.ts +2 -2
- package/src/executor/types/SessionHistoryPaths.ts +1 -1
- package/src/executor/types/SessionRecords.ts +2 -0
- package/src/index.ts +36 -10
- package/src/rpc/Client.ts +58 -95
- package/src/session/Session.ts +128 -37
- package/src/session/browse/Browse.ts +51 -22
- package/src/session/recorder/JsonlSessionMessageStore.ts +246 -0
- package/src/session/recorder/SessionMessageCodec.ts +284 -0
- package/src/session/recorder/SessionRecorder.ts +871 -0
- package/src/session/recorder/SessionRecorderCompaction.ts +188 -0
- package/src/session/recorder/SessionRecorderHistoryStore.ts +276 -0
- package/src/session/runtime/SessionEventHub.ts +25 -12
- package/src/session/runtime/SessionPromptRuntime.ts +60 -43
- package/src/session/services/SessionStateService.ts +159 -86
- package/src/session/services/SessionTurnService.ts +91 -73
- package/src/session/services/SessionViewService.ts +25 -13
- package/src/session/storage/Paths.ts +2 -2
- package/src/session/storage/Persistence.ts +13 -0
- package/src/session/storage/RuntimeSessionPort.ts +8 -9
- package/src/types/agent/SessionActor.ts +31 -8
- package/src/types/rpc/RpcProtocol.ts +44 -67
- package/src/types/runtime/agent/AgentContext.ts +9 -7
- package/src/types/session/SessionApproval.ts +108 -0
- package/src/types/session/SessionMessage.ts +253 -0
- package/src/types/session/SessionMutation.ts +141 -0
- package/src/types/session/SessionOptions.ts +25 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/bin/session/SessionEventMapper.d.ts +0 -32
- package/bin/session/SessionEventMapper.d.ts.map +0 -1
- package/bin/session/SessionEventMapper.js +0 -131
- package/bin/session/SessionEventMapper.js.map +0 -1
- package/bin/types/sdk/AgentSessionEvent.d.ts +0 -302
- 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/sdk/InternalUiChunkEvent.d.ts +0 -100
- package/bin/types/sdk/InternalUiChunkEvent.d.ts.map +0 -1
- package/bin/types/sdk/InternalUiChunkEvent.js +0 -9
- package/bin/types/sdk/InternalUiChunkEvent.js.map +0 -1
- package/scripts/session-history-archive.test.mjs +0 -188
- package/src/session/SessionEventMapper.ts +0 -148
- package/src/types/sdk/AgentSessionEvent.ts +0 -370
- package/src/types/sdk/InternalUiChunkEvent.ts +0 -108
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { SessionUserMessageV1 } from "../../executor/types/SessionRecords.js";
|
|
10
10
|
import type { SessionMessageRecordV1 } from "../../executor/types/SessionRecords.js";
|
|
11
|
-
import type {
|
|
11
|
+
import type { SessionMutation } from "../../types/session/SessionMutation.js";
|
|
12
12
|
import type { AgentSessionPromptInput } from "../../types/sdk/AgentSessionPrompt.js";
|
|
13
13
|
import type { AgentSessionStopResult } from "../../types/sdk/AgentSessionStop.js";
|
|
14
14
|
import type { AgentSessionTurnHandle } from "../../types/sdk/AgentSessionTurn.js";
|
|
@@ -23,23 +23,17 @@ export interface SessionPromptRuntimeOptions {
|
|
|
23
23
|
/**
|
|
24
24
|
* 广播 session 事件。
|
|
25
25
|
*/
|
|
26
|
-
publish: (
|
|
26
|
+
publish: (mutation: SessionMutation) => void;
|
|
27
27
|
/**
|
|
28
28
|
* 构造并持久化一条 user 消息。
|
|
29
29
|
*/
|
|
30
|
-
createAndPersistUserMessage: (input: AgentSessionPromptInput) => Promise<SessionUserMessageV1>;
|
|
31
|
-
/**
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
emit_steer_action: (input: {
|
|
35
|
-
/**
|
|
36
|
-
* steer message 所属的当前 turn 标识。
|
|
37
|
-
*/
|
|
30
|
+
createAndPersistUserMessage: (input: AgentSessionPromptInput, turn_id: string, input_type: "prompt" | "steer") => Promise<SessionUserMessageV1>;
|
|
31
|
+
/** 持久化一条用户可见的 turn 错误 Message。 */
|
|
32
|
+
appendErrorMessage: (input: {
|
|
33
|
+
/** 错误所属 turn。 */
|
|
38
34
|
turn_id: string;
|
|
39
|
-
/**
|
|
40
|
-
|
|
41
|
-
*/
|
|
42
|
-
message: SessionUserMessageV1;
|
|
35
|
+
/** 用户可见错误文本。 */
|
|
36
|
+
message: string;
|
|
43
37
|
}) => Promise<void>;
|
|
44
38
|
/**
|
|
45
39
|
* 执行单轮 turn。
|
|
@@ -67,7 +61,7 @@ export declare class SessionPromptRuntime {
|
|
|
67
61
|
private readonly sessionId;
|
|
68
62
|
private readonly publish;
|
|
69
63
|
private readonly createAndPersistUserMessage;
|
|
70
|
-
private readonly
|
|
64
|
+
private readonly appendErrorMessage;
|
|
71
65
|
private readonly executeTurn;
|
|
72
66
|
private readonly stopTurn;
|
|
73
67
|
private readonly queue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionPromptRuntime.d.ts","sourceRoot":"","sources":["../../../src/session/runtime/SessionPromptRuntime.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,KAAK,EAEV,sBAAsB,EACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"SessionPromptRuntime.d.ts","sourceRoot":"","sources":["../../../src/session/runtime/SessionPromptRuntime.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,KAAK,EAEV,sBAAsB,EACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,KAAK,EACV,sBAAsB,EAEvB,MAAM,iCAAiC,CAAC;AA0DzC;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;IAE7C;;OAEG;IACH,2BAA2B,EAAE,CAC3B,KAAK,EAAE,uBAAuB,EAC9B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,QAAQ,GAAG,OAAO,KAC3B,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAEnC,kCAAkC;IAClC,kBAAkB,EAAE,CAAC,KAAK,EAAE;QAC1B,iBAAiB;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,gBAAgB;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpB;;OAEG;IACH,WAAW,EAAE,CAAC,KAAK,EAAE;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,uBAAuB,CAAC;QACrC,WAAW,EAAE,MAAM,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;QACnD,WAAW,EAAE,WAAW,CAAC;KAC1B,KAAK,OAAO,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,OAAO,CAAC;QACjB,gBAAgB,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;QACjD,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IAEH;;OAEG;IACH,QAAQ,EAAE,MAAM,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IACjE,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAA6D;IACzG,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoD;IACvF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6C;IACzE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0C;IACnE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;IAC5C,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,UAAU,CAAgC;gBAEtC,OAAO,EAAE,2BAA2B;IAYhD;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAUvE;;;;;;OAMG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,IAAI,IAAI,sBAAsB;IAyB9B,OAAO,CAAC,gBAAgB;YAUV,WAAW;IAmGzB,OAAO,CAAC,mBAAmB;YA2Cb,4BAA4B;CA2B3C"}
|
|
@@ -16,7 +16,7 @@ export class SessionPromptRuntime {
|
|
|
16
16
|
sessionId;
|
|
17
17
|
publish;
|
|
18
18
|
createAndPersistUserMessage;
|
|
19
|
-
|
|
19
|
+
appendErrorMessage;
|
|
20
20
|
executeTurn;
|
|
21
21
|
stopTurn;
|
|
22
22
|
queue = [];
|
|
@@ -26,7 +26,7 @@ export class SessionPromptRuntime {
|
|
|
26
26
|
this.sessionId = String(options.sessionId || "").trim();
|
|
27
27
|
this.publish = options.publish;
|
|
28
28
|
this.createAndPersistUserMessage = options.createAndPersistUserMessage;
|
|
29
|
-
this.
|
|
29
|
+
this.appendErrorMessage = options.appendErrorMessage;
|
|
30
30
|
this.executeTurn = options.executeTurn;
|
|
31
31
|
this.stopTurn = options.stopTurn;
|
|
32
32
|
if (!this.sessionId) {
|
|
@@ -97,12 +97,17 @@ export class SessionPromptRuntime {
|
|
|
97
97
|
const activeTurn = createActiveTurnState(turnId);
|
|
98
98
|
this.activeTurn = activeTurn;
|
|
99
99
|
this.publish({
|
|
100
|
-
|
|
101
|
-
|
|
100
|
+
mutation_id: nanoid(),
|
|
101
|
+
variant: "turn",
|
|
102
|
+
type: "start",
|
|
103
|
+
session_id: this.sessionId,
|
|
104
|
+
turn_id: turnId,
|
|
105
|
+
status: "running",
|
|
106
|
+
created_at: Date.now(),
|
|
102
107
|
});
|
|
103
108
|
current.deferredHandle.resolve(createTurnHandle(activeTurn));
|
|
104
109
|
try {
|
|
105
|
-
await this.createAndPersistUserMessage(current.input);
|
|
110
|
+
await this.createAndPersistUserMessage(current.input, turnId, "prompt");
|
|
106
111
|
const result = await this.executeTurn({
|
|
107
112
|
turnId,
|
|
108
113
|
promptInput: current.input,
|
|
@@ -125,10 +130,14 @@ export class SessionPromptRuntime {
|
|
|
125
130
|
};
|
|
126
131
|
activeTurn.result = finalResult;
|
|
127
132
|
this.publish({
|
|
128
|
-
|
|
129
|
-
|
|
133
|
+
mutation_id: nanoid(),
|
|
134
|
+
variant: "turn",
|
|
135
|
+
type: "finish",
|
|
136
|
+
session_id: this.sessionId,
|
|
137
|
+
turn_id: turnId,
|
|
138
|
+
status: stopped ? "stopped" : finalResult.success ? "completed" : "failed",
|
|
139
|
+
created_at: Date.now(),
|
|
130
140
|
text: finalResult.text,
|
|
131
|
-
success: finalResult.success,
|
|
132
141
|
...(finalResult.error ? { error: finalResult.error } : {}),
|
|
133
142
|
});
|
|
134
143
|
activeTurn.deferredFinished.resolve(finalResult);
|
|
@@ -149,16 +158,25 @@ export class SessionPromptRuntime {
|
|
|
149
158
|
};
|
|
150
159
|
activeTurn.result = finalResult;
|
|
151
160
|
if (message !== TURN_STOPPED_MESSAGE) {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
161
|
+
try {
|
|
162
|
+
await this.appendErrorMessage({
|
|
163
|
+
turn_id: turnId,
|
|
164
|
+
message,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// Error Message 写入失败不能阻止 turn handle 收口。
|
|
169
|
+
}
|
|
156
170
|
}
|
|
157
171
|
this.publish({
|
|
158
|
-
|
|
159
|
-
|
|
172
|
+
mutation_id: nanoid(),
|
|
173
|
+
variant: "turn",
|
|
174
|
+
type: "finish",
|
|
175
|
+
session_id: this.sessionId,
|
|
176
|
+
turn_id: turnId,
|
|
177
|
+
status: activeTurn.abortController.signal.aborted ? "stopped" : "failed",
|
|
178
|
+
created_at: Date.now(),
|
|
160
179
|
text: "",
|
|
161
|
-
success: false,
|
|
162
180
|
error: message,
|
|
163
181
|
});
|
|
164
182
|
activeTurn.deferredFinished.resolve(finalResult);
|
|
@@ -190,14 +208,23 @@ export class SessionPromptRuntime {
|
|
|
190
208
|
cancelledTurn.result = finalResult;
|
|
191
209
|
cancelledTurn.deferredFinished.resolve(finalResult);
|
|
192
210
|
this.publish({
|
|
193
|
-
|
|
194
|
-
|
|
211
|
+
mutation_id: nanoid(),
|
|
212
|
+
variant: "turn",
|
|
213
|
+
type: "start",
|
|
214
|
+
session_id: this.sessionId,
|
|
215
|
+
turn_id: turnId,
|
|
216
|
+
status: "running",
|
|
217
|
+
created_at: Date.now(),
|
|
195
218
|
});
|
|
196
219
|
this.publish({
|
|
197
|
-
|
|
198
|
-
|
|
220
|
+
mutation_id: nanoid(),
|
|
221
|
+
variant: "turn",
|
|
222
|
+
type: "finish",
|
|
223
|
+
session_id: this.sessionId,
|
|
224
|
+
turn_id: turnId,
|
|
225
|
+
status: "failed",
|
|
226
|
+
created_at: Date.now(),
|
|
199
227
|
text: "",
|
|
200
|
-
success: false,
|
|
201
228
|
error: QUEUED_PROMPT_CANCELLED_MESSAGE,
|
|
202
229
|
});
|
|
203
230
|
item.deferredHandle.resolve(createTurnHandle(cancelledTurn));
|
|
@@ -212,18 +239,9 @@ export class SessionPromptRuntime {
|
|
|
212
239
|
for (let index = 0; index < drained.length; index += 1) {
|
|
213
240
|
const item = drained[index];
|
|
214
241
|
try {
|
|
215
|
-
const message = await this.createAndPersistUserMessage(item.input);
|
|
242
|
+
const message = await this.createAndPersistUserMessage(item.input, activeTurn.turnId, "steer");
|
|
216
243
|
item.deferredHandle.resolve(createTurnHandle(activeTurn));
|
|
217
244
|
merged.push(message);
|
|
218
|
-
try {
|
|
219
|
-
await this.emit_steer_action({
|
|
220
|
-
turn_id: activeTurn.turnId,
|
|
221
|
-
message,
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
catch {
|
|
225
|
-
// action 发送失败不应阻断已经持久化的 steer message。
|
|
226
|
-
}
|
|
227
245
|
}
|
|
228
246
|
catch {
|
|
229
247
|
// 关键点(中文):若某条消息持久化失败,把未处理部分重新放回队列头部,避免静默丢失。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionPromptRuntime.js","sourceRoot":"","sources":["../../../src/session/runtime/SessionPromptRuntime.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAchC,MAAM,oBAAoB,GAAG,cAAc,CAAC;AAC5C,MAAM,+BAA+B,GACnC,8CAA8C,CAAC;
|
|
1
|
+
{"version":3,"file":"SessionPromptRuntime.js","sourceRoot":"","sources":["../../../src/session/runtime/SessionPromptRuntime.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,14 +7,15 @@
|
|
|
7
7
|
* - `Session` facade 与 turn/view service 都通过它访问可变 session 运行态。
|
|
8
8
|
*/
|
|
9
9
|
import type { Executor } from "../../executor/Executor.js";
|
|
10
|
-
import type {
|
|
10
|
+
import type { SessionHistoryStore } from "../../executor/store/history/SessionHistoryStore.js";
|
|
11
11
|
import type { AgentSessionConfigSnapshot, AgentSessionSetInput } from "../../types/agent/SessionTypes.js";
|
|
12
|
-
import type {
|
|
12
|
+
import type { SessionMutation } from "../../types/session/SessionMutation.js";
|
|
13
13
|
import type { AgentSessionPromptInput } from "../../types/sdk/AgentSessionPrompt.js";
|
|
14
14
|
import type { SessionActionRecordInputV1, SessionActionRecordV1, SessionRecordV1, SessionMessageRecordV1, SessionUserMessageV1 } from "../../executor/types/SessionRecords.js";
|
|
15
15
|
import type { SessionLocalState } from "../../types/session/SessionLocalState.js";
|
|
16
16
|
import type { Logger } from "../../utils/logger/Logger.js";
|
|
17
17
|
import type { AgentModel } from "../../model/CityModelAdapter.js";
|
|
18
|
+
import { SessionRecorder } from "../../session/recorder/SessionRecorder.js";
|
|
18
19
|
type SessionStateServiceOptions = {
|
|
19
20
|
/**
|
|
20
21
|
* 当前 agent 稳定标识。
|
|
@@ -31,7 +32,9 @@ type SessionStateServiceOptions = {
|
|
|
31
32
|
/**
|
|
32
33
|
* 当前 session 历史事实源。
|
|
33
34
|
*/
|
|
34
|
-
history_store:
|
|
35
|
+
history_store: SessionHistoryStore;
|
|
36
|
+
/** 当前 Session Message Recorder。 */
|
|
37
|
+
recorder: SessionRecorder;
|
|
35
38
|
/**
|
|
36
39
|
* 当前 session 执行器。
|
|
37
40
|
*/
|
|
@@ -53,7 +56,7 @@ type SessionStateServiceOptions = {
|
|
|
53
56
|
/**
|
|
54
57
|
* 发布 session 事件。
|
|
55
58
|
*/
|
|
56
|
-
publish_event: (
|
|
59
|
+
publish_event: (mutation: SessionMutation) => void;
|
|
57
60
|
};
|
|
58
61
|
type SessionSetOptions = {
|
|
59
62
|
/**
|
|
@@ -74,6 +77,7 @@ export declare class SessionStateService {
|
|
|
74
77
|
private readonly project_root;
|
|
75
78
|
private readonly session_id;
|
|
76
79
|
private readonly history_store;
|
|
80
|
+
private readonly recorder;
|
|
77
81
|
private readonly executor;
|
|
78
82
|
private readonly state;
|
|
79
83
|
private readonly logger;
|
|
@@ -155,7 +159,7 @@ export declare class SessionStateService {
|
|
|
155
159
|
/**
|
|
156
160
|
* 构造并持久化一条 prompt user 消息。
|
|
157
161
|
*/
|
|
158
|
-
create_and_persist_user_prompt_message(input: AgentSessionPromptInput): Promise<SessionUserMessageV1>;
|
|
162
|
+
create_and_persist_user_prompt_message(input: AgentSessionPromptInput, turn_id: string, input_type?: "prompt" | "steer"): Promise<SessionUserMessageV1>;
|
|
159
163
|
/**
|
|
160
164
|
* 持久化本轮执行期间延迟写入的 user 消息。
|
|
161
165
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionStateService.d.ts","sourceRoot":"","sources":["../../../src/session/services/SessionStateService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"SessionStateService.d.ts","sourceRoot":"","sources":["../../../src/session/services/SessionStateService.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,10 +10,12 @@ import { inferAgentModelLabel, normalizeAgentModel, } from "../../model/CityMode
|
|
|
10
10
|
import { patchSessionModelLabel, readSessionMetadata, resolveSystemTimezone, writeSessionMetadata, } from "../../session/storage/Metadata.js";
|
|
11
11
|
import { touchSessionMetadata } from "../../session/storage/Persistence.js";
|
|
12
12
|
import { ensureSessionTitle } from "../../session/SessionTitle.js";
|
|
13
|
-
import { persistSdkAssistantResult } from "../../session/storage/Persistence.js";
|
|
14
13
|
import { hydrateUserPromptFileParts } from "../../executor/messages/SessionAttachmentMapper.js";
|
|
15
|
-
import { to_session_action_record } from "../../executor/types/SessionRecords.js";
|
|
16
14
|
import { generateId } from "../../utils/Id.js";
|
|
15
|
+
import { normalize_session_user_parts } from "../../session/recorder/SessionRecorder.js";
|
|
16
|
+
import { from_ui_assistant_parts, from_ui_user_parts, to_executor_ui_message, } from "../../session/recorder/SessionMessageCodec.js";
|
|
17
|
+
import fs from "fs-extra";
|
|
18
|
+
import { getSdkAgentSessionMessagesPath } from "../../session/storage/Paths.js";
|
|
17
19
|
/**
|
|
18
20
|
* 本地 Session 状态与持久化服务。
|
|
19
21
|
*/
|
|
@@ -22,6 +24,7 @@ export class SessionStateService {
|
|
|
22
24
|
project_root;
|
|
23
25
|
session_id;
|
|
24
26
|
history_store;
|
|
27
|
+
recorder;
|
|
25
28
|
executor;
|
|
26
29
|
state;
|
|
27
30
|
logger;
|
|
@@ -33,6 +36,7 @@ export class SessionStateService {
|
|
|
33
36
|
this.project_root = options.project_root;
|
|
34
37
|
this.session_id = options.session_id;
|
|
35
38
|
this.history_store = options.history_store;
|
|
39
|
+
this.recorder = options.recorder;
|
|
36
40
|
this.executor = options.executor;
|
|
37
41
|
this.state = options.state;
|
|
38
42
|
this.logger = options.logger;
|
|
@@ -97,6 +101,7 @@ export class SessionStateService {
|
|
|
97
101
|
: {}),
|
|
98
102
|
...(metadata.modelId ? { modelId: metadata.modelId } : {}),
|
|
99
103
|
};
|
|
104
|
+
await this.restore_persisted_model();
|
|
100
105
|
})();
|
|
101
106
|
await this.state.initializePromise;
|
|
102
107
|
}
|
|
@@ -105,7 +110,6 @@ export class SessionStateService {
|
|
|
105
110
|
*/
|
|
106
111
|
async ensure_ready_for_execution() {
|
|
107
112
|
await this.initialize();
|
|
108
|
-
await this.restore_persisted_model();
|
|
109
113
|
if (this.state.ensureConfiguredPromise) {
|
|
110
114
|
await this.state.ensureConfiguredPromise;
|
|
111
115
|
return;
|
|
@@ -138,6 +142,7 @@ export class SessionStateService {
|
|
|
138
142
|
async set(input, options) {
|
|
139
143
|
const should_emit_action = options?.emit_action !== false;
|
|
140
144
|
const previous_model_label = this.state.sessionConfig.modelLabel;
|
|
145
|
+
const previous_model_id = String(this.state.sessionConfig.modelId || previous_model_label || "").trim();
|
|
141
146
|
const requested_model_id = String(input.modelId || "").trim();
|
|
142
147
|
const next_model = input.model || (requested_model_id
|
|
143
148
|
? await this.resolve_model_by_id(requested_model_id)
|
|
@@ -149,17 +154,16 @@ export class SessionStateService {
|
|
|
149
154
|
const should_emit_model_switch_action = Boolean(next_model &&
|
|
150
155
|
should_emit_action &&
|
|
151
156
|
this.state.sessionConfig.model &&
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
157
|
+
previous_model_id &&
|
|
158
|
+
next_model_id &&
|
|
159
|
+
previous_model_id !== next_model_id);
|
|
160
|
+
const previous_model_name = previous_model_label || previous_model_id;
|
|
161
|
+
const next_model_name = next_model_label || next_model_id;
|
|
155
162
|
const action_id = `model-switching:${this.session_id}:${Date.now()}:${generateId()}`;
|
|
156
163
|
if (should_emit_model_switch_action) {
|
|
157
164
|
await this.emit_action_event({
|
|
158
165
|
id: action_id,
|
|
159
|
-
title:
|
|
160
|
-
description: next_model_label
|
|
161
|
-
? `Switching to ${next_model_label}.`
|
|
162
|
-
: undefined,
|
|
166
|
+
title: `Switching session model from ${previous_model_name} to ${next_model_name}`,
|
|
163
167
|
state: "running",
|
|
164
168
|
});
|
|
165
169
|
}
|
|
@@ -183,7 +187,7 @@ export class SessionStateService {
|
|
|
183
187
|
if (should_emit_model_switch_action) {
|
|
184
188
|
await this.emit_action_event({
|
|
185
189
|
id: action_id,
|
|
186
|
-
title:
|
|
190
|
+
title: `Session model switch from ${previous_model_name} to ${next_model_name} failed`,
|
|
187
191
|
description: error instanceof Error ? error.message : String(error),
|
|
188
192
|
state: "failed",
|
|
189
193
|
});
|
|
@@ -193,10 +197,7 @@ export class SessionStateService {
|
|
|
193
197
|
if (should_emit_model_switch_action) {
|
|
194
198
|
await this.emit_action_event({
|
|
195
199
|
id: action_id,
|
|
196
|
-
title:
|
|
197
|
-
description: this.state.sessionConfig.modelLabel
|
|
198
|
-
? `Using ${this.state.sessionConfig.modelLabel}.`
|
|
199
|
-
: undefined,
|
|
200
|
+
title: `Session model switched from ${previous_model_name} to ${next_model_name}`,
|
|
200
201
|
state: "completed",
|
|
201
202
|
});
|
|
202
203
|
}
|
|
@@ -221,7 +222,21 @@ export class SessionStateService {
|
|
|
221
222
|
* 追加一条 user 消息并刷新标题与 metadata。
|
|
222
223
|
*/
|
|
223
224
|
async append_user_message(params) {
|
|
224
|
-
|
|
225
|
+
const parts = params.message && "role" in params.message
|
|
226
|
+
? from_ui_user_parts(params.message.parts)
|
|
227
|
+
: [{
|
|
228
|
+
part_id: `external-user-text:${Date.now()}`,
|
|
229
|
+
type: "text",
|
|
230
|
+
text: String(params.text || "").trim(),
|
|
231
|
+
state: "done",
|
|
232
|
+
}];
|
|
233
|
+
if (parts.length === 0)
|
|
234
|
+
return;
|
|
235
|
+
await this.recorder.append_user_message({
|
|
236
|
+
turn_id: `external:${this.session_id}:${Date.now()}`,
|
|
237
|
+
input_type: "prompt",
|
|
238
|
+
parts,
|
|
239
|
+
});
|
|
225
240
|
await this.ensure_title_from_history({ generate: true });
|
|
226
241
|
await this.touch_metadata();
|
|
227
242
|
}
|
|
@@ -229,18 +244,41 @@ export class SessionStateService {
|
|
|
229
244
|
* 追加一条 assistant 消息并刷新 metadata。
|
|
230
245
|
*/
|
|
231
246
|
async append_assistant_message(params) {
|
|
232
|
-
|
|
247
|
+
const parts = params.message && "role" in params.message
|
|
248
|
+
? from_ui_assistant_parts(params.message.parts)
|
|
249
|
+
: [{
|
|
250
|
+
part_id: `external-assistant-text:${Date.now()}`,
|
|
251
|
+
sequence: 1,
|
|
252
|
+
type: "text",
|
|
253
|
+
text: String(params.fallbackText || "").trim(),
|
|
254
|
+
state: "done",
|
|
255
|
+
}];
|
|
256
|
+
if (parts.length === 0)
|
|
257
|
+
return;
|
|
258
|
+
await this.recorder.append_completed_assistant_message({ parts });
|
|
233
259
|
await this.touch_metadata();
|
|
234
260
|
}
|
|
235
261
|
/**
|
|
236
262
|
* 仅刷新当前 session metadata。
|
|
237
263
|
*/
|
|
238
264
|
async touch_metadata() {
|
|
265
|
+
const message_page = await this.recorder.list_messages({
|
|
266
|
+
limit: 500,
|
|
267
|
+
include_internal: true,
|
|
268
|
+
});
|
|
269
|
+
const messages_path = getSdkAgentSessionMessagesPath(this.project_root, this.agent_id, this.session_id);
|
|
270
|
+
const history_bytes = await fs.stat(messages_path)
|
|
271
|
+
.then((file_stat) => file_stat.size)
|
|
272
|
+
.catch(() => 0);
|
|
273
|
+
const preview_text = resolve_message_preview(message_page.items[message_page.items.length - 1]).slice(0, 180);
|
|
239
274
|
await touchSessionMetadata({
|
|
240
275
|
projectRoot: this.project_root,
|
|
241
276
|
agentId: this.agent_id,
|
|
242
277
|
sessionId: this.session_id,
|
|
243
278
|
sessionConfig: this.state.sessionConfig,
|
|
279
|
+
message_count: message_page.total,
|
|
280
|
+
history_bytes,
|
|
281
|
+
...(preview_text ? { preview_text } : {}),
|
|
244
282
|
});
|
|
245
283
|
}
|
|
246
284
|
/**
|
|
@@ -270,8 +308,11 @@ export class SessionStateService {
|
|
|
270
308
|
if (!next_title || next_title === before_title)
|
|
271
309
|
return;
|
|
272
310
|
this.publish_event({
|
|
273
|
-
|
|
274
|
-
|
|
311
|
+
mutation_id: generateId(),
|
|
312
|
+
variant: "session",
|
|
313
|
+
type: "title",
|
|
314
|
+
session_id: this.session_id,
|
|
315
|
+
created_at: Date.now(),
|
|
275
316
|
title: next_title,
|
|
276
317
|
});
|
|
277
318
|
}
|
|
@@ -279,76 +320,74 @@ export class SessionStateService {
|
|
|
279
320
|
* 持久化最终 assistant 结果。
|
|
280
321
|
*/
|
|
281
322
|
async persist_assistant_result(assistant_message) {
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
agentId: this.agent_id,
|
|
285
|
-
sessionId: this.session_id,
|
|
286
|
-
sessionConfig: this.state.sessionConfig,
|
|
287
|
-
executor: this.executor,
|
|
288
|
-
assistantMessage: assistant_message,
|
|
289
|
-
});
|
|
323
|
+
void assistant_message;
|
|
324
|
+
await this.touch_metadata();
|
|
290
325
|
}
|
|
291
326
|
/**
|
|
292
327
|
* 持久化一条 action record。
|
|
293
328
|
*/
|
|
294
329
|
async persist_action_event(event) {
|
|
295
|
-
const
|
|
296
|
-
|
|
330
|
+
const existing = this.recorder.get_message(event.id);
|
|
331
|
+
if (!existing) {
|
|
332
|
+
const writer = await this.recorder.open_action_message({
|
|
333
|
+
message_id: event.id,
|
|
334
|
+
turn_id: event.metadata.turnId,
|
|
335
|
+
action_type: infer_action_type(event.id),
|
|
336
|
+
title: event.title,
|
|
337
|
+
description: event.description,
|
|
338
|
+
});
|
|
339
|
+
if (event.state === "completed")
|
|
340
|
+
await writer.complete();
|
|
341
|
+
if (event.state === "failed")
|
|
342
|
+
await writer.fail(event.description || event.title);
|
|
343
|
+
}
|
|
344
|
+
else if (existing.type === "action" && event.state !== "running") {
|
|
345
|
+
await this.recorder.update_action_message(event.id, event.state, {
|
|
346
|
+
title: event.title,
|
|
347
|
+
description: event.description,
|
|
348
|
+
});
|
|
349
|
+
}
|
|
297
350
|
await this.touch_metadata();
|
|
298
351
|
}
|
|
299
352
|
/**
|
|
300
353
|
* 写入并发布一条 action。
|
|
301
354
|
*/
|
|
302
355
|
async emit_action_event(input) {
|
|
303
|
-
const
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
356
|
+
const action_id = String(input.id || "").trim() ||
|
|
357
|
+
`action:${this.session_id}:${Date.now()}`;
|
|
358
|
+
const turn_id = "turnId" in input
|
|
359
|
+
? input.turnId
|
|
360
|
+
: input.metadata?.turnId;
|
|
361
|
+
await this.persist_action_event({
|
|
362
|
+
type: "action",
|
|
363
|
+
id: action_id,
|
|
364
|
+
title: input.title,
|
|
365
|
+
...(input.description ? { description: input.description } : {}),
|
|
366
|
+
state: input.state,
|
|
367
|
+
metadata: {
|
|
368
|
+
v: 1,
|
|
369
|
+
ts: input.metadata?.ts || Date.now(),
|
|
370
|
+
sessionId: this.session_id,
|
|
371
|
+
...(turn_id
|
|
372
|
+
? { turnId: turn_id }
|
|
373
|
+
: {}),
|
|
374
|
+
},
|
|
375
|
+
});
|
|
315
376
|
}
|
|
316
377
|
/**
|
|
317
378
|
* 构造并持久化一条 prompt user 消息。
|
|
318
379
|
*/
|
|
319
|
-
async create_and_persist_user_prompt_message(input) {
|
|
380
|
+
async create_and_persist_user_prompt_message(input, turn_id, input_type = "prompt") {
|
|
320
381
|
const query = input.query;
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
await this.executor.append_user_message({
|
|
329
|
-
message,
|
|
330
|
-
});
|
|
331
|
-
await this.ensure_title_from_history({ generate: true });
|
|
332
|
-
await this.touch_metadata();
|
|
333
|
-
return message;
|
|
334
|
-
}
|
|
335
|
-
// query 是 parts 数组,先把本地图片附件转换为模型可消费的 data URL。
|
|
336
|
-
const parts = await hydrateUserPromptFileParts(Array.isArray(query) ? query : [], this.project_root);
|
|
337
|
-
const message = {
|
|
338
|
-
id: `u:${this.session_id}:${generateId()}`,
|
|
339
|
-
role: "user",
|
|
340
|
-
parts,
|
|
341
|
-
metadata: {
|
|
342
|
-
v: 1,
|
|
343
|
-
ts: Date.now(),
|
|
344
|
-
sessionId: this.session_id,
|
|
345
|
-
source: "ingress",
|
|
346
|
-
kind: "normal",
|
|
347
|
-
},
|
|
348
|
-
};
|
|
349
|
-
await this.executor.append_user_message({
|
|
350
|
-
message,
|
|
382
|
+
const ui_parts = typeof query === "string"
|
|
383
|
+
? [{ type: "text", text: query.trim() }]
|
|
384
|
+
: await hydrateUserPromptFileParts(Array.isArray(query) ? query : [], this.project_root);
|
|
385
|
+
const canonical = await this.recorder.append_user_message({
|
|
386
|
+
turn_id,
|
|
387
|
+
input_type,
|
|
388
|
+
parts: normalize_session_user_parts(ui_parts),
|
|
351
389
|
});
|
|
390
|
+
const message = to_executor_ui_message(canonical);
|
|
352
391
|
await this.ensure_title_from_history({ generate: true });
|
|
353
392
|
await this.touch_metadata();
|
|
354
393
|
return message;
|
|
@@ -363,11 +402,36 @@ export class SessionStateService {
|
|
|
363
402
|
if (normalized_messages.length <= 0)
|
|
364
403
|
return;
|
|
365
404
|
for (const message of normalized_messages) {
|
|
366
|
-
await this.
|
|
367
|
-
message,
|
|
405
|
+
await this.recorder.append_user_message({
|
|
406
|
+
turn_id: String(message.metadata?.turnId || `deferred:${this.session_id}:${Date.now()}`),
|
|
407
|
+
input_type: "steer",
|
|
408
|
+
parts: from_ui_user_parts(message.parts),
|
|
368
409
|
});
|
|
369
410
|
}
|
|
370
411
|
await this.touch_metadata();
|
|
371
412
|
}
|
|
372
413
|
}
|
|
414
|
+
function resolve_message_preview(message) {
|
|
415
|
+
if (!message)
|
|
416
|
+
return "";
|
|
417
|
+
if (message.type === "user") {
|
|
418
|
+
return message.parts
|
|
419
|
+
.flatMap((part) => part.type === "text" ? [part.text] : [])
|
|
420
|
+
.join("")
|
|
421
|
+
.trim();
|
|
422
|
+
}
|
|
423
|
+
if (message.type === "assistant") {
|
|
424
|
+
return message.parts
|
|
425
|
+
.flatMap((part) => part.type === "text" ? [part.text] : [])
|
|
426
|
+
.join("")
|
|
427
|
+
.trim();
|
|
428
|
+
}
|
|
429
|
+
if (message.type === "action") {
|
|
430
|
+
return [message.title, message.description].filter(Boolean).join("\n");
|
|
431
|
+
}
|
|
432
|
+
return message.message.trim();
|
|
433
|
+
}
|
|
434
|
+
function infer_action_type(message_id) {
|
|
435
|
+
return String(message_id || "").split(":")[0] || "action";
|
|
436
|
+
}
|
|
373
437
|
//# sourceMappingURL=SessionStateService.js.map
|