@axiom-lattice/react-sdk 4.3.0 → 4.4.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/{AgentDetailSideApp-TI7723CK.mjs → AgentDetailSideApp-RW6B3BGT.mjs} +7 -7
- package/dist/AgentGovernanceWorkbench-OXGHJNFL.mjs +19 -0
- package/dist/{MessageGraph-ES3P4VLY.mjs → MessageGraph-BVP2M3TM.mjs} +3 -3
- package/dist/{ReactChart-6AYFMCMD.mjs → ReactChart-3XHMWXL6.mjs} +3 -3
- package/dist/{TasksSideApp-7R42CIFG.mjs → TasksSideApp-MLG7XUQA.mjs} +4 -4
- package/dist/{TeamWorkspace-JQ762PEX.mjs → TeamWorkspace-IENL2T4X.mjs} +3 -3
- package/dist/{TopologyRuntimeView-OJ35YYVM.mjs → TopologyRuntimeView-B5TVUTAB.mjs} +4 -4
- package/dist/{WorkflowAutomationView-3AS77NKN.mjs → WorkflowAutomationView-ZKTUYMPU.mjs} +6 -6
- package/dist/{chunk-4FI66ZJ3.mjs → chunk-2NCNDHTI.mjs} +2 -2
- package/dist/{chunk-ENLK3ODS.mjs → chunk-3JNBTKKB.mjs} +2 -2
- package/dist/{chunk-2ZK7AUQW.mjs → chunk-ADZRYRP6.mjs} +9 -5
- package/dist/chunk-ADZRYRP6.mjs.map +1 -0
- package/dist/{chunk-4SVLWYLW.mjs → chunk-AJLGOGUB.mjs} +2 -2
- package/dist/{chunk-NSGSGYM7.mjs → chunk-HLVE2SB7.mjs} +48 -1
- package/dist/chunk-HLVE2SB7.mjs.map +1 -0
- package/dist/{chunk-YUV4WO25.mjs → chunk-N5VEHSQU.mjs} +160 -69
- package/dist/chunk-N5VEHSQU.mjs.map +1 -0
- package/dist/{chunk-3NR7UAPT.mjs → chunk-ORTSDZD4.mjs} +26 -44
- package/dist/chunk-ORTSDZD4.mjs.map +1 -0
- package/dist/{chunk-DBTFQUSQ.mjs → chunk-XE2ZIE2L.mjs} +4 -4
- package/dist/{embed-page-AgentDetailSideApp-PSRQVFNR.js → embed-page-AgentDetailSideApp-2BDEWFQ6.js} +1 -1
- package/dist/embed-page-AgentGovernanceWorkbench-WG7E3G5T.js +5 -0
- package/dist/{embed-page-MessageGraph-PDNQ67T4.js → embed-page-MessageGraph-5SWPEQ4V.js} +1 -1
- package/dist/{embed-page-ReactChart-25KAFLQ3.js → embed-page-ReactChart-ZYWRXIMC.js} +1 -1
- package/dist/{embed-page-TasksSideApp-DLH5LRMS.js → embed-page-TasksSideApp-X6255GEF.js} +1 -1
- package/dist/{embed-page-TeamWorkspace-2WJJWF25.js → embed-page-TeamWorkspace-XNZM7AV7.js} +1 -1
- package/dist/{embed-page-TopologyRuntimeView-WDQRHDMO.js → embed-page-TopologyRuntimeView-DGSHSTIU.js} +1 -1
- package/dist/{embed-page-WorkflowAutomationView-BAMJ2WVB.js → embed-page-WorkflowAutomationView-BHIRIWV3.js} +1 -1
- package/dist/embed-page-chunk-DEDTYRZE.js +245 -0
- package/dist/{embed-page-chunk-XVUA7UHE.js → embed-page-chunk-HEO7X7LH.js} +1 -1
- package/dist/{embed-page-chunk-TL2AYM76.js → embed-page-chunk-JMZ7OODN.js} +1 -1
- package/dist/{embed-page-chunk-OBM5EUWZ.js → embed-page-chunk-SPC4BYNU.js} +192 -192
- package/dist/{embed-page-chunk-LOXLXZNP.js → embed-page-chunk-XUXEGF3S.js} +1 -1
- package/dist/{embed-page-chunk-MQDYZS3S.js → embed-page-chunk-YCX5YZRP.js} +1 -1
- package/dist/embed-page.js +1 -1
- package/dist/index.d.mts +27 -1
- package/dist/index.d.ts +27 -1
- package/dist/index.js +2029 -1890
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +13 -8
- package/dist/index.mjs.map +1 -1
- package/dist/web-app.js +48 -3
- package/dist/web-app.js.map +1 -1
- package/dist/web-app.mjs +5 -4
- package/dist/web-app.mjs.map +1 -1
- package/package.json +3 -3
- package/dist/AgentGovernanceWorkbench-2MPAB6UF.mjs +0 -19
- package/dist/chunk-2ZK7AUQW.mjs.map +0 -1
- package/dist/chunk-3NR7UAPT.mjs.map +0 -1
- package/dist/chunk-NSGSGYM7.mjs.map +0 -1
- package/dist/chunk-YUV4WO25.mjs.map +0 -1
- package/dist/embed-page-AgentGovernanceWorkbench-UPQHJZD7.js +0 -5
- package/dist/embed-page-chunk-SSC7ANWV.js +0 -245
- /package/dist/{AgentDetailSideApp-TI7723CK.mjs.map → AgentDetailSideApp-RW6B3BGT.mjs.map} +0 -0
- /package/dist/{AgentGovernanceWorkbench-2MPAB6UF.mjs.map → AgentGovernanceWorkbench-OXGHJNFL.mjs.map} +0 -0
- /package/dist/{MessageGraph-ES3P4VLY.mjs.map → MessageGraph-BVP2M3TM.mjs.map} +0 -0
- /package/dist/{ReactChart-6AYFMCMD.mjs.map → ReactChart-3XHMWXL6.mjs.map} +0 -0
- /package/dist/{TasksSideApp-7R42CIFG.mjs.map → TasksSideApp-MLG7XUQA.mjs.map} +0 -0
- /package/dist/{TeamWorkspace-JQ762PEX.mjs.map → TeamWorkspace-IENL2T4X.mjs.map} +0 -0
- /package/dist/{TopologyRuntimeView-OJ35YYVM.mjs.map → TopologyRuntimeView-B5TVUTAB.mjs.map} +0 -0
- /package/dist/{WorkflowAutomationView-3AS77NKN.mjs.map → WorkflowAutomationView-ZKTUYMPU.mjs.map} +0 -0
- /package/dist/{chunk-4FI66ZJ3.mjs.map → chunk-2NCNDHTI.mjs.map} +0 -0
- /package/dist/{chunk-ENLK3ODS.mjs.map → chunk-3JNBTKKB.mjs.map} +0 -0
- /package/dist/{chunk-4SVLWYLW.mjs.map → chunk-AJLGOGUB.mjs.map} +0 -0
- /package/dist/{chunk-DBTFQUSQ.mjs.map → chunk-XE2ZIE2L.mjs.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Governance/agentMeta.ts","../src/components/Governance/AgentEvalPanel.tsx","../src/components/Governance/evalProjectRef.ts","../src/integrations/web-app/console-chat/AgentChatApp.tsx","../src/integrations/web-app/console-chat/AgentChatSidebar.tsx","../src/integrations/web-app/console-chat/runtimeUploadAuth.ts","../src/components/Governance/configGraph.ts","../src/components/Governance/AgentOverview.tsx","../src/hooks/eval/evalTypes.ts","../src/components/Governance/improvementQuality.ts","../src/components/Governance/EChart.tsx","../src/components/Governance/Learning/trainingUtils.ts","../src/components/Governance/AgentConfigGraph.tsx","../src/components/Governance/ConfigGraphNodes.tsx","../src/components/Governance/graphHandles.tsx","../src/components/Governance/nodeMeta.tsx","../src/components/Governance/CanvasOverlay.tsx","../src/components/Governance/MiniChart.tsx","../src/components/Governance/Learning/LearningProgressCard.tsx","../src/components/Governance/Learning/StartLearningModal.tsx","../src/components/Governance/Learning/ReferenceFilesUpload.tsx","../src/components/Governance/Learning/LearningTaskDetailModal.tsx","../src/components/Governance/Learning/LearningWorkflowGraph.tsx","../src/components/Governance/Learning/learningWorkflowUtils.ts","../src/components/Governance/Learning/WorkflowTaskNode.tsx","../src/components/Governance/CanvasDock.tsx","../src/components/Governance/EvalQualityPanel.tsx","../src/components/Governance/evalQuality.ts","../src/components/Governance/EvalQualitySummary.tsx","../src/components/Governance/RoundTrendChart.tsx","../src/components/Governance/DimensionPanorama.tsx","../src/components/Governance/EvalRunInsights.tsx","../src/components/Governance/CanvasZone.tsx","../src/components/Governance/ArchitectCopilotDock.tsx","../src/components/Governance/useArchitectMobileViewport.ts","../src/components/Governance/useCopilotKickoffRequest.ts","../src/components/Governance/ArchitectCopilotNode.tsx","../src/components/Governance/TestingZone.tsx","../src/components/Governance/canvasLayout.ts","../src/components/Governance/Learning/LearningZone.tsx","../src/components/Governance/OnboardingTour.tsx","../src/components/Governance/Learning/LearningTaskGraphView.tsx","../src/components/Governance/AgentDetailView.tsx","../src/components/Chat/AgentConfigPanel.tsx","../src/components/Governance/AgentWebAppsPanel.tsx","../src/components/Governance/AgentWebAppFormModal.tsx","../src/components/Governance/WorkflowAgentCanvas.tsx","../src/components/Governance/NodeDock.tsx","../src/components/Governance/trainingProjectScope.ts","../src/components/Governance/useEntityRefresher.ts","../src/components/Governance/entityRefresh.ts"],"sourcesContent":["import type { Assistant } from \"@axiom-lattice/client-sdk\";\nimport type { AgentListItem, AgentStatus, GovernanceAgentType, AgentGraphData, AgentGraphNodeData } from \"./types\";\n\nconst TYPE_LABEL: Record<string, { label: GovernanceAgentType; color: string }> = {\n react: { label: \"capability\", color: \"blue\" },\n capability: { label: \"capability\", color: \"blue\" },\n deep_agent: { label: \"orchestrator\", color: \"orange\" },\n orchestrator: { label: \"orchestrator\", color: \"orange\" },\n team: { label: \"team\", color: \"green\" },\n processing: { label: \"workflow\", color: \"purple\" },\n workflow: { label: \"workflow\", color: \"purple\" },\n a2a_remote: { label: \"remote\", color: \"cyan\" },\n remote: { label: \"remote\", color: \"cyan\" },\n};\n\nexport function getTypeBadgeInfo(rawType: string): { label: GovernanceAgentType; color: string } {\n return TYPE_LABEL[rawType] ?? { label: \"capability\", color: \"blue\" };\n}\n\n/** antd color names used by badges/tags. */\nconst STATUS_COLOR: Record<AgentStatus, string> = {\n enabled: \"green\",\n draft: \"orange\",\n disabled: \"default\",\n};\n\nexport function statusColor(status: AgentStatus): string {\n return STATUS_COLOR[status] ?? \"default\";\n}\n\n/** antd color name -> hex for canvas rendering (AgentGraphNode). */\nconst TYPE_HEX: Record<string, string> = {\n blue: \"#3b82f6\",\n orange: \"#f59e0b\",\n green: \"#22c55e\",\n purple: \"#a855f7\",\n cyan: \"#06b6d4\",\n};\n\nexport function colorHex(color: string): string {\n return TYPE_HEX[color] ?? TYPE_HEX.cyan;\n}\n\n/** Hex dot color for an agent status (strong signal on cards). */\nexport function statusHex(status: AgentStatus): string {\n const map: Record<AgentStatus, string> = {\n enabled: \"#22c55e\",\n draft: \"#f59e0b\",\n disabled: \"#d9d9d9\",\n };\n return map[status] ?? map.disabled;\n}\n\nfunction getGraphDefinition(assistant: Assistant): Record<string, unknown> {\n return typeof assistant.graphDefinition === \"object\" && assistant.graphDefinition !== null\n ? assistant.graphDefinition\n : {};\n}\n\nexport function extractTags(assistant: Assistant): string[] {\n const def = getGraphDefinition(assistant);\n const metadata = (def.metadata ?? {}) as Record<string, string>;\n const raw = metadata.tags ?? \"\";\n return raw\n .split(\",\")\n .map((t) => t.trim())\n .filter(Boolean);\n}\n\nexport function extractVersion(assistant: Assistant): string {\n const def = getGraphDefinition(assistant);\n const metadata = (def.metadata ?? {}) as Record<string, string>;\n const raw = metadata.version;\n if (!raw) return \"v1\";\n return raw.startsWith(\"v\") ? raw : `v${raw}`;\n}\n\nexport function extractStatus(assistant: Assistant): AgentStatus {\n const def = getGraphDefinition(assistant);\n const metadata = (def.metadata ?? {}) as Record<string, string>;\n const status = metadata.status ?? \"enabled\";\n return status === \"draft\" || status === \"disabled\" ? status : \"enabled\";\n}\n\nexport function extractSubAgents(assistant: Assistant): string[] {\n const def = getGraphDefinition(assistant);\n const subAgents = def.subAgents ?? [];\n const filtered = Array.isArray(subAgents) ? (subAgents as string[]).filter(Boolean) : [];\n return Array.from(new Set(filtered));\n}\n\nexport function buildAgentListItems(assistants: Assistant[]): AgentListItem[] {\n return assistants.map((assistant) => {\n const def = getGraphDefinition(assistant);\n const rawType = String(def.type ?? \"react\");\n return {\n id: assistant.id,\n name: assistant.name,\n description: assistant.description,\n type: getTypeBadgeInfo(rawType).label,\n tags: extractTags(assistant),\n version: extractVersion(assistant),\n status: extractStatus(assistant),\n subAgents: extractSubAgents(assistant),\n };\n });\n}\n\n/** Build graph nodes + collaboration edges from assistants (edge: agent -> subAgent). */\nexport function buildAgentGraphData(assistants: Assistant[]): AgentGraphData {\n const knownIds = new Set(assistants.map((a) => a.id));\n const nodes: AgentGraphNodeData[] = assistants.map((a) => ({\n id: a.id,\n label: a.name,\n type: getTypeBadgeInfo(String(getGraphDefinition(a).type ?? \"react\")).label,\n subAgentCount: extractSubAgents(a).length,\n }));\n const edges: Array<{ source: string; target: string }> = [];\n for (const assistant of assistants) {\n for (const sub of extractSubAgents(assistant)) {\n if (knownIds.has(sub)) {\n edges.push({ source: assistant.id, target: sub });\n }\n }\n }\n return { nodes, edges };\n}\n","import React, { useState, useCallback, useEffect, useRef } from \"react\";\nimport { Spin, Empty, Button, Modal, Form, Select, Input, Typography, Tag, message } from \"antd\";\nimport { CaretRightOutlined, PlusOutlined, ExperimentOutlined } from \"@ant-design/icons\";\nimport { useEvalProjects } from \"../../hooks/eval/useEvalProjects\";\nimport { EvalSuiteCardList } from \"../Eval/EvalSuiteCardList\";\nimport { EvalSuiteDetail } from \"../Eval/EvalSuiteDetail\";\nimport { EvalRunResults } from \"../Eval/EvalRunResults\";\nimport { RunEnvModal } from \"../Eval/RunEnvModal\";\nimport { useEvalSuites } from \"../../hooks/eval/useEvalSuites\";\nimport { useEvalRuns } from \"../../hooks/eval/useEvalRuns\";\nimport { useWorkspaceContext } from \"../../context/WorkspaceContext\";\nimport { useClient } from \"../../context\";\nimport { findAgentEvalProject, type EvalProjectLike } from \"./evalProjectRef\";\n\nconst { Text } = Typography;\n\ntype Page = \"suites\" | \"suite\" | \"run\";\n\n/** External navigation target for an agent evaluation panel. */\nexport interface AgentEvalPanelInitial {\n page?: Page;\n suiteId?: string;\n runId?: string;\n}\n\nexport interface AgentEvalPanelProps {\n assistantId: string;\n initial?: AgentEvalPanelInitial;\n /** Changes for each external navigation command, even when the target is unchanged. */\n navigationKey?: number;\n onEvalInvalidated?: () => void | Promise<void>;\n}\n\ninterface EvalTarget {\n page: Page;\n suiteId: string;\n runId: string;\n}\n\nconst normalizeInitial = (initial?: AgentEvalPanelInitial): EvalTarget => {\n if (initial?.page === \"suite\" && initial.suiteId?.trim()) {\n return { page: \"suite\", suiteId: initial.suiteId, runId: \"\" };\n }\n if (initial?.page === \"run\" && initial.runId?.trim()) {\n return { page: \"run\", suiteId: \"\", runId: initial.runId };\n }\n return { page: \"suites\", suiteId: \"\", runId: \"\" };\n};\n\ninterface AgentEvalProject extends EvalProjectLike {\n id: string;\n}\n\ninterface ModelClientConfig {\n baseURL?: string;\n apiKey?: string;\n}\n\ninterface ModelClient {\n config?: ModelClientConfig;\n baseUrl?: string;\n}\n\n/**\n * Agent-scoped evaluation panel.\n *\n * Resolves the agent's eval project via findAgentEvalProject\n * (targetAgentId pointer → naming convention → description fallback).\n * When the project exists, renders the agent-scoped eval UI (suites list\n * -> suite detail -> run results). Otherwise shows an empty state with a\n * create-project flow that records the targetAgentId pointer.\n */\nexport const AgentEvalPanel: React.FC<AgentEvalPanelProps> = ({ assistantId, initial, navigationKey, onEvalInvalidated }) => {\n const { projects, loading, create: createProject } = useEvalProjects();\n const project = findAgentEvalProject(projects as AgentEvalProject[], assistantId);\n const projectId = project?.id ?? \"\";\n const projectName = project?.name || `eval-${assistantId}`;\n\n const normalizedInitial = normalizeInitial(initial);\n const initialKey = `${normalizedInitial.page}\\0${normalizedInitial.suiteId}\\0${normalizedInitial.runId}`;\n const [target, setTarget] = useState<EvalTarget>(normalizedInitial);\n const { page, suiteId, runId } = target;\n\n useEffect(() => {\n setTarget(normalizedInitial);\n }, [assistantId, initialKey, navigationKey]);\n\n const { start } = useEvalRuns(projectId);\n const { workspaceId, projectId: envProjectId } = useWorkspaceContext();\n const [runEnvOpen, setRunEnvOpen] = useState(false);\n\n const { create: createSuite } = useEvalSuites(projectId);\n const [showAdd, setShowAdd] = useState(false);\n const [suiteName, setSuiteName] = useState(\"\");\n const [suiteRefreshKey, setSuiteRefreshKey] = useState(0);\n\n const [modalOpen, setModalOpen] = useState(false);\n const [form] = Form.useForm();\n const [submitting, setSubmitting] = useState(false);\n const [models, setModels] = useState<unknown[]>([]);\n const client = useClient(\"__GLOBAL__\");\n const onEvalInvalidatedRef = useRef(onEvalInvalidated);\n onEvalInvalidatedRef.current = onEvalInvalidated;\n\n const buildRunConfig = (pid?: string | null) => ({\n workspaceId: workspaceId || undefined,\n projectId: pid || envProjectId || undefined,\n });\n\n const loadModels = useCallback(async () => {\n const modelClient = client as unknown as ModelClient;\n const baseURL = modelClient.config?.baseURL || modelClient.baseUrl || \"\";\n try {\n const res = await fetch(`${baseURL}/api/models`, {\n headers: { Authorization: `Bearer ${modelClient.config?.apiKey || \"\"}` },\n });\n const d = await res.json();\n if (d.success) setModels(d.data || []);\n } catch { /* ignore */ }\n }, [client]);\n\n const handleCreateProject = async (values: Record<string, string>) => {\n setSubmitting(true);\n try {\n await createProject({\n name: `eval-${assistantId}`,\n judgeModelConfig: { modelKey: values.modelKey || \"\" },\n targetServerConfig: { base_url: \"\", api_key: \"\", targetAgentId: assistantId },\n });\n await Promise.resolve(onEvalInvalidatedRef.current?.()).catch(() => undefined);\n form.resetFields();\n setModalOpen(false);\n } catch (err) {\n // 409 (already exists), 400 (judge model), or 500 must surface;\n // useEvalProjects.create only refreshes the list on success, so a\n // failed create without this toast would strand the panel in the\n // empty state with no feedback.\n message.error(err instanceof Error ? err.message : \"Failed to create eval project\");\n } finally {\n setSubmitting(false);\n }\n };\n\n const navTo = (p: Page, sid?: string, rid?: string) => {\n setTarget((current) => ({\n page: p,\n suiteId: sid ?? current.suiteId,\n runId: rid ?? current.runId,\n }));\n };\n\n const handleAddSuite = async () => {\n if (!suiteName.trim()) return;\n await createSuite(projectId, { name: suiteName.trim() });\n setSuiteRefreshKey((value) => value + 1);\n await onEvalInvalidated?.();\n setSuiteName(\"\");\n setShowAdd(false);\n };\n\n const handleRunAll = async (rc: { workspaceId?: string; projectId?: string }) => {\n const r = await start(projectId, buildRunConfig(rc.projectId));\n if (r?.run_id) {\n await Promise.resolve(onEvalInvalidated?.()).catch(() => undefined);\n navTo(\"run\", undefined, r.run_id);\n }\n };\n\n const createModal = (\n <Modal\n title=\"Create Eval Project\"\n open={modalOpen}\n onCancel={() => { form.resetFields(); setModalOpen(false); }}\n footer={null}\n destroyOnHidden\n width={480}\n >\n <Form form={form} layout=\"vertical\" onFinish={handleCreateProject} initialValues={{ name: `eval-${assistantId}` }}>\n <Form.Item name=\"name\" label=\"Project Name\">\n <Input disabled />\n </Form.Item>\n <Form.Item name=\"modelKey\" label=\"Judge Model\" rules={[{ required: true, message: \"Please select a judge model\" }]}>\n <Select\n placeholder=\"Select a registered model\"\n options={models.map((m) => {\n const model = m as { key?: string; displayName?: string; model?: string };\n return { value: model.key, label: `${model.displayName || model.key} (${model.model || \"\"})` };\n })}\n />\n </Form.Item>\n <Form.Item style={{ marginBottom: 0, textAlign: \"right\" }}>\n <Button onClick={() => { form.resetFields(); setModalOpen(false); }} style={{ marginRight: 8 }}>\n Cancel\n </Button>\n <Button type=\"primary\" htmlType=\"submit\" loading={submitting}>\n Create\n </Button>\n </Form.Item>\n </Form>\n </Modal>\n );\n\n if (loading) {\n return <div style={{ display: \"flex\", justifyContent: \"center\", alignItems: \"center\", height: \"100%\" }}><Spin /></div>;\n }\n\n if (!project) {\n return (\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", alignItems: \"center\", justifyContent: \"center\", gap: 16, background: \"#fff\" }}>\n <Empty description={<Text type=\"secondary\">This agent has no eval project yet</Text>} />\n <Button type=\"primary\" icon={<PlusOutlined />} onClick={() => { void loadModels(); setModalOpen(true); }}>\n Create eval project\n </Button>\n {createModal}\n </div>\n );\n }\n\n return (\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", background: \"#f5f5f5\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", padding: \"12px 24px\", background: \"#fff\", borderBottom: \"1px solid #f0f0f0\", flexShrink: 0 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}>\n <ExperimentOutlined style={{ color: \"#6366f1\", fontSize: 18 }} />\n <span style={{ fontSize: 15, fontWeight: 600 }}>{projectName}</span>\n <Tag color=\"purple\">eval</Tag>\n </div>\n {page === \"suites\" && (\n <div style={{ display: \"flex\", gap: 8 }}>\n <Button icon={<PlusOutlined />} onClick={() => setShowAdd((v) => !v)}>New Suite</Button>\n <Button type=\"primary\" icon={<CaretRightOutlined />} onClick={() => setRunEnvOpen(true)}>Run All</Button>\n </div>\n )}\n </div>\n {page === \"suites\" && showAdd && (\n <div style={{ padding: \"12px 24px\", borderBottom: \"1px solid #f0f0f0\", display: \"flex\", gap: 8, background: \"#fff\" }}>\n <input\n type=\"text\"\n placeholder=\"Suite name\"\n value={suiteName}\n onChange={(e) => setSuiteName(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && void handleAddSuite()}\n autoFocus\n style={{ width: 260, padding: \"6px 12px\", border: \"1px solid #d9d9d9\", borderRadius: 8, fontSize: 14, outline: \"none\" }}\n />\n <Button type=\"primary\" size=\"small\" onClick={() => void handleAddSuite()}>Create</Button>\n <Button size=\"small\" onClick={() => setShowAdd(false)}>Cancel</Button>\n </div>\n )}\n <div style={{ flex: 1, overflow: \"auto\", padding: 28 }}>\n {page === \"suites\" && <EvalSuiteCardList key={`${projectId}:${suiteRefreshKey}`} projectId={projectId} onSelectSuite={(_, sid) => navTo(\"suite\", sid)} onEvalInvalidated={onEvalInvalidated} />}\n {page === \"suite\" && suiteId && (\n <EvalSuiteDetail\n projectId={projectId}\n suiteId={suiteId}\n onBack={() => navTo(\"suites\")}\n onRun={(rid) => {\n void Promise.resolve(onEvalInvalidated?.()).catch(() => undefined);\n navTo(\"run\", undefined, rid);\n }}\n onEvalInvalidated={onEvalInvalidated}\n />\n )}\n {page === \"run\" && runId && <EvalRunResults runId={runId} onBack={() => navTo(\"suites\")} onRunSettled={onEvalInvalidated} />}\n </div>\n <RunEnvModal\n open={runEnvOpen}\n onClose={() => setRunEnvOpen(false)}\n onRun={handleRunAll}\n />\n </div>\n );\n};\n","/**\n * Locate the eval project associated with an agent.\n *\n * An eval project is agent-agnostic by design (it can exercise multiple\n * agents, sub-agents, workflows) — the association is the agent's\n * \"designated verifier\", recorded as a pointer, not owned by the project.\n *\n * Lookup order:\n * 1. `targetServerConfig.targetAgentId` pointer (written by manage_eval\n * create_project when given targetAgentId) — the structural link.\n * 2. `eval-{assistantId}` name convention — legacy projects.\n * 3. description containing the assistantId — tolerated drift (architect\n * sometimes records the target only in free text).\n */\nexport interface EvalProjectLike {\n name?: string;\n description?: string | null;\n targetServerConfig?: Record<string, unknown>;\n}\n\nexport function findAgentEvalProject<T extends EvalProjectLike>(\n projects: T[],\n assistantId: string\n): T | null {\n return (\n projects.find((p) => p.targetServerConfig?.targetAgentId === assistantId) ??\n projects.find((p) => p.name === `eval-${assistantId}`) ??\n projects.find((p) => typeof p.description === \"string\" && p.description.includes(assistantId)) ??\n null\n );\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Spin } from \"antd\";\nimport { RuntimeAxiomClient } from \"@axiom-lattice/client-sdk\";\nimport type { Assistant, Client as SdkClient, ClientConfig as SdkClientConfig } from \"@axiom-lattice/client-sdk\";\nimport { AgentWebAppRuntimeClient } from \"../client\";\nimport { AgentWebAppRuntimeClientError } from \"../error\";\nimport type { AgentWebAppIdentity } from \"../AgentWebAppProvider\";\nimport type { AgentWebAppBootstrap } from \"../types\";\nimport { AxiomLatticeProvider } from \"../../../context\";\nimport { AssistantContext, useAssistantContext } from \"../../../components/Chat/AssistantContext\";\nimport type { AssistantContextValue } from \"../../../components/Chat/AssistantContext\";\nimport { ConversationContextProvider, useConversationContext } from \"../../../components/Chat/ConversationContext\";\nimport { LatticeChat } from \"../../../components/Chat/LatticeChat\";\nimport type { EmbedChatMessageHandler, EmbedChatReadyHandler } from \"../../../components/Chat/EmbedChatBridge\";\nimport { LatticeChatShellContextProvider } from \"../../../components/Chat/LatticeChatShellContext\";\nimport type { LatticeChatShellConfig } from \"../../../components/Chat/LatticeChatShellContext\";\nimport { AgentChatSidebar } from \"./AgentChatSidebar\";\nimport { installRuntimeUploadAuth } from \"./runtimeUploadAuth\";\n/**\n * Props for {@link AgentChatApp}.\n *\n * Mirrors {@link import(\"../AgentWebAppProvider\").AgentWebAppProviderProps} so the\n * component is a drop-in for host applications, but it renders the full Console\n * chat stack (`ConversationContext` + `LatticeChat`) against the web-app runtime\n * instead of composing the lightweight `Widget*` components.\n */\nexport interface AgentChatAppProps {\n gatewayUrl: string;\n webAppId: string;\n identity: AgentWebAppIdentity;\n /**\n * Called for bootstrap/startup errors (mapped to a stable error code the host\n * can turn into a friendly message).\n */\n onError?: (error: AgentWebAppRuntimeClientError) => void;\n /** Called once the chat can accept programmatic sends (thread ready). */\n onChatReady?: EmbedChatReadyHandler;\n /** Fired for each accepted human message and each completed AI reply. */\n onChatMessage?: EmbedChatMessageHandler;\n /** Test seam for the HTTP layer (bootstrap + runtime console mirror). */\n fetch?: typeof globalThis.fetch;\n /** Class name applied to the root chat shell. */\n className?: string;\n /** Host-supplied chat welcome text; overrides the publication appearance. */\n welcome?: string;\n /** Host-supplied quick prompts; overrides the publication appearance entirely. */\n quickPrompts?: Array<{ label: string; text: string }>;\n}\n\n/** Resolves the effective welcome/quicks with host-over-publication precedence. */\nexport function resolveChatConfig(\n host: Pick<AgentChatAppProps, \"welcome\" | \"quickPrompts\">,\n appearance: AgentWebAppBootstrap[\"webApp\"][\"appearance\"],\n): { welcome?: string; quickPrompts: Array<{ label: string; text: string }> } {\n const hostWelcome = nonEmpty(host.welcome);\n const welcome = hostWelcome ?? nonEmpty(appearance.welcomeMessage);\n const quickPrompts = host.quickPrompts ?? appearance.quickPrompts ?? [];\n return { ...(welcome !== undefined ? { welcome } : {}), quickPrompts };\n}\n\nfunction nonEmpty(value: string | undefined): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction validateProps(props: AgentChatAppProps): void {\n if (!props.gatewayUrl.trim()) throw new Error(\"AgentChatApp requires gatewayUrl\");\n try { new URL(props.gatewayUrl); } catch { throw new Error(\"AgentChatApp gatewayUrl must be a valid URL\"); }\n if (!props.webAppId.trim()) throw new Error(\"AgentChatApp requires webAppId\");\n if (props.identity.mode === \"unverified\") {\n if (!props.identity.userId.trim()) throw new Error(\"AgentChatApp requires identity.userId\");\n } else if (typeof props.identity.tokenProvider !== \"function\") {\n throw new Error(\"AgentChatApp requires identity.tokenProvider\");\n }\n if (!props.fetch && typeof globalThis.fetch !== \"function\") throw new Error(\"AgentChatApp requires a fetch implementation\");\n}\n\nfunction runtimeError(error: unknown): AgentWebAppRuntimeClientError {\n if (error instanceof AgentWebAppRuntimeClientError) return error;\n return new AgentWebAppRuntimeClientError(\"INTERNAL_ERROR\", \"Request failed\", true);\n}\n\nfunction identityScopeKey(identity: AgentWebAppIdentity): string {\n return identity.mode === \"unverified\" ? `unverified:${identity.userId}` : \"verified:token\";\n}\n\n/**\n * Public Web App chat shell that reuses the unmodified Console chat stack\n * (`LatticeChat` + `Chating` + `ConversationContext`) against the gateway's\n * `/runtime` console mirror via a {@link RuntimeAxiomClient}.\n *\n * Console management chrome (skill/database/agent/metrics/model slots,\n * workspace project selector, sidebar menus) is disabled through shell\n * configuration; thread creation/listing stay enabled so the Console\n * conversation contract works unchanged.\n */\nexport function AgentChatApp(props: AgentChatAppProps): React.ReactElement {\n validateProps(props);\n const scopeKey = `${props.gatewayUrl}\\u0000${props.webAppId}\\u0000${identityScopeKey(props.identity)}`;\n return <ScopedAgentChatApp key={scopeKey} {...props} />;\n}\n\nfunction ScopedAgentChatApp({ gatewayUrl, webAppId, identity, onError, onChatReady, onChatMessage, fetch: fetchImplementation, className, welcome, quickPrompts }: AgentChatAppProps): React.ReactElement {\n const [state, setState] = useState<{ status: \"loading\" } | { status: \"error\"; error: AgentWebAppRuntimeClientError } | { status: \"ready\"; bootstrap: AgentWebAppBootstrap }>({ status: \"loading\" });\n const identityRef = useRef(identity);\n identityRef.current = identity;\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n const clientRef = useRef<AgentWebAppRuntimeClient>();\n if (!clientRef.current) {\n clientRef.current = new AgentWebAppRuntimeClient({\n gatewayUrl,\n webAppId,\n identityProvider: {\n getIdentity: async () => {\n const current = identityRef.current;\n if (current.mode !== \"verified\") return { externalUserId: current.userId };\n try {\n return { bearerToken: await current.tokenProvider() };\n } catch {\n throw new AgentWebAppRuntimeClientError(\"USER_ID_REQUIRED\", \"Identity token provider failed\", true);\n }\n },\n },\n ...(fetchImplementation ? { fetch: fetchImplementation } : {}),\n });\n }\n\n // Console-stack attachment uploads go through antd XHR (no identity header);\n // inject the web-app identity for this runtime on those requests.\n useEffect(() => installRuntimeUploadAuth({ gatewayUrl, webAppId, identity }), [gatewayUrl, webAppId, identity]);\n\n useEffect(() => {\n let cancelled = false;\n const client = clientRef.current as AgentWebAppRuntimeClient;\n void (async () => {\n try {\n const bootstrap = await client.bootstrap({});\n if (cancelled) return;\n setState({ status: \"ready\", bootstrap });\n } catch (error) {\n if (cancelled) return;\n const normalized = runtimeError(error);\n setState({ status: \"error\", error: normalized });\n onErrorRef.current?.(normalized);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, []);\n\n if (state.status === \"loading\") return <div className={className} />;\n if (state.status === \"error\") {\n return (\n <div className={className} role=\"alert\">\n <strong>Unable to load the assistant</strong>\n <div>{state.error.code}</div>\n <button type=\"button\" onClick={() => setState({ status: \"loading\" })}>Retry</button>\n </div>\n );\n }\n return (\n <RuntimeChatShell\n className={className}\n gatewayUrl={gatewayUrl}\n webAppId={webAppId}\n identity={identity}\n bootstrap={state.bootstrap}\n onChatReady={onChatReady}\n onChatMessage={onChatMessage}\n welcome={welcome}\n quickPrompts={quickPrompts}\n />\n );\n}\n\nfunction toAssistant(assistant: AgentWebAppBootstrap[\"webApp\"][\"assistant\"]): Assistant {\n return {\n id: assistant.id,\n name: assistant.name,\n ...(assistant.description !== undefined ? { description: assistant.description } : {}),\n graphDefinition: undefined,\n createdAt: new Date(0),\n updatedAt: new Date(0),\n };\n}\n\nfunction RuntimeChatShell({ gatewayUrl, webAppId, identity, bootstrap, onChatReady, onChatMessage, className, welcome, quickPrompts }: {\n gatewayUrl: string;\n webAppId: string;\n identity: AgentWebAppIdentity;\n bootstrap: AgentWebAppBootstrap;\n onChatReady?: EmbedChatReadyHandler;\n onChatMessage?: EmbedChatMessageHandler;\n className?: string;\n welcome?: string;\n quickPrompts?: Array<{ label: string; text: string }>;\n}): React.ReactElement {\n const assistant = useMemo(() => toAssistant(bootstrap.webApp.assistant), [bootstrap.webApp.assistant]);\n const resolvedConfig = useMemo(\n () => resolveChatConfig({ welcome, quickPrompts }, bootstrap.webApp.appearance),\n [welcome, quickPrompts, bootstrap.webApp.appearance],\n );\n const runtimeIdentity = useMemo(\n () => identity.mode === \"unverified\"\n ? { mode: \"unverified\" as const, userId: identity.userId }\n : { mode: \"verified\" as const, tokenProvider: identity.tokenProvider },\n [identity],\n );\n\n const createClient = useCallback((config: SdkClientConfig): SdkClient => (\n new RuntimeAxiomClient({\n gatewayUrl,\n webAppId,\n identity: runtimeIdentity,\n assistantId: config.assistantId,\n transport: config.transport,\n ...(config.timeout !== undefined ? { timeout: config.timeout } : {}),\n ...(config.headers !== undefined ? { headers: config.headers } : {}),\n })\n ), [gatewayUrl, webAppId, runtimeIdentity]);\n\n const shellConfig = useMemo((): Partial<LatticeChatShellConfig> => ({\n baseURL: `${gatewayUrl.replace(/\\/$/, \"\")}/api/web-apps/${webAppId}/runtime`,\n apiKey: \"\",\n transport: \"sse\",\n assistantId: assistant.id,\n enableSkillSlot: false,\n enableDatabaseSlot: false,\n enableAgentSlot: false,\n enableMetricsDataSourceSlot: false,\n enableModelSelector: false,\n enableWorkspace: false,\n enableCustomMenu: false,\n showSideMenu: false,\n enableAssistantCreation: false,\n enableAssistantEditing: false,\n enableThreadCreation: true,\n enableThreadList: true,\n }), [assistant.id, gatewayUrl, webAppId]);\n\n const assistantValue = useMemo((): AssistantContextValue => ({\n assistants: [assistant],\n currentAssistant: assistant,\n isLoading: false,\n error: null,\n listAssistants: async () => undefined,\n getAssistant: async () => assistant,\n createAssistant: async () => { throw new Error(\"Not implemented in a Web App\"); },\n updateAssistant: async () => { throw new Error(\"Not implemented in a Web App\"); },\n deleteAssistant: async () => undefined,\n selectAssistant: async () => undefined,\n clearCurrentAssistant: () => undefined,\n refresh: async () => undefined,\n }), [assistant]);\n\n return (\n <AxiomLatticeProvider\n config={{ baseURL: shellConfig.baseURL as string, apiKey: \"\", assistantId: \"__BASE__\", transport: \"sse\" }}\n createClient={createClient}\n >\n <LatticeChatShellContextProvider initialConfig={shellConfig} persistToLocalStorage={false}>\n <AssistantContext.Provider value={assistantValue}>\n <ConversationContextProvider>\n <ScopedChatContent\n className={className}\n onChatReady={onChatReady}\n onChatMessage={onChatMessage}\n welcome={resolvedConfig.welcome}\n quickPrompts={resolvedConfig.quickPrompts}\n />\n </ConversationContextProvider>\n </AssistantContext.Provider>\n </LatticeChatShellContextProvider>\n </AxiomLatticeProvider>\n );\n}\n\n/**\n * Scoped chat content mirroring {@link import(\"../../../components/Chat/ProjectScopedChating\").ProjectScopedChating}:\n * the active conversation thread and assistant identity come from the scoped\n * contexts, and the chat shell renders with a lightweight thread menu on the\n * left (ConversationContext-backed) instead of Console workspace chrome.\n */\nfunction ScopedChatContent({ className, onChatReady, onChatMessage, welcome, quickPrompts = [] }: {\n className?: string;\n onChatReady?: EmbedChatReadyHandler;\n onChatMessage?: EmbedChatMessageHandler;\n welcome?: string;\n quickPrompts?: Array<{ label: string; text: string }>;\n}): React.ReactElement | null {\n const { threadId } = useConversationContext();\n const { currentAssistant } = useAssistantContext();\n\n if (!currentAssistant) return null;\n\n const resolvedThreadId = threadId ?? \"\";\n if (!resolvedThreadId) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n }}\n >\n <Spin tip=\"Creating conversation...\" />\n </div>\n );\n }\n\n return (\n <div className={className}>\n <LatticeChat\n thread_id={resolvedThreadId}\n assistant_id={currentAssistant.id}\n name={currentAssistant.name}\n description={currentAssistant.description}\n menu={<AgentChatSidebar />}\n showProjectSelector={false}\n showSkillSlot={false}\n showDatabaseSlot={false}\n showAgentSlot={false}\n showMetricsDataSourceSlot={false}\n headerRight={null}\n emptyStateGreeting={welcome ? <span>{welcome}</span> : undefined}\n senderPromptsItems={quickPrompts.length > 0\n ? quickPrompts.map((prompt, index) => ({ key: `quick-${index}`, label: prompt.label, description: prompt.text }))\n : undefined}\n showSkillPrompts={false}\n showQuickAnalysis={false}\n onChatReady={onChatReady}\n onChatMessage={onChatMessage}\n />\n </div>\n );\n}\n","import React, { useCallback, useEffect } from \"react\";\nimport { History, PlusCircle } from \"lucide-react\";\nimport { Menu } from \"../../../components/Chat/Menu\";\nimport { ThreadHistoryMenuContent } from \"../../../components/Chat/ThreadHistoryMenuContent\";\nimport type { SideMenuItemConfig } from \"../../../components/Chat/LatticeChatShellContext\";\nimport { useChatUIContext } from \"../../../components/Chat/ChatUIContext\";\nimport { useConversationContext } from \"../../../components/Chat/ConversationContext\";\n\n/**\n * Web-app console-chat left rail.\n *\n * Reuses the exact Console components: the shared {@link Menu} chrome with the\n * built-in \"New Thread\" action and an inline \"History\" drawer backed by\n * {@link ThreadHistoryMenuContent}.\n *\n * The rail starts collapsed to an icon dock (default). Opening History in the\n * collapsed state EXPANDS the rail into the Console inline form — the history\n * panel then reserves its own width instead of floating a drawer over the chat\n * (no occlusion). The collapse state is shared with {@link ChatUIContext} so\n * ColumnLayout's left column follows the rail.\n */\nexport function AgentChatSidebar(): React.ReactElement {\n const { createThread } = useConversationContext();\n const { menuCollapsed, setMenuCollapsed } = useChatUIContext();\n\n // Start collapsed (icon dock) by default. ChatUIContextProvider has no\n // initializer, so seed the shared state once on mount; ColumnLayout reads the\n // same value and collapses its left column to match.\n useEffect(() => {\n if (menuCollapsed === undefined) {\n setMenuCollapsed(true);\n }\n }, [menuCollapsed, setMenuCollapsed]);\n\n const handleNewThread = useCallback(async (): Promise<void> => {\n try {\n await createThread(\"New Thread\");\n } catch (error) {\n console.error(\"Failed to create new thread:\", error);\n }\n }, [createThread]);\n\n const isCollapsed = menuCollapsed ?? true;\n\n const newThreadItem: SideMenuItemConfig = {\n id: \"new-analysis\",\n builtin: \"new-analysis\",\n type: \"action\",\n name: \"New Thread\",\n icon: <PlusCircle size={20} />,\n order: 0,\n };\n const historyToggleItem: SideMenuItemConfig = {\n id: \"thread-history-toggle\",\n type: \"action\",\n name: \"History\",\n icon: <History size={20} />,\n order: 1,\n };\n const historyDrawerItem: SideMenuItemConfig = {\n id: \"thread-history\",\n builtin: \"thread-history\",\n type: \"drawer\",\n name: \"History\",\n icon: <History size={20} />,\n order: 1,\n title: \"Conversation History\",\n width: 320,\n inline: true,\n inlineDefaultExpanded: true,\n content: <ThreadHistoryMenuContent />,\n };\n\n // While collapsed, History is a plain action that expands the rail into the\n // inline Console form (no floating drawer over the chat). Once expanded, the\n // real thread-history drawer item takes over.\n const menuItems: SideMenuItemConfig[] = [\n newThreadItem,\n ...(isCollapsed ? [historyToggleItem] : [historyDrawerItem]),\n ];\n\n return (\n <Menu\n key={isCollapsed ? \"agent-chat-sidebar-collapsed\" : \"agent-chat-sidebar-expanded\"}\n items={menuItems}\n showBranding={false}\n showToggle\n // The \"New Thread\" rail item is the single creation affordance; Menu's\n // separate showNewAnalysis button would duplicate it.\n showNewAnalysis={false}\n defaultExpanded={!isCollapsed}\n collapsed={isCollapsed}\n onCollapsedChange={setMenuCollapsed}\n onNewAnalysis={handleNewThread}\n onItemClick={(item) => {\n if (item.type === \"action\" && item.builtin === \"new-analysis\") {\n void handleNewThread();\n } else if (item.type === \"action\" && item.id === \"thread-history-toggle\") {\n setMenuCollapsed(false);\n }\n }}\n />\n );\n}\n","import type { AgentWebAppIdentity } from \"../AgentWebAppProvider\";\n\n/**\n * Runtime identity header injection for Console-stack uploads.\n *\n * The unmodified Console chat stack uploads attachments through antd's\n * XMLHttpRequest-based Upload, which cannot carry the web-app identity that\n * {@link RuntimeAxiomClient} sends on fetch requests. This installs a scoped\n * XMLHttpRequest interceptor that adds the identity header (external-user id or\n * bearer token) to any request targeting this web app's runtime sandbox upload.\n *\n * Returns a cleanup function. No Console component is modified.\n */\nexport function installRuntimeUploadAuth(options: {\n gatewayUrl: string;\n webAppId: string;\n identity: AgentWebAppIdentity;\n}): () => void {\n if (typeof window === \"undefined\" || typeof XMLHttpRequest === \"undefined\") {\n return () => undefined;\n }\n\n const runtimePrefix = `${options.gatewayUrl.replace(/\\/+$/, \"\")}/api/web-apps/${encodeURIComponent(options.webAppId)}/runtime/`;\n\n const originalOpen = XMLHttpRequest.prototype.open;\n const originalSend = XMLHttpRequest.prototype.send;\n\n const pendingUrl = new WeakMap<XMLHttpRequest, string>();\n\n XMLHttpRequest.prototype.open = function open(this: XMLHttpRequest, method: string, url: string): void {\n pendingUrl.set(this, String(url));\n originalOpen.call(this, method, url, true);\n };\n\n XMLHttpRequest.prototype.send = function send(this: XMLHttpRequest, body?: Document | XMLHttpRequestBodyInit | null): void {\n const url = pendingUrl.get(this) ?? \"\";\n if (!url.startsWith(runtimePrefix) || !/\\/sandbox\\/uploadfile$/.test(url)) {\n originalSend.call(this, body);\n return;\n }\n if (options.identity.mode === \"unverified\") {\n this.setRequestHeader(\"X-Axiom-External-User-Id\", options.identity.userId);\n originalSend.call(this, body);\n return;\n }\n // Verified: resolve the bearer before sending.\n void options.identity.tokenProvider()\n .then((token) => {\n this.setRequestHeader(\"Authorization\", `Bearer ${token}`);\n originalSend.call(this, body);\n })\n .catch(() => {\n originalSend.call(this, body);\n });\n };\n\n return () => {\n XMLHttpRequest.prototype.open = originalOpen;\n XMLHttpRequest.prototype.send = originalSend;\n };\n}\n","import type { GovernanceAgentType } from \"./types\";\n\nexport type ConfigNodeType = \"agent\" | \"tool\" | \"capability\" | \"subagent\" | \"skill\" | \"model\" | \"eval\";\n\nexport interface ConfigGraphNode {\n id: string;\n type: ConfigNodeType;\n label: string;\n description?: string;\n /** Raw config payload (e.g. middleware config, tool schema). */\n config?: unknown;\n /** Agent-side key to jump to in the config panel (section). */\n section?: string;\n}\n\n/** A category container node: holds capability items, one edge from the agent. */\nexport interface ConfigGroup {\n id: string;\n type: ConfigNodeType;\n label: string;\n items: ConfigGraphNode[];\n}\n\nexport interface ConfigGraphData {\n agent: ConfigGraphNode;\n /** Groups with at least one item — or all four when includeEmptyGroups is set. */\n groups: ConfigGroup[];\n}\n\nconst NODE_TYPE_META: Record<ConfigNodeType, { color: string; section?: string }> = {\n agent: { color: \"agent\" },\n tool: { color: \"#06b6d4\", section: \"tools\" },\n capability: { color: \"#6366f1\", section: \"middleware\" },\n subagent: { color: \"#22c55e\", section: \"subagents\" },\n skill: { color: \"#a855f7\", section: \"skills\" },\n model: { color: \"#8c8c8c\" },\n eval: { color: \"#f59e0b\" },\n};\n\nexport function configNodeColor(type: ConfigNodeType): string {\n const meta = NODE_TYPE_META[type];\n if (type === \"agent\") return \"agent\";\n return meta.color;\n}\n\nexport function configNodeSection(type: ConfigNodeType): string | undefined {\n return NODE_TYPE_META[type].section;\n}\n\nexport function getGraphDefinition(def: unknown): Record<string, unknown> {\n return typeof def === \"object\" && def !== null ? (def as Record<string, unknown>) : {};\n}\n\nconst asStrings = (v: unknown): string[] =>\n Array.isArray(v) ? (v as unknown[]).filter((x): x is string => typeof x === \"string\") : [];\n\n/** Synthetic node id for the \"all skills\" pseudo-item when the skill middleware has `readAll: true`. */\nexport const ALL_SKILLS_NODE_ID = \"skill:__all__\";\n\n/**\n * Collect the skills an agent is actually configured with. The live config\n * panel stores the selection inside the `skill` middleware entry\n * (`config.skills` / `config.readAll`), while legacy agents use a top-level\n * `skills` array — read both so the config graph reflects reality.\n */\nfunction collectConfiguredSkills(g: Record<string, unknown>): { ids: string[]; readAll: boolean } {\n const ids: string[] = [];\n const seen = new Set<string>();\n const add = (s: string) => {\n if (seen.has(s)) return;\n seen.add(s);\n ids.push(s);\n };\n\n for (const s of asStrings(g.skills)) add(s);\n\n let readAll = false;\n const middleware = Array.isArray(g.middleware) ? (g.middleware as Record<string, unknown>[]) : [];\n for (const m of middleware) {\n if (m.enabled === false || m.type !== \"skill\") continue;\n const cfg = typeof m.config === \"object\" && m.config !== null ? (m.config as Record<string, unknown>) : {};\n if (cfg.readAll === true) readAll = true;\n for (const s of asStrings(cfg.skills)) add(s);\n }\n\n return { ids, readAll };\n}\n\n/**\n * Build a configuration graph from an agent's graphDefinition:\n * one center agent node + one container node per capability category\n * (tools / middleware / subagents / skills / model). The agent only\n * connects to category containers, not to every single item — keeps\n * the graph readable when an agent has many capabilities.\n */\nexport function buildAgentConfigGraphData(\n def: unknown,\n options?: { includeEmptyGroups?: boolean },\n): ConfigGraphData {\n const g = getGraphDefinition(def);\n const agentKey = typeof g.key === \"string\" ? g.key : \"agent\";\n const agentType = (g.type as GovernanceAgentType | undefined) ?? \"capability\";\n\n const agent: ConfigGraphNode = {\n id: agentKey,\n type: \"agent\",\n label: (g.name as string) || agentKey,\n description: (g.description as string) || undefined,\n config: {\n name: (g.name as string) || agentKey,\n type: agentType,\n description: (g.description as string) || \"\",\n modelKey: (g.modelKey as string) || \"\",\n prompt: (g.prompt as string) || \"\",\n version: ((g.metadata as Record<string, string> | undefined)?.version) || \"\",\n },\n };\n\n const make = (type: ConfigNodeType, id: string, label: string, description?: string, config?: unknown): ConfigGraphNode =>\n ({ id, type, label, description, config });\n\n const tools: ConfigGraphNode[] = asStrings(g.tools).map((t) => make(\"tool\", `tool:${t}`, t));\n // Explicitly disabled middleware items (enabled === false) are hidden — they\n // do not participate in the agent's runtime capability ring. Enabled,\n // absent, or undefined stay visible.\n const capabilities: ConfigGraphNode[] = (Array.isArray(g.middleware) ? (g.middleware as Record<string, unknown>[]) : [])\n .filter((m) => m.enabled !== false)\n .map((m) => {\n const type = typeof m.type === \"string\" ? m.type : \"unknown\";\n return make(\"capability\", `cap:${type}`, (m.name as string) || type, (m.description as string) || undefined, m);\n });\n const subagents: ConfigGraphNode[] = asStrings(g.subAgents).map((s) => make(\"subagent\", `sub:${s}`, s));\n const { ids: configuredSkillIds, readAll } = collectConfiguredSkills(g);\n const skills: ConfigGraphNode[] = [\n ...(readAll ? [make(\"skill\", ALL_SKILLS_NODE_ID, \"All skills\", \"Agent can load any available skill\")] : []),\n ...configuredSkillIds.map((s) => make(\"skill\", `skill:${s}`, s)),\n ];\n\n const allGroups: ConfigGroup[] = [\n { id: \"group:tools\", type: \"tool\" as const, label: \"Tools\", items: tools },\n { id: \"group:capabilities\", type: \"capability\" as const, label: \"Capabilities\", items: capabilities },\n { id: \"group:subagents\", type: \"subagent\" as const, label: \"Sub-Agents\", items: subagents },\n { id: \"group:skills\", type: \"skill\" as const, label: \"Skills\", items: skills },\n ];\n const groups = options?.includeEmptyGroups ? allGroups : allGroups.filter((grp) => grp.items.length > 0);\n\n return { agent, groups };\n}\n","import React, { useMemo, useCallback } from \"react\";\nimport { Spin } from \"antd\";\nimport { Activity, FlaskConical, TrendingUp, Bot, MessageCircle } from \"lucide-react\";\nimport type { EChartsOption } from \"echarts\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { useEvalProjects } from \"../../hooks/eval/useEvalProjects\";\nimport { useEvalSuites } from \"../../hooks/eval/useEvalSuites\";\nimport { useEvalRuns } from \"../../hooks/eval/useEvalRuns\";\nimport type { EvalRunRecord } from \"../../hooks/eval/evalTypes\";\nimport { findAgentEvalProject, type EvalProjectLike } from \"./evalProjectRef\";\nimport { buildImprovementQuality, compareEvalRunsChronologically } from \"./improvementQuality\";\nimport { EntityCard } from \"../EntityList/EntityCard\";\nimport { StatCell } from \"../GenUI/elements/eval_manage_card\";\nimport { EChart } from \"./EChart\";\nimport type { Assistant } from \"@axiom-lattice/client-sdk\";\n\nexport interface AgentOverviewProps {\n assistantId: string;\n assistant: Assistant;\n}\n\n/** Aggregated assistant thread activity, including request status. */\nexport interface ThreadStatsState {\n total: number;\n last7d: number;\n last30d: number;\n lastActive: Date | null;\n daily7d: number[];\n daily30d: number[];\n loading: boolean;\n error: Error | null;\n}\n\nconst EMPTY_THREAD_STATS: ThreadStatsState = {\n total: 0,\n last7d: 0,\n last30d: 0,\n lastActive: null,\n daily7d: [],\n daily30d: [],\n loading: true,\n error: null,\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\nconst timestamp = (value: unknown, now: number): number | null => {\n if (!(typeof value === \"string\" || typeof value === \"number\" || value instanceof Date)) return null;\n const parsed = new Date(value).getTime();\n return Number.isFinite(parsed) && parsed <= now ? parsed : null;\n};\n\n/** Returns local midnight for the calendar day containing the date. */\nexport const localDayStart = (date: Date): Date =>\n new Date(date.getFullYear(), date.getMonth(), date.getDate());\n\nconst localDayOrdinal = (date: Date): number => {\n const start = localDayStart(date);\n return Math.floor(Date.UTC(start.getFullYear(), start.getMonth(), start.getDate()) / 86400000);\n};\n\n/** Whole local calendar days from earlier to later, independent of DST day length. */\nexport const localDayDifference = (later: Date, earlier: Date): number =>\n localDayOrdinal(later) - localDayOrdinal(earlier);\n\n/** Fetches and aggregates thread activity for an assistant. */\nexport function useThreadStats(assistantId: string): ThreadStatsState {\n const { get } = useApi();\n const [state, setState] = React.useState<ThreadStatsState>(EMPTY_THREAD_STATS);\n const generationRef = React.useRef(0);\n const assistantIdRef = React.useRef(assistantId);\n assistantIdRef.current = assistantId;\n\n React.useEffect(() => {\n const generation = ++generationRef.current;\n let active = true;\n const ownsRequest = (): boolean =>\n active && generationRef.current === generation && assistantIdRef.current === assistantId;\n\n setState((current) => ({ ...current, loading: true, error: null }));\n void (async () => {\n try {\n const response = await get<unknown>(`/api/assistants/${assistantId}/threads`);\n if (!isRecord(response) || response.success !== true || !isRecord(response.data)) {\n throw new Error(\"Invalid thread list response\");\n }\n const { records, total } = response.data;\n if (!Array.isArray(records) || typeof total !== \"number\" || !Number.isSafeInteger(total) || total < 0) {\n throw new Error(\"Invalid thread list response\");\n }\n\n const now = Date.now();\n const nowDate = new Date(now);\n let lastActiveMs: number | null = null;\n let last7d = 0;\n let last30d = 0;\n const daily7d = new Array<number>(7).fill(0);\n const daily30d = new Array<number>(30).fill(0);\n for (const thread of records) {\n if (!isRecord(thread)) continue;\n const created = timestamp(thread.createdAt, now);\n if (created !== null) {\n const dayIndex = localDayDifference(nowDate, new Date(created));\n if (dayIndex >= 0 && dayIndex < 7) {\n last7d++;\n daily7d[6 - dayIndex]++;\n }\n if (dayIndex >= 0 && dayIndex < 30) {\n last30d++;\n daily30d[29 - dayIndex]++;\n }\n }\n const updated = timestamp(thread.updatedAt, now);\n if (updated !== null && (lastActiveMs === null || updated > lastActiveMs)) lastActiveMs = updated;\n }\n if (!ownsRequest()) return;\n setState({\n total,\n last7d,\n last30d,\n lastActive: lastActiveMs === null ? null : new Date(lastActiveMs),\n daily7d,\n daily30d,\n loading: false,\n error: null,\n });\n } catch (error) {\n if (!ownsRequest()) return;\n setState({\n ...EMPTY_THREAD_STATS,\n loading: false,\n error: error instanceof Error ? error : new Error(\"Failed to load thread activity\"),\n });\n }\n })();\n\n return () => {\n active = false;\n if (generationRef.current === generation) generationRef.current++;\n };\n }, [get, assistantId]);\n\n return state;\n}\n\n/** Formats a thread activity timestamp relative to now. */\nexport function relativeTime(date: Date | null): string {\n if (!date) return \"—\";\n const diff = Date.now() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n if (minutes < 1) return \"just now\";\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days < 30) return `${days}d ago`;\n if (days < 365) return `${Math.floor(days / 30)}mo ago`;\n return `${Math.floor(days / 365)}y ago`;\n}\n\nexport interface EvalQualityData {\n /** Agent-owned Eval Project used for run association and streaming. */\n evalProjectId?: string;\n /** Project that owns the currently published run inventory. */\n inventoryProjectId: string | null;\n suiteCount: number;\n caseCount: number;\n scores: number[];\n latest?: EvalRunRecord;\n /** Raw run records, oldest → newest (round grouping / holdout filtering need taskId/holdout). */\n runs: EvalRunRecord[];\n runCount: number;\n passRate: number | null;\n score: number | null;\n hasEvalProject: boolean;\n /** Test suite names (for the config graph eval group). */\n suiteNames: string[];\n /** Retained-data warning from the composed eval inventory hooks. */\n error: Error | null;\n /** True until the project pointer and its relevant suite/run inventory are authoritative. */\n loading: boolean;\n /** Refreshes only the shared run inventory and returns its authoritative records. */\n refreshRuns: () => Promise<EvalRunRecord[]>;\n}\n\n/** Eval metrics for an agent (pointer → naming convention, shared by overview + graph cards). */\nexport function useEvalQuality(assistantId: string): EvalQualityData & { refresh: () => Promise<void> } {\n const { projects, loading: projectsLoading, error: projectsError, refresh: refreshProjects } = useEvalProjects();\n const evalProject = findAgentEvalProject(projects as Array<EvalProjectLike & { id: string }>, assistantId);\n const projectId = evalProject?.id ?? \"\";\n const { suites, loading: suitesLoading, error: suitesError, refresh: refreshSuites } = useEvalSuites(projectId);\n const { runs, inventoryProjectId, loading: runsLoading, error: runsError, refresh: refreshRuns } = useEvalRuns(projectId);\n\n const refresh = useCallback(async () => {\n await Promise.all([refreshProjects(), refreshSuites(), refreshRuns()]);\n }, [refreshProjects, refreshSuites, refreshRuns]);\n\n const data = useMemo(() => {\n const caseCount = (suites as Record<string, unknown>[]).reduce((s, x) => s + (x.caseCount as number ?? 0), 0);\n const projectRuns = inventoryProjectId === projectId\n ? runs.filter((run) => run.projectId === projectId)\n : [];\n const sorted = [...projectRuns].sort(compareEvalRunsChronologically);\n const quality = buildImprovementQuality(projectRuns);\n const latest = quality.latest\n ? projectRuns.find((run) => run.id === quality.latest?.runId)\n : undefined;\n return {\n evalProjectId: evalProject?.id,\n inventoryProjectId,\n suiteCount: (suites as unknown[]).length,\n caseCount,\n scores: quality.trend.map((point) => point.score),\n latest,\n runs: sorted,\n runCount: projectRuns.length,\n passRate: quality.passRate,\n score: quality.latest?.score ?? null,\n hasEvalProject: !!evalProject,\n suiteNames: (suites as Array<{ name?: string }>).map((s) => s.name ?? \"Unnamed\").filter(Boolean),\n error: projectsError ?? suitesError ?? runsError,\n loading: Boolean(projectsLoading || (projectId && (inventoryProjectId !== projectId || suitesLoading || runsLoading))),\n };\n }, [suites, runs, inventoryProjectId, evalProject, projectId, projectsLoading, suitesLoading, runsLoading, projectsError, suitesError, runsError]);\n\n return { ...data, refresh, refreshRuns };\n}\n\n/** Local calendar-date labels ending on the supplied date, oldest to newest. */\nexport const localDateLabels = (n: number, today: Date = new Date()): string[] => {\n const out: string[] = [];\n for (let i = n - 1; i >= 0; i--) {\n const date = new Date(today.getFullYear(), today.getMonth(), today.getDate() - i);\n out.push([\n String(date.getFullYear()).padStart(4, \"0\"),\n String(date.getMonth() + 1).padStart(2, \"0\"),\n String(date.getDate()).padStart(2, \"0\"),\n ].join(\"-\"));\n }\n return out;\n};\n\nconst lastNDayLabels = (n: number): string[] =>\n localDateLabels(n).map((label) => label.slice(5));\n\nconst indigo = \"#6366f1\";\nconst green = \"#22c55e\";\nconst orange = \"#f59e0b\";\nconst red = \"#ef4444\";\n\nconst baseGrid = { left: 8, right: 8, top: 24, bottom: 24, containLabel: true } as const;\n\n/** Builds the 30-day thread activity bar chart. */\nexport function runtimeBarOption(daily30d: number[]): EChartsOption {\n return {\n grid: baseGrid,\n tooltip: { trigger: \"axis\" },\n xAxis: {\n type: \"category\",\n data: lastNDayLabels(daily30d.length),\n axisLabel: { fontSize: 9, interval: 4, color: \"#999\" },\n axisLine: { lineStyle: { color: \"#eee\" } },\n },\n yAxis: {\n type: \"value\",\n minInterval: 1,\n axisLabel: { fontSize: 9, color: \"#999\" },\n splitLine: { lineStyle: { color: \"#f5f5f5\" } },\n },\n series: [{\n type: \"bar\",\n data: daily30d,\n itemStyle: { color: indigo, borderRadius: [2, 2, 0, 0] },\n barMaxWidth: 10,\n }],\n };\n}\n\n/** Score trend line (shared by overview + canvas dash overlay). */\nexport function scoreLineOption(scores: number[]): EChartsOption {\n const min = Math.min(...scores, 0);\n const max = Math.max(...scores, 100);\n return {\n grid: baseGrid,\n tooltip: { trigger: \"axis\" },\n xAxis: {\n type: \"category\",\n data: scores.map((_, i) => `#${i + 1}`),\n axisLabel: { fontSize: 9, color: \"#999\", interval: 0 },\n axisLine: { lineStyle: { color: \"#eee\" } },\n },\n yAxis: {\n type: \"value\",\n min: Math.max(0, min - 10),\n max: Math.min(100, max + 10),\n axisLabel: { fontSize: 9, color: \"#999\" },\n splitLine: { lineStyle: { color: \"#f5f5f5\" } },\n },\n series: [{\n type: \"line\",\n data: scores,\n smooth: true,\n symbol: \"circle\",\n symbolSize: 5,\n lineStyle: { color: green, width: 2 },\n itemStyle: { color: green },\n areaStyle: { color: \"rgba(34, 197, 94, 0.08)\" },\n }],\n };\n}\n\nfunction dualBarOption(daily7d: number[], daily30d: number[]): EChartsOption {\n // Last 14 days only, 7d segment highlighted by color.\n const seg = daily30d.slice(-14);\n return {\n grid: baseGrid,\n tooltip: { trigger: \"axis\" },\n xAxis: {\n type: \"category\",\n data: lastNDayLabels(seg.length),\n axisLabel: { fontSize: 9, interval: 2, color: \"#999\" },\n axisLine: { lineStyle: { color: \"#eee\" } },\n },\n yAxis: {\n type: \"value\",\n minInterval: 1,\n axisLabel: { fontSize: 9, color: \"#999\" },\n splitLine: { lineStyle: { color: \"#f5f5f5\" } },\n },\n series: [{\n type: \"bar\",\n data: seg.map((v, i) => ({\n value: v,\n itemStyle: { color: i >= seg.length - 7 ? indigo : \"#c7c7c7\", borderRadius: [2, 2, 0, 0] },\n })),\n barMaxWidth: 12,\n }],\n };\n}\n\nconst dashTitle = { fontSize: 12, fontWeight: 600, color: \"rgba(0,0,0,0.65)\" } as const;\nconst dashDesc = { fontSize: 11, color: \"rgba(0,0,0,0.45)\" } as const;\nconst dashIcon = { width: 34, height: 34, borderRadius: 8, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" } as const;\n\nexport const AgentOverview: React.FC<AgentOverviewProps> = ({ assistantId, assistant }) => {\n const ts = useThreadStats(assistantId);\n const evalData = useEvalQuality(assistantId);\n\n const def = typeof assistant.graphDefinition === \"object\" && assistant.graphDefinition !== null\n ? (assistant.graphDefinition as Record<string, unknown>)\n : {};\n const toolsCount = Array.isArray(def.tools) ? def.tools.length : 0;\n const subAgentsCount = Array.isArray(def.subAgents) ? def.subAgents.length : 0;\n const middlewareCount = Array.isArray(def.middleware) ? def.middleware.length : 0;\n const ageDays = Math.max(0, Math.floor((Date.now() - new Date(assistant.createdAt).getTime()) / 86400000));\n\n const scoreColor = evalData.score === null ? \"#d9d9d9\" : evalData.score >= 80 ? green : evalData.score >= 50 ? orange : red;\n\n if (ts.loading) {\n return <Spin style={{ display: \"block\", margin: \"48px auto\" }} />;\n }\n\n return (\n <div style={{ padding: 24, height: \"100%\", overflow: \"auto\" }}>\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(auto-fill, minmax(340px, 1fr))\", gap: 16 }}>\n {/* ── Runtime ── */}\n <EntityCard\n item={{ id: \"runtime\" }}\n renderIcon={() => (\n <div style={{ ...dashIcon, background: `${indigo}1A`, color: indigo }}><MessageCircle size={17} /></div>\n )}\n renderPrimary={() => <span style={dashTitle}>Runtime</span>}\n renderSecondary={() => <span style={dashDesc}>Conversations · activity</span>}\n renderDetails={() => (\n <div style={{ display: \"flex\", gap: 18 }}>\n <StatCell value={ts.total} label=\"threads\" />\n <StatCell value={ts.last7d} label=\"7d\" />\n <StatCell value={ts.last30d} label=\"30d\" />\n <StatCell value={relativeTime(ts.lastActive)} label=\"last active\" />\n </div>\n )}\n renderFooter={() => (\n <EChart option={runtimeBarOption(ts.daily30d)} height={150} />\n )}\n />\n\n {/* ── Eval Quality ── */}\n <EntityCard\n item={{ id: \"eval\" }}\n renderIcon={() => (\n <div style={{ ...dashIcon, background: `${green}1A`, color: green }}><FlaskConical size={17} /></div>\n )}\n renderPrimary={() => <span style={dashTitle}>Eval Quality</span>}\n renderSecondary={() => <span style={dashDesc}>Quality · score trend</span>}\n renderDetails={() => (\n <div style={{ display: \"flex\", gap: 18 }}>\n <StatCell value={<span style={{ color: scoreColor }}>{evalData.score !== null ? evalData.score.toFixed(1) : \"—\"}</span>} label=\"score\" />\n <StatCell value={evalData.passRate !== null ? `${evalData.passRate}%` : \"—\"} label=\"pass rate\" />\n <StatCell value={evalData.runCount} label=\"runs\" />\n </div>\n )}\n renderFooter={() => (\n evalData.scores.length > 1 ? (\n <EChart option={scoreLineOption(evalData.scores)} height={150} />\n ) : (\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", height: 150, color: \"#bfbfbf\", fontSize: 12 }}>\n {evalData.scores.length === 1 ? \"Single run — trend needs 2+ runs\" : \"No eval runs yet\"}\n </div>\n )\n )}\n />\n\n {/* ── Usage Activity ── */}\n <EntityCard\n item={{ id: \"usage\" }}\n renderIcon={() => (\n <div style={{ ...dashIcon, background: `${orange}1A`, color: orange }}><TrendingUp size={17} /></div>\n )}\n renderPrimary={() => <span style={dashTitle}>Usage Activity</span>}\n renderSecondary={() => <span style={dashDesc}>Last 14 days · dark = last 7</span>}\n renderDetails={() => (\n <div style={{ display: \"flex\", gap: 18 }}>\n <StatCell value={relativeTime(ts.lastActive)} label=\"last active\" />\n <StatCell value={ts.last7d} label=\"7d\" />\n <StatCell value={ts.last30d} label=\"30d\" />\n </div>\n )}\n renderFooter={() => (\n <EChart option={dualBarOption(ts.daily7d, ts.daily30d)} height={150} />\n )}\n />\n\n {/* ── Configuration ── */}\n <EntityCard\n item={{ id: \"config\" }}\n renderIcon={() => (\n <div style={{ ...dashIcon, background: \"#f0f0f0\", color: \"#595959\" }}><Bot size={17} /></div>\n )}\n renderPrimary={() => <span style={dashTitle}>Configuration</span>}\n renderSecondary={() => <span style={dashDesc}>Scale · composition</span>}\n renderDetails={() => (\n <div style={{ display: \"flex\", gap: 18 }}>\n <StatCell value={toolsCount} label=\"tools\" />\n <StatCell value={subAgentsCount} label=\"subagents\" />\n <StatCell value={middlewareCount} label=\"middleware\" />\n <StatCell value={`${ageDays}d`} label=\"age\" />\n </div>\n )}\n renderFooter={() => (\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", height: 150, color: \"#bfbfbf\", fontSize: 12 }}>\n <Activity size={14} style={{ marginRight: 6 }} />\n Static config, no trend\n </div>\n )}\n />\n </div>\n\n {/* Empty eval hint */}\n {!evalData.hasEvalProject && !ts.loading && (\n <div style={{ marginTop: 16, color: \"#bfbfbf\", fontSize: 12 }}>\n This agent has no eval project yet — create one in the Eval Suite tab\n </div>\n )}\n </div>\n );\n};\n","import type { EvalRun, EvalRunResult } from \"@axiom-lattice/protocols\";\n\n/** Eval run as received over JSON, before or after date hydration. */\nexport type EvalRunRecord = Omit<EvalRun, \"createdAt\" | \"startedAt\" | \"completedAt\"> & {\n createdAt: Date | string;\n startedAt?: Date | string;\n completedAt?: Date | string;\n};\n\n/** Eval run result as received over JSON, before or after date hydration. */\nexport type EvalRunResultRecord = Omit<EvalRunResult, \"createdAt\"> & {\n createdAt: Date | string;\n};\n\n/** JSON-safe run detail including its case results. */\nexport type EvalRunDetailRecord = EvalRunRecord & {\n results: EvalRunResultRecord[];\n};\n\n/** Orders runs oldest to newest, placing invalid dates last with a stable ID tie-breaker. */\nexport function compareEvalRunsChronologically(a: EvalRunRecord, b: EvalRunRecord): number {\n const aTime = new Date(a.createdAt).getTime();\n const bTime = new Date(b.createdAt).getTime();\n const aIsValid = Number.isFinite(aTime);\n const bIsValid = Number.isFinite(bTime);\n\n if (aIsValid && !bIsValid) return -1;\n if (!aIsValid && bIsValid) return 1;\n if (aIsValid && bIsValid && aTime !== bTime) return aTime - bTime;\n return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;\n}\n","import { compareEvalRunsChronologically, type EvalRunRecord } from \"../../hooks/eval/evalTypes\";\nexport { compareEvalRunsChronologically } from \"../../hooks/eval/evalTypes\";\n\n/** Classification of score movement between the latest two comparable runs. */\nexport type ImprovementVerdict = \"needs-evidence\" | \"improving\" | \"stable\" | \"regressed\";\n\n/** Normalized quality metrics for one completed evaluation run. */\nexport interface QualityPoint {\n runId: string;\n score: number;\n passRate: number | null;\n createdAt: Date | string;\n taskId?: string;\n}\n\n/** Quality summary, trends, and outstanding run states for an improvement round. */\nexport interface ImprovementQuality {\n verdict: ImprovementVerdict;\n latest?: QualityPoint;\n previous?: QualityPoint;\n delta: number | null;\n passRate: number | null;\n comparisonLabel: \"Latest comparable result\" | \"Latest recorded result\";\n trend: QualityPoint[];\n validationTrend: QualityPoint[];\n runningRuns: EvalRunRecord[];\n failedRuns: EvalRunRecord[];\n}\n\n/**\n * Orders evaluation runs from oldest to newest, placing invalid dates last and\n * using run ID as a deterministic tie-breaker.\n *\n * @param a First evaluation run to compare.\n * @param b Second evaluation run to compare.\n * @returns A negative, positive, or zero value suitable for `Array.sort`.\n */\nfunction toQualityPoint(run: EvalRunRecord): QualityPoint {\n return {\n runId: run.id,\n score: run.avgScore,\n passRate: run.totalCases > 0 ? Math.round((run.passedCases / run.totalCases) * 100) : null,\n createdAt: run.createdAt,\n ...(run.taskId ? { taskId: run.taskId } : {}),\n };\n}\n\n/**\n * Builds quality trends and a verdict from evaluation runs. Development runs\n * are comparable with the latest run when they share its explicit environment;\n * otherwise all completed development runs are compared. A finite threshold is\n * treated as an absolute value, an invalid threshold defaults to 1, and score\n * movement within or equal to the threshold is stable.\n *\n * @param runs Evaluation runs to classify and summarize.\n * @param neutralThreshold Absolute score movement that remains a stable verdict.\n * @returns Comparable quality points, validation history, verdict, and active or failed runs.\n */\nexport function buildImprovementQuality(\n runs: EvalRunRecord[],\n neutralThreshold = 1\n): ImprovementQuality {\n const normalizedThreshold = Number.isFinite(neutralThreshold) ? Math.abs(neutralThreshold) : 1;\n const sorted = runs\n .filter((run) => Number.isFinite(run.avgScore) && Number.isFinite(new Date(run.createdAt).getTime()))\n .sort(compareEvalRunsChronologically);\n // Compact quality is agent/project-global: manual runs can be current quality,\n // while taskId remains provenance for round-only trend and outcome views.\n const developmentRuns = sorted.filter((run) => run.status === \"completed\" && !run.holdout);\n const latestRun = developmentRuns[developmentRuns.length - 1];\n const hasExplicitEnvironment = latestRun?.envProjectId !== undefined;\n const comparableRuns = hasExplicitEnvironment\n ? developmentRuns.filter((run) => run.envProjectId === latestRun.envProjectId)\n : developmentRuns;\n const trend = comparableRuns.map(toQualityPoint);\n const validationTrend = sorted\n .filter((run) => run.status === \"completed\" && run.holdout)\n .map(toQualityPoint);\n const latest = trend[trend.length - 1];\n const previous = trend[trend.length - 2];\n const delta = latest && previous ? latest.score - previous.score : null;\n let verdict: ImprovementVerdict = \"needs-evidence\";\n\n if (delta !== null) {\n verdict = delta > normalizedThreshold\n ? \"improving\"\n : delta < -normalizedThreshold\n ? \"regressed\"\n : \"stable\";\n }\n\n return {\n verdict,\n latest,\n previous,\n delta,\n passRate: latest?.passRate ?? null,\n comparisonLabel: hasExplicitEnvironment ? \"Latest comparable result\" : \"Latest recorded result\",\n trend,\n validationTrend,\n runningRuns: sorted.filter((run) => run.status === \"running\"),\n failedRuns: sorted.filter((run) => run.status === \"failed\" || run.status === \"aborted\"),\n };\n}\n","import React, { useEffect, useRef } from \"react\";\nimport type { ECharts, EChartsOption } from \"echarts\";\n\n/**\n * Minimal React wrapper around an ECharts instance.\n * Handles init / resize (ResizeObserver) / dispose lifecycle; re-renders\n * whenever the `option` object changes. `onEvents` binds chart events\n * (e.g. click) without re-creating the instance.\n *\n * echarts itself is loaded via dynamic import inside the init effect so that\n * every consumer defers the ~1MB library until a chart actually mounts.\n * The latest `option` / `onEvents` are kept in refs and re-applied after the\n * async init resolves (the option/event effects may have run while the chunk\n * was still loading, when `instance.current` was still null).\n */\nexport const EChart: React.FC<{ option: EChartsOption; height?: number; onEvents?: Record<string, (params: unknown) => void> }> = ({ option, height = 200, onEvents }) => {\n const ref = useRef<HTMLDivElement>(null);\n const instance = useRef<ECharts | null>(null);\n\n const latestOption = useRef(option);\n const latestOnEvents = useRef(onEvents);\n\n useEffect(() => {\n latestOption.current = option;\n instance.current?.setOption(option, true);\n }, [option]);\n\n useEffect(() => {\n latestOnEvents.current = onEvents;\n const chart = instance.current;\n if (!chart || !onEvents) return;\n const entries = Object.entries(onEvents);\n for (const [event, handler] of entries) chart.on(event, handler);\n return () => {\n for (const [event, handler] of entries) chart.off(event, handler);\n };\n }, [onEvents]);\n\n useEffect(() => {\n let cancelled = false;\n let observer: ResizeObserver | null = null;\n\n (async () => {\n const echarts = await import(\"echarts\");\n if (cancelled || !ref.current) return;\n const chart = echarts.init(ref.current);\n instance.current = chart;\n chart.setOption(latestOption.current, true);\n const events = latestOnEvents.current;\n if (events) {\n for (const [event, handler] of Object.entries(events)) chart.on(event, handler);\n }\n observer = new ResizeObserver(() => instance.current?.resize());\n observer.observe(ref.current);\n })().catch((error) => {\n // A failed deferred-chunk fetch would otherwise be an unhandled\n // rejection; keep lifecycle unchanged, just make it diagnosable.\n console.error(\"[EChart] async init failed:\", error);\n });\n\n return () => {\n cancelled = true;\n observer?.disconnect();\n instance.current?.dispose();\n instance.current = null;\n };\n }, []);\n\n return <div ref={ref} style={{ width: \"100%\", height }} />;\n};\n","import type { EvalRun, TaskFileRef, TaskItem } from \"@axiom-lattice/protocols\";\nimport type { Assistant } from \"@axiom-lattice/client-sdk\";\n\n/** True when a task is a training round (top-level training task). */\nexport function isTrainingRound(task: TaskItem): boolean {\n const meta = task.metadata ?? {};\n return meta.trainingRound === true;\n}\n\n/**\n * DJB2 hash of a string, rendered in base36 and truncated to 6 chars.\n * Used to derive stable-but-unique agent ids from learn-to-build goals.\n */\nexport function shortHash(str: string): string {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) >>> 0;\n }\n return hash.toString(36).slice(0, 6);\n}\n\n/** True when a training round blocks new round submission. */\nexport function isActiveTrainingRound(task: TaskItem): boolean {\n const active: TaskItem[\"status\"][] = [\"pending\", \"in_progress\", \"review\"];\n return active.includes(task.status);\n}\n\n/** A minimal eval-run shape used for round scoring. */\ntype ScoreRun = { avgScore: number; envProjectId?: string; createdAt?: string | Date };\n\nfunction newestRun(runs: ScoreRun[]): ScoreRun {\n const sorted = [...runs].sort(\n (a, b) =>\n (a.createdAt ? new Date(a.createdAt).getTime() : 0) -\n (b.createdAt ? new Date(b.createdAt).getTime() : 0)\n );\n return sorted[sorted.length - 1];\n}\n\n/** The representative score of a round: validation-env run first, else the newest run. */\nexport function getRoundRepresentativeScore(\n runs: ScoreRun[],\n validationProjectId: string | null | undefined\n): number | null {\n if (runs.length === 0) return null;\n if (validationProjectId) {\n const valRuns = runs.filter((r) => r.envProjectId === validationProjectId);\n if (valRuns.length > 0) return newestRun(valRuns).avgScore;\n }\n return newestRun(runs).avgScore;\n}\n\n/** A single point in an in-round score trend. */\nexport interface RunSeriesPoint {\n runId: string;\n score: number;\n createdAt: string;\n}\n\n/** Sort runs by createdAt ascending for trend charts (Date or ISO string accepted). */\nexport function buildTrainingRunSeries(\n runs: Array<{ id: string; avgScore: number; createdAt: string | Date }>\n): RunSeriesPoint[] {\n return [...runs]\n .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime())\n .map((r) => ({\n runId: r.id,\n score: r.avgScore,\n createdAt: r.createdAt instanceof Date ? r.createdAt.toISOString() : r.createdAt,\n }));\n}\n\n/** The file-item shape `AttachmentsCard` consumes. */\nexport interface AttachmentItemLike {\n id: string;\n name: string;\n}\n\n/** Map task file references to the shape AttachmentsCard consumes. */\nexport function toAttachmentItems(files: TaskFileRef[]): AttachmentItemLike[] {\n return files.map((f) => ({ id: f.uri, name: f.name || f.uri }));\n}\n\n/** Extract the training thread id from a round task's metadata. */\nexport function getTrainingThreadId(task: TaskItem): string | undefined {\n const meta = task.metadata ?? {};\n const v = meta.trainingSessionId;\n return typeof v === \"string\" ? v : undefined;\n}\n\n/** Extract the target agent id from a round task's metadata. */\nexport function getTargetAgentId(task: TaskItem): string | undefined {\n const meta = task.metadata ?? {};\n const v = meta.targetAgentId;\n return typeof v === \"string\" ? v : undefined;\n}\n\n/**\n * Build the tasks-list query string for a target agent's training rounds.\n * The `metadata` filter keys map to stringified JSON values (`\"true\"`) so the\n * PostgreSQL `metadata->>` text comparison matches.\n */\nexport function buildTrainingRoundsQuery(agentId: string, projectId?: string | null): string {\n const q = `ownerId=agent-architect&metadata=${encodeURIComponent(\n JSON.stringify({ trainingRound: \"true\", targetAgentId: agentId })\n )}`;\n return `/api/tasks?${q}${projectId ? `&projectId=${projectId}` : \"\"}`;\n}\n\n/** Build the tasks-list query for a round's subtasks (architect's manage_task tree). */\nexport function buildSubTasksQuery(roundTaskId: string, projectId?: string | null): string {\n const q = `ownerId=agent-architect&parentId=${roundTaskId}`;\n // Project-scoped: the unscoped (personal) tasks list only returns the current\n // user's projectless tasks, so architect-owned subtasks are only reachable\n // through the project branch.\n return `/api/tasks?${q}${projectId ? `&projectId=${projectId}` : \"\"}`;\n}\n\n/**\n * The architect's builder thread id for an agent — the fixed thread the\n * canvas CopilotPanel uses (`{tenantId}:{agentId}`). Learning rounds must\n * associate with THIS thread so the copilot conversation and the learning\n * task share one context.\n */\nexport function buildBuilderThreadId(tenantId: string, agentId: string): string {\n return `${tenantId}:${agentId}`;\n}\n\n/** Filter eval runs down to those belonging to a given round task. */\nexport function filterRunsByTask(runs: EvalRun[], taskId: string): EvalRun[] {\n return runs.filter((r) => r.taskId === taskId);\n}\n\n/** Result of {@link startLearningRound}. */\nexport interface StartLearningRoundResult {\n roundTaskId: string;\n threadId: string;\n}\n\nexport interface StartLearningRoundParams {\n goal: string;\n targetAgentId: string;\n workspaceId?: string;\n projectId?: string;\n /** Reuse the agent's existing training thread when present. */\n existingThreadId?: string | null;\n /** Reference files uploaded for this round, stored on the round task. */\n files?: TaskFileRef[];\n post: <T>(url: string, body?: unknown, options?: { headers?: Record<string, string> }) => Promise<{ data?: T }>;\n put: <T>(url: string, body?: unknown, options?: { headers?: Record<string, string> }) => Promise<{ data?: T }>;\n}\n\n/**\n * Create a learning (training) round task and ensure the architect's training\n * thread exists, returning both ids. Mirrors the retired Training Center bootstrap.\n */\nexport async function startLearningRound(params: StartLearningRoundParams): Promise<StartLearningRoundResult> {\n // Rounds are pinned to the shared training project; declare that exact scope in\n // x-project-id (per-call headers override the ambient workspace context) so the\n // gateway's body/header scope-agreement check passes from any project context.\n const projectScope = params.projectId\n ? { headers: { \"x-project-id\": params.projectId } }\n : undefined;\n const roundRes = await params.post<{ id: string }>(\"/api/tasks\", {\n title: params.goal.slice(0, 60),\n description: params.goal,\n ownerType: \"agent\",\n ownerId: \"agent-architect\",\n workspaceId: params.workspaceId ?? undefined,\n projectId: params.projectId ?? undefined,\n metadata: {\n trainingRound: true,\n targetAgentId: params.targetAgentId,\n },\n files: params.files && params.files.length > 0 ? params.files : undefined,\n }, projectScope);\n const roundTask = roundRes.data;\n if (!roundTask) throw new Error(\"Failed to create learning round task\");\n\n let threadId = params.existingThreadId ?? null;\n if (!threadId) {\n const threadRes = await params.post<{ id: string }>(\"/api/assistants/agent-architect/threads\", {\n metadata: { training: true, targetAgentId: params.targetAgentId },\n });\n threadId = threadRes.data?.id ?? null;\n if (!threadId) throw new Error(\"Failed to create training thread\");\n }\n\n await params.put(`/api/tasks/${roundTask.id}`, {\n metadata: {\n trainingRound: true,\n targetAgentId: params.targetAgentId,\n trainingSessionId: threadId,\n },\n }, projectScope);\n\n return { roundTaskId: roundTask.id, threadId };\n}\n\n/** How the learning round's target identity is held before this round runs. */\nexport type LearningTargetMode = \"placeholder\" | \"existing-agent\" | \"existing-workflow\";\n\n/**\n * Derive the learning target mode from an assistant's graph definition.\n * A target is a placeholder only when it is explicitly marked\n * `learningPlaceholder: \"true\"` AND its architecture is still `undecided`;\n * otherwise its real form (Workflow vs Capability/Orchestra) decides the mode.\n */\nexport function getLearningTargetMode(assistant: Pick<Assistant, \"graphDefinition\">): LearningTargetMode {\n const raw = assistant.graphDefinition;\n let parsed: unknown = raw;\n if (typeof raw === \"string\") {\n try {\n parsed = JSON.parse(raw) as unknown;\n } catch {\n parsed = {};\n }\n }\n const graph =\n parsed !== null && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : {};\n const metadata =\n graph.metadata !== null && typeof graph.metadata === \"object\" && !Array.isArray(graph.metadata)\n ? (graph.metadata as Record<string, unknown>)\n : {};\n if (metadata.learningPlaceholder === \"true\" && metadata.architectureStatus === \"undecided\") {\n return \"placeholder\";\n }\n return graph.type === \"workflow\" ? \"existing-workflow\" : \"existing-agent\";\n}\n\n/** Input for {@link buildLearningKickoff}: the goal plus exact pinned identity/task facts. */\nexport interface LearningKickoffInput {\n goal: string;\n roundTaskId: string;\n targetAgentId: string;\n targetMode: LearningTargetMode;\n files?: TaskFileRef[];\n /** Learning project scope — pins subtask creation beside the round task. */\n projectId?: string;\n workspaceId?: string;\n}\n\n/**\n * The auto-sent architect message that kicks off a learning round.\n * Pins the target identity and round task, states the mode-specific route,\n * and delegates procedures to the loaded skills — it does not copy Task,\n * FEP, Eval, or completion semantics.\n */\nexport function buildLearningKickoff(input: LearningKickoffInput): string {\n const route =\n input.targetMode === \"placeholder\"\n ? \"This is a marked learning placeholder and its architecture is undecided. Select and explicitly approve its initial architecture, then materialize this exact ID through agent-build or design-workflow.\"\n : input.targetMode === \"existing-workflow\"\n ? \"This is an existing Workflow. Keep its architecture and use the design-workflow procedure skill for exact-ID update_workflow followed by validate_workflow.\"\n : \"This is an existing Capability or Orchestra. Keep its architecture and use the agent-build procedure skill for a same-form exact-ID update_agent.\";\n\n return [\n `Learning goal (draft — confirm with the user before any observation or design): ${input.goal}`,\n `Exact target ID: \"${input.targetAgentId}\".`,\n `Exact round Task ID: \"${input.roundTaskId}\".`,\n route,\n \"Load [[agent-architecture]] and the routed procedure skill; follow its goal gate and procedures before any exploration or design.\",\n ...(input.files?.length\n ? [`Reference files: ${input.files.map((file) => `${file.name || file.uri} (${file.uri})`).join(\", \")}. Read them before designing; in your first reply state which files you actually read and what you took from each.`]\n : []),\n ].join(\"\\n\");\n}\n\n/** Max depth fetched below a round task when building the subtree. */\nconst MAX_SUBTREE_DEPTH = 5;\n\n/** BFS-fetch the full descendant task tree of a parent task (bounded depth, deduped). */\nexport interface TaskSubtreeResult {\n tasks: TaskItem[];\n partial: boolean;\n /** Parents whose child inventory could not be fetched or exceeded the depth bound. */\n incompleteParentIds?: string[];\n}\n\n/** Scope for {@link fetchTaskSubtree}: the project the round subtree lives in. */\nexport interface TaskSubtreeScope {\n projectId?: string | null;\n}\n\nexport async function fetchTaskSubtree(\n get: <T>(url: string, options?: { headers?: Record<string, string> }) => Promise<{ data?: T }>,\n rootId: string,\n scope?: TaskSubtreeScope\n): Promise<TaskSubtreeResult> {\n const projectId = scope?.projectId;\n const requestInit = projectId ? { headers: { \"x-project-id\": projectId } } : undefined;\n const withProject = (id: string): string =>\n buildSubTasksQuery(id, projectId ?? undefined);\n const collected: TaskItem[] = [];\n let partial = false;\n const incompleteParentIds = new Set<string>();\n const seen = new Set<string>([rootId]);\n let frontier = [rootId];\n for (let depth = 0; depth < MAX_SUBTREE_DEPTH && frontier.length > 0; depth++) {\n const batches = await Promise.all(\n frontier.map((id) =>\n get<TaskItem[]>(withProject(id), requestInit)\n .then((res) => (Array.isArray(res.data)\n ? res.data.map((task) => task.parentId ? task : { ...task, parentId: id })\n : []))\n .catch(() => {\n partial = true;\n incompleteParentIds.add(id);\n return [] as TaskItem[];\n })\n )\n );\n const children = batches.flat().filter((c) => {\n if (seen.has(c.id)) return false;\n seen.add(c.id);\n return true;\n });\n collected.push(...children);\n frontier = children.map((c) => c.id);\n }\n if (frontier.length > 0) {\n partial = true;\n for (const id of frontier) incompleteParentIds.add(id);\n }\n return {\n tasks: collected,\n partial,\n ...(incompleteParentIds.size > 0 ? { incompleteParentIds: [...incompleteParentIds] } : {}),\n };\n}\n","import React, { useMemo, useEffect, useRef, useState, useCallback } from \"react\";\nimport { ReactFlow, Background, Controls, Node, Edge, useNodesState, useEdgesState, ReactFlowProvider, NodeTypes, useReactFlow, useNodesInitialized, useStore } from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport { buildAgentConfigGraphData, ConfigGraphNode } from \"./configGraph\";\nimport { AgentCardNode, GroupNode } from \"./ConfigGraphNodes\";\nimport { useEvalQuality, type EvalQualityData } from \"./AgentOverview\";\nimport { useEvalSuites } from \"../../hooks/eval/useEvalSuites\";\nimport { CanvasOverlay } from \"./CanvasOverlay\";\nimport { CanvasZone } from \"./CanvasZone\";\nimport { CanvasDock } from \"./CanvasDock\";\nimport { ArchitectCopilotDock } from \"./ArchitectCopilotDock\";\nimport { useArchitectMobileViewport } from \"./useArchitectMobileViewport\";\nimport { ArchitectCopilotNode, COPILOT_NODE_ID } from \"./ArchitectCopilotNode\";\nimport { TestingBadgeNode, TestingPanelNode, resolveTestingZoomTier, type TestingZoomTier } from \"./TestingZone\";\nimport {\n CONFIG_RING_OFFSETS,\n FIT_READABILITY_ZOOM,\n GROUP_NODE_H,\n TESTING_BADGE_H,\n TESTING_BADGE_W,\n TESTING_CONTENT_OFFSET,\n ZONE_MARGIN,\n computePinnedLayout,\n computeTrainingLayout,\n configAgentPosition,\n configGroupPosition,\n testingBadgePosition,\n RENDERED_ZONE_IDS,\n type PinnableZoneKey,\n type TrainingLayout,\n type ZoneRect,\n} from \"./canvasLayout\";\nimport {\n useLearningZoneNodes,\n findTaskInTrees,\n measureLearningDagBBox,\n selectLearningTree,\n LearningHeaderNode,\n LearningDagTaskNode,\n LearningRoundRootNode,\n} from \"./Learning/LearningZone\";\nimport { OnboardingTour, type TourEventKind, type TourEvents } from \"./OnboardingTour\";\nimport { LearningTaskDetailBody } from \"./Learning/LearningTaskDetailModal\";\nimport { EvalQualityPanel } from \"./EvalQualityPanel\";\nimport { CopilotPanel } from \"../Chat/CopilotPanel\";\nimport { ProjectScopeProvider } from \"../ProjectScopeProvider\";\nimport { LearningTaskGraphView } from \"./Learning/LearningTaskGraphView\";\nimport { useCopilotKickoffRequest } from \"./useCopilotKickoffRequest\";\nimport type { InitialMessageRequest } from \"../Chat/InitialMessageSubmitter\";\nimport type { LearningTasksData } from \"./useEntityRefresher\";\nimport type { TaskFileRef, TaskItem } from \"@axiom-lattice/protocols\";\n\n/** Zone id → floor top-left world origin. Empty = the auto chain is live. */\ntype ZoneOrigins = Record<string, { x: number; y: number }>;\n\n/** Floor id → pinnable-zone key (CONFIG never pins — it stays the canvas base layer). */\nconst ZONE_FLOOR_PIN_KEYS: Record<string, PinnableZoneKey> = {\n \"zone:copilot\": \"copilot\",\n \"zone:learning\": \"learning\",\n \"zone:testing\": \"evaluation\",\n};\n\n/** Pinned-panel header label per zone (matches the floor chip labels). */\nconst PINNED_TITLES: Record<PinnableZoneKey, string> = {\n copilot: \"COPILOT\",\n learning: \"LEARNING\",\n evaluation: \"EVALUATION\",\n};\n\n/** Quick-nav dot key → pinnable-zone key (the ③ dot drives the EVALUATION zone). */\nconst DOT_PIN_KEYS: Record<string, PinnableZoneKey> = {\n copilot: \"copilot\",\n learning: \"learning\",\n testing: \"evaluation\",\n};\n\n/**\n * Manual (drag-frozen) zone origins take the place of the auto chain for every\n * zone. Widths/heights stay content-driven — sizes grow in place while x/y are\n * pinned to the stored origins. Empty origins keep the pure auto chain.\n */\nconst anchorZoneOrigins = (base: TrainingLayout, origins: ZoneOrigins): TrainingLayout => {\n if (Object.keys(origins).length === 0) return base;\n const anchor = (rect: ZoneRect): ZoneRect => {\n const origin = origins[rect.id];\n return origin ? { ...rect, x: origin.x, y: origin.y } : rect;\n };\n return {\n config: anchor(base.config),\n copilot: anchor(base.copilot),\n learning: anchor(base.learning),\n testing: anchor(base.testing),\n height: base.height,\n };\n};\n\nexport interface AgentConfigGraphProps {\n graphDefinition: unknown;\n /** Node selected on the canvas (null = pane click cleared the selection). */\n onSelectNode?: (node: ConfigGraphNode | null) => void;\n /** When provided, an Agent Architect copilot panel is shown on the canvas. */\n assistantId?: string;\n assistantName?: string;\n /** Workspace paired with projectId for the architect copilot's private scope. */\n workspaceId?: string | null;\n /** Called when the user removes a capability node from the graph (updates config). */\n onRemoveNode?: (node: ConfigGraphNode) => void;\n /** Auto-send request in the architect copilot (learning kickoff). */\n initialMessageRequest?: InitialMessageRequest | null;\n /** Called after the initial message request has been submitted. */\n onInitialMessageSubmitted?: (requestId: string) => void;\n /** Selected project filter for the learning progress card. */\n projectId?: string | null;\n /** Called when the canvas project selector changes. */\n onProjectChange?: (projectId: string | null) => void;\n /** Called after a learning round is started from the canvas learning card. */\n onLearningStarted?: (goal: string, roundTaskId: string, files?: TaskFileRef[]) => void;\n /** Called with every architect tool name (event-driven UI refresh). */\n onToolActivity?: (toolName: string) => void;\n /** Learning rounds + subtree, forwarded to the canvas overlay. */\n learningTasks?: LearningTasksData;\n /** Refetch learning tasks (after a round is created). */\n onLearningRefresh?: () => Promise<void>;\n /** Bumped (debounced) on run_eval tool activity. */\n evalTick?: number;\n /** Eval data owned by the graph; consumed by the TESTING zone. */\n evalData?: EvalQualityData & { refresh: () => Promise<void> };\n /** HUD column top offset (56 on detail pages — leaves the pill strip exposed). */\n hudTopOffset?: number;\n /** Temporarily hide the copilot without interrupting its active session. */\n copilotTemporarilyHidden?: boolean;\n onOpenArchitect?: (trigger?: HTMLElement) => void;\n /** Parent-owned monotonic signal that reopens Architect after guarded transitions. */\n architectOpenSignal?: number;\n /** Focus target restored when the mobile Architect Drawer closes. */\n architectRestoreFocusRef?: React.RefObject<HTMLElement>;\n}\n\ntype AgentConfigGraphInnerProps = AgentConfigGraphProps & {\n evalData: EvalQualityData & { refresh: () => Promise<void> };\n};\n\nconst EMPTY_LEARNING_TASKS: LearningTasksData = { rounds: [], round: null, subTasks: [], subTasksByRound: {}, loading: false };\n\n/** Kbd-chip styling for keys inside the quick-nav shortcut guide. */\nconst helpKbdStyle: React.CSSProperties = {\n padding: \"1px 6px\", marginRight: 6, border: \"1px solid #e0e0e0\", borderRadius: 4,\n background: \"#fafafa\", fontSize: 11, fontFamily: \"monospace\", color: \"#595959\",\n};\n\n/** localStorage flag: \"1\" = the quick-nav guide was dismissed by the user. */\nconst GUIDE_DISMISSED_KEY = \"axiom.trainingCanvas.guideDismissed\";\nconst readGuideDismissed = (): boolean => {\n try {\n return typeof window !== \"undefined\" && window.localStorage?.getItem(GUIDE_DISMISSED_KEY) === \"1\";\n } catch {\n return false;\n }\n};\nconst writeGuideDismissed = (dismissed: boolean): void => {\n try {\n window.localStorage?.setItem(GUIDE_DISMISSED_KEY, dismissed ? \"1\" : \"0\");\n } catch {\n /* private mode / quota — ignore */\n }\n};\n\n/** localStorage flag: \"1\" = the onboarding tour was finished or skipped. */\nconst TUTORIAL_DONE_KEY = \"axiom.trainingCanvas.tutorialDone\";\nconst readTutorialDone = (): boolean => {\n try {\n return typeof window !== \"undefined\" && window.localStorage?.getItem(TUTORIAL_DONE_KEY) === \"1\";\n } catch {\n return false;\n }\n};\nconst writeTutorialDone = (done: boolean): void => {\n try {\n window.localStorage?.setItem(TUTORIAL_DONE_KEY, done ? \"1\" : \"0\");\n } catch {\n /* private mode / quota — ignore */\n }\n};\n\n/** localStorage record shape: pinned zones + manual zone-floor world origins. */\ninterface StoredCanvasLayout {\n version: 1;\n pinned: string[];\n origins: Record<string, { x: number; y: number }>;\n}\n\n/** localStorage key: the persisted training-canvas layout (one record). */\nconst CANVAS_LAYOUT_KEY = \"axiom.trainingCanvas.layout\";\n/** Pinnable-zone keys (drives validity filtering on restore). */\nconst PINNABLE_ZONE_KEYS: readonly PinnableZoneKey[] = [\"copilot\", \"learning\", \"evaluation\"];\n/** Zone-floor ids that may carry a persisted origin (invalid ids are dropped). */\nconst ZONE_ORIGIN_IDS: ReadonlySet<string> = new Set(RENDERED_ZONE_IDS);\n\nconst isLayoutPoint = (value: unknown): value is { x: number; y: number } => {\n if (typeof value !== \"object\" || value === null) return false;\n const point = value as { x?: unknown; y?: unknown };\n return typeof point.x === \"number\" && Number.isFinite(point.x)\n && typeof point.y === \"number\" && Number.isFinite(point.y);\n};\n\n/** Try/catch-guarded read (SSR/privacy-safe); corrupt or wrong-version records degrade to null. */\nconst readCanvasLayout = (): StoredCanvasLayout | null => {\n try {\n if (typeof window === \"undefined\") return null;\n const raw = window.localStorage?.getItem(CANVAS_LAYOUT_KEY);\n if (!raw) return null;\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed !== \"object\" || parsed === null) return null;\n const record = parsed as { version?: unknown; pinned?: unknown; origins?: unknown };\n if (record.version !== 1) return null;\n const origins: Record<string, { x: number; y: number }> = {};\n if (typeof record.origins === \"object\" && record.origins !== null) {\n for (const [id, origin] of Object.entries(record.origins as Record<string, unknown>)) {\n if (isLayoutPoint(origin)) origins[id] = origin;\n }\n }\n return {\n version: 1,\n pinned: Array.isArray(record.pinned)\n ? record.pinned.filter((key): key is string => typeof key === \"string\")\n : [],\n origins,\n };\n } catch {\n return null;\n }\n};\n\nconst writeCanvasLayout = (pinned: readonly PinnableZoneKey[], origins: ZoneOrigins): void => {\n try {\n const record: StoredCanvasLayout = { version: 1, pinned: [...pinned], origins };\n window.localStorage?.setItem(CANVAS_LAYOUT_KEY, JSON.stringify(record));\n } catch {\n /* private mode / quota — ignore */\n }\n};\n\nconst clearCanvasLayout = (): void => {\n try {\n window.localStorage?.removeItem(CANVAS_LAYOUT_KEY);\n } catch {\n /* private mode / quota — ignore */\n }\n};\n\nconst AgentConfigGraphInner: React.FC<AgentConfigGraphInnerProps> = ({ graphDefinition, onSelectNode, assistantId, assistantName, workspaceId, onRemoveNode, initialMessageRequest, onInitialMessageSubmitted, projectId, onProjectChange, onLearningStarted, onToolActivity, learningTasks, onLearningRefresh, evalTick, evalData, hudTopOffset, copilotTemporarilyHidden, onOpenArchitect, architectOpenSignal = 0, architectRestoreFocusRef }) => {\n const [nodes, setNodes, onNodesChange] = useNodesState<Node>([]);\n const [edges, setEdges, onEdgesChange] = useEdgesState<Edge>([]);\n const [hoveredId, setHoveredId] = useState<string | null>(null);\n const isMobile = useArchitectMobileViewport();\n const reactFlow = useReactFlow();\n const fittedRef = useRef(false);\n /**\n * Shortcut guide: starts hidden once the user dismissed it (persisted in\n * localStorage). ✕ dismisses + persists; the pill ⓘ is a per-session peek\n * that never clears the flag — the next session still starts hidden.\n */\n const [helpOpen, setHelpOpen] = useState(!readGuideDismissed());\n /** Quick-nav dot activation pulse (zone key lit for one pulse window). */\n const [activeDot, setActiveDot] = useState<string | null>(null);\n const pulseTimerRef = useRef<number | null>(null);\n /**\n * Onboarding tour: open on first visit (until finished/skipped, persisted);\n * `tourEvents` carries rising-edge pulses the tour consumes to auto-advance.\n */\n const [tourOpen, setTourOpen] = useState(() => !readTutorialDone());\n const [tourStep, setTourStep] = useState(0);\n const [tourEvents, setTourEvents] = useState<TourEvents>({ zoneActivated: false, zoneDragged: false, copilotPinned: false });\n /** Fire a tour pulse (rising edge); a no-op when the flag is already lit. */\n const fireTourEvent = useCallback((kind: TourEventKind) => {\n setTourEvents((events) => (events[kind] ? events : { ...events, [kind]: true }));\n }, []);\n /** Stable wrappers so unstable parent callbacks never rebuild the graph. */\n const handlersRef = useRef({ onInitialMessageSubmitted, onToolActivity, onLearningStarted });\n handlersRef.current = { onInitialMessageSubmitted, onToolActivity, onLearningStarted };\n\n /**\n * Pin Dock: which zones are pinned into fixed dock panels over the canvas\n * (empty set = the plain four-zone chain canvas). Pin state persists in\n * localStorage (with the manual zone origins) and is restored on mount —\n * invalid keys are dropped.\n */\n const [pinnedZones, setPinnedZones] = useState<Set<PinnableZoneKey>>(() => {\n const restored = new Set<PinnableZoneKey>();\n for (const key of readCanvasLayout()?.pinned ?? []) {\n if ((PINNABLE_ZONE_KEYS as readonly string[]).includes(key)) restored.add(key as PinnableZoneKey);\n }\n return restored;\n });\n /**\n * Frozen floor origins from manual zone drags; persisted alongside the pin\n * set and restored on mount (invalid zone ids are dropped). Empty = the\n * auto chain is still live for every zone.\n */\n const [manualOrigins, setManualOrigins] = useState<ZoneOrigins>(() => {\n const restored: ZoneOrigins = {};\n for (const [id, origin] of Object.entries(readCanvasLayout()?.origins ?? {})) {\n if (ZONE_ORIGIN_IDS.has(id)) restored[id] = origin;\n }\n return restored;\n });\n /** Render-synced mirrors so the stable callbacks always persist the latest state. */\n const pinnedZonesRef = useRef(pinnedZones);\n pinnedZonesRef.current = pinnedZones;\n const manualOriginsRef = useRef(manualOrigins);\n manualOriginsRef.current = manualOrigins;\n const togglePinned = useCallback((key: PinnableZoneKey) => {\n const next = new Set(pinnedZonesRef.current);\n if (next.has(key)) next.delete(key);\n else {\n next.add(key);\n // Pinning the copilot on is the tour's final step — pulse the tour.\n if (key === \"copilot\") fireTourEvent(\"copilotPinned\");\n }\n pinnedZonesRef.current = next;\n setPinnedZones(next);\n writeCanvasLayout([...next], manualOriginsRef.current);\n }, [fireTourEvent]);\n /**\n * Pinned-panel slot table input: the canvas CONTAINER's live layout box,\n * not the window. The pinned docks render inside the container's relative\n * div, which is narrower than the window (the app shell has sidebars) —\n * window-derived column widths overrun the container and overlap their\n * neighbors. The ResizeObserver reports the container's true size (a bare\n * window resize listener would miss shell/sidebar-driven size changes).\n */\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [viewport, setViewport] = useState<{ width: number; height: number }>(() => ({\n width: typeof window === \"undefined\" ? 1200 : window.innerWidth,\n height: typeof window === \"undefined\" ? 800 : window.innerHeight,\n }));\n useEffect(() => {\n const el = containerRef.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const measure = () => {\n const rect = el.getBoundingClientRect();\n setViewport({ width: rect.width, height: rect.height });\n };\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n measure();\n return () => ro.disconnect();\n }, []);\n const pinnedSlots = useMemo(\n () => computePinnedLayout(viewport.width, viewport.height, pinnedZones),\n [viewport, pinnedZones],\n );\n /**\n * Pinned-copilot kickoff bookkeeping — same contract as the canvas node's\n * hook. COPILOT mutual exclusion keeps the two surfaces from ever mounting\n * simultaneously, so there is exactly one CopilotPanel (no double-stream) and\n * one kickoff consumer (a submitted request is cleared by the parent, so the\n * surviving surface never re-sends it).\n */\n const copilotKickoff = useCopilotKickoffRequest({\n assistantId: assistantId ?? \"\",\n initialMessageRequest,\n onInitialMessageSubmitted: (requestId) => handlersRef.current.onInitialMessageSubmitted?.(requestId),\n });\n\n /** Light the dot for one pulse window (~700ms), then fade back. */\n const activateDot = useCallback((key: string) => {\n setActiveDot(key);\n // Zone activation is the tour's \"switch zones\" step — pulse the tour.\n fireTourEvent(\"zoneActivated\");\n if (pulseTimerRef.current !== null) window.clearTimeout(pulseTimerRef.current);\n pulseTimerRef.current = window.setTimeout(() => setActiveDot(null), 700);\n }, [fireTourEvent]);\n useEffect(() => () => {\n if (pulseTimerRef.current !== null) window.clearTimeout(pulseTimerRef.current);\n }, []);\n\n // ③ LEARNING zone state: pinned round (null = follow the newest active),\n // task focus, task detail modal.\n const [selectedLearningRoundId, setSelectedLearningRoundId] = useState<string | null>(null);\n /** Focus mode: the DAG re-scopes onto this task's subtree (null = round root). */\n const [learningFocusId, setLearningFocusId] = useState<string | null>(null);\n /** The detail modal keeps only the task id; the live snapshot is derived from current learningTasks. */\n const [learningModalTaskId, setLearningModalTaskId] = useState<string | null>(null);\n\n // Stable callbacks so the learning zone node memo is never defeated by re-renders.\n const handleLearningTaskClick = useCallback((task: TaskItem) => setLearningModalTaskId(task.id), []);\n const handleLearningDetailClose = useCallback(() => setLearningModalTaskId(null), []);\n const handleLearningFocus = useCallback((id: string | null) => setLearningFocusId(id), []);\n const handleLearningStarted = useCallback(\n (goal: string, roundTaskId: string, files?: TaskFileRef[]) => handlersRef.current.onLearningStarted?.(goal, roundTaskId, files),\n [],\n );\n\n // ② TESTING zone inputs: the panel content derives from the shared run\n // inventory + per-suite case counts (analysis is inline — no dock).\n const { suites: evalSuites } = useEvalSuites(evalData.evalProjectId ?? \"\");\n // Keyed on a primitive signature so a fresh-but-equal suites array never churns the graph effect.\n const suiteCountsKey = evalSuites.map((s) => `${s.name}:${s.caseCount ?? 0}`).join(\"|\");\n const suiteCaseCounts = useMemo(() => {\n const counts: Record<string, number> = {};\n for (const suite of evalSuites) counts[suite.name] = suite.caseCount ?? 0;\n return counts;\n }, [suiteCountsKey]);\n /** Suite chips for the TESTING panel: one ConfigGraphNode per suite (\"N cases\"). */\n const suiteItems = useMemo<ConfigGraphNode[]>(\n () => evalData.suiteNames.map((name) => ({\n id: `suite:${name}`,\n type: \"eval\",\n label: name,\n description: `${suiteCaseCounts[name] ?? 0} cases`,\n })),\n [evalData.suiteNames, suiteCaseCounts],\n );\n\n const graph = useMemo(() => buildAgentConfigGraphData(graphDefinition, { includeEmptyGroups: true }), [graphDefinition]);\n const nodeTypes = useMemo(() => ({\n zone: CanvasZone as unknown as NodeTypes[string],\n config: GroupNode as unknown as NodeTypes[string],\n agent: AgentCardNode as unknown as NodeTypes[string],\n copilot: ArchitectCopilotNode as unknown as NodeTypes[string],\n testingPanel: TestingPanelNode as unknown as NodeTypes[string],\n testingBadge: TestingBadgeNode as unknown as NodeTypes[string],\n learningHeader: LearningHeaderNode as unknown as NodeTypes[string],\n learningTask: LearningDagTaskNode as unknown as NodeTypes[string],\n learningRoundRoot: LearningRoundRootNode as unknown as NodeTypes[string],\n }), []);\n\n const zoom = useStore((state) => state.transform[2]);\n /** ② TESTING LOD: hysteresis-quantized tier so boundary zoom jitter never rebuilds the graph. */\n const testingTierRef = useRef<TestingZoomTier>(\"overview\");\n const testingTier = resolveTestingZoomTier(zoom, testingTierRef.current);\n testingTierRef.current = testingTier;\n const learningTasksData = learningTasks ?? EMPTY_LEARNING_TASKS;\n\n // Group heights: one source for both node positions and floor sizing.\n const groupHeights = useMemo(() => {\n const byId = new Map(graph.groups.map((g) => [g.id, g] as const));\n const heights: Record<string, number> = {};\n for (const g of graph.groups) {\n if (!byId.get(g.id)) continue;\n heights[g.id] = Math.max(GROUP_NODE_H, 56 + g.items.length * 30);\n }\n return heights;\n }, [graph.groups]);\n // Suites chips height (0 = no suites → floor stays at its static minimum).\n const suitesGroupHeight = useMemo(\n () => (evalData.suiteNames.length > 0 ? Math.max(GROUP_NODE_H, 56 + evalData.suiteNames.length * 30) : 0),\n [evalData.suiteNames],\n );\n // Learning content: the selected round's displayed-subtree render model and\n // its natural bbox (focus-aware) — the LEARNING zone's content-driven size input.\n const learningTree = useMemo(\n () => selectLearningTree(learningTasksData, selectedLearningRoundId),\n [learningTasksData, selectedLearningRoundId],\n );\n const learningDagBBox = useMemo(\n () => measureLearningDagBBox(learningTree, learningFocusId),\n [learningTree, learningFocusId],\n );\n // Content-driven chain layout: CONFIG → LEARNING → TESTING → COPILOT, one\n // shared height (the tallest content need), 48-unit gaps, centered on y=0.\n // `autoLayout` is the pure chain; `layout` replaces chain origins with the\n // frozen manual origins once the user has dragged any zone floor.\n const autoLayout = useMemo(\n () => computeTrainingLayout({\n groupHeights,\n suitesGroupHeight,\n learningDagBBox,\n }),\n [groupHeights, suitesGroupHeight, learningDagBBox],\n );\n\n /** Frozen origins replace chain origins for every zone once they exist. */\n const layout = useMemo(() => anchorZoneOrigins(autoLayout, manualOrigins), [autoLayout, manualOrigins]);\n\n // Zone-block drag bookkeeping. ReactFlow itself moves the dragged floor (per\n // event through onNodesChange); we translate the zone's CONTENT to follow.\n // Main-state content (config/testing/copilot) translates here; LEARNING\n // content lives in the zone hook, so it follows through `learningDragOffset`.\n const zoneMembersRef = useRef<Record<string, string[]>>({});\n /** Last known floor top-left per zone — the drag delta baseline. */\n const dragFloorPosRef = useRef<Record<string, { x: number; y: number }>>({});\n /** The floor id of an in-progress gesture (baseline must not be re-seeded mid-drag). */\n const activeDragZoneRef = useRef<string | null>(null);\n /** Live delta applied to the LEARNING zone rect while its floor is dragged. */\n const [learningDragOffset, setLearningDragOffset] = useState({ x: 0, y: 0 });\n const learningZone = useMemo(() => {\n const zone = layout.learning;\n return learningDragOffset.x === 0 && learningDragOffset.y === 0\n ? zone\n : { ...zone, x: zone.x + learningDragOffset.x, y: zone.y + learningDragOffset.y };\n }, [layout, learningDragOffset]);\n\n const handleZoneDragStart = useCallback((nodeId: string, position: { x: number; y: number }) => {\n if (!nodeId.startsWith(\"zone:\")) return;\n activeDragZoneRef.current = nodeId;\n dragFloorPosRef.current[nodeId] = { x: position.x, y: position.y };\n }, []);\n\n const handleZoneDrag = useCallback((nodeId: string, position: { x: number; y: number }) => {\n if (!nodeId.startsWith(\"zone:\")) return;\n const prev = dragFloorPosRef.current[nodeId];\n const next = { x: position.x, y: position.y };\n dragFloorPosRef.current[nodeId] = next;\n if (!prev) return;\n const dx = next.x - prev.x;\n const dy = next.y - prev.y;\n if (dx === 0 && dy === 0) return;\n const members = zoneMembersRef.current[nodeId] ?? [];\n if (nodeId === \"zone:learning\") {\n setLearningDragOffset((offset) => ({ x: offset.x + dx, y: offset.y + dy }));\n }\n if (members.length > 0) {\n setNodes((nds) =>\n nds.map((n) =>\n n.position && members.indexOf(n.id) >= 0\n ? { ...n, position: { x: n.position.x + dx, y: n.position.y + dy } }\n : n,\n ),\n );\n }\n }, [setNodes]);\n\n const handleZoneDragStop = useCallback((nodeId: string, position: { x: number; y: number }) => {\n if (!nodeId.startsWith(\"zone:\")) return;\n activeDragZoneRef.current = null;\n delete dragFloorPosRef.current[nodeId];\n if (nodeId === \"zone:learning\") setLearningDragOffset({ x: 0, y: 0 });\n // Any zone-floor drop is the tour's \"move a zone\" step — pulse the tour.\n fireTourEvent(\"zoneDragged\");\n // First manual drag: freeze EVERY zone at the origin it last auto-had, so\n // later content growth can never re-chain an untouched zone.\n const next: ZoneOrigins = Object.keys(manualOriginsRef.current).length === 0\n ? {\n \"zone:config\": { x: autoLayout.config.x, y: autoLayout.config.y },\n \"zone:copilot\": { x: autoLayout.copilot.x, y: autoLayout.copilot.y },\n \"zone:learning\": { x: autoLayout.learning.x, y: autoLayout.learning.y },\n \"zone:testing\": { x: autoLayout.testing.x, y: autoLayout.testing.y },\n }\n : { ...manualOriginsRef.current };\n next[nodeId] = { x: position.x, y: position.y };\n manualOriginsRef.current = next;\n setManualOrigins(next);\n writeCanvasLayout([...pinnedZonesRef.current], next);\n }, [autoLayout, fireTourEvent]);\n\n /** Guide-card action: back to the default chain (clears storage + local state). */\n const handleLayoutReset = useCallback(() => {\n clearCanvasLayout();\n pinnedZonesRef.current = new Set();\n setPinnedZones(new Set());\n manualOriginsRef.current = {};\n setManualOrigins({});\n }, []);\n\n const learning = useLearningZoneNodes({\n learningTasks: learningTasksData,\n selectedRoundId: selectedLearningRoundId,\n zone: learningZone,\n onSelectRound: setSelectedLearningRoundId,\n onTaskClick: handleLearningTaskClick,\n onFocusTask: handleLearningFocus,\n focusTaskId: learningFocusId,\n onLearningStarted: handleLearningStarted,\n agentId: assistantId ?? \"\",\n projectId,\n });\n /** Derived at render from the current trees: refresh-sync keeps it live, and a vanished task auto-closes. */\n const learningModalTarget = learningModalTaskId ? findTaskInTrees(learningTasksData, learningModalTaskId) : null;\n\n // Auto-close finished: drop the lingering id so reopening re-arms.\n useEffect(() => {\n if (learningModalTaskId && !learningModalTarget) setLearningModalTaskId(null);\n }, [learningModalTaskId, learningModalTarget]);\n\n // Focus is scoped to one round: switching rounds — or losing the focused\n // task to a refresh — returns the DAG to the round root.\n useEffect(() => {\n setLearningFocusId(null);\n }, [selectedLearningRoundId]);\n useEffect(() => {\n if (learningFocusId && !findTaskInTrees(learningTasksData, learningFocusId)) setLearningFocusId(null);\n }, [learningFocusId, learningTasksData]);\n\n useEffect(() => {\n const allGroups = graph.groups;\n const byId = new Map(allGroups.map((g) => [g.id, g] as const));\n const nextNodes: Node[] = [];\n\n // Desktop + owned assistant = the copilot engine exists.\n const copilotEnabled = Boolean(assistantId) && !isMobile;\n\n // Zone floors: every module is a visible bounded block (uniform dashed\n // panel + label chip). All four come from the content-driven chain layout\n // (one shared height — the tallest content need — see `layout` above), so\n // tall ring/suite/DAG content never clips and the modules read as\n // equal-height columns; content anchors derive from each zone's LIVE\n // rect. Copilot floor follows the engine node; learning floor follows the\n // learning content (both desktop/owned only). Floors are draggable: the\n // whole zone (floor + its content) moves as one unit by dragging the label\n // chip — the floor body itself is pointer-transparent (see CanvasZone), so\n // only the chip's mousedown bubbles to the node wrapper's drag handler.\n // Content nodes stay draggable:false.\n const configLive = layout.config;\n const testingLive = layout.testing;\n // Pin Dock exclusions: a pinned zone's floor is hidden along with its\n // content — the pinned panel replaces the whole zone block on the canvas\n // (a bare floor with no content would read as a phantom module).\n const copilotPinned = pinnedZones.has(\"copilot\");\n const learningPinned = pinnedZones.has(\"learning\");\n const evaluationPinned = pinnedZones.has(\"evaluation\");\n const zoneFloors: Node[] = [layout.config, layout.testing, layout.learning, layout.copilot]\n .filter((rect) => rect.id !== layout.copilot.id || (copilotEnabled && !copilotPinned))\n .filter((rect) => rect.id !== layout.learning.id || (Boolean(assistantId) && !learningPinned))\n .filter((rect) => rect.id !== layout.testing.id || !evaluationPinned)\n .map((rect) => {\n const pinKey = ZONE_FLOOR_PIN_KEYS[rect.id];\n return {\n id: rect.id,\n type: \"zone\",\n position: { x: rect.x, y: rect.y },\n data: {\n label: rect.label,\n width: rect.width,\n height: rect.height,\n pinnable: pinKey !== undefined,\n pinned: pinKey !== undefined && pinnedZones.has(pinKey),\n onPinToggle: pinKey !== undefined ? () => togglePinned(pinKey) : undefined,\n },\n draggable: true,\n selectable: false,\n focusable: false,\n deletable: false,\n connectable: false,\n zIndex: -1,\n style: { pointerEvents: \"none\" },\n };\n });\n nextNodes.push(...zoneFloors);\n\n // Zone-block membership: which content node ids ride along with a dragged\n // floor. LEARNING content lives in the zone hook (not this state) and is\n // translated via learningDragOffset instead.\n const zoneMembers: Record<string, string[]> = {\n [layout.config.id]: [],\n [layout.testing.id]: [],\n [layout.learning.id]: [],\n [layout.copilot.id]: [],\n };\n const recordZoneMember = (zoneId: string, id: string): void => {\n const members = zoneMembers[zoneId];\n if (members && members.indexOf(id) < 0) members.push(id);\n };\n\n // Center agent — the outcome anchor inside the CONFIG zone.\n recordZoneMember(layout.config.id, graph.agent.id);\n nextNodes.push({\n id: graph.agent.id,\n type: \"agent\",\n draggable: false,\n data: {\n node: graph.agent,\n onClick: () => onSelectNode?.(graph.agent),\n },\n position: configAgentPosition(configLive),\n });\n\n // Config ring at zone-center + ring offsets (only groups with items).\n for (const g of allGroups) {\n const group = byId.get(g.id);\n if (!group) continue;\n const h = groupHeights[g.id] ?? Math.max(GROUP_NODE_H, 56 + g.items.length * 30);\n recordZoneMember(layout.config.id, g.id);\n nextNodes.push({\n id: g.id,\n type: \"config\",\n draggable: false,\n data: {\n group,\n onClick: (item: ConfigGraphNode) => onSelectNode?.(item),\n onRemove: onRemoveNode,\n },\n position: configGroupPosition(configLive, g.id, h),\n });\n }\n\n // ② TESTING zone: the eval-quality panel embeds the analysis inline\n // (summary + score-by-run + latest-run diagnosis + suite chips), one\n // bounded block filling the zone content; collapses to a badge at low zoom.\n // Pinned EVALUATION hosts the full panel in the pin dock instead — the\n // canvas content (badge AND panel) is skipped entirely.\n if (!pinnedZones.has(\"evaluation\")) {\n if (testingTier === \"badge\") {\n if (evalData.suiteNames.length > 0) {\n recordZoneMember(layout.testing.id, \"testing:badge\");\n nextNodes.push({\n id: \"testing:badge\",\n type: \"testingBadge\",\n draggable: false,\n data: {\n score: evalData.score,\n suiteCount: evalData.suiteNames.length,\n },\n position: testingBadgePosition(testingLive, TESTING_BADGE_W, TESTING_BADGE_H),\n });\n }\n } else {\n recordZoneMember(layout.testing.id, \"testing:panel\");\n nextNodes.push({\n id: \"testing:panel\",\n type: \"testingPanel\",\n draggable: false,\n data: {\n agentId: assistantId ?? \"\",\n runs: evalData.runs,\n width: testingLive.width - ZONE_MARGIN * 2,\n height: testingLive.height - ZONE_MARGIN * 2,\n suites: suiteItems,\n onSuiteClick: (item: ConfigGraphNode) => onSelectNode?.(item),\n },\n position: {\n x: testingLive.x + TESTING_CONTENT_OFFSET.x,\n y: testingLive.y + TESTING_CONTENT_OFFSET.y,\n },\n });\n }\n }\n\n // Architect copilot engine fills the far-right zone of the chain\n // (desktop only; mobile falls back to the floating dock + Drawer below).\n // COPILOT mutual exclusion: while the copilot zone is pinned, the canvas\n // node AND its floor are NOT pushed — two mounted CopilotPanels with the\n // same builder threadId would double-stream, and a bare floor with no\n // engine would read as a phantom module. On unpin the node returns at the\n // same layout rect (position memory unaffected — the zone layout ignores\n // pinning).\n if (copilotEnabled && !pinnedZones.has(\"copilot\")) {\n recordZoneMember(layout.copilot.id, COPILOT_NODE_ID);\n nextNodes.push({\n id: COPILOT_NODE_ID,\n type: \"copilot\",\n draggable: false,\n data: {\n assistantId: assistantId as string,\n assistantName: assistantName ?? \"\",\n workspaceId,\n projectId,\n initialMessageRequest: initialMessageRequest ?? null,\n onInitialMessageSubmitted: (requestId: string) => handlersRef.current.onInitialMessageSubmitted?.(requestId),\n onToolCompleted: (toolName: string) => handlersRef.current.onToolActivity?.(toolName),\n temporarilyHidden: copilotTemporarilyHidden ?? false,\n openSignal: architectOpenSignal,\n width: layout.copilot.width,\n height: layout.copilot.height,\n center: {\n x: layout.copilot.x + layout.copilot.width / 2,\n y: layout.copilot.y + layout.copilot.height / 2,\n },\n },\n position: { x: layout.copilot.x, y: layout.copilot.y },\n });\n }\n\n zoneMembersRef.current = zoneMembers;\n // Drag delta baseline: the floor origins this rebuild just wrote. ReactFlow\n // owns the floor during a gesture; this ref is where the gesture began. A\n // rebuild mid-gesture must not re-baseline the floor being dragged, or the\n // next move's delta would jump the content.\n for (const floor of zoneFloors) {\n if (activeDragZoneRef.current !== floor.id) {\n dragFloorPosRef.current[floor.id] = { x: floor.position.x, y: floor.position.y };\n }\n }\n\n setNodes(nextNodes);\n // Edge handles by cardinal direction: agent leaves from the side facing\n // the group, group receives from the side facing the agent.\n const handleFor = (dx: number, dy: number): string =>\n Math.abs(dx) > Math.abs(dy) ? (dx < 0 ? \"left\" : \"right\") : (dy < 0 ? \"top\" : \"bottom\");\n setEdges(allGroups.map((g) => {\n const offset = CONFIG_RING_OFFSETS[g.id] ?? { x: 0, y: 0 };\n return {\n id: `e${graph.agent.id}-${g.id}`,\n source: graph.agent.id,\n target: g.id,\n sourceHandle: handleFor(offset.x, offset.y),\n targetHandle: handleFor(-offset.x, -offset.y),\n style: { stroke: \"#c7c7c7\", strokeWidth: 1.2 },\n type: \"bezier\",\n };\n }));\n }, [graph, setNodes, setEdges, onRemoveNode, assistantId, isMobile, workspaceId, projectId, assistantName, copilotTemporarilyHidden, architectOpenSignal, initialMessageRequest?.requestId, initialMessageRequest?.content, testingTier, suiteItems, evalData.score, evalData.suiteNames, evalData.runs.map((r) => r.id).join(\",\"), layout, groupHeights, pinnedZones, togglePinned]);\n\n // Initial fit: wait for ReactFlow to MEASURE node dimensions. A\n // setTimeout(0)-based fit raced measurement in prod and framed unmeasured\n // bounds, pushing the content off-center. Frame content only — zone floors\n // are backdrop and their empty padding (LEARNING reserves more height than\n // its content fills) would drag the frame off the actual modules.\n const nodesInitialized = useNodesInitialized();\n useEffect(() => {\n if (!nodesInitialized || fittedRef.current) return;\n fittedRef.current = true;\n const contentNodes = reactFlow.getNodes().filter((n) => !n.id.startsWith(\"zone:\"));\n void reactFlow.fitView({ padding: 0.2, nodes: contentNodes }).then((fitted) => {\n if (!fitted) return;\n // First-open readability: below ~0.45 the full canvas is unreadable —\n // frame the outcome (agent + config groups) only;\n // TESTING/LEARNING/COPILOT are one pan away.\n if (reactFlow.getZoom() < FIT_READABILITY_ZOOM) {\n void reactFlow.fitView({\n padding: 0.2,\n nodes: reactFlow.getNodes().filter((n) => n.type === \"agent\" || n.type === \"config\"),\n });\n }\n });\n }, [nodesInitialized, reactFlow]);\n\n useEffect(() => {\n const zoneOrder: Array<[string, string, string]> = [\n [\"1\", \"zone:config\", \"config\"],\n [\"2\", \"zone:learning\", \"learning\"],\n [\"3\", \"zone:testing\", \"testing\"],\n [\"4\", \"zone:copilot\", \"copilot\"],\n ];\n const onKeyDown = (event: KeyboardEvent): void => {\n if (!(event.ctrlKey || event.metaKey)) return;\n const hit = zoneOrder.find(([key]) => event.key === key);\n if (!hit) return;\n const target = event.target as HTMLElement | null;\n if (target && (target.tagName === \"INPUT\" || target.tagName === \"TEXTAREA\" || target.tagName === \"SELECT\" || target.isContentEditable)) return;\n event.preventDefault();\n // A pinned zone's floor is hidden from the canvas — fitting it is a no-op.\n const pinKey = DOT_PIN_KEYS[hit[2]];\n if (pinKey && pinnedZones.has(pinKey)) return;\n activateDot(hit[2]);\n void reactFlow.fitView({ padding: 0.4, duration: 400, nodes: [{ id: hit[1] }] });\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [reactFlow, activateDot, pinnedZones]);\n\n const displayNodes = useMemo(() => {\n // A graph rebuild (poll/kickoff) can drop the hovered node so mouseleave\n // never fires — treat a stale hover as no hover instead of dimming forever.\n const hovered = nodes.some((n) => n.id === hoveredId) ? hoveredId : null;\n if (hovered === null) return nodes;\n return nodes.map((node) => {\n // Copilot is a working surface; TESTING content is its own module —\n // never dim either. Zone floors are the backdrop, never dimmed.\n if (node.id === COPILOT_NODE_ID || node.id.startsWith(\"zone:\") || node.id.startsWith(\"testing:\")) return node;\n const isConnected =\n node.id === hovered ||\n edges.some((e) => (e.source === hovered && e.target === node.id) || (e.target === hovered && e.source === node.id));\n return { ...node, style: { opacity: isConnected ? 1 : 0.4, transition: \"opacity 0.2s ease\" } };\n });\n }, [nodes, edges, hoveredId]);\n\n return (\n <div ref={containerRef} style={{ width: \"100%\", height: \"100%\", position: \"relative\", background: \"#fafafa\" }}>\n <style>{`.axiom-training-canvas .react-flow__pane { cursor: default; }\n.axiom-training-canvas .react-flow__pane.dragging { cursor: grabbing; }\n@keyframes zone-dot-pulse { 0% { box-shadow: 0 0 0 0 rgba(99,102,241,0.5); } 100% { box-shadow: 0 0 0 8px rgba(99,102,241,0); } }\n.zone-dot-active { animation: zone-dot-pulse 0.7s ease-out; }\n.zone-help-toggle:hover { color: #6366f1; }`}</style>\n <ReactFlow\n className=\"axiom-training-canvas\"\n // Pinned LEARNING hides the zone's canvas content (header/DAG/round-root\n // + floor) — the pinned panel hosts the same model in full size.\n nodes={[...displayNodes, ...(pinnedZones.has(\"learning\") ? [] : learning.nodes)]}\n edges={[...edges, ...(pinnedZones.has(\"learning\") ? [] : learning.edges)]}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n // Zone-block drags: floors are draggable and carry their content; every\n // content node stays draggable:false, so only floors start a gesture.\n onNodeDragStart={(_e, node) => handleZoneDragStart(node.id, node.position)}\n onNodeDrag={(_e, node) => handleZoneDrag(node.id, node.position)}\n onNodeDragStop={(_e, node) => handleZoneDragStop(node.id, node.position)}\n onNodeMouseEnter={(_e, node) => {\n // The copilot has no edges, TESTING content is its own module, zone\n // floors are the backdrop, and learning content belongs to another\n // module — hovering any of them must not dim the graph.\n if (node.id === COPILOT_NODE_ID || node.id.startsWith(\"zone:\") || node.id.startsWith(\"testing:\") || node.type?.startsWith(\"learning\")) return;\n setHoveredId(node.id);\n }}\n onNodeMouseLeave={() => setHoveredId(null)}\n onPaneClick={() => onSelectNode?.(null)}\n onNodeClick={(_e, node) => {\n if (node.type !== \"learningTask\" && node.type !== \"learningRoundRoot\") return;\n const data = node.data as { onTaskClick?: () => void };\n data.onTaskClick?.();\n }}\n nodeTypes={nodeTypes}\n >\n <Background color=\"#eee\" gap={20} />\n <Controls />\n </ReactFlow>\n\n {/* ③ LEARNING drill-down: task click pops the detail in the single right-side\n dock; the live target is derived from the current trees (auto-close on vanish). */}\n <CanvasDock\n open={learningModalTarget !== null}\n width={860}\n title={learningModalTarget?.task.title ?? \"\"}\n onClose={handleLearningDetailClose}\n bodyStyle={{ padding: 0, overflow: \"hidden\" }}\n >\n {learningModalTarget && (\n <LearningTaskDetailBody\n task={learningModalTarget.task}\n relatedTasks={learningModalTarget.related}\n onClose={handleLearningDetailClose}\n onRefresh={onLearningRefresh}\n height=\"100%\"\n />\n )}\n </CanvasDock>\n\n {/* Pin Dock: one CanvasDock per pinned zone at its slot-table placement —\n the original dock chrome (glass panel, title + unpin ✕, width-drag\n handle, flush to the viewport edges). The canvas zone content is\n hidden while pinned (mutual exclusion); the dock hosts the SAME view\n the canvas zone showed, full size. Docks sit above the canvas nodes;\n the task-detail dock (zIndex 25) still opens over them. Escape does\n not unpin — with several pinned docks open, Escape would close them\n all at once; the ✕ (or the floor pin chip) toggles. */}\n {([\"copilot\", \"learning\", \"evaluation\"] as Array<PinnableZoneKey>).map((key) => {\n const slot = pinnedSlots[key];\n if (!slot) return null;\n return (\n <CanvasDock\n key={key}\n open\n width={slot.width}\n left={slot.left}\n top={slot.top}\n height={slot.height}\n escapeEnabled={false}\n zIndex={20}\n title={PINNED_TITLES[key]}\n onClose={() => togglePinned(key)}\n bodyStyle={{ padding: 0 }}\n >\n {key === \"copilot\" && assistantId && (\n <div style={{ width: \"100%\", height: \"100%\", userSelect: \"text\", WebkitUserSelect: \"text\" }}>\n <ProjectScopeProvider\n key={`${workspaceId ?? \"default\"}:${projectId ?? \"default\"}`}\n defaultWorkspaceId={workspaceId ?? undefined}\n defaultProjectId={projectId ?? undefined}\n >\n <CopilotPanel\n key={assistantId}\n workflowContext={{ id: assistantId, name: assistantName ?? \"\", type: \"agent\" }}\n onToolCompleted={(toolName) => handlersRef.current.onToolActivity?.(toolName)}\n initialMessageRequest={copilotKickoff.effectivePendingRequest}\n attemptedInitialMessageRequestIdsRef={copilotKickoff.attemptedRequestIdsRef}\n rawInitialMessage\n showHeader={false}\n onInitialMessageSubmitted={copilotKickoff.handleInitialMessageSubmitted}\n />\n </ProjectScopeProvider>\n </div>\n )}\n {key === \"learning\" && (\n <LearningTaskGraphView\n learningTasks={learningTasksData}\n selectedRoundId={selectedLearningRoundId}\n onSelectRound={setSelectedLearningRoundId}\n agentId={assistantId ?? \"\"}\n projectId={projectId}\n onTaskClick={handleLearningTaskClick}\n height=\"100%\"\n />\n )}\n {key === \"evaluation\" && (\n <EvalQualityPanel agentId={assistantId ?? \"\"} runs={evalData.runs} />\n )}\n </CanvasDock>\n );\n })}\n\n {/* ② TESTING drill-downs are inline in the zone panel — no dock. */}\n\n {/* Selector-only HUD: the zone modules own the runtime/eval/learning cards now. */}\n {assistantId && (\n <CanvasOverlay\n assistantId={assistantId}\n projectId={projectId}\n onProjectChange={onProjectChange}\n onLearningStarted={onLearningStarted}\n learningTasks={learningTasks}\n topOffset={hudTopOffset}\n onLearningRefresh={onLearningRefresh}\n evalTick={evalTick}\n showLearning={false}\n variant=\"selector\"\n />\n )}\n\n {/* Mobile-only copilot fallback (Drawer); desktop uses the canvas node. */}\n {assistantId && isMobile && (\n <ArchitectCopilotDock\n assistantId={assistantId}\n assistantName={assistantName ?? \"\"}\n workspaceId={workspaceId}\n projectId={projectId}\n contextType=\"agent\"\n initialMessageRequest={initialMessageRequest}\n onInitialMessageSubmitted={onInitialMessageSubmitted}\n onToolCompleted={(toolName) => onToolActivity?.(toolName)}\n temporarilyHidden={copilotTemporarilyHidden}\n openSignal={architectOpenSignal}\n restoreFocusRef={architectRestoreFocusRef}\n showMobileTrigger={onOpenArchitect === undefined}\n />\n )}\n\n {/* Zone quick-nav shortcut guide: floats above the pill; ✕ persists the\n dismissal, the pill ⓘ is a per-session peek (flag never cleared). */}\n {helpOpen && (\n <div\n data-testid=\"zone-help-card\"\n style={{\n position: \"absolute\", bottom: 58, left: \"50%\", transform: \"translateX(-50%)\",\n zIndex: 13, width: 300, padding: \"12px 14px\", background: \"#fff\",\n borderRadius: 12, border: \"1px solid #f0f0f0\", boxShadow: \"0 4px 16px rgba(0,0,0,0.10)\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginBottom: 8 }}>\n <span style={{ fontSize: 13, fontWeight: 600, color: \"#262626\" }}>Quick navigation</span>\n <span\n data-testid=\"zone-help-close\"\n onClick={() => { writeGuideDismissed(true); setHelpOpen(false); }}\n style={{ cursor: \"pointer\", color: \"#8c8c8c\", fontSize: 12, lineHeight: 1 }}\n >✕</span>\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6, fontSize: 12, color: \"#595959\" }}>\n <div><span style={helpKbdStyle}>⌘/Ctrl + 1–4</span> focus a zone</div>\n <div><span style={helpKbdStyle}>Click a dot</span> focus a zone</div>\n <div><span style={helpKbdStyle}>Drag a zone label</span> move the block</div>\n <div><span style={helpKbdStyle}>📌 Click a zone label</span> pin it into the side split (click again to unpin)</div>\n <div style={{ color: \"#8c8c8c\" }}>① Config ② Learning ③ Evaluation ④ Copilot</div>\n </div>\n <div style={{ marginTop: 8, paddingTop: 8, borderTop: \"1px solid #f0f0f0\", display: \"flex\", justifyContent: \"flex-end\", gap: 8 }}>\n <button\n type=\"button\"\n data-testid=\"start-tutorial\"\n onClick={() => { writeTutorialDone(false); setTourStep(0); setTourOpen(true); }}\n style={{\n cursor: \"pointer\", border: \"1px solid #6366f1\", borderRadius: 4,\n background: \"#6366f1\", padding: \"2px 10px\", fontSize: 12, color: \"#fff\",\n }}\n >Start tutorial</button>\n <button\n type=\"button\"\n data-testid=\"layout-reset\"\n onClick={handleLayoutReset}\n style={{\n cursor: \"pointer\", border: \"1px solid #e0e0e0\", borderRadius: 4,\n background: \"#fafafa\", padding: \"2px 10px\", fontSize: 12, color: \"#595959\",\n }}\n >Reset layout</button>\n </div>\n </div>\n )}\n\n {/* Zone quick-nav: one dot per zone, left→right; click fits the view. */}\n <div\n data-testid=\"zone-quick-nav\"\n style={{\n position: \"absolute\", bottom: 16, left: \"50%\", transform: \"translateX(-50%)\",\n zIndex: 12, display: \"flex\", gap: 10, padding: \"8px 14px\",\n background: \"#fff\", borderRadius: 9999, border: \"1px solid #f0f0f0\",\n boxShadow: \"0 2px 12px rgba(0,0,0,0.08)\",\n }}\n >\n {([\n [\"config\", \"Config\"],\n [\"learning\", \"Learning\"],\n [\"testing\", \"Evaluation\"],\n [\"copilot\", \"Copilot\"],\n ] as const).map(([key, label]) => {\n const pinKey = DOT_PIN_KEYS[key];\n const zonePinned = pinKey !== undefined && pinnedZones.has(pinKey);\n return (\n <button\n key={key}\n type=\"button\"\n aria-label={`Fit ${label} zone`}\n data-testid={`zone-dot-${key}`}\n className={activeDot === key ? \"zone-dot-active\" : undefined}\n onClick={() => {\n activateDot(key);\n void reactFlow.fitView({ padding: 0.4, duration: 400, nodes: [{ id: layout[key].id }] });\n }}\n style={{ width: 10, height: 10, borderRadius: \"9999px\", border: \"none\", padding: 0, cursor: \"pointer\", background: activeDot === key || zonePinned ? \"#6366f1\" : \"#d9d9d9\" }}\n />\n );\n })}\n <span aria-hidden=\"true\" style={{ width: 1, alignSelf: \"stretch\", background: \"#f0f0f0\" }} />\n <span\n data-testid=\"zone-help-toggle\"\n className=\"zone-help-toggle\"\n aria-label=\"Quick navigation guide\"\n onClick={() => setHelpOpen((open) => !open)}\n style={{ cursor: \"pointer\", color: \"#8c8c8c\", fontSize: 12, lineHeight: \"10px\", userSelect: \"none\" }}\n >ⓘ</span>\n </div>\n\n {/* Interactive onboarding tour: auto-advances on the canvas actions it\n teaches (zone activation, zone drag, copilot pin). */}\n <OnboardingTour\n open={tourOpen}\n step={tourStep}\n onStep={setTourStep}\n onDone={() => { writeTutorialDone(true); setTourOpen(false); }}\n events={tourEvents}\n onEventConsumed={(kind) => setTourEvents((events) => ({ ...events, [kind]: false }))}\n />\n </div>\n );\n};\n\nconst OwnedAgentConfigGraph: React.FC<Omit<AgentConfigGraphProps, \"evalData\">> = (props) => {\n const evalData = useEvalQuality(props.assistantId ?? \"\");\n const previousEvalTickRef = useRef(props.evalTick ?? 0);\n useEffect(() => {\n const evalTick = props.evalTick ?? 0;\n const previousTick = previousEvalTickRef.current;\n previousEvalTickRef.current = evalTick;\n if (evalTick > 0 && evalTick !== previousTick) {\n void evalData.refresh().catch(() => undefined);\n }\n }, [props.evalTick]);\n return <AgentConfigGraphInner {...props} evalData={evalData} />;\n};\n\nconst DerivedAgentConfigGraph: React.FC<{ evalData: EvalQualityData & { refresh: () => Promise<void> } } & Omit<AgentConfigGraphProps, \"evalData\">> = ({ evalData, ...props }) => {\n return <AgentConfigGraphInner {...props} evalData={evalData} />;\n};\n\nexport const AgentConfigGraph: React.FC<AgentConfigGraphProps> = ({ evalData, ...props }) => (\n <ReactFlowProvider>\n {evalData ? <DerivedAgentConfigGraph {...props} evalData={evalData} /> : <OwnedAgentConfigGraph {...props} />}\n </ReactFlowProvider>\n);\n","import React from \"react\";\nimport { Node, NodeProps, Position } from \"@xyflow/react\";\nimport { Tag } from \"antd\";\nimport type { ConfigGraphNode, ConfigGroup } from \"./configGraph\";\nimport { configNodeColor } from \"./configGraph\";\nimport { EdgeHandle } from \"./graphHandles\";\nimport { GROUP_ICON } from \"./nodeMeta\";\nimport { colorHex, getTypeBadgeInfo } from \"./agentMeta\";\n\n/** Cardinal handles around a node so edges leave from the correct side. */\nexport const CardinalHandles: React.FC<{ type?: \"source\" | \"target\" }> = ({ type = \"source\" }) => (\n <>\n <EdgeHandle id=\"top\" position={Position.Top} type={type} />\n <EdgeHandle id=\"bottom\" position={Position.Bottom} type={type} />\n <EdgeHandle id=\"left\" position={Position.Left} type={type} />\n <EdgeHandle id=\"right\" position={Position.Right} type={type} />\n </>\n);\n\nexport const AgentCardNode: React.FC<NodeProps<Node<{ node: ConfigGraphNode; onClick?: () => void }>>> = ({ data }) => {\n const { node, onClick } = data;\n const color = colorHex(getTypeBadgeInfo(String((node.config as { type?: string })?.type ?? \"react\")).color);\n const cfg = (node.config ?? {}) as { name?: string; type?: string; description?: string; modelKey?: string; prompt?: string; version?: string };\n return (\n <div\n onClick={onClick}\n style={{\n width: 220,\n background: \"#fff\",\n border: `2px solid ${color}`,\n borderRadius: 14,\n padding: \"10px 12px\",\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n }}\n >\n <CardinalHandles type=\"source\" />\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6, marginBottom: 4 }}>\n {GROUP_ICON.agent}\n <span style={{ fontSize: 13, fontWeight: 700, color: \"#333\", whiteSpace: \"nowrap\", overflow: \"hidden\", textOverflow: \"ellipsis\" }}>{node.label}</span>\n </div>\n {cfg.description && (\n <div style={{ fontSize: 11, color: \"rgba(0,0,0,0.55)\", marginBottom: 6, display: \"-webkit-box\", WebkitLineClamp: 2, WebkitBoxOrient: \"vertical\", overflow: \"hidden\" }}>{cfg.description}</div>\n )}\n <div style={{ display: \"flex\", gap: 6, flexWrap: \"wrap\", marginBottom: 6 }}>\n <Tag bordered={false} style={{ margin: 0, fontSize: 10, background: `${color}1A`, color }}>{cfg.type ?? \"capability\"}</Tag>\n {cfg.modelKey && <Tag bordered={false} style={{ margin: 0, fontSize: 10 }}>{cfg.modelKey}</Tag>}\n {cfg.version && <Tag bordered={false} style={{ margin: 0, fontSize: 10 }}>v{cfg.version}</Tag>}\n </div>\n {cfg.prompt && (\n <div style={{ fontSize: 10, color: \"#999\", background: \"#fafafa\", borderRadius: 6, padding: \"4px 8px\", overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {cfg.prompt}\n </div>\n )}\n </div>\n );\n};\n\n/** Category container: dashed box with a title + capability pills inside. */\nexport const GroupNode: React.FC<NodeProps<Node<{\n group: ConfigGroup;\n onClick?: (n: ConfigGraphNode) => void;\n onRemove?: (n: ConfigGraphNode) => void;\n}>>> = ({ data }) => {\n const { group, onClick, onRemove } = data;\n const color = configNodeColor(group.type);\n return (\n <div\n style={{\n border: `1.5px dashed ${color}66`,\n borderRadius: 12,\n padding: \"10px 12px\",\n background: \"rgba(255,255,255,0.8)\",\n minWidth: 170,\n }}\n >\n <CardinalHandles type=\"target\" />\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 5, marginBottom: 8 }}>\n {GROUP_ICON[group.type]}\n <span style={{ fontSize: 11, fontWeight: 600, color: \"#666\" }}>{group.label}</span>\n <span style={{ fontSize: 10, color: \"#bbb\" }}>({group.items.length})</span>\n </div>\n {group.items.length === 0 ? (\n <div style={{ fontSize: 10, color: \"#bbb\", padding: \"2px 0\" }}>empty</div>\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n {group.items.map((item) => (\n <div key={item.id} style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n <div\n onClick={(e) => { e.stopPropagation(); onClick?.(item); }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 5,\n padding: \"4px 8px\",\n borderRadius: 8,\n background: \"#fff\",\n border: `1px solid ${color}55`,\n fontSize: 11,\n color: \"#333\",\n cursor: \"pointer\",\n position: \"relative\",\n whiteSpace: \"nowrap\",\n }}\n >\n {GROUP_ICON[item.type]}\n <span style={{ overflow: \"hidden\", textOverflow: \"ellipsis\" }}>{item.label}</span>\n </div>\n {onRemove && (\n <button\n onClick={(e) => { e.stopPropagation(); onRemove(item); }}\n title={`Remove ${item.label}`}\n style={{\n width: 14,\n height: 14,\n borderRadius: \"50%\",\n border: \"none\",\n background: \"transparent\",\n color: \"#ccc\",\n fontSize: 9,\n lineHeight: 1,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 0,\n flexShrink: 0,\n }}\n >\n ✕\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n","import React from \"react\";\nimport { Handle, Position } from \"@xyflow/react\";\n\n/** Invisible handle at a cardinal edge; named so edges connect at the border. */\nexport const EdgeHandle: React.FC<{ id: string; position: Position; type?: \"source\" | \"target\" }> = ({ id, position, type = \"source\" }) => (\n <Handle\n id={id}\n type={type}\n position={position}\n style={{ opacity: 0, width: 0, height: 0, border: \"none\" }}\n isConnectable={false}\n />\n);\n","import React from \"react\";\nimport { Wrench, Blocks, Bot, GraduationCap, Cpu, FlaskConical } from \"lucide-react\";\nimport type { ConfigNodeType } from \"./configGraph\";\n\n/** Shared icon/label maps for config-graph node types (canvas + node dock). */\nexport const GROUP_ICON: Record<ConfigNodeType, React.ReactNode> = {\n agent: <Bot size={14} />,\n tool: <Wrench size={12} />,\n capability: <Blocks size={12} />,\n subagent: <Bot size={12} />,\n skill: <GraduationCap size={12} />,\n model: <Cpu size={12} />,\n eval: <FlaskConical size={12} />,\n};\n\nexport const GROUP_LABEL: Record<ConfigNodeType, string> = {\n agent: \"Agent\",\n tool: \"Tool\",\n capability: \"Capability\",\n subagent: \"Sub-Agent\",\n skill: \"Skill\",\n model: \"Model\",\n eval: \"Eval Suite\",\n};\n","import React, { useEffect, useState } from \"react\";\nimport { useThreadStats, useEvalQuality, relativeTime, runtimeBarOption } from \"./AgentOverview\";\nimport { MiniBarChart, MiniLineChart } from \"./MiniChart\";\nimport { LearningProgressCard } from \"./Learning/LearningProgressCard\";\nimport { LearningWorkflowGraph } from \"./Learning/LearningWorkflowGraph\";\nimport { ProjectSelector } from \"../Chat/ProjectSelector\";\nimport { EChart } from \"./EChart\";\nimport { CanvasDock } from \"./CanvasDock\";\nimport { EvalQualityPanel } from \"./EvalQualityPanel\";\nimport type { LearningTasksData } from \"./useEntityRefresher\";\nimport type { TaskFileRef } from \"@axiom-lattice/protocols\";\n\n/** Shared floating cards rendered over the Agent canvas. */\nexport interface CanvasOverlayProps {\n assistantId: string;\n projectId?: string | null;\n onProjectChange?: (projectId: string | null) => void;\n onLearningStarted?: (goal: string, roundTaskId: string, files?: TaskFileRef[]) => void;\n learningTasks?: LearningTasksData;\n topOffset?: number;\n onLearningRefresh?: () => Promise<void>;\n evalTick?: number;\n /** When false, the learning card is skipped (the agent canvas hosts learning content as zone nodes). */\n showLearning?: boolean;\n /** \"selector\" renders only the project selector — zone modules own the rest of the HUD. */\n variant?: \"full\" | \"selector\";\n}\n\nconst CARD_STYLE: React.CSSProperties = {\n background: \"rgba(255, 255, 255, 0.6)\",\n border: \"1px solid rgba(240, 240, 240, 0.7)\",\n borderRadius: 10,\n padding: \"8px 12px\",\n boxShadow: \"0 2px 10px rgba(0,0,0,0.06)\",\n backdropFilter: \"blur(8px)\",\n pointerEvents: \"auto\",\n cursor: \"pointer\",\n};\n\nconst noopRefresh = async (): Promise<void> => undefined;\nconst DEFAULT_LEARNING_TASKS: LearningTasksData = { rounds: [], round: null, subTasks: [], subTasksByRound: {}, loading: false };\n\nexport const CanvasOverlay: React.FC<CanvasOverlayProps> = ({\n assistantId,\n projectId,\n onProjectChange,\n onLearningStarted,\n learningTasks = DEFAULT_LEARNING_TASKS,\n topOffset = 12,\n onLearningRefresh,\n evalTick,\n showLearning = true,\n variant = \"full\",\n}) => {\n const [dashOpen, setDashOpen] = useState<\"runtime\" | \"eval\" | null>(null);\n const [workflowOpen, setWorkflowOpen] = useState(false);\n const threadStats = useThreadStats(assistantId);\n const evalData = useEvalQuality(assistantId);\n\n useEffect(() => {\n if (evalTick !== undefined && evalTick > 0) void evalData.refresh();\n }, [evalTick]);\n\n // Selector-only HUD: the agent canvas hosts its own zone modules + docks.\n if (variant === \"selector\") {\n return (\n <div style={{ position: \"absolute\", left: 12, top: topOffset, zIndex: 10, pointerEvents: \"none\" }}>\n <div style={{ pointerEvents: \"auto\" }}>\n <ProjectSelector kind=\"training\" disableDropdown={false} showWorkspace={false} value={projectId} onChange={onProjectChange} />\n </div>\n </div>\n );\n }\n\n return (\n <>\n <div style={{ position: \"absolute\", left: 12, top: topOffset, zIndex: 10, display: \"flex\", flexDirection: \"column\", gap: 8, pointerEvents: \"none\" }}>\n <div style={{ pointerEvents: \"auto\" }}>\n <ProjectSelector kind=\"training\" disableDropdown={false} showWorkspace={false} value={projectId} onChange={onProjectChange} />\n </div>\n <div onClick={() => setDashOpen(dashOpen === \"runtime\" ? null : \"runtime\")} title=\"Click for 30-day chart\" style={CARD_STYLE}>\n <div style={{ fontSize: 10, fontWeight: 600, color: \"#999\", marginBottom: 4 }}>Runtime</div>\n <div style={{ display: \"flex\", gap: 14, fontSize: 12, alignItems: \"center\" }}>\n <span><strong style={{ color: \"#595959\" }}>{threadStats.total}</strong> <span style={{ color: \"#bbb\" }}>threads</span></span>\n <span><strong style={{ color: \"#595959\" }}>{threadStats.last7d}</strong> <span style={{ color: \"#bbb\" }}>7d</span></span>\n <span><strong style={{ color: \"#595959\" }}>{threadStats.last30d}</strong> <span style={{ color: \"#bbb\" }}>30d</span></span>\n <span style={{ color: \"#999\" }}>{relativeTime(threadStats.lastActive)}</span>\n {threadStats.daily7d.length > 0 && <MiniBarChart values={threadStats.daily7d} width={56} height={20} color=\"#8c8c8c\" />}\n </div>\n </div>\n <div onClick={() => setDashOpen(dashOpen === \"eval\" ? null : \"eval\")} title=\"Click for score trend\" style={CARD_STYLE}>\n <div style={{ fontSize: 10, fontWeight: 600, color: \"#999\", marginBottom: 4 }}>Eval quality</div>\n <div style={{ display: \"flex\", gap: 14, fontSize: 12, alignItems: \"center\" }}>\n <span><strong style={{ color: evalData.score === null ? \"#d9d9d9\" : evalData.score >= 80 ? \"#22c55e\" : evalData.score >= 50 ? \"#f59e0b\" : \"#ef4444\" }}>{evalData.score !== null ? evalData.score.toFixed(1) : \"—\"}</strong> <span style={{ color: \"#bbb\" }}>score</span></span>\n <span><strong style={{ color: \"#595959\" }}>{evalData.passRate !== null ? `${evalData.passRate}%` : \"—\"}</strong> <span style={{ color: \"#bbb\" }}>pass</span></span>\n <span><strong style={{ color: \"#595959\" }}>{evalData.runCount}</strong> <span style={{ color: \"#bbb\" }}>runs</span></span>\n {evalData.scores.length > 1 && <MiniLineChart values={evalData.scores.slice(-10)} width={64} height={20} color={evalData.score === null ? \"#d9d9d9\" : evalData.score >= 80 ? \"#22c55e\" : evalData.score >= 50 ? \"#f59e0b\" : \"#ef4444\"} />}\n </div>\n </div>\n {showLearning && (\n <LearningProgressCard assistantId={assistantId} projectId={projectId} onLearningStarted={onLearningStarted} round={learningTasks.round} subTasks={learningTasks.subTasks} rounds={learningTasks.rounds} subTasksByRound={learningTasks.subTasksByRound} loading={learningTasks.loading} onRefresh={onLearningRefresh ?? noopRefresh} onExpandWorkflow={() => setWorkflowOpen(true)} />\n )}\n </div>\n {dashOpen === \"runtime\" && <div style={{ position: \"absolute\", left: 340, top: 12, zIndex: 11, background: \"#fff\", borderRadius: 12, padding: 16, border: \"1px solid #f0f0f0\", boxShadow: \"0 6px 24px rgba(0,0,0,0.15)\", width: 420 }}><div style={{ fontSize: 12, fontWeight: 600, color: \"rgba(0,0,0,0.65)\", marginBottom: 8 }}>Runtime — last 30 days</div><EChart option={runtimeBarOption(threadStats.daily30d)} height={220} /></div>}\n {dashOpen === \"eval\" && (\n <CanvasDock open width={720} title=\"Eval quality\" onClose={() => setDashOpen(null)}>\n <EvalQualityPanel agentId={assistantId} runs={evalData.runs ?? []} />\n </CanvasDock>\n )}\n {workflowOpen && (\n <CanvasDock open width={860} title=\"Learning workflow\" onClose={() => setWorkflowOpen(false)}>\n <LearningWorkflowGraph rounds={learningTasks.rounds} subTasksByRound={learningTasks.subTasksByRound} loading={learningTasks.loading} />\n </CanvasDock>\n )}\n </>\n );\n};\n","import React from \"react\";\n\n/** Mini bar chart (sparkline style) rendered with SVG. */\nexport const MiniBarChart: React.FC<{\n values: number[];\n width?: number;\n height?: number;\n color?: string;\n /** Color for zero-value placeholder bars (defaults to a light gray). */\n placeholderColor?: string;\n}> = ({\n values,\n width = 120,\n height = 32,\n color = \"#6366f1\",\n placeholderColor = \"#e5e5e5\",\n}) => {\n if (values.length === 0) return null;\n const max = Math.max(...values, 1);\n const barW = width / values.length;\n const pad = barW > 4 ? 1 : 0;\n const MIN_BAR_H = 2;\n return (\n <svg width={width} height={height} style={{ display: \"block\" }}>\n {values.map((v, i) => {\n const barH = Math.max((v / max) * height, MIN_BAR_H);\n return (\n <rect\n key={i}\n x={i * barW}\n y={height - barH}\n width={Math.max(barW - pad, 1)}\n height={barH}\n fill={v === 0 ? placeholderColor : color}\n rx={1}\n />\n );\n })}\n </svg>\n );\n};\n\n/** Mini line chart (sparkline style) rendered with SVG. */\nexport const MiniLineChart: React.FC<{ values: number[]; width?: number; height?: number; color?: string }> = ({\n values,\n width = 200,\n height = 40,\n color = \"#6366f1\",\n}) => {\n if (values.length === 0) return null;\n const min = Math.min(...values);\n const max = Math.max(...values);\n const range = max - min || 1;\n const pad = 2;\n const usableW = width - pad * 2;\n const xAt = (i: number) =>\n values.length === 1 ? width / 2 : pad + (i / (values.length - 1)) * usableW;\n const yAt = (v: number) => height - 2 - ((v - min) / range) * (height - 4);\n const points = values\n .map((v, i) => `${xAt(i)},${yAt(v)}`)\n .join(\" \");\n return (\n <svg width={width} height={height} style={{ display: \"block\" }}>\n <polyline points={points} fill=\"none\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n {values.map((v, i) => (\n <circle key={i} cx={xAt(i)} cy={yAt(v)} r=\"2.5\" fill={color} />\n ))}\n </svg>\n );\n};\n\n/** Horizontal progress bar (percentage). */\nexport const ProgressBar: React.FC<{ value: number; color?: string; width?: number; height?: number }> = ({\n value,\n color = \"#22c55e\",\n width = 160,\n height = 8,\n}) => {\n const pct = Math.min(100, Math.max(0, value));\n return (\n <svg width={width} height={height} style={{ display: \"block\" }}>\n <rect x={0} y={0} width={width} height={height} fill=\"#f0f0f0\" rx={height / 2} />\n <rect x={0} y={0} width={(pct / 100) * width} height={height} fill={color} rx={height / 2} />\n </svg>\n );\n};\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { App, Button, Select } from \"antd\";\nimport { PlusOutlined, ExpandOutlined } from \"@ant-design/icons\";\nimport { TaskOutlineList } from \"../../Tasks/TaskOutlineList\";\nimport { StartLearningModal } from \"./StartLearningModal\";\nimport { LearningTaskDetailModal, LearningWorkItemTransportContext } from \"./LearningTaskDetailModal\";\nimport type { LearningWorkItemTransport } from \"./LearningTaskDetailModal\";\nimport { useClient } from \"../../../context\";\nimport type { TaskFileRef, TaskItem, TaskWorkItem } from \"@axiom-lattice/protocols\";\n\nconst MAX_IN_FLIGHT_WORK_ITEM_REQUESTS = 32;\nconst RESERVED_FOREGROUND_WORK_ITEM_REQUESTS = 8;\nconst MAX_BACKGROUND_WORK_ITEM_REQUESTS = MAX_IN_FLIGHT_WORK_ITEM_REQUESTS - RESERVED_FOREGROUND_WORK_ITEM_REQUESTS;\n\ninterface WorkItemRequestEntry {\n promise: Promise<TaskWorkItem[]>;\n source: \"live\" | \"detail\";\n detailSession: number;\n}\n\n/** Props for the canvas-corner learning progress card. */\nexport interface LearningProgressCardProps {\n assistantId: string;\n /** Filter learning rounds to this project (undefined = all projects). */\n projectId?: string | null;\n /** Called after a learning round is started from this card (goal + round task id for kickoff). */\n onLearningStarted?: (goal: string, roundTaskId: string, files?: TaskFileRef[]) => void;\n /** The latest training round, any status (null = no rounds yet). */\n round: TaskItem | null;\n /** Full subtask tree under the latest round (all statuses). */\n subTasks: TaskItem[];\n /** All training rounds, newest first — enables the round filter dropdown. */\n rounds?: TaskItem[];\n /** Full subtask tree per round id — lets the card render any selected round. */\n subTasksByRound?: Record<string, TaskItem[]>;\n /** Selected round id when a parent owns the historical evidence scope. */\n selectedRoundId?: string | null;\n /** Reports round selection without mutating local selection in controlled mode. */\n onSelectedRoundChange?: (roundId: string) => void;\n loading: boolean;\n /** Refetch rounds + subtree (called after a new round is created). */\n onRefresh: () => Promise<void>;\n /** Delegates New Learning Task to a single modal owner when embedded. */\n onStartRequest?: () => void;\n /** Opens the large workflow-monitor view of the task tree (hosted by the parent). */\n onExpandWorkflow?: () => void;\n}\n\n/** First markdown heading of a string, with the `#` markers stripped. */\nfunction firstHeadingLine(markdown: string): string | undefined {\n for (const rawLine of markdown.split(\"\\n\")) {\n const match = rawLine.trim().match(/^#{1,6}\\s+(.*)$/);\n if (match) {\n const heading = match[1].trim();\n if (heading.length > 0) return heading;\n }\n }\n return undefined;\n}\n\n/** Live status text: the first heading of detail.markdown, else summary, else action. */\nfunction liveStatusText(item: TaskWorkItem): string {\n const markdown =\n typeof item.detail?.markdown === \"string\" && item.detail.markdown.length > 0 ? item.detail.markdown : undefined;\n if (markdown) {\n const heading = firstHeadingLine(markdown);\n if (heading) return heading;\n }\n return item.summary || item.action || \"\";\n}\n\nfunction isWaitingForApproval(task: TaskItem): boolean {\n const interruption = task.context?.interruption;\n return task.status === \"interrupted\"\n && typeof interruption === \"object\"\n && interruption !== null\n && (interruption as Record<string, unknown>).type === \"review_required\";\n}\n\nfunction withUiTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n return new Promise((resolve, reject) => {\n const timeoutId = window.setTimeout(() => reject(new Error(\"Work-item request timed out\")), timeoutMs);\n promise.then(\n (value) => {\n window.clearTimeout(timeoutId);\n resolve(value);\n },\n (error: unknown) => {\n window.clearTimeout(timeoutId);\n reject(error);\n }\n );\n });\n}\n\n/** Latest learning round and its full subtask tree (all statuses — completed tasks carry results). Data owned by useEntityRefresher. */\nexport const LearningProgressCard: React.FC<LearningProgressCardProps> = ({\n assistantId,\n projectId,\n onLearningStarted,\n round,\n subTasks,\n rounds,\n subTasksByRound,\n selectedRoundId: controlledSelectedRoundId,\n onSelectedRoundChange,\n loading,\n onRefresh,\n onStartRequest,\n onExpandWorkflow,\n}) => {\n const { message: messageApi } = App.useApp();\n const [modalOpen, setModalOpen] = useState(false);\n const [hideCompleted, setHideCompleted] = useState(false);\n const [selectedTask, setSelectedTask] = useState<TaskItem | null>(null);\n const [liveItem, setLiveItem] = useState<TaskWorkItem | null>(null);\n const client = useClient(\"__GLOBAL__\");\n const mountedRef = useRef(true);\n const workItemRequestsRef = useRef<Map<string, WorkItemRequestEntry>>(new Map());\n const supersededWorkItemRequestsRef = useRef<Set<Promise<TaskWorkItem[]>>>(new Set());\n const detailSessionRef = useRef(0);\n const liveTargetCursorRef = useRef(0);\n\n // Multi-round support: fall back to the single (latest) round when the\n // multi-round props aren't provided (backward-compatible with direct usage).\n const allRounds = rounds && rounds.length > 0 ? rounds : round ? [round] : [];\n const [internalSelectedRoundId, setInternalSelectedRoundId] = useState<string | null>(null);\n const isSelectionControlled = controlledSelectedRoundId !== undefined;\n const selectedRoundId = isSelectionControlled ? controlledSelectedRoundId : internalSelectedRoundId;\n const roundListKey = allRounds.map((r) => r.id).join(\",\");\n // Default to the latest round; keep the user's manual selection while valid.\n useEffect(() => {\n if (allRounds.length === 0) {\n setInternalSelectedRoundId(null);\n return;\n }\n setInternalSelectedRoundId((prev) => {\n if (prev && roundListKey.split(\",\").includes(prev)) return prev;\n return allRounds[0].id;\n });\n }, [roundListKey]);\n\n const selectedRound = allRounds.find((r) => r.id === selectedRoundId) ?? allRounds[0] ?? null;\n const selectRound = (roundId: string): void => {\n if (!isSelectionControlled) setInternalSelectedRoundId(roundId);\n onSelectedRoundChange?.(roundId);\n };\n const selectedSubTasks =\n subTasksByRound && selectedRound\n ? (subTasksByRound[selectedRound.id] ?? [])\n : selectedRound && selectedRound.id === round?.id\n ? subTasks\n : [];\n\n // Identity-stable across unrelated re-renders (live poll, toggles) so the\n // detail modal's refresh-sync effect fires only when the tree actually changes.\n const tree = useMemo(\n () => [selectedRound, ...selectedSubTasks].filter((t): t is TaskItem => t !== null),\n // Deps mirror the derived inputs; keeps `relatedTasks` identity stable for the modal.\n [round, subTasks, rounds, subTasksByRound, selectedRoundId]\n );\n // The round itself stays in_progress for its whole duration — live activity\n // means an in-progress SUBTASK; fall back to the round's own latest event.\n const activeTasks = selectedSubTasks.filter((t) => t.status === \"in_progress\");\n const activeTask = activeTasks[0] ?? null;\n // Poll only while something is actively running: in-progress subtasks, or the\n // round itself when it is still in_progress and has no in-progress subtask.\n // Idle rounds (completed/failed/cancelled/interrupted) stop the live poll.\n const isRoundLive = selectedRound?.status === \"in_progress\";\n const liveTargetIds = (activeTasks.length > 0\n ? activeTasks.map((task) => task.id)\n : isRoundLive && selectedRound ? [selectedRound.id] : []\n ).sort();\n const liveTargetKey = liveTargetIds.join(\",\");\n const clientRef = useRef(client);\n clientRef.current = client;\n /** Shared with the detail modal so live and detail requests reuse one in-flight request per task. */\n const detailTransportRef = useRef<LearningWorkItemTransport | null>(null);\n if (!detailTransportRef.current) {\n detailTransportRef.current = {\n getWorkItemRequest: (taskId, source, detailSession, foreground) => getWorkItemRequest(taskId, source, detailSession, foreground),\n getDetailSession: () => detailSessionRef.current,\n bumpDetailSession: () => { detailSessionRef.current += 1; },\n };\n }\n\n const getWorkItemRequest = (\n taskId: string,\n source: WorkItemRequestEntry[\"source\"],\n detailSession = detailSessionRef.current,\n foreground = false,\n ): WorkItemRequestEntry => {\n const existing = workItemRequestsRef.current.get(taskId);\n if (existing && (!foreground || existing.detailSession === detailSession)) return existing;\n if (existing) {\n workItemRequestsRef.current.delete(taskId);\n supersededWorkItemRequestsRef.current.add(existing.promise);\n void existing.promise.finally(() => {\n supersededWorkItemRequestsRef.current.delete(existing.promise);\n }).catch(() => undefined);\n }\n const requestLimit = foreground\n ? MAX_IN_FLIGHT_WORK_ITEM_REQUESTS\n : MAX_BACKGROUND_WORK_ITEM_REQUESTS;\n const trackedRequestCount = workItemRequestsRef.current.size + supersededWorkItemRequestsRef.current.size;\n if (trackedRequestCount >= requestLimit) {\n const unavailable = Promise.reject<TaskWorkItem[]>(new Error(\"Work-item request capacity reached\"));\n void unavailable.catch(() => undefined);\n return { promise: unavailable, source, detailSession };\n }\n let request: Promise<TaskWorkItem[]>;\n try {\n request = Promise.resolve(clientRef.current.tasks.workItems.list(taskId));\n } catch (error) {\n request = Promise.reject(error);\n }\n const entry: WorkItemRequestEntry = { promise: request, source, detailSession };\n workItemRequestsRef.current.set(taskId, entry);\n void request.finally(() => {\n if (workItemRequestsRef.current.get(taskId)?.promise === request) {\n workItemRequestsRef.current.delete(taskId);\n }\n }).catch(() => undefined);\n return entry;\n };\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n // Defer ownership release so React StrictMode's immediate effect replay can reuse transports.\n void Promise.resolve().then(() => {\n if (!mountedRef.current) {\n workItemRequestsRef.current.clear();\n supersededWorkItemRequestsRef.current.clear();\n }\n });\n // The client aborts underlying requests after five minutes; guards detach their UI ownership sooner.\n };\n }, []);\n\n useEffect(() => {\n if (liveTargetIds.length === 0) {\n setLiveItem(null);\n return;\n }\n setLiveItem(null);\n let cancelled = false;\n let pollId: number | undefined;\n const refreshLiveItem = (): Promise<unknown> => {\n // Pause while the tab is hidden: skip the fetch and don't reschedule —\n // the visibilitychange handler resumes on return.\n if (document.hidden) return Promise.resolve();\n const start = liveTargetCursorRef.current % liveTargetIds.length;\n const orderedIds = [...liveTargetIds.slice(start), ...liveTargetIds.slice(0, start)];\n liveTargetCursorRef.current = (start + MAX_IN_FLIGHT_WORK_ITEM_REQUESTS) % liveTargetIds.length;\n return Promise.allSettled(orderedIds.map((taskId) => withUiTimeout(getWorkItemRequest(taskId, \"live\").promise, 4_000)))\n .then((results) => {\n if (cancelled || !mountedRef.current) return;\n const itemGroups = results\n .filter((result): result is PromiseFulfilledResult<TaskWorkItem[]> => result.status === \"fulfilled\")\n .map((result) => result.value);\n if (itemGroups.length === 0) return;\n // Auto-generated \"Status changed to …\" entries carry no information — the\n // live line should show the last *meaningful* event instead.\n const meaningful = itemGroups.flat().filter((i) => !/^Status changed to\\b/i.test(i.summary ?? \"\"));\n const sorted = [...meaningful].sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n setLiveItem(sorted[0] ?? null);\n })\n .finally(() => {\n if (!cancelled && mountedRef.current && !document.hidden) {\n pollId = window.setTimeout(() => void refreshLiveItem(), 5_000);\n }\n });\n };\n const onVisibilityChange = () => {\n if (cancelled || !mountedRef.current || document.hidden) return;\n if (pollId !== undefined) window.clearTimeout(pollId);\n pollId = undefined;\n void refreshLiveItem();\n };\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n void refreshLiveItem();\n return () => {\n cancelled = true;\n if (pollId !== undefined) window.clearTimeout(pollId);\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n };\n }, [liveTargetKey]);\n\n /** Open a task's detail modal (drill-down/loading now owned by LearningTaskDetailModal). */\n const openTask = (task: TaskItem) => setSelectedTask(task);\n\n const handleCreated = (roundTaskId: string, _threadId: string, goal: string, files?: TaskFileRef[]) => {\n // Jump to the just-created round so the new learning task is in view.\n selectRound(roundTaskId);\n setModalOpen(false);\n let refreshPromise: Promise<void>;\n try {\n refreshPromise = Promise.resolve(onRefresh());\n } catch {\n refreshPromise = Promise.reject(new Error(\"Task-list refresh failed\"));\n }\n void refreshPromise.catch(() => {\n if (mountedRef.current) messageApi.error(\"Task created, but the task list could not be refreshed\");\n });\n onLearningStarted?.(goal, roundTaskId, files);\n };\n\n return (\n <div style={{ background: \"rgba(255, 255, 255, 0.6)\", border: \"1px solid rgba(240, 240, 240, 0.7)\", borderRadius: 10, padding: \"8px 10px\", boxShadow: \"0 2px 10px rgba(0,0,0,0.06)\", backdropFilter: \"blur(8px)\", pointerEvents: \"auto\", width: 300 }}>\n {loading ? (\n <div style={{ fontSize: 12, color: \"#bbb\", padding: \"4px 2px\" }}>Loading...</div>\n ) : selectedRound ? (\n <div>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 6, padding: \"0 2px 6px\", borderBottom: \"1px solid rgba(240,240,240,0.7)\", marginBottom: 6 }}>\n <span style={{ fontSize: 12, fontWeight: 600, color: \"#595959\" }}>Learning Tasks</span>\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 2 }}>\n {onExpandWorkflow && (\n <Button size=\"small\" type=\"text\" aria-label=\"Open workflow view\" icon={<ExpandOutlined />} onClick={onExpandWorkflow} />\n )}\n <Button size=\"small\" type=\"text\" icon={<PlusOutlined />} onClick={() => onStartRequest ? onStartRequest() : setModalOpen(true)} style={{ fontSize: 12 }}>\n New Learning Task\n </Button>\n </span>\n </div>\n {allRounds.length > 1 && (\n <Select\n size=\"small\"\n data-testid=\"round-filter\"\n style={{ width: \"100%\", marginBottom: 6 }}\n value={selectedRound.id}\n onChange={selectRound}\n options={allRounds.map((r) => ({\n value: r.id,\n label: `${r.title || r.id} (${r.status})`,\n }))}\n />\n )}\n {(() => {\n const reviewTasks = tree.filter(isWaitingForApproval);\n return reviewTasks.length > 0 ? (\n <Button\n type=\"text\"\n data-testid=\"review-banner\"\n aria-label={`Open ${reviewTasks.length} task${reviewTasks.length > 1 ? \"s\" : \"\"} waiting for approval`}\n onClick={() => openTask(reviewTasks[0])}\n style={{\n display: \"flex\", alignItems: \"center\", justifyContent: \"flex-start\", gap: 6, cursor: \"pointer\", width: \"100%\", height: \"auto\",\n fontSize: 12, fontWeight: 600, color: \"#b45309\",\n background: \"rgba(245,158,11,0.12)\", border: \"1px solid rgba(245,158,11,0.35)\",\n borderRadius: 8, padding: \"5px 8px\", marginBottom: 6,\n }}\n >\n {reviewTasks.length} item{reviewTasks.length > 1 ? \"s\" : \"\"} waiting for approval\n </Button>\n ) : null;\n })()}\n {liveItem && (\n <div\n data-testid=\"live-status\"\n style={{ display: \"flex\", alignItems: \"center\", gap: 6, fontSize: 12, color: \"#666\", padding: \"2px 2px 6px\", borderBottom: \"1px solid rgba(240,240,240,0.7)\", marginBottom: 4 }}\n >\n <span\n style={{\n width: 6, height: 6, borderRadius: \"50%\", flexShrink: 0,\n background: activeTask ? \"#3b82f6\" : \"#bbb\",\n animation: activeTask ? \"live-pulse 1.2s ease-in-out infinite\" : undefined,\n }}\n />\n <span style={{ overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {liveStatusText(liveItem)}\n </span>\n <style>{`@keyframes live-pulse { 0%,100% { opacity: 1; } 50% { opacity: 0.3; } }`}</style>\n </div>\n )}\n <div style={{ maxHeight: 240, overflow: \"auto\" }}>\n <TaskOutlineList\n tasks={[selectedRound, ...selectedSubTasks]}\n loading={false}\n onTaskClick={openTask}\n hideCompleted={hideCompleted}\n onHideCompletedChange={setHideCompleted}\n />\n </div>\n </div>\n ) : (\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", padding: \"4px 2px\" }}>\n <span style={{ fontSize: 12, color: \"#999\" }}>No learning tasks yet</span>\n <Button size=\"small\" icon={<PlusOutlined />} onClick={() => onStartRequest ? onStartRequest() : setModalOpen(true)}>New Learning Task</Button>\n </div>\n )}\n {!onStartRequest && <StartLearningModal open={modalOpen} agentId={assistantId} defaultProjectId={projectId} onClose={() => setModalOpen(false)} onCreated={handleCreated} />}\n\n <LearningWorkItemTransportContext.Provider value={detailTransportRef.current}>\n <LearningTaskDetailModal\n task={selectedTask}\n relatedTasks={tree}\n onClose={() => setSelectedTask(null)}\n onRefresh={onRefresh}\n />\n </LearningWorkItemTransportContext.Provider>\n </div>\n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport { Alert, App, Button, Form, Input, Modal } from \"antd\";\nimport { useApi } from \"../../../hooks/useApi\";\nimport { useClient } from \"../../../context\";\nimport { useWorkspaceContext } from \"../../../context/WorkspaceContext\";\nimport { ReferenceFilesUpload } from \"./ReferenceFilesUpload\";\nimport { TrainingContextCard } from \"./TrainingContextCard\";\nimport {\n startLearningRound,\n isTrainingRound,\n isActiveTrainingRound,\n buildTrainingRoundsQuery,\n buildBuilderThreadId,\n} from \"./trainingUtils\";\nimport type { TaskFileRef, TaskItem } from \"@axiom-lattice/protocols\";\n\n/** Props for the start-learning modal (existing agent). */\nexport interface StartLearningModalProps {\n open: boolean;\n agentId: string;\n /** The learning project selected by the Agent detail page. */\n defaultProjectId?: string | null;\n onClose: () => void;\n /** Called with the created round task id, the training thread id, the goal, and attached reference files. */\n onCreated: (roundTaskId: string, threadId: string, goal: string, files?: TaskFileRef[]) => void;\n}\n\n/** Create a learning round for an existing agent (architect executes in the canvas copilot). */\nexport const StartLearningModal: React.FC<StartLearningModalProps> = ({ open, agentId, defaultProjectId, onClose, onCreated }) => {\n const { get, post, put } = useApi();\n const { message: messageApi } = App.useApp();\n const client = useClient(\"agent-architect\");\n const { trainingProjects, loading: workspaceLoading } = useWorkspaceContext();\n /** The detail page owns the learning project scope; this modal cannot switch it. */\n const trainingProject = trainingProjects.find((p) => p.id === defaultProjectId) ?? null;\n const [form] = Form.useForm();\n const [submitting, setSubmitting] = useState(false);\n const [activeRound, setActiveRound] = useState<TaskItem | null>(null);\n const [existingThreadId, setExistingThreadId] = useState<string | null>(null);\n /** Reference files already uploaded to the shared training project, stored on the round task. */\n const [refFiles, setRefFiles] = useState<TaskFileRef[]>([]);\n\n // The learning round always associates with the architect's builder thread\n // for this agent (`{tenant}:{agentId}`) — the same thread the canvas\n // CopilotPanel uses — so the copilot conversation and the learning task\n // share one context.\n useEffect(() => {\n if (!open) return;\n setExistingThreadId(buildBuilderThreadId(client.tenantId, agentId));\n // Fresh form on every open — leftover refs would point at a previous session's uploads.\n setRefFiles([]);\n }, [open, client, agentId]);\n\n useEffect(() => {\n if (!open) return;\n let cancelled = false;\n void (async () => {\n try {\n // Scope the query to the training project and declare the matching\n // x-project-id header — an unscoped tasks query with a non-default\n // ambient project header is rejected as PROJECT_TASK_SCOPE_CONFLICT.\n const res = await get<{ data?: TaskItem[] }>(\n buildTrainingRoundsQuery(agentId, trainingProject?.id ?? undefined),\n trainingProject ? { headers: { \"x-project-id\": trainingProject.id } } : undefined,\n );\n if (cancelled) return;\n const rounds = (res.data ?? []).filter(isTrainingRound);\n setActiveRound(rounds.find(isActiveTrainingRound) ?? null);\n } catch {\n /* proceed without mutex info */\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [open, get, agentId, trainingProject]);\n\n const handleSubmit = async (values: { goal: string }) => {\n if (!trainingProject) {\n messageApi.error(\"No learning project is available\");\n return;\n }\n setSubmitting(true);\n try {\n const { roundTaskId, threadId } = await startLearningRound({\n goal: values.goal,\n targetAgentId: agentId,\n workspaceId: trainingProject.workspaceId,\n projectId: trainingProject.id,\n existingThreadId,\n files: refFiles,\n post,\n put,\n });\n messageApi.success(\"Learning task created. Preparing the Architect…\");\n form.resetFields();\n onCreated(roundTaskId, threadId, values.goal, refFiles);\n setRefFiles([]);\n } catch (err) {\n messageApi.error(err instanceof Error ? err.message : \"Failed to create the learning task. Please try again.\");\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <Modal title=\"New Learning Task\" open={open} onCancel={onClose} footer={null} width={520} destroyOnClose>\n {activeRound && (\n <Alert\n type=\"warning\"\n showIcon\n style={{ marginBottom: 16 }}\n message=\"A learning task is already in progress. Complete it before starting a new one.\"\n />\n )}\n <Form form={form} layout=\"vertical\" onFinish={handleSubmit}>\n <Form.Item label=\"Learning Goal for This Round\" name=\"goal\" rules={[{ required: true, message: \"Please describe what you want this agent to learn or improve in this round\" }]}>\n <Input.TextArea rows={3} placeholder=\"e.g. Improve the agent's accuracy when handling price disputes based on the price protection policy\" />\n </Form.Item>\n {trainingProject && (\n <Form.Item\n label={\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 12 }}>\n <span>Reference Materials</span>\n <TrainingContextCard\n project={trainingProject}\n selectable={false}\n loading={workspaceLoading}\n />\n </div>\n }\n extra=\"Optional. These materials will be used as reference for this learning round.\"\n style={{ marginBottom: 16 }}\n colon={false}\n >\n <ReferenceFilesUpload projectId={trainingProject.id} value={refFiles} onChange={setRefFiles} />\n </Form.Item>\n )}\n {!trainingProject && !workspaceLoading && (\n <Form.Item style={{ marginBottom: 16 }}>\n <TrainingContextCard\n project={trainingProject}\n projects={trainingProjects}\n loading={workspaceLoading}\n />\n </Form.Item>\n )}\n <Form.Item style={{ marginBottom: 0, textAlign: \"right\" }}>\n <Button onClick={onClose} style={{ marginRight: 8 }}>\n Cancel\n </Button>\n <Button\n type=\"primary\"\n htmlType=\"submit\"\n loading={submitting}\n disabled={!!activeRound || workspaceLoading || !trainingProject}\n >\n Start Learning\n </Button>\n </Form.Item>\n </Form>\n </Modal>\n );\n};\n","import React, { useRef, useState } from \"react\";\nimport { Upload, message } from \"antd\";\nimport type { UploadFile, UploadProps } from \"antd\";\nimport { Paperclip } from \"lucide-react\";\nimport { useWorkspaceContext } from \"../../../context/WorkspaceContext\";\nimport type { TaskFileRef } from \"@axiom-lattice/protocols\";\n\n/**\n * ReferenceFilesUpload — file picker that uploads straight into a project's\n * sandbox (`/project/uploads`) and reports the resulting task file refs.\n * Shared by the learn-to-build creation flows (CreateAssistantModal learn mode,\n * StartLearningModal).\n */\nexport interface ReferenceFilesUploadProps {\n /** Target project — uploads land in this project's sandbox. */\n projectId: string;\n /** Uploaded refs (controlled). */\n value: TaskFileRef[];\n onChange: (files: TaskFileRef[]) => void;\n}\n\nexport const ReferenceFilesUpload: React.FC<ReferenceFilesUploadProps> = ({ projectId, value, onChange }) => {\n const { uploadFileToProject } = useWorkspaceContext();\n /** In-flight/failed uploads; completed ones live in `value`. */\n const [pending, setPending] = useState<UploadFile[]>([]);\n /** Current project — stale async completions close over the old prop value. */\n const projectIdRef = useRef(projectId);\n projectIdRef.current = projectId;\n\n const doneList: UploadFile[] = value.map((f) => ({\n uid: f.uri,\n name: f.name || f.uri,\n status: \"done\",\n response: { uri: f.uri, name: f.name },\n }));\n\n const uploadRequest: UploadProps[\"customRequest\"] = async (options) => {\n const file = options.file as File;\n try {\n const item = await uploadFileToProject(projectId, \"/project/uploads\", file);\n // Tag the response with the project so a stale completion (upload started\n // before a project switch) can be discarded in onChange.\n options.onSuccess?.({ uri: item.path, name: file.name, projectId });\n } catch (err) {\n options.onError?.(err instanceof Error ? err : new Error(\"Upload failed\"));\n }\n };\n\n const handleChange: UploadProps[\"onChange\"] = (info) => {\n const { file } = info;\n if (file.status === \"done\" && file.response?.uri) {\n if (file.response.projectId && file.response.projectId !== projectIdRef.current) {\n // Upload finished after the project switched — its URI points at the old project.\n setPending(info.fileList.filter((f) => f.status === \"uploading\" || f.status === \"error\"));\n return;\n }\n const ref: TaskFileRef = { uri: file.response.uri, name: file.response.name || file.name, addedBy: \"user\" };\n if (!value.some((f) => f.uri === ref.uri)) {\n onChange([...value, ref]);\n }\n }\n if (file.status === \"error\") {\n message.error(`Failed to upload \"${file.name}\"`);\n }\n setPending(info.fileList.filter((f) => f.status === \"uploading\" || f.status === \"error\"));\n };\n\n const handleRemove: UploadProps[\"onRemove\"] = (file) => {\n if (file.status === \"done\") {\n const uri = (file.response as { uri?: string } | undefined)?.uri;\n onChange(value.filter((f) => f.uri !== uri && f.name !== file.name));\n } else {\n setPending((prev) => prev.filter((f) => f.uid !== file.uid));\n }\n };\n\n return (\n <div data-testid=\"reference-files-field\">\n {/* key remounts the picker when the project changes, dropping stale uploads */}\n <Upload.Dragger\n key={projectId}\n multiple\n fileList={[...doneList, ...pending]}\n customRequest={uploadRequest}\n onChange={handleChange}\n onRemove={handleRemove}\n style={{ padding: \"8px 0\" }}\n >\n <p className=\"ant-upload-drag-icon\" style={{ marginBottom: 4 }}>\n <Paperclip size={24} style={{ color: \"#6366f1\" }} />\n </p>\n <p className=\"ant-upload-text\" style={{ fontSize: 13 }}>\n Click or drag files to this area to upload\n </p>\n <p className=\"ant-upload-hint\" style={{ fontSize: 12 }}>\n Files are stored in the selected project under /project/uploads\n </p>\n </Upload.Dragger>\n </div>\n );\n};\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { App, Modal } from \"antd\";\nimport { TaskDetailPanel } from \"../../Tasks/TaskDetailPanel\";\nimport { TASK_DETAIL_MODAL_WIDTH } from \"../../Tasks/taskDetailLayout\";\nimport { useOpenTaskChat } from \"../../Tasks/useOpenTaskChat\";\nimport { useClient } from \"../../../context\";\nimport type { TaskItem, TaskWorkItem } from \"@axiom-lattice/protocols\";\n\nconst MAX_IN_FLIGHT_WORK_ITEM_REQUESTS = 32;\nconst RESERVED_FOREGROUND_WORK_ITEM_REQUESTS = 8;\nconst MAX_BACKGROUND_WORK_ITEM_REQUESTS = MAX_IN_FLIGHT_WORK_ITEM_REQUESTS - RESERVED_FOREGROUND_WORK_ITEM_REQUESTS;\nconst WORK_ITEMS_ERROR = \"Activity could not be loaded. Please try again shortly.\";\nconst WORK_ITEMS_CAPACITY_ERROR = \"Too many activity requests are still pending. Please try again shortly.\";\n\ninterface WorkItemRequestEntry {\n promise: Promise<TaskWorkItem[]>;\n source: \"live\" | \"detail\";\n detailSession: number;\n}\n\n/**\n * Work-item request guard shared between the learning card's live-status poll\n * and the detail modal, so both reuse one in-flight request per task\n * (mirrors the original single-component transport).\n */\nexport interface LearningWorkItemTransport {\n getWorkItemRequest: (\n taskId: string,\n source: WorkItemRequestEntry[\"source\"],\n detailSession?: number,\n foreground?: boolean,\n ) => WorkItemRequestEntry;\n getDetailSession: () => number;\n bumpDetailSession: () => void;\n}\n\n/** Provided by LearningProgressCard; standalone modal usage falls back to its own transport. */\nexport const LearningWorkItemTransportContext = React.createContext<LearningWorkItemTransport | null>(null);\n\n/**\n * Internal: lets the modal host mirror the body's displayed (drilled) task in\n * its aria dialog title. No-op for standalone body usage (the inline pane).\n */\nconst LearningTaskDetailDisplayedTaskContext = React.createContext<(root: TaskItem, displayed: TaskItem) => void>(() => undefined);\n\nfunction statusSuccessMessage(status: TaskItem[\"status\"]): string {\n if (status === \"in_progress\") return \"Task retry started\";\n if (status === \"cancelled\") return \"Task cancelled\";\n return \"Task updated\";\n}\n\nfunction withUiTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n return new Promise((resolve, reject) => {\n const timeoutId = window.setTimeout(() => reject(new Error(\"Work-item request timed out\")), timeoutMs);\n promise.then(\n (value) => {\n window.clearTimeout(timeoutId);\n resolve(value);\n },\n (error: unknown) => {\n window.clearTimeout(timeoutId);\n reject(error);\n }\n );\n });\n}\n\n/** Props for the learning task detail body (modal content / inline canvas pane). */\nexport interface LearningTaskDetailBodyProps {\n /** The task whose detail is open. */\n task: TaskItem;\n /** Current subtree snapshot — related-task navigation, subtask/parent links, and refresh sync. */\n relatedTasks: TaskItem[];\n /** Closes the detail (the owner drops its selection). */\n onClose: () => void;\n /** Refetches the task tree after a lifecycle transition succeeds. */\n onRefresh?: () => Promise<void>;\n /** Bound for the detail panel's scroll container (e.g. \"100%\" inside the inline pane). */\n height?: number | string;\n}\n\n/**\n * Detail body for a learning task: the full detail panel — drill stack,\n * activity feed, and lifecycle actions — without any of its own chrome. The\n * host (task-detail modal or the canvas dock) owns the title bar and close\n * affordance; close-on-vanish still reports through `onClose`.\n */\nexport const LearningTaskDetailBody: React.FC<LearningTaskDetailBodyProps> = ({\n task,\n relatedTasks,\n onClose,\n onRefresh,\n height,\n}) => {\n const { message: messageApi } = App.useApp();\n /** Task shown after drilling down from the entry task; null = show the entry task. */\n const [drilledTask, setDrilledTask] = useState<TaskItem | null>(null);\n /** Drill-down stack: tasks above the current one (mirrors TasksSideApp). */\n const [detailStack, setDetailStack] = useState<TaskItem[]>([]);\n const [workItems, setWorkItems] = useState<TaskWorkItem[]>([]);\n const [workItemsLoading, setWorkItemsLoading] = useState(false);\n const [workItemsError, setWorkItemsError] = useState<string | null>(null);\n const [transitioningTaskIds, setTransitioningTaskIds] = useState<Set<string>>(() => new Set());\n const client = useClient(\"__GLOBAL__\");\n /** Shared with the card's live poll when embedded; standalone usage falls back to a private transport. */\n const injectedTransport = React.useContext(LearningWorkItemTransportContext);\n const transport: LearningWorkItemTransport = injectedTransport ?? {\n getWorkItemRequest: (taskId, source, detailSession, foreground) => getWorkItemRequest(taskId, source, detailSession, foreground),\n getDetailSession: () => detailSessionRef.current,\n bumpDetailSession: () => { detailSessionRef.current += 1; },\n };\n const workItemRequestRef = useRef(0);\n const selectedTaskIdRef = useRef<string | null>(null);\n const transitioningTaskIdsRef = useRef<Set<string>>(new Set());\n const mountedRef = useRef(true);\n const workItemRequestsRef = useRef<Map<string, WorkItemRequestEntry>>(new Map());\n const supersededWorkItemRequestsRef = useRef<Set<Promise<TaskWorkItem[]>>>(new Set());\n const detailSessionRef = useRef(0);\n const clientRef = useRef(client);\n clientRef.current = client;\n /** Latest transport for the unmount cleanup (the injected/fallback choice churns per render). */\n const transportRef = useRef(transport);\n transportRef.current = transport;\n\n /** The task currently displayed: the drilled selection, else the owner-selected entry task. */\n const displayedTask = drilledTask ?? task;\n\n const getWorkItemRequest = (\n taskId: string,\n source: WorkItemRequestEntry[\"source\"],\n detailSession = detailSessionRef.current,\n foreground = false,\n ): WorkItemRequestEntry => {\n const existing = workItemRequestsRef.current.get(taskId);\n if (existing && (!foreground || existing.detailSession === detailSession)) return existing;\n if (existing) {\n workItemRequestsRef.current.delete(taskId);\n supersededWorkItemRequestsRef.current.add(existing.promise);\n void existing.promise.finally(() => {\n supersededWorkItemRequestsRef.current.delete(existing.promise);\n }).catch(() => undefined);\n }\n const requestLimit = foreground\n ? MAX_IN_FLIGHT_WORK_ITEM_REQUESTS\n : MAX_BACKGROUND_WORK_ITEM_REQUESTS;\n const trackedRequestCount = workItemRequestsRef.current.size + supersededWorkItemRequestsRef.current.size;\n if (trackedRequestCount >= requestLimit) {\n const unavailable = Promise.reject<TaskWorkItem[]>(new Error(\"Work-item request capacity reached\"));\n void unavailable.catch(() => undefined);\n return { promise: unavailable, source, detailSession };\n }\n let request: Promise<TaskWorkItem[]>;\n try {\n request = Promise.resolve(clientRef.current.tasks.workItems.list(taskId));\n } catch (error) {\n request = Promise.reject(error);\n }\n const entry: WorkItemRequestEntry = { promise: request, source, detailSession };\n workItemRequestsRef.current.set(taskId, entry);\n void request.finally(() => {\n if (workItemRequestsRef.current.get(taskId)?.promise === request) {\n workItemRequestsRef.current.delete(taskId);\n }\n }).catch(() => undefined);\n return entry;\n };\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n selectedTaskIdRef.current = null;\n workItemRequestRef.current += 1;\n // The request session dies with this body: bump so a shared transport\n // never adopts a stale request into a reopened detail (the modal close\n // path unmounts this body without running closeDetail).\n transportRef.current.bumpDetailSession();\n // Defer ownership release so React StrictMode's immediate effect replay can reuse transports.\n void Promise.resolve().then(() => {\n if (!mountedRef.current) {\n workItemRequestsRef.current.clear();\n supersededWorkItemRequestsRef.current.clear();\n transitioningTaskIdsRef.current.clear();\n }\n });\n // The client aborts underlying requests after five minutes; guards detach their UI ownership sooner.\n };\n }, []);\n\n const loadWorkItems = (taskId: string, showLoading = true): Promise<void> => {\n const request = showLoading ? ++workItemRequestRef.current : workItemRequestRef.current;\n if (showLoading && mountedRef.current) setWorkItemsLoading(true);\n const detailSession = transport.getDetailSession();\n const entry = transport.getWorkItemRequest(taskId, \"detail\", detailSession, showLoading);\n const belongsToDetailSession = entry.detailSession === detailSession;\n return withUiTimeout(entry.promise, 4_000)\n .then((items) => {\n if (belongsToDetailSession && mountedRef.current && request === workItemRequestRef.current && selectedTaskIdRef.current === taskId) {\n setWorkItems(items);\n setWorkItemsError(null);\n }\n })\n .catch((error: unknown) => {\n if (belongsToDetailSession && showLoading && mountedRef.current && request === workItemRequestRef.current && selectedTaskIdRef.current === taskId) {\n setWorkItems([]);\n setWorkItemsError(error instanceof Error && error.message === \"Work-item request capacity reached\"\n ? WORK_ITEMS_CAPACITY_ERROR\n : WORK_ITEMS_ERROR);\n }\n })\n .finally(() => {\n if (belongsToDetailSession && mountedRef.current && request === workItemRequestRef.current && selectedTaskIdRef.current === taskId) {\n setWorkItemsLoading(false);\n }\n });\n };\n\n /** Show a task in the detail body; optionally push the current task onto the drill stack. */\n const showTask = (next: TaskItem, pushCurrent: boolean) => {\n if (pushCurrent) {\n setDetailStack((stack) => (displayedTask ? [...stack, displayedTask] : stack));\n }\n selectedTaskIdRef.current = next.id;\n setDrilledTask(next);\n setWorkItems([]);\n setWorkItemsError(null);\n void loadWorkItems(next.id);\n };\n\n const openTask = (next: TaskItem) => showTask(next, true);\n\n /** Pop the drill stack; the root detail is closed only through the ✕ / owner. */\n const handleBack = () => {\n if (detailStack.length === 0) return;\n const previous = detailStack[detailStack.length - 1];\n setDetailStack(detailStack.slice(0, -1));\n showTask(previous, false);\n };\n\n /** Close the detail and reset the drill stack. */\n const closeDetail = () => {\n transport.bumpDetailSession();\n selectedTaskIdRef.current = null;\n workItemRequestRef.current += 1;\n setDrilledTask(null);\n setDetailStack([]);\n setWorkItems([]);\n setWorkItemsLoading(false);\n setWorkItemsError(null);\n onClose();\n };\n\n /** Status transitions mirror TasksSideApp; the feed and tree refresh afterwards. */\n const updateStatus = async (status: TaskItem[\"status\"], failureReason?: string) => {\n const taskId = selectedTaskIdRef.current;\n if (!taskId || transitioningTaskIdsRef.current.has(taskId)) return;\n const successMessage = statusSuccessMessage(status);\n transitioningTaskIdsRef.current.add(taskId);\n setTransitioningTaskIds((ids) => new Set(ids).add(taskId));\n try {\n try {\n await clientRef.current.tasks.update(taskId, failureReason ? { status, failureReason } : { status });\n } catch {\n if (mountedRef.current) messageApi.error(\"Operation failed, please retry\");\n return;\n }\n if (!mountedRef.current) return;\n if (selectedTaskIdRef.current === taskId) {\n setDrilledTask((prev) => {\n if (!mountedRef.current || prev?.id !== taskId || selectedTaskIdRef.current !== taskId) return prev;\n void loadWorkItems(taskId, false);\n return { ...prev, status, ...(failureReason ? { failureReason } : {}) };\n });\n }\n if (mountedRef.current) messageApi.success(successMessage);\n if (onRefresh) {\n void Promise.resolve()\n .then(onRefresh)\n .catch(() => {\n if (mountedRef.current) messageApi.warning(`${successMessage}, but the task list could not be refreshed`);\n });\n }\n } finally {\n transitioningTaskIdsRef.current.delete(taskId);\n if (mountedRef.current) {\n setTransitioningTaskIds((ids) => {\n const next = new Set(ids);\n next.delete(taskId);\n return next;\n });\n }\n }\n };\n\n // An entry switch (or a remount for a fresh open) resets the drill state and\n // starts a fresh request session for the new task.\n useEffect(() => {\n if (selectedTaskIdRef.current === task.id) return;\n setDetailStack([]);\n showTask(task, false);\n }, [task]);\n\n // Sync the displayed task and drill stack from refreshed tree snapshots; a\n // displayed task removed from the tree closes the detail.\n useEffect(() => {\n const selectedId = selectedTaskIdRef.current;\n if (!selectedId) return;\n const refreshedTask = relatedTasks.find((task) => task.id === selectedId);\n if (!refreshedTask) {\n closeDetail();\n return;\n }\n setDrilledTask((prev) => (prev && prev.id === selectedId ? refreshedTask : prev));\n const tasksById = new Map(relatedTasks.map((task) => [task.id, task]));\n setDetailStack((stack) => stack.flatMap((task) => {\n const refreshed = tasksById.get(task.id);\n return refreshed ? [refreshed] : [];\n }));\n void loadWorkItems(selectedId, false);\n }, [task, relatedTasks]);\n\n useEffect(() => {\n if (!displayedTask?.id) return;\n const taskId = displayedTask.id;\n let cancelled = false;\n let pollId: number | undefined;\n const poll = async (): Promise<void> => {\n // Pause while the tab is hidden: skip the fetch and don't reschedule —\n // the visibilitychange handler resumes on return.\n if (document.hidden) return;\n await loadWorkItems(taskId, false);\n if (!cancelled && mountedRef.current && selectedTaskIdRef.current === taskId && !document.hidden) {\n pollId = window.setTimeout(() => void poll(), 5_000);\n }\n };\n const onVisibilityChange = () => {\n if (cancelled || !mountedRef.current || document.hidden) return;\n if (pollId !== undefined) window.clearTimeout(pollId);\n pollId = undefined;\n void poll();\n };\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n void poll();\n return () => {\n cancelled = true;\n if (pollId !== undefined) window.clearTimeout(pollId);\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n };\n }, [displayedTask?.id]);\n\n /** Open the selected task's thread in the chat side panel — shared with TasksSideApp. */\n const handleViewChat = useOpenTaskChat(displayedTask);\n // The modal host mirrors the displayed (drilled) task for its aria dialog title.\n const reportDisplayedTask = React.useContext(LearningTaskDetailDisplayedTaskContext);\n useEffect(() => {\n reportDisplayedTask(task, displayedTask);\n }, [reportDisplayedTask, task, displayedTask]);\n const transitionPending = displayedTask ? transitioningTaskIds.has(displayedTask.id) : false;\n const lifecycleActions = displayedTask?.ownerType === \"agent\" ? {\n onApprove: undefined as never,\n onReject: undefined as never,\n onRetry: undefined as never,\n onCancel: undefined as never,\n } : {\n onApprove: undefined as never,\n onReject: undefined as never,\n onRetry: () => void updateStatus(\"in_progress\"),\n onCancel: () => void updateStatus(\"cancelled\"),\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n background: \"#fff\",\n border: \"1px solid rgba(5,5,5,0.15)\",\n borderRadius: 12,\n overflow: \"hidden\",\n }}\n >\n <div style={{ flex: 1, minHeight: 0 }}>\n <TaskDetailPanel\n task={displayedTask}\n relatedTasks={relatedTasks}\n onRelatedTaskClick={openTask}\n workItems={workItems}\n loading={workItemsLoading}\n activityError={workItemsError ?? undefined}\n transitionPending={transitionPending}\n {...lifecycleActions}\n onViewChat={handleViewChat}\n onBack={handleBack}\n canGoBack={detailStack.length > 0}\n maxHeight={height}\n focusKey={`${displayedTask.id}:${transitionPending ? \"updating\" : displayedTask.status}`}\n subtasks={relatedTasks.filter((t) => t.parentId === displayedTask.id)}\n onSubtaskClick={openTask}\n parent={relatedTasks.find((t) => t.id === displayedTask.parentId) ?? null}\n onParentClick={openTask}\n />\n </div>\n </div>\n );\n};\n\n/** Props for the learning task detail modal. */\nexport interface LearningTaskDetailModalProps {\n /** The task whose detail is open; null = closed. */\n task: TaskItem | null;\n /** Current subtree snapshot — related-task navigation, subtask/parent links, and refresh sync. */\n relatedTasks: TaskItem[];\n /** Closes the modal (the owner drops its selection). */\n onClose: () => void;\n /** Refetches the task tree after a lifecycle transition succeeds. */\n onRefresh?: () => Promise<void>;\n}\n\n/** Detail modal for a learning task: the flat detail body hosted in a controlled modal. */\nexport const LearningTaskDetailModal: React.FC<LearningTaskDetailModalProps> = ({\n task,\n relatedTasks,\n onClose,\n onRefresh,\n}) => {\n // The dialog title follows the displayed (drilled) task — the Body no\n // longer self-titles, so this is the single visible title.\n const [displayed, setDisplayed] = useState<{ rootId: string; title: string } | null>(null);\n const handleDisplayedTask = useCallback((root: TaskItem, displayedTask: TaskItem) => {\n setDisplayed({ rootId: root.id, title: displayedTask.title });\n }, []);\n useEffect(() => {\n if (!task) setDisplayed(null);\n }, [task]);\n const title = !task\n ? \"\"\n : displayed && displayed.rootId === task.id\n ? displayed.title\n : task.title;\n return (\n <Modal\n open={task !== null}\n onCancel={onClose}\n footer={null}\n title={title}\n width={TASK_DETAIL_MODAL_WIDTH}\n style={{ maxWidth: \"calc(100vw - 32px)\" }}\n styles={{\n header: { padding: \"16px 24px 0\" },\n content: { padding: 0 },\n body: { padding: \"12px 24px 24px\" },\n }}\n centered\n >\n <LearningTaskDetailDisplayedTaskContext.Provider value={handleDisplayedTask}>\n {task && (\n <LearningTaskDetailBody\n task={task}\n relatedTasks={relatedTasks}\n onClose={onClose}\n onRefresh={onRefresh}\n height=\"calc(100dvh - 96px)\"\n />\n )}\n </LearningTaskDetailDisplayedTaskContext.Provider>\n </Modal>\n );\n};\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useNodesState, useEdgesState, type Node, type Edge, type NodeTypes } from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport { Spin, Empty } from \"antd\";\nimport { useClient } from \"@context\";\nimport type { TaskItem, TaskWorkItem } from \"@axiom-lattice/protocols\";\nimport { WorkflowGraphBase, applyDagreLayout } from \"@components/Chat/WorkflowGraphBase\";\nimport { buildTaskGraph } from \"../../Tasks/taskGraphUtils\";\nimport { TaskDetailPanel } from \"../../Tasks/TaskDetailPanel\";\nimport { useOpenTaskChat } from \"../../Tasks/useOpenTaskChat\";\nimport { WorkflowTaskNode, type WorkflowTaskFlowNode } from \"./WorkflowTaskNode\";\nimport { classifyEdge, withSequenceFallback, TASK_STATUS_META } from \"./learningWorkflowUtils\";\n\nconst nodeTypes: NodeTypes = { workflowTask: WorkflowTaskNode };\n\nconst NODE_WIDTH = 180;\nconst NODE_HEIGHT = 56;\n\nconst EDGE_STYLE: Record<string, React.CSSProperties> = {\n traversed: { stroke: \"#22c55e\", strokeWidth: 1.5 },\n flowing: { stroke: \"#6366f1\", strokeWidth: 2 },\n idle: { stroke: \"#d1d5db\", strokeWidth: 1, strokeDasharray: \"5 5\" },\n};\n\nexport interface LearningWorkflowGraphProps {\n rounds: TaskItem[];\n subTasksByRound: Record<string, TaskItem[]>;\n loading: boolean;\n}\n\n/**\n * LearningWorkflowGraph — the workflow-monitor view of one learning round:\n * the round's task tree as a left-to-right pipeline with live statuses,\n * animated in-flight edges, and node drill-down into TaskDetailPanel.\n * Data freshness comes from useEntityRefresher's event-driven refetch —\n * this component never polls.\n */\nexport const LearningWorkflowGraph: React.FC<LearningWorkflowGraphProps> = ({ rounds, subTasksByRound, loading }) => {\n const client = useClient(\"__GLOBAL__\");\n const [selectedRoundId, setSelectedRoundId] = useState<string | null>(null);\n const [selectedTask, setSelectedTask] = useState<TaskItem | null>(null);\n const [workItems, setWorkItems] = useState<TaskWorkItem[]>([]);\n const [workItemsLoading, setWorkItemsLoading] = useState(false);\n const [workItemsError, setWorkItemsError] = useState<string | null>(null);\n const workItemsSeqRef = useRef(0);\n const clientRef = useRef(client);\n clientRef.current = client;\n\n const roundListKey = rounds.map((r) => r.id).join(\",\");\n useEffect(() => {\n setSelectedRoundId((prev) => (prev && roundListKey.split(\",\").includes(prev) ? prev : (rounds[0]?.id ?? null)));\n }, [roundListKey]);\n\n const selectedRound = rounds.find((r) => r.id === selectedRoundId) ?? rounds[0] ?? null;\n const tree = useMemo(\n () => [selectedRound, ...(selectedRound ? (subTasksByRound[selectedRound.id] ?? []) : [])].filter((t): t is TaskItem => t !== null),\n [selectedRound, subTasksByRound],\n );\n\n const { nodes: graphNodes, edges: graphEdges } = useMemo(() => buildTaskGraph(tree), [tree]);\n const displayEdges = useMemo(() => withSequenceFallback(tree, graphEdges), [tree, graphEdges]);\n const taskById = useMemo(() => new Map(tree.map((t) => [t.id, t])), [tree]);\n\n const initialNodes = useMemo<Node<{ task: TaskItem }>[]>(() => {\n const positions = applyDagreLayout(\n graphNodes.map((n) => ({ id: n.id })),\n displayEdges.map((e) => ({ from: e.from, to: e.to })),\n { nodeWidth: NODE_WIDTH, nodeHeight: NODE_HEIGHT, nodesep: 24, ranksep: 60, rankdir: \"LR\" },\n );\n return graphNodes.map((n) => ({\n id: n.id,\n type: \"workflowTask\",\n position: positions.get(n.id) ?? { x: 0, y: 0 },\n data: { task: n.task },\n }));\n }, [graphNodes, displayEdges]);\n\n const initialEdges = useMemo<Edge[]>(\n () =>\n displayEdges.map((e) => {\n const flow = classifyEdge(\n taskById.get(e.from)?.status ?? \"pending\",\n taskById.get(e.to)?.status ?? \"pending\",\n );\n return {\n id: `${e.from}->${e.to}:${e.kind}`,\n source: e.from,\n target: e.to,\n animated: flow === \"flowing\",\n style: {\n ...EDGE_STYLE[flow],\n // Sequence edges are inferred order, not declared dependencies —\n // keep them dashed even when traversed/flowing.\n ...(e.kind === \"sequence\" && flow !== \"idle\" ? { strokeDasharray: \"2 3\" } : {}),\n },\n };\n }),\n [displayEdges, taskById],\n );\n\n const [flowNodes, setFlowNodes, onNodesChange] = useNodesState<Node>(initialNodes);\n const [flowEdges, setFlowEdges, onEdgesChange] = useEdgesState(initialEdges);\n\n useEffect(() => {\n setFlowNodes((prev) => {\n const prevKey = prev.map((n) => n.id).sort().join(\"|\");\n const nextKey = initialNodes.map((n) => n.id).sort().join(\"|\");\n if (prevKey === nextKey) {\n const prevMap = new Map(prev.map((n) => [n.id, n]));\n return initialNodes.map((n) => {\n const prevNode = prevMap.get(n.id);\n return prevNode ? { ...n, position: prevNode.position } : n;\n });\n }\n return initialNodes;\n });\n setFlowEdges(initialEdges);\n }, [initialNodes, initialEdges, setFlowNodes, setFlowEdges]);\n\n const fetchWorkItems = useCallback((taskId: string) => {\n const seq = ++workItemsSeqRef.current;\n setWorkItemsLoading(true);\n setWorkItemsError(null);\n clientRef.current.tasks.workItems\n .list(taskId)\n .then((items) => {\n if (seq === workItemsSeqRef.current) setWorkItems(items);\n })\n .catch(() => {\n if (seq === workItemsSeqRef.current) {\n setWorkItems([]);\n setWorkItemsError(\"Activity could not be loaded. Please try again shortly.\");\n }\n })\n .finally(() => {\n if (seq === workItemsSeqRef.current) setWorkItemsLoading(false);\n });\n }, []);\n\n const handleNodeClick = useCallback(\n (_event: React.MouseEvent, node: Node) => {\n const task = (node.data as { task?: TaskItem } | undefined)?.task;\n if (!task) return;\n setWorkItems([]);\n setSelectedTask(task);\n fetchWorkItems(task.id);\n },\n [fetchWorkItems],\n );\n\n const handleBack = useCallback(() => {\n workItemsSeqRef.current += 1;\n setSelectedTask(null);\n setWorkItems([]);\n setWorkItemsError(null);\n setWorkItemsLoading(false);\n }, []);\n\n const handleViewChat = useOpenTaskChat(selectedTask);\n\n if (loading) {\n return (\n <div style={{ flex: 1, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", height: \"100%\" }}>\n <Spin size=\"large\" />\n </div>\n );\n }\n\n if (!selectedRound || tree.length === 0) {\n return (\n <div style={{ flex: 1, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", height: \"100%\" }}>\n <Empty description=\"No tasks\" />\n </div>\n );\n }\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", height: \"100%\", minHeight: 0 }}>\n {rounds.length > 1 && (\n <div style={{ display: \"flex\", gap: 6, flexWrap: \"wrap\", paddingBottom: 12, flexShrink: 0 }}>\n {rounds.map((round, i) => {\n const meta = TASK_STATUS_META[round.status];\n const selected = round.id === selectedRound.id;\n return (\n <button\n key={round.id}\n type=\"button\"\n data-testid={`round-chip-${round.id}`}\n onClick={() => {\n setSelectedRoundId(round.id);\n handleBack();\n }}\n title={round.title}\n style={{\n display: \"inline-flex\", alignItems: \"center\", gap: 5,\n fontSize: 11, fontWeight: 600, padding: \"3px 10px\", borderRadius: 9999, cursor: \"pointer\",\n border: selected ? \"1.5px solid #6366f1\" : \"1px solid #e5e7eb\",\n background: selected ? \"rgba(99,102,241,0.08)\" : \"#fff\",\n color: selected ? \"#6366f1\" : \"#6b7280\",\n }}\n >\n <span style={{ width: 6, height: 6, borderRadius: 9999, background: meta.color }} />\n R{rounds.length - i}\n </button>\n );\n })}\n </div>\n )}\n <div style={{ flex: 1, minHeight: 0, position: \"relative\" }}>\n <WorkflowGraphBase\n nodes={flowNodes}\n edges={flowEdges}\n nodeTypes={nodeTypes}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onNodeClick={handleNodeClick}\n fitView\n fitViewOptions={{ padding: 0.15 }}\n nodesDraggable\n nodesConnectable={false}\n miniMap\n attributionPosition=\"bottom-right\"\n />\n </div>\n {selectedTask && (\n <div data-testid=\"workflow-detail\" style={{ height: \"40%\", minHeight: 200, flexShrink: 0, borderTop: \"1px solid #f0f0f0\", overflow: \"hidden\" }}>\n <TaskDetailPanel\n task={selectedTask}\n relatedTasks={tree}\n workItems={workItems}\n loading={workItemsLoading}\n activityError={workItemsError ?? undefined}\n onApprove={undefined as never}\n onReject={undefined as never}\n onRetry={undefined as never}\n onCancel={undefined as never}\n onViewChat={handleViewChat}\n onBack={handleBack}\n subtasks={tree.filter((t) => t.parentId === selectedTask.id)}\n onSubtaskClick={(t) => {\n setWorkItems([]);\n setSelectedTask(t);\n fetchWorkItems(t.id);\n }}\n parent={tree.find((t) => t.id === selectedTask.parentId) ?? null}\n onParentClick={(t) => {\n setWorkItems([]);\n setSelectedTask(t);\n fetchWorkItems(t.id);\n }}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport type { WorkflowTaskFlowNode };\n","import type { TaskItem } from \"@axiom-lattice/protocols\";\nimport type { TaskGraphEdge } from \"../../Tasks/taskGraphUtils\";\n\nexport type LearningEdgeKind = \"dependency\" | \"parent\" | \"sequence\";\n\nexport interface LearningGraphEdge {\n from: string;\n to: string;\n kind: LearningEdgeKind;\n}\n\n/**\n * Learning trees created before the dependencies discipline have flat sibling\n * sets — only parent edges. Synthesize a \"sequence\" edge between same-parent\n * siblings (ordered by createdAt) for any sibling that has no incoming\n * dependency edge, so the pipeline view still reads as a flow for legacy\n * data. Sequence edges are visually distinct (dashed) from declared\n * dependencies and are skipped when they would duplicate an edge or close a\n * direct two-cycle with one.\n */\nexport function withSequenceFallback(tasks: TaskItem[], edges: TaskGraphEdge[]): LearningGraphEdge[] {\n const result: LearningGraphEdge[] = [...edges];\n const existing = new Set(edges.map((e) => `${e.from}|${e.to}`));\n const hasIncomingDependency = new Set(\n edges.filter((e) => e.kind === \"dependency\").map((e) => e.to),\n );\n\n const ids = new Set(tasks.map((t) => t.id));\n const byParent = new Map<string, TaskItem[]>();\n for (const task of tasks) {\n if (!task.parentId || !ids.has(task.parentId)) continue;\n const siblings = byParent.get(task.parentId) ?? [];\n siblings.push(task);\n byParent.set(task.parentId, siblings);\n }\n\n for (const siblings of byParent.values()) {\n const sorted = [...siblings].sort(\n (a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime(),\n );\n for (let i = 1; i < sorted.length; i++) {\n const child = sorted[i];\n if (hasIncomingDependency.has(child.id)) continue;\n const from = sorted[i - 1].id;\n const key = `${from}|${child.id}`;\n if (existing.has(key) || existing.has(`${child.id}|${from}`)) continue;\n result.push({ from, to: child.id, kind: \"sequence\" });\n existing.add(key);\n }\n }\n return result;\n}\n\nexport type EdgeFlow = \"idle\" | \"traversed\" | \"flowing\";\n\n/**\n * Edge flow state for the pipeline view:\n * - traversed: source completed and the target moved past pending\n * - flowing: source completed and the target is actively running\n * - idle: everything else (static dashed gray)\n */\nexport function classifyEdge(\n sourceStatus: TaskItem[\"status\"],\n targetStatus: TaskItem[\"status\"],\n): EdgeFlow {\n if (sourceStatus !== \"completed\") return \"idle\";\n if (targetStatus === \"in_progress\") return \"flowing\";\n return targetStatus === \"pending\" ? \"idle\" : \"traversed\";\n}\n\n/**\n * DAG v2 edge classification: the flow state is keyed on the DOWNSTREAM\n * (target) node status only — completed → traversed, in_progress → flowing,\n * everything else → idle.\n */\nexport function classifyDownstreamEdge(targetStatus: TaskItem[\"status\"]): EdgeFlow {\n if (targetStatus === \"completed\") return \"traversed\";\n if (targetStatus === \"in_progress\") return \"flowing\";\n return \"idle\";\n}\nexport interface TaskStatusMeta {\n label: string;\n color: string;\n /** True for the state that gets the breathing pulse animation. */\n active: boolean;\n}\n\nexport const TASK_STATUS_META: Record<TaskItem[\"status\"], TaskStatusMeta> = {\n pending: { label: \"Pending\", color: \"#9ca3af\", active: false },\n in_progress: { label: \"Running\", color: \"#3b82f6\", active: true },\n review: { label: \"Review\", color: \"#8b5cf6\", active: false },\n failed: { label: \"Failed\", color: \"#ef4444\", active: false },\n interrupted: { label: \"Interrupted\", color: \"#f59e0b\", active: false },\n completed: { label: \"Done\", color: \"#22c55e\", active: false },\n cancelled: { label: \"Cancelled\", color: \"#9ca3af\", active: false },\n};\n","import React from \"react\";\nimport { Handle, Position, type NodeProps, type Node } from \"@xyflow/react\";\nimport type { TaskItem } from \"@axiom-lattice/protocols\";\nimport { TASK_STATUS_META } from \"./learningWorkflowUtils\";\n\nexport type WorkflowTaskFlowNode = Node<{ task: TaskItem }, \"workflowTask\">;\n\n/** Pipeline node for the learning workflow monitor: status dot, title, meta, pulse when running. */\nexport const WorkflowTaskNode: React.FC<NodeProps<WorkflowTaskFlowNode>> = ({ data }) => {\n const { task } = data;\n const meta = TASK_STATUS_META[task.status];\n return (\n <div\n data-testid=\"workflow-task-node\"\n data-active={String(meta.active)}\n style={{\n width: 180, padding: \"8px 10px\", borderRadius: 10,\n border: `1.5px solid ${meta.color}`, background: \"#fff\",\n animation: meta.active ? \"workflow-node-pulse 1.6s ease-in-out infinite\" : undefined,\n }}\n >\n <Handle type=\"target\" position={Position.Left} style={{ opacity: 0 }} />\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6, marginBottom: 4 }}>\n <span style={{ width: 8, height: 8, borderRadius: 9999, background: meta.color, flexShrink: 0 }} />\n <span style={{ fontSize: 12, fontWeight: 600, color: \"#262626\", overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }} title={task.title}>\n {task.title}\n </span>\n </div>\n <div style={{ fontSize: 10, color: \"#8c8c8c\" }}>{meta.label}</div>\n <Handle type=\"source\" position={Position.Right} style={{ opacity: 0 }} />\n {meta.active && <style>{`@keyframes workflow-node-pulse { 0%,100% { box-shadow: 0 0 0 0 rgba(59,130,246,0.35); } 50% { box-shadow: 0 0 0 6px rgba(59,130,246,0.08); } }`}</style>}\n </div>\n );\n};\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { X } from \"lucide-react\";\nimport { useMediaQuery } from \"../../hooks/useMediaQuery\";\n\nlet dockIdSequence = 0;\n\nconst MIN_DOCK_WIDTH = 360;\nconst DOCK_VIEWPORT_MARGIN = 48;\nconst KEYBOARD_RESIZE_STEP = 16;\n\nfunction clampDockWidth(width: number): number {\n const max = typeof window === \"undefined\" ? 1200 : window.innerWidth - DOCK_VIEWPORT_MARGIN;\n return Math.min(Math.max(width, MIN_DOCK_WIDTH), max);\n}\n\n/**\n * CanvasDock — the single floating slot on agent canvases. Every content\n * surface (node detail, node editor, playground, eval workspace, pinned zone)\n * is a guest of this dock; only width (and, for left-anchored slots, the\n * vertical span) varies. Same glass material as the canvas pills: translucent\n * white + backdrop blur + rounded + soft shadow, with a 12px canvas margin on\n * all sides.\n */\nexport interface CanvasDockProps {\n open: boolean;\n /** Dock width — the only per-guest variant. */\n width: NonNullable<React.CSSProperties[\"width\"]>;\n mobileWidth?: NonNullable<React.CSSProperties[\"width\"]>;\n /** Anchor to the LEFT edge at this offset instead of the right edge. */\n left?: number;\n /** Top offset (default 56). */\n top?: number;\n /** Bottom offset (default 12; unused when an explicit height is set). */\n bottom?: number;\n /** Explicit height — anchors at `top` and drops the bottom offset. */\n height?: number | string;\n title: React.ReactNode;\n onClose: () => void;\n bodyStyle?: React.CSSProperties;\n restoreFocusRef?: React.RefObject<HTMLElement>;\n focusControlRef?: React.MutableRefObject<(() => void) | null>;\n escapeEnabled?: boolean;\n /** Stacking order. Pinned zone docks sit below transient docks (default 25). */\n zIndex?: number;\n children: React.ReactNode;\n}\n\nexport const CanvasDock: React.FC<CanvasDockProps> = ({ open, width, mobileWidth, left, top = 56, bottom = 12, height, title, onClose, bodyStyle, restoreFocusRef, focusControlRef, escapeEnabled = true, zIndex = 25, children }) => {\n const isMobile = useMediaQuery(\"(max-width: 720px)\");\n const closeButtonRef = useRef<HTMLButtonElement>(null);\n const restoreFocusTargetRef = useRef<HTMLElement | null>(null);\n const titleIdRef = useRef<string | null>(null);\n if (!titleIdRef.current) titleIdRef.current = `canvas-dock-title-${++dockIdSequence}`;\n const titleId = titleIdRef.current;\n\n // Left-edge drag resize: internal override of the guest's default width,\n // reset whenever the guest (width prop) changes. Numeric widths only.\n const [resizedWidth, setResizedWidth] = useState<number | null>(null);\n useEffect(() => setResizedWidth(null), [width, mobileWidth]);\n const resizable = !isMobile && typeof width === \"number\";\n const effectiveWidth = isMobile ? (mobileWidth ?? width) : (resizedWidth ?? width);\n const numericWidth = typeof effectiveWidth === \"number\" ? effectiveWidth : null;\n // Right-anchored docks drag their LEFT edge (dragging left widens); left-\n // anchored docks drag their RIGHT edge (dragging right widens). The sign\n // flips both the pointer delta and the arrow-key directions.\n const resizeSign = left === undefined ? -1 : 1;\n\n const onHandlePointerDown = (event: React.PointerEvent) => {\n if (!resizable || numericWidth === null) return;\n event.preventDefault();\n const drag = { startX: event.clientX, startWidth: numericWidth };\n const onMove = (ev: PointerEvent) => {\n setResizedWidth(clampDockWidth(drag.startWidth + resizeSign * (ev.clientX - drag.startX)));\n };\n const onUp = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n };\n\n const onHandleKeyDown = (event: React.KeyboardEvent) => {\n if (!resizable || numericWidth === null) return;\n if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n setResizedWidth(clampDockWidth(numericWidth - resizeSign * KEYBOARD_RESIZE_STEP));\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n setResizedWidth(clampDockWidth(numericWidth + resizeSign * KEYBOARD_RESIZE_STEP));\n }\n };\n\n useEffect(() => {\n if (!open || !escapeEnabled) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && !e.defaultPrevented) onClose();\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [escapeEnabled, open, onClose]);\n\n useEffect(() => {\n if (!focusControlRef) return;\n focusControlRef.current = () => closeButtonRef.current?.focus();\n return () => { focusControlRef.current = null; };\n }, [focusControlRef]);\n\n useEffect(() => {\n if (!open) return;\n const focusTarget = restoreFocusRef?.current ?? document.activeElement;\n if (focusTarget instanceof HTMLElement) restoreFocusTargetRef.current = focusTarget;\n closeButtonRef.current?.focus();\n return () => {\n restoreFocusTargetRef.current?.focus();\n restoreFocusTargetRef.current = null;\n };\n // Snapshot only when the dock opens; changing a caller's ref must not restart the focus cycle.\n }, [open]);\n\n if (!open) return null;\n\n return (\n <div\n data-testid=\"canvas-dock\"\n role=\"region\"\n aria-labelledby={titleId}\n style={{\n position: \"absolute\",\n top,\n ...(left === undefined ? { right: 12 } : { left }),\n ...(height === undefined ? { bottom } : { height }),\n width: effectiveWidth,\n maxWidth: \"calc(100% - 24px)\",\n boxSizing: \"border-box\",\n zIndex,\n display: \"flex\",\n flexDirection: \"column\",\n background: \"rgba(255,255,255,0.92)\",\n backdropFilter: \"blur(12px)\",\n borderRadius: 16,\n border: \"1px solid rgba(240,240,240,0.9)\",\n boxShadow: \"0 8px 32px rgba(0,0,0,0.12)\",\n animation: \"canvas-dock-in 0.2s ease\",\n overflow: \"hidden\",\n }}\n >\n <style>{`@keyframes canvas-dock-in { from { opacity: 0; transform: translateX(16px); } to { opacity: 1; transform: translateX(0); } }`}</style>\n {resizable && (\n <div\n data-testid=\"canvas-dock-resize-handle\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize panel\"\n aria-valuenow={numericWidth ?? undefined}\n aria-valuemin={MIN_DOCK_WIDTH}\n aria-valuemax={typeof window === \"undefined\" ? undefined : window.innerWidth - DOCK_VIEWPORT_MARGIN}\n tabIndex={0}\n onPointerDown={onHandlePointerDown}\n onKeyDown={onHandleKeyDown}\n style={{ position: \"absolute\", ...(left === undefined ? { left: 0 } : { right: 0 }), top: 0, bottom: 0, width: 6, cursor: \"ew-resize\", zIndex: 1, touchAction: \"none\" }}\n />\n )}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"12px 16px\",\n borderBottom: \"1px solid rgba(240,240,240,0.9)\",\n flexShrink: 0,\n fontSize: 13,\n fontWeight: 600,\n color: \"#333\",\n }}\n >\n <div id={titleId} style={{ flex: 1, minWidth: 0, display: \"flex\", alignItems: \"center\", gap: 8, overflow: \"hidden\" }}>\n {title}\n </div>\n <button\n ref={closeButtonRef}\n type=\"button\"\n aria-label=\"Close dock\"\n onClick={onClose}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 24,\n height: 24,\n border: \"none\",\n borderRadius: 6,\n background: \"transparent\",\n color: \"#999\",\n cursor: \"pointer\",\n flexShrink: 0,\n }}\n >\n <X size={14} />\n </button>\n </div>\n <div data-testid=\"canvas-dock-body\" style={{ flex: 1, minHeight: 0, overflow: \"auto\", padding: 16, ...bodyStyle }}>{children}</div>\n </div>\n );\n};\n","import React, { useEffect, useMemo, useState } from \"react\";\nimport { useApi } from \"../../hooks/useApi\";\nimport type { EvalRunRecord } from \"../../hooks/eval/evalTypes\";\nimport { summarizeEvalRuns, aggregateDimensions, buildRunTrendOption, visibleRuns } from \"./evalQuality\";\nimport { EvalQualitySummary } from \"./EvalQualitySummary\";\nimport { RoundTrendChart } from \"./RoundTrendChart\";\nimport { DimensionPanorama } from \"./DimensionPanorama\";\nimport { EvalRunInsights, latestVisibleRunId } from \"./EvalRunInsights\";\nimport type { RunResult } from \"./EvalRunInsights\";\nimport { EChart } from \"./EChart\";\nimport { relativeTime } from \"./AgentOverview\";\n\nconst SECTION_TITLE: React.CSSProperties = { fontSize: 12, fontWeight: 600, color: \"rgba(0,0,0,0.65)\", marginBottom: 8 };\nconst CARD: React.CSSProperties = { border: \"1px solid #f0f0f0\", borderRadius: 12, padding: 12 };\n\n/**\n * EvalQualityPanel — the canvas \"Eval quality\" dock body, dashboard-style:\n * KPI summary on top, then stacked cards for the by-round view, the by-run\n * view, and the latest-run diagnosis. Owns the single run-detail fetch\n * shared by the diagnosis components. `showRoundTrend: false` hides the\n * by-round chart (round scores already live in the LEARNING zone).\n */\nexport const EvalQualityPanel: React.FC<{ agentId: string; projectId?: string | null; runs: EvalRunRecord[]; showRoundTrend?: boolean }> = ({ agentId, projectId, runs, showRoundTrend = true }) => {\n const { get } = useApi();\n const summary = useMemo(() => summarizeEvalRuns(runs), [runs]);\n const runId = latestVisibleRunId(runs);\n const latestRun = runs.find((r) => r.id === runId);\n const [results, setResults] = useState<RunResult[] | null>(null);\n const getRef = React.useRef(get);\n getRef.current = get;\n\n useEffect(() => {\n if (!runId) {\n setResults(null);\n return;\n }\n let cancelled = false;\n getRef\n .current<{ success: boolean; data?: { results?: RunResult[] } }>(`/api/eval/runs/${runId}`)\n .then((res) => !cancelled && setResults(res.data?.results ?? []))\n .catch(() => !cancelled && setResults([]));\n return () => {\n cancelled = true;\n };\n }, [runId]);\n\n const dimensions = useMemo(() => aggregateDimensions(results ?? []), [results]);\n const runTrendOption = useMemo(() => buildRunTrendOption(runs), [runs]);\n const hasVisibleRuns = visibleRuns(runs).length > 0;\n\n if (summary.latestScore === null) {\n return (\n <div style={{ height: 120, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", color: \"#bfbfbf\", fontSize: 12 }}>\n No eval runs yet\n </div>\n );\n }\n\n return (\n <div data-testid=\"eval-quality-panel\" style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}>\n <EvalQualitySummary summary={summary} />\n {showRoundTrend && <RoundTrendChart agentId={agentId} projectId={projectId} runs={runs} />}\n {hasVisibleRuns && (\n <div data-testid=\"run-trend-card\" style={CARD}>\n <div style={SECTION_TITLE}>Score by run</div>\n <EChart option={runTrendOption} height={160} />\n </div>\n )}\n {runId && results !== null && (\n <div data-testid=\"run-diagnosis-card\" style={CARD}>\n <div style={SECTION_TITLE}>\n Latest run{latestRun ? ` · ${relativeTime(new Date(latestRun.createdAt))}` : \"\"} · {summary.passedCases}/{summary.totalCases} passed\n </div>\n <DimensionPanorama dimensions={dimensions} />\n <EvalRunInsights results={results} />\n </div>\n )}\n </div>\n );\n};\n","import type { EChartsOption } from \"echarts\";\nimport type { EvalRunRecord } from \"../../hooks/eval/evalTypes\";\nimport { compareEvalRunsChronologically } from \"../../hooks/eval/evalTypes\";\n\n/** Quality-gate target score shown as a dashed mark line in trend charts. */\nexport const SCORE_TARGET = 80;\n\n/** Shared threshold coloring: green ≥80, amber ≥50, red below. */\nexport function scoreColor(score: number): string {\n return score >= 80 ? \"#22c55e\" : score >= 50 ? \"#f59e0b\" : \"#ef4444\";\n}\n\n/** Completed, non-holdout runs oldest → newest — the \"visible\" quality signal. */\nexport function visibleRuns(runs: EvalRunRecord[]): EvalRunRecord[] {\n return runs\n .filter((run) => run.status === \"completed\" && run.holdout !== true)\n .sort(compareEvalRunsChronologically);\n}\n\nexport interface EvalSummary {\n latestScore: number | null;\n delta: number | null;\n passRate: number | null;\n passedCases: number;\n totalCases: number;\n interruptedCases: number;\n latestRunId: string | null;\n}\n\n/** KPI strip data: latest visible run, delta vs the previous visible run. */\nexport function summarizeEvalRuns(runs: EvalRunRecord[]): EvalSummary {\n const visible = visibleRuns(runs);\n const latest = visible[visible.length - 1];\n if (!latest) {\n return { latestScore: null, delta: null, passRate: null, passedCases: 0, totalCases: 0, interruptedCases: 0, latestRunId: null };\n }\n const previous = visible[visible.length - 2];\n const total = latest.totalCases ?? 0;\n const passed = latest.passedCases ?? 0;\n return {\n latestScore: latest.avgScore,\n delta: previous ? Math.round(latest.avgScore - previous.avgScore) : null,\n passRate: total > 0 ? Math.round((passed / total) * 100) : null,\n passedCases: passed,\n totalCases: total,\n interruptedCases: latest.interruptedCases ?? 0,\n latestRunId: latest.id,\n };\n}\n\nexport interface DimensionResultLike {\n name: string;\n score: number;\n reason?: string;\n}\n\nexport interface DimensionAggregate {\n name: string;\n avgScore: number;\n count: number;\n}\n\n/** Mean judge-dimension score across judged (non-interrupted) cases, worst first. */\nexport function aggregateDimensions(\n results: Array<{ interrupted?: boolean; dimensionResults?: DimensionResultLike[] }>,\n): DimensionAggregate[] {\n const totals = new Map<string, { sum: number; count: number }>();\n for (const result of results) {\n if (result.interrupted) continue;\n for (const dim of result.dimensionResults ?? []) {\n const entry = totals.get(dim.name) ?? { sum: 0, count: 0 };\n entry.sum += dim.score;\n entry.count += 1;\n totals.set(dim.name, entry);\n }\n }\n return [...totals.entries()]\n .map(([name, { sum, count }]) => ({ name, avgScore: Math.round((sum / count) * 10) / 10, count }))\n .sort((a, b) => a.avgScore - b.avgScore);\n}\n\nexport interface RoundLike {\n id: string;\n createdAt: Date | string;\n}\n\nexport interface RoundTrendInput {\n rounds: RoundLike[];\n runs: EvalRunRecord[];\n selectedRoundId?: string | null;\n}\n\nconst ROUND_SPREAD = 0.15;\n\nconst GRID = { left: 36, right: 12, top: 16, bottom: 24 };\nconst X_LABEL = { fontSize: 9, color: \"#999\" } as const;\n\nfunction baseYAxis(): NonNullable<EChartsOption[\"yAxis\"]> {\n return { type: \"value\", min: 0, max: 100, axisLabel: { ...X_LABEL }, splitLine: { lineStyle: { color: \"#f5f5f5\" } } };\n}\n\n/**\n * Round view: one bar per learning round (latest visible run score) with\n * holdout runs as hollow diamonds spread within their round, and a dashed\n * quality-gate line at SCORE_TARGET. When `selectedRoundId` is not provided\n * the latest SCORED round (newest round with a visible run) is highlighted by\n * default, so the chart is self-contained in the EVALUATION zone.\n */\nexport function buildRoundTrendOption({ rounds, runs, selectedRoundId }: RoundTrendInput): EChartsOption {\n const sortedRounds = [...rounds].sort(\n (a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime(),\n );\n const completed = runs\n .filter((run) => run.status === \"completed\")\n .sort(compareEvalRunsChronologically);\n\n const roundIndexById = new Map(sortedRounds.map((r, i) => [r.id, i + 1]));\n const groupSizes = new Map<number, number>();\n for (const run of completed) {\n const idx = run.taskId ? roundIndexById.get(run.taskId) : undefined;\n if (idx !== undefined) groupSizes.set(idx, (groupSizes.get(idx) ?? 0) + 1);\n }\n const groupSeen = new Map<number, number>();\n\n const holdoutPoints: Array<[number, number]> = [];\n const latestVisibleByRound = new Map<number, number>();\n for (const run of completed) {\n const idx = run.taskId ? roundIndexById.get(run.taskId) : undefined;\n if (idx === undefined) continue;\n const seen = groupSeen.get(idx) ?? 0;\n groupSeen.set(idx, seen + 1);\n if (run.holdout === true) {\n const spread = (seen - ((groupSizes.get(idx) ?? 1) - 1) / 2) * ROUND_SPREAD;\n holdoutPoints.push([Math.round((idx + spread) * 100) / 100, run.avgScore]);\n } else {\n latestVisibleByRound.set(idx, run.avgScore);\n }\n }\n\n // Default highlight = the newest round that actually has a visible score\n // (a newer round without runs must not steal the ring).\n let selectedId: string | null = selectedRoundId ?? null;\n if (selectedId === null) {\n for (let i = sortedRounds.length - 1; i >= 0; i--) {\n if (latestVisibleByRound.has(i + 1)) {\n selectedId = sortedRounds[i].id;\n break;\n }\n }\n }\n\n const barData = sortedRounds.map((round, i) => {\n const score = latestVisibleByRound.get(i + 1);\n if (score === undefined) return null;\n const selected = round.id === selectedId;\n return {\n value: [i + 1, score] as [number, number],\n itemStyle: {\n color: scoreColor(score),\n borderRadius: [4, 4, 0, 0] as [number, number, number, number],\n ...(selected ? { borderColor: \"#6366f1\", borderWidth: 2 } : {}),\n },\n };\n });\n\n return {\n grid: GRID,\n tooltip: { trigger: \"item\" },\n xAxis: {\n type: \"value\", min: 0.5, max: sortedRounds.length + 0.5, interval: 1,\n axisLabel: { ...X_LABEL, formatter: (v: number) => (Number.isInteger(v) ? `R${v}` : \"\") },\n axisLine: { lineStyle: { color: \"#eee\" } }, splitLine: { show: false },\n },\n yAxis: baseYAxis(),\n series: [\n {\n type: \"bar\", data: barData, barWidth: 22,\n markLine: {\n silent: true, symbol: \"none\",\n lineStyle: { type: \"dashed\", color: \"#d9d9d9\" },\n label: { fontSize: 9, color: \"#999\", formatter: `target ${SCORE_TARGET}` },\n data: [{ yAxis: SCORE_TARGET }],\n },\n },\n { type: \"scatter\", data: holdoutPoints, symbol: \"diamond\", symbolSize: 9, itemStyle: { color: \"#fff\", borderColor: \"#f59e0b\", borderWidth: 1.5 }, z: 4 },\n ],\n };\n}\n\n/**\n * Run view: every completed run (including manual ones) as a chronological\n * line, holdout runs as hollow diamonds at their sequence position, with a\n * dashed quality-gate line at SCORE_TARGET.\n */\nexport function buildRunTrendOption(runs: EvalRunRecord[]): EChartsOption {\n const completed = runs\n .filter((run) => run.status === \"completed\")\n .sort(compareEvalRunsChronologically);\n\n const linePoints: Array<[number, number]> = [];\n const holdoutPoints: Array<[number, number]> = [];\n completed.forEach((run, i) => {\n if (run.holdout === true) holdoutPoints.push([i + 1, run.avgScore]);\n else linePoints.push([i + 1, run.avgScore]);\n });\n\n return {\n grid: GRID,\n tooltip: { trigger: \"item\" },\n xAxis: {\n type: \"value\", min: 0.5, max: Math.max(completed.length, 1) + 0.5, interval: 1,\n axisLabel: { ...X_LABEL, formatter: (v: number) => (Number.isInteger(v) ? `#${v}` : \"\") },\n axisLine: { lineStyle: { color: \"#eee\" } }, splitLine: { show: false },\n },\n yAxis: baseYAxis(),\n series: [\n {\n type: \"line\", data: linePoints, symbol: \"circle\", symbolSize: 6,\n lineStyle: { color: \"#6366f1\", width: 1.5 }, itemStyle: { color: \"#6366f1\" },\n markLine: {\n silent: true, symbol: \"none\",\n lineStyle: { type: \"dashed\", color: \"#d9d9d9\" },\n label: { fontSize: 9, color: \"#999\", formatter: `target ${SCORE_TARGET}` },\n data: [{ yAxis: SCORE_TARGET }],\n },\n },\n { type: \"scatter\", data: holdoutPoints, symbol: \"diamond\", symbolSize: 9, itemStyle: { color: \"#fff\", borderColor: \"#f59e0b\", borderWidth: 1.5 }, z: 4 },\n ],\n };\n}\n","import React from \"react\";\nimport { scoreColor } from \"./evalQuality\";\nimport type { EvalSummary } from \"./evalQuality\";\n\nconst CAPTION: React.CSSProperties = { fontSize: 10, color: \"#999\" };\nconst VALUE: React.CSSProperties = { fontSize: 22, fontWeight: 700, lineHeight: 1.2 };\n\n/** KPI strip: latest score + delta, pass rate, interrupted count. */\nexport const EvalQualitySummary: React.FC<{ summary: EvalSummary }> = ({ summary }) => {\n if (summary.latestScore === null) return null;\n return (\n <div data-testid=\"eval-summary\" style={{ display: \"flex\", gap: 28 }}>\n <div>\n <div style={{ ...VALUE, color: scoreColor(summary.latestScore) }}>\n {summary.latestScore.toFixed(1)}\n {summary.delta !== null && (\n <span data-testid=\"summary-delta\" style={{ fontSize: 11, fontWeight: 600, color: summary.delta >= 0 ? \"#22c55e\" : \"#ef4444\", marginLeft: 6 }}>\n {summary.delta >= 0 ? \"▲\" : \"▼\"} {Math.abs(summary.delta)}\n </span>\n )}\n </div>\n <div style={CAPTION}>latest score</div>\n </div>\n <div>\n <div data-testid=\"summary-pass\" style={{ ...VALUE, color: \"#262626\" }}>\n {summary.passRate !== null ? `${summary.passRate}%` : \"—\"}\n </div>\n <div style={CAPTION}>pass · {summary.passedCases}/{summary.totalCases}</div>\n </div>\n {summary.interruptedCases > 0 && (\n <div data-testid=\"summary-interrupted\">\n <div style={{ ...VALUE, color: \"#b45309\" }}>{summary.interruptedCases}</div>\n <div style={CAPTION}>interrupted</div>\n </div>\n )}\n </div>\n );\n};\n","import React, { useEffect, useMemo, useState } from \"react\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { buildTrainingRoundsQuery, isTrainingRound } from \"./Learning/trainingUtils\";\nimport type { TaskItem } from \"@axiom-lattice/protocols\";\nimport type { EvalRunRecord } from \"../../hooks/eval/evalTypes\";\nimport { EChart } from \"./EChart\";\nimport { buildRoundTrendOption, visibleRuns } from \"./evalQuality\";\n\n/**\n * RoundTrendChart — the by-round view: one bar per learning round (latest\n * visible run score), holdout runs as hollow diamonds, and a dashed target\n * line at 80. Clicking a bar selects that round. The chart is fully\n * independent of the LEARNING zone: it fetches every training round for the\n * agent and, when no `selectedRoundId` is passed, self-selects the latest\n * SCORED round by default. Hidden when the agent has no training rounds\n * (run-level data lives in the by-run view instead).\n */\nexport const RoundTrendChart: React.FC<{ agentId: string; projectId?: string | null; runs: EvalRunRecord[]; selectedRoundId?: string | null; onSelectRound?: (roundId: string) => void }> = ({ agentId, projectId, runs, selectedRoundId, onSelectRound }) => {\n const { get } = useApi();\n const [rounds, setRounds] = useState<TaskItem[]>([]);\n const [loaded, setLoaded] = useState(false);\n const [internalSelectedRoundId, setInternalSelectedRoundId] = useState<string | null>(null);\n const getRef = React.useRef(get);\n getRef.current = get;\n\n useEffect(() => {\n let cancelled = false;\n getRef\n .current<{ data?: TaskItem[] }>(buildTrainingRoundsQuery(agentId, projectId))\n .then((res) => {\n if (cancelled) return;\n const list = (res.data ?? []).filter(isTrainingRound);\n list.sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());\n setRounds(list);\n setLoaded(true);\n })\n .catch(() => {\n if (!cancelled) setLoaded(true);\n });\n return () => {\n cancelled = true;\n };\n }, [agentId, projectId]);\n\n // A pinned internal round that no longer exists falls back to the default.\n useEffect(() => {\n if (internalSelectedRoundId && !rounds.some((r) => r.id === internalSelectedRoundId)) {\n setInternalSelectedRoundId(null);\n }\n }, [rounds, internalSelectedRoundId]);\n\n const option = useMemo(\n () => buildRoundTrendOption({ rounds, runs, selectedRoundId: selectedRoundId ?? internalSelectedRoundId }),\n [rounds, runs, selectedRoundId, internalSelectedRoundId],\n );\n\n const onEvents = useMemo(\n () => ({\n click: (params: unknown) => {\n const p = params as { seriesType?: string; dataIndex?: number };\n if (p.seriesType !== \"bar\" || typeof p.dataIndex !== \"number\") return;\n const round = rounds[p.dataIndex];\n if (round) {\n setInternalSelectedRoundId(round.id);\n onSelectRound?.(round.id);\n }\n },\n }),\n [rounds, onSelectRound],\n );\n\n const hasData = useMemo(() => {\n if (rounds.length === 0) return false;\n const roundIds = new Set(rounds.map((r) => r.id));\n return visibleRuns(runs).some((run) => run.taskId !== undefined && roundIds.has(run.taskId));\n }, [rounds, runs]);\n\n if (!loaded) return null;\n if (!hasData) return <div data-testid=\"round-trend-empty\" style={{ display: \"none\" }} />;\n\n return (\n <div data-testid=\"round-trend-chart\" style={{ border: \"1px solid #f0f0f0\", borderRadius: 12, padding: 12 }}>\n <div style={{ fontSize: 12, fontWeight: 600, color: \"rgba(0,0,0,0.65)\", marginBottom: 8 }}>Score by learning round</div>\n <EChart option={option} height={100} onEvents={onEvents} />\n </div>\n );\n};\n","import React from \"react\";\nimport { scoreColor } from \"./evalQuality\";\nimport type { DimensionAggregate } from \"./evalQuality\";\n\n/** Horizontal bar per judge dimension (worst first) for the latest eval run. */\nexport const DimensionPanorama: React.FC<{ dimensions: DimensionAggregate[] }> = ({ dimensions }) => {\n if (dimensions.length === 0) return null;\n return (\n <div data-testid=\"dimension-panorama\" style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n {dimensions.map((d) => {\n const pct = Math.min(Math.max(d.avgScore, 0), 100);\n return (\n <div key={d.name} data-testid={`dimension-row-${d.name}`} style={{ display: \"flex\", alignItems: \"center\", gap: 8, fontSize: 11 }}>\n <span data-testid={`dimension-label-${d.name}`} style={{ flexShrink: 0, maxWidth: \"60%\", color: \"#595959\", overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }} title={d.name}>\n {d.name}\n </span>\n <div style={{ flex: 1, height: 8, background: \"#f5f5f5\", borderRadius: 4, overflow: \"hidden\" }}>\n <div data-testid={`dimension-fill-${d.name}`} style={{ width: `${pct}%`, height: \"100%\", background: scoreColor(d.avgScore), borderRadius: 4 }} />\n </div>\n <span style={{ width: 28, textAlign: \"right\", flexShrink: 0, fontWeight: 600, color: scoreColor(d.avgScore) }}>\n {Math.round(d.avgScore)}\n </span>\n </div>\n );\n })}\n </div>\n );\n};\n","import React from \"react\";\n\n/**\n * EvalRunInsights — the \"why did it fail\" glance: worst-scoring judge\n * dimensions with reasons plus the HITL-interrupted count. Pure renderer;\n * the parent panel fetches run results and shares them.\n */\nexport interface DimensionResult {\n name: string;\n score: number;\n reason: string;\n}\n\nexport interface RunResult {\n pass: boolean;\n interrupted?: boolean;\n dimensionResults?: DimensionResult[];\n}\n\n/**\n * Latest run eligible for case-level insights: completed and not a hold-out\n * run (hold-out case details stay out of the glance view). Runs are oldest →\n * newest.\n */\nexport function latestVisibleRunId(runs: Array<{ id?: unknown; holdout?: unknown; status?: unknown }>): string | null {\n for (let i = runs.length - 1; i >= 0; i--) {\n const r = runs[i];\n if (!r.holdout && r.status === \"completed\" && typeof r.id === \"string\") return r.id;\n }\n return null;\n}\n\nexport const EvalRunInsights: React.FC<{ results: RunResult[] | null }> = ({ results }) => {\n if (results === null) return null;\n\n const interrupted = results.filter((r) => r.interrupted).length;\n const failingDims = results\n .filter((r) => !r.pass && !r.interrupted)\n .flatMap((r) => r.dimensionResults ?? [])\n .sort((a, b) => a.score - b.score)\n .slice(0, 3);\n\n return (\n <div style={{ marginTop: 8 }} data-testid=\"run-insights\">\n {interrupted > 0 && (\n <div data-testid=\"interrupted-count\" style={{ fontSize: 12, color: \"#b45309\", marginBottom: 6 }}>\n {interrupted} interrupted\n </div>\n )}\n {failingDims.length === 0 ? (\n <div style={{ fontSize: 12, color: \"#22c55e\" }}>All cases passed</div>\n ) : (\n failingDims.map((d, i) => (\n <div key={`${d.name}-${i}`} style={{ fontSize: 12, padding: \"3px 0\", display: \"flex\", gap: 6, alignItems: \"baseline\" }}>\n <span style={{ color: \"#333\", fontWeight: 600, flexShrink: 0 }}>{d.name}</span>\n <span style={{ color: d.score >= 50 ? \"#f59e0b\" : \"#ef4444\", flexShrink: 0 }}>{d.score}</span>\n <span style={{ color: \"#888\", overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {d.reason.length > 80 ? `${d.reason.slice(0, 80)}…` : d.reason}\n </span>\n </div>\n ))\n )}\n </div>\n );\n};\n","import React from \"react\";\nimport { Node, NodeProps } from \"@xyflow/react\";\nimport { Pin } from \"lucide-react\";\n\nexport type CanvasZoneData = {\n label: string;\n width: number;\n height: number;\n /** Render the 📌 pin toggle next to the chip (pinnable zones only — CONFIG never pins). */\n pinnable?: boolean;\n /** Whether the zone is currently pinned into a dock panel (filled/indigo pin). */\n pinned?: boolean;\n /** Toggle the zone's pin state (pinning hides the canvas zone and hosts its view in a pinned panel). */\n onPinToggle?: () => void;\n};\n\n/**\n * CanvasZone — a semantic zone floor rendered under graph content.\n * Non-interactive for selection by design: the host node sets\n * selectable/focusable/deletable/connectable to false, and the floor itself is\n * pointer-transparent (pointerEvents none), so empty floor area is click-through\n * (pane-click deselect and panning still work over it). The label chip re-enables\n * pointer events and is the ONLY drag grab handle: mousedown on the chip bubbles\n * to the ReactFlow node wrapper's drag handler (CSS pointer-events on the wrapper\n * never blocks bubbling from a child), starting the zone-block drag. Content nodes\n * are separate draggable:false nodes stacked above and stay clickable.\n * The 📌 button next to the chip pins the zone into the pin dock (a fixed panel\n * over the canvas); it stops drag/click propagation so it never starts a zone drag.\n */\nconst CanvasZoneInner: React.FC<NodeProps<Node<CanvasZoneData>>> = ({ data }) => {\n const [pinHover, setPinHover] = React.useState(false);\n const pinActive = Boolean(data.pinned);\n return (\n <div\n data-testid={`canvas-zone-${data.label.toLowerCase()}`}\n style={{\n width: data.width,\n height: data.height,\n borderRadius: 18,\n border: \"1.5px dashed rgba(99,102,241,0.28)\",\n background: \"rgba(99,102,241,0.04)\",\n pointerEvents: \"none\",\n position: \"relative\",\n }}\n >\n <div style={{ position: \"absolute\", top: -22, left: 2, display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <span\n data-testid={`canvas-zone-chip-${data.label.toLowerCase()}`}\n style={{\n fontSize: 11,\n fontWeight: 600,\n letterSpacing: 1,\n color: \"rgba(99,102,241,0.65)\",\n userSelect: \"none\",\n pointerEvents: \"auto\",\n cursor: \"grab\",\n }}\n >\n {data.label}\n </span>\n {data.pinnable && data.onPinToggle && (\n <button\n type=\"button\"\n data-testid={`canvas-zone-pin-${data.label.toLowerCase()}`}\n aria-label={pinActive ? `Unpin ${data.label} zone` : `Pin ${data.label} zone`}\n aria-pressed={pinActive}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.stopPropagation();\n data.onPinToggle?.();\n }}\n onMouseEnter={() => setPinHover(true)}\n onMouseLeave={() => setPinHover(false)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 18,\n height: 18,\n padding: 0,\n border: \"none\",\n borderRadius: 5,\n background: pinActive ? \"rgba(99,102,241,0.12)\" : \"transparent\",\n color: pinActive || pinHover ? \"#6366f1\" : \"rgba(99,102,241,0.45)\",\n cursor: \"pointer\",\n pointerEvents: \"auto\",\n lineHeight: 1,\n }}\n >\n <Pin size={11} fill={pinActive ? \"currentColor\" : \"none\"} />\n </button>\n )}\n </div>\n </div>\n );\n};\n\nexport const CanvasZone = React.memo(CanvasZoneInner);\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Drawer } from \"antd\";\nimport { CopilotPanel } from \"../Chat/CopilotPanel\";\nimport type { InitialMessageRequest } from \"../Chat/InitialMessageSubmitter\";\nimport { ProjectScopeProvider } from \"../ProjectScopeProvider\";\nimport { MOBILE_ARCHITECT_QUERY } from \"./useArchitectMobileViewport\";\nimport { useCopilotKickoffRequest } from \"./useCopilotKickoffRequest\";\n\n/**\n * ArchitectCopilotDock — the shared right-side architect copilot dock rendered\n * on any agent canvas. Resizable (320-900px via left edge handle), collapsible\n * (vertical tab restores it), and auto-sends a kickoff message when one\n * arrives (learning rounds). The workflow context type switches the copilot\n * template between agent configuration and workflow building.\n */\nexport interface ArchitectCopilotDockProps {\n assistantId: string;\n assistantName: string;\n /** Isolated workspace/project scope used by architect runs and attachments. */\n workspaceId?: string | null;\n projectId?: string | null;\n /** Copilot template context: agent config vs workflow building. */\n contextType: \"agent\" | \"workflow\";\n /** Auto-send request in the copilot (learning kickoff). */\n initialMessageRequest?: InitialMessageRequest | null;\n /** Called after the initial message request has been submitted. */\n onInitialMessageSubmitted?: (requestId: string) => void;\n /** Called when the architect completes a tool call. */\n onToolCompleted?: (toolName: string) => void;\n /** Label on the collapsed vertical tab. */\n label?: string;\n /** Temporarily hide the dock without interrupting its mounted copilot session. */\n temporarilyHidden?: boolean;\n /** Monotonic signal that reopens a user-collapsed dock without remounting it. */\n openSignal?: number;\n /** Show the dock's standalone mobile opener when no surrounding HUD owns access. */\n showMobileTrigger?: boolean;\n /** External trigger to restore when the mobile Drawer has no standalone opener. */\n restoreFocusRef?: React.RefObject<HTMLElement>;\n}\n\nconst mobileViewportMatches = (): boolean =>\n typeof window !== \"undefined\" && typeof window.matchMedia === \"function\"\n ? window.matchMedia(MOBILE_ARCHITECT_QUERY).matches\n : false;\n\nexport const ArchitectCopilotDock: React.FC<ArchitectCopilotDockProps> = ({\n assistantId,\n assistantName,\n workspaceId,\n projectId,\n contextType,\n initialMessageRequest,\n onInitialMessageSubmitted,\n onToolCompleted,\n label = \"Architect\",\n temporarilyHidden = false,\n openSignal = 0,\n showMobileTrigger = true,\n restoreFocusRef,\n}) => {\n const [isMobile, setIsMobile] = useState(mobileViewportMatches);\n const [userOpen, setUserOpen] = useState(() => !mobileViewportMatches());\n const [copilotWidth, setCopilotWidth] = useState(360);\n const containerRef = useRef<HTMLDivElement>(null);\n const openerRef = useRef<HTMLButtonElement>(null);\n const resizingRef = useRef<{ startX: number; startWidth: number } | null>(null);\n const incomingRequest = initialMessageRequest ?? null;\n const { attemptedRequestIdsRef, effectivePendingRequest, handleInitialMessageSubmitted } =\n useCopilotKickoffRequest({ assistantId, initialMessageRequest, onInitialMessageSubmitted });\n\n useEffect(() => {\n if (containerRef.current) {\n containerRef.current.inert = temporarilyHidden || !userOpen;\n }\n }, [isMobile, temporarilyHidden, userOpen]);\n\n useEffect(() => {\n if (isMobile && temporarilyHidden) setUserOpen(false);\n }, [isMobile, temporarilyHidden]);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return;\n const media = window.matchMedia(MOBILE_ARCHITECT_QUERY);\n const handleChange = (event: MediaQueryListEvent): void => {\n setIsMobile(event.matches);\n setUserOpen(!event.matches);\n };\n setIsMobile(media.matches);\n if (typeof media.addEventListener === \"function\") {\n media.addEventListener(\"change\", handleChange);\n return () => media.removeEventListener(\"change\", handleChange);\n }\n media.addListener(handleChange);\n return () => media.removeListener(handleChange);\n }, []);\n\n useEffect(() => {\n if (openSignal > 0) setUserOpen(true);\n }, [openSignal]);\n\n useEffect(() => {\n // A pending kickoff must mount the copilot so it can be sent, even when\n // another dock is temporarily covering it.\n if (incomingRequest && !isMobile) {\n setUserOpen(true);\n }\n }, [assistantId, incomingRequest?.requestId, incomingRequest?.content, isMobile]);\n\n const handleResizeStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n resizingRef.current = { startX: e.clientX, startWidth: copilotWidth };\n }, [copilotWidth]);\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!resizingRef.current) return;\n const delta = resizingRef.current.startX - e.clientX;\n const next = Math.min(900, Math.max(320, resizingRef.current.startWidth + delta));\n setCopilotWidth(next);\n };\n const handleMouseUp = () => {\n resizingRef.current = null;\n };\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, []);\n\n const panel = (\n <div\n ref={containerRef}\n data-testid=\"architect-copilot-container\"\n aria-hidden={temporarilyHidden || !userOpen || undefined}\n style={isMobile ? {\n width: \"100%\",\n height: \"100%\",\n overflow: \"hidden\",\n visibility: temporarilyHidden || !userOpen ? \"hidden\" : \"visible\",\n pointerEvents: temporarilyHidden || !userOpen ? \"none\" : undefined,\n } : {\n position: \"absolute\",\n right: 12,\n top: 56,\n bottom: 12,\n width: copilotWidth,\n zIndex: 15,\n borderRadius: 12,\n overflow: \"hidden\",\n boxShadow: \"0 4px 24px rgba(0,0,0,0.12)\",\n visibility: temporarilyHidden || !userOpen ? \"hidden\" : \"visible\",\n pointerEvents: temporarilyHidden || !userOpen ? \"none\" : undefined,\n }}\n >\n {!isMobile && (\n <div\n onMouseDown={handleResizeStart}\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n bottom: 0,\n width: 6,\n cursor: \"ew-resize\",\n zIndex: 2,\n background: \"transparent\",\n }}\n />\n )}\n <ProjectScopeProvider\n key={`${workspaceId ?? \"default\"}:${projectId ?? \"default\"}`}\n defaultWorkspaceId={workspaceId ?? undefined}\n defaultProjectId={projectId ?? undefined}\n >\n <CopilotPanel\n key={assistantId}\n workflowContext={{ id: assistantId, name: assistantName ?? \"\", type: contextType }}\n onClose={() => setUserOpen(false)}\n onToolCompleted={onToolCompleted}\n initialMessageRequest={effectivePendingRequest}\n attemptedInitialMessageRequestIdsRef={attemptedRequestIdsRef}\n rawInitialMessage\n onInitialMessageSubmitted={handleInitialMessageSubmitted}\n />\n </ProjectScopeProvider>\n </div>\n );\n\n const opener = !userOpen && !temporarilyHidden && (!isMobile || showMobileTrigger) ? (\n <div style={isMobile\n ? { position: \"absolute\", right: 12, bottom: 16, zIndex: 20 }\n : { position: \"absolute\", right: 0, top: \"50%\", transform: \"translateY(-50%)\", zIndex: 20 }}>\n <button\n ref={openerRef}\n type=\"button\"\n aria-label=\"Open copilot\"\n onClick={() => setUserOpen(true)}\n style={isMobile ? {\n padding: \"9px 14px\",\n background: \"#6366f1\",\n color: \"#fff\",\n borderRadius: 9999,\n cursor: \"pointer\",\n fontSize: 12,\n fontWeight: 500,\n userSelect: \"none\",\n border: \"none\",\n boxShadow: \"0 4px 16px rgba(79,70,229,0.28)\",\n } : {\n writingMode: \"vertical-rl\",\n textOrientation: \"mixed\",\n padding: \"16px 8px\",\n background: \"#6366f1\",\n color: \"#fff\",\n borderRadius: \"8px 0 0 8px\",\n cursor: \"pointer\",\n fontSize: 12,\n fontWeight: 500,\n userSelect: \"none\",\n border: \"none\",\n }}\n >\n {label}\n </button>\n </div>\n ) : null;\n\n return (\n <>\n {opener}\n {isMobile ? (\n <Drawer\n title={label}\n aria-label={label}\n placement=\"right\"\n width=\"100vw\"\n open={userOpen && !temporarilyHidden}\n onClose={() => setUserOpen(false)}\n forceRender\n destroyOnHidden={false}\n styles={{ body: { padding: 0, overflow: \"hidden\", height: \"100%\" } }}\n afterOpenChange={(open) => {\n if (!open && !userOpen) {\n (restoreFocusRef?.current ?? openerRef.current)?.focus();\n }\n }}\n >\n {panel}\n </Drawer>\n ) : panel}\n </>\n );\n};\n","import { useEffect, useState } from \"react\";\n\nexport const MOBILE_ARCHITECT_QUERY = \"(max-width: 767px)\";\n\nconst matches = (): boolean =>\n typeof window !== \"undefined\" && typeof window.matchMedia === \"function\"\n ? window.matchMedia(MOBILE_ARCHITECT_QUERY).matches\n : false;\n\n/** True below the architect mobile breakpoint; subscribes to changes. */\nexport function useArchitectMobileViewport(): boolean {\n const [isMobile, setIsMobile] = useState(matches);\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return;\n const media = window.matchMedia(MOBILE_ARCHITECT_QUERY);\n const handleChange = (event: MediaQueryListEvent): void => {\n setIsMobile(event.matches);\n };\n setIsMobile(media.matches);\n if (typeof media.addEventListener === \"function\") {\n media.addEventListener(\"change\", handleChange);\n return () => media.removeEventListener(\"change\", handleChange);\n }\n media.addListener(handleChange);\n return () => media.removeListener(handleChange);\n }, []);\n return isMobile;\n}\n","import { useLayoutEffect, useRef, useState } from \"react\";\nimport type {\n InitialMessageAttemptRegistry,\n InitialMessageRequest,\n} from \"../Chat/InitialMessageSubmitter\";\n\nexport interface PendingKickoffRecord {\n assistantId: string;\n observedRequest: InitialMessageRequest | null;\n request: InitialMessageRequest | null;\n}\n\nexport const kickoffRequestsMatch = (\n left: InitialMessageRequest | null,\n right: InitialMessageRequest | null\n): boolean => left?.requestId === right?.requestId && left?.content === right?.content;\n\nexport interface UseCopilotKickoffRequestArgs {\n assistantId: string;\n /** Auto-send request in the copilot (learning kickoff). */\n initialMessageRequest?: InitialMessageRequest | null;\n /** Called after the initial message request has been submitted. */\n onInitialMessageSubmitted?: (requestId: string) => void;\n}\n\nexport interface UseCopilotKickoffRequestResult {\n /** Registry handed to CopilotPanel to prevent duplicate kickoff sends. */\n attemptedRequestIdsRef: InitialMessageAttemptRegistry;\n /** The kickoff request that still needs to be sent (null once submitted). */\n effectivePendingRequest: InitialMessageRequest | null;\n /** Pass straight to CopilotPanel's onInitialMessageSubmitted. */\n handleInitialMessageSubmitted: (requestId: string) => void;\n}\n\n/**\n * Shared kickoff auto-send bookkeeping for the Architect copilot surfaces\n * (canvas node + mobile dock). Tracks the latest incoming request per\n * assistant, exposes the still-pending request, and clears it after submit\n * while always forwarding the parent's onInitialMessageSubmitted callback.\n */\nexport function useCopilotKickoffRequest({\n assistantId,\n initialMessageRequest,\n onInitialMessageSubmitted,\n}: UseCopilotKickoffRequestArgs): UseCopilotKickoffRequestResult {\n const attemptedRequestIdsRef: InitialMessageAttemptRegistry = useRef(new Set<string>());\n const incomingRequest = initialMessageRequest ?? null;\n const initialPendingRecord = useRef<PendingKickoffRecord | null>(null);\n if (initialPendingRecord.current === null) {\n initialPendingRecord.current = {\n assistantId,\n observedRequest: incomingRequest,\n request: incomingRequest,\n };\n }\n const [pendingRecord, setPendingRecord] = useState<PendingKickoffRecord>(initialPendingRecord.current);\n const committedPendingRecordRef = useRef(pendingRecord);\n\n useLayoutEffect(() => {\n const current = committedPendingRecordRef.current;\n if (current.assistantId === assistantId && kickoffRequestsMatch(current.observedRequest, incomingRequest)) {\n return;\n }\n const next = { assistantId, observedRequest: incomingRequest, request: incomingRequest };\n committedPendingRecordRef.current = next;\n setPendingRecord(next);\n }, [assistantId, incomingRequest?.requestId, incomingRequest?.content]);\n\n const effectivePendingRequest =\n pendingRecord.assistantId === assistantId && kickoffRequestsMatch(pendingRecord.observedRequest, incomingRequest)\n ? pendingRecord.request\n : null;\n\n const handleInitialMessageSubmitted = (requestId: string) => {\n const current = committedPendingRecordRef.current;\n if (current.assistantId !== assistantId) {\n return;\n }\n if (current.request?.requestId === requestId) {\n const next = { ...current, request: null };\n committedPendingRecordRef.current = next;\n setPendingRecord((record) =>\n record.assistantId === assistantId && record.request?.requestId === requestId\n ? { ...record, request: null }\n : record\n );\n }\n onInitialMessageSubmitted?.(requestId);\n };\n\n return { attemptedRequestIdsRef, effectivePendingRequest, handleInitialMessageSubmitted };\n}\n","import React, { useEffect, useRef } from \"react\";\nimport { Node, NodeProps, useReactFlow } from \"@xyflow/react\";\nimport { CopilotPanel } from \"../Chat/CopilotPanel\";\nimport { ProjectScopeProvider } from \"../ProjectScopeProvider\";\nimport type { InitialMessageRequest } from \"../Chat/InitialMessageSubmitter\";\nimport { useCopilotKickoffRequest } from \"./useCopilotKickoffRequest\";\n\nexport const COPILOT_NODE_ID = \"node:architect-copilot\";\n\nexport type ArchitectCopilotNodeData = {\n assistantId: string;\n assistantName: string;\n workspaceId?: string | null;\n projectId?: string | null;\n initialMessageRequest?: InitialMessageRequest | null;\n onInitialMessageSubmitted?: (requestId: string) => void;\n onToolCompleted?: (toolName: string) => void;\n /** Hide the panel without interrupting the mounted copilot session. */\n temporarilyHidden?: boolean;\n /** Monotonic signal to expand the badge back to the full panel. */\n openSignal?: number;\n /** Filled zone width (computeTrainingLayout's copilot rect) — the panel fills its zone. */\n width: number;\n /** Filled zone height. */\n height: number;\n /** Zone center — the expand/re-center target. */\n center: { x: number; y: number };\n};\n\nexport type ArchitectCopilotNodeType = Node<ArchitectCopilotNodeData, \"copilot\">;\n\nconst ArchitectCopilotNodeInner: React.FC<NodeProps<ArchitectCopilotNodeType>> = ({ data }) => {\n const {\n assistantId,\n assistantName,\n workspaceId,\n projectId,\n initialMessageRequest,\n onInitialMessageSubmitted,\n onToolCompleted,\n temporarilyHidden = false,\n openSignal = 0,\n width,\n height,\n center,\n } = data;\n const reactFlow = useReactFlow();\n const containerRef = useRef<HTMLDivElement>(null);\n const { attemptedRequestIdsRef, effectivePendingRequest, handleInitialMessageSubmitted } =\n useCopilotKickoffRequest({ assistantId, initialMessageRequest, onInitialMessageSubmitted });\n\n // Visual-only collapse: the panel stays mounted so the session never resets.\n const collapsed = temporarilyHidden;\n const expandToNode = () =>\n reactFlow.setCenter(center.x, center.y, { zoom: 1, duration: 400 });\n\n useEffect(() => {\n if (containerRef.current) containerRef.current.inert = collapsed;\n }, [collapsed]);\n\n useEffect(() => {\n if (openSignal > 0) expandToNode();\n }, [openSignal]);\n\n return (\n <div style={{ width, height, position: \"relative\", fontFamily: \"inherit\" }}>\n <div\n ref={containerRef}\n data-testid=\"architect-copilot-node-panel\"\n aria-hidden={collapsed || undefined}\n className=\"nodrag nowheel nopan\"\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: 12,\n overflow: \"hidden\",\n background: \"#fff\",\n visibility: collapsed ? \"hidden\" : \"visible\",\n pointerEvents: collapsed ? \"none\" : undefined,\n userSelect: \"text\",\n WebkitUserSelect: \"text\",\n }}\n >\n <ProjectScopeProvider\n key={`${workspaceId ?? \"default\"}:${projectId ?? \"default\"}`}\n defaultWorkspaceId={workspaceId ?? undefined}\n defaultProjectId={projectId ?? undefined}\n >\n <CopilotPanel\n key={assistantId}\n workflowContext={{ id: assistantId, name: assistantName ?? \"\", type: \"agent\" }}\n onToolCompleted={onToolCompleted}\n initialMessageRequest={effectivePendingRequest}\n attemptedInitialMessageRequestIdsRef={attemptedRequestIdsRef}\n rawInitialMessage\n showHeader={false}\n onInitialMessageSubmitted={handleInitialMessageSubmitted}\n />\n </ProjectScopeProvider>\n </div>\n {collapsed && (\n <button\n type=\"button\"\n data-testid=\"architect-copilot-node-badge\"\n aria-label=\"Expand architect copilot\"\n onClick={expandToNode}\n style={{\n position: \"absolute\",\n left: 12,\n top: \"50%\",\n transform: \"translateY(-50%)\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"9px 14px\",\n background: \"#6366f1\",\n color: \"#fff\",\n borderRadius: 9999,\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 12,\n fontWeight: 500,\n userSelect: \"none\",\n }}\n >\n <span style={{ width: 8, height: 8, borderRadius: \"50%\", background: \"#22c55e\", display: \"inline-block\" }} />\n Architect\n </button>\n )}\n </div>\n );\n};\n\nexport const ArchitectCopilotNode = React.memo(ArchitectCopilotNodeInner);\n","import React from \"react\";\nimport { Node, NodeProps } from \"@xyflow/react\";\nimport { EvalQualityPanel } from \"./EvalQualityPanel\";\nimport { scoreColor } from \"./evalQuality\";\nimport type { EvalRunRecord } from \"../../hooks/eval/evalTypes\";\nimport { TESTING_BADGE_H, TESTING_BADGE_W } from \"./canvasLayout\";\nimport { configNodeColor, type ConfigGraphNode } from \"./configGraph\";\n\n/** Zoom below which the TESTING zone collapses to the compact badge. */\nexport const TESTING_BADGE_ZOOM = 0.4;\n/** Hysteresis: a mounted badge tier survives until zoom rises to this (re-entering needs < 0.4). */\nexport const TESTING_BADGE_EXIT_ZOOM = 0.45;\n\nexport type TestingZoomTier = \"overview\" | \"badge\";\n\n/**\n * Quantize raw zoom into an LOD tier with hysteresis (mirrors resolveLearningZoomTier):\n * the badge is entered below 0.4 and kept until zoom reaches 0.45, so boundary\n * jitter never rebuilds the graph.\n */\nexport const resolveTestingZoomTier = (zoom: number, previous: TestingZoomTier): TestingZoomTier =>\n previous === \"badge\"\n ? (zoom >= TESTING_BADGE_EXIT_ZOOM ? \"overview\" : \"badge\")\n : zoom < TESTING_BADGE_ZOOM ? \"badge\" : \"overview\";\n\nexport type TestingPanelData = {\n agentId: string;\n /** Raw run records for the embedded EvalQualityPanel (summary + trend + diagnosis). */\n runs: EvalRunRecord[];\n /** Zone content width the panel fills. */\n width: number;\n /** Zone content height the panel never shrinks below. */\n height: number;\n /** Eval suite chips: one node per suite (\"N cases\" description). */\n suites: ConfigGraphNode[];\n /** Chip click → graph selection (existing NodeDock flow). */\n onSuiteClick: (item: ConfigGraphNode) => void;\n};\n\nexport type TestingBadgeData = {\n score: number | null;\n suiteCount: number;\n};\n\nconst CARD_STYLE: React.CSSProperties = {\n background: \"rgba(255,255,255,0.92)\",\n border: \"1px solid rgba(240,240,240,0.9)\",\n borderRadius: 14,\n};\n\n/**\n * ② TESTING zone, full tier: one bounded block embedding the eval-quality\n * analysis inline (KPI summary + per-round trend + score-by-run + latest-run\n * diagnosis) plus the suite chips below it. Fills the zone content and\n * scrolls internally so overset content clips inside the panel, never past\n * the zone floor.\n */\nconst TestingPanelNodeInner: React.FC<NodeProps<Node<TestingPanelData>>> = ({ data }) => (\n <div\n data-testid=\"testing-panel\"\n style={{ ...CARD_STYLE, width: data.width, minHeight: data.height, boxSizing: \"border-box\", padding: 12, overflow: \"auto\", display: \"flex\", flexDirection: \"column\", gap: 12 }}\n >\n <EvalQualityPanel agentId={data.agentId} runs={data.runs} />\n {data.suites.length > 0 && (\n <div data-testid=\"testing-suites\" style={{ borderTop: \"1px solid #f0f0f0\", paddingTop: 10, display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <div style={{ fontSize: 12, fontWeight: 600, color: \"rgba(0,0,0,0.65)\" }}>Evaluation suites</div>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 6 }}>\n {data.suites.map((suite) => (\n <div\n key={suite.id}\n data-testid=\"testing-suite-chip\"\n onClick={() => data.onSuiteClick(suite)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 5,\n padding: \"4px 10px\",\n borderRadius: 9999,\n background: \"#fff\",\n border: `1px solid ${configNodeColor(\"eval\")}55`,\n fontSize: 11,\n color: \"#333\",\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n }}\n >\n <span style={{ overflow: \"hidden\", textOverflow: \"ellipsis\" }}>{suite.label}</span>\n {suite.description && <span style={{ fontSize: 10, color: \"#999\" }}>{suite.description}</span>}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n);\nexport const TestingPanelNode = React.memo(TestingPanelNodeInner);\n\n/** ② TESTING zone, low-zoom tier: score-colored dot + suite count. */\nconst TestingBadgeNodeInner: React.FC<NodeProps<Node<TestingBadgeData>>> = ({ data }) => (\n <div\n data-testid=\"testing-badge\"\n style={{\n width: TESTING_BADGE_W, height: TESTING_BADGE_H, borderRadius: 10,\n background: \"rgba(255,255,255,0.92)\", border: \"1px solid rgba(240,240,240,0.9)\",\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\", gap: 6,\n }}\n >\n <span style={{ width: 10, height: 10, borderRadius: 9999, background: data.score === null ? \"#d1d5db\" : scoreColor(data.score), flexShrink: 0 }} />\n <span style={{ fontSize: 12, fontWeight: 600, color: \"#6b7280\" }}>{data.suiteCount}</span>\n </div>\n);\nexport const TestingBadgeNode = React.memo(TestingBadgeNodeInner);\n","/**\n * Single source of truth for the training-canvas zone layout.\n *\n * Zone rects are positioning regions AND rendered as uniform floors (label\n * chip + dashed panel) — layout anchors from which all content node positions\n * derive, so layout math can never drift apart. Every module (CONFIG →\n * LEARNING → TESTING → COPILOT, reading left→right) is a visible bounded\n * block on the canvas.\n */\n\nexport interface ZoneRect {\n id: string;\n label: string;\n /** Top-left corner in world coordinates. */\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nconst zoneRect = (id: string, label: string, cx: number, width: number, height: number): ZoneRect => ({\n id,\n label,\n x: cx - width / 2,\n y: -height / 2,\n width,\n height,\n});\n\nexport const CONFIG_ZONE = zoneRect(\"zone:config\", \"CONFIG\", -767, 900, 620);\nexport const TESTING_ZONE = zoneRect(\"zone:testing\", \"EVALUATION\", -69, 400, 560);\nexport const LEARNING_ZONE = zoneRect(\"zone:learning\", \"LEARNING\", 459, 560, 680);\nexport const COPILOT_ZONE = zoneRect(\"zone:copilot\", \"COPILOT\", 1147, 720, 740);\n\nexport const ALL_ZONES: ZoneRect[] = [CONFIG_ZONE, TESTING_ZONE, LEARNING_ZONE, COPILOT_ZONE];\n\n/** All four zones render a semantic floor: every module is a visible bounded block. */\nexport const RENDERED_ZONE_IDS: string[] = [\n CONFIG_ZONE.id,\n TESTING_ZONE.id,\n LEARNING_ZONE.id,\n COPILOT_ZONE.id,\n];\n\n/**\n * First-open readability floor: fitting the full canvas (~2400 world units)\n * lands around 0.39 zoom on a laptop viewport, where the content is\n * unreadable. Below this the initial fit re-frames the CONFIG floor + agent +\n * config groups instead; TESTING/LEARNING/COPILOT are one pan away.\n */\nexport const FIT_READABILITY_ZOOM = 0.45;\n\n// Node sizes (owned here so all layout math lives in one module).\nexport const AGENT_NODE_W = 220;\nexport const AGENT_NODE_H = 110;\nexport const GROUP_NODE_W = 200;\nexport const GROUP_NODE_H = 90;\n\n/**\n * Original ring grouping preserved; offsets are relative to the CONFIG zone\n * center. Diamond layout — the eval group left the ring for the TESTING zone.\n */\nexport const CONFIG_RING_OFFSETS: Record<string, { x: number; y: number }> = {\n \"group:subagents\": { x: 0, y: -190 },\n \"group:capabilities\": { x: 330, y: 0 },\n \"group:tools\": { x: 0, y: 190 },\n \"group:skills\": { x: -330, y: 0 },\n};\n\n/** Agent node: centered in the LIVE CONFIG floor rect (unified height). */\nexport const configAgentPosition = (zone: ZoneRect): { x: number; y: number } => ({\n x: zone.x + zone.width / 2 - AGENT_NODE_W / 2,\n y: zone.y + zone.height / 2 - AGENT_NODE_H / 2,\n});\n\nexport const configGroupPosition = (zone: ZoneRect, groupId: string, groupHeight: number): { x: number; y: number } => {\n const offset = CONFIG_RING_OFFSETS[groupId] ?? { x: 0, y: 0 };\n return {\n x: zone.x + zone.width / 2 + offset.x - GROUP_NODE_W / 2,\n y: zone.y + zone.height / 2 + offset.y - groupHeight / 2,\n };\n};\n\n/** Static fixture half height (620/2). Floors never shrink below this. */\nexport const CONFIG_FLOOR_MIN_HALF_HEIGHT = 310;\n\n/**\n * CONFIG floor: grows vertically to contain the ring (offset + group height),\n * 40px margin. Group node centers sit at zone-center + offset.y, so the\n * required half height is |offset.y| + h/2 + margin; the floor grows\n * symmetrically and stays centered on y=0 (agent/ring anchors unchanged).\n * The margin covers the estimate-vs-DOM delta: the height estimate can\n * undershoot the real rendered GroupNode height, so the margin absorbs it\n * and config content never clips past the floor edge.\n */\nexport const configFloorRect = (groupHeights: Record<string, number>): ZoneRect => {\n const cx = CONFIG_ZONE.x + CONFIG_ZONE.width / 2;\n let half = CONFIG_FLOOR_MIN_HALF_HEIGHT;\n for (const [id, h] of Object.entries(groupHeights)) {\n const off = CONFIG_RING_OFFSETS[id];\n if (!off) continue;\n half = Math.max(half, Math.abs(off.y) + h / 2 + 40);\n }\n return {\n id: CONFIG_ZONE.id,\n label: CONFIG_ZONE.label,\n x: cx - CONFIG_ZONE.width / 2,\n y: -half,\n width: CONFIG_ZONE.width,\n height: half * 2,\n };\n};\n\n/**\n * Unified floor minimum: the chain layout never shrinks below this fixture\n * height — every content need fits its static anchor even when empty.\n */\nexport const UNIFIED_FLOOR_MIN_HEIGHT = 900;\n\n/** ② TESTING content: suites render as chips inside the panel node; badge centered at low zoom. */\nexport const TESTING_CONTENT_OFFSET = { x: 20, y: 20 };\nexport const TESTING_BADGE_W = 110;\nexport const TESTING_BADGE_H = 48;\n\n/** Top offset of the suites area inside the TESTING panel node. */\nexport const TESTING_SUITES_TOP_OFFSET = 220;\n\n/** Static fixture height. Floors never shrink below this. */\nexport const TESTING_FLOOR_MIN_HEIGHT = 560;\n\n/**\n * TESTING floor: reserves the suites area inside the panel node (suites top\n * offset + group height + 24px bottom margin); the resulting height feeds\n * the shared unified floor.\n */\nexport const testingFloorRect = (suitesGroupHeight: number): ZoneRect => ({\n id: TESTING_ZONE.id,\n label: TESTING_ZONE.label,\n x: TESTING_ZONE.x,\n y: TESTING_ZONE.y,\n width: TESTING_ZONE.width,\n height: Math.max(TESTING_FLOOR_MIN_HEIGHT, TESTING_SUITES_TOP_OFFSET + suitesGroupHeight + 24),\n});\n\n/** Low-zoom badge: centered in the LIVE zone (w/h reserved for future tuning). */\nexport const testingBadgePosition = (zone: ZoneRect, w: number, h: number): { x: number; y: number } => {\n void w;\n void h;\n return {\n x: zone.x + zone.width / 2 - TESTING_BADGE_W / 2,\n y: zone.y + zone.height / 2 - TESTING_BADGE_H / 2,\n };\n};\n\n/** Gap between adjacent chain zones. */\nexport const ZONE_GAP = 48;\n/** TESTING zone width once the suite-chips module lives there. */\nexport const TESTING_PANEL_W = 520;\n/** COPILOT zone width (the engine panel fills its zone). */\nexport const COPILOT_PANEL_W = 720;\n/** Interior side margin every zone hangs its content in from. */\nexport const ZONE_MARGIN = 20;\n/** LEARNING header block (selector row + stats row + breadcrumb/banner headroom); the DAG hangs below it. */\nexport const LEARNING_HEADER_HEIGHT = 150;\n\nexport interface TrainingLayoutInput {\n /** Group node heights keyed by group id (CONFIG ring sizing). */\n groupHeights: Record<string, number>;\n /** TESTING suite-chips group height (0 = no suites). */\n suitesGroupHeight: number;\n /** Natural dagre bbox of the capped learning round tree. */\n learningDagBBox: { width: number; height: number };\n}\n\nexport interface TrainingLayout {\n config: ZoneRect;\n testing: ZoneRect;\n learning: ZoneRect;\n copilot: ZoneRect;\n /** One shared floor height — the tallest content need (never below the 800 minimum). */\n height: number;\n}\n\n/**\n * Pin Dock: zones that can pin into fixed dock columns over the canvas.\n * CONFIG never pins — it stays the canvas base layer in the leftover space.\n */\nexport type PinnableZoneKey = \"copilot\" | \"learning\" | \"evaluation\";\n\n/** A pinned zone's CanvasDock placement (dock-prop shaped). */\nexport interface PinnedDockPlacement {\n width: number;\n /** Left-edge anchor; absent = right-anchored (copilot / single-pin slot). */\n left?: number;\n /** Explicit top offset; absent = the dock default (PIN_DOCK_HEADER_TOP). */\n top?: number;\n /** Explicit height; absent = full height between the dock defaults. */\n height?: number;\n}\n\n/** Pin dock chrome: side/bottom margin, top header offset, inter-panel gutter. */\nexport const PIN_DOCK_MARGIN = 12;\nexport const PIN_DOCK_HEADER_TOP = 56;\nexport const PIN_DOCK_PANEL_GAP = 12;\n\n/**\n * Authoritative slot table for pinned zone docks (CanvasDock props, keyed by\n * zone; only pinned zones get an entry). Two columns split the viewport\n * (12px margins + a 12px gutter): copilot owns the RIGHT column full height;\n * the other pinned zones use the LEFT column — full height alone, split\n * top/bottom (learning top, evaluation bottom) with a visible PANEL_GAP when\n * both. Without copilot, learning + evaluation take one full-height column\n * each (learning left, evaluation right); a single learning/evaluation pin\n * takes the right column full height. Every dock is width-draggable via its\n * dock handle. Empty pinned set = {} (pure canvas).\n */\nexport const computePinnedLayout = (\n containerWidth: number,\n containerHeight: number,\n pinned: ReadonlySet<PinnableZoneKey>,\n): Partial<Record<PinnableZoneKey, PinnedDockPlacement>> => {\n const placements: Partial<Record<PinnableZoneKey, PinnedDockPlacement>> = {};\n const M = PIN_DOCK_MARGIN;\n const TOP = PIN_DOCK_HEADER_TOP;\n const G = PIN_DOCK_PANEL_GAP;\n const rightColW = Math.round((containerWidth - M * 2 - G) / 2);\n const leftColW = containerWidth - M * 2 - G - rightColW;\n const leftH = containerHeight - TOP - M;\n const halfH = Math.round((leftH - G) / 2);\n const learningPinned = pinned.has(\"learning\");\n const evaluationPinned = pinned.has(\"evaluation\");\n if (pinned.has(\"copilot\")) {\n // Right column, full height (right-anchored dock default).\n placements.copilot = { width: rightColW };\n if (learningPinned) {\n placements.learning = evaluationPinned\n ? { left: M, top: TOP, width: leftColW, height: halfH }\n : { left: M, top: TOP, width: leftColW, height: leftH };\n }\n if (evaluationPinned) {\n placements.evaluation = learningPinned\n ? { left: M, top: TOP + halfH + G, width: leftColW, height: leftH - halfH - G }\n : { left: M, top: TOP, width: leftColW, height: leftH };\n }\n return placements;\n }\n if (learningPinned && evaluationPinned) {\n // One full-height column each: learning left, evaluation right.\n placements.learning = { left: M, top: TOP, width: leftColW, height: leftH };\n placements.evaluation = { left: M + leftColW + G, top: TOP, width: rightColW, height: leftH };\n return placements;\n }\n // Single pin without copilot: right column, full height (dock defaults).\n if (learningPinned) placements.learning = { width: rightColW };\n if (evaluationPinned) placements.evaluation = { width: rightColW };\n return placements;\n};\n\n/**\n * Content-driven chain layout: the single source of truth for the four zone\n * rects. Every zone's required size comes from its content (config ring,\n * suite chips, learning DAG bbox, copilot panel), the shared height is the\n * tallest content need (never below UNIFIED_FLOOR_MIN_HEIGHT), and the zones\n * are placed left→right (CONFIG → LEARNING → TESTING → COPILOT) with a\n * ZONE_GAP, vertically centered on y=0 — equal-height columns.\n */\nexport const computeTrainingLayout = (input: TrainingLayoutInput): TrainingLayout => {\n const config = configFloorRect(input.groupHeights);\n const testing: ZoneRect = { ...testingFloorRect(input.suitesGroupHeight), width: TESTING_PANEL_W };\n const learningW = Math.max(LEARNING_ZONE.width, input.learningDagBBox.width + ZONE_MARGIN * 2);\n const learning = {\n ...LEARNING_ZONE,\n width: learningW,\n height: Math.max(\n LEARNING_ZONE.height,\n input.learningDagBBox.height + LEARNING_HEADER_HEIGHT + ZONE_MARGIN * 2,\n ),\n };\n const copilot: ZoneRect = { ...COPILOT_ZONE, width: COPILOT_PANEL_W };\n const height = Math.max(UNIFIED_FLOOR_MIN_HEIGHT, config.height, testing.height, learning.height, copilot.height);\n // Chain left→right: CONFIG → LEARNING → TESTING → COPILOT.\n let cursor = config.x;\n const place = (z: { width: number }): { x: number; y: number; width: number; height: number } => {\n const rect = { x: cursor, y: -height / 2, width: z.width, height };\n cursor += z.width + ZONE_GAP;\n return rect;\n };\n return {\n config: { ...place(config), label: config.label, id: config.id },\n learning: { ...place(learning), label: learning.label, id: learning.id },\n testing: { ...place(testing), label: testing.label, id: testing.id },\n copilot: { ...place(copilot), label: copilot.label, id: copilot.id },\n height,\n };\n};\n","import React, { useMemo, useState } from \"react\";\nimport { Node, Edge, NodeProps, Handle, Position } from \"@xyflow/react\";\nimport { Button, Select } from \"antd\";\nimport { PlusOutlined } from \"@ant-design/icons\";\nimport type { TaskFileRef, TaskItem } from \"@axiom-lattice/protocols\";\nimport { applyDagreLayout } from \"@components/Chat/WorkflowGraphBase\";\nimport { buildTaskGraph, isHiddenStatus } from \"../../Tasks/taskGraphUtils\";\nimport { LEARNING_HEADER_HEIGHT, ZONE_MARGIN, type ZoneRect } from \"../canvasLayout\";\nimport type { LearningTasksData } from \"../useEntityRefresher\";\nimport { StartLearningModal } from \"./StartLearningModal\";\nimport { isActiveTrainingRound } from \"./trainingUtils\";\nimport { classifyDownstreamEdge, TASK_STATUS_META, type EdgeFlow } from \"./learningWorkflowUtils\";\n\n/**\n * Resolve a task id against the *current* learning trees. The task-detail\n * modal keeps only the id, so a refresh-sync re-derives the live snapshot and\n * the modal auto-closes when the task no longer exists.\n */\nexport function findTaskInTrees(learningTasks: LearningTasksData, id: string): { task: TaskItem; related: TaskItem[] } | null {\n for (const round of learningTasks.rounds) {\n const subTasks = learningTasks.subTasksByRound[round.id] ?? [];\n if (round.id === id) return { task: round, related: [round, ...subTasks] };\n const found = subTasks.find((t) => t.id === id);\n if (found) return { task: found, related: [round, ...subTasks] };\n }\n return null;\n}\n\n/**\n * Effective selected round — the follow/pin rule:\n * 1. a valid `selectedRoundId` pins that round;\n * 2. otherwise the newest active round (pending/in_progress/review) is\n * followed, so a freshly started round takes over the view;\n * 3. otherwise the latest round, else null.\n * `selectedRoundId: null` means follow mode (the parent keeps the pin state\n * as the single source of truth).\n */\nexport function resolveSelectedRound(learningTasks: LearningTasksData, selectedRoundId: string | null): TaskItem | null {\n const rounds = learningTasks.rounds;\n if (selectedRoundId) {\n const pinned = rounds.find((r) => r.id === selectedRoundId);\n if (pinned) return pinned;\n }\n for (const round of rounds) {\n if (isActiveTrainingRound(round)) return round;\n }\n return learningTasks.round ?? rounds[0] ?? null;\n}\n\n/**\n * The effective selected round's tree (round + its subtasks). Shared by the\n * zone content and the graph's bbox measurement so both always size from the\n * same tree.\n */\nexport function selectLearningTree(learningTasks: LearningTasksData, selectedRoundId: string | null): TaskItem[] {\n const selectedRound = resolveSelectedRound(learningTasks, selectedRoundId);\n return selectedRound ? [selectedRound, ...(learningTasks.subTasksByRound[selectedRound.id] ?? [])] : [];\n}\n\nconst TASK_NODE_WIDTH = 200;\n/** Dagre layout nominal height; the rendered card height is content-driven (title-first card). */\nconst TASK_NODE_HEIGHT = 80;\n/** dagre spacing for the TB layout (Tasks-graph convention: parents above children). */\nconst NODESEP_TB = 40;\nconst RANKSEP_TB = 70;\n\nconst ZERO_BBOX = { width: 0, height: 0 };\n\ninterface LearningLayout {\n headerOffset: { x: number; y: number };\n headerWidth: number;\n dagOffset: { x: number; y: number };\n}\n\n/**\n * Zone-derived layout anchors: every content anchor hangs off the LIVE\n * (unified-height) LEARNING floor rect, never the static fixture, so the\n * module stays glued to its floor as the shared height grows.\n */\nexport const learningLayout = (zone: ZoneRect): LearningLayout => ({\n headerOffset: { x: zone.x + ZONE_MARGIN, y: zone.y + ZONE_MARGIN },\n headerWidth: zone.width - ZONE_MARGIN * 2,\n dagOffset: { x: zone.x + ZONE_MARGIN, y: zone.y + LEARNING_HEADER_HEIGHT + ZONE_MARGIN },\n});\n\nconst CARD_STYLE: React.CSSProperties = {\n background: \"rgba(255,255,255,0.92)\",\n border: \"1px solid rgba(240,240,240,0.9)\",\n borderRadius: 14,\n padding: \"10px 12px\",\n};\n\nconst EDGE_STYLE: Record<EdgeFlow, React.CSSProperties> = {\n traversed: { stroke: \"#22c55e\", strokeWidth: 1.5 },\n flowing: { stroke: \"#6366f1\", strokeWidth: 2 },\n idle: { stroke: \"#d1d5db\", strokeWidth: 1 },\n};\n\n/** Declared dependency edges: dashed + faint, clearly subordinate to the solid parent edges. */\nconst DEPENDENCY_EDGE_STYLE: React.CSSProperties = {\n stroke: \"#cbd5e1\",\n strokeOpacity: 0.55,\n strokeWidth: 1,\n strokeDasharray: \"5 4\",\n};\n\n/** Arrowhead in the dependency stroke color, so dependency direction reads at a glance. */\nconst DEPENDENCY_EDGE_MARKER = { type: \"arrowclosed\", color: \"#cbd5e1\", width: 16, height: 16 } as const;\n\n/** Same predicate as the learning card: an interrupted task parked for HITL approval. */\nfunction isWaitingForApproval(task: TaskItem): boolean {\n const interruption = task.context?.interruption;\n return task.status === \"interrupted\"\n && typeof interruption === \"object\"\n && interruption !== null\n && (interruption as Record<string, unknown>).type === \"review_required\";\n}\n\nfunction relativeActivity(time: Date | string | undefined): string | null {\n if (!time) return null;\n const ms = new Date(time).getTime();\n if (!Number.isFinite(ms)) return null;\n const minutes = Math.floor((Date.now() - ms) / 60000);\n if (minutes < 1) return \"just now\";\n if (minutes < 60) return `${minutes}m ago`;\n if (minutes < 60 * 24) return `${Math.floor(minutes / 60)}h ago`;\n return `${Math.floor(minutes / (60 * 24))}d ago`;\n}\n\n// ---------------------------------------------------------------------------\n// DAG render model (TB, Tasks-graph visual language): a round root node tops\n// the graph, nodes are the round's tasks ordered by a per-sibling-group\n// topological sort over dependency edges (creation-time tiebreak), hierarchy\n// renders as parent (structure) edges styled by the downstream status,\n// declared dependencies render as dashed secondary edges, and dependency-free\n// sibling groups add a dashed sequence chain so the layout keeps execution\n// order. Layout is top-down dagre over the combined edge set (round/parents\n// rank above children; dependency and sequence edges add their own\n// constraints, so a prerequisite or chain predecessor always renders above\n// its successor). Depth-3+ descendants fold into their depth-2 ancestor as\n// an expander chip; expanding re-scopes the whole view onto that node's\n// subtree (focus mode, where the round root yields to the focused subtree).\n// ---------------------------------------------------------------------------\n\ninterface RoundTree {\n byId: Map<string, TaskItem>;\n round: TaskItem | null;\n /** Children per parent id in array (execution) order; orphans attach to the round. */\n childrenOf: Map<string, TaskItem[]>;\n}\n\nfunction buildRoundTree(tree: TaskItem[]): RoundTree {\n const round = tree.length > 0 ? tree[0] : null;\n const byId = new Map(tree.map((t) => [t.id, t]));\n const childrenOf = new Map<string, TaskItem[]>();\n for (const t of tree) {\n if (round && t.id === round.id) continue;\n const parent = t.parentId && t.parentId !== t.id && byId.has(t.parentId) ? t.parentId : round?.id;\n if (!parent) continue;\n const siblings = childrenOf.get(parent) ?? [];\n siblings.push(t);\n childrenOf.set(parent, siblings);\n }\n return { byId, round, childrenOf };\n}\n\nfunction collectDescendants(tree: RoundTree, id: string): TaskItem[] {\n const result: TaskItem[] = [];\n const stack = [...(tree.childrenOf.get(id) ?? [])];\n while (stack.length > 0) {\n const cur = stack.pop();\n if (!cur) break;\n result.push(cur);\n stack.push(...(tree.childrenOf.get(cur.id) ?? []));\n }\n return result;\n}\n\n/** Aggregated expander dot: amber if any waiting/review, blue if any running, else gray. */\nfunction foldDotColor(descendants: TaskItem[]): string {\n if (descendants.some((t) => t.status === \"review\" || isWaitingForApproval(t))) return \"#f59e0b\";\n if (descendants.some((t) => t.status === \"in_progress\")) return \"#3b82f6\";\n return \"#9ca3af\";\n}\n\n/** TaskOutlineList badge semantics: green when every dependency is done, amber while some wait. */\nfunction dependencyBadge(task: TaskItem, byId: Map<string, TaskItem>): { kind: \"done\" | \"waiting\"; count: number } | null {\n const deps = (task.dependencies ?? []).filter((d) => byId.has(d));\n if (deps.length === 0) return null;\n const incomplete = deps.filter((d) => {\n const dependency = byId.get(d);\n return dependency ? !isHiddenStatus(dependency.status) : false;\n });\n return incomplete.length > 0 ? { kind: \"waiting\", count: incomplete.length } : { kind: \"done\", count: deps.length };\n}\n\n/** A focus id is valid only for a non-round member of the current tree. */\nexport function resolveLearningFocusId(tree: TaskItem[], focusTaskId: string | null): string | null {\n const round = tree[0] ?? null;\n if (!round || !focusTaskId || focusTaskId === round.id) return null;\n return tree.some((t) => t.id === focusTaskId) ? focusTaskId : null;\n}\n\n/**\n * Sibling order for one same-parent group: a topological sort over the\n * group's INTERNAL dependency edges (edges whose both endpoints are members),\n * Kahn's algorithm with a stable priority keyed by created_at ASC — when no\n * dependency constrains a pair, creation order wins. Cyclic leftovers are\n * appended in base order (created_at ASC), so a corrupt dependency cycle\n * degrades to creation order instead of hanging.\n */\nfunction dependencyOrder(members: TaskItem[]): TaskItem[] {\n const byId = new Map(members.map((m) => [m.id, m]));\n const memberIds = new Set(members.map((m) => m.id));\n const baseIndex = new Map(\n [...members]\n .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime())\n .map((m, i) => [m.id, i]),\n );\n const dependents = new Map<string, string[]>();\n const indegree = new Map<string, number>();\n for (const m of members) {\n dependents.set(m.id, []);\n indegree.set(m.id, 0);\n }\n for (const m of members) {\n for (const depId of m.dependencies ?? []) {\n if (memberIds.has(depId) && depId !== m.id) {\n dependents.get(depId)?.push(m.id);\n indegree.set(m.id, (indegree.get(m.id) ?? 0) + 1);\n }\n }\n }\n const remaining = new Set(memberIds);\n const ordered: TaskItem[] = [];\n while (remaining.size > 0) {\n let picked: string | null = null;\n let pickedBase = Infinity;\n for (const id of remaining) {\n if ((indegree.get(id) ?? 0) !== 0) continue;\n const base = baseIndex.get(id) ?? Infinity;\n if (base < pickedBase) {\n picked = id;\n pickedBase = base;\n }\n }\n if (picked === null) break;\n remaining.delete(picked);\n const pickedTask = byId.get(picked);\n if (pickedTask) ordered.push(pickedTask);\n for (const next of dependents.get(picked) ?? []) {\n indegree.set(next, (indegree.get(next) ?? 0) - 1);\n }\n }\n for (const id of [...remaining].sort((a, b) => (baseIndex.get(a) ?? Infinity) - (baseIndex.get(b) ?? Infinity))) {\n const task = byId.get(id);\n if (task) ordered.push(task);\n }\n return ordered;\n}\n\n/**\n * Sequence chain edges for one ordered sibling group: consecutive members are\n * chained (so the dagre layout ranks them in execution order) ONLY when the\n * group has NO internal dependency edges — a group ordered by real\n * dependencies gets those edges alone, never a duplicated chain.\n */\nfunction sequenceChainEdges(ordered: TaskItem[], members: TaskItem[]): LearningDagEdge[] {\n const memberIds = new Set(members.map((m) => m.id));\n const hasInternalDependency = members.some((m) =>\n (m.dependencies ?? []).some((d) => d !== m.id && memberIds.has(d)),\n );\n if (hasInternalDependency) return [];\n const chain: LearningDagEdge[] = [];\n for (let i = 0; i + 1 < ordered.length; i++) {\n chain.push({ from: ordered[i].id, to: ordered[i + 1].id, kind: \"sequence\" });\n }\n return chain;\n}\n\nexport interface LearningDagTask {\n id: string;\n task: TaskItem;\n /** 1-based position within its sibling group's dependency order (creation tiebreak). */\n seq: number;\n /** Depth-3+ descendants folded into this node (expander chip), with the aggregated dot color. */\n fold: { count: number; dotColor: string } | null;\n depBadge: { kind: \"done\" | \"waiting\"; count: number } | null;\n}\n\n/** The round root card topping the DAG (completeness of the whole round tree). */\nexport interface LearningDagRoundRoot {\n id: string;\n /** `R{n}` — newest round carries the highest n. */\n label: string;\n title: string;\n status: TaskItem[\"status\"];\n /** Completed tasks across the round + its whole subtree. */\n doneCount: number;\n /** Round + its whole subtree. */\n totalCount: number;\n}\n\nexport type LearningDagEdgeKind = \"structure\" | \"dependency\" | \"sequence\";\n\nexport interface LearningDagEdge {\n from: string;\n to: string;\n kind: LearningDagEdgeKind;\n}\n\nexport interface LearningDagModel {\n /** The round root node (DAG root) — null only in focus mode or with no round. */\n root: LearningDagRoundRoot | null;\n tasks: LearningDagTask[];\n /** Parent (structure) + dependency + sibling-sequence edges between the DISPLAYED nodes, root included (cycles broken). */\n edges: LearningDagEdge[];\n /** Top-left positions of every displayed node (root included), normalized to a (0,0) anchor. */\n positions: Map<string, { x: number; y: number }>;\n bbox: { width: number; height: number };\n}\n\n/**\n * Build the displayed render model for the focused subtree. Without focus the\n * round root card tops the graph; its depth-1 and depth-2 descendants render\n * as task nodes wired by parent (structure) edges, and depth-3+ descendants\n * fold into their depth-2 ancestor as an expander chip. With focus the view\n * re-roots onto the focused task's subtree (no round root). Sibling order —\n * and therefore the `N.` sequence numbers — is a topological sort over each\n * sibling group's internal dependency edges (Kahn's algorithm, stable\n * priority by created_at ASC; cyclic leftovers fall back to base order), so\n * dependencies win and creation time breaks ties. Sibling groups with NO\n * internal dependency edges also draw sequence chain edges between\n * consecutive members (same faint dashed style as dependency edges) so the\n * dagre layout ranks them in execution order; a group with real dependency\n * edges gets those alone — no chain duplication. Edges come from\n * buildTaskGraph over the displayed tasks (parent + dependency, cycles\n * broken) plus the root's parent edges and the sequence chains, and the\n * whole set lays out top-down via dagre — parents rank above children,\n * prerequisites above dependents, and chain predecessors above successors.\n * No caps: the full displayed subtree renders and the bbox drives the zone\n * size. A round with NO children still produces a model: its round-root card\n * renders alone (it represents the round task itself — clickable to its\n * detail) so a fresh round is never an invisible empty view.\n */\nexport function buildLearningDagModel(tree: TaskItem[], focusTaskId: string | null, roundNumber: number | null = null): LearningDagModel {\n const empty: LearningDagModel = { root: null, tasks: [], edges: [], positions: new Map(), bbox: { ...ZERO_BBOX } };\n const roundTree = buildRoundTree(tree);\n const round = roundTree.round;\n if (!round) return empty;\n const focusId = resolveLearningFocusId(tree, focusTaskId);\n const rootId = focusId ?? round.id;\n const depth1 = roundTree.childrenOf.get(rootId) ?? [];\n\n const buildFold = (t: TaskItem): { count: number; dotColor: string } | null => {\n const descendants = collectDescendants(roundTree, t.id);\n if (descendants.length === 0) return null;\n return { count: descendants.length, dotColor: foldDotColor(descendants) };\n };\n\n const asDagTask = (t: TaskItem, seq: number, withFold: boolean): LearningDagTask => ({\n id: t.id,\n task: t,\n seq,\n fold: withFold ? buildFold(t) : null,\n depBadge: dependencyBadge(t, roundTree.byId),\n });\n\n const tasks: LearningDagTask[] = [];\n const sequenceEdges: LearningDagEdge[] = [];\n const orderedGroup = (members: TaskItem[]): TaskItem[] => {\n const ordered = dependencyOrder(members);\n sequenceEdges.push(...sequenceChainEdges(ordered, members));\n return ordered;\n };\n orderedGroup(depth1).forEach((child, i) => {\n // Depth-1 children always render (their children are visible below\n // them); only depth-2 nodes can carry the fold chip for depth-3+.\n tasks.push(asDagTask(child, i + 1, false));\n orderedGroup(roundTree.childrenOf.get(child.id) ?? []).forEach((grandChild, j) => {\n tasks.push(asDagTask(grandChild, j + 1, true));\n });\n });\n\n // The round root participates in the graph (and thus the dagre ranking) —\n // in focus mode the focused subtree replaces it.\n const graphTasks = focusId ? tasks.map((t) => t.task) : [round, ...tasks.map((t) => t.task)];\n const graph = buildTaskGraph(graphTasks);\n const edges: LearningDagEdge[] = graph.edges.map((e) => ({\n from: e.from,\n to: e.to,\n kind: e.kind === \"parent\" ? (\"structure\" as const) : (\"dependency\" as const),\n }));\n edges.push(...sequenceEdges);\n\n let root: LearningDagRoundRoot | null = null;\n if (!focusId) {\n root = {\n id: round.id,\n label: roundNumber !== null ? `R${roundNumber}` : \"R\",\n title: round.title,\n status: round.status,\n doneCount: tree.filter((t) => t.status === \"completed\").length,\n totalCount: tree.length,\n };\n // Orphan depth-1 tasks (stale parentId) hang off the round root.\n const linked = new Set(edges.filter((e) => e.from === round.id).map((e) => `${e.to}:${e.kind}`));\n for (const child of depth1) {\n if (!linked.has(`${child.id}:structure`)) {\n edges.push({ from: round.id, to: child.id, kind: \"structure\" });\n linked.add(`${child.id}:structure`);\n }\n }\n }\n\n const layoutNodes = graphTasks.map((t) => ({ id: t.id }));\n const raw = applyDagreLayout(\n layoutNodes,\n edges.map((e) => ({ from: e.from, to: e.to })),\n { nodeWidth: TASK_NODE_WIDTH, nodeHeight: TASK_NODE_HEIGHT, nodesep: NODESEP_TB, ranksep: RANKSEP_TB, rankdir: \"TB\" },\n );\n let minX = Infinity;\n let minY = Infinity;\n for (const p of raw.values()) {\n minX = Math.min(minX, p.x);\n minY = Math.min(minY, p.y);\n }\n const positions = new Map<string, { x: number; y: number }>();\n if (Number.isFinite(minX) && Number.isFinite(minY)) {\n for (const [id, p] of raw) positions.set(id, { x: p.x - minX, y: p.y - minY });\n }\n let width = 0;\n let height = 0;\n for (const p of positions.values()) {\n width = Math.max(width, p.x + TASK_NODE_WIDTH);\n height = Math.max(height, p.y + TASK_NODE_HEIGHT);\n }\n return { root, tasks, edges, positions, bbox: { width, height } };\n}\n\n/**\n * Natural bbox of the DISPLAYED subtree (start spacing, full render set) —\n * the LEARNING zone's content-driven size input for computeTrainingLayout.\n * Empty view → a zero bbox (the zone keeps its fixture size).\n */\nexport function measureLearningDagBBox(tree: TaskItem[], focusTaskId: string | null = null): { width: number; height: number } {\n if (tree.length === 0) return { width: 0, height: 0 };\n return buildLearningDagModel(tree, focusTaskId).bbox;\n}\n\nconst lockedFlags = {\n draggable: false,\n selectable: false,\n focusable: false,\n deletable: false,\n connectable: false,\n} as const;\n\nexport type LearningBreadcrumb = { id: string; label: string };\n\n/** One entry of the header round selector (all rounds, newest first). */\nexport type LearningRoundOption = {\n id: string;\n /** `R{n}` — newest round carries the highest n. */\n label: string;\n title: string;\n status: TaskItem[\"status\"];\n createdAt: TaskItem[\"createdAt\"];\n};\n\n/**\n * Everything the LEARNING header surface shows, derived once from the\n * learning tasks + pin/focus state: effective round (follow/pin rule), its\n * tree and stats, the selector options, and the focus breadcrumb. Shared by\n * the canvas zone hook and the fullscreen LearningTaskGraphView so the two\n * surfaces can never drift.\n */\nexport interface LearningRoundViewModel {\n /** Effective round's tree (round + subtree). */\n tree: TaskItem[];\n selectedRound: TaskItem | null;\n /** Round tree lookup by task id (structure-edge status styling). */\n roundTreeById: Map<string, TaskItem>;\n /** Validated focus id (null = round-root view). */\n focusId: string | null;\n /** Interrupted tasks parked for HITL approval (review banner). */\n reviewTasks: TaskItem[];\n doneCount: number;\n /** `R{n}` — newest round carries the highest n. */\n roundNumber: number | null;\n roundOptions: LearningRoundOption[];\n /** Relative last-activity time across the effective round's tree. */\n roundLatestActivity: string | null;\n /** Focus path R3 / 阶段一 / 2.提炼 — empty when no round is selected. */\n breadcrumb: LearningBreadcrumb[];\n}\n\nexport function buildLearningRoundViewModel(\n learningTasks: LearningTasksData,\n selectedRoundId: string | null,\n focusTaskId: string | null,\n): LearningRoundViewModel {\n const rounds = learningTasks.rounds;\n const tree = selectLearningTree(learningTasks, selectedRoundId);\n const selectedRound = tree[0] ?? null;\n const reviewTasks = tree.filter(isWaitingForApproval);\n const roundTree = buildRoundTree(tree);\n const doneCount = tree.filter((t) => t.status === \"completed\").length;\n const roundIndex = selectedRound ? rounds.findIndex((r) => r.id === selectedRound.id) : -1;\n const roundNumber = selectedRound ? rounds.length - roundIndex : null;\n const roundOptions: LearningRoundOption[] = rounds.map((round, index) => ({\n id: round.id,\n label: `R${rounds.length - index}`,\n title: round.title,\n status: round.status,\n createdAt: round.createdAt,\n }));\n // Latest activity across the effective round's tree (stats row + summary).\n const latest = tree.reduce<TaskItem | null>((acc, t) => {\n if (!acc) return t;\n return new Date(t.updatedAt).getTime() > new Date(acc.updatedAt).getTime() ? t : acc;\n }, null);\n const focusId = resolveLearningFocusId(tree, focusTaskId);\n\n // Focus path R3 / 阶段一 / 2.提炼 — the round crumb plus the chain to the focused node.\n const breadcrumb: LearningBreadcrumb[] = [];\n if (selectedRound) {\n breadcrumb.push({ id: selectedRound.id, label: `R${roundNumber}` });\n if (focusId) {\n const chain: TaskItem[] = [];\n let cur = roundTree.byId.get(focusId) ?? null;\n while (cur && cur.id !== selectedRound.id) {\n chain.unshift(cur);\n cur = cur.parentId ? roundTree.byId.get(cur.parentId) ?? null : null;\n }\n for (const t of chain) {\n const siblings = dependencyOrder(roundTree.childrenOf.get(t.parentId ?? \"\") ?? []);\n const seq = siblings.findIndex((s) => s.id === t.id) + 1;\n breadcrumb.push({ id: t.id, label: `${seq}.${t.title}` });\n }\n }\n }\n\n return {\n tree,\n selectedRound,\n roundTreeById: roundTree.byId,\n focusId,\n reviewTasks,\n doneCount,\n roundNumber,\n roundOptions,\n roundLatestActivity: relativeActivity(latest?.updatedAt),\n breadcrumb,\n };\n}\n\n/**\n * Selector + stats + breadcrumb + review banner — the LEARNING header surface\n * shared by the canvas zone header node and the fullscreen learning dock so\n * the two can never drift. `actions` is the selector row's right slot (the\n * zone header hosts the New Learning Task button there).\n */\nexport type LearningRoundBarProps = {\n hasRounds: boolean;\n reviewCount: number;\n onReviewClick: () => void;\n roundOptions: LearningRoundOption[];\n selectedRoundValue: string | null;\n onSelectRound: (roundId: string | null) => void;\n roundNumber: number | null;\n roundTitle: string | null;\n roundStatus: TaskItem[\"status\"] | null;\n roundDoneCount: number;\n roundTotalCount: number;\n roundWaitingCount: number;\n roundLatestActivity: string | null;\n breadcrumb: LearningBreadcrumb[];\n onFocusTask: (id: string | null) => void;\n actions?: React.ReactNode;\n};\n\nexport const LearningRoundBar: React.FC<LearningRoundBarProps> = ({\n hasRounds,\n reviewCount,\n onReviewClick,\n roundOptions,\n selectedRoundValue,\n onSelectRound,\n roundTitle,\n roundStatus,\n roundDoneCount,\n roundTotalCount,\n roundWaitingCount,\n roundLatestActivity,\n breadcrumb,\n onFocusTask,\n actions,\n}) => {\n const roundMeta = roundStatus ? TASK_STATUS_META[roundStatus] : null;\n return (\n <>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 8, marginBottom: 6 }}>\n <div className=\"nodrag nopan nowheel\" data-testid=\"learning-round-select\">\n <Select\n size=\"small\"\n style={{ width: 260 }}\n placeholder=\"Select round\"\n value={selectedRoundValue ?? undefined}\n allowClear\n disabled={roundOptions.length === 0}\n onChange={(value) => onSelectRound(value ?? null)}\n options={roundOptions.map((option) => {\n const meta = TASK_STATUS_META[option.status];\n const time = relativeActivity(option.createdAt);\n return {\n value: option.id,\n label: `${option.label} ${option.title} · ${meta.label}${time ? ` · ${time}` : \"\"}`,\n };\n })}\n />\n </div>\n {actions}\n </div>\n {!hasRounds && (\n <div data-testid=\"learning-empty\" style={{ fontSize: 12, color: \"#999\", paddingBottom: 4 }}>No learning tasks yet</div>\n )}\n {roundMeta && roundTitle && (\n <div data-testid=\"learning-round-stats\" style={{ display: \"flex\", alignItems: \"center\", gap: 6, flexWrap: \"wrap\", marginBottom: 6 }}>\n <span style={{ width: 8, height: 8, borderRadius: 9999, background: roundMeta.color, flexShrink: 0 }} />\n <span style={{ fontSize: 12, fontWeight: 600, color: \"#262626\" }}>{roundMeta.label}</span>\n <span style={{ fontSize: 11, color: \"#d1d5db\" }}>·</span>\n <span style={{ fontSize: 11, color: \"#8c8c8c\" }}>{roundDoneCount}/{roundTotalCount} tasks</span>\n {roundWaitingCount > 0 && (\n <span\n style={{\n fontSize: 11, fontWeight: 600, color: \"#b45309\",\n background: \"rgba(245,158,11,0.12)\", border: \"1px solid rgba(245,158,11,0.35)\",\n borderRadius: 9999, padding: \"1px 8px\",\n }}\n >\n ⏸ {roundWaitingCount} waiting\n </span>\n )}\n {roundLatestActivity && (\n <>\n <span style={{ fontSize: 11, color: \"#d1d5db\" }}>·</span>\n <span style={{ fontSize: 11, color: \"#9ca3af\" }}>{roundLatestActivity}</span>\n </>\n )}\n </div>\n )}\n {breadcrumb.length > 1 && (\n <div data-testid=\"learning-breadcrumb\" style={{ display: \"flex\", alignItems: \"center\", gap: 6, flexWrap: \"wrap\", marginBottom: 6, fontSize: 11, color: \"#6b7280\" }}>\n {breadcrumb.map((crumb, i) => (\n <React.Fragment key={crumb.id}>\n {i > 0 && <span style={{ color: \"#d1d5db\" }}>/</span>}\n <button\n type=\"button\"\n data-testid={`learning-crumb-${i}`}\n onClick={() => onFocusTask(i === 0 ? null : crumb.id)}\n style={{ border: \"none\", background: \"transparent\", padding: 0, cursor: \"pointer\", fontSize: 11, fontWeight: 600, color: i === breadcrumb.length - 1 ? \"#4b5563\" : \"#6366f1\" }}\n >\n {crumb.label}\n </button>\n </React.Fragment>\n ))}\n <button\n type=\"button\"\n data-testid=\"learning-crumb-back\"\n onClick={() => onFocusTask(breadcrumb[breadcrumb.length - 2]?.id ?? null)}\n style={{ border: \"none\", background: \"rgba(99,102,241,0.08)\", borderRadius: 9999, padding: \"1px 8px\", cursor: \"pointer\", fontSize: 11, fontWeight: 600, color: \"#6366f1\" }}\n >\n ‹ Back\n </button>\n </div>\n )}\n {reviewCount > 0 && (\n <button\n type=\"button\"\n data-testid=\"learning-review-banner\"\n aria-label={`Open ${reviewCount} task${reviewCount > 1 ? \"s\" : \"\"} waiting for approval`}\n onClick={onReviewClick}\n style={{\n display: \"flex\", alignItems: \"center\", justifyContent: \"flex-start\", gap: 6, cursor: \"pointer\", width: \"100%\",\n fontSize: 12, fontWeight: 600, color: \"#b45309\",\n background: \"rgba(245,158,11,0.12)\", border: \"1px solid rgba(245,158,11,0.35)\",\n borderRadius: 8, padding: \"5px 8px\", marginBottom: 6,\n }}\n >\n {reviewCount} item{reviewCount > 1 ? \"s\" : \"\"} waiting for approval\n </button>\n )}\n </>\n );\n};\n\nexport type LearningHeaderNodeData = LearningRoundBarProps & {\n width: number;\n /** Raw parent pin state (null = follow mode) — clearing the selector returns to it. */\n selectedRoundId: string | null;\n onLearningStarted?: (goal: string, roundTaskId: string, files?: TaskFileRef[]) => void;\n agentId: string;\n projectId?: string | null;\n};\n\nexport type LearningTaskNodeData = {\n task: TaskItem;\n seq: number;\n depBadge: { kind: \"done\" | \"waiting\"; count: number } | null;\n fold: { count: number; dotColor: string } | null;\n onTaskClick: () => void;\n onFocusTask?: (id: string) => void;\n};\n\nexport type LearningRoundRootNodeData = {\n label: string;\n title: string;\n status: TaskItem[\"status\"];\n doneCount: number;\n totalCount: number;\n onTaskClick: () => void;\n};\n\n/** Zone header: round selector + stats, breadcrumb, New Learning Task entry, review banner. */\nconst LearningHeaderNodeInner: React.FC<NodeProps<Node<LearningHeaderNodeData>>> = ({ data }) => {\n const [modalOpen, setModalOpen] = useState(false);\n return (\n <div style={{ ...CARD_STYLE, width: data.width }}>\n <LearningRoundBar\n hasRounds={data.hasRounds}\n reviewCount={data.reviewCount}\n onReviewClick={data.onReviewClick}\n roundOptions={data.roundOptions}\n selectedRoundValue={data.selectedRoundValue}\n onSelectRound={data.onSelectRound}\n roundNumber={data.roundNumber}\n roundTitle={data.roundTitle}\n roundStatus={data.roundStatus}\n roundDoneCount={data.roundDoneCount}\n roundTotalCount={data.roundTotalCount}\n roundWaitingCount={data.roundWaitingCount}\n roundLatestActivity={data.roundLatestActivity}\n breadcrumb={data.breadcrumb}\n onFocusTask={data.onFocusTask}\n actions={\n <Button size=\"small\" type=\"text\" icon={<PlusOutlined />} data-testid=\"learning-new-task\" onClick={() => setModalOpen(true)} style={{ fontSize: 12 }}>\n New Learning Task\n </Button>\n }\n />\n <StartLearningModal\n open={modalOpen}\n agentId={data.agentId}\n defaultProjectId={data.projectId ?? undefined}\n onClose={() => setModalOpen(false)}\n onCreated={(roundTaskId, _threadId, goal, files) => {\n data.onLearningStarted?.(goal, roundTaskId, files);\n setModalOpen(false);\n }}\n />\n </div>\n );\n};\nexport const LearningHeaderNode = React.memo(LearningHeaderNodeInner);\n\n/** Task node (title-first card): status dot + seq + 2-line clamped title, dependency badge + fold expander. */\nconst LearningDagTaskNodeInner: React.FC<NodeProps<Node<LearningTaskNodeData>>> = ({ data }) => {\n const meta = TASK_STATUS_META[data.task.status];\n const [hovered, setHovered] = useState(false);\n return (\n <div\n data-testid=\"learning-dag-task\"\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n width: TASK_NODE_WIDTH, minHeight: 46, padding: \"8px 10px\", borderRadius: 10,\n cursor: \"pointer\",\n border: `1.5px solid ${hovered ? \"rgba(99,102,241,0.5)\" : meta.color}`,\n background: hovered ? \"rgba(99,102,241,0.08)\" : \"#fff\",\n transition: \"background 0.15s ease, border-color 0.15s ease\",\n animation: meta.active ? \"workflow-node-pulse 1.6s ease-in-out infinite\" : undefined,\n }}\n >\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n {/* Parent (structure) edges anchor here; dependency edges keep the top anchor. */}\n <Handle id=\"left\" type=\"target\" position={Position.Left} style={{ opacity: 0 }} />\n <div style={{ display: \"flex\", alignItems: \"flex-start\", gap: 6 }}>\n <span style={{ width: 8, height: 8, borderRadius: 9999, background: meta.color, flexShrink: 0, marginTop: 4 }} />\n <span style={{ fontSize: 12, fontWeight: 600, color: \"#262626\", flexShrink: 0 }}>{data.seq}.</span>\n <span\n data-testid=\"learning-task-title\"\n title={data.task.title}\n style={{\n fontSize: 12, fontWeight: 600, color: \"#262626\", lineHeight: \"17px\",\n display: \"-webkit-box\", WebkitLineClamp: 2, WebkitBoxOrient: \"vertical\", overflow: \"hidden\",\n wordBreak: \"break-word\",\n }}\n >\n {data.task.title}\n </span>\n </div>\n {(data.depBadge || data.fold) && (\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 6, marginTop: 5 }}>\n {data.depBadge ? (\n <span\n data-testid=\"learning-dep-badge\"\n style={{\n fontSize: 10, fontWeight: 600, flexShrink: 0,\n color: data.depBadge.kind === \"done\" ? \"#22c55e\" : \"#f59e0b\",\n background: data.depBadge.kind === \"done\" ? \"rgba(34,197,94,0.1)\" : \"rgba(245,158,11,0.12)\",\n borderRadius: 9999, padding: \"1px 6px\",\n }}\n >\n {data.depBadge.kind === \"done\" ? `⬦ ${data.depBadge.count} deps ✓` : `⬦ waits ${data.depBadge.count}`}\n </span>\n ) : <span />}\n {data.fold && (\n <button\n type=\"button\"\n data-testid=\"learning-fold\"\n className=\"nodrag\"\n aria-label={`Expand ${data.fold.count} nested tasks in ${data.task.title}`}\n onClick={(e) => {\n e.stopPropagation();\n data.onFocusTask?.(data.task.id);\n }}\n style={{\n display: \"inline-flex\", alignItems: \"center\", gap: 4, cursor: \"pointer\", flexShrink: 0,\n fontSize: 10, fontWeight: 600, color: \"#6b7280\",\n border: \"1px solid #e5e7eb\", background: \"#fafafa\", borderRadius: 9999, padding: \"1px 6px\",\n }}\n >\n <span style={{ width: 6, height: 6, borderRadius: 9999, background: data.fold.dotColor, flexShrink: 0 }} />\n ▸ {data.fold.count}\n </button>\n )}\n </div>\n )}\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n {meta.active && <style>{`@keyframes workflow-node-pulse { 0%,100% { box-shadow: 0 0 0 0 rgba(59,130,246,0.35); } 50% { box-shadow: 0 0 0 6px rgba(59,130,246,0.08); } }`}</style>}\n </div>\n );\n};\nexport const LearningDagTaskNode = React.memo(LearningDagTaskNodeInner);\n\n/** DAG root: the whole round's title-first completeness card (status dot + clamped title + done/total); click opens the round TaskItem detail. */\nconst LearningRoundRootNodeInner: React.FC<NodeProps<Node<LearningRoundRootNodeData>>> = ({ data }) => {\n const meta = TASK_STATUS_META[data.status];\n const [hovered, setHovered] = useState(false);\n return (\n <div\n data-testid=\"learning-round-root\"\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n width: TASK_NODE_WIDTH, minHeight: 46, padding: \"8px 10px\", borderRadius: 10, cursor: \"pointer\",\n border: `1.5px solid ${hovered ? \"rgba(99,102,241,0.5)\" : meta.color}`,\n background: hovered ? \"rgba(99,102,241,0.14)\" : \"rgba(99,102,241,0.04)\",\n transition: \"background 0.15s ease, border-color 0.15s ease\",\n }}\n >\n <Handle type=\"target\" position={Position.Top} style={{ opacity: 0 }} />\n <div style={{ display: \"flex\", alignItems: \"flex-start\", gap: 6 }}>\n <span style={{ width: 8, height: 8, borderRadius: 9999, background: meta.color, flexShrink: 0, marginTop: 4 }} />\n <span\n data-testid=\"learning-round-root-title\"\n title={data.title}\n style={{\n fontSize: 12, fontWeight: 700, color: \"#262626\", lineHeight: \"17px\",\n display: \"-webkit-box\", WebkitLineClamp: 2, WebkitBoxOrient: \"vertical\", overflow: \"hidden\",\n wordBreak: \"break-word\",\n }}\n >\n {data.label} · {data.title}\n </span>\n </div>\n <div style={{ fontSize: 11, color: \"#8c8c8c\", marginTop: 4 }}>{data.doneCount}/{data.totalCount} tasks done</div>\n <Handle type=\"source\" position={Position.Bottom} style={{ opacity: 0 }} />\n </div>\n );\n};\nexport const LearningRoundRootNode = React.memo(LearningRoundRootNodeInner);\n\nexport interface UseLearningZoneNodesOptions {\n learningTasks: LearningTasksData;\n selectedRoundId: string | null;\n /** LIVE LEARNING floor rect (unified height) — all zone anchors derive from it. */\n zone: ZoneRect;\n onSelectRound: (roundId: string | null) => void;\n onTaskClick: (task: TaskItem, related: TaskItem[]) => void;\n /** Focus mode: re-scope the DAG onto a task's subtree (null = round root). */\n onFocusTask: (id: string | null) => void;\n focusTaskId: string | null;\n onLearningStarted?: (goal: string, roundTaskId: string, files?: TaskFileRef[]) => void;\n agentId: string;\n projectId?: string | null;\n}\n\nexport interface LearningDagEdgeViewOptions {\n /** Maps a task id to its flow node id (each surface owns its id scheme). */\n nodeId: (taskId: string) => string;\n /** Round-tree task lookup — keys the downstream-status styling of structure edges. */\n byId: Map<string, TaskItem>;\n /** Edge-id prefix (the canvas zone namespaces with \"learning:\"; isolated views use none). */\n prefix?: string;\n}\n\n/**\n * Flow edges for a `buildLearningDagModel` render — shared by the canvas zone\n * hook and the fullscreen LearningTaskGraphView so edge styling can never\n * drift: parent (structure) edges styled by the downstream status and anchored\n * into the child's hidden LEFT handle, declared dependencies as faint dashed\n * bezier with a directional arrowhead, and the sibling sequence chain as the\n * same dashed style without the arrow.\n */\nexport function learningDagEdges(model: LearningDagModel, options: LearningDagEdgeViewOptions): Edge[] {\n const { nodeId, byId, prefix = \"\" } = options;\n return model.edges.map((edge) => {\n if (edge.kind === \"dependency\" || edge.kind === \"sequence\") {\n return {\n id: `${prefix}${edge.from}->${edge.to}:${edge.kind}`,\n source: nodeId(edge.from),\n target: nodeId(edge.to),\n type: \"bezier\",\n animated: false,\n style: DEPENDENCY_EDGE_STYLE,\n // Only declared dependencies read as directional; the sibling\n // sequence chain stays a plain ordering guide.\n ...(edge.kind === \"dependency\" ? { markerEnd: DEPENDENCY_EDGE_MARKER } : {}),\n };\n }\n const flow = classifyDownstreamEdge(byId.get(edge.to)?.status ?? \"pending\");\n return {\n id: `${prefix}${edge.from}->${edge.to}:structure`,\n source: nodeId(edge.from),\n target: nodeId(edge.to),\n // Hierarchy anchors into the child's hidden LEFT handle; the source\n // stays the parent's default bottom handle.\n targetHandle: \"left\",\n animated: flow === \"flowing\",\n style: EDGE_STYLE[flow],\n };\n });\n}\n\nexport interface LearningZoneRenderResult {\n nodes: Node[];\n edges: Edge[];\n /** Bbox of the displayed task nodes (mirrors measureLearningDagBBox). */\n bbox: { width: number; height: number };\n breadcrumb: LearningBreadcrumb[];\n}\n\n/**\n * Builds the ③ LEARNING zone content as real canvas nodes/edges — the header\n * plus the full task DAG of the effective selected round at every zoom (no\n * LOD tiers). The DAG matches the Tasks management graph's visual language: a\n * round root card tops the graph, task nodes are title-first cards (status\n * dot + seq + clamped title, dependency badge + fold chip), the header hosts\n * the round selector + stats, layout is top-down dagre, hierarchy renders as\n * parent (structure) edges styled by the downstream status, and declared\n * dependencies render as dashed secondary edges. A round with no child tasks\n * still renders its round-root card alone (it represents the round task\n * itself). Both the round root and task nodes open the task-detail modal on\n * click (routed via ReactFlow onNodeClick → node data onTaskClick).\n */\nexport function useLearningZoneNodes(options: UseLearningZoneNodesOptions): LearningZoneRenderResult {\n const {\n learningTasks, selectedRoundId, onSelectRound, onTaskClick,\n onFocusTask, focusTaskId, onLearningStarted, agentId, projectId, zone,\n } = options;\n\n return useMemo(() => {\n if (!agentId) return { nodes: [], edges: [], bbox: { ...ZERO_BBOX }, breadcrumb: [] };\n const layout = learningLayout(zone);\n const view = buildLearningRoundViewModel(learningTasks, selectedRoundId, focusTaskId);\n const { tree, selectedRound, roundTreeById, focusId, reviewTasks, doneCount, roundNumber, roundOptions, roundLatestActivity, breadcrumb } = view;\n\n const header: Node = {\n id: \"learning:header\",\n type: \"learningHeader\",\n position: layout.headerOffset,\n data: {\n width: layout.headerWidth,\n hasRounds: learningTasks.rounds.length > 0,\n reviewCount: reviewTasks.length,\n onReviewClick: () => {\n if (reviewTasks[0]) onTaskClick(reviewTasks[0], tree);\n },\n onLearningStarted,\n agentId,\n projectId,\n roundOptions,\n // Raw parent state (null = follow) — clearing the selector returns to\n // it; the selector displays the effective (followed) round meanwhile.\n selectedRoundId,\n selectedRoundValue: selectedRound?.id ?? null,\n onSelectRound,\n roundNumber,\n roundTitle: selectedRound?.title ?? null,\n roundStatus: selectedRound?.status ?? null,\n roundDoneCount: doneCount,\n roundTotalCount: tree.length,\n roundWaitingCount: reviewTasks.length,\n roundLatestActivity,\n breadcrumb,\n onFocusTask,\n },\n ...lockedFlags,\n };\n\n const nodes: Node[] = [header];\n if (!selectedRound) return { nodes, edges: [], bbox: { ...ZERO_BBOX }, breadcrumb };\n\n const model = buildLearningDagModel(tree, focusId, roundNumber);\n // Center the DAG in the zone's content column when it is narrower than the\n // zone; when wider (never, given the zone sizes to the bbox + margins) the\n // left margin applies. dagre coordinates are normalized to x=0, so only\n // the anchor needs the centering offset.\n const contentWidth = zone.width - ZONE_MARGIN * 2;\n const dagAnchorX = layout.dagOffset.x + Math.max(0, (contentWidth - model.bbox.width) / 2);\n if (model.root) {\n const base = model.positions.get(model.root.id) ?? { x: 0, y: 0 };\n nodes.push({\n id: \"learning:round-root\",\n type: \"learningRoundRoot\",\n position: { x: dagAnchorX + base.x, y: layout.dagOffset.y + base.y },\n data: {\n label: model.root.label,\n title: model.root.title,\n status: model.root.status,\n doneCount: model.root.doneCount,\n totalCount: model.root.totalCount,\n onTaskClick: () => onTaskClick(selectedRound, tree),\n },\n ...lockedFlags,\n });\n }\n for (const t of model.tasks) {\n const base = model.positions.get(t.id) ?? { x: 0, y: 0 };\n nodes.push({\n id: `learning:task:${t.id}`,\n type: \"learningTask\",\n position: { x: dagAnchorX + base.x, y: layout.dagOffset.y + base.y },\n data: {\n task: t.task,\n seq: t.seq,\n depBadge: t.depBadge,\n fold: t.fold,\n onTaskClick: () => onTaskClick(t.task, tree),\n onFocusTask: t.fold ? () => onFocusTask(t.id) : undefined,\n },\n ...lockedFlags,\n });\n }\n const nodeId = (taskId: string): string => (taskId === selectedRound.id ? \"learning:round-root\" : `learning:task:${taskId}`);\n const edges: Edge[] = learningDagEdges(model, { byId: roundTreeById, nodeId, prefix: \"learning:\" });\n return { nodes, edges, bbox: model.bbox, breadcrumb };\n }, [learningTasks, selectedRoundId, onSelectRound, onTaskClick, onFocusTask, focusTaskId, onLearningStarted, agentId, projectId, zone]);\n}\n","import React, { useEffect, useRef, useState } from \"react\";\n\n/** Canvas action kinds the tour can auto-advance on (rising-edge pulses from AgentConfigGraph). */\nexport type TourEventKind = \"zoneActivated\" | \"zoneDragged\" | \"copilotPinned\";\n\n/** Rising-edge pulse flags fired by the canvas; the parent resets each after consumption. */\nexport interface TourEvents {\n zoneActivated: boolean;\n zoneDragged: boolean;\n copilotPinned: boolean;\n}\n\nexport interface OnboardingTourProps {\n open: boolean;\n /** Current step index (0..3). */\n step: number;\n /** Next writes through (step + 1). */\n onStep: (step: number) => void;\n /** Marks the tutorial done (skip or finish last step) — the parent closes the tour. */\n onDone: () => void;\n /** Canvas pulse flags; a false→true edge on the current step's kind auto-advances. */\n events: TourEvents;\n /** Called once per consumed pulse so the parent can reset the flag. */\n onEventConsumed: (kind: TourEventKind) => void;\n}\n\ninterface TourStepDef {\n title: string;\n description: string;\n /** CSS selector for the highlight ring (null = no target). */\n targetSelector: string | null;\n /** Canvas event that auto-advances this step (null = manual Next only). */\n eventKind: TourEventKind | null;\n}\n\nconst TOUR_STEPS: readonly TourStepDef[] = [\n {\n title: \"Welcome to the training canvas\",\n description: \"Four zones you can arrange freely. Press Next to learn the basics in 3 quick steps.\",\n targetSelector: null,\n eventKind: null,\n },\n {\n title: \"Switch zones\",\n description: \"Press ⌘/Ctrl + 2 or 4 — or click a dot in the pill below — to jump between zones.\",\n targetSelector: '[data-testid=\"zone-quick-nav\"]',\n eventKind: \"zoneActivated\",\n },\n {\n title: \"Move a zone\",\n description: \"Grab a zone label above any block and drag it anywhere. Positions reset next session.\",\n targetSelector: '[data-testid^=\"canvas-zone-chip-\"]',\n eventKind: \"zoneDragged\",\n },\n {\n title: \"Pin the copilot\",\n description: \"Click 📌 on the COPILOT label to dock it into the right split. Click again to unpin.\",\n targetSelector: '[data-testid=\"canvas-zone-pin-copilot\"]',\n eventKind: \"copilotPinned\",\n },\n];\n\n/** Ring inflation around the target's bounding rect (px). */\nconst RING_INFLATE = 6;\n\n/** Fixed-position highlight ring box (viewport coordinates). */\ninterface TourRingRect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/**\n * OnboardingTour — a 4-step interactive tour over the training canvas.\n *\n * Step card floats top-center (pointerEvents auto so its buttons work); the\n * highlight ring + dim overlay are pointerEvents none, so the highlighted\n * target stays clickable underneath. Auto-advance consumes one rising edge of\n * the current step's canvas event: the tour watches the `events` pulses with a\n * previous-values ref, so a flag that was already true when the step began is\n * stale — it is cleared (via onEventConsumed) instead of advancing.\n */\nexport const OnboardingTour: React.FC<OnboardingTourProps> = ({ open, step, onStep, onDone, events, onEventConsumed }) => {\n const stepDef = TOUR_STEPS[step] ?? null;\n\n /** Highlight ring tracking: viewport rect of the current step's target. */\n const [ringRect, setRingRect] = useState<TourRingRect | null>(null);\n const targetSelector = open && stepDef ? stepDef.targetSelector : null;\n\n /**\n * Track the target with a rAF loop (targets move under pan/zoom/fitView\n * animations and node drags) plus a resize listener; re-measure once\n * synchronously on step entry so the ring is present immediately. Stops\n * when the step loses its target, open flips false, or on unmount.\n */\n useEffect(() => {\n if (!targetSelector) {\n setRingRect(null);\n return;\n }\n let frame = 0;\n let lastKey: string | null = null;\n const measure = (): void => {\n const el = document.querySelector(targetSelector);\n if (!el) {\n if (lastKey !== null) {\n lastKey = null;\n setRingRect(null);\n }\n return;\n }\n const box = el.getBoundingClientRect();\n const next: TourRingRect = {\n left: box.left - RING_INFLATE,\n top: box.top - RING_INFLATE,\n width: box.width + RING_INFLATE * 2,\n height: box.height + RING_INFLATE * 2,\n };\n const key = `${next.left}|${next.top}|${next.width}|${next.height}`;\n if (key !== lastKey) {\n lastKey = key;\n setRingRect(next);\n }\n };\n measure();\n const tick = (): void => {\n measure();\n frame = window.requestAnimationFrame(tick);\n };\n frame = window.requestAnimationFrame(tick);\n window.addEventListener(\"resize\", measure);\n return () => {\n window.cancelAnimationFrame(frame);\n window.removeEventListener(\"resize\", measure);\n };\n }, [targetSelector]);\n\n /**\n * Auto-advance on the current step's rising edge. Runs every render with a\n * previous-values ref: only a false→true edge counts, so a pulse fired\n * before this step began never advances it.\n */\n const prevEventsRef = useRef(events);\n useEffect(() => {\n const previous = prevEventsRef.current;\n prevEventsRef.current = events;\n if (!open || !stepDef) return;\n const kind = stepDef.eventKind;\n if (!kind || !events[kind] || previous[kind]) return;\n onEventConsumed(kind);\n if (step >= TOUR_STEPS.length - 1) onDone();\n else onStep(step + 1);\n });\n\n /**\n * Step entry: a pulse already true for the new step predates it — stale.\n * Consume it so a later real action still produces a fresh rising edge.\n * Re-arms only on step/open transitions; `events` is intentionally read\n * from the commit where the step changed.\n */\n useEffect(() => {\n if (!open || !stepDef) return;\n const kind = stepDef.eventKind;\n if (kind && events[kind]) onEventConsumed(kind);\n }, [open, step]);\n\n if (!open || !stepDef) return null;\n const isLastStep = step >= TOUR_STEPS.length - 1;\n\n return (\n <>\n <style>{`\n.axiom-onboarding-next:hover { background: #4f46e5 !important; }\n.axiom-onboarding-skip:hover { color: #e5e7eb !important; }\n`}</style>\n {ringRect && (\n <div\n data-testid=\"onboarding-tour-ring\"\n style={{\n position: \"fixed\",\n left: ringRect.left,\n top: ringRect.top,\n width: ringRect.width,\n height: ringRect.height,\n border: \"2px solid #6366f1\",\n borderRadius: 10,\n pointerEvents: \"none\",\n boxShadow: \"0 0 0 9999px rgba(0,0,0,0.35)\",\n zIndex: 59,\n }}\n />\n )}\n <div\n data-testid=\"onboarding-tour-card\"\n style={{\n position: \"fixed\",\n top: 16,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n zIndex: 60,\n width: 360,\n padding: \"12px 16px\",\n background: \"rgba(17,24,39,0.92)\",\n color: \"#fff\",\n borderRadius: 12,\n boxShadow: \"0 8px 24px rgba(0,0,0,0.25)\",\n pointerEvents: \"auto\",\n }}\n >\n <div data-testid=\"onboarding-tour-dots\" style={{ display: \"flex\", gap: 6, marginBottom: 8 }}>\n {TOUR_STEPS.map((_, index) => (\n <span\n key={index}\n style={{\n width: 6,\n height: 6,\n borderRadius: \"9999px\",\n background: index === step ? \"#6366f1\" : \"rgba(255,255,255,0.28)\",\n }}\n />\n ))}\n </div>\n <div style={{ fontSize: 14, fontWeight: 600, marginBottom: 4 }}>{stepDef.title}</div>\n <div style={{ fontSize: 12, lineHeight: 1.5, color: \"rgba(255,255,255,0.82)\" }}>{stepDef.description}</div>\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", alignItems: \"center\", gap: 8, marginTop: 10 }}>\n <button\n type=\"button\"\n data-testid=\"onboarding-tour-skip\"\n className=\"axiom-onboarding-skip\"\n onClick={onDone}\n style={{\n cursor: \"pointer\",\n border: \"none\",\n background: \"transparent\",\n padding: \"4px 8px\",\n fontSize: 12,\n color: \"rgba(255,255,255,0.6)\",\n }}\n >Skip tour</button>\n <button\n type=\"button\"\n data-testid=\"onboarding-tour-next\"\n className=\"axiom-onboarding-next\"\n onClick={() => (isLastStep ? onDone() : onStep(step + 1))}\n style={{\n cursor: \"pointer\",\n border: \"none\",\n borderRadius: 6,\n background: \"#6366f1\",\n padding: \"5px 14px\",\n fontSize: 12,\n fontWeight: 600,\n color: \"#fff\",\n }}\n >{isLastStep ? \"Done\" : \"Next\"}</button>\n </div>\n </div>\n </>\n );\n};\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useNodesState, useEdgesState, type Edge, type Node, type NodeTypes } from \"@xyflow/react\";\nimport { WorkflowGraphBase } from \"@components/Chat/WorkflowGraphBase\";\nimport type { TaskItem } from \"@axiom-lattice/protocols\";\nimport {\n buildLearningDagModel,\n buildLearningRoundViewModel,\n learningDagEdges,\n LearningDagTaskNode,\n LearningRoundBar,\n LearningRoundRootNode,\n} from \"./LearningZone\";\nimport type { LearningTasksData } from \"../useEntityRefresher\";\n\nexport interface LearningTaskGraphViewProps {\n learningTasks: LearningTasksData;\n /** Raw parent pin state (null = follow the newest active round) — the parent owns it. */\n selectedRoundId: string | null;\n onSelectRound: (id: string | null) => void;\n agentId: string;\n projectId?: string | null;\n /** Task/round node click — opens the task detail (task + its round tree). */\n onTaskClick: (task: TaskItem, related: TaskItem[]) => void;\n height?: number | string;\n}\n\nconst nodeTypes: NodeTypes = {\n learningTask: LearningDagTaskNode as unknown as NodeTypes[string],\n learningRoundRoot: LearningRoundRootNode as unknown as NodeTypes[string],\n};\n\n/**\n * Fullscreen ③ LEARNING view: the SAME TB task DAG the canvas zone renders —\n * the shared `buildLearningRoundViewModel` + `buildLearningDagModel` +\n * `learningDagEdges` model stack, the same round-root/task node components,\n * and the shared round selector + stats bar (`LearningRoundBar`) — in its own\n * provider-isolated flow (WorkflowGraphBase) at dock size. Focus mode\n * (fold ▸N / breadcrumb) is view-local state; the round pin stays with the\n * parent so the canvas zone follows along.\n */\nexport const LearningTaskGraphView: React.FC<LearningTaskGraphViewProps> = ({\n learningTasks,\n selectedRoundId,\n onSelectRound,\n onTaskClick,\n height = \"100%\",\n}) => {\n // Focus is scoped to one round: switching rounds — or losing the focused\n // task to a refresh (`resolveLearningFocusId` validation) — returns to the\n // round root, exactly like the canvas zone.\n const [focusTaskId, setFocusTaskId] = useState<string | null>(null);\n useEffect(() => {\n setFocusTaskId(null);\n }, [selectedRoundId]);\n\n const view = useMemo(\n () => buildLearningRoundViewModel(learningTasks, selectedRoundId, focusTaskId),\n [learningTasks, selectedRoundId, focusTaskId],\n );\n\n const { dagNodes, dagEdges } = useMemo(() => {\n const model = buildLearningDagModel(view.tree, view.focusId, view.roundNumber);\n const tree = view.tree;\n const nodes: Node[] = [];\n if (model.root && view.selectedRound) {\n nodes.push({\n id: model.root.id,\n type: \"learningRoundRoot\",\n position: model.positions.get(model.root.id) ?? { x: 0, y: 0 },\n data: {\n label: model.root.label,\n title: model.root.title,\n status: model.root.status,\n doneCount: model.root.doneCount,\n totalCount: model.root.totalCount,\n onTaskClick: () => onTaskClick(view.selectedRound as TaskItem, tree),\n },\n });\n }\n for (const t of model.tasks) {\n nodes.push({\n id: t.id,\n type: \"learningTask\",\n position: model.positions.get(t.id) ?? { x: 0, y: 0 },\n data: {\n task: t.task,\n seq: t.seq,\n depBadge: t.depBadge,\n fold: t.fold,\n onTaskClick: () => onTaskClick(t.task, tree),\n onFocusTask: t.fold ? () => setFocusTaskId(t.id) : undefined,\n },\n });\n }\n const edges = learningDagEdges(model, { byId: view.roundTreeById, nodeId: (taskId) => taskId });\n return { dagNodes: nodes, dagEdges: edges };\n }, [view, onTaskClick]);\n\n const [flowNodes, setFlowNodes, onNodesChange] = useNodesState<Node>(dagNodes);\n const [flowEdges, setFlowEdges, onEdgesChange] = useEdgesState<Edge>(dagEdges);\n useEffect(() => {\n setFlowNodes(dagNodes);\n setFlowEdges(dagEdges);\n }, [dagNodes, dagEdges, setFlowNodes, setFlowEdges]);\n\n // Same routing contract as the canvas: node data carries the click handler.\n const handleNodeClick = useCallback((_event: React.MouseEvent, node: Node) => {\n const data = node.data as { onTaskClick?: () => void };\n data.onTaskClick?.();\n }, []);\n\n return (\n <div style={{ width: \"100%\", height, display: \"flex\", flexDirection: \"column\", minHeight: 0 }}>\n {/* Selector + stats above the flow; gesture-isolated so dock scrolling\n and interactions never fight the graph's pan/zoom. */}\n <div className=\"nodrag nowheel nopan\" style={{ flexShrink: 0, padding: \"12px 16px 4px\" }}>\n <LearningRoundBar\n hasRounds={learningTasks.rounds.length > 0}\n reviewCount={view.reviewTasks.length}\n onReviewClick={() => {\n if (view.reviewTasks[0]) onTaskClick(view.reviewTasks[0], view.tree);\n }}\n roundOptions={view.roundOptions}\n selectedRoundValue={view.selectedRound?.id ?? null}\n onSelectRound={onSelectRound}\n roundNumber={view.roundNumber}\n roundTitle={view.selectedRound?.title ?? null}\n roundStatus={view.selectedRound?.status ?? null}\n roundDoneCount={view.doneCount}\n roundTotalCount={view.tree.length}\n roundWaitingCount={view.reviewTasks.length}\n roundLatestActivity={view.roundLatestActivity}\n breadcrumb={view.breadcrumb}\n onFocusTask={setFocusTaskId}\n />\n </div>\n <div style={{ flex: 1, minHeight: 0, position: \"relative\" }}>\n <WorkflowGraphBase\n nodes={flowNodes}\n edges={flowEdges}\n nodeTypes={nodeTypes}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onNodeClick={handleNodeClick}\n fitView\n fitViewOptions={{ padding: 0.15, maxZoom: 1.2 }}\n nodesDraggable={false}\n nodesConnectable={false}\n miniMap={false}\n />\n </div>\n </div>\n );\n};\n","import React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport { Tag, Button, Typography, Modal, Tooltip, message } from \"antd\";\nimport { ArrowLeftOutlined, DeleteOutlined, InfoCircleOutlined } from \"@ant-design/icons\";\nimport { Bot, Workflow as WorkflowIcon, Play, FlaskConical, Settings2, PanelsTopLeft } from \"lucide-react\";\nimport type { Assistant } from \"@axiom-lattice/client-sdk\";\nimport type { TaskFileRef } from \"@axiom-lattice/protocols\";\nimport { AgentConfigPanel } from \"../Chat/AgentConfigPanel\";\nimport { ProjectScopedChating } from \"../Chat/ProjectScopedChating\";\nimport type { InitialMessageRequest } from \"../Chat/InitialMessageSubmitter\";\nimport { AgentEvalPanel, type AgentEvalPanelInitial } from \"./AgentEvalPanel\";\nimport { AgentWebAppsPanel } from \"./AgentWebAppsPanel\";\nimport { AgentConfigGraph } from \"./AgentConfigGraph\";\nimport { WorkflowAgentCanvas } from \"./WorkflowAgentCanvas\";\nimport { CanvasDock } from \"./CanvasDock\";\nimport { NodeDockContent, nodeDockWidth, nodeDockTitle } from \"./NodeDock\";\nimport { ALL_SKILLS_NODE_ID, type ConfigGraphNode } from \"./configGraph\";\nimport { getTypeBadgeInfo, extractVersion, extractStatus, extractTags, statusColor, colorHex } from \"./agentMeta\";\nimport { buildLearningKickoff, getLearningTargetMode } from \"./Learning/trainingUtils\";\nimport { getTrainingProjectId } from \"./trainingProjectScope\";\nimport { MDResponse } from \"../GenUI/MDResponse\";\nimport { useWorkspaceContext } from \"../../context/WorkspaceContext\";\nimport { useEntityRefresher } from \"./useEntityRefresher\";\nimport type { DetailTab } from \"./types\";\n\nconst { Text } = Typography;\n\nexport interface AgentDetailViewProps {\n assistant: Assistant;\n allAssistants: Assistant[];\n onBack: () => void;\n onDeleted: (id: string) => Promise<void> | void;\n /** Initial deep view opened over the canvas (graph = none). */\n initialTab?: DetailTab;\n onSave?: (assistant: Assistant, config: Record<string, unknown>) => Promise<void>;\n /** Called with the freshly fetched assistant after a config-changing copilot tool. */\n onAssistantUpdated?: (assistant: Assistant) => void;\n /** Called when the agent list itself changed (create/delete) or the viewed agent is gone. */\n onAgentListInvalidated?: () => void;\n /** Auto-sent architect message (learning kickoff after creation). */\n initialMessage?: string | null;\n /** Pre-selected canvas project (learn-to-build hands off the modal's choice). */\n initialProjectId?: string | null;\n}\n\ntype DockView =\n | { kind: \"node\"; node: ConfigGraphNode }\n | { kind: \"configuration\" }\n | { kind: \"playground\" }\n | {\n kind: \"eval\";\n initial?: AgentEvalPanelInitial;\n navigationKey: number;\n restoreFocusRef?: React.RefObject<HTMLElement>;\n }\n | { kind: \"web-apps\" };\n\ntype PendingTransition =\n | { kind: \"close\" }\n | { kind: \"back\" }\n | { kind: \"architect\" }\n | { kind: \"dock\"; view: DockView };\n\nconst activeActionStyle: React.CSSProperties = { color: \"#4f46e5\", background: \"#eef2ff\" };\n\nconst RESPONSIVE_HEADER_CSS = `\n@media (max-width: 767px) {\n .agent-detail__identity-pill { max-width: calc(100% - 24px) !important; right: 12px; }\n .agent-detail__actions-pill { top: 52px !important; left: 12px; right: auto !important; }\n}\n`;\n\nconst initialDockView = (initialTab: DetailTab): DockView | null => {\n if (initialTab === \"configuration\") return { kind: \"configuration\" };\n if (initialTab === \"playground\") return { kind: \"playground\" };\n if (initialTab === \"eval\") return { kind: \"eval\", initial: { page: \"suites\" }, navigationKey: 0 };\n if (initialTab === \"web-apps\") return { kind: \"web-apps\" };\n return null;\n};\n\nconst parseGraphDefinition = (value: unknown): Record<string, unknown> => {\n let parsed = value;\n if (typeof value === \"string\") {\n try {\n parsed = JSON.parse(value) as unknown;\n } catch {\n return {};\n }\n }\n return parsed !== null && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : {};\n};\n\nexport const AgentDetailView: React.FC<AgentDetailViewProps> = ({\n assistant,\n allAssistants,\n onBack,\n onDeleted,\n initialTab = \"graph\",\n onSave,\n onAssistantUpdated,\n onAgentListInvalidated,\n initialMessage = null,\n initialProjectId = null,\n}) => {\n const [dockView, setDockView] = useState<DockView | null>(() => initialDockView(initialTab));\n const [configurationDirty, setConfigurationDirty] = useState(false);\n const [configurationOverlayOpen, setConfigurationOverlayOpen] = useState(false);\n const [pendingTransition, setPendingTransition] = useState<PendingTransition | null>(null);\n const [architectOpenSignal, setArchitectOpenSignal] = useState(0);\n const pendingTransitionRef = useRef<PendingTransition | null>(null);\n const transitionRequesterRef = useRef<(transition: PendingTransition) => void>(() => undefined);\n const evalNavigationKeyRef = useRef(0);\n const playgroundButtonRef = useRef<HTMLButtonElement>(null);\n const evalButtonRef = useRef<HTMLButtonElement>(null);\n const webAppsButtonRef = useRef<HTMLButtonElement>(null);\n const configurationButtonRef = useRef<HTMLButtonElement>(null);\n const configurationRestoreFocusRef = useRef<HTMLElement | null>(null);\n const architectRestoreFocusRef = useRef<HTMLElement | null>(null);\n const configurationDockFocusRef = useRef<(() => void) | null>(null);\n const [initialMessageRequest, setInitialMessageRequest] = useState<InitialMessageRequest | null>(() =>\n initialMessage\n ? { requestId: `initial:${assistant.id}`, content: initialMessage }\n : null\n );\n const { workspaceId, trainingProjects } = useWorkspaceContext();\n const trainingProjectId = getTrainingProjectId(assistant.graphDefinition);\n const [learningProjectId, setLearningProjectId] = useState<string | null>(\n initialProjectId ?? trainingProjectId ?? trainingProjects[0]?.id ?? null\n );\n\n const handleProjectChange = (id: string | null) => {\n setLearningProjectId(id);\n };\n\n const handleLearningStarted = (goal: string, roundTaskId: string, files?: TaskFileRef[]) => {\n const learningProject = trainingProjects.find((p) => p.id === learningProjectId) ?? null;\n setInitialMessageRequest({\n requestId: roundTaskId,\n content: buildLearningKickoff({\n goal,\n roundTaskId,\n targetAgentId: assistant.id,\n targetMode: getLearningTargetMode(assistant),\n files,\n projectId: learningProjectId ?? undefined,\n workspaceId: learningProject?.workspaceId ?? workspaceId ?? undefined,\n }),\n });\n };\n\n const handleInitialMessageSubmitted = (requestId: string) => {\n setInitialMessageRequest((current) => current?.requestId === requestId ? null : current);\n };\n\n // Legacy agents without persisted metadata use the first training project.\n useEffect(() => {\n if (!learningProjectId && trainingProjects.length > 0) {\n setLearningProjectId(trainingProjects[0].id);\n }\n }, [learningProjectId, trainingProjects]);\n const [deleting, setDeleting] = useState(false);\n const [deleteModalOpen, setDeleteModalOpen] = useState(false);\n const [descriptionOpen, setDescriptionOpen] = useState(false);\n const [graphDef, setGraphDef] = useState<unknown>(assistant.graphDefinition);\n\n // Event-driven precise refresh: architect tool completions refetch\n // final consistent data per entity group (config / tasks / eval).\n const { handleToolCompleted, learningTasks, refreshLearningTasks, evalTick } = useEntityRefresher({\n agentId: assistant.id,\n projectId: learningProjectId,\n onAssistantUpdated,\n onAgentListInvalidated,\n });\n\n useEffect(() => {\n setGraphDef(assistant.graphDefinition);\n }, [assistant]);\n\n\n const def = typeof assistant.graphDefinition === \"object\" ? assistant.graphDefinition : {};\n const rawType = String((def as Record<string, unknown>).type ?? \"react\");\n const badge = getTypeBadgeInfo(rawType);\n const TypeIcon = rawType === \"workflow\" ? WorkflowIcon : Bot;\n const tags = extractTags(assistant);\n const status = extractStatus(assistant);\n const statusTagColor = statusColor(status);\n\n const executeTransition = (transition: PendingTransition) => {\n if (transition.kind === \"back\") {\n onBack();\n } else if (transition.kind === \"close\") {\n setDockView(null);\n } else if (transition.kind === \"architect\") {\n setDockView(null);\n setArchitectOpenSignal((value) => value + 1);\n } else {\n setDockView(transition.view);\n }\n };\n\n const requestTransition = (transition: PendingTransition) => {\n if (pendingTransitionRef.current) return;\n if (\n transition.kind === \"dock\" &&\n transition.view.kind !== \"node\" &&\n dockView?.kind === transition.view.kind &&\n transition.view.kind !== \"eval\"\n ) return;\n if (dockView?.kind === \"configuration\" && configurationDirty) {\n pendingTransitionRef.current = transition;\n setPendingTransition(transition);\n return;\n }\n executeTransition(transition);\n };\n transitionRequesterRef.current = requestTransition;\n\n const evalRestoreFocusRef = (trigger?: HTMLElement): React.RefObject<HTMLElement> | undefined => {\n const element = trigger ?? (document.activeElement instanceof HTMLElement ? document.activeElement : undefined);\n return element ? { current: element } : undefined;\n };\n\n const openEval = useCallback((trigger?: HTMLElement) => {\n const navigationKey = ++evalNavigationKeyRef.current;\n transitionRequesterRef.current({\n kind: \"dock\",\n view: { kind: \"eval\", initial: { page: \"suites\" }, navigationKey, restoreFocusRef: evalRestoreFocusRef(trigger) },\n });\n }, []);\n\n const cancelPendingTransition = () => {\n pendingTransitionRef.current = null;\n setPendingTransition(null);\n requestAnimationFrame(() => configurationDockFocusRef.current?.());\n };\n\n const discardAndContinue = () => {\n const transition = pendingTransitionRef.current;\n if (!transition) return;\n pendingTransitionRef.current = null;\n setPendingTransition(null);\n setConfigurationDirty(false);\n executeTransition(transition);\n };\n\n const confirmDelete = () => {\n setDeleteModalOpen(true);\n };\n\n const handleDelete = async () => {\n setDeleting(true);\n try {\n await onDeleted(assistant.id);\n setDeleteModalOpen(false);\n } finally {\n setDeleting(false);\n }\n };\n\n /** Persist an edited graphDefinition (node dock: capability/agent editors). */\n const handleSaveGraph = (next: Record<string, unknown>) => {\n setGraphDef(next);\n return onSave?.(assistant, next);\n };\n\n const handleConfigurationSave: AgentDetailViewProps[\"onSave\"] | undefined = onSave\n ? async (assistantArg, config) => {\n await onSave(assistantArg, config);\n setGraphDef({\n ...parseGraphDefinition(assistantArg.graphDefinition),\n ...config,\n });\n }\n : undefined;\n\n /** Remove a capability node from the local graphDefinition and persist. */\n const handleRemoveNode = (node: ConfigGraphNode) => {\n const g = typeof graphDef === \"object\" && graphDef !== null ? (graphDef as Record<string, unknown>) : {};\n const next = { ...g };\n\n if (node.type === \"tool\" && node.id.startsWith(\"tool:\")) {\n next.tools = ((g.tools as string[]) ?? []).filter((t) => t !== node.id.slice(5));\n } else if (node.type === \"subagent\" && node.id.startsWith(\"sub:\")) {\n next.subAgents = ((g.subAgents as string[]) ?? []).filter((s) => s !== node.id.slice(4));\n } else if (node.type === \"skill\" && node.id.startsWith(\"skill:\")) {\n const skillId = node.id.slice(6);\n next.skills = ((g.skills as string[]) ?? []).filter((s) => s !== skillId);\n if (Array.isArray(g.middleware)) {\n next.middleware = (g.middleware as Record<string, unknown>[]).map((m) => {\n if (m.type !== \"skill\") return m;\n const cfg = (typeof m.config === \"object\" && m.config !== null ? m.config : {}) as Record<string, unknown>;\n if (node.id === ALL_SKILLS_NODE_ID) return { ...m, config: { ...cfg, readAll: false } };\n if (!Array.isArray(cfg.skills) || !(cfg.skills as unknown[]).includes(skillId)) return m;\n return { ...m, config: { ...cfg, skills: (cfg.skills as string[]).filter((s) => s !== skillId) } };\n });\n }\n } else if (node.type === \"capability\" && node.id.startsWith(\"cap:\")) {\n const type = node.id.slice(4);\n next.middleware = ((g.middleware as Record<string, unknown>[]) ?? []).filter((m) => m.type !== type);\n } else {\n return;\n }\n\n setGraphDef(next);\n onSave?.(assistant, next).catch(() => message.error(\"Failed to save after removing node\"));\n };\n\n return (\n <div style={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", background: \"#fff\" }}>\n <style data-agent-detail-responsive>{RESPONSIVE_HEADER_CSS}</style>\n <div style={{ flex: 1, minHeight: 0, position: \"relative\" }}>\n {/* Identity pill — top-left, workflow-style: icon-led, slim. */}\n <div\n data-testid=\"agent-header-pill\"\n className=\"agent-detail__identity-pill\"\n style={{\n position: \"absolute\", top: 12, left: 12, zIndex: 12,\n display: \"flex\", alignItems: \"center\", gap: 8, height: 32,\n padding: \"0 10px 0 4px\", background: \"rgba(255,255,255,0.95)\",\n borderRadius: 10, boxShadow: \"0 2px 12px rgba(0,0,0,0.08)\",\n border: \"1px solid #f0f0f0\", maxWidth: \"calc(100% - 176px)\", minWidth: 0,\n }}\n >\n <Button type=\"text\" size=\"small\" icon={<ArrowLeftOutlined />} onClick={() => requestTransition({ kind: \"back\" })} aria-label=\"Back\" />\n <TypeIcon size={15} color={colorHex(badge.color)} />\n <Text strong style={{ fontSize: 13, maxWidth: 220, minWidth: 0, flex: \"1 1 auto\", overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {assistant.name}\n </Text>\n <span\n data-testid=\"agent-status-dot\"\n title={status}\n style={{ width: 8, height: 8, borderRadius: \"50%\", background: colorHex(statusTagColor), flexShrink: 0 }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n aria-label=\"View description\"\n icon={<InfoCircleOutlined />}\n style={{ color: \"#6366f1\" }}\n onClick={() => setDescriptionOpen(true)}\n />\n </div>\n\n {/* Actions pill — top-right, icon-only with tooltips. */}\n <div\n data-testid=\"agent-actions-pill\"\n className=\"agent-detail__actions-pill\"\n style={{\n position: \"absolute\", top: 12, right: 12, zIndex: 12,\n display: \"flex\", alignItems: \"center\", gap: 2, height: 32,\n padding: \"0 6px\", background: \"rgba(255,255,255,0.95)\",\n borderRadius: 10, boxShadow: \"0 2px 12px rgba(0,0,0,0.08)\",\n border: \"1px solid #f0f0f0\",\n }}\n >\n <Tooltip title=\"Test in Playground\">\n <Button ref={playgroundButtonRef} type=\"text\" size=\"small\" icon={<Play size={14} />} onClick={() => requestTransition({ kind: \"dock\", view: { kind: \"playground\" } })} aria-label=\"Test in Playground\" aria-pressed={dockView?.kind === \"playground\"} style={dockView?.kind === \"playground\" ? activeActionStyle : undefined} />\n </Tooltip>\n <Tooltip title=\"Eval Suite\">\n <Button ref={evalButtonRef} type=\"text\" size=\"small\" icon={<FlaskConical size={14} />} onClick={() => openEval(evalButtonRef.current ?? undefined)} aria-label=\"Eval Suite\" aria-pressed={dockView?.kind === \"eval\"} style={dockView?.kind === \"eval\" ? activeActionStyle : undefined} />\n </Tooltip>\n <Tooltip title=\"Web Apps\">\n <Button ref={webAppsButtonRef} type=\"text\" size=\"small\" icon={<PanelsTopLeft size={14} />} onClick={() => requestTransition({ kind: \"dock\", view: { kind: \"web-apps\" } })} aria-label=\"Web Apps\" aria-pressed={dockView?.kind === \"web-apps\"} style={dockView?.kind === \"web-apps\" ? activeActionStyle : undefined} />\n </Tooltip>\n <Tooltip title=\"Configuration\">\n <Button ref={configurationButtonRef} type=\"text\" size=\"small\" icon={<Settings2 size={14} />} onClick={() => requestTransition({ kind: \"dock\", view: { kind: \"configuration\" } })} aria-label=\"Configuration\" aria-pressed={dockView?.kind === \"configuration\"} style={dockView?.kind === \"configuration\" ? activeActionStyle : undefined} />\n </Tooltip>\n <Tooltip title=\"Delete Agent\">\n <Button\n type=\"text\"\n size=\"small\"\n danger\n icon={<DeleteOutlined />}\n loading={deleting}\n onClick={confirmDelete}\n aria-label=\"Delete Agent\"\n />\n </Tooltip>\n </div>\n\n {rawType === \"workflow\" ? (\n <WorkflowAgentCanvas\n graphDefinition={graphDef}\n assistantId={assistant.id}\n assistantName={assistant.name}\n workspaceId={workspaceId}\n description={assistant.description}\n hideTitleBar\n hudTopOffset={56}\n initialMessageRequest={initialMessageRequest}\n onInitialMessageSubmitted={handleInitialMessageSubmitted}\n projectId={learningProjectId}\n onProjectChange={handleProjectChange}\n onLearningStarted={handleLearningStarted}\n onToolActivity={handleToolCompleted}\n learningTasks={learningTasks}\n onLearningRefresh={refreshLearningTasks}\n evalTick={evalTick}\n architectOpenSignal={architectOpenSignal}\n architectRestoreFocusRef={architectRestoreFocusRef}\n copilotTemporarilyHidden={dockView !== null}\n />\n ) : (\n <AgentConfigGraph\n graphDefinition={graphDef}\n assistantId={assistant.id}\n assistantName={assistant.name}\n workspaceId={workspaceId}\n hudTopOffset={56}\n onSelectNode={(node) => {\n if (node) requestTransition({ kind: \"dock\", view: { kind: \"node\", node } });\n else if (dockView?.kind === \"node\") requestTransition({ kind: \"close\" });\n }}\n onRemoveNode={handleRemoveNode}\n initialMessageRequest={initialMessageRequest}\n onInitialMessageSubmitted={handleInitialMessageSubmitted}\n projectId={learningProjectId}\n onProjectChange={handleProjectChange}\n onLearningStarted={handleLearningStarted}\n onToolActivity={handleToolCompleted}\n learningTasks={learningTasks}\n onLearningRefresh={refreshLearningTasks}\n evalTick={evalTick}\n architectOpenSignal={architectOpenSignal}\n architectRestoreFocusRef={architectRestoreFocusRef}\n copilotTemporarilyHidden={dockView !== null}\n />\n )}\n\n {/* The single dock slot: node content / configuration / playground / eval trade places here */}\n {dockView?.kind === \"node\" && (\n <CanvasDock\n open\n width={nodeDockWidth(dockView.node)}\n title={nodeDockTitle(dockView.node)}\n onClose={() => setDockView(null)}\n >\n <NodeDockContent\n node={dockView.node}\n graphDefinition={graphDef}\n assistantId={assistant.id}\n onRemoveNode={(node) => {\n handleRemoveNode(node);\n setDockView(null);\n }}\n onSaveGraph={handleSaveGraph}\n />\n </CanvasDock>\n )}\n {dockView?.kind === \"playground\" && (\n <CanvasDock open width={720} title=\"Playground\" onClose={() => requestTransition({ kind: \"close\" })} restoreFocusRef={playgroundButtonRef}>\n <ProjectScopedChating assistant_id={assistant.id} />\n </CanvasDock>\n )}\n {dockView?.kind === \"eval\" && (\n <CanvasDock key={dockView.navigationKey} open width={860} title={dockView.initial?.page === \"run\" ? \"Run Results\" : \"Eval Suite\"} onClose={() => requestTransition({ kind: \"close\" })} restoreFocusRef={dockView.restoreFocusRef ?? evalButtonRef}>\n <AgentEvalPanel assistantId={assistant.id} initial={dockView.initial} navigationKey={dockView.navigationKey} />\n </CanvasDock>\n )}\n {dockView?.kind === \"web-apps\" && (\n <CanvasDock open width={960} title=\"Web Apps\" onClose={() => requestTransition({ kind: \"close\" })} restoreFocusRef={webAppsButtonRef} bodyStyle={{ padding: 0, overflow: \"hidden\" }}>\n <AgentWebAppsPanel assistant={assistant} />\n </CanvasDock>\n )}\n {dockView?.kind === \"configuration\" && (\n <CanvasDock\n open\n width=\"80%\"\n mobileWidth=\"calc(100% - 24px)\"\n title=\"Configuration\"\n onClose={() => requestTransition({ kind: \"close\" })}\n bodyStyle={{ padding: 0, overflow: \"hidden\" }}\n restoreFocusRef={configurationRestoreFocusRef}\n focusControlRef={configurationDockFocusRef}\n escapeEnabled={!configurationOverlayOpen && !descriptionOpen && !deleteModalOpen && pendingTransition === null}\n >\n <AgentConfigPanel\n assistant={{ ...assistant, graphDefinition: graphDef }}\n allAssistants={allAssistants}\n visible\n onClose={() => requestTransition({ kind: \"close\" })}\n onSave={handleConfigurationSave}\n onDirtyChange={setConfigurationDirty}\n onOverlayOpenChange={setConfigurationOverlayOpen}\n embedded\n />\n </CanvasDock>\n )}\n </div>\n\n <Modal\n title=\"Discard unsaved configuration?\"\n open={pendingTransition !== null}\n onCancel={cancelPendingTransition}\n onOk={discardAndContinue}\n okText=\"Discard\"\n okButtonProps={{ danger: true }}\n cancelText=\"Continue editing\"\n >\n <p>You have unsaved configuration changes. Discard them and continue?</p>\n </Modal>\n\n <Modal\n title={assistant.name}\n open={descriptionOpen}\n onCancel={() => setDescriptionOpen(false)}\n footer={null}\n width={640}\n centered\n >\n <div style={{ display: \"flex\", gap: 6, flexWrap: \"wrap\", marginBottom: 12 }}>\n <Tag color={badge.color} style={{ margin: 0 }}>{badge.label}</Tag>\n {tags.map((tag) => (\n <Tag key={tag} color=\"magenta\" style={{ margin: 0 }}>{tag}</Tag>\n ))}\n <Tag style={{ margin: 0 }}>{extractVersion(assistant)}</Tag>\n <Tag color={statusTagColor} style={{ margin: 0 }}>{status}</Tag>\n </div>\n {assistant.description ? (\n <MDResponse content={assistant.description} />\n ) : (\n <Text type=\"secondary\">No description set.</Text>\n )}\n </Modal>\n\n <Modal\n title=\"Delete Agent\"\n open={deleteModalOpen}\n onCancel={() => setDeleteModalOpen(false)}\n onOk={handleDelete}\n okText=\"Delete\"\n okButtonProps={{ danger: true, loading: deleting }}\n cancelText=\"Cancel\"\n >\n <p>Are you sure you want to delete \"{assistant.name}\"? This action cannot be undone.</p>\n </Modal>\n </div>\n );\n};\n","import React, { useState, useEffect, useMemo, useCallback, useRef } from \"react\";\nimport {\n Form,\n Input,\n Select,\n Button,\n Space,\n Typography,\n Tag,\n Avatar,\n List,\n Checkbox,\n Empty,\n Spin,\n message,\n theme,\n Badge,\n Segmented,\n Tooltip,\n Switch,\n Modal,\n} from \"antd\";\nimport {\n SettingOutlined,\n ToolOutlined,\n FileTextOutlined,\n RobotOutlined,\n SaveOutlined,\n CloseOutlined,\n CodeOutlined,\n InfoCircleOutlined,\n QuestionCircleOutlined,\n ExpandOutlined,\n DatabaseOutlined,\n FolderOutlined,\n StarOutlined,\n DeleteOutlined,\n PlusOutlined,\n ShareAltOutlined,\n SearchOutlined,\n} from \"@ant-design/icons\";\nimport { createStyles } from \"antd-style\";\nimport { Activity } from \"lucide-react\";\nimport { useLatticeChatShellContext, type MiddlewareToolDefinition, type MiddlewareTypeDefinition } from \"./LatticeChatShellContext\";\nimport { useWorkbenchNavStyles } from \"./workbenchNavStyles\";\nimport type { Assistant } from \"@axiom-lattice/client-sdk\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { useMiddlewareTypes } from \"../../hooks/useMiddlewareTypes\";\nimport { EntityCard } from \"../EntityList/EntityCard\";\nimport { MiddlewareConfigForm, ToolDesc, type AgentMiddlewareConfig } from \"./MiddlewareConfigForm\";\n\nconst { TextArea } = Input;\nconst { Text } = Typography;\n\n/**\n * Tool interface\n */\ninterface Tool {\n id: string;\n name: string;\n description: string;\n schema?: any;\n returnDirect?: boolean;\n needUserApprove?: boolean;\n}\n\n/**\n * Middleware type\n */\ntype MiddlewareType = string;\n\n/**\n * Agent configuration interface\n */\ninterface AgentConfig {\n key: string;\n name: string;\n description: string;\n prompt: string;\n tools: string[];\n skills: string[];\n subAgents: string[];\n type: \"react\" | \"deep_agent\" | \"team\" | \"processing\";\n middleware?: AgentMiddlewareConfig[];\n}\n\n/**\n * Props for AgentConfigPanel component\n */\nexport interface AgentConfigPanelProps {\n /**\n * The assistant to configure\n */\n assistant: Assistant | null;\n /**\n * All available assistants for sub-agent selection\n */\n allAssistants: Assistant[];\n /**\n * Whether the panel is visible\n */\n visible: boolean;\n /**\n * Callback when panel is closed\n */\n onClose: () => void;\n /**\n * Callback when configuration is saved\n */\n onSave?: (assistant: Assistant, config: Partial<AgentConfig>) => Promise<void>;\n /**\n * Callback when assistant is deleted\n */\n onDelete?: (assistant: Assistant) => Promise<void>;\n /**\n * Render as an inline page container instead of a Modal (used by the governance workbench).\n */\n embedded?: boolean;\n /**\n * Section to start on when the panel mounts (e.g. jumped from a graph node).\n */\n initialSection?: WorkbenchSection;\n /** Reports whether persisted configuration differs from the last loaded or saved state. */\n onDirtyChange?: (dirty: boolean) => void;\n /** Reports whether either panel-owned modal is open. */\n onOverlayOpenChange?: (open: boolean) => void;\n}\n\nexport type WorkbenchSection = \"basic\" | \"prompt\" | \"tools\" | \"middleware\" | \"subagents\";\n\n/**\n * Category labels for capability tabs (declared by plugins via PluginMeta.category).\n * Unknown values are displayed as-is; missing values fall into \"other\".\n */\nconst CATEGORY_ORDER = [\"data\", \"execution\", \"workflow\", \"assistant\"];\n\nconst CATEGORY_LABELS: Record<string, string> = {\n data: \"Data & Knowledge\",\n execution: \"Execution & Interaction\",\n workflow: \"Workflow & Orchestration\",\n assistant: \"Assistant & Evaluation\",\n other: \"Other\",\n};\n\ninterface PersistedFormFields {\n name: string;\n description: string;\n}\n\ninterface ConfigDraft {\n form: PersistedFormFields;\n agentType: AgentConfig[\"type\"];\n tools: string[];\n subAgents: string[];\n prompt: string;\n middleware: AgentMiddlewareConfig[];\n graphDefinition: unknown;\n}\n\nconst normalizeValue = (value: unknown, key?: string): unknown => {\n if (Array.isArray(value)) {\n const normalized = value.map((entry) => normalizeValue(entry));\n return (key === \"tools\" || key === \"subAgents\") && normalized.every((entry) => typeof entry === \"string\")\n ? [...normalized].sort()\n : normalized;\n }\n if (value !== null && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([entryKey, entry]) => [entryKey, normalizeValue(entry, entryKey)])\n );\n }\n return value;\n};\n\nconst normalizeGraphDefinition = (graphDefinition: Assistant[\"graphDefinition\"]): unknown => {\n if (typeof graphDefinition !== \"string\") {\n return normalizeValue(graphDefinition ?? null);\n }\n try {\n return normalizeValue(JSON.parse(graphDefinition) as unknown);\n } catch {\n return graphDefinition;\n }\n};\n\nconst serializeDraft = (draft: ConfigDraft): string => JSON.stringify(normalizeValue({\n ...draft,\n tools: [...draft.tools].sort(),\n subAgents: [...draft.subAgents].sort(),\n}));\n\nconst useStyles = createStyles(({ token, css }) => ({\n modalBody: css`\n padding: 0;\n height: 92vh;\n width: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n `,\n topbar: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 32px;\n border-bottom: 1px solid ${token.colorBorderSecondary};\n background: ${token.colorBgContainer};\n flex-shrink: 0;\n `,\n topbarLeft: css`\n display: flex;\n align-items: center;\n gap: 16px;\n min-width: 0;\n `,\n agentName: css`\n font-size: 20px;\n font-weight: 600;\n color: ${token.colorText};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n agentDesc: css`\n font-size: 13px;\n color: ${token.colorTextSecondary};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 480px;\n `,\n layout: css`\n display: flex;\n flex: 1;\n min-height: 0;\n\n @media (max-width: 720px) {\n flex-direction: column;\n }\n `,\n pageHeader: css`\n display: flex;\n align-items: center;\n gap: 16px;\n padding-bottom: 20px;\n border-bottom: 1px solid ${token.colorBorderSecondary};\n margin-bottom: 24px;\n `,\n pageIcon: css`\n width: 48px;\n height: 48px;\n border-radius: 12px;\n background: ${token.colorPrimaryBg};\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 22px;\n flex-shrink: 0;\n `,\n pageName: css`\n font-size: 20px;\n font-weight: 600;\n color: ${token.colorText};\n margin: 0;\n `,\n pageDesc: css`\n font-size: 13px;\n color: ${token.colorTextSecondary};\n margin: 4px 0 0;\n `,\n blockTitle: css`\n font-size: 14px;\n font-weight: 600;\n color: ${token.colorTextSecondary};\n margin: 0;\n `,\n content: css`\n flex: 1;\n min-width: 0;\n overflow-y: auto;\n padding: 32px 40px;\n background: ${token.colorBgLayout};\n\n @media (max-width: 720px) {\n padding: 20px 16px;\n }\n `,\n sectionHeader: css`\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n margin-bottom: 20px;\n gap: 16px;\n `,\n sectionTitle: css`\n font-size: 20px;\n font-weight: 600;\n color: ${token.colorText};\n margin: 0;\n `,\n sectionDesc: css`\n font-size: 13px;\n color: ${token.colorTextSecondary};\n margin: 4px 0 0;\n `,\n sectionActions: css`\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n `,\n cardGrid: css`\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(360px, 1fr));\n gap: 16px;\n align-items: start;\n\n @media (max-width: 720px) {\n grid-template-columns: minmax(0, 1fr);\n }\n `,\n footer: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 32px;\n border-top: 1px solid ${token.colorBorderSecondary};\n background: ${token.colorBgContainer};\n flex-shrink: 0;\n\n @media (max-width: 720px) {\n justify-content: flex-end;\n }\n `,\n footerHint: css`\n font-size: 13px;\n\n @media (max-width: 720px) {\n display: none;\n }\n `,\n selectedCard: css`\n border-color: ${token.colorPrimary} !important;\n background: ${token.colorPrimaryBg} !important;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08) !important;\n `,\n dataSection: css`\n border-top: 1px solid ${token.colorBorderSecondary};\n margin-top: 16px;\n padding-top: 16px;\n `,\n dataSectionHeader: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n margin-bottom: 10px;\n `,\n dataList: css`\n max-height: 240px;\n overflow-y: auto;\n border-radius: 10px;\n background: ${token.colorFillQuaternary};\n padding: 4px 8px;\n `,\n toolsGrid: css`\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n gap: 12px;\n align-items: start;\n `,\n toolDesc: css`\n font-size: 13px;\n line-height: 1.5;\n color: ${token.colorTextSecondary};\n display: -webkit-box;\n -webkit-line-clamp: 1;\n -webkit-box-orient: vertical;\n overflow: hidden;\n `,\n configGrid: css`\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px 16px;\n padding: 8px 0;\n `,\n searchBox: css`\n width: 220px;\n `,\n}));\n\nconst getMiddlewareTypeDefinition = (\n middlewareType: string,\n availableTypes: MiddlewareTypeDefinition[] | undefined\n): MiddlewareTypeDefinition | undefined => {\n return availableTypes?.find((t) => t.type === middlewareType);\n};\n\ntype PanelStyles = ReturnType<typeof useStyles>[\"styles\"];\n\n\n\n\n/**\n * AgentConfigPanel component - Full-screen workbench for configuring agent settings\n * Structure: topbar (identity) + left nav (5 sections) + content area + sticky footer\n */\nexport const AgentConfigPanel: React.FC<AgentConfigPanelProps> = ({\n assistant,\n allAssistants,\n visible,\n onClose,\n onSave,\n onDelete,\n embedded,\n initialSection = \"basic\",\n onDirtyChange,\n onOverlayOpenChange,\n}) => {\n const [form] = Form.useForm();\n const { token } = theme.useToken();\n const { styles } = useStyles();\n const { styles: navStyles } = useWorkbenchNavStyles();\n const { config } = useLatticeChatShellContext();\n const { middlewareTypes, isLoading: middlewareTypesLoading } = useMiddlewareTypes(config.middlewareTypesEndpoint);\n const { get } = useApi();\n\n const [activeSection, setActiveSection] = useState<WorkbenchSection>(initialSection);\n const [workingAssistant, setWorkingAssistant] = useState<Assistant | null>(assistant);\n const [activeMiddlewareType, setActiveMiddlewareType] = useState<string | null>(null);\n const [capabilitiesExpanded, setCapabilitiesExpanded] = useState(true);\n\n // Loading states\n const [toolsLoading, setToolsLoading] = useState(false);\n const [saving, setSaving] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n\n // Data states\n const [tools, setTools] = useState<Tool[]>([]);\n const [toolsSearch, setToolsSearch] = useState(\"\");\n const [subAgentsSearch, setSubAgentsSearch] = useState(\"\");\n\n // Selected values\n const [selectedTools, setSelectedTools] = useState<string[]>([]);\n const [selectedSubAgents, setSelectedSubAgents] = useState<string[]>([]);\n const [agentPrompt, setAgentPrompt] = useState(\"\");\n const [isPromptModalOpen, setIsPromptModalOpen] = useState(false);\n const [agentType, setAgentType] = useState<\"react\" | \"deep_agent\" | \"team\" | \"processing\">(\"react\");\n const [middleware, setMiddleware] = useState<AgentMiddlewareConfig[]>([]);\n const [formValues, setFormValues] = useState<PersistedFormFields>({ name: \"\", description: \"\" });\n const [baseline, setBaseline] = useState(\"\");\n const [pendingBaseline, setPendingBaseline] = useState<string | null>(null);\n const [initialized, setInitialized] = useState(false);\n const initializationGenerationRef = useRef(0);\n const initializedAssistantRef = useRef<Assistant | null>(null);\n const latestDirtyRef = useRef(false);\n const onDirtyChangeRef = useRef(onDirtyChange);\n const onOverlayOpenChangeRef = useRef(onOverlayOpenChange);\n\n useEffect(() => {\n onDirtyChangeRef.current = onDirtyChange;\n }, [onDirtyChange]);\n\n useEffect(() => () => {\n onDirtyChangeRef.current?.(false);\n }, []);\n\n useEffect(() => {\n onOverlayOpenChangeRef.current = onOverlayOpenChange;\n }, [onOverlayOpenChange]);\n\n useEffect(() => () => {\n onOverlayOpenChangeRef.current?.(false);\n }, []);\n\n const currentDraft = useMemo(() => serializeDraft({\n form: formValues,\n agentType,\n tools: selectedTools,\n subAgents: selectedSubAgents,\n prompt: agentPrompt,\n middleware,\n graphDefinition: normalizeGraphDefinition(workingAssistant?.graphDefinition),\n }), [formValues, agentType, selectedTools, selectedSubAgents, agentPrompt, middleware, workingAssistant?.graphDefinition]);\n\n const dirty = initialized && currentDraft !== baseline;\n const configurationReady = initialized;\n latestDirtyRef.current = dirty;\n\n /**\n * Parse graph definition from assistant\n */\n const parsedConfig = useMemo(() => {\n if (!assistant?.graphDefinition) {\n return null;\n }\n try {\n const graphDef =\n typeof assistant.graphDefinition === \"string\"\n ? JSON.parse(assistant.graphDefinition)\n : assistant.graphDefinition;\n return {\n tools: graphDef.tools || [],\n prompt: graphDef.prompt || \"\",\n subAgents: graphDef.subAgents || [],\n type: graphDef.type || \"react\",\n middleware: graphDef.middleware || [],\n };\n } catch {\n return null;\n }\n }, [assistant]);\n\n /**\n * Initialize middleware with defaults from context (without config)\n * Only used when agent has no middleware configuration.\n */\n const initializeMiddleware = useCallback((types: MiddlewareTypeDefinition[]): AgentMiddlewareConfig[] => {\n const middlewareTypes = types || [];\n return middlewareTypes\n .filter((type) =>\n (type.schema?.properties && Object.keys(type.schema.properties).length > 0) ||\n (type.tools && type.tools.length > 0)\n )\n .map((type, index) => ({\n id: `${type.type}-${index + 1}`,\n type: type.type as MiddlewareType,\n name: type.name,\n description: type.description,\n enabled: false,\n config: {},\n }));\n }, []);\n\n /**\n * Merge saved middleware config with available types\n */\n const mergeMiddlewareConfig = useCallback((\n savedConfigs: AgentMiddlewareConfig[] | undefined,\n availableTypes: MiddlewareTypeDefinition[]\n ): AgentMiddlewareConfig[] => {\n const types = (availableTypes || []).filter((type) =>\n (type.schema?.properties && Object.keys(type.schema.properties).length > 0) ||\n (type.tools && type.tools.length > 0)\n );\n const savedMap = new Map(savedConfigs?.map(cfg => [cfg.type, cfg]) || []);\n\n const merged = types.map((type, index) => {\n const saved = savedMap.get(type.type as MiddlewareType);\n if (saved) {\n return {\n ...saved,\n name: type.name,\n description: type.description,\n };\n }\n return {\n id: `${type.type}-${index + 1}`,\n type: type.type as MiddlewareType,\n name: type.name,\n description: type.description,\n enabled: false,\n config: {},\n };\n });\n const renderedTypes = new Set(types.map((type) => type.type));\n return [\n ...merged,\n ...(savedConfigs ?? []).filter((saved) => !renderedTypes.has(saved.type)),\n ];\n }, []);\n\n /**\n * Fetch tools from API\n */\n const fetchTools = useCallback(async () => {\n if (!visible) return;\n setToolsLoading(true);\n try {\n const response = await get<{ success: boolean; data?: { records: Tool[] } }>(\"/api/tools\");\n if (response.success && response.data?.records) {\n setTools(response.data.records);\n }\n } catch (error) {\n console.error(\"Failed to fetch tools:\", error);\n } finally {\n setToolsLoading(false);\n }\n }, [get, visible]);\n\n /**\n * Initialize form values when assistant changes\n */\n useEffect(() => {\n if (!visible || !assistant) {\n initializedAssistantRef.current = null;\n initializationGenerationRef.current += 1;\n setInitialized(false);\n setWorkingAssistant(assistant);\n setPendingBaseline(null);\n return;\n }\n if (initializedAssistantRef.current === assistant) return;\n if (\n initializedAssistantRef.current?.id === assistant.id &&\n latestDirtyRef.current\n ) return;\n\n const configuredMiddlewareTypes = config.availableMiddlewareTypes;\n if (!configuredMiddlewareTypes && middlewareTypesLoading) return;\n\n initializedAssistantRef.current = assistant;\n initializationGenerationRef.current += 1;\n {\n fetchTools();\n\n const nextFormValues = {\n name: assistant.name ?? \"\",\n description: assistant.description ?? \"\",\n };\n const nextTools = parsedConfig?.tools ?? [];\n const nextSubAgents = parsedConfig?.subAgents ?? [];\n const nextPrompt = parsedConfig?.prompt ?? \"\";\n const nextAgentType = parsedConfig?.type ?? \"react\";\n const nextMiddleware = parsedConfig\n ? mergeMiddlewareConfig(parsedConfig.middleware, configuredMiddlewareTypes || middlewareTypes)\n : initializeMiddleware(configuredMiddlewareTypes || middlewareTypes);\n\n setInitialized(false);\n setWorkingAssistant(assistant);\n setFormValues(nextFormValues);\n setSelectedTools(nextTools);\n setSelectedSubAgents(nextSubAgents);\n setAgentPrompt(nextPrompt);\n setAgentType(nextAgentType);\n setMiddleware(nextMiddleware);\n form.setFieldsValue({\n ...nextFormValues,\n type: nextAgentType,\n });\n setPendingBaseline(serializeDraft({\n form: nextFormValues,\n agentType: nextAgentType,\n tools: nextTools,\n subAgents: nextSubAgents,\n prompt: nextPrompt,\n middleware: nextMiddleware,\n graphDefinition: normalizeGraphDefinition(assistant.graphDefinition),\n }));\n }\n }, [visible, assistant, dirty, parsedConfig, form, fetchTools, initializeMiddleware, mergeMiddlewareConfig, config.availableMiddlewareTypes, middlewareTypesLoading, middlewareTypes]);\n\n useEffect(() => {\n if (pendingBaseline !== null && currentDraft === pendingBaseline) {\n setBaseline(pendingBaseline);\n setPendingBaseline(null);\n setInitialized(true);\n }\n }, [currentDraft, pendingBaseline]);\n\n useEffect(() => {\n onDirtyChange?.(dirty);\n }, [dirty, onDirtyChange]);\n\n useEffect(() => {\n onOverlayOpenChangeRef.current?.(isPromptModalOpen || isDeleteModalOpen);\n }, [isPromptModalOpen, isDeleteModalOpen]);\n\n /**\n * Handle save\n */\n const handleSave = async () => {\n if (!workingAssistant || !configurationReady) return;\n const saveGeneration = initializationGenerationRef.current;\n const saveSnapshot = currentDraft;\n\n try {\n setSaving(true);\n const values = await form.validateFields();\n\n const configToSave: Partial<AgentConfig> = {\n ...values,\n type: agentType,\n tools: selectedTools,\n subAgents: selectedSubAgents,\n prompt: agentPrompt,\n middleware,\n };\n\n await onSave?.(workingAssistant, configToSave);\n if (initializationGenerationRef.current === saveGeneration) {\n setBaseline(saveSnapshot);\n }\n } catch (error) {\n if (error instanceof Error) {\n message.error(error.message);\n }\n } finally {\n setSaving(false);\n }\n };\n\n /**\n * Handle delete\n */\n const handleDelete = async () => {\n if (!assistant) return;\n\n setDeleting(true);\n try {\n await onDelete?.(assistant);\n setIsDeleteModalOpen(false);\n onClose();\n } catch (error) {\n setIsDeleteModalOpen(false);\n message.error(error instanceof Error ? error.message : \"Failed to delete assistant\");\n } finally {\n setDeleting(false);\n }\n };\n\n /**\n * Toggle middleware enabled state\n */\n const handleMiddlewareToggle = (middlewareId: string) => {\n setMiddleware((prev) =>\n prev.map((m) => {\n if (m.id !== middlewareId) return m;\n if (m.enabled) {\n return { ...m, enabled: false };\n } else {\n const typeDef = (config.availableMiddlewareTypes || middlewareTypes)?.find(t => t.type === m.type);\n return {\n ...m,\n enabled: true,\n config: typeDef?.defaultConfig || {},\n };\n }\n })\n );\n };\n\n /**\n * Update middleware config\n */\n const handleMiddlewareConfigChange = (middlewareId: string, config: Record<string, any>) => {\n setMiddleware((prev) =>\n prev.map((m) =>\n m.id === middlewareId ? { ...m, config: { ...m.config, ...config } } : m\n )\n );\n };\n\n /**\n * Update middleware allowedTools\n */\n const handleMiddlewareAllowedToolsChange = (middlewareId: string, allowedTools: string[] | undefined) => {\n setMiddleware((prev) =>\n prev.map((m) =>\n m.id === middlewareId ? { ...m, allowedTools } : m\n )\n );\n };\n\n /**\n * List sub-section renderer for middleware cards\n */\n\n const renderToolCard = (tool: Tool) => {\n const isSelected = selectedTools.includes(tool.id);\n return (\n <EntityCard\n key={tool.id}\n item={tool}\n className={isSelected ? styles.selectedCard : undefined}\n onClick={() => setSelectedTools((prev) =>\n prev.includes(tool.id) ? prev.filter((id) => id !== tool.id) : [...prev, tool.id]\n )}\n renderIcon={() => (\n <span style={{ fontSize: 18, fontWeight: 600 }}>{tool.name.charAt(0).toUpperCase()}</span>\n )}\n renderPrimary={() => (\n <Space size={6}>\n <span>{tool.name}</span>\n {tool.needUserApprove && (\n <Tag color=\"warning\" style={{ fontSize: 10, padding: \"0 4px\", margin: 0 }}>Approve</Tag>\n )}\n </Space>\n )}\n renderDetails={() => <ToolDesc text={tool.description} className={styles.toolDesc} />}\n renderHeaderActions={() => (\n <Checkbox\n checked={isSelected}\n onClick={(e) => e.stopPropagation()}\n onChange={() => setSelectedTools((prev) =>\n prev.includes(tool.id) ? prev.filter((id) => id !== tool.id) : [...prev, tool.id]\n )}\n />\n )}\n />\n );\n };\n\n const renderSubAgentCard = (subAssistant: Assistant) => {\n const isSelected = selectedSubAgents.includes(subAssistant.id);\n return (\n <EntityCard\n key={subAssistant.id}\n item={subAssistant}\n className={isSelected ? styles.selectedCard : undefined}\n onClick={() => setSelectedSubAgents((prev) =>\n prev.includes(subAssistant.id) ? prev.filter((id) => id !== subAssistant.id) : [...prev, subAssistant.id]\n )}\n renderIcon={() => (\n <Avatar\n size={36}\n style={{\n backgroundColor: isSelected ? token.colorPrimary : token.colorSuccess,\n fontSize: 15,\n }}\n >\n {subAssistant.name?.charAt(0).toUpperCase() || \"A\"}\n </Avatar>\n )}\n renderPrimary={() => subAssistant.name}\n renderSecondary={() => subAssistant.description || \"No description\"}\n renderHeaderActions={() => (\n <Checkbox\n checked={isSelected}\n onClick={(e) => e.stopPropagation()}\n onChange={() => setSelectedSubAgents((prev) =>\n prev.includes(subAssistant.id) ? prev.filter((id) => id !== subAssistant.id) : [...prev, subAssistant.id]\n )}\n />\n )}\n />\n );\n };\n\n const categoryOf = useCallback(\n (m: AgentMiddlewareConfig): string => {\n const def = getMiddlewareTypeDefinition(m.type, config.availableMiddlewareTypes || middlewareTypes);\n return def?.category || \"other\";\n },\n [config.availableMiddlewareTypes, middlewareTypes]\n );\n\n const capabilityGroups = useMemo(() => {\n const map = new Map<string, AgentMiddlewareConfig[]>();\n for (const m of middleware) {\n const cat = categoryOf(m);\n const group = map.get(cat);\n if (group) {\n group.push(m);\n } else {\n map.set(cat, [m]);\n }\n }\n return map;\n }, [middleware, categoryOf]);\n\n const capabilityGroupOrder = useMemo(() => {\n const cats = Array.from(capabilityGroups.keys());\n return [...CATEGORY_ORDER.filter((c) => capabilityGroups.has(c)), ...cats.filter((c) => !CATEGORY_ORDER.includes(c))];\n }, [capabilityGroups]);\n\n const activeMiddleware = useMemo(() => {\n if (middleware.length === 0) return null;\n return (\n middleware.find((m) => m.type === activeMiddlewareType) ??\n middleware.find((m) => m.enabled) ??\n middleware[0]\n );\n }, [middleware, activeMiddlewareType]);\n\n if (!visible || !assistant) {\n return null;\n }\n\n const navItems: Array<{ key: WorkbenchSection; icon: React.ReactNode; label: string; badge?: number }> = [\n { key: \"basic\", icon: <SettingOutlined />, label: \"Basic Info\" },\n { key: \"prompt\", icon: <FileTextOutlined />, label: \"System Prompt\" },\n { key: \"tools\", icon: <ToolOutlined />, label: \"Common Tools\", badge: selectedTools.length },\n { key: \"middleware\", icon: <CodeOutlined />, label: \"Capabilities\", badge: middleware.filter((m) => m.enabled).length },\n { key: \"subagents\", icon: <RobotOutlined />, label: \"Sub-Agents\", badge: selectedSubAgents.length },\n ];\n\n const filteredTools = tools.filter(\n (t) => t.name.toLowerCase().includes(toolsSearch.toLowerCase()) || t.description.toLowerCase().includes(toolsSearch.toLowerCase())\n );\n const otherAssistants = allAssistants.filter((a) => a.id !== assistant.id);\n const filteredSubAgents = otherAssistants.filter(\n (a) => (a.name || \"\").toLowerCase().includes(subAgentsSearch.toLowerCase()) || (a.description || \"\").toLowerCase().includes(subAgentsSearch.toLowerCase())\n );\n\n const renderBasicSection = () => (\n <div style={{ maxWidth: 960 }}>\n <div className={styles.pageHeader}>\n <div className={styles.pageIcon}>\n <SettingOutlined />\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <h2 className={styles.pageName}>Basic Info</h2>\n <p className={styles.pageDesc}>Core identity and behavior of this agent</p>\n </div>\n </div>\n <Form\n form={form}\n layout=\"vertical\"\n autoComplete=\"off\"\n onValuesChange={(_, values: PersistedFormFields) => setFormValues({\n name: values.name ?? \"\",\n description: values.description ?? \"\",\n })}\n >\n <Form.Item\n name=\"name\"\n label={<Text strong style={{ fontSize: 14 }}>Name</Text>}\n rules={[{ required: true, message: \"Please enter agent name\" }]}\n style={{ marginBottom: 24 }}\n >\n <Input placeholder=\"Enter agent name…\" />\n </Form.Item>\n\n <Form.Item\n name=\"type\"\n label={<Text strong style={{ fontSize: 14 }}>Agent Type</Text>}\n rules={[{ required: true }]}\n style={{ marginBottom: 24 }}\n >\n <Segmented\n value={agentType}\n onChange={(value) => setAgentType(value as \"react\" | \"deep_agent\" | \"team\" | \"processing\")}\n options={[\n { value: \"react\", label: \"Executor\" },\n { value: \"deep_agent\", label: \"Orchestrator\" },\n { value: \"team\", label: \"Team\" },\n { value: \"processing\", label: \"Workflow\" },\n ]}\n block\n />\n <Text\n type=\"secondary\"\n style={{ fontSize: 13, marginTop: 8, display: \"block\", lineHeight: 1.6 }}\n >\n {agentType === \"react\"\n ? \"Executor: Executes tasks directly using tools. Best for single-step operations like search, code execution, and data retrieval.\"\n : agentType === \"deep_agent\"\n ? \"Orchestrator: Maintains a todo list to plan and delegate tasks to sub-agents. Best for structured multi-step workflows.\"\n : agentType === \"processing\"\n ? \"Workflow: Delegates to sub-agents in a predefined topology order. Best for deterministic multi-step processes.\"\n : \"Team: Creates tasks with dependencies and dynamically spawns teammates who communicate via mailbox. Best for exploration and divergent thinking.\"}\n </Text>\n </Form.Item>\n\n <Form.Item\n name=\"description\"\n label={<Text strong style={{ fontSize: 14 }}>Description</Text>}\n rules={[{ required: true, message: \"Please enter agent description\" }]}\n style={{ marginBottom: 0 }}\n >\n <Input.TextArea placeholder=\"Enter agent description…\" autoSize={{ minRows: 3, maxRows: 6 }} />\n </Form.Item>\n </Form>\n </div>\n );\n\n const renderPromptSection = () => (\n <div style={{ maxWidth: 960 }}>\n <div className={styles.pageHeader}>\n <div className={styles.pageIcon}>\n <FileTextOutlined />\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <h2 className={styles.pageName}>System Prompt</h2>\n <p className={styles.pageDesc}>Define the agent's behavior, capabilities, and constraints</p>\n </div>\n <Button icon={<ExpandOutlined />} onClick={() => setIsPromptModalOpen(true)}>\n Expand\n </Button>\n </div>\n <TextArea\n aria-label=\"System Prompt\"\n value={agentPrompt}\n onChange={(e) => setAgentPrompt(e.target.value)}\n placeholder=\"Enter the system prompt for this agent…\"\n autoSize={{ minRows: 12, maxRows: 24 }}\n style={{\n fontFamily: \"monospace\",\n fontSize: 13,\n lineHeight: 1.7,\n }}\n />\n <div style={{ marginTop: 8, display: \"flex\", justifyContent: \"flex-end\" }}>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {agentPrompt.length} chars\n </Text>\n </div>\n </div>\n );\n\n const renderToolsSection = () => (\n <>\n <div className={styles.sectionHeader}>\n <div>\n <h2 className={styles.sectionTitle}>Common Tools</h2>\n <p className={styles.sectionDesc}>Choose the tools this agent can call directly</p>\n </div>\n <div className={styles.sectionActions}>\n <Input\n allowClear\n prefix={<SearchOutlined />}\n placeholder=\"Search tools…\"\n value={toolsSearch}\n onChange={(e) => setToolsSearch(e.target.value)}\n className={styles.searchBox}\n />\n <Text type=\"secondary\" style={{ fontSize: 13 }}>\n Selected {selectedTools.length} / {tools.length}\n </Text>\n <Button\n size=\"small\"\n onClick={() =>\n setSelectedTools(\n selectedTools.length === tools.length ? [] : tools.map((t) => t.id)\n )\n }\n >\n {selectedTools.length === tools.length ? \"Clear\" : \"Select All\"}\n </Button>\n </div>\n </div>\n {toolsLoading ? (\n <div style={{ textAlign: \"center\", padding: 60 }}>\n <Spin />\n </div>\n ) : filteredTools.length === 0 ? (\n <Empty description=\"No tools available\" style={{ padding: 60 }} />\n ) : (\n <div className={styles.cardGrid}>\n {filteredTools.map(renderToolCard)}\n </div>\n )}\n </>\n );\n\n const renderMiddlewareSection = () => {\n if (!activeMiddleware) {\n return <Empty description=\"No capabilities available\" style={{ padding: 60 }} />;\n }\n return (\n <MiddlewareConfigForm\n key={activeMiddleware.id}\n middleware={activeMiddleware}\n middlewareType={getMiddlewareTypeDefinition(activeMiddleware.type, config.availableMiddlewareTypes || middlewareTypes)}\n onToggle={() => handleMiddlewareToggle(activeMiddleware.id)}\n onConfigChange={(cfg) => handleMiddlewareConfigChange(activeMiddleware.id, cfg)}\n onAllowedToolsChange={(tools) => handleMiddlewareAllowedToolsChange(activeMiddleware.id, tools)}\n />\n );\n };\n\n const renderSubAgentsSection = () => (\n <>\n <div className={styles.sectionHeader}>\n <div>\n <h2 className={styles.sectionTitle}>Sub-Agents</h2>\n <p className={styles.sectionDesc}>Choose sub-agents this agent can delegate to</p>\n </div>\n <div className={styles.sectionActions}>\n <Input\n allowClear\n prefix={<SearchOutlined />}\n placeholder=\"Search sub-agents…\"\n value={subAgentsSearch}\n onChange={(e) => setSubAgentsSearch(e.target.value)}\n className={styles.searchBox}\n />\n <Text type=\"secondary\" style={{ fontSize: 13 }}>\n Selected {selectedSubAgents.length} / {otherAssistants.length}\n </Text>\n <Button\n size=\"small\"\n onClick={() =>\n setSelectedSubAgents(\n selectedSubAgents.length === otherAssistants.length\n ? []\n : otherAssistants.map((a) => a.id)\n )\n }\n >\n {selectedSubAgents.length === otherAssistants.length ? \"Clear\" : \"Select All\"}\n </Button>\n </div>\n </div>\n {otherAssistants.length === 0 ? (\n <Empty description=\"No other agents available\" style={{ padding: 60 }} />\n ) : filteredSubAgents.length === 0 ? (\n <Empty description=\"No matching results\" style={{ padding: 60 }} />\n ) : (\n <div className={styles.cardGrid}>\n {filteredSubAgents.map(renderSubAgentCard)}\n </div>\n )}\n </>\n );\n\n const sectionContent: Record<WorkbenchSection, React.ReactNode> = {\n basic: renderBasicSection(),\n prompt: renderPromptSection(),\n tools: renderToolsSection(),\n middleware: renderMiddlewareSection(),\n subagents: renderSubAgentsSection(),\n };\n\n const panelContent = (\n <>\n <div className={styles.modalBody} style={embedded ? { height: \"100%\", width: \"100%\" } : undefined}>\n {/* Topbar. Hidden in embedded mode: the host page (governance detail\n view) already renders agent identity and delete actions. */}\n {!embedded && (\n <div className={styles.topbar}>\n <div className={styles.topbarLeft}>\n <Avatar\n size={40}\n style={{\n backgroundColor: token.colorPrimary,\n fontSize: 18,\n flexShrink: 0,\n }}\n >\n {assistant.name?.charAt(0).toUpperCase() || \"A\"}\n </Avatar>\n <div style={{ minWidth: 0 }}>\n <div className={styles.agentName}>{assistant.name}</div>\n <div className={styles.agentDesc}>{assistant.description}</div>\n </div>\n <Tag color=\"blue\" style={{ margin: 0, fontSize: 11, flexShrink: 0 }}>\n Config Workbench\n </Tag>\n </div>\n <Space>\n {onDelete && (\n <Tooltip title=\"Delete Agent\">\n <Button\n aria-label=\"Delete Agent\"\n type=\"text\"\n danger\n icon={<DeleteOutlined />}\n onClick={() => setIsDeleteModalOpen(true)}\n />\n </Tooltip>\n )}\n <Button type=\"text\" icon={<CloseOutlined />} onClick={onClose} />\n </Space>\n </div>\n )}\n\n {/* Body: nav + content */}\n <div className={styles.layout}>\n <div className={navStyles.nav} role=\"tablist\" aria-label=\"Agent configuration sections\">\n {navItems.map((item) => {\n if (item.key !== \"middleware\") {\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={activeSection === item.key}\n key={item.key}\n className={`${navStyles.navItem} ${activeSection === item.key ? \"active\" : \"\"}`}\n onClick={() => setActiveSection(item.key)}\n >\n <span style={{ fontSize: 16 }}>{item.icon}</span>\n <span>{item.label}</span>\n {item.badge !== undefined && item.badge > 0 && (\n <Badge\n count={item.badge}\n size=\"small\"\n className={navStyles.navBadge}\n style={{ backgroundColor: token.colorPrimary }}\n />\n )}\n </button>\n );\n }\n return (\n <React.Fragment key=\"middleware\">\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={activeSection === \"middleware\"}\n className={`${navStyles.navItem} ${activeSection === \"middleware\" ? \"active\" : \"\"}`}\n onClick={() => setCapabilitiesExpanded((prev) => !prev)}\n >\n <span style={{ fontSize: 16 }}>{item.icon}</span>\n <span>{item.label}</span>\n {item.badge !== undefined && item.badge > 0 && (\n <Badge\n count={item.badge}\n size=\"small\"\n className={navStyles.navBadge}\n style={{ backgroundColor: token.colorPrimary }}\n />\n )}\n </button>\n {capabilitiesExpanded && (\n <div className={navStyles.navSub}>\n {capabilityGroupOrder.map((cat) => (\n <div key={cat}>\n <div className={navStyles.navGroupLabel}>\n {CATEGORY_LABELS[cat] || cat}\n </div>\n {capabilityGroups.get(cat)?.map((m) => (\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={activeSection === \"middleware\" && activeMiddlewareType === m.type}\n key={m.id}\n className={`${navStyles.navSubItem} ${activeSection === \"middleware\" && activeMiddlewareType === m.type ? \"active\" : \"\"}`}\n onClick={() => {\n setActiveMiddlewareType(m.type);\n setActiveSection(\"middleware\");\n }}\n >\n <span\n className={navStyles.navStatusDot}\n style={{\n backgroundColor: m.enabled\n ? token.colorSuccess\n : token.colorBorder,\n }}\n />\n <span\n style={{\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {m.name}\n </span>\n </button>\n ))}\n </div>\n ))}\n </div>\n )}\n </React.Fragment>\n );\n })}\n </div>\n\n <div className={styles.content}>\n {configurationReady ? sectionContent[activeSection] : (\n <div style={{ minHeight: \"100%\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>\n <Space direction=\"vertical\" align=\"center\">\n <Spin />\n <Text type=\"secondary\">Loading agent configuration...</Text>\n </Space>\n </div>\n )}\n </div>\n </div>\n\n {/* Footer */}\n <div className={styles.footer}>\n <Text\n data-testid=\"config-footer-hint\"\n className={styles.footerHint}\n type={dirty ? \"warning\" : \"secondary\"}\n >\n {dirty\n ? \"Unsaved changes\"\n : onSave\n ? \"Changes will be saved to this agent\"\n : \"Viewing agent configuration\"}\n </Text>\n <Space>\n <Button onClick={onClose}>Close</Button>\n {onSave && (\n <Button\n aria-label=\"Save\"\n type=\"primary\"\n icon={<SaveOutlined />}\n loading={saving}\n disabled={!configurationReady}\n onClick={handleSave}\n >\n Save\n </Button>\n )}\n </Space>\n </div>\n </div>\n\n {/* System Prompt Expand Modal */}\n <Modal\n title=\"System Prompt\"\n open={isPromptModalOpen}\n onCancel={() => setIsPromptModalOpen(false)}\n width={800}\n footer={[\n <Button key=\"cancel\" onClick={() => setIsPromptModalOpen(false)}>\n Close\n </Button>,\n <Button key=\"done\" type=\"primary\" onClick={() => setIsPromptModalOpen(false)}>\n Done\n </Button>,\n ]}\n >\n <Input.TextArea\n aria-label=\"System Prompt\"\n value={agentPrompt}\n onChange={(e) => setAgentPrompt(e.target.value)}\n rows={16}\n style={{\n width: \"100%\",\n fontFamily: \"monospace\",\n fontSize: 13,\n lineHeight: 1.7,\n resize: \"vertical\",\n minHeight: 300,\n }}\n />\n </Modal>\n\n {/* Delete Confirmation Modal */}\n <Modal\n title=\"Delete Agent\"\n open={isDeleteModalOpen}\n onCancel={() => setIsDeleteModalOpen(false)}\n footer={[\n <Button key=\"cancel\" onClick={() => setIsDeleteModalOpen(false)}>\n Cancel\n </Button>,\n <Button\n key=\"delete\"\n type=\"primary\"\n danger\n loading={deleting}\n onClick={handleDelete}\n >\n Delete\n </Button>,\n ]}\n >\n <Text>\n Are you sure you want to delete <Text strong>{assistant.name}</Text> ? This action cannot be undone.\n </Text>\n </Modal>\n </>\n );\n\n if (embedded) {\n return <div style={{ width: \"100%\", height: \"100%\", overflow: \"hidden\" }}>{panelContent}</div>;\n }\n\n return (\n <Modal\n open={visible}\n onCancel={onClose}\n width=\"88vw\"\n footer={null}\n closable={false}\n centered\n styles={{\n body: { padding: 0 },\n content: {\n borderRadius: 20,\n overflow: \"hidden\",\n padding: 0,\n },\n mask: { backdropFilter: \"blur(4px)\" },\n }}\n destroyOnHidden\n >\n {panelContent}\n </Modal>\n );\n};\n\nexport default AgentConfigPanel;\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Alert, Button, Modal, Space, Table, Tabs, Tag, Typography } from \"antd\";\nimport { Ban, CheckCircle2, Clipboard, Code2, Edit3, ExternalLink, Globe2, Trash2 } from \"lucide-react\";\nimport type { AgentWebApp, Assistant, CreateAgentWebAppInput, Project, UpdateAgentWebAppInput } from \"@axiom-lattice/client-sdk\";\nimport { useClient } from \"../../context\";\nimport { readAuthItem } from \"../../utils/authStorage\";\nimport { useAuth } from \"../../context/AuthContext\";\nimport { useWorkspaceContext } from \"../../context/WorkspaceContext\";\nimport { AgentChatApp } from \"../../integrations/web-app/console-chat/AgentChatApp\";\nimport { EntityListView } from \"../EntityList/EntityListView\";\nimport type { EntityAction } from \"../EntityList/types\";\nimport { AgentWebAppFormModal } from \"./AgentWebAppFormModal\";\n\nconst { Text } = Typography;\ninterface ModelOption { key: string; displayName?: string; model?: string }\n\nconst errorMessage = (error: unknown): string => error instanceof Error ? error.message : \"Request failed\";\n\nfunction consolePreviewFetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n const token = readAuthItem(\"lattice_token\");\n const headers = new Headers(init?.headers);\n if (token) headers.set(\"Authorization\", `Bearer ${token}`);\n headers.set(\"X-Axiom-Web-App-Preview\", \"true\");\n return globalThis.fetch(input, { ...init, headers });\n}\n\nexport interface AgentWebAppIntegrationExamples { embed: string; agentChat: string; composable: string; hooks: string }\n\nexport const buildAgentWebAppIntegrationExamples = (app: AgentWebApp, gatewayUrl: string): AgentWebAppIntegrationExamples => {\n const prelude = `import '@axiom-lattice/react-sdk/web-app/styles.css';\\n\\ninterface ExampleProps {\\n currentUser: { id: string; name?: string };\\n}`;\n const provider = (body: string): string => `<AgentWebAppProvider gatewayUrl=\"${gatewayUrl}\" webAppId=\"${app.id}\" identity={{ mode: 'unverified', userId: currentUser.id, displayName: currentUser.name }}>\\n${body}\\n </AgentWebAppProvider>`;\n return {\n embed: `<script>\\n window.AxiomChatSettings = {\\n gatewayUrl: \"${gatewayUrl}\",\\n webAppId: \"${app.id}\",\\n userId: \"current-user-id\" // stable per-user subject\\n };\\n</script>\\n<script src=\"${gatewayUrl}/embed/agent-chat-loader.js\" defer></script>`,\n agentChat: `import { AgentChatApp } from '@axiom-lattice/react-sdk';\\nimport '@axiom-lattice/react-sdk/styles.css';\\nimport 'antd/dist/reset.css';\\n\\ninterface ExampleProps {\\n currentUser: { id: string; name?: string };\\n}\\n\\nexport function AgentChatExample({ currentUser }: ExampleProps) {\\n // Runs the full Console chat stack (LatticeChat + thread history) against\\n // this web app over the runtime mirror — npm SDK path with full control.\\n return (\\n <AgentChatApp\\n gatewayUrl=\"${gatewayUrl}\"\\n webAppId=\"${app.id}\"\\n identity={{ mode: 'unverified', userId: currentUser.id, displayName: currentUser.name }}\\n />\\n );\\n}`,\n composable: `import { AgentWebAppProvider, WidgetProjectSelector, WidgetThreadList, WidgetMessageList, WidgetComposer } from '@axiom-lattice/react-sdk/web-app';\\n${prelude}\\n\\nexport function ComposableExample({ currentUser }: ExampleProps) {\\n return (\\n ${provider(\" <main>\\n <WidgetProjectSelector />\\n <WidgetThreadList />\\n <WidgetMessageList />\\n <WidgetComposer />\\n </main>\")}\\n );\\n}`,\n hooks: `import { AgentWebAppProvider, useAgentWebApp, useWidgetProject, useWidgetThreads, useWidgetChat } from '@axiom-lattice/react-sdk/web-app';\\n${prelude}\\n\\nfunction RuntimeStatus() {\\n const runtime = useAgentWebApp();\\n const project = useWidgetProject();\\n const threads = useWidgetThreads();\\n const chat = useWidgetChat();\\n return <p>{runtime.bootstrap?.webApp.name}: {project.projectId ?? 'No project'}, {threads.threads.length} threads, {chat.messages.length} messages</p>;\\n}\\n\\nexport function HooksExample({ currentUser }: ExampleProps) {\\n return (\\n ${provider(\" <RuntimeStatus />\")}\\n );\\n}`,\n };\n};\n\nexport interface AgentWebAppsPanelProps { assistant: Assistant }\n\nconst EMBED_SNIPPET_PRE_STYLE: React.CSSProperties = { whiteSpace: \"pre-wrap\", overflow: \"auto\", background: \"#111827\", color: \"#e5e7eb\", padding: 16, borderRadius: 10 };\n\ninterface ZeroCodeSettingRow { name: string; type: string; description: string }\nconst ZERO_CODE_SETTING_ROWS: ZeroCodeSettingRow[] = [\n { name: \"webAppId\", type: \"string · required\", description: \"Publication id (not the Agent id). Missing → the loader warns and does not start.\" },\n { name: \"userId\", type: \"string · required\", description: \"Stable per-user subject. ^[A-Za-z0-9._:@-]+$, ≤128 chars. Missing/invalid → the chat does not start and onError fires with USER_ID_REQUIRED.\" },\n { name: \"gatewayUrl\", type: \"string\", description: \"Gateway URL (defaults to the loader script's own origin). Trailing slashes are trimmed.\" },\n { name: \"mode\", type: '\"bubble\" | \"inline\"', description: 'Bubble popup (default) or embed into the containerSelector element.' },\n { name: \"containerSelector\", type: \"string\", description: \"Required for inline mode. Falls back to body with a console warning when not found.\" },\n { name: \"bubble\", type: \"boolean · default true\", description: \"false = no launcher button; drive the panel with open()/hide().\" },\n { name: \"width / height\", type: \"number · 380 / 640\", description: \"Bubble panel size, clamped to the viewport (min 240).\" },\n { name: \"position\", type: '\"bottom-right\" | \"bottom-left\"', description: \"Horizontal anchor for the launcher and panel.\" },\n { name: \"offsetX / offsetY\", type: \"number · 20\", description: \"Viewport margin. Nested form also supported: offset: { x, y }.\" },\n { name: \"zIndex\", type: \"number · 9999\", description: \"Panel stacking (the launcher sits at zIndex + 1).\" },\n { name: \"welcome\", type: \"string\", description: \"Chat empty-state welcome; overrides the publication appearance.welcomeMessage.\" },\n { name: \"quicks\", type: \"{ label, text }[]\", description: \"Chat empty-state quick prompts (≤6; label 1-40, text 1-500; invalid entries dropped). Overrides appearance.quickPrompts entirely when provided; clicking one sends its text.\" },\n];\n\ninterface ZeroCodeApiRow { api: string; behavior: string }\nconst ZERO_CODE_API_ROWS: ZeroCodeApiRow[] = [\n { api: \"AxiomChat.open() / hide() / toggle()\", behavior: \"Show, hide, or toggle the panel. No-ops in inline mode (the chat is always visible in its container).\" },\n { api: \"AxiomChat.sendMessage(text)\", behavior: \"Send a message programmatically — rendered in the UI like a typed message and streamed from the server. Trimmed non-empty, ≤32768 chars; automatically queued while the chat is busy; before onReady it is buffered and flushed on ready. Send failures show the chat's own inline error banner.\" },\n { api: \"AxiomChat.mount(settings) / AxiomChat.get(id)\", behavior: \"Mount additional independent chats (different webAppIds) on one page; returns an instance handle with the full API (open/hide/toggle/sendMessage/onReady/onMessage/onError). get(id) retrieves a mounted handle; without global settings the default-instance delegates warn and no-op.\" },\n];\n\ninterface ZeroCodeEventRow { event: string; payload: string; when: string }\nconst ZERO_CODE_EVENT_ROWS: ZeroCodeEventRow[] = [\n { event: '[\"onReady\", cb]', payload: \"—\", when: \"The chat can send/receive (handshake complete, thread ready). Buffered sends flush immediately after.\" },\n { event: '[\"onMessage\", cb]', payload: '{ role: \"human\" | \"ai\", content: string }', when: \"Per accepted message: your sent message (server echo) and each completed AI reply (final text — not per-token). Boot-time history is not replayed; the baseline resets per thread. Structured content is not included.\" },\n { event: '[\"onError\", cb]', payload: '{ code: string, message: string }', when: \"WEB_APP_NOT_FOUND · WEB_APP_DISABLED · USER_ID_REQUIRED · PROJECT_NOT_ALLOWED · MODEL_NOT_ALLOWED · FEATURE_DISABLED · INVALID_REQUEST · STREAM_FAILED\" },\n];\n\nexport const AgentWebAppsPanel: React.FC<AgentWebAppsPanelProps> = ({ assistant }) => {\n const client = useClient(\"__GLOBAL__\");\n const { user, currentTenant, baseURL } = useAuth();\n const { projects: workspaceProjects } = useWorkspaceContext();\n const [apps, setApps] = useState<AgentWebApp[]>([]);\n const [models, setModels] = useState<ModelOption[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [formTarget, setFormTarget] = useState<AgentWebApp | \"create\" | null>(null);\n const [formError, setFormError] = useState<string | null>(null);\n const [submitting, setSubmitting] = useState(false);\n const [deleteTarget, setDeleteTarget] = useState<AgentWebApp | null>(null);\n const [deleting, setDeleting] = useState(false);\n const [mutationActive, setMutationActive] = useState(false);\n const [previewTarget, setPreviewTarget] = useState<AgentWebApp | null>(null);\n const [guideTarget, setGuideTarget] = useState<AgentWebApp | null>(null);\n const requestGeneration = useRef(0);\n const modelGeneration = useRef(0);\n const mutationGeneration = useRef(0);\n const mutationActiveRef = useRef(false);\n\n const projects = Array.from(new Map(workspaceProjects.map((project) => [project.id, project])).values()) as Project[];\n\n const load = useCallback(async (): Promise<void> => {\n const generation = ++requestGeneration.current;\n setLoading(true);\n setError(null);\n try {\n const result = await client.webApps.list({ assistantId: assistant.id });\n if (generation === requestGeneration.current) setApps(result.records);\n } catch (cause) {\n if (generation === requestGeneration.current) setError(errorMessage(cause));\n } finally {\n if (generation === requestGeneration.current) setLoading(false);\n }\n }, [assistant.id, client, currentTenant?.id]);\n\n useEffect(() => {\n setApps([]);\n setFormTarget(null);\n setDeleteTarget(null);\n setPreviewTarget(null);\n setGuideTarget(null);\n setSubmitting(false);\n setDeleting(false);\n setMutationActive(false);\n mutationActiveRef.current = false;\n mutationGeneration.current += 1;\n void load();\n return () => { requestGeneration.current += 1; mutationGeneration.current += 1; };\n }, [load]);\n useEffect(() => {\n const generation = ++modelGeneration.current;\n void client.request<{ data: ModelOption[] }>(\"/api/models\").then((result) => {\n if (generation === modelGeneration.current) setModels(result.data ?? []);\n }).catch(() => {\n if (generation === modelGeneration.current) setModels([]);\n });\n return () => { modelGeneration.current += 1; };\n }, [client]);\n\n const mutate = async (operation: () => Promise<unknown>): Promise<void> => {\n if (mutationActiveRef.current) return;\n mutationActiveRef.current = true;\n setMutationActive(true);\n const generation = ++mutationGeneration.current;\n setError(null);\n try {\n await operation();\n if (generation === mutationGeneration.current) await load();\n } catch (cause) {\n if (generation === mutationGeneration.current) setError(errorMessage(cause));\n } finally {\n if (generation === mutationGeneration.current) {\n mutationActiveRef.current = false;\n setMutationActive(false);\n }\n }\n };\n\n const submit = async (input: CreateAgentWebAppInput | UpdateAgentWebAppInput): Promise<void> => {\n if (mutationActiveRef.current) return;\n mutationActiveRef.current = true;\n setMutationActive(true);\n const generation = ++mutationGeneration.current;\n setSubmitting(true);\n setFormError(null);\n try {\n if (formTarget === \"create\") await client.webApps.create(input as CreateAgentWebAppInput);\n else if (formTarget) await client.webApps.update(formTarget.id, input as UpdateAgentWebAppInput);\n if (generation === mutationGeneration.current) {\n setFormTarget(null);\n await load();\n }\n } catch (cause) {\n if (generation === mutationGeneration.current) setFormError(errorMessage(cause));\n } finally {\n if (generation === mutationGeneration.current) {\n mutationActiveRef.current = false;\n setMutationActive(false);\n setSubmitting(false);\n }\n }\n };\n\n const copy = async (text: string): Promise<void> => {\n setError(null);\n try {\n if (!navigator.clipboard) throw new Error(\"Clipboard unavailable\");\n await navigator.clipboard.writeText(text);\n } catch (cause) { setError(errorMessage(cause)); }\n };\n\n const actions = (app: AgentWebApp): EntityAction<AgentWebApp>[] => [\n { key: \"edit\", icon: Edit3, label: \"Edit\", disabled: mutationActive, onClick: setFormTarget },\n { key: \"toggle\", icon: app.status === \"active\" ? Ban : CheckCircle2, label: app.status === \"active\" ? \"Disable\" : \"Enable\", disabled: mutationActive, onClick: (item) => void mutate(() => item.status === \"active\" ? client.webApps.disable(item.id) : client.webApps.enable(item.id)) },\n { key: \"preview\", icon: ExternalLink, label: \"Preview\", disabled: mutationActive, onClick: setPreviewTarget },\n { key: \"guide\", icon: Code2, label: \"Integration guide\", disabled: mutationActive, onClick: setGuideTarget },\n { key: \"copy\", icon: Clipboard, label: \"Copy Web App ID\", disabled: mutationActive, onClick: (item) => void copy(item.id) },\n { key: \"delete\", icon: Trash2, label: \"Delete\", danger: true, disabled: mutationActive, onClick: setDeleteTarget },\n ];\n\n const confirmDelete = async (): Promise<void> => {\n if (!deleteTarget || mutationActiveRef.current) return;\n mutationActiveRef.current = true;\n setMutationActive(true);\n const generation = ++mutationGeneration.current;\n setDeleting(true);\n try {\n await client.webApps.delete(deleteTarget.id);\n if (generation === mutationGeneration.current) { setDeleteTarget(null); await load(); }\n } catch (cause) {\n if (generation === mutationGeneration.current) setError(errorMessage(cause));\n } finally {\n if (generation === mutationGeneration.current) {\n mutationActiveRef.current = false;\n setMutationActive(false);\n setDeleting(false);\n }\n }\n };\n\n return (\n <div style={{ height: \"100%\", overflow: \"auto\", padding: 16 }}>\n <Alert type=\"warning\" showIcon message=\"Unverified identity\" description=\"Web Apps trust the external user ID supplied by the embedding application. Do not use it as proof of authentication.\" style={{ marginBottom: 16 }} />\n {error && <Alert role=\"alert\" type=\"error\" message={error} action={<Button size=\"small\" onClick={() => void load()}>Retry</Button>} style={{ marginBottom: 16 }} />}\n <EntityListView<AgentWebApp>\n title=\"Web Apps\" itemName=\"app\" items={apps} loading={loading} keyExtractor={(app) => app.id}\n createLabel={mutationActive ? undefined : \"Create Web App\"} onCreateClick={mutationActive ? undefined : () => { setFormError(null); setFormTarget(\"create\"); }}\n renderIcon={() => <Globe2 size={22} color=\"#6366f1\" />}\n renderPrimary={(app) => app.name}\n renderSecondary={(app) => app.description ?? app.id}\n renderHeaderActions={(app) => <Tag color={app.status === \"active\" ? \"green\" : app.status === \"disabled\" ? \"default\" : \"gold\"}>{app.status}</Tag>}\n renderDetails={(app) => <Text type=\"secondary\">{app.scope.allowedProjectIds.length} project{app.scope.allowedProjectIds.length === 1 ? \"\" : \"s\"} · react_sdk</Text>}\n itemActions={actions} actionsPosition=\"always\" showViewToggle={false}\n emptyTitle=\"No Web Apps\" emptyDescription=\"Create a React SDK publication for this agent.\"\n />\n <AgentWebAppFormModal open={formTarget !== null} assistantId={assistant.id} value={formTarget === \"create\" ? null : formTarget} projects={projects} models={models} submitting={submitting} error={formError} onCancel={() => setFormTarget(null)} onSubmit={submit} />\n <Modal title=\"Delete Web App\" open={deleteTarget !== null} onCancel={() => setDeleteTarget(null)} onOk={() => void confirmDelete()} okText=\"Delete\" okButtonProps={{ danger: true, loading: deleting }}>\n <p>Delete “{deleteTarget?.name}”? This action cannot be undone.</p>\n </Modal>\n <Modal title=\"Preview\" open={previewTarget !== null} onCancel={() => setPreviewTarget(null)} footer={<Button onClick={() => setPreviewTarget(null)}>Close</Button>} width={900}>\n {!baseURL ? <Alert type=\"warning\" message=\"Gateway URL unavailable\" />\n : previewTarget && previewTarget.status === \"active\" ? (\n <iframe src={`${baseURL}/api/web-apps/${previewTarget.id}/chat?mode=embed`} title=\"Web App preview\" style={{ width: \"100%\", height: 640, border: \"1px solid #d9d9d9\", borderRadius: 8 }} />\n ) : previewTarget ? (\n <div>\n <Alert type=\"info\" showIcon message=\"Draft preview\" description=\"This renders the in-page console chat so you can inspect draft content. Enable the publication to preview the exact embed experience external users get.\" style={{ marginBottom: 16 }} />\n <AgentChatApp gatewayUrl={baseURL} webAppId={previewTarget.id} identity={{ mode: \"unverified\", userId: `console-preview:${user?.id ?? \"unknown\"}:${previewTarget.id}`, displayName: user?.name }} fetch={consolePreviewFetch} />\n </div>\n ) : null}\n </Modal>\n <Modal title=\"Integration guide\" open={guideTarget !== null} onCancel={() => setGuideTarget(null)} footer={<Space><Button onClick={() => guideTarget && void copy(Object.values(buildAgentWebAppIntegrationExamples(guideTarget, baseURL)).join(\"\\n\\n\"))}>Copy examples</Button><Button type=\"primary\" onClick={() => setGuideTarget(null)}>Close</Button></Space>} width={900}>\n {guideTarget && (\n <Tabs\n defaultActiveKey=\"zero-code\"\n items={[\n {\n key: \"zero-code\",\n label: \"Zero-code script loader\",\n children: (\n <>\n <Typography.Paragraph type=\"secondary\" style={{ marginTop: 0 }}>\n One script tag — the full Console-style chat runs in an isolated iframe on the gateway origin. No build step, no npm install.\n </Typography.Paragraph>\n <pre style={EMBED_SNIPPET_PRE_STYLE}>{buildAgentWebAppIntegrationExamples(guideTarget, baseURL).embed}</pre>\n <Typography.Title level={5} style={{ marginTop: 24 }}>Configuration — window.AxiomChatSettings</Typography.Title>\n <Table size=\"small\" style={{ marginBottom: 8 }} pagination={false} rowKey=\"name\"\n columns={[\n { title: \"Key\", dataIndex: \"name\", key: \"name\", width: 160 },\n { title: \"Type\", dataIndex: \"type\", key: \"type\", width: 180 },\n { title: \"Description\", dataIndex: \"description\", key: \"description\" },\n ]}\n dataSource={ZERO_CODE_SETTING_ROWS}\n />\n <Typography.Title level={5}>JS API — window.AxiomChat</Typography.Title>\n <Typography.Paragraph type=\"secondary\">\n Property and command forms are equivalent; register callbacks or actions before the loader loads with the array form\n ({\"window.AxiomChat = [[\\\"onMessage\\\", fn], [\\\"open\\\"]]\"} — replayed in order on load).\n </Typography.Paragraph>\n <Table size=\"small\" style={{ marginBottom: 8 }} pagination={false} rowKey=\"api\"\n columns={[\n { title: \"API\", dataIndex: \"api\", key: \"api\", width: 280 },\n { title: \"Behavior\", dataIndex: \"behavior\", key: \"behavior\" },\n ]}\n dataSource={ZERO_CODE_API_ROWS}\n />\n <Typography.Title level={5}>Events</Typography.Title>\n <Table size=\"small\" style={{ marginBottom: 8 }} pagination={false} rowKey=\"event\"\n columns={[\n { title: \"Register\", dataIndex: \"event\", key: \"event\", width: 220 },\n { title: \"Payload\", dataIndex: \"payload\", key: \"payload\", width: 280 },\n { title: \"When\", dataIndex: \"when\", key: \"when\" },\n ]}\n dataSource={ZERO_CODE_EVENT_ROWS}\n />\n <Alert\n style={{ marginTop: 8 }}\n type=\"warning\"\n showIcon\n message=\"Host trust and limits\"\n description=\"The host page can send messages and read new conversation content — only embed on trusted pages. One streaming reply at a time; loading the loader twice is unsupported. Not available yet: unread callbacks, runtime theme updates, verified setIdentity, token-level streaming events.\"\n />\n </>\n ),\n },\n {\n key: \"npm-sdk\",\n label: \"npm SDK\",\n children: (\n <>\n <Typography.Paragraph type=\"secondary\" style={{ marginTop: 0 }}>\n React applications — the same chat stack as a first-class component in your page, fully composable.\n </Typography.Paragraph>\n <Text strong>Full chat — AgentChatApp</Text>\n <pre style={EMBED_SNIPPET_PRE_STYLE}>{buildAgentWebAppIntegrationExamples(guideTarget, baseURL).agentChat}</pre>\n <Text strong>Composable widgets</Text>\n <pre style={EMBED_SNIPPET_PRE_STYLE}>{buildAgentWebAppIntegrationExamples(guideTarget, baseURL).composable}</pre>\n <Text strong>Hooks</Text>\n <pre style={EMBED_SNIPPET_PRE_STYLE}>{buildAgentWebAppIntegrationExamples(guideTarget, baseURL).hooks}</pre>\n </>\n ),\n },\n ]}\n />\n )}\n </Modal>\n </div>\n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport { Button, Checkbox, Form, Input, Modal, Select, Space, Typography } from \"antd\";\nimport type { AgentWebApp, CreateAgentWebAppInput, Project, UpdateAgentWebAppInput } from \"@axiom-lattice/client-sdk\";\n\nconst { Text } = Typography;\n\ninterface ModelOption { key: string; displayName?: string; model?: string }\n\nexport interface AgentWebAppFormModalProps {\n open: boolean;\n assistantId: string;\n value: AgentWebApp | null;\n projects: Project[];\n models: ModelOption[];\n submitting: boolean;\n error: string | null;\n onCancel: () => void;\n onSubmit: (input: CreateAgentWebAppInput | UpdateAgentWebAppInput) => Promise<void>;\n}\n\ninterface FormValue {\n name: string;\n description?: string;\n defaultProjectId: string;\n allowedProjectIds: string[];\n defaultModelKey?: string;\n allowedModelKeys?: string[];\n projectSelector: boolean;\n modelSelector: boolean;\n threadManagement: boolean;\n attachments: boolean;\n hitl: boolean;\n genUI: boolean;\n files?: boolean;\n title?: string;\n welcomeMessage?: string;\n primaryColor?: string;\n quickPrompts?: Array<{ label?: string; text?: string }>;\n identityPolicy?: \"unverified\" | \"verified\" | \"both\";\n identityIssuers?: string;\n}\n\nconst initialFeatures = { projectSelector: false, modelSelector: false, threadManagement: true, attachments: true, hitl: true, genUI: true, files: false };\n\nexport const AgentWebAppFormModal: React.FC<AgentWebAppFormModalProps> = ({ open, assistantId, value, projects, models, submitting, error, onCancel, onSubmit }) => {\n const [form] = Form.useForm<FormValue>();\n const [multiProject, setMultiProject] = useState(false);\n const [multiModel, setMultiModel] = useState(false);\n\n useEffect(() => {\n if (!open) return;\n const features = value?.features ?? initialFeatures;\n setMultiProject(features.projectSelector);\n setMultiModel(features.modelSelector);\n form.setFieldsValue({\n name: value?.name ?? \"\",\n description: value?.description,\n defaultProjectId: value?.scope.defaultProjectId ?? projects[0]?.id,\n allowedProjectIds: value?.scope.allowedProjectIds ?? (projects[0] ? [projects[0].id] : []),\n defaultModelKey: value?.scope.defaultModelKey,\n allowedModelKeys: value?.scope.allowedModelKeys,\n ...features,\n title: value?.appearance.title,\n welcomeMessage: value?.appearance.welcomeMessage,\n primaryColor: value?.appearance.primaryColor,\n quickPrompts: value?.appearance.quickPrompts,\n identityPolicy: value?.identity?.policy ?? \"unverified\",\n identityIssuers: value?.identity ? JSON.stringify(value.identity.issuers, null, 2) : undefined,\n });\n }, [form, open, projects, value]);\n\n const submit = async (): Promise<void> => {\n const fields = await form.validateFields();\n const allowedProjectIds = fields.projectSelector\n ? Array.from(new Set(fields.allowedProjectIds ?? []))\n : [fields.defaultProjectId];\n const allowedModelKeys = fields.modelSelector\n ? Array.from(new Set([...(fields.defaultModelKey ? [fields.defaultModelKey] : []), ...(fields.allowedModelKeys ?? [])]))\n : fields.defaultModelKey ? [fields.defaultModelKey] : undefined;\n let identity: CreateAgentWebAppInput[\"identity\"];\n const policy = fields.identityPolicy ?? \"unverified\";\n if (policy !== \"unverified\") {\n let issuers: NonNullable<CreateAgentWebAppInput[\"identity\"]>[\"issuers\"];\n try {\n issuers = JSON.parse(fields.identityIssuers ?? \"\") as typeof issuers;\n } catch {\n throw new Error(\"Trusted issuers must be a valid JSON array\");\n }\n if (!Array.isArray(issuers) || issuers.length === 0) {\n throw new Error(\"Verified identity requires at least one trusted issuer\");\n }\n identity = { policy, issuers };\n }\n const quickPrompts = (fields.quickPrompts ?? [])\n .map((prompt) => ({\n label: (prompt?.label ?? \"\").trim(),\n text: (prompt?.text ?? \"\").trim(),\n }))\n .filter((prompt) => prompt.label.length > 0 && prompt.text.length > 0);\n const shared = {\n name: fields.name.trim(),\n description: fields.description?.trim() || undefined,\n scope: {\n defaultProjectId: fields.defaultProjectId,\n allowedProjectIds,\n defaultModelKey: fields.defaultModelKey || undefined,\n allowedModelKeys,\n },\n features: {\n projectSelector: fields.projectSelector,\n modelSelector: fields.modelSelector,\n threadManagement: fields.threadManagement,\n attachments: fields.attachments,\n hitl: fields.hitl,\n genUI: fields.genUI,\n files: fields.files ?? false,\n },\n appearance: {\n title: fields.title?.trim() || undefined,\n welcomeMessage: fields.welcomeMessage?.trim() || undefined,\n primaryColor: fields.primaryColor?.trim() || undefined,\n ...(quickPrompts.length > 0 ? { quickPrompts } : {}),\n },\n identity,\n };\n await onSubmit(value ? shared : { ...shared, assistantId, integration: { type: \"react_sdk\" as const } });\n };\n\n const projectOptions = projects.map((project) => ({ value: project.id, label: project.name }));\n const modelOptions = models.map((model) => ({ value: model.key, label: model.displayName ?? model.model ?? model.key }));\n\n return (\n <Modal title={value ? \"Edit Web App\" : \"Create Web App\"} open={open} onCancel={onCancel} onOk={() => void submit().catch(() => undefined)} okText={value ? \"Save\" : \"Create\"} confirmLoading={submitting} width={720} destroyOnHidden>\n {error && <div role=\"alert\" style={{ color: \"#ef4444\", marginBottom: 12 }}>{error}</div>}\n <Form form={form} layout=\"vertical\" initialValues={initialFeatures}>\n <Form.Item name=\"name\" label=\"Name\" rules={[{ required: true, whitespace: true }, { max: 120, message: \"Name must be 120 characters or fewer\" }]}><Input aria-label=\"Name\" maxLength={121} /></Form.Item>\n <Form.Item name=\"description\" label=\"Description\" rules={[{ max: 1000, message: \"Description must be 1000 characters or fewer\" }]}><Input.TextArea aria-label=\"Description\" maxLength={1001} /></Form.Item>\n <Text strong>Project scope</Text>\n <Form.Item name=\"projectSelector\" valuePropName=\"checked\"><Checkbox aria-label=\"Project selector\" onChange={(event) => setMultiProject(event.target.checked)}>Project selector</Checkbox></Form.Item>\n <Form.Item name=\"allowedProjectIds\" label=\"Allowed projects\" dependencies={[\"defaultProjectId\", \"projectSelector\"]} rules={multiProject ? [\n { required: true, message: \"Select at least one project\" },\n { validator: (_, ids: string[] | undefined) => (ids ?? []).every((id) => projectOptions.some((option) => option.value === id)) ? Promise.resolve() : Promise.reject(new Error(\"Select valid allowed projects\")) },\n { validator: (_, ids: string[] | undefined) => (ids ?? []).includes(form.getFieldValue(\"defaultProjectId\")) ? Promise.resolve() : Promise.reject(new Error(\"Default project must be in allowed projects\")) },\n ] : undefined}>\n <Select aria-label=\"Allowed projects\" mode=\"multiple\" disabled={!multiProject} options={projectOptions} />\n </Form.Item>\n <Form.Item name=\"defaultProjectId\" label=\"Default project\" rules={[\n { required: true },\n { validator: (_, id: string | undefined) => !id || projectOptions.some((option) => option.value === id) ? Promise.resolve() : Promise.reject(new Error(\"Select a valid default project\")) },\n ]}>\n <Select aria-label=\"Default project\" options={projectOptions} />\n </Form.Item>\n <Text strong>Model scope (optional)</Text>\n <Form.Item name=\"modelSelector\" valuePropName=\"checked\"><Checkbox aria-label=\"Model selector\" onChange={(event) => setMultiModel(event.target.checked)}>Model selector</Checkbox></Form.Item>\n <Form.Item name=\"allowedModelKeys\" label=\"Allowed models\" dependencies={[\"defaultModelKey\", \"modelSelector\"]} rules={multiModel ? [\n { validator: (_, keys: string[] | undefined) => (keys?.length || form.getFieldValue(\"defaultModelKey\")) ? Promise.resolve() : Promise.reject(new Error(\"Select at least one model\")) },\n { validator: (_, keys: string[] | undefined) => (keys ?? []).every((key) => modelOptions.some((option) => option.value === key)) ? Promise.resolve() : Promise.reject(new Error(\"Select valid allowed models\")) },\n ] : undefined}><Select aria-label=\"Allowed models\" mode=\"multiple\" allowClear disabled={!multiModel} options={modelOptions} /></Form.Item>\n <Form.Item name=\"defaultModelKey\" label=\"Default model\" rules={[\n { validator: (_, key: string | undefined) => !key || modelOptions.some((option) => option.value === key) ? Promise.resolve() : Promise.reject(new Error(\"Select a valid default model\")) },\n ]}><Select aria-label=\"Default model\" allowClear options={modelOptions} /></Form.Item>\n <Text strong>Features</Text>\n <Space wrap>\n {([\"threadManagement\", \"attachments\", \"hitl\", \"genUI\", \"files\"] as const).map((key) => (\n <Form.Item key={key} name={key} valuePropName=\"checked\" noStyle><Checkbox aria-label={key}>{key}</Checkbox></Form.Item>\n ))}\n </Space>\n <div style={{ marginTop: 20 }}><Text strong>Appearance</Text></div>\n <Form.Item name=\"title\" label=\"Title\" rules={[{ max: 120, message: \"Title must be 120 characters or fewer\" }]}><Input aria-label=\"Title\" maxLength={121} /></Form.Item>\n <Form.Item name=\"welcomeMessage\" label=\"Welcome message\" rules={[{ max: 1000, message: \"Welcome message must be 1000 characters or fewer\" }]}><Input.TextArea aria-label=\"Welcome message\" maxLength={1001} /></Form.Item>\n <Form.Item name=\"primaryColor\" label=\"Primary color\" rules={[{ pattern: /^#[0-9A-Fa-f]{6}$/, message: \"Use a #RRGGBB color\", transform: (input) => input || undefined }]}><Input aria-label=\"Primary color\" placeholder=\"#6366f1\" /></Form.Item>\n <div style={{ marginTop: 12 }}><Text strong>Quick prompts</Text></div>\n <Form.List name=\"quickPrompts\">\n {(fields, { add, remove }) => (\n <>\n {fields.map((field) => (\n <Space key={field.key} align=\"baseline\" style={{ display: \"flex\", marginBottom: 8 }}>\n <Form.Item\n name={[field.name, \"label\"]}\n rules={[\n { required: true, whitespace: true, message: \"Quick prompt label is required\" },\n { max: 40, message: \"Quick prompt label must be 40 characters or fewer\" },\n ]}\n >\n <Input aria-label={`Quick prompt label ${field.name + 1}`} placeholder=\"Label\" maxLength={41} />\n </Form.Item>\n <Form.Item\n name={[field.name, \"text\"]}\n rules={[\n { required: true, whitespace: true, message: \"Quick prompt message is required\" },\n { max: 500, message: \"Quick prompt message must be 500 characters or fewer\" },\n ]}\n >\n <Input aria-label={`Quick prompt message ${field.name + 1}`} placeholder=\"Message text\" maxLength={501} style={{ width: 360 }} />\n </Form.Item>\n <Button aria-label={`Remove quick prompt ${field.name + 1}`} onClick={() => remove(field.name)}>Remove</Button>\n </Space>\n ))}\n <Button aria-label=\"Add quick prompt\" onClick={() => add({ label: \"\", text: \"\" })} disabled={fields.length >= 6}>Add quick prompt</Button>\n </>\n )}\n </Form.List>\n <div style={{ marginTop: 20 }}><Text strong>Identity</Text></div>\n <Form.Item name=\"identityPolicy\" label=\"Identity policy\" initialValue=\"unverified\">\n <Select aria-label=\"Identity policy\" options={[\n { value: \"unverified\", label: \"Unverified (header)\" },\n { value: \"both\", label: \"Verified token or header (migration)\" },\n { value: \"verified\", label: \"Verified tokens only\" },\n ]} />\n </Form.Item>\n <Form.Item\n name=\"identityIssuers\"\n label=\"Trusted issuers (JSON)\"\n tooltip='Required when the policy includes verified tokens. Example: [{\"iss\":\"https://host.example.com\",\"aud\":\"<webAppId>\",\"alg\":\"HS256\",\"secret\":\"...\"}]'\n dependencies={[\"identityPolicy\"]}\n rules={[{ validator: (_, text: string | undefined) => {\n if (form.getFieldValue(\"identityPolicy\") === \"unverified\" || text === undefined || text.trim() === \"\") return Promise.resolve();\n try {\n const parsed = JSON.parse(text);\n return Array.isArray(parsed) && parsed.length > 0 ? Promise.resolve() : Promise.reject(new Error(\"Provide a non-empty JSON array of issuers\"));\n } catch {\n return Promise.reject(new Error(\"Trusted issuers must be a valid JSON array\"));\n }\n } }]}\n ><Input.TextArea aria-label=\"Trusted issuers\" rows={3} placeholder='[{\"iss\":\"https://host.example.com\",\"aud\":\"<webAppId>\",\"alg\":\"HS256\",\"secret\":\"...\"}]' /></Form.Item>\n <Text type=\"secondary\">Integration type: react_sdk</Text>\n </Form>\n </Modal>\n );\n};\n","import React, { useMemo, useState } from \"react\";\nimport { Modal, Typography } from \"antd\";\nimport { InfoCircleOutlined } from \"@ant-design/icons\";\nimport { Workflow as WorkflowIcon } from \"lucide-react\";\nimport { ReactFlowProvider } from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport WorkflowCanvas from \"../Chat/WorkflowCanvas\";\nimport { expandWorkflow } from \"../Chat/WorkflowExpand\";\nimport type { ExpandedDSL } from \"../Chat/WorkflowExpand\";\nimport { MDResponse } from \"../GenUI/MDResponse\";\nimport { CanvasOverlay } from \"./CanvasOverlay\";\nimport { ArchitectCopilotDock } from \"./ArchitectCopilotDock\";\nimport type { InitialMessageRequest } from \"../Chat/InitialMessageSubmitter\";\nimport type { LearningTasksData } from \"./useEntityRefresher\";\nimport type { TaskFileRef } from \"@axiom-lattice/protocols\";\n\nconst { Text } = Typography;\n\n/** Extract the workflow DSL from an assistant graphDefinition (workflow type). */\nfunction extractWorkflowDSL(graphDefinition: unknown): ExpandedDSL | null {\n let def: Record<string, unknown> | null = null;\n if (typeof graphDefinition === \"string\") {\n try {\n def = JSON.parse(graphDefinition) as Record<string, unknown>;\n } catch {\n return null;\n }\n } else if (graphDefinition && typeof graphDefinition === \"object\") {\n def = graphDefinition as Record<string, unknown>;\n }\n if (!def) return null;\n if (typeof def.workflowYaml !== \"string\") return null;\n try {\n return expandWorkflow(def.workflowYaml);\n } catch {\n return null;\n }\n}\n\n/**\n * WorkflowAgentCanvas — the detail canvas for workflow-type agents: renders\n * the YAML DSL as a step graph (WorkflowCanvas) with the same floating HUD\n * and architect copilot as the config-graph canvas. Reuses the standalone\n * WorkflowCanvas/expandWorkflow modules; does not touch WorkflowAutomationView.\n */\nexport interface WorkflowAgentCanvasProps {\n graphDefinition: unknown;\n assistantId: string;\n assistantName: string;\n /** Workspace paired with projectId for the architect copilot's private scope. */\n workspaceId?: string | null;\n description?: string;\n initialMessageRequest?: InitialMessageRequest | null;\n onInitialMessageSubmitted?: (requestId: string) => void;\n projectId?: string | null;\n onProjectChange?: (projectId: string | null) => void;\n onLearningStarted?: (goal: string, roundTaskId: string, files?: TaskFileRef[]) => void;\n /** Called with every architect tool name (event-driven UI refresh). */\n onToolActivity?: (toolName: string) => void;\n /** Learning rounds + subtree, forwarded to the canvas overlay. */\n learningTasks?: LearningTasksData;\n /** Refetch learning tasks (after a round is created). */\n onLearningRefresh?: () => Promise<void>;\n /** Bumped (debounced) on run_eval tool activity. */\n evalTick?: number;\n /** Opens the agent-scoped evaluation suite list. */\n /** Hide the canvas's own top-right title pill (the detail view renders a unified one). */\n hideTitleBar?: boolean;\n /** HUD column top offset (56 on detail pages — leaves the pill strip exposed). */\n hudTopOffset?: number;\n /** Temporarily hide the copilot without interrupting its active session. */\n copilotTemporarilyHidden?: boolean;\n /** Called when the Builder surface is requested. */\n onOpenArchitect?: (trigger?: HTMLElement) => void;\n /** Parent-owned monotonic signal that reopens Architect after guarded transitions. */\n architectOpenSignal?: number;\n /** Focus target restored when the mobile Architect Drawer closes. */\n architectRestoreFocusRef?: React.RefObject<HTMLElement>;\n /** Opens the guarded Agent configuration dock. */\n}\n\nexport const WorkflowAgentCanvas: React.FC<WorkflowAgentCanvasProps> = ({\n graphDefinition,\n assistantId,\n assistantName,\n workspaceId,\n description,\n initialMessageRequest,\n onInitialMessageSubmitted,\n projectId,\n onProjectChange,\n onLearningStarted,\n onToolActivity,\n learningTasks,\n onLearningRefresh,\n evalTick,\n hideTitleBar = false,\n hudTopOffset,\n copilotTemporarilyHidden,\n onOpenArchitect,\n architectOpenSignal = 0,\n architectRestoreFocusRef,\n}) => {\n const [specOpen, setSpecOpen] = useState(false);\n const dsl = useMemo(() => extractWorkflowDSL(graphDefinition), [graphDefinition]);\n\n return (\n <div style={{ width: \"100%\", height: \"100%\", position: \"relative\", background: \"#fafafa\" }}>\n <ReactFlowProvider>\n <div style={{ width: \"100%\", height: \"100%\" }}>\n {dsl ? (\n <WorkflowCanvas dsl={dsl} />\n ) : (\n <div style={{ display: \"flex\", justifyContent: \"center\", alignItems: \"center\", height: \"100%\" }}>\n <Text type=\"secondary\">No workflow DSL yet — ask the architect to design one</Text>\n </div>\n )}\n </div>\n </ReactFlowProvider>\n\n {/* Top bar: name + spec (suppressed when the detail view renders its own pill) */}\n {!hideTitleBar && (\n <div\n style={{\n position: \"absolute\", top: 12, right: 12, zIndex: 10,\n display: \"flex\", alignItems: \"center\", gap: 6, height: 32,\n padding: \"0 14px\", background: \"rgba(255,255,255,0.95)\",\n borderRadius: 10, boxShadow: \"0 2px 12px rgba(0,0,0,0.08)\",\n border: \"1px solid #f0f0f0\",\n }}\n >\n <WorkflowIcon size={16} color=\"#6366f1\" />\n <Text strong style={{ fontSize: 13 }}>{assistantName}</Text>\n <InfoCircleOutlined\n style={{ color: \"#6366f1\", cursor: \"pointer\", fontSize: 15 }}\n onClick={() => setSpecOpen(true)}\n />\n </div>\n )}\n\n <CanvasOverlay\n assistantId={assistantId}\n projectId={projectId}\n onProjectChange={onProjectChange}\n onLearningStarted={onLearningStarted}\n learningTasks={learningTasks}\n topOffset={hudTopOffset}\n onLearningRefresh={onLearningRefresh}\n evalTick={evalTick}\n />\n\n <ArchitectCopilotDock\n assistantId={assistantId}\n assistantName={assistantName}\n workspaceId={workspaceId}\n projectId={projectId}\n contextType=\"workflow\"\n label=\"Builder\"\n initialMessageRequest={initialMessageRequest}\n onInitialMessageSubmitted={onInitialMessageSubmitted}\n onToolCompleted={(toolName) => onToolActivity?.(toolName)}\n temporarilyHidden={copilotTemporarilyHidden}\n openSignal={architectOpenSignal}\n restoreFocusRef={architectRestoreFocusRef}\n showMobileTrigger={onOpenArchitect === undefined}\n />\n\n <Modal\n title={assistantName}\n open={specOpen}\n onCancel={() => setSpecOpen(false)}\n footer={null}\n width=\"85vw\"\n centered\n styles={{ body: { maxHeight: \"calc(85vh - 120px)\", overflow: \"auto\", padding: \"12px 24px 24px\" } }}\n >\n {description ? (\n <MDResponse content={description} />\n ) : (\n <Text type=\"secondary\">No description set.</Text>\n )}\n </Modal>\n </div>\n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport { Button, Input, Spin, Tag, Typography, message } from \"antd\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { useMiddlewareTypes } from \"../../hooks/useMiddlewareTypes\";\nimport { useLatticeChatShellContext } from \"../Chat/LatticeChatShellContext\";\nimport { MiddlewareConfigForm, type AgentMiddlewareConfig } from \"../Chat/MiddlewareConfigForm\";\nimport { MDResponse } from \"../GenUI/MDResponse\";\nimport { AgentEvalPanel } from \"./AgentEvalPanel\";\nimport { GROUP_LABEL } from \"./nodeMeta\";\nimport type { ConfigGraphNode } from \"./configGraph\";\n\nconst { Text } = Typography;\n\n/**\n * NodeDockContent — the content guest of the canvas dock for a clicked graph\n * node. Each node type maps to its target content directly (no intermediate\n * summary card): tool/subagent/skill fetch their detail, capability and agent\n * edit in place, eval embeds the eval panel.\n */\n\nexport interface NodeDockContentProps {\n node: ConfigGraphNode;\n graphDefinition: unknown;\n assistantId?: string;\n onRemoveNode?: (node: ConfigGraphNode) => void;\n /** Persist a merged graphDefinition (capability/agent edits). */\n onSaveGraph?: (nextDef: Record<string, unknown>) => void | Promise<void>;\n}\n\nexport function nodeDockWidth(node: ConfigGraphNode): number {\n switch (node.type) {\n case \"capability\":\n case \"agent\":\n return 560;\n case \"eval\":\n return 860;\n default:\n return 400;\n }\n}\n\nexport function nodeDockTitle(node: ConfigGraphNode): string {\n return node.label;\n}\n\n/** Inline two-step confirm — never a second overlay. */\nconst InlineConfirmButton: React.FC<{ label: string; confirmLabel: string; onConfirm: () => void }> = ({ label, confirmLabel, onConfirm }) => {\n const [armed, setArmed] = useState(false);\n if (armed) {\n return (\n <Button danger size=\"small\" onClick={onConfirm}>\n {confirmLabel}\n </Button>\n );\n }\n return (\n <Button danger size=\"small\" type=\"text\" onClick={() => setArmed(true)}>\n {label}\n </Button>\n );\n};\n\nconst DockSection: React.FC<{ title: string; children: React.ReactNode }> = ({ title, children }) => (\n <div style={{ marginBottom: 16 }}>\n <div style={{ fontSize: 12, fontWeight: 600, color: \"#999\", marginBottom: 6 }}>{title}</div>\n {children}\n </div>\n);\n\nconst ToolDetail: React.FC<{ node: ConfigGraphNode }> = ({ node }) => {\n const { get } = useApi();\n const [tool, setTool] = useState<{ description?: string; schema?: { properties?: Record<string, { type?: string; description?: string }>; required?: string[] } } | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n get<{ success: boolean; data?: { records: Array<{ name: string; description?: string; schema?: unknown }> } }>(\"/api/tools\")\n .then((res) => {\n if (cancelled) return;\n const found = res.data?.records?.find((t) => t.name === node.label) ?? null;\n setTool(found as typeof tool);\n })\n .catch(() => !cancelled && setTool(null))\n .finally(() => !cancelled && setLoading(false));\n return () => {\n cancelled = true;\n };\n }, [get, node.label]);\n\n if (loading) return <Spin size=\"small\" />;\n if (!tool) return <Text type=\"secondary\" style={{ fontSize: 13 }}>Tool details unavailable.</Text>;\n const properties = tool.schema?.properties ?? {};\n const required = new Set(tool.schema?.required ?? []);\n return (\n <>\n {tool.description && <DockSection title=\"Description\">{tool.description}</DockSection>}\n {Object.keys(properties).length > 0 && (\n <DockSection title=\"Parameters\">\n {Object.entries(properties).map(([name, p]) => (\n <div key={name} style={{ display: \"flex\", gap: 8, fontSize: 12, padding: \"4px 0\", alignItems: \"baseline\" }}>\n <span style={{ color: \"#333\", fontWeight: 600 }}>{name}{required.has(name) && <span style={{ color: \"#ef4444\" }}> *</span>}</span>\n <span style={{ color: \"#999\" }}>{p.type ?? \"any\"}</span>\n {p.description && <span style={{ color: \"#666\", flex: 1 }}>{p.description}</span>}\n </div>\n ))}\n </DockSection>\n )}\n </>\n );\n};\n\nconst SubagentDetail: React.FC<{ node: ConfigGraphNode }> = ({ node }) => {\n const { get } = useApi();\n const [agent, setAgent] = useState<{ name?: string; description?: string; graphDefinition?: { modelKey?: string } } | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n get<{ success: boolean; data?: { name?: string; description?: string; graphDefinition?: { modelKey?: string } } }>(`/api/assistants/${node.label}`)\n .then((res) => !cancelled && setAgent(res.data ?? null))\n .catch(() => !cancelled && setAgent(null))\n .finally(() => !cancelled && setLoading(false));\n return () => {\n cancelled = true;\n };\n }, [get, node.label]);\n\n if (loading) return <Spin size=\"small\" />;\n if (!agent) return <Text type=\"secondary\" style={{ fontSize: 13 }}>Sub-agent details unavailable.</Text>;\n return (\n <>\n <DockSection title=\"Description\">{agent.description || \"No description\"}</DockSection>\n {agent.graphDefinition?.modelKey && <DockSection title=\"Model\">{agent.graphDefinition.modelKey}</DockSection>}\n </>\n );\n};\n\nconst SkillDetail: React.FC<{ node: ConfigGraphNode }> = ({ node }) => {\n const { get } = useApi();\n const [skill, setSkill] = useState<{ name?: string; description?: string; content?: string } | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n get<{ success: boolean; data?: { name?: string; description?: string; content?: string } }>(`/api/skills/${node.label}`)\n .then((res) => !cancelled && setSkill(res.data ?? null))\n .catch(() => !cancelled && setSkill(null))\n .finally(() => !cancelled && setLoading(false));\n return () => {\n cancelled = true;\n };\n }, [get, node.label]);\n\n if (loading) return <Spin size=\"small\" />;\n if (!skill) return <Text type=\"secondary\" style={{ fontSize: 13 }}>Skill details unavailable.</Text>;\n return (\n <>\n <DockSection title=\"Description\">{skill.description || \"No description\"}</DockSection>\n {skill.content && (\n <DockSection title=\"Content\">\n <MDResponse content={skill.content} />\n </DockSection>\n )}\n </>\n );\n};\n\n/** Capability: edit only this middleware entry, save merges into graphDefinition. */\nconst CapabilityEditor: React.FC<{\n node: ConfigGraphNode;\n graphDefinition: unknown;\n onSaveGraph?: (nextDef: Record<string, unknown>) => void | Promise<void>;\n}> = ({ node, graphDefinition, onSaveGraph }) => {\n const { config } = useLatticeChatShellContext();\n const { middlewareTypes } = useMiddlewareTypes(config.middlewareTypesEndpoint);\n const raw = (node.config ?? {}) as Record<string, unknown>;\n const [draft, setDraft] = useState<AgentMiddlewareConfig>({\n id: (raw.type as string) ?? node.id,\n type: (raw.type as string) ?? \"unknown\",\n name: (raw.name as string) ?? node.label,\n description: (raw.description as string) ?? \"\",\n enabled: raw.enabled !== false,\n config: (raw.config as Record<string, any>) ?? {},\n allowedTools: raw.allowedTools as string[] | undefined,\n });\n const [saving, setSaving] = useState(false);\n const middlewareType = (config.availableMiddlewareTypes || middlewareTypes)?.find((t) => t.type === draft.type);\n\n const save = async () => {\n if (!onSaveGraph) return;\n setSaving(true);\n try {\n const def = typeof graphDefinition === \"object\" && graphDefinition !== null ? (graphDefinition as Record<string, unknown>) : {};\n const list = Array.isArray(def.middleware) ? (def.middleware as Record<string, unknown>[]) : [];\n const nextEntry = {\n ...raw,\n name: draft.name,\n description: draft.description,\n enabled: draft.enabled,\n config: draft.config,\n ...(draft.allowedTools !== undefined ? { allowedTools: draft.allowedTools } : {}),\n };\n const nextList = list.some((m) => m.type === draft.type)\n ? list.map((m) => (m.type === draft.type ? nextEntry : m))\n : [...list, nextEntry];\n await onSaveGraph({ ...def, middleware: nextList });\n message.success(\"Capability saved\");\n } catch {\n message.error(\"Failed to save capability\");\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <>\n <MiddlewareConfigForm\n middleware={draft}\n middlewareType={middlewareType}\n onToggle={() => setDraft((d) => ({ ...d, enabled: !d.enabled }))}\n onConfigChange={(cfg) => setDraft((d) => ({ ...d, config: { ...d.config, ...cfg } }))}\n onAllowedToolsChange={(allowedTools) => setDraft((d) => ({ ...d, allowedTools }))}\n />\n <div style={{ marginTop: 16, textAlign: \"right\" }}>\n <Button type=\"primary\" size=\"small\" loading={saving} onClick={() => void save()}>\n Save\n </Button>\n </div>\n </>\n );\n};\n\n/** Agent: basic identity fields, saved as a merged graphDefinition. */\nconst AgentBasicEditor: React.FC<{\n graphDefinition: unknown;\n onSaveGraph?: (nextDef: Record<string, unknown>) => void | Promise<void>;\n}> = ({ graphDefinition, onSaveGraph }) => {\n const def = typeof graphDefinition === \"object\" && graphDefinition !== null ? (graphDefinition as Record<string, unknown>) : {};\n const [description, setDescription] = useState((def.description as string) ?? \"\");\n const [prompt, setPrompt] = useState((def.prompt as string) ?? \"\");\n const [modelKey, setModelKey] = useState((def.modelKey as string) ?? \"\");\n const [saving, setSaving] = useState(false);\n\n const save = async () => {\n if (!onSaveGraph) return;\n setSaving(true);\n try {\n await onSaveGraph({ ...def, description, prompt, modelKey });\n message.success(\"Agent saved\");\n } catch {\n message.error(\"Failed to save agent\");\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <>\n <DockSection title=\"Description\">\n <Input.TextArea aria-label=\"Description\" rows={2} value={description} onChange={(e) => setDescription(e.target.value)} />\n </DockSection>\n <DockSection title=\"Model\">\n <Input aria-label=\"Model\" size=\"small\" value={modelKey} onChange={(e) => setModelKey(e.target.value)} />\n </DockSection>\n <DockSection title=\"Prompt\">\n <Input.TextArea aria-label=\"Prompt\" rows={8} value={prompt} onChange={(e) => setPrompt(e.target.value)} />\n </DockSection>\n <div style={{ textAlign: \"right\" }}>\n <Button type=\"primary\" size=\"small\" loading={saving} onClick={() => void save()}>\n Save\n </Button>\n </div>\n </>\n );\n};\n\nexport const NodeDockContent: React.FC<NodeDockContentProps> = ({ node, graphDefinition, assistantId, onRemoveNode, onSaveGraph }) => {\n const removable = node.type === \"tool\" || node.type === \"subagent\" || node.type === \"skill\";\n return (\n <div>\n <div style={{ marginBottom: 12 }}>\n <Tag bordered={false} style={{ margin: 0, fontSize: 10 }}>\n {GROUP_LABEL[node.type]}\n </Tag>\n </div>\n {/* key by node.id: switching between same-type nodes must remount and drop stale drafts/fetches */}\n {node.type === \"tool\" && <ToolDetail key={node.id} node={node} />}\n {node.type === \"subagent\" && <SubagentDetail key={node.id} node={node} />}\n {node.type === \"skill\" && <SkillDetail key={node.id} node={node} />}\n {node.type === \"capability\" && <CapabilityEditor key={node.id} node={node} graphDefinition={graphDefinition} onSaveGraph={onSaveGraph} />}\n {node.type === \"agent\" && <AgentBasicEditor key={node.id} graphDefinition={graphDefinition} onSaveGraph={onSaveGraph} />}\n {node.type === \"eval\" && assistantId && <AgentEvalPanel key={node.id} assistantId={assistantId} />}\n {removable && onRemoveNode && (\n <div style={{ marginTop: 16, borderTop: \"1px solid #f0f0f0\", paddingTop: 12 }}>\n <InlineConfirmButton label=\"Remove from agent\" confirmLabel=\"Confirm remove\" onConfirm={() => onRemoveNode(node)} />\n </div>\n )}\n </div>\n );\n};\n","export function getTrainingProjectId(graphDefinition: unknown): string | undefined {\n let parsed = graphDefinition;\n if (typeof graphDefinition === \"string\") {\n try {\n parsed = JSON.parse(graphDefinition) as unknown;\n } catch {\n return undefined;\n }\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return undefined;\n const metadata = (parsed as Record<string, unknown>).metadata;\n if (!metadata || typeof metadata !== \"object\" || Array.isArray(metadata)) return undefined;\n const projectId = (metadata as Record<string, unknown>).trainingProjectId;\n return typeof projectId === \"string\" ? projectId : undefined;\n}\n","import { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { ApiError, type Assistant } from \"@axiom-lattice/client-sdk\";\nimport type { TaskItem } from \"@axiom-lattice/protocols\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { isAgentListChangeTool, mapToolToEntityGroups, type EntityGroup } from \"./entityRefresh\";\nimport {\n buildTrainingRoundsQuery,\n fetchTaskSubtree,\n isTrainingRound,\n} from \"./Learning/trainingUtils\";\n\n/** Same-group tool events within this window merge into one refetch. */\nexport const REFRESH_DEBOUNCE_MS = 300;\n/** Slow polling fallback for changes the tool events cannot reach. */\nexport const LEARNING_POLL_MS = 300000;\n\nconst emptyLearningTasks = (): LearningTasksData => ({\n rounds: [], round: null, subTasks: [], subTasksByRound: {}, loading: true,\n});\n\nconst emptyFreshness = (): EntityFreshness => ({\n config: { error: null, updatedAt: null },\n tasks: { error: null, updatedAt: null, partial: false },\n});\n\nfunction mergePartialSubtree(\n previous: TaskItem[],\n fetched: TaskItem[],\n incompleteParentIds: string[]\n): TaskItem[] {\n const incomplete = new Set(incompleteParentIds);\n const previousById = new Map(previous.map((task) => [task.id, task]));\n const belongsToIncompleteBranch = (task: TaskItem): boolean => {\n let parentId = task.parentId;\n const seen = new Set<string>();\n while (parentId && !seen.has(parentId)) {\n if (incomplete.has(parentId)) return true;\n seen.add(parentId);\n parentId = previousById.get(parentId)?.parentId;\n }\n return false;\n };\n const fetchedIds = new Set(fetched.map((task) => task.id));\n return [...fetched, ...previous.filter((task) => !fetchedIds.has(task.id) && belongsToIncompleteBranch(task))];\n}\n\nexport interface LearningTasksData {\n /** All learning rounds, newest first (each round is one learning task). */\n rounds: TaskItem[];\n /** The latest training round, any status (null = none yet). Kept for backward compatibility. */\n round: TaskItem | null;\n /** Full subtask tree under the latest round (all statuses — results matter). */\n subTasks: TaskItem[];\n /** Full subtask tree per round id — lets the card render any selected round. */\n subTasksByRound: Record<string, TaskItem[]>;\n loading: boolean;\n}\n\nexport interface EntityFreshness {\n config: { error: Error | null; updatedAt: Date | null };\n tasks: { error: Error | null; updatedAt: Date | null; partial: boolean };\n}\n\nexport interface UseEntityRefresherParams {\n agentId: string;\n /** Filter learning rounds to this project (undefined = all projects). */\n projectId?: string | null;\n /** Called with the freshly fetched assistant after a config-changing tool. */\n onAssistantUpdated?: (assistant: Assistant) => void;\n /**\n * Called when the agent list itself changed (create_agent/delete_agent) or\n * the viewed agent no longer exists (404). The workbench should reload the\n * full list — dropping ghosts and surfacing newly created agents.\n */\n onAgentListInvalidated?: () => void;\n}\n\nexport interface UseEntityRefresherReturn {\n /** Entry point: route a completed architect tool to the right refetch. */\n handleToolCompleted: (toolName: string) => void;\n learningTasks: LearningTasksData;\n refreshLearningTasks: () => Promise<void>;\n refreshAgent: () => Promise<void>;\n freshness: EntityFreshness;\n /** Bumped (debounced) when eval assets or runs mutate; consumers refresh eval data. */\n evalTick: number;\n}\n\n/**\n * Event-driven precise refresh for the agent detail page. Architect tool\n * completions are the invalidation signal; each group refetches final\n * consistent data (single-entity config GET, training rounds + subtree).\n * Replaces the loadAgents() full reload + refreshToken counter pattern.\n */\nexport function useEntityRefresher(params: UseEntityRefresherParams): UseEntityRefresherReturn {\n const { agentId, projectId, onAssistantUpdated, onAgentListInvalidated } = params;\n const { get } = useApi();\n const scope = `${agentId}\\u0000${projectId ?? \"\"}`;\n const [learningState, setLearningState] = useState(() => ({ scope, value: emptyLearningTasks() }));\n const [evalState, setEvalState] = useState(() => ({ scope, value: 0 }));\n const [freshnessState, setFreshnessState] = useState(() => ({ scope, value: emptyFreshness() }));\n const timersRef = useRef<Partial<Record<EntityGroup, ReturnType<typeof setTimeout>>>>({});\n /** Monotonic counter: a newer refresh supersedes an in-flight older one. */\n const taskSeqRef = useRef(0);\n const taskRefreshRef = useRef<{ scope: string; promise: Promise<void> } | null>(null);\n const taskTrailingRef = useRef<string | null>(null);\n const configSeqRef = useRef(0);\n const completeSubtreesRef = useRef<Record<string, TaskItem[]>>({});\n /** Set when the scheduled config refresh already invalidated the list (create/delete tool). */\n const listInvalidatedRef = useRef(false);\n const scopeRef = useRef(scope);\n const cbRef = useRef({ onAssistantUpdated, onAgentListInvalidated });\n useLayoutEffect(() => {\n cbRef.current = { onAssistantUpdated, onAgentListInvalidated };\n }, [onAssistantUpdated, onAgentListInvalidated]);\n useLayoutEffect(() => {\n if (scopeRef.current === scope) return;\n scopeRef.current = scope;\n taskSeqRef.current += 1;\n configSeqRef.current += 1;\n completeSubtreesRef.current = {};\n taskRefreshRef.current = null;\n taskTrailingRef.current = null;\n listInvalidatedRef.current = false;\n for (const timer of Object.values(timersRef.current)) if (timer) clearTimeout(timer);\n timersRef.current = {};\n setLearningState({ scope, value: emptyLearningTasks() });\n setFreshnessState({ scope, value: emptyFreshness() });\n setEvalState({ scope, value: 0 });\n }, [scope]);\n const learningTasks = learningState.scope === scope ? learningState.value : emptyLearningTasks();\n const freshness = freshnessState.scope === scope ? freshnessState.value : emptyFreshness();\n const evalTick = evalState.scope === scope ? evalState.value : 0;\n const setFreshness = (update: (previous: EntityFreshness) => EntityFreshness): void => {\n setFreshnessState((previous) => previous.scope === scope\n ? { scope, value: update(previous.value) }\n : previous);\n };\n const refreshAgent = useCallback(async () => {\n const seq = ++configSeqRef.current;\n const requestScope = scope;\n try {\n const res = await get<{ success: boolean; data?: Assistant }>(`/api/assistants/${agentId}`);\n if (seq !== configSeqRef.current || requestScope !== scopeRef.current) return;\n if (res.success && res.data) {\n listInvalidatedRef.current = false;\n cbRef.current.onAssistantUpdated?.(res.data);\n setFreshness((prev) => ({ ...prev, config: { error: null, updatedAt: new Date() } }));\n } else {\n listInvalidatedRef.current = false;\n setFreshness((prev) => ({ ...prev, config: { ...prev.config, error: new Error(\"Configuration refresh returned no agent\") } }));\n }\n } catch (err) {\n if (seq !== configSeqRef.current || requestScope !== scopeRef.current) return;\n if (err instanceof ApiError && err.statusCode === 404) {\n // The viewed agent was deleted server-side: reload the list so the\n // workbench drops the ghost and navigates back. Skipped when the\n // triggering tool (delete_agent) already invalidated the list.\n if (!listInvalidatedRef.current) cbRef.current.onAgentListInvalidated?.();\n listInvalidatedRef.current = false;\n setFreshness((prev) => ({ ...prev, config: { ...prev.config, error: err } }));\n return;\n }\n listInvalidatedRef.current = false;\n console.warn(\"[useEntityRefresher] config refresh failed\", err);\n const error = err instanceof Error ? err : new Error(String(err));\n setFreshness((prev) => ({ ...prev, config: { ...prev.config, error } }));\n }\n }, [get, agentId, scope]);\n\n const refreshLearningTasks = useCallback((): Promise<void> => {\n const existing = taskRefreshRef.current;\n if (existing?.scope === scope) return existing.promise;\n const seq = ++taskSeqRef.current;\n const requestScope = scope;\n const promise = (async () => {\n try {\n const roundsRes = await get<{ data?: TaskItem[] }>(buildTrainingRoundsQuery(agentId, projectId));\n const rounds = (roundsRes.data ?? []).filter(isTrainingRound);\n // Stores order by created_at DESC — the first round is the latest.\n // Fetch every round's subtree so the card can filter across rounds.\n const subTasksByRound: Record<string, TaskItem[]> = {};\n let partial = false;\n await Promise.all(\n rounds.map(async (r) => {\n const subtree = await fetchTaskSubtree(get, r.id, { projectId });\n partial ||= subtree.partial;\n subTasksByRound[r.id] = subtree.partial\n ? mergePartialSubtree(\n completeSubtreesRef.current[r.id] ?? [],\n subtree.tasks,\n subtree.incompleteParentIds ?? []\n )\n : subtree.tasks;\n })\n );\n if (seq !== taskSeqRef.current || requestScope !== scopeRef.current) return;\n completeSubtreesRef.current = Object.fromEntries(\n rounds.map((round) => [round.id, subTasksByRound[round.id] ?? []])\n );\n const latest = rounds[0] ?? null;\n setLearningState({ scope, value: {\n rounds,\n round: latest,\n subTasks: latest ? (subTasksByRound[latest.id] ?? []) : [],\n subTasksByRound,\n loading: false,\n } });\n setFreshness((prev) => ({ ...prev, tasks: { error: null, updatedAt: new Date(), partial } }));\n } catch (err) {\n console.warn(\"[useEntityRefresher] task refresh failed\", err);\n if (seq !== taskSeqRef.current || requestScope !== scopeRef.current) return;\n setLearningState((previous) => previous.scope === scope\n ? { scope, value: { ...previous.value, loading: false } }\n : previous);\n const error = err instanceof Error ? err : new Error(String(err));\n setFreshness((prev) => ({ ...prev, tasks: { ...prev.tasks, error } }));\n }\n })().finally(() => {\n if (taskRefreshRef.current?.promise !== promise) return;\n taskRefreshRef.current = null;\n if (taskTrailingRef.current === requestScope && scopeRef.current === requestScope) {\n taskTrailingRef.current = null;\n void fnsRef.current.refreshLearningTasks();\n }\n });\n taskRefreshRef.current = { scope, promise };\n return promise;\n }, [get, agentId, projectId, scope]);\n\n // Timers always call the LATEST refresh fns — a pending debounced refresh\n // must not fire with a stale projectId/agentId closure after a prop change.\n const fnsRef = useRef({ refreshAgent, refreshLearningTasks });\n useEffect(() => {\n fnsRef.current = { refreshAgent, refreshLearningTasks };\n });\n\n const schedule = useCallback((group: EntityGroup, fn: () => void) => {\n const timers = timersRef.current;\n if (timers[group]) clearTimeout(timers[group]);\n timers[group] = setTimeout(fn, REFRESH_DEBOUNCE_MS);\n }, []);\n\n const handleToolCompleted = useCallback(\n (toolName: string) => {\n for (const group of mapToolToEntityGroups(toolName)) {\n if (group === \"config\") schedule(group, () => {\n // create/delete change list membership, not just one entity.\n if (isAgentListChangeTool(toolName)) {\n listInvalidatedRef.current = true;\n cbRef.current.onAgentListInvalidated?.();\n }\n void fnsRef.current.refreshAgent();\n });\n if (group === \"tasks\") schedule(group, () => {\n const currentScope = scopeRef.current;\n if (taskRefreshRef.current?.scope === currentScope) taskTrailingRef.current = currentScope;\n else void fnsRef.current.refreshLearningTasks();\n });\n if (group === \"eval\") schedule(group, () => {\n const currentScope = scopeRef.current;\n setEvalState((previous) => previous.scope === currentScope\n ? { scope: currentScope, value: previous.value + 1 }\n : previous);\n });\n }\n },\n [schedule]\n );\n\n // Initial load + slow polling fallback (tool events are the primary trigger).\n useEffect(() => {\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const poll = async (): Promise<void> => {\n await refreshLearningTasks();\n if (!cancelled) timer = setTimeout(() => { void poll(); }, LEARNING_POLL_MS);\n };\n void poll();\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n };\n }, [refreshLearningTasks]);\n\n // Clear pending debounce timers on unmount.\n useEffect(\n () => () => {\n for (const t of Object.values(timersRef.current)) if (t) clearTimeout(t);\n },\n []\n );\n\n return { handleToolCompleted, learningTasks, refreshLearningTasks, refreshAgent, freshness, evalTick };\n}\n","/** Entity groups on the agent detail page that architect tool activity can invalidate. */\nexport type EntityGroup = \"config\" | \"tasks\" | \"eval\";\n\n/**\n * Tool lists below mirror the architect's actual tool set in\n * packages/core/src/agent_lattice/agentArchitectConfig.ts — when core adds a\n * config-changing tool, add it here too (and vice versa).\n */\nconst CONFIG_TOOLS = new Set([\n \"create_agent\",\n \"update_agent\",\n \"delete_agent\",\n \"create_workflow\",\n \"update_workflow\",\n]);\n\nconst TASK_TOOLS = new Set([\"manage_task\"]);\n\nconst EVAL_TOOLS = new Set([\"manage_eval\", \"run_eval\"]);\n\n/** Tools that add/remove agents — they invalidate the whole list, not one entity. */\nconst AGENT_LIST_TOOLS = new Set([\"create_agent\", \"delete_agent\"]);\n\n/** True when the tool changes the agent list membership (create/delete). */\nexport function isAgentListChangeTool(toolName: string): boolean {\n return AGENT_LIST_TOOLS.has(toolName);\n}\n\n/**\n * Map a completed architect tool name to the entity groups it invalidates.\n * This is the single source of truth for tool→refresh routing on the\n * agent detail page (previously split across CONFIG_CHANGE_TOOLS in\n * AgentConfigGraph and WORKFLOW_CHANGE_TOOLS in WorkflowAgentCanvas).\n */\nexport function mapToolToEntityGroups(toolName: string): EntityGroup[] {\n const groups: EntityGroup[] = [];\n if (CONFIG_TOOLS.has(toolName)) groups.push(\"config\");\n if (TASK_TOOLS.has(toolName)) groups.push(\"tasks\");\n if (EVAL_TOOLS.has(toolName)) groups.push(\"eval\");\n return groups;\n}\n"],"mappings":"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","names":["useCallback","useEffect","useRef","useState","Spin","useCallback","useEffect","jsx","useEffect","useCallback","jsx","jsxs","useState","useRef","useEffect","useCallback","Spin","index","getGraphDefinition","React","useMemo","useCallback","Spin","useEffect","useRef","jsx","jsx","jsxs","React","useCallback","useMemo","scoreColor","Spin","useMemo","useEffect","useRef","useState","useCallback","Tag","jsx","Bot","FlaskConical","jsx","jsx","jsxs","Tag","useEffect","useState","jsx","jsxs","useEffect","useMemo","useRef","useState","App","Button","Select","PlusOutlined","useEffect","useState","Button","Form","Input","Modal","useRef","useState","message","jsx","jsxs","useState","useRef","message","jsx","jsxs","Form","useState","useEffect","Modal","Input","Button","React","useCallback","useEffect","useRef","useState","App","Modal","jsx","React","App","useState","useRef","useEffect","task","useCallback","Modal","jsx","jsxs","MAX_IN_FLIGHT_WORK_ITEM_REQUESTS","RESERVED_FOREGROUND_WORK_ITEM_REQUESTS","MAX_BACKGROUND_WORK_ITEM_REQUESTS","withUiTimeout","App","useState","useRef","useEffect","useMemo","Button","PlusOutlined","Select","useCallback","useEffect","useMemo","useRef","useState","Spin","Empty","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useMemo","useCallback","Spin","Empty","useEffect","useRef","useState","jsx","jsxs","useRef","useState","useEffect","React","useEffect","useMemo","useState","jsx","jsxs","React","useEffect","useMemo","useState","jsx","jsxs","useState","React","useEffect","useMemo","jsx","jsxs","jsx","jsxs","jsx","jsxs","useMemo","useState","React","useEffect","Fragment","jsx","jsxs","useState","useEffect","React","jsx","jsxs","useCallback","useEffect","useRef","useState","useEffect","useState","useRef","useState","Fragment","jsx","jsxs","useState","useRef","useEffect","useCallback","React","useEffect","useRef","jsx","jsxs","useRef","useEffect","React","React","jsx","jsxs","CARD_STYLE","React","React","useMemo","useState","Button","Select","PlusOutlined","Fragment","jsx","jsxs","CARD_STYLE","EDGE_STYLE","isWaitingForApproval","index","Select","React","useState","Button","PlusOutlined","useMemo","useEffect","useRef","useState","Fragment","jsx","jsxs","index","useCallback","useEffect","useMemo","useState","jsx","jsxs","nodeTypes","useState","useEffect","useMemo","useCallback","jsx","jsxs","useState","useRef","useCallback","useEffect","useMemo","nodeTypes","useState","useEffect","useRef","useCallback","Tag","Button","Typography","Modal","Tooltip","message","DeleteOutlined","InfoCircleOutlined","Bot","WorkflowIcon","FlaskConical","React","useState","useEffect","useMemo","useCallback","useRef","Form","Input","Button","Typography","Tag","Empty","Spin","message","Modal","ExpandOutlined","Fragment","jsx","jsxs","Input","Text","Typography","Form","useState","useRef","useEffect","useMemo","useCallback","middlewareTypes","index","message","config","Tag","Button","ExpandOutlined","Spin","Empty","tools","React","Modal","useCallback","useEffect","useRef","useState","Alert","Button","Modal","Space","Tag","Typography","useEffect","useState","Button","Checkbox","Form","Input","Modal","Select","Space","Typography","Fragment","jsx","jsxs","Text","Fragment","jsx","jsxs","Text","Typography","useState","useRef","useCallback","useEffect","Alert","Button","Tag","Modal","Space","useMemo","useState","Modal","Typography","InfoCircleOutlined","jsx","jsxs","Text","Typography","useState","useMemo","InfoCircleOutlined","Modal","useEffect","useState","Button","Input","Spin","Tag","Typography","message","Fragment","jsx","jsxs","Text","Typography","useState","Button","useEffect","Spin","message","Input","Tag","useCallback","useEffect","useLayoutEffect","useRef","useState","useState","useRef","useLayoutEffect","useCallback","useEffect","jsx","jsxs","Text","Typography","useState","useRef","useEffect","WorkflowIcon","Bot","useCallback","message","Button","InfoCircleOutlined","Tooltip","FlaskConical","DeleteOutlined","Modal","Tag"]}
|