@downcity/agent 1.1.79 → 1.1.81
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/README.md +1 -1
- package/bin/agent/local/Agent.d.ts +8 -121
- package/bin/agent/local/Agent.d.ts.map +1 -1
- package/bin/agent/local/Agent.js +63 -381
- package/bin/agent/local/Agent.js.map +1 -1
- package/bin/agent/local/AgentRuntimeFactory.d.ts +2 -2
- package/bin/agent/local/AgentRuntimeFactory.d.ts.map +1 -1
- package/bin/agent/local/AgentRuntimeFactory.js +2 -23
- package/bin/agent/local/AgentRuntimeFactory.js.map +1 -1
- package/bin/agent/local/services/AgentAssemblyService.d.ts +112 -0
- package/bin/agent/local/services/AgentAssemblyService.d.ts.map +1 -0
- package/bin/agent/local/services/AgentAssemblyService.js +135 -0
- package/bin/agent/local/services/AgentAssemblyService.js.map +1 -0
- package/bin/agent/local/services/AgentLifecycleService.d.ts +59 -0
- package/bin/agent/local/services/AgentLifecycleService.d.ts.map +1 -0
- package/bin/agent/local/services/AgentLifecycleService.js +136 -0
- package/bin/agent/local/services/AgentLifecycleService.js.map +1 -0
- package/bin/agent/local/services/AgentSessionManager.d.ts +106 -0
- package/bin/agent/local/services/AgentSessionManager.d.ts.map +1 -0
- package/bin/agent/local/services/AgentSessionManager.js +182 -0
- package/bin/agent/local/services/AgentSessionManager.js.map +1 -0
- package/bin/executor/Executor.d.ts +7 -24
- package/bin/executor/Executor.d.ts.map +1 -1
- package/bin/executor/Executor.js +73 -361
- package/bin/executor/Executor.js.map +1 -1
- package/bin/executor/SessionRunScope.d.ts +18 -34
- package/bin/executor/SessionRunScope.d.ts.map +1 -1
- package/bin/executor/SessionRunScope.js +42 -28
- package/bin/executor/SessionRunScope.js.map +1 -1
- package/bin/executor/composer/context/LocalSessionContextComposer.d.ts +5 -3
- package/bin/executor/composer/context/LocalSessionContextComposer.d.ts.map +1 -1
- package/bin/executor/composer/context/LocalSessionContextComposer.js +11 -18
- package/bin/executor/composer/context/LocalSessionContextComposer.js.map +1 -1
- package/bin/executor/composer/context/SessionContextComposer.d.ts +8 -3
- package/bin/executor/composer/context/SessionContextComposer.d.ts.map +1 -1
- package/bin/executor/composer/system/SessionSystemComposer.d.ts +2 -1
- package/bin/executor/composer/system/SessionSystemComposer.d.ts.map +1 -1
- package/bin/executor/composer/system/default/DefaultSessionSystemComposer.d.ts +2 -1
- package/bin/executor/composer/system/default/DefaultSessionSystemComposer.d.ts.map +1 -1
- package/bin/executor/composer/system/default/DefaultSessionSystemComposer.js +2 -4
- package/bin/executor/composer/system/default/DefaultSessionSystemComposer.js.map +1 -1
- package/bin/executor/core-engine/CoreEngineRunner.d.ts +62 -0
- package/bin/executor/core-engine/CoreEngineRunner.d.ts.map +1 -0
- package/bin/executor/core-engine/CoreEngineRunner.js +309 -0
- package/bin/executor/core-engine/CoreEngineRunner.js.map +1 -0
- package/bin/executor/core-engine/CoreEngineUiStreamCollector.d.ts +5 -0
- package/bin/executor/core-engine/CoreEngineUiStreamCollector.d.ts.map +1 -1
- package/bin/executor/core-engine/CoreEngineUiStreamCollector.js +2 -4
- package/bin/executor/core-engine/CoreEngineUiStreamCollector.js.map +1 -1
- package/bin/executor/services/ExecutorInflightService.d.ts +39 -0
- package/bin/executor/services/ExecutorInflightService.d.ts.map +1 -0
- package/bin/executor/services/ExecutorInflightService.js +75 -0
- package/bin/executor/services/ExecutorInflightService.js.map +1 -0
- package/bin/executor/services/ExecutorRecoveryPolicy.d.ts +103 -0
- package/bin/executor/services/ExecutorRecoveryPolicy.d.ts.map +1 -0
- package/bin/executor/services/ExecutorRecoveryPolicy.js +87 -0
- package/bin/executor/services/ExecutorRecoveryPolicy.js.map +1 -0
- package/bin/executor/tools/plugin/PluginToolBridge.d.ts +19 -0
- package/bin/executor/tools/plugin/PluginToolBridge.d.ts.map +1 -0
- package/bin/executor/tools/plugin/PluginToolBridge.js +143 -0
- package/bin/executor/tools/plugin/PluginToolBridge.js.map +1 -0
- package/bin/executor/tools/plugin/PluginToolDefinition.d.ts +32 -0
- package/bin/executor/tools/plugin/PluginToolDefinition.d.ts.map +1 -0
- package/bin/executor/tools/plugin/PluginToolDefinition.js +27 -0
- package/bin/executor/tools/plugin/PluginToolDefinition.js.map +1 -0
- package/bin/executor/tools/plugin/PluginToolSchemas.d.ts +14 -0
- package/bin/executor/tools/plugin/PluginToolSchemas.d.ts.map +1 -0
- package/bin/executor/tools/plugin/PluginToolSchemas.js +19 -0
- package/bin/executor/tools/plugin/PluginToolSchemas.js.map +1 -0
- package/bin/executor/tools/plugin/types/PluginTool.d.ts +39 -0
- package/bin/executor/tools/plugin/types/PluginTool.d.ts.map +1 -0
- package/bin/executor/tools/plugin/types/PluginTool.js +9 -0
- package/bin/executor/tools/plugin/types/PluginTool.js.map +1 -0
- package/bin/executor/tools/shell/ShellToolBridge.js +3 -3
- package/bin/executor/tools/shell/ShellToolBridge.js.map +1 -1
- package/bin/executor/types/SessionRun.d.ts +18 -0
- package/bin/executor/types/SessionRun.d.ts.map +1 -1
- package/bin/index.d.ts +10 -1
- package/bin/index.d.ts.map +1 -1
- package/bin/index.js +3 -0
- package/bin/index.js.map +1 -1
- package/bin/plugin/core/BasePlugin.d.ts +2 -2
- package/bin/plugin/core/BasePlugin.d.ts.map +1 -1
- package/bin/plugin/core/BasePlugin.js.map +1 -1
- package/bin/plugin/core/ImagePlugin.d.ts +56 -0
- package/bin/plugin/core/ImagePlugin.d.ts.map +1 -0
- package/bin/plugin/core/ImagePlugin.js +109 -0
- package/bin/plugin/core/ImagePlugin.js.map +1 -0
- package/bin/session/Session.d.ts +14 -83
- package/bin/session/Session.d.ts.map +1 -1
- package/bin/session/Session.js +139 -362
- package/bin/session/Session.js.map +1 -1
- package/bin/session/SessionSystemBuilder.d.ts +2 -1
- package/bin/session/SessionSystemBuilder.d.ts.map +1 -1
- package/bin/session/SessionSystemBuilder.js +2 -3
- package/bin/session/SessionSystemBuilder.js.map +1 -1
- package/bin/session/services/SessionStateService.d.ts +132 -0
- package/bin/session/services/SessionStateService.d.ts.map +1 -0
- package/bin/session/services/SessionStateService.js +242 -0
- package/bin/session/services/SessionStateService.js.map +1 -0
- package/bin/session/services/SessionTurnService.d.ts +66 -0
- package/bin/session/services/SessionTurnService.d.ts.map +1 -0
- package/bin/session/services/SessionTurnService.js +137 -0
- package/bin/session/services/SessionTurnService.js.map +1 -0
- package/bin/session/services/SessionViewService.d.ts +105 -0
- package/bin/session/services/SessionViewService.d.ts.map +1 -0
- package/bin/session/services/SessionViewService.js +184 -0
- package/bin/session/services/SessionViewService.js.map +1 -0
- package/bin/types/agent/AgentOptions.d.ts +18 -0
- package/bin/types/agent/AgentOptions.d.ts.map +1 -1
- package/bin/types/agent/AgentTypes.d.ts +3 -1
- package/bin/types/agent/AgentTypes.d.ts.map +1 -1
- package/bin/types/agent/SessionTypes.d.ts.map +1 -1
- package/bin/types/executor/SessionRunContext.d.ts +66 -0
- package/bin/types/executor/SessionRunContext.d.ts.map +1 -0
- package/bin/types/executor/SessionRunContext.js +10 -0
- package/bin/types/executor/SessionRunContext.js.map +1 -0
- package/bin/types/plugin/ImagePlugin.d.ts +94 -0
- package/bin/types/plugin/ImagePlugin.d.ts.map +1 -0
- package/bin/types/plugin/ImagePlugin.js +10 -0
- package/bin/types/plugin/ImagePlugin.js.map +1 -0
- package/bin/types/session/SessionComposerOptions.d.ts +90 -0
- package/bin/types/session/SessionComposerOptions.d.ts.map +1 -0
- package/bin/types/session/SessionComposerOptions.js +10 -0
- package/bin/types/session/SessionComposerOptions.js.map +1 -0
- package/bin/types/session/SessionLocalState.d.ts +35 -0
- package/bin/types/session/SessionLocalState.d.ts.map +1 -0
- package/bin/types/session/SessionLocalState.js +10 -0
- package/bin/types/session/SessionLocalState.js.map +1 -0
- package/bin/types/session/SessionOptions.d.ts +85 -0
- package/bin/types/session/SessionOptions.d.ts.map +1 -0
- package/bin/types/session/SessionOptions.js +10 -0
- package/bin/types/session/SessionOptions.js.map +1 -0
- package/package.json +1 -1
- package/src/agent/local/Agent.ts +74 -433
- package/src/agent/local/AgentRuntimeFactory.ts +4 -25
- package/src/agent/local/services/AgentAssemblyService.ts +268 -0
- package/src/agent/local/services/AgentLifecycleService.ts +187 -0
- package/src/agent/local/services/AgentSessionManager.ts +291 -0
- package/src/executor/Executor.ts +103 -441
- package/src/executor/README.md +4 -4
- package/src/executor/SessionRunScope.ts +47 -71
- package/src/executor/composer/context/LocalSessionContextComposer.ts +24 -20
- package/src/executor/composer/context/SessionContextComposer.ts +13 -3
- package/src/executor/composer/system/SessionSystemComposer.ts +2 -1
- package/src/executor/composer/system/default/DefaultSessionSystemComposer.ts +3 -4
- package/src/executor/core-engine/CoreEngineRunner.ts +433 -0
- package/src/executor/core-engine/CoreEngineUiStreamCollector.ts +7 -5
- package/src/executor/services/ExecutorInflightService.ts +101 -0
- package/src/executor/services/ExecutorRecoveryPolicy.ts +213 -0
- package/src/executor/tools/plugin/PluginToolBridge.ts +161 -0
- package/src/executor/tools/plugin/PluginToolDefinition.ts +32 -0
- package/src/executor/tools/plugin/PluginToolSchemas.ts +20 -0
- package/src/executor/tools/plugin/types/PluginTool.ts +41 -0
- package/src/executor/tools/shell/ShellToolBridge.ts +3 -3
- package/src/executor/types/SessionRun.ts +20 -0
- package/src/index.ts +33 -0
- package/src/plugin/core/BasePlugin.ts +2 -2
- package/src/plugin/core/ImagePlugin.ts +128 -0
- package/src/session/Session.ts +178 -485
- package/src/session/SessionSystemBuilder.ts +3 -3
- package/src/session/services/SessionStateService.ts +341 -0
- package/src/session/services/SessionTurnService.ts +202 -0
- package/src/session/services/SessionViewService.ts +301 -0
- package/src/types/agent/AgentOptions.ts +25 -0
- package/src/types/agent/AgentTypes.ts +10 -0
- package/src/types/agent/SessionTypes.ts +1 -0
- package/src/types/executor/SessionRunContext.ts +76 -0
- package/src/types/plugin/ImagePlugin.ts +103 -0
- package/src/types/session/SessionComposerOptions.ts +107 -0
- package/src/types/session/SessionLocalState.ts +40 -0
- package/src/types/session/SessionOptions.ts +99 -0
- package/tsconfig.tsbuildinfo +1 -1
package/bin/session/Session.js
CHANGED
|
@@ -3,25 +3,18 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 关键点(中文)
|
|
5
5
|
* - 面向 `new Agent(...)` 的本地会话使用场景。
|
|
6
|
-
* -
|
|
6
|
+
* - 对外保留稳定 Session facade,把状态、turn、view 逻辑下沉到独立 service。
|
|
7
7
|
* - 内部继续复用 `Executor` / `JsonlSessionHistoryStore` / Composer 体系。
|
|
8
8
|
*/
|
|
9
|
-
import { nanoid } from "nanoid";
|
|
10
9
|
import { Executor } from "../executor/Executor.js";
|
|
11
10
|
import { JsonlSessionHistoryComposer } from "../executor/composer/history/jsonl/JsonlSessionHistoryComposer.js";
|
|
12
11
|
import { JsonlSessionHistoryStore } from "../executor/store/history/jsonl/JsonlSessionHistoryStore.js";
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import { buildSessionHistoryPage, buildSessionInfo, patchSessionModelLabel, readSessionMetadata, resolveSystemTimezone, writeSessionMetadata, } from "../session/index.js";
|
|
16
|
-
import { getSdkAgentSessionArchiveDirPath, getSdkAgentSessionDirPath, getSdkAgentSessionInflightPath, } from "../session/index.js";
|
|
17
|
-
import { mapAgentEventToSessionEvent, mapUiMessageChunkToAgentEvent, } from "../session/SessionEventMapper.js";
|
|
18
|
-
import { persistSdkAssistantResult, touchSessionMetadata, } from "../session/index.js";
|
|
19
|
-
import { createRuntimeSessionPort } from "../session/index.js";
|
|
20
|
-
import { drainDeferredPersistedUserMessages } from "../executor/SessionRunScope.js";
|
|
12
|
+
import { getSdkAgentSessionArchiveDirPath, getSdkAgentSessionDirPath, getSdkAgentSessionInflightPath, resolveSystemTimezone, createRuntimeSessionPort, } from "../session/index.js";
|
|
13
|
+
import { SessionSystemBuilder } from "../session/SessionSystemBuilder.js";
|
|
21
14
|
import { SessionEventHub } from "../session/runtime/SessionEventHub.js";
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
15
|
+
import { SessionStateService } from "../session/services/SessionStateService.js";
|
|
16
|
+
import { SessionTurnService } from "../session/services/SessionTurnService.js";
|
|
17
|
+
import { SessionViewService } from "../session/services/SessionViewService.js";
|
|
25
18
|
/**
|
|
26
19
|
* SDK 本地 Session。
|
|
27
20
|
*/
|
|
@@ -35,16 +28,15 @@ export class Session {
|
|
|
35
28
|
getManagedPluginSystemBlocks;
|
|
36
29
|
getPluginSystemBlocks;
|
|
37
30
|
ensureConfiguredHook;
|
|
31
|
+
composers;
|
|
38
32
|
historyStore;
|
|
39
33
|
historyComposer;
|
|
40
34
|
executor;
|
|
41
35
|
eventHub = new SessionEventHub();
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
initializePromise = null;
|
|
47
|
-
ensureConfiguredPromise = null;
|
|
36
|
+
localState;
|
|
37
|
+
stateService;
|
|
38
|
+
turnService;
|
|
39
|
+
viewService;
|
|
48
40
|
runtimePort = null;
|
|
49
41
|
constructor(options) {
|
|
50
42
|
this.id = String(options.sessionId || "").trim();
|
|
@@ -56,6 +48,7 @@ export class Session {
|
|
|
56
48
|
this.getManagedPluginSystemBlocks = options.getManagedPluginSystemBlocks;
|
|
57
49
|
this.getPluginSystemBlocks = options.getPluginSystemBlocks;
|
|
58
50
|
this.ensureConfiguredHook = options.ensureConfigured;
|
|
51
|
+
this.composers = options.composers;
|
|
59
52
|
if (!this.id) {
|
|
60
53
|
throw new Error("Session requires a non-empty sessionId");
|
|
61
54
|
}
|
|
@@ -65,246 +58,172 @@ export class Session {
|
|
|
65
58
|
if (!this.projectRoot) {
|
|
66
59
|
throw new Error("Session requires a non-empty projectRoot");
|
|
67
60
|
}
|
|
68
|
-
const
|
|
69
|
-
const
|
|
61
|
+
const session_dir_path = getSdkAgentSessionDirPath(this.projectRoot, this.agentId, this.id);
|
|
62
|
+
const messages_dir_path = `${session_dir_path}/messages`;
|
|
70
63
|
this.historyStore = new JsonlSessionHistoryStore({
|
|
71
64
|
rootPath: this.projectRoot,
|
|
72
65
|
agentId: this.agentId,
|
|
73
66
|
sessionId: this.id,
|
|
74
67
|
paths: {
|
|
75
|
-
sessionDirPath,
|
|
76
|
-
messagesDirPath,
|
|
77
|
-
messagesFilePath: `${
|
|
78
|
-
metaFilePath: `${
|
|
68
|
+
sessionDirPath: session_dir_path,
|
|
69
|
+
messagesDirPath: messages_dir_path,
|
|
70
|
+
messagesFilePath: `${messages_dir_path}/messages.jsonl`,
|
|
71
|
+
metaFilePath: `${messages_dir_path}/meta.json`,
|
|
79
72
|
archiveDirPath: getSdkAgentSessionArchiveDirPath(this.projectRoot, this.agentId, this.id),
|
|
80
73
|
inflightFilePath: getSdkAgentSessionInflightPath(this.projectRoot, this.agentId, this.id),
|
|
81
74
|
},
|
|
82
75
|
});
|
|
83
|
-
this.
|
|
76
|
+
this.localState = {
|
|
77
|
+
sessionConfig: {},
|
|
78
|
+
createdAt: Date.now(),
|
|
79
|
+
timezone: resolveSystemTimezone(),
|
|
80
|
+
initializePromise: null,
|
|
81
|
+
ensureConfiguredPromise: null,
|
|
82
|
+
};
|
|
83
|
+
const composer_context = this.create_composer_context();
|
|
84
|
+
this.historyComposer = this.resolve_composer(this.composers?.historyComposer, composer_context, () => new JsonlSessionHistoryComposer({
|
|
84
85
|
store: this.historyStore,
|
|
85
|
-
});
|
|
86
|
+
}));
|
|
87
|
+
const system_composer = this.resolve_composer(this.composers?.systemComposer, composer_context, () => new SessionSystemBuilder({
|
|
88
|
+
agentId: this.agentId,
|
|
89
|
+
projectRoot: this.projectRoot,
|
|
90
|
+
getSessionCreatedAt: () => this.localState.createdAt,
|
|
91
|
+
getSessionTimezone: () => this.localState.timezone,
|
|
92
|
+
getInstructionSystemBlocks: this.getInstructionSystemBlocks,
|
|
93
|
+
getManagedPluginSystemBlocks: this.getManagedPluginSystemBlocks,
|
|
94
|
+
getPluginSystemBlocks: this.getPluginSystemBlocks,
|
|
95
|
+
}));
|
|
96
|
+
const context_composer = this.resolve_optional_composer(this.composers?.contextComposer, composer_context);
|
|
97
|
+
const compaction_composer = this.resolve_optional_composer(this.composers?.compactionComposer, composer_context);
|
|
86
98
|
this.executor = new Executor({
|
|
87
99
|
sessionId: this.id,
|
|
88
100
|
historyStore: this.historyStore,
|
|
89
101
|
historyComposer: this.historyComposer,
|
|
90
|
-
getModel: () => this.sessionConfig.model,
|
|
102
|
+
getModel: () => this.localState.sessionConfig.model,
|
|
91
103
|
logger: this.logger,
|
|
92
|
-
systemComposer:
|
|
93
|
-
agentId: this.agentId,
|
|
94
|
-
projectRoot: this.projectRoot,
|
|
95
|
-
getSessionCreatedAt: () => this.createdAt,
|
|
96
|
-
getSessionTimezone: () => this.timezone,
|
|
97
|
-
getInstructionSystemBlocks: this.getInstructionSystemBlocks,
|
|
98
|
-
getManagedPluginSystemBlocks: this.getManagedPluginSystemBlocks,
|
|
99
|
-
getPluginSystemBlocks: this.getPluginSystemBlocks,
|
|
100
|
-
}),
|
|
104
|
+
systemComposer: system_composer,
|
|
101
105
|
getTools: () => this.tools,
|
|
106
|
+
...(context_composer ? { contextComposer: context_composer } : {}),
|
|
107
|
+
...(compaction_composer
|
|
108
|
+
? { compactionComposer: compaction_composer }
|
|
109
|
+
: {}),
|
|
102
110
|
});
|
|
103
|
-
this.
|
|
104
|
-
|
|
105
|
-
|
|
111
|
+
this.stateService = new SessionStateService({
|
|
112
|
+
agent_id: this.agentId,
|
|
113
|
+
project_root: this.projectRoot,
|
|
114
|
+
session_id: this.id,
|
|
115
|
+
history_store: this.historyStore,
|
|
116
|
+
executor: this.executor,
|
|
117
|
+
state: this.localState,
|
|
118
|
+
ensure_configured_hook: this.ensureConfiguredHook
|
|
119
|
+
? async () => {
|
|
120
|
+
await this.ensureConfiguredHook?.(this);
|
|
121
|
+
}
|
|
122
|
+
: undefined,
|
|
123
|
+
publish_event: (event) => {
|
|
106
124
|
this.eventHub.publish(event);
|
|
107
125
|
},
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
126
|
+
});
|
|
127
|
+
this.turnService = new SessionTurnService({
|
|
128
|
+
session_id: this.id,
|
|
129
|
+
executor: this.executor,
|
|
130
|
+
state_service: this.stateService,
|
|
131
|
+
event_hub: this.eventHub,
|
|
132
|
+
});
|
|
133
|
+
this.viewService = new SessionViewService({
|
|
134
|
+
agent_id: this.agentId,
|
|
135
|
+
project_root: this.projectRoot,
|
|
136
|
+
session_id: this.id,
|
|
137
|
+
history_store: this.historyStore,
|
|
138
|
+
state_service: this.stateService,
|
|
139
|
+
is_executing: () => this.isExecuting(),
|
|
140
|
+
get_instruction_system_blocks: this.getInstructionSystemBlocks,
|
|
141
|
+
get_managed_plugin_system_blocks: this.getManagedPluginSystemBlocks,
|
|
142
|
+
get_plugin_system_blocks: this.getPluginSystemBlocks,
|
|
143
|
+
...(this.composers?.systemComposer
|
|
144
|
+
? { custom_system_composer: system_composer }
|
|
145
|
+
: {}),
|
|
146
|
+
create_fork_session: async (session_id) => {
|
|
147
|
+
const session = this.createChildSession(session_id);
|
|
148
|
+
await session.initialize();
|
|
149
|
+
return {
|
|
150
|
+
session,
|
|
151
|
+
history_store: session.historyStore,
|
|
152
|
+
state_service: session.stateService,
|
|
153
|
+
};
|
|
117
154
|
},
|
|
118
155
|
});
|
|
119
156
|
}
|
|
120
157
|
/**
|
|
121
|
-
* 初始化当前 session
|
|
158
|
+
* 初始化当前 session。
|
|
122
159
|
*/
|
|
123
160
|
async initialize() {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
}
|
|
127
|
-
this.initializePromise = (async () => {
|
|
128
|
-
const metadata = await readSessionMetadata({
|
|
129
|
-
projectRoot: this.projectRoot,
|
|
130
|
-
agentId: this.agentId,
|
|
131
|
-
sessionId: this.id,
|
|
132
|
-
});
|
|
133
|
-
const createdAt = typeof metadata.createdAt === "number" ? metadata.createdAt : Date.now();
|
|
134
|
-
const timezone = typeof metadata.timezone === "string" && metadata.timezone.trim()
|
|
135
|
-
? metadata.timezone.trim()
|
|
136
|
-
: resolveSystemTimezone();
|
|
137
|
-
await writeSessionMetadata({
|
|
138
|
-
projectRoot: this.projectRoot,
|
|
139
|
-
agentId: this.agentId,
|
|
140
|
-
sessionId: this.id,
|
|
141
|
-
meta: {
|
|
142
|
-
...metadata,
|
|
143
|
-
agentId: this.agentId,
|
|
144
|
-
createdAt,
|
|
145
|
-
timezone,
|
|
146
|
-
},
|
|
147
|
-
});
|
|
148
|
-
this.createdAt = createdAt;
|
|
149
|
-
this.timezone = timezone;
|
|
150
|
-
this.sessionConfig = {
|
|
151
|
-
...(metadata.modelLabel
|
|
152
|
-
? { modelLabel: metadata.modelLabel }
|
|
153
|
-
: {}),
|
|
154
|
-
};
|
|
155
|
-
return this;
|
|
156
|
-
})();
|
|
157
|
-
return await this.initializePromise;
|
|
161
|
+
await this.stateService.initialize();
|
|
162
|
+
return this;
|
|
158
163
|
}
|
|
159
164
|
/**
|
|
160
165
|
* 读取当前 session 配置快照。
|
|
161
166
|
*/
|
|
162
167
|
get config() {
|
|
163
|
-
return
|
|
164
|
-
...this.sessionConfig,
|
|
165
|
-
};
|
|
168
|
+
return this.stateService.get_config();
|
|
166
169
|
}
|
|
167
170
|
/**
|
|
168
171
|
* 写入当前 session 默认配置。
|
|
169
172
|
*/
|
|
170
173
|
async set(input) {
|
|
171
|
-
|
|
172
|
-
this.sessionConfig.model = normalizeAgentModel(input.model);
|
|
173
|
-
this.sessionConfig.modelLabel = inferAgentModelLabel(input.model);
|
|
174
|
-
this.executor.clearExecutor();
|
|
175
|
-
}
|
|
176
|
-
await patchSessionModelLabel({
|
|
177
|
-
projectRoot: this.projectRoot,
|
|
178
|
-
agentId: this.agentId,
|
|
179
|
-
sessionId: this.id,
|
|
180
|
-
model: this.sessionConfig.model,
|
|
181
|
-
});
|
|
174
|
+
await this.stateService.set(input);
|
|
182
175
|
}
|
|
183
176
|
/**
|
|
184
177
|
* 追加一条新的 Session prompt。
|
|
185
|
-
*
|
|
186
|
-
* 关键点(中文)
|
|
187
|
-
* - 这是 Session actor 模型下唯一的输入入口。
|
|
188
|
-
* - 首条输入、运行中补充输入、排到下一轮的输入,调用方式完全一致。
|
|
189
178
|
*/
|
|
190
179
|
async prompt(input) {
|
|
191
|
-
|
|
192
|
-
if (!query) {
|
|
193
|
-
throw new Error("session.prompt requires a non-empty query");
|
|
194
|
-
}
|
|
195
|
-
await this.ensureRunnable();
|
|
196
|
-
return await this.promptRuntime.prompt({
|
|
197
|
-
query,
|
|
198
|
-
});
|
|
180
|
+
return await this.turnService.prompt(input);
|
|
199
181
|
}
|
|
200
182
|
/**
|
|
201
183
|
* 订阅当前 Session 的未来事件。
|
|
202
|
-
*
|
|
203
|
-
* 关键点(中文)
|
|
204
|
-
* - 只广播订阅之后产生的事件。
|
|
205
|
-
* - 不做历史回放;历史仍通过 `history()` 读取。
|
|
206
184
|
*/
|
|
207
185
|
subscribe(subscriber) {
|
|
208
|
-
return this.
|
|
186
|
+
return this.turnService.subscribe(subscriber);
|
|
209
187
|
}
|
|
210
188
|
/**
|
|
211
189
|
* 追加一条 user 文本消息。
|
|
212
190
|
*/
|
|
213
191
|
async appendUserMessage(input) {
|
|
214
|
-
await this.
|
|
192
|
+
await this.stateService.append_user_message({
|
|
215
193
|
text: String(input.text || "").trim(),
|
|
216
194
|
});
|
|
217
|
-
await this.ensureTitleFromHistory({ generate: true });
|
|
218
|
-
await this.touchMetadata();
|
|
219
195
|
}
|
|
220
196
|
/**
|
|
221
197
|
* 追加一条 assistant 文本消息。
|
|
222
198
|
*/
|
|
223
199
|
async appendAssistantMessage(input) {
|
|
224
|
-
await this.
|
|
200
|
+
await this.stateService.append_assistant_message({
|
|
225
201
|
fallbackText: String(input.text || "").trim(),
|
|
226
202
|
});
|
|
227
|
-
await this.touchMetadata();
|
|
228
203
|
}
|
|
229
204
|
/**
|
|
230
205
|
* 读取当前 session 详情。
|
|
231
206
|
*/
|
|
232
207
|
async getInfo() {
|
|
233
|
-
|
|
234
|
-
readSessionMetadata({
|
|
235
|
-
projectRoot: this.projectRoot,
|
|
236
|
-
agentId: this.agentId,
|
|
237
|
-
sessionId: this.id,
|
|
238
|
-
}),
|
|
239
|
-
this.historyStore.list(),
|
|
240
|
-
]);
|
|
241
|
-
const metadataWithTitle = metadata.title
|
|
242
|
-
? metadata
|
|
243
|
-
: await ensureSessionTitle({
|
|
244
|
-
projectRoot: this.projectRoot,
|
|
245
|
-
agentId: this.agentId,
|
|
246
|
-
sessionId: this.id,
|
|
247
|
-
messages,
|
|
248
|
-
});
|
|
249
|
-
return buildSessionInfo({
|
|
250
|
-
projectRoot: this.projectRoot,
|
|
251
|
-
agentId: this.agentId,
|
|
252
|
-
sessionId: this.id,
|
|
253
|
-
metadata: metadataWithTitle,
|
|
254
|
-
messages,
|
|
255
|
-
executing: this.isExecuting(),
|
|
256
|
-
});
|
|
208
|
+
return await this.viewService.get_info();
|
|
257
209
|
}
|
|
258
210
|
/**
|
|
259
211
|
* 读取当前 session 历史分页。
|
|
260
212
|
*/
|
|
261
213
|
async history(input) {
|
|
262
|
-
|
|
263
|
-
this.getInfo(),
|
|
264
|
-
this.historyStore.list(),
|
|
265
|
-
]);
|
|
266
|
-
return buildSessionHistoryPage({
|
|
267
|
-
session,
|
|
268
|
-
messages,
|
|
269
|
-
input,
|
|
270
|
-
});
|
|
214
|
+
return await this.viewService.history(input);
|
|
271
215
|
}
|
|
272
216
|
/**
|
|
273
|
-
* 读取当前 session 生效的 system
|
|
274
|
-
*
|
|
275
|
-
* 关键点(中文)
|
|
276
|
-
* - 返回内容与实际 run 时使用的 SDK system composer 同源。
|
|
277
|
-
* - 包含 instruction/core、受托管 plugin system、显式注册 plugin system 与 session 上下文。
|
|
278
|
-
* - 返回结构化快照,不把 system prompt 写入会话历史。
|
|
217
|
+
* 读取当前 session 生效的 system 快照。
|
|
279
218
|
*/
|
|
280
219
|
async system() {
|
|
281
|
-
|
|
282
|
-
agentId: this.agentId,
|
|
283
|
-
projectRoot: this.projectRoot,
|
|
284
|
-
sessionId: this.id,
|
|
285
|
-
createdAt: this.createdAt,
|
|
286
|
-
timezone: this.timezone,
|
|
287
|
-
getInstructionSystemBlocks: this.getInstructionSystemBlocks,
|
|
288
|
-
getManagedPluginSystemBlocks: this.getManagedPluginSystemBlocks,
|
|
289
|
-
getPluginSystemBlocks: this.getPluginSystemBlocks,
|
|
290
|
-
});
|
|
291
|
-
return {
|
|
292
|
-
sessionId: this.id,
|
|
293
|
-
session: {
|
|
294
|
-
agentId: this.agentId,
|
|
295
|
-
sessionId: this.id,
|
|
296
|
-
projectRoot: this.projectRoot,
|
|
297
|
-
createdAt: new Date(this.createdAt).toISOString(),
|
|
298
|
-
timezone: this.timezone,
|
|
299
|
-
},
|
|
300
|
-
blocks,
|
|
301
|
-
};
|
|
220
|
+
return await this.viewService.system();
|
|
302
221
|
}
|
|
303
222
|
/**
|
|
304
223
|
* 返回当前 session 是否正在执行。
|
|
305
224
|
*/
|
|
306
225
|
isExecuting() {
|
|
307
|
-
return this.
|
|
226
|
+
return this.turnService.is_prompt_runtime_active() || this.executor.isExecuting();
|
|
308
227
|
}
|
|
309
228
|
/**
|
|
310
229
|
* 清理当前 session 的执行器缓存。
|
|
@@ -316,41 +235,7 @@ export class Session {
|
|
|
316
235
|
* 从当前 session 创建一个分叉会话。
|
|
317
236
|
*/
|
|
318
237
|
async fork(input) {
|
|
319
|
-
|
|
320
|
-
? String(input || "").trim() || undefined
|
|
321
|
-
: String(input?.messageId || "").trim() || undefined;
|
|
322
|
-
const messages = await this.historyStore.list();
|
|
323
|
-
const forkMessages = !messageId
|
|
324
|
-
? messages
|
|
325
|
-
: (() => {
|
|
326
|
-
const targetIndex = messages.findIndex((message) => String(message.id || "").trim() === messageId);
|
|
327
|
-
if (targetIndex < 0) {
|
|
328
|
-
throw new Error(`Cannot fork session "${this.id}": messageId "${messageId}" not found.`);
|
|
329
|
-
}
|
|
330
|
-
return messages.slice(0, targetIndex + 1);
|
|
331
|
-
})();
|
|
332
|
-
const forked = new Session({
|
|
333
|
-
agentId: this.agentId,
|
|
334
|
-
projectRoot: this.projectRoot,
|
|
335
|
-
sessionId: `fork-${Date.now()}-${nanoid(8)}`,
|
|
336
|
-
tools: this.tools,
|
|
337
|
-
logger: this.logger,
|
|
338
|
-
getInstructionSystemBlocks: this.getInstructionSystemBlocks,
|
|
339
|
-
getManagedPluginSystemBlocks: this.getManagedPluginSystemBlocks,
|
|
340
|
-
getPluginSystemBlocks: this.getPluginSystemBlocks,
|
|
341
|
-
});
|
|
342
|
-
await forked.initialize();
|
|
343
|
-
if (this.sessionConfig.model) {
|
|
344
|
-
await forked.set({
|
|
345
|
-
model: this.sessionConfig.model,
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
for (const message of forkMessages) {
|
|
349
|
-
await forked.historyStore.append(message);
|
|
350
|
-
}
|
|
351
|
-
await forked.ensureTitleFromHistory({ generate: true });
|
|
352
|
-
await forked.touchMetadata();
|
|
353
|
-
return forked;
|
|
238
|
+
return await this.viewService.fork(input);
|
|
354
239
|
}
|
|
355
240
|
/**
|
|
356
241
|
* 返回供受托管 plugin 使用的 session 端口。
|
|
@@ -361,25 +246,19 @@ export class Session {
|
|
|
361
246
|
this.runtimePort = createRuntimeSessionPort({
|
|
362
247
|
sessionId: this.id,
|
|
363
248
|
getExecutor: () => this.executor.getExecutor(),
|
|
364
|
-
prompt: async (input) =>
|
|
365
|
-
|
|
366
|
-
},
|
|
367
|
-
subscribe: (subscriber) => {
|
|
368
|
-
return this.subscribe(subscriber);
|
|
369
|
-
},
|
|
249
|
+
prompt: async (input) => await this.prompt(input),
|
|
250
|
+
subscribe: (subscriber) => this.subscribe(subscriber),
|
|
370
251
|
clearExecutor: () => {
|
|
371
252
|
this.executor.clearExecutor();
|
|
372
253
|
},
|
|
373
254
|
afterSessionUpdatedAsync: async () => {
|
|
374
255
|
await this.executor.afterSessionUpdatedAsync();
|
|
375
256
|
},
|
|
376
|
-
appendUserMessage: async (
|
|
377
|
-
await this.
|
|
378
|
-
await this.ensureTitleFromHistory({ generate: true });
|
|
379
|
-
await this.touchMetadata();
|
|
257
|
+
appendUserMessage: async (message_params) => {
|
|
258
|
+
await this.stateService.append_user_message(message_params);
|
|
380
259
|
},
|
|
381
|
-
appendAssistantMessage: async (
|
|
382
|
-
await this.
|
|
260
|
+
appendAssistantMessage: async (message_params) => {
|
|
261
|
+
await this.stateService.append_assistant_message(message_params);
|
|
383
262
|
},
|
|
384
263
|
isExecuting: () => this.isExecuting(),
|
|
385
264
|
historyStore: this.historyStore,
|
|
@@ -387,7 +266,7 @@ export class Session {
|
|
|
387
266
|
await this.ensureReadyForExecution();
|
|
388
267
|
},
|
|
389
268
|
touchMetadata: async () => {
|
|
390
|
-
await this.
|
|
269
|
+
await this.stateService.touch_metadata();
|
|
391
270
|
},
|
|
392
271
|
});
|
|
393
272
|
return this.runtimePort;
|
|
@@ -396,149 +275,47 @@ export class Session {
|
|
|
396
275
|
* 在执行前确保 session 已完成初始化与宿主装配。
|
|
397
276
|
*/
|
|
398
277
|
async ensureReadyForExecution() {
|
|
399
|
-
await this.
|
|
400
|
-
if (this.ensureConfiguredPromise) {
|
|
401
|
-
await this.ensureConfiguredPromise;
|
|
402
|
-
return;
|
|
403
|
-
}
|
|
404
|
-
this.ensureConfiguredPromise = (async () => {
|
|
405
|
-
if (!this.ensureConfiguredHook)
|
|
406
|
-
return;
|
|
407
|
-
await this.ensureConfiguredHook(this);
|
|
408
|
-
})();
|
|
409
|
-
try {
|
|
410
|
-
await this.ensureConfiguredPromise;
|
|
411
|
-
}
|
|
412
|
-
catch (error) {
|
|
413
|
-
this.ensureConfiguredPromise = null;
|
|
414
|
-
throw error;
|
|
415
|
-
}
|
|
278
|
+
await this.stateService.ensure_ready_for_execution();
|
|
416
279
|
}
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
if (!this.sessionConfig.model) {
|
|
420
|
-
throw new Error(`Session "${this.id}" requires a configured model. Pass model to new Agent({ model }) or call session.set({ model }) first.`);
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
async touchMetadata() {
|
|
424
|
-
await touchSessionMetadata({
|
|
425
|
-
projectRoot: this.projectRoot,
|
|
280
|
+
createChildSession(session_id) {
|
|
281
|
+
return new Session({
|
|
426
282
|
agentId: this.agentId,
|
|
427
|
-
sessionId: this.id,
|
|
428
|
-
sessionConfig: this.sessionConfig,
|
|
429
|
-
});
|
|
430
|
-
}
|
|
431
|
-
async ensureTitleFromHistory(input) {
|
|
432
|
-
const messages = await this.historyStore.list();
|
|
433
|
-
const beforeMetadata = await readSessionMetadata({
|
|
434
283
|
projectRoot: this.projectRoot,
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
sessionId: this.id,
|
|
443
|
-
messages,
|
|
444
|
-
...(input?.generate ? { model: this.sessionConfig.model } : {}),
|
|
445
|
-
generate: input?.generate === true,
|
|
446
|
-
});
|
|
447
|
-
const nextTitle = String(nextMetadata.title || "").trim();
|
|
448
|
-
if (!nextTitle || nextTitle === beforeTitle)
|
|
449
|
-
return;
|
|
450
|
-
this.eventHub.publish({
|
|
451
|
-
type: "session-title",
|
|
452
|
-
sessionId: this.id,
|
|
453
|
-
title: nextTitle,
|
|
284
|
+
sessionId: session_id,
|
|
285
|
+
tools: this.tools,
|
|
286
|
+
logger: this.logger,
|
|
287
|
+
getInstructionSystemBlocks: this.getInstructionSystemBlocks,
|
|
288
|
+
getManagedPluginSystemBlocks: this.getManagedPluginSystemBlocks,
|
|
289
|
+
getPluginSystemBlocks: this.getPluginSystemBlocks,
|
|
290
|
+
composers: this.composers,
|
|
454
291
|
});
|
|
455
292
|
}
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
projectRoot: this.projectRoot,
|
|
293
|
+
create_composer_context() {
|
|
294
|
+
return {
|
|
459
295
|
agentId: this.agentId,
|
|
296
|
+
projectRoot: this.projectRoot,
|
|
460
297
|
sessionId: this.id,
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
text: String(input.query || "").trim(),
|
|
469
|
-
metadata: {
|
|
470
|
-
sessionId: this.id,
|
|
471
|
-
},
|
|
472
|
-
});
|
|
473
|
-
await this.executor.appendUserMessage({
|
|
474
|
-
message,
|
|
475
|
-
});
|
|
476
|
-
await this.ensureTitleFromHistory({ generate: true });
|
|
477
|
-
await this.touchMetadata();
|
|
478
|
-
return message;
|
|
479
|
-
}
|
|
480
|
-
async executePromptTurn(input) {
|
|
481
|
-
const toolNameByCallId = new Map();
|
|
482
|
-
const result = await this.executor.run({
|
|
483
|
-
query: input.promptInput.query,
|
|
484
|
-
onStepCallback: input.onStepMerge,
|
|
485
|
-
onAssistantStepCallback: async (step) => {
|
|
486
|
-
this.eventHub.publish({
|
|
487
|
-
type: "assistant-step",
|
|
488
|
-
turnId: input.turnId,
|
|
489
|
-
text: step.text,
|
|
490
|
-
stepIndex: step.stepIndex,
|
|
491
|
-
...(step.visibility ? { visibility: step.visibility } : {}),
|
|
492
|
-
});
|
|
493
|
-
},
|
|
494
|
-
onUiMessageChunkCallback: async (chunk) => {
|
|
495
|
-
if (chunk.type === "tool-input-start") {
|
|
496
|
-
toolNameByCallId.set(chunk.toolCallId, chunk.toolName);
|
|
497
|
-
return;
|
|
498
|
-
}
|
|
499
|
-
const event = mapUiMessageChunkToAgentEvent(chunk);
|
|
500
|
-
if (!event)
|
|
501
|
-
return;
|
|
502
|
-
const resolvedEvent = (event.type === "tool-result" ||
|
|
503
|
-
event.type === "tool-error") &&
|
|
504
|
-
event.toolName === "unknown"
|
|
505
|
-
? {
|
|
506
|
-
...event,
|
|
507
|
-
toolName: toolNameByCallId.get(event.toolCallId) || event.toolName,
|
|
508
|
-
}
|
|
509
|
-
: event;
|
|
510
|
-
if (resolvedEvent.type === "tool-call" ||
|
|
511
|
-
resolvedEvent.type === "tool-error") {
|
|
512
|
-
toolNameByCallId.set(resolvedEvent.toolCallId, resolvedEvent.toolName);
|
|
513
|
-
}
|
|
514
|
-
const sessionEvent = mapAgentEventToSessionEvent({
|
|
515
|
-
event: resolvedEvent,
|
|
516
|
-
turnId: input.turnId,
|
|
517
|
-
});
|
|
518
|
-
if (sessionEvent) {
|
|
519
|
-
this.eventHub.publish(sessionEvent);
|
|
520
|
-
}
|
|
521
|
-
},
|
|
522
|
-
});
|
|
523
|
-
await this.persistAssistantResult(result.assistantMessage);
|
|
524
|
-
await this.persistDeferredUserMessages();
|
|
525
|
-
return {
|
|
526
|
-
text: extractTextFromUiMessage(result.assistantMessage),
|
|
527
|
-
success: result.success,
|
|
528
|
-
assistantMessage: result.assistantMessage,
|
|
529
|
-
...(result.error ? { error: result.error } : {}),
|
|
298
|
+
historyStore: this.historyStore,
|
|
299
|
+
getTools: () => this.tools,
|
|
300
|
+
getInstructionSystemBlocks: this.getInstructionSystemBlocks,
|
|
301
|
+
getManagedPluginSystemBlocks: this.getManagedPluginSystemBlocks,
|
|
302
|
+
getPluginSystemBlocks: this.getPluginSystemBlocks,
|
|
303
|
+
getSessionCreatedAt: () => this.localState.createdAt,
|
|
304
|
+
getSessionTimezone: () => this.localState.timezone,
|
|
530
305
|
};
|
|
531
306
|
}
|
|
532
|
-
|
|
533
|
-
const
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
if (
|
|
540
|
-
|
|
307
|
+
resolve_composer(input, context, create_default) {
|
|
308
|
+
const composer = this.resolve_optional_composer(input, context);
|
|
309
|
+
return composer || create_default();
|
|
310
|
+
}
|
|
311
|
+
resolve_optional_composer(input, context) {
|
|
312
|
+
if (!input)
|
|
313
|
+
return undefined;
|
|
314
|
+
if (typeof input === "function") {
|
|
315
|
+
const create_composer = input;
|
|
316
|
+
return create_composer(context);
|
|
541
317
|
}
|
|
318
|
+
return input;
|
|
542
319
|
}
|
|
543
320
|
}
|
|
544
321
|
//# sourceMappingURL=Session.js.map
|