@hotmeshio/long-tail 0.9.2 → 0.9.3
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/dashboard/dist/assets/{AdminDashboard-JobmypiO.js → AdminDashboard-BONGlQva.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-JobmypiO.js.map → AdminDashboard-BONGlQva.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-D_HuaRN9.js → AgentConfigPage-C_NJ4-pr.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-D_HuaRN9.js.map → AgentConfigPage-C_NJ4-pr.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-Cj22NZLI.js → AgentDetailPage-MSCS6bFD.js} +2 -2
- package/dashboard/dist/assets/{AgentDetailPage-Cj22NZLI.js.map → AgentDetailPage-MSCS6bFD.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-DTKto-gL.js → AgentsPage-PfSvedS-.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-DTKto-gL.js.map → AgentsPage-PfSvedS-.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-CUvrKkgS.js → AvailableEscalationsPage-DBeBLNWW.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-CUvrKkgS.js.map → AvailableEscalationsPage-DBeBLNWW.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-AwKouk26.js → BotPicker-DmCdoim8.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-AwKouk26.js.map → BotPicker-DmCdoim8.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-1ZMO_0UU.js → CapabilitiesPage-DVf4zIMZ.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-1ZMO_0UU.js.map → CapabilitiesPage-DVf4zIMZ.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-D6kUTrq4.js → CollapsibleSection-7ACdYUZy.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-D6kUTrq4.js.map → CollapsibleSection-7ACdYUZy.js.map} +1 -1
- package/dashboard/dist/assets/{CountdownTimer-Bj9YbInO.js → CountdownTimer-Gbp6RHav.js} +2 -2
- package/dashboard/dist/assets/{CountdownTimer-Bj9YbInO.js.map → CountdownTimer-Gbp6RHav.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-D5H_kyRL.js → CredentialsPage-JWCUgQMi.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-D5H_kyRL.js.map → CredentialsPage-JWCUgQMi.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-DvmJ0EFz.js → CronLabel-9GtrGEDe.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-DvmJ0EFz.js.map → CronLabel-9GtrGEDe.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-DT_g8Hr4.js → CustomDurationPicker-xNJMIvjL.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-DT_g8Hr4.js.map → CustomDurationPicker-xNJMIvjL.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-7_8YpC3D.js → ElapsedCell-rRiChKDm.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-7_8YpC3D.js.map → ElapsedCell-rRiChKDm.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-ClFRLeKV.js → EscalationListSchemaPage-B7PHz5CB.js} +2 -2
- package/dashboard/dist/assets/{EscalationListSchemaPage-ClFRLeKV.js.map → EscalationListSchemaPage-B7PHz5CB.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-BcYcj-b8.js → EscalationSchemaPage-_CbayTDk.js} +2 -2
- package/dashboard/dist/assets/{EscalationSchemaPage-BcYcj-b8.js.map → EscalationSchemaPage-_CbayTDk.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-uHb8ni_5.js → EscalationsOverview-C5bVdGf2.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-uHb8ni_5.js.map → EscalationsOverview-C5bVdGf2.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-CkdWqmEL.js → EventTable-DGaRYVnB.js} +2 -2
- package/dashboard/dist/assets/{EventTable-CkdWqmEL.js.map → EventTable-DGaRYVnB.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-C6sfPjSc.js → GraphInvokePage-R6_p2Sy7.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-C6sfPjSc.js.map → GraphInvokePage-R6_p2Sy7.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-CUHZxihq.js → HomePage-DHxtqRkD.js} +2 -2
- package/dashboard/dist/assets/{HomePage-CUHZxihq.js.map → HomePage-DHxtqRkD.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-nWxpujpH.js → ListToolbar-BhXp7clK.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-nWxpujpH.js.map → ListToolbar-BhXp7clK.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-DXrkDkU-.js → McpOverview-COgIIWkK.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-DXrkDkU-.js.map → McpOverview-COgIIWkK.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-CnLYE26v.js → McpQueryDetailPage-4LEqQZax.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-CnLYE26v.js.map → McpQueryDetailPage-4LEqQZax.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-oE9eWAus.js → McpQueryPage-DWAcSqF-.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-oE9eWAus.js.map → McpQueryPage-DWAcSqF-.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-B7e6AVl1.js → McpRunDetailPage-BNjhOPLp.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-B7e6AVl1.js.map → McpRunDetailPage-BNjhOPLp.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-Bx5DiGk7.js → McpRunsPage-DAjYKqqt.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-Bx5DiGk7.js.map → McpRunsPage-DAjYKqqt.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-BmG3qzdR.js → OperationsPage-5RkfIbtT.js} +2 -2
- package/dashboard/dist/assets/{OperationsPage-BmG3qzdR.js.map → OperationsPage-5RkfIbtT.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-r6hQ57eO.js → OperatorDashboard-B-2dIbj4.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-r6hQ57eO.js.map → OperatorDashboard-B-2dIbj4.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-C3gE4OHq.js → ProcessDetailPage-Bx7sF-vV.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-C3gE4OHq.js.map → ProcessDetailPage-Bx7sF-vV.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-DSsIGmBB.js → ProcessesListPage-Dsfc-DX_.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-DSsIGmBB.js.map → ProcessesListPage-Dsfc-DX_.js.map} +1 -1
- package/dashboard/dist/assets/{RoleDetailPage-DiFISbnq.js → RoleDetailPage-DF-ov9E9.js} +2 -2
- package/dashboard/dist/assets/{RoleDetailPage-DiFISbnq.js.map → RoleDetailPage-DF-ov9E9.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-CE5fui18.js → RolesPage-DIlde9bw.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-CE5fui18.js.map → RolesPage-DIlde9bw.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-Ct8NNadu.js → RunAsSelector-DOYUYXcD.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-Ct8NNadu.js.map → RunAsSelector-DOYUYXcD.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-BfgBtP_B.js → StickyPagination-BwXLmDc-.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-BfgBtP_B.js.map → StickyPagination-BwXLmDc-.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-2rwp7Ynx.js → StreamMessageDetail-CCez20kE.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-2rwp7Ynx.js.map → StreamMessageDetail-CCez20kE.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-BwWyYBCo.js → SwimlaneTimeline-hcWBunXb.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BwWyYBCo.js.map → SwimlaneTimeline-hcWBunXb.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-BUKHu2oD.js → TaskDetailPage-CIarmoAk.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-BUKHu2oD.js.map → TaskDetailPage-CIarmoAk.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-C_PwExQC.js → TasksListPage-CFqMwhLE.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-C_PwExQC.js.map → TasksListPage-CFqMwhLE.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-Bagm-L2o.js → TimeAgo-CuI-66Kw.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-Bagm-L2o.js.map → TimeAgo-CuI-66Kw.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-BwDo7knq.js → TimestampCell-BI3Uptj8.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-BwDo7knq.js.map → TimestampCell-BI3Uptj8.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-CVZ2M1yv.js → ToolTestPanel-QwGyWRfG.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-CVZ2M1yv.js.map → ToolTestPanel-QwGyWRfG.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-DKAvbkxD.js → TopicDetailPage-CGCiqQGf.js} +2 -2
- package/dashboard/dist/assets/{TopicDetailPage-DKAvbkxD.js.map → TopicDetailPage-CGCiqQGf.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-BZknsApe.js → TopicsPage-Bk8-inSO.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-BZknsApe.js.map → TopicsPage-Bk8-inSO.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-ByDxLHPZ.js → UserName-BOaihCFP.js} +2 -2
- package/dashboard/dist/assets/{UserName-ByDxLHPZ.js.map → UserName-BOaihCFP.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-DrwKB2x8.js → WorkflowExecutionPage-CE0QzhIt.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-DrwKB2x8.js.map → WorkflowExecutionPage-CE0QzhIt.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-DEq9fkhl.js → WorkflowsDashboard-wgWRZOnB.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-DEq9fkhl.js.map → WorkflowsDashboard-wgWRZOnB.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-l-0KYP7Y.js → WorkflowsOverview-CLyitES7.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-l-0KYP7Y.js.map → WorkflowsOverview-CLyitES7.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-BgimL3VT.js → YamlWorkflowDetailPage-pP2i1ptj.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-BgimL3VT.js.map → YamlWorkflowDetailPage-pP2i1ptj.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-CabXXA9r.js → YamlWorkflowsPage-BwQSMfYw.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-CabXXA9r.js.map → YamlWorkflowsPage-BwQSMfYw.js.map} +1 -1
- package/dashboard/dist/assets/{agents-D_L6lV0f.js → agents-CRtBacrZ.js} +2 -2
- package/dashboard/dist/assets/{agents-D_L6lV0f.js.map → agents-CRtBacrZ.js.map} +1 -1
- package/dashboard/dist/assets/{bots-wdZz1nJw.js → bots-FjzeqLzA.js} +2 -2
- package/dashboard/dist/assets/{bots-wdZz1nJw.js.map → bots-FjzeqLzA.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-C35_V8eu.js → capabilities-CB0y1ZCx.js} +2 -2
- package/dashboard/dist/assets/{capabilities-C35_V8eu.js.map → capabilities-CB0y1ZCx.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-kR2P6zYv.js → controlplane-ZJtfQopv.js} +2 -2
- package/dashboard/dist/assets/{controlplane-kR2P6zYv.js.map → controlplane-ZJtfQopv.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-BVj16HuR.js → escalation-columns-735GLlEN.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-BVj16HuR.js.map → escalation-columns-735GLlEN.js.map} +1 -1
- package/dashboard/dist/assets/{index-CJFA7aLp.js → index-AUrwksY_.js} +2 -2
- package/dashboard/dist/assets/{index-CJFA7aLp.js.map → index-AUrwksY_.js.map} +1 -1
- package/dashboard/dist/assets/{index-C75E0-Wd.js → index-BH0BQHF-.js} +2 -2
- package/dashboard/dist/assets/{index-C75E0-Wd.js.map → index-BH0BQHF-.js.map} +1 -1
- package/dashboard/dist/assets/{index-DIrYjyRG.js → index-BTrN5iqE.js} +3 -3
- package/dashboard/dist/assets/{index-DIrYjyRG.js.map → index-BTrN5iqE.js.map} +1 -1
- package/dashboard/dist/assets/{index-wZzl3bcK.js → index-B_pZXTTp.js} +2 -2
- package/dashboard/dist/assets/{index-wZzl3bcK.js.map → index-B_pZXTTp.js.map} +1 -1
- package/dashboard/dist/assets/{index-BMQopgAx.js → index-Bho1kYrO.js} +2 -2
- package/dashboard/dist/assets/{index-BMQopgAx.js.map → index-Bho1kYrO.js.map} +1 -1
- package/dashboard/dist/assets/{index-1WCiN-pF.js → index-CzYOxahh.js} +2 -2
- package/dashboard/dist/assets/{index-1WCiN-pF.js.map → index-CzYOxahh.js.map} +1 -1
- package/dashboard/dist/assets/{index-B4zWCfQr.js → index-D4z4fzW5.js} +2 -2
- package/dashboard/dist/assets/{index-B4zWCfQr.js.map → index-D4z4fzW5.js.map} +1 -1
- package/dashboard/dist/assets/{index-BZfX_ziz.js → index-DiCp9bmR.js} +2 -2
- package/dashboard/dist/assets/{index-BZfX_ziz.js.map → index-DiCp9bmR.js.map} +1 -1
- package/dashboard/dist/assets/{index-BmbO85oT.js → index-DlrsXckY.js} +2 -2
- package/dashboard/dist/assets/{index-BmbO85oT.js.map → index-DlrsXckY.js.map} +1 -1
- package/dashboard/dist/assets/{index-so192yXP.js → index-DpGeD89g.js} +3 -3
- package/dashboard/dist/assets/{index-so192yXP.js.map → index-DpGeD89g.js.map} +1 -1
- package/dashboard/dist/assets/{index-xBNf5aFb.js → index-DzIB5CaR.js} +2 -2
- package/dashboard/dist/assets/{index-xBNf5aFb.js.map → index-DzIB5CaR.js.map} +1 -1
- package/dashboard/dist/assets/{index-BfDn7j4K.js → index-GRckVBX1.js} +2 -2
- package/dashboard/dist/assets/{index-BfDn7j4K.js.map → index-GRckVBX1.js.map} +1 -1
- package/dashboard/dist/assets/{index-QOTnrFd1.js → index-iEn58vjL.js} +2 -2
- package/dashboard/dist/assets/{index-QOTnrFd1.js.map → index-iEn58vjL.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-DDt599ea.js → knowledge-Bw51BCX9.js} +2 -2
- package/dashboard/dist/assets/{knowledge-DDt599ea.js.map → knowledge-Bw51BCX9.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-BPXRXEje.js → mcp-D4KRVy2a.js} +2 -2
- package/dashboard/dist/assets/{mcp-BPXRXEje.js.map → mcp-D4KRVy2a.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-HUZuboi-.js → mcp-query-0Zo3GwTv.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-HUZuboi-.js.map → mcp-query-0Zo3GwTv.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-CH8q3ok_.js → pipelines-B8sOpeCD.js} +2 -2
- package/dashboard/dist/assets/{pipelines-CH8q3ok_.js.map → pipelines-B8sOpeCD.js.map} +1 -1
- package/dashboard/dist/assets/{roles-B7rzw8wD.js → roles-Bs6hUrQJ.js} +2 -2
- package/dashboard/dist/assets/{roles-B7rzw8wD.js.map → roles-Bs6hUrQJ.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-j-mVt2EA.js → tasks-KDV3bflF.js} +2 -2
- package/dashboard/dist/assets/{tasks-j-mVt2EA.js.map → tasks-KDV3bflF.js.map} +1 -1
- package/dashboard/dist/assets/{topics-DATyaYWW.js → topics-BS_n738l.js} +2 -2
- package/dashboard/dist/assets/{topics-DATyaYWW.js.map → topics-BS_n738l.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-CwIAhqJk.js → useEventHooks-RbAigCWV.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-CwIAhqJk.js.map → useEventHooks-RbAigCWV.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-hV7rcAfa.js → useNamespace-ChDZWKAd.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-hV7rcAfa.js.map → useNamespace-ChDZWKAd.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-Dwuuu3F0.js → useYamlActivityEvents-6xNaRNAc.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-Dwuuu3F0.js.map → useYamlActivityEvents-6xNaRNAc.js.map} +1 -1
- package/dashboard/dist/assets/{users-DS9yeHe4.js → users-BPt2YERY.js} +2 -2
- package/dashboard/dist/assets/{users-DS9yeHe4.js.map → users-BPt2YERY.js.map} +1 -1
- package/dashboard/dist/assets/{workflows-FF8WUHaC.js → workflows-BaSjfNsd.js} +2 -2
- package/dashboard/dist/assets/{workflows-FF8WUHaC.js.map → workflows-BaSjfNsd.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-y-eo6Rwj.js → yaml-workflows-Be3rM5i2.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-y-eo6Rwj.js.map → yaml-workflows-Be3rM5i2.js.map} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-DIrYjyRG.js","sources":["../../src/components/common/display/EscalationTimeline.tsx","../../src/components/escalation/TriageContext.tsx","../../src/components/escalation/EscalationSidePanel.tsx","../../src/pages/operator/escalation-detail/EscalationActionBar.tsx","../../src/components/common/display/SimpleMarkdown.tsx","../../src/components/escalation/RoundsExhaustedContext.tsx","../../src/components/escalation/IframeViewport.tsx","../../src/components/escalation/widgets/FileUploadWidget.tsx","../../src/components/escalation/widgets/CodeEditorWidget.tsx","../../src/components/escalation/widgets/SignatureWidget.tsx","../../src/components/escalation/widgets/RichTextWidget.tsx","../../src/components/escalation/widgets/MarkdownWidget.tsx","../../src/components/escalation/widgets/index.ts","../../src/components/escalation/ResolverForm.tsx","../../src/pages/operator/escalation-detail/ResolverSection.tsx","../../src/pages/operator/escalation-detail/EscalationDetailSections.tsx","../../src/pages/operator/escalation-detail/EscalationDetailPage.tsx"],"sourcesContent":["import { formatDurationCompact } from '../../../lib/format';\nimport { isEffectivelyClaimed } from '../../../lib/escalation';\nimport type { LTEscalationRecord } from '../../../api/types';\n\n// Matches the palette used in EscalationTimeline (the spine view) and PaceChart\nconst COLORS = {\n pending: '#0ea5e9', // sky blue — waiting to be claimed\n claimed: '#f97316', // orange — actively being worked\n resolved: '#16a34a', // green — done\n cancelled: '#ef4444', // red — cancelled or expired\n} as const;\n\nconst BAR_H = 5; // px\n\n/** A duration label tethered to a point on the bar by a thin vertical tick. */\nfunction Marker({ pct, place, label, title, emphasis }: {\n pct: number;\n place: 'above' | 'below';\n label: string;\n title: string;\n emphasis?: boolean;\n}) {\n const tick = <span className=\"w-px h-1.5 bg-slate-300\" aria-hidden />;\n const text = (\n <span className={`whitespace-nowrap leading-none tabular-nums ${emphasis ? 'text-text-secondary' : 'text-text-tertiary'}`}>\n {label}\n </span>\n );\n return (\n <div\n title={title}\n className={`absolute ${place === 'above' ? 'bottom-0' : 'top-0'} flex flex-col items-center gap-0 -translate-x-1/2 cursor-help`}\n style={{ left: `${pct}%` }}\n >\n {place === 'above' ? <>{text}{tick}</> : <>{tick}{text}</>}\n </div>\n );\n}\n\n/**\n * Compact lifecycle sparkline for the escalation detail side panel.\n *\n * Bar segments: blue (pending — waiting to be claimed) → orange (claimed —\n * being worked) → green (resolved) or red (cancelled). Markers show\n * time-to-claim above the split point and total duration below the right edge.\n */\nexport function EscalationTimeline({ esc, className = '' }: { esc: LTEscalationRecord; className?: string }) {\n const created = new Date(esc.created_at).getTime();\n const claimedAt = esc.claimed_at ? new Date(esc.claimed_at).getTime() : null;\n\n const isResolved = esc.status === 'resolved';\n const isCancelled = esc.status === 'cancelled' || esc.status === 'expired';\n const isTerminal = isResolved || isCancelled;\n const activeClaim = isEffectivelyClaimed(esc);\n\n const showClaimed = !!claimedAt && (activeClaim || isTerminal);\n\n const end = isResolved && esc.resolved_at\n ? new Date(esc.resolved_at).getTime()\n : isCancelled\n ? new Date(esc.updated_at).getTime()\n : Date.now();\n\n const total = Math.max(end - created, 1);\n const pendingMs = showClaimed && claimedAt ? Math.max(claimedAt - created, 0) : total;\n const activeMs = showClaimed && claimedAt ? Math.max(end - claimedAt, 0) : 0;\n\n const pendingPct = Math.min(100, Math.max(0, (pendingMs / total) * 100));\n const activePct = showClaimed ? Math.max(0, 100 - pendingPct) : 0;\n\n const activeColor = isResolved ? COLORS.resolved : isCancelled ? COLORS.cancelled : COLORS.claimed;\n const activeVerb = isResolved ? 'Resolved after' : isCancelled ? 'Cancelled after' : 'In progress';\n\n const split = formatDurationCompact(pendingMs);\n const totalStr = formatDurationCompact(total);\n const totalTip = isResolved\n ? `Resolved in ${totalStr} total`\n : isCancelled\n ? `Cancelled after ${totalStr}`\n : `Open ${totalStr} so far`;\n\n const legend = `Lifecycle bar: blue = time waiting to be claimed, ${isResolved ? 'green' : isCancelled ? 'red' : 'orange'} = ${activeVerb.toLowerCase()} the claim.`;\n\n return (\n <div className={className} title={legend}>\n {/* claim split label (above bar) */}\n <div className=\"relative h-3 text-[9px] font-mono\">\n {showClaimed && (\n <Marker\n pct={pendingPct}\n place=\"above\"\n label={split}\n title={`Time to claim: ${split}`}\n />\n )}\n </div>\n\n {/* Bar track */}\n <div\n className=\"flex w-full rounded-full overflow-hidden\"\n style={{ height: BAR_H, backgroundColor: '#e2e8f0' }}\n title={legend}\n >\n {/* Pending (blue) */}\n <div\n style={{ width: `${pendingPct}%`, minWidth: BAR_H, backgroundColor: COLORS.pending, opacity: 0.75 }}\n title={`Waiting ${split} — created → claimed`}\n />\n {/* Claimed / resolved / cancelled */}\n {showClaimed && activePct > 0 && (\n <div\n style={{ width: `${activePct}%`, minWidth: BAR_H, backgroundColor: activeColor, opacity: 0.75 }}\n title={`${activeVerb} ${formatDurationCompact(activeMs)}`}\n />\n )}\n </div>\n\n {/* Total / age label (below bar, anchored at right edge) */}\n <div className=\"relative h-3 text-[9px] font-mono\">\n <Marker pct={100} place=\"below\" emphasis label={totalStr} title={totalTip} />\n </div>\n </div>\n );\n}\n","interface TriageData {\n diagnosis?: string;\n actions_taken?: string[];\n tool_calls_made?: number;\n confidence?: number;\n recommendation?: string;\n correctedData?: Record<string, unknown>;\n originalData?: Record<string, unknown>;\n}\n\ntype Diff = { key: string; label: string; original: unknown; corrected: unknown };\n\n/**\n * Renders a triage summary when escalation payload contains `_triage`.\n *\n * Fully generic — no knowledge of workflow types or field semantics.\n * Diffs `_triage.originalData` against the payload to detect changes.\n * Follows the unboxed section pattern used throughout the dashboard.\n */\nexport function TriageContext({ triage, payload }: {\n triage: TriageData;\n payload: Record<string, unknown>;\n}) {\n const confidence = triage.confidence ?? 0;\n const confidenceColor =\n confidence >= 0.8 ? 'text-status-success' :\n confidence >= 0.5 ? 'text-status-pending' :\n 'text-status-error';\n\n // Generic diff: compare originalData fields to current payload\n const diffs = computeDiffs(triage.originalData, payload);\n\n return (\n <div className=\"space-y-5\">\n {/* Diagnosis + metadata — unboxed, natural flow */}\n {triage.diagnosis && (\n <p className=\"text-sm text-text-primary leading-relaxed\">\n {triage.diagnosis}\n </p>\n )}\n\n <div className=\"flex flex-wrap items-center gap-3 text-xs text-text-tertiary\">\n {triage.tool_calls_made != null && (\n <span>{triage.tool_calls_made} tool call{triage.tool_calls_made !== 1 ? 's' : ''}</span>\n )}\n {triage.tool_calls_made != null && <span className=\"text-text-quaternary\">·</span>}\n <span className={`font-medium ${confidenceColor}`}>\n {Math.round(confidence * 100)}% confidence\n </span>\n </div>\n\n {triage.actions_taken && triage.actions_taken.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {triage.actions_taken.map((action, i) => (\n <span\n key={i}\n className=\"inline-flex items-center gap-1.5 px-2 py-0.5 text-[11px]\n text-text-secondary\"\n >\n <svg className=\"w-3 h-3 text-status-success shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n {action}\n </span>\n ))}\n </div>\n )}\n\n {triage.recommendation && (\n <p className=\"text-[11px] text-text-tertiary italic\">\n {triage.recommendation}\n </p>\n )}\n\n {/* Generic before/after diffs — separated by subtle dividers */}\n {diffs.length > 0 && (\n <div className=\"space-y-4 pt-2\">\n {diffs.map((diff) => (\n <DiffRow key={diff.key} diff={diff} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Generic diff computation\n// ---------------------------------------------------------------------------\n\nfunction computeDiffs(\n original: Record<string, unknown> | undefined,\n current: Record<string, unknown>,\n): Diff[] {\n if (!original) return [];\n\n const diffs: Diff[] = [];\n for (const key of Object.keys(original)) {\n if (key.startsWith('_')) continue;\n const origVal = original[key];\n const currVal = current[key];\n if (currVal === undefined) continue;\n\n if (JSON.stringify(origVal) !== JSON.stringify(currVal)) {\n diffs.push({\n key,\n label: key.replace(/[_-]/g, ' '),\n original: origVal,\n corrected: currVal,\n });\n }\n }\n return diffs;\n}\n\n// ---------------------------------------------------------------------------\n// Diff row — clean, unboxed before/after\n// ---------------------------------------------------------------------------\n\nfunction DiffRow({ diff }: { diff: Diff }) {\n const origStr = renderValue(diff.original);\n const corrStr = renderValue(diff.corrected);\n\n // Both are primitives — side by side with subtle separator\n if (origStr !== null && corrStr !== null) {\n return (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-3\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n {diff.label} <span className=\"normal-case font-normal\">(original)</span>\n </p>\n <p className=\"text-sm text-text-tertiary leading-relaxed line-through decoration-text-tertiary/30\">\n {origStr}\n </p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n {diff.label} <span className=\"normal-case font-normal text-status-success\">(corrected)</span>\n </p>\n <p className=\"text-sm text-text-primary leading-relaxed\">\n {corrStr}\n </p>\n </div>\n </div>\n );\n }\n\n // Complex values — stacked\n return (\n <div className=\"space-y-3\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n {diff.label} <span className=\"normal-case font-normal\">(original)</span>\n </p>\n <pre className=\"text-xs text-text-tertiary font-mono whitespace-pre-wrap leading-relaxed\">\n {typeof diff.original === 'object' ? JSON.stringify(diff.original, null, 2) : String(diff.original)}\n </pre>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n {diff.label} <span className=\"normal-case font-normal text-status-success\">(corrected)</span>\n </p>\n <pre className=\"text-xs text-text-primary font-mono whitespace-pre-wrap leading-relaxed\">\n {typeof diff.corrected === 'object' ? JSON.stringify(diff.corrected, null, 2) : String(diff.corrected)}\n </pre>\n </div>\n </div>\n );\n}\n\n/** Render a value as a string if it's a primitive, null otherwise */\nfunction renderValue(val: unknown): string | null {\n if (val === null || val === undefined) return 'null';\n if (typeof val === 'string') return val;\n if (typeof val === 'number' || typeof val === 'boolean') return String(val);\n return null;\n}\n","import { useMemo, useState, useCallback } from 'react';\nimport { useNavigate, Link } from 'react-router-dom';\nimport { HelpCircle, Info, Tags, Layers, Braces, Sparkles, User, ListFilter, Search } from 'lucide-react';\nimport { SlidePanel, SlidePanelViews, PanelField, type SlidePanelView } from '../common/layout/SlidePanel';\nimport { MarkdownRenderer } from '../common/display/MarkdownRenderer';\nimport { JsonViewer } from '../common/data/JsonViewer';\nimport { StatusBadge } from '../common/display/StatusBadge';\nimport { EscalationTimeline } from '../common/display/EscalationTimeline';\nimport { RolePill } from '../common/display/RolePill';\nimport { CountdownTimer } from '../common/display/CountdownTimer';\nimport { DateValue } from '../common/display/DateValue';\nimport { CopyableId } from '../common/display/CopyableId';\nimport { UserName } from '../common/display/UserName';\nimport { TriageContext } from './TriageContext';\nimport { buildHelpMarkdown, defaultHelpMarkdown } from '../../lib/x-lt-help';\nimport type { LTEscalationRecord } from '../../api/types';\n\nexport const ESCALATION_PANEL_VIEWS = {\n HELP: 'help',\n DETAILS: 'details',\n TRIAGE: 'triage',\n METADATA: 'metadata',\n CONTEXT: 'context',\n RECORD: 'record',\n} as const;\n\nconst PANEL_VIEW_KEY = 'lt:escalation:panel:view';\n\nfunction readPanelView(validIds: readonly string[]): PanelViewId {\n try {\n const v = localStorage.getItem(PANEL_VIEW_KEY);\n if (v && validIds.includes(v)) return v as PanelViewId;\n } catch {}\n return ESCALATION_PANEL_VIEWS.HELP;\n}\n\ntype PanelViewId = (typeof ESCALATION_PANEL_VIEWS)[keyof typeof ESCALATION_PANEL_VIEWS];\n\n/** Metadata keys that are plumbing, not information for the person resolving. */\nconst HIDDEN_METADATA_KEYS = new Set(['form_schema']);\n\nfunction MetadataList({ metadata, role }: { metadata: Record<string, unknown> | null; role: string }) {\n const entries = Object.entries(metadata ?? {}).filter(\n ([k]) => !k.startsWith('_') && !HIDDEN_METADATA_KEYS.has(k),\n );\n if (entries.length === 0) {\n return <p className=\"text-xs text-text-tertiary italic\">No metadata on this escalation.</p>;\n }\n return (\n <dl className=\"space-y-3.5\">\n {entries.map(([key, value]) => {\n const displayValue = typeof value === 'object' && value !== null\n ? JSON.stringify(value)\n : String(value);\n const facets = encodeURIComponent(JSON.stringify({ [key]: displayValue }));\n const roleUrl = `/escalations/available?role=${encodeURIComponent(role)}&facets=${facets}&status=all`;\n const globalUrl = `/escalations/available?facets=${facets}&status=all`;\n return (\n <div key={key} className=\"group relative\">\n <dt className=\"text-[11px] font-medium text-text-secondary uppercase tracking-wide\">\n {key.replace(/[_-]/g, ' ')}\n </dt>\n <dd className=\"mt-0.5 flex items-center gap-1\">\n <span className=\"text-[12px] text-text-primary font-mono break-all flex-1\">\n {displayValue}\n </span>\n <Link\n to={roleUrl}\n title={`Filter this queue: ${key} = ${displayValue}`}\n className=\"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5 text-text-quaternary hover:text-accent\"\n >\n <ListFilter className=\"w-3 h-3\" />\n </Link>\n <Link\n to={globalUrl}\n title={`Search all queues: ${key} = ${displayValue}`}\n className=\"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5 text-text-quaternary hover:text-accent\"\n >\n <Search className=\"w-3 h-3\" />\n </Link>\n </dd>\n </div>\n );\n })}\n </dl>\n );\n}\n\n/** The escalation's status facts — what used to sit as a strip above the form. */\nfunction DetailsList({ esc, claimed, isTerminal, isBuilder, traceUrl }: {\n esc: LTEscalationRecord;\n claimed: boolean;\n isTerminal: boolean;\n isBuilder: boolean;\n traceUrl: string | null;\n}) {\n return (\n <div className=\"space-y-5\">\n <dl className=\"space-y-3.5\">\n <PanelField label=\"Status\"><StatusBadge status={esc.status} /></PanelField>\n <PanelField label=\"Assigned to Role\"><RolePill role={esc.role} size=\"md\" /></PanelField>\n <PanelField label=\"Priority\">P{esc.priority}</PanelField>\n {(claimed || isTerminal) && esc.assigned_to && (\n <PanelField label=\"Claimed By\">\n <span className=\"inline-flex items-center gap-1.5 font-medium text-text-primary\">\n <User className=\"w-3 h-3 shrink-0 text-accent/75\" />\n <UserName userId={esc.assigned_to} />\n </span>\n </PanelField>\n )}\n <PanelField label=\"Created\"><DateValue date={esc.created_at} /></PanelField>\n {(claimed || isTerminal) && esc.claimed_at && (\n <PanelField label=\"Claimed\"><DateValue date={esc.claimed_at} /></PanelField>\n )}\n {claimed && !isTerminal && esc.assigned_until && (\n <PanelField label=\"Time Remaining\"><CountdownTimer until={esc.assigned_until} /></PanelField>\n )}\n {esc.resolved_at && (\n <PanelField label=\"Completed\">\n <span className=\"text-status-success\"><DateValue date={esc.resolved_at} /></span>\n </PanelField>\n )}\n </dl>\n\n {/* Identifiers — builder-facing references, quietly below a divider */}\n {isBuilder && (\n <>\n <hr className=\"border-surface-border/60\" />\n <div className=\"space-y-3.5\">\n <CopyableId label=\"Escalation ID\" value={esc.id} />\n {esc.task_id && (\n <CopyableId label=\"Task ID\" value={esc.task_id} href={`/workflows/tasks/detail/${esc.task_id}`} />\n )}\n {esc.workflow_type && (\n <CopyableId label=\"Workflow Name\" value={esc.workflow_type} href={`/workflows/executions?entity=${encodeURIComponent(esc.workflow_type)}`} />\n )}\n {esc.workflow_id && (\n <CopyableId label=\"Workflow ID\" value={esc.workflow_id} href={`/workflows/executions/${esc.workflow_id}`} />\n )}\n {esc.task_queue && (\n <CopyableId label=\"Task Queue\" value={esc.task_queue} href={`/admin/controlplane?queue=${encodeURIComponent(esc.task_queue)}`} />\n )}\n {esc.origin_id && esc.origin_id !== esc.workflow_id && (\n <CopyableId label=\"Origin\" value={esc.origin_id} href={`/processes/detail/${esc.origin_id}`} />\n )}\n {esc.trace_id && (\n <CopyableId\n label=\"Trace\"\n value={esc.trace_id}\n href={traceUrl ? traceUrl.replace('{traceId}', esc.trace_id) : undefined}\n external\n />\n )}\n </div>\n </>\n )}\n </div>\n );\n}\n\n/**\n * The escalation detail side panel — a set of views beside the resolve form,\n * ordered by specificity:\n *\n * Help — the form's `x-lt-help` markdown ({{token}}-interpolated), or a\n * state-aware hint when the schema carries none\n * Details — status, role, claim provenance, timestamps, identifiers\n * AI Analysis — what triage diagnosed and corrected (when AI is enabled and\n * the payload carries triage data)\n * Metadata — the row's metadata values, the facts stamped at enqueue\n * Context — the expanded surface: input envelope, escalation context, and\n * resolver payload\n * Record — the raw escalation record (builders only)\n */\nexport function EscalationSidePanel({\n esc,\n schema,\n envelope,\n payload,\n resolver,\n triage,\n hasAI,\n claimed,\n claimedByMe,\n isTerminal,\n isBuilder,\n traceUrl,\n open,\n noGutter,\n}: {\n esc: LTEscalationRecord;\n schema: Record<string, unknown> | null;\n envelope: Record<string, unknown> | null;\n payload: Record<string, unknown> | null;\n resolver: Record<string, unknown> | null;\n triage: Record<string, unknown> | null;\n hasAI: boolean;\n claimed: boolean;\n claimedByMe: boolean;\n isTerminal: boolean;\n isBuilder: boolean;\n traceUrl: string | null;\n open: boolean;\n /** Remove the left gutter so the panel background is flush with the content column (used in full-bleed iframe mode). */\n noGutter?: boolean;\n}) {\n const navigate = useNavigate();\n const ALL_VIEW_IDS = Object.values(ESCALATION_PANEL_VIEWS) as readonly string[];\n const [activeView, setActiveView] = useState<PanelViewId>(() => readPanelView(ALL_VIEW_IDS));\n\n const handleViewChange = useCallback((id: string) => {\n try { localStorage.setItem(PANEL_VIEW_KEY, id); } catch {}\n setActiveView(id as PanelViewId);\n }, []);\n\n const helpMarkdown = useMemo(() => {\n const authored = buildHelpMarkdown(schema, {\n escalation: esc as unknown as Record<string, unknown>,\n metadata: esc.metadata ?? null,\n envelope,\n payload,\n resolver,\n });\n return authored ?? defaultHelpMarkdown({ isTerminal, status: esc.status, claimed, claimedByMe });\n }, [schema, esc, envelope, payload, resolver, isTerminal, claimed, claimedByMe]);\n\n // Relative links in help markdown navigate in-app instead of reloading.\n const handleHelpClick = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\n const anchor = (e.target as HTMLElement).closest('a');\n const href = anchor?.getAttribute('href');\n if (href?.startsWith('/')) {\n e.preventDefault();\n navigate(href);\n }\n }, [navigate]);\n\n const views: SlidePanelView[] = [\n {\n id: ESCALATION_PANEL_VIEWS.HELP,\n icon: HelpCircle,\n label: 'Instructions',\n content: <MarkdownRenderer content={helpMarkdown} onClick={handleHelpClick} />,\n },\n {\n id: ESCALATION_PANEL_VIEWS.DETAILS,\n icon: Info,\n label: 'Details',\n content: <DetailsList esc={esc} claimed={claimed} isTerminal={isTerminal} isBuilder={isBuilder} traceUrl={traceUrl} />,\n },\n ...(hasAI && triage\n ? [{\n id: ESCALATION_PANEL_VIEWS.TRIAGE,\n icon: Sparkles,\n label: 'AI Analysis',\n content: <TriageContext triage={triage} payload={payload ?? {}} />,\n }]\n : []),\n {\n id: ESCALATION_PANEL_VIEWS.METADATA,\n icon: Tags,\n label: 'Metadata',\n content: <MetadataList metadata={esc.metadata} role={esc.role} />,\n },\n {\n id: ESCALATION_PANEL_VIEWS.CONTEXT,\n icon: Layers,\n label: 'Context',\n content: (\n <div className=\"space-y-5\">\n {envelope != null && <JsonViewer data={envelope} label=\"Input Envelope\" />}\n {payload != null && <JsonViewer data={payload} label=\"Escalation Context\" />}\n {resolver != null && <JsonViewer data={resolver} label=\"Resolver Payload\" />}\n {envelope == null && payload == null && resolver == null && (\n <p className=\"text-xs text-text-tertiary italic\">No context on this escalation.</p>\n )}\n </div>\n ),\n },\n ...(isBuilder\n ? [{\n id: ESCALATION_PANEL_VIEWS.RECORD,\n icon: Braces,\n label: 'Record',\n content: <JsonViewer data={esc} label=\"Escalation Record\" />,\n }]\n : []),\n ];\n\n return (\n <SlidePanel open={open} width={384} className=\"h-full\">\n {/* The breathing room collapses with the panel — it lives inside the\n animated width, so the closed state reclaims all of it. The column\n is fixed height (like the left nav): the sparkline row persists at\n the top and the active view scrolls independently beneath it. */}\n <div className={`h-full${noGutter ? '' : ' pl-6'}`}>\n {/* One tinted column, top to bottom — the sparkline lives inside it,\n hovering tight (2px y padding) above the icon row, centered at 80%\n so its edge labels never clip. The slim row drops the icons onto\n the same visual line as the page-title icons beside them; only the\n view content below scrolls. */}\n <div className=\"h-full flex flex-col bg-surface-hover\">\n <div className=\"shrink-0 pt-1.5 pb-0.5 flex justify-center\">\n <EscalationTimeline esc={esc} className=\"w-[80%]\" />\n </div>\n <div className=\"flex-1 min-h-0\">\n {/* No close button — the page-header panel icon owns dismissal. */}\n <SlidePanelViews\n views={views}\n activeId={activeView}\n onViewChange={handleViewChange}\n stickyClassName=\"h-full min-h-0\"\n />\n </div>\n </div>\n </div>\n </SlidePanel>\n );\n}\n","import { useState, useCallback } from 'react';\nimport { mapFormToPayload } from '../../../lib/x-lt-bind';\nimport { CountdownTimer } from '../../../components/common/display/CountdownTimer';\nimport { UserName } from '../../../components/common/display/UserName';\nimport { CustomDurationPicker } from '../../../components/common/form/CustomDurationPicker';\nimport { useClaimDurations } from '../../../hooks/useClaimDurations';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ActionBarMode =\n | 'available' // unclaimed — show claim controls\n | 'claimed_by_me' // I own it — show resolve/escalate/release\n | 'claimed_by_other'// someone else has it\n | 'terminal'; // resolved or cancelled — nothing to do\n\nexport type ActiveView = 'resolve' | 'escalate' | 'release';\n\nexport interface EscalationActionBarProps {\n mode: ActionBarMode;\n // Active view (controlled by parent)\n activeView: ActiveView;\n onActiveViewChange: (view: ActiveView) => void;\n // Claim\n onClaim: (minutes: number) => void;\n claimPending: boolean;\n // Resolve — JSON lives in viewport, bar reads it for submit\n workflowType: string | null;\n json: string;\n onResolve: (payload: Record<string, unknown>) => void;\n resolvePending: boolean;\n resolveError: Error | null;\n // Triage (controlled by parent — callout + overlay render in page body)\n requestTriage: boolean;\n triageNotes: string;\n // Escalate\n currentRole: string;\n escalationTargets: string[];\n onEscalate: (role: string) => void;\n escalatePending: boolean;\n escalateError: Error | null;\n // Release\n onRelease: () => void;\n releasePending: boolean;\n // Cancel (opens confirm modal in parent)\n onCancel: () => void;\n // Other user\n assignedTo?: string | null;\n assignedUntil?: string | null;\n // Validation\n onSubmitAttempt?: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EscalationActionBar(props: EscalationActionBarProps) {\n const {\n mode, activeView, onActiveViewChange,\n onClaim, claimPending,\n workflowType, json, onResolve, resolvePending, resolveError,\n requestTriage, triageNotes,\n currentRole, escalationTargets, onEscalate, escalatePending, escalateError,\n onRelease, releasePending,\n onCancel,\n assignedTo, assignedUntil,\n onSubmitAttempt,\n } = props;\n\n const claimDurations = useClaimDurations();\n const [duration, setDuration] = useState('30');\n const [customMinutes, setCustomMinutes] = useState(0);\n const [parseError, setParseError] = useState('');\n const [escalateTarget, setEscalateTarget] = useState('');\n\n const isCustom = duration === 'custom';\n const onCustomChange = useCallback((m: number) => setCustomMinutes(m), []);\n\n if (mode === 'terminal') return null;\n\n const handleClaim = () => {\n const minutes = isCustom ? customMinutes : parseInt(duration);\n if (!minutes || minutes <= 0) return;\n onClaim(minutes);\n };\n\n const handleSubmitResolve = () => {\n setParseError('');\n\n // When triage is requested, ignore the form payload entirely.\n // Only the triage flag and notes matter — the form data (e.g.\n // approved: true) must NOT leak through, as it would confuse\n // the triage workflow into thinking the issue is already resolved.\n if (requestTriage) {\n const payload: Record<string, unknown> = {\n _lt: { needsTriage: true },\n };\n if (triageNotes.trim()) payload.notes = triageNotes.trim();\n onResolve(payload);\n return;\n }\n\n let payload: Record<string, unknown>;\n try {\n payload = JSON.parse(json);\n } catch {\n setParseError('Invalid JSON');\n return;\n }\n\n // Validate required fields from embedded _form_schema\n const schema = payload._form_schema as Record<string, unknown> | undefined;\n const required = schema?.required as string[] | undefined;\n if (required?.length) {\n const missing = required.filter((field) => {\n const val = payload[field];\n if (val === undefined || val === null) return true;\n if (typeof val === 'string' && val.trim() === '') return true;\n return false;\n });\n if (missing.length > 0) {\n onSubmitAttempt?.();\n const labels = missing.map((f) => f.replace(/[_-]/g, ' '));\n const display = labels.length <= 2\n ? labels.join(', ')\n : `${labels.slice(0, 2).join(', ')}...`;\n setParseError(`Required: ${display}`);\n return;\n }\n }\n\n // Submit the resolver payload in its final shape: drop the UI-only schema and\n // map the flat form fields into the nested payload via x-lt-bind. The server\n // stores this exactly as sent — the payload IS the payload.\n const { _form_schema, ...formValues } = payload;\n onResolve(mapFormToPayload(formValues, schema as Record<string, any> | undefined));\n };\n\n const tabClass = (active: boolean) =>\n `text-xs transition-colors ${active ? 'text-accent font-medium' : 'text-text-tertiary hover:text-accent'}`;\n\n return (\n // Flex-pinned at the bottom of the form column: full-bleed left into the\n // page gutter, ending at the side panel's edge on the right.\n <div className=\"shrink-0 h-[80px] bg-surface/95 backdrop-blur-sm border-t border-surface-border -ml-10 pl-10 pr-10 pt-3 pb-5\" data-testid=\"escalation-action-bar\">\n\n {/* ── Available: claim ── */}\n {mode === 'available' && (\n <div data-testid=\"claim-bar\">\n {/* Duration tab row */}\n <div className=\"flex items-center gap-4 mb-2\">\n {claimDurations.map((opt) => (\n <button\n key={opt.value}\n onClick={() => { setDuration(opt.value); setCustomMinutes(0); }}\n className={tabClass(!isCustom && duration === opt.value)}\n >\n {opt.label}\n </button>\n ))}\n <button\n onClick={() => setDuration('custom')}\n className={tabClass(isCustom)}\n >\n Other\n </button>\n </div>\n {/* Action row — right-aligned */}\n <div className=\"flex items-center gap-3\">\n <button\n onClick={onCancel}\n className=\"text-xs text-text-tertiary hover:text-status-error transition-colors\"\n >\n Cancel escalation\n </button>\n <div className=\"flex-1\" />\n {isCustom && (\n <CustomDurationPicker onChange={onCustomChange} compact autoFocus />\n )}\n <button\n onClick={handleClaim}\n disabled={claimPending || (isCustom && customMinutes <= 0)}\n className=\"btn-primary text-xs\"\n >\n {claimPending ? 'Claiming...' : 'Claim'}\n </button>\n </div>\n </div>\n )}\n\n {/* ── Claimed by other ── */}\n {mode === 'claimed_by_other' && (\n <div className=\"flex items-center gap-4\" data-testid=\"claimed-other-bar\">\n <p className=\"text-sm text-text-secondary\">\n Claimed by <span className=\"font-medium text-text-primary\">{assignedTo ? <UserName userId={assignedTo} /> : 'unknown'}</span>\n </p>\n {assignedUntil && <CountdownTimer until={assignedUntil} />}\n </div>\n )}\n\n {/* ── Claimed by me ── */}\n {mode === 'claimed_by_me' && (\n <div data-testid=\"action-bar\">\n {/* Tab row */}\n <div className=\"flex items-center gap-4 mb-2\">\n <button\n onClick={() => onActiveViewChange('resolve')}\n className={tabClass(activeView === 'resolve')}\n >\n {workflowType ? 'Resolve' : 'Acknowledge'}\n </button>\n {escalationTargets.length > 0 && (\n <button\n onClick={() => onActiveViewChange('escalate')}\n className={tabClass(activeView === 'escalate')}\n >\n Escalate\n </button>\n )}\n <button\n onClick={() => onActiveViewChange('release')}\n className={`text-xs transition-colors ${activeView === 'release' ? 'text-status-error font-medium' : 'text-text-tertiary hover:text-status-error'}`}\n >\n Release\n </button>\n <button\n onClick={onCancel}\n className=\"text-xs transition-colors text-text-tertiary hover:text-status-error\"\n >\n Cancel\n </button>\n </div>\n\n {/* ── Resolve controls ── */}\n {activeView === 'resolve' && (\n workflowType ? (\n <div className=\"flex items-center gap-4\">\n <div className=\"flex-1\" />\n\n {parseError && <span className=\"text-xs text-status-error\">{parseError}</span>}\n {resolveError && <span className=\"text-xs text-status-error\">{resolveError.message}</span>}\n\n <button\n onClick={handleSubmitResolve}\n disabled={resolvePending}\n className=\"btn-primary text-xs\"\n >\n {resolvePending ? 'Submitting...' : requestTriage ? 'Send to Triage' : 'Submit'}\n </button>\n </div>\n ) : (\n <div className=\"flex items-center\">\n <span className=\"text-xs text-text-secondary\">Notification — acknowledge to resolve</span>\n <div className=\"flex-1\" />\n {resolveError && <span className=\"text-xs text-status-error mr-3\">{resolveError.message}</span>}\n <button\n onClick={() => onResolve({ acknowledged: true })}\n disabled={resolvePending}\n className=\"btn-primary text-xs\"\n >\n {resolvePending ? 'Acknowledging...' : 'Acknowledge'}\n </button>\n </div>\n )\n )}\n\n {/* ── Escalate controls ── */}\n {activeView === 'escalate' && (\n <div className=\"flex items-center gap-3\">\n <span className=\"text-xs text-text-secondary\">\n From <span className=\"font-medium text-text-primary\">{currentRole}</span> to\n </span>\n <select\n value={escalateTarget}\n onChange={(e) => setEscalateTarget(e.target.value)}\n className=\"select text-xs\"\n data-testid=\"escalate-select\"\n >\n <option value=\"\">Select role...</option>\n {escalationTargets.map((role) => (\n <option key={role} value={role}>{role}</option>\n ))}\n </select>\n <div className=\"flex-1\" />\n {escalateError && <span className=\"text-xs text-status-error\">{escalateError.message}</span>}\n <button\n onClick={() => onEscalate(escalateTarget)}\n disabled={!escalateTarget || escalatePending}\n className=\"btn-primary text-xs\"\n >\n {escalatePending ? 'Escalating...' : 'Escalate'}\n </button>\n </div>\n )}\n\n {/* ── Release controls ── */}\n {activeView === 'release' && (\n <div className=\"flex items-center gap-3\">\n <span className=\"text-xs text-text-secondary\">Release back to pool?</span>\n <div className=\"flex-1\" />\n <button onClick={() => onActiveViewChange('resolve')} className=\"btn-secondary text-xs\">\n Back\n </button>\n <button\n onClick={onRelease}\n disabled={releasePending}\n className=\"btn-primary text-xs bg-status-error hover:bg-status-error/80\"\n >\n {releasePending ? 'Releasing...' : 'Yes, Release'}\n </button>\n </div>\n )}\n\n </div>\n )}\n </div>\n );\n}\n","/**\n * Lightweight markdown-to-HTML renderer for simple patterns.\n * No external dependency — handles bold, italic, code, links, headers, lists.\n */\n\nfunction renderInline(text: string): string {\n return text\n // Code spans\n .replace(/`([^`]+)`/g, '<code class=\"px-1 py-0.5 bg-surface-sunken rounded text-xs font-mono\">$1</code>')\n // Bold + italic\n .replace(/\\*\\*\\*(.+?)\\*\\*\\*/g, '<strong><em>$1</em></strong>')\n // Bold\n .replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n // Italic\n .replace(/\\*(.+?)\\*/g, '<em>$1</em>')\n // Links\n .replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, '<a href=\"$2\" class=\"text-accent-primary hover:underline\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>');\n}\n\nexport function SimpleMarkdown({ content, compact }: { content: string; compact?: boolean }) {\n // Extract fenced code blocks before line-by-line processing\n const segments: Array<{ type: 'code'; lang: string; code: string } | { type: 'text'; text: string }> = [];\n const fencePattern = /^```(\\w*)\\n([\\s\\S]*?)^```$/gm;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = fencePattern.exec(content)) !== null) {\n if (match.index > lastIndex) {\n segments.push({ type: 'text', text: content.slice(lastIndex, match.index) });\n }\n segments.push({ type: 'code', lang: match[1], code: match[2].replace(/\\n$/, '') });\n lastIndex = match.index + match[0].length;\n }\n if (lastIndex < content.length) {\n segments.push({ type: 'text', text: content.slice(lastIndex) });\n }\n\n const sizeClasses = compact\n ? { text: 'text-xs', heading: 'text-xs', list: 'text-xs', code: 'text-[11px]' }\n : { text: 'text-sm', heading: 'text-sm', list: 'text-sm', code: 'text-xs' };\n\n const allParts: string[] = [];\n for (const segment of segments) {\n if (segment.type === 'code') {\n const escaped = segment.code.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n allParts.push(\n `<pre class=\"my-2 p-2.5 bg-surface-sunken rounded-md overflow-x-auto\"><code class=\"${sizeClasses.code} font-mono text-text-secondary leading-relaxed\">${escaped}</code></pre>`,\n );\n continue;\n }\n allParts.push(...renderTextBlock(segment.text, sizeClasses));\n }\n\n return (\n <div\n className=\"prose-sm\"\n dangerouslySetInnerHTML={{ __html: allParts.join('\\n') }}\n />\n );\n}\n\nfunction renderTextBlock(\n text: string,\n sz: { text: string; heading: string; list: string; code: string },\n): string[] {\n const lines = text.split('\\n');\n const htmlParts: string[] = [];\n let inList = false;\n let inTable = false;\n let tableRows: string[][] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Table rows\n if (trimmed.startsWith('|') && trimmed.endsWith('|')) {\n const cells = trimmed.slice(1, -1).split('|').map((c) => c.trim());\n // Skip separator rows (|---|---|)\n if (cells.every((c) => /^[-:]+$/.test(c))) continue;\n if (!inTable) {\n inTable = true;\n tableRows = [];\n }\n tableRows.push(cells);\n continue;\n }\n if (inTable) {\n inTable = false;\n const [header, ...body] = tableRows;\n htmlParts.push('<div class=\"overflow-x-auto my-2\"><table class=\"text-xs w-full\"><thead><tr>');\n for (const h of header) {\n htmlParts.push(`<th class=\"text-left py-1 px-2 border-b border-border text-text-secondary font-medium\">${renderInline(h)}</th>`);\n }\n htmlParts.push('</tr></thead><tbody>');\n for (const row of body) {\n htmlParts.push('<tr>');\n for (const cell of row) {\n htmlParts.push(`<td class=\"py-1 px-2 border-b border-border/50\">${renderInline(cell)}</td>`);\n }\n htmlParts.push('</tr>');\n }\n htmlParts.push('</tbody></table></div>');\n tableRows = [];\n }\n\n // Empty line\n if (!trimmed) {\n if (inList) { htmlParts.push('</ul>'); inList = false; }\n continue;\n }\n\n // Headers\n if (trimmed.startsWith('### ')) {\n if (inList) { htmlParts.push('</ul>'); inList = false; }\n htmlParts.push(`<h4 class=\"${sz.heading} font-semibold text-text-primary mt-3 mb-1\">${renderInline(trimmed.slice(4))}</h4>`);\n continue;\n }\n if (trimmed.startsWith('## ')) {\n if (inList) { htmlParts.push('</ul>'); inList = false; }\n htmlParts.push(`<h3 class=\"${sz.heading} font-semibold text-text-primary mt-3 mb-1\">${renderInline(trimmed.slice(3))}</h3>`);\n continue;\n }\n\n // Horizontal rule\n if (/^[-*_]{3,}$/.test(trimmed)) {\n if (inList) { htmlParts.push('</ul>'); inList = false; }\n htmlParts.push('<hr class=\"border-border my-3\" />');\n continue;\n }\n\n // List items\n if (/^[-*] /.test(trimmed)) {\n if (!inList) { htmlParts.push('<ul class=\"space-y-1 my-1\">'); inList = true; }\n htmlParts.push(`<li class=\"${sz.list} text-text-secondary flex gap-2\"><span class=\"text-text-tertiary shrink-0\">-</span><span>${renderInline(trimmed.slice(2))}</span></li>`);\n continue;\n }\n\n // Paragraph\n if (inList) { htmlParts.push('</ul>'); inList = false; }\n htmlParts.push(`<p class=\"${sz.text} text-text-secondary my-1\">${renderInline(trimmed)}</p>`);\n }\n\n // Flush any remaining table\n if (inTable && tableRows.length) {\n const [header, ...body] = tableRows;\n htmlParts.push('<div class=\"overflow-x-auto my-2\"><table class=\"text-xs w-full\"><thead><tr>');\n for (const h of header) {\n htmlParts.push(`<th class=\"text-left py-1 px-2 border-b border-border text-text-secondary font-medium\">${renderInline(h)}</th>`);\n }\n htmlParts.push('</tr></thead><tbody>');\n for (const row of body) {\n htmlParts.push('<tr>');\n for (const cell of row) {\n htmlParts.push(`<td class=\"py-1 px-2 border-b border-border/50\">${renderInline(cell)}</td>`);\n }\n htmlParts.push('</tr>');\n }\n htmlParts.push('</tbody></table></div>');\n }\n\n if (inList) htmlParts.push('</ul>');\n\n return htmlParts;\n}\n","import { useState } from 'react';\nimport { Link } from 'react-router-dom';\n\nimport { JsonViewer } from '../common/data/JsonViewer';\nimport { SimpleMarkdown } from '../common/display/SimpleMarkdown';\n\ninterface RoundsExhaustedContextProps {\n payload: Record<string, unknown>;\n isTerminal?: boolean;\n resolverPayload?: Record<string, unknown> | null;\n onRetryTriage?: () => void;\n isRetrying?: boolean;\n}\n\nfunction SectionLabel({ children }: { children: React.ReactNode }) {\n return (\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5\">{children}</p>\n );\n}\n\nexport function RoundsExhaustedContext({ payload, isTerminal, resolverPayload, onRetryTriage, isRetrying }: RoundsExhaustedContextProps) {\n const title = payload.title as string | undefined;\n const summary = payload.summary as string | undefined;\n const diagnosis = payload.diagnosis as string | undefined;\n const toolCalls = payload.tool_calls_made as number | undefined;\n const result = payload.result as Record<string, unknown> | null | undefined;\n\n // Detect triage resolution\n const ltMeta = resolverPayload?._lt as Record<string, unknown> | undefined;\n const wasTriaged = ltMeta?.triaged === true;\n const triageWorkflowId = ltMeta?.triageWorkflowId as string | undefined;\n const isResolvedByTriage = isTerminal && wasTriaged;\n\n const [showResult, setShowResult] = useState(false);\n\n // Resolved by triage — show success state\n if (isResolvedByTriage) {\n return (\n <div className=\"rounded-md border border-status-success/30 bg-surface-raised\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-surface-border\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 text-status-success shrink-0\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z\" />\n </svg>\n <span className=\"text-xs font-medium text-status-success\">Resolved by AI Triage</span>\n </div>\n {typeof toolCalls === 'number' && (\n <span className=\"text-[10px] font-mono px-2 py-0.5 rounded-full bg-status-success/10 text-status-success\">\n {toolCalls} tool calls used\n </span>\n )}\n </div>\n\n {/* Body */}\n <div className=\"px-4 py-4 space-y-4\">\n {title && (\n <p className=\"text-sm font-medium text-text-primary\">{title}</p>\n )}\n\n {diagnosis && (\n <div>\n <SectionLabel>Triage diagnosis</SectionLabel>\n <div className=\"text-xs text-text-primary leading-relaxed\">\n <SimpleMarkdown content={diagnosis} />\n </div>\n </div>\n )}\n\n <div className=\"flex items-center gap-3\">\n {triageWorkflowId && (\n <Link\n to={`/workflows/executions/${triageWorkflowId}`}\n className=\"text-[10px] text-accent hover:underline\"\n >\n View triage execution\n </Link>\n )}\n </div>\n </div>\n </div>\n );\n }\n\n // Default: warning state\n return (\n <div className=\"rounded-md border border-status-warning/30 bg-surface-raised\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-surface-border\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 text-status-warning shrink-0\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 1a7 7 0 110 14A7 7 0 018 1zm0 3a.75.75 0 00-.75.75v3.5a.75.75 0 001.5 0v-3.5A.75.75 0 008 4zm0 7a.75.75 0 100-1.5.75.75 0 000 1.5z\" />\n </svg>\n <span className=\"text-xs font-medium text-status-warning\">Tool Rounds Exhausted</span>\n </div>\n {typeof toolCalls === 'number' && (\n <span className=\"text-[10px] font-mono px-2 py-0.5 rounded-full bg-status-warning/10 text-status-warning\">\n {toolCalls} tool calls used\n </span>\n )}\n </div>\n\n {/* Body */}\n <div className=\"px-4 py-4 space-y-4\">\n {title && (\n <p className=\"text-sm font-medium text-text-primary\">{title}</p>\n )}\n\n {summary && (\n <div>\n <SectionLabel>What happened</SectionLabel>\n <div className=\"text-xs text-text-secondary leading-relaxed\">\n <SimpleMarkdown content={summary} />\n </div>\n </div>\n )}\n\n {diagnosis && (\n <div>\n <SectionLabel>What went wrong</SectionLabel>\n <div className=\"text-xs text-text-primary leading-relaxed\">\n <SimpleMarkdown content={diagnosis} />\n </div>\n </div>\n )}\n\n {result != null && (\n <div>\n <button\n onClick={() => setShowResult(!showResult)}\n className=\"flex items-center gap-1 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary hover:text-text-secondary transition-colors\"\n >\n <svg className={`w-3 h-3 transition-transform ${showResult ? 'rotate-90' : ''}`} viewBox=\"0 0 12 12\" fill=\"currentColor\">\n <path d=\"M4.5 2l4 4-4 4\" />\n </svg>\n Partial results\n </button>\n {showResult && (\n <div className=\"mt-2\">\n <JsonViewer data={result} defaultMode=\"tree\" />\n </div>\n )}\n </div>\n )}\n\n {onRetryTriage && !isTerminal && (\n <div className=\"pt-2\">\n <button\n onClick={onRetryTriage}\n disabled={isRetrying}\n className=\"inline-flex items-center gap-2 px-4 py-2 text-xs font-medium bg-accent text-text-inverse rounded-md hover:bg-accent/90 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n <svg className=\"w-3.5 h-3.5\" viewBox=\"0 0 14 14\" fill=\"currentColor\">\n <path d=\"M7 1a6 6 0 100 12A6 6 0 007 1zm2.5 6.5l-3.5 2V5.5l3.5 2z\" />\n </svg>\n {isRetrying ? 'Sending to triage...' : 'Retry with AI Triage'}\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport type { LTEscalationRecord } from '../../api/types';\n\n// ---------------------------------------------------------------------------\n// postMessage protocol types\n// ---------------------------------------------------------------------------\n\n/** Messages sent from the parent to the iframe. */\ntype ParentMessage =\n | { type: 'lt:init'; escalation: IframeEscalationData; schema: Record<string, unknown> }\n | { type: 'lt:requestSubmit' }\n | { type: 'lt:validate' };\n\n/** Messages received from the iframe. */\ntype ChildMessage =\n | { type: 'lt:ready' }\n | { type: 'lt:submit'; payload: Record<string, unknown> }\n | { type: 'lt:escalate'; target: string }\n | { type: 'lt:resize'; height: number };\n\n/**\n * Escalation context delivered to the iframe via `lt:init`. Includes the\n * full envelope and metadata so the embedded app has all the context it\n * needs to load the right session and submit a meaningful payload back.\n *\n * The iframe is origin-validated before any message is sent, so secrets in\n * the envelope only travel to the declared src origin.\n */\ninterface IframeEscalationData {\n id: string;\n type: string;\n subtype: string;\n description: string | null;\n status: string;\n priority: number;\n role: string;\n workflow_type: string | null;\n envelope: Record<string, unknown> | null;\n metadata: Record<string, unknown> | null;\n escalation_payload: Record<string, unknown> | null;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\ninterface IframeViewportProps {\n src: string;\n escalation: LTEscalationRecord;\n schema: Record<string, unknown>;\n onResolve: (payload: Record<string, unknown>) => void;\n onEscalate: (targetRole: string) => void;\n submitAttempted?: boolean;\n /** Fill the parent container edge-to-edge (absolute inset-0). Used for full-bleed iframe mode. */\n fill?: boolean;\n}\n\nfunction safeParse(s: string | null | undefined): Record<string, unknown> | null {\n if (!s) return null;\n try { return JSON.parse(s) as Record<string, unknown>; } catch { return null; }\n}\n\n/**\n * Renders a sandboxed iframe for fully custom HITL UIs.\n *\n * Protocol — parent → iframe:\n * `lt:init` escalation context (id, envelope, metadata, payload) + schema\n * `lt:requestSubmit` ask the iframe to trigger its own submit flow\n * `lt:validate` ask the iframe to report validation errors\n *\n * Protocol — iframe → parent:\n * `lt:ready` iframe loaded, ready to receive `lt:init`\n * `lt:submit` work complete; payload becomes the resolver payload\n * `lt:escalate` re-route to a different role\n * `lt:resize` resize the iframe height\n *\n * The iframe can detect it is embedded via `window !== window.top` and\n * opt in to postMessage communication instead of its own submit UX.\n */\nexport function IframeViewport({ src, escalation, schema, onResolve, onEscalate, submitAttempted, fill }: IframeViewportProps) {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const iframeOrigin = useRef<string>('');\n\n // Parse the allowed origin from the src URL\n useEffect(() => {\n try {\n const url = new URL(src);\n iframeOrigin.current = url.origin;\n } catch {\n iframeOrigin.current = '';\n }\n }, [src]);\n\n const sendInit = useCallback(() => {\n const iframe = iframeRef.current;\n if (!iframe?.contentWindow || !iframeOrigin.current) return;\n\n const data: IframeEscalationData = {\n id: escalation.id,\n type: escalation.type,\n subtype: escalation.subtype,\n description: escalation.description,\n status: escalation.status,\n priority: escalation.priority,\n role: escalation.role,\n workflow_type: escalation.workflow_type,\n envelope: safeParse(escalation.envelope),\n metadata: escalation.metadata ?? null,\n escalation_payload: safeParse(escalation.escalation_payload),\n };\n\n const message: ParentMessage = { type: 'lt:init', escalation: data, schema };\n iframe.contentWindow.postMessage(message, iframeOrigin.current);\n }, [escalation, schema]);\n\n // Listen for messages from the iframe\n useEffect(() => {\n const handler = (event: MessageEvent) => {\n if (event.origin !== iframeOrigin.current) return;\n\n const data = event.data as ChildMessage;\n if (!data || typeof data !== 'object' || typeof data.type !== 'string') return;\n\n switch (data.type) {\n case 'lt:ready':\n sendInit();\n break;\n case 'lt:submit':\n if (data.payload && typeof data.payload === 'object') {\n onResolve(data.payload);\n }\n break;\n case 'lt:escalate':\n if (typeof data.target === 'string' && data.target) {\n onEscalate(data.target);\n }\n break;\n case 'lt:resize': {\n const iframe = iframeRef.current;\n if (iframe && typeof data.height === 'number' && data.height > 0) {\n iframe.style.height = `${Math.min(data.height, 2000)}px`;\n }\n break;\n }\n }\n };\n\n window.addEventListener('message', handler);\n return () => window.removeEventListener('message', handler);\n }, [sendInit, onResolve, onEscalate]);\n\n // Forward lt:validate to iframe when the action bar triggers a submit attempt\n useEffect(() => {\n if (!submitAttempted) return;\n const iframe = iframeRef.current;\n if (iframe?.contentWindow && iframeOrigin.current) {\n iframe.contentWindow.postMessage({ type: 'lt:validate' } as ParentMessage, iframeOrigin.current);\n }\n }, [submitAttempted]);\n\n if (fill) {\n return (\n <div className=\"absolute inset-0 overflow-hidden\">\n <iframe\n ref={iframeRef}\n src={src}\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-pointer-lock allow-downloads\"\n className=\"w-full h-full border-0 block\"\n title=\"HITL Viewport\"\n onLoad={sendInit}\n />\n </div>\n );\n }\n\n return (\n <div className=\"rounded-md border border-surface-border overflow-hidden bg-white\">\n <iframe\n ref={iframeRef}\n src={src}\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-pointer-lock allow-downloads\"\n className=\"w-full border-0\"\n style={{ minHeight: '600px' }}\n title=\"HITL Viewport\"\n onLoad={sendInit}\n />\n </div>\n );\n}\n","import { useCallback, useRef } from 'react';\n\ninterface FileUploadWidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n}\n\n/**\n * File upload widget that reads a file via FileReader and stores\n * its base64 data URL in the form value.\n */\nexport function FileUploadWidget({ fieldKey, value, onChange, schema }: FileUploadWidgetProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const accept = (schema?.accept as string) ?? undefined;\n const label = fieldKey.replace(/[_-]/g, ' ');\n const helperText = schema?.description as string | undefined;\n\n const handleFile = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result === 'string') {\n onChange(reader.result);\n }\n };\n reader.readAsDataURL(file);\n }, [onChange]);\n\n const hasFile = value.startsWith('data:');\n\n return (\n <div>\n <label className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n {label}\n </label>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <div className=\"mt-1\">\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n onChange={handleFile}\n className=\"hidden\"\n />\n <button\n type=\"button\"\n onClick={() => inputRef.current?.click()}\n className=\"btn-secondary text-xs px-3 py-1.5\"\n >\n {hasFile ? 'Replace file' : 'Choose file'}\n </button>\n {hasFile && (\n <span className=\"ml-2 text-xs text-status-success\">File attached</span>\n )}\n </div>\n </div>\n );\n}\n","import { useCallback } from 'react';\n\ninterface CodeEditorWidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n}\n\n/**\n * Monospace textarea with tab-key support for code input.\n */\nexport function CodeEditorWidget({ fieldKey, value, onChange, schema }: CodeEditorWidgetProps) {\n const label = fieldKey.replace(/[_-]/g, ' ');\n const helperText = schema?.description as string | undefined;\n const language = (schema?.['x-lt-language'] as string) ?? '';\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n const target = e.currentTarget;\n const start = target.selectionStart;\n const end = target.selectionEnd;\n const updated = value.substring(0, start) + ' ' + value.substring(end);\n onChange(updated);\n requestAnimationFrame(() => {\n target.selectionStart = target.selectionEnd = start + 2;\n });\n }\n }, [value, onChange]);\n\n return (\n <div>\n <label className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n {label}\n {language && (\n <span className=\"ml-2 text-text-tertiary/60 normal-case font-normal\">{language}</span>\n )}\n </label>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <textarea\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n className=\"input w-full mt-1 font-mono text-xs leading-relaxed\"\n rows={10}\n spellCheck={false}\n />\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface SignatureWidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n}\n\n/**\n * HTML5 Canvas signature pad. Outputs a PNG data URL.\n */\nexport function SignatureWidget({ fieldKey, value, onChange, schema }: SignatureWidgetProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [isDrawing, setIsDrawing] = useState(false);\n const label = fieldKey.replace(/[_-]/g, ' ');\n const helperText = schema?.description as string | undefined;\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n ctx.lineWidth = 2;\n ctx.lineCap = 'round';\n ctx.strokeStyle = '#1E1535';\n\n if (value && value.startsWith('data:')) {\n const img = new Image();\n img.onload = () => ctx.drawImage(img, 0, 0);\n img.src = value;\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const getPos = useCallback((e: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current!;\n const rect = canvas.getBoundingClientRect();\n if ('touches' in e) {\n return { x: e.touches[0].clientX - rect.left, y: e.touches[0].clientY - rect.top };\n }\n return { x: e.clientX - rect.left, y: e.clientY - rect.top };\n }, []);\n\n const startDraw = useCallback((e: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>) => {\n setIsDrawing(true);\n const ctx = canvasRef.current?.getContext('2d');\n if (!ctx) return;\n const pos = getPos(e);\n ctx.beginPath();\n ctx.moveTo(pos.x, pos.y);\n }, [getPos]);\n\n const draw = useCallback((e: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>) => {\n if (!isDrawing) return;\n const ctx = canvasRef.current?.getContext('2d');\n if (!ctx) return;\n const pos = getPos(e);\n ctx.lineTo(pos.x, pos.y);\n ctx.stroke();\n }, [isDrawing, getPos]);\n\n const endDraw = useCallback(() => {\n setIsDrawing(false);\n const canvas = canvasRef.current;\n if (canvas) {\n onChange(canvas.toDataURL('image/png'));\n }\n }, [onChange]);\n\n const clear = useCallback(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n onChange('');\n }, [onChange]);\n\n return (\n <div>\n <label className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n {label}\n </label>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <div className=\"mt-1 border border-surface-border rounded-md overflow-hidden bg-white\">\n <canvas\n ref={canvasRef}\n width={400}\n height={150}\n className=\"w-full cursor-crosshair touch-none\"\n onMouseDown={startDraw}\n onMouseMove={draw}\n onMouseUp={endDraw}\n onMouseLeave={endDraw}\n onTouchStart={startDraw}\n onTouchMove={draw}\n onTouchEnd={endDraw}\n />\n </div>\n <button\n type=\"button\"\n onClick={clear}\n className=\"mt-1 text-[10px] text-text-tertiary hover:text-accent transition-colors\"\n >\n Clear\n </button>\n </div>\n );\n}\n","interface RichTextWidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n}\n\n/**\n * Rich text input — a tall textarea with formatting hints.\n * A full WYSIWYG editor can replace this in a future iteration.\n */\nexport function RichTextWidget({ fieldKey, value, onChange, schema }: RichTextWidgetProps) {\n const label = fieldKey.replace(/[_-]/g, ' ');\n const helperText = schema?.description as string | undefined;\n\n return (\n <div>\n <label className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n {label}\n </label>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <textarea\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"input w-full mt-1 text-sm leading-relaxed\"\n rows={8}\n placeholder=\"Supports plain text. Markdown formatting is preserved.\"\n />\n </div>\n );\n}\n","import { useState } from 'react';\nimport { MarkdownRenderer } from '../../common/display/MarkdownRenderer';\n\ninterface MarkdownWidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n}\n\n/**\n * Markdown field — the same renderer the docs drawer uses, so a versioned\n * form schema can carry page source. Two shapes:\n *\n * - `readOnly: true` → a content block. The field's markdown (typically the\n * schema `default`) renders as HTML with no input chrome — instructions,\n * SOPs, and context live in the form as authored, versioned pages.\n * - editable → a Write/Preview source editor. The submitted value is the\n * markdown source.\n */\nexport function MarkdownWidget({ fieldKey, value, onChange, schema }: MarkdownWidgetProps) {\n const [tab, setTab] = useState<'write' | 'preview'>('write');\n const label = fieldKey.replace(/[_-]/g, ' ');\n const helperText = schema?.description as string | undefined;\n const isReadOnly = schema?.readOnly === true;\n\n if (isReadOnly) {\n // Pure content block — the markdown carries its own headings and structure.\n return <MarkdownRenderer content={value} className=\"my-1\" />;\n }\n\n return (\n <div>\n <div className=\"flex items-center justify-between\">\n <label className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n {label}\n </label>\n <div className=\"flex items-center gap-0.5\">\n {(['write', 'preview'] as const).map((t) => (\n <button\n key={t}\n type=\"button\"\n onClick={() => setTab(t)}\n className={`px-2 py-0.5 text-[10px] rounded transition-colors ${\n tab === t\n ? 'bg-accent/10 text-accent font-semibold'\n : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n {t === 'write' ? 'Write' : 'Preview'}\n </button>\n ))}\n </div>\n </div>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n {tab === 'write' ? (\n <textarea\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"input w-full mt-1 text-sm font-mono leading-relaxed\"\n rows={10}\n placeholder=\"Write markdown — headings, lists, tables, code blocks, and links all render.\"\n />\n ) : (\n <div className=\"mt-1 px-3 py-2 border border-surface-border rounded min-h-[120px]\">\n {value.trim() ? (\n <MarkdownRenderer content={value} />\n ) : (\n <p className=\"text-xs text-text-quaternary italic\">Nothing to preview.</p>\n )}\n </div>\n )}\n </div>\n );\n}\n","import type { ComponentType } from 'react';\nimport { FileUploadWidget } from './FileUploadWidget';\nimport { CodeEditorWidget } from './CodeEditorWidget';\nimport { SignatureWidget } from './SignatureWidget';\nimport { RichTextWidget } from './RichTextWidget';\nimport { MarkdownWidget } from './MarkdownWidget';\n\nexport interface WidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n}\n\n/**\n * Registry of custom widgets referenced via `x-lt-widget` in JSON Schema.\n * Each widget renders a specialized input for a string field.\n */\nexport const WIDGET_MAP: Record<string, ComponentType<WidgetProps>> = {\n 'file-upload': FileUploadWidget,\n 'code-editor': CodeEditorWidget,\n 'signature': SignatureWidget,\n 'rich-text': RichTextWidget,\n 'markdown': MarkdownWidget,\n};\n","import { useState, useEffect, useCallback } from 'react';\nimport { WIDGET_MAP } from './widgets';\n\ntype JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\n\n/**\n * Renders a JSON object as an editable form with typed inputs.\n *\n * - Strings → text input (textarea if > 80 chars)\n * - Booleans → toggle switch\n * - Numbers → number input\n * - Null → disabled placeholder\n * - Objects → nested section\n * - Arrays of strings → tag display\n * - Keys starting with `_` → hidden (preserved in output)\n *\n * Calls `onChange` with the full JSON string on every edit.\n */\nexport function ResolverForm({ value, onChange, disabled, submitAttempted }: {\n value: string;\n onChange: (json: string) => void;\n disabled?: boolean;\n submitAttempted?: boolean;\n}) {\n const [data, setData] = useState<Record<string, JsonValue>>({});\n const [hidden, setHidden] = useState<Record<string, JsonValue>>({});\n const [formSchema, setFormSchema] = useState<Record<string, any> | null>(null);\n const [parseError, setParseError] = useState(false);\n const [touched, setTouched] = useState<Set<string>>(new Set());\n\n // Parse incoming JSON\n useEffect(() => {\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n const visible: Record<string, JsonValue> = {};\n const internal: Record<string, JsonValue> = {};\n for (const [k, v] of Object.entries(parsed)) {\n if (k.startsWith('_')) {\n internal[k] = v as JsonValue;\n } else {\n visible[k] = v as JsonValue;\n }\n }\n setData(visible);\n setHidden(internal);\n setFormSchema(\n internal._form_schema && typeof internal._form_schema === 'object'\n ? internal._form_schema as Record<string, any>\n : null,\n );\n setParseError(false);\n }\n } catch {\n setParseError(true);\n }\n }, [value]);\n\n const emitChange = useCallback((updated: Record<string, JsonValue>) => {\n setData(updated);\n onChange(JSON.stringify({ ...updated, ...hidden }, null, 2));\n }, [hidden, onChange]);\n\n const updateField = useCallback((key: string, val: JsonValue) => {\n emitChange({ ...data, [key]: val });\n }, [data, emitChange]);\n\n const markTouched = useCallback((key: string) => {\n setTouched((prev) => {\n if (prev.has(key)) return prev;\n const next = new Set(prev);\n next.add(key);\n return next;\n });\n }, []);\n\n if (parseError) {\n return (\n <p className=\"text-xs text-status-error\">\n Unable to parse resolver data as form. Use the JSON editor below.\n </p>\n );\n }\n\n const allEntries = Object.entries(data);\n if (allEntries.length === 0) {\n return (\n <p className=\"text-xs text-text-tertiary italic\">\n No resolver fields defined.\n </p>\n );\n }\n\n // Field ordering via x-lt-order\n const fieldOrder = formSchema?.['x-lt-order'] as string[] | undefined;\n const entries = fieldOrder\n ? [...allEntries].sort((a, b) => {\n const ai = fieldOrder.indexOf(a[0]);\n const bi = fieldOrder.indexOf(b[0]);\n return (ai === -1 ? Infinity : ai) - (bi === -1 ? Infinity : bi);\n })\n : allEntries;\n\n const requiredFields = new Set(formSchema?.required as string[] ?? []);\n const layout = formSchema?.['x-lt-layout'] as string | undefined;\n const schemaTitle = formSchema?.title as string | undefined;\n const schemaDescription = formSchema?.description as string | undefined;\n\n const fieldRows = entries.map(([key, val]) => {\n const fieldSchema = formSchema?.properties?.[key] as Record<string, unknown> | undefined;\n const isReadOnly = fieldSchema?.readOnly === true;\n const span = (fieldSchema?.['x-lt-span'] as number) ?? 1;\n const isReq = requiredFields.has(key);\n const isTouched = touched.has(key) || !!submitAttempted;\n\n // Derive inline error for touched required fields\n let error: string | undefined;\n if (isReq && isTouched) {\n if (val === undefined || val === null) {\n error = 'Required';\n } else if (typeof val === 'string' && val.trim() === '') {\n error = 'Required';\n }\n }\n // Format-specific validation for touched fields\n if (isTouched && typeof val === 'string' && val.trim() !== '' && fieldSchema) {\n const fmt = fieldSchema.format as string | undefined;\n if (fmt === 'email' && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(val)) {\n error = 'Enter a valid email address';\n }\n if (fmt === 'uri' && !/^https?:\\/\\/.+/.test(val)) {\n error = 'Enter a valid URL';\n }\n }\n\n return (\n <div\n key={key}\n className={layout === 'two-column' && span >= 2 ? 'col-span-2' : ''}\n >\n <FieldRow\n fieldKey={key}\n value={val}\n onChange={(v) => updateField(key, v)}\n onBlur={() => markTouched(key)}\n schema={formSchema}\n isRequired={isReq}\n isReadOnly={isReadOnly}\n error={error}\n />\n </div>\n );\n });\n\n return (\n <div className={`pb-8 ${disabled ? 'opacity-60 pointer-events-none' : ''}`}>\n {/* Schema title and description */}\n {schemaTitle && (\n <h3 className=\"text-lg font-light text-text-primary mb-1\">{schemaTitle}</h3>\n )}\n {schemaDescription && (\n <p className=\"text-sm text-text-secondary leading-relaxed mb-6\">{schemaDescription}</p>\n )}\n\n {/* Layout modes */}\n {layout === 'two-column' ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-x-14 gap-y-6\">{fieldRows}</div>\n ) : (\n <div className=\"space-y-6\">{fieldRows}</div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Field row — renders appropriate input per type\n// ---------------------------------------------------------------------------\n\nfunction FieldRow({ fieldKey, value, onChange, onBlur, schema, isRequired, isReadOnly, error }: {\n fieldKey: string;\n value: JsonValue;\n onChange: (v: JsonValue) => void;\n onBlur?: () => void;\n schema?: Record<string, any> | null;\n isRequired?: boolean;\n isReadOnly?: boolean;\n error?: string;\n}) {\n const label = fieldKey.replace(/[_-]/g, ' ');\n const fieldSchema = schema?.properties?.[fieldKey] as Record<string, any> | undefined;\n const widgetName = fieldSchema?.['x-lt-widget'] as string | undefined;\n\n // Markdown dispatches ahead of the read-only branch: a readOnly markdown\n // field is a CONTENT BLOCK — the widget renders its source as HTML (the\n // versioned schema carries the page source), not as static text.\n const isMarkdown = widgetName === 'markdown' && typeof value === 'string';\n\n // Read-only fields display as static text\n if (isReadOnly && !isMarkdown) {\n const displayValue = value === null ? 'null'\n : typeof value === 'object' ? JSON.stringify(value, null, 2)\n : String(value);\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n <p className=\"text-sm text-text-secondary mt-0.5 whitespace-pre-wrap\">{displayValue}</p>\n </div>\n );\n }\n\n // Custom widget via x-lt-widget (string fields only)\n if (widgetName && widgetName in WIDGET_MAP && typeof value === 'string') {\n const Widget = WIDGET_MAP[widgetName];\n return <Widget fieldKey={fieldKey} value={value} onChange={(v) => onChange(v)} schema={fieldSchema} />;\n }\n\n // Boolean → checkbox\n if (typeof value === 'boolean') {\n return (\n <div>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={value}\n onChange={(e) => { onChange(e.target.checked); onBlur?.(); }}\n className=\"w-3.5 h-3.5 rounded accent-accent\"\n />\n <span className=\"text-[11px] font-semibold uppercase tracking-wider text-text-secondary\">\n {label}\n {isRequired && <span className=\"text-status-error ml-0.5\">*</span>}\n </span>\n </label>\n <FieldError error={error} />\n </div>\n );\n }\n\n // Number\n if (typeof value === 'number') {\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n <input\n type=\"number\"\n value={value}\n onChange={(e) => onChange(parseFloat(e.target.value) || 0)}\n onBlur={onBlur}\n step=\"any\"\n className={inputClass(!!error)}\n />\n <FieldError error={error} />\n </div>\n );\n }\n\n // String\n if (typeof value === 'string') {\n const isPassword = fieldSchema?.format === 'password';\n const enumValues = fieldSchema?.enum as string[] | undefined;\n const helperText = fieldSchema?.description as string | undefined;\n\n if (enumValues?.length) {\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onBlur={onBlur}\n className={inputClass(!!error)}\n >\n {enumValues.map((opt) => (\n <option key={opt} value={opt}>{opt}</option>\n ))}\n </select>\n <FieldError error={error} />\n </div>\n );\n }\n\n if (isPassword) {\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <input\n type=\"password\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onBlur={onBlur}\n className={inputClass(!!error)}\n autoComplete=\"off\"\n />\n <FieldError error={error} />\n </div>\n );\n }\n\n // Format-based input types\n const format = fieldSchema?.format as string | undefined;\n const FORMAT_INPUT_TYPES: Record<string, string> = {\n date: 'date',\n 'date-time': 'datetime-local',\n email: 'email',\n uri: 'url',\n };\n if (format && format in FORMAT_INPUT_TYPES) {\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <input\n type={FORMAT_INPUT_TYPES[format]}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onBlur={onBlur}\n className={inputClass(!!error)}\n />\n <FieldError error={error} />\n </div>\n );\n }\n\n // Explicit textarea format or long content\n if (format === 'textarea' || value.length > 80) {\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <textarea\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onBlur={onBlur}\n className={`${inputClass(!!error)} leading-relaxed`}\n rows={Math.min(6, Math.max(3, Math.ceil(value.length / 60)))}\n />\n <FieldError error={error} />\n </div>\n );\n }\n\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onBlur={onBlur}\n className={inputClass(!!error)}\n />\n <FieldError error={error} />\n </div>\n );\n }\n\n // Null\n if (value === null) {\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n <p className=\"text-xs text-text-tertiary italic mt-1\">null</p>\n </div>\n );\n }\n\n // Array of primitives\n if (Array.isArray(value)) {\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n <div className=\"flex flex-wrap gap-1.5 mt-1\">\n {value.map((item, i) => (\n <span\n key={i}\n className=\"px-2 py-0.5 text-[11px] font-mono bg-surface-sunken rounded text-text-secondary\"\n >\n {String(item)}\n </span>\n ))}\n </div>\n </div>\n );\n }\n\n // Nested object → recursive\n if (typeof value === 'object') {\n const entries = Object.entries(value);\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n <div className=\"ml-4 mt-2 pl-4 border-l border-accent-faint space-y-3\">\n {entries.map(([k, v]) => (\n <FieldRow\n key={k}\n fieldKey={k}\n value={v}\n onChange={(updated) => onChange({ ...value, [k]: updated })}\n />\n ))}\n </div>\n </div>\n );\n }\n\n return null;\n}\n\nfunction FieldLabel({ children, isRequired }: { children: React.ReactNode; isRequired?: boolean }) {\n return (\n <label className=\"text-[11px] font-semibold uppercase tracking-wider text-text-secondary\">\n {children}\n {isRequired && <span className=\"text-status-error ml-0.5\">*</span>}\n </label>\n );\n}\n\nfunction FieldError({ error }: { error?: string }) {\n if (!error) return null;\n return (\n <p className=\"text-[10px] text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]\">\n {error}\n </p>\n );\n}\n\nfunction inputClass(hasError?: boolean): string {\n return hasError\n ? 'input text-sm w-full mt-1 border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]'\n : 'input text-sm w-full mt-1';\n}\n","import { ResolverForm } from '../../../components/escalation/ResolverForm';\n\nexport function ResolverSection({\n json,\n onJsonChange,\n requestTriage,\n onRequestTriageChange,\n triageNotes,\n onTriageNotesChange,\n disabled = false,\n submitAttempted = false,\n showTriage = false,\n}: {\n json: string;\n onJsonChange: (v: string) => void;\n requestTriage: boolean;\n onRequestTriageChange: (v: boolean) => void;\n triageNotes: string;\n onTriageNotesChange: (v: string) => void;\n disabled?: boolean;\n submitAttempted?: boolean;\n showTriage?: boolean;\n}) {\n return (\n <>\n {/* Triage callout */}\n {showTriage && (\n <div className=\"flex items-center justify-between mb-3\">\n {requestTriage ? (\n <button\n onClick={() => onRequestTriageChange(false)}\n className=\"group flex items-center gap-2 text-left\"\n data-testid=\"triage-cancel\"\n >\n <span className=\"flex items-center justify-center w-5 h-5 rounded-full bg-accent/10 text-accent shrink-0\">\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </span>\n <span className=\"text-xs text-text-secondary group-hover:text-text-primary transition-colors\">\n AI Triage active.{' '}\n <span className=\"text-accent group-hover:underline\">Cancel</span>\n </span>\n </button>\n ) : (\n <button\n onClick={() => onRequestTriageChange(true)}\n className=\"group flex items-center gap-2.5 text-left my-4\"\n data-testid=\"triage-callout\"\n >\n <span className=\"flex items-center justify-center w-6 h-6 rounded-full bg-accent/10 text-accent shrink-0 animate-[triage-glow_6s_ease-in-out_infinite]\">\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.663 17h4.674M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\" />\n </svg>\n </span>\n <span className=\"text-[13px] text-text-secondary group-hover:text-text-primary transition-colors\">\n This form doesn't capture the issue?{' '}\n <span className=\"text-accent group-hover:underline\">Request AI Triage</span>\n </span>\n </button>\n )}\n </div>\n )}\n\n <div className=\"relative min-h-[200px]\">\n {/* Form controls */}\n <div className={requestTriage ? 'pointer-events-none select-none' : ''}>\n <ResolverForm value={json} onChange={onJsonChange} disabled={disabled} submitAttempted={submitAttempted} />\n </div>\n\n {/* Triage overlay — occludes the form when AI Triage is checked */}\n {requestTriage && (\n <div\n className=\"absolute inset-0 z-10 flex flex-col bg-surface/90 backdrop-blur-[2px] rounded-md border border-accent/20 p-5\"\n data-testid=\"triage-overlay\"\n >\n <p className=\"text-xs text-text-secondary mb-3 leading-relaxed\">\n The resolution form will not be submitted. Describe the issue\n so AI triage can diagnose and fix it using available tools.\n The corrected result will come back as a new escalation for\n your review.\n </p>\n <textarea\n value={triageNotes}\n onChange={(e) => onTriageNotesChange(e.target.value)}\n placeholder=\"e.g. Content is in Spanish — needs translation to English before review...\"\n className=\"input text-xs w-full flex-1 min-h-[80px] resize-none\"\n autoFocus\n data-testid=\"triage-notes\"\n />\n </div>\n )}\n </div>\n </>\n );\n}\n","import { Link } from 'react-router-dom';\nimport { KeyRound, MonitorPlay } from 'lucide-react';\nimport { RoundsExhaustedContext } from '../../../components/escalation/RoundsExhaustedContext';\nimport { IframeViewport } from '../../../components/escalation/IframeViewport';\nimport { ResolverForm } from '../../../components/escalation/ResolverForm';\nimport { mapPayloadToForm } from '../../../lib/x-lt-bind';\nimport { ResolverSection } from './ResolverSection';\nimport type { ActiveView } from './EscalationActionBar';\nimport type { LTEscalationRecord } from '../../../api/types';\n\n/**\n * Expands `{key}` tokens in a viewport src URL using values from the\n * escalation's payload, envelope, and metadata — merged in that order so\n * escalation_payload values win over envelope, and envelope wins over metadata.\n *\n * This mirrors how the existing form schemas map envelope/metadata values into\n * default field values, but applied to the iframe src URL.\n */\nexport function expandViewportSrc(src: string, esc: LTEscalationRecord): string {\n if (!src.includes('{')) return src;\n try {\n const parse = (s: string | null | undefined): Record<string, unknown> => {\n if (!s) return {};\n try { return JSON.parse(s) as Record<string, unknown>; } catch { return {}; }\n };\n const merged = {\n ...parse(esc.metadata as any),\n ...parse(esc.envelope),\n ...parse(esc.escalation_payload),\n };\n return src.replace(/\\{([^}]+)\\}/g, (_, key) =>\n Object.prototype.hasOwnProperty.call(merged, key) ? String(merged[key]) : `{${key}}`\n );\n } catch {\n return src;\n }\n}\n\ninterface EscalationContextProps {\n isRoundsExhausted: boolean;\n payloadObj: Record<string, unknown> | null;\n isTerminal: boolean;\n resolverPayload: Record<string, unknown> | null;\n onRetryTriage: () => Promise<void>;\n isRetrying: boolean;\n}\n\nexport function EscalationContextBlocks({\n isRoundsExhausted,\n payloadObj,\n isTerminal,\n resolverPayload,\n onRetryTriage,\n isRetrying,\n}: EscalationContextProps) {\n return (\n <>\n {/* Rounds-exhausted structured context */}\n {isRoundsExhausted && payloadObj && (\n <div className=\"mt-8\">\n <RoundsExhaustedContext\n payload={payloadObj}\n isTerminal={isTerminal}\n resolverPayload={resolverPayload}\n onRetryTriage={onRetryTriage}\n isRetrying={isRetrying}\n />\n </div>\n )}\n\n {/* Missing credential context */}\n {payloadObj?.category === 'missing_credential' && (\n <div className=\"mt-8 bg-status-warning/10 border border-status-warning/30 rounded-md px-5 py-4 flex items-start gap-3\">\n <KeyRound size={20} className=\"text-status-warning mt-0.5 shrink-0\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary mb-1\">Missing Credential</p>\n <p className=\"text-xs text-text-secondary mb-3\">\n This workflow requires a <span className=\"font-medium capitalize\">{String(payloadObj.provider)}</span> credential\n to continue. Register one and then resolve this escalation to retry.\n </p>\n <Link\n to=\"/credentials\"\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <KeyRound size={12} />\n Go to Credentials\n </Link>\n </div>\n </div>\n )}\n </>\n );\n}\n\ninterface FormSectionProps {\n esc: LTEscalationRecord;\n resolverPayload: unknown;\n isTerminal: boolean;\n claimedByMe: boolean;\n activeView: ActiveView;\n metadataFormSchema: unknown;\n /** The resolved form schema (metadata-embedded, role-owned, or workflow fallback). */\n effectiveSchema: Record<string, unknown> | null;\n json: string;\n onJsonChange: (v: string) => void;\n requestTriage: boolean;\n onRequestTriageChange: (v: boolean) => void;\n triageNotes: string;\n onTriageNotesChange: (v: string) => void;\n onResolve?: (payload: Record<string, unknown>) => void;\n onEscalate?: (targetRole: string) => void;\n onClaim?: () => void;\n submitAttempted?: boolean;\n isCertified?: boolean;\n hasAI?: boolean;\n}\n\n/**\n * The form area — the page's single, direct surface: the resolve form (or a\n * custom iframe viewport), shown even before claiming and enabled by the\n * claim. Terminal escalations render the submitted resolution read-only.\n * Everything else about the record lives in the side panel.\n */\nexport function EscalationFormSection({\n esc,\n resolverPayload,\n isTerminal,\n claimedByMe,\n activeView,\n metadataFormSchema,\n effectiveSchema,\n json,\n onJsonChange,\n requestTriage,\n onRequestTriageChange,\n triageNotes,\n onTriageNotesChange,\n onResolve,\n onEscalate,\n onClaim,\n submitAttempted,\n isCertified,\n hasAI,\n}: FormSectionProps) {\n const schema = effectiveSchema;\n\n // Terminal: show the submitted resolution read-only. The stored payload is\n // the NESTED shape (mapped through x-lt-bind on submit) — reverse-map it\n // back to flat form fields so the resolution renders as the same two-column\n // form it was filled in on, not as raw payload sections.\n if (isTerminal) {\n if (resolverPayload == null) return null;\n const payload = typeof resolverPayload === 'object' && resolverPayload !== null\n ? resolverPayload as Record<string, unknown>\n : {};\n const formSchema = (effectiveSchema ?? (metadataFormSchema as Record<string, any> | null));\n const value = formSchema?.properties\n ? { ...mapPayloadToForm(payload, formSchema), _form_schema: formSchema }\n : payload;\n return (\n <div className=\"mt-8 pt-6\">\n <ResolverForm\n value={JSON.stringify(value, null, 2)}\n onChange={() => {}}\n disabled\n />\n </div>\n );\n }\n\n if (activeView !== 'resolve' || !(esc.workflow_type || effectiveSchema)) return null;\n\n const viewport = schema?.['x-lt-viewport'] as { type?: string; src?: string } | undefined;\n const isIframeViewport = viewport?.type === 'iframe' && !!viewport.src && onResolve && onEscalate;\n\n if (isIframeViewport && !claimedByMe) {\n return (\n <button\n onClick={() => onClaim?.()}\n disabled={!onClaim}\n className=\"flex flex-col items-center justify-center min-h-[55vh] w-full gap-3 text-center group disabled:opacity-50 disabled:cursor-default\"\n >\n <MonitorPlay className=\"w-10 h-10 text-text-tertiary group-hover:text-accent transition-colors\" strokeWidth={1} />\n <p className=\"text-base font-medium text-text-primary group-hover:text-accent transition-colors\">Claim to launch the editor</p>\n </button>\n );\n }\n\n const resolvedSrc = isIframeViewport ? expandViewportSrc(viewport!.src!, esc) : '';\n\n return (\n <div className=\"mt-8 pt-6\">\n {isIframeViewport ? (\n <IframeViewport\n src={resolvedSrc}\n escalation={esc}\n schema={schema!}\n onResolve={onResolve!}\n onEscalate={onEscalate!}\n submitAttempted={submitAttempted}\n />\n ) : (\n <ResolverSection\n json={json}\n onJsonChange={onJsonChange}\n requestTriage={requestTriage}\n onRequestTriageChange={onRequestTriageChange}\n triageNotes={triageNotes}\n onTriageNotesChange={onTriageNotesChange}\n disabled={!claimedByMe}\n submitAttempted={submitAttempted}\n showTriage={!!isCertified && !!hasAI}\n />\n )}\n </div>\n );\n}\n","import { useState, useEffect, useRef } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useAuth } from '../../../hooks/useAuth';\nimport { useAccess } from '../../../hooks/useAccess';\nimport {\n useEscalation,\n useClaimEscalation,\n useResolveEscalation,\n useEscalateToRole,\n useCancelEscalation,\n} from '../../../api/escalations';\nimport { ConfirmCancelModal } from '../../../components/common/modal/ConfirmCancelModal';\nimport { useEscalationTargets } from '../../../api/roles';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../../components/common/data/ListToolbar';\nimport { isEffectivelyClaimed } from '../../../lib/escalation';\nimport { mapPayloadToForm } from '../../../lib/x-lt-bind';\nimport { useWorkflowConfigs } from '../../../api/workflows';\nimport { useSettings } from '../../../api/settings';\nimport { getAiOverride } from '../../../lib/view-as';\nimport { useEscalationDetailEvents } from '../../../hooks/useEventHooks';\nimport { PanelRightClose, PanelRightOpen, RotateCcw, X } from 'lucide-react';\nimport { EscalationSidePanel } from '../../../components/escalation/EscalationSidePanel';\nimport { EscalationActionBar } from './EscalationActionBar';\nimport type { ActionBarMode, ActiveView } from './EscalationActionBar';\nimport { EscalationContextBlocks, EscalationFormSection, expandViewportSrc } from './EscalationDetailSections';\nimport { IframeViewport } from '../../../components/escalation/IframeViewport';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst PANEL_OPEN_KEY = 'lt:escalation:panel:open';\n\nfunction readPanelOpen(): boolean {\n try {\n const v = localStorage.getItem(PANEL_OPEN_KEY);\n return v === null ? true : v === 'true';\n } catch {\n return true;\n }\n}\n\nfunction savePanelOpen(open: boolean): void {\n try { localStorage.setItem(PANEL_OPEN_KEY, String(open)); } catch {}\n}\n\nfunction safeParse(value: string | null | undefined): unknown {\n if (!value) return null;\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main page\n// ---------------------------------------------------------------------------\n\nexport function EscalationDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { user } = useAuth();\n const navigate = useNavigate();\n const queryClient = useQueryClient();\n const { data: esc, isLoading, refetch, isFetching } = useEscalation(id!);\n useEscalationDetailEvents(id);\n const claim = useClaimEscalation();\n const resolve = useResolveEscalation();\n const escalate = useEscalateToRole();\n const cancel = useCancelEscalation();\n const [cancelModalOpen, setCancelModalOpen] = useState(false);\n const { data: escalationTargets } = useEscalationTargets(esc?.role ?? '');\n const { data: workflowConfigs } = useWorkflowConfigs();\n const { data: settings } = useSettings();\n\n const { isBuilder } = useAccess();\n\n const wfConfig = workflowConfigs?.find((c) => c.workflow_type === esc?.workflow_type);\n const traceUrl = settings?.telemetry?.traceUrl ?? null;\n const [activeView, setActiveView] = useState<ActiveView>('resolve');\n const [json, setJson] = useState('{}');\n\n const [sidePanelOpen, setSidePanelOpen] = useState<boolean>(readPanelOpen);\n\n const [requestTriage, setRequestTriage] = useState(false);\n const [triageNotes, setTriageNotes] = useState('');\n const [submitAttempted, setSubmitAttempted] = useState(false);\n // Schema resolution, most specific first:\n // 1. metadata.form_schema — a full form embedded on the row (legacy records)\n // 2. esc.form_schema — the role's form the single-escalation GET already\n // JOINed in, resolved to the row's pinned version (metadata.schema_version)\n // or the role's latest when unpinned. No second call.\n // 3. workflow-level resolver_schema (legacy fallback)\n const metadataFormSchema = (esc?.metadata as any)?.form_schema ?? null;\n const resolverSchema =\n (esc?.form_schema ?? wfConfig?.resolver_schema ?? null) as Record<string, any> | null;\n const effectiveSchema = metadataFormSchema ?? resolverSchema;\n\n // Initialize json from the form exactly once. Each field is seeded from the\n // workflow's `envelope.formDefaults` (a resolver-shaped payload, reverse-mapped\n // through x-lt-bind to the flat form) and falls back to the field's schema\n // default. So workflow-sent defaults prefill; schema defaults fill the rest.\n // Subsequent esc refetches (claim events, real-time updates) must NOT reset\n // user edits. The form arrives embedded on esc, so nothing else to await.\n const jsonInitialized = useRef(false);\n useEffect(() => {\n if (jsonInitialized.current) return;\n const formSchema = metadataFormSchema ?? (resolverSchema?.properties ? resolverSchema : null);\n if (formSchema?.properties) {\n jsonInitialized.current = true;\n const seeded = safeParse(esc?.envelope) as Record<string, any> | null;\n const seededDefaults = seeded?.formDefaults;\n const prefill = seededDefaults && typeof seededDefaults === 'object'\n ? mapPayloadToForm(seededDefaults as Record<string, any>, formSchema)\n : {};\n const initial: Record<string, any> = { _form_schema: formSchema };\n for (const [key, def] of Object.entries(formSchema.properties)) {\n const fieldDef = def as Record<string, any>;\n initial[key] = prefill[key] ?? fieldDef.default ?? '';\n }\n setJson(JSON.stringify(initial, null, 2));\n } else if (effectiveSchema) {\n jsonInitialized.current = true;\n setJson(JSON.stringify(effectiveSchema, null, 2));\n }\n }, [effectiveSchema, metadataFormSchema, resolverSchema, esc?.envelope]);\n\n const isRoundsExhausted = esc?.subtype === 'rounds_exhausted';\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-8\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-32 bg-surface-sunken rounded w-full\" />\n </div>\n );\n }\n\n if (!esc) {\n return <p className=\"text-sm text-text-secondary\">Escalation not found.</p>;\n }\n\n const claimed = isEffectivelyClaimed(esc);\n const claimedByMe = claimed && esc.assigned_to === user?.userId;\n const claimedByOther = claimed && !claimedByMe;\n const isTerminal = esc.status === 'resolved' || esc.status === 'cancelled';\n\n const iframeViewport = (effectiveSchema as any)?.['x-lt-viewport'] as { type?: string; src?: string } | undefined;\n const isIframeMode = iframeViewport?.type === 'iframe' && !!iframeViewport?.src && claimedByMe && !isTerminal;\n\n const escalationPayload = safeParse(esc.escalation_payload);\n const resolverPayload = safeParse(esc.resolver_payload);\n const envelopeObj = safeParse(esc.envelope) as Record<string, any> | null;\n const isCertified = !!(envelopeObj?.metadata?.certified);\n const aiOverride = getAiOverride();\n const hasAI = aiOverride !== null ? aiOverride : !!(settings as any)?.ai?.enabled;\n\n const payloadObj = (typeof escalationPayload === 'object' && escalationPayload !== null && !Array.isArray(escalationPayload))\n ? escalationPayload as Record<string, unknown>\n : null;\n const triageData = payloadObj?._triage as Record<string, unknown> | undefined;\n const resolverObj = (typeof resolverPayload === 'object' && resolverPayload !== null && !Array.isArray(resolverPayload))\n ? resolverPayload as Record<string, unknown>\n : null;\n\n const actionBarMode: ActionBarMode = isTerminal\n ? 'terminal'\n : claimedByMe\n ? 'claimed_by_me'\n : claimedByOther\n ? 'claimed_by_other'\n : 'available';\n\n const handleClaim = (durationMinutes: number) => {\n claim.mutate({ id: esc.id, durationMinutes });\n };\n\n const goBack = () => {\n queryClient.resetQueries({ queryKey: ['escalations'] });\n queryClient.resetQueries({ queryKey: ['escalationStats'] });\n navigate(-1);\n };\n\n const handleResolve = async (payload: Record<string, unknown>) => {\n await resolve.mutateAsync({ id: esc.id, resolverPayload: payload });\n goBack();\n };\n\n const handleEscalate = async (targetRole: string) => {\n if (!targetRole) return;\n await escalate.mutateAsync({ id: esc.id, targetRole });\n goBack();\n };\n\n const handleRetryTriage = async () => {\n if (!claimedByMe) {\n await claim.mutateAsync({ id: esc.id, durationMinutes: 30 });\n }\n const diagnosis = (payloadObj?.diagnosis as string) || esc.description || '';\n await resolve.mutateAsync({\n id: esc.id,\n resolverPayload: { _lt: { needsTriage: true }, notes: diagnosis },\n });\n goBack();\n };\n\n const handleRelease = async () => {\n await claim.mutateAsync({ id: esc.id, durationMinutes: 0 });\n goBack();\n };\n\n const handleConfirmCancel = async () => {\n await cancel.mutateAsync(esc.id);\n setCancelModalOpen(false);\n goBack();\n };\n\n const headerActions = (\n <div className=\"flex items-center gap-2\">\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/escalations/${esc.id}`}\n />\n <button\n onClick={() => setSidePanelOpen((prev) => { savePanelOpen(!prev); return !prev; })}\n className=\"ml-2 text-text-tertiary hover:text-accent transition-colors\"\n title={sidePanelOpen ? 'Hide side panel' : 'Show side panel'}\n >\n {sidePanelOpen\n ? <PanelRightClose className=\"w-5 h-5\" strokeWidth={1.5} />\n : <PanelRightOpen className=\"w-5 h-5\" strokeWidth={1.5} />}\n </button>\n </div>\n );\n\n return (\n // Two fixed-height columns, like the left nav: the form column scrolls\n // independently and the side panel keeps its own scroll. Negative margins\n // let the panel span the full middle row (header to event feed, flush\n // right); the left column re-adds those gutters for its own content.\n <div className=\"flex-1 min-h-0 min-w-0 flex items-stretch -mt-10 -mr-10 -mb-16\">\n <div className=\"flex-1 min-w-0 flex flex-col min-h-0\">\n {isIframeMode ? (\n // Full-bleed iframe mode: no header, no padding, -ml-10 cancels shell's pl-10.\n // Release, Cancel, and panel toggle float at top-right over the iframe.\n <div className=\"relative flex-1 min-h-0 -ml-10\">\n <div className=\"absolute top-3 right-3 z-50 flex items-center gap-0.5 bg-surface/90 backdrop-blur-sm rounded-lg px-1.5 py-1 shadow-sm border border-surface-border/40\">\n {[\n {\n onClick: handleRelease,\n disabled: claim.isPending,\n label: 'Release',\n hoverClass: 'hover:text-accent',\n icon: <RotateCcw className=\"w-4 h-4\" strokeWidth={1.5} />,\n },\n {\n onClick: () => setCancelModalOpen(true),\n disabled: false,\n label: 'Cancel',\n hoverClass: 'hover:text-status-error',\n icon: <X className=\"w-4 h-4\" strokeWidth={1.5} />,\n },\n {\n onClick: () => setSidePanelOpen((prev) => { savePanelOpen(!prev); return !prev; }),\n disabled: false,\n label: sidePanelOpen ? 'Hide panel' : 'Show panel',\n hoverClass: 'hover:text-accent',\n icon: sidePanelOpen\n ? <PanelRightClose className=\"w-4 h-4\" strokeWidth={1.5} />\n : <PanelRightOpen className=\"w-4 h-4\" strokeWidth={1.5} />,\n },\n ].map(({ onClick, disabled, label, hoverClass, icon }) => (\n <div key={label} className=\"relative group/tip\">\n <button\n onClick={onClick}\n disabled={disabled}\n className={`text-text-tertiary ${hoverClass} transition-colors disabled:opacity-40 disabled:cursor-default p-1.5 rounded-md`}\n >\n {icon}\n </button>\n <span className=\"pointer-events-none absolute top-full left-1/2 -translate-x-1/2 mt-1.5 px-2 py-0.5 rounded text-[11px] bg-surface-sunken text-text-primary whitespace-nowrap opacity-0 group-hover/tip:opacity-100 transition-opacity\">\n {label}\n </span>\n </div>\n ))}\n </div>\n <IframeViewport\n src={expandViewportSrc(iframeViewport!.src!, esc)}\n escalation={esc}\n schema={effectiveSchema!}\n onResolve={handleResolve}\n onEscalate={handleEscalate}\n submitAttempted={submitAttempted}\n fill\n />\n </div>\n ) : (\n <>\n {/* The description IS the title — the page opens with what to do. It\n shares the row with the toolbar and panel toggle, truncating to\n make room. */}\n <div className=\"shrink-0 pt-10 pr-10\">\n <PageHeader title={esc.description || 'Escalation'} actions={headerActions} />\n </div>\n\n {/* Independently scrolling form column */}\n <div className=\"flex-1 min-h-0 overflow-y-auto pr-10\">\n <EscalationContextBlocks\n isRoundsExhausted={isRoundsExhausted}\n payloadObj={payloadObj}\n isTerminal={isTerminal}\n resolverPayload={resolverPayload as Record<string, unknown> | null}\n onRetryTriage={handleRetryTriage}\n isRetrying={claim.isPending || resolve.isPending}\n />\n\n <EscalationFormSection\n esc={esc}\n resolverPayload={resolverPayload}\n isTerminal={isTerminal}\n claimedByMe={claimedByMe}\n activeView={activeView}\n metadataFormSchema={metadataFormSchema}\n effectiveSchema={effectiveSchema as Record<string, unknown> | null}\n json={json}\n onJsonChange={setJson}\n requestTriage={requestTriage}\n onRequestTriageChange={setRequestTriage}\n triageNotes={triageNotes}\n onTriageNotesChange={setTriageNotes}\n onResolve={handleResolve}\n onEscalate={handleEscalate}\n onClaim={() => handleClaim(30)}\n submitAttempted={submitAttempted}\n isCertified={isCertified}\n hasAI={hasAI}\n />\n\n <div className=\"h-10\" />\n </div>\n </>\n )}\n\n {!isIframeMode && <EscalationActionBar\n mode={actionBarMode}\n activeView={activeView}\n onActiveViewChange={setActiveView}\n onClaim={handleClaim}\n claimPending={claim.isPending}\n workflowType={esc.workflow_type}\n json={json}\n onResolve={handleResolve}\n resolvePending={resolve.isPending}\n resolveError={resolve.error as Error | null}\n requestTriage={requestTriage}\n triageNotes={triageNotes}\n currentRole={esc.role}\n escalationTargets={(escalationTargets?.targets ?? []).filter((r) => r !== esc.role)}\n onEscalate={handleEscalate}\n escalatePending={escalate.isPending}\n escalateError={escalate.error as Error | null}\n onRelease={handleRelease}\n releasePending={claim.isPending}\n onCancel={() => setCancelModalOpen(true)}\n assignedTo={esc.assigned_to}\n assignedUntil={esc.assigned_until}\n onSubmitAttempt={() => setSubmitAttempted(true)}\n />}\n </div>\n\n <EscalationSidePanel\n esc={esc}\n schema={effectiveSchema as Record<string, unknown> | null}\n envelope={envelopeObj}\n payload={payloadObj}\n resolver={resolverObj}\n triage={triageData ?? null}\n hasAI={hasAI}\n claimed={claimed}\n claimedByMe={claimedByMe}\n isTerminal={isTerminal}\n isBuilder={isBuilder}\n traceUrl={traceUrl}\n open={sidePanelOpen}\n noGutter={isIframeMode}\n />\n\n <ConfirmCancelModal\n open={cancelModalOpen}\n onClose={() => setCancelModalOpen(false)}\n onConfirm={handleConfirmCancel}\n isPending={cancel.isPending}\n error={cancel.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["COLORS","BAR_H","Marker","pct","place","label","title","emphasis","tick","jsx","text","jsxs","Fragment","EscalationTimeline","esc","className","created","claimedAt","isResolved","isCancelled","isTerminal","activeClaim","isEffectivelyClaimed","showClaimed","end","total","pendingMs","activeMs","pendingPct","activePct","activeColor","activeVerb","split","formatDurationCompact","totalStr","totalTip","legend","TriageContext","triage","payload","confidence","confidenceColor","diffs","computeDiffs","action","i","diff","DiffRow","original","current","key","origVal","currVal","origStr","renderValue","corrStr","val","ESCALATION_PANEL_VIEWS","PANEL_VIEW_KEY","readPanelView","validIds","v","HIDDEN_METADATA_KEYS","MetadataList","metadata","role","entries","k","value","displayValue","facets","roleUrl","globalUrl","Link","ListFilter","Search","DetailsList","claimed","isBuilder","traceUrl","PanelField","StatusBadge","RolePill","User","UserName","DateValue","CountdownTimer","CopyableId","EscalationSidePanel","schema","envelope","resolver","hasAI","claimedByMe","open","noGutter","navigate","useNavigate","ALL_VIEW_IDS","activeView","setActiveView","useState","handleViewChange","useCallback","id","helpMarkdown","useMemo","buildHelpMarkdown","defaultHelpMarkdown","handleHelpClick","e","anchor","href","views","HelpCircle","MarkdownRenderer","Info","Sparkles","Tags","Layers","JsonViewer","Braces","SlidePanel","SlidePanelViews","EscalationActionBar","props","mode","onActiveViewChange","onClaim","claimPending","workflowType","json","onResolve","resolvePending","resolveError","requestTriage","triageNotes","currentRole","escalationTargets","onEscalate","escalatePending","escalateError","onRelease","releasePending","onCancel","assignedTo","assignedUntil","onSubmitAttempt","claimDurations","useClaimDurations","duration","setDuration","customMinutes","setCustomMinutes","parseError","setParseError","escalateTarget","setEscalateTarget","isCustom","onCustomChange","m","handleClaim","minutes","handleSubmitResolve","required","missing","field","labels","f","display","_form_schema","formValues","mapFormToPayload","tabClass","active","opt","CustomDurationPicker","renderInline","SimpleMarkdown","content","compact","segments","fencePattern","lastIndex","match","sizeClasses","allParts","segment","escaped","renderTextBlock","sz","lines","htmlParts","inList","inTable","tableRows","line","trimmed","cells","header","body","h","row","cell","SectionLabel","children","RoundsExhaustedContext","resolverPayload","onRetryTriage","isRetrying","summary","diagnosis","toolCalls","result","ltMeta","wasTriaged","triageWorkflowId","isResolvedByTriage","showResult","setShowResult","safeParse","s","IframeViewport","src","escalation","submitAttempted","fill","iframeRef","useRef","iframeOrigin","useEffect","url","sendInit","iframe","message","handler","event","data","FileUploadWidget","fieldKey","onChange","inputRef","accept","helperText","handleFile","file","_a","reader","hasFile","CodeEditorWidget","language","handleKeyDown","target","start","updated","SignatureWidget","canvasRef","isDrawing","setIsDrawing","canvas","ctx","img","getPos","rect","startDraw","pos","draw","endDraw","clear","RichTextWidget","MarkdownWidget","tab","setTab","t","WIDGET_MAP","ResolverForm","disabled","setData","hidden","setHidden","formSchema","setFormSchema","touched","setTouched","parsed","visible","internal","emitChange","updateField","markTouched","prev","next","allEntries","fieldOrder","a","b","ai","bi","requiredFields","layout","schemaTitle","schemaDescription","fieldRows","fieldSchema","isReadOnly","span","isReq","isTouched","error","fmt","FieldRow","onBlur","isRequired","widgetName","FieldLabel","Widget","FieldError","inputClass","isPassword","enumValues","format","FORMAT_INPUT_TYPES","item","hasError","ResolverSection","onJsonChange","onRequestTriageChange","onTriageNotesChange","showTriage","expandViewportSrc","parse","merged","_","EscalationContextBlocks","isRoundsExhausted","payloadObj","KeyRound","EscalationFormSection","metadataFormSchema","effectiveSchema","isCertified","mapPayloadToForm","viewport","isIframeViewport","MonitorPlay","resolvedSrc","PANEL_OPEN_KEY","readPanelOpen","savePanelOpen","EscalationDetailPage","useParams","user","useAuth","queryClient","useQueryClient","isLoading","refetch","isFetching","useEscalation","useEscalationDetailEvents","claim","useClaimEscalation","resolve","useResolveEscalation","escalate","useEscalateToRole","cancel","useCancelEscalation","cancelModalOpen","setCancelModalOpen","useEscalationTargets","workflowConfigs","useWorkflowConfigs","settings","useSettings","useAccess","wfConfig","c","setJson","sidePanelOpen","setSidePanelOpen","setRequestTriage","setTriageNotes","setSubmitAttempted","_b","resolverSchema","jsonInitialized","seeded","seededDefaults","prefill","initial","def","fieldDef","claimedByOther","iframeViewport","isIframeMode","escalationPayload","envelopeObj","_c","aiOverride","getAiOverride","_d","triageData","resolverObj","actionBarMode","durationMinutes","goBack","handleResolve","handleEscalate","targetRole","handleRetryTriage","handleRelease","handleConfirmCancel","headerActions","ListToolbar","PanelRightClose","PanelRightOpen","RotateCcw","X","onClick","hoverClass","icon","PageHeader","r","ConfirmCancelModal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-BTrN5iqE.js","sources":["../../src/components/common/display/EscalationTimeline.tsx","../../src/components/escalation/TriageContext.tsx","../../src/components/escalation/EscalationSidePanel.tsx","../../src/pages/operator/escalation-detail/EscalationActionBar.tsx","../../src/components/common/display/SimpleMarkdown.tsx","../../src/components/escalation/RoundsExhaustedContext.tsx","../../src/components/escalation/IframeViewport.tsx","../../src/components/escalation/widgets/FileUploadWidget.tsx","../../src/components/escalation/widgets/CodeEditorWidget.tsx","../../src/components/escalation/widgets/SignatureWidget.tsx","../../src/components/escalation/widgets/RichTextWidget.tsx","../../src/components/escalation/widgets/MarkdownWidget.tsx","../../src/components/escalation/widgets/index.ts","../../src/components/escalation/ResolverForm.tsx","../../src/pages/operator/escalation-detail/ResolverSection.tsx","../../src/pages/operator/escalation-detail/EscalationDetailSections.tsx","../../src/pages/operator/escalation-detail/EscalationDetailPage.tsx"],"sourcesContent":["import { formatDurationCompact } from '../../../lib/format';\nimport { isEffectivelyClaimed } from '../../../lib/escalation';\nimport type { LTEscalationRecord } from '../../../api/types';\n\n// Matches the palette used in EscalationTimeline (the spine view) and PaceChart\nconst COLORS = {\n pending: '#0ea5e9', // sky blue — waiting to be claimed\n claimed: '#f97316', // orange — actively being worked\n resolved: '#16a34a', // green — done\n cancelled: '#ef4444', // red — cancelled or expired\n} as const;\n\nconst BAR_H = 5; // px\n\n/** A duration label tethered to a point on the bar by a thin vertical tick. */\nfunction Marker({ pct, place, label, title, emphasis }: {\n pct: number;\n place: 'above' | 'below';\n label: string;\n title: string;\n emphasis?: boolean;\n}) {\n const tick = <span className=\"w-px h-1.5 bg-slate-300\" aria-hidden />;\n const text = (\n <span className={`whitespace-nowrap leading-none tabular-nums ${emphasis ? 'text-text-secondary' : 'text-text-tertiary'}`}>\n {label}\n </span>\n );\n return (\n <div\n title={title}\n className={`absolute ${place === 'above' ? 'bottom-0' : 'top-0'} flex flex-col items-center gap-0 -translate-x-1/2 cursor-help`}\n style={{ left: `${pct}%` }}\n >\n {place === 'above' ? <>{text}{tick}</> : <>{tick}{text}</>}\n </div>\n );\n}\n\n/**\n * Compact lifecycle sparkline for the escalation detail side panel.\n *\n * Bar segments: blue (pending — waiting to be claimed) → orange (claimed —\n * being worked) → green (resolved) or red (cancelled). Markers show\n * time-to-claim above the split point and total duration below the right edge.\n */\nexport function EscalationTimeline({ esc, className = '' }: { esc: LTEscalationRecord; className?: string }) {\n const created = new Date(esc.created_at).getTime();\n const claimedAt = esc.claimed_at ? new Date(esc.claimed_at).getTime() : null;\n\n const isResolved = esc.status === 'resolved';\n const isCancelled = esc.status === 'cancelled' || esc.status === 'expired';\n const isTerminal = isResolved || isCancelled;\n const activeClaim = isEffectivelyClaimed(esc);\n\n const showClaimed = !!claimedAt && (activeClaim || isTerminal);\n\n const end = isResolved && esc.resolved_at\n ? new Date(esc.resolved_at).getTime()\n : isCancelled\n ? new Date(esc.updated_at).getTime()\n : Date.now();\n\n const total = Math.max(end - created, 1);\n const pendingMs = showClaimed && claimedAt ? Math.max(claimedAt - created, 0) : total;\n const activeMs = showClaimed && claimedAt ? Math.max(end - claimedAt, 0) : 0;\n\n const pendingPct = Math.min(100, Math.max(0, (pendingMs / total) * 100));\n const activePct = showClaimed ? Math.max(0, 100 - pendingPct) : 0;\n\n const activeColor = isResolved ? COLORS.resolved : isCancelled ? COLORS.cancelled : COLORS.claimed;\n const activeVerb = isResolved ? 'Resolved after' : isCancelled ? 'Cancelled after' : 'In progress';\n\n const split = formatDurationCompact(pendingMs);\n const totalStr = formatDurationCompact(total);\n const totalTip = isResolved\n ? `Resolved in ${totalStr} total`\n : isCancelled\n ? `Cancelled after ${totalStr}`\n : `Open ${totalStr} so far`;\n\n const legend = `Lifecycle bar: blue = time waiting to be claimed, ${isResolved ? 'green' : isCancelled ? 'red' : 'orange'} = ${activeVerb.toLowerCase()} the claim.`;\n\n return (\n <div className={className} title={legend}>\n {/* claim split label (above bar) */}\n <div className=\"relative h-3 text-[9px] font-mono\">\n {showClaimed && (\n <Marker\n pct={pendingPct}\n place=\"above\"\n label={split}\n title={`Time to claim: ${split}`}\n />\n )}\n </div>\n\n {/* Bar track */}\n <div\n className=\"flex w-full rounded-full overflow-hidden\"\n style={{ height: BAR_H, backgroundColor: '#e2e8f0' }}\n title={legend}\n >\n {/* Pending (blue) */}\n <div\n style={{ width: `${pendingPct}%`, minWidth: BAR_H, backgroundColor: COLORS.pending, opacity: 0.75 }}\n title={`Waiting ${split} — created → claimed`}\n />\n {/* Claimed / resolved / cancelled */}\n {showClaimed && activePct > 0 && (\n <div\n style={{ width: `${activePct}%`, minWidth: BAR_H, backgroundColor: activeColor, opacity: 0.75 }}\n title={`${activeVerb} ${formatDurationCompact(activeMs)}`}\n />\n )}\n </div>\n\n {/* Total / age label (below bar, anchored at right edge) */}\n <div className=\"relative h-3 text-[9px] font-mono\">\n <Marker pct={100} place=\"below\" emphasis label={totalStr} title={totalTip} />\n </div>\n </div>\n );\n}\n","interface TriageData {\n diagnosis?: string;\n actions_taken?: string[];\n tool_calls_made?: number;\n confidence?: number;\n recommendation?: string;\n correctedData?: Record<string, unknown>;\n originalData?: Record<string, unknown>;\n}\n\ntype Diff = { key: string; label: string; original: unknown; corrected: unknown };\n\n/**\n * Renders a triage summary when escalation payload contains `_triage`.\n *\n * Fully generic — no knowledge of workflow types or field semantics.\n * Diffs `_triage.originalData` against the payload to detect changes.\n * Follows the unboxed section pattern used throughout the dashboard.\n */\nexport function TriageContext({ triage, payload }: {\n triage: TriageData;\n payload: Record<string, unknown>;\n}) {\n const confidence = triage.confidence ?? 0;\n const confidenceColor =\n confidence >= 0.8 ? 'text-status-success' :\n confidence >= 0.5 ? 'text-status-pending' :\n 'text-status-error';\n\n // Generic diff: compare originalData fields to current payload\n const diffs = computeDiffs(triage.originalData, payload);\n\n return (\n <div className=\"space-y-5\">\n {/* Diagnosis + metadata — unboxed, natural flow */}\n {triage.diagnosis && (\n <p className=\"text-sm text-text-primary leading-relaxed\">\n {triage.diagnosis}\n </p>\n )}\n\n <div className=\"flex flex-wrap items-center gap-3 text-xs text-text-tertiary\">\n {triage.tool_calls_made != null && (\n <span>{triage.tool_calls_made} tool call{triage.tool_calls_made !== 1 ? 's' : ''}</span>\n )}\n {triage.tool_calls_made != null && <span className=\"text-text-quaternary\">·</span>}\n <span className={`font-medium ${confidenceColor}`}>\n {Math.round(confidence * 100)}% confidence\n </span>\n </div>\n\n {triage.actions_taken && triage.actions_taken.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {triage.actions_taken.map((action, i) => (\n <span\n key={i}\n className=\"inline-flex items-center gap-1.5 px-2 py-0.5 text-[11px]\n text-text-secondary\"\n >\n <svg className=\"w-3 h-3 text-status-success shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n {action}\n </span>\n ))}\n </div>\n )}\n\n {triage.recommendation && (\n <p className=\"text-[11px] text-text-tertiary italic\">\n {triage.recommendation}\n </p>\n )}\n\n {/* Generic before/after diffs — separated by subtle dividers */}\n {diffs.length > 0 && (\n <div className=\"space-y-4 pt-2\">\n {diffs.map((diff) => (\n <DiffRow key={diff.key} diff={diff} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Generic diff computation\n// ---------------------------------------------------------------------------\n\nfunction computeDiffs(\n original: Record<string, unknown> | undefined,\n current: Record<string, unknown>,\n): Diff[] {\n if (!original) return [];\n\n const diffs: Diff[] = [];\n for (const key of Object.keys(original)) {\n if (key.startsWith('_')) continue;\n const origVal = original[key];\n const currVal = current[key];\n if (currVal === undefined) continue;\n\n if (JSON.stringify(origVal) !== JSON.stringify(currVal)) {\n diffs.push({\n key,\n label: key.replace(/[_-]/g, ' '),\n original: origVal,\n corrected: currVal,\n });\n }\n }\n return diffs;\n}\n\n// ---------------------------------------------------------------------------\n// Diff row — clean, unboxed before/after\n// ---------------------------------------------------------------------------\n\nfunction DiffRow({ diff }: { diff: Diff }) {\n const origStr = renderValue(diff.original);\n const corrStr = renderValue(diff.corrected);\n\n // Both are primitives — side by side with subtle separator\n if (origStr !== null && corrStr !== null) {\n return (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-3\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n {diff.label} <span className=\"normal-case font-normal\">(original)</span>\n </p>\n <p className=\"text-sm text-text-tertiary leading-relaxed line-through decoration-text-tertiary/30\">\n {origStr}\n </p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n {diff.label} <span className=\"normal-case font-normal text-status-success\">(corrected)</span>\n </p>\n <p className=\"text-sm text-text-primary leading-relaxed\">\n {corrStr}\n </p>\n </div>\n </div>\n );\n }\n\n // Complex values — stacked\n return (\n <div className=\"space-y-3\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n {diff.label} <span className=\"normal-case font-normal\">(original)</span>\n </p>\n <pre className=\"text-xs text-text-tertiary font-mono whitespace-pre-wrap leading-relaxed\">\n {typeof diff.original === 'object' ? JSON.stringify(diff.original, null, 2) : String(diff.original)}\n </pre>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n {diff.label} <span className=\"normal-case font-normal text-status-success\">(corrected)</span>\n </p>\n <pre className=\"text-xs text-text-primary font-mono whitespace-pre-wrap leading-relaxed\">\n {typeof diff.corrected === 'object' ? JSON.stringify(diff.corrected, null, 2) : String(diff.corrected)}\n </pre>\n </div>\n </div>\n );\n}\n\n/** Render a value as a string if it's a primitive, null otherwise */\nfunction renderValue(val: unknown): string | null {\n if (val === null || val === undefined) return 'null';\n if (typeof val === 'string') return val;\n if (typeof val === 'number' || typeof val === 'boolean') return String(val);\n return null;\n}\n","import { useMemo, useState, useCallback } from 'react';\nimport { useNavigate, Link } from 'react-router-dom';\nimport { HelpCircle, Info, Tags, Layers, Braces, Sparkles, User, ListFilter, Search } from 'lucide-react';\nimport { SlidePanel, SlidePanelViews, PanelField, type SlidePanelView } from '../common/layout/SlidePanel';\nimport { MarkdownRenderer } from '../common/display/MarkdownRenderer';\nimport { JsonViewer } from '../common/data/JsonViewer';\nimport { StatusBadge } from '../common/display/StatusBadge';\nimport { EscalationTimeline } from '../common/display/EscalationTimeline';\nimport { RolePill } from '../common/display/RolePill';\nimport { CountdownTimer } from '../common/display/CountdownTimer';\nimport { DateValue } from '../common/display/DateValue';\nimport { CopyableId } from '../common/display/CopyableId';\nimport { UserName } from '../common/display/UserName';\nimport { TriageContext } from './TriageContext';\nimport { buildHelpMarkdown, defaultHelpMarkdown } from '../../lib/x-lt-help';\nimport type { LTEscalationRecord } from '../../api/types';\n\nexport const ESCALATION_PANEL_VIEWS = {\n HELP: 'help',\n DETAILS: 'details',\n TRIAGE: 'triage',\n METADATA: 'metadata',\n CONTEXT: 'context',\n RECORD: 'record',\n} as const;\n\nconst PANEL_VIEW_KEY = 'lt:escalation:panel:view';\n\nfunction readPanelView(validIds: readonly string[]): PanelViewId {\n try {\n const v = localStorage.getItem(PANEL_VIEW_KEY);\n if (v && validIds.includes(v)) return v as PanelViewId;\n } catch {}\n return ESCALATION_PANEL_VIEWS.HELP;\n}\n\ntype PanelViewId = (typeof ESCALATION_PANEL_VIEWS)[keyof typeof ESCALATION_PANEL_VIEWS];\n\n/** Metadata keys that are plumbing, not information for the person resolving. */\nconst HIDDEN_METADATA_KEYS = new Set(['form_schema']);\n\nfunction MetadataList({ metadata, role }: { metadata: Record<string, unknown> | null; role: string }) {\n const entries = Object.entries(metadata ?? {}).filter(\n ([k]) => !k.startsWith('_') && !HIDDEN_METADATA_KEYS.has(k),\n );\n if (entries.length === 0) {\n return <p className=\"text-xs text-text-tertiary italic\">No metadata on this escalation.</p>;\n }\n return (\n <dl className=\"space-y-3.5\">\n {entries.map(([key, value]) => {\n const displayValue = typeof value === 'object' && value !== null\n ? JSON.stringify(value)\n : String(value);\n const facets = encodeURIComponent(JSON.stringify({ [key]: displayValue }));\n const roleUrl = `/escalations/available?role=${encodeURIComponent(role)}&facets=${facets}&status=all`;\n const globalUrl = `/escalations/available?facets=${facets}&status=all`;\n return (\n <div key={key} className=\"group relative\">\n <dt className=\"text-[11px] font-medium text-text-secondary uppercase tracking-wide\">\n {key.replace(/[_-]/g, ' ')}\n </dt>\n <dd className=\"mt-0.5 flex items-center gap-1\">\n <span className=\"text-[12px] text-text-primary font-mono break-all flex-1\">\n {displayValue}\n </span>\n <Link\n to={roleUrl}\n title={`Filter this queue: ${key} = ${displayValue}`}\n className=\"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5 text-text-quaternary hover:text-accent\"\n >\n <ListFilter className=\"w-3 h-3\" />\n </Link>\n <Link\n to={globalUrl}\n title={`Search all queues: ${key} = ${displayValue}`}\n className=\"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5 text-text-quaternary hover:text-accent\"\n >\n <Search className=\"w-3 h-3\" />\n </Link>\n </dd>\n </div>\n );\n })}\n </dl>\n );\n}\n\n/** The escalation's status facts — what used to sit as a strip above the form. */\nfunction DetailsList({ esc, claimed, isTerminal, isBuilder, traceUrl }: {\n esc: LTEscalationRecord;\n claimed: boolean;\n isTerminal: boolean;\n isBuilder: boolean;\n traceUrl: string | null;\n}) {\n return (\n <div className=\"space-y-5\">\n <dl className=\"space-y-3.5\">\n <PanelField label=\"Status\"><StatusBadge status={esc.status} /></PanelField>\n <PanelField label=\"Assigned to Role\"><RolePill role={esc.role} size=\"md\" /></PanelField>\n <PanelField label=\"Priority\">P{esc.priority}</PanelField>\n {(claimed || isTerminal) && esc.assigned_to && (\n <PanelField label=\"Claimed By\">\n <span className=\"inline-flex items-center gap-1.5 font-medium text-text-primary\">\n <User className=\"w-3 h-3 shrink-0 text-accent/75\" />\n <UserName userId={esc.assigned_to} />\n </span>\n </PanelField>\n )}\n <PanelField label=\"Created\"><DateValue date={esc.created_at} /></PanelField>\n {(claimed || isTerminal) && esc.claimed_at && (\n <PanelField label=\"Claimed\"><DateValue date={esc.claimed_at} /></PanelField>\n )}\n {claimed && !isTerminal && esc.assigned_until && (\n <PanelField label=\"Time Remaining\"><CountdownTimer until={esc.assigned_until} /></PanelField>\n )}\n {esc.resolved_at && (\n <PanelField label=\"Completed\">\n <span className=\"text-status-success\"><DateValue date={esc.resolved_at} /></span>\n </PanelField>\n )}\n </dl>\n\n {/* Identifiers — builder-facing references, quietly below a divider */}\n {isBuilder && (\n <>\n <hr className=\"border-surface-border/60\" />\n <div className=\"space-y-3.5\">\n <CopyableId label=\"Escalation ID\" value={esc.id} />\n {esc.task_id && (\n <CopyableId label=\"Task ID\" value={esc.task_id} href={`/workflows/tasks/detail/${esc.task_id}`} />\n )}\n {esc.workflow_type && (\n <CopyableId label=\"Workflow Name\" value={esc.workflow_type} href={`/workflows/executions?entity=${encodeURIComponent(esc.workflow_type)}`} />\n )}\n {esc.workflow_id && (\n <CopyableId label=\"Workflow ID\" value={esc.workflow_id} href={`/workflows/executions/${esc.workflow_id}`} />\n )}\n {esc.task_queue && (\n <CopyableId label=\"Task Queue\" value={esc.task_queue} href={`/admin/controlplane?queue=${encodeURIComponent(esc.task_queue)}`} />\n )}\n {esc.origin_id && esc.origin_id !== esc.workflow_id && (\n <CopyableId label=\"Origin\" value={esc.origin_id} href={`/processes/detail/${esc.origin_id}`} />\n )}\n {esc.trace_id && (\n <CopyableId\n label=\"Trace\"\n value={esc.trace_id}\n href={traceUrl ? traceUrl.replace('{traceId}', esc.trace_id) : undefined}\n external\n />\n )}\n </div>\n </>\n )}\n </div>\n );\n}\n\n/**\n * The escalation detail side panel — a set of views beside the resolve form,\n * ordered by specificity:\n *\n * Help — the form's `x-lt-help` markdown ({{token}}-interpolated), or a\n * state-aware hint when the schema carries none\n * Details — status, role, claim provenance, timestamps, identifiers\n * AI Analysis — what triage diagnosed and corrected (when AI is enabled and\n * the payload carries triage data)\n * Metadata — the row's metadata values, the facts stamped at enqueue\n * Context — the expanded surface: input envelope, escalation context, and\n * resolver payload\n * Record — the raw escalation record (builders only)\n */\nexport function EscalationSidePanel({\n esc,\n schema,\n envelope,\n payload,\n resolver,\n triage,\n hasAI,\n claimed,\n claimedByMe,\n isTerminal,\n isBuilder,\n traceUrl,\n open,\n noGutter,\n}: {\n esc: LTEscalationRecord;\n schema: Record<string, unknown> | null;\n envelope: Record<string, unknown> | null;\n payload: Record<string, unknown> | null;\n resolver: Record<string, unknown> | null;\n triage: Record<string, unknown> | null;\n hasAI: boolean;\n claimed: boolean;\n claimedByMe: boolean;\n isTerminal: boolean;\n isBuilder: boolean;\n traceUrl: string | null;\n open: boolean;\n /** Remove the left gutter so the panel background is flush with the content column (used in full-bleed iframe mode). */\n noGutter?: boolean;\n}) {\n const navigate = useNavigate();\n const ALL_VIEW_IDS = Object.values(ESCALATION_PANEL_VIEWS) as readonly string[];\n const [activeView, setActiveView] = useState<PanelViewId>(() => readPanelView(ALL_VIEW_IDS));\n\n const handleViewChange = useCallback((id: string) => {\n try { localStorage.setItem(PANEL_VIEW_KEY, id); } catch {}\n setActiveView(id as PanelViewId);\n }, []);\n\n const helpMarkdown = useMemo(() => {\n const authored = buildHelpMarkdown(schema, {\n escalation: esc as unknown as Record<string, unknown>,\n metadata: esc.metadata ?? null,\n envelope,\n payload,\n resolver,\n });\n return authored ?? defaultHelpMarkdown({ isTerminal, status: esc.status, claimed, claimedByMe });\n }, [schema, esc, envelope, payload, resolver, isTerminal, claimed, claimedByMe]);\n\n // Relative links in help markdown navigate in-app instead of reloading.\n const handleHelpClick = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\n const anchor = (e.target as HTMLElement).closest('a');\n const href = anchor?.getAttribute('href');\n if (href?.startsWith('/')) {\n e.preventDefault();\n navigate(href);\n }\n }, [navigate]);\n\n const views: SlidePanelView[] = [\n {\n id: ESCALATION_PANEL_VIEWS.HELP,\n icon: HelpCircle,\n label: 'Instructions',\n content: <MarkdownRenderer content={helpMarkdown} onClick={handleHelpClick} />,\n },\n {\n id: ESCALATION_PANEL_VIEWS.DETAILS,\n icon: Info,\n label: 'Details',\n content: <DetailsList esc={esc} claimed={claimed} isTerminal={isTerminal} isBuilder={isBuilder} traceUrl={traceUrl} />,\n },\n ...(hasAI && triage\n ? [{\n id: ESCALATION_PANEL_VIEWS.TRIAGE,\n icon: Sparkles,\n label: 'AI Analysis',\n content: <TriageContext triage={triage} payload={payload ?? {}} />,\n }]\n : []),\n {\n id: ESCALATION_PANEL_VIEWS.METADATA,\n icon: Tags,\n label: 'Metadata',\n content: <MetadataList metadata={esc.metadata} role={esc.role} />,\n },\n {\n id: ESCALATION_PANEL_VIEWS.CONTEXT,\n icon: Layers,\n label: 'Context',\n content: (\n <div className=\"space-y-5\">\n {envelope != null && <JsonViewer data={envelope} label=\"Input Envelope\" />}\n {payload != null && <JsonViewer data={payload} label=\"Escalation Context\" />}\n {resolver != null && <JsonViewer data={resolver} label=\"Resolver Payload\" />}\n {envelope == null && payload == null && resolver == null && (\n <p className=\"text-xs text-text-tertiary italic\">No context on this escalation.</p>\n )}\n </div>\n ),\n },\n ...(isBuilder\n ? [{\n id: ESCALATION_PANEL_VIEWS.RECORD,\n icon: Braces,\n label: 'Record',\n content: <JsonViewer data={esc} label=\"Escalation Record\" />,\n }]\n : []),\n ];\n\n return (\n <SlidePanel open={open} width={384} className=\"h-full\">\n {/* The breathing room collapses with the panel — it lives inside the\n animated width, so the closed state reclaims all of it. The column\n is fixed height (like the left nav): the sparkline row persists at\n the top and the active view scrolls independently beneath it. */}\n <div className={`h-full${noGutter ? '' : ' pl-6'}`}>\n {/* One tinted column, top to bottom — the sparkline lives inside it,\n hovering tight (2px y padding) above the icon row, centered at 80%\n so its edge labels never clip. The slim row drops the icons onto\n the same visual line as the page-title icons beside them; only the\n view content below scrolls. */}\n <div className=\"h-full flex flex-col bg-surface-hover\">\n <div className=\"shrink-0 pt-1.5 pb-0.5 flex justify-center\">\n <EscalationTimeline esc={esc} className=\"w-[80%]\" />\n </div>\n <div className=\"flex-1 min-h-0\">\n {/* No close button — the page-header panel icon owns dismissal. */}\n <SlidePanelViews\n views={views}\n activeId={activeView}\n onViewChange={handleViewChange}\n stickyClassName=\"h-full min-h-0\"\n />\n </div>\n </div>\n </div>\n </SlidePanel>\n );\n}\n","import { useState, useCallback } from 'react';\nimport { mapFormToPayload } from '../../../lib/x-lt-bind';\nimport { CountdownTimer } from '../../../components/common/display/CountdownTimer';\nimport { UserName } from '../../../components/common/display/UserName';\nimport { CustomDurationPicker } from '../../../components/common/form/CustomDurationPicker';\nimport { useClaimDurations } from '../../../hooks/useClaimDurations';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ActionBarMode =\n | 'available' // unclaimed — show claim controls\n | 'claimed_by_me' // I own it — show resolve/escalate/release\n | 'claimed_by_other'// someone else has it\n | 'terminal'; // resolved or cancelled — nothing to do\n\nexport type ActiveView = 'resolve' | 'escalate' | 'release';\n\nexport interface EscalationActionBarProps {\n mode: ActionBarMode;\n // Active view (controlled by parent)\n activeView: ActiveView;\n onActiveViewChange: (view: ActiveView) => void;\n // Claim\n onClaim: (minutes: number) => void;\n claimPending: boolean;\n // Resolve — JSON lives in viewport, bar reads it for submit\n workflowType: string | null;\n json: string;\n onResolve: (payload: Record<string, unknown>) => void;\n resolvePending: boolean;\n resolveError: Error | null;\n // Triage (controlled by parent — callout + overlay render in page body)\n requestTriage: boolean;\n triageNotes: string;\n // Escalate\n currentRole: string;\n escalationTargets: string[];\n onEscalate: (role: string) => void;\n escalatePending: boolean;\n escalateError: Error | null;\n // Release\n onRelease: () => void;\n releasePending: boolean;\n // Cancel (opens confirm modal in parent)\n onCancel: () => void;\n // Other user\n assignedTo?: string | null;\n assignedUntil?: string | null;\n // Validation\n onSubmitAttempt?: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EscalationActionBar(props: EscalationActionBarProps) {\n const {\n mode, activeView, onActiveViewChange,\n onClaim, claimPending,\n workflowType, json, onResolve, resolvePending, resolveError,\n requestTriage, triageNotes,\n currentRole, escalationTargets, onEscalate, escalatePending, escalateError,\n onRelease, releasePending,\n onCancel,\n assignedTo, assignedUntil,\n onSubmitAttempt,\n } = props;\n\n const claimDurations = useClaimDurations();\n const [duration, setDuration] = useState('30');\n const [customMinutes, setCustomMinutes] = useState(0);\n const [parseError, setParseError] = useState('');\n const [escalateTarget, setEscalateTarget] = useState('');\n\n const isCustom = duration === 'custom';\n const onCustomChange = useCallback((m: number) => setCustomMinutes(m), []);\n\n if (mode === 'terminal') return null;\n\n const handleClaim = () => {\n const minutes = isCustom ? customMinutes : parseInt(duration);\n if (!minutes || minutes <= 0) return;\n onClaim(minutes);\n };\n\n const handleSubmitResolve = () => {\n setParseError('');\n\n // When triage is requested, ignore the form payload entirely.\n // Only the triage flag and notes matter — the form data (e.g.\n // approved: true) must NOT leak through, as it would confuse\n // the triage workflow into thinking the issue is already resolved.\n if (requestTriage) {\n const payload: Record<string, unknown> = {\n _lt: { needsTriage: true },\n };\n if (triageNotes.trim()) payload.notes = triageNotes.trim();\n onResolve(payload);\n return;\n }\n\n let payload: Record<string, unknown>;\n try {\n payload = JSON.parse(json);\n } catch {\n setParseError('Invalid JSON');\n return;\n }\n\n // Validate required fields from embedded _form_schema\n const schema = payload._form_schema as Record<string, unknown> | undefined;\n const required = schema?.required as string[] | undefined;\n if (required?.length) {\n const missing = required.filter((field) => {\n const val = payload[field];\n if (val === undefined || val === null) return true;\n if (typeof val === 'string' && val.trim() === '') return true;\n return false;\n });\n if (missing.length > 0) {\n onSubmitAttempt?.();\n const labels = missing.map((f) => f.replace(/[_-]/g, ' '));\n const display = labels.length <= 2\n ? labels.join(', ')\n : `${labels.slice(0, 2).join(', ')}...`;\n setParseError(`Required: ${display}`);\n return;\n }\n }\n\n // Submit the resolver payload in its final shape: drop the UI-only schema and\n // map the flat form fields into the nested payload via x-lt-bind. The server\n // stores this exactly as sent — the payload IS the payload.\n const { _form_schema, ...formValues } = payload;\n onResolve(mapFormToPayload(formValues, schema as Record<string, any> | undefined));\n };\n\n const tabClass = (active: boolean) =>\n `text-xs transition-colors ${active ? 'text-accent font-medium' : 'text-text-tertiary hover:text-accent'}`;\n\n return (\n // Flex-pinned at the bottom of the form column: full-bleed left into the\n // page gutter, ending at the side panel's edge on the right.\n <div className=\"shrink-0 h-[80px] bg-surface/95 backdrop-blur-sm border-t border-surface-border -ml-10 pl-10 pr-10 pt-3 pb-5\" data-testid=\"escalation-action-bar\">\n\n {/* ── Available: claim ── */}\n {mode === 'available' && (\n <div data-testid=\"claim-bar\">\n {/* Duration tab row */}\n <div className=\"flex items-center gap-4 mb-2\">\n {claimDurations.map((opt) => (\n <button\n key={opt.value}\n onClick={() => { setDuration(opt.value); setCustomMinutes(0); }}\n className={tabClass(!isCustom && duration === opt.value)}\n >\n {opt.label}\n </button>\n ))}\n <button\n onClick={() => setDuration('custom')}\n className={tabClass(isCustom)}\n >\n Other\n </button>\n </div>\n {/* Action row — right-aligned */}\n <div className=\"flex items-center gap-3\">\n <button\n onClick={onCancel}\n className=\"text-xs text-text-tertiary hover:text-status-error transition-colors\"\n >\n Cancel escalation\n </button>\n <div className=\"flex-1\" />\n {isCustom && (\n <CustomDurationPicker onChange={onCustomChange} compact autoFocus />\n )}\n <button\n onClick={handleClaim}\n disabled={claimPending || (isCustom && customMinutes <= 0)}\n className=\"btn-primary text-xs\"\n >\n {claimPending ? 'Claiming...' : 'Claim'}\n </button>\n </div>\n </div>\n )}\n\n {/* ── Claimed by other ── */}\n {mode === 'claimed_by_other' && (\n <div className=\"flex items-center gap-4\" data-testid=\"claimed-other-bar\">\n <p className=\"text-sm text-text-secondary\">\n Claimed by <span className=\"font-medium text-text-primary\">{assignedTo ? <UserName userId={assignedTo} /> : 'unknown'}</span>\n </p>\n {assignedUntil && <CountdownTimer until={assignedUntil} />}\n </div>\n )}\n\n {/* ── Claimed by me ── */}\n {mode === 'claimed_by_me' && (\n <div data-testid=\"action-bar\">\n {/* Tab row */}\n <div className=\"flex items-center gap-4 mb-2\">\n <button\n onClick={() => onActiveViewChange('resolve')}\n className={tabClass(activeView === 'resolve')}\n >\n {workflowType ? 'Resolve' : 'Acknowledge'}\n </button>\n {escalationTargets.length > 0 && (\n <button\n onClick={() => onActiveViewChange('escalate')}\n className={tabClass(activeView === 'escalate')}\n >\n Escalate\n </button>\n )}\n <button\n onClick={() => onActiveViewChange('release')}\n className={`text-xs transition-colors ${activeView === 'release' ? 'text-status-error font-medium' : 'text-text-tertiary hover:text-status-error'}`}\n >\n Release\n </button>\n <button\n onClick={onCancel}\n className=\"text-xs transition-colors text-text-tertiary hover:text-status-error\"\n >\n Cancel\n </button>\n </div>\n\n {/* ── Resolve controls ── */}\n {activeView === 'resolve' && (\n workflowType ? (\n <div className=\"flex items-center gap-4\">\n <div className=\"flex-1\" />\n\n {parseError && <span className=\"text-xs text-status-error\">{parseError}</span>}\n {resolveError && <span className=\"text-xs text-status-error\">{resolveError.message}</span>}\n\n <button\n onClick={handleSubmitResolve}\n disabled={resolvePending}\n className=\"btn-primary text-xs\"\n >\n {resolvePending ? 'Submitting...' : requestTriage ? 'Send to Triage' : 'Submit'}\n </button>\n </div>\n ) : (\n <div className=\"flex items-center\">\n <span className=\"text-xs text-text-secondary\">Notification — acknowledge to resolve</span>\n <div className=\"flex-1\" />\n {resolveError && <span className=\"text-xs text-status-error mr-3\">{resolveError.message}</span>}\n <button\n onClick={() => onResolve({ acknowledged: true })}\n disabled={resolvePending}\n className=\"btn-primary text-xs\"\n >\n {resolvePending ? 'Acknowledging...' : 'Acknowledge'}\n </button>\n </div>\n )\n )}\n\n {/* ── Escalate controls ── */}\n {activeView === 'escalate' && (\n <div className=\"flex items-center gap-3\">\n <span className=\"text-xs text-text-secondary\">\n From <span className=\"font-medium text-text-primary\">{currentRole}</span> to\n </span>\n <select\n value={escalateTarget}\n onChange={(e) => setEscalateTarget(e.target.value)}\n className=\"select text-xs\"\n data-testid=\"escalate-select\"\n >\n <option value=\"\">Select role...</option>\n {escalationTargets.map((role) => (\n <option key={role} value={role}>{role}</option>\n ))}\n </select>\n <div className=\"flex-1\" />\n {escalateError && <span className=\"text-xs text-status-error\">{escalateError.message}</span>}\n <button\n onClick={() => onEscalate(escalateTarget)}\n disabled={!escalateTarget || escalatePending}\n className=\"btn-primary text-xs\"\n >\n {escalatePending ? 'Escalating...' : 'Escalate'}\n </button>\n </div>\n )}\n\n {/* ── Release controls ── */}\n {activeView === 'release' && (\n <div className=\"flex items-center gap-3\">\n <span className=\"text-xs text-text-secondary\">Release back to pool?</span>\n <div className=\"flex-1\" />\n <button onClick={() => onActiveViewChange('resolve')} className=\"btn-secondary text-xs\">\n Back\n </button>\n <button\n onClick={onRelease}\n disabled={releasePending}\n className=\"btn-primary text-xs bg-status-error hover:bg-status-error/80\"\n >\n {releasePending ? 'Releasing...' : 'Yes, Release'}\n </button>\n </div>\n )}\n\n </div>\n )}\n </div>\n );\n}\n","/**\n * Lightweight markdown-to-HTML renderer for simple patterns.\n * No external dependency — handles bold, italic, code, links, headers, lists.\n */\n\nfunction renderInline(text: string): string {\n return text\n // Code spans\n .replace(/`([^`]+)`/g, '<code class=\"px-1 py-0.5 bg-surface-sunken rounded text-xs font-mono\">$1</code>')\n // Bold + italic\n .replace(/\\*\\*\\*(.+?)\\*\\*\\*/g, '<strong><em>$1</em></strong>')\n // Bold\n .replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n // Italic\n .replace(/\\*(.+?)\\*/g, '<em>$1</em>')\n // Links\n .replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, '<a href=\"$2\" class=\"text-accent-primary hover:underline\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>');\n}\n\nexport function SimpleMarkdown({ content, compact }: { content: string; compact?: boolean }) {\n // Extract fenced code blocks before line-by-line processing\n const segments: Array<{ type: 'code'; lang: string; code: string } | { type: 'text'; text: string }> = [];\n const fencePattern = /^```(\\w*)\\n([\\s\\S]*?)^```$/gm;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = fencePattern.exec(content)) !== null) {\n if (match.index > lastIndex) {\n segments.push({ type: 'text', text: content.slice(lastIndex, match.index) });\n }\n segments.push({ type: 'code', lang: match[1], code: match[2].replace(/\\n$/, '') });\n lastIndex = match.index + match[0].length;\n }\n if (lastIndex < content.length) {\n segments.push({ type: 'text', text: content.slice(lastIndex) });\n }\n\n const sizeClasses = compact\n ? { text: 'text-xs', heading: 'text-xs', list: 'text-xs', code: 'text-[11px]' }\n : { text: 'text-sm', heading: 'text-sm', list: 'text-sm', code: 'text-xs' };\n\n const allParts: string[] = [];\n for (const segment of segments) {\n if (segment.type === 'code') {\n const escaped = segment.code.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n allParts.push(\n `<pre class=\"my-2 p-2.5 bg-surface-sunken rounded-md overflow-x-auto\"><code class=\"${sizeClasses.code} font-mono text-text-secondary leading-relaxed\">${escaped}</code></pre>`,\n );\n continue;\n }\n allParts.push(...renderTextBlock(segment.text, sizeClasses));\n }\n\n return (\n <div\n className=\"prose-sm\"\n dangerouslySetInnerHTML={{ __html: allParts.join('\\n') }}\n />\n );\n}\n\nfunction renderTextBlock(\n text: string,\n sz: { text: string; heading: string; list: string; code: string },\n): string[] {\n const lines = text.split('\\n');\n const htmlParts: string[] = [];\n let inList = false;\n let inTable = false;\n let tableRows: string[][] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Table rows\n if (trimmed.startsWith('|') && trimmed.endsWith('|')) {\n const cells = trimmed.slice(1, -1).split('|').map((c) => c.trim());\n // Skip separator rows (|---|---|)\n if (cells.every((c) => /^[-:]+$/.test(c))) continue;\n if (!inTable) {\n inTable = true;\n tableRows = [];\n }\n tableRows.push(cells);\n continue;\n }\n if (inTable) {\n inTable = false;\n const [header, ...body] = tableRows;\n htmlParts.push('<div class=\"overflow-x-auto my-2\"><table class=\"text-xs w-full\"><thead><tr>');\n for (const h of header) {\n htmlParts.push(`<th class=\"text-left py-1 px-2 border-b border-border text-text-secondary font-medium\">${renderInline(h)}</th>`);\n }\n htmlParts.push('</tr></thead><tbody>');\n for (const row of body) {\n htmlParts.push('<tr>');\n for (const cell of row) {\n htmlParts.push(`<td class=\"py-1 px-2 border-b border-border/50\">${renderInline(cell)}</td>`);\n }\n htmlParts.push('</tr>');\n }\n htmlParts.push('</tbody></table></div>');\n tableRows = [];\n }\n\n // Empty line\n if (!trimmed) {\n if (inList) { htmlParts.push('</ul>'); inList = false; }\n continue;\n }\n\n // Headers\n if (trimmed.startsWith('### ')) {\n if (inList) { htmlParts.push('</ul>'); inList = false; }\n htmlParts.push(`<h4 class=\"${sz.heading} font-semibold text-text-primary mt-3 mb-1\">${renderInline(trimmed.slice(4))}</h4>`);\n continue;\n }\n if (trimmed.startsWith('## ')) {\n if (inList) { htmlParts.push('</ul>'); inList = false; }\n htmlParts.push(`<h3 class=\"${sz.heading} font-semibold text-text-primary mt-3 mb-1\">${renderInline(trimmed.slice(3))}</h3>`);\n continue;\n }\n\n // Horizontal rule\n if (/^[-*_]{3,}$/.test(trimmed)) {\n if (inList) { htmlParts.push('</ul>'); inList = false; }\n htmlParts.push('<hr class=\"border-border my-3\" />');\n continue;\n }\n\n // List items\n if (/^[-*] /.test(trimmed)) {\n if (!inList) { htmlParts.push('<ul class=\"space-y-1 my-1\">'); inList = true; }\n htmlParts.push(`<li class=\"${sz.list} text-text-secondary flex gap-2\"><span class=\"text-text-tertiary shrink-0\">-</span><span>${renderInline(trimmed.slice(2))}</span></li>`);\n continue;\n }\n\n // Paragraph\n if (inList) { htmlParts.push('</ul>'); inList = false; }\n htmlParts.push(`<p class=\"${sz.text} text-text-secondary my-1\">${renderInline(trimmed)}</p>`);\n }\n\n // Flush any remaining table\n if (inTable && tableRows.length) {\n const [header, ...body] = tableRows;\n htmlParts.push('<div class=\"overflow-x-auto my-2\"><table class=\"text-xs w-full\"><thead><tr>');\n for (const h of header) {\n htmlParts.push(`<th class=\"text-left py-1 px-2 border-b border-border text-text-secondary font-medium\">${renderInline(h)}</th>`);\n }\n htmlParts.push('</tr></thead><tbody>');\n for (const row of body) {\n htmlParts.push('<tr>');\n for (const cell of row) {\n htmlParts.push(`<td class=\"py-1 px-2 border-b border-border/50\">${renderInline(cell)}</td>`);\n }\n htmlParts.push('</tr>');\n }\n htmlParts.push('</tbody></table></div>');\n }\n\n if (inList) htmlParts.push('</ul>');\n\n return htmlParts;\n}\n","import { useState } from 'react';\nimport { Link } from 'react-router-dom';\n\nimport { JsonViewer } from '../common/data/JsonViewer';\nimport { SimpleMarkdown } from '../common/display/SimpleMarkdown';\n\ninterface RoundsExhaustedContextProps {\n payload: Record<string, unknown>;\n isTerminal?: boolean;\n resolverPayload?: Record<string, unknown> | null;\n onRetryTriage?: () => void;\n isRetrying?: boolean;\n}\n\nfunction SectionLabel({ children }: { children: React.ReactNode }) {\n return (\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5\">{children}</p>\n );\n}\n\nexport function RoundsExhaustedContext({ payload, isTerminal, resolverPayload, onRetryTriage, isRetrying }: RoundsExhaustedContextProps) {\n const title = payload.title as string | undefined;\n const summary = payload.summary as string | undefined;\n const diagnosis = payload.diagnosis as string | undefined;\n const toolCalls = payload.tool_calls_made as number | undefined;\n const result = payload.result as Record<string, unknown> | null | undefined;\n\n // Detect triage resolution\n const ltMeta = resolverPayload?._lt as Record<string, unknown> | undefined;\n const wasTriaged = ltMeta?.triaged === true;\n const triageWorkflowId = ltMeta?.triageWorkflowId as string | undefined;\n const isResolvedByTriage = isTerminal && wasTriaged;\n\n const [showResult, setShowResult] = useState(false);\n\n // Resolved by triage — show success state\n if (isResolvedByTriage) {\n return (\n <div className=\"rounded-md border border-status-success/30 bg-surface-raised\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-surface-border\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 text-status-success shrink-0\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z\" />\n </svg>\n <span className=\"text-xs font-medium text-status-success\">Resolved by AI Triage</span>\n </div>\n {typeof toolCalls === 'number' && (\n <span className=\"text-[10px] font-mono px-2 py-0.5 rounded-full bg-status-success/10 text-status-success\">\n {toolCalls} tool calls used\n </span>\n )}\n </div>\n\n {/* Body */}\n <div className=\"px-4 py-4 space-y-4\">\n {title && (\n <p className=\"text-sm font-medium text-text-primary\">{title}</p>\n )}\n\n {diagnosis && (\n <div>\n <SectionLabel>Triage diagnosis</SectionLabel>\n <div className=\"text-xs text-text-primary leading-relaxed\">\n <SimpleMarkdown content={diagnosis} />\n </div>\n </div>\n )}\n\n <div className=\"flex items-center gap-3\">\n {triageWorkflowId && (\n <Link\n to={`/workflows/executions/${triageWorkflowId}`}\n className=\"text-[10px] text-accent hover:underline\"\n >\n View triage execution\n </Link>\n )}\n </div>\n </div>\n </div>\n );\n }\n\n // Default: warning state\n return (\n <div className=\"rounded-md border border-status-warning/30 bg-surface-raised\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-surface-border\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 text-status-warning shrink-0\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 1a7 7 0 110 14A7 7 0 018 1zm0 3a.75.75 0 00-.75.75v3.5a.75.75 0 001.5 0v-3.5A.75.75 0 008 4zm0 7a.75.75 0 100-1.5.75.75 0 000 1.5z\" />\n </svg>\n <span className=\"text-xs font-medium text-status-warning\">Tool Rounds Exhausted</span>\n </div>\n {typeof toolCalls === 'number' && (\n <span className=\"text-[10px] font-mono px-2 py-0.5 rounded-full bg-status-warning/10 text-status-warning\">\n {toolCalls} tool calls used\n </span>\n )}\n </div>\n\n {/* Body */}\n <div className=\"px-4 py-4 space-y-4\">\n {title && (\n <p className=\"text-sm font-medium text-text-primary\">{title}</p>\n )}\n\n {summary && (\n <div>\n <SectionLabel>What happened</SectionLabel>\n <div className=\"text-xs text-text-secondary leading-relaxed\">\n <SimpleMarkdown content={summary} />\n </div>\n </div>\n )}\n\n {diagnosis && (\n <div>\n <SectionLabel>What went wrong</SectionLabel>\n <div className=\"text-xs text-text-primary leading-relaxed\">\n <SimpleMarkdown content={diagnosis} />\n </div>\n </div>\n )}\n\n {result != null && (\n <div>\n <button\n onClick={() => setShowResult(!showResult)}\n className=\"flex items-center gap-1 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary hover:text-text-secondary transition-colors\"\n >\n <svg className={`w-3 h-3 transition-transform ${showResult ? 'rotate-90' : ''}`} viewBox=\"0 0 12 12\" fill=\"currentColor\">\n <path d=\"M4.5 2l4 4-4 4\" />\n </svg>\n Partial results\n </button>\n {showResult && (\n <div className=\"mt-2\">\n <JsonViewer data={result} defaultMode=\"tree\" />\n </div>\n )}\n </div>\n )}\n\n {onRetryTriage && !isTerminal && (\n <div className=\"pt-2\">\n <button\n onClick={onRetryTriage}\n disabled={isRetrying}\n className=\"inline-flex items-center gap-2 px-4 py-2 text-xs font-medium bg-accent text-text-inverse rounded-md hover:bg-accent/90 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n <svg className=\"w-3.5 h-3.5\" viewBox=\"0 0 14 14\" fill=\"currentColor\">\n <path d=\"M7 1a6 6 0 100 12A6 6 0 007 1zm2.5 6.5l-3.5 2V5.5l3.5 2z\" />\n </svg>\n {isRetrying ? 'Sending to triage...' : 'Retry with AI Triage'}\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport type { LTEscalationRecord } from '../../api/types';\n\n// ---------------------------------------------------------------------------\n// postMessage protocol types\n// ---------------------------------------------------------------------------\n\n/** Messages sent from the parent to the iframe. */\ntype ParentMessage =\n | { type: 'lt:init'; escalation: IframeEscalationData; schema: Record<string, unknown> }\n | { type: 'lt:requestSubmit' }\n | { type: 'lt:validate' };\n\n/** Messages received from the iframe. */\ntype ChildMessage =\n | { type: 'lt:ready' }\n | { type: 'lt:submit'; payload: Record<string, unknown> }\n | { type: 'lt:escalate'; target: string }\n | { type: 'lt:resize'; height: number };\n\n/**\n * Escalation context delivered to the iframe via `lt:init`. Includes the\n * full envelope and metadata so the embedded app has all the context it\n * needs to load the right session and submit a meaningful payload back.\n *\n * The iframe is origin-validated before any message is sent, so secrets in\n * the envelope only travel to the declared src origin.\n */\ninterface IframeEscalationData {\n id: string;\n type: string;\n subtype: string;\n description: string | null;\n status: string;\n priority: number;\n role: string;\n workflow_type: string | null;\n envelope: Record<string, unknown> | null;\n metadata: Record<string, unknown> | null;\n escalation_payload: Record<string, unknown> | null;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\ninterface IframeViewportProps {\n src: string;\n escalation: LTEscalationRecord;\n schema: Record<string, unknown>;\n onResolve: (payload: Record<string, unknown>) => void;\n onEscalate: (targetRole: string) => void;\n submitAttempted?: boolean;\n /** Fill the parent container edge-to-edge (absolute inset-0). Used for full-bleed iframe mode. */\n fill?: boolean;\n}\n\nfunction safeParse(s: string | null | undefined): Record<string, unknown> | null {\n if (!s) return null;\n try { return JSON.parse(s) as Record<string, unknown>; } catch { return null; }\n}\n\n/**\n * Renders a sandboxed iframe for fully custom HITL UIs.\n *\n * Protocol — parent → iframe:\n * `lt:init` escalation context (id, envelope, metadata, payload) + schema\n * `lt:requestSubmit` ask the iframe to trigger its own submit flow\n * `lt:validate` ask the iframe to report validation errors\n *\n * Protocol — iframe → parent:\n * `lt:ready` iframe loaded, ready to receive `lt:init`\n * `lt:submit` work complete; payload becomes the resolver payload\n * `lt:escalate` re-route to a different role\n * `lt:resize` resize the iframe height\n *\n * The iframe can detect it is embedded via `window !== window.top` and\n * opt in to postMessage communication instead of its own submit UX.\n */\nexport function IframeViewport({ src, escalation, schema, onResolve, onEscalate, submitAttempted, fill }: IframeViewportProps) {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const iframeOrigin = useRef<string>('');\n\n // Parse the allowed origin from the src URL\n useEffect(() => {\n try {\n const url = new URL(src);\n iframeOrigin.current = url.origin;\n } catch {\n iframeOrigin.current = '';\n }\n }, [src]);\n\n const sendInit = useCallback(() => {\n const iframe = iframeRef.current;\n if (!iframe?.contentWindow || !iframeOrigin.current) return;\n\n const data: IframeEscalationData = {\n id: escalation.id,\n type: escalation.type,\n subtype: escalation.subtype,\n description: escalation.description,\n status: escalation.status,\n priority: escalation.priority,\n role: escalation.role,\n workflow_type: escalation.workflow_type,\n envelope: safeParse(escalation.envelope),\n metadata: escalation.metadata ?? null,\n escalation_payload: safeParse(escalation.escalation_payload),\n };\n\n const message: ParentMessage = { type: 'lt:init', escalation: data, schema };\n iframe.contentWindow.postMessage(message, iframeOrigin.current);\n }, [escalation, schema]);\n\n // Listen for messages from the iframe\n useEffect(() => {\n const handler = (event: MessageEvent) => {\n if (event.origin !== iframeOrigin.current) return;\n\n const data = event.data as ChildMessage;\n if (!data || typeof data !== 'object' || typeof data.type !== 'string') return;\n\n switch (data.type) {\n case 'lt:ready':\n sendInit();\n break;\n case 'lt:submit':\n if (data.payload && typeof data.payload === 'object') {\n onResolve(data.payload);\n }\n break;\n case 'lt:escalate':\n if (typeof data.target === 'string' && data.target) {\n onEscalate(data.target);\n }\n break;\n case 'lt:resize': {\n const iframe = iframeRef.current;\n if (iframe && typeof data.height === 'number' && data.height > 0) {\n iframe.style.height = `${Math.min(data.height, 2000)}px`;\n }\n break;\n }\n }\n };\n\n window.addEventListener('message', handler);\n return () => window.removeEventListener('message', handler);\n }, [sendInit, onResolve, onEscalate]);\n\n // Forward lt:validate to iframe when the action bar triggers a submit attempt\n useEffect(() => {\n if (!submitAttempted) return;\n const iframe = iframeRef.current;\n if (iframe?.contentWindow && iframeOrigin.current) {\n iframe.contentWindow.postMessage({ type: 'lt:validate' } as ParentMessage, iframeOrigin.current);\n }\n }, [submitAttempted]);\n\n if (fill) {\n return (\n <div className=\"absolute inset-0 overflow-hidden\">\n <iframe\n ref={iframeRef}\n src={src}\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-pointer-lock allow-downloads\"\n className=\"w-full h-full border-0 block\"\n title=\"HITL Viewport\"\n onLoad={sendInit}\n />\n </div>\n );\n }\n\n return (\n <div className=\"rounded-md border border-surface-border overflow-hidden bg-white\">\n <iframe\n ref={iframeRef}\n src={src}\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-pointer-lock allow-downloads\"\n className=\"w-full border-0\"\n style={{ minHeight: '600px' }}\n title=\"HITL Viewport\"\n onLoad={sendInit}\n />\n </div>\n );\n}\n","import { useCallback, useRef } from 'react';\n\ninterface FileUploadWidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n}\n\n/**\n * File upload widget that reads a file via FileReader and stores\n * its base64 data URL in the form value.\n */\nexport function FileUploadWidget({ fieldKey, value, onChange, schema }: FileUploadWidgetProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const accept = (schema?.accept as string) ?? undefined;\n const label = fieldKey.replace(/[_-]/g, ' ');\n const helperText = schema?.description as string | undefined;\n\n const handleFile = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result === 'string') {\n onChange(reader.result);\n }\n };\n reader.readAsDataURL(file);\n }, [onChange]);\n\n const hasFile = value.startsWith('data:');\n\n return (\n <div>\n <label className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n {label}\n </label>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <div className=\"mt-1\">\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n onChange={handleFile}\n className=\"hidden\"\n />\n <button\n type=\"button\"\n onClick={() => inputRef.current?.click()}\n className=\"btn-secondary text-xs px-3 py-1.5\"\n >\n {hasFile ? 'Replace file' : 'Choose file'}\n </button>\n {hasFile && (\n <span className=\"ml-2 text-xs text-status-success\">File attached</span>\n )}\n </div>\n </div>\n );\n}\n","import { useCallback } from 'react';\n\ninterface CodeEditorWidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n}\n\n/**\n * Monospace textarea with tab-key support for code input.\n */\nexport function CodeEditorWidget({ fieldKey, value, onChange, schema }: CodeEditorWidgetProps) {\n const label = fieldKey.replace(/[_-]/g, ' ');\n const helperText = schema?.description as string | undefined;\n const language = (schema?.['x-lt-language'] as string) ?? '';\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n const target = e.currentTarget;\n const start = target.selectionStart;\n const end = target.selectionEnd;\n const updated = value.substring(0, start) + ' ' + value.substring(end);\n onChange(updated);\n requestAnimationFrame(() => {\n target.selectionStart = target.selectionEnd = start + 2;\n });\n }\n }, [value, onChange]);\n\n return (\n <div>\n <label className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n {label}\n {language && (\n <span className=\"ml-2 text-text-tertiary/60 normal-case font-normal\">{language}</span>\n )}\n </label>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <textarea\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n className=\"input w-full mt-1 font-mono text-xs leading-relaxed\"\n rows={10}\n spellCheck={false}\n />\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface SignatureWidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n}\n\n/**\n * HTML5 Canvas signature pad. Outputs a PNG data URL.\n */\nexport function SignatureWidget({ fieldKey, value, onChange, schema }: SignatureWidgetProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [isDrawing, setIsDrawing] = useState(false);\n const label = fieldKey.replace(/[_-]/g, ' ');\n const helperText = schema?.description as string | undefined;\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n ctx.lineWidth = 2;\n ctx.lineCap = 'round';\n ctx.strokeStyle = '#1E1535';\n\n if (value && value.startsWith('data:')) {\n const img = new Image();\n img.onload = () => ctx.drawImage(img, 0, 0);\n img.src = value;\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const getPos = useCallback((e: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current!;\n const rect = canvas.getBoundingClientRect();\n if ('touches' in e) {\n return { x: e.touches[0].clientX - rect.left, y: e.touches[0].clientY - rect.top };\n }\n return { x: e.clientX - rect.left, y: e.clientY - rect.top };\n }, []);\n\n const startDraw = useCallback((e: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>) => {\n setIsDrawing(true);\n const ctx = canvasRef.current?.getContext('2d');\n if (!ctx) return;\n const pos = getPos(e);\n ctx.beginPath();\n ctx.moveTo(pos.x, pos.y);\n }, [getPos]);\n\n const draw = useCallback((e: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>) => {\n if (!isDrawing) return;\n const ctx = canvasRef.current?.getContext('2d');\n if (!ctx) return;\n const pos = getPos(e);\n ctx.lineTo(pos.x, pos.y);\n ctx.stroke();\n }, [isDrawing, getPos]);\n\n const endDraw = useCallback(() => {\n setIsDrawing(false);\n const canvas = canvasRef.current;\n if (canvas) {\n onChange(canvas.toDataURL('image/png'));\n }\n }, [onChange]);\n\n const clear = useCallback(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n onChange('');\n }, [onChange]);\n\n return (\n <div>\n <label className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n {label}\n </label>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <div className=\"mt-1 border border-surface-border rounded-md overflow-hidden bg-white\">\n <canvas\n ref={canvasRef}\n width={400}\n height={150}\n className=\"w-full cursor-crosshair touch-none\"\n onMouseDown={startDraw}\n onMouseMove={draw}\n onMouseUp={endDraw}\n onMouseLeave={endDraw}\n onTouchStart={startDraw}\n onTouchMove={draw}\n onTouchEnd={endDraw}\n />\n </div>\n <button\n type=\"button\"\n onClick={clear}\n className=\"mt-1 text-[10px] text-text-tertiary hover:text-accent transition-colors\"\n >\n Clear\n </button>\n </div>\n );\n}\n","interface RichTextWidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n}\n\n/**\n * Rich text input — a tall textarea with formatting hints.\n * A full WYSIWYG editor can replace this in a future iteration.\n */\nexport function RichTextWidget({ fieldKey, value, onChange, schema }: RichTextWidgetProps) {\n const label = fieldKey.replace(/[_-]/g, ' ');\n const helperText = schema?.description as string | undefined;\n\n return (\n <div>\n <label className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n {label}\n </label>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <textarea\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"input w-full mt-1 text-sm leading-relaxed\"\n rows={8}\n placeholder=\"Supports plain text. Markdown formatting is preserved.\"\n />\n </div>\n );\n}\n","import { useState } from 'react';\nimport { MarkdownRenderer } from '../../common/display/MarkdownRenderer';\n\ninterface MarkdownWidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n}\n\n/**\n * Markdown field — the same renderer the docs drawer uses, so a versioned\n * form schema can carry page source. Two shapes:\n *\n * - `readOnly: true` → a content block. The field's markdown (typically the\n * schema `default`) renders as HTML with no input chrome — instructions,\n * SOPs, and context live in the form as authored, versioned pages.\n * - editable → a Write/Preview source editor. The submitted value is the\n * markdown source.\n */\nexport function MarkdownWidget({ fieldKey, value, onChange, schema }: MarkdownWidgetProps) {\n const [tab, setTab] = useState<'write' | 'preview'>('write');\n const label = fieldKey.replace(/[_-]/g, ' ');\n const helperText = schema?.description as string | undefined;\n const isReadOnly = schema?.readOnly === true;\n\n if (isReadOnly) {\n // Pure content block — the markdown carries its own headings and structure.\n return <MarkdownRenderer content={value} className=\"my-1\" />;\n }\n\n return (\n <div>\n <div className=\"flex items-center justify-between\">\n <label className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n {label}\n </label>\n <div className=\"flex items-center gap-0.5\">\n {(['write', 'preview'] as const).map((t) => (\n <button\n key={t}\n type=\"button\"\n onClick={() => setTab(t)}\n className={`px-2 py-0.5 text-[10px] rounded transition-colors ${\n tab === t\n ? 'bg-accent/10 text-accent font-semibold'\n : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n {t === 'write' ? 'Write' : 'Preview'}\n </button>\n ))}\n </div>\n </div>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n {tab === 'write' ? (\n <textarea\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"input w-full mt-1 text-sm font-mono leading-relaxed\"\n rows={10}\n placeholder=\"Write markdown — headings, lists, tables, code blocks, and links all render.\"\n />\n ) : (\n <div className=\"mt-1 px-3 py-2 border border-surface-border rounded min-h-[120px]\">\n {value.trim() ? (\n <MarkdownRenderer content={value} />\n ) : (\n <p className=\"text-xs text-text-quaternary italic\">Nothing to preview.</p>\n )}\n </div>\n )}\n </div>\n );\n}\n","import type { ComponentType } from 'react';\nimport { FileUploadWidget } from './FileUploadWidget';\nimport { CodeEditorWidget } from './CodeEditorWidget';\nimport { SignatureWidget } from './SignatureWidget';\nimport { RichTextWidget } from './RichTextWidget';\nimport { MarkdownWidget } from './MarkdownWidget';\n\nexport interface WidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n}\n\n/**\n * Registry of custom widgets referenced via `x-lt-widget` in JSON Schema.\n * Each widget renders a specialized input for a string field.\n */\nexport const WIDGET_MAP: Record<string, ComponentType<WidgetProps>> = {\n 'file-upload': FileUploadWidget,\n 'code-editor': CodeEditorWidget,\n 'signature': SignatureWidget,\n 'rich-text': RichTextWidget,\n 'markdown': MarkdownWidget,\n};\n","import { useState, useEffect, useCallback } from 'react';\nimport { WIDGET_MAP } from './widgets';\n\ntype JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\n\n/**\n * Renders a JSON object as an editable form with typed inputs.\n *\n * - Strings → text input (textarea if > 80 chars)\n * - Booleans → toggle switch\n * - Numbers → number input\n * - Null → disabled placeholder\n * - Objects → nested section\n * - Arrays of strings → tag display\n * - Keys starting with `_` → hidden (preserved in output)\n *\n * Calls `onChange` with the full JSON string on every edit.\n */\nexport function ResolverForm({ value, onChange, disabled, submitAttempted }: {\n value: string;\n onChange: (json: string) => void;\n disabled?: boolean;\n submitAttempted?: boolean;\n}) {\n const [data, setData] = useState<Record<string, JsonValue>>({});\n const [hidden, setHidden] = useState<Record<string, JsonValue>>({});\n const [formSchema, setFormSchema] = useState<Record<string, any> | null>(null);\n const [parseError, setParseError] = useState(false);\n const [touched, setTouched] = useState<Set<string>>(new Set());\n\n // Parse incoming JSON\n useEffect(() => {\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n const visible: Record<string, JsonValue> = {};\n const internal: Record<string, JsonValue> = {};\n for (const [k, v] of Object.entries(parsed)) {\n if (k.startsWith('_')) {\n internal[k] = v as JsonValue;\n } else {\n visible[k] = v as JsonValue;\n }\n }\n setData(visible);\n setHidden(internal);\n setFormSchema(\n internal._form_schema && typeof internal._form_schema === 'object'\n ? internal._form_schema as Record<string, any>\n : null,\n );\n setParseError(false);\n }\n } catch {\n setParseError(true);\n }\n }, [value]);\n\n const emitChange = useCallback((updated: Record<string, JsonValue>) => {\n setData(updated);\n onChange(JSON.stringify({ ...updated, ...hidden }, null, 2));\n }, [hidden, onChange]);\n\n const updateField = useCallback((key: string, val: JsonValue) => {\n emitChange({ ...data, [key]: val });\n }, [data, emitChange]);\n\n const markTouched = useCallback((key: string) => {\n setTouched((prev) => {\n if (prev.has(key)) return prev;\n const next = new Set(prev);\n next.add(key);\n return next;\n });\n }, []);\n\n if (parseError) {\n return (\n <p className=\"text-xs text-status-error\">\n Unable to parse resolver data as form. Use the JSON editor below.\n </p>\n );\n }\n\n const allEntries = Object.entries(data);\n if (allEntries.length === 0) {\n return (\n <p className=\"text-xs text-text-tertiary italic\">\n No resolver fields defined.\n </p>\n );\n }\n\n // Field ordering via x-lt-order\n const fieldOrder = formSchema?.['x-lt-order'] as string[] | undefined;\n const entries = fieldOrder\n ? [...allEntries].sort((a, b) => {\n const ai = fieldOrder.indexOf(a[0]);\n const bi = fieldOrder.indexOf(b[0]);\n return (ai === -1 ? Infinity : ai) - (bi === -1 ? Infinity : bi);\n })\n : allEntries;\n\n const requiredFields = new Set(formSchema?.required as string[] ?? []);\n const layout = formSchema?.['x-lt-layout'] as string | undefined;\n const schemaTitle = formSchema?.title as string | undefined;\n const schemaDescription = formSchema?.description as string | undefined;\n\n const fieldRows = entries.map(([key, val]) => {\n const fieldSchema = formSchema?.properties?.[key] as Record<string, unknown> | undefined;\n const isReadOnly = fieldSchema?.readOnly === true;\n const span = (fieldSchema?.['x-lt-span'] as number) ?? 1;\n const isReq = requiredFields.has(key);\n const isTouched = touched.has(key) || !!submitAttempted;\n\n // Derive inline error for touched required fields\n let error: string | undefined;\n if (isReq && isTouched) {\n if (val === undefined || val === null) {\n error = 'Required';\n } else if (typeof val === 'string' && val.trim() === '') {\n error = 'Required';\n }\n }\n // Format-specific validation for touched fields\n if (isTouched && typeof val === 'string' && val.trim() !== '' && fieldSchema) {\n const fmt = fieldSchema.format as string | undefined;\n if (fmt === 'email' && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(val)) {\n error = 'Enter a valid email address';\n }\n if (fmt === 'uri' && !/^https?:\\/\\/.+/.test(val)) {\n error = 'Enter a valid URL';\n }\n }\n\n return (\n <div\n key={key}\n className={layout === 'two-column' && span >= 2 ? 'col-span-2' : ''}\n >\n <FieldRow\n fieldKey={key}\n value={val}\n onChange={(v) => updateField(key, v)}\n onBlur={() => markTouched(key)}\n schema={formSchema}\n isRequired={isReq}\n isReadOnly={isReadOnly}\n error={error}\n />\n </div>\n );\n });\n\n return (\n <div className={`pb-8 ${disabled ? 'opacity-60 pointer-events-none' : ''}`}>\n {/* Schema title and description */}\n {schemaTitle && (\n <h3 className=\"text-lg font-light text-text-primary mb-1\">{schemaTitle}</h3>\n )}\n {schemaDescription && (\n <p className=\"text-sm text-text-secondary leading-relaxed mb-6\">{schemaDescription}</p>\n )}\n\n {/* Layout modes */}\n {layout === 'two-column' ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-x-14 gap-y-6\">{fieldRows}</div>\n ) : (\n <div className=\"space-y-6\">{fieldRows}</div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Field row — renders appropriate input per type\n// ---------------------------------------------------------------------------\n\nfunction FieldRow({ fieldKey, value, onChange, onBlur, schema, isRequired, isReadOnly, error }: {\n fieldKey: string;\n value: JsonValue;\n onChange: (v: JsonValue) => void;\n onBlur?: () => void;\n schema?: Record<string, any> | null;\n isRequired?: boolean;\n isReadOnly?: boolean;\n error?: string;\n}) {\n const label = fieldKey.replace(/[_-]/g, ' ');\n const fieldSchema = schema?.properties?.[fieldKey] as Record<string, any> | undefined;\n const widgetName = fieldSchema?.['x-lt-widget'] as string | undefined;\n\n // Markdown dispatches ahead of the read-only branch: a readOnly markdown\n // field is a CONTENT BLOCK — the widget renders its source as HTML (the\n // versioned schema carries the page source), not as static text.\n const isMarkdown = widgetName === 'markdown' && typeof value === 'string';\n\n // Read-only fields display as static text\n if (isReadOnly && !isMarkdown) {\n const displayValue = value === null ? 'null'\n : typeof value === 'object' ? JSON.stringify(value, null, 2)\n : String(value);\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n <p className=\"text-sm text-text-secondary mt-0.5 whitespace-pre-wrap\">{displayValue}</p>\n </div>\n );\n }\n\n // Custom widget via x-lt-widget (string fields only)\n if (widgetName && widgetName in WIDGET_MAP && typeof value === 'string') {\n const Widget = WIDGET_MAP[widgetName];\n return <Widget fieldKey={fieldKey} value={value} onChange={(v) => onChange(v)} schema={fieldSchema} />;\n }\n\n // Boolean → checkbox\n if (typeof value === 'boolean') {\n return (\n <div>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={value}\n onChange={(e) => { onChange(e.target.checked); onBlur?.(); }}\n className=\"w-3.5 h-3.5 rounded accent-accent\"\n />\n <span className=\"text-[11px] font-semibold uppercase tracking-wider text-text-secondary\">\n {label}\n {isRequired && <span className=\"text-status-error ml-0.5\">*</span>}\n </span>\n </label>\n <FieldError error={error} />\n </div>\n );\n }\n\n // Number\n if (typeof value === 'number') {\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n <input\n type=\"number\"\n value={value}\n onChange={(e) => onChange(parseFloat(e.target.value) || 0)}\n onBlur={onBlur}\n step=\"any\"\n className={inputClass(!!error)}\n />\n <FieldError error={error} />\n </div>\n );\n }\n\n // String\n if (typeof value === 'string') {\n const isPassword = fieldSchema?.format === 'password';\n const enumValues = fieldSchema?.enum as string[] | undefined;\n const helperText = fieldSchema?.description as string | undefined;\n\n if (enumValues?.length) {\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onBlur={onBlur}\n className={inputClass(!!error)}\n >\n {enumValues.map((opt) => (\n <option key={opt} value={opt}>{opt}</option>\n ))}\n </select>\n <FieldError error={error} />\n </div>\n );\n }\n\n if (isPassword) {\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <input\n type=\"password\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onBlur={onBlur}\n className={inputClass(!!error)}\n autoComplete=\"off\"\n />\n <FieldError error={error} />\n </div>\n );\n }\n\n // Format-based input types\n const format = fieldSchema?.format as string | undefined;\n const FORMAT_INPUT_TYPES: Record<string, string> = {\n date: 'date',\n 'date-time': 'datetime-local',\n email: 'email',\n uri: 'url',\n };\n if (format && format in FORMAT_INPUT_TYPES) {\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <input\n type={FORMAT_INPUT_TYPES[format]}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onBlur={onBlur}\n className={inputClass(!!error)}\n />\n <FieldError error={error} />\n </div>\n );\n }\n\n // Explicit textarea format or long content\n if (format === 'textarea' || value.length > 80) {\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <textarea\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onBlur={onBlur}\n className={`${inputClass(!!error)} leading-relaxed`}\n rows={Math.min(6, Math.max(3, Math.ceil(value.length / 60)))}\n />\n <FieldError error={error} />\n </div>\n );\n }\n\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n {helperText && <p className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onBlur={onBlur}\n className={inputClass(!!error)}\n />\n <FieldError error={error} />\n </div>\n );\n }\n\n // Null\n if (value === null) {\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n <p className=\"text-xs text-text-tertiary italic mt-1\">null</p>\n </div>\n );\n }\n\n // Array of primitives\n if (Array.isArray(value)) {\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n <div className=\"flex flex-wrap gap-1.5 mt-1\">\n {value.map((item, i) => (\n <span\n key={i}\n className=\"px-2 py-0.5 text-[11px] font-mono bg-surface-sunken rounded text-text-secondary\"\n >\n {String(item)}\n </span>\n ))}\n </div>\n </div>\n );\n }\n\n // Nested object → recursive\n if (typeof value === 'object') {\n const entries = Object.entries(value);\n return (\n <div>\n <FieldLabel isRequired={isRequired}>{label}</FieldLabel>\n <div className=\"ml-4 mt-2 pl-4 border-l border-accent-faint space-y-3\">\n {entries.map(([k, v]) => (\n <FieldRow\n key={k}\n fieldKey={k}\n value={v}\n onChange={(updated) => onChange({ ...value, [k]: updated })}\n />\n ))}\n </div>\n </div>\n );\n }\n\n return null;\n}\n\nfunction FieldLabel({ children, isRequired }: { children: React.ReactNode; isRequired?: boolean }) {\n return (\n <label className=\"text-[11px] font-semibold uppercase tracking-wider text-text-secondary\">\n {children}\n {isRequired && <span className=\"text-status-error ml-0.5\">*</span>}\n </label>\n );\n}\n\nfunction FieldError({ error }: { error?: string }) {\n if (!error) return null;\n return (\n <p className=\"text-[10px] text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]\">\n {error}\n </p>\n );\n}\n\nfunction inputClass(hasError?: boolean): string {\n return hasError\n ? 'input text-sm w-full mt-1 border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]'\n : 'input text-sm w-full mt-1';\n}\n","import { ResolverForm } from '../../../components/escalation/ResolverForm';\n\nexport function ResolverSection({\n json,\n onJsonChange,\n requestTriage,\n onRequestTriageChange,\n triageNotes,\n onTriageNotesChange,\n disabled = false,\n submitAttempted = false,\n showTriage = false,\n}: {\n json: string;\n onJsonChange: (v: string) => void;\n requestTriage: boolean;\n onRequestTriageChange: (v: boolean) => void;\n triageNotes: string;\n onTriageNotesChange: (v: string) => void;\n disabled?: boolean;\n submitAttempted?: boolean;\n showTriage?: boolean;\n}) {\n return (\n <>\n {/* Triage callout */}\n {showTriage && (\n <div className=\"flex items-center justify-between mb-3\">\n {requestTriage ? (\n <button\n onClick={() => onRequestTriageChange(false)}\n className=\"group flex items-center gap-2 text-left\"\n data-testid=\"triage-cancel\"\n >\n <span className=\"flex items-center justify-center w-5 h-5 rounded-full bg-accent/10 text-accent shrink-0\">\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </span>\n <span className=\"text-xs text-text-secondary group-hover:text-text-primary transition-colors\">\n AI Triage active.{' '}\n <span className=\"text-accent group-hover:underline\">Cancel</span>\n </span>\n </button>\n ) : (\n <button\n onClick={() => onRequestTriageChange(true)}\n className=\"group flex items-center gap-2.5 text-left my-4\"\n data-testid=\"triage-callout\"\n >\n <span className=\"flex items-center justify-center w-6 h-6 rounded-full bg-accent/10 text-accent shrink-0 animate-[triage-glow_6s_ease-in-out_infinite]\">\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.663 17h4.674M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\" />\n </svg>\n </span>\n <span className=\"text-[13px] text-text-secondary group-hover:text-text-primary transition-colors\">\n This form doesn't capture the issue?{' '}\n <span className=\"text-accent group-hover:underline\">Request AI Triage</span>\n </span>\n </button>\n )}\n </div>\n )}\n\n <div className=\"relative min-h-[200px]\">\n {/* Form controls */}\n <div className={requestTriage ? 'pointer-events-none select-none' : ''}>\n <ResolverForm value={json} onChange={onJsonChange} disabled={disabled} submitAttempted={submitAttempted} />\n </div>\n\n {/* Triage overlay — occludes the form when AI Triage is checked */}\n {requestTriage && (\n <div\n className=\"absolute inset-0 z-10 flex flex-col bg-surface/90 backdrop-blur-[2px] rounded-md border border-accent/20 p-5\"\n data-testid=\"triage-overlay\"\n >\n <p className=\"text-xs text-text-secondary mb-3 leading-relaxed\">\n The resolution form will not be submitted. Describe the issue\n so AI triage can diagnose and fix it using available tools.\n The corrected result will come back as a new escalation for\n your review.\n </p>\n <textarea\n value={triageNotes}\n onChange={(e) => onTriageNotesChange(e.target.value)}\n placeholder=\"e.g. Content is in Spanish — needs translation to English before review...\"\n className=\"input text-xs w-full flex-1 min-h-[80px] resize-none\"\n autoFocus\n data-testid=\"triage-notes\"\n />\n </div>\n )}\n </div>\n </>\n );\n}\n","import { Link } from 'react-router-dom';\nimport { KeyRound, MonitorPlay } from 'lucide-react';\nimport { RoundsExhaustedContext } from '../../../components/escalation/RoundsExhaustedContext';\nimport { IframeViewport } from '../../../components/escalation/IframeViewport';\nimport { ResolverForm } from '../../../components/escalation/ResolverForm';\nimport { mapPayloadToForm } from '../../../lib/x-lt-bind';\nimport { ResolverSection } from './ResolverSection';\nimport type { ActiveView } from './EscalationActionBar';\nimport type { LTEscalationRecord } from '../../../api/types';\n\n/**\n * Expands `{key}` tokens in a viewport src URL using values from the\n * escalation's payload, envelope, and metadata — merged in that order so\n * escalation_payload values win over envelope, and envelope wins over metadata.\n *\n * This mirrors how the existing form schemas map envelope/metadata values into\n * default field values, but applied to the iframe src URL.\n */\nexport function expandViewportSrc(src: string, esc: LTEscalationRecord): string {\n if (!src.includes('{')) return src;\n try {\n const parse = (s: string | null | undefined): Record<string, unknown> => {\n if (!s) return {};\n try { return JSON.parse(s) as Record<string, unknown>; } catch { return {}; }\n };\n const merged = {\n ...(esc.metadata ?? {}),\n ...parse(esc.envelope),\n ...parse(esc.escalation_payload),\n };\n return src.replace(/\\{([^}]+)\\}/g, (_, key) =>\n Object.prototype.hasOwnProperty.call(merged, key) ? String(merged[key]) : `{${key}}`\n );\n } catch {\n return src;\n }\n}\n\ninterface EscalationContextProps {\n isRoundsExhausted: boolean;\n payloadObj: Record<string, unknown> | null;\n isTerminal: boolean;\n resolverPayload: Record<string, unknown> | null;\n onRetryTriage: () => Promise<void>;\n isRetrying: boolean;\n}\n\nexport function EscalationContextBlocks({\n isRoundsExhausted,\n payloadObj,\n isTerminal,\n resolverPayload,\n onRetryTriage,\n isRetrying,\n}: EscalationContextProps) {\n return (\n <>\n {/* Rounds-exhausted structured context */}\n {isRoundsExhausted && payloadObj && (\n <div className=\"mt-8\">\n <RoundsExhaustedContext\n payload={payloadObj}\n isTerminal={isTerminal}\n resolverPayload={resolverPayload}\n onRetryTriage={onRetryTriage}\n isRetrying={isRetrying}\n />\n </div>\n )}\n\n {/* Missing credential context */}\n {payloadObj?.category === 'missing_credential' && (\n <div className=\"mt-8 bg-status-warning/10 border border-status-warning/30 rounded-md px-5 py-4 flex items-start gap-3\">\n <KeyRound size={20} className=\"text-status-warning mt-0.5 shrink-0\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary mb-1\">Missing Credential</p>\n <p className=\"text-xs text-text-secondary mb-3\">\n This workflow requires a <span className=\"font-medium capitalize\">{String(payloadObj.provider)}</span> credential\n to continue. Register one and then resolve this escalation to retry.\n </p>\n <Link\n to=\"/credentials\"\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <KeyRound size={12} />\n Go to Credentials\n </Link>\n </div>\n </div>\n )}\n </>\n );\n}\n\ninterface FormSectionProps {\n esc: LTEscalationRecord;\n resolverPayload: unknown;\n isTerminal: boolean;\n claimedByMe: boolean;\n activeView: ActiveView;\n metadataFormSchema: unknown;\n /** The resolved form schema (metadata-embedded, role-owned, or workflow fallback). */\n effectiveSchema: Record<string, unknown> | null;\n json: string;\n onJsonChange: (v: string) => void;\n requestTriage: boolean;\n onRequestTriageChange: (v: boolean) => void;\n triageNotes: string;\n onTriageNotesChange: (v: string) => void;\n onResolve?: (payload: Record<string, unknown>) => void;\n onEscalate?: (targetRole: string) => void;\n onClaim?: () => void;\n submitAttempted?: boolean;\n isCertified?: boolean;\n hasAI?: boolean;\n}\n\n/**\n * The form area — the page's single, direct surface: the resolve form (or a\n * custom iframe viewport), shown even before claiming and enabled by the\n * claim. Terminal escalations render the submitted resolution read-only.\n * Everything else about the record lives in the side panel.\n */\nexport function EscalationFormSection({\n esc,\n resolverPayload,\n isTerminal,\n claimedByMe,\n activeView,\n metadataFormSchema,\n effectiveSchema,\n json,\n onJsonChange,\n requestTriage,\n onRequestTriageChange,\n triageNotes,\n onTriageNotesChange,\n onResolve,\n onEscalate,\n onClaim,\n submitAttempted,\n isCertified,\n hasAI,\n}: FormSectionProps) {\n const schema = effectiveSchema;\n\n // Terminal: show the submitted resolution read-only. The stored payload is\n // the NESTED shape (mapped through x-lt-bind on submit) — reverse-map it\n // back to flat form fields so the resolution renders as the same two-column\n // form it was filled in on, not as raw payload sections.\n if (isTerminal) {\n if (resolverPayload == null) return null;\n const payload = typeof resolverPayload === 'object' && resolverPayload !== null\n ? resolverPayload as Record<string, unknown>\n : {};\n const formSchema = (effectiveSchema ?? (metadataFormSchema as Record<string, any> | null));\n const value = formSchema?.properties\n ? { ...mapPayloadToForm(payload, formSchema), _form_schema: formSchema }\n : payload;\n return (\n <div className=\"mt-8 pt-6\">\n <ResolverForm\n value={JSON.stringify(value, null, 2)}\n onChange={() => {}}\n disabled\n />\n </div>\n );\n }\n\n if (activeView !== 'resolve' || !(esc.workflow_type || effectiveSchema)) return null;\n\n const viewport = schema?.['x-lt-viewport'] as { type?: string; src?: string } | undefined;\n const isIframeViewport = viewport?.type === 'iframe' && !!viewport.src && onResolve && onEscalate;\n\n if (isIframeViewport && !claimedByMe) {\n return (\n <button\n onClick={() => onClaim?.()}\n disabled={!onClaim}\n className=\"flex flex-col items-center justify-center min-h-[55vh] w-full gap-3 text-center group disabled:opacity-50 disabled:cursor-default\"\n >\n <MonitorPlay className=\"w-10 h-10 text-text-tertiary group-hover:text-accent transition-colors\" strokeWidth={1} />\n <p className=\"text-base font-medium text-text-primary group-hover:text-accent transition-colors\">Claim to launch the editor</p>\n </button>\n );\n }\n\n const resolvedSrc = isIframeViewport ? expandViewportSrc(viewport!.src!, esc) : '';\n\n return (\n <div className=\"mt-8 pt-6\">\n {isIframeViewport ? (\n <IframeViewport\n src={resolvedSrc}\n escalation={esc}\n schema={schema!}\n onResolve={onResolve!}\n onEscalate={onEscalate!}\n submitAttempted={submitAttempted}\n />\n ) : (\n <ResolverSection\n json={json}\n onJsonChange={onJsonChange}\n requestTriage={requestTriage}\n onRequestTriageChange={onRequestTriageChange}\n triageNotes={triageNotes}\n onTriageNotesChange={onTriageNotesChange}\n disabled={!claimedByMe}\n submitAttempted={submitAttempted}\n showTriage={!!isCertified && !!hasAI}\n />\n )}\n </div>\n );\n}\n","import { useState, useEffect, useRef } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useAuth } from '../../../hooks/useAuth';\nimport { useAccess } from '../../../hooks/useAccess';\nimport {\n useEscalation,\n useClaimEscalation,\n useResolveEscalation,\n useEscalateToRole,\n useCancelEscalation,\n} from '../../../api/escalations';\nimport { ConfirmCancelModal } from '../../../components/common/modal/ConfirmCancelModal';\nimport { useEscalationTargets } from '../../../api/roles';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../../components/common/data/ListToolbar';\nimport { isEffectivelyClaimed } from '../../../lib/escalation';\nimport { mapPayloadToForm } from '../../../lib/x-lt-bind';\nimport { useWorkflowConfigs } from '../../../api/workflows';\nimport { useSettings } from '../../../api/settings';\nimport { getAiOverride } from '../../../lib/view-as';\nimport { useEscalationDetailEvents } from '../../../hooks/useEventHooks';\nimport { PanelRightClose, PanelRightOpen, RotateCcw, X } from 'lucide-react';\nimport { EscalationSidePanel } from '../../../components/escalation/EscalationSidePanel';\nimport { EscalationActionBar } from './EscalationActionBar';\nimport type { ActionBarMode, ActiveView } from './EscalationActionBar';\nimport { EscalationContextBlocks, EscalationFormSection, expandViewportSrc } from './EscalationDetailSections';\nimport { IframeViewport } from '../../../components/escalation/IframeViewport';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst PANEL_OPEN_KEY = 'lt:escalation:panel:open';\n\nfunction readPanelOpen(): boolean {\n try {\n const v = localStorage.getItem(PANEL_OPEN_KEY);\n return v === null ? true : v === 'true';\n } catch {\n return true;\n }\n}\n\nfunction savePanelOpen(open: boolean): void {\n try { localStorage.setItem(PANEL_OPEN_KEY, String(open)); } catch {}\n}\n\nfunction safeParse(value: string | null | undefined): unknown {\n if (!value) return null;\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main page\n// ---------------------------------------------------------------------------\n\nexport function EscalationDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { user } = useAuth();\n const navigate = useNavigate();\n const queryClient = useQueryClient();\n const { data: esc, isLoading, refetch, isFetching } = useEscalation(id!);\n useEscalationDetailEvents(id);\n const claim = useClaimEscalation();\n const resolve = useResolveEscalation();\n const escalate = useEscalateToRole();\n const cancel = useCancelEscalation();\n const [cancelModalOpen, setCancelModalOpen] = useState(false);\n const { data: escalationTargets } = useEscalationTargets(esc?.role ?? '');\n const { data: workflowConfigs } = useWorkflowConfigs();\n const { data: settings } = useSettings();\n\n const { isBuilder } = useAccess();\n\n const wfConfig = workflowConfigs?.find((c) => c.workflow_type === esc?.workflow_type);\n const traceUrl = settings?.telemetry?.traceUrl ?? null;\n const [activeView, setActiveView] = useState<ActiveView>('resolve');\n const [json, setJson] = useState('{}');\n\n const [sidePanelOpen, setSidePanelOpen] = useState<boolean>(readPanelOpen);\n\n const [requestTriage, setRequestTriage] = useState(false);\n const [triageNotes, setTriageNotes] = useState('');\n const [submitAttempted, setSubmitAttempted] = useState(false);\n // Schema resolution, most specific first:\n // 1. metadata.form_schema — a full form embedded on the row (legacy records)\n // 2. esc.form_schema — the role's form the single-escalation GET already\n // JOINed in, resolved to the row's pinned version (metadata.schema_version)\n // or the role's latest when unpinned. No second call.\n // 3. workflow-level resolver_schema (legacy fallback)\n const metadataFormSchema = (esc?.metadata as any)?.form_schema ?? null;\n const resolverSchema =\n (esc?.form_schema ?? wfConfig?.resolver_schema ?? null) as Record<string, any> | null;\n const effectiveSchema = metadataFormSchema ?? resolverSchema;\n\n // Initialize json from the form exactly once. Each field is seeded from the\n // workflow's `envelope.formDefaults` (a resolver-shaped payload, reverse-mapped\n // through x-lt-bind to the flat form) and falls back to the field's schema\n // default. So workflow-sent defaults prefill; schema defaults fill the rest.\n // Subsequent esc refetches (claim events, real-time updates) must NOT reset\n // user edits. The form arrives embedded on esc, so nothing else to await.\n const jsonInitialized = useRef(false);\n useEffect(() => {\n if (jsonInitialized.current) return;\n const formSchema = metadataFormSchema ?? (resolverSchema?.properties ? resolverSchema : null);\n if (formSchema?.properties) {\n jsonInitialized.current = true;\n const seeded = safeParse(esc?.envelope) as Record<string, any> | null;\n const seededDefaults = seeded?.formDefaults;\n const prefill = seededDefaults && typeof seededDefaults === 'object'\n ? mapPayloadToForm(seededDefaults as Record<string, any>, formSchema)\n : {};\n const initial: Record<string, any> = { _form_schema: formSchema };\n for (const [key, def] of Object.entries(formSchema.properties)) {\n const fieldDef = def as Record<string, any>;\n initial[key] = prefill[key] ?? fieldDef.default ?? '';\n }\n setJson(JSON.stringify(initial, null, 2));\n } else if (effectiveSchema) {\n jsonInitialized.current = true;\n setJson(JSON.stringify(effectiveSchema, null, 2));\n }\n }, [effectiveSchema, metadataFormSchema, resolverSchema, esc?.envelope]);\n\n const isRoundsExhausted = esc?.subtype === 'rounds_exhausted';\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-8\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-32 bg-surface-sunken rounded w-full\" />\n </div>\n );\n }\n\n if (!esc) {\n return <p className=\"text-sm text-text-secondary\">Escalation not found.</p>;\n }\n\n const claimed = isEffectivelyClaimed(esc);\n const claimedByMe = claimed && esc.assigned_to === user?.userId;\n const claimedByOther = claimed && !claimedByMe;\n const isTerminal = esc.status === 'resolved' || esc.status === 'cancelled';\n\n const iframeViewport = (effectiveSchema as any)?.['x-lt-viewport'] as { type?: string; src?: string } | undefined;\n const isIframeMode = iframeViewport?.type === 'iframe' && !!iframeViewport?.src && claimedByMe && !isTerminal;\n\n const escalationPayload = safeParse(esc.escalation_payload);\n const resolverPayload = safeParse(esc.resolver_payload);\n const envelopeObj = safeParse(esc.envelope) as Record<string, any> | null;\n const isCertified = !!(envelopeObj?.metadata?.certified);\n const aiOverride = getAiOverride();\n const hasAI = aiOverride !== null ? aiOverride : !!(settings as any)?.ai?.enabled;\n\n const payloadObj = (typeof escalationPayload === 'object' && escalationPayload !== null && !Array.isArray(escalationPayload))\n ? escalationPayload as Record<string, unknown>\n : null;\n const triageData = payloadObj?._triage as Record<string, unknown> | undefined;\n const resolverObj = (typeof resolverPayload === 'object' && resolverPayload !== null && !Array.isArray(resolverPayload))\n ? resolverPayload as Record<string, unknown>\n : null;\n\n const actionBarMode: ActionBarMode = isTerminal\n ? 'terminal'\n : claimedByMe\n ? 'claimed_by_me'\n : claimedByOther\n ? 'claimed_by_other'\n : 'available';\n\n const handleClaim = (durationMinutes: number) => {\n claim.mutate({ id: esc.id, durationMinutes });\n };\n\n const goBack = () => {\n queryClient.resetQueries({ queryKey: ['escalations'] });\n queryClient.resetQueries({ queryKey: ['escalationStats'] });\n navigate(-1);\n };\n\n const handleResolve = async (payload: Record<string, unknown>) => {\n await resolve.mutateAsync({ id: esc.id, resolverPayload: payload });\n goBack();\n };\n\n const handleEscalate = async (targetRole: string) => {\n if (!targetRole) return;\n await escalate.mutateAsync({ id: esc.id, targetRole });\n goBack();\n };\n\n const handleRetryTriage = async () => {\n if (!claimedByMe) {\n await claim.mutateAsync({ id: esc.id, durationMinutes: 30 });\n }\n const diagnosis = (payloadObj?.diagnosis as string) || esc.description || '';\n await resolve.mutateAsync({\n id: esc.id,\n resolverPayload: { _lt: { needsTriage: true }, notes: diagnosis },\n });\n goBack();\n };\n\n const handleRelease = async () => {\n await claim.mutateAsync({ id: esc.id, durationMinutes: 0 });\n goBack();\n };\n\n const handleConfirmCancel = async () => {\n await cancel.mutateAsync(esc.id);\n setCancelModalOpen(false);\n goBack();\n };\n\n const headerActions = (\n <div className=\"flex items-center gap-2\">\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/escalations/${esc.id}`}\n />\n <button\n onClick={() => setSidePanelOpen((prev) => { savePanelOpen(!prev); return !prev; })}\n className=\"ml-2 text-text-tertiary hover:text-accent transition-colors\"\n title={sidePanelOpen ? 'Hide side panel' : 'Show side panel'}\n >\n {sidePanelOpen\n ? <PanelRightClose className=\"w-5 h-5\" strokeWidth={1.5} />\n : <PanelRightOpen className=\"w-5 h-5\" strokeWidth={1.5} />}\n </button>\n </div>\n );\n\n return (\n // Two fixed-height columns, like the left nav: the form column scrolls\n // independently and the side panel keeps its own scroll. Negative margins\n // let the panel span the full middle row (header to event feed, flush\n // right); the left column re-adds those gutters for its own content.\n <div className=\"flex-1 min-h-0 min-w-0 flex items-stretch -mt-10 -mr-10 -mb-16\">\n <div className=\"flex-1 min-w-0 flex flex-col min-h-0\">\n {isIframeMode ? (\n // Full-bleed iframe mode: no header, no padding, -ml-10 cancels shell's pl-10.\n // Release, Cancel, and panel toggle float at top-right over the iframe.\n <div className=\"relative flex-1 min-h-0 -ml-10\">\n <div className=\"absolute top-3 right-3 z-50 flex items-center gap-0.5 bg-surface/90 backdrop-blur-sm rounded-lg px-1.5 py-1 shadow-sm border border-surface-border/40\">\n {[\n {\n onClick: handleRelease,\n disabled: claim.isPending,\n label: 'Release',\n hoverClass: 'hover:text-accent',\n icon: <RotateCcw className=\"w-4 h-4\" strokeWidth={1.5} />,\n },\n {\n onClick: () => setCancelModalOpen(true),\n disabled: false,\n label: 'Cancel',\n hoverClass: 'hover:text-status-error',\n icon: <X className=\"w-4 h-4\" strokeWidth={1.5} />,\n },\n {\n onClick: () => setSidePanelOpen((prev) => { savePanelOpen(!prev); return !prev; }),\n disabled: false,\n label: sidePanelOpen ? 'Hide panel' : 'Show panel',\n hoverClass: 'hover:text-accent',\n icon: sidePanelOpen\n ? <PanelRightClose className=\"w-4 h-4\" strokeWidth={1.5} />\n : <PanelRightOpen className=\"w-4 h-4\" strokeWidth={1.5} />,\n },\n ].map(({ onClick, disabled, label, hoverClass, icon }) => (\n <div key={label} className=\"relative group/tip\">\n <button\n onClick={onClick}\n disabled={disabled}\n className={`text-text-tertiary ${hoverClass} transition-colors disabled:opacity-40 disabled:cursor-default p-1.5 rounded-md`}\n >\n {icon}\n </button>\n <span className=\"pointer-events-none absolute top-full left-1/2 -translate-x-1/2 mt-1.5 px-2 py-0.5 rounded text-[11px] bg-surface-sunken text-text-primary whitespace-nowrap opacity-0 group-hover/tip:opacity-100 transition-opacity\">\n {label}\n </span>\n </div>\n ))}\n </div>\n <IframeViewport\n src={expandViewportSrc(iframeViewport!.src!, esc)}\n escalation={esc}\n schema={effectiveSchema!}\n onResolve={handleResolve}\n onEscalate={handleEscalate}\n submitAttempted={submitAttempted}\n fill\n />\n </div>\n ) : (\n <>\n {/* The description IS the title — the page opens with what to do. It\n shares the row with the toolbar and panel toggle, truncating to\n make room. */}\n <div className=\"shrink-0 pt-10 pr-10\">\n <PageHeader title={esc.description || 'Escalation'} actions={headerActions} />\n </div>\n\n {/* Independently scrolling form column */}\n <div className=\"flex-1 min-h-0 overflow-y-auto pr-10\">\n <EscalationContextBlocks\n isRoundsExhausted={isRoundsExhausted}\n payloadObj={payloadObj}\n isTerminal={isTerminal}\n resolverPayload={resolverPayload as Record<string, unknown> | null}\n onRetryTriage={handleRetryTriage}\n isRetrying={claim.isPending || resolve.isPending}\n />\n\n <EscalationFormSection\n esc={esc}\n resolverPayload={resolverPayload}\n isTerminal={isTerminal}\n claimedByMe={claimedByMe}\n activeView={activeView}\n metadataFormSchema={metadataFormSchema}\n effectiveSchema={effectiveSchema as Record<string, unknown> | null}\n json={json}\n onJsonChange={setJson}\n requestTriage={requestTriage}\n onRequestTriageChange={setRequestTriage}\n triageNotes={triageNotes}\n onTriageNotesChange={setTriageNotes}\n onResolve={handleResolve}\n onEscalate={handleEscalate}\n onClaim={() => handleClaim(30)}\n submitAttempted={submitAttempted}\n isCertified={isCertified}\n hasAI={hasAI}\n />\n\n <div className=\"h-10\" />\n </div>\n </>\n )}\n\n {!isIframeMode && <EscalationActionBar\n mode={actionBarMode}\n activeView={activeView}\n onActiveViewChange={setActiveView}\n onClaim={handleClaim}\n claimPending={claim.isPending}\n workflowType={esc.workflow_type}\n json={json}\n onResolve={handleResolve}\n resolvePending={resolve.isPending}\n resolveError={resolve.error as Error | null}\n requestTriage={requestTriage}\n triageNotes={triageNotes}\n currentRole={esc.role}\n escalationTargets={(escalationTargets?.targets ?? []).filter((r) => r !== esc.role)}\n onEscalate={handleEscalate}\n escalatePending={escalate.isPending}\n escalateError={escalate.error as Error | null}\n onRelease={handleRelease}\n releasePending={claim.isPending}\n onCancel={() => setCancelModalOpen(true)}\n assignedTo={esc.assigned_to}\n assignedUntil={esc.assigned_until}\n onSubmitAttempt={() => setSubmitAttempted(true)}\n />}\n </div>\n\n <EscalationSidePanel\n esc={esc}\n schema={effectiveSchema as Record<string, unknown> | null}\n envelope={envelopeObj}\n payload={payloadObj}\n resolver={resolverObj}\n triage={triageData ?? null}\n hasAI={hasAI}\n claimed={claimed}\n claimedByMe={claimedByMe}\n isTerminal={isTerminal}\n isBuilder={isBuilder}\n traceUrl={traceUrl}\n open={sidePanelOpen}\n noGutter={isIframeMode}\n />\n\n <ConfirmCancelModal\n open={cancelModalOpen}\n onClose={() => setCancelModalOpen(false)}\n onConfirm={handleConfirmCancel}\n isPending={cancel.isPending}\n error={cancel.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["COLORS","BAR_H","Marker","pct","place","label","title","emphasis","tick","jsx","text","jsxs","Fragment","EscalationTimeline","esc","className","created","claimedAt","isResolved","isCancelled","isTerminal","activeClaim","isEffectivelyClaimed","showClaimed","end","total","pendingMs","activeMs","pendingPct","activePct","activeColor","activeVerb","split","formatDurationCompact","totalStr","totalTip","legend","TriageContext","triage","payload","confidence","confidenceColor","diffs","computeDiffs","action","i","diff","DiffRow","original","current","key","origVal","currVal","origStr","renderValue","corrStr","val","ESCALATION_PANEL_VIEWS","PANEL_VIEW_KEY","readPanelView","validIds","v","HIDDEN_METADATA_KEYS","MetadataList","metadata","role","entries","k","value","displayValue","facets","roleUrl","globalUrl","Link","ListFilter","Search","DetailsList","claimed","isBuilder","traceUrl","PanelField","StatusBadge","RolePill","User","UserName","DateValue","CountdownTimer","CopyableId","EscalationSidePanel","schema","envelope","resolver","hasAI","claimedByMe","open","noGutter","navigate","useNavigate","ALL_VIEW_IDS","activeView","setActiveView","useState","handleViewChange","useCallback","id","helpMarkdown","useMemo","buildHelpMarkdown","defaultHelpMarkdown","handleHelpClick","e","anchor","href","views","HelpCircle","MarkdownRenderer","Info","Sparkles","Tags","Layers","JsonViewer","Braces","SlidePanel","SlidePanelViews","EscalationActionBar","props","mode","onActiveViewChange","onClaim","claimPending","workflowType","json","onResolve","resolvePending","resolveError","requestTriage","triageNotes","currentRole","escalationTargets","onEscalate","escalatePending","escalateError","onRelease","releasePending","onCancel","assignedTo","assignedUntil","onSubmitAttempt","claimDurations","useClaimDurations","duration","setDuration","customMinutes","setCustomMinutes","parseError","setParseError","escalateTarget","setEscalateTarget","isCustom","onCustomChange","m","handleClaim","minutes","handleSubmitResolve","required","missing","field","labels","f","display","_form_schema","formValues","mapFormToPayload","tabClass","active","opt","CustomDurationPicker","renderInline","SimpleMarkdown","content","compact","segments","fencePattern","lastIndex","match","sizeClasses","allParts","segment","escaped","renderTextBlock","sz","lines","htmlParts","inList","inTable","tableRows","line","trimmed","cells","header","body","h","row","cell","SectionLabel","children","RoundsExhaustedContext","resolverPayload","onRetryTriage","isRetrying","summary","diagnosis","toolCalls","result","ltMeta","wasTriaged","triageWorkflowId","isResolvedByTriage","showResult","setShowResult","safeParse","s","IframeViewport","src","escalation","submitAttempted","fill","iframeRef","useRef","iframeOrigin","useEffect","url","sendInit","iframe","message","handler","event","data","FileUploadWidget","fieldKey","onChange","inputRef","accept","helperText","handleFile","file","_a","reader","hasFile","CodeEditorWidget","language","handleKeyDown","target","start","updated","SignatureWidget","canvasRef","isDrawing","setIsDrawing","canvas","ctx","img","getPos","rect","startDraw","pos","draw","endDraw","clear","RichTextWidget","MarkdownWidget","tab","setTab","t","WIDGET_MAP","ResolverForm","disabled","setData","hidden","setHidden","formSchema","setFormSchema","touched","setTouched","parsed","visible","internal","emitChange","updateField","markTouched","prev","next","allEntries","fieldOrder","a","b","ai","bi","requiredFields","layout","schemaTitle","schemaDescription","fieldRows","fieldSchema","isReadOnly","span","isReq","isTouched","error","fmt","FieldRow","onBlur","isRequired","widgetName","FieldLabel","Widget","FieldError","inputClass","isPassword","enumValues","format","FORMAT_INPUT_TYPES","item","hasError","ResolverSection","onJsonChange","onRequestTriageChange","onTriageNotesChange","showTriage","expandViewportSrc","parse","merged","_","EscalationContextBlocks","isRoundsExhausted","payloadObj","KeyRound","EscalationFormSection","metadataFormSchema","effectiveSchema","isCertified","mapPayloadToForm","viewport","isIframeViewport","MonitorPlay","resolvedSrc","PANEL_OPEN_KEY","readPanelOpen","savePanelOpen","EscalationDetailPage","useParams","user","useAuth","queryClient","useQueryClient","isLoading","refetch","isFetching","useEscalation","useEscalationDetailEvents","claim","useClaimEscalation","resolve","useResolveEscalation","escalate","useEscalateToRole","cancel","useCancelEscalation","cancelModalOpen","setCancelModalOpen","useEscalationTargets","workflowConfigs","useWorkflowConfigs","settings","useSettings","useAccess","wfConfig","c","setJson","sidePanelOpen","setSidePanelOpen","setRequestTriage","setTriageNotes","setSubmitAttempted","_b","resolverSchema","jsonInitialized","seeded","seededDefaults","prefill","initial","def","fieldDef","claimedByOther","iframeViewport","isIframeMode","escalationPayload","envelopeObj","_c","aiOverride","getAiOverride","_d","triageData","resolverObj","actionBarMode","durationMinutes","goBack","handleResolve","handleEscalate","targetRole","handleRetryTriage","handleRelease","handleConfirmCancel","headerActions","ListToolbar","PanelRightClose","PanelRightOpen","RotateCcw","X","onClick","hoverClass","icon","PageHeader","r","ConfirmCancelModal"],"mappings":"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"}
|