@downcity/agent 1.1.129 → 1.1.135

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 (77) hide show
  1. package/bin/agent/local/Agent.d.ts +38 -6
  2. package/bin/agent/local/Agent.d.ts.map +1 -1
  3. package/bin/agent/local/Agent.js +62 -11
  4. package/bin/agent/local/Agent.js.map +1 -1
  5. package/bin/agent/local/AgentRuntimeFactory.d.ts +9 -34
  6. package/bin/agent/local/AgentRuntimeFactory.d.ts.map +1 -1
  7. package/bin/agent/local/AgentRuntimeFactory.js +2 -41
  8. package/bin/agent/local/AgentRuntimeFactory.js.map +1 -1
  9. package/bin/agent/local/services/AgentAssemblyService.d.ts +1 -1
  10. package/bin/agent/local/services/AgentAssemblyService.d.ts.map +1 -1
  11. package/bin/agent/local/services/AgentAssemblyService.js +28 -9
  12. package/bin/agent/local/services/AgentAssemblyService.js.map +1 -1
  13. package/bin/agent/local/services/AgentBackgroundService.d.ts +55 -0
  14. package/bin/agent/local/services/AgentBackgroundService.d.ts.map +1 -0
  15. package/bin/agent/local/services/AgentBackgroundService.js +86 -0
  16. package/bin/agent/local/services/AgentBackgroundService.js.map +1 -0
  17. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.d.ts +8 -0
  18. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.d.ts.map +1 -1
  19. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.js +22 -0
  20. package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.js.map +1 -1
  21. package/bin/index.d.ts +3 -3
  22. package/bin/index.d.ts.map +1 -1
  23. package/bin/index.js +1 -2
  24. package/bin/index.js.map +1 -1
  25. package/bin/session/services/SessionViewService.d.ts.map +1 -1
  26. package/bin/session/services/SessionViewService.js +1 -7
  27. package/bin/session/services/SessionViewService.js.map +1 -1
  28. package/bin/types/agent/AgentOptions.d.ts +0 -63
  29. package/bin/types/agent/AgentOptions.d.ts.map +1 -1
  30. package/bin/types/agent/AgentTypes.d.ts +1 -1
  31. package/bin/types/agent/AgentTypes.d.ts.map +1 -1
  32. package/bin/types/runtime/agent/AgentContext.d.ts +66 -42
  33. package/bin/types/runtime/agent/AgentContext.d.ts.map +1 -1
  34. package/bin/types/runtime/agent/AgentContext.js +77 -3
  35. package/bin/types/runtime/agent/AgentContext.js.map +1 -1
  36. package/package.json +3 -3
  37. package/src/agent/local/Agent.ts +63 -14
  38. package/src/agent/local/AgentRuntimeFactory.ts +9 -83
  39. package/src/agent/local/services/AgentAssemblyService.ts +30 -13
  40. package/src/agent/local/services/AgentBackgroundService.ts +116 -0
  41. package/src/executor/store/history/jsonl/JsonlSessionHistoryStore.ts +22 -0
  42. package/src/index.ts +2 -9
  43. package/src/session/services/SessionViewService.ts +1 -7
  44. package/src/types/agent/AgentOptions.ts +0 -69
  45. package/src/types/agent/AgentTypes.ts +0 -5
  46. package/src/types/runtime/agent/AgentContext.ts +103 -43
  47. package/tsconfig.tsbuildinfo +1 -1
  48. package/bin/agent/local/services/AgentLifecycleService.d.ts +0 -65
  49. package/bin/agent/local/services/AgentLifecycleService.d.ts.map +0 -1
  50. package/bin/agent/local/services/AgentLifecycleService.js +0 -140
  51. package/bin/agent/local/services/AgentLifecycleService.js.map +0 -1
  52. package/bin/rpc/Server.d.ts +0 -31
  53. package/bin/rpc/Server.d.ts.map +0 -1
  54. package/bin/rpc/Server.js +0 -106
  55. package/bin/rpc/Server.js.map +0 -1
  56. package/bin/rpc/server/InternalHandlers.d.ts +0 -21
  57. package/bin/rpc/server/InternalHandlers.d.ts.map +0 -1
  58. package/bin/rpc/server/InternalHandlers.js +0 -244
  59. package/bin/rpc/server/InternalHandlers.js.map +0 -1
  60. package/bin/rpc/server/RequestDispatcher.d.ts +0 -27
  61. package/bin/rpc/server/RequestDispatcher.d.ts.map +0 -1
  62. package/bin/rpc/server/RequestDispatcher.js +0 -38
  63. package/bin/rpc/server/RequestDispatcher.js.map +0 -1
  64. package/bin/rpc/server/SdkSessionHandlers.d.ts +0 -25
  65. package/bin/rpc/server/SdkSessionHandlers.d.ts.map +0 -1
  66. package/bin/rpc/server/SdkSessionHandlers.js +0 -86
  67. package/bin/rpc/server/SdkSessionHandlers.js.map +0 -1
  68. package/bin/rpc/server/ServerTypes.d.ts +0 -64
  69. package/bin/rpc/server/ServerTypes.d.ts.map +0 -1
  70. package/bin/rpc/server/ServerTypes.js +0 -9
  71. package/bin/rpc/server/ServerTypes.js.map +0 -1
  72. package/src/agent/local/services/AgentLifecycleService.ts +0 -198
  73. package/src/rpc/Server.ts +0 -143
  74. package/src/rpc/server/InternalHandlers.ts +0 -285
  75. package/src/rpc/server/RequestDispatcher.ts +0 -67
  76. package/src/rpc/server/SdkSessionHandlers.ts +0 -106
  77. package/src/rpc/server/ServerTypes.ts +0 -70
