@downcity/agent 1.1.129 → 1.1.148

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 (228) hide show
  1. package/README.md +2 -2
  2. package/bin/agent/local/Agent.d.ts +40 -26
  3. package/bin/agent/local/Agent.d.ts.map +1 -1
  4. package/bin/agent/local/Agent.js +65 -41
  5. package/bin/agent/local/Agent.js.map +1 -1
  6. package/bin/agent/local/ProjectSetup.js +2 -2
  7. package/bin/agent/local/ProjectSetup.js.map +1 -1
  8. package/bin/agent/local/services/AgentAssemblyService.d.ts +2 -7
  9. package/bin/agent/local/services/AgentAssemblyService.d.ts.map +1 -1
  10. package/bin/agent/local/services/AgentAssemblyService.js +34 -22
  11. package/bin/agent/local/services/AgentAssemblyService.js.map +1 -1
  12. package/bin/agent/local/services/AgentBackgroundService.d.ts +55 -0
  13. package/bin/agent/local/services/AgentBackgroundService.d.ts.map +1 -0
  14. package/bin/agent/local/services/AgentBackgroundService.js +86 -0
  15. package/bin/agent/local/services/AgentBackgroundService.js.map +1 -0
  16. package/bin/agent/local/services/AgentSessionManager.d.ts +16 -7
  17. package/bin/agent/local/services/AgentSessionManager.d.ts.map +1 -1
  18. package/bin/agent/local/services/AgentSessionManager.js +83 -8
  19. package/bin/agent/local/services/AgentSessionManager.js.map +1 -1
  20. package/bin/agent/remote/RemoteAgent.d.ts +9 -13
  21. package/bin/agent/remote/RemoteAgent.d.ts.map +1 -1
  22. package/bin/agent/remote/RemoteAgent.js +23 -24
  23. package/bin/agent/remote/RemoteAgent.js.map +1 -1
  24. package/bin/agent/remote/RemoteSession.d.ts +11 -4
  25. package/bin/agent/remote/RemoteSession.d.ts.map +1 -1
  26. package/bin/agent/remote/RemoteSession.js +15 -3
  27. package/bin/agent/remote/RemoteSession.js.map +1 -1
  28. package/bin/agent/remote/RemoteTransport.d.ts +9 -1
  29. package/bin/agent/remote/RemoteTransport.d.ts.map +1 -1
  30. package/bin/agent/remote/transports/HttpRemoteAgentTransport.d.ts +7 -3
  31. package/bin/agent/remote/transports/HttpRemoteAgentTransport.d.ts.map +1 -1
  32. package/bin/agent/remote/transports/HttpRemoteAgentTransport.js +65 -2
  33. package/bin/agent/remote/transports/HttpRemoteAgentTransport.js.map +1 -1
  34. package/bin/agent/remote/transports/RpcRemoteAgentTransport.d.ts +5 -1
  35. package/bin/agent/remote/transports/RpcRemoteAgentTransport.d.ts.map +1 -1
  36. package/bin/agent/remote/transports/RpcRemoteAgentTransport.js +12 -0
  37. package/bin/agent/remote/transports/RpcRemoteAgentTransport.js.map +1 -1
  38. package/bin/config/AgentInitializer.d.ts +2 -2
  39. package/bin/config/AgentInitializer.js +2 -2
  40. package/bin/executor/Executor.d.ts +5 -0
  41. package/bin/executor/Executor.d.ts.map +1 -1
  42. package/bin/executor/Executor.js +34 -0
  43. package/bin/executor/Executor.js.map +1 -1
  44. package/bin/executor/composer/system/default/InitPrompts.d.ts +1 -1
  45. package/bin/executor/composer/system/default/InitPrompts.js +1 -1
  46. package/bin/executor/composer/system/default/SystemDomain.js +2 -2
  47. package/bin/executor/composer/system/default/SystemDomain.js.map +1 -1
  48. package/bin/executor/core-engine/CoreEngineRunner.d.ts.map +1 -1
  49. package/bin/executor/core-engine/CoreEngineRunner.js +16 -0
  50. package/bin/executor/core-engine/CoreEngineRunner.js.map +1 -1
  51. package/bin/executor/messages/ChatMessageMarkupTypes.d.ts +1 -1
  52. package/bin/executor/messages/ChatMessageMarkupTypes.js +1 -1
  53. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.d.ts +8 -0
  54. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.d.ts.map +1 -1
  55. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.js +22 -0
  56. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.js.map +1 -1
  57. package/bin/executor/types/SessionExecutor.d.ts +8 -0
  58. package/bin/executor/types/SessionExecutor.d.ts.map +1 -1
  59. package/bin/index.d.ts +4 -4
  60. package/bin/index.d.ts.map +1 -1
  61. package/bin/index.js +1 -2
  62. package/bin/index.js.map +1 -1
  63. package/bin/plugin/core/Activation.d.ts +0 -2
  64. package/bin/plugin/core/Activation.d.ts.map +1 -1
  65. package/bin/plugin/core/Activation.js +1 -1
  66. package/bin/plugin/core/Activation.js.map +1 -1
  67. package/bin/plugin/core/PluginCommandRequest.d.ts +1 -1
  68. package/bin/plugin/core/PluginCommandRequest.js +1 -1
  69. package/bin/plugin/core/PluginStateController.d.ts +0 -5
  70. package/bin/plugin/core/PluginStateController.d.ts.map +1 -1
  71. package/bin/plugin/core/PluginStateController.js +1 -5
  72. package/bin/plugin/core/PluginStateController.js.map +1 -1
  73. package/bin/plugin/types/PluginApi.d.ts +1 -1
  74. package/bin/plugin/types/PluginApi.js +1 -1
  75. package/bin/rpc/Client.d.ts +17 -1
  76. package/bin/rpc/Client.d.ts.map +1 -1
  77. package/bin/rpc/Client.js +47 -0
  78. package/bin/rpc/Client.js.map +1 -1
  79. package/bin/session/Session.d.ts +5 -0
  80. package/bin/session/Session.d.ts.map +1 -1
  81. package/bin/session/Session.js +7 -0
  82. package/bin/session/Session.js.map +1 -1
  83. package/bin/session/browse/Browse.d.ts +9 -1
  84. package/bin/session/browse/Browse.d.ts.map +1 -1
  85. package/bin/session/browse/Browse.js +81 -3
  86. package/bin/session/browse/Browse.js.map +1 -1
  87. package/bin/session/index.d.ts +3 -3
  88. package/bin/session/index.d.ts.map +1 -1
  89. package/bin/session/index.js +3 -3
  90. package/bin/session/index.js.map +1 -1
  91. package/bin/session/runtime/SessionPromptRuntime.d.ts +13 -0
  92. package/bin/session/runtime/SessionPromptRuntime.d.ts.map +1 -1
  93. package/bin/session/runtime/SessionPromptRuntime.js +82 -5
  94. package/bin/session/runtime/SessionPromptRuntime.js.map +1 -1
  95. package/bin/session/services/SessionTurnService.d.ts +5 -0
  96. package/bin/session/services/SessionTurnService.d.ts.map +1 -1
  97. package/bin/session/services/SessionTurnService.js +10 -1
  98. package/bin/session/services/SessionTurnService.js.map +1 -1
  99. package/bin/session/services/SessionViewService.d.ts.map +1 -1
  100. package/bin/session/services/SessionViewService.js +1 -7
  101. package/bin/session/services/SessionViewService.js.map +1 -1
  102. package/bin/session/storage/Metadata.d.ts +15 -0
  103. package/bin/session/storage/Metadata.d.ts.map +1 -1
  104. package/bin/session/storage/Metadata.js +15 -1
  105. package/bin/session/storage/Metadata.js.map +1 -1
  106. package/bin/session/storage/Paths.d.ts +24 -0
  107. package/bin/session/storage/Paths.d.ts.map +1 -1
  108. package/bin/session/storage/Paths.js +34 -0
  109. package/bin/session/storage/Paths.js.map +1 -1
  110. package/bin/session/storage/RuntimeSessionPort.d.ts +5 -0
  111. package/bin/session/storage/RuntimeSessionPort.d.ts.map +1 -1
  112. package/bin/session/storage/RuntimeSessionPort.js +4 -0
  113. package/bin/session/storage/RuntimeSessionPort.js.map +1 -1
  114. package/bin/types/agent/AgentOptions.d.ts +0 -63
  115. package/bin/types/agent/AgentOptions.d.ts.map +1 -1
  116. package/bin/types/agent/AgentTypes.d.ts +3 -2
  117. package/bin/types/agent/AgentTypes.d.ts.map +1 -1
  118. package/bin/types/agent/SessionActor.d.ts +13 -4
  119. package/bin/types/agent/SessionActor.d.ts.map +1 -1
  120. package/bin/types/agent/SessionTypes.d.ts +62 -0
  121. package/bin/types/agent/SessionTypes.d.ts.map +1 -1
  122. package/bin/types/config/DowncityConfig.d.ts +1 -1
  123. package/bin/types/executor/SessionRunContext.d.ts +8 -0
  124. package/bin/types/executor/SessionRunContext.d.ts.map +1 -1
  125. package/bin/types/platform/Store.d.ts +2 -2
  126. package/bin/types/platform/Store.js +2 -2
  127. package/bin/types/rpc/RpcProtocol.d.ts +37 -5
  128. package/bin/types/rpc/RpcProtocol.d.ts.map +1 -1
  129. package/bin/types/rpc/RpcProtocol.js +1 -1
  130. package/bin/types/runtime/agent/AgentContext.d.ts +92 -43
  131. package/bin/types/runtime/agent/AgentContext.d.ts.map +1 -1
  132. package/bin/types/runtime/agent/AgentContext.js +97 -5
  133. package/bin/types/runtime/agent/AgentContext.js.map +1 -1
  134. package/bin/types/runtime/platform/Platform.d.ts +8 -8
  135. package/bin/types/runtime/platform/PlatformGateway.d.ts +2 -2
  136. package/bin/types/sdk/AgentSessionStop.d.ts +36 -0
  137. package/bin/types/sdk/AgentSessionStop.d.ts.map +1 -0
  138. package/bin/types/sdk/AgentSessionStop.js +9 -0
  139. package/bin/types/sdk/AgentSessionStop.js.map +1 -0
  140. package/package.json +3 -3
  141. package/scripts/city-model-tool-loop.test.mjs +2 -2
  142. package/scripts/session-prompt-runtime.test.mjs +59 -0
  143. package/src/agent/local/Agent.ts +66 -55
  144. package/src/agent/local/ProjectSetup.ts +2 -2
  145. package/src/agent/local/services/AgentAssemblyService.ts +41 -35
  146. package/src/agent/local/services/AgentBackgroundService.ts +116 -0
  147. package/src/agent/local/services/AgentSessionManager.ts +127 -13
  148. package/src/agent/remote/RemoteAgent.ts +25 -34
  149. package/src/agent/remote/RemoteSession.ts +21 -6
  150. package/src/agent/remote/RemoteTransport.ts +14 -0
  151. package/src/agent/remote/transports/HttpRemoteAgentTransport.ts +100 -2
  152. package/src/agent/remote/transports/RpcRemoteAgentTransport.ts +26 -0
  153. package/src/config/AgentInitializer.ts +2 -2
  154. package/src/executor/Executor.ts +33 -0
  155. package/src/executor/composer/system/default/InitPrompts.ts +1 -1
  156. package/src/executor/composer/system/default/SystemDomain.ts +2 -2
  157. package/src/executor/core-engine/CoreEngineRunner.ts +21 -0
  158. package/src/executor/messages/ChatMessageMarkupTypes.ts +1 -1
  159. package/src/executor/store/history/jsonl/JsonlSessionHistoryStore.ts +22 -0
  160. package/src/executor/types/SessionExecutor.ts +2 -1
  161. package/src/index.ts +8 -10
  162. package/src/plugin/core/Activation.ts +1 -3
  163. package/src/plugin/core/PluginCommandRequest.ts +1 -1
  164. package/src/plugin/core/PluginStateController.ts +1 -10
  165. package/src/plugin/types/PluginApi.ts +1 -1
  166. package/src/rpc/Client.ts +61 -0
  167. package/src/session/Session.ts +9 -0
  168. package/src/session/browse/Browse.ts +103 -3
  169. package/src/session/index.ts +7 -0
  170. package/src/session/runtime/SessionPromptRuntime.ts +100 -5
  171. package/src/session/services/SessionTurnService.ts +13 -1
  172. package/src/session/services/SessionViewService.ts +1 -7
  173. package/src/session/storage/Metadata.ts +23 -1
  174. package/src/session/storage/Paths.ts +70 -0
  175. package/src/session/storage/RuntimeSessionPort.ts +9 -0
  176. package/src/types/agent/AgentOptions.ts +0 -69
  177. package/src/types/agent/AgentTypes.ts +6 -5
  178. package/src/types/agent/SessionActor.ts +21 -3
  179. package/src/types/agent/SessionTypes.ts +68 -0
  180. package/src/types/config/DowncityConfig.ts +1 -1
  181. package/src/types/executor/SessionRunContext.ts +9 -0
  182. package/src/types/platform/Store.ts +2 -2
  183. package/src/types/rpc/RpcProtocol.ts +46 -4
  184. package/src/types/runtime/agent/AgentContext.ts +132 -45
  185. package/src/types/runtime/platform/Platform.ts +8 -8
  186. package/src/types/runtime/platform/PlatformGateway.ts +2 -2
  187. package/src/types/sdk/AgentSessionStop.ts +39 -0
  188. package/tsconfig.tsbuildinfo +1 -1
  189. package/bin/agent/local/AgentRuntimeFactory.d.ts +0 -72
  190. package/bin/agent/local/AgentRuntimeFactory.d.ts.map +0 -1
  191. package/bin/agent/local/AgentRuntimeFactory.js +0 -73
  192. package/bin/agent/local/AgentRuntimeFactory.js.map +0 -1
  193. package/bin/agent/local/services/AgentLifecycleService.d.ts +0 -65
  194. package/bin/agent/local/services/AgentLifecycleService.d.ts.map +0 -1
  195. package/bin/agent/local/services/AgentLifecycleService.js +0 -140
  196. package/bin/agent/local/services/AgentLifecycleService.js.map +0 -1
  197. package/bin/rpc/Server.d.ts +0 -31
  198. package/bin/rpc/Server.d.ts.map +0 -1
  199. package/bin/rpc/Server.js +0 -106
  200. package/bin/rpc/Server.js.map +0 -1
  201. package/bin/rpc/server/InternalHandlers.d.ts +0 -21
  202. package/bin/rpc/server/InternalHandlers.d.ts.map +0 -1
  203. package/bin/rpc/server/InternalHandlers.js +0 -244
  204. package/bin/rpc/server/InternalHandlers.js.map +0 -1
  205. package/bin/rpc/server/RequestDispatcher.d.ts +0 -27
  206. package/bin/rpc/server/RequestDispatcher.d.ts.map +0 -1
  207. package/bin/rpc/server/RequestDispatcher.js +0 -38
  208. package/bin/rpc/server/RequestDispatcher.js.map +0 -1
  209. package/bin/rpc/server/SdkSessionHandlers.d.ts +0 -25
  210. package/bin/rpc/server/SdkSessionHandlers.d.ts.map +0 -1
  211. package/bin/rpc/server/SdkSessionHandlers.js +0 -86
  212. package/bin/rpc/server/SdkSessionHandlers.js.map +0 -1
  213. package/bin/rpc/server/ServerTypes.d.ts +0 -64
  214. package/bin/rpc/server/ServerTypes.d.ts.map +0 -1
  215. package/bin/rpc/server/ServerTypes.js +0 -9
  216. package/bin/rpc/server/ServerTypes.js.map +0 -1
  217. package/bin/types/runtime/agent/AgentRuntime.d.ts +0 -79
  218. package/bin/types/runtime/agent/AgentRuntime.d.ts.map +0 -1
  219. package/bin/types/runtime/agent/AgentRuntime.js +0 -13
  220. package/bin/types/runtime/agent/AgentRuntime.js.map +0 -1
  221. package/src/agent/local/AgentRuntimeFactory.ts +0 -152
  222. package/src/agent/local/services/AgentLifecycleService.ts +0 -198
  223. package/src/rpc/Server.ts +0 -143
  224. package/src/rpc/server/InternalHandlers.ts +0 -285
  225. package/src/rpc/server/RequestDispatcher.ts +0 -67
  226. package/src/rpc/server/SdkSessionHandlers.ts +0 -106
  227. package/src/rpc/server/ServerTypes.ts +0 -70
  228. package/src/types/runtime/agent/AgentRuntime.ts +0 -84
