@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.
Files changed (173) hide show
  1. package/README.md +1 -1
  2. package/bin/agent/local/Agent.d.ts +8 -121
  3. package/bin/agent/local/Agent.d.ts.map +1 -1
  4. package/bin/agent/local/Agent.js +63 -381
  5. package/bin/agent/local/Agent.js.map +1 -1
  6. package/bin/agent/local/AgentRuntimeFactory.d.ts +2 -2
  7. package/bin/agent/local/AgentRuntimeFactory.d.ts.map +1 -1
  8. package/bin/agent/local/AgentRuntimeFactory.js +2 -23
  9. package/bin/agent/local/AgentRuntimeFactory.js.map +1 -1
  10. package/bin/agent/local/services/AgentAssemblyService.d.ts +112 -0
  11. package/bin/agent/local/services/AgentAssemblyService.d.ts.map +1 -0
  12. package/bin/agent/local/services/AgentAssemblyService.js +135 -0
  13. package/bin/agent/local/services/AgentAssemblyService.js.map +1 -0
  14. package/bin/agent/local/services/AgentLifecycleService.d.ts +59 -0
  15. package/bin/agent/local/services/AgentLifecycleService.d.ts.map +1 -0
  16. package/bin/agent/local/services/AgentLifecycleService.js +136 -0
  17. package/bin/agent/local/services/AgentLifecycleService.js.map +1 -0
  18. package/bin/agent/local/services/AgentSessionManager.d.ts +106 -0
  19. package/bin/agent/local/services/AgentSessionManager.d.ts.map +1 -0
  20. package/bin/agent/local/services/AgentSessionManager.js +182 -0
  21. package/bin/agent/local/services/AgentSessionManager.js.map +1 -0
  22. package/bin/executor/Executor.d.ts +7 -24
  23. package/bin/executor/Executor.d.ts.map +1 -1
  24. package/bin/executor/Executor.js +73 -361
  25. package/bin/executor/Executor.js.map +1 -1
  26. package/bin/executor/SessionRunScope.d.ts +18 -34
  27. package/bin/executor/SessionRunScope.d.ts.map +1 -1
  28. package/bin/executor/SessionRunScope.js +42 -28
  29. package/bin/executor/SessionRunScope.js.map +1 -1
  30. package/bin/executor/composer/context/LocalSessionContextComposer.d.ts +5 -3
  31. package/bin/executor/composer/context/LocalSessionContextComposer.d.ts.map +1 -1
  32. package/bin/executor/composer/context/LocalSessionContextComposer.js +11 -18
  33. package/bin/executor/composer/context/LocalSessionContextComposer.js.map +1 -1
  34. package/bin/executor/composer/context/SessionContextComposer.d.ts +8 -3
  35. package/bin/executor/composer/context/SessionContextComposer.d.ts.map +1 -1
  36. package/bin/executor/composer/system/SessionSystemComposer.d.ts +2 -1
  37. package/bin/executor/composer/system/SessionSystemComposer.d.ts.map +1 -1
  38. package/bin/executor/composer/system/default/DefaultSessionSystemComposer.d.ts +2 -1
  39. package/bin/executor/composer/system/default/DefaultSessionSystemComposer.d.ts.map +1 -1
  40. package/bin/executor/composer/system/default/DefaultSessionSystemComposer.js +2 -4
  41. package/bin/executor/composer/system/default/DefaultSessionSystemComposer.js.map +1 -1
  42. package/bin/executor/core-engine/CoreEngineRunner.d.ts +62 -0
  43. package/bin/executor/core-engine/CoreEngineRunner.d.ts.map +1 -0
  44. package/bin/executor/core-engine/CoreEngineRunner.js +309 -0
  45. package/bin/executor/core-engine/CoreEngineRunner.js.map +1 -0
  46. package/bin/executor/core-engine/CoreEngineUiStreamCollector.d.ts +5 -0
  47. package/bin/executor/core-engine/CoreEngineUiStreamCollector.d.ts.map +1 -1
  48. package/bin/executor/core-engine/CoreEngineUiStreamCollector.js +2 -4
  49. package/bin/executor/core-engine/CoreEngineUiStreamCollector.js.map +1 -1
  50. package/bin/executor/services/ExecutorInflightService.d.ts +39 -0
  51. package/bin/executor/services/ExecutorInflightService.d.ts.map +1 -0
  52. package/bin/executor/services/ExecutorInflightService.js +75 -0
  53. package/bin/executor/services/ExecutorInflightService.js.map +1 -0
  54. package/bin/executor/services/ExecutorRecoveryPolicy.d.ts +103 -0
  55. package/bin/executor/services/ExecutorRecoveryPolicy.d.ts.map +1 -0
  56. package/bin/executor/services/ExecutorRecoveryPolicy.js +87 -0
  57. package/bin/executor/services/ExecutorRecoveryPolicy.js.map +1 -0
  58. package/bin/executor/tools/plugin/PluginToolBridge.d.ts +19 -0
  59. package/bin/executor/tools/plugin/PluginToolBridge.d.ts.map +1 -0
  60. package/bin/executor/tools/plugin/PluginToolBridge.js +143 -0
  61. package/bin/executor/tools/plugin/PluginToolBridge.js.map +1 -0
  62. package/bin/executor/tools/plugin/PluginToolDefinition.d.ts +32 -0
  63. package/bin/executor/tools/plugin/PluginToolDefinition.d.ts.map +1 -0
  64. package/bin/executor/tools/plugin/PluginToolDefinition.js +27 -0
  65. package/bin/executor/tools/plugin/PluginToolDefinition.js.map +1 -0
  66. package/bin/executor/tools/plugin/PluginToolSchemas.d.ts +14 -0
  67. package/bin/executor/tools/plugin/PluginToolSchemas.d.ts.map +1 -0
  68. package/bin/executor/tools/plugin/PluginToolSchemas.js +19 -0
  69. package/bin/executor/tools/plugin/PluginToolSchemas.js.map +1 -0
  70. package/bin/executor/tools/plugin/types/PluginTool.d.ts +39 -0
  71. package/bin/executor/tools/plugin/types/PluginTool.d.ts.map +1 -0
  72. package/bin/executor/tools/plugin/types/PluginTool.js +9 -0
  73. package/bin/executor/tools/plugin/types/PluginTool.js.map +1 -0
  74. package/bin/executor/tools/shell/ShellToolBridge.js +3 -3
  75. package/bin/executor/tools/shell/ShellToolBridge.js.map +1 -1
  76. package/bin/executor/types/SessionRun.d.ts +18 -0
  77. package/bin/executor/types/SessionRun.d.ts.map +1 -1
  78. package/bin/index.d.ts +10 -1
  79. package/bin/index.d.ts.map +1 -1
  80. package/bin/index.js +3 -0
  81. package/bin/index.js.map +1 -1
  82. package/bin/plugin/core/BasePlugin.d.ts +2 -2
  83. package/bin/plugin/core/BasePlugin.d.ts.map +1 -1
  84. package/bin/plugin/core/BasePlugin.js.map +1 -1
  85. package/bin/plugin/core/ImagePlugin.d.ts +56 -0
  86. package/bin/plugin/core/ImagePlugin.d.ts.map +1 -0
  87. package/bin/plugin/core/ImagePlugin.js +109 -0
  88. package/bin/plugin/core/ImagePlugin.js.map +1 -0
  89. package/bin/session/Session.d.ts +14 -83
  90. package/bin/session/Session.d.ts.map +1 -1
  91. package/bin/session/Session.js +139 -362
  92. package/bin/session/Session.js.map +1 -1
  93. package/bin/session/SessionSystemBuilder.d.ts +2 -1
  94. package/bin/session/SessionSystemBuilder.d.ts.map +1 -1
  95. package/bin/session/SessionSystemBuilder.js +2 -3
  96. package/bin/session/SessionSystemBuilder.js.map +1 -1
  97. package/bin/session/services/SessionStateService.d.ts +132 -0
  98. package/bin/session/services/SessionStateService.d.ts.map +1 -0
  99. package/bin/session/services/SessionStateService.js +242 -0
  100. package/bin/session/services/SessionStateService.js.map +1 -0
  101. package/bin/session/services/SessionTurnService.d.ts +66 -0
  102. package/bin/session/services/SessionTurnService.d.ts.map +1 -0
  103. package/bin/session/services/SessionTurnService.js +137 -0
  104. package/bin/session/services/SessionTurnService.js.map +1 -0
  105. package/bin/session/services/SessionViewService.d.ts +105 -0
  106. package/bin/session/services/SessionViewService.d.ts.map +1 -0
  107. package/bin/session/services/SessionViewService.js +184 -0
  108. package/bin/session/services/SessionViewService.js.map +1 -0
  109. package/bin/types/agent/AgentOptions.d.ts +18 -0
  110. package/bin/types/agent/AgentOptions.d.ts.map +1 -1
  111. package/bin/types/agent/AgentTypes.d.ts +3 -1
  112. package/bin/types/agent/AgentTypes.d.ts.map +1 -1
  113. package/bin/types/agent/SessionTypes.d.ts.map +1 -1
  114. package/bin/types/executor/SessionRunContext.d.ts +66 -0
  115. package/bin/types/executor/SessionRunContext.d.ts.map +1 -0
  116. package/bin/types/executor/SessionRunContext.js +10 -0
  117. package/bin/types/executor/SessionRunContext.js.map +1 -0
  118. package/bin/types/plugin/ImagePlugin.d.ts +94 -0
  119. package/bin/types/plugin/ImagePlugin.d.ts.map +1 -0
  120. package/bin/types/plugin/ImagePlugin.js +10 -0
  121. package/bin/types/plugin/ImagePlugin.js.map +1 -0
  122. package/bin/types/session/SessionComposerOptions.d.ts +90 -0
  123. package/bin/types/session/SessionComposerOptions.d.ts.map +1 -0
  124. package/bin/types/session/SessionComposerOptions.js +10 -0
  125. package/bin/types/session/SessionComposerOptions.js.map +1 -0
  126. package/bin/types/session/SessionLocalState.d.ts +35 -0
  127. package/bin/types/session/SessionLocalState.d.ts.map +1 -0
  128. package/bin/types/session/SessionLocalState.js +10 -0
  129. package/bin/types/session/SessionLocalState.js.map +1 -0
  130. package/bin/types/session/SessionOptions.d.ts +85 -0
  131. package/bin/types/session/SessionOptions.d.ts.map +1 -0
  132. package/bin/types/session/SessionOptions.js +10 -0
  133. package/bin/types/session/SessionOptions.js.map +1 -0
  134. package/package.json +1 -1
  135. package/src/agent/local/Agent.ts +74 -433
  136. package/src/agent/local/AgentRuntimeFactory.ts +4 -25
  137. package/src/agent/local/services/AgentAssemblyService.ts +268 -0
  138. package/src/agent/local/services/AgentLifecycleService.ts +187 -0
  139. package/src/agent/local/services/AgentSessionManager.ts +291 -0
  140. package/src/executor/Executor.ts +103 -441
  141. package/src/executor/README.md +4 -4
  142. package/src/executor/SessionRunScope.ts +47 -71
  143. package/src/executor/composer/context/LocalSessionContextComposer.ts +24 -20
  144. package/src/executor/composer/context/SessionContextComposer.ts +13 -3
  145. package/src/executor/composer/system/SessionSystemComposer.ts +2 -1
  146. package/src/executor/composer/system/default/DefaultSessionSystemComposer.ts +3 -4
  147. package/src/executor/core-engine/CoreEngineRunner.ts +433 -0
  148. package/src/executor/core-engine/CoreEngineUiStreamCollector.ts +7 -5
  149. package/src/executor/services/ExecutorInflightService.ts +101 -0
  150. package/src/executor/services/ExecutorRecoveryPolicy.ts +213 -0
  151. package/src/executor/tools/plugin/PluginToolBridge.ts +161 -0
  152. package/src/executor/tools/plugin/PluginToolDefinition.ts +32 -0
  153. package/src/executor/tools/plugin/PluginToolSchemas.ts +20 -0
  154. package/src/executor/tools/plugin/types/PluginTool.ts +41 -0
  155. package/src/executor/tools/shell/ShellToolBridge.ts +3 -3
  156. package/src/executor/types/SessionRun.ts +20 -0
  157. package/src/index.ts +33 -0
  158. package/src/plugin/core/BasePlugin.ts +2 -2
  159. package/src/plugin/core/ImagePlugin.ts +128 -0
  160. package/src/session/Session.ts +178 -485
  161. package/src/session/SessionSystemBuilder.ts +3 -3
  162. package/src/session/services/SessionStateService.ts +341 -0
  163. package/src/session/services/SessionTurnService.ts +202 -0
  164. package/src/session/services/SessionViewService.ts +301 -0
  165. package/src/types/agent/AgentOptions.ts +25 -0
  166. package/src/types/agent/AgentTypes.ts +10 -0
  167. package/src/types/agent/SessionTypes.ts +1 -0
  168. package/src/types/executor/SessionRunContext.ts +76 -0
  169. package/src/types/plugin/ImagePlugin.ts +103 -0
  170. package/src/types/session/SessionComposerOptions.ts +107 -0
  171. package/src/types/session/SessionLocalState.ts +40 -0
  172. package/src/types/session/SessionOptions.ts +99 -0
  173. package/tsconfig.tsbuildinfo +1 -1
