aws-runtime-bridge 1.8.7 → 1.9.0
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/dist/routes/terminal.d.ts +1 -0
- package/dist/routes/terminal.d.ts.map +1 -1
- package/dist/routes/terminal.js +41 -8
- package/dist/services/session-output.d.ts +1 -0
- package/dist/services/session-output.d.ts.map +1 -1
- package/dist/services/session-output.js +35 -14
- package/dist/services/session-output.test.js +41 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/routes/terminal.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAKxC,OAAO,EAOL,KAAK,oBAAoB,EAEzB,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAG7B,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,+BAA+B,CAAC;AASvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,eAAO,MAAM,cAAc,4CAAW,CAAC;AAIvC,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,0BAA0B,CAAC,EAAE,MAAM,CAAC;CACrC;AAGD,eAAO,MAAM,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAa,CAAC;AAMnE,wBAAgB,wBAAwB,CAAC,UAAU,CAAC,EAAE,uBAAuB;;;cAa5E;AA0BD,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,MAAM,EACrB,GAAG,OAAa,GACf,MAAM,CAoBR;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAW/D;AAED,wBAAgB,kCAAkC,CAChD,UAAU,EAAE,MAAM,EAClB,SAAS,SAA+C,GACvD,MAAM,CAER;AAED,wBAAgB,oCAAoC,CAClD,SAAS,SAAyC,GACjD,MAAM,CAIR;AAcD;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIpE;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAQR;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,SAAkC,GACzC,WAAW,CAMb;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,WAAW,EACpB,KAAK,CAAC,EAAE,MAAM,EACd,GAAG,UAAQ,GACV,MAAM,CAQR;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,IAAI,GAAG,SAAS,CAmB3B;AAmDD;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,aAAa,CAAC,EAAE,MAAM,EACtB,oBAAoB,CAAC,EAAE,MAAM,GAC5B,MAAM,CAOR;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,YAAY,GAAG,aAAa,GAAG,UAAU,GAAG,qBAAqB,CAAC;CAC3E;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,EAC5C,YAAY,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAA0B,GACxD,6BAA6B,CAc/B;
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/routes/terminal.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/terminal.js
CHANGED
|
@@ -233,7 +233,10 @@ function appendCommandOutput(entry, output) {
|
|
|
233
233
|
return;
|
|
234
234
|
}
|
|
235
235
|
entry.seq += 1;
|
|
236
|
-
void sendOutput(entry.agentId, output, entry.sessionId, entry.seq
|
|
236
|
+
void sendOutput(entry.agentId, output, entry.sessionId, entry.seq, undefined, {
|
|
237
|
+
runtimeAccessToken: entry.runtimeAccessToken,
|
|
238
|
+
schedulerBaseUrl: entry.schedulerBaseUrl,
|
|
239
|
+
});
|
|
237
240
|
}
|
|
238
241
|
/**
|
|
239
242
|
* 生成显示在终端输出流中的工作目录提示符。
|
|
@@ -307,6 +310,9 @@ async function executeTerminalCommand(sessionId, commandValue) {
|
|
|
307
310
|
actionType: "bash",
|
|
308
311
|
actionLabel: "终端命令",
|
|
309
312
|
actionDetail: displayCommand,
|
|
313
|
+
}, undefined, {
|
|
314
|
+
runtimeAccessToken: entry.runtimeAccessToken,
|
|
315
|
+
schedulerBaseUrl: entry.schedulerBaseUrl,
|
|
310
316
|
});
|
|
311
317
|
const child = spawn(command, {
|
|
312
318
|
cwd: state.currentDirectory,
|
|
@@ -398,7 +404,10 @@ async function executeTerminalCommand(sessionId, commandValue) {
|
|
|
398
404
|
appendCommandOutput(entry, `\r\n[signal ${signal}]\r\n`);
|
|
399
405
|
}
|
|
400
406
|
appendCommandOutput(entry, formatTerminalPrompt(state.currentDirectory));
|
|
401
|
-
void sendStatus(entry.agentId, sessionId, "waiting_input"
|
|
407
|
+
void sendStatus(entry.agentId, sessionId, "waiting_input", undefined, undefined, {
|
|
408
|
+
runtimeAccessToken: entry.runtimeAccessToken,
|
|
409
|
+
schedulerBaseUrl: entry.schedulerBaseUrl,
|
|
410
|
+
});
|
|
402
411
|
});
|
|
403
412
|
return { started: true, cwd: state.currentDirectory };
|
|
404
413
|
}
|
|
@@ -626,12 +635,16 @@ function formatSdkToolLogMessage(event, phaseLabel) {
|
|
|
626
635
|
function resolveSdkToolLogDetail(event, actionInfo) {
|
|
627
636
|
const input = event.data.toolInput;
|
|
628
637
|
if (actionInfo.actionType === "bash") {
|
|
629
|
-
return getCommandDisplayDetail(input) ||
|
|
638
|
+
return (getCommandDisplayDetail(input) ||
|
|
639
|
+
event.data.actionDetail ||
|
|
640
|
+
actionInfo.actionDetail);
|
|
630
641
|
}
|
|
631
642
|
if (actionInfo.actionType === "read_file" ||
|
|
632
643
|
actionInfo.actionType === "edit_file" ||
|
|
633
644
|
actionInfo.actionType === "write_file") {
|
|
634
|
-
return getFileDisplayDetail(input) ||
|
|
645
|
+
return (getFileDisplayDetail(input) ||
|
|
646
|
+
event.data.actionDetail ||
|
|
647
|
+
actionInfo.actionDetail);
|
|
635
648
|
}
|
|
636
649
|
return event.data.actionDetail || actionInfo.actionDetail;
|
|
637
650
|
}
|
|
@@ -730,7 +743,10 @@ export function resolveRuntimeStatusFromProviderEvent(event) {
|
|
|
730
743
|
actionInfo: {
|
|
731
744
|
actionType: event.data.actionType || inferredAction.actionType,
|
|
732
745
|
actionLabel: event.data.actionLabel || inferredAction.actionLabel,
|
|
733
|
-
actionDetail: actionDetail ||
|
|
746
|
+
actionDetail: actionDetail ||
|
|
747
|
+
event.data.actionDetail ||
|
|
748
|
+
inferredAction.actionDetail ||
|
|
749
|
+
event.data.toolName,
|
|
734
750
|
actionId: event.data.actionId || event.data.toolUseId,
|
|
735
751
|
},
|
|
736
752
|
};
|
|
@@ -740,7 +756,10 @@ export function resolveRuntimeStatusFromProviderEvent(event) {
|
|
|
740
756
|
actionInfo: {
|
|
741
757
|
actionType: event.data.actionType || inferredAction.actionType,
|
|
742
758
|
actionLabel: event.data.actionLabel || inferredAction.actionLabel,
|
|
743
|
-
actionDetail: actionDetail ||
|
|
759
|
+
actionDetail: actionDetail ||
|
|
760
|
+
event.data.actionDetail ||
|
|
761
|
+
inferredAction.actionDetail ||
|
|
762
|
+
event.data.toolName,
|
|
744
763
|
actionId: event.data.actionId || event.data.toolUseId,
|
|
745
764
|
},
|
|
746
765
|
};
|
|
@@ -772,7 +791,10 @@ function forwardSdkOutputEvent(event, entry) {
|
|
|
772
791
|
return;
|
|
773
792
|
}
|
|
774
793
|
entry.seq += 1;
|
|
775
|
-
void sendOutput(entry.agentId, output, event.sessionId, entry.seq, buildSdkOutputMetadata(event), {
|
|
794
|
+
void sendOutput(entry.agentId, output, event.sessionId, entry.seq, buildSdkOutputMetadata(event), {
|
|
795
|
+
runtimeAccessToken: entry.runtimeAccessToken,
|
|
796
|
+
schedulerBaseUrl: entry.schedulerBaseUrl,
|
|
797
|
+
});
|
|
776
798
|
}
|
|
777
799
|
export function resolveSdkProviderId(command) {
|
|
778
800
|
return resolveSdkProviderIdByCommand(command);
|
|
@@ -792,13 +814,17 @@ function wireSdkAdapterEvents(adapter, definition) {
|
|
|
792
814
|
console.log(`[${definition.displayName} Adapter] Event: ${event.type} for session ${event.sessionId}`);
|
|
793
815
|
const runtimeStatus = resolveRuntimeStatusFromProviderEvent(event);
|
|
794
816
|
if (runtimeStatus) {
|
|
795
|
-
void sendStatus(entry.agentId, event.sessionId, runtimeStatus.status, runtimeStatus.actionInfo, resolveStatusChangeUsage(runtimeStatus.actionInfo), {
|
|
817
|
+
void sendStatus(entry.agentId, event.sessionId, runtimeStatus.status, runtimeStatus.actionInfo, resolveStatusChangeUsage(runtimeStatus.actionInfo), {
|
|
818
|
+
runtimeAccessToken: entry.runtimeAccessToken,
|
|
819
|
+
schedulerBaseUrl: entry.schedulerBaseUrl,
|
|
820
|
+
});
|
|
796
821
|
}
|
|
797
822
|
forwardSdkOutputEvent(event, entry);
|
|
798
823
|
const toolResultActionInfo = buildToolResultTimelineActionInfo(event);
|
|
799
824
|
if (toolResultActionInfo) {
|
|
800
825
|
void sendStatus(entry.agentId, event.sessionId, "tool_result", toolResultActionInfo, undefined, {
|
|
801
826
|
runtimeAccessToken: entry.runtimeAccessToken,
|
|
827
|
+
schedulerBaseUrl: entry.schedulerBaseUrl,
|
|
802
828
|
});
|
|
803
829
|
}
|
|
804
830
|
}
|
|
@@ -819,6 +845,7 @@ function wireSdkAdapterEvents(adapter, definition) {
|
|
|
819
845
|
});
|
|
820
846
|
void sendStatus(entry.agentId, sessionId, status, actionInfo, resolveStatusChangeUsage(actionInfo), {
|
|
821
847
|
runtimeAccessToken: entry.runtimeAccessToken,
|
|
848
|
+
schedulerBaseUrl: entry.schedulerBaseUrl,
|
|
822
849
|
});
|
|
823
850
|
}
|
|
824
851
|
});
|
|
@@ -828,6 +855,7 @@ function wireSdkAdapterEvents(adapter, definition) {
|
|
|
828
855
|
console.log(`[${definition.displayName} Adapter] AskUserQuestion for agent ${entry.agentId}`);
|
|
829
856
|
void sendQuestionRequest(entry.agentId, data.sessionId, Array.isArray(data.questions) ? data.questions : [], {
|
|
830
857
|
runtimeAccessToken: entry.runtimeAccessToken,
|
|
858
|
+
schedulerBaseUrl: entry.schedulerBaseUrl,
|
|
831
859
|
});
|
|
832
860
|
}
|
|
833
861
|
});
|
|
@@ -874,6 +902,7 @@ async function startSdkSession(req, res) {
|
|
|
874
902
|
let sessionId = null;
|
|
875
903
|
const normalizedAgentId = String(agentId || "").trim();
|
|
876
904
|
const runtimeAccessToken = String(req.body?.runtimeAccessToken || "").trim() || undefined;
|
|
905
|
+
const requestedSchedulerBaseUrl = String(req.body?.schedulerBaseUrl || "").trim() || undefined;
|
|
877
906
|
try {
|
|
878
907
|
ensureAdapterInitialized();
|
|
879
908
|
if (!normalizedAgentId) {
|
|
@@ -949,6 +978,7 @@ async function startSdkSession(req, res) {
|
|
|
949
978
|
providerId, // 记录使用的 provider
|
|
950
979
|
seq: 0,
|
|
951
980
|
runtimeAccessToken,
|
|
981
|
+
schedulerBaseUrl: requestedSchedulerBaseUrl,
|
|
952
982
|
});
|
|
953
983
|
// 启动 SDK 会话
|
|
954
984
|
await adapter.startSession(sessionId, config);
|
|
@@ -1175,6 +1205,7 @@ terminalRouter.post("/sdk/stop", validateToken, async (req, res) => {
|
|
|
1175
1205
|
await processManager.removeProcess(entry.agentId);
|
|
1176
1206
|
await sendStatus(entry.agentId, null, "stopped", undefined, undefined, {
|
|
1177
1207
|
runtimeAccessToken: entry.runtimeAccessToken,
|
|
1208
|
+
schedulerBaseUrl: entry.schedulerBaseUrl,
|
|
1178
1209
|
});
|
|
1179
1210
|
res.json({ ok: true, status: "stopped" });
|
|
1180
1211
|
}
|
|
@@ -1366,6 +1397,7 @@ terminalRouter.post("/stop", validateToken, async (req, res) => {
|
|
|
1366
1397
|
await processManager.removeProcess(agentId);
|
|
1367
1398
|
await sendStatus(agentId, null, "stopped", undefined, undefined, {
|
|
1368
1399
|
runtimeAccessToken: sdkEntry.runtimeAccessToken,
|
|
1400
|
+
schedulerBaseUrl: sdkEntry.schedulerBaseUrl,
|
|
1369
1401
|
});
|
|
1370
1402
|
res.json({ ok: true, status: "stopped", mode: "sdk" });
|
|
1371
1403
|
}
|
|
@@ -1400,6 +1432,7 @@ terminalRouter.post("/stop-all", validateToken, async (_req, res) => {
|
|
|
1400
1432
|
stoppedSdk.push(sessionId);
|
|
1401
1433
|
await sendStatus(entry.agentId, null, "stopped", undefined, undefined, {
|
|
1402
1434
|
runtimeAccessToken: entry.runtimeAccessToken,
|
|
1435
|
+
schedulerBaseUrl: entry.schedulerBaseUrl,
|
|
1403
1436
|
});
|
|
1404
1437
|
}
|
|
1405
1438
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-output.d.ts","sourceRoot":"","sources":["../../src/services/session-output.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"session-output.d.ts","sourceRoot":"","sources":["../../src/services/session-output.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C,UAAU,uBAAuB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA8BD,aAAa;AACb,eAAO,MAAM,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAa,CAAC;AAExD;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,uBAAuB,EACpC,KAAK,CAAC,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,EACrD,WAAW,CAAC,EAAE,0BAA0B,GACvC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,CA4C7C;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,qBAAqB,EAChC,WAAW,CAAC,EAAE,0BAA0B,GACvC,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,OAAO,EAAE,EACpB,WAAW,CAAC,EAAE,0BAA0B,GACvC,OAAO,CAAC,IAAI,CAAC,CAef;AAED,MAAM,WAAW,yBAAyB;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAef;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAgBzE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAa3D;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCzE"}
|
|
@@ -4,15 +4,22 @@
|
|
|
4
4
|
* 管理终端会话的输出缓冲和刷新机制
|
|
5
5
|
*/
|
|
6
6
|
import axios from "axios";
|
|
7
|
-
import {
|
|
7
|
+
import { resolveSchedulerBaseUrlFrom } from "../config.js";
|
|
8
8
|
import { logger } from "../utils/logger.js";
|
|
9
9
|
import { getRuntimeAccessToken } from "./runtime-binding.js";
|
|
10
|
-
function runtimeAuthHeaders(options) {
|
|
10
|
+
function runtimeAuthHeaders(options, callbackBaseUrl = resolveRuntimeCallbackBaseUrl(options)) {
|
|
11
11
|
const token = options?.runtimeAccessToken ||
|
|
12
|
-
getRuntimeAccessToken(undefined,
|
|
12
|
+
getRuntimeAccessToken(undefined, callbackBaseUrl) ||
|
|
13
13
|
getRuntimeAccessToken();
|
|
14
14
|
return token ? { "X-Runtime-Token": token } : undefined;
|
|
15
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* 解析 Runtime 回调的调度中心地址。
|
|
18
|
+
* 主流程:优先使用启动请求携带的 scheduler 地址;否则按环境变量、单自动注册目标、默认值依次回退。
|
|
19
|
+
*/
|
|
20
|
+
function resolveRuntimeCallbackBaseUrl(options) {
|
|
21
|
+
return resolveSchedulerBaseUrlFrom(options?.schedulerBaseUrl).url;
|
|
22
|
+
}
|
|
16
23
|
/** 输出刷新防抖时间:合并启动期高频小块输出,降低 HTTP/WebSocket 压力。 */
|
|
17
24
|
const OUTPUT_FLUSH_DEBOUNCE_MS = 100;
|
|
18
25
|
/** 单个会话待发送输出上限,避免调度器不可达时内存无限增长。 */
|
|
@@ -49,19 +56,21 @@ export async function sendStatus(agentId, sessionId, status, actionInfo, usage,
|
|
|
49
56
|
payload.inputTokens = usage.inputTokens;
|
|
50
57
|
payload.outputTokens = usage.outputTokens;
|
|
51
58
|
}
|
|
52
|
-
const
|
|
59
|
+
const callbackBaseUrl = resolveRuntimeCallbackBaseUrl(authOptions);
|
|
60
|
+
const headers = runtimeAuthHeaders(authOptions, callbackBaseUrl);
|
|
53
61
|
if (!headers) {
|
|
54
|
-
logger.warn("Skip runtime status callback because runtime token is missing", { agentId, sessionId, status });
|
|
62
|
+
logger.warn("Skip runtime status callback because runtime token is missing", { agentId, sessionId, status, schedulerBaseUrl: callbackBaseUrl });
|
|
55
63
|
return undefined;
|
|
56
64
|
}
|
|
57
65
|
try {
|
|
58
|
-
return await axios.post(`${
|
|
66
|
+
return await axios.post(`${callbackBaseUrl}/api/runtime/callback/status`, payload, { headers });
|
|
59
67
|
}
|
|
60
68
|
catch (error) {
|
|
61
69
|
logger.warn("Runtime status callback failed", {
|
|
62
70
|
agentId,
|
|
63
71
|
sessionId,
|
|
64
72
|
status,
|
|
73
|
+
schedulerBaseUrl: callbackBaseUrl,
|
|
65
74
|
error,
|
|
66
75
|
});
|
|
67
76
|
return undefined;
|
|
@@ -77,14 +86,24 @@ export async function sendStatus(agentId, sessionId, status, actionInfo, usage,
|
|
|
77
86
|
*/
|
|
78
87
|
export async function sendOutput(agentId, output, sessionId, seq, metadata, authOptions) {
|
|
79
88
|
try {
|
|
80
|
-
const
|
|
89
|
+
const callbackBaseUrl = resolveRuntimeCallbackBaseUrl(authOptions);
|
|
90
|
+
const headers = runtimeAuthHeaders(authOptions, callbackBaseUrl);
|
|
81
91
|
if (!headers) {
|
|
92
|
+
logger.warn("Skip runtime output callback because runtime token is missing", {
|
|
93
|
+
agentId,
|
|
94
|
+
sessionId,
|
|
95
|
+
schedulerBaseUrl: callbackBaseUrl,
|
|
96
|
+
});
|
|
82
97
|
return;
|
|
83
98
|
}
|
|
84
|
-
await axios.post(`${
|
|
99
|
+
await axios.post(`${callbackBaseUrl}/api/runtime/callback/output`, { agentId, output, sessionId, seq, ...metadata }, { headers });
|
|
85
100
|
}
|
|
86
|
-
catch {
|
|
87
|
-
|
|
101
|
+
catch (error) {
|
|
102
|
+
logger.warn("Runtime output callback failed", {
|
|
103
|
+
agentId,
|
|
104
|
+
sessionId,
|
|
105
|
+
error,
|
|
106
|
+
});
|
|
88
107
|
}
|
|
89
108
|
}
|
|
90
109
|
/**
|
|
@@ -96,11 +115,12 @@ export async function sendOutput(agentId, output, sessionId, seq, metadata, auth
|
|
|
96
115
|
*/
|
|
97
116
|
export async function sendQuestionRequest(agentId, sessionId, questions, authOptions) {
|
|
98
117
|
try {
|
|
99
|
-
const
|
|
118
|
+
const callbackBaseUrl = resolveRuntimeCallbackBaseUrl(authOptions);
|
|
119
|
+
const headers = runtimeAuthHeaders(authOptions, callbackBaseUrl);
|
|
100
120
|
if (!headers) {
|
|
101
121
|
return;
|
|
102
122
|
}
|
|
103
|
-
await axios.post(`${
|
|
123
|
+
await axios.post(`${callbackBaseUrl}/api/runtime/callback/question`, { agentId, sessionId, questions }, { headers });
|
|
104
124
|
}
|
|
105
125
|
catch {
|
|
106
126
|
// ignore transient callback failures
|
|
@@ -111,11 +131,12 @@ export async function sendQuestionRequest(agentId, sessionId, questions, authOpt
|
|
|
111
131
|
*/
|
|
112
132
|
export async function sendFileChanged(payload) {
|
|
113
133
|
try {
|
|
114
|
-
const
|
|
134
|
+
const callbackBaseUrl = resolveRuntimeCallbackBaseUrl();
|
|
135
|
+
const headers = runtimeAuthHeaders(undefined, callbackBaseUrl);
|
|
115
136
|
if (!headers) {
|
|
116
137
|
return;
|
|
117
138
|
}
|
|
118
|
-
await axios.post(`${
|
|
139
|
+
await axios.post(`${callbackBaseUrl}/api/runtime/callback/file-changed`, payload, { headers });
|
|
119
140
|
}
|
|
120
141
|
catch {
|
|
121
142
|
// ignore transient callback failures
|
|
@@ -5,6 +5,7 @@ import axios from "axios";
|
|
|
5
5
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
6
6
|
import { logger } from "../utils/logger.js";
|
|
7
7
|
import { appendSessionOutput, sendOutput, sendStatus, sessions, } from "./session-output.js";
|
|
8
|
+
import { getRuntimeAccessToken } from "./runtime-binding.js";
|
|
8
9
|
vi.mock("axios", () => ({
|
|
9
10
|
default: {
|
|
10
11
|
post: vi.fn(),
|
|
@@ -20,6 +21,7 @@ vi.mock("../utils/logger.js", () => ({
|
|
|
20
21
|
}));
|
|
21
22
|
const mockedAxiosPost = axios.post;
|
|
22
23
|
const mockedLogger = vi.mocked(logger);
|
|
24
|
+
const mockedGetRuntimeAccessToken = vi.mocked(getRuntimeAccessToken);
|
|
23
25
|
const createSession = (overrides = {}) => ({
|
|
24
26
|
agentId: "agent-1",
|
|
25
27
|
workspacePath: "D:/workspace",
|
|
@@ -133,4 +135,43 @@ describe("session-output service", () => {
|
|
|
133
135
|
sourceEventType: "text_delta",
|
|
134
136
|
}, { headers: { "X-Runtime-Token": "session-runtime-token" } });
|
|
135
137
|
});
|
|
138
|
+
it("uses launch scheduler URL for Docker-deployed scheduler callbacks", async () => {
|
|
139
|
+
mockedAxiosPost.mockResolvedValue({ data: { ok: true } });
|
|
140
|
+
await sendStatus("agent-1", "session-1", "thinking", undefined, undefined, {
|
|
141
|
+
runtimeAccessToken: "session-runtime-token",
|
|
142
|
+
schedulerBaseUrl: "http://127.0.0.1:7380",
|
|
143
|
+
});
|
|
144
|
+
await sendOutput("agent-1", "[ACode] 正在请求模型 gpt-test:hello", "session-1", 8, { sourceEventType: "ai_request", logCategory: "acode" }, {
|
|
145
|
+
runtimeAccessToken: "session-runtime-token",
|
|
146
|
+
schedulerBaseUrl: "http://127.0.0.1:7380",
|
|
147
|
+
});
|
|
148
|
+
expect(mockedAxiosPost).toHaveBeenNthCalledWith(1, "http://127.0.0.1:7380/api/runtime/callback/status", {
|
|
149
|
+
agentId: "agent-1",
|
|
150
|
+
sessionId: "session-1",
|
|
151
|
+
status: "thinking",
|
|
152
|
+
}, { headers: { "X-Runtime-Token": "session-runtime-token" } });
|
|
153
|
+
expect(mockedAxiosPost).toHaveBeenNthCalledWith(2, "http://127.0.0.1:7380/api/runtime/callback/output", {
|
|
154
|
+
agentId: "agent-1",
|
|
155
|
+
output: "[ACode] 正在请求模型 gpt-test:hello",
|
|
156
|
+
sessionId: "session-1",
|
|
157
|
+
seq: 8,
|
|
158
|
+
sourceEventType: "ai_request",
|
|
159
|
+
logCategory: "acode",
|
|
160
|
+
}, { headers: { "X-Runtime-Token": "session-runtime-token" } });
|
|
161
|
+
});
|
|
162
|
+
it("looks up persisted runtime token by launch scheduler URL when explicit token is missing", async () => {
|
|
163
|
+
mockedAxiosPost.mockResolvedValueOnce({ data: { ok: true } });
|
|
164
|
+
mockedGetRuntimeAccessToken.mockImplementationOnce((_, serverBaseUrl) => serverBaseUrl === "http://127.0.0.1:7380"
|
|
165
|
+
? "scoped-7380-token"
|
|
166
|
+
: undefined);
|
|
167
|
+
await sendStatus("agent-1", "session-1", "thinking", undefined, undefined, {
|
|
168
|
+
schedulerBaseUrl: "http://127.0.0.1:7380",
|
|
169
|
+
});
|
|
170
|
+
expect(mockedGetRuntimeAccessToken).toHaveBeenNthCalledWith(1, undefined, "http://127.0.0.1:7380");
|
|
171
|
+
expect(mockedAxiosPost).toHaveBeenCalledWith("http://127.0.0.1:7380/api/runtime/callback/status", {
|
|
172
|
+
agentId: "agent-1",
|
|
173
|
+
sessionId: "session-1",
|
|
174
|
+
status: "thinking",
|
|
175
|
+
}, { headers: { "X-Runtime-Token": "scoped-7380-token" } });
|
|
176
|
+
});
|
|
136
177
|
});
|