@hotmeshio/long-tail 0.19.1 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/README.md +4 -4
  2. package/build/api/escalations/accumulate.d.ts +96 -0
  3. package/build/api/escalations/accumulate.js +516 -0
  4. package/build/api/escalations/index.d.ts +1 -0
  5. package/build/api/escalations/index.js +10 -1
  6. package/build/api/roles.d.ts +4 -5
  7. package/build/api/roles.js +53 -4
  8. package/build/api/scan-codes/execute.js +2 -0
  9. package/build/api/scan-codes/verbs.d.ts +15 -0
  10. package/build/api/scan-codes/verbs.js +65 -0
  11. package/build/api/workflows/config.d.ts +3 -0
  12. package/build/api/workflows/config.js +15 -0
  13. package/build/api/workflows/index.d.ts +1 -0
  14. package/build/api/workflows/index.js +3 -1
  15. package/build/api/workflows/input-lookups.d.ts +16 -0
  16. package/build/api/workflows/input-lookups.js +69 -0
  17. package/build/api/workflows/input-validation.d.ts +4 -3
  18. package/build/api/workflows/input-validation.js +7 -4
  19. package/build/api/workflows/invocable.js +1 -0
  20. package/build/api/workflows/invocation.js +1 -1
  21. package/build/index.js +60 -0
  22. package/build/lib/db/schemas/035_workflow_input_lookups.sql +9 -0
  23. package/build/lib/db/schemas/036_role_portals.sql +12 -0
  24. package/build/routes/escalations/accumulate.d.ts +7 -0
  25. package/build/routes/escalations/accumulate.js +150 -0
  26. package/build/routes/escalations/index.js +5 -0
  27. package/build/routes/workflows/config.js +10 -0
  28. package/build/sdk/index.d.ts +25 -0
  29. package/build/sdk/index.js +8 -0
  30. package/build/services/config/cache.js +1 -0
  31. package/build/services/config/read.js +2 -0
  32. package/build/services/config/sql.d.ts +2 -2
  33. package/build/services/config/sql.js +6 -5
  34. package/build/services/config/write.js +10 -1
  35. package/build/services/escalation/accumulate.d.ts +81 -0
  36. package/build/services/escalation/accumulate.js +154 -0
  37. package/build/services/escalation/index.d.ts +1 -0
  38. package/build/services/escalation/index.js +1 -0
  39. package/build/services/knowledge/index.d.ts +1 -0
  40. package/build/services/knowledge/index.js +1 -0
  41. package/build/services/knowledge/lookup-refs.d.ts +7 -0
  42. package/build/services/knowledge/lookup-refs.js +26 -0
  43. package/build/services/mcp/db-server/schemas.d.ts +2 -2
  44. package/build/services/mcp/playwright-server/schemas.d.ts +2 -2
  45. package/build/services/orchestrator/condition.d.ts +40 -3
  46. package/build/services/orchestrator/condition.js +42 -2
  47. package/build/services/role/index.js +1 -0
  48. package/build/services/role/seed.js +6 -1
  49. package/build/services/role/sql.d.ts +6 -3
  50. package/build/services/role/sql.js +7 -2
  51. package/build/services/role/types.d.ts +38 -10
  52. package/build/services/role/types.js +10 -1
  53. package/build/services/scan-code/validate.js +16 -0
  54. package/build/shared/form-validation/display-only-widgets.d.ts +16 -0
  55. package/build/shared/form-validation/display-only-widgets.js +25 -0
  56. package/build/shared/form-validation/field-validator.d.ts +1 -0
  57. package/build/shared/form-validation/field-validator.js +94 -6
  58. package/build/shared/form-validation/index.d.ts +2 -0
  59. package/build/shared/form-validation/index.js +2 -0
  60. package/build/shared/form-validation/invoke-context.d.ts +4 -3
  61. package/build/shared/form-validation/invoke-context.js +5 -4
  62. package/build/shared/form-validation/x-lt-bind.d.ts +2 -14
  63. package/build/shared/form-validation/x-lt-bind.js +12 -8
  64. package/build/shared/form-validation/x-lt-invoke.d.ts +38 -0
  65. package/build/shared/form-validation/x-lt-invoke.js +103 -0
  66. package/build/shared/form-validation/x-lt-options.d.ts +3 -3
  67. package/build/shared/form-validation/x-lt-options.js +19 -5
  68. package/build/shared/form-validation/x-lt-show-if.d.ts +5 -0
  69. package/build/shared/form-validation/x-lt-show-if.js +10 -0
  70. package/build/start/workers.js +10 -0
  71. package/build/system/mcp-servers/admin/escalations.js +39 -0
  72. package/build/system/mcp-servers/admin/schemas.d.ts +256 -33
  73. package/build/system/mcp-servers/admin/schemas.js +55 -3
  74. package/build/system/mcp-servers/admin/users.js +1 -0
  75. package/build/system/mcp-servers/admin/workflow-config.js +54 -9
  76. package/build/system/mcp-servers/admin/workflows.js +9 -7
  77. package/build/system/mcp-servers/db-query/schemas.d.ts +2 -2
  78. package/build/system/mcp-servers/docs.js +4 -0
  79. package/build/system/mcp-servers/human-queue-schemas.d.ts +85 -0
  80. package/build/system/mcp-servers/human-queue-schemas.js +19 -1
  81. package/build/system/mcp-servers/human-queue.d.ts +2 -0
  82. package/build/system/mcp-servers/human-queue.js +77 -0
  83. package/build/system/seed/tool-manifests-admin.d.ts +1509 -227
  84. package/build/system/seed/tool-manifests-admin.js +8 -4
  85. package/build/system/seed/tool-manifests-escalation.d.ts +174 -0
  86. package/build/system/seed/tool-manifests-escalation.js +56 -0
  87. package/build/tsconfig.tsbuildinfo +1 -1
  88. package/build/types/config.d.ts +4 -0
  89. package/build/types/escalation.d.ts +52 -0
  90. package/build/types/escalation.js +29 -1
  91. package/build/types/index.d.ts +2 -2
  92. package/build/types/index.js +3 -1
  93. package/build/types/scan-code.d.ts +24 -0
  94. package/build/types/scan-code.js +9 -0
  95. package/build/types/startup.d.ts +26 -0
  96. package/dashboard/dist/assets/{AdminDashboard-Drs-9TRM.js → AdminDashboard-uarpHB88.js} +2 -2
  97. package/dashboard/dist/assets/{AdminDashboard-Drs-9TRM.js.map → AdminDashboard-uarpHB88.js.map} +1 -1
  98. package/dashboard/dist/assets/{AgentConfigPage-BDPDZ7-v.js → AgentConfigPage-BcUaDD5E.js} +6 -6
  99. package/dashboard/dist/assets/{AgentConfigPage-BDPDZ7-v.js.map → AgentConfigPage-BcUaDD5E.js.map} +1 -1
  100. package/dashboard/dist/assets/{AgentDetailPage-CGBulM4_.js → AgentDetailPage-BaZBhK6i.js} +3 -3
  101. package/dashboard/dist/assets/{AgentDetailPage-CGBulM4_.js.map → AgentDetailPage-BaZBhK6i.js.map} +1 -1
  102. package/dashboard/dist/assets/AgentsPage-CuVFSDc4.js +2 -0
  103. package/dashboard/dist/assets/{AgentsPage-D77JeViQ.js.map → AgentsPage-CuVFSDc4.js.map} +1 -1
  104. package/dashboard/dist/assets/AvailableEscalationsPage-iO5NyyIK.js +2 -0
  105. package/dashboard/dist/assets/AvailableEscalationsPage-iO5NyyIK.js.map +1 -0
  106. package/dashboard/dist/assets/{BotPicker-CC5vI_Sv.js → BotPicker-CClMby6B.js} +2 -2
  107. package/dashboard/dist/assets/{BotPicker-CC5vI_Sv.js.map → BotPicker-CClMby6B.js.map} +1 -1
  108. package/dashboard/dist/assets/BulkAssignModal-BL8FRgkN.js +2 -0
  109. package/dashboard/dist/assets/{BulkAssignModal-BXiJnlqt.js.map → BulkAssignModal-BL8FRgkN.js.map} +1 -1
  110. package/dashboard/dist/assets/CapabilitiesPage-D53ogPor.js +2 -0
  111. package/dashboard/dist/assets/{CapabilitiesPage-D9TC2iKy.js.map → CapabilitiesPage-D53ogPor.js.map} +1 -1
  112. package/dashboard/dist/assets/{CollapsibleSection-D10lGw_u.js → CollapsibleSection-ow8jpbtD.js} +2 -2
  113. package/dashboard/dist/assets/{CollapsibleSection-D10lGw_u.js.map → CollapsibleSection-ow8jpbtD.js.map} +1 -1
  114. package/dashboard/dist/assets/{ConfirmDeleteModal-BJdLN6No.js → ConfirmDeleteModal-CeEDt9iJ.js} +2 -2
  115. package/dashboard/dist/assets/{ConfirmDeleteModal-BJdLN6No.js.map → ConfirmDeleteModal-CeEDt9iJ.js.map} +1 -1
  116. package/dashboard/dist/assets/{CountdownTimer-D9B-BjQ7.js → CountdownTimer-CSqyZMCG.js} +2 -2
  117. package/dashboard/dist/assets/{CountdownTimer-D9B-BjQ7.js.map → CountdownTimer-CSqyZMCG.js.map} +1 -1
  118. package/dashboard/dist/assets/{CredentialsPage-hniUAFBK.js → CredentialsPage-Dx7SxA23.js} +2 -2
  119. package/dashboard/dist/assets/{CredentialsPage-hniUAFBK.js.map → CredentialsPage-Dx7SxA23.js.map} +1 -1
  120. package/dashboard/dist/assets/{CronLabel-v9DCD2FX.js → CronLabel-LYPxpvNN.js} +2 -2
  121. package/dashboard/dist/assets/{CronLabel-v9DCD2FX.js.map → CronLabel-LYPxpvNN.js.map} +1 -1
  122. package/dashboard/dist/assets/DataTable-spX1dFyb.js +2 -0
  123. package/dashboard/dist/assets/DataTable-spX1dFyb.js.map +1 -0
  124. package/dashboard/dist/assets/{DropZone-XlcY8hEH.js → DropZone-f1o-GLM8.js} +2 -2
  125. package/dashboard/dist/assets/{DropZone-XlcY8hEH.js.map → DropZone-f1o-GLM8.js.map} +1 -1
  126. package/dashboard/dist/assets/{ElapsedCell-_xvVTK8N.js → ElapsedCell-BZJTSm9N.js} +2 -2
  127. package/dashboard/dist/assets/{ElapsedCell-_xvVTK8N.js.map → ElapsedCell-BZJTSm9N.js.map} +1 -1
  128. package/dashboard/dist/assets/EntityTimelinePanel-0wIIW2en.js +2 -0
  129. package/dashboard/dist/assets/{EntityTimelinePanel-1lT3jkCM.js.map → EntityTimelinePanel-0wIIW2en.js.map} +1 -1
  130. package/dashboard/dist/assets/{EscalationListSchemaPage-BeQUTUEO.js → EscalationListSchemaPage-CoYvtMzj.js} +3 -3
  131. package/dashboard/dist/assets/{EscalationListSchemaPage-BeQUTUEO.js.map → EscalationListSchemaPage-CoYvtMzj.js.map} +1 -1
  132. package/dashboard/dist/assets/EscalationListView-DWFHPufv.js +2 -0
  133. package/dashboard/dist/assets/EscalationListView-DWFHPufv.js.map +1 -0
  134. package/dashboard/dist/assets/{EscalationSchemaPage-D4VlEwyS.js → EscalationSchemaPage-C9Xu_A25.js} +3 -3
  135. package/dashboard/dist/assets/{EscalationSchemaPage-D4VlEwyS.js.map → EscalationSchemaPage-C9Xu_A25.js.map} +1 -1
  136. package/dashboard/dist/assets/EscalationTimeline-D8W2LNNk.js +2 -0
  137. package/dashboard/dist/assets/EscalationTimeline-D8W2LNNk.js.map +1 -0
  138. package/dashboard/dist/assets/EscalationTitleSelect-DLK8NWMp.js +2 -0
  139. package/dashboard/dist/assets/EscalationTitleSelect-DLK8NWMp.js.map +1 -0
  140. package/dashboard/dist/assets/{EscalationsOverview-Bx6Zrzm-.js → EscalationsOverview-CW57FaP9.js} +2 -2
  141. package/dashboard/dist/assets/{EscalationsOverview-Bx6Zrzm-.js.map → EscalationsOverview-CW57FaP9.js.map} +1 -1
  142. package/dashboard/dist/assets/{EventTable-KEC3YWBf.js → EventTable-D1ctWhKf.js} +2 -2
  143. package/dashboard/dist/assets/{EventTable-KEC3YWBf.js.map → EventTable-D1ctWhKf.js.map} +1 -1
  144. package/dashboard/dist/assets/{FilterBar-xwN_b5fj.js → FilterBar-C-iur-Nj.js} +2 -2
  145. package/dashboard/dist/assets/{FilterBar-xwN_b5fj.js.map → FilterBar-C-iur-Nj.js.map} +1 -1
  146. package/dashboard/dist/assets/GraphInvokePage-CcA_44M4.js +2 -0
  147. package/dashboard/dist/assets/{GraphInvokePage-DV7Y0fe2.js.map → GraphInvokePage-CcA_44M4.js.map} +1 -1
  148. package/dashboard/dist/assets/HomePage-Dc085ghJ.js +2 -0
  149. package/dashboard/dist/assets/{HomePage-G785SWcW.js.map → HomePage-Dc085ghJ.js.map} +1 -1
  150. package/dashboard/dist/assets/ListToolbar-h_ziBt4O.js +2 -0
  151. package/dashboard/dist/assets/{ListToolbar-zPVYPg3W.js.map → ListToolbar-h_ziBt4O.js.map} +1 -1
  152. package/dashboard/dist/assets/{McpOverview-CMGUq8hx.js → McpOverview-qXXhbNWV.js} +2 -2
  153. package/dashboard/dist/assets/{McpOverview-CMGUq8hx.js.map → McpOverview-qXXhbNWV.js.map} +1 -1
  154. package/dashboard/dist/assets/{McpQueryDetailPage-CdhLhaKn.js → McpQueryDetailPage-SEzSbZrd.js} +2 -2
  155. package/dashboard/dist/assets/{McpQueryDetailPage-CdhLhaKn.js.map → McpQueryDetailPage-SEzSbZrd.js.map} +1 -1
  156. package/dashboard/dist/assets/McpQueryPage-Cy0V0kv9.js +2 -0
  157. package/dashboard/dist/assets/{McpQueryPage-CNSNMagY.js.map → McpQueryPage-Cy0V0kv9.js.map} +1 -1
  158. package/dashboard/dist/assets/{McpRunDetailPage-DBm8hUaW.js → McpRunDetailPage-DjJO5vSb.js} +2 -2
  159. package/dashboard/dist/assets/{McpRunDetailPage-DBm8hUaW.js.map → McpRunDetailPage-DjJO5vSb.js.map} +1 -1
  160. package/dashboard/dist/assets/McpRunsPage-BfjiJ8mM.js +2 -0
  161. package/dashboard/dist/assets/{McpRunsPage-B6rb5QBf.js.map → McpRunsPage-BfjiJ8mM.js.map} +1 -1
  162. package/dashboard/dist/assets/{NamespacePill-Bb3revqD.js → NamespacePill-DADRJOUl.js} +2 -2
  163. package/dashboard/dist/assets/{NamespacePill-Bb3revqD.js.map → NamespacePill-DADRJOUl.js.map} +1 -1
  164. package/dashboard/dist/assets/OperationsPage-dJcER0T_.js +3 -0
  165. package/dashboard/dist/assets/OperationsPage-dJcER0T_.js.map +1 -0
  166. package/dashboard/dist/assets/OperatorDashboard-zCkW4eqk.js +2 -0
  167. package/dashboard/dist/assets/{OperatorDashboard-DBOscDnf.js.map → OperatorDashboard-zCkW4eqk.js.map} +1 -1
  168. package/dashboard/dist/assets/{PageHeader-Di5Sz3an.js → PageHeader-Csq434-v.js} +2 -2
  169. package/dashboard/dist/assets/{PageHeader-Di5Sz3an.js.map → PageHeader-Csq434-v.js.map} +1 -1
  170. package/dashboard/dist/assets/{PageHeaderWithStats-DutKJ-h2.js → PageHeaderWithStats-CSnk1p5A.js} +2 -2
  171. package/dashboard/dist/assets/{PageHeaderWithStats-DutKJ-h2.js.map → PageHeaderWithStats-CSnk1p5A.js.map} +1 -1
  172. package/dashboard/dist/assets/{PersonaDetailPage-BGRdGpeR.js → PersonaDetailPage-Cx6L3Jvu.js} +2 -2
  173. package/dashboard/dist/assets/{PersonaDetailPage-BGRdGpeR.js.map → PersonaDetailPage-Cx6L3Jvu.js.map} +1 -1
  174. package/dashboard/dist/assets/{PersonasPage-DRzOZcVa.js → PersonasPage-DOgGUlJl.js} +2 -2
  175. package/dashboard/dist/assets/{PersonasPage-DRzOZcVa.js.map → PersonasPage-DOgGUlJl.js.map} +1 -1
  176. package/dashboard/dist/assets/PortalPage-BKuL1BeJ.js +2 -0
  177. package/dashboard/dist/assets/PortalPage-BKuL1BeJ.js.map +1 -0
  178. package/dashboard/dist/assets/{ProcessDetailPage-BLGjZXpM.js → ProcessDetailPage-BFcFSDUv.js} +2 -2
  179. package/dashboard/dist/assets/{ProcessDetailPage-BLGjZXpM.js.map → ProcessDetailPage-BFcFSDUv.js.map} +1 -1
  180. package/dashboard/dist/assets/ProcessesListPage-BaHV2cXp.js +2 -0
  181. package/dashboard/dist/assets/{ProcessesListPage-5NnysKFC.js.map → ProcessesListPage-BaHV2cXp.js.map} +1 -1
  182. package/dashboard/dist/assets/ResolverForm-Bgc0Zrya.js +7 -0
  183. package/dashboard/dist/assets/ResolverForm-Bgc0Zrya.js.map +1 -0
  184. package/dashboard/dist/assets/RoleDetailPage-BPY6i3CU.js +8 -0
  185. package/dashboard/dist/assets/RoleDetailPage-BPY6i3CU.js.map +1 -0
  186. package/dashboard/dist/assets/{RolePill-DhnVPK4q.js → RolePill-BafrASDX.js} +2 -2
  187. package/dashboard/dist/assets/{RolePill-DhnVPK4q.js.map → RolePill-BafrASDX.js.map} +1 -1
  188. package/dashboard/dist/assets/{RolesPage-BmW1LzkU.js → RolesPage-DSqqKPbv.js} +2 -2
  189. package/dashboard/dist/assets/{RolesPage-BmW1LzkU.js.map → RolesPage-DSqqKPbv.js.map} +1 -1
  190. package/dashboard/dist/assets/RunAsSelector-B29iWwel.js +2 -0
  191. package/dashboard/dist/assets/{RunAsSelector-BwZTJ4Yj.js.map → RunAsSelector-B29iWwel.js.map} +1 -1
  192. package/dashboard/dist/assets/ScanCodesPage-S8aAJfnC.js +2 -0
  193. package/dashboard/dist/assets/{ScanCodesPage-FiYIYB-m.js.map → ScanCodesPage-S8aAJfnC.js.map} +1 -1
  194. package/dashboard/dist/assets/{ScanSchemeDetailPage-BiAqtD-a.js → ScanSchemeDetailPage-CUBRAtmJ.js} +2 -2
  195. package/dashboard/dist/assets/{ScanSchemeDetailPage-BiAqtD-a.js.map → ScanSchemeDetailPage-CUBRAtmJ.js.map} +1 -1
  196. package/dashboard/dist/assets/ScanStationPage-R9t1-CeQ.js +2 -0
  197. package/dashboard/dist/assets/{ScanStationPage-8CdOtbCD.js.map → ScanStationPage-R9t1-CeQ.js.map} +1 -1
  198. package/dashboard/dist/assets/{ScopeBadge-CXUg0FHo.js → ScopeBadge-b6MIBiYD.js} +2 -2
  199. package/dashboard/dist/assets/{ScopeBadge-CXUg0FHo.js.map → ScopeBadge-b6MIBiYD.js.map} +1 -1
  200. package/dashboard/dist/assets/{StickyPagination-DRuqKhZt.js → StickyPagination-CkW_A507.js} +2 -2
  201. package/dashboard/dist/assets/{StickyPagination-DRuqKhZt.js.map → StickyPagination-CkW_A507.js.map} +1 -1
  202. package/dashboard/dist/assets/{StreamMessageDetail-JwlbRiMn.js → StreamMessageDetail-yzWX0wac.js} +2 -2
  203. package/dashboard/dist/assets/{StreamMessageDetail-JwlbRiMn.js.map → StreamMessageDetail-yzWX0wac.js.map} +1 -1
  204. package/dashboard/dist/assets/{SwimlaneTimeline-hu3c4bCJ.js → SwimlaneTimeline-Cf4DXFxj.js} +2 -2
  205. package/dashboard/dist/assets/{SwimlaneTimeline-hu3c4bCJ.js.map → SwimlaneTimeline-Cf4DXFxj.js.map} +1 -1
  206. package/dashboard/dist/assets/{TagInput-BZ8vb2oW.js → TagInput-ZrIIrEUP.js} +2 -2
  207. package/dashboard/dist/assets/{TagInput-BZ8vb2oW.js.map → TagInput-ZrIIrEUP.js.map} +1 -1
  208. package/dashboard/dist/assets/{TaskDetailPage-NqVZF3jW.js → TaskDetailPage-DCDcEps9.js} +2 -2
  209. package/dashboard/dist/assets/{TaskDetailPage-NqVZF3jW.js.map → TaskDetailPage-DCDcEps9.js.map} +1 -1
  210. package/dashboard/dist/assets/{TaskQueuePill-Bxir8WRl.js → TaskQueuePill-DkQ1uc6y.js} +2 -2
  211. package/dashboard/dist/assets/{TaskQueuePill-Bxir8WRl.js.map → TaskQueuePill-DkQ1uc6y.js.map} +1 -1
  212. package/dashboard/dist/assets/TasksListPage-BBATgpf7.js +2 -0
  213. package/dashboard/dist/assets/{TasksListPage-BQNaSzCn.js.map → TasksListPage-BBATgpf7.js.map} +1 -1
  214. package/dashboard/dist/assets/{TimeAgo-Cv35DOiI.js → TimeAgo-CSNVEjch.js} +2 -2
  215. package/dashboard/dist/assets/{TimeAgo-Cv35DOiI.js.map → TimeAgo-CSNVEjch.js.map} +1 -1
  216. package/dashboard/dist/assets/{TimestampCell-DHUXey9s.js → TimestampCell-Du1nBrPn.js} +2 -2
  217. package/dashboard/dist/assets/{TimestampCell-DHUXey9s.js.map → TimestampCell-Du1nBrPn.js.map} +1 -1
  218. package/dashboard/dist/assets/{ToolPill-FkgTXIhq.js → ToolPill-Baxm02L6.js} +2 -2
  219. package/dashboard/dist/assets/{ToolPill-FkgTXIhq.js.map → ToolPill-Baxm02L6.js.map} +1 -1
  220. package/dashboard/dist/assets/ToolTestPanel-CF-h_5Rg.js +2 -0
  221. package/dashboard/dist/assets/{ToolTestPanel-DvuLFWqQ.js.map → ToolTestPanel-CF-h_5Rg.js.map} +1 -1
  222. package/dashboard/dist/assets/{TopicDetailPage-TXX3QNSo.js → TopicDetailPage-Dr1UmWcp.js} +3 -3
  223. package/dashboard/dist/assets/{TopicDetailPage-TXX3QNSo.js.map → TopicDetailPage-Dr1UmWcp.js.map} +1 -1
  224. package/dashboard/dist/assets/TopicsPage-CUUo-Ylf.js +2 -0
  225. package/dashboard/dist/assets/{TopicsPage-h-oyTeEJ.js.map → TopicsPage-CUUo-Ylf.js.map} +1 -1
  226. package/dashboard/dist/assets/{UserName-BceRCeDF.js → UserName-kBh1dc39.js} +2 -2
  227. package/dashboard/dist/assets/{UserName-BceRCeDF.js.map → UserName-kBh1dc39.js.map} +1 -1
  228. package/dashboard/dist/assets/{WorkflowExecutionPage-CmHGcaN9.js → WorkflowExecutionPage-CCRSbnDx.js} +2 -2
  229. package/dashboard/dist/assets/{WorkflowExecutionPage-CmHGcaN9.js.map → WorkflowExecutionPage-CCRSbnDx.js.map} +1 -1
  230. package/dashboard/dist/assets/{WorkflowPill--AYMW7u_.js → WorkflowPill-ZepbO_ny.js} +2 -2
  231. package/dashboard/dist/assets/{WorkflowPill--AYMW7u_.js.map → WorkflowPill-ZepbO_ny.js.map} +1 -1
  232. package/dashboard/dist/assets/WorkflowsDashboard-BNQVvyek.js +2 -0
  233. package/dashboard/dist/assets/{WorkflowsDashboard-B0r2lQXk.js.map → WorkflowsDashboard-BNQVvyek.js.map} +1 -1
  234. package/dashboard/dist/assets/{WorkflowsOverview-BTMc2PJ_.js → WorkflowsOverview-DswubNJN.js} +2 -2
  235. package/dashboard/dist/assets/{WorkflowsOverview-BTMc2PJ_.js.map → WorkflowsOverview-DswubNJN.js.map} +1 -1
  236. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DUiCVnZp.js → YamlWorkflowDetailPage-Cw9Dlmup.js} +11 -11
  237. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DUiCVnZp.js.map → YamlWorkflowDetailPage-Cw9Dlmup.js.map} +1 -1
  238. package/dashboard/dist/assets/{YamlWorkflowsPage-BAuXfwi0.js → YamlWorkflowsPage-DB8xnIXy.js} +2 -2
  239. package/dashboard/dist/assets/{YamlWorkflowsPage-BAuXfwi0.js.map → YamlWorkflowsPage-DB8xnIXy.js.map} +1 -1
  240. package/dashboard/dist/assets/{agents-BvmLCk4h.js → agents-BwEnf6N9.js} +2 -2
  241. package/dashboard/dist/assets/{agents-BvmLCk4h.js.map → agents-BwEnf6N9.js.map} +1 -1
  242. package/dashboard/dist/assets/{bots-f_tyhl4I.js → bots-CCmJTT2u.js} +2 -2
  243. package/dashboard/dist/assets/{bots-f_tyhl4I.js.map → bots-CCmJTT2u.js.map} +1 -1
  244. package/dashboard/dist/assets/{capabilities-DNo5bqLx.js → capabilities-BZHgp_nh.js} +2 -2
  245. package/dashboard/dist/assets/{capabilities-DNo5bqLx.js.map → capabilities-BZHgp_nh.js.map} +1 -1
  246. package/dashboard/dist/assets/{constants-BHkpVaqx.js → constants-CeBBTzf5.js} +2 -2
  247. package/dashboard/dist/assets/{constants-BHkpVaqx.js.map → constants-CeBBTzf5.js.map} +1 -1
  248. package/dashboard/dist/assets/{controlplane-Dyyj2Irb.js → controlplane-CyfwUlFA.js} +2 -2
  249. package/dashboard/dist/assets/{controlplane-Dyyj2Irb.js.map → controlplane-CyfwUlFA.js.map} +1 -1
  250. package/dashboard/dist/assets/escalation-columns-BJPTNmLW.js +2 -0
  251. package/dashboard/dist/assets/escalation-columns-BJPTNmLW.js.map +1 -0
  252. package/dashboard/dist/assets/index-3gbd5neL.js +67 -0
  253. package/dashboard/dist/assets/index-3gbd5neL.js.map +1 -0
  254. package/dashboard/dist/assets/index-BAAVTyZ-.js +2 -0
  255. package/dashboard/dist/assets/{index-DL83W7Gu.js.map → index-BAAVTyZ-.js.map} +1 -1
  256. package/dashboard/dist/assets/{index-CsKiRyhy.js → index-BC6Jenlo.js} +2 -2
  257. package/dashboard/dist/assets/{index-CsKiRyhy.js.map → index-BC6Jenlo.js.map} +1 -1
  258. package/dashboard/dist/assets/index-C7KHqOTQ.js +2 -0
  259. package/dashboard/dist/assets/{index-D7ESqn22.js.map → index-C7KHqOTQ.js.map} +1 -1
  260. package/dashboard/dist/assets/index-CDrqqbSR.js +3 -0
  261. package/dashboard/dist/assets/index-CDrqqbSR.js.map +1 -0
  262. package/dashboard/dist/assets/index-CVwzCZ43.js +2 -0
  263. package/dashboard/dist/assets/{index-DvxxrFBo.js.map → index-CVwzCZ43.js.map} +1 -1
  264. package/dashboard/dist/assets/index-CaGF6TCC.js +2 -0
  265. package/dashboard/dist/assets/index-CaGF6TCC.js.map +1 -0
  266. package/dashboard/dist/assets/index-ClVbfe4z.js +13 -0
  267. package/dashboard/dist/assets/index-ClVbfe4z.js.map +1 -0
  268. package/dashboard/dist/assets/{index-DWse7ERF.js → index-CuVkSmj5.js} +2 -2
  269. package/dashboard/dist/assets/{index-DWse7ERF.js.map → index-CuVkSmj5.js.map} +1 -1
  270. package/dashboard/dist/assets/{index-PcyGjmBm.js → index-DAuX_PlL.js} +2 -2
  271. package/dashboard/dist/assets/{index-PcyGjmBm.js.map → index-DAuX_PlL.js.map} +1 -1
  272. package/dashboard/dist/assets/{index-e2X-s0EQ.js → index-DBWS5QL8.js} +2 -2
  273. package/dashboard/dist/assets/{index-e2X-s0EQ.js.map → index-DBWS5QL8.js.map} +1 -1
  274. package/dashboard/dist/assets/index-DIWCI6HC.js +2 -0
  275. package/dashboard/dist/assets/{index-BNZknxFY.js.map → index-DIWCI6HC.js.map} +1 -1
  276. package/dashboard/dist/assets/{index-C-Xr2V3F.js → index-DZ8X_Gp4.js} +2 -2
  277. package/dashboard/dist/assets/{index-C-Xr2V3F.js.map → index-DZ8X_Gp4.js.map} +1 -1
  278. package/dashboard/dist/assets/index-Dh8MJl3L.css +1 -0
  279. package/dashboard/dist/assets/{knowledge-Coo6CKzo.js → knowledge-CqyLhUMg.js} +2 -2
  280. package/dashboard/dist/assets/{knowledge-Coo6CKzo.js.map → knowledge-CqyLhUMg.js.map} +1 -1
  281. package/dashboard/dist/assets/{mcp-Cz5eFnP_.js → mcp-Cvu6bFYH.js} +2 -2
  282. package/dashboard/dist/assets/{mcp-Cz5eFnP_.js.map → mcp-Cvu6bFYH.js.map} +1 -1
  283. package/dashboard/dist/assets/{mcp-query-BtnuO4LF.js → mcp-query-qC6A3e9l.js} +2 -2
  284. package/dashboard/dist/assets/{mcp-query-BtnuO4LF.js.map → mcp-query-qC6A3e9l.js.map} +1 -1
  285. package/dashboard/dist/assets/metadata-display-COo3mMCr.js +2 -0
  286. package/dashboard/dist/assets/metadata-display-COo3mMCr.js.map +1 -0
  287. package/dashboard/dist/assets/{personas-C2-LgpHQ.js → personas-BKN_lJuV.js} +2 -2
  288. package/dashboard/dist/assets/{personas-C2-LgpHQ.js.map → personas-BKN_lJuV.js.map} +1 -1
  289. package/dashboard/dist/assets/{pipelines-TuXQvUA-.js → pipelines-BldIfv85.js} +2 -2
  290. package/dashboard/dist/assets/{pipelines-TuXQvUA-.js.map → pipelines-BldIfv85.js.map} +1 -1
  291. package/dashboard/dist/assets/{tasks-OUzpu__z.js → tasks-B-Uay8uL.js} +2 -2
  292. package/dashboard/dist/assets/{tasks-OUzpu__z.js.map → tasks-B-Uay8uL.js.map} +1 -1
  293. package/dashboard/dist/assets/{topics-B8bdrBaW.js → topics-438EQogt.js} +2 -2
  294. package/dashboard/dist/assets/{topics-B8bdrBaW.js.map → topics-438EQogt.js.map} +1 -1
  295. package/dashboard/dist/assets/useContainerWidth-DSLp1gEm.js +2 -0
  296. package/dashboard/dist/assets/useContainerWidth-DSLp1gEm.js.map +1 -0
  297. package/dashboard/dist/assets/{useDebouncedValue-Cp5ZOtVE.js → useDebouncedValue-Cw8hYZ8y.js} +2 -2
  298. package/dashboard/dist/assets/{useDebouncedValue-Cp5ZOtVE.js.map → useDebouncedValue-Cw8hYZ8y.js.map} +1 -1
  299. package/dashboard/dist/assets/{useNamespace-DtQe3wZ5.js → useNamespace-D1218GQ8.js} +2 -2
  300. package/dashboard/dist/assets/{useNamespace-DtQe3wZ5.js.map → useNamespace-D1218GQ8.js.map} +1 -1
  301. package/dashboard/dist/assets/{useYamlActivityEvents-CS22c15X.js → useYamlActivityEvents-BAQf_y_U.js} +2 -2
  302. package/dashboard/dist/assets/{useYamlActivityEvents-CS22c15X.js.map → useYamlActivityEvents-BAQf_y_U.js.map} +1 -1
  303. package/dashboard/dist/assets/{vendor-icons-DeBdvyKJ.js → vendor-icons-B7OcUM6b.js} +2 -2
  304. package/dashboard/dist/assets/{vendor-icons-DeBdvyKJ.js.map → vendor-icons-B7OcUM6b.js.map} +1 -1
  305. package/dashboard/dist/assets/{yaml-workflows-HQIki3hI.js → yaml-workflows-CN01gEB0.js} +2 -2
  306. package/dashboard/dist/assets/{yaml-workflows-HQIki3hI.js.map → yaml-workflows-CN01gEB0.js.map} +1 -1
  307. package/dashboard/dist/index.html +3 -3
  308. package/docs/accumulator.md +113 -0
  309. package/docs/api/http/escalations.md +89 -0
  310. package/docs/api/http/roles.md +1 -0
  311. package/docs/api/http/workflows.md +28 -1
  312. package/docs/api/mcp/admin.md +40 -4
  313. package/docs/api/sdk/escalations.md +91 -0
  314. package/docs/api/sdk/roles.md +2 -0
  315. package/docs/architecture.md +1 -1
  316. package/docs/code-owned-configuration.md +3 -2
  317. package/docs/dashboard.md +11 -5
  318. package/docs/hitl/design.md +1 -1
  319. package/docs/hitl/escalation.md +37 -1
  320. package/docs/hitl/form.md +12 -7
  321. package/docs/hitl/invoke-form.md +10 -3
  322. package/docs/hitl/lookups.md +21 -0
  323. package/docs/hitl/pinned-views.md +4 -0
  324. package/docs/hitl/portal.md +97 -0
  325. package/docs/hitl/resolution.md +41 -0
  326. package/docs/hitl/x-lt-embed.md +1 -1
  327. package/docs/hitl/x-lt-invoke.md +95 -0
  328. package/docs/hitl/x-lt-list-schema.md +3 -1
  329. package/docs/hitl/x-lt-validation.md +50 -3
  330. package/docs/hitl/x-lt-widget.md +22 -0
  331. package/docs/hitl-guide.md +12 -2
  332. package/docs/scan-codes.md +15 -2
  333. package/docs/sdk.md +1 -1
  334. package/docs/workflows.md +2 -2
  335. package/package.json +4 -2
  336. package/dashboard/dist/assets/AgentsPage-D77JeViQ.js +0 -2
  337. package/dashboard/dist/assets/AvailableEscalationsPage-CqM_MOMy.js +0 -2
  338. package/dashboard/dist/assets/AvailableEscalationsPage-CqM_MOMy.js.map +0 -1
  339. package/dashboard/dist/assets/BulkAssignModal-BXiJnlqt.js +0 -2
  340. package/dashboard/dist/assets/CapabilitiesPage-D9TC2iKy.js +0 -2
  341. package/dashboard/dist/assets/DataTable-7C7riavf.js +0 -2
  342. package/dashboard/dist/assets/DataTable-7C7riavf.js.map +0 -1
  343. package/dashboard/dist/assets/EntityTimelinePanel-1lT3jkCM.js +0 -2
  344. package/dashboard/dist/assets/EscalationListView-uuZRMSLB.js +0 -2
  345. package/dashboard/dist/assets/EscalationListView-uuZRMSLB.js.map +0 -1
  346. package/dashboard/dist/assets/GraphInvokePage-DV7Y0fe2.js +0 -2
  347. package/dashboard/dist/assets/HomePage-G785SWcW.js +0 -2
  348. package/dashboard/dist/assets/ListToolbar-zPVYPg3W.js +0 -2
  349. package/dashboard/dist/assets/McpQueryPage-CNSNMagY.js +0 -2
  350. package/dashboard/dist/assets/McpRunsPage-B6rb5QBf.js +0 -2
  351. package/dashboard/dist/assets/OperationsPage-Dxk1fAMg.js +0 -3
  352. package/dashboard/dist/assets/OperationsPage-Dxk1fAMg.js.map +0 -1
  353. package/dashboard/dist/assets/OperatorDashboard-DBOscDnf.js +0 -2
  354. package/dashboard/dist/assets/ProcessesListPage-5NnysKFC.js +0 -2
  355. package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js +0 -2
  356. package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js.map +0 -1
  357. package/dashboard/dist/assets/RoleDetailPage-C_LIoe1j.js +0 -8
  358. package/dashboard/dist/assets/RoleDetailPage-C_LIoe1j.js.map +0 -1
  359. package/dashboard/dist/assets/RunAsSelector-BwZTJ4Yj.js +0 -2
  360. package/dashboard/dist/assets/ScanCodesPage-FiYIYB-m.js +0 -2
  361. package/dashboard/dist/assets/ScanStationPage-8CdOtbCD.js +0 -2
  362. package/dashboard/dist/assets/TasksListPage-BQNaSzCn.js +0 -2
  363. package/dashboard/dist/assets/ToolTestPanel-DvuLFWqQ.js +0 -2
  364. package/dashboard/dist/assets/TopicsPage-h-oyTeEJ.js +0 -2
  365. package/dashboard/dist/assets/WorkflowsDashboard-B0r2lQXk.js +0 -2
  366. package/dashboard/dist/assets/escalation-columns-DIigeTOK.js +0 -2
  367. package/dashboard/dist/assets/escalation-columns-DIigeTOK.js.map +0 -1
  368. package/dashboard/dist/assets/index-BMlQYOE1.js +0 -67
  369. package/dashboard/dist/assets/index-BMlQYOE1.js.map +0 -1
  370. package/dashboard/dist/assets/index-BNZknxFY.js +0 -2
  371. package/dashboard/dist/assets/index-Bpvfr4OW.css +0 -1
  372. package/dashboard/dist/assets/index-CegPUKpc.js +0 -3
  373. package/dashboard/dist/assets/index-CegPUKpc.js.map +0 -1
  374. package/dashboard/dist/assets/index-D7ESqn22.js +0 -2
  375. package/dashboard/dist/assets/index-DL83W7Gu.js +0 -2
  376. package/dashboard/dist/assets/index-DPLssnMW.js +0 -6
  377. package/dashboard/dist/assets/index-DPLssnMW.js.map +0 -1
  378. package/dashboard/dist/assets/index-DoETPlJP.js +0 -11
  379. package/dashboard/dist/assets/index-DoETPlJP.js.map +0 -1
  380. package/dashboard/dist/assets/index-DvxxrFBo.js +0 -2
  381. package/dashboard/dist/assets/metadata-display--TzK0REC.js +0 -2
  382. package/dashboard/dist/assets/metadata-display--TzK0REC.js.map +0 -1
  383. package/dashboard/dist/assets/resolver-payload-C1dXB3n6.js +0 -2
  384. package/dashboard/dist/assets/resolver-payload-C1dXB3n6.js.map +0 -1
  385. package/dashboard/dist/assets/seed-form-json-DvPsISxD.js +0 -2
  386. package/dashboard/dist/assets/seed-form-json-DvPsISxD.js.map +0 -1
  387. package/docs/compilation.md +0 -152
  388. package/docs/compiler.md +0 -311
  389. package/docs/contributing.md +0 -56
  390. package/docs/design-principles.md +0 -244
  391. package/docs/schema-exchange.md +0 -173
  392. package/docs/self-test.md +0 -106
  393. package/docs/story.md +0 -184