@@ -6,7 +6,7 @@
6
6
 
7
7
  - `Session`:用户/SDK 面向的完整会话对象,负责模型配置、历史入口、prompt 入口和分叉能力。
8
8
  - `Executor`:单个 session 的内部单轮执行引擎,负责并发锁、执行 scope、Composer 编排、压缩重试、assistant step 持久化和 tool-loop 调用。
9
- - `Composer`:执行前的材料组装协议,只负责把原材料组装成某一阶段输入,不直接执行模型,也没有公共运行时基类。
9
+ - `Composer`:Session 执行阶段的可替换策略协议。调用方可以通过 custom composer 定义 system、history、runtime context 与 compaction 等阶段逻辑。
10
10
  - `HistoryStore`:历史事实源,负责 JSONL 读写、meta、archive、lock、compact 与消息工厂。
11
11
  - `HistoryComposer`:历史组装策略,只负责把 `HistoryStore` 中的历史组装成本轮模型输入。
12
12
  - `CoreEngine`:Executor 内部的模型/tool-loop 核心机制,负责模型流、tool calls、续写和最终 assistant message 合并。
@@ -38,7 +38,7 @@ sdk/Session.prompt({ query })
38
38
 
39
39
  ## Composer 的代码实现方式
40
40
 
41
- Composer 在代码里是 TypeScript `interface`,不是抽象基类。每个 Composer 只声明当前阶段需要的最小协议,实现类用 `implements` 接上。
41
+ Composer 在代码里是 TypeScript `interface`,不是抽象基类。每个 Composer 声明当前阶段的策略协议,实现类用 `implements` 接上;如果需要自定义 Composer,应在自定义 `Session` 类中传给 `super({ composers })`。
42
42
 