@@ -3,11 +3,103 @@
3
3
  *
4
4
  * 职责说明(中文)
5
5
  * - 这里定义 plugin runtime、plugin、prompt system 共用的统一执行上下文。
6
- * - `AgentContext` 表达的是“当前一次执行可见的能力面”,不是宿主状态本体。
6
+ * - `AgentContext` 是一个 class,表达"当前一次执行可见的能力面",不是宿主状态本体。
7
+ * - 同一 agent 实例全程共享同一个 context;plugin、session、executor 都基于它读写状态。
8
+ */
9
+ /**
10
+ * 统一执行上下文。
7
11
  *
8
- * 边界说明(中文)
9
- * - `AgentRuntime` 负责保存长期状态;`AgentContext` 负责把这些状态暴露成执行接口。
10
- * - 这里只定义协议,不负责任何上下文装配逻辑。
12
+ * 关键点(中文)
13
+ * - 字段全部 readonly,构造一次后语义稳定,避免 plugin 误改。
14
+ * - `env` 引用 agent 级共享 mutable 对象,`...ctx.env` / `ctx.env.FOO` 直接可用。
15
+ * - `invoke` 是构造期组装的 plugin 调用端口,对外仍以 `InvokePluginPort` 形态暴露。
11
16
  */
12
- export {};
17
+ export class AgentContext {
18
+ /** 当前命令工作目录。 */
19
+ cwd;
20
+ /** 当前项目根目录。 */
21
+ rootPath;
22
+ /** 统一日志器。 */
23
+ logger;
24
+ /** 当前运行时已解析配置。 */
25
+ config;
26
+ /** 当前项目环境变量共享视图。 */
27
+ env;
28
+ /** 当前生效的 system 文本集合。 */
29
+ systems;
30
+ /** 当前可见的路径能力集合。 */
31
+ paths;
32
+ /** 当前可见的 plugin 配置持久化能力集合。 */
33
+ pluginConfig;
34
+ /** 当前 agent 持有的插件实例集合。 */
35
+ pluginInstances;
36
+ /** Session 能力入口。 */
37
+ session;
38
+ /** Plugin 调用入口。 */
39
+ plugins;
40
+ /** 跨 plugin runtime 调用主入口。 */
41
+ invoke;
42
+ constructor(options) {
43
+ this.cwd = options.cwd;
44
+ this.rootPath = options.rootPath;
45
+ this.logger = options.logger;
46
+ this.config = options.config;
47
+ this.env = options.env;
48
+ this.systems = options.systems;
49
+ this.paths = options.paths;
50
+ this.pluginConfig = options.pluginConfig;
51
+ this.pluginInstances = options.pluginInstances;
52
+ this.session = options.session;
53
+ this.plugins = options.plugins;
54
+ this.invoke = {
55
+ invoke: (params) => this.invoke_plugin_action(params),
56
+ };
57
+ }
58
+ /**
59
+ * 读取指定 sessionId 对应的 session 端口。
60
+ *
61
+ * 关键点(中文)
62
+ * - 返回值是统一的 `SessionPort`,而不是裸 `Executor`。
63
+ * - 这样 HTTP / plugin runtime / chat queue / contact 等入口都能复用同一层会话装配与执行兜底。
64
+ */
65
+ getSession(sessionId) {
66
+ return this.session.get(sessionId);
67
+ }
68
+ /**
69
+ * 返回当前执行中的 sessionId 列表。
70
+ */
71
+ listExecutingSessionIds() {
72
+ return this.session.listExecutingSessionIds();
73
+ }
74
+ /**
75
+ * 返回当前执行中的 session 数量。
76
+ */
77
+ getExecutingSessionCount() {
78
+ return this.session.getExecutingSessionCount();
79
+ }
80
+ /**
81
+ * 跨 plugin runtime 调用 action 的内部实现。
82
+ *
83
+ * 关键点(中文)
84
+ * - 统一把 `runAction` 的成功/失败结果归一化为 `InvokePluginResult`。
85
+ * - 这里替代了原 `createAgentContext` 工厂里的胶水匿名函数。
86
+ */
87
+ async invoke_plugin_action(params) {
88
+ const result = await this.plugins.runAction({
89
+ plugin: params.plugin,
90
+ action: params.action,
91
+ ...(params.payload !== undefined ? { payload: params.payload } : {}),
92
+ });
93
+ if (!result.success) {
94
+ return {
95
+ success: false,
96
+ error: result.error || result.message || "plugin action failed",
97
+ };
98
+ }
99
+ return {
100
+ success: true,
101
+ ...(result.data !== undefined ? { data: result.data } : {}),
102
+ };
103
+ }
104
+ }
13
105
  //# sourceMappingURL=AgentContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AgentContext.js","sourceRoot":"","sources":["../../../../src/types/runtime/agent/AgentContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