@@ -1,2 +0,0 @@
1
- import{a as v,j as n}from"./vendor-query-DvWWuNIB.js";import{al as At,aa as Et,bv as _t,bj as Ot,aE as K,bw as $t,a4 as Ct}from"./vendor-icons-DeBdvyKJ.js";import{g as et,H as Tt,c as Y,r as nt,s as Ft}from"./EscalationListView-uuZRMSLB.js";import{ad as lt,ai as Dt,a9 as st,a0 as Mt,a5 as It,s as Wt}from"./index-BMlQYOE1.js";import{L as gt}from"./vendor-react-_9U4mKFr.js";import{S as Lt}from"./StatusBadge-DHVwxre2.js";function U(t,e){const r=e==null?void 0:e.title;if(typeof r=="string"&&r.trim().length>0)return r.trim();const s=t.split(/[_-]+/).filter(Boolean);return s.length<=1?t:s.map(i=>Rt(i)?i:i.charAt(0).toUpperCase()+i.slice(1)).join(" ")}function Rt(t){return t.length>1&&t===t.toUpperCase()&&/[A-Z]/.test(t)}const Pt=/\{\{\s*([^{}]+?)\s*\}\}/g;function S(t){return typeof t=="string"&&/\{\{[^{}]+\}\}/.test(t)}function rt(t,e){if(!e)return;const r=t.indexOf("."),s=e[r===-1?t:t.slice(0,r)];if(r===-1)return s;if(!(s===null||typeof s!="object"))return et(s,t.slice(r+1))}function bt(t,e){let r=!1;const s=t.replace(Pt,(i,o)=>{const l=rt(o,e);return typeof l=="string"&&l.trim().length>0?l:typeof l=="number"&&Number.isFinite(l)?String(l):(r=!0,"")});return r?null:s}const qt="x-lt-options";function ct(t){return typeof t=="string"||typeof t=="number"&&Number.isFinite(t)}function Ut(t){if(ct(t))return{value:t,label:String(t)};if(t&&typeof t=="object"&&!Array.isArray(t)){const e=t,r=e.value!==void 0?e.value:e.id;if(ct(r)&&typeof e.label=="string"&&e.label.length>0)return{value:r,label:e.label}}return null}function mt(t,e){if(!t)return;const r=t.enum;if(Array.isArray(r)&&r.length>0)return r.map(l=>({value:l,label:String(l)}));const s=t[qt],i=(typeof s=="string"?[s]:Array.isArray(s)?s:[]).filter(l=>typeof l=="string"&&l.length>0);if(i.length===0)return;const o=i.some(S)?[]:void 0;for(const l of i){let c=l;if(S(l)){const a=bt(l,e);if(a===null)continue;c=a}const d=rt(c,e);if(!Array.isArray(d))continue;const u=d.map(Ut).filter(a=>a!==null);if(u.length>0)return u}return o}function it(t,e){const r=(typeof t=="string"?[t]:Array.isArray(t)?t:[]).filter(s=>typeof s=="string"&&s.length>0);if(r.length===0||!e)return[];for(const s of r){let i=s;if(S(s)){const l=bt(s,e);if(l===null)continue;i=l}const o=rt(i,e);if(Array.isArray(o)&&o.length>0)return o}return[]}const Ht="x-lt-default-checked";function Jt(t,e,r){if((t==null?void 0:t["x-lt-widget"])!=="checklist"||t[Ht]!==!0||e&&typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length>0)return null;const s=it(t["x-lt-source"],r);return s.length===0?null:Object.fromEntries(s.map(i=>[i.id,!0]))}function Xt(t,e,r){if((e==null?void 0:e["x-lt-widget"])!=="checklist"||e["x-lt-require-all"]!==!0)return;const i=it(e["x-lt-source"],r).filter(c=>c.required!==!1);if(i.length===0)return;const o=typeof t=="object"&&t!==null&&!Array.isArray(t)?t:{},l=i.filter(c=>!o[c.id]).length;if(l!==0)return`${l} of ${i.length} checks incomplete`}function Yt(t,e){const r=e==null?void 0:e.type;if(typeof r=="string"&&!(t==null||t===""))switch(r){case"string":return typeof t=="string"?void 0:"Expected text";case"number":return typeof t=="number"&&Number.isFinite(t)?void 0:"Expected a number";case"integer":return typeof t=="number"&&Number.isInteger(t)?void 0:"Expected a whole number";case"boolean":return typeof t=="boolean"?void 0:"Expected true or false";case"array":return Array.isArray(t)?void 0:"Expected a list";case"object":return typeof t=="object"&&!Array.isArray(t)?void 0:"Expected an object";default:return}}function zt(t,e,r){if(!e)return;const s=mt(e,r);if(s!==void 0&&t!==void 0&&t!==null&&t!==""){if(s.length===0)return"No valid options for this selection";if(!s.some(i=>i.value===t))return`Must be one of: ${s.map(i=>String(i.value)).join(", ")}`}if(typeof t=="string"){const i=t.trim();if(i==="")return;const o=X(e.minLength,e["x-lt-min-length"],r);if(o!==void 0&&i.length<o)return`Minimum ${o} character${o===1?"":"s"}`;const l=X(e.maxLength,e["x-lt-max-length"],r);if(l!==void 0&&i.length>l)return`Maximum ${l} characters (${i.length} entered)`;const c=e.pattern;if(c)try{if(!new RegExp(c).test(i))return e["x-lt-pattern-error"]??"Invalid format"}catch{}const d=e.format;if(d==="email"&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(i))return"Enter a valid email address";if(d==="uri"&&!/^https?:\/\/.+/.test(i))return"Enter a valid URL"}if(typeof t=="number"){const i=X(e.minimum,e["x-lt-minimum"],r),o=X(e.exclusiveMinimum,void 0,r),l=X(e.maximum,e["x-lt-maximum"],r),c=X(e.exclusiveMaximum,void 0,r);if(i!==void 0&&t<i)return`Minimum value is ${i}`;if(o!==void 0&&t<=o)return`Must be greater than ${o}`;if(l!==void 0&&t>l)return`Maximum value is ${l}`;if(c!==void 0&&t>=c)return`Must be less than ${c}`}}function X(t,e,r){if(typeof t=="number")return t;if(typeof e=="string"&&r){const s=e.indexOf(".");if(s!==-1){const i=e.slice(0,s),o=e.slice(s+1),l=r[i];if(l&&typeof l=="object"){const c=o.split(".");let d=l;for(const u of c)if(d=d[u],d===void 0)break;if(typeof d=="number")return d;if(typeof d=="string"){const u=Number(d);if(!Number.isNaN(u))return u}}}}}function Gt(t,e,r,s,i){if(!s)return;if(r){if(t==null||typeof t=="boolean"&&!t||typeof t=="string"&&t.trim()==="")return"Required";if(typeof t=="object"&&!Array.isArray(t)&&t!==null){const c=Object.values(t);if(c.length===0||c.every(d=>!d))return"Required"}}const o=Yt(t,e);if(o)return o;const l=Xt(t,e,i);return l||zt(t,e,i)}function dt(t){return t!=null&&t!==""&&t!==!1&&t!==0}function Qt(t){return t==null?"":typeof t=="object"?JSON.stringify(t):String(t)}function xt(t,e){const r=t.indexOf("."),s=r===-1?t:t.slice(0,r);if(!Tt.includes(s))return{known:!1,value:void 0};const i=e[s];if(r===-1)return{known:!0,value:i};try{return{known:!0,value:et(i,t.slice(r+1))}}catch{return{known:!0,value:void 0}}}function jt(t,e){if(Array.isArray(t))return t.every(d=>jt(d,e));if(typeof t!="string"||t.length===0||!e)return!0;const r=t.startsWith("!"),s=r?t.slice(1):t,i=s.indexOf("!="),o=s.indexOf("=");if(i!==-1||o!==-1&&o!==i+1){const d=i!==-1&&(o===-1||i<o),u=d?i:o,a=s.slice(0,u).trim(),g=s.slice(u+(d?2:1)).trim(),{known:x,value:y}=xt(a,e);if(!x)return!0;const w=Qt(y)===g,b=d?!w:w;return r?!b:b}const{known:l,value:c}=xt(s,e);return l?r?!dt(c):dt(c):!0}const Vt=2600;function Zt({hint:t,onLockedClick:e,children:r}){const[s,i]=v.useState(null);v.useEffect(()=>{if(!s)return;const l=setTimeout(()=>i(null),Vt);return()=>clearTimeout(l)},[s]);const o=l=>{if(e==null||e(),t){const c=Math.min(Math.max(l.clientX,96),window.innerWidth-96);i(d=>({x:c,y:l.clientY,n:((d==null?void 0:d.n)??0)+1}))}};return n.jsxs("div",{className:"pb-8 max-w-form",onClick:o,"data-testid":"locked-form-frame",children:[r,t&&s&&n.jsxs("div",{role:"status",className:"fixed z-[60] pointer-events-none flex items-center gap-2 px-3 py-1.5 rounded-md bg-surface-raised border border-surface-border shadow-lg text-xs font-medium text-text-primary whitespace-nowrap animate-[click-hint_2.6s_ease-in-out_both]",style:{left:s.x,top:s.y-12},onAnimationEnd:()=>i(null),"data-testid":"locked-form-hint",children:[n.jsx(At,{className:"w-3.5 h-3.5 text-accent shrink-0",strokeWidth:1.5}),t]},s.n)]})}function E({children:t,isRequired:e,htmlFor:r}){return n.jsxs("label",{htmlFor:r,className:"block text-2xs font-semibold uppercase tracking-wider text-text-secondary",children:[t,e&&n.jsx("span",{className:"text-status-error ml-0.5",children:"*"})]})}function W({id:t,children:e}){return n.jsx("p",{id:t,className:"text-2xs text-text-tertiary mt-0.5 leading-snug",children:e})}function H({error:t,id:e}){return t?n.jsx("p",{id:e,role:"alert",className:"text-2xs text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]",children:t}):null}function z(t){return t?"input text-sm w-full mt-1 border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]":"input text-sm w-full mt-1"}function Bt(t){return t?"select text-sm mt-1 min-w-[min(16rem,100%)] max-w-full border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]":"select text-sm mt-1 min-w-[min(16rem,100%)] max-w-full"}function Kt({fieldKey:t,value:e,onChange:r,schema:s,isRequired:i}){const o=v.useRef(null),l=(s==null?void 0:s.accept)??void 0,c=U(t,s),d=s==null?void 0:s.description,u=v.useCallback(g=>{var w;const x=(w=g.target.files)==null?void 0:w[0];if(!x)return;const y=new FileReader;y.onload=()=>{typeof y.result=="string"&&r(y.result)},y.readAsDataURL(x)},[r]),a=e.startsWith("data:");return n.jsxs("div",{children:[n.jsx(E,{isRequired:i,children:c}),d&&n.jsx("p",{className:"text-2xs text-text-tertiary mt-0.5",children:d}),n.jsxs("div",{className:"mt-1",children:[n.jsx("input",{ref:o,type:"file",accept:l,onChange:u,className:"hidden"}),n.jsx("button",{type:"button",onClick:()=>{var g;return(g=o.current)==null?void 0:g.click()},className:"btn-secondary text-xs px-3 py-1.5",children:a?"Replace file":"Choose file"}),a&&n.jsx("span",{className:"ml-2 text-xs text-status-success",children:"File attached"})]})]})}function St({fieldKey:t,value:e,onChange:r,schema:s,isRequired:i}){const o=U(t,s),l=s==null?void 0:s.description,c=(s==null?void 0:s["x-lt-language"])??"",d=v.useCallback(u=>{if(u.key==="Tab"){u.preventDefault();const a=u.currentTarget,g=a.selectionStart,x=a.selectionEnd,y=e.substring(0,g)+" "+e.substring(x);r(y),requestAnimationFrame(()=>{a.selectionStart=a.selectionEnd=g+2})}},[e,r]);return n.jsxs("div",{children:[n.jsxs(E,{isRequired:i,children:[o,c&&n.jsx("span",{className:"ml-2 text-text-tertiary/60 normal-case font-normal",children:c})]}),l&&n.jsx("p",{className:"text-2xs text-text-tertiary mt-0.5",children:l}),n.jsx("textarea",{value:e,onChange:u=>r(u.target.value),onKeyDown:d,className:"input w-full mt-1 font-mono text-xs leading-relaxed",rows:10,spellCheck:!1})]})}function te({fieldKey:t,value:e,onChange:r,schema:s,isRequired:i}){const o=v.useRef(null),[l,c]=v.useState(!1),d=U(t,s),u=s==null?void 0:s.description;v.useEffect(()=>{const b=o.current;if(!b)return;const f=b.getContext("2d");if(f&&(f.lineWidth=2,f.lineCap="round",f.strokeStyle="#1E1535",e&&e.startsWith("data:"))){const N=new Image;N.onload=()=>f.drawImage(N,0,0),N.src=e}},[]);const a=v.useCallback(b=>{const f=o.current,N=f.getBoundingClientRect(),_=N.width>0?f.width/N.width:1,p=N.height>0?f.height/N.height:1;return"touches"in b?{x:(b.touches[0].clientX-N.left)*_,y:(b.touches[0].clientY-N.top)*p}:{x:(b.clientX-N.left)*_,y:(b.clientY-N.top)*p}},[]),g=v.useCallback(b=>{var _;c(!0);const f=(_=o.current)==null?void 0:_.getContext("2d");if(!f)return;const N=a(b);f.beginPath(),f.moveTo(N.x,N.y)},[a]),x=v.useCallback(b=>{var _;if(!l)return;const f=(_=o.current)==null?void 0:_.getContext("2d");if(!f)return;const N=a(b);f.lineTo(N.x,N.y),f.stroke()},[l,a]),y=v.useCallback(()=>{c(!1);const b=o.current;b&&r(b.toDataURL("image/png"))},[r]),w=v.useCallback(()=>{const b=o.current;if(!b)return;const f=b.getContext("2d");f&&(f.clearRect(0,0,b.width,b.height),r(""))},[r]);return n.jsxs("div",{children:[n.jsx(E,{isRequired:i,children:d}),u&&n.jsx("p",{className:"text-2xs text-text-tertiary mt-0.5",children:u}),n.jsx("div",{className:"mt-1 max-w-[25rem] border border-surface-border rounded-md overflow-hidden bg-white",children:n.jsx("canvas",{ref:o,width:400,height:150,className:"w-full cursor-crosshair touch-none",onMouseDown:g,onMouseMove:x,onMouseUp:y,onMouseLeave:y,onTouchStart:g,onTouchMove:x,onTouchEnd:y})}),n.jsx("button",{type:"button",onClick:w,className:"mt-1 text-2xs text-text-tertiary hover:text-accent transition-colors",children:"Clear"})]})}function ee({fieldKey:t,value:e,onChange:r,schema:s,isRequired:i}){const o=U(t,s),l=s==null?void 0:s.description;return n.jsxs("div",{children:[n.jsx(E,{isRequired:i,children:o}),l&&n.jsx("p",{className:"text-2xs text-text-tertiary mt-0.5",children:l}),n.jsx("textarea",{value:e,onChange:c=>r(c.target.value),className:"input w-full mt-1 text-sm leading-relaxed",rows:8,placeholder:"Supports plain text. Markdown formatting is preserved."})]})}function ne({fieldKey:t,value:e,onChange:r,schema:s,isRequired:i}){const[o,l]=v.useState("write"),c=U(t,s),d=s==null?void 0:s.description;return(s==null?void 0:s.readOnly)===!0?n.jsx(lt,{content:e,className:"my-1"}):n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center justify-between",children:[n.jsx(E,{isRequired:i,children:c}),n.jsx("div",{className:"flex items-center gap-0.5",children:["write","preview"].map(a=>n.jsx("button",{type:"button",onClick:()=>l(a),className:`px-2 py-0.5 text-2xs rounded transition-colors ${o===a?"bg-accent/10 text-accent font-semibold":"text-text-quaternary hover:text-text-secondary"}`,children:a==="write"?"Write":"Preview"},a))})]}),d&&n.jsx("p",{className:"text-2xs text-text-tertiary mt-0.5",children:d}),o==="write"?n.jsx("textarea",{value:e,onChange:a=>r(a.target.value),className:"input w-full mt-1 text-sm font-mono leading-relaxed",rows:10,placeholder:"Write markdown — headings, lists, tables, code blocks, and links all render."}):n.jsx("div",{className:"mt-1 px-3 py-2 border border-surface-border rounded min-h-[120px]",children:e.trim()?n.jsx(lt,{content:e}):n.jsx("p",{className:"text-xs text-text-quaternary italic",children:"Nothing to preview."})})]})}const se=28;function re({fieldKey:t,value:e,onChange:r,schema:s,escalationContext:i,isRequired:o,submitAttempted:l,error:c}){const d=(s==null?void 0:s["x-lt-require-all"])===!0,u=it(s==null?void 0:s["x-lt-source"],i);let a={};try{e&&(a=JSON.parse(e))}catch{}const g=(()=>{const p=Jt(s,a,i);return p?JSON.stringify(p):null})();v.useEffect(()=>{g&&r(g)},[g]);const x=p=>r(JSON.stringify({...a,[p]:!a[p]})),y=U(t,s),w=s==null?void 0:s.description;if(u.length===0)return n.jsxs(n.Fragment,{children:[n.jsx("p",{className:"text-xs text-text-tertiary italic mt-1",children:"No checklist items. None of the field's x-lt-source paths resolved on this escalation."}),c&&n.jsx("p",{className:"text-2xs text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]",children:c})]});const b=s==null?void 0:s["x-lt-variant"],f=b==="chips"||b==="rows"?b:d||u.some(p=>p.label.length>se)?"rows":"chips",N=u.filter(p=>a[p.id]).length,_=(u.find(p=>!a[p.id]&&p.required!==!1)??u[0]).id;return n.jsxs("div",{role:"group","aria-label":y,"aria-required":o||void 0,"aria-invalid":c?!0:void 0,children:[n.jsx(E,{isRequired:o,children:y}),w&&n.jsx(W,{children:w}),f==="chips"?n.jsx("div",{className:"flex flex-wrap gap-2 mt-2",children:u.map(p=>{const $=a[p.id]??!1,C=!$&&!!l&&N===0&&(p.required||o);return n.jsxs("label",{className:`inline-flex items-center gap-1.5 cursor-pointer select-none px-3.5 py-2 text-sm border transition-colors rounded-[var(--lt-radius-field)] ${$?"bg-accent border-accent text-text-inverse":C?"bg-surface-field border-status-error/60 text-status-error":"bg-surface-field border-surface-field-border text-text-secondary hover:border-accent hover:text-text-primary"}`,children:[n.jsx("input",{type:"checkbox",checked:$,onChange:()=>x(p.id),className:"sr-only","data-testid":`checklist-item-${p.id}`,...p.id===_?{"data-field-key":t}:{}}),$&&n.jsx(Et,{className:"w-3.5 h-3.5 shrink-0",strokeWidth:2.5}),p.label]},p.id)})}):n.jsx("div",{className:"space-y-2.5 mt-2",children:u.map(p=>{const $=a[p.id]??!1,C=!$&&!!l&&(d?p.required!==!1:N===0&&(p.required||o));return n.jsxs("label",{className:`flex items-start gap-3 cursor-pointer group select-none rounded px-2 py-1 -mx-2 transition-colors ${C?"bg-status-error/5":"hover:bg-surface-hover"}`,children:[n.jsx("input",{type:"checkbox",checked:$,onChange:()=>x(p.id),className:`mt-0.5 w-3.5 h-3.5 shrink-0 rounded ${C?"accent-status-error":"accent-accent"}`,"data-testid":`checklist-item-${p.id}`,...p.id===_?{"data-field-key":t}:{}}),n.jsxs("span",{className:`text-sm leading-snug transition-colors ${C?"text-status-error":"text-text-secondary group-hover:text-text-primary"}`,children:[p.label,p.required&&n.jsx("span",{className:`ml-0.5 text-2xs ${C?"text-status-error":"text-text-quaternary"}`,children:"*"})]})]},p.id)})}),n.jsx("p",{className:"text-2xs text-text-quaternary mt-3 tabular-nums",children:f==="chips"?n.jsxs(n.Fragment,{children:[N," selected",o&&N===0&&!!l&&n.jsx("span",{className:"ml-1 text-text-quaternary/60",children:"(check at least one)"})]}):n.jsxs(n.Fragment,{children:[N," / ",u.length," confirmed",d?n.jsxs("span",{className:"ml-1 text-text-quaternary/60",children:["(all required",u.some(p=>p.required===!1)?" except optional":"",")"]}):o&&N===0&&!!l&&n.jsx("span",{className:"ml-1 text-text-quaternary/60",children:"(at least one required)"})]})}),c&&n.jsx("p",{role:"alert",className:"text-2xs text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]",children:c})]})}const ie=/\.(png|jpe?g|gif|webp|avif|bmp|svg)(\?.*)?$/i;function oe(t){var s,i,o,l;const e=t.trim();if(!e)return{kind:"none"};const r=(i=(s=/^data:([^;,]+)[;,]/.exec(e))==null?void 0:s[1])==null?void 0:i.toLowerCase();if(r)return r.startsWith("image/")?{kind:"image",src:e}:{kind:"file",href:e,label:r==="application/pdf"?"PDF":r,isData:!0};if(/^https?:\/\//i.test(e)){if(ie.test(e))return{kind:"image",src:e};const c=(l=(o=/\.([a-z0-9]{2,5})(\?.*)?$/i.exec(e))==null?void 0:o[1])==null?void 0:l.toUpperCase();return{kind:"file",href:e,label:c??"attachment",isData:!1}}return{kind:"none"}}function ut({fieldKey:t,value:e,schema:r}){const[s,i]=v.useState(!1),o=oe(e??""),l=t.replace(/[_-]/g," "),c=r==null?void 0:r.description,d=n.jsxs(n.Fragment,{children:[n.jsx("label",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary",children:l}),c&&n.jsx("p",{className:"text-2xs text-text-tertiary mt-0.5",children:c})]});return o.kind==="none"?n.jsxs("div",{children:[d,n.jsx("p",{className:"text-xs text-text-quaternary italic mt-1",children:"No attachment"})]}):o.kind==="image"?n.jsxs("div",{children:[d,n.jsxs("div",{className:"mt-1",children:[n.jsx("button",{type:"button",onClick:()=>i(!0),className:"block rounded-[0.125em] border border-surface-border overflow-hidden hover:border-accent transition-colors",title:"View full size",children:n.jsx("img",{src:o.src,alt:t.replace(/[_-]/g," "),className:"max-h-48 max-w-full object-contain","data-testid":`attachment-image-${t}`})}),s&&n.jsx("div",{className:"fixed inset-0 z-[100] bg-text-primary/60 backdrop-blur-sm flex items-center justify-center p-8 cursor-zoom-out",onClick:()=>i(!1),role:"dialog","aria-modal":"true","aria-label":`${l} — full size`,children:n.jsx("img",{src:o.src,alt:l,className:"max-h-[90vh] max-w-[90vw] object-contain"})})]})]}):n.jsxs("div",{children:[d,n.jsx("div",{className:"mt-1",children:n.jsxs("a",{href:o.href,...o.isData?{download:`${t}.${o.label==="PDF"?"pdf":"bin"}`}:{target:"_blank",rel:"noopener noreferrer"},className:"inline-flex items-center gap-1.5 text-xs text-accent hover:text-accent-hover transition-colors","data-testid":`attachment-link-${t}`,children:[n.jsx(_t,{className:"w-3.5 h-3.5",strokeWidth:1.5}),o.isData?`Download ${o.label}`:`Open ${o.label}`,o.isData?n.jsx(Ot,{className:"w-3 h-3",strokeWidth:1.5}):n.jsx(K,{className:"w-3 h-3",strokeWidth:1.5})]})})]})}function ae({fieldKey:t,schema:e,escalationContext:r}){const s=(e==null?void 0:e["x-lt-href"])??"",i=s&&r?Y(s,r):s,o=(e==null?void 0:e.title)??(e==null?void 0:e.description)??"Open",l=e==null?void 0:e.description,c=i.startsWith("/"),d=!i.trim();return n.jsxs("div",{"data-field-key":t,children:[n.jsx(E,{children:o}),l&&n.jsx(W,{children:l}),n.jsx("div",{className:"mt-1",children:d?n.jsx("span",{className:"text-xs text-text-quaternary italic",children:"No link configured"}):c?n.jsxs(gt,{to:i,className:"inline-flex items-center gap-1 text-xs text-accent hover:text-accent-hover transition-colors","data-testid":`link-widget-${t}`,children:[o,n.jsx(K,{className:"w-3 h-3 shrink-0",strokeWidth:1.5})]}):n.jsxs("a",{href:i,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-1 text-xs text-accent hover:text-accent-hover transition-colors","data-testid":`link-widget-${t}`,children:[o,n.jsx(K,{className:"w-3 h-3 shrink-0",strokeWidth:1.5})]})})]})}function yt({to:t,className:e=""}){return n.jsxs(gt,{to:t,title:"View details",tabIndex:-1,className:`inline-flex items-center justify-center w-6 h-6 shrink-0 rounded border border-surface-border text-accent/70 hover:text-accent hover:border-accent/60 hover:bg-accent/5 transition-colors ${e}`,children:[n.jsx($t,{className:"w-3.5 h-3.5",strokeWidth:2}),n.jsx("span",{className:"sr-only",children:"View details"})]})}const pt="—";function le(t,e){if(!t||!e)return"";const r=t.indexOf(".");if(r===-1)return"";const s=t.slice(0,r),i=t.slice(r+1);try{const o=et(e[s],i);return typeof o=="string"?o:""}catch{return""}}function ce(t,e){if(!t||t===pt)return pt;if(e==="age"){const r=new Date(t);return Number.isNaN(r.getTime())?t:st(t)}return t}function de({fieldKey:t,schema:e,escalationContext:r}){const s=e==null?void 0:e["x-lt-source"],i=(e==null?void 0:e["x-lt-fields"])??[],o=(e==null?void 0:e.title)??"Linked escalation",l=e==null?void 0:e.description,c=le(s,r),{data:d,isLoading:u,isError:a}=Dt(c);return n.jsxs("div",{"data-field-key":t,children:[n.jsx(E,{children:o}),l&&n.jsx(W,{children:l}),n.jsx("div",{className:"mt-1",children:!c||a?n.jsx("p",{className:"text-xs text-text-quaternary italic","data-testid":`escalation-widget-empty-${t}`,children:"No linked record"}):u?n.jsx(ue,{}):d?n.jsx(xe,{esc:d,fields:i,fieldKey:t}):n.jsx("p",{className:"text-xs text-text-quaternary italic",children:"No linked record"})})]})}function xe({esc:t,fields:e,fieldKey:r}){if(!t)return null;const s=nt(t);return n.jsxs("div",{className:"border-l-2 border-accent-faint pl-3 py-2 space-y-2","data-testid":`escalation-widget-card-${r}`,children:[n.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[n.jsxs("span",{className:"text-2xs font-semibold uppercase tracking-wider text-text-secondary",children:[t.type,t.subtype&&t.subtype!==t.type?` · ${t.subtype}`:""]}),n.jsx(Lt,{status:t.status})]}),t.description&&n.jsx("p",{className:"text-xs text-text-primary leading-snug",children:t.description}),e.length>0&&n.jsx("dl",{className:"grid grid-cols-[auto_1fr] gap-x-4 gap-y-0.5",children:e.map(i=>{const o=Y(i.value,s),l=ce(o,i.format);return n.jsxs("div",{className:"contents",children:[n.jsx("dt",{className:"text-2xs text-text-tertiary whitespace-nowrap",children:i.label}),n.jsx("dd",{className:"text-2xs text-text-primary",children:l})]},i.label)})}),n.jsxs("div",{className:"flex items-center justify-between gap-2",children:[n.jsxs("span",{className:"text-2xs text-text-quaternary",children:[t.role," · ",st(t.created_at)]}),n.jsx(yt,{to:`/escalations/detail/${t.id}`})]})]})}function ue(){return n.jsxs("div",{className:"border-l-2 border-accent-faint pl-3 py-2 space-y-2 animate-pulse",children:[n.jsx("div",{className:"h-3 w-32 bg-surface-sunken rounded"}),n.jsx("div",{className:"h-3 w-48 bg-surface-sunken rounded"}),n.jsx("div",{className:"h-3 w-24 bg-surface-sunken rounded"})]})}function pe(t,e){if(!t)return{};const r={};for(const[s,i]of Object.entries(t))r[s]=typeof i=="string"?Y(i,e):i;return r}function fe(t,e,r){const s=pe(t.facets,e),i={role:t.role,status:t.status??"pending",facets:s,limit:t.limit,enabled:!!(t.role||Object.keys(s).length)};return t.assigned==="me"?{...i,assigned_to:r,available:!1,enabled:i.enabled&&!!r}:t.assigned==="any"?i:{...i,available:t.available??!0}}const ge=[{label:"Description",value:"{{escalation.description}}"},{label:"Role",value:"{{escalation.role}}"},{label:"Age",value:"{{escalation.created_at}}",format:"age"}],ft="—";function be(t,e){if(!t||t===ft)return ft;if(e==="age"){const r=new Date(t);return Number.isNaN(r.getTime())?t:st(t)}return t}function tt(t,e){return typeof t=="string"?Y(t,e):Array.isArray(t)?t.map(r=>tt(r,e)):t&&typeof t=="object"?Object.fromEntries(Object.entries(t).map(([r,s])=>[r,tt(s,e)])):t}function me({fieldKey:t,schema:e,escalationContext:r}){const s=(e==null?void 0:e["x-lt-query"])??{},i=(e==null?void 0:e["x-lt-columns"])??ge,o=(e==null?void 0:e["x-lt-actions"])??[],l=(e==null?void 0:e.title)??"Related items",c=e==null?void 0:e.description,d=r??{},{user:u}=Mt(),a=fe(s,d,u==null?void 0:u.userId),{data:g,isLoading:x}=It({role:a.role,status:a.status,facets:a.facets,assigned_to:a.assigned_to,available:a.available,limit:a.limit??5,enabled:a.enabled,include:Ft({columns:i,actions:o})?"envelope":void 0}),y=(g==null?void 0:g.escalations)??[],w=Wt(),[b,f]=v.useState({}),[N,_]=v.useState(null),p=async($,C)=>{const R=nt($);if(!(C.confirm&&!window.confirm(Y(C.confirm,R)))){_($.id),f(I=>({...I,[$.id]:""}));try{await w.mutateAsync({id:$.id,resolverPayload:tt(C.resolverPayload,R)})}catch(I){f(P=>({...P,[$.id]:I.message}))}finally{_(null)}}};return n.jsxs("div",{"data-field-key":t,children:[n.jsx(E,{children:l}),c&&n.jsx(W,{children:c}),n.jsx("div",{className:"mt-1","data-testid":`escalation-list-widget-${t}`,children:x?n.jsx(ye,{columns:i.length}):n.jsx(je,{escalations:y,columns:i,fieldKey:t,actions:o,onAction:p,pendingRow:N,rowErrors:b})})]})}function je({escalations:t,columns:e,fieldKey:r,actions:s,onAction:i,pendingRow:o,rowErrors:l}){return t.length===0?n.jsx("p",{className:"text-xs text-text-quaternary italic py-1","data-testid":`escalation-list-empty-${r}`,children:"No items found"}):n.jsxs("table",{className:"w-full text-xs border-collapse","data-testid":`escalation-list-table-${r}`,children:[n.jsx("thead",{children:n.jsxs("tr",{className:"border-b border-surface-border",children:[e.map(c=>n.jsx("th",{className:"text-left text-2xs font-semibold uppercase tracking-wider text-text-tertiary pb-1 pr-3 last:pr-0",children:c.label},c.label)),s.length>0&&n.jsx("th",{className:"w-px"}),n.jsx("th",{className:"w-8"})]})}),n.jsx("tbody",{children:t.map(c=>{const d=nt(c),u=l[c.id];return n.jsxs("tr",{className:"border-b border-surface-border/50 last:border-0 hover:bg-surface-sunken/50 transition-colors",children:[e.map(a=>{const g=Y(a.value,d),x=be(g,a.format);return n.jsx("td",{className:"py-1 pr-3 last:pr-0 text-text-primary align-top",children:x},a.label)}),s.length>0&&n.jsxs("td",{className:"py-1 pr-2 align-top whitespace-nowrap",children:[s.map(a=>n.jsx("button",{type:"button",onClick:()=>i(c,a),disabled:o===c.id,className:"px-2 py-0.5 text-2xs font-medium text-accent border border-accent/40 rounded hover:bg-accent/10 disabled:opacity-40 disabled:cursor-default transition-colors ml-1 first:ml-0","data-testid":`escalation-list-action-${c.id}`,children:a.label},a.label)),u&&n.jsx("p",{className:"text-2xs text-status-error mt-0.5 whitespace-normal max-w-[16rem]","data-testid":`escalation-list-action-error-${c.id}`,children:u})]}),n.jsx("td",{className:"py-1 pl-2 align-top",children:n.jsx(yt,{to:`/escalations/detail/${c.id}`})})]},c.id)})})]})}function ye({columns:t}){return n.jsx("div",{className:"space-y-1.5 animate-pulse",children:[0,1,2].map(e=>n.jsx("div",{className:"flex gap-4",children:Array.from({length:t},(r,s)=>n.jsx("div",{className:"h-3 bg-surface-sunken rounded flex-1"},s))},e))})}const Z={"file-upload":Kt,"code-editor":St,signature:te,"rich-text":ee,markdown:ne,checklist:re,attachment:ut,image:ut,link:ae,escalation:de,"escalation-list":me};function ht({fieldKey:t,value:e,onChange:r,onBlur:s,schema:i,isRequired:o,isReadOnly:l,error:c,escalationContext:d,submitAttempted:u}){var P;const a=(P=i==null?void 0:i.properties)==null?void 0:P[t],g=U(t,a),x=a==null?void 0:a["x-lt-widget"],y=`lt-field-${t}`,w=`${y}-error`,b=`${y}-help`,f=typeof(a==null?void 0:a.description)=="string"&&a.description.length>0?a.description:void 0,p={id:y,"aria-required":o||void 0,"aria-invalid":c?!0:void 0,"aria-describedby":c?w:f!==void 0?b:void 0},$=x==="markdown"&&typeof e=="string",C=(x==="attachment"||x==="image")&&typeof e=="string",R=!!(x&&x in Z);if(l&&!$&&!C&&!R){const A=e===null?"null":typeof e=="object"?JSON.stringify(e,null,2):String(e);return n.jsxs("div",{children:[n.jsx(E,{isRequired:o,children:g}),n.jsx("p",{className:"text-sm text-text-secondary mt-0.5 whitespace-pre-wrap",children:A})]})}if(x&&x in Z){const A=Z[x],O=o||(a==null?void 0:a["x-lt-require-all"])===!0,k={fieldKey:t,schema:a,escalationContext:d,isRequired:O,submitAttempted:u,error:c};if((a==null?void 0:a.type)==="object"){const T=typeof e=="string"?e:typeof e=="object"&&e!==null&&!Array.isArray(e)?JSON.stringify(e):"";return n.jsx(A,{...k,value:T,onChange:F=>{try{r(JSON.parse(F))}catch{r(F)}}})}if(typeof e=="string")return n.jsx(A,{...k,value:e,onChange:T=>r(T)});if(typeof e=="object"&&e!==null&&!Array.isArray(e))return n.jsx(A,{...k,value:JSON.stringify(e),onChange:T=>{try{r(JSON.parse(T))}catch{r(T)}}})}const I=mt(a,d);if(I&&(e===null||typeof e=="string"||typeof e=="number")){const A=e===null?"":String(e),O=I.some(k=>String(k.value)===A);return n.jsxs("div",{children:[n.jsx(E,{isRequired:o,htmlFor:y,children:g}),f&&n.jsx(W,{id:b,children:f}),n.jsxs("select",{value:O?A:"",disabled:I.length===0,onChange:k=>{const T=I.find(F=>String(F.value)===k.target.value);r(T?T.value:k.target.value)},onBlur:s,"data-field-key":t,className:Bt(!!c),...p,children:[!O&&n.jsx("option",{value:"",disabled:!0,children:"Choose…"}),I.map(k=>n.jsx("option",{value:String(k.value),children:k.label},String(k.value)))]}),n.jsx(H,{error:c,id:w})]})}if(typeof e=="boolean")return n.jsxs("div",{children:[n.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[n.jsx("input",{type:"checkbox",checked:e,onChange:A=>{r(A.target.checked),s==null||s()},className:"w-3.5 h-3.5 rounded accent-accent","data-field-key":t,...p}),n.jsxs("span",{className:"text-2xs font-semibold uppercase tracking-wider text-text-secondary",children:[g,o&&n.jsx("span",{className:"text-status-error ml-0.5",children:"*"})]})]}),f&&n.jsx(W,{id:b,children:f}),n.jsx(H,{error:c,id:w})]});if(typeof e=="number")return n.jsxs("div",{children:[n.jsx(E,{isRequired:o,htmlFor:y,children:g}),f&&n.jsx(W,{id:b,children:f}),n.jsx("input",{type:"number",value:e,onChange:A=>r(parseFloat(A.target.value)||0),onBlur:s,step:"any","data-field-key":t,className:`${z(!!c)} max-w-48`,...p}),n.jsx(H,{error:c,id:w})]});if(typeof e=="string"){if((a==null?void 0:a.format)==="password")return n.jsxs("div",{children:[n.jsx(E,{isRequired:o,htmlFor:y,children:g}),f&&n.jsx(W,{id:b,children:f}),n.jsx("input",{type:"password",value:e,onChange:F=>r(F.target.value),onBlur:s,"data-field-key":t,className:z(!!c),autoComplete:"off",...p}),n.jsx(H,{error:c,id:w})]});const O=a==null?void 0:a.format,k={date:"date","date-time":"datetime-local",email:"email",uri:"url"},T={date:"max-w-48","date-time":"max-w-64"};if(O&&O in k)return n.jsxs("div",{children:[n.jsx(E,{isRequired:o,htmlFor:y,children:g}),f&&n.jsx(W,{id:b,children:f}),n.jsx("input",{type:k[O],value:e,onChange:F=>r(F.target.value),onBlur:s,"data-field-key":t,className:`${z(!!c)} ${T[O]??""}`,...p}),n.jsx(H,{error:c,id:w})]});if(O==="textarea"||e.length>80){const F=a==null?void 0:a.maxLength,J=a==null?void 0:a["x-lt-max-length"];let M=F;if(M===void 0&&J&&d){const q=J.indexOf(".");if(q!==-1){const G=J.slice(0,q),Q=J.slice(q+1),m=d[G];if(m&&typeof m=="object"){let h=m;for(const j of Q.split("."))if(h=h[j],h===void 0)break;if(typeof h=="number")M=h;else if(typeof h=="string"){const j=Number(h);Number.isNaN(j)||(M=j)}}}}const V=M!==void 0&&e.length>M;return n.jsxs("div",{children:[n.jsx(E,{isRequired:o,htmlFor:y,children:g}),f&&n.jsx(W,{id:b,children:f}),n.jsx("textarea",{value:e,onChange:q=>{r(q.target.value),s==null||s()},onBlur:s,"data-field-key":t,className:`${z(!!c)} leading-relaxed`,rows:Math.min(6,Math.max(3,Math.ceil(e.length/60))),...p}),M!==void 0&&n.jsxs("p",{className:`text-2xs mt-0.5 text-right tabular-nums ${V?"text-status-error font-medium":"text-text-quaternary"}`,children:[e.length," / ",M]}),n.jsx(H,{error:c,id:w})]})}return n.jsxs("div",{children:[n.jsx(E,{isRequired:o,htmlFor:y,children:g}),f&&n.jsx(W,{id:b,children:f}),n.jsx("input",{type:"text",value:e,onChange:F=>r(F.target.value),onBlur:s,"data-field-key":t,className:z(!!c),...p}),n.jsx(H,{error:c,id:w})]})}if(e===null)return n.jsxs("div",{children:[n.jsx(E,{isRequired:o,children:g}),n.jsx("p",{className:"text-xs text-text-tertiary italic mt-1",children:"null"})]});if(Array.isArray(e))return n.jsxs("div",{children:[n.jsx(E,{isRequired:o,children:g}),n.jsx("div",{className:"flex flex-wrap gap-1.5 mt-1",children:e.map((A,O)=>n.jsx("span",{className:"px-2 py-0.5 text-2xs font-mono bg-surface-sunken rounded text-text-secondary",children:String(A)},O))})]});if(typeof e=="object"){const A=Object.entries(e);return n.jsxs("div",{children:[n.jsx(E,{isRequired:o,children:g}),n.jsx("div",{className:"ml-4 mt-2 pl-4 border-l border-accent-faint space-y-3",children:A.map(([O,k])=>n.jsx(ht,{fieldKey:O,value:k,onChange:T=>r({...e,[O]:T})},O))})]})}return null}function he({items:t,columns:e=1}){if(t.length===0)return null;const r=e>=2&&t.length>1?"grid-cols-1 @dict-inline:grid-cols-[max-content_1fr] @dict-pairs:grid-cols-[max-content_1fr_max-content_1fr]":"grid-cols-1 @dict-inline:grid-cols-[max-content_1fr]";return n.jsx("div",{className:"@container",children:n.jsx("dl",{className:`grid ${r} items-baseline gap-x-6 @dict-pairs:gap-x-8 gap-y-1.5`,children:t.map(({key:s,label:i,value:o})=>n.jsxs(v.Fragment,{children:[n.jsx("dt",{className:"text-2xs font-semibold uppercase tracking-wide text-text-secondary mt-2 first:mt-0 @dict-inline:mt-0",children:i}),n.jsx("dd",{className:"text-sm text-text-primary break-words min-w-0","data-field-key":s,children:Ne(o)})]},s))})})}function Ne(t){return t==null||t===""?"—":typeof t=="boolean"?t?"Yes":"No":typeof t=="object"?JSON.stringify(t):String(t)}const B="dictionary",ve=new Set(["markdown","attachment","image"]);function Nt(t,e){if(!e)return;const r=t==null?void 0:t["x-lt-section-options"],s=r==null?void 0:r[e];return s&&typeof s=="object"?s:void 0}function we(t,e,r){var c,d;const s=(c=t==null?void 0:t.properties)==null?void 0:c[r];if((s==null?void 0:s.readOnly)!==!0)return!1;const i=s==null?void 0:s["x-lt-widget"];if(typeof i=="string"&&ve.has(i))return!1;const o=s==null?void 0:s["x-lt-display"];if(typeof o=="string")return o===B;const l=(d=Nt(t,e))==null?void 0:d.display;return typeof l=="string"?l===B:(t==null?void 0:t["x-lt-display"])===B}function ke(t,e,r,s){var o;const i=[];for(const l of t){const[c]=l,d=i[i.length-1];if(we(e,r,c)){(d==null?void 0:d.kind)==="dictionary"?d.entries.push(l):i.push({kind:"dictionary",entries:[l]});continue}const u=(o=e==null?void 0:e.properties)==null?void 0:o[c],a=u==null?void 0:u["x-lt-column-group"];if(s==="two-column"&&typeof a=="string"&&a.trim()){(d==null?void 0:d.kind)==="column-group"&&d.name===a?d.entries.push(l):i.push({kind:"column-group",name:a,entries:[l]});continue}i.push({kind:"field",entry:l})}return i}function Ae({name:t,entries:e,formSchema:r,layout:s,renderField:i}){const o=ke(e,r,t,s),l=Nt(r,t),c=(l==null?void 0:l.columns)??(s==="two-column"?2:1),d=a=>a.map(([g,x])=>{var y;return{key:g,label:U(g,(y=r==null?void 0:r.properties)==null?void 0:y[g]),value:x}}),u=()=>o.map((a,g)=>a.kind==="dictionary"?n.jsx("div",{className:s==="two-column"?"col-span-full":"",children:n.jsx(he,{items:d(a.entries),columns:c})},`dict-${g}`):a.kind==="column-group"?n.jsx("div",{className:"@container",children:n.jsx("div",{className:"grid grid-cols-1 @grp-cols:grid-cols-2 gap-x-4 gap-y-5",children:a.entries.map(x=>i(x))})},`group-${a.name}-${g}`):i(a.entry));return n.jsxs("div",{className:t?"border border-surface-border bg-surface-sunken rounded-[var(--lt-radius-section)] p-4 animate-[section-enter_0.25s_ease-out]":"",children:[t&&n.jsx("p",{className:"mb-4 text-[1.40625rem] font-semibold tracking-wider text-heading [font-variant-caps:small-caps]",children:t}),s==="two-column"?n.jsx("div",{className:"@container",children:n.jsx("div",{className:"grid grid-cols-1 @form-cols:grid-cols-2 gap-x-col-gap gap-y-5",children:u()})}):n.jsx("div",{className:"space-y-5",children:u()})]})}function Fe({value:t,onChange:e,disabled:r,submitAttempted:s,escalationContext:i,onOpenHelp:o,onDisabledClick:l,disabledHint:c}){var G,Q;const[d,u]=v.useState({}),[a,g]=v.useState({}),[x,y]=v.useState(null),[w,b]=v.useState(!1),[f,N]=v.useState(new Set);v.useEffect(()=>{try{const m=JSON.parse(t);if(typeof m=="object"&&m!==null&&!Array.isArray(m)){const h={},j={};for(const[D,L]of Object.entries(m))D.startsWith("_")?j[D]=L:h[D]=L;u(h),g(j),y(j._form_schema&&typeof j._form_schema=="object"?j._form_schema:null),b(!1)}}catch{b(!0)}},[t]);const _=v.useCallback(m=>{u(m),e(JSON.stringify({...m,...a},null,2))},[a,e]),p=v.useCallback((m,h)=>{_({...d,[m]:h})},[d,_]),$=v.useCallback(m=>{N(h=>{if(h.has(m))return h;const j=new Set(h);return j.add(m),j})},[]);if(w)return n.jsx("p",{className:"text-xs text-status-error",children:"Unable to parse resolver data as form. Use the JSON editor below."});const C=Object.entries(d);if(C.length===0)return n.jsx("p",{className:"text-xs text-text-tertiary italic",children:"No resolver fields defined."});const R=x==null?void 0:x["x-lt-order"],I=R?[...C].sort((m,h)=>{const j=R.indexOf(m[0]),D=R.indexOf(h[0]);return(j===-1?1/0:j)-(D===-1?1/0:D)}):C,P={...i??{},resolver:d,input:d},A=I.filter(([m,h])=>{var D;const j=(D=x==null?void 0:x.properties)==null?void 0:D[m];return!(!jt(j==null?void 0:j["x-lt-showIf"],P)||(j==null?void 0:j["x-lt-hide-if-empty"])===!0&&(h==null||h===""||h===!1||h===0))}),O=new Set((x==null?void 0:x.required)??[]),k=x==null?void 0:x["x-lt-layout"],T=x==null?void 0:x.title,F=x==null?void 0:x.description,J=typeof(x==null?void 0:x["x-lt-help"])=="string"||typeof(x==null?void 0:x["x-lt-context"])=="string",M=[];for(const m of A){const[h]=m,j=(G=x==null?void 0:x.properties)==null?void 0:G[h],D=((Q=j==null?void 0:j["x-lt-section"])==null?void 0:Q.trim())||null,L=M[M.length-1];!L||L.name!==D?M.push({name:D,entries:[m]}):L.entries.push(m)}const V=([m,h])=>{var at;const j=(at=x==null?void 0:x.properties)==null?void 0:at[m],D=(j==null?void 0:j.readOnly)===!0,L=(j==null?void 0:j["x-lt-span"])??1,ot=O.has(m),vt=f.has(m)||!!s,wt=Gt(h,j,ot,vt,P);return n.jsx("div",{className:`animate-[field-enter_0.2s_ease-out] ${k==="two-column"&&L>=2?"col-span-full":""}`,children:n.jsx(ht,{fieldKey:m,value:h,onChange:kt=>p(m,kt),onBlur:()=>$(m),schema:x,isRequired:ot,isReadOnly:D,error:wt,escalationContext:P,submitAttempted:!!s})},m)},q=n.jsxs("div",{className:r?"pointer-events-none":void 0,inert:r||void 0,"aria-disabled":r||void 0,children:[T&&n.jsxs("div",{className:"mb-1 flex items-center gap-1.5",children:[n.jsx("h3",{className:"heading-3",children:T}),J&&o&&n.jsx("button",{type:"button",onClick:o,title:"Open instructions","aria-label":"Open instructions",className:"p-1 rounded-md text-text-tertiary hover:text-accent hover:bg-surface-hover transition-colors",children:n.jsx(Ct,{className:"w-4 h-4",strokeWidth:1.5})})]}),F&&n.jsx("p",{className:"text-sm text-text-secondary leading-relaxed mb-6",children:F}),n.jsx("div",{className:"space-y-8",children:M.map((m,h)=>n.jsx(Ae,{name:m.name,entries:m.entries,formSchema:x,layout:k,renderField:V},m.name??`__s${h}`))})]});return r?n.jsx(Zt,{hint:c,onLockedClick:l,children:q}):n.jsx("div",{className:"pb-8 max-w-form",children:q})}export{Fe as R,U as d,jt as e,fe as r,Gt as v};
2
- //# sourceMappingURL=ResolverForm-Dy0yirtP.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ResolverForm-Dy0yirtP.js","sources":["../../../shared/form-validation/derive-field-label.ts","../../../shared/form-validation/ctx-path.ts","../../../shared/form-validation/x-lt-options.ts","../../../shared/form-validation/field-validator.ts","../../../shared/form-validation/x-lt-show-if.ts","../../src/components/escalation/resolver-form/LockedFormFrame.tsx","../../src/components/escalation/resolver-form/FieldChrome.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/LinkWidget.tsx","../../src/components/escalation/widgets/OpenDetailButton.tsx","../../src/components/escalation/widgets/EscalationWidget.tsx","../../../shared/form-validation/x-lt-query.ts","../../src/components/escalation/widgets/EscalationListWidget.tsx","../../src/components/escalation/widgets/index.ts","../../src/components/escalation/resolver-form/FieldRow.tsx","../../src/components/escalation/resolver-form/DictionaryList.tsx","../../src/components/escalation/resolver-form/form-cells.ts","../../src/components/escalation/resolver-form/SectionGroup.tsx","../../src/components/escalation/resolver-form/ResolverForm.tsx"],"sourcesContent":["/**\n * Human-readable label for a schema field.\n *\n * Resolution order:\n * 1. The JSON Schema `title` keyword — the author's explicit label, always wins.\n * 2. Snake/kebab keys become Title Case: `left_quantity` → `Left Quantity`.\n * 3. Single-token keys pass through unchanged: `PO`, `SKU`, `LEFTQUANTITY` —\n * a run of capitals carries no word boundaries to recover, and lowercasing\n * would mangle acronyms. Authors who want prose labels declare `title`.\n *\n * Used everywhere a field name faces a human: form labels, dictionary lists,\n * the errors panel, and metadata displays.\n */\nexport function deriveFieldLabel(\n key: string,\n fieldSchema?: Record<string, unknown> | null,\n): string {\n const title = fieldSchema?.title;\n if (typeof title === 'string' && title.trim().length > 0) return title.trim();\n\n const words = key.split(/[_-]+/).filter(Boolean);\n if (words.length <= 1) return key;\n\n return words\n .map((w) => (isCapsToken(w) ? w : w.charAt(0).toUpperCase() + w.slice(1)))\n .join(' ');\n}\n\n/** All-caps tokens (PO, SKU, ID) keep their casing inside multi-word keys. */\nfunction isCapsToken(word: string): boolean {\n return word.length > 1 && word === word.toUpperCase() && /[A-Z]/.test(word);\n}\n","/**\n * Context-path resolution shared by every token that names a `\"domain.path\"`.\n *\n * A path may embed `{{domain.path}}` interpolation segments — the same\n * grammar as x-lt-help tokens — resolved against the live context before the\n * walk. This is what makes cascading selects work: a field can declare\n *\n * x-lt-options: \"lookup.geo.regions.{{resolver.country}}\"\n *\n * and its option list follows the submitter's country answer, re-resolved\n * locally on every edit. An unresolved segment means \"no concrete path yet\",\n * never a literal placeholder.\n */\nimport { getDeep } from './x-lt-bind';\n\nexport const INTERPOLATION_PATTERN = /\\{\\{\\s*([^{}]+?)\\s*\\}\\}/g;\n\n/** Whether a token embeds `{{domain.path}}` interpolation segments. */\nexport function hasInterpolation(token: unknown): token is string {\n return typeof token === 'string' && /\\{\\{[^{}]+\\}\\}/.test(token);\n}\n\n/** Resolve a concrete `\"domain.path\"` (x-lt-bind syntax, `a.b[0].c`) against the context. */\nexport function resolveCtxPath(\n path: string,\n ctx: Record<string, unknown> | undefined,\n): unknown {\n if (!ctx) return undefined;\n const dot = path.indexOf('.');\n const root = ctx[dot === -1 ? path : path.slice(0, dot)];\n if (dot === -1) return root;\n if (root === null || typeof root !== 'object') return undefined;\n return getDeep(root, path.slice(dot + 1));\n}\n\n/**\n * Interpolate every `{{domain.path}}` segment against the context. Returns\n * the concrete path, or null when any segment resolves to nothing (missing,\n * null, empty string) or to a non-scalar — an unanswered cascade parent\n * yields no path, so the dependent field offers nothing.\n */\nexport function interpolatePath(\n template: string,\n ctx: Record<string, unknown> | undefined,\n): string | null {\n let unresolved = false;\n const concrete = template.replace(INTERPOLATION_PATTERN, (_match, rawPath: string) => {\n const value = resolveCtxPath(rawPath, ctx);\n if (typeof value === 'string' && value.trim().length > 0) return value;\n if (typeof value === 'number' && Number.isFinite(value)) return String(value);\n unresolved = true;\n return '';\n });\n return unresolved ? null : concrete;\n}\n","/**\n * x-lt-options — a select's option list resolved from the escalation context.\n * The field-level token names a `\"domain.path\"`; the value at that path is an\n * array whose entries are scalars (strings or numbers) or `{ value, label }`\n * objects (`{ id, label }` accepted as an alias), so one static role form can\n * offer a different legal set per escalation (e.g. `[1..N]` where N rides the\n * envelope, or a versioned knowledge lookup under the `lookup` domain).\n *\n * x-lt-options \"domain.path\" or an ORDERED array of paths — e.g.\n * \"envelope.left_quantity_options\" or\n * [\"lookup.reasons.items\", \"envelope.reject_reason_items\"].\n * With an array, the first entry that resolves to options\n * wins, so lookup-backed and envelope-embedded rows render\n * the same shared schema interchangeably (a parked row\n * falls through to the envelope it already carries).\n * Paths may embed {{domain.path}} interpolation segments —\n * e.g. \"lookup.geo.regions.{{resolver.country}}\" — making\n * the option list follow another answer (cascading selects);\n * an entry whose interpolation cannot resolve falls through\n * to the next entry.\n *\n * Object entries separate what the submitter SEES from what the payload\n * STORES: the select renders the label and emits the value (a DB-backed pick\n * list showing text while storing its foreign key). A scalar entry is both.\n *\n * A static `enum` takes precedence when both are present — the same\n * static-over-dynamic rule as x-lt-minimum/x-lt-maximum. Resolution is a\n * tri-state:\n *\n * undefined — no dynamic contract: a plain path that resolves to nothing\n * (the field renders as its plain input; membership unenforced)\n * [] — a dynamic (interpolated) contract offering nothing YET: the\n * select renders disabled and a present value fails membership\n * options — the option list\n *\n * Malformed entries in a resolved array are dropped.\n */\nimport { hasInterpolation, interpolatePath, resolveCtxPath } from './ctx-path';\n\nexport const X_LT_OPTIONS = 'x-lt-options';\n\nexport type OptionValue = string | number;\n\n/** One resolved option: the payload value and the rendered label. */\nexport interface ResolvedOption {\n value: OptionValue;\n label: string;\n}\n\nfunction isScalar(v: unknown): v is OptionValue {\n return typeof v === 'string' || (typeof v === 'number' && Number.isFinite(v));\n}\n\n/** Normalize one array entry, mixed arrays resolving each entry independently. */\nfunction toOption(entry: unknown): ResolvedOption | null {\n if (isScalar(entry)) return { value: entry, label: String(entry) };\n if (entry && typeof entry === 'object' && !Array.isArray(entry)) {\n const o = entry as Record<string, unknown>;\n const value = o.value !== undefined ? o.value : o.id;\n if (isScalar(value) && typeof o.label === 'string' && o.label.length > 0) {\n return { value, label: o.label };\n }\n }\n return null;\n}\n\n/**\n * The field's effective option list: the static `enum` when present, else the\n * entries at the token's `\"domain.path\"`.\n */\nexport function resolveFieldOptions(\n fieldSchema: Record<string, unknown> | null | undefined,\n ctx: Record<string, unknown> | undefined,\n): ResolvedOption[] | undefined {\n if (!fieldSchema) return undefined;\n\n // Enum entries pass through verbatim as values (whatever their type), each\n // labeled by its string form — the legacy membership contract is unchanged.\n const staticEnum = fieldSchema.enum;\n if (Array.isArray(staticEnum) && staticEnum.length > 0) {\n return staticEnum.map((v) => ({ value: v as OptionValue, label: String(v) }));\n }\n\n const token = fieldSchema[X_LT_OPTIONS];\n const paths = (typeof token === 'string' ? [token] : Array.isArray(token) ? token : [])\n .filter((p): p is string => typeof p === 'string' && p.length > 0);\n if (paths.length === 0) return undefined;\n\n // Interpolated entries are a standing contract: when nothing resolves, the\n // field stays a (disabled) select and fails closed — a cascade child never\n // becomes free text. All-plain-path tokens keep the legacy undefined-on-miss\n // reading (the field falls back to its typed plain input).\n const miss = paths.some(hasInterpolation) ? ([] as ResolvedOption[]) : undefined;\n\n for (const sourcePath of paths) {\n let concrete = sourcePath;\n if (hasInterpolation(sourcePath)) {\n const resolved = interpolatePath(sourcePath, ctx);\n if (resolved === null) continue;\n concrete = resolved;\n }\n const cur = resolveCtxPath(concrete, ctx);\n if (!Array.isArray(cur)) continue;\n const options = cur.map(toOption).filter((o): o is ResolvedOption => o !== null);\n if (options.length > 0) return options;\n }\n return miss;\n}\n","import { resolveFieldOptions } from './x-lt-options';\nimport { hasInterpolation, interpolatePath, resolveCtxPath } from './ctx-path';\n\nexport 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 * a \"domain.path\" or an ORDERED array of paths — against the escalation\n * context. With an array, the first entry that resolves to a non-empty item\n * list wins, so lookup-backed and envelope-embedded rows render the same\n * shared schema interchangeably. Paths may embed `{{domain.path}}`\n * interpolation segments (cascading sources); an entry that cannot resolve\n * falls through to the next. Nothing resolvable yields an empty list.\n */\nexport function resolveChecklistItems(\n source: unknown,\n ctx: Record<string, unknown> | undefined,\n): ChecklistItem[] {\n const paths = (typeof source === 'string' ? [source] : Array.isArray(source) ? source : [])\n .filter((p): p is string => typeof p === 'string' && p.length > 0);\n if (paths.length === 0 || !ctx) return [];\n for (const sourcePath of paths) {\n let concrete = sourcePath;\n if (hasInterpolation(sourcePath)) {\n const resolved = interpolatePath(sourcePath, ctx);\n if (resolved === null) continue;\n concrete = resolved;\n }\n const cur = resolveCtxPath(concrete, ctx);\n if (Array.isArray(cur) && cur.length > 0) return cur as ChecklistItem[];\n }\n return [];\n}\n\nexport const X_LT_DEFAULT_CHECKED = 'x-lt-default-checked';\n\n/**\n * The checklist's first-load default (`x-lt-default-checked`): every resolved\n * item starts checked, for affirm-then-exception flows where the submitter\n * unchecks what failed. Returns the all-checked answer map ONLY when the\n * field carries no answer yet — a saved or drafted map (any key, even\n * all-false) is never clobbered — and null otherwise: absent flag, existing\n * answer, or a source that resolves to no items. Declared on the widget\n * because the item set is runtime-sourced (envelope or lookup): a pure\n * escalation-minting step cannot enumerate the ids to seed formDefaults.\n */\nexport function resolveChecklistDefault(\n fieldSchema: Record<string, unknown> | null | undefined,\n currentValue: unknown,\n ctx?: Record<string, unknown>,\n): Record<string, boolean> | null {\n if (fieldSchema?.['x-lt-widget'] !== 'checklist') return null;\n if (fieldSchema[X_LT_DEFAULT_CHECKED] !== true) return null;\n if (\n currentValue && typeof currentValue === 'object' && !Array.isArray(currentValue)\n && Object.keys(currentValue).length > 0\n ) {\n return null;\n }\n const items = resolveChecklistItems(fieldSchema['x-lt-source'], ctx);\n if (items.length === 0) return null;\n return Object.fromEntries(items.map((i) => [i.id, true]));\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 * Runtime type check against the field's declared JSON Schema `type`. Guards\n * the payload contract for API-first callers (a form widget already produces\n * the right primitive; a script or agent submitting `\"1\"` for a number field\n * does not). Absent/empty values pass — presence is the required check's job.\n */\nexport function validateFieldType(\n value: unknown,\n fieldSchema: Record<string, unknown> | undefined,\n): string | undefined {\n const declared = fieldSchema?.type;\n if (typeof declared !== 'string') return undefined;\n if (value === undefined || value === null || value === '') return undefined;\n switch (declared) {\n case 'string':\n return typeof value === 'string' ? undefined : 'Expected text';\n case 'number':\n return typeof value === 'number' && Number.isFinite(value) ? undefined : 'Expected a number';\n case 'integer':\n return typeof value === 'number' && Number.isInteger(value) ? undefined : 'Expected a whole number';\n case 'boolean':\n return typeof value === 'boolean' ? undefined : 'Expected true or false';\n case 'array':\n return Array.isArray(value) ? undefined : 'Expected a list';\n case 'object':\n return typeof value === 'object' && !Array.isArray(value) ? undefined : 'Expected an object';\n default:\n return undefined;\n }\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 // Option membership — the form's select widget constrains choices; API-first\n // callers are unconstrained, so the effective option list is the contract:\n // the static enum, or the x-lt-options list resolved from context. The\n // submitted answer is the option VALUE (labels are presentation). An\n // interpolated list that currently offers nothing fails closed — a stale\n // cascade child value never submits.\n const allowed = resolveFieldOptions(fieldSchema, ctx);\n if (allowed !== undefined && value !== undefined && value !== null && value !== '') {\n if (allowed.length === 0) {\n return 'No valid options for this selection';\n }\n if (!allowed.some((o) => o.value === value)) {\n return `Must be one of: ${allowed.map((o) => String(o.value)).join(', ')}`;\n }\n }\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 // Declared-type check runs before constraints: a mis-typed value would make\n // the numeric/string constraint branches silently inapplicable.\n const typeError = validateFieldType(value, fieldSchema);\n if (typeError) return typeError;\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","/**\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 * An array of conditions shows the field only when every one holds.\n */\nexport function evaluateShowIf(condition: unknown, ctx: ShowIfContext | null | undefined): boolean {\n if (Array.isArray(condition)) return condition.every((c) => evaluateShowIf(c, ctx));\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","import { useEffect, useState, type ReactNode } from 'react';\nimport { Lock } from 'lucide-react';\n\n/** Animation length; a fallback timer clears state where animationend never fires. */\nconst HINT_MS = 2600;\n\n/**\n * The locked form's interaction frame. A click reports the gesture (the page\n * nudges Claim) and answers right at the click point: a small toast pops in\n * above the cursor naming the state — \"Claim this escalation to edit the\n * form\", \"Claimed by …\", \"resolved\" — holds a beat, and drifts out. Children\n * arrive as a prop, so hint state re-renders only this frame, never the form\n * beneath it.\n */\nexport function LockedFormFrame({\n hint,\n onLockedClick,\n children,\n}: {\n hint?: ReactNode;\n onLockedClick?: () => void;\n children: ReactNode;\n}) {\n const [hintAt, setHintAt] = useState<{ x: number; y: number; n: number } | null>(null);\n\n useEffect(() => {\n if (!hintAt) return;\n const timer = setTimeout(() => setHintAt(null), HINT_MS);\n return () => clearTimeout(timer);\n }, [hintAt]);\n\n const handleClick = (e: React.MouseEvent) => {\n onLockedClick?.();\n if (hint) {\n // Keep the bubble on screen when the click hugs a viewport edge.\n const x = Math.min(Math.max(e.clientX, 96), window.innerWidth - 96);\n setHintAt((prev) => ({ x, y: e.clientY, n: (prev?.n ?? 0) + 1 }));\n }\n };\n\n return (\n <div className=\"pb-8 max-w-form\" onClick={handleClick} data-testid=\"locked-form-frame\">\n {children}\n {hint && hintAt && (\n <div\n // Keyed per click so a repeat click replays the pop at the new spot.\n key={hintAt.n}\n role=\"status\"\n className=\"fixed z-[60] pointer-events-none flex items-center gap-2 px-3 py-1.5 rounded-md bg-surface-raised border border-surface-border shadow-lg text-xs font-medium text-text-primary whitespace-nowrap animate-[click-hint_2.6s_ease-in-out_both]\"\n style={{ left: hintAt.x, top: hintAt.y - 12 }}\n onAnimationEnd={() => setHintAt(null)}\n data-testid=\"locked-form-hint\"\n >\n <Lock className=\"w-3.5 h-3.5 text-accent shrink-0\" strokeWidth={1.5} />\n {hint}\n </div>\n )}\n </div>\n );\n}\n","/**\n * Shared field chrome for the resolver form: label, helper, error, and the\n * input class recipes. One place styles every generated field.\n */\n\nexport function FieldLabel({ children, isRequired, htmlFor }: {\n children: React.ReactNode;\n isRequired?: boolean;\n htmlFor?: string;\n}) {\n // `block` is load-bearing: a <label> is inline by default, and the\n // label→instruction→control anatomy would then hold only by accident —\n // a full-width control wraps below, but a narrow control (number,\n // max-w-48) with no instruction line sits flush BESIDE the label. The\n // anatomy is a column; the label declares it.\n return (\n <label htmlFor={htmlFor} className=\"block text-2xs 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\nexport function FieldHelper({ id, children }: { id?: string; children: React.ReactNode }) {\n return (\n <p id={id} className=\"text-2xs text-text-tertiary mt-0.5 leading-snug\">\n {children}\n </p>\n );\n}\n\nexport function FieldError({ error, id }: { error?: string; id?: string }) {\n if (!error) return null;\n return (\n <p id={id} role=\"alert\" className=\"text-2xs text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]\">\n {error}\n </p>\n );\n}\n\nexport function 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).\n// Width follows the content, floored for presence and capped by the cell —\n// a one-word choice never stretches across the measure. The floor is\n// min(16rem, 100%): CSS lets min-width beat max-width, so a bare min-w-64\n// would overflow a cell narrower than 16rem — the cell always wins.\nexport function selectClass(hasError?: boolean): string {\n return hasError\n ? 'select text-sm mt-1 min-w-[min(16rem,100%)] max-w-full border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]'\n : 'select text-sm mt-1 min-w-[min(16rem,100%)] max-w-full';\n}\n","import { useCallback, useRef } from 'react';\nimport { deriveFieldLabel } from '../../../lib/derive-field-label';\nimport { FieldLabel } from '../resolver-form/FieldChrome';\n\ninterface FileUploadWidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n isRequired?: boolean;\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, isRequired }: FileUploadWidgetProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const accept = (schema?.accept as string) ?? undefined;\n const label = deriveFieldLabel(fieldKey, schema);\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 <FieldLabel isRequired={isRequired}>\n {label}\n </FieldLabel>\n {helperText && <p className=\"text-2xs 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';\nimport { deriveFieldLabel } from '../../../lib/derive-field-label';\nimport { FieldLabel } from '../resolver-form/FieldChrome';\n\ninterface CodeEditorWidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n isRequired?: boolean;\n}\n\n/**\n * Monospace textarea with tab-key support for code input.\n */\nexport function CodeEditorWidget({ fieldKey, value, onChange, schema, isRequired }: CodeEditorWidgetProps) {\n const label = deriveFieldLabel(fieldKey, schema);\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 <FieldLabel isRequired={isRequired}>\n {label}\n {language && (\n <span className=\"ml-2 text-text-tertiary/60 normal-case font-normal\">{language}</span>\n )}\n </FieldLabel>\n {helperText && <p className=\"text-2xs 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';\nimport { deriveFieldLabel } from '../../../lib/derive-field-label';\nimport { FieldLabel } from '../resolver-form/FieldChrome';\n\ninterface SignatureWidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n isRequired?: boolean;\n}\n\n/**\n * HTML5 Canvas signature pad. Outputs a PNG data URL.\n */\nexport function SignatureWidget({ fieldKey, value, onChange, schema, isRequired }: SignatureWidgetProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [isDrawing, setIsDrawing] = useState(false);\n const label = deriveFieldLabel(fieldKey, schema);\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 // Deliberately unthemed: the signature is a captured document artifact —\n // the exported PNG must read like ink on paper regardless of theme.\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 // The backing store is a fixed 400×150 document; the element may display\n // at any width. Scale pointer coordinates into store space so the ink\n // lands under the cursor at every display size.\n const scaleX = rect.width > 0 ? canvas.width / rect.width : 1;\n const scaleY = rect.height > 0 ? canvas.height / rect.height : 1;\n if ('touches' in e) {\n return {\n x: (e.touches[0].clientX - rect.left) * scaleX,\n y: (e.touches[0].clientY - rect.top) * scaleY,\n };\n }\n return { x: (e.clientX - rect.left) * scaleX, y: (e.clientY - rect.top) * scaleY };\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 <FieldLabel isRequired={isRequired}>\n {label}\n </FieldLabel>\n {helperText && <p className=\"text-2xs text-text-tertiary mt-0.5\">{helperText}</p>}\n {/* The pad holds its natural document proportion (25rem = the 400px\n backing store), never stretched to the measure — the exported PNG\n is the artifact. Narrower cells shrink it; the scaling in getPos\n keeps the ink under the cursor either way. */}\n <div className=\"mt-1 max-w-[25rem] 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-2xs text-text-tertiary hover:text-accent transition-colors\"\n >\n Clear\n </button>\n </div>\n );\n}\n","import { deriveFieldLabel } from '../../../lib/derive-field-label';\nimport { FieldLabel } from '../resolver-form/FieldChrome';\n\ninterface RichTextWidgetProps {\n fieldKey: string;\n value: string;\n onChange: (v: string) => void;\n schema?: Record<string, unknown>;\n isRequired?: boolean;\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, isRequired }: RichTextWidgetProps) {\n const label = deriveFieldLabel(fieldKey, schema);\n const helperText = schema?.description as string | undefined;\n\n return (\n <div>\n <FieldLabel isRequired={isRequired}>\n {label}\n </FieldLabel>\n {helperText && <p className=\"text-2xs 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 { deriveFieldLabel } from '../../../lib/derive-field-label';\nimport { FieldLabel } from '../resolver-form/FieldChrome';\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 isRequired?: boolean;\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, isRequired }: MarkdownWidgetProps) {\n const [tab, setTab] = useState<'write' | 'preview'>('write');\n const label = deriveFieldLabel(fieldKey, schema);\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 <FieldLabel isRequired={isRequired}>\n {label}\n </FieldLabel>\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-2xs 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-2xs 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 { useEffect } from 'react';\nimport { Check } from 'lucide-react';\n\nimport { deriveFieldLabel } from '../../../lib/derive-field-label';\nimport { resolveChecklistItems, resolveChecklistDefault } from '../../../lib/field-validator';\nimport type { ShowIfContext } from '../../../lib/x-lt-show-if';\nimport { FieldLabel, FieldHelper } from '../resolver-form/FieldChrome';\nimport type { WidgetProps } from './index';\n\ninterface ChecklistItem { id: string; label: string; required?: boolean }\n\n/** Labels at or under this length read as tags; longer ones read as sentences. */\nconst CHIP_LABEL_MAX = 28;\n\n/**\n * Checklist widget — a dynamic list of labeled checkboxes driven by runtime\n * data in the escalation context.\n *\n * Schema usage:\n * \"x-lt-widget\": \"checklist\"\n * \"x-lt-source\": \"envelope.checklist_items\" (any domain.path, or an\n * ordered array of paths — first source that resolves wins)\n * \"x-lt-variant\": \"chips\" | \"rows\" (optional; see geometry below)\n *\n * Item definitions: Array<{ id: string; label: string; required?: boolean }>\n *\n * GEOMETRY — item length and selection mode decide it:\n * - rows — one item per line. The shape for rituals: sentence-length\n * confirmations read top-down and are ticked deliberately.\n * `x-lt-require-all` always renders rows.\n * - chips — a wrapping cloud of selectable pills. The shape for tags:\n * short pick-any items (reject reasons, categories) flow horizontally,\n * thumb-sized, selection visible at a glance.\n * Explicit `x-lt-variant` wins; otherwise require-all → rows, else chips\n * when every label is ≤28 characters.\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 *\n * \"x-lt-default-checked\": true — first-load default: an unanswered field\n * initializes to every item checked (affirm-then-exception: the submitter\n * unchecks what failed). A saved answer map is never clobbered.\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 requireAll = schema?.['x-lt-require-all'] === true;\n // The shared resolver serves render and enforcement alike — including\n // {{domain.path}} interpolation in the source path.\n const items: ChecklistItem[] = resolveChecklistItems(\n schema?.['x-lt-source'],\n escalationContext as Record<string, unknown> | undefined,\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 // First-load default (x-lt-default-checked): the moment the source resolves\n // (a lookup arrives async), an unanswered field initializes to every item\n // checked. Keyed on the serialized default so it fires once per material\n // change and never against a saved answer map.\n const defaultJson = (() => {\n const d = resolveChecklistDefault(schema, state, escalationContext as Record<string, unknown> | undefined);\n return d ? JSON.stringify(d) : null;\n })();\n useEffect(() => {\n if (defaultJson) onChange(defaultJson);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [defaultJson]);\n\n const toggle = (id: string) => onChange(JSON.stringify({ ...state, [id]: !state[id] }));\n\n const title = deriveFieldLabel(fieldKey, schema);\n const helperText = schema?.description as string | undefined;\n\n if (items.length === 0) {\n return (\n <>\n <p className=\"text-xs text-text-tertiary italic mt-1\">\n No checklist items. None of the field's x-lt-source paths resolved on this escalation.\n </p>\n {error && (\n <p className=\"text-2xs text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]\">\n {error}\n </p>\n )}\n </>\n );\n }\n\n const explicitVariant = schema?.['x-lt-variant'] as string | undefined;\n const variant = explicitVariant === 'chips' || explicitVariant === 'rows'\n ? explicitVariant\n : requireAll || items.some((i) => i.label.length > CHIP_LABEL_MAX)\n ? 'rows'\n : 'chips';\n\n const checkedCount = items.filter((item) => state[item.id]).length;\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={title} aria-required={isRequired || undefined} aria-invalid={error ? true : undefined}>\n <FieldLabel isRequired={isRequired}>{title}</FieldLabel>\n {helperText && <FieldHelper>{helperText}</FieldHelper>}\n {variant === 'chips' ? (\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {items.map((item) => {\n const checked = state[item.id] ?? false;\n const showItemError = !checked && !!submitAttempted && checkedCount === 0 && (item.required || isRequired);\n return (\n // The pill IS the checkbox: the real input stays in the label\n // (sr-only) so native semantics and the focus anchor survive.\n // Selection is an act — it earns the solid accent.\n <label\n key={item.id}\n className={`inline-flex items-center gap-1.5 cursor-pointer select-none px-3.5 py-2 text-sm border transition-colors rounded-[var(--lt-radius-field)] ${\n checked\n ? 'bg-accent border-accent text-text-inverse'\n : showItemError\n ? 'bg-surface-field border-status-error/60 text-status-error'\n : 'bg-surface-field border-surface-field-border text-text-secondary hover:border-accent hover:text-text-primary'\n }`}\n >\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() => toggle(item.id)}\n className=\"sr-only\"\n data-testid={`checklist-item-${item.id}`}\n {...(item.id === focusId ? { 'data-field-key': fieldKey } : {})}\n />\n {checked && <Check className=\"w-3.5 h-3.5 shrink-0\" strokeWidth={2.5} />}\n {item.label}\n </label>\n );\n })}\n </div>\n ) : (\n <div className=\"space-y-2.5 mt-2\">\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-2xs ${showItemError ? 'text-status-error' : 'text-text-quaternary'}`}>*</span>\n )}\n </span>\n </label>\n );\n })}\n </div>\n )}\n <p className=\"text-2xs text-text-quaternary mt-3 tabular-nums\">\n {variant === 'chips' ? (\n <>\n {checkedCount} selected\n {isRequired && checkedCount === 0 && !!submitAttempted && (\n <span className=\"ml-1 text-text-quaternary/60\">(check at least one)</span>\n )}\n </>\n ) : (\n <>\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 </>\n )}\n </p>\n {error && (\n <p role=\"alert\" className=\"text-2xs 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-2xs font-semibold uppercase tracking-widest text-text-tertiary\">\n {label}\n </label>\n {helperText && <p className=\"text-2xs 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 { Link } from 'react-router-dom';\nimport { ExternalLink } from 'lucide-react';\nimport { interpolateHelp } from '../../../lib/x-lt-help';\nimport { FieldLabel, FieldHelper } from '../resolver-form/FieldChrome';\nimport type { WidgetProps } from './index';\n\n/**\n * Link widget — a named navigation link whose URL is a `{{domain.path}}`\n * template resolved at render time from the escalation context.\n *\n * Schema usage:\n * \"x-lt-widget\": \"link\"\n * \"x-lt-href\": \"/escalations/available?role=foo&facets={\\\"orderId\\\":\\\"{{metadata.orderId}}\\\"}\"\n * \"title\": \"Human-readable label\"\n * \"description\": \"One-line instruction text\"\n *\n * URL behaviour:\n * Paths starting with \"/\" navigate inside the dashboard (React Router <Link>).\n * Anything else opens in a new tab with rel=\"noreferrer\".\n *\n * This widget is display-only — it produces no resolver payload value and must\n * never appear in the schema's `required` array.\n */\nexport function LinkWidget({ fieldKey, schema, escalationContext }: WidgetProps) {\n const hrefTemplate = (schema?.['x-lt-href'] as string | undefined) ?? '';\n const href = hrefTemplate && escalationContext\n ? interpolateHelp(hrefTemplate, escalationContext)\n : hrefTemplate;\n\n const label = (schema?.title as string | undefined) ?? (schema?.description as string | undefined) ?? 'Open';\n const helperText = schema?.description as string | undefined;\n const isInternal = href.startsWith('/');\n const isEmpty = !href.trim();\n\n return (\n <div data-field-key={fieldKey}>\n <FieldLabel>{label}</FieldLabel>\n {helperText && <FieldHelper>{helperText}</FieldHelper>}\n <div className=\"mt-1\">\n {isEmpty ? (\n <span className=\"text-xs text-text-quaternary italic\">No link configured</span>\n ) : isInternal ? (\n <Link\n to={href}\n className=\"inline-flex items-center gap-1 text-xs text-accent hover:text-accent-hover transition-colors\"\n data-testid={`link-widget-${fieldKey}`}\n >\n {label}\n <ExternalLink className=\"w-3 h-3 shrink-0\" strokeWidth={1.5} />\n </Link>\n ) : (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1 text-xs text-accent hover:text-accent-hover transition-colors\"\n data-testid={`link-widget-${fieldKey}`}\n >\n {label}\n <ExternalLink className=\"w-3 h-3 shrink-0\" strokeWidth={1.5} />\n </a>\n )}\n </div>\n </div>\n );\n}\n","import { Link } from 'react-router-dom';\nimport { ArrowUpRight } from 'lucide-react';\n\n/**\n * The one affordance for opening an embedded row's detail page — a clear\n * icon-in-a-button, not a bare glyph, so the gesture reads as \"open this\". The\n * tooltip stays generic (\"View details\") rather than naming the record kind, so\n * the same control fits any embed. Non-focusable: the row/card click and the\n * canned actions carry the keyboard path; this is a pointer shortcut.\n */\nexport function OpenDetailButton({ to, className = '' }: { to: string; className?: string }) {\n return (\n <Link\n to={to}\n title=\"View details\"\n tabIndex={-1}\n className={`inline-flex items-center justify-center w-6 h-6 shrink-0 rounded border border-surface-border text-accent/70 hover:text-accent hover:border-accent/60 hover:bg-accent/5 transition-colors ${className}`}\n >\n <ArrowUpRight className=\"w-3.5 h-3.5\" strokeWidth={2} />\n <span className=\"sr-only\">View details</span>\n </Link>\n );\n}\n","import { OpenDetailButton } from './OpenDetailButton';\n\nimport { interpolateHelp } from '../../../lib/x-lt-help';\nimport { getDeep } from '../../../lib/x-lt-bind';\nimport { formatAgoCompact } from '../../../lib/format';\nimport { useEscalation } from '../../../api/escalations';\nimport { rowContext } from '../EscalationListView';\nimport { FieldLabel, FieldHelper } from '../resolver-form/FieldChrome';\nimport { StatusBadge } from '../../common/display/StatusBadge';\nimport type { WidgetProps } from './index';\nimport type { ShowIfContext } from '../../../lib/x-lt-show-if';\n\ninterface FieldDef { label: string; value: string; format?: string }\n\nconst EM_DASH = '—';\n\nfunction resolveSourceId(\n sourcePath: string | undefined,\n escalationContext: ShowIfContext | undefined,\n): string {\n if (!sourcePath || !escalationContext) return '';\n const dot = sourcePath.indexOf('.');\n if (dot === -1) return '';\n const domain = sourcePath.slice(0, dot) as keyof ShowIfContext;\n const path = sourcePath.slice(dot + 1);\n try {\n const v = getDeep(escalationContext[domain] as unknown, path);\n return typeof v === 'string' ? v : '';\n } catch {\n return '';\n }\n}\n\nfunction renderFieldValue(raw: string, format?: string): string {\n if (!raw || raw === EM_DASH) return EM_DASH;\n if (format === 'age') {\n const d = new Date(raw);\n return Number.isNaN(d.getTime()) ? raw : formatAgoCompact(raw);\n }\n return raw;\n}\n\n/**\n * Escalation widget — embeds a single escalation record inline in the form as\n * a compact card. The escalation ID is resolved from a `domain.path` declared\n * in `x-lt-source`; the card's detail rows are configured via `x-lt-fields`.\n *\n * Schema usage:\n * \"x-lt-widget\": \"escalation\"\n * \"x-lt-source\": \"metadata.parent_escalation_id\" (any domain.path → ID)\n * \"x-lt-fields\": [ (optional, any of escalation's data)\n * { \"label\": \"Order\", \"value\": \"{{metadata.orderId}}\" },\n * { \"label\": \"Decision\", \"value\": \"{{resolver.decision}}\" },\n * { \"label\": \"Age\", \"value\": \"{{escalation.created_at}}\", \"format\": \"age\" }\n * ]\n * \"title\": \"Card heading label\"\n * \"description\": \"One-line instruction text\"\n *\n * `x-lt-fields` token values resolve against the *embedded* escalation's own\n * context (its escalation row, metadata, envelope, payload, resolver) — not the\n * parent form's context. Same domain/path convention as x-lt-active.fields.\n *\n * Display-only — produces no resolver payload and must not appear in `required`.\n */\nexport function EscalationWidget({ fieldKey, schema, escalationContext }: WidgetProps) {\n const sourcePath = schema?.['x-lt-source'] as string | undefined;\n const fields = (schema?.['x-lt-fields'] as FieldDef[] | undefined) ?? [];\n const label = (schema?.title as string | undefined) ?? 'Linked escalation';\n const helperText = schema?.description as string | undefined;\n\n const id = resolveSourceId(sourcePath, escalationContext);\n const { data: esc, isLoading, isError } = useEscalation(id);\n\n return (\n <div data-field-key={fieldKey}>\n <FieldLabel>{label}</FieldLabel>\n {helperText && <FieldHelper>{helperText}</FieldHelper>}\n <div className=\"mt-1\">\n {!id || isError ? (\n <p className=\"text-xs text-text-quaternary italic\" data-testid={`escalation-widget-empty-${fieldKey}`}>\n No linked record\n </p>\n ) : isLoading ? (\n <EscalationCardSkeleton />\n ) : esc ? (\n <EscalationCard esc={esc} fields={fields} fieldKey={fieldKey} />\n ) : (\n <p className=\"text-xs text-text-quaternary italic\">No linked record</p>\n )}\n </div>\n </div>\n );\n}\n\nfunction EscalationCard({\n esc,\n fields,\n fieldKey,\n}: {\n esc: ReturnType<typeof useEscalation>['data'];\n fields: FieldDef[];\n fieldKey: string;\n}) {\n if (!esc) return null;\n const ctx = rowContext(esc);\n\n return (\n <div\n className=\"border-l-2 border-accent-faint pl-3 py-2 space-y-2\"\n data-testid={`escalation-widget-card-${fieldKey}`}\n >\n {/* Header: type + status */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"text-2xs font-semibold uppercase tracking-wider text-text-secondary\">\n {esc.type}{esc.subtype && esc.subtype !== esc.type ? ` · ${esc.subtype}` : ''}\n </span>\n <StatusBadge status={esc.status} />\n </div>\n\n {/* Description */}\n {esc.description && (\n <p className=\"text-xs text-text-primary leading-snug\">{esc.description}</p>\n )}\n\n {/* x-lt-fields facts — same dictionary visual as DictionaryList */}\n {fields.length > 0 && (\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-0.5\">\n {fields.map((f) => {\n const raw = interpolateHelp(f.value, ctx);\n const display = renderFieldValue(raw, f.format);\n return (\n <div key={f.label} className=\"contents\">\n <dt className=\"text-2xs text-text-tertiary whitespace-nowrap\">{f.label}</dt>\n <dd className=\"text-2xs text-text-primary\">{display}</dd>\n </div>\n );\n })}\n </dl>\n )}\n\n {/* Footer: role, age, detail link */}\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-2xs text-text-quaternary\">\n {esc.role} · {formatAgoCompact(esc.created_at)}\n </span>\n <OpenDetailButton to={`/escalations/detail/${esc.id}`} />\n </div>\n </div>\n );\n}\n\nfunction EscalationCardSkeleton() {\n return (\n <div className=\"border-l-2 border-accent-faint pl-3 py-2 space-y-2 animate-pulse\">\n <div className=\"h-3 w-32 bg-surface-sunken rounded\" />\n <div className=\"h-3 w-48 bg-surface-sunken rounded\" />\n <div className=\"h-3 w-24 bg-surface-sunken rounded\" />\n </div>\n );\n}\n","import { interpolateHelp } from './x-lt-help';\nimport type { ShowIfContext } from './x-lt-show-if';\n\n/**\n * The embedded escalation query shape shared by `x-lt-query` (escalation-list\n * widget) and `x-lt-submit-guard.query` (form-level submit gate). String\n * values inside `facets` support `{{domain.path}}` token interpolation against\n * the host escalation's context. Isomorphic: the dashboard renders embeds from\n * it, and the API layer enforces the submit gate from the identical mapping.\n *\n * `assigned` is the ownership scope. Ownership is not a separate list — it is\n * one more dimension of the same faceted query language the escalation API\n * composes server-side (\"claimed\" is the implied status: pending, held, claim\n * window live):\n * - `\"me\"` — rows claimed by the viewing user (the walk case: I walk what I own)\n * - `\"any\"` — all matching rows regardless of claim state\n * - omitted — available rows only (unclaimed, or claim window lapsed)\n */\nexport interface EmbedQuery {\n role?: string;\n status?: string;\n facets?: Record<string, string>;\n limit?: number;\n assigned?: 'me' | 'any';\n /** Superseded by `assigned`; honored only when `assigned` is omitted. */\n available?: boolean;\n}\n\n/** Interpolate `{{domain.path}}` tokens in every string value of the facets map. */\nexport function resolveQueryFacets(\n facets: Record<string, string> | undefined,\n ctx: ShowIfContext,\n): Record<string, unknown> {\n if (!facets) return {};\n const resolved: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(facets)) {\n resolved[k] = typeof v === 'string' ? interpolateHelp(v, ctx) : v;\n }\n return resolved;\n}\n\n/** The escalation-query params an EmbedQuery resolves to — the exact input\n * shape of `useEscalations`, so every embed surface queries identically. */\nexport interface ScopedQueryParams {\n role?: string;\n status: string;\n facets: Record<string, unknown>;\n assigned_to?: string;\n available?: boolean;\n limit?: number;\n enabled: boolean;\n}\n\n/**\n * Resolve an EmbedQuery into concrete escalation-query params — the ONE\n * mapping every embed surface (escalation-list, x-lt-actions, x-lt-submit-guard)\n * consumes, so the visible rows and any count derived from the same query can\n * never disagree.\n *\n * Ownership scope translates into the faceted query language:\n * - `assigned: \"me\"` → `assigned_to = viewer AND available = false` — the\n * implied \"claimed\" status (pending + live claim window held by the viewer)\n * - `assigned: \"any\"` → no ownership constraint\n * - omitted → `available = true` (the unclaimed pool; a declared\n * legacy `available` value is honored)\n *\n * When `assigned: \"me\"` and no viewer id is supplied (a surface with no\n * resolving user, e.g. an MCP resolve), the scope cannot be evaluated —\n * `enabled` is false rather than silently widening to another scope.\n */\nexport function resolveScopedQuery(\n query: EmbedQuery,\n ctx: ShowIfContext,\n viewerId: string | undefined,\n): ScopedQueryParams {\n const facets = resolveQueryFacets(query.facets, ctx);\n const base: ScopedQueryParams = {\n role: query.role,\n status: query.status ?? 'pending',\n facets,\n limit: query.limit,\n enabled: !!(query.role || Object.keys(facets).length),\n };\n if (query.assigned === 'me') {\n return { ...base, assigned_to: viewerId, available: false, enabled: base.enabled && !!viewerId };\n }\n if (query.assigned === 'any') {\n return base;\n }\n return { ...base, available: query.available ?? true };\n}\n","import { useState } from 'react';\nimport { OpenDetailButton } from './OpenDetailButton';\nimport { interpolateHelp } from '../../../lib/x-lt-help';\nimport { formatAgoCompact } from '../../../lib/format';\nimport { rowContext } from '../EscalationListView';\nimport { useEscalations, useResolveEscalation } from '../../../api/escalations';\nimport { useAuth } from '../../../hooks/useAuth';\nimport { FieldLabel, FieldHelper } from '../resolver-form/FieldChrome';\nimport { resolveScopedQuery, type EmbedQuery } from '../../../lib/x-lt-query';\nimport { schemaNeedsEnvelope } from '../../../lib/schema-needs-envelope';\nimport type { WidgetProps } from './index';\nimport type { ShowIfContext } from '../../../lib/x-lt-show-if';\nimport type { LTEscalationRecord } from '../../../api/types';\n\ninterface ColumnDef { label: string; value: string; format?: string }\n\n/**\n * An inline row action: fires a canned resolve against the row through the\n * standard resolve endpoint — RBAC and enforce_schema validation apply\n * server-side exactly as a full-form resolve. String leaves inside\n * `resolverPayload` (and `confirm`) interpolate `{{domain.path}}` tokens\n * against the row's own context; booleans and numbers pass through typed.\n */\ninterface ActionDef {\n label: string;\n resolverPayload: Record<string, unknown>;\n /** Optional confirm prompt shown before firing; tokens interpolate per row. */\n confirm?: string;\n}\n\nconst DEFAULT_COLUMNS: ColumnDef[] = [\n { label: 'Description', value: '{{escalation.description}}' },\n { label: 'Role', value: '{{escalation.role}}' },\n { label: 'Age', value: '{{escalation.created_at}}', format: 'age' },\n];\n\nconst EM_DASH = '—';\n\nfunction renderValue(raw: string, format?: string): string {\n if (!raw || raw === EM_DASH) return EM_DASH;\n if (format === 'age') {\n const d = new Date(raw);\n return Number.isNaN(d.getTime()) ? raw : formatAgoCompact(raw);\n }\n return raw;\n}\n\n/** Deep-walk a payload template: string leaves interpolate `{{domain.path}}`\n * tokens against the row context; every other type passes through typed. */\nfunction interpolatePayload(value: unknown, ctx: ShowIfContext): unknown {\n if (typeof value === 'string') return interpolateHelp(value, ctx);\n if (Array.isArray(value)) return value.map((v) => interpolatePayload(v, ctx));\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value).map(([k, v]) => [k, interpolatePayload(v, ctx)]),\n );\n }\n return value;\n}\n\n/**\n * Escalation list widget — embeds a compact list of escalations inline in the\n * form, driven by a facet query declared in `x-lt-query`. String values inside\n * `x-lt-query.facets` support `{{domain.path}}` token interpolation.\n *\n * Schema usage:\n * \"x-lt-widget\": \"escalation-list\"\n * \"x-lt-query\": {\n * \"role\": \"rel-originator\",\n * \"facets\": { \"customerId\": \"{{metadata.customerId}}\" },\n * \"status\": \"pending\",\n * \"limit\": 5\n * }\n * \"x-lt-columns\": [ (optional)\n * { \"label\": \"Order\", \"value\": \"{{metadata.orderId}}\" },\n * { \"label\": \"Age\", \"value\": \"{{escalation.created_at}}\", \"format\": \"age\" }\n * ]\n * \"title\": \"List heading\"\n * \"description\": \"One-line instruction text\"\n * \"x-lt-actions\": [ (optional)\n * { \"label\": \"Bagged ✓\",\n * \"resolverPayload\": { \"approved\": true, \"checks\": { \"bagged\": true } },\n * \"confirm\": \"Bag {{metadata.orderId}}?\" }\n * ]\n *\n * Column `value` strings use the same `{{domain.path}}` token convention as\n * `x-lt-active.fields` and `x-lt-columns` in list schemas — tokens resolve\n * against each displayed escalation's own row context.\n *\n * When `x-lt-columns` is absent, falls back to three default columns:\n * description, role, age.\n *\n * Produces no resolver payload for the PARENT form and must not appear in\n * `required`. `x-lt-actions` buttons resolve the ROW through the standard\n * resolve endpoint — server-side RBAC and enforce_schema apply; a rejected\n * canned resolve surfaces its message inline and the row's detail link\n * remains the full-form path.\n */\nexport function EscalationListWidget({ fieldKey, schema, escalationContext }: WidgetProps) {\n const rawQuery = (schema?.['x-lt-query'] as EmbedQuery | undefined) ?? {};\n const columns = (schema?.['x-lt-columns'] as ColumnDef[] | undefined) ?? DEFAULT_COLUMNS;\n const actions = (schema?.['x-lt-actions'] as ActionDef[] | undefined) ?? [];\n const label = (schema?.title as string | undefined) ?? 'Related items';\n const helperText = schema?.description as string | undefined;\n\n const ctx = escalationContext ?? {};\n const { user } = useAuth();\n\n // ONE shared mapping (resolveScopedQuery) turns x-lt-query into concrete\n // escalation params — the same call x-lt-submit-guard makes, so the visible\n // rows and the guard's count evaluate the identical scope.\n const scoped = resolveScopedQuery(rawQuery, ctx, user?.userId);\n\n const { data, isLoading } = useEscalations({\n role: scoped.role,\n status: scoped.status,\n facets: scoped.facets,\n assigned_to: scoped.assigned_to,\n available: scoped.available,\n limit: scoped.limit ?? 5,\n enabled: scoped.enabled,\n include: schemaNeedsEnvelope({ columns, actions }) ? 'envelope' : undefined,\n });\n\n const escalations = data?.escalations ?? [];\n\n const resolve = useResolveEscalation();\n const [rowErrors, setRowErrors] = useState<Record<string, string>>({});\n const [pendingRow, setPendingRow] = useState<string | null>(null);\n\n const fireAction = async (esc: LTEscalationRecord, action: ActionDef) => {\n const rowCtx = rowContext(esc);\n if (action.confirm && !window.confirm(interpolateHelp(action.confirm, rowCtx))) return;\n setPendingRow(esc.id);\n setRowErrors((prev) => ({ ...prev, [esc.id]: '' }));\n try {\n await resolve.mutateAsync({\n id: esc.id,\n resolverPayload: interpolatePayload(action.resolverPayload, rowCtx) as Record<string, unknown>,\n });\n } catch (err) {\n setRowErrors((prev) => ({ ...prev, [esc.id]: (err as Error).message }));\n } finally {\n setPendingRow(null);\n }\n };\n\n return (\n <div data-field-key={fieldKey}>\n <FieldLabel>{label}</FieldLabel>\n {helperText && <FieldHelper>{helperText}</FieldHelper>}\n <div className=\"mt-1\" data-testid={`escalation-list-widget-${fieldKey}`}>\n {isLoading ? (\n <ListSkeleton columns={columns.length} />\n ) : (\n <EmbedTable\n escalations={escalations}\n columns={columns}\n fieldKey={fieldKey}\n actions={actions}\n onAction={fireAction}\n pendingRow={pendingRow}\n rowErrors={rowErrors}\n />\n )}\n </div>\n </div>\n );\n}\n\nfunction EmbedTable({\n escalations,\n columns,\n fieldKey,\n actions,\n onAction,\n pendingRow,\n rowErrors,\n}: {\n escalations: LTEscalationRecord[];\n columns: ColumnDef[];\n fieldKey: string;\n actions: ActionDef[];\n onAction: (esc: LTEscalationRecord, action: ActionDef) => void;\n pendingRow: string | null;\n rowErrors: Record<string, string>;\n}) {\n if (escalations.length === 0) {\n return (\n <p className=\"text-xs text-text-quaternary italic py-1\" data-testid={`escalation-list-empty-${fieldKey}`}>\n No items found\n </p>\n );\n }\n\n return (\n <table className=\"w-full text-xs border-collapse\" data-testid={`escalation-list-table-${fieldKey}`}>\n <thead>\n <tr className=\"border-b border-surface-border\">\n {columns.map((col) => (\n <th\n key={col.label}\n className=\"text-left text-2xs font-semibold uppercase tracking-wider text-text-tertiary pb-1 pr-3 last:pr-0\"\n >\n {col.label}\n </th>\n ))}\n {actions.length > 0 && <th className=\"w-px\" />}\n <th className=\"w-8\" />\n </tr>\n </thead>\n <tbody>\n {escalations.map((esc) => {\n const ctx = rowContext(esc);\n const error = rowErrors[esc.id];\n return (\n <tr\n key={esc.id}\n className=\"border-b border-surface-border/50 last:border-0 hover:bg-surface-sunken/50 transition-colors\"\n >\n {columns.map((col) => {\n const raw = interpolateHelp(col.value, ctx);\n const display = renderValue(raw, col.format);\n return (\n <td key={col.label} className=\"py-1 pr-3 last:pr-0 text-text-primary align-top\">\n {display}\n </td>\n );\n })}\n {actions.length > 0 && (\n <td className=\"py-1 pr-2 align-top whitespace-nowrap\">\n {actions.map((action) => (\n <button\n key={action.label}\n type=\"button\"\n onClick={() => onAction(esc, action)}\n disabled={pendingRow === esc.id}\n className=\"px-2 py-0.5 text-2xs font-medium text-accent border border-accent/40 rounded hover:bg-accent/10 disabled:opacity-40 disabled:cursor-default transition-colors ml-1 first:ml-0\"\n data-testid={`escalation-list-action-${esc.id}`}\n >\n {action.label}\n </button>\n ))}\n {error && (\n <p className=\"text-2xs text-status-error mt-0.5 whitespace-normal max-w-[16rem]\" data-testid={`escalation-list-action-error-${esc.id}`}>\n {error}\n </p>\n )}\n </td>\n )}\n <td className=\"py-1 pl-2 align-top\">\n <OpenDetailButton to={`/escalations/detail/${esc.id}`} />\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n\nfunction ListSkeleton({ columns }: { columns: number }) {\n return (\n <div className=\"space-y-1.5 animate-pulse\">\n {[0, 1, 2].map((i) => (\n <div key={i} className=\"flex gap-4\">\n {Array.from({ length: columns }, (_, j) => (\n <div key={j} className=\"h-3 bg-surface-sunken rounded flex-1\" />\n ))}\n </div>\n ))}\n </div>\n );\n}\n","import type { ComponentType } from 'react';\nimport { FileUploadWidget } from './FileUploadWidget';\nimport { CodeEditorWidget } from './CodeEditorWidget';\nimport { SignatureWidget } from './SignatureWidget';\nimport { RichTextWidget } from './RichTextWidget';\nimport { MarkdownWidget } from './MarkdownWidget';\nimport { ChecklistWidget } from './ChecklistWidget';\nimport { AttachmentWidget } from './AttachmentWidget';\nimport { LinkWidget } from './LinkWidget';\nimport { EscalationWidget } from './EscalationWidget';\nimport { EscalationListWidget } from './EscalationListWidget';\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 // Embed and navigation — display-only; produce no resolver payload.\n 'link': LinkWidget,\n 'escalation': EscalationWidget,\n 'escalation-list': EscalationListWidget,\n};\n","import { WIDGET_MAP } from '../widgets';\nimport { type ShowIfContext } from '../../../lib/x-lt-show-if';\nimport { resolveFieldOptions } from '../../../lib/x-lt-options';\nimport { deriveFieldLabel } from '../../../lib/derive-field-label';\nimport { FieldLabel, FieldHelper, FieldError, inputClass, selectClass } from './FieldChrome';\nimport { type JsonValue } from './form-cells';\n\n/**\n * Field row — renders the appropriate input per JSON type and schema hints.\n * The `data-field-key` attribute and `lt-field-*` ids are load-bearing: the\n * errors panel scroll-and-focus and the test suite target them.\n */\nexport function 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 fieldSchema = schema?.properties?.[fieldKey] as Record<string, any> | undefined;\n const label = deriveFieldLabel(fieldKey, fieldSchema);\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 // The instruction line renders on EVERY editable input, in one fixed\n // anatomy: label, instruction, control. No input goes without.\n const helperText = typeof fieldSchema?.description === 'string' && fieldSchema.description.length > 0\n ? fieldSchema.description\n : undefined;\n const hasHelper = helperText !== undefined;\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), a readOnly\n // attachment/image renders the captured binary, and embed widgets (link,\n // escalation, escalation-list) render their own display — never static text.\n const isMarkdown = widgetName === 'markdown' && typeof value === 'string';\n const isAttachment = (widgetName === 'attachment' || widgetName === 'image') && typeof value === 'string';\n const hasRegisteredWidget = !!(widgetName && widgetName in WIDGET_MAP);\n\n // Read-only fields display as static text, unless a widget handles the rendering.\n if (isReadOnly && !isMarkdown && !isAttachment && !hasRegisteredWidget) {\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 // The widget interface always deals in strings; FieldRow owns the\n // object ↔ string boundary, decided by the DECLARED type — never the\n // runtime value. An object-typed field (checklist) stores an object in\n // the form data on every change, so a stray string value (an old draft,\n // an empty init) heals on the next interaction instead of sticking.\n if (widgetName && widgetName in WIDGET_MAP) {\n const Widget = WIDGET_MAP[widgetName];\n // A require-all checklist is required by definition — its label carries\n // the asterisk like any other required input.\n const widgetRequired = isRequired || fieldSchema?.['x-lt-require-all'] === true;\n const widgetProps = { fieldKey, schema: fieldSchema, escalationContext, isRequired: widgetRequired, submitAttempted, error };\n if (fieldSchema?.type === 'object') {\n const raw = typeof value === 'string'\n ? value\n : typeof value === 'object' && value !== null && !Array.isArray(value)\n ? JSON.stringify(value)\n : '';\n return (\n <Widget\n {...widgetProps}\n value={raw}\n onChange={(next) => { try { onChange(JSON.parse(next) as JsonValue); } catch { onChange(next); } }}\n />\n );\n }\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 // Select — the option list is the schema's static enum, or the x-lt-options\n // list resolved from the escalation context (one static role form, per-row\n // legal options). Dispatched by SCHEMA, not runtime value: a number-typed\n // count seeded to its 0 default must render as a select, not a number input.\n // An interpolated list that resolves to nothing yet (a cascade child whose\n // parent is unanswered) renders as a DISABLED select — it enables and\n // populates the moment the parent answer lands.\n const selectOptions = resolveFieldOptions(fieldSchema, escalationContext as Record<string, unknown> | undefined);\n if (selectOptions && (value === null || typeof value === 'string' || typeof value === 'number')) {\n const current = value === null ? '' : String(value);\n // A value outside the option list (empty init, stale draft, options that\n // shrank per-row) renders an explicit disabled \"Choose…\" placeholder: the\n // decision is the user's, never an implicit first option. Once chosen\n // there is no way back to unchosen.\n const hasCurrent = selectOptions.some((opt) => String(opt.value) === current);\n return (\n <div>\n <FieldLabel isRequired={isRequired} htmlFor={fieldId}>{label}</FieldLabel>\n {helperText && <FieldHelper id={helpId}>{helperText}</FieldHelper>}\n <select\n value={hasCurrent ? current : ''}\n disabled={selectOptions.length === 0}\n onChange={(e) => {\n // The submitted answer is the option VALUE (labels are\n // presentation), emitted with its own type so a numeric option\n // stays a number.\n const picked = selectOptions.find((opt) => String(opt.value) === e.target.value);\n onChange(picked ? picked.value : e.target.value);\n }}\n onBlur={onBlur}\n data-field-key={fieldKey}\n className={selectClass(!!error)}\n {...ariaProps}\n >\n {!hasCurrent && <option value=\"\" disabled>Choose…</option>}\n {selectOptions.map((opt) => (\n <option key={String(opt.value)} value={String(opt.value)}>{opt.label}</option>\n ))}\n </select>\n <FieldError error={error} id={errorId} />\n </div>\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-2xs 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 {helperText && <FieldHelper id={helpId}>{helperText}</FieldHelper>}\n <FieldError error={error} id={errorId} />\n </div>\n );\n }\n\n // Number — numbers are short; the input holds a hand-sized width instead\n // of stretching to the measure.\n if (typeof value === 'number') {\n return (\n <div>\n <FieldLabel isRequired={isRequired} htmlFor={fieldId}>{label}</FieldLabel>\n {helperText && <FieldHelper id={helpId}>{helperText}</FieldHelper>}\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)} max-w-48`}\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\n if (isPassword) {\n return (\n <div>\n <FieldLabel isRequired={isRequired} htmlFor={fieldId}>{label}</FieldLabel>\n {helperText && <FieldHelper id={helpId}>{helperText}</FieldHelper>}\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. Width follows the content the format expects:\n // emails and urls are prose-length and fill the cell; dates are fixed-\n // length values and hold a hand-sized width, like numbers.\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 const FORMAT_WIDTH: Record<string, string> = {\n date: 'max-w-48',\n 'date-time': 'max-w-64',\n };\n if (format && format in FORMAT_INPUT_TYPES) {\n return (\n <div>\n <FieldLabel isRequired={isRequired} htmlFor={fieldId}>{label}</FieldLabel>\n {helperText && <FieldHelper id={helpId}>{helperText}</FieldHelper>}\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)} ${FORMAT_WIDTH[format] ?? ''}`}\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 && <FieldHelper id={helpId}>{helperText}</FieldHelper>}\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-2xs 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 && <FieldHelper id={helpId}>{helperText}</FieldHelper>}\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-2xs 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","import { Fragment } from 'react';\nimport { type JsonValue } from './form-cells';\n\nexport interface DictionaryItem {\n key: string;\n label: string;\n value: JsonValue;\n}\n\n/**\n * Dense definition-list display for read-only label/value facts — the compact\n * alternative to full-height field rows. Labels sit beside values in a\n * max-content column so a run of short facts reads like a spec sheet, not a\n * form.\n *\n * The poster child of the responsive doctrine: geometry follows the\n * CONTAINER. The same pairs render as two pairs per row (≥ @dict-pairs),\n * one label|value pair per row (≥ @dict-inline), or label stacked over\n * value below that — however narrow a side panel squeezes the form.\n * Two-column mode fills ROW BY ROW, so the author's ordering controls\n * pairing (Left Qty beside Right Qty, Left first) in every geometry.\n */\nexport function DictionaryList({ items, columns = 1 }: {\n items: DictionaryItem[];\n columns?: number;\n}) {\n if (items.length === 0) return null;\n\n const gridCols = columns >= 2 && items.length > 1\n ? 'grid-cols-1 @dict-inline:grid-cols-[max-content_1fr] @dict-pairs:grid-cols-[max-content_1fr_max-content_1fr]'\n : 'grid-cols-1 @dict-inline:grid-cols-[max-content_1fr]';\n\n return (\n <div className=\"@container\">\n <dl className={`grid ${gridCols} items-baseline gap-x-6 @dict-pairs:gap-x-8 gap-y-1.5`}>\n {items.map(({ key, label, value }) => (\n <Fragment key={key}>\n {/* Stacked geometry clusters each label with its value. */}\n <dt className=\"text-2xs font-semibold uppercase tracking-wide text-text-secondary mt-2 first:mt-0 @dict-inline:mt-0\">\n {label}\n </dt>\n <dd className=\"text-sm text-text-primary break-words min-w-0\" data-field-key={key}>\n {formatDictionaryValue(value)}\n </dd>\n </Fragment>\n ))}\n </dl>\n </div>\n );\n}\n\nfunction formatDictionaryValue(value: JsonValue): string {\n if (value === null || value === undefined || value === '') return '—';\n if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n","/**\n * Layout cell partitioning for the schema-driven resolver form.\n *\n * A section's fields render as a sequence of cells:\n * - `dictionary` — consecutive read-only facts merged into one dense\n * definition list (`x-lt-display: \"dictionary\"` at field, section, or\n * schema level)\n * - `column-group` — consecutive fields sharing an `x-lt-column-group` name,\n * rendered as an inner two-column grid inside one cell of a two-column\n * layout (the 2×2 nesting level)\n * - `field` — everything else, one input per cell\n */\n\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nexport type FormEntry = [string, JsonValue];\n\nexport interface SectionOptions {\n display?: string;\n columns?: number;\n}\n\nexport type FormCell =\n | { kind: 'field'; entry: FormEntry }\n | { kind: 'dictionary'; entries: FormEntry[] }\n | { kind: 'column-group'; name: string; entries: FormEntry[] };\n\nconst DICTIONARY = 'dictionary';\n\n/** Widgets that render content blocks even when readOnly — never dictionary rows. */\nconst CONTENT_WIDGETS = new Set(['markdown', 'attachment', 'image']);\n\nexport function sectionOptionsFor(\n formSchema: Record<string, any> | null | undefined,\n sectionName: string | null,\n): SectionOptions | undefined {\n if (!sectionName) return undefined;\n const all = formSchema?.['x-lt-section-options'] as Record<string, SectionOptions> | undefined;\n const opts = all?.[sectionName];\n return opts && typeof opts === 'object' ? opts : undefined;\n}\n\n/**\n * A field renders as a dictionary row when it is read-only, is not a content\n * widget, and dictionary display is requested at the nearest level:\n * field `x-lt-display` > section options > schema-root `x-lt-display`.\n */\nexport function isDictionaryField(\n formSchema: Record<string, any> | null | undefined,\n sectionName: string | null,\n key: string,\n): boolean {\n const fieldSchema = formSchema?.properties?.[key] as Record<string, unknown> | undefined;\n if (fieldSchema?.readOnly !== true) return false;\n const widget = fieldSchema?.['x-lt-widget'];\n if (typeof widget === 'string' && CONTENT_WIDGETS.has(widget)) return false;\n\n const fieldDisplay = fieldSchema?.['x-lt-display'];\n if (typeof fieldDisplay === 'string') return fieldDisplay === DICTIONARY;\n const sectionDisplay = sectionOptionsFor(formSchema, sectionName)?.display;\n if (typeof sectionDisplay === 'string') return sectionDisplay === DICTIONARY;\n return formSchema?.['x-lt-display'] === DICTIONARY;\n}\n\nexport function partitionCells(\n entries: FormEntry[],\n formSchema: Record<string, any> | null | undefined,\n sectionName: string | null,\n layout: string | undefined,\n): FormCell[] {\n const cells: FormCell[] = [];\n for (const entry of entries) {\n const [key] = entry;\n const last = cells[cells.length - 1];\n\n if (isDictionaryField(formSchema, sectionName, key)) {\n if (last?.kind === 'dictionary') {\n last.entries.push(entry);\n } else {\n cells.push({ kind: 'dictionary', entries: [entry] });\n }\n continue;\n }\n\n const fieldSchema = formSchema?.properties?.[key] as Record<string, unknown> | undefined;\n const groupName = fieldSchema?.['x-lt-column-group'];\n if (layout === 'two-column' && typeof groupName === 'string' && groupName.trim()) {\n if (last?.kind === 'column-group' && last.name === groupName) {\n last.entries.push(entry);\n } else {\n cells.push({ kind: 'column-group', name: groupName, entries: [entry] });\n }\n continue;\n }\n\n cells.push({ kind: 'field', entry });\n }\n return cells;\n}\n","import { type ReactNode } from 'react';\nimport { deriveFieldLabel } from '../../../lib/derive-field-label';\nimport { DictionaryList } from './DictionaryList';\nimport {\n partitionCells,\n sectionOptionsFor,\n type FormEntry,\n type JsonValue,\n} from './form-cells';\n\n/**\n * One visual section of the resolver form: optional named chrome (accent rule,\n * sunken band, section header), then the section's fields laid out as cells —\n * dictionary runs, 2×2 column groups, and single fields.\n */\nexport function SectionGroup({ name, entries, formSchema, layout, renderField }: {\n name: string | null;\n entries: FormEntry[];\n formSchema: Record<string, any> | null;\n layout: string | undefined;\n renderField: (entry: FormEntry) => ReactNode;\n}) {\n const cells = partitionCells(entries, formSchema, name, layout);\n const options = sectionOptionsFor(formSchema, name);\n const dictionaryColumns = options?.columns ?? (layout === 'two-column' ? 2 : 1);\n\n const dictionaryItems = (dictEntries: FormEntry[]) =>\n dictEntries.map(([key, value]: [string, JsonValue]) => ({\n key,\n label: deriveFieldLabel(key, formSchema?.properties?.[key] as Record<string, unknown> | undefined),\n value,\n }));\n\n const renderCells = () =>\n cells.map((cell, i) => {\n if (cell.kind === 'dictionary') {\n return (\n <div key={`dict-${i}`} className={layout === 'two-column' ? 'col-span-full' : ''}>\n <DictionaryList items={dictionaryItems(cell.entries)} columns={dictionaryColumns} />\n </div>\n );\n }\n if (cell.kind === 'column-group') {\n // One cell of the outer two-column grid holding its own two columns —\n // the single extra nesting level (2×2). The cell is its own container:\n // it measures the half-width it actually gets, not the section.\n return (\n <div key={`group-${cell.name}-${i}`} className=\"@container\">\n <div className=\"grid grid-cols-1 @grp-cols:grid-cols-2 gap-x-4 gap-y-5\">\n {cell.entries.map((entry) => renderField(entry))}\n </div>\n </div>\n );\n }\n return renderField(cell.entry);\n });\n\n return (\n <div\n className={name\n // Sections are distinct surfaces on the page wash — white paper in\n // light themes, the deeper well at night — with field wells stepping\n // away from them. Theme-driven, never a hardcoded hex.\n ? 'border border-surface-border bg-surface-sunken rounded-[var(--lt-radius-section)] p-4 animate-[section-enter_0.25s_ease-out]'\n : ''}\n >\n {name && (\n <p className=\"mb-4 text-[1.40625rem] font-semibold tracking-wider text-heading [font-variant-caps:small-caps]\">\n {name}\n </p>\n )}\n {layout === 'two-column' ? (\n // Geometry follows the container: the grid splits when the SECTION\n // is wide enough, whatever the viewport says.\n <div className=\"@container\">\n <div className=\"grid grid-cols-1 @form-cols:grid-cols-2 gap-x-col-gap gap-y-5\">\n {renderCells()}\n </div>\n </div>\n ) : (\n <div className=\"space-y-5\">\n {renderCells()}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect, useCallback, type ReactNode } from 'react';\nimport { LockedFormFrame } from './LockedFormFrame';\nimport { HelpCircle } from 'lucide-react';\nimport { evaluateShowIf, type ShowIfContext } from '../../../lib/x-lt-show-if';\nimport { validateField } from '../../../lib/field-validator';\nimport { FieldRow } from './FieldRow';\nimport { SectionGroup } from './SectionGroup';\nimport { type FormEntry, type JsonValue } from './form-cells';\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, onOpenHelp, onDisabledClick, disabledHint }: {\n value: string;\n onChange: (json: string) => void;\n disabled?: boolean;\n submitAttempted?: boolean;\n escalationContext?: ShowIfContext;\n /** Opens the Instructions panel view; renders a help icon when the schema carries authored help. */\n onOpenHelp?: () => void;\n /** Fires when the user clicks the locked form — the page points them at Claim. */\n onDisabledClick?: () => void;\n /** Cursor-following hint over the locked form naming the state or gesture. */\n disabledHint?: ReactNode;\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>, input: 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 const hasAuthoredHelp =\n typeof formSchema?.['x-lt-help'] === 'string' || typeof formSchema?.['x-lt-context'] === 'string';\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 Section = { name: string | null; entries: FormEntry[] };\n const sectionGroups: Section[] = [];\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 renderField = ([key, val]: FormEntry) => {\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-full' : ''}`}\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 // A locked form stays fully readable — no fade. `inert` (not just\n // pointer-events) locks the body for keyboard and assistive-tech users —\n // fields leave the tab order entirely — and makes it transparent to hit\n // testing, so a click anywhere on the locked form lands on the frame,\n // which reports the interaction and carries the cursor hint.\n // max-w-form: the form holds a readable measure on any monitor.\n const body = (\n <div\n className={disabled ? 'pointer-events-none' : undefined}\n inert={disabled || undefined}\n aria-disabled={disabled || undefined}\n >\n {schemaTitle && (\n <div className=\"mb-1 flex items-center gap-1.5\">\n <h3 className=\"heading-3\">{schemaTitle}</h3>\n {hasAuthoredHelp && onOpenHelp && (\n <button\n type=\"button\"\n onClick={onOpenHelp}\n title=\"Open instructions\"\n aria-label=\"Open instructions\"\n className=\"p-1 rounded-md text-text-tertiary hover:text-accent hover:bg-surface-hover transition-colors\"\n >\n <HelpCircle className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n )}\n </div>\n )}\n {schemaDescription && (\n <p className=\"text-sm text-text-secondary leading-relaxed mb-6\">{schemaDescription}</p>\n )}\n\n <div className=\"space-y-8\">\n {sectionGroups.map((group, i) => (\n <SectionGroup\n key={group.name ?? `__s${i}`}\n name={group.name}\n entries={group.entries}\n formSchema={formSchema}\n layout={layout}\n renderField={renderField}\n />\n ))}\n </div>\n </div>\n );\n\n if (disabled) {\n return (\n <LockedFormFrame hint={disabledHint} onLockedClick={onDisabledClick}>\n {body}\n </LockedFormFrame>\n );\n }\n return <div className=\"pb-8 max-w-form\">{body}</div>;\n}\n"],"names":["deriveFieldLabel","key","fieldSchema","title","words","w","isCapsToken","word","INTERPOLATION_PATTERN","hasInterpolation","token","resolveCtxPath","path","ctx","dot","root","getDeep","interpolatePath","template","unresolved","concrete","_match","rawPath","value","X_LT_OPTIONS","isScalar","v","toOption","entry","o","resolveFieldOptions","staticEnum","paths","p","miss","sourcePath","resolved","cur","options","resolveChecklistItems","source","X_LT_DEFAULT_CHECKED","resolveChecklistDefault","currentValue","items","validateRequireAll","mandatory","i","state","incomplete","validateFieldType","declared","validateFieldConstraints","allowed","s","minLength","resolveNumericConstraint","maxLength","pattern","fmt","minimum","exclusiveMinimum","maximum","exclusiveMaximum","staticVal","dynamicPath","domain","domainObj","parts","n","validateField","isRequired","isTouched","vals","typeError","requireAll","isTruthy","asComparable","resolvePath","expr","HELP_DOMAINS","evaluateShowIf","condition","c","negate","neqAt","eqAt","isNeq","opAt","expected","known","matches","result","HINT_MS","LockedFormFrame","hint","onLockedClick","children","hintAt","setHintAt","useState","useEffect","timer","handleClick","e","x","prev","jsxs","jsx","Lock","FieldLabel","htmlFor","FieldHelper","id","FieldError","error","inputClass","hasError","selectClass","FileUploadWidget","fieldKey","onChange","schema","inputRef","useRef","accept","label","helperText","handleFile","useCallback","file","_a","reader","hasFile","CodeEditorWidget","language","handleKeyDown","target","start","end","updated","SignatureWidget","canvasRef","isDrawing","setIsDrawing","canvas","img","getPos","rect","scaleX","scaleY","startDraw","pos","draw","endDraw","clear","RichTextWidget","MarkdownWidget","tab","setTab","MarkdownRenderer","t","CHIP_LABEL_MAX","ChecklistWidget","escalationContext","submitAttempted","defaultJson","d","toggle","Fragment","explicitVariant","variant","checkedCount","item","focusId","checked","showItemError","Check","IMAGE_EXT","classify","dataMime","_b","ext","_d","_c","AttachmentWidget","expanded","setExpanded","att","head","Paperclip","Download","ExternalLink","LinkWidget","hrefTemplate","href","interpolateHelp","isInternal","isEmpty","Link","OpenDetailButton","to","className","ArrowUpRight","EM_DASH","resolveSourceId","renderFieldValue","raw","format","formatAgoCompact","EscalationWidget","fields","esc","isLoading","isError","useEscalation","EscalationCardSkeleton","EscalationCard","rowContext","StatusBadge","f","display","resolveQueryFacets","facets","k","resolveScopedQuery","query","viewerId","base","DEFAULT_COLUMNS","renderValue","interpolatePayload","EscalationListWidget","rawQuery","columns","actions","user","useAuth","scoped","data","useEscalations","schemaNeedsEnvelope","escalations","resolve","useResolveEscalation","rowErrors","setRowErrors","pendingRow","setPendingRow","fireAction","action","rowCtx","err","ListSkeleton","EmbedTable","onAction","col","_","j","WIDGET_MAP","FieldRow","onBlur","isReadOnly","widgetName","fieldId","errorId","helpId","ariaProps","isMarkdown","isAttachment","hasRegisteredWidget","displayValue","Widget","widgetRequired","widgetProps","next","selectOptions","current","hasCurrent","opt","picked","FORMAT_INPUT_TYPES","FORMAT_WIDTH","staticMax","dynamicMaxPath","resolvedMax","isOverMax","entries","DictionaryList","gridCols","formatDictionaryValue","DICTIONARY","CONTENT_WIDGETS","sectionOptionsFor","formSchema","sectionName","all","opts","isDictionaryField","widget","fieldDisplay","sectionDisplay","partitionCells","layout","cells","last","groupName","SectionGroup","name","renderField","dictionaryColumns","dictionaryItems","dictEntries","renderCells","cell","ResolverForm","disabled","onOpenHelp","onDisabledClick","disabledHint","setData","hidden","setHidden","setFormSchema","parseError","setParseError","touched","setTouched","parsed","visible","internal","emitChange","updateField","val","markTouched","allEntries","fieldOrder","ordered","a","b","ai","bi","liveCtx","requiredFields","schemaTitle","schemaDescription","hasAuthoredHelp","sectionGroups","span","isReq","body","HelpCircle","group"],"mappings":"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"}