fix(agent): bound SCADA presentation continuations
Generic Container CI/CD / test-build-publish (push) Successful in 1m7s
Agent CI/CD / build-test-publish-and-deploy (push) Successful in 1m7s

This commit is contained in:
2026-11-12 12:22:07 +08:00
parent 0be30b80bb
commit f7e411c288
4 changed files with 27 additions and 2 deletions
+11
View File
@@ -410,6 +410,17 @@ export function scadaPresentationContinuation(error: unknown): string | null {
return `Server尚未接受本轮调查结束:${error.message}\n请按返回设备补充publish_task_presentation监测图,必要时更新publish_task_report。保留目标设备与真实缺测说明,完成后再结束本轮。`;
}
/** Bound automatic extra model turns to the current response, preserving the Server gate. */
export function createScadaPresentationContinuation() {
let attempts = 0;
return (error: unknown): string | null => {
const guidance = scadaPresentationContinuation(error);
if (!guidance || attempts >= 3) return null;
attempts++;
return guidance;
};
}
const parseJson = (text: string): unknown => {
if (!text.trim()) return {};
try {
+3 -2
View File
@@ -45,7 +45,7 @@ import {
clearOperationalTaskLease,
operationalTaskClient,
releaseOperationalTaskCredential,
scadaPresentationContinuation,
createScadaPresentationContinuation,
} from "../product/operational-task-client.js";
import { type SessionTranscriptStore } from "../sessions/transcriptStore.js";
import { type SessionUiStateStore } from "../sessions/uiStateStore.js";
@@ -692,6 +692,7 @@ export const registerChatStreamRoute = (
let taskHeartbeatPromise: Promise<void> | undefined;
let taskLeaseFailure: Error | undefined;
let taskRunFinalized = false;
const continueScadaPresentation = createScadaPresentationContinuation();
const stopTaskHeartbeat = async () => {
taskHeartbeatActive = false;
if (taskHeartbeat) clearInterval(taskHeartbeat);
@@ -819,7 +820,7 @@ export const registerChatStreamRoute = (
if (task.lifecycle_status === "failed") throw new Error("Server rejected incomplete investigation artifacts");
return true;
} catch (error) {
const continuation = scadaPresentationContinuation(error);
const continuation = continueScadaPresentation(error);
if (continuation) return continuation;
if (error && typeof error === "object" && "code" in error && error.code === "PENDING_AGENT_MESSAGES") {
await messaging?.flush(binding.sessionId);