1
+ {"version":3,"file":"AgentContext.js","sourceRoot":"","sources":["../../../../src/types/runtime/agent/AgentContext.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA2PH;;;;;;;GAOG;AACH,MAAM,OAAO,YAAY;IACvB,gBAAgB;IACP,GAAG,CAAS;IACrB,eAAe;IACN,QAAQ,CAAS;IAC1B,aAAa;IACJ,MAAM,CAAS;IACxB,kBAAkB;IACT,MAAM,CAAiB;IAChC,oBAAoB;IACX,GAAG,CAAyB;IACrC,yBAAyB;IAChB,OAAO,CAAW;IAC3B,mBAAmB;IACV,KAAK,CAAmB;IACjC,8BAA8B;IACrB,YAAY,CAA2B;IAChD,0BAA0B;IACjB,eAAe,CAA0B;IAClD,oBAAoB;IACX,OAAO,CAAwB;IACxC,mBAAmB;IACV,OAAO,CAAe;IAC/B,8BAA8B;IACrB,MAAM,CAAmB;IAElC,YAAY,OAA4B;QACtC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;QAC/C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG;YACZ,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;SACtD,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,uBAAuB;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,wBAAwB;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC;IACjD,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,oBAAoB,CAChC,MAA0B;QAE1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YAC1C,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,IAAI,sBAAsB;aAChE,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,CAAC;IACJ,CAAC;CACF"}
@@ -23,7 +23,7 @@ export interface PlatformAgentOption {
23
23
  */
24
24
  projectRoot: string;
25
25
  /**
26
- * 当前 Town 托管的 Agent 进程是否存活。
26
+ * 当前 downcity 托管的 Agent 进程是否存活。
27
27
  */
28
28
  running: boolean;
29
29
  /**
@@ -51,11 +51,11 @@ export interface PlatformAgentOption {
51
51
  */
52
52
  stoppedAt?: string;
53
53
  /**
54
- * 当前读取到的 Town 托管进程 pid(仅 running=true 时有值)。
54
+ * 当前读取到的 downcity 托管进程 pid(仅 running=true 时有值)。
55
55
  */
56
56
  daemonPid?: number;
57
57
  /**
58
- * Town 托管进程日志路径(用于排障展示)。
58
+ * downcity 托管进程日志路径(用于排障展示)。
59
59
  */
60
60
  logPath?: string;
61
61
  /**
@@ -141,7 +141,7 @@ export interface PlatformAgentDirectoryInspection {
141
141
  /** 该目录是否已出现在 managed agent registry 中。 */
142
142
  knownAgent: boolean;
143
143
  /**
144
- * 若已登记,当前 Town 托管进程是否运行中。
144
+ * 若已登记,当前 downcity 托管进程是否运行中。
145
145
  */
146
146
  running: boolean;
147
147
  /**
@@ -297,7 +297,7 @@ export interface ManagedAgentRegistryEntry {
297
297
  */
298
298
  projectRoot: string;
299
299
  /**
300
- * registry 最近一次记录的 Town 托管进程 pid。
300
+ * registry 最近一次记录的 downcity 托管进程 pid。
301
301
  */
302
302
  pid: number;
303
303
  /**
@@ -335,7 +335,7 @@ export interface ManagedAgentRegistryV1 {
335
335
  agents: ManagedAgentRegistryEntry[];
336
336
  }
337
337
  /**
338
- * `town agent list --running` 输出可复用的受管 agent 运行态视图。
338
+ * `downcity agent list --running` 输出可复用的受管 agent 运行态视图。
339
339
  */
340
340
  export interface ManagedAgentProcessView {
341
341
  /**
@@ -347,7 +347,7 @@ export interface ManagedAgentProcessView {
347
347
  */
348
348
  registeredPid: number;
349
349
  /**
350
- * 当前实际存活的 Town 托管进程 pid。
350
+ * 当前实际存活的 downcity 托管进程 pid。
351
351
  */
352
352
  daemonPid: number;
353
353
  /**
@@ -363,7 +363,7 @@ export interface ManagedAgentProcessView {
363
363
  */
364
364
  updatedAt: string;
365
365
  /**
366
- * Town 托管进程日志文件路径。
366
+ * downcity 托管进程日志文件路径。
367
367
  */
368
368
  logPath: string;
369
369
  }
@@ -96,11 +96,11 @@ export interface PlatformAgentShipPluginsConfig {
96
96
  */
97
97
  export interface PlatformAgentShipStartConfig {
98
98
  /**
99
- * Town Agent HTTP gateway host。
99
+ * downcity Agent HTTP gateway host。
100
100
  */
101
101
  host?: unknown;
102
102
  /**
103
- * Town Agent HTTP gateway port。
103
+ * downcity Agent HTTP gateway port。
104
104
  */
105
105
  port?: unknown;
106
106
  }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Agent Session stop 类型定义。
3
+ *
4
+ * 关键点(中文)
5
+ * - `session.stop()` 用于停止当前正在执行的 turn。
6
+ * - 尚未被当前 turn 吸收的排队 prompt 会被取消,不会自动开启下一轮。
7
+ */
8
+ /**
9
+ * Session stop 的最终结果。
10
+ */
11
+ export interface AgentSessionStopResult {
12
+ /**
13
+ * 本次调用是否实际停止了活跃 turn 或取消了排队 prompt。
14
+ */
15
+ stopped: boolean;
16
+ /**
17
+ * 被停止的当前 turn 标识。
18
+ *
19
+ * 说明(中文)
20
+ * - 当前没有活跃 turn 时不会返回该字段。
21
+ * - 如果只是清空尚未启动的队列,也不会返回该字段。
22
+ */
23
+ turnId?: string;
24
+ /**
25
+ * 本次 stop 取消的未绑定 prompt 数量。
26
+ *
27
+ * 说明(中文)
28
+ * - 已经被当前 turn 吸收的 prompt 不计入这里,它们会随当前 turn 一起结束。
29
+ */
30
+ cancelledQueuedPrompts: number;
31
+ /**
32
+ * 本次 stop 的归因。
33
+ */
34
+ reason: "stopped" | "idle";
35
+ }
36
+ //# sourceMappingURL=AgentSessionStop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentSessionStop.d.ts","sourceRoot":"","sources":["../../../src/types/sdk/AgentSessionStop.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;;OAKG;IACH,sBAAsB,EAAE,MAAM,CAAC;IAE/B;;OAEG;IACH,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;CAC5B"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Agent Session stop 类型定义。
3
+ *
4
+ * 关键点(中文)
5
+ * - `session.stop()` 用于停止当前正在执行的 turn。
6
+ * - 尚未被当前 turn 吸收的排队 prompt 会被取消,不会自动开启下一轮。
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=AgentSessionStop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentSessionStop.js","sourceRoot":"","sources":["../../../src/types/sdk/AgentSessionStop.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@downcity/agent",
3
- "version": "1.1.129",
3
+ "version": "1.1.148",
4
4
  "type": "module",
5
5
  "description": "Downcity Agent 运行时 — 单 Agent 执行壳与本机 RPC 能力",
6
6
  "main": "./bin/index.js",
@@ -17,8 +17,8 @@
17
17
  },
18
18
  "dependencies": {
19
19
  "@ai-sdk/openai-compatible": "^2.0.48",
20
- "@downcity/shell": "^0.1.17",
21
- "@downcity/type": "0.1.52",
20
+ "@downcity/shell": "^0.1.28",
21
+ "@downcity/type": "0.1.62",
22
22
  "@larksuiteoapi/node-sdk": "^1.66.0",
23
23
  "ai": "^6.0.193",
24
24
  "commander": "^15.0.0",
@@ -230,7 +230,7 @@ test("CityModel uses direct LanguageModel path and sends tool result back", asyn
230
230
  const city = new City({
231
231
  role: "user",
232
232
  city_url: `http://127.0.0.1:${String(address.port)}`,
233
- town_id: "town_demo",
233
+ city_id: "city_demo",
234
234
  user_token: "ub_test",
235
235
  });
236
236
  const catalog = await city.ai.listModels();
@@ -266,7 +266,7 @@ test("CityModel uses direct LanguageModel path and sends tool result back", asyn
266
266
  assert.equal(tool_executed, true);
267
267
  assert.equal(stream_requests, 0);
268
268
  assert.equal(agent_requests.length, 2);
269
- assert.equal(requests.every((request) => request?.town_id === "town_demo"), true);
269
+ assert.equal(requests.every((request) => request?.city_id === "city_demo"), true);
270
270
  assert.equal(agent_requests[0]?.model, "mock-model");
271
271
 
272
272
  const second_request_messages = Array.isArray(agent_requests[1]?.messages)
@@ -98,6 +98,7 @@ test("SessionPromptRuntime merges queued prompts at the next step boundary", asy
98
98
  assistantMessage: createAssistantMessage("done", 1),
99
99
  };
100
100
  },
101
+ stopTurn: () => false,
101
102
  });
102
103
 
103
104
  const firstTurn = await runtime.prompt({ query: "first" });
@@ -159,6 +160,7 @@ test("SessionPromptRuntime moves unmerged prompts into the next turn", async ()
159
160
  ),
160
161
  };
161
162
  },
