@downcity/agent 1.1.126 → 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,27 +0,0 @@
1
- /**
2
- * RPC request dispatcher。
3
- *
4
- * 关键点(中文)
5
- * - Server.ts 不直接包含业务 switch,只负责把已解析请求交给这里。
6
- * - dispatcher 按命名空间分发,避免 SDK 与 Town internal 方法混在一起。
7
- */
8
- import type { RpcRequest } from "../../types/rpc/RpcProtocol.js";
9
- import type { RpcRequestHandlerOptions, RpcSocketSubscription, RpcWriteError, RpcWriteEvent, RpcWriteSuccess } from "../../rpc/server/ServerTypes.js";
10
- /**
11
- * 分发并执行单个 RPC 请求。
12
- */
13
- export declare function dispatchRpcRequest(params: {
14
- /** 当前 RPC 请求。 */
15
- request: RpcRequest;
16
- /** handler 依赖。 */
17
- options: RpcRequestHandlerOptions;
18
- /** 当前 socket 的订阅表。 */
19
- subscriptions: Map<string, RpcSocketSubscription>;
20
- /** 成功帧写入函数。 */
21
- write_success: RpcWriteSuccess;
22
- /** 失败帧写入函数。 */
23
- write_error: RpcWriteError;
24
- /** 事件帧写入函数。 */
25
- write_event: RpcWriteEvent;
26
- }): Promise<void>;
27
- //# sourceMappingURL=RequestDispatcher.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RequestDispatcher.d.ts","sourceRoot":"","sources":["../../../src/rpc/server/RequestDispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EACV,wBAAwB,EACxB,qBAAqB,EACrB,aAAa,EACb,aAAa,EACb,eAAe,EAChB,MAAM,6BAA6B,CAAC;AAIrC;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,iBAAiB;IACjB,OAAO,EAAE,UAAU,CAAC;IACpB,kBAAkB;IAClB,OAAO,EAAE,wBAAwB,CAAC;IAClC,sBAAsB;IACtB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAClD,eAAe;IACf,aAAa,EAAE,eAAe,CAAC;IAC/B,eAAe;IACf,WAAW,EAAE,aAAa,CAAC;IAC3B,eAAe;IACf,WAAW,EAAE,aAAa,CAAC;CAC5B,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BhB"}
@@ -1,38 +0,0 @@
1
- /**
2
- * RPC request dispatcher。
3
- *
4
- * 关键点(中文)
5
- * - Server.ts 不直接包含业务 switch,只负责把已解析请求交给这里。
6
- * - dispatcher 按命名空间分发,避免 SDK 与 Town internal 方法混在一起。
7
- */
8
- import { handleSdkSessionRpcRequest } from "../../rpc/server/SdkSessionHandlers.js";
9
- import { handleInternalRpcRequest } from "../../rpc/server/InternalHandlers.js";
10
- /**
11
- * 分发并执行单个 RPC 请求。
12
- */
13
- export async function dispatchRpcRequest(params) {
14
- const { request, options, subscriptions, write_success, write_error, write_event, } = params;
15
- try {
16
- const handled_by_sdk = await handleSdkSessionRpcRequest({
17
- request,
18
- options,
19
- subscriptions,
20
- write_success,
21
- write_event,
22
- });
23
- if (handled_by_sdk)
24
- return;
25
- const handled_by_internal = await handleInternalRpcRequest({
26
- request,
27
- options,
28
- write_success,
29
- });
30
- if (handled_by_internal)
31
- return;
32
- throw new Error(`Unsupported RPC method: ${request.method}`);
33
- }
34
- catch (error) {
35
- write_error(request.id, error);
36
- }
37
- }
38
- //# sourceMappingURL=RequestDispatcher.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RequestDispatcher.js","sourceRoot":"","sources":["../../../src/rpc/server/RequestDispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAaxC;IACC,MAAM,EACJ,OAAO,EACP,OAAO,EACP,aAAa,EACb,aAAa,EACb,WAAW,EACX,WAAW,GACZ,GAAG,MAAM,CAAC;IAEX,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,MAAM,0BAA0B,CAAC;YACtD,OAAO;YACP,OAAO;YACP,aAAa;YACb,aAAa;YACb,WAAW;SACZ,CAAC,CAAC;QACH,IAAI,cAAc;YAAE,OAAO;QAE3B,MAAM,mBAAmB,GAAG,MAAM,wBAAwB,CAAC;YACzD,OAAO;YACP,OAAO;YACP,aAAa;SACd,CAAC,CAAC;QACH,IAAI,mBAAmB;YAAE,OAAO;QAEhC,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
@@ -1,25 +0,0 @@
1
- /**
2
- * RPC SDK session handlers。
3
- *
4
- * 关键点(中文)
5
- * - 只处理 `sdk.sessions.*` 方法。
6
- * - 这些方法是 RemoteAgent RPC transport 的稳定 SDK 面。
7
- */
8
- import type { RpcRequest } from "../../types/rpc/RpcProtocol.js";
9
- import type { RpcSocketSubscription, RpcWriteEvent, RpcWriteSuccess, RpcRequestHandlerOptions } from "../../rpc/server/ServerTypes.js";
10
- /**
11
- * 处理 SDK session RPC 请求。
12
- */
13
- export declare function handleSdkSessionRpcRequest(params: {
14
- /** 当前 RPC 请求。 */
15
- request: RpcRequest;
16
- /** handler 依赖。 */
17
- options: RpcRequestHandlerOptions;
18
- /** 当前 socket 的订阅表。 */
19
- subscriptions: Map<string, RpcSocketSubscription>;
20
- /** 成功帧写入函数。 */
21
- write_success: RpcWriteSuccess;
22
- /** 事件帧写入函数。 */
23
- write_event: RpcWriteEvent;
24
- }): Promise<boolean>;
25
- //# sourceMappingURL=SdkSessionHandlers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SdkSessionHandlers.d.ts","sourceRoot":"","sources":["../../../src/rpc/server/SdkSessionHandlers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EACV,qBAAqB,EACrB,aAAa,EACb,eAAe,EACf,wBAAwB,EACzB,MAAM,6BAA6B,CAAC;AAErC;;GAEG;AACH,wBAAsB,0BAA0B,CAAC,MAAM,EAAE;IACvD,iBAAiB;IACjB,OAAO,EAAE,UAAU,CAAC;IACpB,kBAAkB;IAClB,OAAO,EAAE,wBAAwB,CAAC;IAClC,sBAAsB;IACtB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAClD,eAAe;IACf,aAAa,EAAE,eAAe,CAAC;IAC/B,eAAe;IACf,WAAW,EAAE,aAAa,CAAC;CAC5B,GAAG,OAAO,CAAC,OAAO,CAAC,CA2EnB"}
@@ -1,86 +0,0 @@
1
- /**
2
- * RPC SDK session handlers。
3
- *
4
- * 关键点(中文)
5
- * - 只处理 `sdk.sessions.*` 方法。
6
- * - 这些方法是 RemoteAgent RPC transport 的稳定 SDK 面。
7
- */
8
- /**
9
- * 处理 SDK session RPC 请求。
10
- */
11
- export async function handleSdkSessionRpcRequest(params) {
12
- const { request, options, subscriptions, write_success, write_event } = params;
13
- switch (request.method) {
14
- case "sdk.sessions.list": {
15
- const page = await options.sessionCollection.listSessions(request.params);
16
- write_success(request.id, { page });
17
- return true;
18
- }
19
- case "sdk.sessions.create": {
20
- const session = await options.sessionCollection.createSession(request.params);
21
- write_success(request.id, { session: await session.getInfo() });
22
- return true;
23
- }
24
- case "sdk.sessions.get": {
25
- const session = await options.sessionCollection.getSession(request.params.sessionId);
26
- write_success(request.id, { session: await session.getInfo() });
27
- return true;
28
- }
29
- case "sdk.sessions.prompt": {
30
- const session = await options.sessionCollection.getSession(request.params.sessionId);
31
- const turn = await session.prompt(request.params.input);
32
- write_success(request.id, { turn: { id: turn.id } });
33
- return true;
34
- }
35
- case "sdk.sessions.history": {
36
- const session = await options.sessionCollection.getSession(request.params.sessionId);
37
- const history = await session.history(request.params.input);
38
- write_success(request.id, { history });
39
- return true;
40
- }
41
- case "sdk.sessions.system": {
42
- const session = await options.sessionCollection.getSession(request.params.sessionId);
43
- write_success(request.id, { system: await session.system() });
44
- return true;
45
- }
46
- case "sdk.sessions.fork": {
47
- const session = await options.sessionCollection.getSession(request.params.sessionId);
48
- const forked = await session.fork(request.params.messageId);
49
- write_success(request.id, { session: await forked.getInfo() });
50
- return true;
51
- }
52
- case "sdk.sessions.subscribe": {
53
- const session = await options.sessionCollection.getSession(request.params.sessionId);
54
- const subscription_id = [
55
- request.params.sessionId,
56
- Date.now(),
57
- Math.random().toString(36).slice(2, 10),
58
- ].join(":");
59
- const unsubscribe = session.subscribe((event) => {
60
- write_event({
61
- type: "event",
62
- subscriptionId: subscription_id,
63
- event,
64
- });
65
- });
66
- subscriptions.set(subscription_id, {
67
- sessionId: request.params.sessionId,
68
- unsubscribe,
69
- });
70
- write_success(request.id, { subscriptionId: subscription_id });
71
- return true;
72
- }
73
- case "sdk.sessions.unsubscribe": {
74
- const subscription = subscriptions.get(request.params.subscriptionId);
75
- if (subscription) {
76
- subscription.unsubscribe();
77
- subscriptions.delete(request.params.subscriptionId);
78
- }
79
- write_success(request.id, { unsubscribed: true });
80
- return true;
81
- }
82
- default:
83
- return false;
84
- }
85
- }
86
- //# sourceMappingURL=SdkSessionHandlers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SdkSessionHandlers.js","sourceRoot":"","sources":["../../../src/rpc/server/SdkSessionHandlers.ts"],"names":[],"mappings":"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"}
@@ -1,64 +0,0 @@
1
- /**
2
- * Agent RPC server 内部类型。
3
- *
4
- * 关键点(中文)
5
- * - 这里描述 handler 需要的依赖,不承载 socket 生命周期。
6
- * - Server.ts 负责网络,handler 负责把协议方法转成 Agent 操作。
7
- */
8
- import type { AgentSessionCollection } from "../../types/agent/AgentTypes.js";
9
- import type { AgentContext } from "../../types/runtime/agent/AgentContext.js";
10
- import type { AgentRuntime } from "../../types/runtime/agent/AgentRuntime.js";
11
- import type { RpcEventFrame } from "../../types/rpc/RpcProtocol.js";
12
- import type { Shell } from "@downcity/shell";
13
- /**
14
- * RPC Server 启动参数。
15
- */
16
- export interface RpcServerStartOptions {
17
- /** RPC 服务监听端口。 */
18
- port: number;
19
- /** RPC 服务监听主机。 */
20
- host: string;
21
- /** Session 集合访问口。 */
22
- sessionCollection: AgentSessionCollection;
23
- /** Agent 上下文访问口。 */
24
- getAgentContext?: () => AgentContext;
25
- /** Agent 运行态访问口。 */
26
- getAgentRuntime?: () => AgentRuntime;
27
- /** Shell 访问口。 */
28
- getShell?: () => Shell | undefined;
29
- }
30
- /**
31
- * RPC request handler 依赖。
32
- */
33
- export interface RpcRequestHandlerOptions {
34
- /** Session 集合访问口。 */
35
- sessionCollection: AgentSessionCollection;
36
- /** Agent 上下文访问口。 */
37
- getAgentContext?: () => AgentContext;
38
- /** Agent 运行态访问口。 */
39
- getAgentRuntime?: () => AgentRuntime;
40
- /** Shell 访问口。 */
41
- getShell?: () => Shell | undefined;
42
- }
43
- /**
44
- * 单个 socket 上的 session 订阅。
45
- */
46
- export interface RpcSocketSubscription {
47
- /** 被订阅的 session id。 */
48
- sessionId: string;
49
- /** 取消订阅函数。 */
50
- unsubscribe: () => void;
51
- }
52
- /**
53
- * 写入 RPC 成功帧。
54
- */
55
- export type RpcWriteSuccess = (id: string, data?: unknown) => void;
56
- /**
57
- * 写入 RPC 失败帧。
58
- */
59
- export type RpcWriteError = (id: string, error: unknown) => void;
60
- /**
61
- * 写入 RPC 事件帧。
62
- */
63
- export type RpcWriteEvent = (frame: RpcEventFrame) => void;
64
- //# sourceMappingURL=ServerTypes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ServerTypes.d.ts","sourceRoot":"","sources":["../../../src/rpc/server/ServerTypes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,iBAAiB,EAAE,sBAAsB,CAAC;IAC1C,oBAAoB;IACpB,eAAe,CAAC,EAAE,MAAM,YAAY,CAAC;IACrC,oBAAoB;IACpB,eAAe,CAAC,EAAE,MAAM,YAAY,CAAC;IACrC,iBAAiB;IACjB,QAAQ,CAAC,EAAE,MAAM,KAAK,GAAG,SAAS,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,qBAAqB;IACrB,iBAAiB,EAAE,sBAAsB,CAAC;IAC1C,oBAAoB;IACpB,eAAe,CAAC,EAAE,MAAM,YAAY,CAAC;IACrC,oBAAoB;IACpB,eAAe,CAAC,EAAE,MAAM,YAAY,CAAC;IACrC,iBAAiB;IACjB,QAAQ,CAAC,EAAE,MAAM,KAAK,GAAG,SAAS,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc;IACd,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAEnE;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;AAEjE;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC"}
@@ -1,9 +0,0 @@
1
- /**
2
- * Agent RPC server 内部类型。
3
- *
4
- * 关键点(中文)
5
- * - 这里描述 handler 需要的依赖,不承载 socket 生命周期。
6
- * - Server.ts 负责网络,handler 负责把协议方法转成 Agent 操作。
7
- */
8
- export {};
9
- //# sourceMappingURL=ServerTypes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ServerTypes.js","sourceRoot":"","sources":["../../../src/rpc/server/ServerTypes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -1,198 +0,0 @@
1
- /**
2
- * AgentLifecycleService:本地 Agent 生命周期服务。
3
- *
4
- * 关键点(中文)
5
- * - 统一管理 plugins、ActionSchedule 与本机 RPC 的启动/停止。
6
- * - 该服务只负责长期后台能力生命周期,不负责 session 构造与运行时装配。
7
- * - facade 通过它暴露 `start()` / `stop()` 语义,避免生命周期状态散落在 Agent 主类中。
8
- */
9
-
10
- import type { AgentContext } from "@/types/runtime/agent/AgentContext.js";
11
- import type {
12
- AgentRpcBinding,
13
- AgentRpcStartOptions,
14
- AgentSessionCollection,
15
- AgentStartOptions,
16
- AgentStartResult,
17
- AgentStopResult,
18
- } from "@/types/agent/AgentTypes.js";
19
- import type { Logger } from "@/utils/logger/Logger.js";
20
- import type { ActionScheduleRuntimeHandle } from "@/plugin/core/ActionScheduleRuntime.js";
21
- import { startActionScheduleRuntime } from "@/plugin/core/ActionScheduleRuntime.js";
22
- import { startAllPlugins, stopAllPlugins } from "@/plugin/core/Manager.js";
23
- import { startRpcServer } from "@/rpc/Server.js";
24
- import type { AgentRuntime } from "@/types/runtime/agent/AgentRuntime.js";
25
- import type { Shell } from "@downcity/shell";
26
-
27
- type AgentLifecycleServiceOptions = {
28
- /**
29
- * 当前统一日志器。
30
- */
31
- logger: Logger;
32
-
33
- /**
34
- * 当前 agent context。
35
- */
36
- agent_context: AgentContext;
37
-
38
- /**
39
- * 当前 session collection。
40
- */
41
- session_collection: AgentSessionCollection;
42
-
43
- /**
44
- * 读取当前 agent runtime。
45
- */
46
- get_runtime: () => AgentRuntime;
47
-
48
- /**
49
- * 读取当前 agent 挂载的 Shell。
50
- */
51
- get_shell?: () => Shell | undefined;
52
- };
53
-
54
- /**
55
- * 本地 Agent 生命周期服务。
56
- */
57
- export class AgentLifecycleService {
58
- private readonly logger: Logger;
59
- private readonly agent_context: AgentContext;
60
- private readonly session_collection: AgentSessionCollection;
61
- private readonly get_runtime: AgentLifecycleServiceOptions["get_runtime"];
62
- private readonly get_shell: AgentLifecycleServiceOptions["get_shell"];
63
-
64
- private plugins_started = false;
65
- private action_schedule_runtime: ActionScheduleRuntimeHandle | null = null;
66
- private start_promise: Promise<AgentStartResult> | null = null;
67
- private rpc_binding: AgentRpcBinding | null = null;
68
-
69
- constructor(options: AgentLifecycleServiceOptions) {
70
- this.logger = options.logger;
71
- this.agent_context = options.agent_context;
72
- this.session_collection = options.session_collection;
73
- this.get_runtime = options.get_runtime;
74
- this.get_shell = options.get_shell;
75
- }
76
-
77
- /**
78
- * 启动当前 agent 实例的长期运行能力。
79
- */
80
- async start(options?: AgentStartOptions): Promise<AgentStartResult> {
81
- if (this.start_promise) {
82
- return await this.start_promise;
83
- }
84
- this.start_promise = (async () => {
85
- const should_start_plugins = options?.plugins !== false;
86
- if (should_start_plugins) {
87
- await this.ensure_plugins_started();
88
- }
89
- const rpc_binding =
90
- options?.rpc === false || options?.rpc === undefined
91
- ? undefined
92
- : await this.start_rpc(options.rpc);
93
- return {
94
- ...(rpc_binding ? { rpc: rpc_binding } : {}),
95
- pluginsStarted: this.plugins_started,
96
- };
97
- })();
98
- try {
99
- return await this.start_promise;
100
- } catch (error) {
101
- this.start_promise = null;
102
- throw error;
103
- }
104
- }
105
-
106
- /**
107
- * 停止当前 agent 实例的长期运行能力。
108
- */
109
- async stop(): Promise<AgentStopResult> {
110
- const plugins_started = this.plugins_started;
111
- const rpc_started = this.rpc_binding !== null;
112
-
113
- if (plugins_started) {
114
- await this.stop_action_schedule_runtime();
115
- await stopAllPlugins(this.agent_context);
116
- this.plugins_started = false;
117
- }
118
-
119
- if (rpc_started) {
120
- await this.stop_rpc();
121
- }
122
-
123
- await this.get_shell?.()?.dispose();
124
-
125
- this.start_promise = null;
126
-
127
- return {
128
- rpcStopped: rpc_started,
129
- pluginsStopped: plugins_started,
130
- };
131
- }
132
-
133
- private async ensure_plugins_started(): Promise<void> {
134
- if (this.plugins_started) return;
135
- const lifecycle = await startAllPlugins(this.agent_context);
136
- this.plugins_started = true;
137
- for (const item of lifecycle.results) {
138
- if (!item.success) {
139
- this.logger.error(
140
- `Plugin start failed: ${item.plugin?.name || "unknown"} - ${item.error || "unknown error"}`,
141
- );
142
- }
143
- }
144
- await this.ensure_action_schedule_runtime_started();
145
- }
146
-
147
- private async ensure_action_schedule_runtime_started(): Promise<void> {
148
- if (this.action_schedule_runtime) return;
149
- try {
150
- this.action_schedule_runtime = await startActionScheduleRuntime(
151
- this.agent_context,
152
- );
153
- } catch (error) {
154
- this.logger.error(`ActionSchedule start failed: ${String(error)}`);
155
- }
156
- }
157
-
158
- private async stop_action_schedule_runtime(): Promise<void> {
159
- const runtime = this.action_schedule_runtime;
160
- this.action_schedule_runtime = null;
161
- runtime?.stop();
162
- }
163
-
164
- private async start_rpc(
165
- options?: AgentRpcStartOptions,
166
- ): Promise<AgentRpcBinding> {
167
- if (this.rpc_binding) {
168
- return this.rpc_binding;
169
- }
170
- const host = String(options?.host || "127.0.0.1").trim() || "127.0.0.1";
171
- const port =
172
- typeof options?.port === "number" && Number.isInteger(options.port)
173
- ? options.port
174
- : 15314;
175
- const server = await startRpcServer({
176
- host,
177
- port,
178
- sessionCollection: this.session_collection,
179
- getAgentContext: () => this.agent_context,
180
- getAgentRuntime: () => this.get_runtime(),
181
- getShell: () => this.get_shell?.(),
182
- });
183
- this.rpc_binding = {
184
- url: `rpc://${host}:${port}`,
185
- host,
186
- port,
187
- server,
188
- };
189
- return this.rpc_binding;
190
- }
191
-
192
- private async stop_rpc(): Promise<void> {
193
- if (!this.rpc_binding) return;
194
- const current = this.rpc_binding;
195
- this.rpc_binding = null;
196
- await current.server.stop();
197
- }
198
- }
package/src/rpc/Server.ts DELETED
@@ -1,143 +0,0 @@
1
- /**
2
- * Agent 本机 RPC Server。
3
- *
4
- * 职责说明(中文)
5
- * - 为本机 `RemoteAgent(rpc://...)` 与 Town runtime 提供 Agent RPC 入口。
6
- * - 只负责 TCP/NDJSON framing、socket 生命周期与订阅清理。
7
- * - 具体 `sdk.*` / `internal.*` 方法由 server handlers 承接。
8
- */
9
-
10
- import net from "node:net";
11
- import type {
12
- RpcRequest,
13
- RpcServerFrame,
14
- } from "@/types/rpc/RpcProtocol.js";
15
- import type {
16
- RpcServerStartOptions,
17
- RpcSocketSubscription,
18
- } from "@/rpc/server/ServerTypes.js";
19
- import { dispatchRpcRequest } from "@/rpc/server/RequestDispatcher.js";
20
-
21
- export type { RpcServerStartOptions } from "@/rpc/server/ServerTypes.js";
22
-
23
- /**
24
- * RPC Server 运行实例。
25
- */
26
- export interface RpcServerInstance {
27
- /** 当前监听 host。 */
28
- host: string;
29
- /** 当前监听 port。 */
30
- port: number;
31
- /** 当前访问 URL。 */
32
- url: string;
33
- /** 原生 net server。 */
34
- server: net.Server;
35
- /** 停止当前服务。 */
36
- stop(): Promise<void>;
37
- }
38
-
39
- /**
40
- * 启动 Agent 本机 RPC 服务。
41
- */
42
- export async function startRpcServer(
43
- options: RpcServerStartOptions,
44
- ): Promise<RpcServerInstance> {
45
- const sockets = new Set<net.Socket>();
46
- const server = net.createServer((socket) => {
47
- sockets.add(socket);
48
- const subscriptions = new Map<string, RpcSocketSubscription>();
49
- let buffered = "";
50
-
51
- const cleanup_subscriptions = (): void => {
52
- for (const subscription of subscriptions.values()) {
53
- subscription.unsubscribe();
54
- }
55
- subscriptions.clear();
56
- };
57
-
58
- const write_frame = (frame: RpcServerFrame): void => {
59
- socket.write(`${JSON.stringify(frame)}\n`);
60
- };
61
-
62
- const write_success = (id: string, data?: unknown): void => {
63
- write_frame({
64
- id,
65
- success: true,
66
- ...(data === undefined ? {} : { data }),
67
- });
68
- };
69
-
70
- const write_error = (id: string, error: unknown): void => {
71
- write_frame({
72
- id,
73
- success: false,
74
- error: error instanceof Error ? error.message : String(error),
75
- });
76
- };
77
-
78
- const handle_line = (line: string): void => {
79
- try {
80
- const request = JSON.parse(line) as RpcRequest;
81
- void dispatchRpcRequest({
82
- request,
83
- options,
84
- subscriptions,
85
- write_success,
86
- write_error,
87
- write_event: write_frame,
88
- });
89
- } catch (error) {
90
- write_error("parse", error);
91
- }
92
- };
93
-
94
- socket.on("data", (chunk) => {
95
- buffered += chunk.toString("utf8");
96
- let newline_index = buffered.indexOf("\n");
97
- while (newline_index >= 0) {
98
- const line = buffered.slice(0, newline_index).trim();
99
- buffered = buffered.slice(newline_index + 1);
100
- if (line) {
101
- handle_line(line);
102
- }
103
- newline_index = buffered.indexOf("\n");
104
- }
105
- });
106
-
107
- socket.on("error", () => {
108
- cleanup_subscriptions();
109
- });
110
- socket.on("close", () => {
111
- sockets.delete(socket);
112
- cleanup_subscriptions();
113
- });
114
- socket.on("end", () => {
115
- cleanup_subscriptions();
116
- });
117
- });
118
-
119
- await new Promise<void>((resolve, reject) => {
120
- server.once("error", reject);
121
- server.listen(options.port, options.host, () => {
122
- server.off("error", reject);
123
- resolve();
124
- });
125
- });
126
-
127
- return {
128
- host: options.host,
129
- port: options.port,
130
- url: `rpc://${options.host}:${options.port}`,
131
- server,
132
- async stop(): Promise<void> {
133
- // 关键点(中文):RPC 是长连接;停止 server 时必须主动关闭现有 socket。
134
- for (const socket of sockets) {
135
- socket.destroy();
136
- }
137
- sockets.clear();
138
- await new Promise<void>((resolve) => {
139
- server.close(() => resolve());
140
- });
141
- },
142
- };
143
- }