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
+19 -1
View File
@@ -3,6 +3,14 @@ import { supplyLayerSchema } from "./task-presentation.js";
import { answerUiBlockSchema } from "../chat/answer-ui.js";
const text = z.string().trim().min(1);
export function mermaidDeclaresNodeId(source: string, nodeId: string): boolean {
const escaped = nodeId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
return new RegExp(
`(?:^|[^A-Za-z0-9_-])${escaped}(?=\\s*(?:[\\[({@;]|--|==|-\\.|$))`,
"m",
).test(source);
}
export const investigationDiagramSchema = z.object({
title: text,
mermaid: text.max(20000).refine((source) =>
@@ -14,7 +22,7 @@ export const investigationDiagramSchema = z.object({
label: text,
evidence_refs: z.array(text).default([]),
action_refs: z.array(z.string().uuid()).default([]),
status: z.enum(["pending", "running", "completed", "waiting_human", "failed", "skipped", "cancelled"]).nullish(),
status: z.enum(["pending", "running", "completed", "waiting", "waiting_human", "failed", "skipped", "cancelled"]).nullish().describe("Evidence-confirmed node state; waiting means prerequisites/external/system result, waiting_human requires manual authorization/approval/feedback. Unknown stays omitted/null; host controls colors."),
map_targets: z.array(z.object({
source_id: supplyLayerSchema,
feature_id: text.max(128),
@@ -24,6 +32,15 @@ export const investigationDiagramSchema = z.object({
if (new Set(diagram.node_refs.map((node) => node.node_id)).size !== diagram.node_refs.length) {
ctx.addIssue({ code: z.ZodIssueCode.custom, message: "调查图节点引用重复" });
}
diagram.node_refs.forEach((node, index) => {
if (!mermaidDeclaresNodeId(diagram.mermaid, node.node_id)) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
path: ["node_refs", index, "node_id"],
message: `调查图节点引用 ${node.node_id} 未在 Mermaid 源码中声明`,
});
}
});
});
export const taskProgressSchema = z.object({
summary: text.max(20000),
@@ -65,6 +82,7 @@ export const taskReportSchema = z.object({
if (Buffer.byteLength(JSON.stringify(blocks), "utf8") > 400000) invalid("报告交互内容超过 400 KB");
if (new Set(blocks.map((item) => item.block.block_id)).size !== blocks.length) invalid("报告界面块编号重复");
for (const item of blocks) {
if (item.block.phase === "process") invalid("正式报告只能包含 final 界面块;旧版未标注阶段的块保持兼容");
if (item.evidence_refs.some((ref) => !report.evidence_refs.includes(ref))) invalid("界面依据必须属于报告依据");
for (const node of Object.values(item.block.spec.elements)) {
if (node.type === "Evidence" && !item.evidence_refs.includes(String(node.props.evidence_id ?? "")))