163
+ stopTurn: () => false,
162
164
  });
163
165
 
164
166
  const firstTurn = await runtime.prompt({ query: "first" });
@@ -185,3 +187,60 @@ test("SessionPromptRuntime moves unmerged prompts into the next turn", async ()
185
187
  ["turn-start", "turn-finish", "turn-start", "turn-finish"],
186
188
  );
187
189
  });
190
+
191
+ test("SessionPromptRuntime stops current turn and cancels unmerged queued prompts", async () => {
192
+ const events = [];
193
+ const executionFinished = createDeferred();
194
+ let stopRequested = false;
195
+
196
+ const runtime = new SessionPromptRuntime({
197
+ sessionId: "test",
198
+ publish: (event) => {
199
+ events.push(event);
200
+ },
201
+ createAndPersistUserMessage: async (input) => {
202
+ return createUserMessage(input.query, events.length + 1);
203
+ },
204
+ executeTurn: async (input) => {
205
+ await new Promise((resolve) => {
206
+ input.abortSignal.addEventListener("abort", resolve, { once: true });
207
+ });
208
+ await executionFinished.promise;
209
+ return {
210
+ text: "should-not-succeed",
211
+ success: true,
212
+ assistantMessage: createAssistantMessage("should-not-succeed", 1),
213
+ };
214
+ },
215
+ stopTurn: () => {
216
+ stopRequested = true;
217
+ executionFinished.resolve();
218
+ return true;
219
+ },
220
+ });
221
+
222
+ const firstTurn = await runtime.prompt({ query: "first" });
223
+ const secondTurnPromise = runtime.prompt({ query: "second" });
224
+ await waitUntil(() => runtime.isActive());
225
+
226
+ const stopResult = runtime.stop();
227
+ const secondTurn = await secondTurnPromise;
228
+ const firstResult = await firstTurn.finished;
229
+ const secondResult = await secondTurn.finished;
230
+
231
+ assert.equal(stopRequested, true);
232
+ assert.equal(stopResult.stopped, true);
233
+ assert.equal(stopResult.turnId, firstTurn.id);
234
+ assert.equal(stopResult.cancelledQueuedPrompts, 1);
235
+ assert.equal(firstResult.success, false);
236
+ assert.equal(firstResult.error, "Turn stopped");
237
+ assert.equal(secondResult.success, false);
238
+ assert.equal(
239
+ secondResult.error,
240
+ "Prompt cancelled because session was stopped",
241
+ );
242
+ assert.deepEqual(
243
+ events.map((event) => event.type),
244
+ ["turn-start", "turn-start", "turn-finish", "turn-finish"],
245
+ );
246
+ });
@@ -9,20 +9,12 @@
9
9
 
