feat: upgrade investigation and presentation runtime
Generic Container CI/CD / test-build-publish (push) Successful in 1m6s
Agent CI/CD / build-test-publish-and-deploy (push) Successful in 1m7s

This commit is contained in:
2026-10-30 17:30:19 +08:00
parent 3b52a0ddab
commit 6336157ff4
104 changed files with 6541 additions and 961 deletions
+21
View File
@@ -3,6 +3,7 @@ import { taskReportSchema, taskProgressSchema, type TaskProgress } from "./inves
import { taskPresentationCommandSchema, taskPresentationResultSchema, type TaskPresentationCommand } from "./task-presentation.js";
export { taskReportSchema } from "./investigation-report.js";
import { z } from "zod";
import { interactionQuestionsSchema, type InteractionQuestion } from "../chat/interaction-request-contract.js";
import { config } from "../config.js";
import {
@@ -32,6 +33,7 @@ const operationalTaskRunSchema = z.object({
status: z.enum(["queued", "claimed", "running", "succeeded", "failed", "timed_out", "cancelled"]),
revision: z.number().int().positive(),
agent_session_id: z.string().min(1).nullable(),
agent_instance_id: z.string().min(1).nullable().default(null),
lease_expires_at: z.string().datetime({ offset: true }).nullable(),
heartbeat_at: z.string().datetime({ offset: true }).nullable(),
started_at: z.string().datetime({ offset: true }).nullable(),
@@ -180,6 +182,7 @@ export class OperationalTaskClient {
request_id: input.requestId,
expected_revision: input.expectedRevision,
source_session_id: input.sourceSessionId,
agent_instance_id: config.AGENT_INSTANCE_ID,
}),
});
const result = operationalTaskRunSchema.parse(raw);
@@ -203,6 +206,7 @@ export class OperationalTaskClient {
request_id: crypto.randomUUID(),
expected_revision: state.revision,
source_session_id: sourceSessionId,
agent_instance_id: config.AGENT_INSTANCE_ID,
}),
});
const result = operationalTaskRunSchema.parse(raw);
@@ -290,6 +294,7 @@ export class OperationalTaskClient {
request_id: crypto.randomUUID(),
expected_revision: state.revision,
source_session_id: sourceSessionId,
agent_instance_id: config.AGENT_INSTANCE_ID,
...extra,
}),
},
@@ -326,6 +331,22 @@ export class OperationalTaskClient {
});
}
async askTaskUser(runtimeSessionId: string, taskId: string, input: {
request_id: string; questions: InteractionQuestion[]; sourceSessionId: string;
}) {
return this.mutateRun(runtimeSessionId, async () => {
const state = taskRunStates.get(runtimeSessionId);
if (!state) throw new OperationalTaskClientError(409, "task run context unavailable");
const raw = await this.request(runtimeSessionId, `/api/v1/operational-tasks/${encodeURIComponent(taskId)}/questions`, {
method: "POST", body: JSON.stringify({ request_id: input.request_id,
source_session_id: input.sourceSessionId, run_id: state.runId,
questions: interactionQuestionsSchema.parse(input.questions) }),
});
return z.object({ question_request_id: z.string().uuid(), status: z.enum(["pending", "answered", "cancelled"]),
version: z.number().int().positive() }).passthrough().parse(raw);
});
}
async proposeAction(runtimeSessionId: string, taskId: string, input: ProposedTaskAction) {
const result = await this.request(runtimeSessionId, `/api/v1/operational-tasks/${encodeURIComponent(taskId)}/actions`, {
method: "POST",