@downcity/agent 1.1.22 → 1.1.25
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 +6 -3
- 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/SessionRoutes.d.ts.map +1 -1
- package/bin/runtime/server/http/control/SessionRoutes.js +0 -27
- package/bin/runtime/server/http/control/SessionRoutes.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/InternalUiChunkEvent.d.ts +100 -0
- package/bin/types/sdk/InternalUiChunkEvent.d.ts.map +1 -0
- package/bin/types/sdk/InternalUiChunkEvent.js +9 -0
- package/bin/types/sdk/InternalUiChunkEvent.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 -8
- 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/SessionRoutes.ts +0 -27
- 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/InternalUiChunkEvent.ts +108 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/bin/runtime/server/http/control/StreamBySession.d.ts +0 -22
- package/bin/runtime/server/http/control/StreamBySession.d.ts.map +0 -1
- package/bin/runtime/server/http/control/StreamBySession.js +0 -135
- package/bin/runtime/server/http/control/StreamBySession.js.map +0 -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/runtime/server/http/control/StreamBySession.ts +0 -198
- package/src/sdk/AsyncQueue.ts +0 -92
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Control session 流式执行 helper。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 仅用于单 agent control API 的本地 session 流式返回。
|
|
6
|
-
* - chatKey 命中的平台 chat 队列仍保持原有入队语义,不在这里伪造“流式完成”。
|
|
7
|
-
* - 输出协议复用 SDK `AgentSessionStreamEvent` 的 NDJSON 事件行,便于 CLI 直接消费。
|
|
8
|
-
*/
|
|
9
|
-
import type { AgentContext } from "../../../../core/AgentContextTypes.js";
|
|
10
|
-
import type { AgentRuntime } from "../../../../core/AgentCoreTypes.js";
|
|
11
|
-
import type { ControlSessionExecuteAttachmentInput } from "../../../../runtime/server/http/control/types/ControlSessionExecute.js";
|
|
12
|
-
/**
|
|
13
|
-
* 为指定 session 创建流式执行响应。
|
|
14
|
-
*/
|
|
15
|
-
export declare function createControlSessionStreamResponse(params: {
|
|
16
|
-
agentState: AgentRuntime;
|
|
17
|
-
executionContext: AgentContext;
|
|
18
|
-
sessionId: string;
|
|
19
|
-
instructions: string;
|
|
20
|
-
attachments?: ControlSessionExecuteAttachmentInput[];
|
|
21
|
-
}): Promise<Response>;
|
|
22
|
-
//# sourceMappingURL=StreamBySession.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StreamBySession.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/server/http/control/StreamBySession.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,6BAA6B,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EACV,oCAAoC,EACrC,MAAM,8DAA8D,CAAC;AAkEtE;;GAEG;AACH,wBAAsB,kCAAkC,CAAC,MAAM,EAAE;IAC/D,UAAU,EAAE,YAAY,CAAC;IACzB,gBAAgB,EAAE,YAAY,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,oCAAoC,EAAE,CAAC;CACtD,GAAG,OAAO,CAAC,QAAQ,CAAC,CA6GpB"}
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Control session 流式执行 helper。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 仅用于单 agent control API 的本地 session 流式返回。
|
|
6
|
-
* - chatKey 命中的平台 chat 队列仍保持原有入队语义,不在这里伪造“流式完成”。
|
|
7
|
-
* - 输出协议复用 SDK `AgentSessionStreamEvent` 的 NDJSON 事件行,便于 CLI 直接消费。
|
|
8
|
-
*/
|
|
9
|
-
import { buildExecuteInputText } from "../../../../runtime/server/http/control/Helpers.js";
|
|
10
|
-
import { drainDeferredPersistedUserMessages } from "../../../../session/SessionRunScope.js";
|
|
11
|
-
import { mapUiMessageChunkToSdkEvent } from "../../../../sdk/StreamEvents.js";
|
|
12
|
-
import { resolveDispatchTargetByChatKey } from "../../../../service/builtins/chat/runtime/ChatkeySend.js";
|
|
13
|
-
import { pickLastSuccessfulChatSendText, resolveAssistantMessageForPersistence, } from "../../../../service/builtins/chat/runtime/UserVisibleText.js";
|
|
14
|
-
const NDJSON_CONTENT_TYPE = "application/x-ndjson; charset=utf-8";
|
|
15
|
-
function encodeNdjsonLine(encoder, value) {
|
|
16
|
-
return encoder.encode(`${JSON.stringify(value)}\n`);
|
|
17
|
-
}
|
|
18
|
-
function resolveStreamEventFromUiChunk(params) {
|
|
19
|
-
const { chunk, toolNameByCallId } = params;
|
|
20
|
-
if (chunk.type === "tool-input-start") {
|
|
21
|
-
toolNameByCallId.set(chunk.toolCallId, chunk.toolName);
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
24
|
-
const event = mapUiMessageChunkToSdkEvent(chunk);
|
|
25
|
-
if (!event)
|
|
26
|
-
return null;
|
|
27
|
-
if (event.type === "tool-call" || event.type === "tool-error") {
|
|
28
|
-
toolNameByCallId.set(event.toolCallId, event.toolName);
|
|
29
|
-
}
|
|
30
|
-
if ((event.type === "tool-result" || event.type === "tool-error") &&
|
|
31
|
-
event.toolName === "unknown") {
|
|
32
|
-
const toolName = toolNameByCallId.get(event.toolCallId);
|
|
33
|
-
return toolName ? { ...event, toolName } : event;
|
|
34
|
-
}
|
|
35
|
-
return event;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* 为指定 session 创建流式执行响应。
|
|
39
|
-
*/
|
|
40
|
-
export async function createControlSessionStreamResponse(params) {
|
|
41
|
-
const sessionId = String(params.sessionId || "").trim();
|
|
42
|
-
const instructions = String(params.instructions || "").trim();
|
|
43
|
-
if (!sessionId) {
|
|
44
|
-
return Response.json({ success: false, error: "Missing sessionId" }, { status: 400 });
|
|
45
|
-
}
|
|
46
|
-
if (!instructions) {
|
|
47
|
-
return Response.json({ success: false, error: "Missing instructions" }, { status: 400 });
|
|
48
|
-
}
|
|
49
|
-
const executeInput = await buildExecuteInputText({
|
|
50
|
-
projectRoot: params.agentState.rootPath,
|
|
51
|
-
sessionId,
|
|
52
|
-
instructions,
|
|
53
|
-
attachments: params.attachments,
|
|
54
|
-
});
|
|
55
|
-
const dispatchTarget = await resolveDispatchTargetByChatKey({
|
|
56
|
-
context: params.executionContext,
|
|
57
|
-
chatKey: sessionId,
|
|
58
|
-
});
|
|
59
|
-
if (dispatchTarget) {
|
|
60
|
-
return Response.json({
|
|
61
|
-
success: false,
|
|
62
|
-
error: "Streaming execute does not support queued chat sessions. Use the non-stream execute API for chatKey routes.",
|
|
63
|
-
}, { status: 409 });
|
|
64
|
-
}
|
|
65
|
-
const session = params.agentState.getSession(sessionId);
|
|
66
|
-
const encoder = new TextEncoder();
|
|
67
|
-
const stream = new ReadableStream({
|
|
68
|
-
start(controller) {
|
|
69
|
-
void (async () => {
|
|
70
|
-
const toolNameByCallId = new Map();
|
|
71
|
-
const pushEvent = (event) => {
|
|
72
|
-
controller.enqueue(encodeNdjsonLine(encoder, event));
|
|
73
|
-
};
|
|
74
|
-
try {
|
|
75
|
-
await session.appendUserMessage({
|
|
76
|
-
text: executeInput,
|
|
77
|
-
});
|
|
78
|
-
const result = await session.run({
|
|
79
|
-
query: executeInput,
|
|
80
|
-
onUiMessageChunkCallback: async (chunk) => {
|
|
81
|
-
const event = resolveStreamEventFromUiChunk({
|
|
82
|
-
chunk,
|
|
83
|
-
toolNameByCallId,
|
|
84
|
-
});
|
|
85
|
-
if (!event)
|
|
86
|
-
return;
|
|
87
|
-
pushEvent(event);
|
|
88
|
-
},
|
|
89
|
-
});
|
|
90
|
-
const userVisible = pickLastSuccessfulChatSendText(result.assistantMessage).trim();
|
|
91
|
-
try {
|
|
92
|
-
const messageForPersistence = resolveAssistantMessageForPersistence(result.assistantMessage);
|
|
93
|
-
if (messageForPersistence) {
|
|
94
|
-
await session.appendAssistantMessage({
|
|
95
|
-
message: messageForPersistence,
|
|
96
|
-
fallbackText: userVisible,
|
|
97
|
-
extra: {
|
|
98
|
-
via: "tui_session_stream",
|
|
99
|
-
note: "assistant_message_missing",
|
|
100
|
-
},
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
const deferredInjectedMessages = drainDeferredPersistedUserMessages(sessionId);
|
|
104
|
-
for (const message of deferredInjectedMessages) {
|
|
105
|
-
await session.appendUserMessage({
|
|
106
|
-
message,
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
// ignore persistence follow-up errors after stream completion
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
catch (error) {
|
|
115
|
-
pushEvent({
|
|
116
|
-
type: "error",
|
|
117
|
-
error: error instanceof Error ? error.message : String(error),
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
finally {
|
|
121
|
-
controller.close();
|
|
122
|
-
}
|
|
123
|
-
})();
|
|
124
|
-
},
|
|
125
|
-
});
|
|
126
|
-
return new Response(stream, {
|
|
127
|
-
status: 200,
|
|
128
|
-
headers: {
|
|
129
|
-
"Content-Type": NDJSON_CONTENT_TYPE,
|
|
130
|
-
"Cache-Control": "no-cache, no-transform",
|
|
131
|
-
"X-Accel-Buffering": "no",
|
|
132
|
-
},
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
//# sourceMappingURL=StreamBySession.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StreamBySession.js","sourceRoot":"","sources":["../../../../../src/runtime/server/http/control/StreamBySession.ts"],"names":[],"mappings":"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"}
|
package/bin/sdk/AsyncQueue.d.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SDK AsyncQueue。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 用于把 callback 风格的 stream 事件桥接成 `AsyncIterable`。
|
|
6
|
-
* - 保持实现轻量,不引入额外第三方依赖。
|
|
7
|
-
*/
|
|
8
|
-
/**
|
|
9
|
-
* 极简异步队列。
|
|
10
|
-
*/
|
|
11
|
-
export declare class AsyncQueue<T> implements AsyncIterable<T> {
|
|
12
|
-
private readonly state;
|
|
13
|
-
/**
|
|
14
|
-
* 推入一个值。
|
|
15
|
-
*/
|
|
16
|
-
push(value: T): void;
|
|
17
|
-
/**
|
|
18
|
-
* 关闭队列。
|
|
19
|
-
*/
|
|
20
|
-
close(): void;
|
|
21
|
-
/**
|
|
22
|
-
* 返回异步迭代器。
|
|
23
|
-
*/
|
|
24
|
-
[Symbol.asyncIterator](): AsyncIterator<T>;
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=AsyncQueue.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AsyncQueue.d.ts","sourceRoot":"","sources":["../../src/sdk/AsyncQueue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmBH;;GAEG;AACH,qBAAa,UAAU,CAAC,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAIpB;IAEF;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAapB;;OAEG;IACH,KAAK,IAAI,IAAI;IAab;;OAEG;IACH,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC;CAqB3C"}
|
package/bin/sdk/AsyncQueue.js
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SDK AsyncQueue。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 用于把 callback 风格的 stream 事件桥接成 `AsyncIterable`。
|
|
6
|
-
* - 保持实现轻量,不引入额外第三方依赖。
|
|
7
|
-
*/
|
|
8
|
-
/**
|
|
9
|
-
* 极简异步队列。
|
|
10
|
-
*/
|
|
11
|
-
export class AsyncQueue {
|
|
12
|
-
state = {
|
|
13
|
-
values: [],
|
|
14
|
-
waiters: [],
|
|
15
|
-
closed: false,
|
|
16
|
-
};
|
|
17
|
-
/**
|
|
18
|
-
* 推入一个值。
|
|
19
|
-
*/
|
|
20
|
-
push(value) {
|
|
21
|
-
if (this.state.closed)
|
|
22
|
-
return;
|
|
23
|
-
const waiter = this.state.waiters.shift();
|
|
24
|
-
if (waiter) {
|
|
25
|
-
waiter({
|
|
26
|
-
done: false,
|
|
27
|
-
value,
|
|
28
|
-
});
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
this.state.values.push(value);
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* 关闭队列。
|
|
35
|
-
*/
|
|
36
|
-
close() {
|
|
37
|
-
if (this.state.closed)
|
|
38
|
-
return;
|
|
39
|
-
this.state.closed = true;
|
|
40
|
-
while (this.state.waiters.length > 0) {
|
|
41
|
-
const waiter = this.state.waiters.shift();
|
|
42
|
-
if (!waiter)
|
|
43
|
-
continue;
|
|
44
|
-
waiter({
|
|
45
|
-
done: true,
|
|
46
|
-
value: undefined,
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* 返回异步迭代器。
|
|
52
|
-
*/
|
|
53
|
-
[Symbol.asyncIterator]() {
|
|
54
|
-
return {
|
|
55
|
-
next: () => {
|
|
56
|
-
if (this.state.values.length > 0) {
|
|
57
|
-
return Promise.resolve({
|
|
58
|
-
done: false,
|
|
59
|
-
value: this.state.values.shift(),
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
if (this.state.closed) {
|
|
63
|
-
return Promise.resolve({
|
|
64
|
-
done: true,
|
|
65
|
-
value: undefined,
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
return new Promise((resolve) => {
|
|
69
|
-
this.state.waiters.push(resolve);
|
|
70
|
-
});
|
|
71
|
-
},
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
//# sourceMappingURL=AsyncQueue.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AsyncQueue.js","sourceRoot":"","sources":["../../src/sdk/AsyncQueue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmBH;;GAEG;AACH,MAAM,OAAO,UAAU;IACJ,KAAK,GAAkB;QACtC,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,KAAK;KACd,CAAC;IAEF;;OAEG;IACH,IAAI,CAAC,KAAQ;QACX,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC1C,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC;gBACL,IAAI,EAAE,KAAK;gBACX,KAAK;aACN,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO;QAC9B,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,MAAM,CAAC;gBACL,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,SAAc;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,CAAC,MAAM,CAAC,aAAa,CAAC;QACpB,OAAO;YACL,IAAI,EAAE,GAAG,EAAE;gBACT,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACjC,OAAO,OAAO,CAAC,OAAO,CAAC;wBACrB,IAAI,EAAE,KAAK;wBACX,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAO;qBACtC,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;oBACtB,OAAO,OAAO,CAAC,OAAO,CAAC;wBACrB,IAAI,EAAE,IAAI;wBACV,KAAK,EAAE,SAAc;qBACtB,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,IAAI,OAAO,CAAoB,CAAC,OAAO,EAAE,EAAE;oBAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACnC,CAAC,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SDK Stream 事件映射辅助。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 把底层 AI SDK `UIMessageChunk` 归一到 `AgentSessionStreamEvent`。
|
|
6
|
-
* - 仅保留 SDK 当前需要的稳定事件,不把所有底层细节直接暴露出去。
|
|
7
|
-
*/
|
|
8
|
-
import type { UIMessageChunk } from "ai";
|
|
9
|
-
import type { AgentSessionStreamEvent } from "../sdk/AgentSdkTypes.js";
|
|
10
|
-
import type { AsyncQueue } from "../sdk/AsyncQueue.js";
|
|
11
|
-
/**
|
|
12
|
-
* 把单个 UI chunk 映射为 SDK stream 事件。
|
|
13
|
-
*/
|
|
14
|
-
export declare function mapUiMessageChunkToSdkEvent(chunk: UIMessageChunk): AgentSessionStreamEvent | null;
|
|
15
|
-
/**
|
|
16
|
-
* 把 UI chunk 推入 SDK stream 队列。
|
|
17
|
-
*
|
|
18
|
-
* 关键点(中文)
|
|
19
|
-
* - `tool-output-*` chunk 本身不总是携带 toolName。
|
|
20
|
-
* - 这里用调用 id 维护一次流式执行内的工具名称映射,避免上层重复关心底层 chunk 细节。
|
|
21
|
-
*/
|
|
22
|
-
export declare function pushUiMessageChunkAsSdkEvent(params: {
|
|
23
|
-
/**
|
|
24
|
-
* SDK stream 事件队列。
|
|
25
|
-
*/
|
|
26
|
-
queue: AsyncQueue<AgentSessionStreamEvent>;
|
|
27
|
-
/**
|
|
28
|
-
* 底层 AI SDK UI chunk。
|
|
29
|
-
*/
|
|
30
|
-
chunk: UIMessageChunk;
|
|
31
|
-
/**
|
|
32
|
-
* 当前 stream 生命周期内的 toolCallId 到 toolName 映射。
|
|
33
|
-
*/
|
|
34
|
-
toolNameByCallId: Map<string, string>;
|
|
35
|
-
}): void;
|
|
36
|
-
//# sourceMappingURL=StreamEvents.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StreamEvents.d.ts","sourceRoot":"","sources":["../../src/sdk/StreamEvents.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AAEzC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAmBtD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,cAAc,GACpB,uBAAuB,GAAG,IAAI,CA4DhC;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE;IACnD;;OAEG;IACH,KAAK,EAAE,UAAU,CAAC,uBAAuB,CAAC,CAAC;IAC3C;;OAEG;IACH,KAAK,EAAE,cAAc,CAAC;IACtB;;OAEG;IACH,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC,GAAG,IAAI,CAoBP"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StreamEvents.js","sourceRoot":"","sources":["../../src/sdk/StreamEvents.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Control session 流式执行 helper。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 仅用于单 agent control API 的本地 session 流式返回。
|
|
6
|
-
* - chatKey 命中的平台 chat 队列仍保持原有入队语义,不在这里伪造“流式完成”。
|
|
7
|
-
* - 输出协议复用 SDK `AgentSessionStreamEvent` 的 NDJSON 事件行,便于 CLI 直接消费。
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import type { AgentContext, SessionPort } from "@/core/AgentContextTypes.js";
|
|
11
|
-
import type { AgentRuntime } from "@/core/AgentCoreTypes.js";
|
|
12
|
-
import type {
|
|
13
|
-
ControlSessionExecuteAttachmentInput,
|
|
14
|
-
} from "@/runtime/server/http/control/types/ControlSessionExecute.js";
|
|
15
|
-
import { buildExecuteInputText } from "@/runtime/server/http/control/Helpers.js";
|
|
16
|
-
import { drainDeferredPersistedUserMessages } from "@session/SessionRunScope.js";
|
|
17
|
-
import { mapUiMessageChunkToSdkEvent } from "@/sdk/StreamEvents.js";
|
|
18
|
-
import type { AgentSessionStreamEvent } from "@/sdk/AgentSdkTypes.js";
|
|
19
|
-
import type {
|
|
20
|
-
SessionRunResult,
|
|
21
|
-
SessionUiMessageChunkCallback,
|
|
22
|
-
} from "@/session/types/SessionRun.js";
|
|
23
|
-
import { resolveDispatchTargetByChatKey } from "@/service/builtins/chat/runtime/ChatkeySend.js";
|
|
24
|
-
import {
|
|
25
|
-
pickLastSuccessfulChatSendText,
|
|
26
|
-
resolveAssistantMessageForPersistence,
|
|
27
|
-
} from "@/service/builtins/chat/runtime/UserVisibleText.js";
|
|
28
|
-
|
|
29
|
-
type StreamableSessionPort = SessionPort & {
|
|
30
|
-
/**
|
|
31
|
-
* 流式执行当前 session。
|
|
32
|
-
*
|
|
33
|
-
* 说明(中文)
|
|
34
|
-
* - `SessionPort` 对外接口当前未显式暴露 `onUiMessageChunkCallback`,
|
|
35
|
-
* 但本地 executor 已支持该回调,这里按本地 control runtime 语义做窄化使用。
|
|
36
|
-
*/
|
|
37
|
-
run(params: {
|
|
38
|
-
query: string;
|
|
39
|
-
onUiMessageChunkCallback?: SessionUiMessageChunkCallback;
|
|
40
|
-
}): Promise<SessionRunResult>;
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
const NDJSON_CONTENT_TYPE = "application/x-ndjson; charset=utf-8";
|
|
44
|
-
|
|
45
|
-
function encodeNdjsonLine(
|
|
46
|
-
encoder: TextEncoder,
|
|
47
|
-
value: AgentSessionStreamEvent,
|
|
48
|
-
): Uint8Array {
|
|
49
|
-
return encoder.encode(`${JSON.stringify(value)}\n`);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function resolveStreamEventFromUiChunk(params: {
|
|
53
|
-
chunk: Parameters<NonNullable<SessionUiMessageChunkCallback>>[0];
|
|
54
|
-
toolNameByCallId: Map<string, string>;
|
|
55
|
-
}): AgentSessionStreamEvent | null {
|
|
56
|
-
const { chunk, toolNameByCallId } = params;
|
|
57
|
-
if (chunk.type === "tool-input-start") {
|
|
58
|
-
toolNameByCallId.set(chunk.toolCallId, chunk.toolName);
|
|
59
|
-
return null;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const event = mapUiMessageChunkToSdkEvent(chunk);
|
|
63
|
-
if (!event) return null;
|
|
64
|
-
|
|
65
|
-
if (event.type === "tool-call" || event.type === "tool-error") {
|
|
66
|
-
toolNameByCallId.set(event.toolCallId, event.toolName);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
if (
|
|
70
|
-
(event.type === "tool-result" || event.type === "tool-error") &&
|
|
71
|
-
event.toolName === "unknown"
|
|
72
|
-
) {
|
|
73
|
-
const toolName = toolNameByCallId.get(event.toolCallId);
|
|
74
|
-
return toolName ? { ...event, toolName } : event;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return event;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* 为指定 session 创建流式执行响应。
|
|
82
|
-
*/
|
|
83
|
-
export async function createControlSessionStreamResponse(params: {
|
|
84
|
-
agentState: AgentRuntime;
|
|
85
|
-
executionContext: AgentContext;
|
|
86
|
-
sessionId: string;
|
|
87
|
-
instructions: string;
|
|
88
|
-
attachments?: ControlSessionExecuteAttachmentInput[];
|
|
89
|
-
}): Promise<Response> {
|
|
90
|
-
const sessionId = String(params.sessionId || "").trim();
|
|
91
|
-
const instructions = String(params.instructions || "").trim();
|
|
92
|
-
if (!sessionId) {
|
|
93
|
-
return Response.json({ success: false, error: "Missing sessionId" }, { status: 400 });
|
|
94
|
-
}
|
|
95
|
-
if (!instructions) {
|
|
96
|
-
return Response.json({ success: false, error: "Missing instructions" }, { status: 400 });
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const executeInput = await buildExecuteInputText({
|
|
100
|
-
projectRoot: params.agentState.rootPath,
|
|
101
|
-
sessionId,
|
|
102
|
-
instructions,
|
|
103
|
-
attachments: params.attachments,
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
const dispatchTarget = await resolveDispatchTargetByChatKey({
|
|
107
|
-
context: params.executionContext,
|
|
108
|
-
chatKey: sessionId,
|
|
109
|
-
});
|
|
110
|
-
if (dispatchTarget) {
|
|
111
|
-
return Response.json(
|
|
112
|
-
{
|
|
113
|
-
success: false,
|
|
114
|
-
error:
|
|
115
|
-
"Streaming execute does not support queued chat sessions. Use the non-stream execute API for chatKey routes.",
|
|
116
|
-
},
|
|
117
|
-
{ status: 409 },
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
const session = params.agentState.getSession(sessionId) as StreamableSessionPort;
|
|
122
|
-
const encoder = new TextEncoder();
|
|
123
|
-
|
|
124
|
-
const stream = new ReadableStream<Uint8Array>({
|
|
125
|
-
start(controller) {
|
|
126
|
-
void (async () => {
|
|
127
|
-
const toolNameByCallId = new Map<string, string>();
|
|
128
|
-
|
|
129
|
-
const pushEvent = (event: AgentSessionStreamEvent): void => {
|
|
130
|
-
controller.enqueue(encodeNdjsonLine(encoder, event));
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
try {
|
|
134
|
-
await session.appendUserMessage({
|
|
135
|
-
text: executeInput,
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
const result = await session.run({
|
|
139
|
-
query: executeInput,
|
|
140
|
-
onUiMessageChunkCallback: async (chunk) => {
|
|
141
|
-
const event = resolveStreamEventFromUiChunk({
|
|
142
|
-
chunk,
|
|
143
|
-
toolNameByCallId,
|
|
144
|
-
});
|
|
145
|
-
if (!event) return;
|
|
146
|
-
pushEvent(event);
|
|
147
|
-
},
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
const userVisible = pickLastSuccessfulChatSendText(
|
|
151
|
-
result.assistantMessage,
|
|
152
|
-
).trim();
|
|
153
|
-
try {
|
|
154
|
-
const messageForPersistence = resolveAssistantMessageForPersistence(
|
|
155
|
-
result.assistantMessage,
|
|
156
|
-
);
|
|
157
|
-
if (messageForPersistence) {
|
|
158
|
-
await session.appendAssistantMessage({
|
|
159
|
-
message: messageForPersistence,
|
|
160
|
-
fallbackText: userVisible,
|
|
161
|
-
extra: {
|
|
162
|
-
via: "tui_session_stream",
|
|
163
|
-
note: "assistant_message_missing",
|
|
164
|
-
},
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
const deferredInjectedMessages = drainDeferredPersistedUserMessages(
|
|
168
|
-
sessionId,
|
|
169
|
-
);
|
|
170
|
-
for (const message of deferredInjectedMessages) {
|
|
171
|
-
await session.appendUserMessage({
|
|
172
|
-
message,
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
} catch {
|
|
176
|
-
// ignore persistence follow-up errors after stream completion
|
|
177
|
-
}
|
|
178
|
-
} catch (error) {
|
|
179
|
-
pushEvent({
|
|
180
|
-
type: "error",
|
|
181
|
-
error: error instanceof Error ? error.message : String(error),
|
|
182
|
-
});
|
|
183
|
-
} finally {
|
|
184
|
-
controller.close();
|
|
185
|
-
}
|
|
186
|
-
})();
|
|
187
|
-
},
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
return new Response(stream, {
|
|
191
|
-
status: 200,
|
|
192
|
-
headers: {
|
|
193
|
-
"Content-Type": NDJSON_CONTENT_TYPE,
|
|
194
|
-
"Cache-Control": "no-cache, no-transform",
|
|
195
|
-
"X-Accel-Buffering": "no",
|
|
196
|
-
},
|
|
197
|
-
});
|
|
198
|
-
}
|
package/src/sdk/AsyncQueue.ts
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SDK AsyncQueue。
|
|
3
|
-
*
|
|
4
|
-
* 关键点(中文)
|
|
5
|
-
* - 用于把 callback 风格的 stream 事件桥接成 `AsyncIterable`。
|
|
6
|
-
* - 保持实现轻量,不引入额外第三方依赖。
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
type QueueState<T> = {
|
|
10
|
-
/**
|
|
11
|
-
* 已入队但尚未消费的值。
|
|
12
|
-
*/
|
|
13
|
-
values: T[];
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* 等待中的消费者回调。
|
|
17
|
-
*/
|
|
18
|
-
waiters: Array<(result: IteratorResult<T>) => void>;
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* 队列是否已关闭。
|
|
22
|
-
*/
|
|
23
|
-
closed: boolean;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* 极简异步队列。
|
|
28
|
-
*/
|
|
29
|
-
export class AsyncQueue<T> implements AsyncIterable<T> {
|
|
30
|
-
private readonly state: QueueState<T> = {
|
|
31
|
-
values: [],
|
|
32
|
-
waiters: [],
|
|
33
|
-
closed: false,
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* 推入一个值。
|
|
38
|
-
*/
|
|
39
|
-
push(value: T): void {
|
|
40
|
-
if (this.state.closed) return;
|
|
41
|
-
const waiter = this.state.waiters.shift();
|
|
42
|
-
if (waiter) {
|
|
43
|
-
waiter({
|
|
44
|
-
done: false,
|
|
45
|
-
value,
|
|
46
|
-
});
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
this.state.values.push(value);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* 关闭队列。
|
|
54
|
-
*/
|
|
55
|
-
close(): void {
|
|
56
|
-
if (this.state.closed) return;
|
|
57
|
-
this.state.closed = true;
|
|
58
|
-
while (this.state.waiters.length > 0) {
|
|
59
|
-
const waiter = this.state.waiters.shift();
|
|
60
|
-
if (!waiter) continue;
|
|
61
|
-
waiter({
|
|
62
|
-
done: true,
|
|
63
|
-
value: undefined as T,
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* 返回异步迭代器。
|
|
70
|
-
*/
|
|
71
|
-
[Symbol.asyncIterator](): AsyncIterator<T> {
|
|
72
|
-
return {
|
|
73
|
-
next: () => {
|
|
74
|
-
if (this.state.values.length > 0) {
|
|
75
|
-
return Promise.resolve({
|
|
76
|
-
done: false,
|
|
77
|
-
value: this.state.values.shift() as T,
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
if (this.state.closed) {
|
|
81
|
-
return Promise.resolve({
|
|
82
|
-
done: true,
|
|
83
|
-
value: undefined as T,
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
return new Promise<IteratorResult<T>>((resolve) => {
|
|
87
|
-
this.state.waiters.push(resolve);
|
|
88
|
-
});
|
|
89
|
-
},
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
}
|