43
43
  ```ts
44
44
  export interface SessionSystemComposer {
@@ -76,9 +76,9 @@ Executor.prepareExecuteInput()
76
76
  边界规则:
77
77
 
78
78
  - Composer 不调用模型,模型调用只发生在 `Executor.runCoreEngine()`。
79
- - Composer 不持有历史事实,历史事实由 `HistoryStore` 负责。
79
+ - Composer 可以绑定或读取当前 session 的上下文,但历史事实源仍由 `HistoryStore` 负责。
80
80
  - Composer 不管理 session 生命周期,生命周期由 `Session` / `Executor` 管理。
81
- - Composer 可以读取上下文并做策略判断,但输出应该是“本轮执行材料”。
81
+ - Composer 可以读取上下文并做策略判断,输出或执行结果应该服务于当前阶段的本轮 session 执行。
82
82
 
83
83
  ## 当前目录结构
84
84
 
@@ -1,54 +1,20 @@
1
1
  import { AsyncLocalStorage } from "node:async_hooks";
2
+ import type { FileUIPart } from "ai";
2
3
  import type { SessionUserMessageV1 } from "@/executor/types/SessionMessages.js";
3
- import type {
4
- SessionAssistantStepCallback,
5
- SessionUiMessageChunkCallback,
6
- } from "@/executor/types/SessionRun.js";
4
+ import type { SessionRunContext } from "@/types/executor/SessionRunContext.js";
7
5
 
8
6
  /**
9
7
  * SessionRunScope(单次请求作用域)。
10
8
  *
11
9
  * 关键点(中文)
12
10
  * - 这是 session run 层请求作用域上下文,不属于具体 plugin 业务模块。
13
- * - 统一承载请求链需要透传的字段(如 `sessionId`)。
11
+ * - 当前阶段仅作为深层工具回调读取 `runContext` 的薄包装。
14
12
  */
15
13
  export type SessionRunScope = {
16
- sessionId?: string;
17
14
  /**
18
- * step 边界合并回调(可选)。
19
- *
20
- * 关键点(中文)
21
- * - 由调用侧(如 chat queue)注入。
22
- * - Orchestrator 从 SessionRunScope 读取并编排到本轮运行上下文。
15
+ * 当前显式运行上下文。
23
16
  */
24
- onStepCallback?: () => Promise<SessionUserMessageV1[]>;
25
-
26
- /**
27
- * assistant step 完成回调(可选)。
28
- *
29
- * 关键点(中文)
30
- * - 在每个 LLM step 结束时触发。
31
- * - 用于把中间文本增量派发到外部通道(如 direct 模式分步发送)。
32
- */
33
- onAssistantStepCallback?: SessionAssistantStepCallback;
34
-
35
- /**
36
- * UI stream chunk 回调(可选)。
37
- *
38
- * 关键点(中文)
39
- * - 用于把底层模型 UI stream 事件向上层 SDK / transport 旁路输出。
40
- * - 不影响最终 assistantMessage 的收敛与落盘。
41
- */
42
- onUiMessageChunkCallback?: SessionUiMessageChunkCallback;
43
-
44
- /**
45
- * 运行时注入的 user 消息队列(可选)。
46
- *
47
- * 关键点(中文)
48
- * - 用于在 tool 执行后向下一 step 注入结构化 user 消息。
49
- * - 队列内容由上层 plugin runtime 通过统一协议下发,main 不感知业务语义。
50
- */
51
- injectedUserMessages?: SessionUserMessageV1[];
17
+ runContext: SessionRunContext;
52
18
  };
53
19
 
54
20
  /**
@@ -56,23 +22,10 @@ export type SessionRunScope = {
56
22
  *
57
23
  * 关键点(中文)
58
24
  * - 同一条异步调用链内可读取一致的 SessionRunScope。
59
- * - 用于把 `sessionId` 从入口透传到 plugin runtime 与工具层。
25
+ * - 当前主要用于 tool 深层桥接层读取活跃 runContext。
60
26
  */
61
27
  export const sessionRunScopeStorage = new AsyncLocalStorage<SessionRunScope>();
62
28
 
63
- /**
64
- * 待持久化的运行时注入 user 消息队列(按 sessionId)。
65
- *
66
- * 关键点(中文)
67
- * - sessionRunScopeStorage 中的 injectedUserMessages 只负责“下一 step 临时可见”。
68
- * - 为了让时间线顺序稳定,这里把“真正写入历史”的动作延后到
69
- * assistant message 落盘之后再统一执行。
70
- */
71
- const deferredPersistedUserMessagesBySession = new Map<
72
- string,
73
- SessionUserMessageV1[]
74
- >();
75
-
76
29
  /**
77
30
  * 在当前异步调用链内绑定 session run 作用域。
78
31
  */
@@ -87,6 +40,13 @@ export function getSessionRunScope(): SessionRunScope | undefined {
87
40
  return sessionRunScopeStorage.getStore();
88
41
  }
89
42
 
43
+ /**
44
+ * 读取当前异步链路上的显式 runContext。
45
+ */
46
+ export function getSessionRunContext(): SessionRunContext | undefined {
47
+ return sessionRunScopeStorage.getStore()?.runContext;
48
+ }
49
+
90
50
  /**
91
51
  * 入队一条“待注入 user 消息”。
92
52
  *
@@ -96,12 +56,9 @@ export function getSessionRunScope(): SessionRunScope | undefined {
96
56
  export function enqueueInjectedUserMessage(
97
57
  message: SessionUserMessageV1,
98
58
  ): void {
99
- const store = sessionRunScopeStorage.getStore();
100
- if (!store || !message) return;
101
- if (!Array.isArray(store.injectedUserMessages)) {
102
- store.injectedUserMessages = [];
103
- }
104
- store.injectedUserMessages.push(message);
59
+ const run_context = getSessionRunContext();
60
+ if (!run_context || !message) return;
61
+ run_context.injectedUserMessages.push(message);
105
62
  }
106
63
 
107
64
  /**
@@ -111,10 +68,10 @@ export function enqueueInjectedUserMessage(
111
68
  * - 采用 drain 语义,确保每条注入消息只在下一 step 使用一次。
112
69
  */
113
70
  export function drainInjectedUserMessages(): SessionUserMessageV1[] {
114
- const store = sessionRunScopeStorage.getStore();
115
- if (!store || !Array.isArray(store.injectedUserMessages)) return [];
116
- const out = [...store.injectedUserMessages];
117
- store.injectedUserMessages = [];
71
+ const run_context = getSessionRunContext();
72
+ if (!run_context) return [];
73
+ const out = [...run_context.injectedUserMessages];
74
+ run_context.injectedUserMessages = [];
118
75
  return out;
119
76
  }
120
77
 
@@ -125,11 +82,11 @@ export function enqueueDeferredPersistedUserMessage(
125
82
  sessionId: string,
126
83
  message: SessionUserMessageV1,
127
84
  ): void {
85
+ const run_context = getSessionRunContext();
128
86
  const key = String(sessionId || "").trim();
129
- if (!key || !message) return;
130
- const current = deferredPersistedUserMessagesBySession.get(key) || [];
131
- current.push(message);
132
- deferredPersistedUserMessagesBySession.set(key, current);
87
+ if (!run_context || !key || !message) return;
88
+ if (run_context.sessionId !== key) return;
89
+ run_context.deferredPersistedUserMessages.push(message);
133
90
  }
134
91
 
135
92
  /**
@@ -138,9 +95,28 @@ export function enqueueDeferredPersistedUserMessage(
138
95
  export function drainDeferredPersistedUserMessages(
139
96
  sessionId: string,
140
97
  ): SessionUserMessageV1[] {
98
+ const run_context = getSessionRunContext();
141
99
  const key = String(sessionId || "").trim();
142
- if (!key) return [];
143
- const current = deferredPersistedUserMessagesBySession.get(key) || [];
144
- deferredPersistedUserMessagesBySession.delete(key);
145
- return [...current];
100
+ if (!run_context || !key || run_context.sessionId !== key) return [];
101
+ const current = [...run_context.deferredPersistedUserMessages];
102
+ run_context.deferredPersistedUserMessages = [];
103
+ return current;
104
+ }
105
+
106
+ /**
107
+ * 入队一组“待并入 assistant 消息的 file parts”。
108
+ */
109
+ export function enqueueAssistantFileParts(parts: FileUIPart[]): void {
110
+ const run_context = getSessionRunContext();
111
+ if (!run_context || !Array.isArray(parts) || parts.length === 0) return;
112
+ run_context.pendingAssistantFileParts.push(...parts);
113
+ }
114
+
115
+ /**
116
+ * 读取当前 run 内待并入 assistant 消息的 file parts。
117
+ */
118
+ export function readPendingAssistantFileParts(): FileUIPart[] {
119
+ const run_context = getSessionRunContext();
120
+ if (!run_context) return [];
121
+ return [...run_context.pendingAssistantFileParts];
146
122
  }
@@ -8,10 +8,6 @@
8
8
 
9
9
  import type { ModelMessage } from "ai";
10
10
  import { generateId } from "@/utils/Id.js";
11
- import {
12
- drainInjectedUserMessages,
13
- getSessionRunScope,
14
- } from "@executor/SessionRunScope.js";
15
11
  import type {
16
12
  SessionContextComposer,
17
13
  SessionContextComposeResult,
@@ -19,6 +15,7 @@ import type {
19
15
  import type { SessionMessageV1 } from "@/executor/types/SessionMessages.js";
20
16
  import type { SessionSystemMessage } from "@/executor/types/SessionPrompts.js";
21
17
  import type { Tool } from "ai";
18
+ import type { SessionRunContext } from "@/types/executor/SessionRunContext.js";
22
19
 
23
20
  type LocalSessionContextComposerOptions = {
24
21
  /**
@@ -45,19 +42,18 @@ export class LocalSessionContextComposer implements SessionContextComposer {
45
42
  this.getTools = options.getTools;
46
43
  }
47
44
 
48
- async compose(): Promise<SessionContextComposeResult> {
45
+ async compose(
46
+ run_context: SessionRunContext,
47
+ ): Promise<SessionContextComposeResult> {
49
48
  const tools = this.getTools();
50
- const ctx = getSessionRunScope();
51
- const sessionId = String(ctx?.sessionId || this.sessionId || "").trim();
49
+ const sessionId = String(
50
+ run_context.sessionId || this.sessionId || "",
51
+ ).trim();
52
52
  if (!sessionId) {
53
53
  throw new Error(
54
- "LocalSessionContextComposer.compose requires a sessionId from sessionRunScope or options.sessionId",
54
+ "LocalSessionContextComposer.compose requires a non-empty sessionId",
55
55
  );
56
56
  }
57
- // 关键点(中文):sessionId 统一回填到请求上下文,后续组件直接读取。
58
- if (ctx && typeof ctx === "object") {
59
- if (!ctx.sessionId) ctx.sessionId = sessionId;
60
- }
61
57
  return {
62
58
  tools,
63
59
  };
@@ -69,6 +65,7 @@ export class LocalSessionContextComposer implements SessionContextComposer {
69
65
  appendMergedUserMessages: (
70
66
  messages: SessionMessageV1[],
71
67
  ) => Promise<ModelMessage[]>;
68
+ runContext: SessionRunContext;
72
69
  },
73
70
  ): (input: { messages?: ModelMessage[] }) => Promise<{
74
71
  system: SessionSystemMessage[];
@@ -82,8 +79,9 @@ export class LocalSessionContextComposer implements SessionContextComposer {
82
79
  system: SessionSystemMessage[];
83
80
  messages?: ModelMessage[];
84
81
  }> => {
85
- const injectedMessages = drainInjectedUserMessages();
86
- const onStepCallback = getSessionRunScope()?.onStepCallback;
82
+ const injectedMessages = [...input.runContext.injectedUserMessages];
83
+ input.runContext.injectedUserMessages = [];
84
+ const onStepCallback = input.runContext.onStepCallback;
87
85
  if (
88
86
  typeof onStepCallback !== "function" &&
89
87
  injectedMessages.length === 0
@@ -120,8 +118,10 @@ export class LocalSessionContextComposer implements SessionContextComposer {
120
118
  };
121
119
  }
122
120
 
123
- createOnStepFinishHandler(): (stepResult: unknown) => Promise<void> {
124
- const onAssistantStepCallback = getSessionRunScope()?.onAssistantStepCallback;
121
+ createOnStepFinishHandler(
122
+ run_context: SessionRunContext,
123
+ ): (stepResult: unknown) => Promise<void> {
124
+ const onAssistantStepCallback = run_context.onAssistantStepCallback;
125
125
  let assistantStepIndex = 0;
126
126
  return async (stepResult: unknown): Promise<void> => {
127
127
  const step = stepResult as { text?: unknown };
@@ -144,12 +144,16 @@ export class LocalSessionContextComposer implements SessionContextComposer {
144
144
  /**
145
145
  * 构造 fallback assistant 消息。
146
146
  */
147
- buildFallbackAssistantMessage(text: string): SessionMessageV1 {
148
- const ctx = getSessionRunScope();
149
- const sessionId = String(ctx?.sessionId || this.sessionId || "").trim();
147
+ buildFallbackAssistantMessage(
148
+ text: string,
149
+ run_context: SessionRunContext,
150
+ ): SessionMessageV1 {
151
+ const sessionId = String(
152
+ run_context.sessionId || this.sessionId || "",
153
+ ).trim();
150
154
  if (!sessionId) {
151
155
  throw new Error(
152
- "LocalSessionContextComposer.buildFallbackAssistantMessage requires a sessionId from sessionRunScope or options.sessionId",
156
+ "LocalSessionContextComposer.buildFallbackAssistantMessage requires a non-empty sessionId",
153
157
  );
154
158
  }
155
159
  return {
@@ -9,6 +9,7 @@
9
9
  import type { ModelMessage, Tool } from "ai";
10
10
  import type { SessionMessageV1 } from "@/executor/types/SessionMessages.js";
11
11
  import type { SessionSystemMessage } from "@/executor/types/SessionPrompts.js";
12
+ import type { SessionRunContext } from "@/types/executor/SessionRunContext.js";
12
13
 
13
14
  /**
14
15
  * 本轮运行上下文组装输出。
@@ -32,7 +33,7 @@ export interface SessionContextComposer {
32
33
  /**
33
34
  * 组装一次 run 所需上下文。
34
35
  */
35
- compose(): Promise<SessionContextComposeResult>;
36
+ compose(run_context: SessionRunContext): Promise<SessionContextComposeResult>;
36
37
 
37
38
  /**
38
39
  * 构造 prepareStep 回调。
@@ -49,6 +50,10 @@ export interface SessionContextComposer {
49
50
  appendMergedUserMessages: (
50
51
  messages: SessionMessageV1[],
51
52
  ) => Promise<ModelMessage[]>;
53
+ /**
54
+ * 当前显式运行上下文。
55
+ */
56
+ runContext: SessionRunContext;
52
57
  },
53
58
  ): (input: { messages?: ModelMessage[] }) => Promise<{
54
59
  system: SessionSystemMessage[];
@@ -58,7 +63,9 @@ export interface SessionContextComposer {
58
63
  /**
59
64
  * 构造 onStepFinish 回调。
60
65
  */
61
- createOnStepFinishHandler(): (stepResult: unknown) => Promise<void>;
66
+ createOnStepFinishHandler(
67
+ run_context: SessionRunContext,
68
+ ): (stepResult: unknown) => Promise<void>;
62
69
 
63
70
  /**
64
71
  * 构造 fallback assistant 消息。
@@ -66,5 +73,8 @@ export interface SessionContextComposer {
66
73
  * 关键点(中文)
67
74
  * - fallback 消息构造由 ContextComposer 内部实现,Executor 不直接依赖 history Composer。
68
75
  */
69
- buildFallbackAssistantMessage(text: string): SessionMessageV1;
76
+ buildFallbackAssistantMessage(
77
+ text: string,
78
+ run_context: SessionRunContext,
79
+ ): SessionMessageV1;
70
80
  }
@@ -7,6 +7,7 @@
7
7
  */
8
8
 
9
9
  import type { SystemModelMessage } from "ai";
10
+ import type { SessionRunContext } from "@/types/executor/SessionRunContext.js";
10
11
 
11
12
  /**
12
13
  * Session system Composer 协议。
@@ -20,5 +21,5 @@ export interface SessionSystemComposer {
20
21
  /**
21
22
  * 解析本轮 system messages。
22
23
  */
23
- resolve(): Promise<SystemModelMessage[]>;
24
+ resolve(run_context: SessionRunContext): Promise<SystemModelMessage[]>;
24
25
  }
@@ -9,8 +9,8 @@
9
9
  import type {
10
10
  SessionSystemComposer,
11
11
  } from "@executor/composer/system/SessionSystemComposer.js";
12
- import { getSessionRunScope } from "@executor/SessionRunScope.js";
13
12
  import type { AgentContext } from "@/types/runtime/agent/AgentContext.js";
13
+ import type { SessionRunContext } from "@/types/executor/SessionRunContext.js";
14
14
  import {
15
15
  resolveSessionSystemMessages,
16
16
  type SystemProfile,
@@ -60,9 +60,8 @@ export class DefaultSessionSystemComposer implements SessionSystemComposer {
60
60
  this.profile = options.profile === "task" ? "task" : "chat";
61
61
  }
62
62
 
63
- async resolve() {
64
- const ctx = getSessionRunScope();
65
- const sessionId = String(ctx?.sessionId || "").trim();
63
+ async resolve(run_context: SessionRunContext) {
64
+ const sessionId = String(run_context.sessionId || "").trim();
66
65
  if (!sessionId) {
67
66
  throw new Error("DefaultSessionSystemComposer.resolve requires a non-empty sessionId");
68
67
  }