@hotmeshio/long-tail 0.14.0 → 0.14.1
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/api/escalations/claim.d.ts +4 -1
- package/build/api/escalations/claim.js +6 -2
- package/build/index.js +4 -0
- package/build/routes/escalations/single.js +3 -1
- package/build/sdk/index.d.ts +1 -0
- package/build/services/escalation/crud.d.ts +10 -2
- package/build/services/escalation/crud.js +20 -12
- package/dashboard/dist/assets/{AdminDashboard-DeZsR4pA.js → AdminDashboard-C4h1R-lz.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-DeZsR4pA.js.map → AdminDashboard-C4h1R-lz.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-Bi5ZAsjf.js → AgentConfigPage-EWC8VQ7R.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-Bi5ZAsjf.js.map → AgentConfigPage-EWC8VQ7R.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-CIbKor5E.js → AgentDetailPage-DaLfa80d.js} +2 -2
- package/dashboard/dist/assets/{AgentDetailPage-CIbKor5E.js.map → AgentDetailPage-DaLfa80d.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-CRFZ6KDu.js → AgentsPage-islj_zrh.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-CRFZ6KDu.js.map → AgentsPage-islj_zrh.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-DDsmXjpi.js → AvailableEscalationsPage-B8NjwwKQ.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-DDsmXjpi.js.map → AvailableEscalationsPage-B8NjwwKQ.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-dUpw1wW6.js → BotPicker-CnX8xfka.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-dUpw1wW6.js.map → BotPicker-CnX8xfka.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-Ca2jEln-.js → CapabilitiesPage-DK7wGMFt.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-Ca2jEln-.js.map → CapabilitiesPage-DK7wGMFt.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-BXlR5QmW.js → CollapsibleSection-WqEpMTyx.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-BXlR5QmW.js.map → CollapsibleSection-WqEpMTyx.js.map} +1 -1
- package/dashboard/dist/assets/{CountdownTimer-rnoWmFqx.js → CountdownTimer-BvQw_3WJ.js} +2 -2
- package/dashboard/dist/assets/{CountdownTimer-rnoWmFqx.js.map → CountdownTimer-BvQw_3WJ.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-CGyCCzGh.js → CredentialsPage-CfT60FiU.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-CGyCCzGh.js.map → CredentialsPage-CfT60FiU.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-CAu2hmQf.js → CronLabel-ds7dLz6S.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-CAu2hmQf.js.map → CronLabel-ds7dLz6S.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-hlnadaFt.js → CustomDurationPicker-D-iY1f4n.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-hlnadaFt.js.map → CustomDurationPicker-D-iY1f4n.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-B1eoCzEw.js → ElapsedCell-DRQhFky_.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-B1eoCzEw.js.map → ElapsedCell-DRQhFky_.js.map} +1 -1
- package/dashboard/dist/assets/{EntityTimelinePanel-CIOyjwjM.js → EntityTimelinePanel-nCgWdmpK.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-CIOyjwjM.js.map → EntityTimelinePanel-nCgWdmpK.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-DQNQ7o_4.js → EscalationListSchemaPage-DBCnPMG9.js} +2 -2
- package/dashboard/dist/assets/{EscalationListSchemaPage-DQNQ7o_4.js.map → EscalationListSchemaPage-DBCnPMG9.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-DFgDn4R3.js → EscalationSchemaPage-DfzRTqhV.js} +2 -2
- package/dashboard/dist/assets/{EscalationSchemaPage-DFgDn4R3.js.map → EscalationSchemaPage-DfzRTqhV.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-DfbKtXVZ.js → EscalationsOverview-CWd2Ivso.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DfbKtXVZ.js.map → EscalationsOverview-CWd2Ivso.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-CZPkvhao.js → EventTable-Dm9Fbab1.js} +2 -2
- package/dashboard/dist/assets/{EventTable-CZPkvhao.js.map → EventTable-Dm9Fbab1.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-CYjKK9Cp.js → FilterBar-DR4cJvTB.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-CYjKK9Cp.js.map → FilterBar-DR4cJvTB.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-DY9u42vt.js → GraphInvokePage-DQt64Ru0.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-DY9u42vt.js.map → GraphInvokePage-DQt64Ru0.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-p_CYlGnh.js → HomePage-D7qNiqtw.js} +2 -2
- package/dashboard/dist/assets/{HomePage-p_CYlGnh.js.map → HomePage-D7qNiqtw.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-Dz-1RXSH.js → ListToolbar-BdZkpRMo.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-Dz-1RXSH.js.map → ListToolbar-BdZkpRMo.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-BUI9sVTk.js → McpOverview-DHAEYY1b.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-BUI9sVTk.js.map → McpOverview-DHAEYY1b.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-CVN_UAB3.js → McpQueryDetailPage-BfGhRO_c.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-CVN_UAB3.js.map → McpQueryDetailPage-BfGhRO_c.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-DRTKSPDR.js → McpQueryPage-3EXLX1Eq.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-DRTKSPDR.js.map → McpQueryPage-3EXLX1Eq.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-CTb1AxR3.js → McpRunDetailPage-DHI0F65P.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-CTb1AxR3.js.map → McpRunDetailPage-DHI0F65P.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-BWLwjVd0.js → McpRunsPage-C6-KpYCY.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-BWLwjVd0.js.map → McpRunsPage-C6-KpYCY.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-BSl_oUAJ.js → OperationsPage-BNW7uris.js} +2 -2
- package/dashboard/dist/assets/{OperationsPage-BSl_oUAJ.js.map → OperationsPage-BNW7uris.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-DGs9kPOZ.js → OperatorDashboard-DLp9gCTA.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-DGs9kPOZ.js.map → OperatorDashboard-DLp9gCTA.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-C33MgXUY.js → PersonaDetailPage-DFv4Zwmq.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-C33MgXUY.js.map → PersonaDetailPage-DFv4Zwmq.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-BbLOHq5X.js → PersonasPage-C52o87Zv.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-BbLOHq5X.js.map → PersonasPage-C52o87Zv.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-zwd0HCJl.js → ProcessDetailPage-CKCxXogl.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-zwd0HCJl.js.map → ProcessDetailPage-CKCxXogl.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-DnfmK6jf.js → ProcessesListPage-D1bxIy7-.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-DnfmK6jf.js.map → ProcessesListPage-D1bxIy7-.js.map} +1 -1
- package/dashboard/dist/assets/{RoleDetailPage-axZtFPC_.js → RoleDetailPage-_MrbOGW_.js} +2 -2
- package/dashboard/dist/assets/{RoleDetailPage-axZtFPC_.js.map → RoleDetailPage-_MrbOGW_.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-DN6yqH7-.js → RolesPage-ZVCkB4iF.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-DN6yqH7-.js.map → RolesPage-ZVCkB4iF.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-DrGsUhL8.js → RunAsSelector-BAqa1Tya.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-DrGsUhL8.js.map → RunAsSelector-BAqa1Tya.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-BmQjEyWZ.js → ScanCodesPage-b7WkFiy-.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-BmQjEyWZ.js.map → ScanCodesPage-b7WkFiy-.js.map} +1 -1
- package/dashboard/dist/assets/{ScanSchemeDetailPage-VODehqGs.js → ScanSchemeDetailPage-BCsEgS-s.js} +2 -2
- package/dashboard/dist/assets/{ScanSchemeDetailPage-VODehqGs.js.map → ScanSchemeDetailPage-BCsEgS-s.js.map} +1 -1
- package/dashboard/dist/assets/ScanStationPage-CPC9CdCR.js +2 -0
- package/dashboard/dist/assets/ScanStationPage-CPC9CdCR.js.map +1 -0
- package/dashboard/dist/assets/{StickyPagination-9VkHiOsT.js → StickyPagination-CgSzarlP.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-9VkHiOsT.js.map → StickyPagination-CgSzarlP.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-C37J6Qyz.js → StreamMessageDetail-B4E3S5RB.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-C37J6Qyz.js.map → StreamMessageDetail-B4E3S5RB.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-NVGsBIX-.js → SwimlaneTimeline-BkcjucMZ.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-NVGsBIX-.js.map → SwimlaneTimeline-BkcjucMZ.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-5sbMHi5U.js → TaskDetailPage-D7e8x2gX.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-5sbMHi5U.js.map → TaskDetailPage-D7e8x2gX.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-C9AN7IBb.js → TasksListPage-B4mxP9Ey.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-C9AN7IBb.js.map → TasksListPage-B4mxP9Ey.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-CsbQGlSd.js → TimeAgo-D6sbYsUO.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-CsbQGlSd.js.map → TimeAgo-D6sbYsUO.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-DlbIkV-G.js → TimestampCell-DFDf3NAT.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-DlbIkV-G.js.map → TimestampCell-DFDf3NAT.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-BKbLocvr.js → ToolTestPanel-DbWw0-Le.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-BKbLocvr.js.map → ToolTestPanel-DbWw0-Le.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-fOnTfDso.js → TopicDetailPage-C6CPcvuO.js} +2 -2
- package/dashboard/dist/assets/{TopicDetailPage-fOnTfDso.js.map → TopicDetailPage-C6CPcvuO.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-BoVkp7DM.js → TopicsPage-C8_XpeT2.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-BoVkp7DM.js.map → TopicsPage-C8_XpeT2.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-0gjVPU_U.js → UserName-CIoJvf_e.js} +2 -2
- package/dashboard/dist/assets/{UserName-0gjVPU_U.js.map → UserName-CIoJvf_e.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-B28OxTS_.js → WorkflowExecutionPage-Bq3kSkRr.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-B28OxTS_.js.map → WorkflowExecutionPage-Bq3kSkRr.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-Bzvz6tTY.js → WorkflowsDashboard-y2L_zwnf.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-Bzvz6tTY.js.map → WorkflowsDashboard-y2L_zwnf.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-BkcRU4Ej.js → WorkflowsOverview-ChE1Mm3P.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-BkcRU4Ej.js.map → WorkflowsOverview-ChE1Mm3P.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CmM78sYi.js → YamlWorkflowDetailPage-D0aY_inb.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CmM78sYi.js.map → YamlWorkflowDetailPage-D0aY_inb.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-Dp6vG1au.js → YamlWorkflowsPage-DJ0JitPs.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-Dp6vG1au.js.map → YamlWorkflowsPage-DJ0JitPs.js.map} +1 -1
- package/dashboard/dist/assets/{agents-MeqzOPD6.js → agents-Bu5Ly_ER.js} +2 -2
- package/dashboard/dist/assets/{agents-MeqzOPD6.js.map → agents-Bu5Ly_ER.js.map} +1 -1
- package/dashboard/dist/assets/{bots-DTGXnvX_.js → bots-Cb14wZ1Y.js} +2 -2
- package/dashboard/dist/assets/{bots-DTGXnvX_.js.map → bots-Cb14wZ1Y.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-BjlARR7F.js → capabilities-DeHLk9JJ.js} +2 -2
- package/dashboard/dist/assets/{capabilities-BjlARR7F.js.map → capabilities-DeHLk9JJ.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-DMYI0OaL.js → controlplane-YBZ3SbA6.js} +2 -2
- package/dashboard/dist/assets/{controlplane-DMYI0OaL.js.map → controlplane-YBZ3SbA6.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-BMO_H3cb.js → escalation-columns-CA9DQlhA.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-BMO_H3cb.js.map → escalation-columns-CA9DQlhA.js.map} +1 -1
- package/dashboard/dist/assets/{index-Ch-OS1pk.js → index-B0qNe7Ux.js} +2 -2
- package/dashboard/dist/assets/{index-Ch-OS1pk.js.map → index-B0qNe7Ux.js.map} +1 -1
- package/dashboard/dist/assets/{index-CGCD5hTX.js → index-B4Nea96C.js} +2 -2
- package/dashboard/dist/assets/{index-CGCD5hTX.js.map → index-B4Nea96C.js.map} +1 -1
- package/dashboard/dist/assets/{index-B3FzpDEG.js → index-B7fE-rND.js} +2 -2
- package/dashboard/dist/assets/{index-B3FzpDEG.js.map → index-B7fE-rND.js.map} +1 -1
- package/dashboard/dist/assets/{index-DuhqzYwC.js → index-BAKroiNw.js} +2 -2
- package/dashboard/dist/assets/{index-DuhqzYwC.js.map → index-BAKroiNw.js.map} +1 -1
- package/dashboard/dist/assets/{index-k5vcLICm.js → index-BRmgxeZM.js} +2 -2
- package/dashboard/dist/assets/{index-k5vcLICm.js.map → index-BRmgxeZM.js.map} +1 -1
- package/dashboard/dist/assets/{index-3QEnMBNG.js → index-BaDimDGQ.js} +2 -2
- package/dashboard/dist/assets/{index-3QEnMBNG.js.map → index-BaDimDGQ.js.map} +1 -1
- package/dashboard/dist/assets/{index-DuyzcDuV.js → index-BhurEB5s.js} +2 -2
- package/dashboard/dist/assets/{index-DuyzcDuV.js.map → index-BhurEB5s.js.map} +1 -1
- package/dashboard/dist/assets/{index-D3iDAWK2.js → index-CQriisJy.js} +2 -2
- package/dashboard/dist/assets/{index-D3iDAWK2.js.map → index-CQriisJy.js.map} +1 -1
- package/dashboard/dist/assets/{index-CkkOh8y9.js → index-D5MSJsiW.js} +2 -2
- package/dashboard/dist/assets/{index-CkkOh8y9.js.map → index-D5MSJsiW.js.map} +1 -1
- package/dashboard/dist/assets/{index-BU4oujVO.js → index-Ntul2ZC1.js} +3 -3
- package/dashboard/dist/assets/{index-BU4oujVO.js.map → index-Ntul2ZC1.js.map} +1 -1
- package/dashboard/dist/assets/{index-D6kXz3H8.js → index-YUv7aNb4.js} +2 -2
- package/dashboard/dist/assets/{index-D6kXz3H8.js.map → index-YUv7aNb4.js.map} +1 -1
- package/dashboard/dist/assets/{index-Dsgqxdyh.js → index-chMUPSOd.js} +2 -2
- package/dashboard/dist/assets/{index-Dsgqxdyh.js.map → index-chMUPSOd.js.map} +1 -1
- package/dashboard/dist/assets/index-uWUJXqGS.js +3 -0
- package/dashboard/dist/assets/index-uWUJXqGS.js.map +1 -0
- package/dashboard/dist/assets/{knowledge-DAV1Jy7b.js → knowledge-B1HqYuB2.js} +2 -2
- package/dashboard/dist/assets/{knowledge-DAV1Jy7b.js.map → knowledge-B1HqYuB2.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CivbxL1P.js → mcp-dhihqJpH.js} +2 -2
- package/dashboard/dist/assets/{mcp-CivbxL1P.js.map → mcp-dhihqJpH.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-CGvWNrgo.js → mcp-query-B_gkB7JK.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-CGvWNrgo.js.map → mcp-query-B_gkB7JK.js.map} +1 -1
- package/dashboard/dist/assets/metadata-display-DHjqWkLG.js +2 -0
- package/dashboard/dist/assets/metadata-display-DHjqWkLG.js.map +1 -0
- package/dashboard/dist/assets/{personas-lI3aUr6t.js → personas-Bw_OlfI6.js} +2 -2
- package/dashboard/dist/assets/{personas-lI3aUr6t.js.map → personas-Bw_OlfI6.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-DjPfnTmx.js → pipelines-BYwn0LXY.js} +2 -2
- package/dashboard/dist/assets/{pipelines-DjPfnTmx.js.map → pipelines-BYwn0LXY.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-Co_S55BO.js → tasks-t6bPmJ7P.js} +2 -2
- package/dashboard/dist/assets/{tasks-Co_S55BO.js.map → tasks-t6bPmJ7P.js.map} +1 -1
- package/dashboard/dist/assets/{topics-2IGhZXBi.js → topics-Bgo9xw80.js} +2 -2
- package/dashboard/dist/assets/{topics-2IGhZXBi.js.map → topics-Bgo9xw80.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-D0C5yke4.js → useEventHooks-BJbMbg_h.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-D0C5yke4.js.map → useEventHooks-BJbMbg_h.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-LG52DTT-.js → useNamespace-CaXJuSFG.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-LG52DTT-.js.map → useNamespace-CaXJuSFG.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-1IZGVpWC.js → useYamlActivityEvents-B47LQrDk.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-1IZGVpWC.js.map → useYamlActivityEvents-B47LQrDk.js.map} +1 -1
- package/dashboard/dist/assets/{users-C-eHT1i6.js → users-D0jvzUqW.js} +2 -2
- package/dashboard/dist/assets/{users-C-eHT1i6.js.map → users-D0jvzUqW.js.map} +1 -1
- package/dashboard/dist/assets/{workflows-C16CeY4e.js → workflows-DRoZRrMH.js} +2 -2
- package/dashboard/dist/assets/{workflows-C16CeY4e.js.map → workflows-DRoZRrMH.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-BBenayT9.js → yaml-workflows-BdhYyIef.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-BBenayT9.js.map → yaml-workflows-BdhYyIef.js.map} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/docs/api/http/escalations.md +5 -1
- package/docs/hitl/iframe.md +56 -6
- package/package.json +1 -1
- package/dashboard/dist/assets/ScanStationPage-Y-9Gs7t5.js +0 -2
- package/dashboard/dist/assets/ScanStationPage-Y-9Gs7t5.js.map +0 -1
- package/dashboard/dist/assets/index-LF1gEc6w.js +0 -3
- package/dashboard/dist/assets/index-LF1gEc6w.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users-
|
|
1
|
+
{"version":3,"file":"users-D0jvzUqW.js","sources":["../../src/api/users.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { LTUserRecord, LTRoleType, LTReadScope, LTWriteScope } from './types';\n\ninterface UserListResponse {\n users: LTUserRecord[];\n total: number;\n}\n\ninterface UserFilters {\n role?: string;\n roleType?: string;\n status?: string;\n search?: string;\n limit?: number;\n offset?: number;\n}\n\nexport function useUsers(filters: UserFilters = {}) {\n const params = new URLSearchParams();\n if (filters.role) params.set('role', filters.role);\n if (filters.roleType) params.set('roleType', filters.roleType);\n if (filters.status) params.set('status', filters.status);\n if (filters.search) params.set('search', filters.search);\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<UserListResponse>({\n queryKey: ['users', filters],\n queryFn: () => apiFetch(`/users?${params}`),\n });\n}\n\nexport function useUser(id: string) {\n return useQuery<LTUserRecord>({\n queryKey: ['users', id],\n queryFn: () => apiFetch(`/users/${id}`),\n enabled: !!id,\n });\n}\n\nexport function useCreateUser() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (data: {\n external_id: string;\n email?: string;\n display_name?: string;\n password?: string;\n roles?: { role: string; type: LTRoleType }[];\n }) =>\n apiFetch('/users', {\n method: 'POST',\n body: JSON.stringify(data),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['users'] });\n },\n });\n}\n\nexport function useUpdateUser() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n id,\n ...data\n }: {\n id: string;\n email?: string;\n display_name?: string;\n status?: string;\n }) =>\n apiFetch(`/users/${id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['users'] });\n },\n });\n}\n\nexport function useDeleteUser() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch(`/users/${id}`, { method: 'DELETE' }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['users'] });\n },\n });\n}\n\nexport function useAddUserRole() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n userId,\n role,\n type,\n read_scope,\n write_scope,\n }: {\n userId: string;\n role: string;\n type: LTRoleType;\n read_scope?: LTReadScope;\n write_scope?: LTWriteScope;\n }) =>\n apiFetch(`/users/${userId}/roles`, {\n method: 'POST',\n body: JSON.stringify({ role, type, read_scope, write_scope }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['users'] });\n },\n });\n}\n\nexport function useRemoveUserRole() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ userId, role }: { userId: string; role: string }) =>\n apiFetch(`/users/${userId}/roles/${encodeURIComponent(role)}`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['users'] });\n },\n });\n}\n"],"names":["useUsers","filters","params","useQuery","apiFetch","useUser","id","useCreateUser","queryClient","useQueryClient","useMutation","data","useUpdateUser","useDeleteUser","useAddUserRole","userId","role","type","read_scope","write_scope","useRemoveUserRole"],"mappings":"qGAkBO,SAASA,EAASC,EAAuB,GAAI,CAClD,MAAMC,EAAS,IAAI,gBACnB,OAAID,EAAQ,MAAMC,EAAO,IAAI,OAAQD,EAAQ,IAAI,EAC7CA,EAAQ,UAAUC,EAAO,IAAI,WAAYD,EAAQ,QAAQ,EACzDA,EAAQ,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EACnDA,EAAQ,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EACnDA,EAAQ,OAAOC,EAAO,IAAI,QAAS,OAAOD,EAAQ,KAAK,CAAC,EACxDA,EAAQ,SAAW,QAAWC,EAAO,IAAI,SAAU,OAAOD,EAAQ,MAAM,CAAC,EAEtEE,EAA2B,CAChC,SAAU,CAAC,QAASF,CAAO,EAC3B,QAAS,IAAMG,EAAS,UAAUF,CAAM,EAAE,CAAA,CAC3C,CACH,CAEO,SAASG,EAAQC,EAAY,CAClC,OAAOH,EAAuB,CAC5B,SAAU,CAAC,QAASG,CAAE,EACtB,QAAS,IAAMF,EAAS,UAAUE,CAAE,EAAE,EACtC,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAEO,SAASC,GAAgB,CAC9B,MAAMC,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaC,GAOXP,EAAS,SAAU,CACjB,OAAQ,OACR,KAAM,KAAK,UAAUO,CAAI,CAAA,CAC1B,EACH,UAAW,IAAM,CACfH,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,CACvD,CAAA,CACD,CACH,CAEO,SAASI,GAAgB,CAC9B,MAAMJ,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CACX,GAAAJ,EACA,GAAGK,CAAA,IAOHP,EAAS,UAAUE,CAAE,GAAI,CACvB,OAAQ,MACR,KAAM,KAAK,UAAUK,CAAI,CAAA,CAC1B,EACH,UAAW,IAAM,CACfH,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,CACvD,CAAA,CACD,CACH,CAEO,SAASK,GAAgB,CAC9B,MAAML,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXF,EAAS,UAAUE,CAAE,GAAI,CAAE,OAAQ,SAAU,EAC/C,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,CACvD,CAAA,CACD,CACH,CAEO,SAASM,GAAiB,CAC/B,MAAMN,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CACX,OAAAK,EACA,KAAAC,EACA,KAAAC,EACA,WAAAC,EACA,YAAAC,CAAA,IAQAf,EAAS,UAAUW,CAAM,SAAU,CACjC,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,KAAAC,EAAM,KAAAC,EAAM,WAAAC,EAAY,YAAAC,EAAa,CAAA,CAC7D,EACH,UAAW,IAAM,CACfX,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,CACvD,CAAA,CACD,CACH,CAEO,SAASY,GAAoB,CAClC,MAAMZ,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CAAE,OAAAK,EAAQ,KAAAC,CAAA,IACrBZ,EAAS,UAAUW,CAAM,UAAU,mBAAmBC,CAAI,CAAC,GAAI,CAC7D,OAAQ,QAAA,CACT,EACH,UAAW,IAAM,CACfR,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAO,EAAG,CACvD,CAAA,CACD,CACH"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as n,b as t,c as u}from"./vendor-query-RUZdMvN6.js";import{g as s}from"./index-
|
|
2
|
-
//# sourceMappingURL=workflows-
|
|
1
|
+
import{u as n,b as t,c as u}from"./vendor-query-RUZdMvN6.js";import{g as s}from"./index-Ntul2ZC1.js";function f(){return n({queryKey:["activeWorkers"],queryFn:async()=>(await s("/workflows/workers")).workers})}function w(){return n({queryKey:["discoveredWorkflows"],queryFn:async()=>(await s("/workflows/discovered")).workflows})}function l(){return n({queryKey:["workflowConfigs"],queryFn:async()=>(await s("/workflows/config")).workflows})}function d(){return n({queryKey:["cronStatus"],queryFn:async()=>(await s("/workflows/cron/status")).schedules})}function k(e){return n({queryKey:["workflowExecution",e],queryFn:()=>s(`/workflow-states/${e}/execution`),enabled:!!e})}function m(e,o){const r=new URLSearchParams;return e.limit&&r.set("limit",String(e.limit)),e.offset!==void 0&&r.set("offset",String(e.offset)),e.entity&&r.set("entity",e.entity),e.search&&r.set("search",e.search),e.status&&r.set("status",e.status),e.sort_by&&r.set("sort_by",e.sort_by),e.order&&r.set("order",e.order),e.registered&&r.set("registered",e.registered),e.namespace&&r.set("namespace",e.namespace),n({queryKey:["jobs",e],queryFn:()=>s(`/workflow-states/jobs?${r}`),enabled:(o==null?void 0:o.enabled)??!0})}function q(){const e=t();return u({mutationFn:o=>s(`/workflows/${o}/terminate`,{method:"POST"}),onSuccess:(o,r)=>{e.invalidateQueries({queryKey:["workflowExecution",r],refetchType:"all"}),e.invalidateQueries({queryKey:["jobs"],refetchType:"all"})}})}function g(){const e=t();return u({mutationFn:({workflow_type:o,...r})=>s(`/workflows/${encodeURIComponent(o)}/config`,{method:"PUT",body:JSON.stringify(r)}),onSuccess:()=>{e.invalidateQueries({queryKey:["workflowConfigs"],refetchType:"all"})}})}function h(){const e=t();return u({mutationFn:o=>s(`/workflows/${encodeURIComponent(o)}/config`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["workflowConfigs"],refetchType:"all"})}})}function b(){const e=t();return u({mutationFn:({workflowType:o,data:r,metadata:i,execute_as:a})=>s(`/workflows/${o}/invoke`,{method:"POST",body:JSON.stringify({data:r,metadata:i,...a?{execute_as:a}:{}})}),onSuccess:()=>{e.invalidateQueries({queryKey:["tasks"],refetchType:"all"}),e.invalidateQueries({queryKey:["jobs"],refetchType:"all"})}})}export{k as a,m as b,b as c,w as d,d as e,q as f,f as g,h,g as i,l as u};
|
|
2
|
+
//# sourceMappingURL=workflows-DRoZRrMH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflows-
|
|
1
|
+
{"version":3,"file":"workflows-DRoZRrMH.js","sources":["../../src/api/workflows.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { ActiveWorker, CronScheduleEntry, DiscoveredWorkflow, LTJob, LTWorkflowConfig, WorkflowExecution } from './types';\n\nexport function useActiveWorkers() {\n return useQuery<ActiveWorker[]>({\n queryKey: ['activeWorkers'],\n queryFn: async () => {\n const res = await apiFetch<{ workers: ActiveWorker[] }>('/workflows/workers');\n return res.workers;\n },\n });\n}\n\nexport function useDiscoveredWorkflows() {\n return useQuery<DiscoveredWorkflow[]>({\n queryKey: ['discoveredWorkflows'],\n queryFn: async () => {\n const res = await apiFetch<{ workflows: DiscoveredWorkflow[] }>('/workflows/discovered');\n return res.workflows;\n },\n });\n}\n\nexport function useWorkflowConfigs() {\n return useQuery<LTWorkflowConfig[]>({\n queryKey: ['workflowConfigs'],\n queryFn: async () => {\n const res = await apiFetch<{ workflows: LTWorkflowConfig[] }>('/workflows/config');\n return res.workflows;\n },\n });\n}\n\nexport function useCronStatus() {\n return useQuery<CronScheduleEntry[]>({\n queryKey: ['cronStatus'],\n queryFn: async () => {\n const res = await apiFetch<{ schedules: CronScheduleEntry[] }>('/workflows/cron/status');\n return res.schedules;\n },\n });\n}\n\nexport function useWorkflowExecution(workflowId: string) {\n return useQuery<WorkflowExecution>({\n queryKey: ['workflowExecution', workflowId],\n queryFn: () =>\n apiFetch(`/workflow-states/${workflowId}/execution`),\n enabled: !!workflowId,\n });\n}\n\nexport function useWorkflowState(workflowId: string) {\n return useQuery<{ workflow_id: string; state: Record<string, unknown> }>({\n queryKey: ['workflowState', workflowId],\n queryFn: () => apiFetch(`/workflow-states/${workflowId}/state`),\n enabled: !!workflowId,\n });\n}\n\nexport function useJobs(filters: {\n limit?: number;\n offset?: number;\n entity?: string;\n search?: string;\n status?: string;\n sort_by?: string;\n order?: string;\n registered?: string;\n namespace?: string;\n}, options?: { enabled?: boolean }) {\n const params = new URLSearchParams();\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n if (filters.entity) params.set('entity', filters.entity);\n if (filters.search) params.set('search', filters.search);\n if (filters.status) params.set('status', filters.status);\n if (filters.sort_by) params.set('sort_by', filters.sort_by);\n if (filters.order) params.set('order', filters.order);\n if (filters.registered) params.set('registered', filters.registered);\n if (filters.namespace) params.set('namespace', filters.namespace);\n\n return useQuery<{ jobs: LTJob[]; total: number }>({\n queryKey: ['jobs', filters],\n queryFn: () => apiFetch(`/workflow-states/jobs?${params}`),\n enabled: options?.enabled ?? true,\n });\n}\n\nexport function useTerminateWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (workflowId: string) =>\n apiFetch(`/workflows/${workflowId}/terminate`, { method: 'POST' }),\n onSuccess: (_data, workflowId) => {\n queryClient.invalidateQueries({ queryKey: ['workflowExecution', workflowId], refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['jobs'], refetchType: 'all' });\n },\n });\n}\n\nexport function useUpsertWorkflowConfig() {\n const queryClient = useQueryClient();\n return useMutation<\n LTWorkflowConfig,\n Error,\n {\n workflow_type: string;\n description?: string | null;\n\n invocable?: boolean;\n certified?: boolean;\n task_queue?: string | null;\n default_role?: string;\n roles?: string[];\n invocation_roles?: string[];\n consumes?: string[];\n envelope_schema?: Record<string, unknown> | null;\n resolver_schema?: Record<string, unknown> | null;\n cron_schedule?: string | null;\n execute_as?: string | null;\n }\n >({\n mutationFn: ({ workflow_type, ...body }) =>\n apiFetch(`/workflows/${encodeURIComponent(workflow_type)}/config`, {\n method: 'PUT',\n body: JSON.stringify(body),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['workflowConfigs'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeleteWorkflowConfig() {\n const queryClient = useQueryClient();\n return useMutation<{ deleted: boolean; workflow_type: string }, Error, string>({\n mutationFn: (workflowType) =>\n apiFetch(`/workflows/${encodeURIComponent(workflowType)}/config`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['workflowConfigs'], refetchType: 'all' });\n },\n });\n}\n\nexport function useSetCronSchedule() {\n const queryClient = useQueryClient();\n return useMutation<\n LTWorkflowConfig,\n Error,\n { config: LTWorkflowConfig; cron_schedule: string | null; envelope_schema?: Record<string, unknown> | null }\n >({\n mutationFn: ({ config, cron_schedule, envelope_schema }) =>\n apiFetch(`/workflows/${encodeURIComponent(config.workflow_type)}/config`, {\n method: 'PUT',\n body: JSON.stringify({\n ...config,\n cron_schedule,\n ...(envelope_schema !== undefined ? { envelope_schema } : {}),\n }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['workflowConfigs'], refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['cronStatus'], refetchType: 'all' });\n },\n });\n}\n\nexport function useInvokeWorkflow() {\n const queryClient = useQueryClient();\n return useMutation<\n { workflowId: string; message: string },\n Error,\n { workflowType: string; data: Record<string, unknown>; metadata?: Record<string, unknown>; execute_as?: string }\n >({\n mutationFn: ({ workflowType, data, metadata, execute_as }) =>\n apiFetch(`/workflows/${workflowType}/invoke`, {\n method: 'POST',\n body: JSON.stringify({ data, metadata, ...(execute_as ? { execute_as } : {}) }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['tasks'], refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['jobs'], refetchType: 'all' });\n },\n });\n}\n"],"names":["useActiveWorkers","useQuery","apiFetch","useDiscoveredWorkflows","useWorkflowConfigs","useCronStatus","useWorkflowExecution","workflowId","useJobs","filters","options","params","useTerminateWorkflow","queryClient","useQueryClient","useMutation","_data","useUpsertWorkflowConfig","workflow_type","body","useDeleteWorkflowConfig","workflowType","useInvokeWorkflow","data","metadata","execute_as"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as l,b as a,c as s}from"./vendor-query-RUZdMvN6.js";import{g as r}from"./index-
|
|
2
|
-
//# sourceMappingURL=yaml-workflows-
|
|
1
|
+
import{u as l,b as a,c as s}from"./vendor-query-RUZdMvN6.js";import{g as r}from"./index-Ntul2ZC1.js";function f(e={}){const o=new URLSearchParams;return e.status&&o.set("status",e.status),e.graph_topic&&o.set("graph_topic",e.graph_topic),e.app_id&&o.set("app_id",e.app_id),e.search&&o.set("search",e.search),e.set_id&&o.set("set_id",e.set_id),e.limit&&o.set("limit",String(e.limit)),e.offset!==void 0&&o.set("offset",String(e.offset)),l({queryKey:["yamlWorkflows",e],queryFn:()=>r(`/yaml-workflows?${o}`)})}function m(){return l({queryKey:["yamlWorkflowAppIds"],queryFn:()=>r("/yaml-workflows/app-ids")})}function c(e){return l({queryKey:["yamlWorkflows",e],queryFn:()=>r(`/yaml-workflows/${e}`),enabled:!!e})}function w(){const e=a();return s({mutationFn:o=>r("/yaml-workflows",{method:"POST",body:JSON.stringify(o)}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function k(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}/deploy`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function p(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}/activate`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function d(){const e=a();return s({mutationFn:({id:o,data:t,sync:n,execute_as:u})=>r(`/yaml-workflows/${o}/invoke`,{method:"POST",body:JSON.stringify({data:t,sync:n,...u?{execute_as:u}:{}})}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function h(){const e=a();return s({mutationFn:({id:o,task_queue:t,compilation_feedback:n})=>r(`/yaml-workflows/${o}/regenerate`,{method:"POST",body:JSON.stringify({task_queue:t,compilation_feedback:n})}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function q(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}/archive`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function W(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}/restore`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"}),e.invalidateQueries({queryKey:["yamlWorkflow"],refetchType:"all"})}})}function S(){const e=a();return s({mutationFn:({id:o,...t})=>r(`/yaml-workflows/${o}`,{method:"PUT",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function v(){const e=a();return s({mutationFn:o=>r(`/yaml-workflows/${o}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["yamlWorkflows"],refetchType:"all"})}})}function T(e){return l({queryKey:["yamlWorkflows",e,"versions"],queryFn:()=>r(`/yaml-workflows/${e}/versions`),enabled:!!e})}function F(e,o){return l({queryKey:["yamlWorkflows",e,"versions",o],queryFn:()=>r(`/yaml-workflows/${e}/versions/${o}`),enabled:!!e&&o!==null})}export{m as a,S as b,c,T as d,k as e,p as f,q as g,W as h,v as i,h as j,F as k,d as l,w as m,f as u};
|
|
2
|
+
//# sourceMappingURL=yaml-workflows-BdhYyIef.js.map
|
package/dashboard/dist/assets/{yaml-workflows-BBenayT9.js.map → yaml-workflows-BdhYyIef.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yaml-workflows-BBenayT9.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-BdhYyIef.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-Ntul2ZC1.js"></script>
|
|
12
12
|
<link rel="modulepreload" crossorigin href="./assets/vendor-query-RUZdMvN6.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="./assets/vendor-react-CdqEC2zv.js">
|
|
14
14
|
<link rel="modulepreload" crossorigin href="./assets/vendor-icons-BPsNpK3Y.js">
|
|
@@ -883,7 +883,11 @@ Release a claimed escalation back to the available pool. Only the user who holds
|
|
|
883
883
|
|-----------|-------------|
|
|
884
884
|
| `id` | Escalation UUID |
|
|
885
885
|
|
|
886
|
-
**Request body:**
|
|
886
|
+
**Request body (optional):**
|
|
887
|
+
|
|
888
|
+
| Field | Type | Description |
|
|
889
|
+
|-------|------|-------------|
|
|
890
|
+
| `quiet` | boolean | Perform the identical release without publishing the `released` event. For bookkeeping releases — a dispatcher's held-skip loop freeing rows every ranking window — that are not lifecycle transitions. Faceted machine claims are already silent; this is the release-side counterpart. Default: `false` (loud). |
|
|
887
891
|
|
|
888
892
|
**Response 200:**
|
|
889
893
|
|
package/docs/hitl/iframe.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Iframe Viewport Protocol
|
|
2
2
|
|
|
3
|
-
For fully custom UIs — PDF viewers, complex multi-step forms, specialized domain interfaces — replace the generated form with an iframe. The iframe owns its
|
|
3
|
+
For fully custom UIs — PDF viewers, complex multi-step forms, specialized domain interfaces — replace the generated form with an iframe. The iframe owns its rendering: layout, widgets, and draft persistence belong to the embedded app. The schema remains the submission contract — with [server-side enforcement](../schema-enforcement.md) on the role, every payload the iframe (or anything else) submits validates against it. Reach for the schema-driven form first ([choosing your surface](../hitl-guide.md#choosing-your-surface)); use the iframe when the domain demands a surface the schema cannot express.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -16,7 +16,7 @@ For fully custom UIs — PDF viewers, complex multi-step forms, specialized doma
|
|
|
16
16
|
}
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
When `x-lt-viewport` is present, the dashboard renders an iframe instead of the standard form. The `properties` block still defines the resolver payload shape for
|
|
19
|
+
When `x-lt-viewport` is present, the dashboard renders an iframe instead of the standard form. The `properties` block still defines the resolver payload shape — and with enforcement on, it is the binding contract for every submission (see Submission Rules below).
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
@@ -152,7 +152,7 @@ Communication happens via `window.postMessage`.
|
|
|
152
152
|
document.getElementById('submit').addEventListener('click', () => {
|
|
153
153
|
window.parent.postMessage({
|
|
154
154
|
type: 'lt:submit',
|
|
155
|
-
payload: {
|
|
155
|
+
payload: { responseType: 'approved', reviewed_at: new Date().toISOString() },
|
|
156
156
|
}, '*');
|
|
157
157
|
});
|
|
158
158
|
</script>
|
|
@@ -162,9 +162,59 @@ Communication happens via `window.postMessage`.
|
|
|
162
162
|
|
|
163
163
|
---
|
|
164
164
|
|
|
165
|
+
## Submission Rules — the schema is still the contract
|
|
166
|
+
|
|
167
|
+
The iframe replaces the rendering, never the contract. Declare submission
|
|
168
|
+
rules on the same schema that carries `x-lt-viewport`, and turn on
|
|
169
|
+
[`enforce_schema`](../schema-enforcement.md) for the role:
|
|
170
|
+
|
|
171
|
+
```json
|
|
172
|
+
{
|
|
173
|
+
"x-lt-viewport": { "type": "iframe", "src": "https://your-app.example.com/hitl-form" },
|
|
174
|
+
"required": ["responseType"],
|
|
175
|
+
"properties": {
|
|
176
|
+
"responseType": {
|
|
177
|
+
"type": "string",
|
|
178
|
+
"enum": ["approved", "rework", "hold"]
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
With enforcement on, the gate sits at the API — on **every** resolve surface,
|
|
185
|
+
not just the iframe's `lt:submit`: resolve by id, `resolve_by_metadata`,
|
|
186
|
+
signal-key resolves, bulk, and the MCP tools all validate the payload against
|
|
187
|
+
this schema before anything is written. A submission missing `responseType`
|
|
188
|
+
(or carrying a value outside the enum) is rejected with the canonical 422 and
|
|
189
|
+
the escalation stays pending. That makes the pattern defensible against
|
|
190
|
+
errant ingress: a bridge or event handler that resolves rows generically with
|
|
191
|
+
a minimal payload can never close one of these — only a caller that states an
|
|
192
|
+
explicit, legal `responseType` can.
|
|
193
|
+
|
|
194
|
+
The rules for making the contract airtight:
|
|
195
|
+
|
|
196
|
+
- Put the deciding field in the root `required` array and give it **no
|
|
197
|
+
`x-lt-showIf`** — a field hidden by a condition is waived from `required`,
|
|
198
|
+
so an unconditional field is the unforgeable part of the contract.
|
|
199
|
+
- An `enum` bounds the legal outcomes; each of the embedded app's action
|
|
200
|
+
buttons submits one of them.
|
|
201
|
+
- The iframe receives the schema in `lt:init`, so the embedded app can read
|
|
202
|
+
the contract it must satisfy rather than duplicating it.
|
|
203
|
+
- The dashboard routes an enforcement 422 into the standard errors panel, so
|
|
204
|
+
a contract violation from the embedded app is visible to the operator.
|
|
205
|
+
- Schema versions pin at escalation creation: rows created before the rule
|
|
206
|
+
existed validate against their pinned version. Drain or migrate pending
|
|
207
|
+
rows when introducing a new required field to an in-flight queue.
|
|
208
|
+
|
|
209
|
+
The `cad-designer` example (`examples/seed-workbench.ts`) ships this shape:
|
|
210
|
+
a required `responseType` enum on the viewport schema with `enforce_schema`
|
|
211
|
+
on the role.
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
165
215
|
## Security
|
|
166
216
|
|
|
167
217
|
- The iframe runs with `sandbox="allow-scripts allow-same-origin allow-forms"`
|
|
168
|
-
- The parent validates message origins — only messages from the iframe's declared origin are accepted
|
|
169
|
-
-
|
|
170
|
-
-
|
|
218
|
+
- The parent validates message origins — only messages from the iframe's declared origin are accepted, and `lt:init` posts only to that origin
|
|
219
|
+
- `lt:init` carries the escalation context the embedded app needs (`id`, `type`, `description`, `status`, `priority`, `role`, `envelope`, `metadata`, `escalation_payload`) — because the envelope travels, declare only trusted `src` origins
|
|
220
|
+
- With `enforce_schema` on the role, a compromised or buggy embedded app still cannot resolve outside the schema's contract — the server gate validates every payload
|
package/package.json
CHANGED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e,a as o}from"./vendor-query-RUZdMvN6.js";import{a0 as E,at as O,au as B,_,m as R,av as L,aw as W,ax as C,Y as v}from"./index-BU4oujVO.js";import{a as A,aV as F,aW as P}from"./vendor-icons-BPsNpK3Y.js";import{M as D}from"./Modal-BU7No9NH.js";import{a as V,u as U}from"./vendor-react-CdqEC2zv.js";function $({stationName:t}){return e.jsxs("div",{className:"flex-1 flex flex-col items-center justify-center text-center py-24",children:[e.jsx(A,{className:"w-10 h-10 text-accent-muted mb-8",strokeWidth:1}),e.jsx("h1",{className:"text-3xl font-light text-text-primary tracking-tight",children:t}),e.jsx("div",{className:"w-16 border-t border-surface-border my-8"}),e.jsx("p",{className:"text-lg text-text-secondary",children:"Scan your badge to begin"}),e.jsx("p",{className:"text-sm text-text-tertiary mt-2",children:"or scan an item"})]})}function q(t){const r=Math.floor(t/60),c=t%60;return`${r}:${String(c).padStart(2,"0")}`}function H(){const{identity:t,remainingSeconds:r}=E(),[,c]=o.useState(0);return o.useEffect(()=>{if(!(t!=null&&t.expiresAt))return;const n=setInterval(()=>c(f=>f+1),1e3);return()=>clearInterval(n)},[t]),t?e.jsxs("div",{className:"flex items-center gap-2.5 pb-3 mb-6 border-b border-surface-border",children:[e.jsx(F,{className:"w-4 h-4 text-status-success shrink-0",strokeWidth:1.5}),e.jsxs("span",{className:"text-sm font-medium text-text-primary",children:["Hi ",t.displayName]}),t.expiresAt&&e.jsx("span",{className:"ml-auto text-sm font-mono tabular-nums text-text-tertiary",children:q(r())})]}):null}function M(t,r){return!t.withheld||r}function Y(t,r,c){return t.find(n=>!!n.code&&n.code===c&&M(n,r))??null}function G(t){return t==null||t===""?"—":typeof t=="boolean"?t?"Yes":"No":typeof t=="object"?JSON.stringify(t):String(t)}function J({label:t,value:r}){return e.jsxs("div",{className:"flex items-baseline gap-4 py-2",children:[e.jsx("span",{className:"w-32 shrink-0 text-2xs uppercase tracking-wide text-text-quaternary",children:t}),e.jsx("span",{className:"text-sm text-text-primary break-words",children:r})]})}function I(){return e.jsx("span",{className:"text-text-quaternary select-none",children:"·"})}function X({response:t,hasActingIdentity:r,selfId:c,busy:n,onExecute:f,onWithheldSelect:a}){var i,u;const{setCodeInterceptor:h}=O(),[x,d]=o.useState(null),l=t.escalation??{},m=t.choices??[],S=l.metadata??{},b=s=>{s.confirm?d(s):f(s)},j=o.useRef({choices:m,hasActingIdentity:r,select:b});j.current={choices:m,hasActingIdentity:r,select:b},o.useEffect(()=>(h(s=>{const p=j.current,T=Y(p.choices,p.hasActingIdentity,s);return T?(p.select(T),!0):!1}),()=>h(null)),[h]);const g=l.assigned_to??null,k=g?g===c?"Claimed by you":"Claimed":"Unclaimed",w=g===c?"text-accent":"text-text-secondary",N=[l.type,l.subtype].filter(Boolean).join(" · "),y=Object.entries(S);return e.jsxs("div",{className:"flex-1 min-h-0 flex flex-col max-w-form",children:[e.jsxs("div",{children:[((i=t.rule)==null?void 0:i.name)&&e.jsx("div",{className:"text-2xs font-semibold uppercase tracking-widest text-accent mb-2",children:t.rule.name}),e.jsx("h2",{className:"text-2xl font-medium leading-tight text-text-primary mb-2",children:l.description||N||"Located item"}),e.jsxs("div",{className:"flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-text-secondary mb-5",children:[e.jsx("span",{children:String(l.role??"—")}),N&&e.jsxs(e.Fragment,{children:[e.jsx(I,{}),e.jsx("span",{children:N})]}),e.jsx(I,{}),e.jsx("span",{className:w,children:k}),typeof l.created_at=="string"&&e.jsxs(e.Fragment,{children:[e.jsx(I,{}),e.jsx("span",{children:B(l.created_at)})]})]}),y.length>0&&e.jsx("div",{className:"divide-y divide-surface-border border-t border-surface-border",children:y.map(([s,p])=>e.jsx(J,{label:s,value:G(p)},s))})]}),e.jsx("div",{className:"mt-8 space-y-3",children:m.map(s=>{const p=M(s,r);return e.jsx("div",{children:e.jsx("button",{type:"button",disabled:n,onClick:()=>p?b(s):a(s),className:"w-full text-left px-5 py-4 text-lg text-text-primary border border-surface-border rounded hover:bg-surface-sunken transition-colors disabled:opacity-40 disabled:cursor-not-allowed",children:e.jsxs("span",{className:"flex items-baseline gap-3",children:[s.label,s.code&&e.jsx("span",{className:"ml-auto text-2xs font-mono text-text-quaternary",children:s.code})]})})},s.index)})}),x&&e.jsx(D,{open:!0,onClose:()=>d(null),title:x.label,children:e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-sm text-text-secondary",children:(u=x.confirm)==null?void 0:u.prompt}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{type:"button",onClick:()=>d(null),disabled:n,className:"btn-secondary text-xs",children:"No, go back"}),e.jsx("button",{type:"button",onClick:()=>{const s=x;d(null),f(s)},disabled:n,className:"btn-primary text-xs",children:"Yes, continue"})]})]})})]})}function z({choice:t,notPrimedMarkdown:r,primed:c,busy:n,onExecute:f,onCancel:a}){var l;const[h,x]=o.useState(!1),d=o.useRef(!1);return o.useEffect(()=>{if(!c){d.current=!1;return}d.current||(d.current=!0,t.confirm?x(!0):f(t))},[c,t,f]),e.jsxs("div",{className:"flex-1 flex flex-col items-center justify-center text-center py-24",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-8",children:[e.jsx(A,{className:"w-8 h-8 text-text-quaternary",strokeWidth:1}),e.jsx(P,{className:"w-10 h-10 text-accent-muted",strokeWidth:1})]}),e.jsx("h2",{className:"text-2xl font-light text-text-primary tracking-tight",children:"Scan your badge to continue"}),e.jsxs("p",{className:"text-lg text-text-secondary mt-2",children:["to ",t.label]}),r&&e.jsx("div",{className:"text-sm text-text-tertiary mt-6 max-w-prose",children:e.jsx(_,{content:r,compact:!0})}),e.jsx("div",{className:"w-16 border-t border-surface-border my-8"}),e.jsx("button",{type:"button",onClick:a,disabled:n,className:"text-sm text-text-tertiary hover:text-text-secondary hover:underline",children:"Cancel"}),h&&e.jsx(D,{open:!0,onClose:a,title:t.label,children:e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-sm text-text-secondary",children:(l=t.confirm)==null?void 0:l.prompt}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{type:"button",onClick:a,disabled:n,className:"btn-secondary text-xs",children:"No, go back"}),e.jsx("button",{type:"button",onClick:()=>{x(!1),f(t)},disabled:n,className:"btn-primary text-xs",children:"Yes, continue"})]})]})})]})}const K=8e3,Q=[v.SHOW_DETAIL,v.CLAIM,v.CLAIM_SHOW_DETAIL];function ae(){var y;const t=V(),r=U(),{user:c}=R(),{identity:n,clear:f}=E(),[a,h]=o.useState(null),[x,d]=o.useState(null),[l,m]=o.useState(null),[S,b]=o.useState(!1);o.useEffect(()=>{var s,p;const i=(s=t.state)==null?void 0:s[L];if(!i)return;h(i),m(null);const u=((p=i.choices)==null?void 0:p.length)===1?i.choices[0]:void 0;d(i.autoSelect&&u?{choice:u,returnTo:"idle"}:null),r(t.pathname,{replace:!0,state:null})},[t,r]),o.useEffect(()=>{if(!l)return;const i=setTimeout(()=>m(null),K);return()=>clearTimeout(i)},[l]);const j=o.useCallback(async i=>{if(!(!(a!=null&&a.rule)||!a.escalation)){b(!0);try{const u=await W({schemeVersion:a.rule.schemeVersion,category:a.rule.category,stepIndex:a.stepIndex??0,choiceIndex:i.index,escalationId:String(a.escalation.id),actingToken:n==null?void 0:n.actingToken});switch(u.outcome){case C.EXECUTED:if(h(null),d(null),Q.includes(i.verb)&&u.escalation){r(`/escalations/detail/${u.escalation.id}`);break}m({at:Date.now(),tone:"text-status-success",text:`${i.label} — done`});break;case C.CONFLICT:h(null),d(null),m({at:Date.now(),tone:"text-status-warning",text:u.error||"The item changed since it was scanned — scan it again."});break;case C.UNCONFIGURED:h(null),d(null),m({at:Date.now(),tone:"text-status-warning",text:u.error||"This choice is no longer configured."});break;case C.NOT_PRIMED:f(),m(null),d(s=>({choice:i,returnTo:(s==null?void 0:s.returnTo)??"choices"}));break;default:m({at:Date.now(),tone:"text-status-error",text:u.error||"The choice did not run."})}}catch(u){m({at:Date.now(),tone:"text-status-error",text:u.message})}finally{b(!1)}}},[a,n,r,f]),g=o.useCallback(i=>{d({choice:i,returnTo:"choices"})},[]),k=o.useCallback(()=>{(x==null?void 0:x.returnTo)==="idle"&&h(null),d(null)},[x]),w=(c==null?void 0:c.displayName)||(c==null?void 0:c.username)||"Scan station",N=!!(a!=null&&a.choices&&a.escalation);return e.jsxs("div",{className:"flex-1 min-h-0 flex flex-col",children:[e.jsx(H,{}),x&&a?e.jsx(z,{choice:x.choice,notPrimedMarkdown:(y=a.notPrimed)==null?void 0:y.markdown,primed:!!n,busy:S,onExecute:j,onCancel:k}):N?e.jsx(X,{response:a,hasActingIdentity:!!n,selfId:(n==null?void 0:n.actorId)??(c==null?void 0:c.userId)??null,busy:S,onExecute:j,onWithheldSelect:g},String(a.escalation.id)):e.jsx($,{stationName:w}),l&&e.jsxs("div",{role:"status",className:"mt-8 pt-3 border-t border-surface-border",children:[e.jsx("span",{className:`text-sm font-medium ${l.tone}`,children:l.text}),l.markdown&&e.jsx("div",{className:"text-sm text-text-secondary mt-1",children:e.jsx(_,{content:l.markdown,compact:!0})})]})]})}export{ae as ScanStationPage};
|
|
2
|
-
//# sourceMappingURL=ScanStationPage-Y-9Gs7t5.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ScanStationPage-Y-9Gs7t5.js","sources":["../../src/components/scan/station/StationIdle.tsx","../../src/components/scan/station/PrimedChrome.tsx","../../src/components/scan/station/choice-code.ts","../../src/components/scan/station/InfoChoiceScreen.tsx","../../src/components/scan/station/BadgePrompt.tsx","../../src/pages/scan/ScanStationPage.tsx"],"sourcesContent":["import { ScanBarcode } from 'lucide-react';\n\n/**\n * The station at rest — large, calm typography. The station is named for the\n * logged-in account; a badge scan primes an acting identity, an item scan\n * presents its reality.\n */\nexport function StationIdle({ stationName }: { stationName: string }) {\n return (\n <div className=\"flex-1 flex flex-col items-center justify-center text-center py-24\">\n <ScanBarcode className=\"w-10 h-10 text-accent-muted mb-8\" strokeWidth={1} />\n <h1 className=\"text-3xl font-light text-text-primary tracking-tight\">{stationName}</h1>\n <div className=\"w-16 border-t border-surface-border my-8\" />\n <p className=\"text-lg text-text-secondary\">Scan your badge to begin</p>\n <p className=\"text-sm text-text-tertiary mt-2\">or scan an item</p>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { BadgeCheck } from 'lucide-react';\nimport { useActingIdentity } from '../../../hooks/useActingIdentity';\n\nfunction formatMmSs(totalSeconds: number): string {\n const m = Math.floor(totalSeconds / 60);\n const s = totalSeconds % 60;\n return `${m}:${String(s).padStart(2, '0')}`;\n}\n\n/**\n * Slim persistent strip while an acting identity is primed: the greeting and\n * a mm:ss countdown to the grant's expiry. The context clears itself at the\n * expiry instant — this chrome only renders. The per-second tick is a visible\n * wall clock, not data polling; it runs only while a grant is live.\n */\nexport function PrimedChrome() {\n const { identity, remainingSeconds } = useActingIdentity();\n const [, setTick] = useState(0);\n\n useEffect(() => {\n if (!identity?.expiresAt) return;\n const interval = setInterval(() => setTick((t) => t + 1), 1_000);\n return () => clearInterval(interval);\n }, [identity]);\n\n if (!identity) return null;\n\n return (\n <div className=\"flex items-center gap-2.5 pb-3 mb-6 border-b border-surface-border\">\n <BadgeCheck className=\"w-4 h-4 text-status-success shrink-0\" strokeWidth={1.5} />\n <span className=\"text-sm font-medium text-text-primary\">Hi {identity.displayName}</span>\n {identity.expiresAt && (\n <span className=\"ml-auto text-sm font-mono tabular-nums text-text-tertiary\">\n {formatMmSs(remainingSeconds())}\n </span>\n )}\n </div>\n );\n}\n","import type { ScanPresentedChoice } from '../../../api/scan-codes';\n\n/**\n * Whether a presented choice can act right now. The server withholds choices\n * whose identity requirement was unsatisfied at scan time; a badge primed\n * afterwards satisfies it, so the withholding lifts client-side without a\n * fresh present. A choice the server did not withhold stays enabled.\n */\nexport function isChoiceEnabled(choice: ScanPresentedChoice, hasActingIdentity: boolean): boolean {\n return !choice.withheld || hasActingIdentity;\n}\n\n/**\n * The enabled choice whose double-scan code exactly equals the raw emitted\n * string, or null. Choice codes are short tokens that never parse as scheme\n * codes, so an exact match is unambiguous; anything else falls through to\n * normal scan execution.\n */\nexport function matchChoiceByCode(\n choices: ScanPresentedChoice[],\n hasActingIdentity: boolean,\n raw: string,\n): ScanPresentedChoice | null {\n return (\n choices.find((c) => !!c.code && c.code === raw && isChoiceEnabled(c, hasActingIdentity)) ?? null\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { Modal } from '../../common/modal/Modal';\nimport { useScanInput } from '../../../hooks/useScanInput';\nimport { formatTimeAgo } from '../../../lib/format';\nimport { isChoiceEnabled, matchChoiceByCode } from './choice-code';\nimport type { ScanExecuteResponse, ScanPresentedChoice } from '../../../api/scan-codes';\n\n/** Format a metadata leaf for display: booleans read as Yes/No, objects compact\n * to JSON, empty values show an em dash. */\nfunction formatFactValue(value: unknown): string {\n if (value == null || value === '') return '—';\n if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n\nfunction FactRow({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex items-baseline gap-4 py-2\">\n <span className=\"w-32 shrink-0 text-2xs uppercase tracking-wide text-text-quaternary\">{label}</span>\n <span className=\"text-sm text-text-primary break-words\">{value}</span>\n </div>\n );\n}\n\n/** Inline dot separator for the dense summary line. */\nfunction Dot() {\n return <span className=\"text-text-quaternary select-none\">·</span>;\n}\n\n/**\n * A PRESENT response, rendered whole. Upper half states the located item's\n * reality plainly; lower half offers the step's labeled choices as large\n * buttons. Withheld choices show the badge affordance and enable fully the\n * moment an acting identity primes. While mounted, this screen\n * takes first look at raw scans: a code matching an enabled choice selects it\n * (confirm still applies); everything else falls through to normal execution.\n * Tapping a withheld choice hands it to the caller as a pending action — the\n * badge stop-over collects the identity and executes it.\n */\nexport function InfoChoiceScreen({\n response,\n hasActingIdentity,\n selfId,\n busy,\n onExecute,\n onWithheldSelect,\n}: {\n response: ScanExecuteResponse;\n hasActingIdentity: boolean;\n selfId: string | null;\n busy: boolean;\n onExecute: (choice: ScanPresentedChoice) => void;\n onWithheldSelect: (choice: ScanPresentedChoice) => void;\n}) {\n const { setCodeInterceptor } = useScanInput();\n const [pendingChoice, setPendingChoice] = useState<ScanPresentedChoice | null>(null);\n\n const escalation = (response.escalation ?? {}) as Record<string, unknown>;\n const choices = response.choices ?? [];\n const metadata = (escalation.metadata ?? {}) as Record<string, unknown>;\n\n const select = (choice: ScanPresentedChoice) => {\n if (choice.confirm) setPendingChoice(choice);\n else onExecute(choice);\n };\n\n // Live refs so the interceptor installed once sees current state — a badge\n // primed after mount enables withheld choices for double-scan selection too.\n const liveRef = useRef({ choices, hasActingIdentity, select });\n liveRef.current = { choices, hasActingIdentity, select };\n\n useEffect(() => {\n setCodeInterceptor((raw) => {\n const live = liveRef.current;\n const match = matchChoiceByCode(live.choices, live.hasActingIdentity, raw);\n if (!match) return false;\n live.select(match);\n return true;\n });\n return () => setCodeInterceptor(null);\n }, [setCodeInterceptor]);\n\n const assignedTo = (escalation.assigned_to as string | null) ?? null;\n const claimState = !assignedTo ? 'Unclaimed' : assignedTo === selfId ? 'Claimed by you' : 'Claimed';\n const claimClass = assignedTo === selfId ? 'text-accent' : 'text-text-secondary';\n const typeLine = [escalation.type, escalation.subtype].filter(Boolean).join(' · ');\n const metaEntries = Object.entries(metadata);\n\n return (\n <div className=\"flex-1 min-h-0 flex flex-col max-w-form\">\n {/* Reality — the located item's identity up top, dense summary beneath,\n then its metadata as a clean definition list. */}\n <div>\n {response.rule?.name && (\n <div className=\"text-2xs font-semibold uppercase tracking-widest text-accent mb-2\">\n {response.rule.name}\n </div>\n )}\n <h2 className=\"text-2xl font-medium leading-tight text-text-primary mb-2\">\n {(escalation.description as string) || typeLine || 'Located item'}\n </h2>\n {/* Dense one-line summary of the system facts. */}\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-text-secondary mb-5\">\n <span>{String(escalation.role ?? '—')}</span>\n {typeLine && (<><Dot /><span>{typeLine}</span></>)}\n <Dot /><span className={claimClass}>{claimState}</span>\n {typeof escalation.created_at === 'string' && (\n <><Dot /><span>{formatTimeAgo(escalation.created_at)}</span></>\n )}\n </div>\n {metaEntries.length > 0 && (\n <div className=\"divide-y divide-surface-border border-t border-surface-border\">\n {metaEntries.map(([key, value]) => (\n <FactRow key={key} label={key} value={formatFactValue(value)} />\n ))}\n </div>\n )}\n </div>\n\n {/* Choices — the human's tap (or a second scan) disambiguates */}\n <div className=\"mt-8 space-y-3\">\n {choices.map((choice) => {\n const enabled = isChoiceEnabled(choice, hasActingIdentity);\n // Withheld choices stay fully presented and tappable — the identity\n // requirement is collected on the ensuing badge screen, not announced\n // here (one instruction at a time keeps this screen clear).\n return (\n <div key={choice.index}>\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => (enabled ? select(choice) : onWithheldSelect(choice))}\n className=\"w-full text-left px-5 py-4 text-lg text-text-primary border border-surface-border rounded hover:bg-surface-sunken transition-colors disabled:opacity-40 disabled:cursor-not-allowed\"\n >\n <span className=\"flex items-baseline gap-3\">\n {choice.label}\n {choice.code && (\n <span className=\"ml-auto text-2xs font-mono text-text-quaternary\">{choice.code}</span>\n )}\n </span>\n </button>\n </div>\n );\n })}\n </div>\n\n {pendingChoice && (\n <Modal open onClose={() => setPendingChoice(null)} title={pendingChoice.label}>\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">{pendingChoice.confirm?.prompt}</p>\n <div className=\"flex justify-end gap-3 pt-2\">\n <button\n type=\"button\"\n onClick={() => setPendingChoice(null)}\n disabled={busy}\n className=\"btn-secondary text-xs\"\n >\n No, go back\n </button>\n <button\n type=\"button\"\n onClick={() => {\n const choice = pendingChoice;\n setPendingChoice(null);\n onExecute(choice);\n }}\n disabled={busy}\n className=\"btn-primary text-xs\"\n >\n Yes, continue\n </button>\n </div>\n </div>\n </Modal>\n )}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { IdCard, ScanBarcode } from 'lucide-react';\nimport { Modal } from '../../common/modal/Modal';\nimport { SimpleMarkdown } from '../../common/display/SimpleMarkdown';\nimport type { ScanPresentedChoice } from '../../../api/scan-codes';\n\n/**\n * The badge stop-over: a chosen action wants an acting identity that is not\n * primed yet. The screen holds the choice and waits — a badge scan flows\n * through the normal scan pipeline and primes the identity; the moment\n * `primed` flips true this component executes the pending choice (asking\n * first when the choice carries a confirm). Cancel hands control back to the\n * caller, which decides where to return.\n */\nexport function BadgePrompt({\n choice,\n notPrimedMarkdown,\n primed,\n busy,\n onExecute,\n onCancel,\n}: {\n choice: ScanPresentedChoice;\n notPrimedMarkdown?: string;\n primed: boolean;\n busy: boolean;\n onExecute: (choice: ScanPresentedChoice) => void;\n onCancel: () => void;\n}) {\n const [confirming, setConfirming] = useState(false);\n // One execution per priming — re-arms if the grant lapses before it lands.\n const firedRef = useRef(false);\n\n useEffect(() => {\n if (!primed) {\n firedRef.current = false;\n return;\n }\n if (firedRef.current) return;\n firedRef.current = true;\n if (choice.confirm) setConfirming(true);\n else onExecute(choice);\n }, [primed, choice, onExecute]);\n\n return (\n <div className=\"flex-1 flex flex-col items-center justify-center text-center py-24\">\n <div className=\"flex items-center gap-4 mb-8\">\n <ScanBarcode className=\"w-8 h-8 text-text-quaternary\" strokeWidth={1} />\n <IdCard className=\"w-10 h-10 text-accent-muted\" strokeWidth={1} />\n </div>\n <h2 className=\"text-2xl font-light text-text-primary tracking-tight\">\n Scan your badge to continue\n </h2>\n <p className=\"text-lg text-text-secondary mt-2\">to {choice.label}</p>\n {notPrimedMarkdown && (\n <div className=\"text-sm text-text-tertiary mt-6 max-w-prose\">\n <SimpleMarkdown content={notPrimedMarkdown} compact />\n </div>\n )}\n <div className=\"w-16 border-t border-surface-border my-8\" />\n <button\n type=\"button\"\n onClick={onCancel}\n disabled={busy}\n className=\"text-sm text-text-tertiary hover:text-text-secondary hover:underline\"\n >\n Cancel\n </button>\n\n {confirming && (\n <Modal open onClose={onCancel} title={choice.label}>\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">{choice.confirm?.prompt}</p>\n <div className=\"flex justify-end gap-3 pt-2\">\n <button type=\"button\" onClick={onCancel} disabled={busy} className=\"btn-secondary text-xs\">\n No, go back\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setConfirming(false);\n onExecute(choice);\n }}\n disabled={busy}\n className=\"btn-primary text-xs\"\n >\n Yes, continue\n </button>\n </div>\n </div>\n </Modal>\n )}\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useActingIdentity } from '../../hooks/useActingIdentity';\nimport { SCAN_CHOICES_STATE } from '../../hooks/useScanInput';\nimport {\n executeScanChoice,\n SCAN_OUTCOMES,\n SCAN_VERBS,\n type ScanExecuteResponse,\n type ScanPresentedChoice,\n type ScanVerb,\n} from '../../api/scan-codes';\nimport { StationIdle, PrimedChrome, InfoChoiceScreen, BadgePrompt } from '../../components/scan/station';\nimport { SimpleMarkdown } from '../../components/common/display/SimpleMarkdown';\n\nconst NOTICE_DISMISS_MS = 8_000;\n\n/** Choice verbs whose execution lands the person on the escalation's detail page. */\nconst DETAIL_VERBS: ScanVerb[] = [\n SCAN_VERBS.SHOW_DETAIL,\n SCAN_VERBS.CLAIM,\n SCAN_VERBS.CLAIM_SHOW_DETAIL,\n];\n\ninterface StationNotice {\n at: number;\n tone: string;\n text: string;\n markdown?: string;\n}\n\n/** A choice waiting on a badge, and where Cancel returns. */\ninterface PendingBadge {\n choice: ScanPresentedChoice;\n returnTo: 'choices' | 'idle';\n}\n\n/**\n * The scan station: a full-page surface for badge + item work. Idle until a\n * scan presents an item's reality and choices; a badge scan primes an acting\n * identity that unlocks withheld choices and rides along on executions. A\n * choice that needs a badge first parks in the stop-over (BadgePrompt) — one\n * badge scan primes the identity and the pending choice executes itself.\n * Claim and show choices land on the escalation's detail page for the work.\n */\nexport function ScanStationPage() {\n const location = useLocation();\n const navigate = useNavigate();\n const { user } = useAuth();\n const { identity, clear } = useActingIdentity();\n const [screen, setScreen] = useState<ScanExecuteResponse | null>(null);\n const [pendingBadge, setPendingBadge] = useState<PendingBadge | null>(null);\n const [notice, setNotice] = useState<StationNotice | null>(null);\n const [busy, setBusy] = useState(false);\n\n // Adopt a CHOICES response arriving in route state, then drop it from\n // history so refresh/back land on the idle station, never a stale reality.\n // An autoSelect response skips the choice screen: the server would have\n // executed its single choice but identity stopped it — straight to the\n // stop-over with that choice pending; Cancel returns to idle.\n useEffect(() => {\n const incoming = (location.state as Record<string, unknown> | null)\n ?.[SCAN_CHOICES_STATE] as ScanExecuteResponse | undefined;\n if (!incoming) return;\n setScreen(incoming);\n setNotice(null);\n const single = incoming.choices?.length === 1 ? incoming.choices[0] : undefined;\n setPendingBadge(incoming.autoSelect && single ? { choice: single, returnTo: 'idle' } : null);\n navigate(location.pathname, { replace: true, state: null });\n }, [location, navigate]);\n\n // Notices self-dismiss — one timeout keyed to the notice.\n useEffect(() => {\n if (!notice) return;\n const timer = setTimeout(() => setNotice(null), NOTICE_DISMISS_MS);\n return () => clearTimeout(timer);\n }, [notice]);\n\n const executeChoice = useCallback(async (choice: ScanPresentedChoice) => {\n if (!screen?.rule || !screen.escalation) return;\n setBusy(true);\n try {\n const result = await executeScanChoice({\n schemeVersion: screen.rule.schemeVersion,\n category: screen.rule.category,\n stepIndex: screen.stepIndex ?? 0,\n choiceIndex: choice.index,\n escalationId: String(screen.escalation.id),\n actingToken: identity?.actingToken,\n });\n switch (result.outcome) {\n case SCAN_OUTCOMES.EXECUTED:\n setScreen(null);\n setPendingBadge(null);\n if (DETAIL_VERBS.includes(choice.verb) && result.escalation) {\n // The claim (or show) landed — go work the item where it lives.\n navigate(`/escalations/detail/${result.escalation.id}`);\n break;\n }\n // Done — back to idle, ready for the next item.\n setNotice({ at: Date.now(), tone: 'text-status-success', text: `${choice.label} — done` });\n break;\n case SCAN_OUTCOMES.CONFLICT:\n // Someone else won the row; the presented reality is stale.\n setScreen(null);\n setPendingBadge(null);\n setNotice({\n at: Date.now(),\n tone: 'text-status-warning',\n text: result.error || 'The item changed since it was scanned — scan it again.',\n });\n break;\n case SCAN_OUTCOMES.UNCONFIGURED:\n setScreen(null);\n setPendingBadge(null);\n setNotice({\n at: Date.now(),\n tone: 'text-status-warning',\n text: result.error || 'This choice is no longer configured.',\n });\n break;\n case SCAN_OUTCOMES.NOT_PRIMED:\n // The grant died between render and tap — reflect that, then park\n // the choice in the stop-over; the next badge scan satisfies it.\n clear();\n setNotice(null);\n setPendingBadge((prev) => ({ choice, returnTo: prev?.returnTo ?? 'choices' }));\n break;\n default:\n setNotice({\n at: Date.now(),\n tone: 'text-status-error',\n text: result.error || 'The choice did not run.',\n });\n }\n } catch (err: any) {\n setNotice({ at: Date.now(), tone: 'text-status-error', text: err.message });\n } finally {\n setBusy(false);\n }\n }, [screen, identity, navigate, clear]);\n\n const holdForBadge = useCallback((choice: ScanPresentedChoice) => {\n setPendingBadge({ choice, returnTo: 'choices' });\n }, []);\n\n const cancelBadge = useCallback(() => {\n if (pendingBadge?.returnTo === 'idle') setScreen(null);\n setPendingBadge(null);\n }, [pendingBadge]);\n\n const stationName = user?.displayName || user?.username || 'Scan station';\n const showChoices = !!(screen?.choices && screen.escalation);\n\n return (\n <div className=\"flex-1 min-h-0 flex flex-col\">\n <PrimedChrome />\n {pendingBadge && screen ? (\n <BadgePrompt\n choice={pendingBadge.choice}\n notPrimedMarkdown={screen.notPrimed?.markdown}\n primed={!!identity}\n busy={busy}\n onExecute={executeChoice}\n onCancel={cancelBadge}\n />\n ) : showChoices ? (\n <InfoChoiceScreen\n key={String(screen!.escalation!.id)}\n response={screen!}\n hasActingIdentity={!!identity}\n selfId={identity?.actorId ?? user?.userId ?? null}\n busy={busy}\n onExecute={executeChoice}\n onWithheldSelect={holdForBadge}\n />\n ) : (\n <StationIdle stationName={stationName} />\n )}\n {notice && (\n <div role=\"status\" className=\"mt-8 pt-3 border-t border-surface-border\">\n <span className={`text-sm font-medium ${notice.tone}`}>{notice.text}</span>\n {notice.markdown && (\n <div className=\"text-sm text-text-secondary mt-1\">\n <SimpleMarkdown content={notice.markdown} compact />\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"names":["StationIdle","stationName","jsxs","jsx","ScanBarcode","formatMmSs","totalSeconds","m","s","PrimedChrome","identity","remainingSeconds","useActingIdentity","setTick","useState","useEffect","interval","t","BadgeCheck","isChoiceEnabled","choice","hasActingIdentity","matchChoiceByCode","choices","raw","c","formatFactValue","value","FactRow","label","Dot","InfoChoiceScreen","response","selfId","busy","onExecute","onWithheldSelect","setCodeInterceptor","useScanInput","pendingChoice","setPendingChoice","escalation","metadata","select","liveRef","useRef","live","match","assignedTo","claimState","claimClass","typeLine","metaEntries","_a","Fragment","formatTimeAgo","key","enabled","Modal","_b","BadgePrompt","notPrimedMarkdown","primed","onCancel","confirming","setConfirming","firedRef","IdCard","SimpleMarkdown","NOTICE_DISMISS_MS","DETAIL_VERBS","SCAN_VERBS","ScanStationPage","location","useLocation","navigate","useNavigate","user","useAuth","clear","screen","setScreen","pendingBadge","setPendingBadge","notice","setNotice","setBusy","incoming","SCAN_CHOICES_STATE","single","timer","executeChoice","useCallback","result","executeScanChoice","SCAN_OUTCOMES","prev","err","holdForBadge","cancelBadge","showChoices"],"mappings":"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"}
|