@hotmeshio/long-tail 0.10.2 → 0.10.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.
Files changed (283) hide show
  1. package/README.md +1 -0
  2. package/build/api/bot-accounts.d.ts +4 -0
  3. package/build/api/bot-accounts.js +3 -1
  4. package/build/api/escalations/metadata.js +21 -1
  5. package/build/api/escalations/resolve.d.ts +8 -0
  6. package/build/api/escalations/resolve.js +82 -3
  7. package/build/api/roles.d.ts +2 -0
  8. package/build/api/roles.js +4 -0
  9. package/build/bin/ltc.js +10 -1
  10. package/build/lib/cli/client.d.ts +4 -1
  11. package/build/lib/cli/client.js +4 -2
  12. package/build/lib/db/schemas/023_role_enforce_schema.sql +18 -0
  13. package/build/lib/typed-resolution.d.ts +35 -0
  14. package/build/lib/typed-resolution.js +37 -0
  15. package/build/modules/config.d.ts +1 -0
  16. package/build/modules/config.js +5 -0
  17. package/build/routes/bot-accounts.js +3 -1
  18. package/build/sdk/index.d.ts +4 -0
  19. package/build/sdk/index.js +14 -0
  20. package/build/services/escalation/crud.d.ts +18 -6
  21. package/build/services/escalation/crud.js +18 -2
  22. package/build/services/escalation/index.d.ts +1 -0
  23. package/build/services/escalation/index.js +1 -0
  24. package/build/services/escalation/resolver-validation.d.ts +28 -0
  25. package/build/services/escalation/resolver-validation.js +95 -0
  26. package/build/services/escalation/sql.d.ts +12 -2
  27. package/build/services/escalation/sql.js +22 -2
  28. package/build/services/iam/bots.d.ts +4 -1
  29. package/build/services/iam/bots.js +5 -3
  30. package/build/services/iam/sql.d.ts +2 -2
  31. package/build/services/iam/sql.js +15 -1
  32. package/build/services/role/enforcement-cache.d.ts +21 -0
  33. package/build/services/role/enforcement-cache.js +0 -0
  34. package/build/services/role/index.js +5 -0
  35. package/build/services/role/sql.d.ts +12 -2
  36. package/build/services/role/sql.js +15 -2
  37. package/build/services/role/types.d.ts +9 -0
  38. package/build/shared/form-validation/field-validator.d.ts +45 -0
  39. package/build/shared/form-validation/field-validator.js +214 -0
  40. package/build/shared/form-validation/index.d.ts +11 -0
  41. package/build/shared/form-validation/index.js +27 -0
  42. package/build/shared/form-validation/validate-resolver-payload.d.ts +41 -0
  43. package/build/shared/form-validation/validate-resolver-payload.js +62 -0
  44. package/build/shared/form-validation/x-lt-bind.d.ts +41 -0
  45. package/build/shared/form-validation/x-lt-bind.js +110 -0
  46. package/build/shared/form-validation/x-lt-help.d.ts +21 -0
  47. package/build/shared/form-validation/x-lt-help.js +91 -0
  48. package/build/shared/form-validation/x-lt-show-if.d.ts +7 -0
  49. package/build/shared/form-validation/x-lt-show-if.js +84 -0
  50. package/build/system/mcp-servers/admin/schemas.d.ts +3 -0
  51. package/build/system/mcp-servers/admin/schemas.js +1 -0
  52. package/build/system/mcp-servers/admin/users.js +3 -1
  53. package/build/system/mcp-servers/human-queue-schemas.d.ts +4 -4
  54. package/build/system/mcp-servers/human-queue-schemas.js +4 -1
  55. package/build/system/mcp-servers/human-queue.js +41 -2
  56. package/build/tsconfig.tsbuildinfo +1 -1
  57. package/build/types/sdk.d.ts +6 -1
  58. package/build/types/validation.d.ts +43 -0
  59. package/build/types/validation.js +28 -0
  60. package/dashboard/dist/assets/{AdminDashboard-Dy031e9g.js → AdminDashboard-DQLGybZ9.js} +2 -2
  61. package/dashboard/dist/assets/{AdminDashboard-Dy031e9g.js.map → AdminDashboard-DQLGybZ9.js.map} +1 -1
  62. package/dashboard/dist/assets/{AgentConfigPage-CqmtYBbC.js → AgentConfigPage-4JgMpuYJ.js} +3 -3
  63. package/dashboard/dist/assets/AgentConfigPage-4JgMpuYJ.js.map +1 -0
  64. package/dashboard/dist/assets/{AgentDetailPage-oYLBrN74.js → AgentDetailPage-DCgKokgX.js} +2 -2
  65. package/dashboard/dist/assets/{AgentDetailPage-oYLBrN74.js.map → AgentDetailPage-DCgKokgX.js.map} +1 -1
  66. package/dashboard/dist/assets/{AgentsPage-CHczRx5N.js → AgentsPage-BK_8VKZO.js} +2 -2
  67. package/dashboard/dist/assets/{AgentsPage-CHczRx5N.js.map → AgentsPage-BK_8VKZO.js.map} +1 -1
  68. package/dashboard/dist/assets/AvailableEscalationsPage-Dp1rsIHC.js +2 -0
  69. package/dashboard/dist/assets/AvailableEscalationsPage-Dp1rsIHC.js.map +1 -0
  70. package/dashboard/dist/assets/BotPicker-DvUnYEJk.js +2 -0
  71. package/dashboard/dist/assets/BotPicker-DvUnYEJk.js.map +1 -0
  72. package/dashboard/dist/assets/{CapabilitiesPage-lQJGZ_-t.js → CapabilitiesPage-CJ5ldY8w.js} +2 -2
  73. package/dashboard/dist/assets/{CapabilitiesPage-lQJGZ_-t.js.map → CapabilitiesPage-CJ5ldY8w.js.map} +1 -1
  74. package/dashboard/dist/assets/{CollapsibleSection-CHWP0WI6.js → CollapsibleSection-BXOpfs3z.js} +2 -2
  75. package/dashboard/dist/assets/{CollapsibleSection-CHWP0WI6.js.map → CollapsibleSection-BXOpfs3z.js.map} +1 -1
  76. package/dashboard/dist/assets/{CountdownTimer-TXsRlTU4.js → CountdownTimer-D20FNwS-.js} +2 -2
  77. package/dashboard/dist/assets/{CountdownTimer-TXsRlTU4.js.map → CountdownTimer-D20FNwS-.js.map} +1 -1
  78. package/dashboard/dist/assets/{CredentialsPage-BKxS-1sA.js → CredentialsPage-vZ2psNnd.js} +2 -2
  79. package/dashboard/dist/assets/{CredentialsPage-BKxS-1sA.js.map → CredentialsPage-vZ2psNnd.js.map} +1 -1
  80. package/dashboard/dist/assets/{CronLabel-Bd2G0Rap.js → CronLabel-KRkqNSYs.js} +2 -2
  81. package/dashboard/dist/assets/{CronLabel-Bd2G0Rap.js.map → CronLabel-KRkqNSYs.js.map} +1 -1
  82. package/dashboard/dist/assets/{CustomDurationPicker-j4bBrDJ6.js → CustomDurationPicker-C-vGsrFl.js} +2 -2
  83. package/dashboard/dist/assets/CustomDurationPicker-C-vGsrFl.js.map +1 -0
  84. package/dashboard/dist/assets/{DropZone-DNDEgMpJ.js → DropZone-C3NdMtwK.js} +2 -2
  85. package/dashboard/dist/assets/{DropZone-DNDEgMpJ.js.map → DropZone-C3NdMtwK.js.map} +1 -1
  86. package/dashboard/dist/assets/{ElapsedCell-g7GO7f8L.js → ElapsedCell-DNH-XHOS.js} +2 -2
  87. package/dashboard/dist/assets/{ElapsedCell-g7GO7f8L.js.map → ElapsedCell-DNH-XHOS.js.map} +1 -1
  88. package/dashboard/dist/assets/{EscalationListSchemaPage-CIJ-OgVC.js → EscalationListSchemaPage-BIW1qxjC.js} +3 -3
  89. package/dashboard/dist/assets/{EscalationListSchemaPage-CIJ-OgVC.js.map → EscalationListSchemaPage-BIW1qxjC.js.map} +1 -1
  90. package/dashboard/dist/assets/{EscalationSchemaPage-C7dHgG8e.js → EscalationSchemaPage-Fj2IwQXQ.js} +3 -3
  91. package/dashboard/dist/assets/{EscalationSchemaPage-C7dHgG8e.js.map → EscalationSchemaPage-Fj2IwQXQ.js.map} +1 -1
  92. package/dashboard/dist/assets/{EscalationsOverview-D8NrATg2.js → EscalationsOverview-BVUx0vZH.js} +2 -2
  93. package/dashboard/dist/assets/{EscalationsOverview-D8NrATg2.js.map → EscalationsOverview-BVUx0vZH.js.map} +1 -1
  94. package/dashboard/dist/assets/{EventTable-DBV1P2ME.js → EventTable-Dm4zZaRl.js} +2 -2
  95. package/dashboard/dist/assets/{EventTable-DBV1P2ME.js.map → EventTable-Dm4zZaRl.js.map} +1 -1
  96. package/dashboard/dist/assets/{GraphInvokePage-DbHvggQ_.js → GraphInvokePage-D4f074qh.js} +2 -2
  97. package/dashboard/dist/assets/GraphInvokePage-D4f074qh.js.map +1 -0
  98. package/dashboard/dist/assets/HomePage-DQ0bb_M_.js +2 -0
  99. package/dashboard/dist/assets/HomePage-DQ0bb_M_.js.map +1 -0
  100. package/dashboard/dist/assets/{ListToolbar-KC6LGtKP.js → ListToolbar-CItVkLQ-.js} +2 -2
  101. package/dashboard/dist/assets/{ListToolbar-KC6LGtKP.js.map → ListToolbar-CItVkLQ-.js.map} +1 -1
  102. package/dashboard/dist/assets/{McpOverview-BDZC9Hvl.js → McpOverview-ByYVDldF.js} +2 -2
  103. package/dashboard/dist/assets/{McpOverview-BDZC9Hvl.js.map → McpOverview-ByYVDldF.js.map} +1 -1
  104. package/dashboard/dist/assets/{McpQueryDetailPage-CXhgX1pS.js → McpQueryDetailPage-DYuIdJiH.js} +2 -2
  105. package/dashboard/dist/assets/{McpQueryDetailPage-CXhgX1pS.js.map → McpQueryDetailPage-DYuIdJiH.js.map} +1 -1
  106. package/dashboard/dist/assets/{McpQueryPage-CsKNXUhb.js → McpQueryPage-C9C4mPC0.js} +2 -2
  107. package/dashboard/dist/assets/{McpQueryPage-CsKNXUhb.js.map → McpQueryPage-C9C4mPC0.js.map} +1 -1
  108. package/dashboard/dist/assets/McpRunDetailPage-CWHKhx8n.js +2 -0
  109. package/dashboard/dist/assets/McpRunDetailPage-CWHKhx8n.js.map +1 -0
  110. package/dashboard/dist/assets/{McpRunsPage-f5hDbpLo.js → McpRunsPage-DMamEjjr.js} +2 -2
  111. package/dashboard/dist/assets/{McpRunsPage-f5hDbpLo.js.map → McpRunsPage-DMamEjjr.js.map} +1 -1
  112. package/dashboard/dist/assets/{NamespacePill-C4u6Go1W.js → NamespacePill-B3YOa1xo.js} +2 -2
  113. package/dashboard/dist/assets/{NamespacePill-C4u6Go1W.js.map → NamespacePill-B3YOa1xo.js.map} +1 -1
  114. package/dashboard/dist/assets/{OperationsPage-D37cZ8Qh.js → OperationsPage-CVPDugQz.js} +2 -2
  115. package/dashboard/dist/assets/OperationsPage-CVPDugQz.js.map +1 -0
  116. package/dashboard/dist/assets/OperatorDashboard-CK-4GREp.js +2 -0
  117. package/dashboard/dist/assets/{OperatorDashboard-_axS17fp.js.map → OperatorDashboard-CK-4GREp.js.map} +1 -1
  118. package/dashboard/dist/assets/{PageHeader-Bxa1XFz0.js → PageHeader-poyTWcUA.js} +2 -2
  119. package/dashboard/dist/assets/{PageHeader-Bxa1XFz0.js.map → PageHeader-poyTWcUA.js.map} +1 -1
  120. package/dashboard/dist/assets/{PageHeaderWithStats-D_sO0MqJ.js → PageHeaderWithStats-CAmspbl9.js} +2 -2
  121. package/dashboard/dist/assets/{PageHeaderWithStats-D_sO0MqJ.js.map → PageHeaderWithStats-CAmspbl9.js.map} +1 -1
  122. package/dashboard/dist/assets/{ProcessDetailPage-D8pAWUXx.js → ProcessDetailPage-BBCwv1bQ.js} +2 -2
  123. package/dashboard/dist/assets/{ProcessDetailPage-D8pAWUXx.js.map → ProcessDetailPage-BBCwv1bQ.js.map} +1 -1
  124. package/dashboard/dist/assets/{ProcessesListPage-CoQEi_Su.js → ProcessesListPage-m70xmTZx.js} +2 -2
  125. package/dashboard/dist/assets/{ProcessesListPage-CoQEi_Su.js.map → ProcessesListPage-m70xmTZx.js.map} +1 -1
  126. package/dashboard/dist/assets/RoleDetailPage-l865Cx3n.js +8 -0
  127. package/dashboard/dist/assets/RoleDetailPage-l865Cx3n.js.map +1 -0
  128. package/dashboard/dist/assets/RolePill-C0SWz9X7.js +2 -0
  129. package/dashboard/dist/assets/RolePill-C0SWz9X7.js.map +1 -0
  130. package/dashboard/dist/assets/RolesPage-Wzfjz7Wc.js +2 -0
  131. package/dashboard/dist/assets/RolesPage-Wzfjz7Wc.js.map +1 -0
  132. package/dashboard/dist/assets/{RunAsSelector-BebF8Lib.js → RunAsSelector-DlnIolTf.js} +2 -2
  133. package/dashboard/dist/assets/{RunAsSelector-BebF8Lib.js.map → RunAsSelector-DlnIolTf.js.map} +1 -1
  134. package/dashboard/dist/assets/{SlidePanel-BDVDuwIf.js → SlidePanel-Bm9B6zIA.js} +2 -2
  135. package/dashboard/dist/assets/{SlidePanel-BDVDuwIf.js.map → SlidePanel-Bm9B6zIA.js.map} +1 -1
  136. package/dashboard/dist/assets/{StickyPagination-Cd83AHd_.js → StickyPagination-BHF5fTt5.js} +2 -2
  137. package/dashboard/dist/assets/{StickyPagination-Cd83AHd_.js.map → StickyPagination-BHF5fTt5.js.map} +1 -1
  138. package/dashboard/dist/assets/{StreamMessageDetail-BIXbrZM0.js → StreamMessageDetail-Dgp1lzay.js} +2 -2
  139. package/dashboard/dist/assets/{StreamMessageDetail-BIXbrZM0.js.map → StreamMessageDetail-Dgp1lzay.js.map} +1 -1
  140. package/dashboard/dist/assets/{SwimlaneTimeline-CC5qZjYo.js → SwimlaneTimeline-BlptZ8lr.js} +2 -2
  141. package/dashboard/dist/assets/{SwimlaneTimeline-CC5qZjYo.js.map → SwimlaneTimeline-BlptZ8lr.js.map} +1 -1
  142. package/dashboard/dist/assets/{TagInput-C2gi47M8.js → TagInput-CM3AV5Ky.js} +2 -2
  143. package/dashboard/dist/assets/{TagInput-C2gi47M8.js.map → TagInput-CM3AV5Ky.js.map} +1 -1
  144. package/dashboard/dist/assets/{TaskDetailPage-DnjhW7qv.js → TaskDetailPage-f5K9dVPG.js} +2 -2
  145. package/dashboard/dist/assets/{TaskDetailPage-DnjhW7qv.js.map → TaskDetailPage-f5K9dVPG.js.map} +1 -1
  146. package/dashboard/dist/assets/{TaskQueuePill-BPP0Almh.js → TaskQueuePill-BZYmqdcv.js} +2 -2
  147. package/dashboard/dist/assets/{TaskQueuePill-BPP0Almh.js.map → TaskQueuePill-BZYmqdcv.js.map} +1 -1
  148. package/dashboard/dist/assets/{TasksListPage-DySfZFgs.js → TasksListPage-BPyPG6UY.js} +2 -2
  149. package/dashboard/dist/assets/{TasksListPage-DySfZFgs.js.map → TasksListPage-BPyPG6UY.js.map} +1 -1
  150. package/dashboard/dist/assets/{TimeAgo-BKOl-7Tt.js → TimeAgo-CBaGbueK.js} +2 -2
  151. package/dashboard/dist/assets/{TimeAgo-BKOl-7Tt.js.map → TimeAgo-CBaGbueK.js.map} +1 -1
  152. package/dashboard/dist/assets/{TimestampCell-DGOsba-A.js → TimestampCell-Z5kDrR9U.js} +2 -2
  153. package/dashboard/dist/assets/{TimestampCell-DGOsba-A.js.map → TimestampCell-Z5kDrR9U.js.map} +1 -1
  154. package/dashboard/dist/assets/{ToolPill-D74TkYB-.js → ToolPill-D_-m3lUO.js} +2 -2
  155. package/dashboard/dist/assets/{ToolPill-D74TkYB-.js.map → ToolPill-D_-m3lUO.js.map} +1 -1
  156. package/dashboard/dist/assets/{ToolTestPanel-Bez6OyRL.js → ToolTestPanel-DFrP_aMx.js} +2 -2
  157. package/dashboard/dist/assets/{ToolTestPanel-Bez6OyRL.js.map → ToolTestPanel-DFrP_aMx.js.map} +1 -1
  158. package/dashboard/dist/assets/{TopicDetailPage-BHccgkU_.js → TopicDetailPage-Cj9qXnTW.js} +3 -3
  159. package/dashboard/dist/assets/TopicDetailPage-Cj9qXnTW.js.map +1 -0
  160. package/dashboard/dist/assets/{TopicsPage-5yW63ELl.js → TopicsPage-Dyq6niOv.js} +2 -2
  161. package/dashboard/dist/assets/{TopicsPage-5yW63ELl.js.map → TopicsPage-Dyq6niOv.js.map} +1 -1
  162. package/dashboard/dist/assets/{UserName-DcXhOSVm.js → UserName-DOX2P-8M.js} +2 -2
  163. package/dashboard/dist/assets/{UserName-DcXhOSVm.js.map → UserName-DOX2P-8M.js.map} +1 -1
  164. package/dashboard/dist/assets/WorkflowExecutionPage-Cb_dSIoq.js +2 -0
  165. package/dashboard/dist/assets/WorkflowExecutionPage-Cb_dSIoq.js.map +1 -0
  166. package/dashboard/dist/assets/{WorkflowPill-Fjc2q9U9.js → WorkflowPill-CyYYPB7b.js} +2 -2
  167. package/dashboard/dist/assets/{WorkflowPill-Fjc2q9U9.js.map → WorkflowPill-CyYYPB7b.js.map} +1 -1
  168. package/dashboard/dist/assets/{WorkflowsDashboard-C0Bbrd5M.js → WorkflowsDashboard-DJpMO5IY.js} +2 -2
  169. package/dashboard/dist/assets/{WorkflowsDashboard-C0Bbrd5M.js.map → WorkflowsDashboard-DJpMO5IY.js.map} +1 -1
  170. package/dashboard/dist/assets/{WorkflowsOverview-D8MkSMex.js → WorkflowsOverview-CCC_KaXz.js} +2 -2
  171. package/dashboard/dist/assets/{WorkflowsOverview-D8MkSMex.js.map → WorkflowsOverview-CCC_KaXz.js.map} +1 -1
  172. package/dashboard/dist/assets/{YamlWorkflowDetailPage-BcbrYhDI.js → YamlWorkflowDetailPage-C3ntUyoZ.js} +2 -2
  173. package/dashboard/dist/assets/{YamlWorkflowDetailPage-BcbrYhDI.js.map → YamlWorkflowDetailPage-C3ntUyoZ.js.map} +1 -1
  174. package/dashboard/dist/assets/{YamlWorkflowsPage-9Ki54d-9.js → YamlWorkflowsPage-ju-9JDXg.js} +2 -2
  175. package/dashboard/dist/assets/{YamlWorkflowsPage-9Ki54d-9.js.map → YamlWorkflowsPage-ju-9JDXg.js.map} +1 -1
  176. package/dashboard/dist/assets/{agents-CopQ3t5o.js → agents-gs9fea8r.js} +2 -2
  177. package/dashboard/dist/assets/{agents-CopQ3t5o.js.map → agents-gs9fea8r.js.map} +1 -1
  178. package/dashboard/dist/assets/bots-DYxAHrob.js +2 -0
  179. package/dashboard/dist/assets/bots-DYxAHrob.js.map +1 -0
  180. package/dashboard/dist/assets/{capabilities-5JRieYUy.js → capabilities-BJoxz6DJ.js} +2 -2
  181. package/dashboard/dist/assets/{capabilities-5JRieYUy.js.map → capabilities-BJoxz6DJ.js.map} +1 -1
  182. package/dashboard/dist/assets/{controlplane-B4rT6tIw.js → controlplane-BeDZgDDf.js} +2 -2
  183. package/dashboard/dist/assets/{controlplane-B4rT6tIw.js.map → controlplane-BeDZgDDf.js.map} +1 -1
  184. package/dashboard/dist/assets/escalation-columns-CZ4fl0IE.js +2 -0
  185. package/dashboard/dist/assets/escalation-columns-CZ4fl0IE.js.map +1 -0
  186. package/dashboard/dist/assets/{index-CUZJHXew.js → index-BMM3Xug7.js} +2 -2
  187. package/dashboard/dist/assets/index-BMM3Xug7.js.map +1 -0
  188. package/dashboard/dist/assets/index-BMXkxgnK.js +2 -0
  189. package/dashboard/dist/assets/{index-BOJMUk4F.js.map → index-BMXkxgnK.js.map} +1 -1
  190. package/dashboard/dist/assets/{index-mcAkQblr.js → index-Bj1Mjjiv.js} +2 -2
  191. package/dashboard/dist/assets/{index-mcAkQblr.js.map → index-Bj1Mjjiv.js.map} +1 -1
  192. package/dashboard/dist/assets/{index-iOb3sGsC.js → index-BqVb13tE.js} +2 -2
  193. package/dashboard/dist/assets/index-BqVb13tE.js.map +1 -0
  194. package/dashboard/dist/assets/{index-CDHDoHYz.js → index-CGrtjUdj.js} +2 -2
  195. package/dashboard/dist/assets/{index-CDHDoHYz.js.map → index-CGrtjUdj.js.map} +1 -1
  196. package/dashboard/dist/assets/{index-BAi89Xpm.js → index-CQ8cd4JZ.js} +2 -2
  197. package/dashboard/dist/assets/{index-BAi89Xpm.js.map → index-CQ8cd4JZ.js.map} +1 -1
  198. package/dashboard/dist/assets/{index-B68A3v-S.js → index-CruL35yU.js} +2 -2
  199. package/dashboard/dist/assets/{index-B68A3v-S.js.map → index-CruL35yU.js.map} +1 -1
  200. package/dashboard/dist/assets/index-DAM1Dm1F.js +2 -0
  201. package/dashboard/dist/assets/index-DAM1Dm1F.js.map +1 -0
  202. package/dashboard/dist/assets/{index-Dd1RxGNw.js → index-DZ7PWRg1.js} +2 -2
  203. package/dashboard/dist/assets/{index-Dd1RxGNw.js.map → index-DZ7PWRg1.js.map} +1 -1
  204. package/dashboard/dist/assets/{index-BxgtIqvl.js → index-DfbrPOP3.js} +2 -2
  205. package/dashboard/dist/assets/{index-BxgtIqvl.js.map → index-DfbrPOP3.js.map} +1 -1
  206. package/dashboard/dist/assets/index-DwuM7Fka.js +5 -0
  207. package/dashboard/dist/assets/index-DwuM7Fka.js.map +1 -0
  208. package/dashboard/dist/assets/index-DycfrrTK.js +63 -0
  209. package/dashboard/dist/assets/index-DycfrrTK.js.map +1 -0
  210. package/dashboard/dist/assets/{index-BrgYykPV.js → index-tbvwCdvQ.js} +2 -2
  211. package/dashboard/dist/assets/{index-BrgYykPV.js.map → index-tbvwCdvQ.js.map} +1 -1
  212. package/dashboard/dist/assets/index-zP2ncT4m.css +1 -0
  213. package/dashboard/dist/assets/{knowledge-B9bmoXOe.js → knowledge-DZnI1Fdk.js} +2 -2
  214. package/dashboard/dist/assets/{knowledge-B9bmoXOe.js.map → knowledge-DZnI1Fdk.js.map} +1 -1
  215. package/dashboard/dist/assets/{mcp-DYMFBOFz.js → mcp-BB_m6UyI.js} +2 -2
  216. package/dashboard/dist/assets/{mcp-DYMFBOFz.js.map → mcp-BB_m6UyI.js.map} +1 -1
  217. package/dashboard/dist/assets/{mcp-query-wloSpyPM.js → mcp-query-BTSWn0de.js} +2 -2
  218. package/dashboard/dist/assets/{mcp-query-wloSpyPM.js.map → mcp-query-BTSWn0de.js.map} +1 -1
  219. package/dashboard/dist/assets/{pipelines-DBXX6TEi.js → pipelines-CvGQLyUz.js} +2 -2
  220. package/dashboard/dist/assets/{pipelines-DBXX6TEi.js.map → pipelines-CvGQLyUz.js.map} +1 -1
  221. package/dashboard/dist/assets/task-queues-7-sHKPsN.js +2 -0
  222. package/dashboard/dist/assets/task-queues-7-sHKPsN.js.map +1 -0
  223. package/dashboard/dist/assets/{tasks-CD3-C7tP.js → tasks-BbgOhCVm.js} +2 -2
  224. package/dashboard/dist/assets/{tasks-CD3-C7tP.js.map → tasks-BbgOhCVm.js.map} +1 -1
  225. package/dashboard/dist/assets/{topics-D8pKi6zA.js → topics-D9usuYHv.js} +2 -2
  226. package/dashboard/dist/assets/{topics-D8pKi6zA.js.map → topics-D9usuYHv.js.map} +1 -1
  227. package/dashboard/dist/assets/{useEventHooks-DV9pLDOW.js → useEventHooks-DxnqYVPg.js} +2 -2
  228. package/dashboard/dist/assets/{useEventHooks-DV9pLDOW.js.map → useEventHooks-DxnqYVPg.js.map} +1 -1
  229. package/dashboard/dist/assets/{useNamespace-DykYhZY9.js → useNamespace-CBAn0o5z.js} +2 -2
  230. package/dashboard/dist/assets/{useNamespace-DykYhZY9.js.map → useNamespace-CBAn0o5z.js.map} +1 -1
  231. package/dashboard/dist/assets/{useYamlActivityEvents-By044UAv.js → useYamlActivityEvents-blOlKGDO.js} +2 -2
  232. package/dashboard/dist/assets/{useYamlActivityEvents-By044UAv.js.map → useYamlActivityEvents-blOlKGDO.js.map} +1 -1
  233. package/dashboard/dist/assets/{users-mI9goDjj.js → users-CYVJHgNM.js} +2 -2
  234. package/dashboard/dist/assets/{users-mI9goDjj.js.map → users-CYVJHgNM.js.map} +1 -1
  235. package/dashboard/dist/assets/{vendor-icons-ihWGa7_d.js → vendor-icons-B98-XxNc.js} +2 -2
  236. package/dashboard/dist/assets/{vendor-icons-ihWGa7_d.js.map → vendor-icons-B98-XxNc.js.map} +1 -1
  237. package/dashboard/dist/assets/{workflows-DCUilz68.js → workflows-csQAJF0G.js} +2 -2
  238. package/dashboard/dist/assets/{workflows-DCUilz68.js.map → workflows-csQAJF0G.js.map} +1 -1
  239. package/dashboard/dist/assets/{yaml-workflows-DWNMP1PT.js → yaml-workflows-CctsTDby.js} +2 -2
  240. package/dashboard/dist/assets/{yaml-workflows-DWNMP1PT.js.map → yaml-workflows-CctsTDby.js.map} +1 -1
  241. package/dashboard/dist/index.html +3 -3
  242. package/docs/api/http/escalations.md +15 -1
  243. package/docs/api/http/roles.md +2 -0
  244. package/docs/hitl/x-lt-list-schema.md +8 -1
  245. package/docs/hitl-guide.md +3 -2
  246. package/docs/schema-enforcement.md +149 -0
  247. package/package.json +1 -1
  248. package/dashboard/dist/assets/AgentConfigPage-CqmtYBbC.js.map +0 -1
  249. package/dashboard/dist/assets/AvailableEscalationsPage-DDVuivEE.js +0 -2
  250. package/dashboard/dist/assets/AvailableEscalationsPage-DDVuivEE.js.map +0 -1
  251. package/dashboard/dist/assets/BotPicker-2QEIpc-K.js +0 -2
  252. package/dashboard/dist/assets/BotPicker-2QEIpc-K.js.map +0 -1
  253. package/dashboard/dist/assets/CustomDurationPicker-j4bBrDJ6.js.map +0 -1
  254. package/dashboard/dist/assets/GraphInvokePage-DbHvggQ_.js.map +0 -1
  255. package/dashboard/dist/assets/HomePage-BpexnDO_.js +0 -2
  256. package/dashboard/dist/assets/HomePage-BpexnDO_.js.map +0 -1
  257. package/dashboard/dist/assets/McpRunDetailPage-BM3mUSlH.js +0 -2
  258. package/dashboard/dist/assets/McpRunDetailPage-BM3mUSlH.js.map +0 -1
  259. package/dashboard/dist/assets/OperationsPage-D37cZ8Qh.js.map +0 -1
  260. package/dashboard/dist/assets/OperatorDashboard-_axS17fp.js +0 -2
  261. package/dashboard/dist/assets/RoleDetailPage-ufbypNNR.js +0 -8
  262. package/dashboard/dist/assets/RoleDetailPage-ufbypNNR.js.map +0 -1
  263. package/dashboard/dist/assets/RolePill-DLwmVMam.js +0 -2
  264. package/dashboard/dist/assets/RolePill-DLwmVMam.js.map +0 -1
  265. package/dashboard/dist/assets/RolesPage-CxpXm4Sw.js +0 -2
  266. package/dashboard/dist/assets/RolesPage-CxpXm4Sw.js.map +0 -1
  267. package/dashboard/dist/assets/TopicDetailPage-BHccgkU_.js.map +0 -1
  268. package/dashboard/dist/assets/WorkflowExecutionPage-CDDLled5.js +0 -2
  269. package/dashboard/dist/assets/WorkflowExecutionPage-CDDLled5.js.map +0 -1
  270. package/dashboard/dist/assets/bots-CAYJYL9E.js +0 -2
  271. package/dashboard/dist/assets/bots-CAYJYL9E.js.map +0 -1
  272. package/dashboard/dist/assets/escalation-columns-BbS5X61l.js +0 -2
  273. package/dashboard/dist/assets/escalation-columns-BbS5X61l.js.map +0 -1
  274. package/dashboard/dist/assets/index-BJ0jjFsI.js +0 -5
  275. package/dashboard/dist/assets/index-BJ0jjFsI.js.map +0 -1
  276. package/dashboard/dist/assets/index-BOJMUk4F.js +0 -2
  277. package/dashboard/dist/assets/index-C0cHXaX-.css +0 -1
  278. package/dashboard/dist/assets/index-CUZJHXew.js.map +0 -1
  279. package/dashboard/dist/assets/index-D5n_e59T.js +0 -2
  280. package/dashboard/dist/assets/index-D5n_e59T.js.map +0 -1
  281. package/dashboard/dist/assets/index-DIgiIoou.js +0 -63
  282. package/dashboard/dist/assets/index-DIgiIoou.js.map +0 -1
  283. package/dashboard/dist/assets/index-iOb3sGsC.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-BJ0jjFsI.js","sources":["../../src/components/common/display/EscalationTimeline.tsx","../../src/components/escalation/TriageContext.tsx","../../src/components/escalation/EscalationSidePanel.tsx","../../src/lib/x-lt-show-if.ts","../../src/lib/field-validator.ts","../../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/ChecklistWidget.tsx","../../src/components/escalation/widgets/AttachmentWidget.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/ClaimExpiryModal.tsx","../../src/hooks/useClaimClock.ts","../../src/lib/draft-store.ts","../../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\">&middot;</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, useEffect } from 'react';\nimport { useNavigate, Link } from 'react-router-dom';\nimport { HelpCircle, Info, Tags, Layers, Braces, Sparkles, User, ListFilter, Search, AlertCircle } 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 { metadataFacetUrl } from '../../lib/facet-url';\nimport type { LTEscalationRecord } from '../../api/types';\nimport type { FieldError } from '../../lib/field-validator';\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 ERRORS: 'errors',\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 roleUrl = metadataFacetUrl(key, value, role);\n const globalUrl = metadataFacetUrl(key, value);\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\nfunction ErrorsPanel({ errors }: { errors: FieldError[] }) {\n const focusField = (field: string) => {\n const el = document.querySelector<HTMLElement>(`[data-field-key=\"${field}\"]`);\n if (!el) return;\n el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n el.focus({ preventScroll: true });\n };\n\n if (errors.length === 0) {\n return <p className=\"text-xs text-text-tertiary italic\">No errors to display.</p>;\n }\n\n return (\n <div className=\"space-y-1\" role=\"alert\" aria-live=\"polite\">\n <p className=\"text-[11px] font-semibold uppercase tracking-wider text-status-error mb-4\">\n {errors.length} {errors.length === 1 ? 'issue' : 'issues'} to resolve\n </p>\n <div className=\"space-y-1.5\">\n {errors.map(({ field, message }) => (\n <button\n key={field}\n onClick={() => focusField(field)}\n className=\"w-full text-left flex items-start gap-3 px-3 py-2.5 rounded hover:bg-status-error/5 transition-colors group\"\n >\n <AlertCircle className=\"w-3.5 h-3.5 mt-0.5 shrink-0 text-status-error/60 group-hover:text-status-error transition-colors\" />\n <div>\n <p className=\"text-[11px] font-semibold text-text-primary capitalize leading-snug\">\n {field.replace(/[_-]/g, ' ')}\n </p>\n <p className=\"text-[11px] text-text-tertiary group-hover:text-text-secondary transition-colors leading-snug mt-0.5\">\n {message}\n </p>\n </div>\n </button>\n ))}\n </div>\n <p className=\"text-[10px] text-text-quaternary mt-4 px-3\">\n Click an issue to scroll to and focus the field.\n </p>\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 formErrors,\n activePanel,\n onPanelChange,\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 /** Structured form validation errors from the last submit attempt. When non-empty, the errors panel is available. */\n formErrors?: FieldError[];\n /** Controlled active panel view id. When provided, the panel uses this instead of internal state. */\n activePanel?: string;\n /** Called when the user changes the active panel view. */\n onPanelChange?: (id: string) => void;\n}) {\n const navigate = useNavigate();\n const ALL_VIEW_IDS = Object.values(ESCALATION_PANEL_VIEWS) as readonly string[];\n const [internalView, setInternalView] = useState<PanelViewId>(() => readPanelView(ALL_VIEW_IDS));\n\n const activeView = (activePanel as PanelViewId | undefined) ?? internalView;\n\n const handleViewChange = useCallback((id: string) => {\n try { localStorage.setItem(PANEL_VIEW_KEY, id); } catch {}\n setInternalView(id as PanelViewId);\n onPanelChange?.(id);\n }, [onPanelChange]);\n\n // Sync to controlled activePanel when it changes externally (e.g. page forces 'errors' after submit).\n useEffect(() => {\n if (activePanel && activePanel !== internalView) {\n setInternalView(activePanel as PanelViewId);\n }\n }, [activePanel]); // eslint-disable-line react-hooks/exhaustive-deps\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 ...(formErrors && formErrors.length > 0\n ? [{\n id: ESCALATION_PANEL_VIEWS.ERRORS,\n icon: (({ className }: { className?: string }) => (\n <AlertCircle className={`${className ?? ''} text-status-error`} />\n )) as SlidePanelView['icon'],\n label: 'Errors',\n content: <ErrorsPanel errors={formErrors} />,\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","/**\n * x-lt-showIf — conditional field visibility. A form_schema property may\n * declare `x-lt-showIf: \"domain.path\"` to show the field only when the value\n * at that path is present and truthy. Prefix `!` to invert: show when absent\n * or falsy.\n *\n * Equality forms compare the resolved value's string form:\n * \"domain.path=VALUE\" — show when String(value) equals VALUE\n * \"domain.path!=VALUE\" — show when it does not\n * An absent value compares as the empty string, so `=X` is false and `!=X` is\n * true when the path is missing. VALUE is the raw remainder after the operator\n * (trimmed; no quoting). The truthy/! forms are unchanged.\n *\n * Domains follow the same `domain.path` convention as x-lt-help tokens:\n * metadata — the escalation row's metadata dict\n * payload — the escalation context payload (escalation_payload)\n * envelope — the workflow-sent input envelope\n * escalation — top-level escalation row fields\n * resolver — the submitted resolver payload\n *\n * A missing or non-string condition always shows the field (opt-in, safe default).\n */\nimport { getDeep } from './x-lt-bind';\nimport { HELP_DOMAINS, type HelpTokenContext } from './x-lt-help';\n\nexport type ShowIfContext = HelpTokenContext;\n\nfunction isTruthy(value: unknown): boolean {\n return value !== null && value !== undefined && value !== '' && value !== false && value !== 0;\n}\n\n/** The value's comparable string form; absent compares as the empty string. */\nfunction asComparable(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n\nfunction resolvePath(expr: string, ctx: ShowIfContext): { known: boolean; value: unknown } {\n const dot = expr.indexOf('.');\n const domain = (dot === -1 ? expr : expr.slice(0, dot)) as (typeof HELP_DOMAINS)[number];\n if (!(HELP_DOMAINS as readonly string[]).includes(domain)) return { known: false, value: undefined };\n const root = ctx[domain];\n if (dot === -1) return { known: true, value: root };\n try {\n return { known: true, value: getDeep(root, expr.slice(dot + 1)) };\n } catch {\n return { known: true, value: undefined };\n }\n}\n\n/**\n * Evaluates an x-lt-showIf condition. Returns true when the field should be\n * shown. Returns true when condition is absent, non-string, or context is null.\n */\nexport function evaluateShowIf(condition: unknown, ctx: ShowIfContext | null | undefined): boolean {\n if (typeof condition !== 'string' || condition.length === 0) return true;\n if (!ctx) return true;\n const negate = condition.startsWith('!');\n const expr = negate ? condition.slice(1) : condition;\n\n // Equality forms — `!=` first so it never parses as `=` with a `!` in the path.\n const neqAt = expr.indexOf('!=');\n const eqAt = expr.indexOf('=');\n if (neqAt !== -1 || (eqAt !== -1 && eqAt !== neqAt + 1)) {\n const isNeq = neqAt !== -1 && (eqAt === -1 || neqAt < eqAt);\n const opAt = isNeq ? neqAt : eqAt;\n const path = expr.slice(0, opAt).trim();\n const expected = expr.slice(opAt + (isNeq ? 2 : 1)).trim();\n const { known, value } = resolvePath(path, ctx);\n if (!known) return true; // unknown domain — safe default, same as truthy form\n const matches = asComparable(value) === expected;\n const result = isNeq ? !matches : matches;\n return negate ? !result : result;\n }\n\n const { known, value } = resolvePath(expr, ctx);\n if (!known) return true;\n return negate ? !isTruthy(value) : isTruthy(value);\n}\n","export interface FieldError { field: string; message: string }\n\ninterface ChecklistItem { id: string; label: string; required?: boolean }\n\n/**\n * Resolve a checklist widget's item definitions from its `x-lt-source`\n * \"domain.path\" against the escalation context. Missing domain/path or a\n * non-array value yields an empty list.\n */\nexport function resolveChecklistItems(\n sourcePath: unknown,\n ctx: Record<string, unknown> | undefined,\n): ChecklistItem[] {\n if (typeof sourcePath !== 'string' || !ctx) return [];\n const dot = sourcePath.indexOf('.');\n if (dot === -1) return [];\n const domainObj = ctx[sourcePath.slice(0, dot)];\n if (!domainObj || typeof domainObj !== 'object') return [];\n let cur: unknown = domainObj;\n for (const p of sourcePath.slice(dot + 1).split('.')) {\n cur = (cur as Record<string, unknown>)[p];\n if (cur === undefined) return [];\n }\n return Array.isArray(cur) ? (cur as ChecklistItem[]) : [];\n}\n\n/**\n * The checklist completion guard (`x-lt-require-all`): every rendered item must\n * be checked, except items whose definition carries `required: false` (the\n * explicit opt-out). Vacuous when the source resolves to no items — never\n * blocks on zero. Returns the panel message, or undefined when satisfied.\n * Stricter than (and composes with) the field-level required-array entry,\n * which remains the at-least-one check.\n */\nexport function validateRequireAll(\n value: unknown,\n fieldSchema: Record<string, unknown> | undefined,\n ctx?: Record<string, unknown>,\n): string | undefined {\n if (fieldSchema?.['x-lt-widget'] !== 'checklist') return undefined;\n if (fieldSchema['x-lt-require-all'] !== true) return undefined;\n\n const items = resolveChecklistItems(fieldSchema['x-lt-source'], ctx);\n const mandatory = items.filter((i) => i.required !== false);\n if (mandatory.length === 0) return undefined;\n\n const state = (typeof value === 'object' && value !== null && !Array.isArray(value))\n ? (value as Record<string, unknown>)\n : {};\n const incomplete = mandatory.filter((i) => !state[i.id]).length;\n if (incomplete === 0) return undefined;\n return `${incomplete} of ${mandatory.length} checks incomplete`;\n}\n\n/**\n * Per-field JSON Schema validation — subset used by the resolver form.\n *\n * Returns a human-readable error string when the value fails a constraint,\n * or undefined when the value is valid. Callers are responsible for the\n * required check (empty-when-required) before calling this for constraint checks.\n *\n * `ctx` is optional context (ShowIfContext-shaped) used to resolve dynamic\n * constraint paths like `x-lt-minimum: \"envelope.min_score\"`.\n */\nexport function validateFieldConstraints(\n value: unknown,\n fieldSchema: Record<string, unknown> | undefined,\n ctx?: Record<string, unknown>,\n): string | undefined {\n if (!fieldSchema) return undefined;\n\n if (typeof value === 'string') {\n const s = value.trim();\n if (s === '') return undefined; // empty string: required check is the caller's job\n\n const minLength = resolveNumericConstraint(fieldSchema.minLength, fieldSchema['x-lt-min-length'], ctx);\n if (minLength !== undefined && s.length < minLength) {\n return `Minimum ${minLength} character${minLength === 1 ? '' : 's'}`;\n }\n\n const maxLength = resolveNumericConstraint(fieldSchema.maxLength, fieldSchema['x-lt-max-length'], ctx);\n if (maxLength !== undefined && s.length > maxLength) {\n return `Maximum ${maxLength} characters (${s.length} entered)`;\n }\n\n const pattern = fieldSchema.pattern as string | undefined;\n if (pattern) {\n try {\n if (!new RegExp(pattern).test(s)) {\n const patternError = fieldSchema['x-lt-pattern-error'] as string | undefined;\n return patternError ?? 'Invalid format';\n }\n } catch {\n // Malformed pattern in schema — silently skip\n }\n }\n\n const fmt = fieldSchema.format as string | undefined;\n if (fmt === 'email' && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(s)) {\n return 'Enter a valid email address';\n }\n if (fmt === 'uri' && !/^https?:\\/\\/.+/.test(s)) {\n return 'Enter a valid URL';\n }\n }\n\n if (typeof value === 'number') {\n const minimum = resolveNumericConstraint(fieldSchema.minimum, fieldSchema['x-lt-minimum'], ctx);\n const exclusiveMinimum = resolveNumericConstraint(fieldSchema.exclusiveMinimum, undefined, ctx);\n const maximum = resolveNumericConstraint(fieldSchema.maximum, fieldSchema['x-lt-maximum'], ctx);\n const exclusiveMaximum = resolveNumericConstraint(fieldSchema.exclusiveMaximum, undefined, ctx);\n\n if (minimum !== undefined && value < minimum) {\n return `Minimum value is ${minimum}`;\n }\n if (exclusiveMinimum !== undefined && value <= exclusiveMinimum) {\n return `Must be greater than ${exclusiveMinimum}`;\n }\n if (maximum !== undefined && value > maximum) {\n return `Maximum value is ${maximum}`;\n }\n if (exclusiveMaximum !== undefined && value >= exclusiveMaximum) {\n return `Must be less than ${exclusiveMaximum}`;\n }\n }\n\n return undefined;\n}\n\nfunction resolveNumericConstraint(\n staticVal: unknown,\n dynamicPath: unknown,\n ctx: Record<string, unknown> | undefined,\n): number | undefined {\n if (typeof staticVal === 'number') return staticVal;\n if (typeof dynamicPath === 'string' && ctx) {\n const dot = dynamicPath.indexOf('.');\n if (dot !== -1) {\n const domain = dynamicPath.slice(0, dot);\n const path = dynamicPath.slice(dot + 1);\n const domainObj = ctx[domain];\n if (domainObj && typeof domainObj === 'object') {\n const parts = path.split('.');\n let cur: unknown = domainObj;\n for (const p of parts) {\n cur = (cur as Record<string, unknown>)[p];\n if (cur === undefined) break;\n }\n if (typeof cur === 'number') return cur;\n if (typeof cur === 'string') {\n const n = Number(cur);\n if (!Number.isNaN(n)) return n;\n }\n }\n }\n }\n return undefined;\n}\n\n/** Full field error including required check then constraints. */\nexport function validateField(\n value: unknown,\n fieldSchema: Record<string, unknown> | undefined,\n isRequired: boolean,\n isTouched: boolean,\n ctx?: Record<string, unknown>,\n): string | undefined {\n if (!isTouched) return undefined;\n\n if (isRequired) {\n if (value === undefined || value === null) return 'Required';\n if (typeof value === 'boolean' && !value) return 'Required';\n if (typeof value === 'string' && value.trim() === '') return 'Required';\n if (typeof value === 'object' && !Array.isArray(value) && value !== null) {\n const vals = Object.values(value as Record<string, unknown>);\n if (vals.length === 0 || vals.every((v) => !v)) return 'Required';\n }\n }\n\n // Checklist completion — the stricter guard runs regardless of the\n // required-array entry (which stays at-least-one when present).\n const requireAll = validateRequireAll(value, fieldSchema, ctx);\n if (requireAll) return requireAll;\n\n return validateFieldConstraints(value, fieldSchema, ctx);\n}\n","import { useState, useCallback } from 'react';\nimport { mapFormToPayload } from '../../../lib/x-lt-bind';\nimport { evaluateShowIf, type ShowIfContext } from '../../../lib/x-lt-show-if';\nimport { validateField, type FieldError } from '../../../lib/field-validator';\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 /** Called with structured errors when submit is blocked by validation. */\n onValidationErrors?: (errors: FieldError[]) => void;\n /** Escalation context — used to skip required checks on fields hidden by x-lt-showIf. */\n escalationContext?: ShowIfContext;\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 onValidationErrors,\n escalationContext,\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 all fields against the embedded _form_schema.\n // Hidden fields (x-lt-showIf evaluates falsy against the live context) are\n // excluded — a field the user cannot see must never block submission.\n const schema = payload._form_schema as Record<string, unknown> | undefined;\n if (schema) {\n const properties = (schema.properties ?? {}) as Record<string, Record<string, unknown>>;\n const required = new Set((schema.required as string[] | undefined) ?? []);\n const liveCtx: ShowIfContext = {\n ...(escalationContext ?? {}),\n resolver: payload as Record<string, unknown>,\n };\n\n const fieldErrors: FieldError[] = [];\n for (const [field, fieldSchema] of Object.entries(properties)) {\n if (!evaluateShowIf(fieldSchema['x-lt-showIf'], liveCtx)) continue;\n const err = validateField(payload[field], fieldSchema, required.has(field), true, liveCtx as Record<string, unknown>);\n if (err) fieldErrors.push({ field, message: err });\n }\n\n if (fieldErrors.length > 0) {\n onSubmitAttempt?.();\n onValidationErrors?.(fieldErrors);\n const first = fieldErrors[0];\n const labels = fieldErrors.map((e) => e.field.replace(/[_-]/g, ' '));\n const display = labels.length <= 2\n ? labels.join(', ')\n : `${labels.slice(0, 2).join(', ')}...`;\n setParseError(first.message === 'Required' ? `Required: ${display}` : `${first.message} — ${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 <div className=\"flex items-center gap-4\">\n <div className=\"flex-1\" />\n {parseError && <span className=\"text-xs text-status-error\">{parseError}</span>}\n {resolveError && <span className=\"text-xs text-status-error\">{resolveError.message}</span>}\n <button\n onClick={handleSubmitResolve}\n disabled={resolvePending}\n className=\"btn-primary text-xs\"\n >\n {resolvePending\n ? (workflowType ? 'Submitting...' : 'Acknowledging...')\n : requestTriage ? 'Send to Triage'\n : workflowType ? 'Submit' : 'Acknowledge'}\n </button>\n </div>\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, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\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 { getDeep } from '../../../lib/x-lt-bind';\nimport type { ShowIfContext } from '../../../lib/x-lt-show-if';\nimport type { WidgetProps } from './index';\n\ninterface ChecklistItem { id: string; label: string; required?: boolean }\n\n/**\n * Checklist widget — renders a dynamic list of labeled checkboxes driven by\n * runtime data in the escalation context.\n *\n * Schema usage:\n * \"x-lt-widget\": \"checklist\"\n * \"x-lt-source\": \"envelope.checklist_items\" (any domain.path works)\n *\n * Item definitions: Array<{ id: string; label: string; required?: boolean }>\n * required items show an asterisk and highlight in red when unchecked after\n * a submit attempt — informational, does not block the overall form submit.\n *\n * Field-level required (schema.required includes this key): the widget shows\n * an error when all items are unchecked and submitAttempted is true.\n *\n * \"x-lt-require-all\": true — completion guard: every item must be checked\n * before submission, except items whose definition carries required: false\n * (the explicit opt-out). Unchecked mandatory items highlight red after a\n * submit attempt and clear live as they are checked.\n *\n * Value stored: Record<string, boolean> keyed by item id.\n */\nexport function ChecklistWidget({\n fieldKey,\n value,\n onChange,\n schema,\n escalationContext,\n isRequired,\n submitAttempted,\n error,\n}: WidgetProps & { escalationContext?: ShowIfContext }) {\n const sourcePath = schema?.['x-lt-source'] as string | undefined;\n const requireAll = schema?.['x-lt-require-all'] === true;\n const items: ChecklistItem[] = [];\n\n if (sourcePath && escalationContext) {\n const dot = sourcePath.indexOf('.');\n if (dot !== -1) {\n const domain = sourcePath.slice(0, dot) as keyof ShowIfContext;\n const path = sourcePath.slice(dot + 1);\n try {\n const raw = getDeep(escalationContext[domain] as unknown, path);\n if (Array.isArray(raw)) items.push(...(raw as ChecklistItem[]));\n } catch { /* ignore bad source path */ }\n }\n }\n\n let state: Record<string, boolean> = {};\n try { if (value) state = JSON.parse(value) as Record<string, boolean>; } catch { /* start empty */ }\n\n const toggle = (id: string) => onChange(JSON.stringify({ ...state, [id]: !state[id] }));\n\n if (items.length === 0) {\n return (\n <>\n <p className=\"text-xs text-text-tertiary italic mt-1\">\n No checklist items. Provide checklist_items in the escalation envelope or metadata.\n </p>\n {error && (\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 );\n }\n\n const checkedCount = items.filter((item) => state[item.id]).length;\n const groupLabel = (schema?.description as string | undefined) || 'Checklist';\n // The click-to-focus anchor: the first unchecked mandatory item, so the\n // error panel lands the user on the next box to tick (first item when done).\n const focusId = (items.find((i) => !state[i.id] && i.required !== false) ?? items[0]).id;\n\n return (\n <div role=\"group\" aria-label={groupLabel} aria-required={isRequired || undefined} aria-invalid={error ? true : undefined}>\n <div className=\"space-y-2.5 mt-1\">\n {items.map((item) => {\n const checked = state[item.id] ?? false;\n // require-all: every unchecked mandatory item (required !== false) is an\n // error after a submit attempt, clearing live as each is checked.\n // At-least-one mode: highlight only while ZERO are checked — once any\n // item is confirmed the group requirement is met and highlights clear.\n const showItemError = !checked && !!submitAttempted && (\n requireAll\n ? item.required !== false\n : checkedCount === 0 && (item.required || isRequired)\n );\n return (\n <label\n key={item.id}\n className={`flex items-start gap-3 cursor-pointer group select-none rounded px-2 py-1 -mx-2 transition-colors ${\n showItemError ? 'bg-status-error/5' : 'hover:bg-surface-hover'\n }`}\n >\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() => toggle(item.id)}\n className={`mt-0.5 w-3.5 h-3.5 shrink-0 rounded ${showItemError ? 'accent-status-error' : 'accent-accent'}`}\n data-testid={`checklist-item-${item.id}`}\n {...(item.id === focusId ? { 'data-field-key': fieldKey } : {})}\n />\n <span className={`text-sm leading-snug transition-colors ${\n showItemError\n ? 'text-status-error'\n : 'text-text-secondary group-hover:text-text-primary'\n }`}>\n {item.label}\n {item.required && (\n <span className={`ml-0.5 text-[10px] ${showItemError ? 'text-status-error' : 'text-text-quaternary'}`}>*</span>\n )}\n </span>\n </label>\n );\n })}\n </div>\n <p className=\"text-[10px] text-text-quaternary mt-3 tabular-nums\">\n {checkedCount} / {items.length} confirmed\n {requireAll ? (\n <span className=\"ml-1 text-text-quaternary/60\">\n (all required{items.some((i) => i.required === false) ? ' except optional' : ''})\n </span>\n ) : isRequired && checkedCount === 0 && !!submitAttempted && (\n <span className=\"ml-1 text-text-quaternary/60\">(at least one required)</span>\n )}\n </p>\n {error && (\n <p role=\"alert\" className=\"text-[10px] text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]\">\n {error}\n </p>\n )}\n </div>\n );\n}\n","import { useState } from 'react';\nimport { Paperclip, Download, ExternalLink } from 'lucide-react';\nimport type { WidgetProps } from './index';\n\n/**\n * Attachment widget — readOnly display of a binary value captured earlier\n * (typically by the file-upload widget): a data URL or a fetchable URL.\n * Declared as `x-lt-widget: \"attachment\"` (`\"image\"` is an accepted alias).\n *\n * Type dispatch keeps rendering safe:\n * image/* — inline constrained preview, click for full size (the <img>\n * context is script-inert, so data URLs are safe here)\n * everything else — a labeled open/download affordance, NEVER embedded as a\n * document (inlining arbitrary data: content is an XSS vector)\n */\n\ntype Kind =\n | { kind: 'none' }\n | { kind: 'image'; src: string }\n | { kind: 'file'; href: string; label: string; isData: boolean };\n\nconst IMAGE_EXT = /\\.(png|jpe?g|gif|webp|avif|bmp|svg)(\\?.*)?$/i;\n\nfunction classify(value: string): Kind {\n const v = value.trim();\n if (!v) return { kind: 'none' };\n\n const dataMime = /^data:([^;,]+)[;,]/.exec(v)?.[1]?.toLowerCase();\n if (dataMime) {\n if (dataMime.startsWith('image/')) return { kind: 'image', src: v };\n const label = dataMime === 'application/pdf' ? 'PDF' : dataMime;\n return { kind: 'file', href: v, label, isData: true };\n }\n\n if (/^https?:\\/\\//i.test(v)) {\n if (IMAGE_EXT.test(v)) return { kind: 'image', src: v };\n const ext = /\\.([a-z0-9]{2,5})(\\?.*)?$/i.exec(v)?.[1]?.toUpperCase();\n return { kind: 'file', href: v, label: ext ?? 'attachment', isData: false };\n }\n\n return { kind: 'none' };\n}\n\nexport function AttachmentWidget({ fieldKey, value, schema }: WidgetProps) {\n const [expanded, setExpanded] = useState(false);\n const att = classify(value ?? '');\n const label = fieldKey.replace(/[_-]/g, ' ');\n const helperText = schema?.description as string | undefined;\n\n const head = (\n <>\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 </>\n );\n\n if (att.kind === 'none') {\n return (\n <div>\n {head}\n <p className=\"text-xs text-text-quaternary italic mt-1\">No attachment</p>\n </div>\n );\n }\n\n if (att.kind === 'image') {\n return (\n <div>\n {head}\n <div className=\"mt-1\">\n <button\n type=\"button\"\n onClick={() => setExpanded(true)}\n className=\"block rounded-[0.125em] border border-surface-border overflow-hidden hover:border-accent transition-colors\"\n title=\"View full size\"\n >\n <img\n src={att.src}\n alt={fieldKey.replace(/[_-]/g, ' ')}\n className=\"max-h-48 max-w-full object-contain\"\n data-testid={`attachment-image-${fieldKey}`}\n />\n </button>\n {expanded && (\n <div\n className=\"fixed inset-0 z-[100] bg-text-primary/60 backdrop-blur-sm flex items-center justify-center p-8 cursor-zoom-out\"\n onClick={() => setExpanded(false)}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`${label} — full size`}\n >\n <img src={att.src} alt={label} className=\"max-h-[90vh] max-w-[90vw] object-contain\" />\n </div>\n )}\n </div>\n </div>\n );\n }\n\n // Non-image: safe open/download only — the content is never embedded.\n return (\n <div>\n {head}\n <div className=\"mt-1\">\n <a\n href={att.href}\n {...(att.isData\n ? { download: `${fieldKey}.${att.label === 'PDF' ? 'pdf' : 'bin'}` }\n : { target: '_blank', rel: 'noopener noreferrer' })}\n className=\"inline-flex items-center gap-1.5 text-xs text-accent hover:text-accent-hover transition-colors\"\n data-testid={`attachment-link-${fieldKey}`}\n >\n <Paperclip className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n {att.isData ? `Download ${att.label}` : `Open ${att.label}`}\n {att.isData\n ? <Download className=\"w-3 h-3\" strokeWidth={1.5} />\n : <ExternalLink className=\"w-3 h-3\" strokeWidth={1.5} />}\n </a>\n </div>\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';\nimport { ChecklistWidget } from './ChecklistWidget';\nimport { AttachmentWidget } from './AttachmentWidget';\nimport type { ShowIfContext } from '../../../lib/x-lt-show-if';\n\nexport interface WidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n /** Escalation context — used by widgets that read from envelope/metadata/payload at render time. */\n escalationContext?: ShowIfContext;\n /** Whether this field is listed in the schema's required array. */\n isRequired?: boolean;\n /** Whether the user has attempted to submit — triggers required/validation display in widgets. */\n submitAttempted?: boolean;\n /** Validation error to display inside the widget. */\n error?: string;\n}\n\n/**\n * Registry of custom widgets referenced via `x-lt-widget` in JSON Schema.\n * String-typed fields receive value directly; object-typed fields are\n * JSON-serialized into the widget and parsed back on change (see FieldRow).\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 'checklist': ChecklistWidget,\n // Attachment renders a captured binary (data URL / fetchable URL): images\n // inline, everything else as a safe open/download link. \"image\" is an alias\n // so schemas can name the constrained intent.\n 'attachment': AttachmentWidget,\n 'image': AttachmentWidget,\n};\n","import { useState, useEffect, useCallback } from 'react';\nimport { Layers } from 'lucide-react';\nimport { WIDGET_MAP } from './widgets';\nimport { evaluateShowIf, type ShowIfContext } from '../../lib/x-lt-show-if';\nimport { validateField } from '../../lib/field-validator';\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, escalationContext }: {\n value: string;\n onChange: (json: string) => void;\n disabled?: boolean;\n submitAttempted?: boolean;\n escalationContext?: ShowIfContext;\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 ordered = 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 // Merge current form data into the resolver domain so x-lt-showIf: 'resolver.field'\n // reacts to live edits — the parent context only carries the saved row state.\n const liveCtx: ShowIfContext = { ...(escalationContext ?? {}), resolver: data as Record<string, unknown> };\n\n // Conditional visibility via x-lt-showIf and x-lt-hide-if-empty\n const entries = ordered.filter(([key, val]) => {\n const fieldSchema = formSchema?.properties?.[key] as Record<string, unknown> | undefined;\n if (!evaluateShowIf(fieldSchema?.['x-lt-showIf'], liveCtx)) return false;\n if (fieldSchema?.['x-lt-hide-if-empty'] === true) {\n const isEmpty = val === null || val === undefined || val === '' || val === false || val === 0;\n if (isEmpty) return false;\n }\n return true;\n });\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 // Group entries by x-lt-section for labeled visual grouping.\n // Fields without x-lt-section or with an empty value form an unnamed group.\n type SectionGroup = { name: string | null; entries: [string, JsonValue][] };\n const sectionGroups: SectionGroup[] = [];\n for (const entry of entries) {\n const [key] = entry;\n const fieldSchema = formSchema?.properties?.[key] as Record<string, unknown> | undefined;\n const sectionName = (fieldSchema?.['x-lt-section'] as string | undefined)?.trim() || null;\n const last = sectionGroups[sectionGroups.length - 1];\n if (!last || last.name !== sectionName) {\n sectionGroups.push({ name: sectionName, entries: [entry] });\n } else {\n last.entries.push(entry);\n }\n }\n\n const renderGroupFields = (groupEntries: [string, JsonValue][]) =>\n groupEntries.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 const error = validateField(val, fieldSchema, isReq, isTouched, liveCtx as Record<string, unknown>);\n\n return (\n <div\n key={key}\n className={`animate-[field-enter_0.2s_ease-out] ${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 escalationContext={liveCtx}\n submitAttempted={!!submitAttempted}\n />\n </div>\n );\n });\n\n return (\n // `inert` (not just pointer-events) locks a disabled form for keyboard and\n // assistive-tech users too — fields leave the tab order entirely.\n <div\n className={`pb-8 ${disabled ? 'opacity-60 pointer-events-none' : ''}`}\n inert={disabled || undefined}\n aria-disabled={disabled || undefined}\n >\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 <div className=\"space-y-10\">\n {sectionGroups.map((group, i) => (\n <div\n key={group.name ?? `__s${i}`}\n className={group.name\n // Sections sit on the sunken band — a shade DARKER than the\n // lightest field fill, so embedded inputs pop against the group\n // the same way they pop against the filter bars. Theme-driven,\n // never a hardcoded hex.\n ? 'border-l-2 border-accent/30 bg-surface-sunken/80 rounded-[0.125em] p-4 animate-[section-enter_0.25s_ease-out]'\n : ''}\n >\n {group.name && (\n <div className=\"mb-5 flex items-center gap-2\">\n <Layers className=\"w-3.5 h-3.5 text-accent/50 shrink-0\" strokeWidth={1.5} />\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n {group.name}\n </p>\n </div>\n )}\n {layout === 'two-column' ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-x-14 gap-y-6\">\n {renderGroupFields(group.entries)}\n </div>\n ) : (\n <div className=\"space-y-6\">\n {renderGroupFields(group.entries)}\n </div>\n )}\n </div>\n ))}\n </div>\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, escalationContext, submitAttempted }: {\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 escalationContext?: ShowIfContext;\n submitAttempted?: boolean;\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 // Accessible wiring shared by every input branch: explicit label-for-input\n // association, and error/helper text linked via aria-describedby.\n const fieldId = `lt-field-${fieldKey}`;\n const errorId = `${fieldId}-error`;\n const helpId = `${fieldId}-help`;\n const hasHelper = typeof fieldSchema?.description === 'string' && fieldSchema.description.length > 0;\n const describedBy = error ? errorId : hasHelper ? helpId : undefined;\n const ariaProps = {\n id: fieldId,\n 'aria-required': isRequired || undefined,\n 'aria-invalid': error ? true : undefined,\n 'aria-describedby': describedBy,\n } as const;\n\n // Some widgets dispatch ahead of the read-only branch: a readOnly markdown\n // field is a CONTENT BLOCK (renders its source as HTML), and a readOnly\n // attachment/image renders the captured binary — never static text.\n const isMarkdown = widgetName === 'markdown' && typeof value === 'string';\n const isAttachment = (widgetName === 'attachment' || widgetName === 'image') && typeof value === 'string';\n\n // Read-only fields display as static text\n if (isReadOnly && !isMarkdown && !isAttachment) {\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.\n // String fields pass the value directly. Object fields (e.g. checklist) are\n // JSON-serialized into the widget and parsed back on change — the widget\n // interface always deals in strings; FieldRow owns the object ↔ string boundary.\n if (widgetName && widgetName in WIDGET_MAP) {\n const Widget = WIDGET_MAP[widgetName];\n const widgetProps = { fieldKey, schema: fieldSchema, escalationContext, isRequired, submitAttempted, error };\n if (typeof value === 'string') {\n return <Widget {...widgetProps} value={value} onChange={(v) => onChange(v)} />;\n }\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n return (\n <Widget\n {...widgetProps}\n value={JSON.stringify(value)}\n onChange={(raw) => { try { onChange(JSON.parse(raw) as JsonValue); } catch { onChange(raw); } }}\n />\n );\n }\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 data-field-key={fieldKey}\n {...ariaProps}\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} id={errorId} />\n </div>\n );\n }\n\n // Number\n if (typeof value === 'number') {\n return (\n <div>\n <FieldLabel isRequired={isRequired} htmlFor={fieldId}>{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 data-field-key={fieldKey}\n className={inputClass(!!error)}\n {...ariaProps}\n />\n <FieldError error={error} id={errorId} />\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} htmlFor={fieldId}>{label}</FieldLabel>\n {helperText && <p id={helpId} 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 data-field-key={fieldKey}\n className={selectClass(!!error)}\n {...ariaProps}\n >\n {enumValues.map((opt) => (\n <option key={opt} value={opt}>{opt}</option>\n ))}\n </select>\n <FieldError error={error} id={errorId} />\n </div>\n );\n }\n\n if (isPassword) {\n return (\n <div>\n <FieldLabel isRequired={isRequired} htmlFor={fieldId}>{label}</FieldLabel>\n {helperText && <p id={helpId} 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 data-field-key={fieldKey}\n className={inputClass(!!error)}\n autoComplete=\"off\"\n {...ariaProps}\n />\n <FieldError error={error} id={errorId} />\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} htmlFor={fieldId}>{label}</FieldLabel>\n {helperText && <p id={helpId} 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 data-field-key={fieldKey}\n className={inputClass(!!error)}\n {...ariaProps}\n />\n <FieldError error={error} id={errorId} />\n </div>\n );\n }\n\n // Explicit textarea format or long content\n if (format === 'textarea' || value.length > 80) {\n // Resolve effective maxLength for live counter — static schema wins, then dynamic path\n const staticMax = fieldSchema?.maxLength as number | undefined;\n const dynamicMaxPath = fieldSchema?.['x-lt-max-length'] as string | undefined;\n let resolvedMax: number | undefined = staticMax;\n if (resolvedMax === undefined && dynamicMaxPath && escalationContext) {\n const dot = dynamicMaxPath.indexOf('.');\n if (dot !== -1) {\n const domain = dynamicMaxPath.slice(0, dot);\n const path = dynamicMaxPath.slice(dot + 1);\n const domainObj = (escalationContext as Record<string, unknown>)[domain];\n if (domainObj && typeof domainObj === 'object') {\n let cur: unknown = domainObj;\n for (const p of path.split('.')) {\n cur = (cur as Record<string, unknown>)[p];\n if (cur === undefined) break;\n }\n if (typeof cur === 'number') resolvedMax = cur;\n else if (typeof cur === 'string') { const n = Number(cur); if (!Number.isNaN(n)) resolvedMax = n; }\n }\n }\n }\n const isOverMax = resolvedMax !== undefined && value.length > resolvedMax;\n\n return (\n <div>\n <FieldLabel isRequired={isRequired} htmlFor={fieldId}>{label}</FieldLabel>\n {helperText && <p id={helpId} className=\"text-[10px] text-text-tertiary mt-0.5\">{helperText}</p>}\n <textarea\n value={value}\n onChange={(e) => { onChange(e.target.value); onBlur?.(); }}\n onBlur={onBlur}\n data-field-key={fieldKey}\n className={`${inputClass(!!error)} leading-relaxed`}\n rows={Math.min(6, Math.max(3, Math.ceil(value.length / 60)))}\n {...ariaProps}\n />\n {resolvedMax !== undefined && (\n <p className={`text-[10px] mt-0.5 text-right tabular-nums ${isOverMax ? 'text-status-error font-medium' : 'text-text-quaternary'}`}>\n {value.length} / {resolvedMax}\n </p>\n )}\n <FieldError error={error} id={errorId} />\n </div>\n );\n }\n\n return (\n <div>\n <FieldLabel isRequired={isRequired} htmlFor={fieldId}>{label}</FieldLabel>\n {helperText && <p id={helpId} 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 data-field-key={fieldKey}\n className={inputClass(!!error)}\n {...ariaProps}\n />\n <FieldError error={error} id={errorId} />\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, htmlFor }: { children: React.ReactNode; isRequired?: boolean; htmlFor?: string }) {\n return (\n <label htmlFor={htmlFor} 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, id }: { error?: string; id?: string }) {\n if (!error) return null;\n return (\n <p id={id} role=\"alert\" 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\n// Select shares the field recipe but adds the unified chevron (via .select), so\n// generated dropdowns match every other select in the product.\nfunction selectClass(hasError?: boolean): string {\n return hasError\n ? 'select text-sm w-full mt-1 border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]'\n : 'select text-sm w-full mt-1';\n}\n","import { ResolverForm } from '../../../components/escalation/ResolverForm';\nimport type { ShowIfContext } from '../../../lib/x-lt-show-if';\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 escalationContext,\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 escalationContext?: ShowIfContext;\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&apos;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} escalationContext={escalationContext} />\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 type { ShowIfContext } from '../../../lib/x-lt-show-if';\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\nfunction parseJson(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\nexport function buildShowIfContext(esc: LTEscalationRecord): ShowIfContext {\n return {\n escalation: esc as unknown as Record<string, unknown>,\n metadata: esc.metadata ?? null,\n envelope: parseJson(esc.envelope),\n payload: parseJson(esc.escalation_payload),\n resolver: null,\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 const showIfCtx = buildShowIfContext(esc);\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 escalationContext={showIfCtx}\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 escalationContext={showIfCtx}\n />\n )}\n </div>\n );\n}\n","import { useState, useCallback } from 'react';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport { CustomDurationPicker } from '../../../components/common/form/CustomDurationPicker';\nimport { CountdownTimer } from '../../../components/common/display/CountdownTimer';\nimport { useClaimDurations } from '../../../hooks/useClaimDurations';\n\ninterface ClaimExpiryModalProps {\n open: boolean;\n /** ISO timestamp the claim expires at — drives the live countdown. */\n assignedUntil: string;\n onClose: () => void;\n onExtend: (durationMinutes: number) => void;\n isPending: boolean;\n}\n\n/**\n * Shown when the user's claim enters the warning window before expiry.\n * Extending re-claims with a fresh duration (an idempotent TTL extension for\n * the same assignee). Dismissing lets the claim lapse — the form locks at\n * expiry and edits are kept as a local draft.\n */\nexport function ClaimExpiryModal({ open, assignedUntil, onClose, onExtend, isPending }: ClaimExpiryModalProps) {\n const claimDurations = useClaimDurations();\n const [claimDuration, setClaimDuration] = useState('30');\n const [customMinutes, setCustomMinutes] = useState(0);\n\n const isCustom = claimDuration === 'custom';\n const effectiveMinutes = isCustom ? customMinutes : parseInt(claimDuration);\n const onCustomChange = useCallback((m: number) => setCustomMinutes(m), []);\n\n return (\n <Modal open={open} onClose={onClose} title=\"Claim Expiring\">\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n Your claim on this escalation expires in{' '}\n <CountdownTimer until={assignedUntil} />. When it lapses, the form\n locks and the item returns to the queue — your edits are kept as a\n draft. Extend to keep working.\n </p>\n <select\n value={claimDuration}\n onChange={(e) => { setClaimDuration(e.target.value); setCustomMinutes(0); }}\n className=\"select w-full text-sm\"\n aria-label=\"Extension duration\"\n >\n {claimDurations.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n <option value=\"custom\">Other...</option>\n </select>\n {isCustom && (\n <CustomDurationPicker onChange={onCustomChange} autoFocus />\n )}\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Dismiss\n </button>\n <button\n onClick={() => onExtend(effectiveMinutes)}\n className=\"btn-primary text-xs\"\n disabled={isPending || !effectiveMinutes || effectiveMinutes <= 0}\n >\n {isPending ? 'Extending...' : 'Extend Claim'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useEffect, useState } from 'react';\n\n/** How long before claim expiry the extend prompt appears. */\nexport const CLAIM_WARNING_MS = 90_000;\n\nexport interface ClaimClock {\n /** The claim window has lapsed (`assigned_until` is in the past). */\n expired: boolean;\n /** Inside the warning window before expiry — time to offer an extension. */\n expiringSoon: boolean;\n /** Milliseconds until expiry; 0 when expired or when there is no claim. */\n msRemaining: number;\n}\n\n/**\n * Re-renders the consumer exactly when a claim crosses its warning threshold\n * and again when it expires, so claim-derived UI state (form lock, extend\n * dialog) reacts to the clock. Two one-shot timeouts per claim window — no\n * per-second interval. Timers reset whenever `assignedUntil` changes (a claim\n * extension moves the expiry forward and restarts the cycle).\n */\nexport function useClaimClock(\n assignedUntil: string | null | undefined,\n warningMs: number = CLAIM_WARNING_MS,\n): ClaimClock {\n const [, forceTick] = useState(0);\n\n useEffect(() => {\n if (!assignedUntil) return;\n const remaining = new Date(assignedUntil).getTime() - Date.now();\n if (remaining <= 0) return;\n const tick = () => forceTick((t) => t + 1);\n const timers: number[] = [];\n const untilWarning = remaining - warningMs;\n if (untilWarning > 0) timers.push(window.setTimeout(tick, untilWarning));\n timers.push(window.setTimeout(tick, remaining));\n return () => timers.forEach((t) => window.clearTimeout(t));\n }, [assignedUntil, warningMs]);\n\n if (!assignedUntil) return { expired: false, expiringSoon: false, msRemaining: 0 };\n const msRemaining = Math.max(0, new Date(assignedUntil).getTime() - Date.now());\n return {\n expired: msRemaining <= 0,\n expiringSoon: msRemaining > 0 && msRemaining <= warningMs,\n msRemaining,\n };\n}\n","/**\n * Local draft persistence for the resolver form. Edits are saved per\n * escalation while the user works and restored when they return — a lapsed\n * claim or an accidental navigation never loses typed input. The draft is\n * cleared when the escalation reaches a terminal state through this client\n * (resolved, acknowledged, or cancelled).\n */\n\nconst DRAFT_KEY_PREFIX = 'lt:escalation:draft:';\n\nfunction draftKey(escalationId: string): string {\n return `${DRAFT_KEY_PREFIX}${escalationId}`;\n}\n\nexport function readDraft(escalationId: string): string | null {\n try {\n return localStorage.getItem(draftKey(escalationId));\n } catch {\n return null;\n }\n}\n\nexport function saveDraft(escalationId: string, json: string): void {\n try {\n localStorage.setItem(draftKey(escalationId), json);\n } catch {\n /* storage unavailable or full — drafts are best-effort */\n }\n}\n\nexport function clearDraft(escalationId: string): void {\n try {\n localStorage.removeItem(draftKey(escalationId));\n } catch {\n /* storage unavailable — nothing to clear */\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, ESCALATION_PANEL_VIEWS } from '../../../components/escalation/EscalationSidePanel';\nimport { EscalationActionBar } from './EscalationActionBar';\nimport type { ActionBarMode, ActiveView } from './EscalationActionBar';\nimport type { FieldError } from '../../../lib/field-validator';\nimport { validateField } from '../../../lib/field-validator';\nimport { evaluateShowIf } from '../../../lib/x-lt-show-if';\nimport { EscalationContextBlocks, EscalationFormSection, expandViewportSrc, buildShowIfContext } from './EscalationDetailSections';\nimport { IframeViewport } from '../../../components/escalation/IframeViewport';\nimport { ClaimExpiryModal } from './ClaimExpiryModal';\nimport { useClaimClock } from '../../../hooks/useClaimClock';\nimport { readDraft, saveDraft, clearDraft } from '../../../lib/draft-store';\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 const [formErrors, setFormErrors] = useState<FieldError[]>([]);\n const [panelActiveView, setPanelActiveView] = useState<string | undefined>(undefined);\n\n // Claim clock: re-renders at the warning threshold (extend prompt) and at\n // expiry (isEffectivelyClaimed flips false on that render — the form locks\n // and the action bar returns to its available state). Dismissal is keyed by\n // the assigned_until value so an ignored prompt stays away for that claim\n // window but returns after an extension starts a new one.\n const claimClock = useClaimClock(esc?.assigned_until);\n const [extendDismissedUntil, setExtendDismissedUntil] = useState<string | null>(null);\n\n // Recompute form errors in real-time once the user has attempted a submit.\n // This keeps the errors sidebar in sync as the user fixes (or breaks) fields.\n useEffect(() => {\n if (!submitAttempted || !esc) return;\n try {\n const payload = JSON.parse(json) as Record<string, unknown>;\n const schema = payload._form_schema as Record<string, unknown> | undefined;\n if (!schema) { setFormErrors([]); return; }\n const properties = (schema.properties ?? {}) as Record<string, Record<string, unknown>>;\n const required = new Set((schema.required as string[] | undefined) ?? []);\n const ctx = { ...buildShowIfContext(esc), resolver: payload };\n const errors: FieldError[] = [];\n for (const [field, fieldSchema] of Object.entries(properties)) {\n if (!evaluateShowIf(fieldSchema['x-lt-showIf'], ctx)) continue;\n const err = validateField(payload[field], fieldSchema, required.has(field), true, ctx as Record<string, unknown>);\n if (err) errors.push({ field, message: err });\n }\n setFormErrors(errors);\n } catch { /* leave errors unchanged on parse failure */ }\n }, [json, submitAttempted, esc]);\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. Fields are seeded in priority order:\n // metadata (facts stamped at enqueue) → envelope.formDefaults (workflow overrides)\n // → schema default. formDefaults always wins over metadata so the workflow can\n // override a metadata fact when needed. Subsequent esc refetches must NOT reset\n // user edits. The form arrives embedded on esc, so nothing else to await.\n const jsonInitialized = useRef(false);\n const initialJsonRef = useRef<string | null>(null);\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 formDefaults = seeded?.formDefaults;\n const mergedPrefill: Record<string, any> = {\n ...(esc?.metadata ?? {}),\n ...(typeof formDefaults === 'object' && formDefaults !== null ? formDefaults : {}),\n };\n const prefill = mapPayloadToForm(mergedPrefill, formSchema);\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 initialJsonRef.current = JSON.stringify(initial, null, 2);\n // A saved draft (typed input from an earlier visit or a lapsed claim)\n // wins over the seeded defaults. The schema is always taken fresh —\n // a draft never resurrects a stale form definition.\n const terminal = esc?.status === 'resolved' || esc?.status === 'cancelled';\n const draft = !terminal && esc?.id ? readDraft(esc.id) : null;\n const draftObj = draft ? (safeParse(draft) as Record<string, any> | null) : null;\n if (draftObj && typeof draftObj === 'object' && !Array.isArray(draftObj)) {\n setJson(JSON.stringify({ ...draftObj, _form_schema: formSchema }, null, 2));\n } else {\n setJson(initialJsonRef.current);\n }\n } else if (effectiveSchema) {\n jsonInitialized.current = true;\n setJson(JSON.stringify(effectiveSchema, null, 2));\n }\n }, [effectiveSchema, metadataFormSchema, resolverSchema, esc?.envelope, esc?.metadata, esc?.id, esc?.status]);\n\n // Persist edits as a local draft (debounced). Best-effort insurance against\n // a lapsed claim or accidental navigation. Pristine defaults are not saved,\n // and reverting to them removes the stored draft; a terminal outcome\n // through this client clears it too (see handleResolve / handleConfirmCancel).\n useEffect(() => {\n if (!jsonInitialized.current || initialJsonRef.current === null || !esc?.id) return;\n if (esc.status !== 'pending') return;\n const escalationId = esc.id;\n const timer = window.setTimeout(() => {\n if (json === initialJsonRef.current) clearDraft(escalationId);\n else saveDraft(escalationId, json);\n }, 400);\n return () => window.clearTimeout(timer);\n }, [json, esc?.id, esc?.status]);\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 clearDraft(esc.id);\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 clearDraft(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 escalationContext={buildShowIfContext(esc)}\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 onValidationErrors={(errors) => {\n setFormErrors(errors);\n setSidePanelOpen(true);\n savePanelOpen(true);\n setPanelActiveView(ESCALATION_PANEL_VIEWS.ERRORS);\n }}\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 formErrors={formErrors}\n activePanel={panelActiveView}\n onPanelChange={setPanelActiveView}\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\n {claimedByMe && !isTerminal && esc.assigned_until && (\n <ClaimExpiryModal\n open={claimClock.expiringSoon && esc.assigned_until !== extendDismissedUntil}\n assignedUntil={esc.assigned_until}\n onClose={() => setExtendDismissedUntil(esc.assigned_until ?? null)}\n onExtend={handleClaim}\n isPending={claim.isPending}\n />\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","roleUrl","metadataFacetUrl","globalUrl","Link","ListFilter","Search","DetailsList","claimed","isBuilder","traceUrl","PanelField","StatusBadge","RolePill","User","UserName","DateValue","CountdownTimer","CopyableId","ErrorsPanel","errors","focusField","field","el","message","AlertCircle","EscalationSidePanel","schema","envelope","resolver","hasAI","claimedByMe","open","noGutter","formErrors","activePanel","onPanelChange","navigate","useNavigate","ALL_VIEW_IDS","internalView","setInternalView","useState","activeView","handleViewChange","useCallback","id","useEffect","helpMarkdown","useMemo","buildHelpMarkdown","defaultHelpMarkdown","handleHelpClick","e","anchor","href","views","HelpCircle","MarkdownRenderer","Info","Sparkles","Tags","Layers","JsonViewer","Braces","SlidePanel","SlidePanelViews","isTruthy","asComparable","resolvePath","expr","ctx","dot","domain","HELP_DOMAINS","root","getDeep","evaluateShowIf","condition","negate","neqAt","eqAt","isNeq","opAt","path","expected","known","matches","result","resolveChecklistItems","sourcePath","domainObj","cur","p","validateRequireAll","fieldSchema","mandatory","state","incomplete","validateFieldConstraints","s","minLength","resolveNumericConstraint","maxLength","pattern","fmt","minimum","exclusiveMinimum","maximum","exclusiveMaximum","staticVal","dynamicPath","parts","n","validateField","isRequired","isTouched","vals","requireAll","EscalationActionBar","props","mode","onActiveViewChange","onClaim","claimPending","workflowType","json","onResolve","resolvePending","resolveError","requestTriage","triageNotes","currentRole","escalationTargets","onEscalate","escalatePending","escalateError","onRelease","releasePending","onCancel","assignedTo","assignedUntil","onSubmitAttempt","onValidationErrors","escalationContext","claimDurations","useClaimDurations","duration","setDuration","customMinutes","setCustomMinutes","parseError","setParseError","escalateTarget","setEscalateTarget","isCustom","onCustomChange","m","handleClaim","minutes","handleSubmitResolve","properties","required","liveCtx","fieldErrors","err","first","labels","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","c","header","body","h","row","cell","SectionLabel","children","RoundsExhaustedContext","resolverPayload","onRetryTriage","isRetrying","summary","diagnosis","toolCalls","ltMeta","wasTriaged","triageWorkflowId","isResolvedByTriage","showResult","setShowResult","safeParse","IframeViewport","src","escalation","submitAttempted","fill","iframeRef","useRef","iframeOrigin","url","sendInit","iframe","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","img","getPos","rect","startDraw","pos","draw","endDraw","clear","RichTextWidget","MarkdownWidget","tab","setTab","t","ChecklistWidget","error","items","raw","toggle","checkedCount","item","groupLabel","focusId","checked","showItemError","IMAGE_EXT","classify","dataMime","_b","ext","_d","_c","AttachmentWidget","expanded","setExpanded","att","head","Paperclip","Download","ExternalLink","WIDGET_MAP","ResolverForm","disabled","setData","hidden","setHidden","formSchema","setFormSchema","touched","setTouched","parsed","visible","internal","emitChange","updateField","markTouched","prev","next","allEntries","fieldOrder","ordered","a","b","ai","bi","requiredFields","layout","schemaTitle","schemaDescription","sectionGroups","entry","sectionName","last","renderGroupFields","groupEntries","isReadOnly","span","isReq","FieldRow","group","onBlur","widgetName","fieldId","errorId","helpId","hasHelper","ariaProps","FieldLabel","Widget","widgetProps","FieldError","inputClass","isPassword","enumValues","selectClass","format","FORMAT_INPUT_TYPES","staticMax","dynamicMaxPath","resolvedMax","isOverMax","htmlFor","hasError","ResolverSection","onJsonChange","onRequestTriageChange","onTriageNotesChange","showTriage","expandViewportSrc","parse","merged","_","parseJson","buildShowIfContext","EscalationContextBlocks","isRoundsExhausted","payloadObj","KeyRound","EscalationFormSection","metadataFormSchema","effectiveSchema","isCertified","showIfCtx","mapPayloadToForm","viewport","isIframeViewport","MonitorPlay","resolvedSrc","ClaimExpiryModal","onClose","onExtend","isPending","claimDuration","setClaimDuration","effectiveMinutes","Modal","CLAIM_WARNING_MS","useClaimClock","warningMs","forceTick","remaining","timers","untilWarning","msRemaining","DRAFT_KEY_PREFIX","draftKey","escalationId","readDraft","saveDraft","clearDraft","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","setActiveView","setJson","sidePanelOpen","setSidePanelOpen","setRequestTriage","setTriageNotes","setSubmitAttempted","setFormErrors","panelActiveView","setPanelActiveView","claimClock","extendDismissedUntil","setExtendDismissedUntil","resolverSchema","jsonInitialized","initialJsonRef","seeded","formDefaults","mergedPrefill","prefill","initial","def","fieldDef","draft","draftObj","timer","claimedByOther","iframeViewport","isIframeMode","escalationPayload","envelopeObj","aiOverride","getAiOverride","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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"}