@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.
Files changed (55) hide show
  1. package/LICENSE +183 -0
  2. package/README.md +51 -0
  3. package/bin/http/AgentHTTP.d.ts +53 -0
  4. package/bin/http/AgentHTTP.d.ts.map +1 -0
  5. package/bin/http/AgentHTTP.js +118 -0
  6. package/bin/http/AgentHTTP.js.map +1 -0
  7. package/bin/http/NodeHttpAdapter.d.ts +21 -0
  8. package/bin/http/NodeHttpAdapter.d.ts.map +1 -0
  9. package/bin/http/NodeHttpAdapter.js +56 -0
  10. package/bin/http/NodeHttpAdapter.js.map +1 -0
  11. package/bin/http/routes/SessionRoutes.d.ts +15 -0
  12. package/bin/http/routes/SessionRoutes.d.ts.map +1 -0
  13. package/bin/http/routes/SessionRoutes.js +249 -0
  14. package/bin/http/routes/SessionRoutes.js.map +1 -0
  15. package/bin/index.d.ts +13 -0
  16. package/bin/index.d.ts.map +1 -0
  17. package/bin/index.js +10 -0
  18. package/bin/index.js.map +1 -0
  19. package/bin/rpc/AgentRPC.d.ts +37 -0
  20. package/bin/rpc/AgentRPC.d.ts.map +1 -0
  21. package/bin/rpc/AgentRPC.js +81 -0
  22. package/bin/rpc/AgentRPC.js.map +1 -0
  23. package/bin/rpc/RpcServer.d.ts +30 -0
  24. package/bin/rpc/RpcServer.d.ts.map +1 -0
  25. package/bin/rpc/RpcServer.js +106 -0
  26. package/bin/rpc/RpcServer.js.map +1 -0
  27. package/bin/rpc/server/InternalHandlers.d.ts +22 -0
  28. package/bin/rpc/server/InternalHandlers.d.ts.map +1 -0
  29. package/bin/rpc/server/InternalHandlers.js +248 -0
  30. package/bin/rpc/server/InternalHandlers.js.map +1 -0
  31. package/bin/rpc/server/RequestDispatcher.d.ts +27 -0
  32. package/bin/rpc/server/RequestDispatcher.d.ts.map +1 -0
  33. package/bin/rpc/server/RequestDispatcher.js +38 -0
  34. package/bin/rpc/server/RequestDispatcher.js.map +1 -0
  35. package/bin/rpc/server/SdkSessionHandlers.d.ts +25 -0
  36. package/bin/rpc/server/SdkSessionHandlers.d.ts.map +1 -0
  37. package/bin/rpc/server/SdkSessionHandlers.js +86 -0
  38. package/bin/rpc/server/SdkSessionHandlers.js.map +1 -0
  39. package/bin/rpc/server/ServerTypes.d.ts +58 -0
  40. package/bin/rpc/server/ServerTypes.d.ts.map +1 -0
  41. package/bin/rpc/server/ServerTypes.js +9 -0
  42. package/bin/rpc/server/ServerTypes.js.map +1 -0
  43. package/bin/types/AgentHttpBinding.d.ts +24 -0
  44. package/bin/types/AgentHttpBinding.d.ts.map +1 -0
  45. package/bin/types/AgentHttpBinding.js +5 -0
  46. package/bin/types/AgentHttpBinding.js.map +1 -0
  47. package/bin/types/AgentRpcBinding.d.ts +27 -0
  48. package/bin/types/AgentRpcBinding.d.ts.map +1 -0
  49. package/bin/types/AgentRpcBinding.js +8 -0
  50. package/bin/types/AgentRpcBinding.js.map +1 -0
  51. package/bin/types/RpcProtocol.d.ts +9 -0
  52. package/bin/types/RpcProtocol.d.ts.map +1 -0
  53. package/bin/types/RpcProtocol.js +9 -0
  54. package/bin/types/RpcProtocol.js.map +1 -0
  55. 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
@@ -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"}