10
10
  import type { Tool } from "ai";
11
11
  import type { AgentContext } from "@/types/runtime/agent/AgentContext.js";
12
- import type { AgentRuntime } from "@/types/runtime/agent/AgentRuntime.js";
13
12
  import type { DowncityConfig } from "@/types/config/DowncityConfig.js";
14
13
  import type { AgentPlugins } from "@/plugin/types/Plugin.js";
15
14
  import type {
16
- AgentCreateSessionInput,
17
- AgentListSessionsInput,
18
15
  AgentModel,
19
16
  AgentOptions,
20
- AgentSession,
21
17
  AgentSessionCollection,
22
- AgentSessionSummaryPage,
23
- AgentStartOptions,
24
- AgentStartResult,
25
- AgentStopResult,
26
18
  } from "@/types/agent/AgentTypes.js";
27
19
  import type {
28
20
  ShellApprovalMode,
@@ -41,7 +33,7 @@ import {
41
33
  type AgentAssemblyResult,
42
34
  } from "@/agent/local/services/AgentAssemblyService.js";
43
35
  import { AgentSessionManager } from "@/agent/local/services/AgentSessionManager.js";
44
- import { AgentLifecycleService } from "@/agent/local/services/AgentLifecycleService.js";
36
+ import { AgentBackgroundService } from "@/agent/local/services/AgentBackgroundService.js";
45
37
 
46
38
  /**
47
39
  * SDK 本地 Agent。
@@ -53,7 +45,6 @@ export class Agent {
53
45
  readonly plugins: AgentPlugins;
54
46
 
55
47
  private readonly logger: Logger;
56
- private readonly runtime: AgentRuntime;
57
48
  private readonly agentContext: AgentContext;
58
49
  private readonly pluginRegistry: PluginRegistry;
59
50
  private readonly config: DowncityConfig;
@@ -61,7 +52,7 @@ export class Agent {
61
52
  private readonly defaultModel?: AgentModel;
62
53
  private readonly SessionClass: AgentOptions["Session"];
63
54
  private readonly sessionManager: AgentSessionManager;
64
- private readonly lifecycleService: AgentLifecycleService;
55
+ private readonly backgroundService: AgentBackgroundService;
65
56
  private readonly shell?: AgentOptions["shell"];
66
57
 
67
58
  private instruction: string[];
@@ -92,7 +83,6 @@ export class Agent {
92
83
  this.tools = assembly.tools;
93
84
  this.plugins = assembly.plugins;
94
85
  this.logger = assembly.logger;
95
- this.runtime = assembly.runtime;
96
86
  this.agentContext = assembly.agent_context;
97
87
  this.pluginRegistry = assembly.plugin_registry;
98
88
  this.config = assembly.config;
@@ -102,50 +92,34 @@ export class Agent {
102
92
 
103
93
  this.sessionManager = this.create_session_manager(assembly);
104
94
  session_manager_ref = this.sessionManager;
105
- this.lifecycleService = new AgentLifecycleService({
95
+ // 关键点(中文):构造完成即触发后台能力启动;调用方可 `await agent.ready()` 等待。
96
+ this.backgroundService = new AgentBackgroundService({
106
97
  logger: this.logger,
107
98
  agent_context: this.agentContext,
108
- session_collection: this.sessionManager.get_session_collection(),
109
- get_runtime: () => this.runtime,
110
99
  get_shell: () => this.shell,
111
100
  });
112
101
  }
113
102
 
114
103
  /**
115
- * 新建一个 session。
104
+ * 等待 Agent 后台能力启动完成。
105
+ *
106
+ * 关键点(中文)
107
+ * - Agent 构造完成即开始启动 plugin lifecycle 与 ActionSchedule。
108
+ * - 调用方在需要确认后台能力就绪时使用,例如启动后立刻读取 plugin 状态。
116
109
  */
117
- async createSession(input?: AgentCreateSessionInput): Promise<AgentSession> {
118
- return await this.sessionManager.create_session(input);
110
+ async ready(): Promise<void> {
111
+ await this.backgroundService.ready();
119
112
  }
120
113
 
121
114
  /**
122
- * 获取一个已存在的 session。
115
+ * 释放当前 Agent 的后台能力。
116
+ *
117
+ * 关键点(中文)
118
+ * - 关闭 plugin lifecycle、ActionSchedule、shell 等后台资源。
119
+ * - 不负责任何 transport(RPC / HTTP);transport 由 `@downcity/server` 自行管理。
123
120
  */
124
- async getSession(sessionId: string): Promise<AgentSession> {
125
- return await this.sessionManager.get_session(sessionId);
126
- }
127
-
128
- /**
129
- * 列出当前 agent 的 session 摘要页。
130
- */
131
- async listSessions(
132
- input?: AgentListSessionsInput,
133
- ): Promise<AgentSessionSummaryPage> {
134
- return await this.sessionManager.list_sessions(input);
135
- }
136
-
137
- /**
138
- * 启动当前 agent 实例的长期运行能力。
139
- */
140
- async start(options?: AgentStartOptions): Promise<AgentStartResult> {
141
- return await this.lifecycleService.start(options);
142
- }
143
-
144
- /**
145
- * 停止当前 agent 实例的长期运行能力。
146
- */
147
- async stop(): Promise<AgentStopResult> {
148
- return await this.lifecycleService.stop();
121
+ async dispose(): Promise<void> {
122
+ await this.backgroundService.dispose();
149
123
  }
150
124
 
151
125
  /**
@@ -204,6 +178,51 @@ export class Agent {
204
178
  this.instruction = normalizeInstructionInput(input);
205
179
  }
206
180
 
181
+ /**
182
+ * 返回当前 agent env 的浅拷贝快照。
183
+ *
184
+ * 关键点(中文)
185
+ * - 返回的是拷贝,调用方修改它不会影响 agent 真实状态。
186
+ * - 想改 env 请使用 `setEnv` / `patchEnv`。
187
+ */
188
+ getEnv(): Record<string, string> {
189
+ return { ...this.env };
190
+ }
191
+
192
+ /**
193
+ * 整体覆盖 agent env。
194
+ *
195
+ * 关键点(中文)
196
+ * - 直接清空当前共享 env 对象,再写入新值,保证 plugin / runtime / shell 看到的是同一引用。
197
+ * - 仅写入字符串值,`null` / `undefined` 表示删除该 key。
198
+ */
199
+ setEnv(next: Record<string, string | null | undefined>): void {
200
+ for (const key of Object.keys(this.env)) {
201
+ delete this.env[key];
202
+ }
203
+ this.patchEnv(next);
204
+ }
205
+
206
+ /**
207
+ * 增量合并 agent env。
208
+ *
209
+ * 关键点(中文)
210
+ * - `null` / `undefined` 表示删除该 key;其他值会强制转字符串后写入。
211
+ * - 修改原地生效,所有持有 `context.env` 引用的模块立即可见。
212
+ */
213
+ patchEnv(patch: Record<string, string | null | undefined>): void {
214
+ if (!patch || typeof patch !== "object") return;
215
+ for (const [raw_key, raw_value] of Object.entries(patch)) {
216
+ const key = String(raw_key || "").trim();
217
+ if (!key) continue;
218
+ if (raw_value === null || raw_value === undefined) {
219
+ delete this.env[key];
220
+ continue;
221
+ }
222
+ this.env[key] = String(raw_value);
223
+ }
224
+ }
225
+
207
226
  /**
208
227
  * 返回当前项目根目录解析后的配置快照。
209
228
  */
@@ -218,13 +237,6 @@ export class Agent {
218
237
  return this.logger;
219
238
  }
220
239
 
221
- /**
222
- * 返回当前 agent runtime。
223
- */
224
- getRuntime(): AgentRuntime {
225
- return this.runtime;
226
- }
227
-
228
240
  /**
229
241
  * 返回当前 agent context。
230
242
  */
@@ -233,9 +245,9 @@ export class Agent {
233
245
  }
234
246
 
235
247
  /**
236
- * 返回当前 session collection
248
+ * 返回当前 session collection 入口。
237
249
  */
238
- getSessionCollection(): AgentSessionCollection {
250
+ session_collection(): AgentSessionCollection {
239
251
  return this.sessionManager.get_session_collection();
240
252
  }
241
253
 
@@ -254,8 +266,7 @@ export class Agent {
254
266
  project_root: this.path || assembly.path,
255
267
  tools: this.tools || assembly.tools,
256
268
  logger: this.logger || assembly.logger,
257
- runtime: this.runtime || assembly.runtime,
258
- get_agent_context: () => this.agentContext || assembly.agent_context,
269
+ get_agent_context: () => this.agentContext ?? assembly.agent_context,
259
270
  get_instruction: () => this.instruction,
260
271
  plugin_instances: assembly.plugin_instances,
261
272
  default_model: this.defaultModel,
@@ -30,14 +30,14 @@ function ensureContextFiles(projectRoot: string): void {
30
30
  // Check if initialized(启动入口一次性确认工程根目录与关键文件)
31
31
  if (!fs.existsSync(getProfileMdPath(projectRoot))) {
32
32
  console.error(
33
- '❌ Project not initialized. Please run "town agent create" first',
33
+ '❌ Project not initialized. Please run "downcity agent create" first',
34
34
  );
35
35
  process.exit(1);
36
36
  }
37
37
 
38
38
  if (!fs.existsSync(getDowncityJsonPath(projectRoot))) {
39
39
  console.error(
40
- '❌ downcity.json does not exist. Please run "town agent create" first',
40
+ '❌ downcity.json does not exist. Please run "downcity agent create" first',
41
41
  );
42
42
  process.exit(1);
43
43
  }