@@ -1 +1 @@
1
- {"version":3,"file":"AgentContext.d.ts","sourceRoot":"","sources":["../../../../src/types/runtime/agent/AgentContext.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AgentContext.d.ts","sourceRoot":"","sources":["../../../../src/types/runtime/agent/AgentContext.ts"],"names":[],"mappings":"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"}
@@ -3,11 +3,85 @@
3
3
  *
4
4
  * 职责说明(中文)
5
5
  * - 这里定义 plugin runtime、plugin、prompt system 共用的统一执行上下文。
6
- * - `AgentContext` 表达的是“当前一次执行可见的能力面”,不是宿主状态本体。
6
+ * - `AgentContext` 是一个 class,表达“当前一次执行可见的能力面”,不是宿主状态本体。
7
+ * - 同一 agent 实例全程共享同一个 context;plugin、session、executor 都基于它读写状态。
7
8
  *
8
9
  * 边界说明(中文)
9
10
  * - `AgentRuntime` 负责保存长期状态;`AgentContext` 负责把这些状态暴露成执行接口。
10
- * - 这里只定义协议,不负责任何上下文装配逻辑。
11
+ * - 这里同时声明类型协议与默认实现;plugin 作者拿到的就是这个 class 的实例。
11
12
  */
12
- export {};
13
+ /**
14
+ * 统一执行上下文。
15
+ *
16
+ * 关键点(中文)
17
+ * - 字段全部 readonly,构造一次后语义稳定,避免 plugin 误改。
18
+ * - `env` 引用 agent 级共享 mutable 对象,`...ctx.env` / `ctx.env.FOO` 直接可用。
19
+ * - `invoke` 是构造期组装的 plugin 调用端口,对外仍以 `InvokePluginPort` 形态暴露。
20
+ */
21
+ export class AgentContext {
22
+ /** 当前执行上下文对应的 agent 状态。 */
23
+ agent;
24
+ /** 当前命令工作目录。 */
25
+ cwd;
26
+ /** 当前项目根目录。 */
27
+ rootPath;
28
+ /** 统一日志器。 */
29
+ logger;
30
+ /** 当前运行时已解析配置。 */
31
+ config;
32
+ /** 当前项目环境变量共享视图。 */
33
+ env;
34
+ /** 当前生效的 system 文本集合。 */
35
+ systems;
36
+ /** 当前可见的路径能力集合。 */
37
+ paths;
38
+ /** 当前可见的 plugin 配置持久化能力集合。 */
39
+ pluginConfig;
40
+ /** Session 能力入口。 */
41
+ session;
42
+ /** Plugin 调用入口。 */
43
+ plugins;
44
+ /** 跨 plugin runtime 调用主入口。 */
45
+ invoke;
46
+ constructor(options) {
47
+ this.agent = options.agent;
48
+ this.cwd = options.cwd;
49
+ this.rootPath = options.rootPath;
50
+ this.logger = options.logger;
51
+ this.config = options.config;
52
+ this.env = options.env;
53
+ this.systems = options.systems;
54
+ this.paths = options.paths;
55
+ this.pluginConfig = options.pluginConfig;
56
+ this.session = options.session;
57
+ this.plugins = options.plugins;
58
+ this.invoke = {
59
+ invoke: (params) => this.invoke_plugin_action(params),
60
+ };
61
+ }
62
+ /**
63
+ * 跨 plugin runtime 调用 action 的内部实现。
64
+ *
65
+ * 关键点(中文)
66
+ * - 统一把 `runAction` 的成功/失败结果归一化为 `InvokePluginResult`。
67
+ * - 这里替代了原 `createAgentContext` 工厂里的胶水匿名函数。
68
+ */
69
+ async invoke_plugin_action(params) {
70
+ const result = await this.plugins.runAction({
71
+ plugin: params.plugin,
72
+ action: params.action,
73
+ ...(params.payload !== undefined ? { payload: params.payload } : {}),
74
+ });
75
+ if (!result.success) {
76
+ return {
77
+ success: false,
78
+ error: result.error || result.message || "plugin action failed",
79
+ };
80
+ }
81
+ return {
82
+ success: true,
83
+ ...(result.data !== undefined ? { data: result.data } : {}),
84
+ };
85
+ }
86
+ }
13
87
  //# 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;;;;;;;;;;;GAWG;AAqPH;;;;;;;GAOG;AACH,MAAM,OAAO,YAAY;IACvB,2BAA2B;IAClB,KAAK,CAAe;IAC7B,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,oBAAoB;IACX,OAAO,CAAwB;IACxC,mBAAmB;IACV,OAAO,CAAe;IAC/B,8BAA8B;IACrB,MAAM,CAAmB;IAElC,YAAY,OAA4B;QACtC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,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,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;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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@downcity/agent",
3
- "version": "1.1.129",
3
+ "version": "1.1.135",
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.19",
21
+ "@downcity/type": "0.1.54",
22
22
  "@larksuiteoapi/node-sdk": "^1.66.0",
23
23
  "ai": "^6.0.193",
24
24
  "commander": "^15.0.0",
@@ -20,9 +20,6 @@ import type {
20
20
  AgentSession,
21
21
  AgentSessionCollection,
22
22
  AgentSessionSummaryPage,
23
- AgentStartOptions,
24
- AgentStartResult,
25
- AgentStopResult,
26
23
  } from "@/types/agent/AgentTypes.js";
27
24
  import type {
28
25
  ShellApprovalMode,
@@ -41,7 +38,7 @@ import {
41
38
  type AgentAssemblyResult,
42
39
  } from "@/agent/local/services/AgentAssemblyService.js";
43
40
  import { AgentSessionManager } from "@/agent/local/services/AgentSessionManager.js";
44
- import { AgentLifecycleService } from "@/agent/local/services/AgentLifecycleService.js";
41
+ import { AgentBackgroundService } from "@/agent/local/services/AgentBackgroundService.js";
45
42
 
46
43
  /**
47
44
  * SDK 本地 Agent。
@@ -61,7 +58,7 @@ export class Agent {
61
58
  private readonly defaultModel?: AgentModel;
62
59
  private readonly SessionClass: AgentOptions["Session"];
63
60
  private readonly sessionManager: AgentSessionManager;
64
- private readonly lifecycleService: AgentLifecycleService;
61
+ private readonly backgroundService: AgentBackgroundService;
65
62
  private readonly shell?: AgentOptions["shell"];
66
63
 
67
64
  private instruction: string[];
@@ -102,11 +99,10 @@ export class Agent {
102
99
 
103
100
  this.sessionManager = this.create_session_manager(assembly);
104
101
  session_manager_ref = this.sessionManager;
105
- this.lifecycleService = new AgentLifecycleService({
102
+ // 关键点(中文):构造完成即触发后台能力启动;调用方可 `await agent.ready()` 等待。
103
+ this.backgroundService = new AgentBackgroundService({
106
104
  logger: this.logger,
107
105
  agent_context: this.agentContext,
108
- session_collection: this.sessionManager.get_session_collection(),
109
- get_runtime: () => this.runtime,
110
106
  get_shell: () => this.shell,
111
107
  });
112
108
  }
@@ -135,17 +131,25 @@ export class Agent {
135
131
  }
136
132
 
137
133
  /**
138
- * 启动当前 agent 实例的长期运行能力。
134
+ * 等待 Agent 后台能力启动完成。
135
+ *
136
+ * 关键点(中文)
137
+ * - Agent 构造完成即开始启动 plugin lifecycle 与 ActionSchedule。
138
+ * - 调用方在需要确认后台能力就绪时使用,例如启动后立刻读取 plugin 状态。
139
139
  */
140
- async start(options?: AgentStartOptions): Promise<AgentStartResult> {
141
- return await this.lifecycleService.start(options);
140
+ async ready(): Promise<void> {
141
+ await this.backgroundService.ready();
142
142
  }
143
143
 
144
144
  /**
145
- * 停止当前 agent 实例的长期运行能力。
145
+ * 释放当前 Agent 的后台能力。
146
+ *
147
+ * 关键点(中文)
148
+ * - 关闭 plugin lifecycle、ActionSchedule、shell 等后台资源。
149
+ * - 不负责任何 transport(RPC / HTTP);transport 由 `@downcity/server` 自行管理。
146
150
  */
147
- async stop(): Promise<AgentStopResult> {
148
- return await this.lifecycleService.stop();
151
+ async dispose(): Promise<void> {
152
+ await this.backgroundService.dispose();
149
153
  }
150
154
 
151
155
  /**
@@ -204,6 +208,51 @@ export class Agent {
204
208
  this.instruction = normalizeInstructionInput(input);
205
209
  }
206
210
 
211
+ /**
212
+ * 返回当前 agent env 的浅拷贝快照。
213
+ *
214
+ * 关键点(中文)
215
+ * - 返回的是拷贝,调用方修改它不会影响 agent 真实状态。
216
+ * - 想改 env 请使用 `setEnv` / `patchEnv`。
217
+ */
218
+ getEnv(): Record<string, string> {
219
+ return { ...this.env };
220
+ }
221
+
222
+ /**
223
+ * 整体覆盖 agent env。
224
+ *
225
+ * 关键点(中文)
226
+ * - 直接清空当前共享 env 对象,再写入新值,保证 plugin / runtime / shell 看到的是同一引用。
227
+ * - 仅写入字符串值,`null` / `undefined` 表示删除该 key。
228
+ */
229
+ setEnv(next: Record<string, string | null | undefined>): void {
230
+ for (const key of Object.keys(this.env)) {
231
+ delete this.env[key];
232
+ }
233
+ this.patchEnv(next);
234
+ }
235
+
236
+ /**
237
+ * 增量合并 agent env。
238
+ *
239
+ * 关键点(中文)
240
+ * - `null` / `undefined` 表示删除该 key;其他值会强制转字符串后写入。
241
+ * - 修改原地生效,所有持有 `context.env` 引用的模块立即可见。
242
+ */
243
+ patchEnv(patch: Record<string, string | null | undefined>): void {
244
+ if (!patch || typeof patch !== "object") return;
245
+ for (const [raw_key, raw_value] of Object.entries(patch)) {
246
+ const key = String(raw_key || "").trim();
247
+ if (!key) continue;
248
+ if (raw_value === null || raw_value === undefined) {
249
+ delete this.env[key];
250
+ continue;
251
+ }
252
+ this.env[key] = String(raw_value);
253
+ }
254
+ }
255
+
207
256
  /**
208
257
  * 返回当前项目根目录解析后的配置快照。
209
258
  */
@@ -2,21 +2,16 @@
2
2
  * Agent runtime / context 装配工厂。
3
3
  *
4
4
  * 关键点(中文)
5
- * - 这里只创建长期 runtime 视图与执行期 context 视图。
5
+ * - 这里只创建长期 runtime 视图。
6
+ * - `AgentContext` 已经收敛为 class,调用方直接 `new AgentContext(...)`,不再走工厂。
6
7
  * - Agent 仍然持有 session/plugin 状态;这里通过函数参数读取状态。
7
8
  */
8
9
 
9
10
  import type { BasePlugin } from "@/plugin/core/BasePlugin.js";
10
11
  import type { Logger } from "@/utils/logger/Logger.js";
11
12
  import type { DowncityConfig } from "@/types/config/DowncityConfig.js";
12
- import type { LanguageModel } from "ai";
13
- import type { JsonValue } from "@/types/common/Json.js";
14
- import type {
15
- AgentContext,
16
- SessionPort,
17
- } from "@/types/runtime/agent/AgentContext.js";
13
+ import type { SessionPort } from "@/types/runtime/agent/AgentContext.js";
18
14
  import type { AgentRuntime } from "@/types/runtime/agent/AgentRuntime.js";
19
- import type { AgentPlugins } from "@/plugin/types/Plugin.js";
20
15
  import type { AgentManagedSession } from "@/types/agent/AgentTypes.js";
21
16
  import {
22
17
  createAgentPathRuntime,
@@ -35,7 +30,12 @@ export interface CreateAgentRuntimeOptions {
35
30
  logger: Logger;
36
31
  /** 当前解析后的配置。 */
37
32
  config: DowncityConfig;
38
- /** 当前环境变量快照。 */
33
+ /**
34
+ * 当前 agent 共享 env 对象。
35
+ *
36
+ * 关键点(中文)
37
+ * - 必须传入 Agent 持有的同一份 mutable 对象,runtime / context 直接复用同一引用。
38
+ */
39
39
  env: Record<string, string>;
40
40
  /** 当前静态 system 文本集合。 */
41
41
  systems: string[];
@@ -47,32 +47,6 @@ export interface CreateAgentRuntimeOptions {
47
47
  list_cached_sessions: () => AgentManagedSession[];
48
48
  }
49
49
 
50
- /**
51
- * 创建 AgentContext 的参数。
52
- */
53
- export interface CreateAgentContextOptions {
54
- /** 当前 AgentRuntime。 */
55
- runtime: AgentRuntime;
56
- /** 当前项目根目录。 */
57
- project_root: string;
58
- /** 统一日志器。 */
59
- logger: Logger;
60
- /** 当前解析后的配置。 */
61
- config: DowncityConfig;
62
- /** 当前环境变量快照。 */
63
- env: Record<string, string>;
64
- /** 当前静态 system 文本集合。 */
65
- systems: string[];
66
- /** 当前 plugin 实例集合。 */
67
- plugin_instances: Map<string, BasePlugin>;
68
- /** 对外 plugin 调用端口。 */
69
- plugins: AgentPlugins;
70
- /** 获取或创建 session runtime port。 */
71
- get_session_port: (session_id: string) => SessionPort;
72
- /** 解析 session 当前绑定的模型实例。 */
73
- resolve_session_model: (session_id: string) => Promise<LanguageModel | undefined>;
74
- }
75
-
76
50
  /**
77
51
  * 创建实例级 runtime 视图。
78
52
  */
@@ -102,51 +76,3 @@ export function createAgentRuntime(
102
76
  pluginInstances: options.plugin_instances,
103
77
  };
104
78
  }
105
-
106
- /**
107
- * 创建统一执行上下文。
108
- */
109
- export function createAgentContext(
110
- options: CreateAgentContextOptions,
111
- ): AgentContext {
112
- let context!: AgentContext;
113
- context = {
114
- agent: options.runtime,
115
- cwd: options.project_root,
116
- rootPath: options.project_root,
117
- logger: options.logger,
118
- config: options.config,
119
- env: options.env,
120
- systems: options.systems,
121
- paths: options.runtime.paths,
122
- pluginConfig: options.runtime.pluginConfig,
123
- session: {
124
- get: (session_id) => options.get_session_port(session_id),
125
- listExecutingSessionIds: () => options.runtime.listExecutingSessionIds(),
126
- getExecutingSessionCount: () => options.runtime.getExecutingSessionCount(),
127
- resolveModel: async (session_id) =>
128
- await options.resolve_session_model(session_id),
129
- },
130
- invoke: {
131
- invoke: async (params: {
132
- plugin: string;
133
- action: string;
134
- payload?: JsonValue;
135
- }) => {
136
- const result = await options.plugins.runAction(params);
137
- if (!result.success) {
138
- return {
139
- success: false,
140
- error: result.error || result.message || "plugin action failed",
141
- };
142
- }
143
- return {
144
- success: true,
145
- ...(result.data !== undefined ? { data: result.data } : {}),
146
- };
147
- },
148
- },
149
- plugins: options.plugins,
150
- };
151
- return context;
152
- }
@@ -9,7 +9,7 @@
9
9
 
10
10
  import type { LanguageModel, Tool } from "ai";
11
11
  import type { BasePlugin } from "@/plugin/core/BasePlugin.js";
12
- import type { AgentContext } from "@/types/runtime/agent/AgentContext.js";
12
+ import { AgentContext } from "@/types/runtime/agent/AgentContext.js";
13
13
  import type { AgentRuntime } from "@/types/runtime/agent/AgentRuntime.js";
14
14
  import type { DowncityConfig } from "@/types/config/DowncityConfig.js";
15
15
  import type { AgentPlugins } from "@/plugin/types/Plugin.js";
@@ -25,7 +25,6 @@ import {
25
25
  createAgentPluginRegistry,
26
26
  } from "@/agent/local/AgentPluginFactory.js";
27
27
  import {
28
- createAgentContext,
29
28
  createAgentRuntime,
30
29
  } from "@/agent/local/AgentRuntimeFactory.js";
31
30
  import {
@@ -165,6 +164,9 @@ export class AgentAssemblyService {
165
164
 
166
165
  const logger = new Logger();
167
166
  logger.bindProjectRoot(path);
167
+ // 关键点(中文)
168
+ // - 这里产出的 env 是 agent 全生命周期共享的 mutable 对象引用。
169
+ // - runtime / context / shell 都持有同一引用;后续 `agent.setEnv()` 会原地修改它。
168
170
  const env = resolveAgentEnv(path, this.options.env);
169
171
  const instruction = normalizeInstructionInput(this.options.instruction);
170
172
  const config = this.load_config(id, path);
@@ -184,27 +186,42 @@ export class AgentAssemblyService {
184
186
 
185
187
  this.register_plugins(plugin_instances, this.options.plugins || []);
186
188
 
187
- let agent_context!: AgentContext;
189
+ // 关键点(中文)
190
+ // - plugin_registry 仍然延迟读取 agent_context(避免循环依赖)。
191
+ // - context 一构造完就赋值,registry 第一次读 get_context 时已经是非空。
192
+ let agent_context: AgentContext | undefined;
188
193
  const plugin_registry = createAgentPluginRegistry({
189
194
  plugins: [...plugin_instances.values()],
190
- get_context: () => agent_context,
195
+ get_context: () => {
196
+ if (!agent_context) {
197
+ throw new Error("AgentContext is not assembled yet");
198
+ }
199
+ return agent_context;
200
+ },
191
201
  });
192
202
  const plugins = plugin_registry;
193
203
  if (this.should_register_plugin_call_tool(plugin_instances)) {
194
204
  tools.plugin_call = tools.plugin_call || plugin_tools.plugin_call;
195
205
  }
196
- agent_context = createAgentContext({
197
- runtime,
198
- project_root: path,
206
+ const resolve_session_model = this.resolve_session_model;
207
+ agent_context = new AgentContext({
208
+ agent: runtime,
209
+ cwd: path,
210
+ rootPath: path,
199
211
  logger,
200
212
  config,
201
213
  env,
202
214
  systems: instruction,
203
- plugin_instances,
215
+ paths: runtime.paths,
216
+ pluginConfig: runtime.pluginConfig,
217
+ session: {
218
+ get: (session_id) => this.get_session_port(session_id),
219
+ listExecutingSessionIds: () => runtime.listExecutingSessionIds(),
220
+ getExecutingSessionCount: () => runtime.getExecutingSessionCount(),
221
+ resolveModel: async (session_id) =>
222
+ await resolve_session_model(session_id),
223
+ },
204
224
  plugins,
205
- get_session_port: this.get_session_port,
206
- resolve_session_model: async (session_id) =>
207
- await this.resolve_session_model(session_id),
208
225
  });
209
226
  const shell = this.options.shell;
210
227
  if (shell) {
@@ -216,7 +233,7 @@ export class AgentAssemblyService {
216
233
  emit_event: (event) => {
217
234
  const session_id = String(event.session_id || "").trim();
218
235
  if (!session_id) return;
219
- agent_context.session.get(session_id).publishEvent(event as unknown as AgentSessionEvent);
236
+ agent_context!.session.get(session_id).publishEvent(event as unknown as AgentSessionEvent);
220
237
  },
221
238
  });
222
239
  Object.assign(tools, shell.tools);
@@ -235,7 +252,7 @@ export class AgentAssemblyService {
235
252
  plugin_registry,
236
253
  plugins,
237
254
  runtime,
238
- agent_context,
255
+ agent_context: agent_context!,
239
256
  ...(shell ? { shell } : {}),
240
257
  };
241
258
  }
@@ -0,0 +1,116 @@
1
+ /**
2
+ * AgentBackgroundService:本地 Agent 后台能力生命周期服务。
3
+ *
4
+ * 关键点(中文)
5
+ * - 统一管理 plugins 与 ActionSchedule 的启动 / 停止。
6
+ * - 在 Agent 构造阶段自动启动后台能力,调用方通过 `await agent.ready()` 等待启动完成。
7
+ * - RPC / HTTP 等 transport 不再属于 Agent 内部职责,由 `@downcity/server` 等外部包按需挂载。
8
+ */
9
+
10
+ import type { AgentContext } from "@/types/runtime/agent/AgentContext.js";
11
+ import type { Logger } from "@/utils/logger/Logger.js";
12
+ import type { ActionScheduleRuntimeHandle } from "@/plugin/core/ActionScheduleRuntime.js";
13
+ import { startActionScheduleRuntime } from "@/plugin/core/ActionScheduleRuntime.js";
14
+ import { startAllPlugins, stopAllPlugins } from "@/plugin/core/Manager.js";
15
+ import type { Shell } from "@downcity/shell";
16
+
17
+ type AgentBackgroundServiceOptions = {
18
+ /**
19
+ * 当前统一日志器。
20
+ */
21
+ logger: Logger;
22
+
23
+ /**
24
+ * 当前 agent context。
25
+ */
26
+ agent_context: AgentContext;
27
+
28
+ /**
29
+ * 读取当前 agent 挂载的 Shell。
30
+ */
31
+ get_shell?: () => Shell | undefined;
32
+ };
33
+
34
+ /**
35
+ * 本地 Agent 后台能力生命周期服务。
36
+ *
37
+ * 关键点(中文)
38
+ * - 构造时自动触发 plugin lifecycle 与 ActionSchedule 启动。
39
+ * - 失败由 logger.error 记录,不抛错;调用方通过 `ready()` 等待启动完成。
40
+ */
41
+ export class AgentBackgroundService {
42
+ private readonly logger: Logger;
43
+ private readonly agent_context: AgentContext;
44
+ private readonly get_shell: AgentBackgroundServiceOptions["get_shell"];
45
+
46
+ private plugins_started = false;
47
+ private action_schedule_runtime: ActionScheduleRuntimeHandle | null = null;
48
+ private ready_promise: Promise<void> | null = null;
49
+
50
+ constructor(options: AgentBackgroundServiceOptions) {
51
+ this.logger = options.logger;
52
+ this.agent_context = options.agent_context;
53
+ this.get_shell = options.get_shell;
54
+ // 关键点(中文):Agent 构造完成即触发后台启动,不再要求外部显式 `start()`。
55
+ this.ready_promise = this.boot();
56
+ }
57
+
58
+ /**
59
+ * 等待后台能力启动完成。
60
+ */
61
+ async ready(): Promise<void> {
62
+ if (!this.ready_promise) return;
63
+ await this.ready_promise;
64
+ }
65
+
66
+ /**
67
+ * 释放当前 Agent 的后台能力。
68
+ */
69
+ async dispose(): Promise<void> {
70
+ if (this.ready_promise) {
71
+ await this.ready_promise.catch(() => undefined);
72
+ this.ready_promise = null;
73
+ }
74
+ if (this.plugins_started) {
75
+ await this.stop_action_schedule_runtime();
76
+ await stopAllPlugins(this.agent_context);
77
+ this.plugins_started = false;
78
+ }
79
+ await this.get_shell?.()?.dispose();
80
+ }
81
+
82
+ private async boot(): Promise<void> {
83
+ await this.ensure_plugins_started();
84
+ }
85
+
86
+ private async ensure_plugins_started(): Promise<void> {
87
+ if (this.plugins_started) return;
88
+ const lifecycle = await startAllPlugins(this.agent_context);
89
+ this.plugins_started = true;
90
+ for (const item of lifecycle.results) {
91
+ if (!item.success) {
92
+ this.logger.error(
93
+ `Plugin start failed: ${item.plugin?.name || "unknown"} - ${item.error || "unknown error"}`,
94
+ );
95
+ }
96
+ }
97
+ await this.ensure_action_schedule_runtime_started();
98
+ }
99
+
100
+ private async ensure_action_schedule_runtime_started(): Promise<void> {
101
+ if (this.action_schedule_runtime) return;
102
+ try {
103
+ this.action_schedule_runtime = await startActionScheduleRuntime(
104
+ this.agent_context,
105
+ );
106
+ } catch (error) {
107
+ this.logger.error(`ActionSchedule start failed: ${String(error)}`);
108
+ }
109
+ }
110
+
111
+ private async stop_action_schedule_runtime(): Promise<void> {
112
+ const runtime = this.action_schedule_runtime;
113
+ this.action_schedule_runtime = null;
114
+ runtime?.stop();
115
+ }
116
+ }
@@ -493,6 +493,28 @@ export class JsonlSessionHistoryStore implements SessionHistoryStore {
493
493
  });
494
494
  }
495
495
 
496
+ /**
497
+ * 批量追加消息。
498
+ *
499
+ * 关键点(中文)
500
+ * - 一次锁、一次 IO,适合 fork 等需要拷贝整段历史的场景。
501
+ * - 不处理 inflight,调用方需自行确保历史已经收口。
502
+ */
503
+ async appendMany(messages: SessionMessageV1[]): Promise<void> {
504
+ if (!Array.isArray(messages) || messages.length === 0) return;
505
+ const normalized_list = messages
506
+ .map((message) => this.normalizePersistedMessage(message))
507
+ .filter((message): message is SessionMessageV1 => message !== null);
508
+ if (normalized_list.length === 0) return;
509
+
510
+ const payload = normalized_list
511
+ .map((message) => `${JSON.stringify(message)}\n`)
512
+ .join("");
513
+ await this.withWriteLock(async () => {
514
+ await fs.appendFile(this.getMessagesFilePath(), payload, "utf8");
515
+ });
516
+ }
517
+
496
518
  async readInflight(): Promise<SessionMessageV1 | null> {
497
519
  await this.ensureLayout();
498
520
  return this.readInflightUnsafe();
package/src/index.ts CHANGED
@@ -26,11 +26,6 @@ export type {
26
26
  AgentCreateSessionInput,
27
27
  AgentListSessionsInput,
28
28
  AgentOptions,
29
- AgentRpcBinding,
30
- AgentRpcStartOptions,
31
- AgentStartOptions,
32
- AgentStartResult,
33
- AgentStopResult,
34
29
  RemoteAgentOptions,
35
30
  AgentSessionConfigSnapshot,
36
31
  AgentSessionForkInput,
@@ -61,8 +56,9 @@ export type {
61
56
  AgentSessionTurnResult,
62
57
  } from "./types/sdk/AgentSessionTurn.js";
63
58
  export type { AgentRuntime, AgentRuntimeBase } from "./types/runtime/agent/AgentRuntime.js";
59
+ export { AgentContext } from "./types/runtime/agent/AgentContext.js";
64
60
  export type {
65
- AgentContext,
61
+ AgentContextOptions,
66
62
  InvokePluginPort,
67
63
  SessionCollectionPort,
68
64
  SessionPort,
@@ -130,9 +126,6 @@ export {
130
126
  registerPluginActionCommandsForCli,
131
127
  } from "./plugin/core/PluginCommand.js";
132
128
 
133
- // Agent RPC 集成
134
- export { startRpcServer } from "./rpc/Server.js";
135
-
136
129
  // Runtime plugin 运行集成
137
130
  export {
138
131
  startAllPlugins,
@@ -302,13 +302,7 @@ export class SessionViewService<TSession extends Pick<AgentSession, "set">> {
302
302
  },
303
303
  messages: SessionMessageV1[],
304
304
  ): Promise<void> {
305
- for (const message of messages) {
306
- await forked_bundle.history_store.append(message);
307
- }
308
- await forked_bundle.state_service.ensure_title_from_history({
309
- generate: true,
310
- });
311
- await forked_bundle.state_service.touch_metadata();
305
+ await forked_bundle.history_store.appendMany(messages);
312
306
  }
313
307
 
314
308
  private stringify_system_content(content: unknown): string {