@downcity/server 0.1.3
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/LICENSE +183 -0
- package/README.md +51 -0
- package/bin/http/AgentHTTP.d.ts +53 -0
- package/bin/http/AgentHTTP.d.ts.map +1 -0
- package/bin/http/AgentHTTP.js +118 -0
- package/bin/http/AgentHTTP.js.map +1 -0
- package/bin/http/NodeHttpAdapter.d.ts +21 -0
- package/bin/http/NodeHttpAdapter.d.ts.map +1 -0
- package/bin/http/NodeHttpAdapter.js +56 -0
- package/bin/http/NodeHttpAdapter.js.map +1 -0
- package/bin/http/routes/SessionRoutes.d.ts +15 -0
- package/bin/http/routes/SessionRoutes.d.ts.map +1 -0
- package/bin/http/routes/SessionRoutes.js +249 -0
- package/bin/http/routes/SessionRoutes.js.map +1 -0
- package/bin/index.d.ts +13 -0
- package/bin/index.d.ts.map +1 -0
- package/bin/index.js +10 -0
- package/bin/index.js.map +1 -0
- package/bin/rpc/AgentRPC.d.ts +37 -0
- package/bin/rpc/AgentRPC.d.ts.map +1 -0
- package/bin/rpc/AgentRPC.js +81 -0
- package/bin/rpc/AgentRPC.js.map +1 -0
- package/bin/rpc/RpcServer.d.ts +30 -0
- package/bin/rpc/RpcServer.d.ts.map +1 -0
- package/bin/rpc/RpcServer.js +106 -0
- package/bin/rpc/RpcServer.js.map +1 -0
- package/bin/rpc/server/InternalHandlers.d.ts +22 -0
- package/bin/rpc/server/InternalHandlers.d.ts.map +1 -0
- package/bin/rpc/server/InternalHandlers.js +248 -0
- package/bin/rpc/server/InternalHandlers.js.map +1 -0
- package/bin/rpc/server/RequestDispatcher.d.ts +27 -0
- package/bin/rpc/server/RequestDispatcher.d.ts.map +1 -0
- package/bin/rpc/server/RequestDispatcher.js +38 -0
- package/bin/rpc/server/RequestDispatcher.js.map +1 -0
- package/bin/rpc/server/SdkSessionHandlers.d.ts +25 -0
- package/bin/rpc/server/SdkSessionHandlers.d.ts.map +1 -0
- package/bin/rpc/server/SdkSessionHandlers.js +86 -0
- package/bin/rpc/server/SdkSessionHandlers.js.map +1 -0
- package/bin/rpc/server/ServerTypes.d.ts +58 -0
- package/bin/rpc/server/ServerTypes.d.ts.map +1 -0
- package/bin/rpc/server/ServerTypes.js +9 -0
- package/bin/rpc/server/ServerTypes.js.map +1 -0
- package/bin/types/AgentHttpBinding.d.ts +24 -0
- package/bin/types/AgentHttpBinding.d.ts.map +1 -0
- package/bin/types/AgentHttpBinding.js +5 -0
- package/bin/types/AgentHttpBinding.js.map +1 -0
- package/bin/types/AgentRpcBinding.d.ts +27 -0
- package/bin/types/AgentRpcBinding.d.ts.map +1 -0
- package/bin/types/AgentRpcBinding.js +8 -0
- package/bin/types/AgentRpcBinding.js.map +1 -0
- package/bin/types/RpcProtocol.d.ts +9 -0
- package/bin/types/RpcProtocol.d.ts.map +1 -0
- package/bin/types/RpcProtocol.js +9 -0
- package/bin/types/RpcProtocol.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK HTTP session 路由。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - 这组路由面向 `RemoteAgent`,只暴露最小 Session actor 使用面。
|
|
6
|
+
* - 当前公开输入收口到 `prompt()`,公开输出收口到 `events` 长连接。
|
|
7
|
+
* - 不复用 control API 的控制台语义,避免 transport 面混入非 SDK 约束。
|
|
8
|
+
*/
|
|
9
|
+
const NDJSON_CONTENT_TYPE = "application/x-ndjson; charset=utf-8";
|
|
10
|
+
const SDK_EVENTS_READY_FRAME = {
|
|
11
|
+
type: "sdk-events-ready",
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* 注册 SDK session 路由。
|
|
15
|
+
*/
|
|
16
|
+
export function registerSdkSessionRoutes(app, sessionCollection) {
|
|
17
|
+
app.get("/api/sdk/sessions", async (c) => {
|
|
18
|
+
try {
|
|
19
|
+
const input = {
|
|
20
|
+
...(c.req.query("limit") ? { limit: Number(c.req.query("limit")) } : {}),
|
|
21
|
+
...(c.req.query("cursor") ? { cursor: c.req.query("cursor") } : {}),
|
|
22
|
+
...(c.req.query("query") ? { query: c.req.query("query") } : {}),
|
|
23
|
+
};
|
|
24
|
+
const page = await sessionCollection.listSessions(input);
|
|
25
|
+
return c.json({
|
|
26
|
+
success: true,
|
|
27
|
+
page,
|
|
28
|
+
sessions: page.items,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
return c.json({
|
|
33
|
+
success: false,
|
|
34
|
+
error: error instanceof Error ? error.message : String(error),
|
|
35
|
+
}, 500);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
app.post("/api/sdk/sessions", async (c) => {
|
|
39
|
+
try {
|
|
40
|
+
const body = (await c.req.json().catch(() => ({})));
|
|
41
|
+
const session = await sessionCollection.createSession({
|
|
42
|
+
...(body.sessionId ? { sessionId: String(body.sessionId).trim() } : {}),
|
|
43
|
+
});
|
|
44
|
+
return c.json({
|
|
45
|
+
success: true,
|
|
46
|
+
session: await session.getInfo(),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
return c.json({
|
|
51
|
+
success: false,
|
|
52
|
+
error: error instanceof Error ? error.message : String(error),
|
|
53
|
+
}, 500);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
app.get("/api/sdk/sessions/:sessionId", async (c) => {
|
|
57
|
+
try {
|
|
58
|
+
const sessionId = String(c.req.param("sessionId") || "").trim();
|
|
59
|
+
if (!sessionId) {
|
|
60
|
+
return c.json({ success: false, error: "Missing sessionId" }, 400);
|
|
61
|
+
}
|
|
62
|
+
const session = await sessionCollection.getSession(sessionId);
|
|
63
|
+
return c.json({
|
|
64
|
+
success: true,
|
|
65
|
+
session: await session.getInfo(),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
return c.json({
|
|
70
|
+
success: false,
|
|
71
|
+
error: error instanceof Error ? error.message : String(error),
|
|
72
|
+
}, 500);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
app.post("/api/sdk/sessions/:sessionId/prompt", async (c) => {
|
|
76
|
+
try {
|
|
77
|
+
const sessionId = String(c.req.param("sessionId") || "").trim();
|
|
78
|
+
if (!sessionId) {
|
|
79
|
+
return c.json({ success: false, error: "Missing sessionId" }, 400);
|
|
80
|
+
}
|
|
81
|
+
const body = (await c.req.json());
|
|
82
|
+
const session = await sessionCollection.getSession(sessionId);
|
|
83
|
+
const turn = await session.prompt(body);
|
|
84
|
+
return c.json({
|
|
85
|
+
success: true,
|
|
86
|
+
turn: {
|
|
87
|
+
id: turn.id,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
return c.json({
|
|
93
|
+
success: false,
|
|
94
|
+
error: error instanceof Error ? error.message : String(error),
|
|
95
|
+
}, 500);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
app.get("/api/sdk/sessions/:sessionId/events", async (c) => {
|
|
99
|
+
const sessionId = String(c.req.param("sessionId") || "").trim();
|
|
100
|
+
if (!sessionId) {
|
|
101
|
+
return c.json({ success: false, error: "Missing sessionId" }, 400);
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const session = await sessionCollection.getSession(sessionId);
|
|
105
|
+
const encoder = new TextEncoder();
|
|
106
|
+
const requestSignal = c.req.raw.signal;
|
|
107
|
+
let cleanupEventsConnection = () => { };
|
|
108
|
+
const stream = new ReadableStream({
|
|
109
|
+
cancel() {
|
|
110
|
+
cleanupEventsConnection();
|
|
111
|
+
},
|
|
112
|
+
start(controller) {
|
|
113
|
+
const writeLine = (value) => {
|
|
114
|
+
controller.enqueue(encoder.encode(`${JSON.stringify(value)}\n`));
|
|
115
|
+
};
|
|
116
|
+
const unsubscribe = session.subscribe((event) => {
|
|
117
|
+
writeLine(event);
|
|
118
|
+
});
|
|
119
|
+
const closeStream = () => {
|
|
120
|
+
cleanupEventsConnection();
|
|
121
|
+
try {
|
|
122
|
+
controller.close();
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// ignore duplicate close attempts
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
cleanupEventsConnection = () => {
|
|
129
|
+
unsubscribe();
|
|
130
|
+
requestSignal.removeEventListener("abort", closeStream);
|
|
131
|
+
};
|
|
132
|
+
if (requestSignal.aborted) {
|
|
133
|
+
closeStream();
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
requestSignal.addEventListener("abort", closeStream, { once: true });
|
|
137
|
+
writeLine(SDK_EVENTS_READY_FRAME);
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
return new Response(stream, {
|
|
141
|
+
status: 200,
|
|
142
|
+
headers: {
|
|
143
|
+
"Content-Type": NDJSON_CONTENT_TYPE,
|
|
144
|
+
"Cache-Control": "no-cache, no-transform",
|
|
145
|
+
"X-Accel-Buffering": "no",
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
return c.json({
|
|
151
|
+
success: false,
|
|
152
|
+
error: error instanceof Error ? error.message : String(error),
|
|
153
|
+
}, 500);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
app.get("/api/sdk/sessions/:sessionId/history", async (c) => {
|
|
157
|
+
try {
|
|
158
|
+
const sessionId = String(c.req.param("sessionId") || "").trim();
|
|
159
|
+
if (!sessionId) {
|
|
160
|
+
return c.json({ success: false, error: "Missing sessionId" }, 400);
|
|
161
|
+
}
|
|
162
|
+
const session = await sessionCollection.getSession(sessionId);
|
|
163
|
+
const history = await session.history({
|
|
164
|
+
...(c.req.query("limit") ? { limit: Number(c.req.query("limit")) } : {}),
|
|
165
|
+
...(c.req.query("cursor") ? { cursor: c.req.query("cursor") } : {}),
|
|
166
|
+
...(c.req.query("order")
|
|
167
|
+
? { order: c.req.query("order") }
|
|
168
|
+
: {}),
|
|
169
|
+
...(c.req.query("view")
|
|
170
|
+
? { view: c.req.query("view") }
|
|
171
|
+
: {}),
|
|
172
|
+
});
|
|
173
|
+
return c.json({
|
|
174
|
+
success: true,
|
|
175
|
+
history,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
return c.json({
|
|
180
|
+
success: false,
|
|
181
|
+
error: error instanceof Error ? error.message : String(error),
|
|
182
|
+
}, 500);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
app.get("/api/sdk/sessions/:sessionId/messages", async (c) => {
|
|
186
|
+
try {
|
|
187
|
+
const sessionId = String(c.req.param("sessionId") || "").trim();
|
|
188
|
+
if (!sessionId) {
|
|
189
|
+
return c.json({ success: false, error: "Missing sessionId" }, 400);
|
|
190
|
+
}
|
|
191
|
+
const session = await sessionCollection.getSession(sessionId);
|
|
192
|
+
const history = await session.history({
|
|
193
|
+
view: "message",
|
|
194
|
+
});
|
|
195
|
+
return c.json({
|
|
196
|
+
success: true,
|
|
197
|
+
messages: history.items,
|
|
198
|
+
history,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
return c.json({
|
|
203
|
+
success: false,
|
|
204
|
+
error: error instanceof Error ? error.message : String(error),
|
|
205
|
+
}, 500);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
app.get("/api/sdk/sessions/:sessionId/system", async (c) => {
|
|
209
|
+
try {
|
|
210
|
+
const sessionId = String(c.req.param("sessionId") || "").trim();
|
|
211
|
+
if (!sessionId) {
|
|
212
|
+
return c.json({ success: false, error: "Missing sessionId" }, 400);
|
|
213
|
+
}
|
|
214
|
+
const session = await sessionCollection.getSession(sessionId);
|
|
215
|
+
return c.json({
|
|
216
|
+
success: true,
|
|
217
|
+
system: await session.system(),
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
return c.json({
|
|
222
|
+
success: false,
|
|
223
|
+
error: error instanceof Error ? error.message : String(error),
|
|
224
|
+
}, 500);
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
app.post("/api/sdk/sessions/:sessionId/fork", async (c) => {
|
|
228
|
+
try {
|
|
229
|
+
const sessionId = String(c.req.param("sessionId") || "").trim();
|
|
230
|
+
if (!sessionId) {
|
|
231
|
+
return c.json({ success: false, error: "Missing sessionId" }, 400);
|
|
232
|
+
}
|
|
233
|
+
const body = (await c.req.json().catch(() => ({})));
|
|
234
|
+
const session = await sessionCollection.getSession(sessionId);
|
|
235
|
+
const forked = await session.fork(String(body.messageId || "").trim() || undefined);
|
|
236
|
+
return c.json({
|
|
237
|
+
success: true,
|
|
238
|
+
session: await forked.getInfo(),
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
return c.json({
|
|
243
|
+
success: false,
|
|
244
|
+
error: error instanceof Error ? error.message : String(error),
|
|
245
|
+
}, 500);
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=SessionRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionRoutes.js","sourceRoot":"","sources":["../../../src/http/routes/SessionRoutes.ts"],"names":[],"mappings":"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"}
|
package/bin/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @downcity/server 包公共入口。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - 这里只导出 transport 适配类与必要的绑定类型。
|
|
6
|
+
* - Agent 业务能力仍由 `@downcity/agent` 提供,本包不做转出。
|
|
7
|
+
*/
|
|
8
|
+
export { AgentRPC } from "./rpc/AgentRPC.js";
|
|
9
|
+
export { AgentHTTP } from "./http/AgentHTTP.js";
|
|
10
|
+
export type { AgentHttpServerHandle } from "./http/AgentHTTP.js";
|
|
11
|
+
export type { AgentRpcBinding, AgentRpcListenOptions, } from "./types/AgentRpcBinding.js";
|
|
12
|
+
export type { AgentHttpBinding, AgentHttpListenOptions, } from "./types/AgentHttpBinding.js";
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,YAAY,EACV,eAAe,EACf,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,6BAA6B,CAAC"}
|
package/bin/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @downcity/server 包公共入口。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - 这里只导出 transport 适配类与必要的绑定类型。
|
|
6
|
+
* - Agent 业务能力仍由 `@downcity/agent` 提供,本包不做转出。
|
|
7
|
+
*/
|
|
8
|
+
export { AgentRPC } from "./rpc/AgentRPC.js";
|
|
9
|
+
export { AgentHTTP } from "./http/AgentHTTP.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
package/bin/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentRPC:把本地 Agent 暴露为本机 RPC 服务的对外类。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - 持有一个 `Agent` 引用,按需启动 / 关闭底层 net server。
|
|
6
|
+
* - RPC 协议本身仍是 NDJSON over TCP,不做协议变更。
|
|
7
|
+
* - 仅提供 `listen()` / `close()` / `binding()` 三个方法,端口、host 由调用方决定。
|
|
8
|
+
*/
|
|
9
|
+
import type { Agent } from "@downcity/agent";
|
|
10
|
+
import type { AgentRpcBinding, AgentRpcListenOptions } from "../types/AgentRpcBinding.js";
|
|
11
|
+
/**
|
|
12
|
+
* 把一个 `Agent` 暴露为本机 RPC 服务。
|
|
13
|
+
*/
|
|
14
|
+
export declare class AgentRPC {
|
|
15
|
+
private readonly agent;
|
|
16
|
+
private rpc_instance;
|
|
17
|
+
private current_binding;
|
|
18
|
+
private start_promise;
|
|
19
|
+
constructor(agent: Agent);
|
|
20
|
+
/**
|
|
21
|
+
* 监听 RPC 端口。
|
|
22
|
+
*
|
|
23
|
+
* 说明(中文)
|
|
24
|
+
* - 重复调用返回同一个 binding。
|
|
25
|
+
* - 默认 `127.0.0.1:15314`,本机调试足够。
|
|
26
|
+
*/
|
|
27
|
+
listen(options?: AgentRpcListenOptions): Promise<AgentRpcBinding>;
|
|
28
|
+
/**
|
|
29
|
+
* 关闭 RPC 服务。
|
|
30
|
+
*/
|
|
31
|
+
close(): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* 当前监听绑定信息,未 listen 时返回 `null`。
|
|
34
|
+
*/
|
|
35
|
+
binding(): AgentRpcBinding | null;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=AgentRPC.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentRPC.d.ts","sourceRoot":"","sources":["../../src/rpc/AgentRPC.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACtB,MAAM,4BAA4B,CAAC;AAKpC;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,aAAa,CAAyC;gBAElD,KAAK,EAAE,KAAK;IAIxB;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IAiCvE;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B;;OAEG;IACH,OAAO,IAAI,eAAe,GAAG,IAAI;CAGlC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentRPC:把本地 Agent 暴露为本机 RPC 服务的对外类。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - 持有一个 `Agent` 引用,按需启动 / 关闭底层 net server。
|
|
6
|
+
* - RPC 协议本身仍是 NDJSON over TCP,不做协议变更。
|
|
7
|
+
* - 仅提供 `listen()` / `close()` / `binding()` 三个方法,端口、host 由调用方决定。
|
|
8
|
+
*/
|
|
9
|
+
import { startRpcServer } from "../rpc/RpcServer.js";
|
|
10
|
+
const DEFAULT_RPC_HOST = "127.0.0.1";
|
|
11
|
+
const DEFAULT_RPC_PORT = 15314;
|
|
12
|
+
/**
|
|
13
|
+
* 把一个 `Agent` 暴露为本机 RPC 服务。
|
|
14
|
+
*/
|
|
15
|
+
export class AgentRPC {
|
|
16
|
+
agent;
|
|
17
|
+
rpc_instance = null;
|
|
18
|
+
current_binding = null;
|
|
19
|
+
start_promise = null;
|
|
20
|
+
constructor(agent) {
|
|
21
|
+
this.agent = agent;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 监听 RPC 端口。
|
|
25
|
+
*
|
|
26
|
+
* 说明(中文)
|
|
27
|
+
* - 重复调用返回同一个 binding。
|
|
28
|
+
* - 默认 `127.0.0.1:15314`,本机调试足够。
|
|
29
|
+
*/
|
|
30
|
+
async listen(options) {
|
|
31
|
+
if (this.start_promise)
|
|
32
|
+
return await this.start_promise;
|
|
33
|
+
if (this.current_binding)
|
|
34
|
+
return this.current_binding;
|
|
35
|
+
this.start_promise = (async () => {
|
|
36
|
+
const host = String(options?.host || DEFAULT_RPC_HOST).trim() || DEFAULT_RPC_HOST;
|
|
37
|
+
const port = typeof options?.port === "number" && Number.isInteger(options.port)
|
|
38
|
+
? options.port
|
|
39
|
+
: DEFAULT_RPC_PORT;
|
|
40
|
+
const instance = await startRpcServer({
|
|
41
|
+
host,
|
|
42
|
+
port,
|
|
43
|
+
sessionCollection: this.agent.getSessionCollection(),
|
|
44
|
+
getAgentContext: () => this.agent.getContext(),
|
|
45
|
+
getAgentRuntime: () => this.agent.getRuntime(),
|
|
46
|
+
getShell: () => this.agent.getShell(),
|
|
47
|
+
});
|
|
48
|
+
this.rpc_instance = instance;
|
|
49
|
+
this.current_binding = {
|
|
50
|
+
url: instance.url,
|
|
51
|
+
host: instance.host,
|
|
52
|
+
port: instance.port,
|
|
53
|
+
};
|
|
54
|
+
return this.current_binding;
|
|
55
|
+
})();
|
|
56
|
+
try {
|
|
57
|
+
return await this.start_promise;
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
this.start_promise = null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 关闭 RPC 服务。
|
|
65
|
+
*/
|
|
66
|
+
async close() {
|
|
67
|
+
const instance = this.rpc_instance;
|
|
68
|
+
this.rpc_instance = null;
|
|
69
|
+
this.current_binding = null;
|
|
70
|
+
if (!instance)
|
|
71
|
+
return;
|
|
72
|
+
await instance.stop();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 当前监听绑定信息,未 listen 时返回 `null`。
|
|
76
|
+
*/
|
|
77
|
+
binding() {
|
|
78
|
+
return this.current_binding;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=AgentRPC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentRPC.js","sourceRoot":"","sources":["../../src/rpc/AgentRPC.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,cAAc,EAA0B,MAAM,oBAAoB,CAAC;AAM5E,MAAM,gBAAgB,GAAG,WAAW,CAAC;AACrC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B;;GAEG;AACH,MAAM,OAAO,QAAQ;IACF,KAAK,CAAQ;IACtB,YAAY,GAA6B,IAAI,CAAC;IAC9C,eAAe,GAA2B,IAAI,CAAC;IAC/C,aAAa,GAAoC,IAAI,CAAC;IAE9D,YAAY,KAAY;QACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CAAC,OAA+B;QAC1C,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC;QACxD,IAAI,IAAI,CAAC,eAAe;YAAE,OAAO,IAAI,CAAC,eAAe,CAAC;QACtD,IAAI,CAAC,aAAa,GAAG,CAAC,KAAK,IAAI,EAAE;YAC/B,MAAM,IAAI,GACR,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,gBAAgB,CAAC,CAAC,IAAI,EAAE,IAAI,gBAAgB,CAAC;YACvE,MAAM,IAAI,GACR,OAAO,OAAO,EAAE,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;gBACjE,CAAC,CAAC,OAAO,CAAC,IAAI;gBACd,CAAC,CAAC,gBAAgB,CAAC;YACvB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC;gBACpC,IAAI;gBACJ,IAAI;gBACJ,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE;gBACpD,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;gBAC9C,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;gBAC9C,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;aACtC,CAAC,CAAC;YACH,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;YAC7B,IAAI,CAAC,eAAe,GAAG;gBACrB,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;aACpB,CAAC;YACF,OAAO,IAAI,CAAC,eAAe,CAAC;QAC9B,CAAC,CAAC,EAAE,CAAC;QACL,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC;QAClC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
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
|
+
import net from "node:net";
|
|
10
|
+
import type { RpcServerStartOptions } from "../rpc/server/ServerTypes.js";
|
|
11
|
+
/**
|
|
12
|
+
* RPC server 运行实例。
|
|
13
|
+
*/
|
|
14
|
+
export interface RpcServerInstance {
|
|
15
|
+
/** 当前监听 host。 */
|
|
16
|
+
host: string;
|
|
17
|
+
/** 当前监听 port。 */
|
|
18
|
+
port: number;
|
|
19
|
+
/** 当前访问 URL。 */
|
|
20
|
+
url: string;
|
|
21
|
+
/** 原生 net server。 */
|
|
22
|
+
server: net.Server;
|
|
23
|
+
/** 停止当前服务。 */
|
|
24
|
+
stop(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 启动 Agent 本机 RPC server。
|
|
28
|
+
*/
|
|
29
|
+
export declare function startRpcServer(options: RpcServerStartOptions): Promise<RpcServerInstance>;
|
|
30
|
+
//# sourceMappingURL=RpcServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcServer.d.ts","sourceRoot":"","sources":["../../src/rpc/RpcServer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,GAAG,MAAM,UAAU,CAAC;AAK3B,OAAO,KAAK,EACV,qBAAqB,EAEtB,MAAM,6BAA6B,CAAC;AAGrC;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,qBAAqB;IACrB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC;IACnB,cAAc;IACd,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CAmG5B"}
|
|
@@ -0,0 +1,106 @@
|
|
|
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
|
+
import net from "node:net";
|
|
10
|
+
import { dispatchRpcRequest } from "../rpc/server/RequestDispatcher.js";
|
|
11
|
+
/**
|
|
12
|
+
* 启动 Agent 本机 RPC server。
|
|
13
|
+
*/
|
|
14
|
+
export async function startRpcServer(options) {
|
|
15
|
+
const sockets = new Set();
|
|
16
|
+
const server = net.createServer((socket) => {
|
|
17
|
+
sockets.add(socket);
|
|
18
|
+
const subscriptions = new Map();
|
|
19
|
+
let buffered = "";
|
|
20
|
+
const cleanup_subscriptions = () => {
|
|
21
|
+
for (const subscription of subscriptions.values()) {
|
|
22
|
+
subscription.unsubscribe();
|
|
23
|
+
}
|
|
24
|
+
subscriptions.clear();
|
|
25
|
+
};
|
|
26
|
+
const write_frame = (frame) => {
|
|
27
|
+
socket.write(`${JSON.stringify(frame)}\n`);
|
|
28
|
+
};
|
|
29
|
+
const write_success = (id, data) => {
|
|
30
|
+
write_frame({
|
|
31
|
+
id,
|
|
32
|
+
success: true,
|
|
33
|
+
...(data === undefined ? {} : { data }),
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
const write_error = (id, error) => {
|
|
37
|
+
write_frame({
|
|
38
|
+
id,
|
|
39
|
+
success: false,
|
|
40
|
+
error: error instanceof Error ? error.message : String(error),
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
const handle_line = (line) => {
|
|
44
|
+
try {
|
|
45
|
+
const request = JSON.parse(line);
|
|
46
|
+
void dispatchRpcRequest({
|
|
47
|
+
request,
|
|
48
|
+
options,
|
|
49
|
+
subscriptions,
|
|
50
|
+
write_success,
|
|
51
|
+
write_error,
|
|
52
|
+
write_event: write_frame,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
write_error("parse", error);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
socket.on("data", (chunk) => {
|
|
60
|
+
buffered += chunk.toString("utf8");
|
|
61
|
+
let newline_index = buffered.indexOf("\n");
|
|
62
|
+
while (newline_index >= 0) {
|
|
63
|
+
const line = buffered.slice(0, newline_index).trim();
|
|
64
|
+
buffered = buffered.slice(newline_index + 1);
|
|
65
|
+
if (line) {
|
|
66
|
+
handle_line(line);
|
|
67
|
+
}
|
|
68
|
+
newline_index = buffered.indexOf("\n");
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
socket.on("error", () => {
|
|
72
|
+
cleanup_subscriptions();
|
|
73
|
+
});
|
|
74
|
+
socket.on("close", () => {
|
|
75
|
+
sockets.delete(socket);
|
|
76
|
+
cleanup_subscriptions();
|
|
77
|
+
});
|
|
78
|
+
socket.on("end", () => {
|
|
79
|
+
cleanup_subscriptions();
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
await new Promise((resolve, reject) => {
|
|
83
|
+
server.once("error", reject);
|
|
84
|
+
server.listen(options.port, options.host, () => {
|
|
85
|
+
server.off("error", reject);
|
|
86
|
+
resolve();
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
return {
|
|
90
|
+
host: options.host,
|
|
91
|
+
port: options.port,
|
|
92
|
+
url: `rpc://${options.host}:${options.port}`,
|
|
93
|
+
server,
|
|
94
|
+
async stop() {
|
|
95
|
+
// 关键点(中文):RPC 是长连接;停止 server 时必须主动关闭现有 socket。
|
|
96
|
+
for (const socket of sockets) {
|
|
97
|
+
socket.destroy();
|
|
98
|
+
}
|
|
99
|
+
sockets.clear();
|
|
100
|
+
await new Promise((resolve) => {
|
|
101
|
+
server.close(() => resolve());
|
|
102
|
+
});
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=RpcServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RpcServer.js","sourceRoot":"","sources":["../../src/rpc/RpcServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RPC internal handlers。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - 只处理 `internal.*` 方法。
|
|
6
|
+
* - 这些方法服务 Town 本机管理通道,不属于 RemoteAgent 的用户 SDK 面。
|
|
7
|
+
* - 实现依赖 `@downcity/agent` 的 internal 路径,故只能由 `@downcity/server` 同进程使用。
|
|
8
|
+
*/
|
|
9
|
+
import type { RpcRequest } from "../../types/RpcProtocol.js";
|
|
10
|
+
import type { RpcRequestHandlerOptions, RpcWriteSuccess } from "../../rpc/server/ServerTypes.js";
|
|
11
|
+
/**
|
|
12
|
+
* 处理 internal RPC 请求。
|
|
13
|
+
*/
|
|
14
|
+
export declare function handleInternalRpcRequest(params: {
|
|
15
|
+
/** 当前 RPC 请求。 */
|
|
16
|
+
request: RpcRequest;
|
|
17
|
+
/** handler 依赖。 */
|
|
18
|
+
options: RpcRequestHandlerOptions;
|
|
19
|
+
/** 成功帧写入函数。 */
|
|
20
|
+
write_success: RpcWriteSuccess;
|
|
21
|
+
}): Promise<boolean>;
|
|
22
|
+
//# sourceMappingURL=InternalHandlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InternalHandlers.d.ts","sourceRoot":"","sources":["../../../src/rpc/server/InternalHandlers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EACV,wBAAwB,EACxB,eAAe,EAChB,MAAM,6BAA6B,CAAC;AAarC;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE;IACrD,iBAAiB;IACjB,OAAO,EAAE,UAAU,CAAC;IACpB,kBAAkB;IAClB,OAAO,EAAE,wBAAwB,CAAC;IAClC,eAAe;IACf,aAAa,EAAE,eAAe,CAAC;CAChC,GAAG,OAAO,CAAC,OAAO,CAAC,CAyKnB"}
|