@hotmeshio/long-tail 0.31.0 → 0.32.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 (326) hide show
  1. package/build/api/escalations/create.js +17 -6
  2. package/build/api/escalations/files.d.ts +18 -0
  3. package/build/api/escalations/files.js +73 -0
  4. package/build/api/escalations/index.d.ts +1 -0
  5. package/build/api/escalations/index.js +4 -2
  6. package/build/api/escalations/metadata.js +5 -4
  7. package/build/api/escalations/resolve.js +6 -4
  8. package/build/bin/ltc.js +4 -2
  9. package/build/index.d.ts +2 -0
  10. package/build/index.js +13 -2
  11. package/build/lib/cli/commands/escalations.d.ts +2 -0
  12. package/build/lib/cli/commands/escalations.js +12 -4
  13. package/build/lib/storage/s3.js +1 -0
  14. package/build/modules/config.d.ts +9 -0
  15. package/build/modules/config.js +9 -0
  16. package/build/routes/escalations/single.js +11 -0
  17. package/build/scripts/bambu-boat.d.ts +4 -2
  18. package/build/scripts/bambu-boat.js +4 -2
  19. package/build/scripts/bambu-print.d.ts +2 -1
  20. package/build/scripts/bambu-print.js +7 -3
  21. package/build/scripts/machine-line.js +2 -1
  22. package/build/sdk/index.d.ts +4 -0
  23. package/build/sdk/index.js +2 -0
  24. package/build/services/escalation/aggregate-resolved-sql.d.ts +19 -0
  25. package/build/services/escalation/aggregate-resolved-sql.js +57 -0
  26. package/build/services/escalation/aggregate-sql.d.ts +6 -1
  27. package/build/services/escalation/aggregate-sql.js +33 -12
  28. package/build/services/escalation/aggregate-validate.d.ts +5 -2
  29. package/build/services/escalation/aggregate-validate.js +7 -4
  30. package/build/services/escalation/aggregates.js +5 -3
  31. package/build/services/escalation/crud.js +3 -0
  32. package/build/services/escalation/file-links.d.ts +39 -0
  33. package/build/services/escalation/file-links.js +118 -0
  34. package/build/services/escalation/resolver-validation.d.ts +33 -0
  35. package/build/services/escalation/resolver-validation.js +22 -6
  36. package/build/services/orchestrator/condition.d.ts +20 -4
  37. package/build/services/orchestrator/condition.js +27 -8
  38. package/build/shared/form-validation/display-only-widgets.d.ts +3 -2
  39. package/build/shared/form-validation/display-only-widgets.js +3 -2
  40. package/build/shared/form-validation/index.d.ts +2 -0
  41. package/build/shared/form-validation/index.js +2 -0
  42. package/build/shared/form-validation/x-lt-confidence-facets.d.ts +27 -0
  43. package/build/shared/form-validation/x-lt-confidence-facets.js +60 -0
  44. package/build/shared/form-validation/x-lt-confidence.d.ts +57 -0
  45. package/build/shared/form-validation/x-lt-confidence.js +177 -0
  46. package/build/shared/form-validation/x-lt-help.d.ts +1 -1
  47. package/build/shared/form-validation/x-lt-help.js +1 -1
  48. package/build/system/mcp-servers/admin/escalations.js +4 -2
  49. package/build/system/mcp-servers/admin/labels-schemas.d.ts +4 -4
  50. package/build/system/mcp-servers/admin/schemas.d.ts +111 -70
  51. package/build/system/mcp-servers/admin/schemas.js +8 -3
  52. package/build/system/mcp-servers/human-queue-files.d.ts +8 -0
  53. package/build/system/mcp-servers/human-queue-files.js +32 -0
  54. package/build/system/mcp-servers/human-queue-schemas.d.ts +7 -0
  55. package/build/system/mcp-servers/human-queue-schemas.js +4 -1
  56. package/build/system/mcp-servers/human-queue.d.ts +1 -0
  57. package/build/system/mcp-servers/human-queue.js +23 -16
  58. package/build/system/seed/tool-manifests-admin.js +1 -1
  59. package/build/system/seed/tool-manifests-escalation.js +13 -0
  60. package/build/tsconfig.tsbuildinfo +1 -1
  61. package/build/types/analytics.d.ts +14 -3
  62. package/build/types/analytics.js +3 -1
  63. package/build/types/escalation.d.ts +34 -0
  64. package/build/types/escalation.js +72 -1
  65. package/build/types/index.d.ts +4 -4
  66. package/build/types/index.js +5 -1
  67. package/dashboard/dist/assets/{AdminDashboard-BafKaq50.js → AdminDashboard-C25co77C.js} +2 -2
  68. package/dashboard/dist/assets/{AdminDashboard-BafKaq50.js.map → AdminDashboard-C25co77C.js.map} +1 -1
  69. package/dashboard/dist/assets/{AgentConfigPage-CFHf31DT.js → AgentConfigPage-CsCpI15j.js} +5 -5
  70. package/dashboard/dist/assets/{AgentConfigPage-CFHf31DT.js.map → AgentConfigPage-CsCpI15j.js.map} +1 -1
  71. package/dashboard/dist/assets/{AgentDetailPage-CEvz5rJr.js → AgentDetailPage-ByaepsB5.js} +3 -3
  72. package/dashboard/dist/assets/{AgentDetailPage-CEvz5rJr.js.map → AgentDetailPage-ByaepsB5.js.map} +1 -1
  73. package/dashboard/dist/assets/{AgentsPage-DjQaio0O.js → AgentsPage-ByHU42SO.js} +2 -2
  74. package/dashboard/dist/assets/{AgentsPage-DjQaio0O.js.map → AgentsPage-ByHU42SO.js.map} +1 -1
  75. package/dashboard/dist/assets/{AvailableEscalationsPage-UB03VTJx.js → AvailableEscalationsPage--o6qcz7-.js} +2 -2
  76. package/dashboard/dist/assets/{AvailableEscalationsPage-UB03VTJx.js.map → AvailableEscalationsPage--o6qcz7-.js.map} +1 -1
  77. package/dashboard/dist/assets/{BotPicker-C7MNWOF7.js → BotPicker-B3y3H3fs.js} +2 -2
  78. package/dashboard/dist/assets/{BotPicker-C7MNWOF7.js.map → BotPicker-B3y3H3fs.js.map} +1 -1
  79. package/dashboard/dist/assets/{BulkAssignModal-h5fX-_cV.js → BulkAssignModal-DMNIkIn6.js} +2 -2
  80. package/dashboard/dist/assets/{BulkAssignModal-h5fX-_cV.js.map → BulkAssignModal-DMNIkIn6.js.map} +1 -1
  81. package/dashboard/dist/assets/{CapabilitiesPage-BIzDl-ZT.js → CapabilitiesPage-BekfKHlk.js} +2 -2
  82. package/dashboard/dist/assets/{CapabilitiesPage-BIzDl-ZT.js.map → CapabilitiesPage-BekfKHlk.js.map} +1 -1
  83. package/dashboard/dist/assets/{CollapsibleSection-B5TivtEg.js → CollapsibleSection-BAteHgBG.js} +2 -2
  84. package/dashboard/dist/assets/{CollapsibleSection-B5TivtEg.js.map → CollapsibleSection-BAteHgBG.js.map} +1 -1
  85. package/dashboard/dist/assets/{ConfirmDeleteModal-CB4nKePb.js → ConfirmDeleteModal-BNY287W9.js} +2 -2
  86. package/dashboard/dist/assets/{ConfirmDeleteModal-CB4nKePb.js.map → ConfirmDeleteModal-BNY287W9.js.map} +1 -1
  87. package/dashboard/dist/assets/{ConnectedAppsPage-B3S5gVWw.js → ConnectedAppsPage-LLiiH3da.js} +2 -2
  88. package/dashboard/dist/assets/{ConnectedAppsPage-B3S5gVWw.js.map → ConnectedAppsPage-LLiiH3da.js.map} +1 -1
  89. package/dashboard/dist/assets/{CountdownTimer-BHVIq3kA.js → CountdownTimer-DBLURjxh.js} +2 -2
  90. package/dashboard/dist/assets/{CountdownTimer-BHVIq3kA.js.map → CountdownTimer-DBLURjxh.js.map} +1 -1
  91. package/dashboard/dist/assets/{CredentialConfirmModal-w0AGmCIe.js → CredentialConfirmModal-BqpY3yen.js} +2 -2
  92. package/dashboard/dist/assets/{CredentialConfirmModal-w0AGmCIe.js.map → CredentialConfirmModal-BqpY3yen.js.map} +1 -1
  93. package/dashboard/dist/assets/{CredentialsPage-BtCGBJrT.js → CredentialsPage-CW3_dbm2.js} +2 -2
  94. package/dashboard/dist/assets/{CredentialsPage-BtCGBJrT.js.map → CredentialsPage-CW3_dbm2.js.map} +1 -1
  95. package/dashboard/dist/assets/{CronLabel-BG1rZK-5.js → CronLabel-CR6DiZZr.js} +2 -2
  96. package/dashboard/dist/assets/{CronLabel-BG1rZK-5.js.map → CronLabel-CR6DiZZr.js.map} +1 -1
  97. package/dashboard/dist/assets/{DataTable-FjFhx0SE.js → DataTable-C-IlbLhY.js} +2 -2
  98. package/dashboard/dist/assets/{DataTable-FjFhx0SE.js.map → DataTable-C-IlbLhY.js.map} +1 -1
  99. package/dashboard/dist/assets/{DropZone-D8ZVdEb5.js → DropZone-CHmz59w4.js} +2 -2
  100. package/dashboard/dist/assets/{DropZone-D8ZVdEb5.js.map → DropZone-CHmz59w4.js.map} +1 -1
  101. package/dashboard/dist/assets/{ElapsedCell-l4m8Yvfv.js → ElapsedCell-CEapQvgU.js} +2 -2
  102. package/dashboard/dist/assets/{ElapsedCell-l4m8Yvfv.js.map → ElapsedCell-CEapQvgU.js.map} +1 -1
  103. package/dashboard/dist/assets/{EntityTimelinePanel-BOHlIaxF.js → EntityTimelinePanel-DqD_BpJM.js} +2 -2
  104. package/dashboard/dist/assets/{EntityTimelinePanel-BOHlIaxF.js.map → EntityTimelinePanel-DqD_BpJM.js.map} +1 -1
  105. package/dashboard/dist/assets/{EscalationListSchemaPage-BotlwlX3.js → EscalationListSchemaPage-DDKcrVbb.js} +3 -3
  106. package/dashboard/dist/assets/{EscalationListSchemaPage-BotlwlX3.js.map → EscalationListSchemaPage-DDKcrVbb.js.map} +1 -1
  107. package/dashboard/dist/assets/{EscalationSchemaPage-CfZSVOSD.js → EscalationSchemaPage-BZHZfJiQ.js} +3 -3
  108. package/dashboard/dist/assets/{EscalationSchemaPage-CfZSVOSD.js.map → EscalationSchemaPage-BZHZfJiQ.js.map} +1 -1
  109. package/dashboard/dist/assets/{EscalationTimeline-CCKpuRBU.js → EscalationTimeline-Dv0XUgQX.js} +2 -2
  110. package/dashboard/dist/assets/{EscalationTimeline-CCKpuRBU.js.map → EscalationTimeline-Dv0XUgQX.js.map} +1 -1
  111. package/dashboard/dist/assets/{EscalationTitleSelect-cpTzPHiW.js → EscalationTitleSelect-BN7D52wT.js} +2 -2
  112. package/dashboard/dist/assets/{EscalationTitleSelect-cpTzPHiW.js.map → EscalationTitleSelect-BN7D52wT.js.map} +1 -1
  113. package/dashboard/dist/assets/{EscalationsOverview-DS-nK0qV.js → EscalationsOverview-DE6EPkhT.js} +2 -2
  114. package/dashboard/dist/assets/{EscalationsOverview-DS-nK0qV.js.map → EscalationsOverview-DE6EPkhT.js.map} +1 -1
  115. package/dashboard/dist/assets/{EventTable-UfebhJf0.js → EventTable-CiV62txY.js} +2 -2
  116. package/dashboard/dist/assets/{EventTable-UfebhJf0.js.map → EventTable-CiV62txY.js.map} +1 -1
  117. package/dashboard/dist/assets/{FilterBar-newA5l-X.js → FilterBar-WyNQPyQ1.js} +2 -2
  118. package/dashboard/dist/assets/{FilterBar-newA5l-X.js.map → FilterBar-WyNQPyQ1.js.map} +1 -1
  119. package/dashboard/dist/assets/{GraphInvokePage-6SCDyQcK.js → GraphInvokePage--gn48yUD.js} +2 -2
  120. package/dashboard/dist/assets/{GraphInvokePage-6SCDyQcK.js.map → GraphInvokePage--gn48yUD.js.map} +1 -1
  121. package/dashboard/dist/assets/{HomePage-BEc-XdKj.js → HomePage-IR_jgBE8.js} +2 -2
  122. package/dashboard/dist/assets/{HomePage-BEc-XdKj.js.map → HomePage-IR_jgBE8.js.map} +1 -1
  123. package/dashboard/dist/assets/{LabelJobsPage-BO50zXT5.js → LabelJobsPage-C8LSts4O.js} +2 -2
  124. package/dashboard/dist/assets/{LabelJobsPage-BO50zXT5.js.map → LabelJobsPage-C8LSts4O.js.map} +1 -1
  125. package/dashboard/dist/assets/{LinePage-NYxJQ-ex.js → LinePage-CS7uUv00.js} +2 -2
  126. package/dashboard/dist/assets/{LinePage-NYxJQ-ex.js.map → LinePage-CS7uUv00.js.map} +1 -1
  127. package/dashboard/dist/assets/{LinesPage-RbWTaQRh.js → LinesPage-CJprjG39.js} +3 -3
  128. package/dashboard/dist/assets/{LinesPage-RbWTaQRh.js.map → LinesPage-CJprjG39.js.map} +1 -1
  129. package/dashboard/dist/assets/{ListToolbar-B-E9-toh.js → ListToolbar-YP3uwvXC.js} +2 -2
  130. package/dashboard/dist/assets/{ListToolbar-B-E9-toh.js.map → ListToolbar-YP3uwvXC.js.map} +1 -1
  131. package/dashboard/dist/assets/{McpOverview-Shcf9QhZ.js → McpOverview-Ce-m2JON.js} +2 -2
  132. package/dashboard/dist/assets/{McpOverview-Shcf9QhZ.js.map → McpOverview-Ce-m2JON.js.map} +1 -1
  133. package/dashboard/dist/assets/{McpQueryDetailPage-D8kmjy2v.js → McpQueryDetailPage-CtnUqO1v.js} +2 -2
  134. package/dashboard/dist/assets/{McpQueryDetailPage-D8kmjy2v.js.map → McpQueryDetailPage-CtnUqO1v.js.map} +1 -1
  135. package/dashboard/dist/assets/{McpQueryPage-ck-o5m8A.js → McpQueryPage-C-lqUPlg.js} +2 -2
  136. package/dashboard/dist/assets/{McpQueryPage-ck-o5m8A.js.map → McpQueryPage-C-lqUPlg.js.map} +1 -1
  137. package/dashboard/dist/assets/{McpRunDetailPage-BJKkM9-3.js → McpRunDetailPage-MnIe0hwz.js} +2 -2
  138. package/dashboard/dist/assets/{McpRunDetailPage-BJKkM9-3.js.map → McpRunDetailPage-MnIe0hwz.js.map} +1 -1
  139. package/dashboard/dist/assets/{McpRunsPage-DqhHfD5G.js → McpRunsPage-CpYLXVPF.js} +2 -2
  140. package/dashboard/dist/assets/{McpRunsPage-DqhHfD5G.js.map → McpRunsPage-CpYLXVPF.js.map} +1 -1
  141. package/dashboard/dist/assets/{NamespacePill--uIaGtrN.js → NamespacePill-DilSgLyE.js} +2 -2
  142. package/dashboard/dist/assets/{NamespacePill--uIaGtrN.js.map → NamespacePill-DilSgLyE.js.map} +1 -1
  143. package/dashboard/dist/assets/{OperationsPage-D6B9Vv__.js → OperationsPage-xe6bAwaq.js} +2 -2
  144. package/dashboard/dist/assets/{OperationsPage-D6B9Vv__.js.map → OperationsPage-xe6bAwaq.js.map} +1 -1
  145. package/dashboard/dist/assets/{OperatorDashboard-CIH1cxjQ.js → OperatorDashboard-Cm9_C0EP.js} +2 -2
  146. package/dashboard/dist/assets/{OperatorDashboard-CIH1cxjQ.js.map → OperatorDashboard-Cm9_C0EP.js.map} +1 -1
  147. package/dashboard/dist/assets/{PageHeader-DClJ33fV.js → PageHeader-B7SOvLT8.js} +2 -2
  148. package/dashboard/dist/assets/{PageHeader-DClJ33fV.js.map → PageHeader-B7SOvLT8.js.map} +1 -1
  149. package/dashboard/dist/assets/{PageHeaderWithStats-C-TrbKQL.js → PageHeaderWithStats-DWKap7gs.js} +2 -2
  150. package/dashboard/dist/assets/{PageHeaderWithStats-C-TrbKQL.js.map → PageHeaderWithStats-DWKap7gs.js.map} +1 -1
  151. package/dashboard/dist/assets/{PersonaDetailPage-DjvfyIph.js → PersonaDetailPage-CvstNkh3.js} +2 -2
  152. package/dashboard/dist/assets/{PersonaDetailPage-DjvfyIph.js.map → PersonaDetailPage-CvstNkh3.js.map} +1 -1
  153. package/dashboard/dist/assets/{PersonasPage-D7ryA8Vc.js → PersonasPage-ba1KeInW.js} +2 -2
  154. package/dashboard/dist/assets/{PersonasPage-D7ryA8Vc.js.map → PersonasPage-ba1KeInW.js.map} +1 -1
  155. package/dashboard/dist/assets/{PortalPage-D3ybr0mo.js → PortalPage-GDgG88TM.js} +2 -2
  156. package/dashboard/dist/assets/{PortalPage-D3ybr0mo.js.map → PortalPage-GDgG88TM.js.map} +1 -1
  157. package/dashboard/dist/assets/{PrintLabelsPanel-D0HF5x8b.js → PrintLabelsPanel-BkUN00Qd.js} +2 -2
  158. package/dashboard/dist/assets/{PrintLabelsPanel-D0HF5x8b.js.map → PrintLabelsPanel-BkUN00Qd.js.map} +1 -1
  159. package/dashboard/dist/assets/{ProcessDetailPage-0xS9EdHe.js → ProcessDetailPage-BKu9_wWv.js} +2 -2
  160. package/dashboard/dist/assets/{ProcessDetailPage-0xS9EdHe.js.map → ProcessDetailPage-BKu9_wWv.js.map} +1 -1
  161. package/dashboard/dist/assets/{ProcessesListPage-93SMj1Fd.js → ProcessesListPage-BfJYTU_v.js} +2 -2
  162. package/dashboard/dist/assets/{ProcessesListPage-93SMj1Fd.js.map → ProcessesListPage-BfJYTU_v.js.map} +1 -1
  163. package/dashboard/dist/assets/ResolverForm-DZmY6wJV.js +8 -0
  164. package/dashboard/dist/assets/ResolverForm-DZmY6wJV.js.map +1 -0
  165. package/dashboard/dist/assets/{RoleDetailPage-DlUOJWSB.js → RoleDetailPage-vGeth3ve.js} +3 -3
  166. package/dashboard/dist/assets/{RoleDetailPage-DlUOJWSB.js.map → RoleDetailPage-vGeth3ve.js.map} +1 -1
  167. package/dashboard/dist/assets/{RolePill-BjD1Qw5y.js → RolePill-KhT-Yehm.js} +2 -2
  168. package/dashboard/dist/assets/{RolePill-BjD1Qw5y.js.map → RolePill-KhT-Yehm.js.map} +1 -1
  169. package/dashboard/dist/assets/{RolesPage-DqhHSvaw.js → RolesPage-CwxHOkqF.js} +2 -2
  170. package/dashboard/dist/assets/{RolesPage-DqhHSvaw.js.map → RolesPage-CwxHOkqF.js.map} +1 -1
  171. package/dashboard/dist/assets/{RosterWidget-BrIq61HR.js → RosterWidget-DRVj9xyk.js} +2 -2
  172. package/dashboard/dist/assets/{RosterWidget-BrIq61HR.js.map → RosterWidget-DRVj9xyk.js.map} +1 -1
  173. package/dashboard/dist/assets/{RunAsSelector-D6zQrCNr.js → RunAsSelector-DvPX3XmA.js} +2 -2
  174. package/dashboard/dist/assets/{RunAsSelector-D6zQrCNr.js.map → RunAsSelector-DvPX3XmA.js.map} +1 -1
  175. package/dashboard/dist/assets/{ScanCodesPage-B2S9DR2f.js → ScanCodesPage-Cptbe7h8.js} +2 -2
  176. package/dashboard/dist/assets/{ScanCodesPage-B2S9DR2f.js.map → ScanCodesPage-Cptbe7h8.js.map} +1 -1
  177. package/dashboard/dist/assets/{ScanSchemeDetailPage-gpxKN-pL.js → ScanSchemeDetailPage-DquNJ7Or.js} +4 -4
  178. package/dashboard/dist/assets/{ScanSchemeDetailPage-gpxKN-pL.js.map → ScanSchemeDetailPage-DquNJ7Or.js.map} +1 -1
  179. package/dashboard/dist/assets/{ScanStationPage-B-UTgXsG.js → ScanStationPage-DaRfGGa8.js} +2 -2
  180. package/dashboard/dist/assets/{ScanStationPage-B-UTgXsG.js.map → ScanStationPage-DaRfGGa8.js.map} +1 -1
  181. package/dashboard/dist/assets/{SchemeMatchFields-BK24aa7K.js → SchemeMatchFields-w-pffi98.js} +2 -2
  182. package/dashboard/dist/assets/{SchemeMatchFields-BK24aa7K.js.map → SchemeMatchFields-w-pffi98.js.map} +1 -1
  183. package/dashboard/dist/assets/{ScopeBadge-ofLQ6HW-.js → ScopeBadge-HeuiMJhW.js} +2 -2
  184. package/dashboard/dist/assets/{ScopeBadge-ofLQ6HW-.js.map → ScopeBadge-HeuiMJhW.js.map} +1 -1
  185. package/dashboard/dist/assets/{StickyPagination-CgVv7vc_.js → StickyPagination-D6fDHCcJ.js} +2 -2
  186. package/dashboard/dist/assets/{StickyPagination-CgVv7vc_.js.map → StickyPagination-D6fDHCcJ.js.map} +1 -1
  187. package/dashboard/dist/assets/{StreamMessageDetail-B9sxDVw4.js → StreamMessageDetail-BmYVQrzl.js} +2 -2
  188. package/dashboard/dist/assets/{StreamMessageDetail-B9sxDVw4.js.map → StreamMessageDetail-BmYVQrzl.js.map} +1 -1
  189. package/dashboard/dist/assets/{SwimlaneTimeline-DQc0CYSL.js → SwimlaneTimeline-KCqA-PeL.js} +2 -2
  190. package/dashboard/dist/assets/{SwimlaneTimeline-DQc0CYSL.js.map → SwimlaneTimeline-KCqA-PeL.js.map} +1 -1
  191. package/dashboard/dist/assets/{TagInput-47qVYzke.js → TagInput-CZBAu1Hy.js} +2 -2
  192. package/dashboard/dist/assets/{TagInput-47qVYzke.js.map → TagInput-CZBAu1Hy.js.map} +1 -1
  193. package/dashboard/dist/assets/{TaskDetailPage-D6VOsA1f.js → TaskDetailPage-WtVv2z7T.js} +2 -2
  194. package/dashboard/dist/assets/{TaskDetailPage-D6VOsA1f.js.map → TaskDetailPage-WtVv2z7T.js.map} +1 -1
  195. package/dashboard/dist/assets/{TaskQueuePill-C5KmdXAl.js → TaskQueuePill-DWGn3CWx.js} +2 -2
  196. package/dashboard/dist/assets/{TaskQueuePill-C5KmdXAl.js.map → TaskQueuePill-DWGn3CWx.js.map} +1 -1
  197. package/dashboard/dist/assets/{TasksListPage-DG8hvO8G.js → TasksListPage-DMYQNDIw.js} +2 -2
  198. package/dashboard/dist/assets/{TasksListPage-DG8hvO8G.js.map → TasksListPage-DMYQNDIw.js.map} +1 -1
  199. package/dashboard/dist/assets/{TimeAgo-CL02EhFi.js → TimeAgo-BkY4lahi.js} +2 -2
  200. package/dashboard/dist/assets/{TimeAgo-CL02EhFi.js.map → TimeAgo-BkY4lahi.js.map} +1 -1
  201. package/dashboard/dist/assets/{TimestampCell-BE7oKVJg.js → TimestampCell-BBPb9TI2.js} +2 -2
  202. package/dashboard/dist/assets/{TimestampCell-BE7oKVJg.js.map → TimestampCell-BBPb9TI2.js.map} +1 -1
  203. package/dashboard/dist/assets/{ToolPill-Cp9Drk1s.js → ToolPill-B2aRk0o1.js} +2 -2
  204. package/dashboard/dist/assets/{ToolPill-Cp9Drk1s.js.map → ToolPill-B2aRk0o1.js.map} +1 -1
  205. package/dashboard/dist/assets/{ToolTestPanel-CRecLh6S.js → ToolTestPanel-CNMbmymK.js} +2 -2
  206. package/dashboard/dist/assets/{ToolTestPanel-CRecLh6S.js.map → ToolTestPanel-CNMbmymK.js.map} +1 -1
  207. package/dashboard/dist/assets/{TopicDetailPage-QzkinTfN.js → TopicDetailPage-CodBRylU.js} +2 -2
  208. package/dashboard/dist/assets/{TopicDetailPage-QzkinTfN.js.map → TopicDetailPage-CodBRylU.js.map} +1 -1
  209. package/dashboard/dist/assets/TopicsPage-BtD8jTU7.js +2 -0
  210. package/dashboard/dist/assets/{TopicsPage-D8dW6J65.js.map → TopicsPage-BtD8jTU7.js.map} +1 -1
  211. package/dashboard/dist/assets/{UserName-Dw3R_zrl.js → UserName-D6y9AnuY.js} +2 -2
  212. package/dashboard/dist/assets/{UserName-Dw3R_zrl.js.map → UserName-D6y9AnuY.js.map} +1 -1
  213. package/dashboard/dist/assets/{WorkflowExecutionPage-BTocv8or.js → WorkflowExecutionPage-BeffqV13.js} +2 -2
  214. package/dashboard/dist/assets/{WorkflowExecutionPage-BTocv8or.js.map → WorkflowExecutionPage-BeffqV13.js.map} +1 -1
  215. package/dashboard/dist/assets/{WorkflowPill-BiLYq__w.js → WorkflowPill-BNm3R4pP.js} +2 -2
  216. package/dashboard/dist/assets/{WorkflowPill-BiLYq__w.js.map → WorkflowPill-BNm3R4pP.js.map} +1 -1
  217. package/dashboard/dist/assets/{WorkflowsDashboard-CIPEt3et.js → WorkflowsDashboard-m4Co5diK.js} +2 -2
  218. package/dashboard/dist/assets/{WorkflowsDashboard-CIPEt3et.js.map → WorkflowsDashboard-m4Co5diK.js.map} +1 -1
  219. package/dashboard/dist/assets/{WorkflowsOverview-Bj4MJIE-.js → WorkflowsOverview-DNoI9qY8.js} +2 -2
  220. package/dashboard/dist/assets/{WorkflowsOverview-Bj4MJIE-.js.map → WorkflowsOverview-DNoI9qY8.js.map} +1 -1
  221. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DMEk5k9-.js → YamlWorkflowDetailPage-8Vpc4Oxy.js} +2 -2
  222. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DMEk5k9-.js.map → YamlWorkflowDetailPage-8Vpc4Oxy.js.map} +1 -1
  223. package/dashboard/dist/assets/{YamlWorkflowsPage-F2yyyoiB.js → YamlWorkflowsPage-D1JNwDSg.js} +2 -2
  224. package/dashboard/dist/assets/{YamlWorkflowsPage-F2yyyoiB.js.map → YamlWorkflowsPage-D1JNwDSg.js.map} +1 -1
  225. package/dashboard/dist/assets/{agents-mSgxEPpI.js → agents-LTHUsfv3.js} +2 -2
  226. package/dashboard/dist/assets/{agents-mSgxEPpI.js.map → agents-LTHUsfv3.js.map} +1 -1
  227. package/dashboard/dist/assets/{bots-p4Hp0CV6.js → bots-CQxehfBo.js} +2 -2
  228. package/dashboard/dist/assets/{bots-p4Hp0CV6.js.map → bots-CQxehfBo.js.map} +1 -1
  229. package/dashboard/dist/assets/{capabilities-D_-I_SXR.js → capabilities-DECTnJrK.js} +2 -2
  230. package/dashboard/dist/assets/{capabilities-D_-I_SXR.js.map → capabilities-DECTnJrK.js.map} +1 -1
  231. package/dashboard/dist/assets/{controlplane-DjdoQnRU.js → controlplane-Dx20db5g.js} +2 -2
  232. package/dashboard/dist/assets/{controlplane-DjdoQnRU.js.map → controlplane-Dx20db5g.js.map} +1 -1
  233. package/dashboard/dist/assets/{escalation-columns-R_IEVQjQ.js → escalation-columns-CVFGUB79.js} +2 -2
  234. package/dashboard/dist/assets/{escalation-columns-R_IEVQjQ.js.map → escalation-columns-CVFGUB79.js.map} +1 -1
  235. package/dashboard/dist/assets/escalation-items-Bj7bkwWy.js +2 -0
  236. package/dashboard/dist/assets/escalation-items-Bj7bkwWy.js.map +1 -0
  237. package/dashboard/dist/assets/index-BD4O-ISx.js +13 -0
  238. package/dashboard/dist/assets/{index-Dk2KKo0z.js.map → index-BD4O-ISx.js.map} +1 -1
  239. package/dashboard/dist/assets/{index-D9RAN9sA.js → index-BL8XOMHT.js} +2 -2
  240. package/dashboard/dist/assets/{index-D9RAN9sA.js.map → index-BL8XOMHT.js.map} +1 -1
  241. package/dashboard/dist/assets/index-C2vRDf96.js +2 -0
  242. package/dashboard/dist/assets/{index-C5osluV3.js.map → index-C2vRDf96.js.map} +1 -1
  243. package/dashboard/dist/assets/{index-DUYAGxwc.js → index-CNgyKRQ8.js} +2 -2
  244. package/dashboard/dist/assets/{index-DUYAGxwc.js.map → index-CNgyKRQ8.js.map} +1 -1
  245. package/dashboard/dist/assets/{index-DlJkZ12b.js → index-CdXPbBgs.js} +2 -2
  246. package/dashboard/dist/assets/{index-DlJkZ12b.js.map → index-CdXPbBgs.js.map} +1 -1
  247. package/dashboard/dist/assets/{index-BuCEhhnl.js → index-CnBUFCV7.js} +2 -2
  248. package/dashboard/dist/assets/{index-BuCEhhnl.js.map → index-CnBUFCV7.js.map} +1 -1
  249. package/dashboard/dist/assets/index-CoLciFzq.css +1 -0
  250. package/dashboard/dist/assets/{index-D-FYj9jT.js → index-D_TSx-k_.js} +2 -2
  251. package/dashboard/dist/assets/{index-D-FYj9jT.js.map → index-D_TSx-k_.js.map} +1 -1
  252. package/dashboard/dist/assets/{index-C_dAJUzh.js → index-Do9Y6Fgt.js} +16 -16
  253. package/dashboard/dist/assets/index-Do9Y6Fgt.js.map +1 -0
  254. package/dashboard/dist/assets/{index-D6K_IgCz.js → index-Dq1zjilj.js} +2 -2
  255. package/dashboard/dist/assets/{index-D6K_IgCz.js.map → index-Dq1zjilj.js.map} +1 -1
  256. package/dashboard/dist/assets/{index-BEMdD58x.js → index-Dz4LSzA2.js} +2 -2
  257. package/dashboard/dist/assets/{index-BEMdD58x.js.map → index-Dz4LSzA2.js.map} +1 -1
  258. package/dashboard/dist/assets/{index-D7L_VoBD.js → index-g1MmARVR.js} +2 -2
  259. package/dashboard/dist/assets/{index-D7L_VoBD.js.map → index-g1MmARVR.js.map} +1 -1
  260. package/dashboard/dist/assets/{index-BxbQmeqh.js → index-qEd4FVmN.js} +2 -2
  261. package/dashboard/dist/assets/{index-BxbQmeqh.js.map → index-qEd4FVmN.js.map} +1 -1
  262. package/dashboard/dist/assets/index-v4rQ8ctJ.js +3 -0
  263. package/dashboard/dist/assets/index-v4rQ8ctJ.js.map +1 -0
  264. package/dashboard/dist/assets/{knowledge-DSsPTqkK.js → knowledge-CT1I1t1S.js} +2 -2
  265. package/dashboard/dist/assets/{knowledge-DSsPTqkK.js.map → knowledge-CT1I1t1S.js.map} +1 -1
  266. package/dashboard/dist/assets/{machines-DSgGtqqr.js → machines-Dsuw-l1y.js} +2 -2
  267. package/dashboard/dist/assets/{machines-DSgGtqqr.js.map → machines-Dsuw-l1y.js.map} +1 -1
  268. package/dashboard/dist/assets/{mcp-Cg-_uLw8.js → mcp-C3o5wzO8.js} +2 -2
  269. package/dashboard/dist/assets/{mcp-Cg-_uLw8.js.map → mcp-C3o5wzO8.js.map} +1 -1
  270. package/dashboard/dist/assets/{mcp-query-DQombEK_.js → mcp-query-IvkIG7gH.js} +2 -2
  271. package/dashboard/dist/assets/{mcp-query-DQombEK_.js.map → mcp-query-IvkIG7gH.js.map} +1 -1
  272. package/dashboard/dist/assets/pdf-CcZYcL52.js +13 -0
  273. package/dashboard/dist/assets/pdf-CcZYcL52.js.map +1 -0
  274. package/dashboard/dist/assets/pdf.worker.min-DgRcL-GR.js +2 -0
  275. package/dashboard/dist/assets/pdf.worker.min-DgRcL-GR.js.map +1 -0
  276. package/dashboard/dist/assets/pdf.worker.min-yatZIOMy.mjs +21 -0
  277. package/dashboard/dist/assets/{personas-DYrcoVBu.js → personas-zWlWjj6j.js} +2 -2
  278. package/dashboard/dist/assets/{personas-DYrcoVBu.js.map → personas-zWlWjj6j.js.map} +1 -1
  279. package/dashboard/dist/assets/{pipelines-wdb4xsey.js → pipelines-BKNvBMdf.js} +2 -2
  280. package/dashboard/dist/assets/{pipelines-wdb4xsey.js.map → pipelines-BKNvBMdf.js.map} +1 -1
  281. package/dashboard/dist/assets/{tasks-Bil7gvm9.js → tasks-BQSO3Sjv.js} +2 -2
  282. package/dashboard/dist/assets/{tasks-Bil7gvm9.js.map → tasks-BQSO3Sjv.js.map} +1 -1
  283. package/dashboard/dist/assets/{topics-wBqaVhRR.js → topics-Dr_1TtUM.js} +2 -2
  284. package/dashboard/dist/assets/{topics-wBqaVhRR.js.map → topics-Dr_1TtUM.js.map} +1 -1
  285. package/dashboard/dist/assets/{useContainerWidth-DSLp1gEm.js → useContainerWidth-D38m8eub.js} +2 -2
  286. package/dashboard/dist/assets/{useContainerWidth-DSLp1gEm.js.map → useContainerWidth-D38m8eub.js.map} +1 -1
  287. package/dashboard/dist/assets/{useDebouncedValue-CwrY8TpV.js → useDebouncedValue-C5ESASfo.js} +2 -2
  288. package/dashboard/dist/assets/{useDebouncedValue-CwrY8TpV.js.map → useDebouncedValue-C5ESASfo.js.map} +1 -1
  289. package/dashboard/dist/assets/{useNamespace-Sod_xApz.js → useNamespace-DLLOJRYY.js} +2 -2
  290. package/dashboard/dist/assets/{useNamespace-Sod_xApz.js.map → useNamespace-DLLOJRYY.js.map} +1 -1
  291. package/dashboard/dist/assets/{useYamlActivityEvents-CKLInV3C.js → useYamlActivityEvents-D0XNXli1.js} +2 -2
  292. package/dashboard/dist/assets/{useYamlActivityEvents-CKLInV3C.js.map → useYamlActivityEvents-D0XNXli1.js.map} +1 -1
  293. package/dashboard/dist/assets/{validate-CYhW1xMJ.js → validate-Be4GWnJ1.js} +2 -2
  294. package/dashboard/dist/assets/{validate-CYhW1xMJ.js.map → validate-Be4GWnJ1.js.map} +1 -1
  295. package/dashboard/dist/assets/{vendor-icons-ed7mYQw4.js → vendor-icons-D48ijXZU.js} +209 -189
  296. package/dashboard/dist/assets/vendor-icons-D48ijXZU.js.map +1 -0
  297. package/dashboard/dist/assets/{yaml-workflows-C20qHo3L.js → yaml-workflows-BQpO-G-I.js} +2 -2
  298. package/dashboard/dist/assets/{yaml-workflows-C20qHo3L.js.map → yaml-workflows-BQpO-G-I.js.map} +1 -1
  299. package/dashboard/dist/index.html +3 -3
  300. package/docs/api/http/escalations.md +54 -7
  301. package/docs/api/mcp/admin.md +7 -5
  302. package/docs/api/mcp/human-queue.md +17 -1
  303. package/docs/api/sdk/escalations.md +30 -4
  304. package/docs/api/sdk/files.md +19 -0
  305. package/docs/cli.md +4 -1
  306. package/docs/escalation-analytics.md +17 -0
  307. package/docs/hitl/files.md +104 -0
  308. package/docs/hitl/x-lt-confidence.md +139 -0
  309. package/docs/hitl/x-lt-layout.md +19 -0
  310. package/docs/hitl/x-lt-widget.md +20 -0
  311. package/docs/hitl-guide.md +6 -0
  312. package/docs/machines.md +2 -2
  313. package/docs/mcp.md +2 -1
  314. package/package.json +1 -1
  315. package/dashboard/dist/assets/ResolverForm-DfogHDzl.js +0 -8
  316. package/dashboard/dist/assets/ResolverForm-DfogHDzl.js.map +0 -1
  317. package/dashboard/dist/assets/TopicsPage-D8dW6J65.js +0 -2
  318. package/dashboard/dist/assets/escalation-items-BGZlJMpk.js +0 -2
  319. package/dashboard/dist/assets/escalation-items-BGZlJMpk.js.map +0 -1
  320. package/dashboard/dist/assets/index-BUmz0NMg.css +0 -1
  321. package/dashboard/dist/assets/index-C5osluV3.js +0 -2
  322. package/dashboard/dist/assets/index-C_dAJUzh.js.map +0 -1
  323. package/dashboard/dist/assets/index-Dk2KKo0z.js +0 -13
  324. package/dashboard/dist/assets/index-FiNThtNU.js +0 -3
  325. package/dashboard/dist/assets/index-FiNThtNU.js.map +0 -1
  326. package/dashboard/dist/assets/vendor-icons-ed7mYQw4.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"PrintLabelsPanel-D0HF5x8b.js","sources":["../../src/components/common/form/Field.tsx","../../src/components/labels/LabelLayoutFields.tsx","../../src/lib/verify-symbols.ts","../../src/components/labels/LabelSheetPreview.tsx","../../src/components/labels/LabelSourceFields.tsx","../../src/components/labels/BadgeSourceFields.tsx","../../src/components/labels/PrintLabelsPanel.tsx"],"sourcesContent":["import { useId, type ReactNode, type InputHTMLAttributes, type SelectHTMLAttributes, type TextareaHTMLAttributes } from 'react';\n\n/**\n * Canonical form primitives. Every authored page composes its forms from these\n * so labels, fields, hints, and errors look identical everywhere — and so a\n * single override of the `.input` / `.select` / `.textarea` classes (or the\n * theme tokens they read) restyles the whole product at once. Do not hand-roll\n * `<input className=\"border ...\">`; reach for these.\n */\n\ninterface FieldShellProps {\n label?: ReactNode;\n required?: boolean;\n hint?: ReactNode;\n error?: ReactNode;\n htmlFor?: string;\n className?: string;\n children: ReactNode;\n}\n\n/** Label + control + hint/error, wired for accessibility. The message renders\n * at `${htmlFor}-msg` so controls can point aria-describedby at it. */\nexport function Field({ label, required, hint, error, htmlFor, className = '', children }: FieldShellProps) {\n const msgId = htmlFor ? `${htmlFor}-msg` : undefined;\n return (\n <div className={className}>\n {label && (\n <label htmlFor={htmlFor} className=\"label\">\n {label}\n {required && <span className=\"text-status-error ml-0.5\">*</span>}\n </label>\n )}\n {children}\n {error ? (\n <p id={msgId} className=\"text-2xs text-status-error mt-1\" role=\"alert\">{error}</p>\n ) : hint ? (\n <p id={msgId} className=\"hint\">{hint}</p>\n ) : null}\n </div>\n );\n}\n\ntype BaseProps = {\n label?: ReactNode;\n hint?: ReactNode;\n error?: ReactNode;\n required?: boolean;\n /** Extra classes on the wrapping Field, not the control. */\n fieldClassName?: string;\n};\n\nfunction describedBy(id: string, hint: ReactNode, error: ReactNode): string | undefined {\n return error || hint ? `${id}-msg` : undefined;\n}\n\nexport function TextField({\n label, hint, error, required, fieldClassName, id, className = '', ...rest\n}: BaseProps & InputHTMLAttributes<HTMLInputElement>) {\n const auto = useId();\n const fieldId = id ?? auto;\n return (\n <Field label={label} required={required} hint={hint} error={error} htmlFor={fieldId} className={fieldClassName}>\n <input\n id={fieldId}\n className={`input ${className}`}\n aria-required={required || undefined}\n aria-invalid={error ? true : undefined}\n aria-describedby={describedBy(fieldId, hint, error)}\n {...rest}\n />\n </Field>\n );\n}\n\ninterface SelectFieldProps extends BaseProps, Omit<SelectHTMLAttributes<HTMLSelectElement>, 'children'> {\n options: { value: string; label: string }[];\n placeholder?: string;\n}\n\nexport function SelectField({\n label, hint, error, required, fieldClassName, id, className = '', options, placeholder, ...rest\n}: SelectFieldProps) {\n const auto = useId();\n const fieldId = id ?? auto;\n return (\n <Field label={label} required={required} hint={hint} error={error} htmlFor={fieldId} className={fieldClassName}>\n <select\n id={fieldId}\n className={`select ${className}`}\n aria-required={required || undefined}\n aria-invalid={error ? true : undefined}\n aria-describedby={describedBy(fieldId, hint, error)}\n {...rest}\n >\n {placeholder !== undefined && <option value=\"\">{placeholder}</option>}\n {options.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n </Field>\n );\n}\n\nexport function TextArea({\n label, hint, error, required, fieldClassName, id, className = '', ...rest\n}: BaseProps & TextareaHTMLAttributes<HTMLTextAreaElement>) {\n const auto = useId();\n const fieldId = id ?? auto;\n return (\n <Field label={label} required={required} hint={hint} error={error} htmlFor={fieldId} className={fieldClassName}>\n <textarea\n id={fieldId}\n className={`textarea ${className}`}\n aria-required={required || undefined}\n aria-invalid={error ? true : undefined}\n aria-describedby={describedBy(fieldId, hint, error)}\n {...rest}\n />\n </Field>\n );\n}\n","import { SelectField, TextField } from '../common/form/Field';\nimport type { LabelLayout } from '../../api/labels';\nimport type { LabelMedia } from '../../../../shared/labels/types';\n\n/** Media, start position on a partly used sheet, copies, and page options. */\nexport function LabelLayoutFields({ media, value, onChange }: {\n media: LabelMedia[];\n value: LabelLayout;\n onChange: (next: LabelLayout) => void;\n}) {\n const chosen = media.find((m) => m.id === value.media);\n const slots = chosen ? chosen.columns * chosen.rows : 1;\n return (\n <div className=\"space-y-3\">\n <SelectField\n label=\"Media\"\n hint=\"The label stock or thermal roll in the printer.\"\n value={value.media ?? ''}\n options={media.map((m) => ({ value: m.id, label: m.name }))}\n onChange={(e) => onChange({ ...value, media: e.target.value, startPosition: 1 })}\n />\n <div className=\"grid gap-3 grid-cols-2\">\n <TextField\n label=\"Start at label\"\n hint={slots > 1 ? `Skips used labels on the first sheet (1 to ${slots}).` : 'One label per page on this media.'}\n type=\"number\"\n min={1}\n max={slots}\n disabled={slots === 1}\n value={value.startPosition ?? 1}\n onChange={(e) => onChange({ ...value, startPosition: Number(e.target.value) })}\n />\n <TextField\n label=\"Copies\"\n hint=\"Of each label, printed together.\"\n type=\"number\"\n min={1}\n max={50}\n value={value.copies ?? 1}\n onChange={(e) => onChange({ ...value, copies: Number(e.target.value) })}\n />\n </div>\n {chosen?.family === 'sheet' && (\n <div className=\"grid gap-3 grid-cols-2\">\n <SelectField\n label=\"Per page\"\n value={value.onePerPage ? 'one' : 'fill'}\n options={[{ value: 'fill', label: 'Fill each sheet' }, { value: 'one', label: 'One label per page' }]}\n onChange={(e) => onChange({ ...value, onePerPage: e.target.value === 'one' })}\n />\n <SelectField\n label=\"Cut marks\"\n hint=\"For card stock you trim by hand.\"\n value={value.cutMarks ? 'yes' : 'no'}\n options={[{ value: 'no', label: 'None' }, { value: 'yes', label: 'Print cut marks' }]}\n onChange={(e) => onChange({ ...value, cutMarks: e.target.value === 'yes' })}\n />\n </div>\n )}\n </div>\n );\n}\n","/**\n * On-screen code check: rasterize each preview page and decode it with the\n * browser's BarcodeDetector (Chrome), then compare with the codes each\n * symbol was drawn from. Browsers without the detector skip the check.\n */\n\ninterface DetectedBarcode { rawValue: string }\ninterface BarcodeDetectorLike { detect(source: CanvasImageSource): Promise<DetectedBarcode[]> }\ntype DetectorCtor = new (opts: { formats: string[] }) => BarcodeDetectorLike;\n\nexport interface SymbolCheck {\n expected: number;\n decoded: number;\n missing: string[];\n}\n\nconst FORMATS = ['code_128', 'qr_code', 'data_matrix'];\nconst RASTER_SCALE = 8;\n\nexport function canVerifySymbols(): boolean {\n return typeof window !== 'undefined' && 'BarcodeDetector' in window;\n}\n\nasync function rasterize(svg: SVGSVGElement): Promise<HTMLCanvasElement> {\n const viewBox = svg.viewBox.baseVal;\n const canvas = document.createElement('canvas');\n canvas.width = Math.round(viewBox.width * RASTER_SCALE);\n canvas.height = Math.round(viewBox.height * RASTER_SCALE);\n const image = new Image();\n const markup = new XMLSerializer().serializeToString(svg);\n image.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(markup)}`;\n await image.decode();\n const ctx = canvas.getContext('2d')!;\n ctx.fillStyle = '#fff';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n return canvas;\n}\n\n/** Decode every page under `container` and report codes the browser could not read back. */\nexport async function verifySymbols(container: HTMLElement): Promise<SymbolCheck | null> {\n if (!canVerifySymbols()) return null;\n const Detector = (window as unknown as { BarcodeDetector: DetectorCtor }).BarcodeDetector;\n const detector = new Detector({ formats: FORMATS });\n const expected = new Set<string>();\n const decoded = new Set<string>();\n for (const svg of Array.from(container.querySelectorAll<SVGSVGElement>('svg.lt-print-page'))) {\n svg.querySelectorAll('[data-code]').forEach((el) => expected.add(el.getAttribute('data-code')!));\n const found = await detector.detect(await rasterize(svg));\n for (const code of found) decoded.add(code.rawValue);\n }\n const missing = [...expected].filter((code) => !decoded.has(code));\n return { expected: expected.size, decoded: expected.size - missing.length, missing };\n}\n","import { useMemo, useRef, useState } from 'react';\n\nimport { renderSheetSvg } from '../../../../shared/labels/render-svg';\nimport type { LabelSheet, LabelWarning } from '../../../../shared/labels/types';\nimport { canVerifySymbols, verifySymbols, type SymbolCheck } from '../../lib/verify-symbols';\n\nconst WARNINGS_SHOWN = 8;\n\n/**\n * Pages as they will print, label outlines dashed, with every warning that\n * would make a code fail on the floor listed under them. Markup comes from\n * the shared renderer, which escapes all label text.\n */\nexport function LabelSheetPreview({ sheet, warnings }: { sheet: LabelSheet; warnings: LabelWarning[] }) {\n const pages = useMemo(() => renderSheetSvg(sheet, { outlines: true }), [sheet]);\n const pagesRef = useRef<HTMLDivElement>(null);\n const [check, setCheck] = useState<SymbolCheck | null>(null);\n const [checking, setChecking] = useState(false);\n const labelCount = sheet.pages.reduce((n, p) => n + p.labels.length, 0);\n\n async function runCheck() {\n if (!pagesRef.current) return;\n setChecking(true);\n try {\n setCheck(await verifySymbols(pagesRef.current));\n } finally {\n setChecking(false);\n }\n }\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3 text-xs text-text-secondary\">\n <span>{labelCount} labels on {pages.length} {pages.length === 1 ? 'page' : 'pages'} · {sheet.media.name}</span>\n {canVerifySymbols() && (\n <button onClick={runCheck} disabled={checking} className=\"ml-auto text-accent hover:text-accent-hover\">\n {checking ? 'Checking…' : 'Check codes on screen'}\n </button>\n )}\n </div>\n {check && (\n <p role=\"status\" className={`text-xs ${check.missing.length ? 'text-status-error' : 'text-status-success'}`}>\n {check.decoded} of {check.expected} codes read back on screen\n {check.missing.length > 0 && `; not read: ${check.missing.slice(0, 3).join(', ')}`}\n </p>\n )}\n {warnings.length > 0 && (\n <ul aria-label=\"Label warnings\" className=\"space-y-1 border-l-2 border-l-status-error pl-3\">\n {warnings.slice(0, WARNINGS_SHOWN).map((w, i) => (\n <li key={i} className=\"text-xs text-text-secondary\">\n <span className=\"font-medium text-status-error\">Label {w.index + 1}</span> · {w.detail}\n </li>\n ))}\n {warnings.length > WARNINGS_SHOWN && (\n <li className=\"text-xs text-text-tertiary\">and {warnings.length - WARNINGS_SHOWN} more</li>\n )}\n </ul>\n )}\n <div ref={pagesRef} className=\"grid gap-4 @split:grid-cols-2\">\n {pages.map((svg, i) => (\n <div\n key={i}\n data-page={i + 1}\n className=\"bg-white shadow-sm [&>svg]:w-full [&>svg]:h-auto\"\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n ))}\n </div>\n </div>\n );\n}\n","import { SelectField, TextArea, TextField } from '../common/form/Field';\nimport type { LabelSource } from '../../api/labels';\n\nexport type EditableSource = Extract<LabelSource, { kind: 'list' | 'range' }>;\n\nexport const DEFAULT_RANGE: EditableSource = { kind: 'range', prefix: '', from: 1, to: 10, pad: 0 };\n\n/** A pasted list or a numeric range: the targets an admin types. */\nexport function LabelSourceFields({ value, onChange }: { value: EditableSource; onChange: (next: EditableSource) => void }) {\n return (\n <div className=\"space-y-3\">\n <SelectField\n label=\"Targets\"\n hint=\"A range numbers targets in sequence; a list can carry a column per text token.\"\n value={value.kind}\n options={[{ value: 'range', label: 'A numbered range' }, { value: 'list', label: 'A pasted list' }]}\n onChange={(e) => onChange(e.target.value === 'list' ? { kind: 'list', text: '' } : DEFAULT_RANGE)}\n />\n {value.kind === 'range' ? (\n <div className=\"grid gap-3 grid-cols-2 @form-cols:grid-cols-4\">\n <TextField label=\"Prefix\" value={value.prefix ?? ''} onChange={(e) => onChange({ ...value, prefix: e.target.value })} placeholder=\"A-\" />\n <TextField label=\"From\" type=\"number\" min={0} value={value.from} onChange={(e) => onChange({ ...value, from: Number(e.target.value) })} />\n <TextField label=\"To\" type=\"number\" min={0} value={value.to} onChange={(e) => onChange({ ...value, to: Number(e.target.value) })} />\n <TextField label=\"Digits\" hint=\"Pads with zeros: 2 prints 01.\" type=\"number\" min={0} max={12} value={value.pad ?? 0} onChange={(e) => onChange({ ...value, pad: Number(e.target.value) })} />\n </div>\n ) : (\n <TextArea\n label=\"List\"\n hint='One target per line. Start with a header such as \"target,subtitle\" to fill {item.subtitle}.'\n rows={6}\n value={value.text}\n onChange={(e) => onChange({ kind: 'list', text: e.target.value })}\n />\n )}\n </div>\n );\n}\n","import { SelectField } from '../common/form/Field';\nimport { useRoles } from '../../api/roles';\nimport type { LabelSource } from '../../api/labels';\n\nexport type UserSource = Extract<LabelSource, { kind: 'users' }>;\n\n/** Whose badges print when no one is selected: every badge holder, or every holder in one role. */\nexport function BadgeSourceFields({ value, onChange }: { value: UserSource; onChange: (next: UserSource) => void }) {\n const { data } = useRoles();\n return (\n <div className=\"space-y-3\">\n <SelectField\n label=\"Badges for\"\n hint=\"Users without a badge are left out; up to 200 badges print per job.\"\n value={value.role === undefined ? 'all' : 'role'}\n options={[{ value: 'all', label: 'Everyone with a badge' }, { value: 'role', label: 'Everyone in a role' }]}\n onChange={(e) => onChange(e.target.value === 'role' ? { kind: 'users', role: '' } : { kind: 'users' })}\n />\n {value.role !== undefined && (\n <SelectField\n label=\"Role\"\n value={value.role}\n placeholder=\"Choose…\"\n options={(data?.roles ?? []).map((r) => ({ value: r, label: r }))}\n onChange={(e) => onChange({ kind: 'users', role: e.target.value })}\n />\n )}\n </div>\n );\n}\n","import { useEffect, useMemo, useState } from 'react';\n\nimport { Modal } from '../common/modal/Modal';\nimport { SelectField } from '../common/form/Field';\nimport {\n useIssueLabels, useLabelMedia, useLabelTransports, usePreviewLabels,\n type LabelLayout, type LabelOutput, type LabelSource, type LabelTemplate,\n} from '../../api/labels';\nimport { printSheet } from '../../lib/print-sheet';\nimport { CredentialConfirm } from './CredentialConfirmModal';\nimport { LabelLayoutFields } from './LabelLayoutFields';\nimport { LabelSheetPreview } from './LabelSheetPreview';\nimport { DEFAULT_RANGE, LabelSourceFields, type EditableSource } from './LabelSourceFields';\nimport { BadgeSourceFields, type UserSource } from './BadgeSourceFields';\n\ninterface PrintLabelsPanelProps {\n open: boolean;\n onClose: () => void;\n title: string;\n /** The templates this entry point offers. */\n templates: LabelTemplate[];\n /** Targets chosen elsewhere (selected rows or users); without it, a range or list, or for badges, everyone or a role. */\n source?: LabelSource;\n /** How many targets `source` names, for the confirmation. */\n sourceCount?: number;\n /** True when the templates print badges (an identity scheme). */\n identity?: boolean;\n}\n\n/**\n * The one print flow every entry point opens: choose a template, targets and\n * stock, preview the pages with their warnings, then print in the browser,\n * download a PDF or ZPL, or send to a registered printer. A sensitive\n * template (every badge) confirms first; the server records the requester\n * before it composes a single code.\n */\nexport function PrintLabelsPanel({ open, onClose, title, templates, source, sourceCount, identity = false }: PrintLabelsPanelProps) {\n const { data: mediaData } = useLabelMedia();\n const { data: transportData } = useLabelTransports();\n const preview = usePreviewLabels();\n const issue = useIssueLabels();\n\n const [templateName, setTemplateName] = useState(templates[0]?.name ?? '');\n const [typed, setTyped] = useState<EditableSource>(DEFAULT_RANGE);\n const [holders, setHolders] = useState<UserSource>({ kind: 'users' });\n const [layout, setLayout] = useState<LabelLayout>({});\n const [transport, setTransport] = useState('');\n const [pending, setPending] = useState<LabelOutput | null>(null);\n const [done, setDone] = useState<string | null>(null);\n\n const template = templates.find((t) => t.name === templateName) ?? null;\n const media = mediaData?.media ?? [];\n const chosenMedia = media.find((m) => m.id === layout.media);\n const thermal = chosenMedia?.family === 'thermal';\n const jobSource: LabelSource = source ?? (identity ? holders : typed);\n const sourceReady = !(jobSource.kind === 'users' && jobSource.role === '');\n\n useEffect(() => {\n if (template && mediaData) setLayout((l) => ({ ...l, media: template.media ?? mediaData.defaultMedia, startPosition: 1 }));\n }, [template?.name, mediaData?.defaultMedia]);\n\n const request = useMemo(() => ({ template: templateName, source: jobSource, layout }), [templateName, jobSource, layout]);\n const requestKey = JSON.stringify(request);\n const [previewedKey, setPreviewedKey] = useState<string | null>(null);\n // Printing follows a preview of exactly this request, so its warnings are seen first.\n const previewed = !!preview.data && previewedKey === requestKey;\n const count = sourceCount ?? preview.data?.labelCount ?? 0;\n const ready = !!template && previewed && sourceReady && !issue.isPending;\n\n function run(output: LabelOutput, confirm = false) {\n setDone(null);\n if (template?.sensitive && !confirm) {\n setPending(output);\n return;\n }\n issue.mutate({ ...request, output, confirm: template?.sensitive ? true : undefined }, {\n onSuccess: (result) => {\n setPending(null);\n if (result.sheet) printSheet(result.sheet);\n setDone(result.downloaded\n ? `Saved ${result.downloaded}.`\n : result.receipt ? `Sent to ${output.slice('transport:'.length)} (job ${result.jobId}).` : `Printing job ${result.jobId}.`);\n },\n });\n }\n\n const sendable = (transportData?.transports ?? []).filter((t) => t.formats.includes(thermal ? 'zpl' : 'pdf'));\n\n return (\n <Modal open={open} onClose={onClose} title={title} maxWidth=\"max-w-5xl\" closeOnBackdrop={false}>\n <div className=\"@container space-y-6\">\n <div className=\"grid gap-6 @split:grid-cols-[22rem_1fr]\">\n <div className=\"space-y-4\">\n <SelectField\n label=\"Template\"\n hint={template?.description ?? 'What each label shows.'}\n value={templateName}\n placeholder={templates.length ? undefined : 'No templates for this choice'}\n options={templates.map((t) => ({ value: t.name, label: t.title }))}\n onChange={(e) => setTemplateName(e.target.value)}\n />\n {source\n ? <p className=\"text-xs text-text-secondary\">{sourceCount ?? 0} selected</p>\n : identity\n ? <BadgeSourceFields value={holders} onChange={setHolders} />\n : <LabelSourceFields value={typed} onChange={setTyped} />}\n <LabelLayoutFields media={media} value={layout} onChange={setLayout} />\n <button\n onClick={() => preview.mutate(request, { onSuccess: () => setPreviewedKey(requestKey) })}\n disabled={!template || !sourceReady || preview.isPending}\n className=\"btn-secondary text-xs\"\n >\n {preview.isPending ? 'Laying out…' : 'Preview'}\n </button>\n {preview.error && <p role=\"alert\" className=\"text-xs text-status-error\">{(preview.error as Error).message}</p>}\n </div>\n <div className=\"min-w-0\">\n {preview.data\n ? <LabelSheetPreview sheet={preview.data.sheet} warnings={preview.data.warnings} />\n : <p className=\"text-xs text-text-tertiary\">Preview the pages before printing.</p>}\n </div>\n </div>\n\n {pending ? (\n <CredentialConfirm\n count={count}\n identity={identity}\n isPending={issue.isPending}\n error={issue.error as Error | null}\n onConfirm={() => run(pending, true)}\n onClose={() => setPending(null)}\n />\n ) : (\n <div className=\"flex flex-wrap items-end gap-3 border-t border-surface-border pt-4\">\n {!previewed && <p className=\"text-xs text-text-tertiary\">Preview this choice to print it.</p>}\n {!thermal && <button onClick={() => run('sheet')} disabled={!ready} className=\"btn-primary text-xs\">Print</button>}\n {!thermal && <button onClick={() => run('pdf')} disabled={!ready} className=\"btn-secondary text-xs\">Download PDF</button>}\n {thermal && <button onClick={() => run('zpl')} disabled={!ready} className=\"btn-primary text-xs\">Download ZPL</button>}\n {sendable.length > 0 && (\n <>\n <SelectField\n label=\"Printer\"\n value={transport}\n placeholder=\"Choose…\"\n options={sendable.map((t) => ({ value: t.name, label: t.name }))}\n onChange={(e) => setTransport(e.target.value)}\n />\n <button onClick={() => run(`transport:${transport}`)} disabled={!ready || !transport} className=\"btn-secondary text-xs\">\n Send\n </button>\n </>\n )}\n {issue.error && <p role=\"alert\" className=\"text-xs text-status-error\">{(issue.error as Error).message}</p>}\n {done && <p role=\"status\" className=\"text-xs text-status-success ml-auto\">{done}</p>}\n </div>\n )}\n </div>\n </Modal>\n );\n}\n"],"names":["Field","label","required","hint","error","htmlFor","className","children","msgId","jsxs","jsx","describedBy","id","TextField","fieldClassName","rest","auto","useId","fieldId","SelectField","options","placeholder","o","TextArea","LabelLayoutFields","media","value","onChange","chosen","m","slots","e","FORMATS","RASTER_SCALE","canVerifySymbols","rasterize","svg","viewBox","canvas","image","markup","ctx","verifySymbols","container","Detector","detector","expected","decoded","el","found","code","missing","WARNINGS_SHOWN","LabelSheetPreview","sheet","warnings","pages","useMemo","renderSheetSvg","pagesRef","useRef","check","setCheck","useState","checking","setChecking","labelCount","n","p","runCheck","w","i","DEFAULT_RANGE","LabelSourceFields","BadgeSourceFields","data","useRoles","r","PrintLabelsPanel","open","onClose","title","templates","source","sourceCount","identity","mediaData","useLabelMedia","transportData","useLabelTransports","preview","usePreviewLabels","issue","useIssueLabels","templateName","setTemplateName","_a","typed","setTyped","holders","setHolders","layout","setLayout","transport","setTransport","pending","setPending","done","setDone","template","t","chosenMedia","thermal","jobSource","sourceReady","useEffect","l","request","requestKey","previewedKey","setPreviewedKey","previewed","count","_b","ready","run","output","confirm","result","printSheet","sendable","Modal","CredentialConfirm","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"PrintLabelsPanel-BkUN00Qd.js","sources":["../../src/components/common/form/Field.tsx","../../src/components/labels/LabelLayoutFields.tsx","../../src/lib/verify-symbols.ts","../../src/components/labels/LabelSheetPreview.tsx","../../src/components/labels/LabelSourceFields.tsx","../../src/components/labels/BadgeSourceFields.tsx","../../src/components/labels/PrintLabelsPanel.tsx"],"sourcesContent":["import { useId, type ReactNode, type InputHTMLAttributes, type SelectHTMLAttributes, type TextareaHTMLAttributes } from 'react';\n\n/**\n * Canonical form primitives. Every authored page composes its forms from these\n * so labels, fields, hints, and errors look identical everywhere — and so a\n * single override of the `.input` / `.select` / `.textarea` classes (or the\n * theme tokens they read) restyles the whole product at once. Do not hand-roll\n * `<input className=\"border ...\">`; reach for these.\n */\n\ninterface FieldShellProps {\n label?: ReactNode;\n required?: boolean;\n hint?: ReactNode;\n error?: ReactNode;\n htmlFor?: string;\n className?: string;\n children: ReactNode;\n}\n\n/** Label + control + hint/error, wired for accessibility. The message renders\n * at `${htmlFor}-msg` so controls can point aria-describedby at it. */\nexport function Field({ label, required, hint, error, htmlFor, className = '', children }: FieldShellProps) {\n const msgId = htmlFor ? `${htmlFor}-msg` : undefined;\n return (\n <div className={className}>\n {label && (\n <label htmlFor={htmlFor} className=\"label\">\n {label}\n {required && <span className=\"text-status-error ml-0.5\">*</span>}\n </label>\n )}\n {children}\n {error ? (\n <p id={msgId} className=\"text-2xs text-status-error mt-1\" role=\"alert\">{error}</p>\n ) : hint ? (\n <p id={msgId} className=\"hint\">{hint}</p>\n ) : null}\n </div>\n );\n}\n\ntype BaseProps = {\n label?: ReactNode;\n hint?: ReactNode;\n error?: ReactNode;\n required?: boolean;\n /** Extra classes on the wrapping Field, not the control. */\n fieldClassName?: string;\n};\n\nfunction describedBy(id: string, hint: ReactNode, error: ReactNode): string | undefined {\n return error || hint ? `${id}-msg` : undefined;\n}\n\nexport function TextField({\n label, hint, error, required, fieldClassName, id, className = '', ...rest\n}: BaseProps & InputHTMLAttributes<HTMLInputElement>) {\n const auto = useId();\n const fieldId = id ?? auto;\n return (\n <Field label={label} required={required} hint={hint} error={error} htmlFor={fieldId} className={fieldClassName}>\n <input\n id={fieldId}\n className={`input ${className}`}\n aria-required={required || undefined}\n aria-invalid={error ? true : undefined}\n aria-describedby={describedBy(fieldId, hint, error)}\n {...rest}\n />\n </Field>\n );\n}\n\ninterface SelectFieldProps extends BaseProps, Omit<SelectHTMLAttributes<HTMLSelectElement>, 'children'> {\n options: { value: string; label: string }[];\n placeholder?: string;\n}\n\nexport function SelectField({\n label, hint, error, required, fieldClassName, id, className = '', options, placeholder, ...rest\n}: SelectFieldProps) {\n const auto = useId();\n const fieldId = id ?? auto;\n return (\n <Field label={label} required={required} hint={hint} error={error} htmlFor={fieldId} className={fieldClassName}>\n <select\n id={fieldId}\n className={`select ${className}`}\n aria-required={required || undefined}\n aria-invalid={error ? true : undefined}\n aria-describedby={describedBy(fieldId, hint, error)}\n {...rest}\n >\n {placeholder !== undefined && <option value=\"\">{placeholder}</option>}\n {options.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n </Field>\n );\n}\n\nexport function TextArea({\n label, hint, error, required, fieldClassName, id, className = '', ...rest\n}: BaseProps & TextareaHTMLAttributes<HTMLTextAreaElement>) {\n const auto = useId();\n const fieldId = id ?? auto;\n return (\n <Field label={label} required={required} hint={hint} error={error} htmlFor={fieldId} className={fieldClassName}>\n <textarea\n id={fieldId}\n className={`textarea ${className}`}\n aria-required={required || undefined}\n aria-invalid={error ? true : undefined}\n aria-describedby={describedBy(fieldId, hint, error)}\n {...rest}\n />\n </Field>\n );\n}\n","import { SelectField, TextField } from '../common/form/Field';\nimport type { LabelLayout } from '../../api/labels';\nimport type { LabelMedia } from '../../../../shared/labels/types';\n\n/** Media, start position on a partly used sheet, copies, and page options. */\nexport function LabelLayoutFields({ media, value, onChange }: {\n media: LabelMedia[];\n value: LabelLayout;\n onChange: (next: LabelLayout) => void;\n}) {\n const chosen = media.find((m) => m.id === value.media);\n const slots = chosen ? chosen.columns * chosen.rows : 1;\n return (\n <div className=\"space-y-3\">\n <SelectField\n label=\"Media\"\n hint=\"The label stock or thermal roll in the printer.\"\n value={value.media ?? ''}\n options={media.map((m) => ({ value: m.id, label: m.name }))}\n onChange={(e) => onChange({ ...value, media: e.target.value, startPosition: 1 })}\n />\n <div className=\"grid gap-3 grid-cols-2\">\n <TextField\n label=\"Start at label\"\n hint={slots > 1 ? `Skips used labels on the first sheet (1 to ${slots}).` : 'One label per page on this media.'}\n type=\"number\"\n min={1}\n max={slots}\n disabled={slots === 1}\n value={value.startPosition ?? 1}\n onChange={(e) => onChange({ ...value, startPosition: Number(e.target.value) })}\n />\n <TextField\n label=\"Copies\"\n hint=\"Of each label, printed together.\"\n type=\"number\"\n min={1}\n max={50}\n value={value.copies ?? 1}\n onChange={(e) => onChange({ ...value, copies: Number(e.target.value) })}\n />\n </div>\n {chosen?.family === 'sheet' && (\n <div className=\"grid gap-3 grid-cols-2\">\n <SelectField\n label=\"Per page\"\n value={value.onePerPage ? 'one' : 'fill'}\n options={[{ value: 'fill', label: 'Fill each sheet' }, { value: 'one', label: 'One label per page' }]}\n onChange={(e) => onChange({ ...value, onePerPage: e.target.value === 'one' })}\n />\n <SelectField\n label=\"Cut marks\"\n hint=\"For card stock you trim by hand.\"\n value={value.cutMarks ? 'yes' : 'no'}\n options={[{ value: 'no', label: 'None' }, { value: 'yes', label: 'Print cut marks' }]}\n onChange={(e) => onChange({ ...value, cutMarks: e.target.value === 'yes' })}\n />\n </div>\n )}\n </div>\n );\n}\n","/**\n * On-screen code check: rasterize each preview page and decode it with the\n * browser's BarcodeDetector (Chrome), then compare with the codes each\n * symbol was drawn from. Browsers without the detector skip the check.\n */\n\ninterface DetectedBarcode { rawValue: string }\ninterface BarcodeDetectorLike { detect(source: CanvasImageSource): Promise<DetectedBarcode[]> }\ntype DetectorCtor = new (opts: { formats: string[] }) => BarcodeDetectorLike;\n\nexport interface SymbolCheck {\n expected: number;\n decoded: number;\n missing: string[];\n}\n\nconst FORMATS = ['code_128', 'qr_code', 'data_matrix'];\nconst RASTER_SCALE = 8;\n\nexport function canVerifySymbols(): boolean {\n return typeof window !== 'undefined' && 'BarcodeDetector' in window;\n}\n\nasync function rasterize(svg: SVGSVGElement): Promise<HTMLCanvasElement> {\n const viewBox = svg.viewBox.baseVal;\n const canvas = document.createElement('canvas');\n canvas.width = Math.round(viewBox.width * RASTER_SCALE);\n canvas.height = Math.round(viewBox.height * RASTER_SCALE);\n const image = new Image();\n const markup = new XMLSerializer().serializeToString(svg);\n image.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(markup)}`;\n await image.decode();\n const ctx = canvas.getContext('2d')!;\n ctx.fillStyle = '#fff';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n return canvas;\n}\n\n/** Decode every page under `container` and report codes the browser could not read back. */\nexport async function verifySymbols(container: HTMLElement): Promise<SymbolCheck | null> {\n if (!canVerifySymbols()) return null;\n const Detector = (window as unknown as { BarcodeDetector: DetectorCtor }).BarcodeDetector;\n const detector = new Detector({ formats: FORMATS });\n const expected = new Set<string>();\n const decoded = new Set<string>();\n for (const svg of Array.from(container.querySelectorAll<SVGSVGElement>('svg.lt-print-page'))) {\n svg.querySelectorAll('[data-code]').forEach((el) => expected.add(el.getAttribute('data-code')!));\n const found = await detector.detect(await rasterize(svg));\n for (const code of found) decoded.add(code.rawValue);\n }\n const missing = [...expected].filter((code) => !decoded.has(code));\n return { expected: expected.size, decoded: expected.size - missing.length, missing };\n}\n","import { useMemo, useRef, useState } from 'react';\n\nimport { renderSheetSvg } from '../../../../shared/labels/render-svg';\nimport type { LabelSheet, LabelWarning } from '../../../../shared/labels/types';\nimport { canVerifySymbols, verifySymbols, type SymbolCheck } from '../../lib/verify-symbols';\n\nconst WARNINGS_SHOWN = 8;\n\n/**\n * Pages as they will print, label outlines dashed, with every warning that\n * would make a code fail on the floor listed under them. Markup comes from\n * the shared renderer, which escapes all label text.\n */\nexport function LabelSheetPreview({ sheet, warnings }: { sheet: LabelSheet; warnings: LabelWarning[] }) {\n const pages = useMemo(() => renderSheetSvg(sheet, { outlines: true }), [sheet]);\n const pagesRef = useRef<HTMLDivElement>(null);\n const [check, setCheck] = useState<SymbolCheck | null>(null);\n const [checking, setChecking] = useState(false);\n const labelCount = sheet.pages.reduce((n, p) => n + p.labels.length, 0);\n\n async function runCheck() {\n if (!pagesRef.current) return;\n setChecking(true);\n try {\n setCheck(await verifySymbols(pagesRef.current));\n } finally {\n setChecking(false);\n }\n }\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3 text-xs text-text-secondary\">\n <span>{labelCount} labels on {pages.length} {pages.length === 1 ? 'page' : 'pages'} · {sheet.media.name}</span>\n {canVerifySymbols() && (\n <button onClick={runCheck} disabled={checking} className=\"ml-auto text-accent hover:text-accent-hover\">\n {checking ? 'Checking…' : 'Check codes on screen'}\n </button>\n )}\n </div>\n {check && (\n <p role=\"status\" className={`text-xs ${check.missing.length ? 'text-status-error' : 'text-status-success'}`}>\n {check.decoded} of {check.expected} codes read back on screen\n {check.missing.length > 0 && `; not read: ${check.missing.slice(0, 3).join(', ')}`}\n </p>\n )}\n {warnings.length > 0 && (\n <ul aria-label=\"Label warnings\" className=\"space-y-1 border-l-2 border-l-status-error pl-3\">\n {warnings.slice(0, WARNINGS_SHOWN).map((w, i) => (\n <li key={i} className=\"text-xs text-text-secondary\">\n <span className=\"font-medium text-status-error\">Label {w.index + 1}</span> · {w.detail}\n </li>\n ))}\n {warnings.length > WARNINGS_SHOWN && (\n <li className=\"text-xs text-text-tertiary\">and {warnings.length - WARNINGS_SHOWN} more</li>\n )}\n </ul>\n )}\n <div ref={pagesRef} className=\"grid gap-4 @split:grid-cols-2\">\n {pages.map((svg, i) => (\n <div\n key={i}\n data-page={i + 1}\n className=\"bg-white shadow-sm [&>svg]:w-full [&>svg]:h-auto\"\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n ))}\n </div>\n </div>\n );\n}\n","import { SelectField, TextArea, TextField } from '../common/form/Field';\nimport type { LabelSource } from '../../api/labels';\n\nexport type EditableSource = Extract<LabelSource, { kind: 'list' | 'range' }>;\n\nexport const DEFAULT_RANGE: EditableSource = { kind: 'range', prefix: '', from: 1, to: 10, pad: 0 };\n\n/** A pasted list or a numeric range: the targets an admin types. */\nexport function LabelSourceFields({ value, onChange }: { value: EditableSource; onChange: (next: EditableSource) => void }) {\n return (\n <div className=\"space-y-3\">\n <SelectField\n label=\"Targets\"\n hint=\"A range numbers targets in sequence; a list can carry a column per text token.\"\n value={value.kind}\n options={[{ value: 'range', label: 'A numbered range' }, { value: 'list', label: 'A pasted list' }]}\n onChange={(e) => onChange(e.target.value === 'list' ? { kind: 'list', text: '' } : DEFAULT_RANGE)}\n />\n {value.kind === 'range' ? (\n <div className=\"grid gap-3 grid-cols-2 @form-cols:grid-cols-4\">\n <TextField label=\"Prefix\" value={value.prefix ?? ''} onChange={(e) => onChange({ ...value, prefix: e.target.value })} placeholder=\"A-\" />\n <TextField label=\"From\" type=\"number\" min={0} value={value.from} onChange={(e) => onChange({ ...value, from: Number(e.target.value) })} />\n <TextField label=\"To\" type=\"number\" min={0} value={value.to} onChange={(e) => onChange({ ...value, to: Number(e.target.value) })} />\n <TextField label=\"Digits\" hint=\"Pads with zeros: 2 prints 01.\" type=\"number\" min={0} max={12} value={value.pad ?? 0} onChange={(e) => onChange({ ...value, pad: Number(e.target.value) })} />\n </div>\n ) : (\n <TextArea\n label=\"List\"\n hint='One target per line. Start with a header such as \"target,subtitle\" to fill {item.subtitle}.'\n rows={6}\n value={value.text}\n onChange={(e) => onChange({ kind: 'list', text: e.target.value })}\n />\n )}\n </div>\n );\n}\n","import { SelectField } from '../common/form/Field';\nimport { useRoles } from '../../api/roles';\nimport type { LabelSource } from '../../api/labels';\n\nexport type UserSource = Extract<LabelSource, { kind: 'users' }>;\n\n/** Whose badges print when no one is selected: every badge holder, or every holder in one role. */\nexport function BadgeSourceFields({ value, onChange }: { value: UserSource; onChange: (next: UserSource) => void }) {\n const { data } = useRoles();\n return (\n <div className=\"space-y-3\">\n <SelectField\n label=\"Badges for\"\n hint=\"Users without a badge are left out; up to 200 badges print per job.\"\n value={value.role === undefined ? 'all' : 'role'}\n options={[{ value: 'all', label: 'Everyone with a badge' }, { value: 'role', label: 'Everyone in a role' }]}\n onChange={(e) => onChange(e.target.value === 'role' ? { kind: 'users', role: '' } : { kind: 'users' })}\n />\n {value.role !== undefined && (\n <SelectField\n label=\"Role\"\n value={value.role}\n placeholder=\"Choose…\"\n options={(data?.roles ?? []).map((r) => ({ value: r, label: r }))}\n onChange={(e) => onChange({ kind: 'users', role: e.target.value })}\n />\n )}\n </div>\n );\n}\n","import { useEffect, useMemo, useState } from 'react';\n\nimport { Modal } from '../common/modal/Modal';\nimport { SelectField } from '../common/form/Field';\nimport {\n useIssueLabels, useLabelMedia, useLabelTransports, usePreviewLabels,\n type LabelLayout, type LabelOutput, type LabelSource, type LabelTemplate,\n} from '../../api/labels';\nimport { printSheet } from '../../lib/print-sheet';\nimport { CredentialConfirm } from './CredentialConfirmModal';\nimport { LabelLayoutFields } from './LabelLayoutFields';\nimport { LabelSheetPreview } from './LabelSheetPreview';\nimport { DEFAULT_RANGE, LabelSourceFields, type EditableSource } from './LabelSourceFields';\nimport { BadgeSourceFields, type UserSource } from './BadgeSourceFields';\n\ninterface PrintLabelsPanelProps {\n open: boolean;\n onClose: () => void;\n title: string;\n /** The templates this entry point offers. */\n templates: LabelTemplate[];\n /** Targets chosen elsewhere (selected rows or users); without it, a range or list, or for badges, everyone or a role. */\n source?: LabelSource;\n /** How many targets `source` names, for the confirmation. */\n sourceCount?: number;\n /** True when the templates print badges (an identity scheme). */\n identity?: boolean;\n}\n\n/**\n * The one print flow every entry point opens: choose a template, targets and\n * stock, preview the pages with their warnings, then print in the browser,\n * download a PDF or ZPL, or send to a registered printer. A sensitive\n * template (every badge) confirms first; the server records the requester\n * before it composes a single code.\n */\nexport function PrintLabelsPanel({ open, onClose, title, templates, source, sourceCount, identity = false }: PrintLabelsPanelProps) {\n const { data: mediaData } = useLabelMedia();\n const { data: transportData } = useLabelTransports();\n const preview = usePreviewLabels();\n const issue = useIssueLabels();\n\n const [templateName, setTemplateName] = useState(templates[0]?.name ?? '');\n const [typed, setTyped] = useState<EditableSource>(DEFAULT_RANGE);\n const [holders, setHolders] = useState<UserSource>({ kind: 'users' });\n const [layout, setLayout] = useState<LabelLayout>({});\n const [transport, setTransport] = useState('');\n const [pending, setPending] = useState<LabelOutput | null>(null);\n const [done, setDone] = useState<string | null>(null);\n\n const template = templates.find((t) => t.name === templateName) ?? null;\n const media = mediaData?.media ?? [];\n const chosenMedia = media.find((m) => m.id === layout.media);\n const thermal = chosenMedia?.family === 'thermal';\n const jobSource: LabelSource = source ?? (identity ? holders : typed);\n const sourceReady = !(jobSource.kind === 'users' && jobSource.role === '');\n\n useEffect(() => {\n if (template && mediaData) setLayout((l) => ({ ...l, media: template.media ?? mediaData.defaultMedia, startPosition: 1 }));\n }, [template?.name, mediaData?.defaultMedia]);\n\n const request = useMemo(() => ({ template: templateName, source: jobSource, layout }), [templateName, jobSource, layout]);\n const requestKey = JSON.stringify(request);\n const [previewedKey, setPreviewedKey] = useState<string | null>(null);\n // Printing follows a preview of exactly this request, so its warnings are seen first.\n const previewed = !!preview.data && previewedKey === requestKey;\n const count = sourceCount ?? preview.data?.labelCount ?? 0;\n const ready = !!template && previewed && sourceReady && !issue.isPending;\n\n function run(output: LabelOutput, confirm = false) {\n setDone(null);\n if (template?.sensitive && !confirm) {\n setPending(output);\n return;\n }\n issue.mutate({ ...request, output, confirm: template?.sensitive ? true : undefined }, {\n onSuccess: (result) => {\n setPending(null);\n if (result.sheet) printSheet(result.sheet);\n setDone(result.downloaded\n ? `Saved ${result.downloaded}.`\n : result.receipt ? `Sent to ${output.slice('transport:'.length)} (job ${result.jobId}).` : `Printing job ${result.jobId}.`);\n },\n });\n }\n\n const sendable = (transportData?.transports ?? []).filter((t) => t.formats.includes(thermal ? 'zpl' : 'pdf'));\n\n return (\n <Modal open={open} onClose={onClose} title={title} maxWidth=\"max-w-5xl\" closeOnBackdrop={false}>\n <div className=\"@container space-y-6\">\n <div className=\"grid gap-6 @split:grid-cols-[22rem_1fr]\">\n <div className=\"space-y-4\">\n <SelectField\n label=\"Template\"\n hint={template?.description ?? 'What each label shows.'}\n value={templateName}\n placeholder={templates.length ? undefined : 'No templates for this choice'}\n options={templates.map((t) => ({ value: t.name, label: t.title }))}\n onChange={(e) => setTemplateName(e.target.value)}\n />\n {source\n ? <p className=\"text-xs text-text-secondary\">{sourceCount ?? 0} selected</p>\n : identity\n ? <BadgeSourceFields value={holders} onChange={setHolders} />\n : <LabelSourceFields value={typed} onChange={setTyped} />}\n <LabelLayoutFields media={media} value={layout} onChange={setLayout} />\n <button\n onClick={() => preview.mutate(request, { onSuccess: () => setPreviewedKey(requestKey) })}\n disabled={!template || !sourceReady || preview.isPending}\n className=\"btn-secondary text-xs\"\n >\n {preview.isPending ? 'Laying out…' : 'Preview'}\n </button>\n {preview.error && <p role=\"alert\" className=\"text-xs text-status-error\">{(preview.error as Error).message}</p>}\n </div>\n <div className=\"min-w-0\">\n {preview.data\n ? <LabelSheetPreview sheet={preview.data.sheet} warnings={preview.data.warnings} />\n : <p className=\"text-xs text-text-tertiary\">Preview the pages before printing.</p>}\n </div>\n </div>\n\n {pending ? (\n <CredentialConfirm\n count={count}\n identity={identity}\n isPending={issue.isPending}\n error={issue.error as Error | null}\n onConfirm={() => run(pending, true)}\n onClose={() => setPending(null)}\n />\n ) : (\n <div className=\"flex flex-wrap items-end gap-3 border-t border-surface-border pt-4\">\n {!previewed && <p className=\"text-xs text-text-tertiary\">Preview this choice to print it.</p>}\n {!thermal && <button onClick={() => run('sheet')} disabled={!ready} className=\"btn-primary text-xs\">Print</button>}\n {!thermal && <button onClick={() => run('pdf')} disabled={!ready} className=\"btn-secondary text-xs\">Download PDF</button>}\n {thermal && <button onClick={() => run('zpl')} disabled={!ready} className=\"btn-primary text-xs\">Download ZPL</button>}\n {sendable.length > 0 && (\n <>\n <SelectField\n label=\"Printer\"\n value={transport}\n placeholder=\"Choose…\"\n options={sendable.map((t) => ({ value: t.name, label: t.name }))}\n onChange={(e) => setTransport(e.target.value)}\n />\n <button onClick={() => run(`transport:${transport}`)} disabled={!ready || !transport} className=\"btn-secondary text-xs\">\n Send\n </button>\n </>\n )}\n {issue.error && <p role=\"alert\" className=\"text-xs text-status-error\">{(issue.error as Error).message}</p>}\n {done && <p role=\"status\" className=\"text-xs text-status-success ml-auto\">{done}</p>}\n </div>\n )}\n </div>\n </Modal>\n );\n}\n"],"names":["Field","label","required","hint","error","htmlFor","className","children","msgId","jsxs","jsx","describedBy","id","TextField","fieldClassName","rest","auto","useId","fieldId","SelectField","options","placeholder","o","TextArea","LabelLayoutFields","media","value","onChange","chosen","m","slots","e","FORMATS","RASTER_SCALE","canVerifySymbols","rasterize","svg","viewBox","canvas","image","markup","ctx","verifySymbols","container","Detector","detector","expected","decoded","el","found","code","missing","WARNINGS_SHOWN","LabelSheetPreview","sheet","warnings","pages","useMemo","renderSheetSvg","pagesRef","useRef","check","setCheck","useState","checking","setChecking","labelCount","n","p","runCheck","w","i","DEFAULT_RANGE","LabelSourceFields","BadgeSourceFields","data","useRoles","r","PrintLabelsPanel","open","onClose","title","templates","source","sourceCount","identity","mediaData","useLabelMedia","transportData","useLabelTransports","preview","usePreviewLabels","issue","useIssueLabels","templateName","setTemplateName","_a","typed","setTyped","holders","setHolders","layout","setLayout","transport","setTransport","pending","setPending","done","setDone","template","t","chosenMedia","thermal","jobSource","sourceReady","useEffect","l","request","requestKey","previewedKey","setPreviewedKey","previewed","count","_b","ready","run","output","confirm","result","printSheet","sendable","Modal","CredentialConfirm","Fragment"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as b,j as e}from"./vendor-query-DvWWuNIB.js";import{a as z}from"./tasks-Bil7gvm9.js";import{D as L,f as P,C as V,b as J,c as q,d as G,J as $,S}from"./index-C_dAJUzh.js";import{P as K}from"./PageHeaderWithStats-C-TrbKQL.js";import{S as R}from"./StatusBadge-DHVwxre2.js";import{W as Q}from"./WorkflowPill-BiLYq__w.js";import{T as M}from"./TimestampCell-BE7oKVJg.js";import{L as T,e as X}from"./vendor-react-_9U4mKFr.js";import{R as Y}from"./RolePill-BjD1Qw5y.js";import{U as Z}from"./UserName-Dw3R_zrl.js";import"./vendor-icons-ed7mYQw4.js";const ee="bg-stripes animate-pulse opacity-70";function I(t){switch(t){case"completed":return"text-status-success";case"in_progress":case"pending":return"text-status-warning";case"needs_intervention":return"text-status-error";case"cancelled":return"text-text-tertiary";default:return"text-text-tertiary"}}function E(t){switch(t){case"resolved":return"text-status-success";case"pending":return"text-status-warning";case"cancelled":return"text-text-tertiary";default:return"text-text-tertiary"}}function te(t,a,l){return`${t==="task"?"Task":l?"Notification":"Escalation"} is ${a.replace(/_/g," ")}`}function se(t,a){if(a)return ee;switch(t){case"completed":case"resolved":return"bg-status-success";case"pending":case"in_progress":case"needs_intervention":return"bg-status-warning";case"cancelled":return"bg-status-error";default:return"bg-text-tertiary"}}function ae(t){return t.startsWith("mcp")||t.startsWith("Mcp")}function A(t){return!t.workflow_type}function W(t,a){if(t.length<=a)return t;const l=Math.floor((a-1)/2);return`${t.slice(0,l)}…${t.slice(t.length-l)}`}function ne(t,a){const l=Date.now(),c=new Map,d=[];for(const s of a)s.task_id?(c.has(s.task_id)||c.set(s.task_id,[]),c.get(s.task_id).push(s)):d.push(s);const r=[...t].sort((s,x)=>new Date(s.created_at).getTime()-new Date(x.created_at).getTime()),i=[];for(const s of t)i.push(new Date(s.created_at).getTime()),s.completed_at&&i.push(new Date(s.completed_at).getTime());for(const s of a)i.push(new Date(s.created_at).getTime()),s.resolved_at&&i.push(new Date(s.resolved_at).getTime()),s.claimed_at&&i.push(new Date(s.claimed_at).getTime());if(i.length===0)return{lanes:[],timeMin:0,timeMax:1};const o=Math.min(...i),f=t.some(s=>!s.completed_at)||a.some(s=>!s.resolved_at)?Math.max(l,Math.max(...i)):Math.max(...i),u=f-o||1,m=s=>(s-o)/u*100,p=[];for(const s of r){const x=new Date(s.created_at).getTime(),v=s.completed_at?new Date(s.completed_at).getTime():l,k=!s.completed_at;p.push({kind:"task",id:s.id,label:s.workflow_type,taskId:s.id,startMs:x,endMs:v,startPct:m(x),widthPct:Math.max((v-x)/u*100,.5),durationMs:v-x,isOpen:k,task:s});const h=(c.get(s.id)||[]).sort((n,g)=>new Date(n.created_at).getTime()-new Date(g.created_at).getTime());for(const n of h){const g=new Date(n.created_at).getTime(),j=n.resolved_at?new Date(n.resolved_at).getTime():l,D=!n.resolved_at;let y=null;if(n.claimed_at){const w=new Date(n.claimed_at).getTime(),H=j-g||1;y=(w-g)/H*100}p.push({kind:"escalation",id:n.id,label:n.role,taskId:s.id,startMs:g,endMs:j,startPct:m(g),widthPct:Math.max((j-g)/u*100,.5),durationMs:j-g,isOpen:D,escalation:n,claimPct:y})}}for(const s of d){const x=new Date(s.created_at).getTime(),v=s.resolved_at?new Date(s.resolved_at).getTime():l;let k=null;if(s.claimed_at){const h=new Date(s.claimed_at).getTime(),n=v-x||1;k=(h-x)/n*100}p.push({kind:"escalation",id:s.id,label:s.role,taskId:"",startMs:x,endMs:v,startPct:m(x),widthPct:Math.max((v-x)/u*100,.5),durationMs:v-x,isOpen:!s.resolved_at,escalation:s,claimPct:k})}return{lanes:p,timeMin:o,timeMax:f}}function re(t,a,l,c=500){const[d,r]=b.useState(0),i=b.useRef(null),o=l-a||1;b.useEffect(()=>{if(t===0)return;i.current=null,r(0);let f;const u=m=>{i.current===null&&(i.current=m);const p=m-i.current,s=Math.min(p/c,1),x=1-Math.pow(1-s,3);r(x),s<1&&(f=requestAnimationFrame(u))};return f=requestAnimationFrame(u),()=>cancelAnimationFrame(f)},[t,c]);const N=b.useCallback(f=>{const u=(f.startMs-a)/o,m=(f.endMs-a)/o;if(d<u)return{width:0,opacity:0};const p=m-u||.001,s=Math.min((d-u)/p,1),x=f.widthPct*s,v=Math.min(s/.1,1);return{width:x,opacity:v}},[d,a,o]);return{progress:d,animatedBar:N}}function B({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"})})}function O({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.813 15.904L9 18.75l-.813-2.846a4.5 4.5 0 00-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 003.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 003.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 00-3.09 3.09zM18.259 8.715L18 9.75l-.259-1.035a3.375 3.375 0 00-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 002.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 002.455 2.456L21.75 6l-1.036.259a3.375 3.375 0 00-2.455 2.456zM16.894 20.567L16.5 21.75l-.394-1.183a2.25 2.25 0 00-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 001.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 001.423 1.423l1.183.394-1.183.394a2.25 2.25 0 00-1.423 1.423z"})})}function F({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0"})})}function U({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z"})})}function ie({allExpanded:t,onToggleAll:a}){return e.jsxs("div",{className:"flex items-center gap-4 mb-4 flex-wrap",children:[e.jsx("button",{onClick:a,className:"text-2xs text-accent hover:underline",children:t?"Collapse all":"Expand all"}),e.jsxs("div",{className:"flex items-center gap-4 ml-auto",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(B,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Task"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(O,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"AI Task"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(U,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Escalation"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(F,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Notification"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2.5 h-2.5 rounded-full dot-ring bg-status-success"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Done"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2.5 h-2.5 rounded-full dot-ring bg-status-warning"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Active"})]})]})]})}function oe({ticks:t}){return e.jsxs("div",{className:"flex",children:[e.jsx("div",{className:"w-52 shrink-0"}),e.jsx("div",{className:"flex-1 relative h-6 border-b border-surface-border",children:t.map(a=>e.jsx("span",{className:"absolute text-2xs font-mono text-text-tertiary -translate-x-1/2 bottom-1 whitespace-nowrap",style:{left:`${a.pct}%`},children:a.label},a.pct))})]})}function _({label:t,children:a}){return e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:t}),e.jsx("div",{className:"text-xs text-text-primary",children:a})]})}function le({traceId:t,href:a}){const[l,c]=b.useState(!1),d=i=>{i.stopPropagation(),navigator.clipboard.writeText(t),c(!0),setTimeout(()=>c(!1),1500)},r=i=>{i.stopPropagation(),a&&window.open(a,"_blank","noopener,noreferrer")};return e.jsxs("span",{className:"group/trace inline-flex items-center gap-1.5",children:[a&&e.jsx("button",{onClick:r,title:"Open trace",className:"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5",children:e.jsx("svg",{className:"w-3 h-3 text-text-tertiary hover:text-accent",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-4.5-4.5h6m0 0v6m0-6L10.5 15"})})}),e.jsx("button",{onClick:d,title:"Copy trace ID",className:"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5",children:e.jsx("svg",{className:`w-3 h-3 transition-colors ${l?"text-status-success":"text-text-tertiary hover:text-accent"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:l?e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"}):e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3"})})}),e.jsx("span",{className:"text-2xs text-accent",children:"Trace Details"})]})}function ce({task:t,traceUrl:a}){const l=t.completed_at?new Date(t.completed_at).getTime()-new Date(t.created_at).getTime():Date.now()-new Date(t.created_at).getTime();return e.jsxs("div",{className:"grid grid-cols-[3fr_1fr] gap-6",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(R,{status:t.status}),e.jsx(Q,{type:t.workflow_type})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(_,{label:"Started",children:e.jsx(M,{date:t.created_at})}),e.jsx(_,{label:"Completed",children:t.completed_at?e.jsx(M,{date:t.completed_at}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"In progress"})}),e.jsx(_,{label:"Duration",children:e.jsx(L,{ms:l,className:"font-mono text-sm"})})]}),t.milestones.length>0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Milestones"}),e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.milestones.map((c,d)=>e.jsxs("span",{className:"px-2 py-0.5 text-2xs font-mono bg-accent-faint/50 rounded text-text-secondary",children:[c.name,": ",String(c.value)]},d))})]})]}),e.jsxs("div",{className:"flex flex-col items-end gap-2",children:[e.jsx(T,{to:`/workflows/executions/${encodeURIComponent(t.workflow_id)}`,className:"block text-2xs text-accent hover:underline",children:"Execution Details"}),e.jsx(T,{to:`/workflows/tasks/detail/${t.id}`,className:"block text-2xs text-accent hover:underline",children:"Task Details"}),t.trace_id&&e.jsx(le,{traceId:t.trace_id,href:a?a.replace("{traceId}",t.trace_id):void 0})]})]})}function de({escalation:t}){const a=new Date(t.created_at).getTime(),l=t.claimed_at?new Date(t.claimed_at).getTime()-a:null,c=t.resolved_at?new Date(t.resolved_at).getTime()-a:null;return e.jsxs("div",{className:"grid grid-cols-[3fr_1fr] gap-6",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(R,{status:t.status}),e.jsx(Y,{role:t.role}),t.type&&e.jsxs("span",{className:"text-2xs text-text-tertiary",children:[t.type,t.subtype?` / ${t.subtype}`:""]})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(_,{label:"Created",children:e.jsx(M,{date:t.created_at})}),e.jsx(_,{label:"Claimed",children:t.claimed_at?e.jsxs(e.Fragment,{children:[e.jsx(M,{date:t.claimed_at}),e.jsxs("p",{className:"text-2xs text-text-tertiary mt-0.5",children:["after ",e.jsx(L,{ms:l}),t.assigned_to&&e.jsxs(e.Fragment,{children:[" ","by"," ",e.jsx("span",{className:"text-text-secondary font-medium",children:e.jsx(Z,{userId:t.assigned_to})})]})]})]}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"Unclaimed"})}),e.jsx(_,{label:"Resolved",children:t.resolved_at?e.jsxs(e.Fragment,{children:[e.jsx(M,{date:t.resolved_at}),e.jsxs("p",{className:"text-2xs text-text-tertiary mt-0.5",children:[e.jsx(L,{ms:c})," total"]})]}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"Pending"})})]}),t.description&&e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"}),e.jsx("p",{className:"text-2xs text-text-secondary leading-relaxed",children:t.description})]})]}),e.jsxs("div",{className:"flex flex-col items-end gap-2",children:[t.workflow_id&&e.jsx(T,{to:`/workflows/executions/${encodeURIComponent(t.workflow_id)}`,className:"block text-2xs text-accent hover:underline",children:"Execution Details"}),e.jsx(T,{to:`/escalations/detail/${t.id}`,className:"block text-2xs text-accent hover:underline",children:"Escalation Details"})]})]})}function xe({lane:t,ticks:a,isExpanded:l,onToggle:c,anim:d,animDone:r,traceUrl:i}){var m,p;const o=t.kind==="task",N=o?t.task.status:t.escalation.status,f=se(N,t.isOpen),u=d.opacity>0;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center border-b border-surface-border cursor-pointer hover:bg-surface-sunken/40 transition-colors",onClick:c,children:[e.jsxs("div",{className:`w-52 shrink-0 py-3 pr-4 flex items-center gap-2 ${o?"":"pl-6"}`,style:{opacity:u?1:0,transition:"opacity 0.15s ease-out"},children:[o?ae(t.task.workflow_type)?e.jsx(O,{className:`w-4 h-4 shrink-0 ${I(t.task.status)}`}):e.jsx(B,{className:`w-4 h-4 shrink-0 ${I(t.task.status)}`}):A(t.escalation)?e.jsx(F,{className:`w-4 h-4 shrink-0 ${E(t.escalation.status)}`}):e.jsx(U,{className:`w-4 h-4 shrink-0 ${E(t.escalation.status)}`}),e.jsx("p",{className:"text-xs font-mono text-text-secondary whitespace-nowrap overflow-hidden",title:te(t.kind,o?t.task.status:t.escalation.status,!o&&A(t.escalation)),children:o?W(t.label,24):W(((m=t.escalation)==null?void 0:m.role)??t.label,20)})]}),e.jsxs("div",{className:"flex-1 relative h-10",children:[a.map(s=>e.jsx("div",{className:"absolute top-0 bottom-0 w-px bg-surface-border opacity-30",style:{left:`${s.pct}%`}},s.pct)),e.jsxs("div",{className:`absolute top-2 h-6 rounded-sm ${l?`${f} ring-2 ring-accent ring-offset-1`:`${f} hover:opacity-80`}`,style:{left:`${t.startPct}%`,width:u?`${Math.max(d.width,.3)}%`:"0%",minWidth:u?"4px":"0px",opacity:d.opacity},title:`${t.label} — ${P(t.durationMs)} — ${new Date(t.startMs).toLocaleTimeString()}`,children:[d.width>8&&r&&e.jsx("span",{className:"absolute inset-0 flex items-center px-1.5 text-2xs font-mono text-text-inverse truncate",children:P(t.durationMs)}),t.claimPct!=null&&r&&e.jsx("div",{className:"absolute top-0 bottom-0 w-px border-l border-dashed border-text-inverse/70",style:{left:`${t.claimPct}%`},title:(p=t.escalation)!=null&&p.assigned_to?`Claimed by ${t.escalation.assigned_to}`:"Claimed",children:e.jsx("div",{className:"absolute -top-1 -left-[3px] w-[7px] h-[7px] rounded-full bg-text-inverse border border-status-warning"})})]})]})]}),e.jsx(V,{open:l,children:e.jsx("div",{className:"py-4 px-6 pl-52 border-b border-surface-border bg-surface-sunken/20",children:o&&t.task?e.jsx(ce,{task:t.task,traceUrl:i}):t.escalation?e.jsx(de,{escalation:t.escalation}):null})})]})}function me({tasks:t,escalations:a,traceUrl:l}){const[c,d]=b.useState(new Set),{lanes:r,timeMin:i,timeMax:o}=b.useMemo(()=>ne(t,a),[t,a]),N=o-i||1,{progress:f,animatedBar:u}=re(r.length,i,o);if(r.length===0)return e.jsx("p",{className:"text-sm text-text-tertiary py-8 text-center",children:"No events in this process."});const m=5,p=Array.from({length:m+1},(n,g)=>({pct:g/m*100,label:P(Math.round(g/m*N))})),s=n=>{d(g=>{const j=new Set(g);return j.has(n)?j.delete(n):j.add(n),j})},x=r.map(n=>n.id),v=x.length>0&&x.every(n=>c.has(n)),k=()=>{d(v?new Set:new Set(x))},h=f>=1;return e.jsxs("div",{className:"py-2",children:[e.jsx(ie,{allExpanded:v,onToggleAll:k}),e.jsx(oe,{ticks:p}),r.map(n=>e.jsx(xe,{lane:n,ticks:p,isExpanded:c.has(n.id),onToggle:()=>s(n.id),anim:u(n),animDone:h,traceUrl:l},`${n.kind}-${n.id}`))]})}function C(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}function ue(t){return t.length===0?null:[...t].sort((a,l)=>new Date(a.created_at).getTime()-new Date(l.created_at).getTime())[0]}function ye(){var k;const{originId:t}=X();J(t);const{data:a,isLoading:l}=z(t??""),{data:c}=q(),d=((k=c==null?void 0:c.telemetry)==null?void 0:k.traceUrl)??null,r=(a==null?void 0:a.tasks)??[],i=(a==null?void 0:a.escalations)??[],o=b.useMemo(()=>ue(r),[r]),N=b.useMemo(()=>C(o==null?void 0:o.envelope),[o]),f=b.useMemo(()=>{if(o!=null&&o.data)return C(o.data);const h=r.filter(n=>n.status==="completed"&&n.data).sort((n,g)=>new Date(g.completed_at).getTime()-new Date(n.completed_at).getTime());return h.length>0?C(h[0].data):null},[o,r]),u=b.useMemo(()=>r.length>0&&r.some(h=>h.status!=="completed"&&h.status!=="cancelled"),[r]),m=b.useMemo(()=>{const h=r.filter(j=>j.status==="completed").length,n=r.filter(j=>j.status==="needs_intervention").length,g=i.filter(j=>j.status==="resolved").length;return{tasks:r.length,completed:h,escalated:n,escalations:i.length,resolved:g}},[r,i]),p=b.useMemo(()=>{if(r.length===0&&i.length===0)return null;const n=[...r.map(w=>w.created_at),...i.map(w=>w.created_at)].sort()[0],g=r.every(w=>w.status==="completed"||w.status==="cancelled"),j=i.every(w=>w.status==="resolved"),D=r.length>0&&g&&j,y=D?[...r.map(w=>w.completed_at),...i.map(w=>w.resolved_at)].filter(Boolean).sort().pop()??null:null;return{startIso:n,endIso:y,isFinished:D,elapsed:G(n,y)}},[r,i]),s=b.useMemo(()=>{const h=[];return p&&h.push({label:p.isFinished?"Completed":"Running",value:p.elapsed,dotClass:p.isFinished?"bg-status-success":"bg-status-pending animate-pulse"}),h.push({label:"Tasks",value:`${m.completed}/${m.tasks}`},{label:"Escalations",value:`${m.resolved}/${m.escalations}`}),h},[p,m]);if(l&&r.length===0)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]});const v=r.some(h=>h.envelope!==void 0)&&(N||f||u);return e.jsxs("div",{children:[e.jsx(K,{title:"Process Detail",docsHash:"#docs:dashboard.md:process-detail",subtitle:t,stats:s}),v&&e.jsxs("div",{className:"grid grid-cols-1 @split:grid-cols-2 gap-8 mb-10",children:[e.jsx("div",{children:N?e.jsx($,{data:N,label:"Input",defaultMode:"json",defaultCollapsed:!0}):e.jsxs("div",{children:[e.jsx(S,{children:"Input"}),e.jsx("div",{className:"font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-tertiary italic mt-2",children:"Waiting for task..."})]})}),e.jsx("div",{children:f?e.jsx($,{data:f,label:"Output",defaultMode:"json",defaultCollapsed:!0}):u?e.jsxs("div",{children:[e.jsx(S,{children:"Output"}),e.jsxs("div",{className:"flex items-center gap-2 font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-secondary mt-2",children:[e.jsx("span",{className:"w-2.5 h-2.5 rounded-full dot-ring bg-status-pending animate-pulse"}),"Processing..."]})]}):null})]}),e.jsx(S,{className:"mb-6",children:"Timeline"}),e.jsx(me,{tasks:r,escalations:i,traceUrl:d})]})}export{ye as ProcessDetailPage};
2
- //# sourceMappingURL=ProcessDetailPage-0xS9EdHe.js.map
1
+ import{a as b,j as e}from"./vendor-query-DvWWuNIB.js";import{a as z}from"./tasks-BQSO3Sjv.js";import{D as L,f as P,C as V,b as J,c as q,d as G,J as $,S}from"./index-Do9Y6Fgt.js";import{P as K}from"./PageHeaderWithStats-DWKap7gs.js";import{S as R}from"./StatusBadge-DHVwxre2.js";import{W as Q}from"./WorkflowPill-BNm3R4pP.js";import{T as M}from"./TimestampCell-BBPb9TI2.js";import{L as T,e as X}from"./vendor-react-_9U4mKFr.js";import{R as Y}from"./RolePill-KhT-Yehm.js";import{U as Z}from"./UserName-D6y9AnuY.js";import"./vendor-icons-D48ijXZU.js";const ee="bg-stripes animate-pulse opacity-70";function I(t){switch(t){case"completed":return"text-status-success";case"in_progress":case"pending":return"text-status-warning";case"needs_intervention":return"text-status-error";case"cancelled":return"text-text-tertiary";default:return"text-text-tertiary"}}function E(t){switch(t){case"resolved":return"text-status-success";case"pending":return"text-status-warning";case"cancelled":return"text-text-tertiary";default:return"text-text-tertiary"}}function te(t,a,l){return`${t==="task"?"Task":l?"Notification":"Escalation"} is ${a.replace(/_/g," ")}`}function se(t,a){if(a)return ee;switch(t){case"completed":case"resolved":return"bg-status-success";case"pending":case"in_progress":case"needs_intervention":return"bg-status-warning";case"cancelled":return"bg-status-error";default:return"bg-text-tertiary"}}function ae(t){return t.startsWith("mcp")||t.startsWith("Mcp")}function A(t){return!t.workflow_type}function W(t,a){if(t.length<=a)return t;const l=Math.floor((a-1)/2);return`${t.slice(0,l)}…${t.slice(t.length-l)}`}function ne(t,a){const l=Date.now(),c=new Map,d=[];for(const s of a)s.task_id?(c.has(s.task_id)||c.set(s.task_id,[]),c.get(s.task_id).push(s)):d.push(s);const r=[...t].sort((s,x)=>new Date(s.created_at).getTime()-new Date(x.created_at).getTime()),i=[];for(const s of t)i.push(new Date(s.created_at).getTime()),s.completed_at&&i.push(new Date(s.completed_at).getTime());for(const s of a)i.push(new Date(s.created_at).getTime()),s.resolved_at&&i.push(new Date(s.resolved_at).getTime()),s.claimed_at&&i.push(new Date(s.claimed_at).getTime());if(i.length===0)return{lanes:[],timeMin:0,timeMax:1};const o=Math.min(...i),f=t.some(s=>!s.completed_at)||a.some(s=>!s.resolved_at)?Math.max(l,Math.max(...i)):Math.max(...i),u=f-o||1,m=s=>(s-o)/u*100,p=[];for(const s of r){const x=new Date(s.created_at).getTime(),v=s.completed_at?new Date(s.completed_at).getTime():l,k=!s.completed_at;p.push({kind:"task",id:s.id,label:s.workflow_type,taskId:s.id,startMs:x,endMs:v,startPct:m(x),widthPct:Math.max((v-x)/u*100,.5),durationMs:v-x,isOpen:k,task:s});const h=(c.get(s.id)||[]).sort((n,g)=>new Date(n.created_at).getTime()-new Date(g.created_at).getTime());for(const n of h){const g=new Date(n.created_at).getTime(),j=n.resolved_at?new Date(n.resolved_at).getTime():l,D=!n.resolved_at;let y=null;if(n.claimed_at){const w=new Date(n.claimed_at).getTime(),H=j-g||1;y=(w-g)/H*100}p.push({kind:"escalation",id:n.id,label:n.role,taskId:s.id,startMs:g,endMs:j,startPct:m(g),widthPct:Math.max((j-g)/u*100,.5),durationMs:j-g,isOpen:D,escalation:n,claimPct:y})}}for(const s of d){const x=new Date(s.created_at).getTime(),v=s.resolved_at?new Date(s.resolved_at).getTime():l;let k=null;if(s.claimed_at){const h=new Date(s.claimed_at).getTime(),n=v-x||1;k=(h-x)/n*100}p.push({kind:"escalation",id:s.id,label:s.role,taskId:"",startMs:x,endMs:v,startPct:m(x),widthPct:Math.max((v-x)/u*100,.5),durationMs:v-x,isOpen:!s.resolved_at,escalation:s,claimPct:k})}return{lanes:p,timeMin:o,timeMax:f}}function re(t,a,l,c=500){const[d,r]=b.useState(0),i=b.useRef(null),o=l-a||1;b.useEffect(()=>{if(t===0)return;i.current=null,r(0);let f;const u=m=>{i.current===null&&(i.current=m);const p=m-i.current,s=Math.min(p/c,1),x=1-Math.pow(1-s,3);r(x),s<1&&(f=requestAnimationFrame(u))};return f=requestAnimationFrame(u),()=>cancelAnimationFrame(f)},[t,c]);const N=b.useCallback(f=>{const u=(f.startMs-a)/o,m=(f.endMs-a)/o;if(d<u)return{width:0,opacity:0};const p=m-u||.001,s=Math.min((d-u)/p,1),x=f.widthPct*s,v=Math.min(s/.1,1);return{width:x,opacity:v}},[d,a,o]);return{progress:d,animatedBar:N}}function B({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"})})}function O({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.813 15.904L9 18.75l-.813-2.846a4.5 4.5 0 00-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 003.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 003.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 00-3.09 3.09zM18.259 8.715L18 9.75l-.259-1.035a3.375 3.375 0 00-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 002.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 002.455 2.456L21.75 6l-1.036.259a3.375 3.375 0 00-2.455 2.456zM16.894 20.567L16.5 21.75l-.394-1.183a2.25 2.25 0 00-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 001.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 001.423 1.423l1.183.394-1.183.394a2.25 2.25 0 00-1.423 1.423z"})})}function F({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0"})})}function U({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z"})})}function ie({allExpanded:t,onToggleAll:a}){return e.jsxs("div",{className:"flex items-center gap-4 mb-4 flex-wrap",children:[e.jsx("button",{onClick:a,className:"text-2xs text-accent hover:underline",children:t?"Collapse all":"Expand all"}),e.jsxs("div",{className:"flex items-center gap-4 ml-auto",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(B,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Task"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(O,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"AI Task"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(U,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Escalation"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(F,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Notification"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2.5 h-2.5 rounded-full dot-ring bg-status-success"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Done"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2.5 h-2.5 rounded-full dot-ring bg-status-warning"}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:"Active"})]})]})]})}function oe({ticks:t}){return e.jsxs("div",{className:"flex",children:[e.jsx("div",{className:"w-52 shrink-0"}),e.jsx("div",{className:"flex-1 relative h-6 border-b border-surface-border",children:t.map(a=>e.jsx("span",{className:"absolute text-2xs font-mono text-text-tertiary -translate-x-1/2 bottom-1 whitespace-nowrap",style:{left:`${a.pct}%`},children:a.label},a.pct))})]})}function _({label:t,children:a}){return e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:t}),e.jsx("div",{className:"text-xs text-text-primary",children:a})]})}function le({traceId:t,href:a}){const[l,c]=b.useState(!1),d=i=>{i.stopPropagation(),navigator.clipboard.writeText(t),c(!0),setTimeout(()=>c(!1),1500)},r=i=>{i.stopPropagation(),a&&window.open(a,"_blank","noopener,noreferrer")};return e.jsxs("span",{className:"group/trace inline-flex items-center gap-1.5",children:[a&&e.jsx("button",{onClick:r,title:"Open trace",className:"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5",children:e.jsx("svg",{className:"w-3 h-3 text-text-tertiary hover:text-accent",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-4.5-4.5h6m0 0v6m0-6L10.5 15"})})}),e.jsx("button",{onClick:d,title:"Copy trace ID",className:"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5",children:e.jsx("svg",{className:`w-3 h-3 transition-colors ${l?"text-status-success":"text-text-tertiary hover:text-accent"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:l?e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"}):e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3"})})}),e.jsx("span",{className:"text-2xs text-accent",children:"Trace Details"})]})}function ce({task:t,traceUrl:a}){const l=t.completed_at?new Date(t.completed_at).getTime()-new Date(t.created_at).getTime():Date.now()-new Date(t.created_at).getTime();return e.jsxs("div",{className:"grid grid-cols-[3fr_1fr] gap-6",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(R,{status:t.status}),e.jsx(Q,{type:t.workflow_type})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(_,{label:"Started",children:e.jsx(M,{date:t.created_at})}),e.jsx(_,{label:"Completed",children:t.completed_at?e.jsx(M,{date:t.completed_at}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"In progress"})}),e.jsx(_,{label:"Duration",children:e.jsx(L,{ms:l,className:"font-mono text-sm"})})]}),t.milestones.length>0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Milestones"}),e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.milestones.map((c,d)=>e.jsxs("span",{className:"px-2 py-0.5 text-2xs font-mono bg-accent-faint/50 rounded text-text-secondary",children:[c.name,": ",String(c.value)]},d))})]})]}),e.jsxs("div",{className:"flex flex-col items-end gap-2",children:[e.jsx(T,{to:`/workflows/executions/${encodeURIComponent(t.workflow_id)}`,className:"block text-2xs text-accent hover:underline",children:"Execution Details"}),e.jsx(T,{to:`/workflows/tasks/detail/${t.id}`,className:"block text-2xs text-accent hover:underline",children:"Task Details"}),t.trace_id&&e.jsx(le,{traceId:t.trace_id,href:a?a.replace("{traceId}",t.trace_id):void 0})]})]})}function de({escalation:t}){const a=new Date(t.created_at).getTime(),l=t.claimed_at?new Date(t.claimed_at).getTime()-a:null,c=t.resolved_at?new Date(t.resolved_at).getTime()-a:null;return e.jsxs("div",{className:"grid grid-cols-[3fr_1fr] gap-6",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(R,{status:t.status}),e.jsx(Y,{role:t.role}),t.type&&e.jsxs("span",{className:"text-2xs text-text-tertiary",children:[t.type,t.subtype?` / ${t.subtype}`:""]})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(_,{label:"Created",children:e.jsx(M,{date:t.created_at})}),e.jsx(_,{label:"Claimed",children:t.claimed_at?e.jsxs(e.Fragment,{children:[e.jsx(M,{date:t.claimed_at}),e.jsxs("p",{className:"text-2xs text-text-tertiary mt-0.5",children:["after ",e.jsx(L,{ms:l}),t.assigned_to&&e.jsxs(e.Fragment,{children:[" ","by"," ",e.jsx("span",{className:"text-text-secondary font-medium",children:e.jsx(Z,{userId:t.assigned_to})})]})]})]}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"Unclaimed"})}),e.jsx(_,{label:"Resolved",children:t.resolved_at?e.jsxs(e.Fragment,{children:[e.jsx(M,{date:t.resolved_at}),e.jsxs("p",{className:"text-2xs text-text-tertiary mt-0.5",children:[e.jsx(L,{ms:c})," total"]})]}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"Pending"})})]}),t.description&&e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"}),e.jsx("p",{className:"text-2xs text-text-secondary leading-relaxed",children:t.description})]})]}),e.jsxs("div",{className:"flex flex-col items-end gap-2",children:[t.workflow_id&&e.jsx(T,{to:`/workflows/executions/${encodeURIComponent(t.workflow_id)}`,className:"block text-2xs text-accent hover:underline",children:"Execution Details"}),e.jsx(T,{to:`/escalations/detail/${t.id}`,className:"block text-2xs text-accent hover:underline",children:"Escalation Details"})]})]})}function xe({lane:t,ticks:a,isExpanded:l,onToggle:c,anim:d,animDone:r,traceUrl:i}){var m,p;const o=t.kind==="task",N=o?t.task.status:t.escalation.status,f=se(N,t.isOpen),u=d.opacity>0;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center border-b border-surface-border cursor-pointer hover:bg-surface-sunken/40 transition-colors",onClick:c,children:[e.jsxs("div",{className:`w-52 shrink-0 py-3 pr-4 flex items-center gap-2 ${o?"":"pl-6"}`,style:{opacity:u?1:0,transition:"opacity 0.15s ease-out"},children:[o?ae(t.task.workflow_type)?e.jsx(O,{className:`w-4 h-4 shrink-0 ${I(t.task.status)}`}):e.jsx(B,{className:`w-4 h-4 shrink-0 ${I(t.task.status)}`}):A(t.escalation)?e.jsx(F,{className:`w-4 h-4 shrink-0 ${E(t.escalation.status)}`}):e.jsx(U,{className:`w-4 h-4 shrink-0 ${E(t.escalation.status)}`}),e.jsx("p",{className:"text-xs font-mono text-text-secondary whitespace-nowrap overflow-hidden",title:te(t.kind,o?t.task.status:t.escalation.status,!o&&A(t.escalation)),children:o?W(t.label,24):W(((m=t.escalation)==null?void 0:m.role)??t.label,20)})]}),e.jsxs("div",{className:"flex-1 relative h-10",children:[a.map(s=>e.jsx("div",{className:"absolute top-0 bottom-0 w-px bg-surface-border opacity-30",style:{left:`${s.pct}%`}},s.pct)),e.jsxs("div",{className:`absolute top-2 h-6 rounded-sm ${l?`${f} ring-2 ring-accent ring-offset-1`:`${f} hover:opacity-80`}`,style:{left:`${t.startPct}%`,width:u?`${Math.max(d.width,.3)}%`:"0%",minWidth:u?"4px":"0px",opacity:d.opacity},title:`${t.label} — ${P(t.durationMs)} — ${new Date(t.startMs).toLocaleTimeString()}`,children:[d.width>8&&r&&e.jsx("span",{className:"absolute inset-0 flex items-center px-1.5 text-2xs font-mono text-text-inverse truncate",children:P(t.durationMs)}),t.claimPct!=null&&r&&e.jsx("div",{className:"absolute top-0 bottom-0 w-px border-l border-dashed border-text-inverse/70",style:{left:`${t.claimPct}%`},title:(p=t.escalation)!=null&&p.assigned_to?`Claimed by ${t.escalation.assigned_to}`:"Claimed",children:e.jsx("div",{className:"absolute -top-1 -left-[3px] w-[7px] h-[7px] rounded-full bg-text-inverse border border-status-warning"})})]})]})]}),e.jsx(V,{open:l,children:e.jsx("div",{className:"py-4 px-6 pl-52 border-b border-surface-border bg-surface-sunken/20",children:o&&t.task?e.jsx(ce,{task:t.task,traceUrl:i}):t.escalation?e.jsx(de,{escalation:t.escalation}):null})})]})}function me({tasks:t,escalations:a,traceUrl:l}){const[c,d]=b.useState(new Set),{lanes:r,timeMin:i,timeMax:o}=b.useMemo(()=>ne(t,a),[t,a]),N=o-i||1,{progress:f,animatedBar:u}=re(r.length,i,o);if(r.length===0)return e.jsx("p",{className:"text-sm text-text-tertiary py-8 text-center",children:"No events in this process."});const m=5,p=Array.from({length:m+1},(n,g)=>({pct:g/m*100,label:P(Math.round(g/m*N))})),s=n=>{d(g=>{const j=new Set(g);return j.has(n)?j.delete(n):j.add(n),j})},x=r.map(n=>n.id),v=x.length>0&&x.every(n=>c.has(n)),k=()=>{d(v?new Set:new Set(x))},h=f>=1;return e.jsxs("div",{className:"py-2",children:[e.jsx(ie,{allExpanded:v,onToggleAll:k}),e.jsx(oe,{ticks:p}),r.map(n=>e.jsx(xe,{lane:n,ticks:p,isExpanded:c.has(n.id),onToggle:()=>s(n.id),anim:u(n),animDone:h,traceUrl:l},`${n.kind}-${n.id}`))]})}function C(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}function ue(t){return t.length===0?null:[...t].sort((a,l)=>new Date(a.created_at).getTime()-new Date(l.created_at).getTime())[0]}function ye(){var k;const{originId:t}=X();J(t);const{data:a,isLoading:l}=z(t??""),{data:c}=q(),d=((k=c==null?void 0:c.telemetry)==null?void 0:k.traceUrl)??null,r=(a==null?void 0:a.tasks)??[],i=(a==null?void 0:a.escalations)??[],o=b.useMemo(()=>ue(r),[r]),N=b.useMemo(()=>C(o==null?void 0:o.envelope),[o]),f=b.useMemo(()=>{if(o!=null&&o.data)return C(o.data);const h=r.filter(n=>n.status==="completed"&&n.data).sort((n,g)=>new Date(g.completed_at).getTime()-new Date(n.completed_at).getTime());return h.length>0?C(h[0].data):null},[o,r]),u=b.useMemo(()=>r.length>0&&r.some(h=>h.status!=="completed"&&h.status!=="cancelled"),[r]),m=b.useMemo(()=>{const h=r.filter(j=>j.status==="completed").length,n=r.filter(j=>j.status==="needs_intervention").length,g=i.filter(j=>j.status==="resolved").length;return{tasks:r.length,completed:h,escalated:n,escalations:i.length,resolved:g}},[r,i]),p=b.useMemo(()=>{if(r.length===0&&i.length===0)return null;const n=[...r.map(w=>w.created_at),...i.map(w=>w.created_at)].sort()[0],g=r.every(w=>w.status==="completed"||w.status==="cancelled"),j=i.every(w=>w.status==="resolved"),D=r.length>0&&g&&j,y=D?[...r.map(w=>w.completed_at),...i.map(w=>w.resolved_at)].filter(Boolean).sort().pop()??null:null;return{startIso:n,endIso:y,isFinished:D,elapsed:G(n,y)}},[r,i]),s=b.useMemo(()=>{const h=[];return p&&h.push({label:p.isFinished?"Completed":"Running",value:p.elapsed,dotClass:p.isFinished?"bg-status-success":"bg-status-pending animate-pulse"}),h.push({label:"Tasks",value:`${m.completed}/${m.tasks}`},{label:"Escalations",value:`${m.resolved}/${m.escalations}`}),h},[p,m]);if(l&&r.length===0)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]});const v=r.some(h=>h.envelope!==void 0)&&(N||f||u);return e.jsxs("div",{children:[e.jsx(K,{title:"Process Detail",docsHash:"#docs:dashboard.md:process-detail",subtitle:t,stats:s}),v&&e.jsxs("div",{className:"grid grid-cols-1 @split:grid-cols-2 gap-8 mb-10",children:[e.jsx("div",{children:N?e.jsx($,{data:N,label:"Input",defaultMode:"json",defaultCollapsed:!0}):e.jsxs("div",{children:[e.jsx(S,{children:"Input"}),e.jsx("div",{className:"font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-tertiary italic mt-2",children:"Waiting for task..."})]})}),e.jsx("div",{children:f?e.jsx($,{data:f,label:"Output",defaultMode:"json",defaultCollapsed:!0}):u?e.jsxs("div",{children:[e.jsx(S,{children:"Output"}),e.jsxs("div",{className:"flex items-center gap-2 font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-secondary mt-2",children:[e.jsx("span",{className:"w-2.5 h-2.5 rounded-full dot-ring bg-status-pending animate-pulse"}),"Processing..."]})]}):null})]}),e.jsx(S,{className:"mb-6",children:"Timeline"}),e.jsx(me,{tasks:r,escalations:i,traceUrl:d})]})}export{ye as ProcessDetailPage};
2
+ //# sourceMappingURL=ProcessDetailPage-BKu9_wWv.js.map