@downcity/agent 1.1.22 → 1.1.23
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 +6 -5
- package/bin/core/AgentContextTypes.d.ts +21 -2
- package/bin/core/AgentContextTypes.d.ts.map +1 -1
- package/bin/index.d.ts +5 -1
- package/bin/index.d.ts.map +1 -1
- package/bin/index.js.map +1 -1
- package/bin/runtime/server/http/Server.d.ts +1 -1
- package/bin/runtime/server/http/Server.d.ts.map +1 -1
- package/bin/runtime/server/http/Server.js +4 -0
- package/bin/runtime/server/http/Server.js.map +1 -1
- package/bin/runtime/server/http/control/ExecuteBySession.js +1 -1
- package/bin/runtime/server/http/control/ExecuteBySession.js.map +1 -1
- package/bin/runtime/server/http/control/StreamBySession.d.ts +3 -3
- package/bin/runtime/server/http/control/StreamBySession.js +6 -6
- package/bin/runtime/server/http/control/StreamBySession.js.map +1 -1
- package/bin/runtime/server/http/execute/execute.js +1 -1
- package/bin/runtime/server/http/execute/execute.js.map +1 -1
- package/bin/runtime/server/http/sdk/Router.d.ts +14 -0
- package/bin/runtime/server/http/sdk/Router.d.ts.map +1 -0
- package/bin/runtime/server/http/sdk/Router.js +18 -0
- package/bin/runtime/server/http/sdk/Router.js.map +1 -0
- package/bin/runtime/server/http/sdk/SessionRoutes.d.ts +15 -0
- package/bin/runtime/server/http/sdk/SessionRoutes.d.ts.map +1 -0
- package/bin/runtime/server/http/sdk/SessionRoutes.js +190 -0
- package/bin/runtime/server/http/sdk/SessionRoutes.js.map +1 -0
- package/bin/sdk/AgentSdkTypes.d.ts +1 -124
- package/bin/sdk/AgentSdkTypes.d.ts.map +1 -1
- package/bin/sdk/RemoteAgent.d.ts +27 -8
- package/bin/sdk/RemoteAgent.d.ts.map +1 -1
- package/bin/sdk/RemoteAgent.js +266 -38
- package/bin/sdk/RemoteAgent.js.map +1 -1
- package/bin/sdk/Session.d.ts +31 -10
- package/bin/sdk/Session.d.ts.map +1 -1
- package/bin/sdk/Session.js +181 -73
- package/bin/sdk/Session.js.map +1 -1
- package/bin/sdk/SessionEventMapper.d.ts +32 -0
- package/bin/sdk/SessionEventMapper.d.ts.map +1 -0
- package/bin/sdk/{StreamEvents.js → SessionEventMapper.js} +43 -28
- package/bin/sdk/SessionEventMapper.js.map +1 -0
- package/bin/sdk/session/ServicePort.d.ts +51 -4
- package/bin/sdk/session/ServicePort.d.ts.map +1 -1
- package/bin/sdk/session/ServicePort.js +17 -10
- package/bin/sdk/session/ServicePort.js.map +1 -1
- package/bin/sdk/session/runtime/SessionEventHub.d.ts +24 -0
- package/bin/sdk/session/runtime/SessionEventHub.d.ts.map +1 -0
- package/bin/sdk/session/runtime/SessionEventHub.js +39 -0
- package/bin/sdk/session/runtime/SessionEventHub.js.map +1 -0
- package/bin/sdk/session/runtime/SessionPromptRuntime.d.ts +68 -0
- package/bin/sdk/session/runtime/SessionPromptRuntime.d.ts.map +1 -0
- package/bin/sdk/session/runtime/SessionPromptRuntime.js +170 -0
- package/bin/sdk/session/runtime/SessionPromptRuntime.js.map +1 -0
- package/bin/service/builtins/chat/runtime/ChatQueueWorker.js +1 -1
- package/bin/service/builtins/chat/runtime/ChatQueueWorker.js.map +1 -1
- package/bin/service/builtins/chat/runtime/ChatSession.d.ts +1 -1
- package/bin/service/builtins/chat/runtime/ChatSession.js +1 -1
- package/bin/service/builtins/contact/runtime/ChatRuntime.js +1 -1
- package/bin/service/builtins/contact/runtime/ChatRuntime.js.map +1 -1
- package/bin/types/sdk/AgentSessionEvent.d.ts +160 -0
- package/bin/types/sdk/AgentSessionEvent.d.ts.map +1 -0
- package/bin/types/sdk/AgentSessionEvent.js +9 -0
- package/bin/types/sdk/AgentSessionEvent.js.map +1 -0
- package/bin/types/sdk/AgentSessionPrompt.d.ts +21 -0
- package/bin/types/sdk/AgentSessionPrompt.d.ts.map +1 -0
- package/bin/types/sdk/AgentSessionPrompt.js +9 -0
- package/bin/types/sdk/AgentSessionPrompt.js.map +1 -0
- package/bin/types/sdk/AgentSessionTurn.d.ts +59 -0
- package/bin/types/sdk/AgentSessionTurn.d.ts.map +1 -0
- package/bin/types/sdk/AgentSessionTurn.js +10 -0
- package/bin/types/sdk/AgentSessionTurn.js.map +1 -0
- package/bin/types/sdk/AgentUiChunkEvent.d.ts +100 -0
- package/bin/types/sdk/AgentUiChunkEvent.d.ts.map +1 -0
- package/bin/types/sdk/AgentUiChunkEvent.js +9 -0
- package/bin/types/sdk/AgentUiChunkEvent.js.map +1 -0
- package/package.json +2 -1
- package/scripts/session-prompt-runtime.test.mjs +167 -0
- package/src/core/AgentContextTypes.ts +24 -2
- package/src/index.ts +11 -3
- package/src/runtime/server/http/Server.ts +5 -1
- package/src/runtime/server/http/control/ExecuteBySession.ts +1 -1
- package/src/runtime/server/http/control/StreamBySession.ts +11 -11
- package/src/runtime/server/http/execute/execute.ts +1 -1
- package/src/runtime/server/http/sdk/Router.ts +22 -0
- package/src/runtime/server/http/sdk/SessionRoutes.ts +232 -0
- package/src/sdk/AgentSdkTypes.ts +1 -137
- package/src/sdk/RemoteAgent.ts +368 -49
- package/src/sdk/Session.ts +235 -86
- package/src/sdk/{StreamEvents.ts → SessionEventMapper.ts} +50 -40
- package/src/sdk/session/ServicePort.ts +74 -12
- package/src/sdk/session/runtime/SessionEventHub.ts +47 -0
- package/src/sdk/session/runtime/SessionPromptRuntime.ts +269 -0
- package/src/service/builtins/chat/runtime/ChatQueueWorker.ts +1 -1
- package/src/service/builtins/chat/runtime/ChatSession.ts +1 -1
- package/src/service/builtins/contact/runtime/ChatRuntime.ts +1 -1
- package/src/session/README.md +8 -7
- package/src/types/sdk/AgentSessionEvent.ts +195 -0
- package/src/types/sdk/AgentSessionPrompt.ts +21 -0
- package/src/types/sdk/AgentSessionTurn.ts +65 -0
- package/src/types/sdk/AgentUiChunkEvent.ts +108 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/bin/sdk/AsyncQueue.d.ts +0 -26
- package/bin/sdk/AsyncQueue.d.ts.map +0 -1
- package/bin/sdk/AsyncQueue.js +0 -75
- package/bin/sdk/AsyncQueue.js.map +0 -1
- package/bin/sdk/StreamEvents.d.ts +0 -36
- package/bin/sdk/StreamEvents.d.ts.map +0 -1
- package/bin/sdk/StreamEvents.js.map +0 -1
- package/src/sdk/AsyncQueue.ts +0 -92
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
import { createPluginsRouter } from "@/runtime/server/http/plugins/plugins.js";
|
|
23
23
|
import { createStaticRouter } from "@/runtime/server/http/static/static.js";
|
|
24
24
|
import { createControlRouter } from "@/runtime/server/http/control/ControlRouter.js";
|
|
25
|
+
import { createSdkRouter } from "@/runtime/server/http/sdk/Router.js";
|
|
25
26
|
import {
|
|
26
27
|
registerBuiltinPluginHttpRoutes,
|
|
27
28
|
} from "@/plugin/core/HttpRoutes.js";
|
|
@@ -38,7 +39,7 @@ export interface ServerStartOptions {
|
|
|
38
39
|
/** HTTP 服务监听主机。 */
|
|
39
40
|
host: string;
|
|
40
41
|
/** 可选实例级 agent core。 */
|
|
41
|
-
core?: Pick<AgentCore, "getContext" | "getRuntime">;
|
|
42
|
+
core?: Pick<AgentCore, "getContext" | "getRuntime" | "session" | "sessions">;
|
|
42
43
|
/** 可选实例级 runtime 读取函数。 */
|
|
43
44
|
getAgentRuntime?: () => AgentRuntime;
|
|
44
45
|
/** 可选实例级 context 读取函数。 */
|
|
@@ -122,6 +123,9 @@ export function createServerApp(
|
|
|
122
123
|
getAgentRuntime: bindings.getAgentRuntime,
|
|
123
124
|
getAgentContext: bindings.getAgentContext,
|
|
124
125
|
}));
|
|
126
|
+
if (options.core) {
|
|
127
|
+
app.route("/", createSdkRouter(options.core));
|
|
128
|
+
}
|
|
125
129
|
registerBuiltinPluginHttpRoutes({
|
|
126
130
|
app,
|
|
127
131
|
getContext: bindings.getAgentContext,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Control session
|
|
2
|
+
* Control session 增量执行 helper。
|
|
3
3
|
*
|
|
4
4
|
* 关键点(中文)
|
|
5
|
-
* - 仅用于单 agent control API 的本地 session
|
|
5
|
+
* - 仅用于单 agent control API 的本地 session 增量返回。
|
|
6
6
|
* - chatKey 命中的平台 chat 队列仍保持原有入队语义,不在这里伪造“流式完成”。
|
|
7
|
-
* -
|
|
7
|
+
* - 输出协议使用内部 `AgentUiChunkEvent` 的 NDJSON 事件行,便于 CLI 直接消费。
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import type { AgentContext, SessionPort } from "@/core/AgentContextTypes.js";
|
|
@@ -14,8 +14,8 @@ import type {
|
|
|
14
14
|
} from "@/runtime/server/http/control/types/ControlSessionExecute.js";
|
|
15
15
|
import { buildExecuteInputText } from "@/runtime/server/http/control/Helpers.js";
|
|
16
16
|
import { drainDeferredPersistedUserMessages } from "@session/SessionRunScope.js";
|
|
17
|
-
import {
|
|
18
|
-
import type {
|
|
17
|
+
import { mapUiMessageChunkToAgentEvent } from "@/sdk/SessionEventMapper.js";
|
|
18
|
+
import type { AgentUiChunkEvent } from "@/types/sdk/AgentUiChunkEvent.js";
|
|
19
19
|
import type {
|
|
20
20
|
SessionRunResult,
|
|
21
21
|
SessionUiMessageChunkCallback,
|
|
@@ -34,7 +34,7 @@ type StreamableSessionPort = SessionPort & {
|
|
|
34
34
|
* - `SessionPort` 对外接口当前未显式暴露 `onUiMessageChunkCallback`,
|
|
35
35
|
* 但本地 executor 已支持该回调,这里按本地 control runtime 语义做窄化使用。
|
|
36
36
|
*/
|
|
37
|
-
|
|
37
|
+
execute(params: {
|
|
38
38
|
query: string;
|
|
39
39
|
onUiMessageChunkCallback?: SessionUiMessageChunkCallback;
|
|
40
40
|
}): Promise<SessionRunResult>;
|
|
@@ -44,7 +44,7 @@ const NDJSON_CONTENT_TYPE = "application/x-ndjson; charset=utf-8";
|
|
|
44
44
|
|
|
45
45
|
function encodeNdjsonLine(
|
|
46
46
|
encoder: TextEncoder,
|
|
47
|
-
value:
|
|
47
|
+
value: AgentUiChunkEvent,
|
|
48
48
|
): Uint8Array {
|
|
49
49
|
return encoder.encode(`${JSON.stringify(value)}\n`);
|
|
50
50
|
}
|
|
@@ -52,14 +52,14 @@ function encodeNdjsonLine(
|
|
|
52
52
|
function resolveStreamEventFromUiChunk(params: {
|
|
53
53
|
chunk: Parameters<NonNullable<SessionUiMessageChunkCallback>>[0];
|
|
54
54
|
toolNameByCallId: Map<string, string>;
|
|
55
|
-
}):
|
|
55
|
+
}): AgentUiChunkEvent | null {
|
|
56
56
|
const { chunk, toolNameByCallId } = params;
|
|
57
57
|
if (chunk.type === "tool-input-start") {
|
|
58
58
|
toolNameByCallId.set(chunk.toolCallId, chunk.toolName);
|
|
59
59
|
return null;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
const event =
|
|
62
|
+
const event = mapUiMessageChunkToAgentEvent(chunk);
|
|
63
63
|
if (!event) return null;
|
|
64
64
|
|
|
65
65
|
if (event.type === "tool-call" || event.type === "tool-error") {
|
|
@@ -126,7 +126,7 @@ export async function createControlSessionStreamResponse(params: {
|
|
|
126
126
|
void (async () => {
|
|
127
127
|
const toolNameByCallId = new Map<string, string>();
|
|
128
128
|
|
|
129
|
-
const pushEvent = (event:
|
|
129
|
+
const pushEvent = (event: AgentUiChunkEvent): void => {
|
|
130
130
|
controller.enqueue(encodeNdjsonLine(encoder, event));
|
|
131
131
|
};
|
|
132
132
|
|
|
@@ -135,7 +135,7 @@ export async function createControlSessionStreamResponse(params: {
|
|
|
135
135
|
text: executeInput,
|
|
136
136
|
});
|
|
137
137
|
|
|
138
|
-
const result = await session.
|
|
138
|
+
const result = await session.execute({
|
|
139
139
|
query: executeInput,
|
|
140
140
|
onUiMessageChunkCallback: async (chunk) => {
|
|
141
141
|
const event = resolveStreamEventFromUiChunk({
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK HTTP 路由入口模块。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - 这里专门承载 `RemoteAgent` 对应的最小 SDK transport。
|
|
6
|
+
* - 路由面围绕 Session actor 公开能力展开,不混入 control UI 语义。
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { Hono } from "hono";
|
|
10
|
+
import type { AgentCore } from "@/core/AgentCore.js";
|
|
11
|
+
import { registerSdkSessionRoutes } from "@/runtime/server/http/sdk/SessionRoutes.js";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* 创建 SDK HTTP router。
|
|
15
|
+
*/
|
|
16
|
+
export function createSdkRouter(
|
|
17
|
+
core: Pick<AgentCore, "session" | "sessions">,
|
|
18
|
+
): Hono {
|
|
19
|
+
const router = new Hono();
|
|
20
|
+
registerSdkSessionRoutes(router, core);
|
|
21
|
+
return router;
|
|
22
|
+
}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK HTTP session 路由。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - 这组路由面向 `RemoteAgent`,只暴露最小 Session actor 使用面。
|
|
6
|
+
* - 当前公开输入收口到 `prompt()`,公开输出收口到 `events` 长连接。
|
|
7
|
+
* - 不复用 control API 的控制台语义,避免 transport 面混入非 SDK 约束。
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { Hono } from "hono";
|
|
11
|
+
import type { AgentCore } from "@/core/AgentCore.js";
|
|
12
|
+
import type { AgentSessionPromptInput } from "@/types/sdk/AgentSessionPrompt.js";
|
|
13
|
+
import type { AgentSessionEvent } from "@/types/sdk/AgentSessionEvent.js";
|
|
14
|
+
|
|
15
|
+
const NDJSON_CONTENT_TYPE = "application/x-ndjson; charset=utf-8";
|
|
16
|
+
const SDK_EVENTS_READY_FRAME = {
|
|
17
|
+
type: "sdk-events-ready",
|
|
18
|
+
} as const;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* 注册 SDK session 路由。
|
|
22
|
+
*/
|
|
23
|
+
export function registerSdkSessionRoutes(
|
|
24
|
+
app: Hono,
|
|
25
|
+
core: Pick<AgentCore, "session" | "sessions">,
|
|
26
|
+
): void {
|
|
27
|
+
app.get("/api/sdk/sessions", async (c) => {
|
|
28
|
+
try {
|
|
29
|
+
const sessions = await core.sessions();
|
|
30
|
+
return c.json({
|
|
31
|
+
success: true,
|
|
32
|
+
sessions,
|
|
33
|
+
});
|
|
34
|
+
} catch (error) {
|
|
35
|
+
return c.json(
|
|
36
|
+
{
|
|
37
|
+
success: false,
|
|
38
|
+
error: error instanceof Error ? error.message : String(error),
|
|
39
|
+
},
|
|
40
|
+
500,
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
app.post("/api/sdk/sessions", async (c) => {
|
|
46
|
+
try {
|
|
47
|
+
const body = (await c.req.json().catch(() => ({}))) as {
|
|
48
|
+
sessionId?: unknown;
|
|
49
|
+
};
|
|
50
|
+
const rawSessionId = String(body.sessionId || "").trim();
|
|
51
|
+
const session = await core.session(rawSessionId || undefined);
|
|
52
|
+
return c.json({
|
|
53
|
+
success: true,
|
|
54
|
+
session: await session.toMetadata(),
|
|
55
|
+
});
|
|
56
|
+
} catch (error) {
|
|
57
|
+
return c.json(
|
|
58
|
+
{
|
|
59
|
+
success: false,
|
|
60
|
+
error: error instanceof Error ? error.message : String(error),
|
|
61
|
+
},
|
|
62
|
+
500,
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
app.post("/api/sdk/sessions/:sessionId/prompt", async (c) => {
|
|
68
|
+
try {
|
|
69
|
+
const sessionId = String(c.req.param("sessionId") || "").trim();
|
|
70
|
+
if (!sessionId) {
|
|
71
|
+
return c.json({ success: false, error: "Missing sessionId" }, 400);
|
|
72
|
+
}
|
|
73
|
+
const body = (await c.req.json()) as AgentSessionPromptInput;
|
|
74
|
+
const session = await core.session(sessionId);
|
|
75
|
+
const turn = await session.prompt(body);
|
|
76
|
+
return c.json({
|
|
77
|
+
success: true,
|
|
78
|
+
turn: {
|
|
79
|
+
id: turn.id,
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
} catch (error) {
|
|
83
|
+
return c.json(
|
|
84
|
+
{
|
|
85
|
+
success: false,
|
|
86
|
+
error: error instanceof Error ? error.message : String(error),
|
|
87
|
+
},
|
|
88
|
+
500,
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
app.get("/api/sdk/sessions/:sessionId/events", async (c) => {
|
|
94
|
+
const sessionId = String(c.req.param("sessionId") || "").trim();
|
|
95
|
+
if (!sessionId) {
|
|
96
|
+
return c.json({ success: false, error: "Missing sessionId" }, 400);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
const session = await core.session(sessionId);
|
|
101
|
+
const encoder = new TextEncoder();
|
|
102
|
+
const requestSignal = c.req.raw.signal;
|
|
103
|
+
|
|
104
|
+
let cleanupEventsConnection = (): void => {};
|
|
105
|
+
const stream = new ReadableStream<Uint8Array>({
|
|
106
|
+
cancel() {
|
|
107
|
+
cleanupEventsConnection();
|
|
108
|
+
},
|
|
109
|
+
start(controller) {
|
|
110
|
+
const writeLine = (value: unknown): void => {
|
|
111
|
+
controller.enqueue(encoder.encode(`${JSON.stringify(value)}\n`));
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const unsubscribe = session.subscribe((event) => {
|
|
115
|
+
writeLine(event);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
const closeStream = (): void => {
|
|
119
|
+
cleanupEventsConnection();
|
|
120
|
+
try {
|
|
121
|
+
controller.close();
|
|
122
|
+
} catch {
|
|
123
|
+
// ignore duplicate close attempts
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
cleanupEventsConnection = (): void => {
|
|
128
|
+
unsubscribe();
|
|
129
|
+
requestSignal.removeEventListener("abort", closeStream);
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
if (requestSignal.aborted) {
|
|
133
|
+
closeStream();
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
requestSignal.addEventListener("abort", closeStream, { once: true });
|
|
138
|
+
writeLine(SDK_EVENTS_READY_FRAME);
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
return new Response(stream, {
|
|
143
|
+
status: 200,
|
|
144
|
+
headers: {
|
|
145
|
+
"Content-Type": NDJSON_CONTENT_TYPE,
|
|
146
|
+
"Cache-Control": "no-cache, no-transform",
|
|
147
|
+
"X-Accel-Buffering": "no",
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
} catch (error) {
|
|
151
|
+
return c.json(
|
|
152
|
+
{
|
|
153
|
+
success: false,
|
|
154
|
+
error: error instanceof Error ? error.message : String(error),
|
|
155
|
+
},
|
|
156
|
+
500,
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
app.get("/api/sdk/sessions/:sessionId/messages", async (c) => {
|
|
162
|
+
try {
|
|
163
|
+
const sessionId = String(c.req.param("sessionId") || "").trim();
|
|
164
|
+
if (!sessionId) {
|
|
165
|
+
return c.json({ success: false, error: "Missing sessionId" }, 400);
|
|
166
|
+
}
|
|
167
|
+
const session = await core.session(sessionId);
|
|
168
|
+
return c.json({
|
|
169
|
+
success: true,
|
|
170
|
+
messages: await session.history(),
|
|
171
|
+
});
|
|
172
|
+
} catch (error) {
|
|
173
|
+
return c.json(
|
|
174
|
+
{
|
|
175
|
+
success: false,
|
|
176
|
+
error: error instanceof Error ? error.message : String(error),
|
|
177
|
+
},
|
|
178
|
+
500,
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
app.get("/api/sdk/sessions/:sessionId/system", async (c) => {
|
|
184
|
+
try {
|
|
185
|
+
const sessionId = String(c.req.param("sessionId") || "").trim();
|
|
186
|
+
if (!sessionId) {
|
|
187
|
+
return c.json({ success: false, error: "Missing sessionId" }, 400);
|
|
188
|
+
}
|
|
189
|
+
const session = await core.session(sessionId);
|
|
190
|
+
return c.json({
|
|
191
|
+
success: true,
|
|
192
|
+
system: await session.system(),
|
|
193
|
+
});
|
|
194
|
+
} catch (error) {
|
|
195
|
+
return c.json(
|
|
196
|
+
{
|
|
197
|
+
success: false,
|
|
198
|
+
error: error instanceof Error ? error.message : String(error),
|
|
199
|
+
},
|
|
200
|
+
500,
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
app.post("/api/sdk/sessions/:sessionId/fork", async (c) => {
|
|
206
|
+
try {
|
|
207
|
+
const sessionId = String(c.req.param("sessionId") || "").trim();
|
|
208
|
+
if (!sessionId) {
|
|
209
|
+
return c.json({ success: false, error: "Missing sessionId" }, 400);
|
|
210
|
+
}
|
|
211
|
+
const body = (await c.req.json().catch(() => ({}))) as {
|
|
212
|
+
messageId?: unknown;
|
|
213
|
+
};
|
|
214
|
+
const session = await core.session(sessionId);
|
|
215
|
+
const forked = await session.fork(
|
|
216
|
+
String(body.messageId || "").trim() || undefined,
|
|
217
|
+
);
|
|
218
|
+
return c.json({
|
|
219
|
+
success: true,
|
|
220
|
+
session: await forked.toMetadata(),
|
|
221
|
+
});
|
|
222
|
+
} catch (error) {
|
|
223
|
+
return c.json(
|
|
224
|
+
{
|
|
225
|
+
success: false,
|
|
226
|
+
error: error instanceof Error ? error.message : String(error),
|
|
227
|
+
},
|
|
228
|
+
500,
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
}
|
package/src/sdk/AgentSdkTypes.ts
CHANGED
|
@@ -9,9 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
import type { LanguageModel, Tool } from "ai";
|
|
11
11
|
import type { BaseService } from "@/service/builtins/BaseService.js";
|
|
12
|
-
import type { JsonValue } from "@/types/common/Json.js";
|
|
13
12
|
import type { Plugin } from "@/plugin/types/Plugin.js";
|
|
14
|
-
import type { SessionMessageV1 } from "@/session/types/SessionMessages.js";
|
|
15
13
|
import type { AgentPlatformRuntime } from "@/types/runtime/host/AgentHost.js";
|
|
16
14
|
import type { LocalRpcServerHandle } from "@/types/runtime/rpc/LocalRpc.js";
|
|
17
15
|
import type { ServerInstance } from "@/runtime/server/http/Server.js";
|
|
@@ -292,140 +290,6 @@ export interface AgentSessionConfigSnapshot {
|
|
|
292
290
|
modelLabel?: string;
|
|
293
291
|
}
|
|
294
292
|
|
|
295
|
-
/**
|
|
296
|
-
* Session 运行输入。
|
|
297
|
-
*/
|
|
298
|
-
export interface AgentSessionRunInput {
|
|
299
|
-
/**
|
|
300
|
-
* 当前轮用户查询文本。
|
|
301
|
-
*/
|
|
302
|
-
query: string;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
/**
|
|
306
|
-
* Session 运行结果。
|
|
307
|
-
*/
|
|
308
|
-
export interface AgentSessionRunResult {
|
|
309
|
-
/**
|
|
310
|
-
* 本轮执行是否成功。
|
|
311
|
-
*/
|
|
312
|
-
success: boolean;
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* 失败时的错误文本。
|
|
316
|
-
*/
|
|
317
|
-
error?: string;
|
|
318
|
-
|
|
319
|
-
/**
|
|
320
|
-
* 最终 assistant 文本。
|
|
321
|
-
*/
|
|
322
|
-
text: string;
|
|
323
|
-
|
|
324
|
-
/**
|
|
325
|
-
* 最终 assistant 原始 UIMessage。
|
|
326
|
-
*/
|
|
327
|
-
assistantMessage: SessionMessageV1;
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
/**
|
|
331
|
-
* SDK 对外的流式事件。
|
|
332
|
-
*/
|
|
333
|
-
export type AgentSessionStreamEvent =
|
|
334
|
-
| {
|
|
335
|
-
/**
|
|
336
|
-
* 文本增量事件。
|
|
337
|
-
*/
|
|
338
|
-
type: "text-delta";
|
|
339
|
-
/**
|
|
340
|
-
* 当前追加的文本片段。
|
|
341
|
-
*/
|
|
342
|
-
text: string;
|
|
343
|
-
}
|
|
344
|
-
| {
|
|
345
|
-
/**
|
|
346
|
-
* reasoning 增量事件。
|
|
347
|
-
*/
|
|
348
|
-
type: "reasoning-delta";
|
|
349
|
-
/**
|
|
350
|
-
* 当前追加的 reasoning 文本片段。
|
|
351
|
-
*/
|
|
352
|
-
text: string;
|
|
353
|
-
}
|
|
354
|
-
| {
|
|
355
|
-
/**
|
|
356
|
-
* 工具调用可用事件。
|
|
357
|
-
*/
|
|
358
|
-
type: "tool-call";
|
|
359
|
-
/**
|
|
360
|
-
* 当前工具调用唯一标识。
|
|
361
|
-
*/
|
|
362
|
-
toolCallId: string;
|
|
363
|
-
/**
|
|
364
|
-
* 工具名称。
|
|
365
|
-
*/
|
|
366
|
-
toolName: string;
|
|
367
|
-
/**
|
|
368
|
-
* 工具输入参数。
|
|
369
|
-
*/
|
|
370
|
-
args: JsonValue;
|
|
371
|
-
}
|
|
372
|
-
| {
|
|
373
|
-
/**
|
|
374
|
-
* 工具调用结果事件。
|
|
375
|
-
*/
|
|
376
|
-
type: "tool-result";
|
|
377
|
-
/**
|
|
378
|
-
* 当前工具调用唯一标识。
|
|
379
|
-
*/
|
|
380
|
-
toolCallId: string;
|
|
381
|
-
/**
|
|
382
|
-
* 工具名称。
|
|
383
|
-
*/
|
|
384
|
-
toolName: string;
|
|
385
|
-
/**
|
|
386
|
-
* 工具输出结果。
|
|
387
|
-
*/
|
|
388
|
-
result: JsonValue;
|
|
389
|
-
}
|
|
390
|
-
| {
|
|
391
|
-
/**
|
|
392
|
-
* 工具调用失败事件。
|
|
393
|
-
*/
|
|
394
|
-
type: "tool-error";
|
|
395
|
-
/**
|
|
396
|
-
* 当前工具调用唯一标识。
|
|
397
|
-
*/
|
|
398
|
-
toolCallId: string;
|
|
399
|
-
/**
|
|
400
|
-
* 工具名称。
|
|
401
|
-
*/
|
|
402
|
-
toolName: string;
|
|
403
|
-
/**
|
|
404
|
-
* 错误文本。
|
|
405
|
-
*/
|
|
406
|
-
error: string;
|
|
407
|
-
}
|
|
408
|
-
| {
|
|
409
|
-
/**
|
|
410
|
-
* 运行结束事件。
|
|
411
|
-
*/
|
|
412
|
-
type: "finish";
|
|
413
|
-
/**
|
|
414
|
-
* 最终完成原因(若底层可提供)。
|
|
415
|
-
*/
|
|
416
|
-
finishReason?: string;
|
|
417
|
-
}
|
|
418
|
-
| {
|
|
419
|
-
/**
|
|
420
|
-
* 运行错误事件。
|
|
421
|
-
*/
|
|
422
|
-
type: "error";
|
|
423
|
-
/**
|
|
424
|
-
* 错误文本。
|
|
425
|
-
*/
|
|
426
|
-
error: string;
|
|
427
|
-
};
|
|
428
|
-
|
|
429
293
|
/**
|
|
430
294
|
* Session system block 来源类型。
|
|
431
295
|
*/
|
|
@@ -490,7 +354,7 @@ export interface AgentSessionSystemSessionInfo {
|
|
|
490
354
|
*
|
|
491
355
|
* 关键点(中文)
|
|
492
356
|
* - 这是 session 初始化时落盘的稳定参考时间,按 Date/ISO 字符串对外展示。
|
|
493
|
-
* -
|
|
357
|
+
* - 它不是每轮运行的当前时间,不会随着后续 turn 执行而改变。
|
|
494
358
|
*/
|
|
495
359
|
createdAt: string;
|
|
496
360
|
|