@hotmeshio/long-tail 0.25.2 → 0.25.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/routes/oauth-server/authorize.js +4 -4
- package/build/services/auth/oauth-server/authorization.d.ts +5 -0
- package/build/services/auth/oauth-server/authorization.js +8 -0
- package/build/services/auth/oauth-server/metadata.d.ts +1 -1
- package/build/services/auth/oauth-server/metadata.js +2 -1
- package/dashboard/dist/assets/{AdminDashboard-B8MqNLiB.js → AdminDashboard-DlItqxFS.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-B8MqNLiB.js.map → AdminDashboard-DlItqxFS.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-Yg81Eiuo.js → AgentConfigPage-BUmT4a7n.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-Yg81Eiuo.js.map → AgentConfigPage-BUmT4a7n.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-ZUGYEONO.js → AgentDetailPage-Cww8rlBi.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-ZUGYEONO.js.map → AgentDetailPage-Cww8rlBi.js.map} +1 -1
- package/dashboard/dist/assets/AgentsPage-C9UuUKhr.js +2 -0
- package/dashboard/dist/assets/{AgentsPage-CZIWMwak.js.map → AgentsPage-C9UuUKhr.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-BVtpc4xO.js → AvailableEscalationsPage-DrvfXz70.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-BVtpc4xO.js.map → AvailableEscalationsPage-DrvfXz70.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-8bf0yOCT.js → BotPicker-CDq9XRMp.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-8bf0yOCT.js.map → BotPicker-CDq9XRMp.js.map} +1 -1
- package/dashboard/dist/assets/{BulkAssignModal-B2lr1J6P.js → BulkAssignModal-jsvqtrEA.js} +2 -2
- package/dashboard/dist/assets/{BulkAssignModal-B2lr1J6P.js.map → BulkAssignModal-jsvqtrEA.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-BQQBR2sj.js → CapabilitiesPage-CSCrI6B1.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-BQQBR2sj.js.map → CapabilitiesPage-CSCrI6B1.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-DFW8TYyU.js → CollapsibleSection-uD9mn-CQ.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-DFW8TYyU.js.map → CollapsibleSection-uD9mn-CQ.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-DGlOlQAo.js → ConfirmDeleteModal-BRmx2hA4.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-DGlOlQAo.js.map → ConfirmDeleteModal-BRmx2hA4.js.map} +1 -1
- package/dashboard/dist/assets/{ConnectedAppsPage-CIM9gzHj.js → ConnectedAppsPage-DlMzE5a-.js} +2 -2
- package/dashboard/dist/assets/{ConnectedAppsPage-CIM9gzHj.js.map → ConnectedAppsPage-DlMzE5a-.js.map} +1 -1
- package/dashboard/dist/assets/{CountdownTimer-BD_iWm6S.js → CountdownTimer-sRuM4eM5.js} +2 -2
- package/dashboard/dist/assets/{CountdownTimer-BD_iWm6S.js.map → CountdownTimer-sRuM4eM5.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-CTtUkvoD.js → CredentialsPage-bLYydwqa.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-CTtUkvoD.js.map → CredentialsPage-bLYydwqa.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-rZMptkYQ.js → CronLabel-D_ATDL2N.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-rZMptkYQ.js.map → CronLabel-D_ATDL2N.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-CmK9gHC5.js → ElapsedCell-groSMfqB.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-CmK9gHC5.js.map → ElapsedCell-groSMfqB.js.map} +1 -1
- package/dashboard/dist/assets/{EntityTimelinePanel-Cfg0EMZs.js → EntityTimelinePanel-D-F3_A9m.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-Cfg0EMZs.js.map → EntityTimelinePanel-D-F3_A9m.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-CPcbC1-9.js → EscalationListSchemaPage-Bad6Jrmr.js} +2 -2
- package/dashboard/dist/assets/{EscalationListSchemaPage-CPcbC1-9.js.map → EscalationListSchemaPage-Bad6Jrmr.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-BsYdNVN7.js → EscalationSchemaPage-BKi_npI9.js} +2 -2
- package/dashboard/dist/assets/{EscalationSchemaPage-BsYdNVN7.js.map → EscalationSchemaPage-BKi_npI9.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationTimeline-D1enxZDs.js → EscalationTimeline-DQUUm3b1.js} +2 -2
- package/dashboard/dist/assets/{EscalationTimeline-D1enxZDs.js.map → EscalationTimeline-DQUUm3b1.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationTitleSelect-DwqhnPKX.js → EscalationTitleSelect-3mhXh77a.js} +2 -2
- package/dashboard/dist/assets/{EscalationTitleSelect-DwqhnPKX.js.map → EscalationTitleSelect-3mhXh77a.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-ChuKh02E.js → EscalationsOverview-Qaov-uML.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-ChuKh02E.js.map → EscalationsOverview-Qaov-uML.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-GqZIKPce.js → EventTable-V4RF_n58.js} +2 -2
- package/dashboard/dist/assets/{EventTable-GqZIKPce.js.map → EventTable-V4RF_n58.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-CqPFZkVU.js → FilterBar-BygWrnB1.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-CqPFZkVU.js.map → FilterBar-BygWrnB1.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-_fB7mtBU.js → GraphInvokePage-Djslhf96.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-_fB7mtBU.js.map → GraphInvokePage-Djslhf96.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-BXA0Cz0F.js → HomePage-EjcNxlKx.js} +2 -2
- package/dashboard/dist/assets/{HomePage-BXA0Cz0F.js.map → HomePage-EjcNxlKx.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-Bf4DFITI.js → ListToolbar-RrEAePOX.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-Bf4DFITI.js.map → ListToolbar-RrEAePOX.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-H61XQRji.js → McpOverview-8gqiL3Vj.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-H61XQRji.js.map → McpOverview-8gqiL3Vj.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-wbwK8WWq.js → McpQueryDetailPage-COyn6Ak5.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-wbwK8WWq.js.map → McpQueryDetailPage-COyn6Ak5.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-CYvVEk3G.js → McpQueryPage-Dj6Qj72w.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-CYvVEk3G.js.map → McpQueryPage-Dj6Qj72w.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-TZBX68i4.js → McpRunDetailPage-80fQn9iX.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-TZBX68i4.js.map → McpRunDetailPage-80fQn9iX.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-Cu91Mh52.js → McpRunsPage-DaSsI-EM.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-Cu91Mh52.js.map → McpRunsPage-DaSsI-EM.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-D-6sKw6y.js → OperationsPage-BSu1o2gB.js} +2 -2
- package/dashboard/dist/assets/{OperationsPage-D-6sKw6y.js.map → OperationsPage-BSu1o2gB.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-DD8JUU3L.js → OperatorDashboard-HFI4WGIV.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-DD8JUU3L.js.map → OperatorDashboard-HFI4WGIV.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-CGri6okV.js → PersonaDetailPage-D0qlBuGi.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-CGri6okV.js.map → PersonaDetailPage-D0qlBuGi.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-DtHW6-Qx.js → PersonasPage-BJClu-5H.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-DtHW6-Qx.js.map → PersonasPage-BJClu-5H.js.map} +1 -1
- package/dashboard/dist/assets/{PortalPage-Dgbk_mzr.js → PortalPage-CucNZn_w.js} +2 -2
- package/dashboard/dist/assets/{PortalPage-Dgbk_mzr.js.map → PortalPage-CucNZn_w.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-BdkacBrD.js → ProcessDetailPage-B9wMw0RV.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-BdkacBrD.js.map → ProcessDetailPage-B9wMw0RV.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-DO5A-OfZ.js → ProcessesListPage-B6k4RpmR.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-DO5A-OfZ.js.map → ProcessesListPage-B6k4RpmR.js.map} +1 -1
- package/dashboard/dist/assets/{ResolverForm-CqGE5lf-.js → ResolverForm-ZVufJ4G-.js} +2 -2
- package/dashboard/dist/assets/{ResolverForm-CqGE5lf-.js.map → ResolverForm-ZVufJ4G-.js.map} +1 -1
- package/dashboard/dist/assets/{RoleDetailPage-DgVp0Hih.js → RoleDetailPage-CTbq0mz4.js} +2 -2
- package/dashboard/dist/assets/{RoleDetailPage-DgVp0Hih.js.map → RoleDetailPage-CTbq0mz4.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-BmsWq83e.js → RolesPage-DBKxeam4.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-BmsWq83e.js.map → RolesPage-DBKxeam4.js.map} +1 -1
- package/dashboard/dist/assets/RosterWidget-BkLAwEYB.js +2 -0
- package/dashboard/dist/assets/RosterWidget-BkLAwEYB.js.map +1 -0
- package/dashboard/dist/assets/{RunAsSelector-CyUWGp5P.js → RunAsSelector-D2DC4iDf.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-CyUWGp5P.js.map → RunAsSelector-D2DC4iDf.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-Cy05JOt4.js → ScanCodesPage-BlKleaT0.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-Cy05JOt4.js.map → ScanCodesPage-BlKleaT0.js.map} +1 -1
- package/dashboard/dist/assets/{ScanSchemeDetailPage-BX1afzOg.js → ScanSchemeDetailPage-CTW6gofi.js} +2 -2
- package/dashboard/dist/assets/{ScanSchemeDetailPage-BX1afzOg.js.map → ScanSchemeDetailPage-CTW6gofi.js.map} +1 -1
- package/dashboard/dist/assets/{ScanStationPage-DLAB41tb.js → ScanStationPage-DPRjSPyT.js} +2 -2
- package/dashboard/dist/assets/{ScanStationPage-DLAB41tb.js.map → ScanStationPage-DPRjSPyT.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-BzUTnYYE.js → StickyPagination-CkmX3-Gu.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-BzUTnYYE.js.map → StickyPagination-CkmX3-Gu.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-D0W1ekgG.js → StreamMessageDetail-Xm_n510s.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-D0W1ekgG.js.map → StreamMessageDetail-Xm_n510s.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-BPBwmwuO.js → SwimlaneTimeline-De48aJan.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BPBwmwuO.js.map → SwimlaneTimeline-De48aJan.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-VuaIXISy.js → TaskDetailPage-HycMx3O9.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-VuaIXISy.js.map → TaskDetailPage-HycMx3O9.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-KaUSoqos.js → TasksListPage-OIcFFp1C.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-KaUSoqos.js.map → TasksListPage-OIcFFp1C.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-C_E6u0fr.js → TimeAgo-OTC_55oZ.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-C_E6u0fr.js.map → TimeAgo-OTC_55oZ.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-CUJiAmax.js → TimestampCell-CAwIj_AI.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-CUJiAmax.js.map → TimestampCell-CAwIj_AI.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-Ch5nQANh.js → ToolTestPanel-8Vf6pfw4.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-Ch5nQANh.js.map → ToolTestPanel-8Vf6pfw4.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-BprToO7w.js → TopicDetailPage-iZW8rK9L.js} +2 -2
- package/dashboard/dist/assets/{TopicDetailPage-BprToO7w.js.map → TopicDetailPage-iZW8rK9L.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-8SmCnQ-E.js → TopicsPage-CqiEcj-W.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-8SmCnQ-E.js.map → TopicsPage-CqiEcj-W.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-BkJryunF.js → UserName-DQFjuoib.js} +2 -2
- package/dashboard/dist/assets/{UserName-BkJryunF.js.map → UserName-DQFjuoib.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-B2S5ODie.js → WorkflowExecutionPage-Di08wCbs.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-B2S5ODie.js.map → WorkflowExecutionPage-Di08wCbs.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-CABuRCXp.js → WorkflowsDashboard-Bb8HlrTJ.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-CABuRCXp.js.map → WorkflowsDashboard-Bb8HlrTJ.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-BPUHAj8T.js → WorkflowsOverview-Dta1kurk.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-BPUHAj8T.js.map → WorkflowsOverview-Dta1kurk.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DZGjT-Tl.js → YamlWorkflowDetailPage-CfAajg68.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DZGjT-Tl.js.map → YamlWorkflowDetailPage-CfAajg68.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-DIxHURlM.js → YamlWorkflowsPage-CQFUzT4t.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-DIxHURlM.js.map → YamlWorkflowsPage-CQFUzT4t.js.map} +1 -1
- package/dashboard/dist/assets/{agents-BnDp2rcb.js → agents-PuftRTB2.js} +2 -2
- package/dashboard/dist/assets/{agents-BnDp2rcb.js.map → agents-PuftRTB2.js.map} +1 -1
- package/dashboard/dist/assets/{bots-maURYoyr.js → bots-BmEiPAWY.js} +2 -2
- package/dashboard/dist/assets/{bots-maURYoyr.js.map → bots-BmEiPAWY.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-5-TakMUh.js → capabilities-CRii4Soa.js} +2 -2
- package/dashboard/dist/assets/{capabilities-5-TakMUh.js.map → capabilities-CRii4Soa.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-BXVVTWoh.js → controlplane-DO_czaYo.js} +2 -2
- package/dashboard/dist/assets/{controlplane-BXVVTWoh.js.map → controlplane-DO_czaYo.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-v8gx8wFb.js → escalation-columns-CzCquCPh.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-v8gx8wFb.js.map → escalation-columns-CzCquCPh.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-items-OWntjDaH.js → escalation-items-Cy0ZgJqV.js} +2 -2
- package/dashboard/dist/assets/{escalation-items-OWntjDaH.js.map → escalation-items-Cy0ZgJqV.js.map} +1 -1
- package/dashboard/dist/assets/{index-BIfY4mR2.js → index-2SM2_onB.js} +2 -2
- package/dashboard/dist/assets/{index-BIfY4mR2.js.map → index-2SM2_onB.js.map} +1 -1
- package/dashboard/dist/assets/{index-vgHzaGmW.js → index-4YaDUcKd.js} +2 -2
- package/dashboard/dist/assets/{index-vgHzaGmW.js.map → index-4YaDUcKd.js.map} +1 -1
- package/dashboard/dist/assets/{index-YGTGxcTF.js → index-CL_1VpGb.js} +2 -2
- package/dashboard/dist/assets/{index-YGTGxcTF.js.map → index-CL_1VpGb.js.map} +1 -1
- package/dashboard/dist/assets/{index-Dk7nwVpm.js → index-CZ7A3AcD.js} +2 -2
- package/dashboard/dist/assets/{index-Dk7nwVpm.js.map → index-CZ7A3AcD.js.map} +1 -1
- package/dashboard/dist/assets/{index-CvKegIVe.js → index-CfP2nKRc.js} +2 -2
- package/dashboard/dist/assets/{index-CvKegIVe.js.map → index-CfP2nKRc.js.map} +1 -1
- package/dashboard/dist/assets/{index-CR9rhAvN.js → index-Cga5IW3D.js} +2 -2
- package/dashboard/dist/assets/{index-CR9rhAvN.js.map → index-Cga5IW3D.js.map} +1 -1
- package/dashboard/dist/assets/{index-BTm3-qwq.js → index-Cx8xb-oU.js} +2 -2
- package/dashboard/dist/assets/{index-BTm3-qwq.js.map → index-Cx8xb-oU.js.map} +1 -1
- package/dashboard/dist/assets/{index-Dafrbwk_.js → index-DhSCCpqM.js} +2 -2
- package/dashboard/dist/assets/{index-Dafrbwk_.js.map → index-DhSCCpqM.js.map} +1 -1
- package/dashboard/dist/assets/{index-WPVpyoD3.js → index-DiaRlFYI.js} +2 -2
- package/dashboard/dist/assets/{index-WPVpyoD3.js.map → index-DiaRlFYI.js.map} +1 -1
- package/dashboard/dist/assets/{index-D7peGNN0.js → index-Dz6R8-Dw.js} +11 -11
- package/dashboard/dist/assets/index-Dz6R8-Dw.js.map +1 -0
- package/dashboard/dist/assets/{index-D_ojXTgO.js → index-Rwqrflm-.js} +2 -2
- package/dashboard/dist/assets/{index-D_ojXTgO.js.map → index-Rwqrflm-.js.map} +1 -1
- package/dashboard/dist/assets/{index-DvkcyTE2.js → index-XntldBd0.js} +2 -2
- package/dashboard/dist/assets/{index-DvkcyTE2.js.map → index-XntldBd0.js.map} +1 -1
- package/dashboard/dist/assets/{index-CWKs10VQ.js → index-jL2K6us4.js} +2 -2
- package/dashboard/dist/assets/{index-CWKs10VQ.js.map → index-jL2K6us4.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-L_zY1zmy.js → knowledge-CeUqGPuo.js} +2 -2
- package/dashboard/dist/assets/{knowledge-L_zY1zmy.js.map → knowledge-CeUqGPuo.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-wCWFRA0T.js → mcp-Cx96NTeD.js} +2 -2
- package/dashboard/dist/assets/{mcp-wCWFRA0T.js.map → mcp-Cx96NTeD.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-CFbGudkb.js → mcp-query-XAzWl0gm.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-CFbGudkb.js.map → mcp-query-XAzWl0gm.js.map} +1 -1
- package/dashboard/dist/assets/{personas-B_VIacZJ.js → personas--4kjwyOw.js} +2 -2
- package/dashboard/dist/assets/{personas-B_VIacZJ.js.map → personas--4kjwyOw.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-Bv0Z8xQA.js → pipelines-PgkwvG7f.js} +2 -2
- package/dashboard/dist/assets/{pipelines-Bv0Z8xQA.js.map → pipelines-PgkwvG7f.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-DP6yaNZs.js → tasks-CcYxdBa3.js} +2 -2
- package/dashboard/dist/assets/{tasks-DP6yaNZs.js.map → tasks-CcYxdBa3.js.map} +1 -1
- package/dashboard/dist/assets/{topics-UBSIcpSR.js → topics-_lik7cNY.js} +2 -2
- package/dashboard/dist/assets/{topics-UBSIcpSR.js.map → topics-_lik7cNY.js.map} +1 -1
- package/dashboard/dist/assets/{useDebouncedValue-R62q3Xpx.js → useDebouncedValue-Bm_AoxVx.js} +2 -2
- package/dashboard/dist/assets/{useDebouncedValue-R62q3Xpx.js.map → useDebouncedValue-Bm_AoxVx.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-CAaszJDE.js → useNamespace-DgXXKdx5.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-CAaszJDE.js.map → useNamespace-DgXXKdx5.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-emCp9U69.js → useYamlActivityEvents-Dj2qtGSd.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-emCp9U69.js.map → useYamlActivityEvents-Dj2qtGSd.js.map} +1 -1
- package/dashboard/dist/assets/{validate-C7yskdEn.js → validate-FlXCBBT6.js} +2 -2
- package/dashboard/dist/assets/{validate-C7yskdEn.js.map → validate-FlXCBBT6.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-C2sOwz1p.js → yaml-workflows-B0_JxRYQ.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-C2sOwz1p.js.map → yaml-workflows-B0_JxRYQ.js.map} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/docs/hitl/x-lt-roster.md +1 -1
- package/docs/mcp.md +6 -1
- package/docs/scan-codes.md +5 -0
- package/package.json +1 -1
- package/dashboard/dist/assets/AgentsPage-CZIWMwak.js +0 -2
- package/dashboard/dist/assets/RosterWidget-DR-T4Izu.js +0 -2
- package/dashboard/dist/assets/RosterWidget-DR-T4Izu.js.map +0 -1
- package/dashboard/dist/assets/index-D7peGNN0.js.map +0 -1
package/dashboard/dist/assets/{yaml-workflows-C2sOwz1p.js.map → yaml-workflows-B0_JxRYQ.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yaml-workflows-C2sOwz1p.js","sources":["../../src/api/yaml-workflows.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { LTYamlWorkflowRecord, LTYamlWorkflowStatus, LTYamlWorkflowVersion } from './types';\n\ninterface YamlWorkflowListResponse {\n workflows: LTYamlWorkflowRecord[];\n total: number;\n}\n\ninterface YamlWorkflowFilters {\n status?: LTYamlWorkflowStatus;\n graph_topic?: string;\n app_id?: string;\n search?: string;\n set_id?: string;\n limit?: number;\n offset?: number;\n}\n\nexport function useYamlWorkflows(filters: YamlWorkflowFilters = {}) {\n const params = new URLSearchParams();\n if (filters.status) params.set('status', filters.status);\n if (filters.graph_topic) params.set('graph_topic', filters.graph_topic);\n if (filters.app_id) params.set('app_id', filters.app_id);\n if (filters.search) params.set('search', filters.search);\n if (filters.set_id) params.set('set_id', filters.set_id);\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', filters],\n queryFn: () => apiFetch(`/yaml-workflows?${params}`),\n });\n}\n\nexport function useYamlWorkflowAppIds() {\n return useQuery<{ app_ids: string[] }>({\n queryKey: ['yamlWorkflowAppIds'],\n queryFn: () => apiFetch('/yaml-workflows/app-ids'),\n });\n}\n\nexport function useYamlWorkflowByTopic(graphTopic: string | undefined, appId?: string) {\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', 'byTopic', graphTopic, appId],\n queryFn: () => {\n const params = new URLSearchParams({ graph_topic: graphTopic!, limit: '1' });\n if (appId) params.set('app_id', appId);\n return apiFetch(`/yaml-workflows?${params}`);\n },\n enabled: !!graphTopic,\n });\n}\n\nexport function useYamlWorkflow(id: string) {\n return useQuery<LTYamlWorkflowRecord>({\n queryKey: ['yamlWorkflows', id],\n queryFn: () => apiFetch(`/yaml-workflows/${id}`),\n enabled: !!id,\n });\n}\n\nexport function useCreateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: {\n workflow_id: string;\n task_queue: string;\n workflow_name: string;\n name: string;\n description?: string;\n app_id?: string;\n subscribes?: string;\n tags?: string[];\n compilation_feedback?: string;\n }) =>\n apiFetch<LTYamlWorkflowRecord>('/yaml-workflows', {\n method: 'POST',\n body: JSON.stringify(input),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeployYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/deploy`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useActivateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/activate`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useInvokeYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, data, sync, execute_as }: { id: string; data: Record<string, unknown>; sync?: boolean; execute_as?: string }) =>\n apiFetch<{ result?: unknown; job_id?: string }>(`/yaml-workflows/${id}/invoke`, {\n method: 'POST',\n body: JSON.stringify({ data, sync, ...(execute_as ? { execute_as } : {}) }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRegenerateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, task_queue, compilation_feedback }: { id: string; task_queue?: string; compilation_feedback?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/regenerate`, {\n method: 'POST',\n body: JSON.stringify({ task_queue, compilation_feedback }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useArchiveYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/archive`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRestoreYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/restore`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflow'], refetchType: 'all' });\n },\n });\n}\n\nexport function useUpdateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, ...updates }: { id: string; yaml_content?: string; name?: string; description?: string; input_schema?: Record<string, unknown>; output_schema?: Record<string, unknown>; tags?: string[]; app_id?: string; graph_topic?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}`, {\n method: 'PUT',\n body: JSON.stringify(updates),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeleteYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<{ deleted: boolean }>(`/yaml-workflows/${id}`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Cron scheduling ─────────────────────────────────────────────\n\nexport function useSetYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, cron_schedule, cron_envelope, execute_as }: {\n id: string;\n cron_schedule: string;\n cron_envelope?: Record<string, unknown> | null;\n execute_as?: string | null;\n }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'PUT',\n body: JSON.stringify({ cron_schedule, cron_envelope, execute_as }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useClearYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Version history ─────────────────────────────────────────────\n\nexport function useYamlWorkflowVersions(id: string) {\n return useQuery<{ versions: LTYamlWorkflowVersion[]; total: number }>({\n queryKey: ['yamlWorkflows', id, 'versions'],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions`),\n enabled: !!id,\n });\n}\n\nexport function useYamlWorkflowVersion(id: string, version: number | null) {\n return useQuery<LTYamlWorkflowVersion>({\n queryKey: ['yamlWorkflows', id, 'versions', version],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions/${version}`),\n enabled: !!id && version !== null,\n });\n}\n"],"names":["useYamlWorkflows","filters","params","useQuery","apiFetch","useYamlWorkflowAppIds","useYamlWorkflow","id","useCreateYamlWorkflow","queryClient","useQueryClient","useMutation","input","useDeployYamlWorkflow","useActivateYamlWorkflow","useInvokeYamlWorkflow","data","sync","execute_as","useRegenerateYamlWorkflow","task_queue","compilation_feedback","useArchiveYamlWorkflow","useRestoreYamlWorkflow","useUpdateYamlWorkflow","updates","useDeleteYamlWorkflow","useYamlWorkflowVersions","useYamlWorkflowVersion","version"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"yaml-workflows-B0_JxRYQ.js","sources":["../../src/api/yaml-workflows.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { LTYamlWorkflowRecord, LTYamlWorkflowStatus, LTYamlWorkflowVersion } from './types';\n\ninterface YamlWorkflowListResponse {\n workflows: LTYamlWorkflowRecord[];\n total: number;\n}\n\ninterface YamlWorkflowFilters {\n status?: LTYamlWorkflowStatus;\n graph_topic?: string;\n app_id?: string;\n search?: string;\n set_id?: string;\n limit?: number;\n offset?: number;\n}\n\nexport function useYamlWorkflows(filters: YamlWorkflowFilters = {}) {\n const params = new URLSearchParams();\n if (filters.status) params.set('status', filters.status);\n if (filters.graph_topic) params.set('graph_topic', filters.graph_topic);\n if (filters.app_id) params.set('app_id', filters.app_id);\n if (filters.search) params.set('search', filters.search);\n if (filters.set_id) params.set('set_id', filters.set_id);\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', filters],\n queryFn: () => apiFetch(`/yaml-workflows?${params}`),\n });\n}\n\nexport function useYamlWorkflowAppIds() {\n return useQuery<{ app_ids: string[] }>({\n queryKey: ['yamlWorkflowAppIds'],\n queryFn: () => apiFetch('/yaml-workflows/app-ids'),\n });\n}\n\nexport function useYamlWorkflowByTopic(graphTopic: string | undefined, appId?: string) {\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', 'byTopic', graphTopic, appId],\n queryFn: () => {\n const params = new URLSearchParams({ graph_topic: graphTopic!, limit: '1' });\n if (appId) params.set('app_id', appId);\n return apiFetch(`/yaml-workflows?${params}`);\n },\n enabled: !!graphTopic,\n });\n}\n\nexport function useYamlWorkflow(id: string) {\n return useQuery<LTYamlWorkflowRecord>({\n queryKey: ['yamlWorkflows', id],\n queryFn: () => apiFetch(`/yaml-workflows/${id}`),\n enabled: !!id,\n });\n}\n\nexport function useCreateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: {\n workflow_id: string;\n task_queue: string;\n workflow_name: string;\n name: string;\n description?: string;\n app_id?: string;\n subscribes?: string;\n tags?: string[];\n compilation_feedback?: string;\n }) =>\n apiFetch<LTYamlWorkflowRecord>('/yaml-workflows', {\n method: 'POST',\n body: JSON.stringify(input),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeployYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/deploy`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useActivateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/activate`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useInvokeYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, data, sync, execute_as }: { id: string; data: Record<string, unknown>; sync?: boolean; execute_as?: string }) =>\n apiFetch<{ result?: unknown; job_id?: string }>(`/yaml-workflows/${id}/invoke`, {\n method: 'POST',\n body: JSON.stringify({ data, sync, ...(execute_as ? { execute_as } : {}) }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRegenerateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, task_queue, compilation_feedback }: { id: string; task_queue?: string; compilation_feedback?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/regenerate`, {\n method: 'POST',\n body: JSON.stringify({ task_queue, compilation_feedback }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useArchiveYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/archive`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRestoreYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/restore`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflow'], refetchType: 'all' });\n },\n });\n}\n\nexport function useUpdateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, ...updates }: { id: string; yaml_content?: string; name?: string; description?: string; input_schema?: Record<string, unknown>; output_schema?: Record<string, unknown>; tags?: string[]; app_id?: string; graph_topic?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}`, {\n method: 'PUT',\n body: JSON.stringify(updates),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeleteYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<{ deleted: boolean }>(`/yaml-workflows/${id}`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Cron scheduling ─────────────────────────────────────────────\n\nexport function useSetYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, cron_schedule, cron_envelope, execute_as }: {\n id: string;\n cron_schedule: string;\n cron_envelope?: Record<string, unknown> | null;\n execute_as?: string | null;\n }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'PUT',\n body: JSON.stringify({ cron_schedule, cron_envelope, execute_as }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useClearYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Version history ─────────────────────────────────────────────\n\nexport function useYamlWorkflowVersions(id: string) {\n return useQuery<{ versions: LTYamlWorkflowVersion[]; total: number }>({\n queryKey: ['yamlWorkflows', id, 'versions'],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions`),\n enabled: !!id,\n });\n}\n\nexport function useYamlWorkflowVersion(id: string, version: number | null) {\n return useQuery<LTYamlWorkflowVersion>({\n queryKey: ['yamlWorkflows', id, 'versions', version],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions/${version}`),\n enabled: !!id && version !== null,\n });\n}\n"],"names":["useYamlWorkflows","filters","params","useQuery","apiFetch","useYamlWorkflowAppIds","useYamlWorkflow","id","useCreateYamlWorkflow","queryClient","useQueryClient","useMutation","input","useDeployYamlWorkflow","useActivateYamlWorkflow","useInvokeYamlWorkflow","data","sync","execute_as","useRegenerateYamlWorkflow","task_queue","compilation_feedback","useArchiveYamlWorkflow","useRestoreYamlWorkflow","useUpdateYamlWorkflow","updates","useDeleteYamlWorkflow","useYamlWorkflowVersions","useYamlWorkflowVersion","version"],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
9
9
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
10
10
|
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
|
|
11
|
-
<script type="module" crossorigin src="./assets/index-
|
|
11
|
+
<script type="module" crossorigin src="./assets/index-Dz6R8-Dw.js"></script>
|
|
12
12
|
<link rel="modulepreload" crossorigin href="./assets/vendor-query-DvWWuNIB.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="./assets/vendor-react-_9U4mKFr.js">
|
|
14
14
|
<link rel="modulepreload" crossorigin href="./assets/vendor-icons-DUYcKTjP.js">
|
package/docs/hitl/x-lt-roster.md
CHANGED
|
@@ -79,7 +79,7 @@ Each `x-lt-actions` entry is one act on the entry:
|
|
|
79
79
|
| Act | Shape | Offered by default | What it does |
|
|
80
80
|
|-----|-------|--------------------|--------------|
|
|
81
81
|
| Resolve | `"resolverPayload": { ... }` | `waiting` | Resolves the entry's member row (a `query` set). String leaves interpolate against the member row. |
|
|
82
|
-
| Fill | `"fill": { "payload": { ... }, "enterCode": true }` | `waiting`, `flagged` | Fills the entry's batch key, as a scan would. With `enterCode`, the person types the code from the label and the server checks it against the key (a UPC-A matches its GTIN-14 key); the payload records it as `enteredCode`. |
|
|
82
|
+
| Fill | `"fill": { "payload": { ... }, "enterCode": true }` | `waiting`, `flagged` | Fills the entry's batch key, as a scan would. With `enterCode`, the person types the code from the label and the server checks it against the key (a UPC-A matches its GTIN-14 key); the payload records it as `enteredCode`. The key-in field takes keys and scans as its own answer; they never also run as a scan. |
|
|
83
83
|
| Flag | `"flag": { "label": "Missing", "payload": { ... } }` | `waiting` | Flags the entry's batch key. The key stays pending and still fills; the entry reads flagged under the label and counts in `roster.<field>.flagged`. |
|
|
84
84
|
| Unflag | `"unflag": true` | `flagged` | Clears the entry's flag while the row is pending ("Found it"). |
|
|
85
85
|
|
package/docs/mcp.md
CHANGED
|
@@ -216,7 +216,10 @@ start({
|
|
|
216
216
|
auth: {
|
|
217
217
|
oauthServer: {
|
|
218
218
|
issuer: 'https://api.example.com/longtail', // the public base URL Long Tail is served under
|
|
219
|
-
allowedRedirectUris: [
|
|
219
|
+
allowedRedirectUris: [ // exact https redirects, beyond loopback
|
|
220
|
+
'https://claude.ai/api/mcp/auth_callback',
|
|
221
|
+
'https://chatgpt.com/connector_platform_oauth_redirect',
|
|
222
|
+
],
|
|
220
223
|
},
|
|
221
224
|
},
|
|
222
225
|
});
|
|
@@ -224,6 +227,8 @@ start({
|
|
|
224
227
|
|
|
225
228
|
Clients register themselves (RFC 7591). Loopback redirects (`http://127.0.0.1`, `localhost`, `[::1]`, any port) are always allowed, which covers Claude Code and Claude Desktop; an `https` redirect is allowed only when it equals a URI in `allowedRedirectUris`.
|
|
226
229
|
|
|
230
|
+
Every authorization response, a code or an error, carries the issuer as `iss` (RFC 9207), and the server metadata advertises it with `authorization_response_iss_parameter_supported`. Clients that check the issuer use one fixed callback for every connection, which a single `allowedRedirectUris` entry covers: ChatGPT's is `https://chatgpt.com/connector_platform_oauth_redirect`.
|
|
231
|
+
|
|
227
232
|
**Embedded deployments** mount two routers, and let four paths reach Long Tail without the host's login:
|
|
228
233
|
|
|
229
234
|
- `adapter.getRouter()` under the base path, as today, and `adapter.getWellKnownRouter()` at the host's root. The well-known router answers only its two documents and passes every other request on.
|
package/docs/scan-codes.md
CHANGED
|
@@ -692,6 +692,11 @@ code never starts inside a longer run of digits.
|
|
|
692
692
|
- On a match, the terminator is swallowed, the code's characters are
|
|
693
693
|
stripped back out of whatever editable held focus (byte-exact, at the
|
|
694
694
|
cursor), and the code executes. Cursor focus never diverts a scan.
|
|
695
|
+
- **A field that takes a code as its own answer keeps its keys.** Keys typed
|
|
696
|
+
inside an element marked `data-lt-scan-capture="off"` reach only that
|
|
697
|
+
field, at any speed, with or without Enter. A roster's key-in field is
|
|
698
|
+
marked, so a code typed or scanned into it is the key-in and never also a
|
|
699
|
+
scan.
|
|
695
700
|
- Scanner pacing is irrelevant: slow Bluetooth HID links, Shift-chorded
|
|
696
701
|
capitals and colons, and mid-burst stalls all capture, because nothing has
|
|
697
702
|
to be recognized mid-flight. The one tunable is the **key gap limit**
|
package/package.json
CHANGED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as t}from"./vendor-query-DvWWuNIB.js";import{u as f}from"./agents-BnDp2rcb.js";import{c as b,y as v,bQ as j,g as N}from"./index-D7peGNN0.js";import{u as y}from"./useFilterParams-DBRw1Hcv.js";import{b as P}from"./api-path-u2Jf9QXS.js";import{D as w}from"./DataTable-FjFhx0SE.js";import{S}from"./StickyPagination-BzUTnYYE.js";import{F as k,b as A}from"./FilterBar-CqPFZkVU.js";import{P as _}from"./PageHeader-BSWIspNB.js";import{L as C}from"./ListToolbar-Bf4DFITI.js";import{h as F}from"./vendor-icons-DUYcKTjP.js";import{u as z}from"./vendor-react-_9U4mKFr.js";import"./EmptyState-DgC_6njU.js";import"./useContainerWidth-DSLp1gEm.js";const L=[{value:"active",label:"Active"},{value:"inactive",label:"Inactive"},{value:"paused",label:"Paused"},{value:"error",label:"Error"}],T=[{key:"name",label:"Agent",render:e=>t.jsxs("div",{className:"flex items-center gap-2.5 min-w-0",children:[t.jsx("span",{className:`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${e.status==="active"?"bg-status-success":e.status==="paused"?"bg-status-warning":e.status==="error"?"bg-status-error":"bg-surface-border"}`}),t.jsx("span",{className:"text-xs font-medium text-text-primary whitespace-nowrap",children:e.id}),e.description&&t.jsx("p",{className:"flex-1 min-w-0 truncate text-2xs text-text-tertiary",children:e.description})]})},{key:"knowledge_domain",label:"Knowledge",render:e=>e.knowledge_domain?t.jsx("span",{className:"text-2xs font-mono text-text-secondary whitespace-nowrap",children:e.knowledge_domain}):t.jsx("span",{className:"text-text-quaternary",children:"—"}),className:"w-28"},{key:"schedules",label:"Schedules",render:e=>{var r,i;const s=(r=e.behaviors)==null?void 0:r.schedules,a=s!=null&&s.length?s.map(c=>c.cron):(i=e.behaviors)!=null&&i.cron?[e.behaviors.cron]:[];return a.length?t.jsxs("span",{className:"text-2xs font-mono text-text-secondary whitespace-nowrap",children:[a[0],a.length>1?` +${a.length-1}`:""]}):t.jsx("span",{className:"text-text-quaternary",children:"—"})},className:"w-28"},{key:"subscriptions",label:"Subscriptions",render:e=>{var i;const s=e.subscription_count??0,a=e.sub_topics??[];if(!s)return t.jsx("span",{className:"text-text-quaternary",children:"—"});const r=((i=a[0])==null?void 0:i.replace(/^lt\.events\./,""))??"";return t.jsxs("span",{className:"text-2xs font-mono text-text-secondary whitespace-nowrap",children:[r,s>1?` +${s-1}`:""]})},className:"w-36"},{key:"last_run_at",label:"Last Run",render:e=>e.last_run_at?t.jsx("span",{className:"whitespace-nowrap",children:t.jsx(N,{date:e.last_run_at})}):t.jsx("span",{className:"text-text-quaternary",children:"—"}),className:"w-32"}];function G(){var p;const e=z(),{data:s}=b(),a=v(),r=a!==null?a:!!((p=s==null?void 0:s.ai)!=null&&p.enabled),i=r?"Agent":"Automation",c=r?"Agents":"Automations";j();const{filters:u,setFilter:d,pagination:n}=y({filters:{status:""}}),{data:o,isLoading:x,refetch:g,isFetching:h}=f({status:u.status||void 0,limit:n.pageSize,offset:n.offset}),m=(o==null?void 0:o.total)??0;return t.jsxs("div",{children:[t.jsx(_,{title:c,docsHash:"#docs:agents.md",actions:t.jsxs("button",{onClick:()=>e("/agents/new"),className:"flex items-center gap-2 px-4 py-2 text-sm rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors",children:[t.jsx(F,{className:"w-4 h-4"})," Create ",i]})}),t.jsx(k,{actions:t.jsx(C,{onRefresh:()=>g(),isFetching:h,apiPath:P("/agents",{limit:n.pageSize,offset:n.offset,status:u.status||void 0})}),children:t.jsx(A,{label:"Status",value:u.status,onChange:l=>d("status",l),options:L})}),t.jsx(w,{columns:T,data:(o==null?void 0:o.agents)??[],keyFn:l=>l.id,onRowClick:l=>e(`/agents/${l.id}`),isLoading:x,emptyMessage:`No ${c.toLowerCase()} found`}),t.jsx(S,{page:n.page,totalPages:n.totalPages(m),onPageChange:n.setPage,total:m,pageSize:n.pageSize,onPageSizeChange:n.setPageSize})]})}export{G as AgentsPage};
|
|
2
|
-
//# sourceMappingURL=AgentsPage-CZIWMwak.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as a,a as v,d as ot}from"./vendor-query-DvWWuNIB.js";import{bJ as at,aK as it,bn as lt,bH as ct}from"./vendor-icons-DUYcKTjP.js";import{L as ut}from"./vendor-react-_9U4mKFr.js";import{g as w,H as dt,a as R,F as ft,j as pt,f as xt}from"./escalation-items-OWntjDaH.js";import{bl as mt,bm as bt,ax as gt,bn as W}from"./index-D7peGNN0.js";const yt=/\{\{\s*([^{}]+?)\s*\}\}/g;function le(t){return typeof t=="string"&&/\{\{[^{}]+\}\}/.test(t)}function L(t,e){if(!e)return;const s=t.indexOf("."),n=e[s===-1?t:t.slice(0,s)];if(s===-1)return n;if(!(n===null||typeof n!="object"))return w(n,t.slice(s+1))}function ce(t,e){let s=!1;const n=t.replace(yt,(r,o)=>{const i=L(o,e);return typeof i=="string"&&i.trim().length>0?i:typeof i=="number"&&Number.isFinite(i)?String(i):(s=!0,"")});return s?null:n}function M(t){return t!=null&&t!==""&&t!==!1&&t!==0}function ht(t){return t==null?"":typeof t=="object"?JSON.stringify(t):String(t)}function U(t,e){const s=t.indexOf("."),n=s===-1?t:t.slice(0,s);if(!dt.includes(n))return{known:!1,value:void 0};const r=e[n];if(s===-1)return{known:!0,value:r};try{return{known:!0,value:w(r,t.slice(s+1))}}catch{return{known:!0,value:void 0}}}function X(t,e){if(Array.isArray(t))return t.every(l=>X(l,e));if(typeof t!="string"||t.length===0||!e)return!0;const s=t.startsWith("!"),n=s?t.slice(1):t,r=n.indexOf("!="),o=n.indexOf("=");if(r!==-1||o!==-1&&o!==r+1){const l=r!==-1&&(o===-1||r<o),u=l?r:o,m=n.slice(0,u).trim(),b=n.slice(u+(l?2:1)).trim(),{known:h,value:k}=U(m,e);if(!h)return!0;const y=ht(k)===b,f=l?!y:y;return s?!f:f}const{known:i,value:c}=U(n,e);return i?s?!M(c):M(c):!0}function ue(t,e){return(t==null?void 0:t["x-lt-hide-if-empty"])!==!0?!1:e==null||e===""||e===!1||e===0}const Et="x-lt-hidden";function de(t){return(t==null?void 0:t[Et])===!0}function Nt({children:t,isRequired:e,htmlFor:s}){return a.jsxs("label",{htmlFor:s,className:"block text-2xs font-semibold uppercase tracking-wider text-text-secondary",children:[t,e&&a.jsx("span",{className:"text-status-error ml-0.5",children:"*"})]})}function At({id:t,children:e}){return a.jsx("p",{id:t,className:"text-2xs text-text-tertiary mt-0.5 leading-snug",children:e})}function fe({error:t,id:e}){return t?a.jsx("p",{id:e,role:"alert",className:"text-2xs text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]",children:t}):null}function pe(t){return t?"input text-sm w-full mt-1 border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]":"input text-sm w-full mt-1"}function xe(t){return t?"select text-sm mt-1 min-w-[min(16rem,100%)] max-w-full border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]":"select text-sm mt-1 min-w-[min(16rem,100%)] max-w-full"}function wt({to:t,className:e=""}){return a.jsxs(ut,{to:t,title:"View details",tabIndex:-1,className:`inline-flex items-center justify-center w-6 h-6 shrink-0 rounded border border-surface-border text-accent/70 hover:text-accent hover:border-accent/60 hover:bg-accent/5 transition-colors ${e}`,children:[a.jsx(at,{className:"w-3.5 h-3.5",strokeWidth:2}),a.jsx("span",{className:"sr-only",children:"View details"})]})}function kt({message:t,onConfirm:e,onCancel:s,testId:n}){return a.jsxs("span",{className:"inline-flex flex-wrap items-center gap-2",role:"group","aria-label":"Confirm action","data-testid":n,children:[a.jsx("span",{className:"text-xs text-text-primary whitespace-normal",children:t}),a.jsx("button",{type:"button",onClick:e,className:"px-2 py-0.5 text-2xs font-medium text-text-inverse bg-accent rounded hover:bg-accent/90 transition-colors","data-testid":n?`${n}-yes`:void 0,autoFocus:!0,children:"Confirm"}),a.jsx("button",{type:"button",onClick:s,className:"px-2 py-0.5 text-2xs font-medium text-text-secondary border border-surface-border rounded hover:bg-surface-hover transition-colors","data-testid":n?`${n}-no`:void 0,children:"Cancel"})]})}const jt=(t,e,s)=>{s!=null&&s.badge||e()},vt=v.createContext(jt);function _t(){return v.useContext(vt)}function Tt({label:t,onConfirm:e,onCancel:s,testId:n}){const[r,o]=v.useState(""),i=()=>{r.trim()&&e(r.trim())};return a.jsxs("span",{className:"inline-flex flex-wrap items-center gap-2",role:"group","aria-label":t,"data-testid":n,children:[a.jsx("input",{type:"text",inputMode:"numeric",value:r,onChange:c=>o(c.target.value),onKeyDown:c=>{c.key==="Enter"&&i(),c.key==="Escape"&&s()},placeholder:"Code on the label","aria-label":"Code on the label",className:"input text-xs py-0.5 w-40 font-mono","data-testid":n?`${n}-input`:void 0,autoFocus:!0}),a.jsx("button",{type:"button",onClick:i,disabled:!r.trim(),className:"px-2 py-0.5 text-2xs font-medium text-text-inverse bg-accent rounded hover:bg-accent/90 disabled:opacity-40 disabled:cursor-not-allowed transition-colors","data-testid":n?`${n}-yes`:void 0,children:t}),a.jsx("button",{type:"button",onClick:s,className:"px-2 py-0.5 text-2xs font-medium text-text-secondary border border-surface-border rounded hover:bg-surface-hover transition-colors","data-testid":n?`${n}-no`:void 0,children:"Cancel"})]})}const Ct="x-lt-roster",Rt=200,H="items",Lt="any",x={WAITING:"waiting",IN:"in",FLAGGED:"flagged"},Ft="{{escalation.id}}",Y="—",J="batch_keys",B="batch_pending",Ot="batch_flags",It="accumulate_keys";function g(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function N(t){return typeof t=="string"?t?[t]:[]:Array.isArray(t)?t.filter(e=>typeof e=="string"&&e.length>0):[]}function z(t){const e=t==null?void 0:t[Ct];if(!g(e)||!g(e.expected))return;const s=e.expected;return g(s.query)||typeof s.list=="string"||s.batch===!0?e:void 0}function St(t){const e=g(t==null?void 0:t.properties)?t.properties:{},s={};for(const[n,r]of Object.entries(e)){const o=g(r)?z(r):void 0;o&&(s[n]=o)}return s}function Gt(t){return"query"in t.expected&&g(t.expected.query)?t.expected.query:null}function Dt(t,e){const s={};for(const[o,i]of Object.entries(t.facets??{})){if(typeof i!="string")continue;const c=R(i,e);if(!c||c===Y)return null;s[o]=c}const n=[...t.role?[t.role]:[],...N(t.roles)];if(!n.length&&!Object.keys(s).length)return null;const r=t.status&&t.status!==Lt?t.status:void 0;return{...n.length?{roles:n}:{},facets:s,...r?{status:r}:{},limit:Rt}}function T(t){if(g(t))return t;if(typeof t!="string"||!t)return null;try{const e=JSON.parse(t);return g(e)?e:null}catch{return null}}function $t(t){return{escalation:t,metadata:g(t.metadata)?t.metadata:T(t.metadata),envelope:T(t.envelope),payload:T(t.escalation_payload),resolver:T(t.resolver_payload)}}function Wt(t){const e=t.metadata??{},s=e[It];if(Array.isArray(s))return new Set(N(s));const n=w(t.envelope,"accumulate_items");if(g(n))return new Set(Object.keys(n));if(Array.isArray(e[B])){const r=new Set(N(e[B]));return new Set(N(e[J]).filter(o=>!r.has(o)))}return new Set}function Mt(t,e){if(!e)return t;const s=new Map;return t.flatMap(n=>{const r=(s.get(n)??0)+1;return s.set(n,r),[n,`${n}${e}${r}`]})}function Ut(t,e){const s=new Set,n=typeof t.countedBy=="string"&&t.countedBy?t.countedBy:void 0;for(const r of t.in??[H])(r===H?[...Wt(e)]:Mt(N(L(r,e)),n)).forEach(i=>s.add(i));return s}function Ht(t,e){const s=w(t.envelope,Ot),n=g(s)?s[e]:void 0;return g(n)&&typeof n.label=="string"&&n.label?n.label:void 0}function Bt(t,e){if(e)for(const s of t.flagged??[]){const n=N(s.when);if(!(!n.length||typeof s.label!="string")&&X(n,e))return s.label}}function P(t){const e=t.escalation.created_at,s=e instanceof Date?e.getTime():typeof e=="string"?Date.parse(e):NaN;return Number.isNaN(s)?0:s}function Pt(t,e,s){var c;const n=new Set,r=[],o=(l,u={})=>{!l||l===Y||n.has(l)||(n.add(l),r.push({key:l,...u}))},i=t.expected;if("query"in i){const l=t.key??Ft,u=new Map;for(const m of s){const b=R(l,m),h=u.get(b);(!h||P(m)>P(h))&&u.set(b,m)}for(const m of s){const b=R(l,m);o(b,{row:u.get(b)})}}else if("list"in i)N(L(i.list,e)).forEach(l=>o(l));else{const l=i.labels?L(i.labels,e):void 0;for(const u of N((c=e.metadata)==null?void 0:c[J]))o(u,g(l)&&u in l?{label:l[u]}:{})}return r}function V(t,e,s=[]){const n=Ut(t,e),r="batch"in t.expected,o=Pt(t,e,s).map(l=>{if(n.has(l.key))return{...l,state:x.IN};const u=r?Ht(e,l.key):Bt(t,l.row);return u?{...l,state:x.FLAGGED,flag:u}:{...l,state:x.WAITING}}),i=l=>o.filter(u=>u.state===l).length,c=i(x.WAITING);return{entries:o,counts:{expected:o.length,in:i(x.IN),flagged:i(x.FLAGGED),waiting:c,outstanding:c}}}function Vt(t){const{counts:e}=t,s=[`${e.in} of ${e.expected} in`],n=new Map;for(const r of t.entries)r.state===x.FLAGGED&&r.flag&&n.set(r.flag,(n.get(r.flag)??0)+1);for(const[r,o]of n)s.push(`${o} ${r}`);return s.join(" · ")}const K={waiting:"Waiting",in:"In",flagged:"Flagged"};function Kt({state:t}){return t===x.IN?a.jsx(it,{className:"w-4 h-4 text-status-success shrink-0",strokeWidth:2,"aria-hidden":!0}):t===x.FLAGGED?a.jsx(lt,{className:"w-4 h-4 text-status-warning shrink-0",strokeWidth:2,"aria-hidden":!0}):a.jsx(ct,{className:"w-4 h-4 text-text-tertiary shrink-0",strokeWidth:2,"aria-hidden":!0})}function qt({entry:t,item:e,hostCtx:s,columns:n,offered:r,asking:o,pending:i,error:c,onAction:l,onConfirm:u,onCancel:m}){var y;const b=t.row??s,h=t.state===x.IN,k=t.state===x.FLAGGED?t.flag??K.flagged:K[t.state];return a.jsxs("li",{className:"py-2 flex items-start gap-3 border-b border-surface-border/50 last:border-0","data-testid":`roster-entry-${t.key}`,"data-state":t.state,children:[a.jsx("span",{className:"pt-0.5",children:a.jsx(Kt,{state:t.state})}),a.jsx("div",{className:"min-w-0 flex-1 flex flex-wrap items-baseline gap-x-4 gap-y-0.5",children:n.map(f=>a.jsxs("span",{className:`text-sm min-w-0 ${h?"text-text-secondary":"text-text-primary"}`,children:[a.jsxs("span",{className:"sr-only",children:[f.label,": "]}),a.jsx(ft,{raw:pt(f.value,e,b),format:f.format})]},f.label))}),a.jsx("span",{className:`text-xs font-medium shrink-0 pt-0.5 ${h?"text-status-success":t.state===x.FLAGGED?"text-status-warning":"text-text-tertiary"}`,"data-testid":`roster-state-${t.key}`,children:k}),(r.length>0||o||c)&&a.jsxs("span",{className:"shrink-0 flex flex-col items-end gap-0.5",children:[(y=o==null?void 0:o.action.fill)!=null&&y.enterCode?a.jsx(Tt,{label:o.action.label,onConfirm:f=>u(f),onCancel:m,testId:`roster-code-${t.key}`}):o?a.jsx(kt,{message:R(o.action.confirm??"",b),onConfirm:()=>u(),onCancel:m,testId:`roster-confirm-${t.key}`}):a.jsx("span",{className:"flex gap-1",children:r.map(f=>a.jsx("button",{type:"button",onClick:()=>l(f),disabled:i,className:"px-2 py-0.5 text-2xs font-medium text-accent border border-accent/40 rounded hover:bg-accent/10 disabled:opacity-40 disabled:cursor-not-allowed transition-colors","data-testid":`roster-action-${t.key}`,children:f.action.label},f.index))}),c&&a.jsx("span",{className:"text-2xs text-status-error max-w-[16rem] text-right","data-testid":`roster-error-${t.key}`,children:c})]}),t.row&&a.jsx(wt,{to:`/escalations/detail/${String(t.row.escalation.id)}`})]})}function Qt(t,e){const s=Gt(t),n=s?Dt(s,e):null;return n?{roles:n.roles,status:n.status,facets:n.facets,limit:n.limit,include:xt({key:t.key,flagged:t.flagged})?"envelope":void 0}:null}function Xt(t,e){const s=Object.entries(St(t)),n=e??{},r=s.map(([,c])=>Qt(c,n)),o=ot({queries:r.map(c=>({...mt(c??{}),enabled:!!c}))}),i={};return s.forEach(([c,l],u)=>{if(!r[u]){i[c]=V(l,n);return}const m=o[u];if(!m.isSuccess){i[c]=null;return}const b=m.data.escalations.map(h=>$t(h));i[c]=V(l,n,b)}),i}function me(t){const e=Object.entries(t).filter(([,s])=>s!==null);return e.length?Object.fromEntries(e.map(([s,n])=>[s,n.counts])):null}const Yt="x-lt-actions",_={RESOLVE:"resolve",FILL:"fill",FLAG:"flag",UNFLAG:"unflag"},Jt={resolve:[x.WAITING],fill:[x.WAITING,x.FLAGGED],flag:[x.WAITING],unflag:[x.FLAGGED]};function C(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function Z(t){const e=[];return C(t.resolverPayload)&&e.push(_.RESOLVE),C(t.fill)&&e.push(_.FILL),C(t.flag)&&typeof t.flag.label=="string"&&t.flag.label&&e.push(_.FLAG),t.unflag===!0&&e.push(_.UNFLAG),e.length===1?e[0]:null}function zt(t){const e=t==null?void 0:t[Yt];return Array.isArray(e)?e.filter(s=>C(s)&&typeof s.label=="string"&&!!s.label&&Z(s)!==null):[]}function Zt(t,e,s){const n=Z(t);return!n||(n===_.RESOLVE?!e.row:!s)?!1:(t.when===void 0?Jt[n]:Array.isArray(t.when)?t.when:[t.when]).includes(e.state)}const te=[{label:"Item",value:"{{item.itemKey}}"}],q="continue",ee=[W.NEEDS_BADGE,W.ROLE_REFUSED];function A(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function Q(t,e,s){const n=w(t.envelope,e),r=A(n)?n[s]:void 0;return typeof r=="string"?r:void 0}function ne(t,e){const s=w(e.envelope,"accumulate_items"),n=w(e.envelope,"batch_items"),r=A(s)&&A(s[t.key])?s[t.key]:null,o=r&&A(r.payload)?r.payload:A(n)&&A(n[t.key])?n[t.key]:void 0,i=typeof(r==null?void 0:r.at)=="string"?r.at:r?void 0:Q(e,"batch_filled_at",t.key),c=typeof(r==null?void 0:r.actor)=="string"?r.actor:r?void 0:Q(e,"batch_filled_by",t.key);return{itemKey:t.key,at:i??"",...o?{payload:o}:{},...c?{actor:c}:{},...t.label!==void 0?{label:t.label}:{}}}function be({fieldKey:t,schema:e,escalationContext:s}){var G;const n=s??{},r=Xt({properties:{[t]:e??{}}},n)[t],o=z(e),i=!!o&&"batch"in o.expected,c=(e==null?void 0:e["x-lt-columns"])??te,l=zt(e),u=(e==null?void 0:e.title)??"Expected items",m=e==null?void 0:e.description,b=String(((G=n.escalation)==null?void 0:G.id)??""),h=bt(),k=_t(),[y,f]=v.useState(null),[tt,F]=v.useState(null),[et,O]=v.useState({}),I=async(d,p,E)=>{F(d.key),O(j=>({...j,[d.key]:""}));try{await h.mutateAsync({id:b,field:t,action:p.index,entry:d.key,code:E})}catch(j){const D=j.message;O(rt=>({...rt,[d.key]:D}));const $=j instanceof gt&&A(j.body)?j.body.outcome:void 0;typeof $=="string"&&ee.includes($)&&k(q,()=>I(d,p,E),{badge:D})}finally{F(null)}},S=(d,p,E)=>{f(null),k(q,()=>I(d,p,E))},nt=(d,p)=>{var E;p.action.confirm||(E=p.action.fill)!=null&&E.enterCode?f({key:d.key,offer:p}):S(d,p)},st=d=>l.map((p,E)=>({action:p,index:E})).filter(({action:p})=>Zt(p,d,i));return a.jsxs("div",{"data-field-key":t,"data-testid":`roster-widget-${t}`,children:[a.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[a.jsx(Nt,{children:u}),r&&a.jsx("span",{className:"text-sm font-medium text-text-primary","data-testid":`roster-headline-${t}`,children:Vt(r)})]}),m&&a.jsx(At,{children:m}),r?r.entries.length===0?a.jsx("p",{className:"text-xs text-text-tertiary italic py-2","data-testid":`roster-empty-${t}`,children:"Nothing expected."}):a.jsx("ul",{className:"mt-1","data-testid":`roster-list-${t}`,children:r.entries.map(d=>a.jsx(qt,{entry:d,item:ne(d,n),hostCtx:n,columns:c,offered:b?st(d):[],asking:(y==null?void 0:y.key)===d.key?y.offer:null,pending:tt===d.key,error:et[d.key]||void 0,onAction:p=>nt(d,p),onConfirm:p=>y&&S(d,y.offer,p),onCancel:()=>f(null)},d.key))}):a.jsx("p",{className:"text-xs text-text-tertiary py-2","data-testid":`roster-loading-${t}`,children:"Loading expected items…"})]})}export{vt as E,Nt as F,kt as I,wt as O,be as R,Yt as X,L as a,de as b,At as c,_t as d,X as e,fe as f,pe as g,le as h,ce as i,ue as j,$t as k,me as r,xe as s,Xt as u};
|
|
2
|
-
//# sourceMappingURL=RosterWidget-DR-T4Izu.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RosterWidget-DR-T4Izu.js","sources":["../../../shared/form-validation/ctx-path.ts","../../../shared/form-validation/x-lt-show-if.ts","../../src/components/escalation/resolver-form/FieldChrome.tsx","../../src/components/escalation/widgets/OpenDetailButton.tsx","../../src/components/escalation/widgets/InlineConfirm.tsx","../../src/components/escalation/widgets/embed-write.ts","../../src/components/escalation/widgets/InlineCodeEntry.tsx","../../../shared/form-validation/x-lt-roster.ts","../../src/components/escalation/widgets/RosterEntryRow.tsx","../../src/hooks/useRosters.ts","../../../shared/form-validation/x-lt-actions.ts","../../src/components/escalation/widgets/RosterWidget.tsx"],"sourcesContent":["/**\n * Context-path resolution shared by every token that names a `\"domain.path\"`.\n *\n * A path may embed `{{domain.path}}` interpolation segments — the same\n * grammar as x-lt-help tokens — resolved against the live context before the\n * walk. This is what makes cascading selects work: a field can declare\n *\n * x-lt-options: \"lookup.geo.regions.{{resolver.country}}\"\n *\n * and its option list follows the submitter's country answer, re-resolved\n * locally on every edit. An unresolved segment means \"no concrete path yet\",\n * never a literal placeholder.\n */\nimport { getDeep } from './x-lt-bind';\n\nexport const INTERPOLATION_PATTERN = /\\{\\{\\s*([^{}]+?)\\s*\\}\\}/g;\n\n/** Whether a token embeds `{{domain.path}}` interpolation segments. */\nexport function hasInterpolation(token: unknown): token is string {\n return typeof token === 'string' && /\\{\\{[^{}]+\\}\\}/.test(token);\n}\n\n/** Resolve a concrete `\"domain.path\"` (x-lt-bind syntax, `a.b[0].c`) against the context. */\nexport function resolveCtxPath(\n path: string,\n ctx: Record<string, unknown> | undefined,\n): unknown {\n if (!ctx) return undefined;\n const dot = path.indexOf('.');\n const root = ctx[dot === -1 ? path : path.slice(0, dot)];\n if (dot === -1) return root;\n if (root === null || typeof root !== 'object') return undefined;\n return getDeep(root, path.slice(dot + 1));\n}\n\n/**\n * Interpolate every `{{domain.path}}` segment against the context. Returns\n * the concrete path, or null when any segment resolves to nothing (missing,\n * null, empty string) or to a non-scalar — an unanswered cascade parent\n * yields no path, so the dependent field offers nothing.\n */\nexport function interpolatePath(\n template: string,\n ctx: Record<string, unknown> | undefined,\n): string | null {\n let unresolved = false;\n const concrete = template.replace(INTERPOLATION_PATTERN, (_match, rawPath: string) => {\n const value = resolveCtxPath(rawPath, ctx);\n if (typeof value === 'string' && value.trim().length > 0) return value;\n if (typeof value === 'number' && Number.isFinite(value)) return String(value);\n unresolved = true;\n return '';\n });\n return unresolved ? null : concrete;\n}\n","/**\n * x-lt-showIf — conditional field visibility. A form_schema property may\n * declare `x-lt-showIf: \"domain.path\"` to show the field only when the value\n * at that path is present and truthy. Prefix `!` to invert: show when absent\n * or falsy.\n *\n * Equality forms compare the resolved value's string form:\n * \"domain.path=VALUE\" — show when String(value) equals VALUE\n * \"domain.path!=VALUE\" — show when it does not\n * An absent value compares as the empty string, so `=X` is false and `!=X` is\n * true when the path is missing. VALUE is the raw remainder after the operator\n * (trimmed; no quoting). The truthy/! forms are unchanged.\n *\n * Domains follow the same `domain.path` convention as x-lt-help tokens:\n * metadata — the escalation row's metadata dict\n * payload — the escalation context payload (escalation_payload)\n * envelope — the workflow-sent input envelope\n * escalation — top-level escalation row fields\n * resolver — the submitted resolver payload\n * roster (each roster field's counts: `roster.orders.outstanding=0`)\n *\n * A missing or non-string condition always shows the field (opt-in, safe default).\n */\nimport { getDeep } from './x-lt-bind';\nimport { HELP_DOMAINS, type HelpTokenContext } from './x-lt-help';\n\nexport type ShowIfContext = HelpTokenContext;\n\nfunction isTruthy(value: unknown): boolean {\n return value !== null && value !== undefined && value !== '' && value !== false && value !== 0;\n}\n\n/** The value's comparable string form; absent compares as the empty string. */\nfunction asComparable(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n\nfunction resolvePath(expr: string, ctx: ShowIfContext): { known: boolean; value: unknown } {\n const dot = expr.indexOf('.');\n const domain = (dot === -1 ? expr : expr.slice(0, dot)) as (typeof HELP_DOMAINS)[number];\n if (!(HELP_DOMAINS as readonly string[]).includes(domain)) return { known: false, value: undefined };\n const root = ctx[domain];\n if (dot === -1) return { known: true, value: root };\n try {\n return { known: true, value: getDeep(root, expr.slice(dot + 1)) };\n } catch {\n return { known: true, value: undefined };\n }\n}\n\n/**\n * Evaluates an x-lt-showIf condition. Returns true when the field should be\n * shown. Returns true when condition is absent, non-string, or context is null.\n * An array of conditions shows the field only when every one holds.\n */\nexport function evaluateShowIf(condition: unknown, ctx: ShowIfContext | null | undefined): boolean {\n if (Array.isArray(condition)) return condition.every((c) => evaluateShowIf(c, ctx));\n if (typeof condition !== 'string' || condition.length === 0) return true;\n if (!ctx) return true;\n const negate = condition.startsWith('!');\n const expr = negate ? condition.slice(1) : condition;\n\n // Equality forms — `!=` first so it never parses as `=` with a `!` in the path.\n const neqAt = expr.indexOf('!=');\n const eqAt = expr.indexOf('=');\n if (neqAt !== -1 || (eqAt !== -1 && eqAt !== neqAt + 1)) {\n const isNeq = neqAt !== -1 && (eqAt === -1 || neqAt < eqAt);\n const opAt = isNeq ? neqAt : eqAt;\n const path = expr.slice(0, opAt).trim();\n const expected = expr.slice(opAt + (isNeq ? 2 : 1)).trim();\n const { known, value } = resolvePath(path, ctx);\n if (!known) return true; // unknown domain — safe default, same as truthy form\n const matches = asComparable(value) === expected;\n const result = isNeq ? !matches : matches;\n return negate ? !result : result;\n }\n\n const { known, value } = resolvePath(expr, ctx);\n if (!known) return true;\n return negate ? !isTruthy(value) : isTruthy(value);\n}\n\n/**\n * `x-lt-hide-if-empty`: the field is suppressed while its value is empty\n * (null, undefined, '', false, or 0). Render and validation share this test.\n */\nexport function isHiddenIfEmpty(fieldSchema: Record<string, unknown> | undefined, value: unknown): boolean {\n if (fieldSchema?.['x-lt-hide-if-empty'] !== true) return false;\n return value === null || value === undefined || value === '' || value === false || value === 0;\n}\n\n/**\n * `x-lt-hidden: true`: the field never renders. A value set by the caller\n * (a workflow default, an API submitter) passes through to the payload and\n * is checked against the field's type and enum; the field is never required,\n * since no one on the form can answer it.\n */\nexport const X_LT_HIDDEN = 'x-lt-hidden';\n\nexport function isHiddenField(fieldSchema: Record<string, unknown> | undefined): boolean {\n return fieldSchema?.[X_LT_HIDDEN] === true;\n}\n","/**\n * Shared field chrome for the resolver form: label, helper, error, and the\n * input class recipes. One place styles every generated field.\n */\n\nexport function FieldLabel({ children, isRequired, htmlFor }: {\n children: React.ReactNode;\n isRequired?: boolean;\n htmlFor?: string;\n}) {\n // `block` is load-bearing: a <label> is inline by default, and the\n // label→instruction→control anatomy would then hold only by accident —\n // a full-width control wraps below, but a narrow control (number,\n // max-w-48) with no instruction line sits flush BESIDE the label. The\n // anatomy is a column; the label declares it.\n return (\n <label htmlFor={htmlFor} className=\"block text-2xs font-semibold uppercase tracking-wider text-text-secondary\">\n {children}\n {isRequired && <span className=\"text-status-error ml-0.5\">*</span>}\n </label>\n );\n}\n\nexport function FieldHelper({ id, children }: { id?: string; children: React.ReactNode }) {\n return (\n <p id={id} className=\"text-2xs text-text-tertiary mt-0.5 leading-snug\">\n {children}\n </p>\n );\n}\n\nexport function FieldError({ error, id }: { error?: string; id?: string }) {\n if (!error) return null;\n return (\n <p id={id} role=\"alert\" className=\"text-2xs text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]\">\n {error}\n </p>\n );\n}\n\nexport function inputClass(hasError?: boolean): string {\n return hasError\n ? 'input text-sm w-full mt-1 border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]'\n : 'input text-sm w-full mt-1';\n}\n\n// Select shares the field recipe but adds the unified chevron (via .select).\n// Width follows the content, floored for presence and capped by the cell —\n// a one-word choice never stretches across the measure. The floor is\n// min(16rem, 100%): CSS lets min-width beat max-width, so a bare min-w-64\n// would overflow a cell narrower than 16rem — the cell always wins.\nexport function selectClass(hasError?: boolean): string {\n return hasError\n ? 'select text-sm mt-1 min-w-[min(16rem,100%)] max-w-full border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]'\n : 'select text-sm mt-1 min-w-[min(16rem,100%)] max-w-full';\n}\n","import { Link } from 'react-router-dom';\nimport { ArrowUpRight } from 'lucide-react';\n\n/**\n * The one affordance for opening an embedded row's detail page — a clear\n * icon-in-a-button, not a bare glyph, so the gesture reads as \"open this\". The\n * tooltip stays generic (\"View details\") rather than naming the record kind, so\n * the same control fits any embed. Non-focusable: the row/card click and the\n * canned actions carry the keyboard path; this is a pointer shortcut.\n */\nexport function OpenDetailButton({ to, className = '' }: { to: string; className?: string }) {\n return (\n <Link\n to={to}\n title=\"View details\"\n tabIndex={-1}\n className={`inline-flex items-center justify-center w-6 h-6 shrink-0 rounded border border-surface-border text-accent/70 hover:text-accent hover:border-accent/60 hover:bg-accent/5 transition-colors ${className}`}\n >\n <ArrowUpRight className=\"w-3.5 h-3.5\" strokeWidth={2} />\n <span className=\"sr-only\">View details</span>\n </Link>\n );\n}\n","/**\n * A confirmation asked in place, beside the control that asked it. Used by\n * embedded row actions instead of a browser dialog, which blocks a shared\n * station and every other tab.\n */\nexport function InlineConfirm({ message, onConfirm, onCancel, testId }: {\n message: string;\n onConfirm: () => void;\n onCancel: () => void;\n testId?: string;\n}) {\n return (\n <span className=\"inline-flex flex-wrap items-center gap-2\" role=\"group\" aria-label=\"Confirm action\" data-testid={testId}>\n <span className=\"text-xs text-text-primary whitespace-normal\">{message}</span>\n <button\n type=\"button\"\n onClick={onConfirm}\n className=\"px-2 py-0.5 text-2xs font-medium text-text-inverse bg-accent rounded hover:bg-accent/90 transition-colors\"\n data-testid={testId ? `${testId}-yes` : undefined}\n autoFocus\n >\n Confirm\n </button>\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"px-2 py-0.5 text-2xs font-medium text-text-secondary border border-surface-border rounded hover:bg-surface-hover transition-colors\"\n data-testid={testId ? `${testId}-no` : undefined}\n >\n Cancel\n </button>\n </span>\n );\n}\n","import { createContext, useContext } from 'react';\n\nexport interface EmbedWriteOptions {\n /**\n * The action needs a badge (a role the person acting lacks): hold it for\n * the next badge, saying this. A page that takes no badges drops it.\n */\n badge?: string;\n}\n\n/** Runs an embedded row action, or holds it until the page can run it (a badge at a shared station). */\nexport type EmbedWriteGuard = (verb: string, run: () => Promise<void>, options?: EmbedWriteOptions) => void;\n\nconst runNow: EmbedWriteGuard = (_verb, run, options) => {\n if (!options?.badge) void run();\n};\n\n/**\n * The host page's gate for writes an embedded widget makes on other rows\n * (roster and list actions). Absent a provider, actions run directly.\n */\nexport const EmbedWriteContext = createContext<EmbedWriteGuard>(runNow);\n\nexport function useEmbedWrite(): EmbedWriteGuard {\n return useContext(EmbedWriteContext);\n}\n","import { useState } from 'react';\n\n/**\n * A code typed in place, beside the control that asked for it: a key-in for\n * an item whose barcode will not scan. The server checks the code against\n * the entry; Enter confirms.\n */\nexport function InlineCodeEntry({ label, onConfirm, onCancel, testId }: {\n label: string;\n onConfirm: (code: string) => void;\n onCancel: () => void;\n testId?: string;\n}) {\n const [code, setCode] = useState('');\n const submit = () => { if (code.trim()) onConfirm(code.trim()); };\n return (\n <span className=\"inline-flex flex-wrap items-center gap-2\" role=\"group\" aria-label={label} data-testid={testId}>\n <input\n type=\"text\"\n inputMode=\"numeric\"\n value={code}\n onChange={(e) => setCode(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') submit();\n if (e.key === 'Escape') onCancel();\n }}\n placeholder=\"Code on the label\"\n aria-label=\"Code on the label\"\n className=\"input text-xs py-0.5 w-40 font-mono\"\n data-testid={testId ? `${testId}-input` : undefined}\n autoFocus\n />\n <button\n type=\"button\"\n onClick={submit}\n disabled={!code.trim()}\n className=\"px-2 py-0.5 text-2xs font-medium text-text-inverse bg-accent rounded hover:bg-accent/90 disabled:opacity-40 disabled:cursor-not-allowed transition-colors\"\n data-testid={testId ? `${testId}-yes` : undefined}\n >\n {label}\n </button>\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"px-2 py-0.5 text-2xs font-medium text-text-secondary border border-surface-border rounded hover:bg-surface-hover transition-colors\"\n data-testid={testId ? `${testId}-no` : undefined}\n >\n Cancel\n </button>\n </span>\n );\n}\n","/**\n * x-lt-roster: every member a container row expects, each with its state.\n * A form field declares `x-lt-widget: \"roster\"` and an `x-lt-roster` block:\n *\n * \"x-lt-roster\": {\n * \"expected\": { \"query\": { \"roles\": [\"packing\"], \"facets\": { \"box\": \"{{escalation.id}}\" } } },\n * \"key\": \"{{metadata.orderId}}\",\n * \"in\": [\"items\", \"resolver.bags\"],\n * \"flagged\": [{ \"when\": \"resolver.outcome=missing\", \"label\": \"Missing\" }]\n * }\n *\n * The expected set is one of:\n * - `query`: member rows matched by role(s) and facets, any status unless\n * `status` narrows it. `key` names each row's entry (default its id).\n * - `list`: a `domain.path` naming an array of keys on the host row.\n * - `batch`: the host row's batch keys; `labels` names a per-key map.\n *\n * An entry is `in` when its key is held by the host row (`items`: the\n * accumulated keys, or a batch's filled keys) or appears in a named context\n * value (`resolver.<field>`, a string or an array). It is `flagged` when its\n * member row matches a `flagged` rule (or, on a batch set, when its key\n * carries a flag in `envelope.batch_flags`), and `waiting` otherwise. In wins over\n * flagged, so a member flagged on its own row and then added reads in.\n *\n * `countedBy` names the separator of counted keys (`<code>#1`, `<code>#2`):\n * the nth occurrence of a code in a named context value ticks `<code>#n`,\n * so two scans of one code tick both of its keys.\n *\n * Isomorphic: the dashboard renders the widget and the form's `roster.*`\n * context from it, and the API layer computes the same counts to evaluate\n * showIf and the roster submit guard at resolve.\n */\nimport { getDeep } from './x-lt-bind';\nimport { resolveCtxPath } from './ctx-path';\nimport { interpolateHelp, type HelpTokenContext } from './x-lt-help';\nimport { evaluateShowIf } from './x-lt-show-if';\n\nexport const X_LT_ROSTER = 'x-lt-roster';\nexport const ROSTER_WIDGET = 'roster';\n/** The context domain the counts are read from: `roster.<field>.outstanding`. */\nexport const ROSTER_DOMAIN = 'roster';\n/** The most member rows a query set reads. */\nexport const ROSTER_QUERY_LIMIT = 200;\n/** The `in` source naming the host row's held keys. */\nexport const ROSTER_ITEMS_SOURCE = 'items';\n/** `query.status` value that reads every status (the default). */\nexport const ROSTER_ANY_STATUS = 'any';\n\nexport const ROSTER_STATES = { WAITING: 'waiting', IN: 'in', FLAGGED: 'flagged' } as const;\nexport type RosterState = (typeof ROSTER_STATES)[keyof typeof ROSTER_STATES];\n\nexport interface RosterQuery {\n role?: string;\n roles?: string[];\n facets?: Record<string, string>;\n /** A status to narrow to; omitted or `any` reads every status. */\n status?: string;\n}\n\nexport type RosterExpected =\n | { query: RosterQuery }\n | { list: string }\n | { batch: true; labels?: string };\n\nexport interface RosterFlagRule {\n /** An x-lt-showIf condition over the member row's own context. */\n when: string | string[];\n label: string;\n}\n\nexport interface RosterDef {\n expected: RosterExpected;\n key?: string;\n in?: string[];\n flagged?: RosterFlagRule[];\n /** The separator of counted keys: the nth occurrence of a code ticks `<code><sep>n`. */\n countedBy?: string;\n}\n\n/** One member row's token context (the row's own domains). */\nexport type RosterRow = HelpTokenContext & { escalation: Record<string, unknown> };\n\nexport interface RosterEntry {\n key: string;\n state: RosterState;\n /** The matching flag rule's label, when flagged. */\n flag?: string;\n /** The member row, for a query set. */\n row?: RosterRow;\n /** The per-key label value from a batch's `labels` map. */\n label?: unknown;\n}\n\nexport interface RosterCounts {\n expected: number;\n in: number;\n flagged: number;\n waiting: number;\n /** Entries neither in nor flagged: the count a roster guard waits on. */\n outstanding: number;\n}\n\nexport interface RosterResult {\n entries: RosterEntry[];\n counts: RosterCounts;\n}\n\nconst DEFAULT_KEY = '{{escalation.id}}';\nconst MISSING = '—';\nconst BATCH_KEYS = 'batch_keys';\nconst BATCH_PENDING = 'batch_pending';\nconst BATCH_FLAGS = 'batch_flags';\nconst ACCUMULATE_KEYS = 'accumulate_keys';\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return !!v && typeof v === 'object' && !Array.isArray(v);\n}\n\nfunction strings(v: unknown): string[] {\n if (typeof v === 'string') return v ? [v] : [];\n if (!Array.isArray(v)) return [];\n return v.filter((s): s is string => typeof s === 'string' && s.length > 0);\n}\n\n/** The field's roster declaration, or undefined when it declares none or an unusable one. */\nexport function readRosterDef(fieldSchema: Record<string, unknown> | null | undefined): RosterDef | undefined {\n const raw = fieldSchema?.[X_LT_ROSTER];\n if (!isRecord(raw) || !isRecord(raw.expected)) return undefined;\n const e = raw.expected;\n const hasSource = isRecord(e.query) || typeof e.list === 'string' || e.batch === true;\n return hasSource ? (raw as unknown as RosterDef) : undefined;\n}\n\n/** Every roster field of a form schema, by field name. */\nexport function readRosterDefs(schema: Record<string, unknown> | null | undefined): Record<string, RosterDef> {\n const properties = isRecord(schema?.properties) ? (schema!.properties as Record<string, unknown>) : {};\n const defs: Record<string, RosterDef> = {};\n for (const [field, def] of Object.entries(properties)) {\n const roster = isRecord(def) ? readRosterDef(def) : undefined;\n if (roster) defs[field] = roster;\n }\n return defs;\n}\n\n/** The roster's member-row query, or null when its set is not a query. */\nexport function rosterQueryOf(def: RosterDef): RosterQuery | null {\n return 'query' in def.expected && isRecord(def.expected.query) ? def.expected.query : null;\n}\n\n/** The query's concrete params: facets interpolated, `any` status dropped. Null when the scope is empty. */\nexport function resolveRosterQuery(\n query: RosterQuery,\n ctx: HelpTokenContext,\n): { roles?: string[]; facets: Record<string, string>; status?: string; limit: number } | null {\n const facets: Record<string, string> = {};\n for (const [k, v] of Object.entries(query.facets ?? {})) {\n if (typeof v !== 'string') continue;\n const resolved = interpolateHelp(v, ctx);\n if (!resolved || resolved === MISSING) return null;\n facets[k] = resolved;\n }\n const roles = [...(query.role ? [query.role] : []), ...strings(query.roles)];\n if (!roles.length && !Object.keys(facets).length) return null;\n const status = query.status && query.status !== ROSTER_ANY_STATUS ? query.status : undefined;\n return { ...(roles.length ? { roles } : {}), facets, ...(status ? { status } : {}), limit: ROSTER_QUERY_LIMIT };\n}\n\nfunction parseJson(v: unknown): Record<string, unknown> | null {\n if (isRecord(v)) return v;\n if (typeof v !== 'string' || !v) return null;\n try {\n const parsed = JSON.parse(v);\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\n/** A member row's token context, from a row whose JSON columns are strings or objects. */\nexport function rosterRowContext(row: Record<string, unknown>): RosterRow {\n return {\n escalation: row,\n metadata: isRecord(row.metadata) ? row.metadata : parseJson(row.metadata),\n envelope: parseJson(row.envelope),\n payload: parseJson(row.escalation_payload),\n resolver: parseJson(row.resolver_payload),\n };\n}\n\n/** The keys the host row holds: its accumulated keys, or a batch's filled keys. */\nfunction heldKeys(ctx: HelpTokenContext): Set<string> {\n const metadata = ctx.metadata ?? {};\n const accumulated = metadata[ACCUMULATE_KEYS];\n if (Array.isArray(accumulated)) return new Set(strings(accumulated));\n const envelopeItems = getDeep(ctx.envelope, 'accumulate_items');\n if (isRecord(envelopeItems)) return new Set(Object.keys(envelopeItems));\n if (Array.isArray(metadata[BATCH_PENDING])) {\n const pending = new Set(strings(metadata[BATCH_PENDING]));\n return new Set(strings(metadata[BATCH_KEYS]).filter((k) => !pending.has(k)));\n }\n return new Set();\n}\n\n/** Each value as given, and with `countedBy` its nth occurrence also as `<value><sep>n`. */\nfunction countedKeys(values: string[], separator: string | undefined): string[] {\n if (!separator) return values;\n const seen = new Map<string, number>();\n return values.flatMap((v) => {\n const n = (seen.get(v) ?? 0) + 1;\n seen.set(v, n);\n return [v, `${v}${separator}${n}`];\n });\n}\n\nfunction arrivedKeys(def: RosterDef, ctx: HelpTokenContext): Set<string> {\n const arrived = new Set<string>();\n const separator = typeof def.countedBy === 'string' && def.countedBy ? def.countedBy : undefined;\n for (const source of def.in ?? [ROSTER_ITEMS_SOURCE]) {\n const keys = source === ROSTER_ITEMS_SOURCE\n ? [...heldKeys(ctx)]\n : countedKeys(strings(resolveCtxPath(source, ctx as Record<string, unknown>)), separator);\n keys.forEach((k) => arrived.add(k));\n }\n return arrived;\n}\n\n/** A batch key's flag label, from `envelope.batch_flags[key].label`. */\nfunction batchFlagLabel(ctx: HelpTokenContext, key: string): string | undefined {\n const flags = getDeep(ctx.envelope, BATCH_FLAGS);\n const flag = isRecord(flags) ? flags[key] : undefined;\n return isRecord(flag) && typeof flag.label === 'string' && flag.label ? flag.label : undefined;\n}\n\nfunction flagFor(def: RosterDef, row: RosterRow | undefined): string | undefined {\n if (!row) return undefined;\n for (const rule of def.flagged ?? []) {\n const conditions = strings(rule.when);\n if (!conditions.length || typeof rule.label !== 'string') continue;\n if (evaluateShowIf(conditions, row)) return rule.label;\n }\n return undefined;\n}\n\n/** A row's creation instant in ms; 0 when absent or unreadable. */\nfunction createdAt(row: RosterRow): number {\n const raw = row.escalation.created_at;\n const ms = raw instanceof Date ? raw.getTime() : typeof raw === 'string' ? Date.parse(raw) : NaN;\n return Number.isNaN(ms) ? 0 : ms;\n}\n\n/**\n * The expected keys in order, each with its member row (query) or label\n * (batch). Several rows sharing a key (a member that parked again) read as\n * one entry on the newest row, so its state and actions follow the live row.\n */\nfunction expectedEntries(\n def: RosterDef,\n ctx: HelpTokenContext,\n rows: RosterRow[],\n): Array<{ key: string; row?: RosterRow; label?: unknown }> {\n const seen = new Set<string>();\n const out: Array<{ key: string; row?: RosterRow; label?: unknown }> = [];\n const push = (key: string, extra: { row?: RosterRow; label?: unknown } = {}) => {\n if (!key || key === MISSING || seen.has(key)) return;\n seen.add(key);\n out.push({ key, ...extra });\n };\n const e = def.expected;\n if ('query' in e) {\n const template = def.key ?? DEFAULT_KEY;\n const newest = new Map<string, RosterRow>();\n for (const row of rows) {\n const key = interpolateHelp(template, row);\n const held = newest.get(key);\n if (!held || createdAt(row) > createdAt(held)) newest.set(key, row);\n }\n for (const row of rows) {\n const key = interpolateHelp(template, row);\n push(key, { row: newest.get(key) });\n }\n } else if ('list' in e) {\n strings(resolveCtxPath(e.list, ctx as Record<string, unknown>)).forEach((k) => push(k));\n } else {\n const labels = e.labels ? resolveCtxPath(e.labels, ctx as Record<string, unknown>) : undefined;\n for (const key of strings(ctx.metadata?.[BATCH_KEYS])) {\n push(key, isRecord(labels) && key in labels ? { label: labels[key] } : {});\n }\n }\n return out;\n}\n\n/**\n * Every expected entry with its state, and the counts. `rows` are the\n * member rows a query set read (ignored for list and batch sets). `ctx` is\n * the host row's context with the live form values under `resolver`.\n */\nexport function computeRoster(def: RosterDef, ctx: HelpTokenContext, rows: RosterRow[] = []): RosterResult {\n const arrived = arrivedKeys(def, ctx);\n const batch = 'batch' in def.expected;\n const entries: RosterEntry[] = expectedEntries(def, ctx, rows).map((e) => {\n if (arrived.has(e.key)) return { ...e, state: ROSTER_STATES.IN };\n const flag = batch ? batchFlagLabel(ctx, e.key) : flagFor(def, e.row);\n return flag ? { ...e, state: ROSTER_STATES.FLAGGED, flag } : { ...e, state: ROSTER_STATES.WAITING };\n });\n const count = (s: RosterState) => entries.filter((e) => e.state === s).length;\n const waiting = count(ROSTER_STATES.WAITING);\n return {\n entries,\n counts: {\n expected: entries.length,\n in: count(ROSTER_STATES.IN),\n flagged: count(ROSTER_STATES.FLAGGED),\n waiting,\n outstanding: waiting,\n },\n };\n}\n\n/** The header line: \"3 of 5 in · 1 Missing\". */\nexport function rosterHeadline(result: RosterResult): string {\n const { counts } = result;\n const parts = [`${counts.in} of ${counts.expected} in`];\n const byFlag = new Map<string, number>();\n for (const e of result.entries) {\n if (e.state === ROSTER_STATES.FLAGGED && e.flag) byFlag.set(e.flag, (byFlag.get(e.flag) ?? 0) + 1);\n }\n for (const [flag, n] of byFlag) parts.push(`${n} ${flag}`);\n return parts.join(' · ');\n}\n","import { CheckCircle2, Circle, Flag } from 'lucide-react';\nimport { OpenDetailButton } from './OpenDetailButton';\nimport { InlineConfirm } from './InlineConfirm';\nimport { InlineCodeEntry } from './InlineCodeEntry';\nimport { FormattedValue } from '../../common/display/FormattedValue';\nimport { interpolateHelp } from '../../../lib/x-lt-help';\nimport { interpolateItemTemplate, type EscalationItem } from '../../../lib/escalation-items';\nimport type { EmbedColumnDef } from '../../../lib/embed-row';\nimport type { RosterActionDef } from '../../../lib/x-lt-actions';\nimport { ROSTER_STATES, type RosterEntry, type RosterState } from '../../../lib/x-lt-roster';\nimport type { ShowIfContext } from '../../../lib/x-lt-show-if';\n\n/** An action the entry offers, with its index among the field's actions. */\nexport interface OfferedAction {\n index: number;\n action: RosterActionDef;\n}\n\nconst STATE_TEXT: Record<RosterState, string> = { waiting: 'Waiting', in: 'In', flagged: 'Flagged' };\n\nfunction StateMark({ state }: { state: RosterState }) {\n if (state === ROSTER_STATES.IN) return <CheckCircle2 className=\"w-4 h-4 text-status-success shrink-0\" strokeWidth={2} aria-hidden />;\n if (state === ROSTER_STATES.FLAGGED) return <Flag className=\"w-4 h-4 text-status-warning shrink-0\" strokeWidth={2} aria-hidden />;\n return <Circle className=\"w-4 h-4 text-text-tertiary shrink-0\" strokeWidth={2} aria-hidden />;\n}\n\n/**\n * One roster entry: its state mark, columns, state label, and the actions\n * its state offers. Columns read the member row's domains (a query set) or\n * the host row's, beside `{{item.*}}`: the entry key, a batch label, and\n * the item's payload, actor and time once it is in.\n */\nexport function RosterEntryRow({\n entry, item, hostCtx, columns, offered, asking, pending, error, onAction, onConfirm, onCancel,\n}: {\n entry: RosterEntry;\n item: EscalationItem & { label?: unknown };\n hostCtx: ShowIfContext;\n columns: EmbedColumnDef[];\n offered: OfferedAction[];\n /** The action asking in place: its confirmation, or its code entry. */\n asking: OfferedAction | null;\n pending: boolean;\n error?: string;\n onAction: (offer: OfferedAction) => void;\n onConfirm: (code?: string) => void;\n onCancel: () => void;\n}) {\n const ctx = entry.row ?? hostCtx;\n const done = entry.state === ROSTER_STATES.IN;\n const stateLabel = entry.state === ROSTER_STATES.FLAGGED ? entry.flag ?? STATE_TEXT.flagged : STATE_TEXT[entry.state];\n\n return (\n <li\n className=\"py-2 flex items-start gap-3 border-b border-surface-border/50 last:border-0\"\n data-testid={`roster-entry-${entry.key}`}\n data-state={entry.state}\n >\n <span className=\"pt-0.5\"><StateMark state={entry.state} /></span>\n <div className=\"min-w-0 flex-1 flex flex-wrap items-baseline gap-x-4 gap-y-0.5\">\n {columns.map((col) => (\n <span key={col.label} className={`text-sm min-w-0 ${done ? 'text-text-secondary' : 'text-text-primary'}`}>\n <span className=\"sr-only\">{col.label}: </span>\n <FormattedValue raw={interpolateItemTemplate(col.value, item, ctx)} format={col.format} />\n </span>\n ))}\n </div>\n <span\n className={`text-xs font-medium shrink-0 pt-0.5 ${done ? 'text-status-success' : entry.state === ROSTER_STATES.FLAGGED ? 'text-status-warning' : 'text-text-tertiary'}`}\n data-testid={`roster-state-${entry.key}`}\n >\n {stateLabel}\n </span>\n {(offered.length > 0 || asking || error) && (\n <span className=\"shrink-0 flex flex-col items-end gap-0.5\">\n {asking?.action.fill?.enterCode ? (\n <InlineCodeEntry\n label={asking.action.label}\n onConfirm={(code) => onConfirm(code)}\n onCancel={onCancel}\n testId={`roster-code-${entry.key}`}\n />\n ) : asking ? (\n <InlineConfirm\n message={interpolateHelp(asking.action.confirm ?? '', ctx)}\n onConfirm={() => onConfirm()}\n onCancel={onCancel}\n testId={`roster-confirm-${entry.key}`}\n />\n ) : (\n <span className=\"flex gap-1\">\n {offered.map((offer) => (\n <button\n key={offer.index}\n type=\"button\"\n onClick={() => onAction(offer)}\n disabled={pending}\n className=\"px-2 py-0.5 text-2xs font-medium text-accent border border-accent/40 rounded hover:bg-accent/10 disabled:opacity-40 disabled:cursor-not-allowed transition-colors\"\n data-testid={`roster-action-${entry.key}`}\n >\n {offer.action.label}\n </button>\n ))}\n </span>\n )}\n {error && (\n <span className=\"text-2xs text-status-error max-w-[16rem] text-right\" data-testid={`roster-error-${entry.key}`}>{error}</span>\n )}\n </span>\n )}\n {entry.row && (\n <OpenDetailButton to={`/escalations/detail/${String(entry.row.escalation.id)}`} />\n )}\n </li>\n );\n}\n","import { useQueries } from '@tanstack/react-query';\nimport { escalationListQuery } from '../api/escalations';\nimport { schemaNeedsEnvelope } from '../lib/schema-needs-envelope';\nimport {\n computeRoster,\n readRosterDefs,\n resolveRosterQuery,\n rosterQueryOf,\n rosterRowContext,\n type RosterDef,\n type RosterResult,\n type RosterRow,\n} from '../lib/x-lt-roster';\nimport type { ShowIfContext } from '../lib/x-lt-show-if';\n\n/** A roster's result, or null while its member rows are loading or failed to load. */\nexport type RosterView = RosterResult | null;\n\nfunction listFiltersFor(def: RosterDef, ctx: ShowIfContext) {\n const query = rosterQueryOf(def);\n const scoped = query ? resolveRosterQuery(query, ctx) : null;\n if (!scoped) return null;\n return {\n roles: scoped.roles,\n status: scoped.status,\n facets: scoped.facets,\n limit: scoped.limit,\n include: schemaNeedsEnvelope({ key: def.key, flagged: def.flagged }) ? ('envelope' as const) : undefined,\n };\n}\n\n/**\n * Every roster of a form, by field name. Member rows load through the shared\n * list query, so a roster refreshes on the same escalation events as every\n * list, and the widget and the page read one cached result. `ctx` carries\n * the live form values under `resolver`.\n */\nexport function useRosters(\n schema: Record<string, unknown> | null | undefined,\n ctx: ShowIfContext | undefined,\n): Record<string, RosterView> {\n const defs = Object.entries(readRosterDefs(schema));\n const host = ctx ?? {};\n const filters = defs.map(([, def]) => listFiltersFor(def, host));\n const reads = useQueries({\n queries: filters.map((f) => ({\n ...escalationListQuery(f ?? {}),\n enabled: !!f,\n })),\n });\n\n const views: Record<string, RosterView> = {};\n defs.forEach(([field, def], i) => {\n if (!filters[i]) {\n views[field] = computeRoster(def, host);\n return;\n }\n const read = reads[i];\n if (!read.isSuccess) {\n views[field] = null;\n return;\n }\n const rows: RosterRow[] = read.data.escalations.map((e) => rosterRowContext(e as unknown as Record<string, unknown>));\n views[field] = computeRoster(def, host, rows);\n });\n return views;\n}\n\n/** The `roster` context domain: each loaded roster's counts. */\nexport function rosterContext(views: Record<string, RosterView>): Record<string, unknown> | null {\n const loaded = Object.entries(views).filter(([, v]) => v !== null);\n if (!loaded.length) return null;\n return Object.fromEntries(loaded.map(([field, v]) => [field, v!.counts]));\n}\n","/**\n * x-lt-actions on a roster field: the acts an entry offers, read the same way\n * by the dashboard (which shows them) and the API (which runs them). Each\n * action is exactly one act:\n *\n * { \"label\": \"Missing\", \"resolverPayload\": { \"outcome\": \"missing\" } } resolve the member row\n * { \"label\": \"Key in\", \"fill\": { \"payload\": { \"source\": \"key-in\" }, \"enterCode\": true } }\n * { \"label\": \"Missing\", \"flag\": { \"label\": \"Missing\" } } flag the batch key\n * { \"label\": \"Found it\", \"unflag\": true } clear the flag\n *\n * `when` names the entry states that offer it. `roles` limits who may run it:\n * the action shows to everyone and runs only for a person holding one of the\n * roles; `refuse` is what anyone else is told. The server re-reads the action\n * from the row's form schema and decides; the dashboard only displays.\n */\nimport { interpolateHelp, type HelpTokenContext } from './x-lt-help';\nimport { ROSTER_STATES, type RosterEntry, type RosterState } from './x-lt-roster';\nimport { displayGtin, isValidGtin, normalizeGtin } from '../scan-code/gtin';\n\nexport const X_LT_ACTIONS = 'x-lt-actions';\n\nexport const ROSTER_ACTION_KINDS = {\n RESOLVE: 'resolve',\n FILL: 'fill',\n FLAG: 'flag',\n UNFLAG: 'unflag',\n} as const;\nexport type RosterActionKind = (typeof ROSTER_ACTION_KINDS)[keyof typeof ROSTER_ACTION_KINDS];\n\n/** The separator of counted batch keys when the roster names none. */\nexport const ROSTER_KEY_SEPARATOR_DEFAULT = '#';\n\n/** The payload key a key-in records the entered code under. */\nexport const ENTERED_CODE_KEY = 'enteredCode';\n\nexport interface RosterActionDef {\n label: string;\n /** The entry states that offer it; the default follows the act. */\n when?: RosterState | RosterState[];\n /** A confirmation asked in place before firing; tokens interpolate per entry. */\n confirm?: string;\n /** Resolve the entry's member row with this canned payload (a query set). */\n resolverPayload?: Record<string, unknown>;\n /** Fill the entry's batch key; `enterCode` asks for the code and checks it against the key. */\n fill?: { payload?: Record<string, unknown>; enterCode?: boolean };\n /** Flag the entry's batch key. */\n flag?: { label: string; payload?: Record<string, unknown> };\n /** Clear the entry's flag. */\n unflag?: true;\n /** Runs only for a person holding one of these roles. */\n roles?: string[];\n /** What a person without the roles is told. */\n refuse?: string;\n}\n\nconst DEFAULT_WHEN: Record<RosterActionKind, RosterState[]> = {\n resolve: [ROSTER_STATES.WAITING],\n fill: [ROSTER_STATES.WAITING, ROSTER_STATES.FLAGGED],\n flag: [ROSTER_STATES.WAITING],\n unflag: [ROSTER_STATES.FLAGGED],\n};\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return !!v && typeof v === 'object' && !Array.isArray(v);\n}\n\n/** The one act an action declares, or null when it declares none or several. */\nexport function rosterActionKind(action: RosterActionDef): RosterActionKind | null {\n const kinds: RosterActionKind[] = [];\n if (isRecord(action.resolverPayload)) kinds.push(ROSTER_ACTION_KINDS.RESOLVE);\n if (isRecord(action.fill)) kinds.push(ROSTER_ACTION_KINDS.FILL);\n if (isRecord(action.flag) && typeof action.flag.label === 'string' && action.flag.label) {\n kinds.push(ROSTER_ACTION_KINDS.FLAG);\n }\n if (action.unflag === true) kinds.push(ROSTER_ACTION_KINDS.UNFLAG);\n return kinds.length === 1 ? kinds[0] : null;\n}\n\n/** The field's actions with a label and exactly one act, in declared order. */\nexport function readRosterActions(fieldSchema: Record<string, unknown> | null | undefined): RosterActionDef[] {\n const raw = fieldSchema?.[X_LT_ACTIONS];\n if (!Array.isArray(raw)) return [];\n return raw.filter((a): a is RosterActionDef =>\n isRecord(a) && typeof a.label === 'string' && !!a.label && rosterActionKind(a as unknown as RosterActionDef) !== null);\n}\n\n/**\n * True when the entry offers the action: the entry is in one of its states,\n * and the act fits the entry (a resolve needs a member row; batch acts need\n * a batch set).\n */\nexport function offersAction(action: RosterActionDef, entry: RosterEntry, batch: boolean): boolean {\n const kind = rosterActionKind(action);\n if (!kind) return false;\n if (kind === ROSTER_ACTION_KINDS.RESOLVE ? !entry.row : !batch) return false;\n const when = action.when === undefined ? DEFAULT_WHEN[kind]\n : Array.isArray(action.when) ? action.when : [action.when];\n return when.includes(entry.state);\n}\n\n/** True when a person holding `roles` may run the action. */\nexport function holdsActionRole(action: Pick<RosterActionDef, 'roles'>, roles: string[], superadmin = false): boolean {\n const required = Array.isArray(action.roles) ? action.roles.filter((r) => typeof r === 'string' && r) : [];\n return required.length === 0 || superadmin || required.some((r) => roles.includes(r));\n}\n\n/** What a person without the action's roles is told. */\nexport function actionRefusal(action: Pick<RosterActionDef, 'label' | 'roles' | 'refuse'>): string {\n if (typeof action.refuse === 'string' && action.refuse.trim()) return action.refuse;\n const roles = (action.roles ?? []).filter(Boolean);\n return `${action.label} needs ${roles.length > 1 ? 'one of these roles' : 'the role'}: ${roles.join(', ')}.`;\n}\n\n/** Deep-walk a payload template: string leaves interpolate against the context; other types pass through typed. */\nexport function interpolatePayload(value: unknown, ctx: HelpTokenContext): unknown {\n if (typeof value === 'string') return interpolateHelp(value, ctx);\n if (Array.isArray(value)) return value.map((v) => interpolatePayload(v, ctx));\n if (isRecord(value)) {\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, interpolatePayload(v, ctx)]));\n }\n return value;\n}\n\n/** The code a batch key names, without its ordinal suffix. */\nexport function batchKeyCode(key: string, separator = ROSTER_KEY_SEPARATOR_DEFAULT): string {\n const at = key.lastIndexOf(separator);\n return at > 0 && /^[0-9]+$/.test(key.slice(at + 1)) ? key.slice(0, at) : key;\n}\n\n/** The batch key's code as its label prints it: a GTIN in its EAN-13 or EAN-8 form. */\nexport function printedKeyCode(key: string, separator?: string): string {\n const code = batchKeyCode(key, separator);\n return isValidGtin(code) ? displayGtin(normalizeGtin(code)) : code;\n}\n\n/**\n * True when an entered code names the batch key's code. GTINs compare in\n * their 14-digit form, so a UPC-A typed from the label matches its GTIN-14\n * key; anything else compares as trimmed text.\n */\nexport function enteredCodeMatches(entered: string, key: string, separator?: string): boolean {\n const typed = entered.trim();\n const code = batchKeyCode(key, separator);\n if (!typed) return false;\n if (isValidGtin(typed) && isValidGtin(code)) return normalizeGtin(typed) === normalizeGtin(code);\n return typed === code;\n}\n","import { useState } from 'react';\nimport { FieldLabel, FieldHelper } from '../resolver-form/FieldChrome';\nimport { RosterEntryRow, type OfferedAction } from './RosterEntryRow';\nimport { useEmbedWrite } from './embed-write';\nimport { useRosters } from '../../../hooks/useRosters';\nimport { ApiError } from '../../../api/client';\nimport { ROSTER_ACTION_OUTCOMES, useRosterAction } from '../../../api/escalations';\nimport { getDeep } from '../../../lib/x-lt-bind';\nimport type { EmbedColumnDef } from '../../../lib/embed-row';\nimport { offersAction, readRosterActions } from '../../../lib/x-lt-actions';\nimport { readRosterDef, rosterHeadline, type RosterEntry } from '../../../lib/x-lt-roster';\nimport type { EscalationItem } from '../../../lib/escalation-items';\nimport type { ShowIfContext } from '../../../lib/x-lt-show-if';\nimport type { WidgetProps } from './index';\n\nconst DEFAULT_COLUMNS: EmbedColumnDef[] = [{ label: 'Item', value: '{{item.itemKey}}' }];\nconst EMBED_WRITE_VERB = 'continue';\nconst BADGE_OUTCOMES: string[] = [ROSTER_ACTION_OUTCOMES.NEEDS_BADGE, ROSTER_ACTION_OUTCOMES.ROLE_REFUSED];\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return !!v && typeof v === 'object' && !Array.isArray(v);\n}\n\n/** The value a per-key envelope map holds for the entry, when it is a string. */\nfunction keyed(ctx: ShowIfContext, map: string, key: string): string | undefined {\n const values = getDeep(ctx.envelope, map);\n const value = isRecord(values) ? values[key] : undefined;\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * The entry's `item` domain: its key, a batch label, and the item once it is\n * in. A held item reads its payload, time and actor from `accumulate_items`;\n * a batch entry reads its payload from `batch_items` and its time and actor\n * from `batch_filled_at` and `batch_filled_by`.\n */\nfunction itemFor(entry: RosterEntry, ctx: ShowIfContext): EscalationItem & { label?: unknown } {\n const held = getDeep(ctx.envelope, 'accumulate_items');\n const batchPayload = getDeep(ctx.envelope, 'batch_items');\n const h = isRecord(held) && isRecord(held[entry.key]) ? held[entry.key] as Record<string, unknown> : null;\n const payload = h && isRecord(h.payload) ? h.payload\n : isRecord(batchPayload) && isRecord(batchPayload[entry.key]) ? batchPayload[entry.key] as Record<string, unknown>\n : undefined;\n const at = typeof h?.at === 'string' ? h.at : h ? undefined : keyed(ctx, 'batch_filled_at', entry.key);\n const actor = typeof h?.actor === 'string' ? h.actor : h ? undefined : keyed(ctx, 'batch_filled_by', entry.key);\n return {\n itemKey: entry.key,\n at: at ?? '',\n ...(payload ? { payload } : {}),\n ...(actor ? { actor } : {}),\n ...(entry.label !== undefined ? { label: entry.label } : {}),\n };\n}\n\n/**\n * Roster widget: every member the host row expects, each marked waiting, in,\n * or flagged, with the count in the heading. The entries come from the same\n * shared computation the page reads for `roster.*` and the roster guard,\n * against the live form, so a scan into a form field ticks its entry in at\n * once and an arrival on any device ticks it in on the next escalation\n * event.\n *\n * Actions run on the server (`/escalations/:id/roster-action`), which\n * re-reads the declaration: a resolve of the entry's member row, or a fill,\n * flag or unflag of its batch key. An action limited to roles asks for a\n * badge of that role when the person acting lacks it.\n *\n * Schema usage:\n * \"x-lt-widget\": \"roster\",\n * \"x-lt-roster\": { \"expected\": { ... }, \"key\": \"...\", \"in\": [...], \"flagged\": [...] },\n * \"x-lt-columns\": [{ \"label\": \"Order\", \"value\": \"{{metadata.orderId}}\" }],\n * \"x-lt-actions\": [{ \"label\": \"Missing\", \"when\": \"waiting\",\n * \"resolverPayload\": { \"outcome\": \"missing\" },\n * \"confirm\": \"Mark {{metadata.orderId}} missing?\" }]\n *\n * Display-only: produces no value of its own in the resolver payload.\n */\nexport function RosterWidget({ fieldKey, schema, escalationContext }: WidgetProps) {\n const ctx = escalationContext ?? {};\n const view = useRosters({ properties: { [fieldKey]: schema ?? {} } }, ctx)[fieldKey];\n const def = readRosterDef(schema);\n const batch = !!def && 'batch' in def.expected;\n const columns = (schema?.['x-lt-columns'] as EmbedColumnDef[] | undefined) ?? DEFAULT_COLUMNS;\n const actions = readRosterActions(schema);\n const label = (schema?.title as string | undefined) ?? 'Expected items';\n const helperText = schema?.description as string | undefined;\n const hostId = String((ctx.escalation as Record<string, unknown> | undefined)?.id ?? '');\n\n const runAction = useRosterAction();\n const guard = useEmbedWrite();\n const [asking, setAsking] = useState<{ key: string; offer: OfferedAction } | null>(null);\n const [pendingKey, setPendingKey] = useState<string | null>(null);\n const [errors, setErrors] = useState<Record<string, string>>({});\n\n const fire = async (entry: RosterEntry, offer: OfferedAction, code?: string): Promise<void> => {\n setPendingKey(entry.key);\n setErrors((prev) => ({ ...prev, [entry.key]: '' }));\n try {\n await runAction.mutateAsync({ id: hostId, field: fieldKey, action: offer.index, entry: entry.key, code });\n } catch (err) {\n const message = (err as Error).message;\n setErrors((prev) => ({ ...prev, [entry.key]: message }));\n const outcome = err instanceof ApiError && isRecord(err.body) ? err.body.outcome : undefined;\n if (typeof outcome === 'string' && BADGE_OUTCOMES.includes(outcome)) {\n guard(EMBED_WRITE_VERB, () => fire(entry, offer, code), { badge: message });\n }\n } finally {\n setPendingKey(null);\n }\n };\n\n const act = (entry: RosterEntry, offer: OfferedAction, code?: string) => {\n setAsking(null);\n guard(EMBED_WRITE_VERB, () => fire(entry, offer, code));\n };\n\n const request = (entry: RosterEntry, offer: OfferedAction) => {\n if (offer.action.confirm || offer.action.fill?.enterCode) setAsking({ key: entry.key, offer });\n else act(entry, offer);\n };\n\n const offeredFor = (entry: RosterEntry): OfferedAction[] =>\n actions\n .map((action, index) => ({ action, index }))\n .filter(({ action }) => offersAction(action, entry, batch));\n\n return (\n <div data-field-key={fieldKey} data-testid={`roster-widget-${fieldKey}`}>\n <div className=\"flex items-baseline justify-between gap-3\">\n <FieldLabel>{label}</FieldLabel>\n {view && (\n <span className=\"text-sm font-medium text-text-primary\" data-testid={`roster-headline-${fieldKey}`}>\n {rosterHeadline(view)}\n </span>\n )}\n </div>\n {helperText && <FieldHelper>{helperText}</FieldHelper>}\n {!view ? (\n <p className=\"text-xs text-text-tertiary py-2\" data-testid={`roster-loading-${fieldKey}`}>Loading expected items…</p>\n ) : view.entries.length === 0 ? (\n <p className=\"text-xs text-text-tertiary italic py-2\" data-testid={`roster-empty-${fieldKey}`}>Nothing expected.</p>\n ) : (\n <ul className=\"mt-1\" data-testid={`roster-list-${fieldKey}`}>\n {view.entries.map((entry) => (\n <RosterEntryRow\n key={entry.key}\n entry={entry}\n item={itemFor(entry, ctx)}\n hostCtx={ctx}\n columns={columns}\n offered={hostId ? offeredFor(entry) : []}\n asking={asking?.key === entry.key ? asking.offer : null}\n pending={pendingKey === entry.key}\n error={errors[entry.key] || undefined}\n onAction={(offer) => request(entry, offer)}\n onConfirm={(code) => asking && act(entry, asking.offer, code)}\n onCancel={() => setAsking(null)}\n />\n ))}\n </ul>\n )}\n </div>\n );\n}\n"],"names":["INTERPOLATION_PATTERN","hasInterpolation","token","resolveCtxPath","path","ctx","dot","root","getDeep","interpolatePath","template","unresolved","concrete","_match","rawPath","value","isTruthy","asComparable","resolvePath","expr","domain","HELP_DOMAINS","evaluateShowIf","condition","c","negate","neqAt","eqAt","isNeq","opAt","expected","known","matches","result","isHiddenIfEmpty","fieldSchema","X_LT_HIDDEN","isHiddenField","FieldLabel","children","isRequired","htmlFor","jsxs","jsx","FieldHelper","id","FieldError","error","inputClass","hasError","selectClass","OpenDetailButton","to","className","Link","ArrowUpRight","InlineConfirm","message","onConfirm","onCancel","testId","runNow","_verb","run","options","EmbedWriteContext","createContext","useEmbedWrite","useContext","InlineCodeEntry","label","code","setCode","useState","submit","e","X_LT_ROSTER","ROSTER_QUERY_LIMIT","ROSTER_ITEMS_SOURCE","ROSTER_ANY_STATUS","ROSTER_STATES","DEFAULT_KEY","MISSING","BATCH_KEYS","BATCH_PENDING","BATCH_FLAGS","ACCUMULATE_KEYS","isRecord","v","strings","s","readRosterDef","raw","readRosterDefs","schema","properties","defs","field","def","roster","rosterQueryOf","resolveRosterQuery","query","facets","k","resolved","interpolateHelp","roles","status","parseJson","parsed","rosterRowContext","row","heldKeys","metadata","accumulated","envelopeItems","pending","countedKeys","values","separator","seen","n","arrivedKeys","arrived","source","batchFlagLabel","key","flags","flag","flagFor","rule","conditions","createdAt","ms","expectedEntries","rows","out","push","extra","newest","held","labels","_a","computeRoster","batch","entries","count","waiting","rosterHeadline","counts","parts","byFlag","STATE_TEXT","StateMark","state","CheckCircle2","Flag","Circle","RosterEntryRow","entry","item","hostCtx","columns","offered","asking","onAction","done","stateLabel","col","FormattedValue","interpolateItemTemplate","offer","listFiltersFor","scoped","schemaNeedsEnvelope","useRosters","host","filters","reads","useQueries","f","escalationListQuery","views","i","read","rosterContext","loaded","X_LT_ACTIONS","ROSTER_ACTION_KINDS","DEFAULT_WHEN","rosterActionKind","action","kinds","readRosterActions","a","offersAction","kind","DEFAULT_COLUMNS","EMBED_WRITE_VERB","BADGE_OUTCOMES","ROSTER_ACTION_OUTCOMES","keyed","map","itemFor","batchPayload","h","payload","at","actor","RosterWidget","fieldKey","escalationContext","view","actions","helperText","hostId","runAction","useRosterAction","guard","setAsking","pendingKey","setPendingKey","errors","setErrors","fire","prev","err","outcome","ApiError","act","request","offeredFor","index"],"mappings":"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"}
|