@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.
- package/README.md +2 -2
- package/bin/agent/local/Agent.d.ts +40 -26
- package/bin/agent/local/Agent.d.ts.map +1 -1
- package/bin/agent/local/Agent.js +65 -41
- package/bin/agent/local/Agent.js.map +1 -1
- package/bin/agent/local/ProjectSetup.js +2 -2
- package/bin/agent/local/ProjectSetup.js.map +1 -1
- package/bin/agent/local/services/AgentAssemblyService.d.ts +2 -7
- package/bin/agent/local/services/AgentAssemblyService.d.ts.map +1 -1
- package/bin/agent/local/services/AgentAssemblyService.js +34 -22
- package/bin/agent/local/services/AgentAssemblyService.js.map +1 -1
- package/bin/agent/local/services/AgentBackgroundService.d.ts +55 -0
- package/bin/agent/local/services/AgentBackgroundService.d.ts.map +1 -0
- package/bin/agent/local/services/AgentBackgroundService.js +86 -0
- package/bin/agent/local/services/AgentBackgroundService.js.map +1 -0
- package/bin/agent/local/services/AgentSessionManager.d.ts +16 -7
- package/bin/agent/local/services/AgentSessionManager.d.ts.map +1 -1
- package/bin/agent/local/services/AgentSessionManager.js +83 -8
- package/bin/agent/local/services/AgentSessionManager.js.map +1 -1
- package/bin/agent/remote/RemoteAgent.d.ts +9 -13
- package/bin/agent/remote/RemoteAgent.d.ts.map +1 -1
- package/bin/agent/remote/RemoteAgent.js +23 -24
- package/bin/agent/remote/RemoteAgent.js.map +1 -1
- package/bin/agent/remote/RemoteSession.d.ts +11 -4
- package/bin/agent/remote/RemoteSession.d.ts.map +1 -1
- package/bin/agent/remote/RemoteSession.js +15 -3
- package/bin/agent/remote/RemoteSession.js.map +1 -1
- package/bin/agent/remote/RemoteTransport.d.ts +9 -1
- package/bin/agent/remote/RemoteTransport.d.ts.map +1 -1
- package/bin/agent/remote/transports/HttpRemoteAgentTransport.d.ts +7 -3
- package/bin/agent/remote/transports/HttpRemoteAgentTransport.d.ts.map +1 -1
- package/bin/agent/remote/transports/HttpRemoteAgentTransport.js +65 -2
- package/bin/agent/remote/transports/HttpRemoteAgentTransport.js.map +1 -1
- package/bin/agent/remote/transports/RpcRemoteAgentTransport.d.ts +5 -1
- package/bin/agent/remote/transports/RpcRemoteAgentTransport.d.ts.map +1 -1
- package/bin/agent/remote/transports/RpcRemoteAgentTransport.js +12 -0
- package/bin/agent/remote/transports/RpcRemoteAgentTransport.js.map +1 -1
- package/bin/config/AgentInitializer.d.ts +2 -2
- package/bin/config/AgentInitializer.js +2 -2
- package/bin/executor/Executor.d.ts +5 -0
- package/bin/executor/Executor.d.ts.map +1 -1
- package/bin/executor/Executor.js +34 -0
- package/bin/executor/Executor.js.map +1 -1
- package/bin/executor/composer/system/default/InitPrompts.d.ts +1 -1
- package/bin/executor/composer/system/default/InitPrompts.js +1 -1
- package/bin/executor/composer/system/default/SystemDomain.js +2 -2
- package/bin/executor/composer/system/default/SystemDomain.js.map +1 -1
- package/bin/executor/core-engine/CoreEngineRunner.d.ts.map +1 -1
- package/bin/executor/core-engine/CoreEngineRunner.js +16 -0
- package/bin/executor/core-engine/CoreEngineRunner.js.map +1 -1
- package/bin/executor/messages/ChatMessageMarkupTypes.d.ts +1 -1
- package/bin/executor/messages/ChatMessageMarkupTypes.js +1 -1
- package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.d.ts +8 -0
- package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.d.ts.map +1 -1
- package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.js +22 -0
- package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.js.map +1 -1
- package/bin/executor/types/SessionExecutor.d.ts +8 -0
- package/bin/executor/types/SessionExecutor.d.ts.map +1 -1
- package/bin/index.d.ts +4 -4
- package/bin/index.d.ts.map +1 -1
- package/bin/index.js +1 -2
- package/bin/index.js.map +1 -1
- package/bin/plugin/core/Activation.d.ts +0 -2
- package/bin/plugin/core/Activation.d.ts.map +1 -1
- package/bin/plugin/core/Activation.js +1 -1
- package/bin/plugin/core/Activation.js.map +1 -1
- package/bin/plugin/core/PluginCommandRequest.d.ts +1 -1
- package/bin/plugin/core/PluginCommandRequest.js +1 -1
- package/bin/plugin/core/PluginStateController.d.ts +0 -5
- package/bin/plugin/core/PluginStateController.d.ts.map +1 -1
- package/bin/plugin/core/PluginStateController.js +1 -5
- package/bin/plugin/core/PluginStateController.js.map +1 -1
- package/bin/plugin/types/PluginApi.d.ts +1 -1
- package/bin/plugin/types/PluginApi.js +1 -1
- package/bin/rpc/Client.d.ts +17 -1
- package/bin/rpc/Client.d.ts.map +1 -1
- package/bin/rpc/Client.js +47 -0
- package/bin/rpc/Client.js.map +1 -1
- package/bin/session/Session.d.ts +5 -0
- package/bin/session/Session.d.ts.map +1 -1
- package/bin/session/Session.js +7 -0
- package/bin/session/Session.js.map +1 -1
- package/bin/session/browse/Browse.d.ts +9 -1
- package/bin/session/browse/Browse.d.ts.map +1 -1
- package/bin/session/browse/Browse.js +81 -3
- package/bin/session/browse/Browse.js.map +1 -1
- package/bin/session/index.d.ts +3 -3
- package/bin/session/index.d.ts.map +1 -1
- package/bin/session/index.js +3 -3
- package/bin/session/index.js.map +1 -1
- package/bin/session/runtime/SessionPromptRuntime.d.ts +13 -0
- package/bin/session/runtime/SessionPromptRuntime.d.ts.map +1 -1
- package/bin/session/runtime/SessionPromptRuntime.js +82 -5
- package/bin/session/runtime/SessionPromptRuntime.js.map +1 -1
- package/bin/session/services/SessionTurnService.d.ts +5 -0
- package/bin/session/services/SessionTurnService.d.ts.map +1 -1
- package/bin/session/services/SessionTurnService.js +10 -1
- package/bin/session/services/SessionTurnService.js.map +1 -1
- package/bin/session/services/SessionViewService.d.ts.map +1 -1
- package/bin/session/services/SessionViewService.js +1 -7
- package/bin/session/services/SessionViewService.js.map +1 -1
- package/bin/session/storage/Metadata.d.ts +15 -0
- package/bin/session/storage/Metadata.d.ts.map +1 -1
- package/bin/session/storage/Metadata.js +15 -1
- package/bin/session/storage/Metadata.js.map +1 -1
- package/bin/session/storage/Paths.d.ts +24 -0
- package/bin/session/storage/Paths.d.ts.map +1 -1
- package/bin/session/storage/Paths.js +34 -0
- package/bin/session/storage/Paths.js.map +1 -1
- package/bin/session/storage/RuntimeSessionPort.d.ts +5 -0
- package/bin/session/storage/RuntimeSessionPort.d.ts.map +1 -1
- package/bin/session/storage/RuntimeSessionPort.js +4 -0
- package/bin/session/storage/RuntimeSessionPort.js.map +1 -1
- package/bin/types/agent/AgentOptions.d.ts +0 -63
- package/bin/types/agent/AgentOptions.d.ts.map +1 -1
- package/bin/types/agent/AgentTypes.d.ts +3 -2
- package/bin/types/agent/AgentTypes.d.ts.map +1 -1
- package/bin/types/agent/SessionActor.d.ts +13 -4
- package/bin/types/agent/SessionActor.d.ts.map +1 -1
- package/bin/types/agent/SessionTypes.d.ts +62 -0
- package/bin/types/agent/SessionTypes.d.ts.map +1 -1
- package/bin/types/config/DowncityConfig.d.ts +1 -1
- package/bin/types/executor/SessionRunContext.d.ts +8 -0
- package/bin/types/executor/SessionRunContext.d.ts.map +1 -1
- package/bin/types/platform/Store.d.ts +2 -2
- package/bin/types/platform/Store.js +2 -2
- package/bin/types/rpc/RpcProtocol.d.ts +37 -5
- package/bin/types/rpc/RpcProtocol.d.ts.map +1 -1
- package/bin/types/rpc/RpcProtocol.js +1 -1
- package/bin/types/runtime/agent/AgentContext.d.ts +92 -43
- package/bin/types/runtime/agent/AgentContext.d.ts.map +1 -1
- package/bin/types/runtime/agent/AgentContext.js +97 -5
- package/bin/types/runtime/agent/AgentContext.js.map +1 -1
- package/bin/types/runtime/platform/Platform.d.ts +8 -8
- package/bin/types/runtime/platform/PlatformGateway.d.ts +2 -2
- package/bin/types/sdk/AgentSessionStop.d.ts +36 -0
- package/bin/types/sdk/AgentSessionStop.d.ts.map +1 -0
- package/bin/types/sdk/AgentSessionStop.js +9 -0
- package/bin/types/sdk/AgentSessionStop.js.map +1 -0
- package/package.json +3 -3
- package/scripts/city-model-tool-loop.test.mjs +2 -2
- package/scripts/session-prompt-runtime.test.mjs +59 -0
- package/src/agent/local/Agent.ts +66 -55
- package/src/agent/local/ProjectSetup.ts +2 -2
- package/src/agent/local/services/AgentAssemblyService.ts +41 -35
- package/src/agent/local/services/AgentBackgroundService.ts +116 -0
- package/src/agent/local/services/AgentSessionManager.ts +127 -13
- package/src/agent/remote/RemoteAgent.ts +25 -34
- package/src/agent/remote/RemoteSession.ts +21 -6
- package/src/agent/remote/RemoteTransport.ts +14 -0
- package/src/agent/remote/transports/HttpRemoteAgentTransport.ts +100 -2
- package/src/agent/remote/transports/RpcRemoteAgentTransport.ts +26 -0
- package/src/config/AgentInitializer.ts +2 -2
- package/src/executor/Executor.ts +33 -0
- package/src/executor/composer/system/default/InitPrompts.ts +1 -1
- package/src/executor/composer/system/default/SystemDomain.ts +2 -2
- package/src/executor/core-engine/CoreEngineRunner.ts +21 -0
- package/src/executor/messages/ChatMessageMarkupTypes.ts +1 -1
- package/src/executor/store/history/jsonl/JsonlSessionHistoryStore.ts +22 -0
- package/src/executor/types/SessionExecutor.ts +2 -1
- package/src/index.ts +8 -10
- package/src/plugin/core/Activation.ts +1 -3
- package/src/plugin/core/PluginCommandRequest.ts +1 -1
- package/src/plugin/core/PluginStateController.ts +1 -10
- package/src/plugin/types/PluginApi.ts +1 -1
- package/src/rpc/Client.ts +61 -0
- package/src/session/Session.ts +9 -0
- package/src/session/browse/Browse.ts +103 -3
- package/src/session/index.ts +7 -0
- package/src/session/runtime/SessionPromptRuntime.ts +100 -5
- package/src/session/services/SessionTurnService.ts +13 -1
- package/src/session/services/SessionViewService.ts +1 -7
- package/src/session/storage/Metadata.ts +23 -1
- package/src/session/storage/Paths.ts +70 -0
- package/src/session/storage/RuntimeSessionPort.ts +9 -0
- package/src/types/agent/AgentOptions.ts +0 -69
- package/src/types/agent/AgentTypes.ts +6 -5
- package/src/types/agent/SessionActor.ts +21 -3
- package/src/types/agent/SessionTypes.ts +68 -0
- package/src/types/config/DowncityConfig.ts +1 -1
- package/src/types/executor/SessionRunContext.ts +9 -0
- package/src/types/platform/Store.ts +2 -2
- package/src/types/rpc/RpcProtocol.ts +46 -4
- package/src/types/runtime/agent/AgentContext.ts +132 -45
- package/src/types/runtime/platform/Platform.ts +8 -8
- package/src/types/runtime/platform/PlatformGateway.ts +2 -2
- package/src/types/sdk/AgentSessionStop.ts +39 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/bin/agent/local/AgentRuntimeFactory.d.ts +0 -72
- package/bin/agent/local/AgentRuntimeFactory.d.ts.map +0 -1
- package/bin/agent/local/AgentRuntimeFactory.js +0 -73
- package/bin/agent/local/AgentRuntimeFactory.js.map +0 -1
- package/bin/agent/local/services/AgentLifecycleService.d.ts +0 -65
- package/bin/agent/local/services/AgentLifecycleService.d.ts.map +0 -1
- package/bin/agent/local/services/AgentLifecycleService.js +0 -140
- package/bin/agent/local/services/AgentLifecycleService.js.map +0 -1
- package/bin/rpc/Server.d.ts +0 -31
- package/bin/rpc/Server.d.ts.map +0 -1
- package/bin/rpc/Server.js +0 -106
- package/bin/rpc/Server.js.map +0 -1
- package/bin/rpc/server/InternalHandlers.d.ts +0 -21
- package/bin/rpc/server/InternalHandlers.d.ts.map +0 -1
- package/bin/rpc/server/InternalHandlers.js +0 -244
- package/bin/rpc/server/InternalHandlers.js.map +0 -1
- package/bin/rpc/server/RequestDispatcher.d.ts +0 -27
- package/bin/rpc/server/RequestDispatcher.d.ts.map +0 -1
- package/bin/rpc/server/RequestDispatcher.js +0 -38
- package/bin/rpc/server/RequestDispatcher.js.map +0 -1
- package/bin/rpc/server/SdkSessionHandlers.d.ts +0 -25
- package/bin/rpc/server/SdkSessionHandlers.d.ts.map +0 -1
- package/bin/rpc/server/SdkSessionHandlers.js +0 -86
- package/bin/rpc/server/SdkSessionHandlers.js.map +0 -1
- package/bin/rpc/server/ServerTypes.d.ts +0 -64
- package/bin/rpc/server/ServerTypes.d.ts.map +0 -1
- package/bin/rpc/server/ServerTypes.js +0 -9
- package/bin/rpc/server/ServerTypes.js.map +0 -1
- package/bin/types/runtime/agent/AgentRuntime.d.ts +0 -79
- package/bin/types/runtime/agent/AgentRuntime.d.ts.map +0 -1
- package/bin/types/runtime/agent/AgentRuntime.js +0 -13
- package/bin/types/runtime/agent/AgentRuntime.js.map +0 -1
- package/src/agent/local/AgentRuntimeFactory.ts +0 -152
- package/src/agent/local/services/AgentLifecycleService.ts +0 -198
- package/src/rpc/Server.ts +0 -143
- package/src/rpc/server/InternalHandlers.ts +0 -285
- package/src/rpc/server/RequestDispatcher.ts +0 -67
- package/src/rpc/server/SdkSessionHandlers.ts +0 -106
- package/src/rpc/server/ServerTypes.ts +0 -70
- package/src/types/runtime/agent/AgentRuntime.ts +0 -84
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent runtime / context 装配工厂。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 这里只创建长期 runtime 视图与执行期 context 视图。
|
|
6
|
-
* - Agent 仍然持有 session/plugin 状态;这里通过函数参数读取状态。
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type { BasePlugin } from "@/plugin/core/BasePlugin.js";
|
|
10
|
-
import type { Logger } from "@/utils/logger/Logger.js";
|
|
11
|
-
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";
|
|
18
|
-
import type { AgentRuntime } from "@/types/runtime/agent/AgentRuntime.js";
|
|
19
|
-
import type { AgentPlugins } from "@/plugin/types/Plugin.js";
|
|
20
|
-
import type { AgentManagedSession } from "@/types/agent/AgentTypes.js";
|
|
21
|
-
import {
|
|
22
|
-
createAgentPathRuntime,
|
|
23
|
-
createAgentPluginConfigRuntime,
|
|
24
|
-
} from "@/agent/local/AgentRuntimeAssembly.js";
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* 创建 AgentRuntime 的参数。
|
|
28
|
-
*/
|
|
29
|
-
export interface CreateAgentRuntimeOptions {
|
|
30
|
-
/** 当前 agent id。 */
|
|
31
|
-
agent_id: string;
|
|
32
|
-
/** 当前项目根目录。 */
|
|
33
|
-
project_root: string;
|
|
34
|
-
/** 统一日志器。 */
|
|
35
|
-
logger: Logger;
|
|
36
|
-
/** 当前解析后的配置。 */
|
|
37
|
-
config: DowncityConfig;
|
|
38
|
-
/** 当前环境变量快照。 */
|
|
39
|
-
env: Record<string, string>;
|
|
40
|
-
/** 当前静态 system 文本集合。 */
|
|
41
|
-
systems: string[];
|
|
42
|
-
/** 当前 plugin 实例集合。 */
|
|
43
|
-
plugin_instances: Map<string, BasePlugin>;
|
|
44
|
-
/** 获取或创建 session runtime port。 */
|
|
45
|
-
get_session_port: (session_id: string) => SessionPort;
|
|
46
|
-
/** 读取当前已缓存的 session 实例。 */
|
|
47
|
-
list_cached_sessions: () => AgentManagedSession[];
|
|
48
|
-
}
|
|
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
|
-
/**
|
|
77
|
-
* 创建实例级 runtime 视图。
|
|
78
|
-
*/
|
|
79
|
-
export function createAgentRuntime(
|
|
80
|
-
options: CreateAgentRuntimeOptions,
|
|
81
|
-
): AgentRuntime {
|
|
82
|
-
return {
|
|
83
|
-
cwd: options.project_root,
|
|
84
|
-
rootPath: options.project_root,
|
|
85
|
-
logger: options.logger,
|
|
86
|
-
config: options.config,
|
|
87
|
-
env: options.env,
|
|
88
|
-
systems: options.systems,
|
|
89
|
-
paths: createAgentPathRuntime(options.project_root, options.agent_id),
|
|
90
|
-
pluginConfig: createAgentPluginConfigRuntime(options.project_root),
|
|
91
|
-
getSession: (session_id: string): SessionPort =>
|
|
92
|
-
options.get_session_port(session_id),
|
|
93
|
-
listExecutingSessionIds: () =>
|
|
94
|
-
options
|
|
95
|
-
.list_cached_sessions()
|
|
96
|
-
.filter((session) => session.isExecuting())
|
|
97
|
-
.map((session) => session.id),
|
|
98
|
-
getExecutingSessionCount: () =>
|
|
99
|
-
options
|
|
100
|
-
.list_cached_sessions()
|
|
101
|
-
.filter((session) => session.isExecuting()).length,
|
|
102
|
-
pluginInstances: options.plugin_instances,
|
|
103
|
-
};
|
|
104
|
-
}
|
|
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
|
-
}
|
|
@@ -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
|
-
}
|