@hotmeshio/long-tail 0.10.11 → 0.10.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/README.md +2 -4
  2. package/build/api/escalations/list.d.ts +1 -0
  3. package/build/api/escalations/list.js +1 -0
  4. package/build/api/escalations/metadata.d.ts +11 -0
  5. package/build/api/escalations/metadata.js +28 -8
  6. package/build/api/escalations/resolve.js +4 -4
  7. package/build/api/scan-codes/config.d.ts +22 -0
  8. package/build/api/scan-codes/config.js +136 -0
  9. package/build/api/scan-codes/execute.d.ts +9 -0
  10. package/build/api/scan-codes/execute.js +372 -0
  11. package/build/api/scan-codes/index.d.ts +2 -0
  12. package/build/api/scan-codes/index.js +14 -0
  13. package/build/lib/db/schemas/026_scan_codes.sql +51 -0
  14. package/build/lib/db/schemas/027_scan_codes_reindex.sql +23 -0
  15. package/build/lib/events/system-events.js +4 -0
  16. package/build/modules/features.d.ts +8 -0
  17. package/build/modules/features.js +1 -0
  18. package/build/routes/escalations/list.js +1 -0
  19. package/build/routes/index.js +2 -0
  20. package/build/routes/scan-codes.d.ts +2 -0
  21. package/build/routes/scan-codes.js +138 -0
  22. package/build/sdk/index.d.ts +4 -0
  23. package/build/services/escalation/crud.d.ts +1 -1
  24. package/build/services/escalation/crud.js +4 -2
  25. package/build/services/escalation/queries.d.ts +1 -0
  26. package/build/services/escalation/queries.js +2 -0
  27. package/build/services/escalation/resolver-validation.d.ts +1 -1
  28. package/build/services/escalation/resolver-validation.js +12 -5
  29. package/build/services/escalation/sql.d.ts +11 -6
  30. package/build/services/escalation/sql.js +20 -20
  31. package/build/services/escalation/submit-guard.d.ts +29 -0
  32. package/build/services/escalation/submit-guard.js +57 -0
  33. package/build/services/scan-code/index.d.ts +4 -0
  34. package/build/services/scan-code/index.js +21 -0
  35. package/build/services/scan-code/parse.d.ts +35 -0
  36. package/build/services/scan-code/parse.js +108 -0
  37. package/build/services/scan-code/read.d.ts +5 -0
  38. package/build/services/scan-code/read.js +50 -0
  39. package/build/services/scan-code/sql.d.ts +10 -0
  40. package/build/services/scan-code/sql.js +57 -0
  41. package/build/services/scan-code/validate.d.ts +12 -0
  42. package/build/services/scan-code/validate.js +78 -0
  43. package/build/services/scan-code/write.d.ts +26 -0
  44. package/build/services/scan-code/write.js +71 -0
  45. package/build/shared/form-validation/index.d.ts +5 -0
  46. package/build/shared/form-validation/index.js +5 -0
  47. package/build/shared/form-validation/x-lt-labels.d.ts +28 -0
  48. package/build/shared/form-validation/x-lt-labels.js +42 -0
  49. package/build/shared/form-validation/x-lt-query.d.ts +56 -0
  50. package/build/shared/form-validation/x-lt-query.js +49 -0
  51. package/build/shared/form-validation/x-lt-submit-guard.d.ts +46 -0
  52. package/build/shared/form-validation/x-lt-submit-guard.js +25 -0
  53. package/build/shared/form-validation/x-lt-submit-on-claim.d.ts +22 -0
  54. package/build/shared/form-validation/x-lt-submit-on-claim.js +28 -0
  55. package/build/shared/form-validation/x-lt-transition.d.ts +47 -0
  56. package/build/shared/form-validation/x-lt-transition.js +65 -0
  57. package/build/system/mcp-servers/admin/index.d.ts +1 -0
  58. package/build/system/mcp-servers/admin/index.js +5 -2
  59. package/build/system/mcp-servers/admin/scan-codes.d.ts +10 -0
  60. package/build/system/mcp-servers/admin/scan-codes.js +111 -0
  61. package/build/system/mcp-servers/admin/schemas.d.ts +232 -14
  62. package/build/system/mcp-servers/admin/schemas.js +50 -0
  63. package/build/system/seed/tool-manifests-admin.d.ts +1380 -0
  64. package/build/system/seed/tool-manifests-admin.js +6 -0
  65. package/build/tsconfig.tsbuildinfo +1 -1
  66. package/build/types/events.d.ts +9 -0
  67. package/build/types/index.d.ts +2 -0
  68. package/build/types/index.js +10 -1
  69. package/build/types/scan-code.d.ts +183 -0
  70. package/build/types/scan-code.js +80 -0
  71. package/build/types/startup.d.ts +6 -0
  72. package/dashboard/dist/assets/{AdminDashboard-CkTbRfY9.js → AdminDashboard-Chg69wlx.js} +2 -2
  73. package/dashboard/dist/assets/{AdminDashboard-CkTbRfY9.js.map → AdminDashboard-Chg69wlx.js.map} +1 -1
  74. package/dashboard/dist/assets/{AgentConfigPage-Cm8FRpXi.js → AgentConfigPage-DRTFwbfC.js} +6 -6
  75. package/dashboard/dist/assets/{AgentConfigPage-Cm8FRpXi.js.map → AgentConfigPage-DRTFwbfC.js.map} +1 -1
  76. package/dashboard/dist/assets/{AgentDetailPage-sQ1-UT46.js → AgentDetailPage-JKByfFIi.js} +3 -3
  77. package/dashboard/dist/assets/{AgentDetailPage-sQ1-UT46.js.map → AgentDetailPage-JKByfFIi.js.map} +1 -1
  78. package/dashboard/dist/assets/AgentsPage-BlgEmKhA.js +2 -0
  79. package/dashboard/dist/assets/{AgentsPage-bSx_mdae.js.map → AgentsPage-BlgEmKhA.js.map} +1 -1
  80. package/dashboard/dist/assets/{AutoGrowTextarea-y-oNY51_.js → AutoGrowTextarea-DgEQeRQw.js} +2 -2
  81. package/dashboard/dist/assets/{AutoGrowTextarea-y-oNY51_.js.map → AutoGrowTextarea-DgEQeRQw.js.map} +1 -1
  82. package/dashboard/dist/assets/AvailableEscalationsPage-C_7y692Q.js +2 -0
  83. package/dashboard/dist/assets/{AvailableEscalationsPage-8pMC7Xv6.js.map → AvailableEscalationsPage-C_7y692Q.js.map} +1 -1
  84. package/dashboard/dist/assets/BotPicker-CCVcz4Cq.js +2 -0
  85. package/dashboard/dist/assets/{BotPicker-C4uGH2x9.js.map → BotPicker-CCVcz4Cq.js.map} +1 -1
  86. package/dashboard/dist/assets/{CapabilitiesPage-BRoOeKcc.js → CapabilitiesPage-Czi9jUwD.js} +2 -2
  87. package/dashboard/dist/assets/{CapabilitiesPage-BRoOeKcc.js.map → CapabilitiesPage-Czi9jUwD.js.map} +1 -1
  88. package/dashboard/dist/assets/{CollapsibleSection-CIj8Adc9.js → CollapsibleSection-8YE965QX.js} +2 -2
  89. package/dashboard/dist/assets/{CollapsibleSection-CIj8Adc9.js.map → CollapsibleSection-8YE965QX.js.map} +1 -1
  90. package/dashboard/dist/assets/{ConfirmDeleteModal-Ugi_9Ukq.js → ConfirmDeleteModal-CQsJUzEa.js} +2 -2
  91. package/dashboard/dist/assets/{ConfirmDeleteModal-Ugi_9Ukq.js.map → ConfirmDeleteModal-CQsJUzEa.js.map} +1 -1
  92. package/dashboard/dist/assets/{CopyableId-GUEdiiL5.js → CopyableId-4Lqlc5cU.js} +2 -2
  93. package/dashboard/dist/assets/{CopyableId-GUEdiiL5.js.map → CopyableId-4Lqlc5cU.js.map} +1 -1
  94. package/dashboard/dist/assets/CountdownTimer-Bxvq3D7j.js +2 -0
  95. package/dashboard/dist/assets/CountdownTimer-Bxvq3D7j.js.map +1 -0
  96. package/dashboard/dist/assets/{CredentialsPage-B73Si6K1.js → CredentialsPage-Bn7_SX6-.js} +2 -2
  97. package/dashboard/dist/assets/{CredentialsPage-B73Si6K1.js.map → CredentialsPage-Bn7_SX6-.js.map} +1 -1
  98. package/dashboard/dist/assets/{CronLabel-Ca1aHolt.js → CronLabel-Bn4mX_Yn.js} +2 -2
  99. package/dashboard/dist/assets/{CronLabel-Ca1aHolt.js.map → CronLabel-Bn4mX_Yn.js.map} +1 -1
  100. package/dashboard/dist/assets/{CustomDurationPicker-_9E9x1YN.js → CustomDurationPicker-pMcrFyW6.js} +2 -2
  101. package/dashboard/dist/assets/{CustomDurationPicker-_9E9x1YN.js.map → CustomDurationPicker-pMcrFyW6.js.map} +1 -1
  102. package/dashboard/dist/assets/{DataTable-BTu2AaEl.js → DataTable-Bir0Xs1p.js} +2 -2
  103. package/dashboard/dist/assets/{DataTable-BTu2AaEl.js.map → DataTable-Bir0Xs1p.js.map} +1 -1
  104. package/dashboard/dist/assets/{DropZone-NYn6TWHz.js → DropZone-zCEGjjk-.js} +2 -2
  105. package/dashboard/dist/assets/{DropZone-NYn6TWHz.js.map → DropZone-zCEGjjk-.js.map} +1 -1
  106. package/dashboard/dist/assets/{ElapsedCell-karxia93.js → ElapsedCell-BGO7IXEg.js} +2 -2
  107. package/dashboard/dist/assets/{ElapsedCell-karxia93.js.map → ElapsedCell-BGO7IXEg.js.map} +1 -1
  108. package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js → EmptyState-lpUFYfun.js} +2 -2
  109. package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js.map → EmptyState-lpUFYfun.js.map} +1 -1
  110. package/dashboard/dist/assets/{EscalationListSchemaPage-CDaNmbUA.js → EscalationListSchemaPage-CFDxbd50.js} +3 -3
  111. package/dashboard/dist/assets/{EscalationListSchemaPage-CDaNmbUA.js.map → EscalationListSchemaPage-CFDxbd50.js.map} +1 -1
  112. package/dashboard/dist/assets/{EscalationSchemaPage-k-2hFT2t.js → EscalationSchemaPage-DnXPnDkz.js} +3 -3
  113. package/dashboard/dist/assets/{EscalationSchemaPage-k-2hFT2t.js.map → EscalationSchemaPage-DnXPnDkz.js.map} +1 -1
  114. package/dashboard/dist/assets/{EscalationsOverview-C1e7IPn_.js → EscalationsOverview-BZMVXrkK.js} +2 -2
  115. package/dashboard/dist/assets/{EscalationsOverview-C1e7IPn_.js.map → EscalationsOverview-BZMVXrkK.js.map} +1 -1
  116. package/dashboard/dist/assets/EventTable-Bfi-f8as.js +2 -0
  117. package/dashboard/dist/assets/EventTable-Bfi-f8as.js.map +1 -0
  118. package/dashboard/dist/assets/FilterBar-Do7yR4xM.js +2 -0
  119. package/dashboard/dist/assets/FilterBar-Do7yR4xM.js.map +1 -0
  120. package/dashboard/dist/assets/{GraphInvokePage-LMpWw8z1.js → GraphInvokePage-d1ie4T7f.js} +2 -2
  121. package/dashboard/dist/assets/{GraphInvokePage-LMpWw8z1.js.map → GraphInvokePage-d1ie4T7f.js.map} +1 -1
  122. package/dashboard/dist/assets/{HomePage-Kl2DBG6l.js → HomePage-BEeodImU.js} +2 -2
  123. package/dashboard/dist/assets/{HomePage-Kl2DBG6l.js.map → HomePage-BEeodImU.js.map} +1 -1
  124. package/dashboard/dist/assets/ListToolbar-CLtw-1QN.js +2 -0
  125. package/dashboard/dist/assets/{ListToolbar-B2fub0DY.js.map → ListToolbar-CLtw-1QN.js.map} +1 -1
  126. package/dashboard/dist/assets/{McpOverview-odYnCZCC.js → McpOverview-DIsy9TB3.js} +2 -2
  127. package/dashboard/dist/assets/{McpOverview-odYnCZCC.js.map → McpOverview-DIsy9TB3.js.map} +1 -1
  128. package/dashboard/dist/assets/{McpQueryDetailPage-BtqwHUAg.js → McpQueryDetailPage-6PomdsyD.js} +3 -3
  129. package/dashboard/dist/assets/{McpQueryDetailPage-BtqwHUAg.js.map → McpQueryDetailPage-6PomdsyD.js.map} +1 -1
  130. package/dashboard/dist/assets/McpQueryPage-YMdQCXm9.js +2 -0
  131. package/dashboard/dist/assets/{McpQueryPage-CPkVwNIK.js.map → McpQueryPage-YMdQCXm9.js.map} +1 -1
  132. package/dashboard/dist/assets/McpRunDetailPage-DsD1Gm2o.js +2 -0
  133. package/dashboard/dist/assets/McpRunDetailPage-DsD1Gm2o.js.map +1 -0
  134. package/dashboard/dist/assets/{McpRunsPage-rdpZ2yMh.js → McpRunsPage--a5Jgb33.js} +2 -2
  135. package/dashboard/dist/assets/{McpRunsPage-rdpZ2yMh.js.map → McpRunsPage--a5Jgb33.js.map} +1 -1
  136. package/dashboard/dist/assets/{Modal-Dr1Xy0j0.js → Modal-BU7No9NH.js} +2 -2
  137. package/dashboard/dist/assets/{Modal-Dr1Xy0j0.js.map → Modal-BU7No9NH.js.map} +1 -1
  138. package/dashboard/dist/assets/{NamespacePill-GwO-WfhX.js → NamespacePill-wV6L4VW1.js} +2 -2
  139. package/dashboard/dist/assets/{NamespacePill-GwO-WfhX.js.map → NamespacePill-wV6L4VW1.js.map} +1 -1
  140. package/dashboard/dist/assets/OperationsPage-B2v9k3DT.js +2 -0
  141. package/dashboard/dist/assets/{OperationsPage-DlyGLPAs.js.map → OperationsPage-B2v9k3DT.js.map} +1 -1
  142. package/dashboard/dist/assets/{OperatorDashboard-Csei5vj-.js → OperatorDashboard-CkLfbxEh.js} +2 -2
  143. package/dashboard/dist/assets/{OperatorDashboard-Csei5vj-.js.map → OperatorDashboard-CkLfbxEh.js.map} +1 -1
  144. package/dashboard/dist/assets/{PageHeader-Bo9BU9pK.js → PageHeader-BtIr6r-8.js} +2 -2
  145. package/dashboard/dist/assets/{PageHeader-Bo9BU9pK.js.map → PageHeader-BtIr6r-8.js.map} +1 -1
  146. package/dashboard/dist/assets/{PageHeaderWithStats-8_5cOSKL.js → PageHeaderWithStats-C2sGqFQG.js} +2 -2
  147. package/dashboard/dist/assets/{PageHeaderWithStats-8_5cOSKL.js.map → PageHeaderWithStats-C2sGqFQG.js.map} +1 -1
  148. package/dashboard/dist/assets/{PersonaDetailPage--ZL6Or6v.js → PersonaDetailPage-CCmOgKQb.js} +2 -2
  149. package/dashboard/dist/assets/{PersonaDetailPage--ZL6Or6v.js.map → PersonaDetailPage-CCmOgKQb.js.map} +1 -1
  150. package/dashboard/dist/assets/{PersonasPage-Bdcoay3P.js → PersonasPage-BJkSuDTN.js} +2 -2
  151. package/dashboard/dist/assets/{PersonasPage-Bdcoay3P.js.map → PersonasPage-BJkSuDTN.js.map} +1 -1
  152. package/dashboard/dist/assets/{PriorityBadge-CCERr9vQ.js → PriorityBadge-BETdj4M-.js} +2 -2
  153. package/dashboard/dist/assets/{PriorityBadge-CCERr9vQ.js.map → PriorityBadge-BETdj4M-.js.map} +1 -1
  154. package/dashboard/dist/assets/{ProcessDetailPage-HrmVQq7S.js → ProcessDetailPage-DT9BlJXK.js} +2 -2
  155. package/dashboard/dist/assets/{ProcessDetailPage-HrmVQq7S.js.map → ProcessDetailPage-DT9BlJXK.js.map} +1 -1
  156. package/dashboard/dist/assets/{ProcessesListPage-_xmj6Bo-.js → ProcessesListPage-DgSGzTDT.js} +2 -2
  157. package/dashboard/dist/assets/{ProcessesListPage-_xmj6Bo-.js.map → ProcessesListPage-DgSGzTDT.js.map} +1 -1
  158. package/dashboard/dist/assets/{RoleDetailPage-C0ju2-4K.js → RoleDetailPage-DMphTvro.js} +3 -3
  159. package/dashboard/dist/assets/{RoleDetailPage-C0ju2-4K.js.map → RoleDetailPage-DMphTvro.js.map} +1 -1
  160. package/dashboard/dist/assets/{RolePill-CQlnEWkK.js → RolePill-BBYjhAPj.js} +2 -2
  161. package/dashboard/dist/assets/{RolePill-CQlnEWkK.js.map → RolePill-BBYjhAPj.js.map} +1 -1
  162. package/dashboard/dist/assets/{RolesPage-CKluVSpB.js → RolesPage-gi_kaot1.js} +2 -2
  163. package/dashboard/dist/assets/{RolesPage-CKluVSpB.js.map → RolesPage-gi_kaot1.js.map} +1 -1
  164. package/dashboard/dist/assets/{RowActions-BA9L9djf.js → RowActions-eYrzgQSj.js} +2 -2
  165. package/dashboard/dist/assets/{RowActions-BA9L9djf.js.map → RowActions-eYrzgQSj.js.map} +1 -1
  166. package/dashboard/dist/assets/RunAsSelector-CateuvcC.js +2 -0
  167. package/dashboard/dist/assets/{RunAsSelector-DdfecQ1U.js.map → RunAsSelector-CateuvcC.js.map} +1 -1
  168. package/dashboard/dist/assets/ScanCodesPage-CQ8RxMug.js +2 -0
  169. package/dashboard/dist/assets/ScanCodesPage-CQ8RxMug.js.map +1 -0
  170. package/dashboard/dist/assets/ScanSchemeDetailPage-puSbuxcV.js +2 -0
  171. package/dashboard/dist/assets/ScanSchemeDetailPage-puSbuxcV.js.map +1 -0
  172. package/dashboard/dist/assets/{ScopeBadge-BBYkevuR.js → ScopeBadge-xs2Nhjy4.js} +2 -2
  173. package/dashboard/dist/assets/{ScopeBadge-BBYkevuR.js.map → ScopeBadge-xs2Nhjy4.js.map} +1 -1
  174. package/dashboard/dist/assets/SegmentedTabs-DXNzY05q.js +2 -0
  175. package/dashboard/dist/assets/SegmentedTabs-DXNzY05q.js.map +1 -0
  176. package/dashboard/dist/assets/{StatCard-Ca-ngCaD.js → StatCard-BXQ8dD9Y.js} +2 -2
  177. package/dashboard/dist/assets/{StatCard-Ca-ngCaD.js.map → StatCard-BXQ8dD9Y.js.map} +1 -1
  178. package/dashboard/dist/assets/{StatusBadge-BwUvykDo.js → StatusBadge-DkgllZHv.js} +2 -2
  179. package/dashboard/dist/assets/{StatusBadge-BwUvykDo.js.map → StatusBadge-DkgllZHv.js.map} +1 -1
  180. package/dashboard/dist/assets/StickyPagination-Cg-QdYWL.js +2 -0
  181. package/dashboard/dist/assets/StickyPagination-Cg-QdYWL.js.map +1 -0
  182. package/dashboard/dist/assets/{StreamMessageDetail-CZXWDawC.js → StreamMessageDetail-DEeuh4_-.js} +2 -2
  183. package/dashboard/dist/assets/{StreamMessageDetail-CZXWDawC.js.map → StreamMessageDetail-DEeuh4_-.js.map} +1 -1
  184. package/dashboard/dist/assets/{SwimlaneTimeline-fWY0gaf3.js → SwimlaneTimeline-DMY0jL2F.js} +2 -2
  185. package/dashboard/dist/assets/{SwimlaneTimeline-fWY0gaf3.js.map → SwimlaneTimeline-DMY0jL2F.js.map} +1 -1
  186. package/dashboard/dist/assets/{TagInput-CDKbslLx.js → TagInput-BMmiV-MD.js} +2 -2
  187. package/dashboard/dist/assets/{TagInput-CDKbslLx.js.map → TagInput-BMmiV-MD.js.map} +1 -1
  188. package/dashboard/dist/assets/{TaskDetailPage-BjE4G2yn.js → TaskDetailPage-CPbkIvfF.js} +2 -2
  189. package/dashboard/dist/assets/{TaskDetailPage-BjE4G2yn.js.map → TaskDetailPage-CPbkIvfF.js.map} +1 -1
  190. package/dashboard/dist/assets/{TaskQueuePill-G3RuYRNZ.js → TaskQueuePill-DLgYaw1x.js} +2 -2
  191. package/dashboard/dist/assets/{TaskQueuePill-G3RuYRNZ.js.map → TaskQueuePill-DLgYaw1x.js.map} +1 -1
  192. package/dashboard/dist/assets/{TasksListPage-KAhmCWB2.js → TasksListPage-CtHudKhQ.js} +2 -2
  193. package/dashboard/dist/assets/{TasksListPage-KAhmCWB2.js.map → TasksListPage-CtHudKhQ.js.map} +1 -1
  194. package/dashboard/dist/assets/TimeAgo-BdHOizWg.js +2 -0
  195. package/dashboard/dist/assets/{TimeAgo-C_H2TyZw.js.map → TimeAgo-BdHOizWg.js.map} +1 -1
  196. package/dashboard/dist/assets/{TimestampCell-COG_4Flg.js → TimestampCell-FVukzKRe.js} +2 -2
  197. package/dashboard/dist/assets/{TimestampCell-COG_4Flg.js.map → TimestampCell-FVukzKRe.js.map} +1 -1
  198. package/dashboard/dist/assets/{ToolPill-ChSyRJZC.js → ToolPill-BvS53hxP.js} +2 -2
  199. package/dashboard/dist/assets/{ToolPill-ChSyRJZC.js.map → ToolPill-BvS53hxP.js.map} +1 -1
  200. package/dashboard/dist/assets/{ToolTestPanel-BPdJECW0.js → ToolTestPanel-HN0OCYTL.js} +2 -2
  201. package/dashboard/dist/assets/{ToolTestPanel-BPdJECW0.js.map → ToolTestPanel-HN0OCYTL.js.map} +1 -1
  202. package/dashboard/dist/assets/{TopicDetailPage-DAqx5JqA.js → TopicDetailPage-DHdSpN61.js} +4 -4
  203. package/dashboard/dist/assets/{TopicDetailPage-DAqx5JqA.js.map → TopicDetailPage-DHdSpN61.js.map} +1 -1
  204. package/dashboard/dist/assets/TopicsPage-Clr6Tl5P.js +2 -0
  205. package/dashboard/dist/assets/{TopicsPage-DoGqAdPm.js.map → TopicsPage-Clr6Tl5P.js.map} +1 -1
  206. package/dashboard/dist/assets/UserName-BUVYyIAS.js +2 -0
  207. package/dashboard/dist/assets/{UserName-CKO_rk1R.js.map → UserName-BUVYyIAS.js.map} +1 -1
  208. package/dashboard/dist/assets/WorkflowExecutionPage-kncWFfe5.js +2 -0
  209. package/dashboard/dist/assets/WorkflowExecutionPage-kncWFfe5.js.map +1 -0
  210. package/dashboard/dist/assets/{WorkflowPill-CNbwug5p.js → WorkflowPill-BPC_Dc_I.js} +2 -2
  211. package/dashboard/dist/assets/{WorkflowPill-CNbwug5p.js.map → WorkflowPill-BPC_Dc_I.js.map} +1 -1
  212. package/dashboard/dist/assets/WorkflowsDashboard-4ypPDGKx.js +2 -0
  213. package/dashboard/dist/assets/{WorkflowsDashboard-DdJ86We6.js.map → WorkflowsDashboard-4ypPDGKx.js.map} +1 -1
  214. package/dashboard/dist/assets/{WorkflowsOverview-ZfFBzePp.js → WorkflowsOverview-CeQlZkkd.js} +2 -2
  215. package/dashboard/dist/assets/{WorkflowsOverview-ZfFBzePp.js.map → WorkflowsOverview-CeQlZkkd.js.map} +1 -1
  216. package/dashboard/dist/assets/{YamlWorkflowDetailPage-4bd5yXdA.js → YamlWorkflowDetailPage-DLAlEzwT.js} +13 -13
  217. package/dashboard/dist/assets/{YamlWorkflowDetailPage-4bd5yXdA.js.map → YamlWorkflowDetailPage-DLAlEzwT.js.map} +1 -1
  218. package/dashboard/dist/assets/{YamlWorkflowsPage-iHPNXjQj.js → YamlWorkflowsPage-DQhenKFT.js} +2 -2
  219. package/dashboard/dist/assets/{YamlWorkflowsPage-iHPNXjQj.js.map → YamlWorkflowsPage-DQhenKFT.js.map} +1 -1
  220. package/dashboard/dist/assets/{agents-DjD5U3Wb.js → agents-s3feet3W.js} +2 -2
  221. package/dashboard/dist/assets/{agents-DjD5U3Wb.js.map → agents-s3feet3W.js.map} +1 -1
  222. package/dashboard/dist/assets/{bots-DiljVapH.js → bots-CkSd2rn9.js} +2 -2
  223. package/dashboard/dist/assets/{bots-DiljVapH.js.map → bots-CkSd2rn9.js.map} +1 -1
  224. package/dashboard/dist/assets/capabilities-DA_r09tM.js +2 -0
  225. package/dashboard/dist/assets/{capabilities-DV_5ghHT.js.map → capabilities-DA_r09tM.js.map} +1 -1
  226. package/dashboard/dist/assets/{controlplane-BKMvfWCB.js → controlplane-C9c25q21.js} +2 -2
  227. package/dashboard/dist/assets/{controlplane-BKMvfWCB.js.map → controlplane-C9c25q21.js.map} +1 -1
  228. package/dashboard/dist/assets/{escalation-columns-BQpCaJId.js → escalation-columns-Cp3UrT48.js} +2 -2
  229. package/dashboard/dist/assets/{escalation-columns-BQpCaJId.js.map → escalation-columns-Cp3UrT48.js.map} +1 -1
  230. package/dashboard/dist/assets/{index-BO-7S9Xw.js → index--7Vdkzwd.js} +2 -2
  231. package/dashboard/dist/assets/{index-BO-7S9Xw.js.map → index--7Vdkzwd.js.map} +1 -1
  232. package/dashboard/dist/assets/index--DG-qQBT.js +65 -0
  233. package/dashboard/dist/assets/index--DG-qQBT.js.map +1 -0
  234. package/dashboard/dist/assets/{index-BaV3l0UE.js → index-BIcYbDVf.js} +2 -2
  235. package/dashboard/dist/assets/{index-BaV3l0UE.js.map → index-BIcYbDVf.js.map} +1 -1
  236. package/dashboard/dist/assets/index-BU5FFAJo.js +2 -0
  237. package/dashboard/dist/assets/{index-CItsikDw.js.map → index-BU5FFAJo.js.map} +1 -1
  238. package/dashboard/dist/assets/{index-BsOxMMmb.js → index-Bo5TtX9l.js} +2 -2
  239. package/dashboard/dist/assets/{index-BsOxMMmb.js.map → index-Bo5TtX9l.js.map} +1 -1
  240. package/dashboard/dist/assets/{index-Tx_ETzcH.js → index-C-MmR-jf.js} +2 -2
  241. package/dashboard/dist/assets/{index-Tx_ETzcH.js.map → index-C-MmR-jf.js.map} +1 -1
  242. package/dashboard/dist/assets/index-C7ABSOU2.js +6 -0
  243. package/dashboard/dist/assets/index-C7ABSOU2.js.map +1 -0
  244. package/dashboard/dist/assets/index-Cmxzk4ay.js +5 -0
  245. package/dashboard/dist/assets/{index-nIrYejxe.js.map → index-Cmxzk4ay.js.map} +1 -1
  246. package/dashboard/dist/assets/{index-CI8rrKjx.js → index-Cw9poaez.js} +2 -2
  247. package/dashboard/dist/assets/{index-CI8rrKjx.js.map → index-Cw9poaez.js.map} +1 -1
  248. package/dashboard/dist/assets/index-DEbY57_c.js +3 -0
  249. package/dashboard/dist/assets/index-DEbY57_c.js.map +1 -0
  250. package/dashboard/dist/assets/index-DnV6LSeY.css +1 -0
  251. package/dashboard/dist/assets/{index-xZqQxqu2.js → index-DvoMXQqO.js} +2 -2
  252. package/dashboard/dist/assets/{index-xZqQxqu2.js.map → index-DvoMXQqO.js.map} +1 -1
  253. package/dashboard/dist/assets/{index-DhATO1cS.js → index-S13oPvuS.js} +2 -2
  254. package/dashboard/dist/assets/{index-DhATO1cS.js.map → index-S13oPvuS.js.map} +1 -1
  255. package/dashboard/dist/assets/index-WxE3ONia.js +2 -0
  256. package/dashboard/dist/assets/{index-CStR4uIU.js.map → index-WxE3ONia.js.map} +1 -1
  257. package/dashboard/dist/assets/{knowledge-BocTnSiA.js → knowledge-Bpln0zy_.js} +2 -2
  258. package/dashboard/dist/assets/{knowledge-BocTnSiA.js.map → knowledge-Bpln0zy_.js.map} +1 -1
  259. package/dashboard/dist/assets/{mcp-C1KBjKQ_.js → mcp-BqDq3RZH.js} +2 -2
  260. package/dashboard/dist/assets/{mcp-C1KBjKQ_.js.map → mcp-BqDq3RZH.js.map} +1 -1
  261. package/dashboard/dist/assets/{mcp-query-B3cjukkA.js → mcp-query-DGue75R6.js} +2 -2
  262. package/dashboard/dist/assets/{mcp-query-B3cjukkA.js.map → mcp-query-DGue75R6.js.map} +1 -1
  263. package/dashboard/dist/assets/{personas-DiA2bJaX.js → personas-B8z_sTiJ.js} +2 -2
  264. package/dashboard/dist/assets/{personas-DiA2bJaX.js.map → personas-B8z_sTiJ.js.map} +1 -1
  265. package/dashboard/dist/assets/{pipelines-Dt2d2EFR.js → pipelines-DYgNd9nB.js} +2 -2
  266. package/dashboard/dist/assets/{pipelines-Dt2d2EFR.js.map → pipelines-DYgNd9nB.js.map} +1 -1
  267. package/dashboard/dist/assets/{tasks-cDh2hNml.js → tasks-CJdjjhgO.js} +2 -2
  268. package/dashboard/dist/assets/{tasks-cDh2hNml.js.map → tasks-CJdjjhgO.js.map} +1 -1
  269. package/dashboard/dist/assets/{topics-yFlGF-u1.js → topics-DPrL8Dtq.js} +2 -2
  270. package/dashboard/dist/assets/{topics-yFlGF-u1.js.map → topics-DPrL8Dtq.js.map} +1 -1
  271. package/dashboard/dist/assets/{useDebouncedValue-BA5S7V54.js → useDebouncedValue-C4P2jQuh.js} +2 -2
  272. package/dashboard/dist/assets/{useDebouncedValue-BA5S7V54.js.map → useDebouncedValue-C4P2jQuh.js.map} +1 -1
  273. package/dashboard/dist/assets/{useEventHooks-D2R_ckS8.js → useEventHooks-DXCgDgiu.js} +2 -2
  274. package/dashboard/dist/assets/{useEventHooks-D2R_ckS8.js.map → useEventHooks-DXCgDgiu.js.map} +1 -1
  275. package/dashboard/dist/assets/{useFilterParams-B7suPsIK.js → useFilterParams-crmlBw_l.js} +2 -2
  276. package/dashboard/dist/assets/{useFilterParams-B7suPsIK.js.map → useFilterParams-crmlBw_l.js.map} +1 -1
  277. package/dashboard/dist/assets/{useNamespace-u-V1GVUD.js → useNamespace-DnFZfy7N.js} +2 -2
  278. package/dashboard/dist/assets/{useNamespace-u-V1GVUD.js.map → useNamespace-DnFZfy7N.js.map} +1 -1
  279. package/dashboard/dist/assets/{useYamlActivityEvents-BhOZeqgE.js → useYamlActivityEvents-kx5CLENv.js} +2 -2
  280. package/dashboard/dist/assets/{useYamlActivityEvents-BhOZeqgE.js.map → useYamlActivityEvents-kx5CLENv.js.map} +1 -1
  281. package/dashboard/dist/assets/{users-BoXPwdee.js → users-DKng7vAG.js} +2 -2
  282. package/dashboard/dist/assets/{users-BoXPwdee.js.map → users-DKng7vAG.js.map} +1 -1
  283. package/dashboard/dist/assets/{vendor-icons-D71XjkNy.js → vendor-icons-CN-bAo9U.js} +144 -134
  284. package/dashboard/dist/assets/vendor-icons-CN-bAo9U.js.map +1 -0
  285. package/dashboard/dist/assets/{vendor-query-B2UbickB.js → vendor-query-RUZdMvN6.js} +2 -2
  286. package/dashboard/dist/assets/{vendor-query-B2UbickB.js.map → vendor-query-RUZdMvN6.js.map} +1 -1
  287. package/dashboard/dist/assets/{vendor-react-C1YOyCSV.js → vendor-react-CdqEC2zv.js} +2 -2
  288. package/dashboard/dist/assets/{vendor-react-C1YOyCSV.js.map → vendor-react-CdqEC2zv.js.map} +1 -1
  289. package/dashboard/dist/assets/{workflows-mCoyKuLZ.js → workflows-C4V0rMkM.js} +2 -2
  290. package/dashboard/dist/assets/{workflows-mCoyKuLZ.js.map → workflows-C4V0rMkM.js.map} +1 -1
  291. package/dashboard/dist/assets/{yaml-workflows-CWxXGDpn.js → yaml-workflows-D3PAiJ9d.js} +2 -2
  292. package/dashboard/dist/assets/{yaml-workflows-CWxXGDpn.js.map → yaml-workflows-D3PAiJ9d.js.map} +1 -1
  293. package/dashboard/dist/index.html +5 -5
  294. package/docs/design-principles.md +9 -7
  295. package/docs/hitl/x-lt-embed.md +8 -4
  296. package/docs/hitl/x-lt-footer.md +68 -0
  297. package/docs/hitl/x-lt-list-schema.md +10 -3
  298. package/docs/hitl/x-lt-transition.md +105 -0
  299. package/docs/hitl-guide.md +9 -0
  300. package/docs/scan-codes.md +243 -0
  301. package/package.json +2 -2
  302. package/dashboard/dist/assets/AgentsPage-bSx_mdae.js +0 -2
  303. package/dashboard/dist/assets/AvailableEscalationsPage-8pMC7Xv6.js +0 -2
  304. package/dashboard/dist/assets/BotPicker-C4uGH2x9.js +0 -2
  305. package/dashboard/dist/assets/CountdownTimer-D3t0XMhE.js +0 -2
  306. package/dashboard/dist/assets/CountdownTimer-D3t0XMhE.js.map +0 -1
  307. package/dashboard/dist/assets/EventTable-CIrrtL7_.js +0 -2
  308. package/dashboard/dist/assets/EventTable-CIrrtL7_.js.map +0 -1
  309. package/dashboard/dist/assets/FilterBar-CzjtH74v.js +0 -2
  310. package/dashboard/dist/assets/FilterBar-CzjtH74v.js.map +0 -1
  311. package/dashboard/dist/assets/ListToolbar-B2fub0DY.js +0 -2
  312. package/dashboard/dist/assets/McpQueryPage-CPkVwNIK.js +0 -2
  313. package/dashboard/dist/assets/McpRunDetailPage-D-Rz9MRw.js +0 -2
  314. package/dashboard/dist/assets/McpRunDetailPage-D-Rz9MRw.js.map +0 -1
  315. package/dashboard/dist/assets/OperationsPage-DlyGLPAs.js +0 -2
  316. package/dashboard/dist/assets/RunAsSelector-DdfecQ1U.js +0 -2
  317. package/dashboard/dist/assets/StickyPagination-cLddIdtT.js +0 -2
  318. package/dashboard/dist/assets/StickyPagination-cLddIdtT.js.map +0 -1
  319. package/dashboard/dist/assets/TimeAgo-C_H2TyZw.js +0 -2
  320. package/dashboard/dist/assets/TopicsPage-DoGqAdPm.js +0 -2
  321. package/dashboard/dist/assets/UserName-CKO_rk1R.js +0 -2
  322. package/dashboard/dist/assets/WorkflowExecutionPage-D3VQ9iQV.js +0 -2
  323. package/dashboard/dist/assets/WorkflowExecutionPage-D3VQ9iQV.js.map +0 -1
  324. package/dashboard/dist/assets/WorkflowsDashboard-DdJ86We6.js +0 -2
  325. package/dashboard/dist/assets/capabilities-DV_5ghHT.js +0 -2
  326. package/dashboard/dist/assets/index-B-WkiNRN.js +0 -6
  327. package/dashboard/dist/assets/index-B-WkiNRN.js.map +0 -1
  328. package/dashboard/dist/assets/index-CItsikDw.js +0 -2
  329. package/dashboard/dist/assets/index-CStR4uIU.js +0 -2
  330. package/dashboard/dist/assets/index-DbTD-dio.js +0 -63
  331. package/dashboard/dist/assets/index-DbTD-dio.js.map +0 -1
  332. package/dashboard/dist/assets/index-DnlsDaAw.css +0 -1
  333. package/dashboard/dist/assets/index-kzIIeVbx.js +0 -5
  334. package/dashboard/dist/assets/index-kzIIeVbx.js.map +0 -1
  335. package/dashboard/dist/assets/index-nIrYejxe.js +0 -5
  336. package/dashboard/dist/assets/vendor-icons-D71XjkNy.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{u as n,b as t,c as u}from"./vendor-query-B2UbickB.js";import{d as s}from"./index-DbTD-dio.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-mCoyKuLZ.js.map
1
+ import{u as n,b as t,c as u}from"./vendor-query-RUZdMvN6.js";import{g as s}from"./index--DG-qQBT.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-C4V0rMkM.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflows-mCoyKuLZ.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
+ {"version":3,"file":"workflows-C4V0rMkM.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-B2UbickB.js";import{d as r}from"./index-DbTD-dio.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-CWxXGDpn.js.map
1
+ import{u as l,b as a,c as s}from"./vendor-query-RUZdMvN6.js";import{g as r}from"./index--DG-qQBT.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-D3PAiJ9d.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"yaml-workflows-CWxXGDpn.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":"qGAmBO,SAASA,EAAiBC,EAA+B,GAAI,CAClE,MAAMC,EAAS,IAAI,gBACnB,OAAID,EAAQ,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EACnDA,EAAQ,aAAaC,EAAO,IAAI,cAAeD,EAAQ,WAAW,EAClEA,EAAQ,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EACnDA,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,EAAmC,CACxC,SAAU,CAAC,gBAAiBF,CAAO,EACnC,QAAS,IAAMG,EAAS,mBAAmBF,CAAM,EAAE,CAAA,CACpD,CACH,CAEO,SAASG,GAAwB,CACtC,OAAOF,EAAgC,CACrC,SAAU,CAAC,oBAAoB,EAC/B,QAAS,IAAMC,EAAS,yBAAyB,CAAA,CAClD,CACH,CAcO,SAASE,EAAgBC,EAAY,CAC1C,OAAOJ,EAA+B,CACpC,SAAU,CAAC,gBAAiBI,CAAE,EAC9B,QAAS,IAAMH,EAAS,mBAAmBG,CAAE,EAAE,EAC/C,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAEO,SAASC,GAAwB,CACtC,MAAMC,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaC,GAWXR,EAA+B,kBAAmB,CAChD,OAAQ,OACR,KAAM,KAAK,UAAUQ,CAAK,CAAA,CAC3B,EACH,UAAW,IAAM,CACfH,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASI,GAAwB,CACtC,MAAMJ,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXH,EAA+B,mBAAmBG,CAAE,UAAW,CAC7D,OAAQ,MAAA,CACT,EACH,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASK,GAA0B,CACxC,MAAML,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXH,EAA+B,mBAAmBG,CAAE,YAAa,CAC/D,OAAQ,MAAA,CACT,EACH,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASM,GAAwB,CACtC,MAAMN,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CAAE,GAAAJ,EAAI,KAAAS,EAAM,KAAAC,EAAM,WAAAC,KAC7Bd,EAAgD,mBAAmBG,CAAE,UAAW,CAC9E,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,KAAAS,EAAM,KAAAC,EAAM,GAAIC,EAAa,CAAE,WAAAA,CAAA,EAAe,GAAK,CAAA,CAC3E,EACH,UAAW,IAAM,CACfT,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASU,GAA4B,CAC1C,MAAMV,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CAAE,GAAAJ,EAAI,WAAAa,EAAY,qBAAAC,KAC7BjB,EAA+B,mBAAmBG,CAAE,cAAe,CACjE,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,WAAAa,EAAY,qBAAAC,EAAsB,CAAA,CAC1D,EACH,UAAW,IAAM,CACfZ,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASa,GAAyB,CACvC,MAAMb,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXH,EAA+B,mBAAmBG,CAAE,WAAY,CAC9D,OAAQ,MAAA,CACT,EACH,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASc,GAAyB,CACvC,MAAMd,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXH,EAA+B,mBAAmBG,CAAE,WAAY,CAC9D,OAAQ,MAAA,CACT,EACH,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,EACjFA,EAAY,kBAAkB,CAAE,SAAU,CAAC,cAAc,EAAG,YAAa,MAAO,CAClF,CAAA,CACD,CACH,CAEO,SAASe,GAAwB,CACtC,MAAMf,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CAAE,GAAAJ,EAAI,GAAGkB,KACpBrB,EAA+B,mBAAmBG,CAAE,GAAI,CACtD,OAAQ,MACR,KAAM,KAAK,UAAUkB,CAAO,CAAA,CAC7B,EACH,UAAW,IAAM,CACfhB,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASiB,GAAwB,CACtC,MAAMjB,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXH,EAA+B,mBAAmBG,CAAE,GAAI,CACtD,OAAQ,QAAA,CACT,EACH,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAsCO,SAASkB,EAAwBpB,EAAY,CAClD,OAAOJ,EAA+D,CACpE,SAAU,CAAC,gBAAiBI,EAAI,UAAU,EAC1C,QAAS,IAAMH,EAAS,mBAAmBG,CAAE,WAAW,EACxD,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAEO,SAASqB,EAAuBrB,EAAYsB,EAAwB,CACzE,OAAO1B,EAAgC,CACrC,SAAU,CAAC,gBAAiBI,EAAI,WAAYsB,CAAO,EACnD,QAAS,IAAMzB,EAAS,mBAAmBG,CAAE,aAAasB,CAAO,EAAE,EACnE,QAAS,CAAC,CAACtB,GAAMsB,IAAY,IAAA,CAC9B,CACH"}
1
+ {"version":3,"file":"yaml-workflows-D3PAiJ9d.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":"qGAmBO,SAASA,EAAiBC,EAA+B,GAAI,CAClE,MAAMC,EAAS,IAAI,gBACnB,OAAID,EAAQ,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EACnDA,EAAQ,aAAaC,EAAO,IAAI,cAAeD,EAAQ,WAAW,EAClEA,EAAQ,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EACnDA,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,EAAmC,CACxC,SAAU,CAAC,gBAAiBF,CAAO,EACnC,QAAS,IAAMG,EAAS,mBAAmBF,CAAM,EAAE,CAAA,CACpD,CACH,CAEO,SAASG,GAAwB,CACtC,OAAOF,EAAgC,CACrC,SAAU,CAAC,oBAAoB,EAC/B,QAAS,IAAMC,EAAS,yBAAyB,CAAA,CAClD,CACH,CAcO,SAASE,EAAgBC,EAAY,CAC1C,OAAOJ,EAA+B,CACpC,SAAU,CAAC,gBAAiBI,CAAE,EAC9B,QAAS,IAAMH,EAAS,mBAAmBG,CAAE,EAAE,EAC/C,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAEO,SAASC,GAAwB,CACtC,MAAMC,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaC,GAWXR,EAA+B,kBAAmB,CAChD,OAAQ,OACR,KAAM,KAAK,UAAUQ,CAAK,CAAA,CAC3B,EACH,UAAW,IAAM,CACfH,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASI,GAAwB,CACtC,MAAMJ,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXH,EAA+B,mBAAmBG,CAAE,UAAW,CAC7D,OAAQ,MAAA,CACT,EACH,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASK,GAA0B,CACxC,MAAML,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXH,EAA+B,mBAAmBG,CAAE,YAAa,CAC/D,OAAQ,MAAA,CACT,EACH,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASM,GAAwB,CACtC,MAAMN,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CAAE,GAAAJ,EAAI,KAAAS,EAAM,KAAAC,EAAM,WAAAC,KAC7Bd,EAAgD,mBAAmBG,CAAE,UAAW,CAC9E,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,KAAAS,EAAM,KAAAC,EAAM,GAAIC,EAAa,CAAE,WAAAA,CAAA,EAAe,GAAK,CAAA,CAC3E,EACH,UAAW,IAAM,CACfT,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASU,GAA4B,CAC1C,MAAMV,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CAAE,GAAAJ,EAAI,WAAAa,EAAY,qBAAAC,KAC7BjB,EAA+B,mBAAmBG,CAAE,cAAe,CACjE,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,WAAAa,EAAY,qBAAAC,EAAsB,CAAA,CAC1D,EACH,UAAW,IAAM,CACfZ,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASa,GAAyB,CACvC,MAAMb,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXH,EAA+B,mBAAmBG,CAAE,WAAY,CAC9D,OAAQ,MAAA,CACT,EACH,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASc,GAAyB,CACvC,MAAMd,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXH,EAA+B,mBAAmBG,CAAE,WAAY,CAC9D,OAAQ,MAAA,CACT,EACH,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,EACjFA,EAAY,kBAAkB,CAAE,SAAU,CAAC,cAAc,EAAG,YAAa,MAAO,CAClF,CAAA,CACD,CACH,CAEO,SAASe,GAAwB,CACtC,MAAMf,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAY,CAAC,CAAE,GAAAJ,EAAI,GAAGkB,KACpBrB,EAA+B,mBAAmBG,CAAE,GAAI,CACtD,OAAQ,MACR,KAAM,KAAK,UAAUkB,CAAO,CAAA,CAC7B,EACH,UAAW,IAAM,CACfhB,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAEO,SAASiB,GAAwB,CACtC,MAAMjB,EAAcC,EAAA,EACpB,OAAOC,EAAY,CACjB,WAAaJ,GACXH,EAA+B,mBAAmBG,CAAE,GAAI,CACtD,OAAQ,QAAA,CACT,EACH,UAAW,IAAM,CACfE,EAAY,kBAAkB,CAAE,SAAU,CAAC,eAAe,EAAG,YAAa,MAAO,CACnF,CAAA,CACD,CACH,CAsCO,SAASkB,EAAwBpB,EAAY,CAClD,OAAOJ,EAA+D,CACpE,SAAU,CAAC,gBAAiBI,EAAI,UAAU,EAC1C,QAAS,IAAMH,EAAS,mBAAmBG,CAAE,WAAW,EACxD,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAEO,SAASqB,EAAuBrB,EAAYsB,EAAwB,CACzE,OAAO1B,EAAgC,CACrC,SAAU,CAAC,gBAAiBI,EAAI,WAAYsB,CAAO,EACnD,QAAS,IAAMzB,EAAS,mBAAmBG,CAAE,aAAasB,CAAO,EAAE,EACnE,QAAS,CAAC,CAACtB,GAAMsB,IAAY,IAAA,CAC9B,CACH"}
@@ -8,11 +8,11 @@
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-DbTD-dio.js"></script>
12
- <link rel="modulepreload" crossorigin href="./assets/vendor-query-B2UbickB.js">
13
- <link rel="modulepreload" crossorigin href="./assets/vendor-react-C1YOyCSV.js">
14
- <link rel="modulepreload" crossorigin href="./assets/vendor-icons-D71XjkNy.js">
15
- <link rel="stylesheet" crossorigin href="./assets/index-DnlsDaAw.css">
11
+ <script type="module" crossorigin src="./assets/index--DG-qQBT.js"></script>
12
+ <link rel="modulepreload" crossorigin href="./assets/vendor-query-RUZdMvN6.js">
13
+ <link rel="modulepreload" crossorigin href="./assets/vendor-react-CdqEC2zv.js">
14
+ <link rel="modulepreload" crossorigin href="./assets/vendor-icons-CN-bAo9U.js">
15
+ <link rel="stylesheet" crossorigin href="./assets/index-DnV6LSeY.css">
16
16
  </head>
17
17
  <body>
18
18
  <div id="root"></div>
@@ -24,9 +24,11 @@ swatches, and overlay scrims.
24
24
 
25
25
  Chroma is spent, not spread.
26
26
 
27
- - **Surfaces are near-neutral.** Hover fills, section bands, and borders
28
- carry only a whisper of the theme hue. Chroma never lands on a large
29
- rectangle — a colored slab makes every real accent invisible.
27
+ - **Surfaces are near-neutral; lines carry the hue.** Hover fills and section
28
+ bands stay a whisper off-neutral, but the thin structure — borders,
29
+ dividers, outlines, field rules — carries a clear, light tint of the accent
30
+ so the frame reads as thematic. Chroma never lands on a large rectangle — a
31
+ colored slab makes every real accent invisible — but a hairline may glow.
30
32
  - **One elevation logic, both polarities.** The page carries the base wash
31
33
  (a light theme tint by day, the deep shade at night); sections and sheets
32
34
  are distinct surfaces on it (white paper by day, the deeper well at
@@ -64,10 +66,10 @@ Chroma is spent, not spread.
64
66
 
65
67
  ## 4. Fields and controls
66
68
 
67
- - **One recipe** (`.field/.input/.select/.textarea`): white body, light
68
- neutral border, 3px radius (`--lt-radius-field`), border deepens to accent
69
- and fill takes the theme tint on focus. Every field-like control uses the
70
- recipe or the tokens — no bespoke field styling.
69
+ - **One recipe** (`.field/.input/.select/.textarea`): white body, a light
70
+ accent-tinted border, soft radius (`--lt-radius-field`), border deepens to
71
+ accent and fill takes the theme tint on focus. Every field-like control uses
72
+ the recipe or the tokens — no bespoke field styling.
71
73
  - **Width follows content, capped by the measure:**
72
74
  - Generated forms hold a readable measure (`max-w-form`, 56rem). A wide
73
75
  monitor gets margin, never a 2000px input.
@@ -227,7 +227,8 @@ A top-level form_schema token (a peer of `x-lt-help`) that keeps the resolve but
227
227
  "assigned": "me"
228
228
  },
229
229
  "mustBeEmpty": true,
230
- "message": "{{count}} item(s) still pending — pick them before closing the order."
230
+ "message": "{{count}} item(s) still pending — pick them before closing the order.",
231
+ "autoResolveWhenEmpty": true
231
232
  },
232
233
  "type": "object",
233
234
  "properties": { ... }
@@ -239,12 +240,15 @@ A top-level form_schema token (a peer of `x-lt-help`) that keeps the resolve but
239
240
  | `query` | `object` | Same shape as `x-lt-query` — including the `assigned` ownership scope; facet string values interpolate against the host escalation's context |
240
241
  | `mustBeEmpty` | `boolean` | The gate condition (default `true`) |
241
242
  | `message` | `string` | Shown beside the disabled submit; `{{count}}` carries the live row count, `{{domain.path}}` tokens also interpolate |
243
+ | `autoResolveWhenEmpty` | `boolean` | Auto-submit the claimed parent the moment the query is confirmed empty |
242
244
 
243
- The guard and an escalation-list embed declaring the same query resolve through one shared mapping — the count and the visible rows always agree, whatever the scope.
245
+ The guard and an escalation-list embed declaring the same query resolve through one shared mapping — the count and the visible rows always agree, whatever the scope. Pair it with an `escalation-list` embed on the same query so the operator sees exactly which rows are holding the gate.
244
246
 
245
- Pair it with an `escalation-list` embed on the same query so the operator sees exactly which rows are holding the gate.
247
+ **Only a confirmed empty read clears the gate** — a successful query returning zero rows. While it is loading, or on an error or a 403, the submit stays disabled: the gate opens only when it can prove there is nothing left.
246
248
 
247
- The guard is a UI layer: it makes the form honest, it does not enforce. A resolve arriving through the raw API bypasses it by design — the consuming workflow's own verification (reject and re-park with the remainder) is the durable backstop. Triage is never gated: when the guarded work itself is the problem, "Send to Triage" stays available.
249
+ **Enforced on both sides.** The dashboard disables the submit; for `enforce_schema` roles the API server runs the same query and rejects a resolve with a canonical `422` while it returns rows, so the rule holds through the raw API too. The server counts the true children regardless of the resolver's read scope, so a role that cannot see them can never falsely clear the gate. A surface with no resolving user (an MCP resolve of an `assigned:"me"` guard) and roles that do not `enforce_schema` fall back to the consuming workflow's own verification (reject and re-park with the remainder) as the durable backstop. Triage is never gated: when the guarded work itself is the problem, "Send to Triage" stays available.
250
+
251
+ **`autoResolveWhenEmpty`** closes the loop. With it set, the claimed parent submits itself the moment the query is confirmed empty — re-checked on page-load and after each inline child-resolve — so a person clears the children (resolving them in place via `x-lt-actions`) and the parent closes with no extra click. A parent launched from a list with [`x-lt-submit-on-claim`](./x-lt-footer.md) that carries a guard claims, shows its children, and auto-closes as they drain; if the parent has a [transition](./x-lt-transition.md), it then hands off to the follow-on. The parent's own form must still validate — an incomplete parent is left for the person rather than auto-closed.
248
252
 
249
253
  ---
250
254
 
@@ -0,0 +1,68 @@
1
+ # x-lt-footer — the escalation footer, configured
2
+
3
+ A role's versioned `form_schema` can, at its root, shape the standard escalation
4
+ footer: rename its action controls and fold claim-and-submit into one gesture.
5
+ Both tokens are opt-in top-level form tokens, siblings of
6
+ [`x-lt-transition`](./x-lt-transition.md) and `x-lt-submit-guard`
7
+ ([x-lt-embed.md](./x-lt-embed.md)).
8
+
9
+ ## Tokens (schema root)
10
+
11
+ | Token | Type | Meaning |
12
+ |-------|------|---------|
13
+ | `x-lt-submit-on-claim` | boolean | Claiming also resolves, submitting whatever the form holds. Defaults off. |
14
+ | `x-lt-labels` | object | Per-target overrides for the footer's action labels. |
15
+
16
+ ## `x-lt-labels` — configurable copy
17
+
18
+ An object whose keys are standard footer targets and whose values are the labels
19
+ to render in their place:
20
+
21
+ | Target | Default | Control |
22
+ |--------|---------|---------|
23
+ | `claim` | Claim | The claim button (unclaimed). |
24
+ | `cancel` | Cancel / Cancel escalation | The cancel control, both states. |
25
+ | `submit` | Submit / Acknowledge | The resolve button (claimed). |
26
+ | `escalate` | Escalate | The escalate tab and button. |
27
+ | `release` | Release | The release tab. |
28
+
29
+ ```jsonc
30
+ {
31
+ "type": "object",
32
+ "x-lt-labels": { "claim": "Claim and Submit", "submit": "Approve" },
33
+ "properties": { /* … */ }
34
+ }
35
+ ```
36
+
37
+ Only the five known targets are read; unknown keys and non-string values are
38
+ ignored. Any target the schema omits keeps its default, so a schema overrides
39
+ just the controls it cares about. The pending, triage, and confirmation states
40
+ ("Claiming…", "Send to Triage", "Yes, Release") keep their own copy.
41
+
42
+ ## `x-lt-submit-on-claim` — the one-gesture claim
43
+
44
+ When true, clicking Claim also resolves the escalation in the same gesture,
45
+ submitting the form's current values — its seeded defaults (metadata,
46
+ `formDefaults`, or schema `default`), or a restored draft. The person advances
47
+ the work item with a single click; there is no second Submit step.
48
+
49
+ ```jsonc
50
+ {
51
+ "type": "object",
52
+ "x-lt-submit-on-claim": true,
53
+ "x-lt-labels": { "claim": "Claim and Submit" },
54
+ "properties": {
55
+ "approved": { "type": "boolean", "default": true }
56
+ }
57
+ }
58
+ ```
59
+
60
+ Claim and resolve are distinct operations — the server accepts a resolve only
61
+ from the claimant — so they run in sequence: claim, then resolve. If the seeded
62
+ defaults fail validation the claim still stands and the page drops into the
63
+ normal claimed state with the field errors in the side panel, so the person
64
+ completes the form by hand. Pair it with `x-lt-labels.claim` so the button reads
65
+ honestly ("Claim and Submit").
66
+
67
+ Use it when the standard outcome needs only a confirmation — the defaults are
68
+ the answer, and claiming is the decision.
@@ -31,9 +31,10 @@ Every layout carries a persistent action button — the active card's CTA, a tra
31
31
 
32
32
  ```jsonc
33
33
  "x-lt-row-action": {
34
- "action": "claim", // "claim" | "view" — default "claim"
35
- "label": "Service", // button text; defaults "Claim" / "View"
36
- "durationMinutes": 60 // claim hold time; default 30
34
+ "action": "claim", // "claim" | "view" — default "claim"
35
+ "label": "Service", // button text; defaults "Claim" / "View"
36
+ "durationMinutes": 60, // claim hold time; default 30
37
+ "submitOnClaim": true // claim AND submit, then transition on (see below)
37
38
  }
38
39
  ```
39
40
 
@@ -41,6 +42,12 @@ Every layout carries a persistent action button — the active card's CTA, a tra
41
42
 
42
43
  On My Escalations (`/escalations/queue`) every row is already held by the viewer, so a `claim` template renders as a View action there: the button opens the detail page with the default "View" label. Authored `view` actions keep their label.
43
44
 
45
+ ### Start from the list — `submitOnClaim`
46
+
47
+ `submitOnClaim: true` turns the row action into a one-gesture start: the row is claimed and its form's seeded defaults are submitted, then — when the resolve spawns a follow-on born assigned to the person — the wait screen bridges to it. A "Start Harvesting" button on the list claims, submits, and lands the person on the next step, no detail-page stop in between.
48
+
49
+ The behavior itself lives on the form: the claim-and-submit and the hand-off are the form schema's [`x-lt-submit-on-claim`](./x-lt-footer.md) and [`x-lt-transition`](./x-lt-transition.md). The list action only launches that flow with the authored claim duration — so one role owns the outcome and the list template just points to it. If the seeded defaults fail validation the claim still lands and the person finishes on the detail page. Applies to claimable rows; on My Escalations the row already belongs to the viewer, so it opens as a View.
50
+
44
51
  ---
45
52
 
46
53
  ## Layouts
@@ -0,0 +1,105 @@
1
+ # x-lt-transition — the post-submit hand-off
2
+
3
+ A role's versioned `form_schema` can declare, at its root, that submitting one of
4
+ its escalations should pause on a friendly wait screen instead of returning to
5
+ the list — because a follow-on escalation is about to be handed to the same
6
+ person. The result feels like a multi-page form: submit, a brief "one moment…",
7
+ then the next step opens automatically.
8
+
9
+ ## Tokens (schema root)
10
+
11
+ | Token | Type | Meaning |
12
+ |-------|------|---------|
13
+ | `x-lt-transition` | boolean | Opt in to the wait screen after a successful resolve. |
14
+ | `x-lt-transition-message` | markdown | Shown on the wait screen. Defaults to a generic "preparing your next step" line. |
15
+ | `x-lt-transition-max-wait-seconds` | number | How long to wait for the follow-on before the fallback runs. Clamped to 5–300; defaults to 30. |
16
+ | `x-lt-transition-done` | href template | Where to go when the step ends without a further hand-off (see below). Independent of `x-lt-transition`. |
17
+
18
+ ```jsonc
19
+ {
20
+ "type": "object",
21
+ "x-lt-transition": true,
22
+ "x-lt-transition-message": "**Account saved.**\n\nSetting up your preferences…",
23
+ "x-lt-transition-max-wait-seconds": 20,
24
+ "properties": { /* … */ }
25
+ }
26
+ ```
27
+
28
+ These tokens control **only the UX**. They carry no navigation target — the
29
+ schema never names the next escalation.
30
+
31
+ ## How navigation happens
32
+
33
+ The follow-on is created **born assigned** to the submitter in a single atomic
34
+ commit, using the HotMesh `condition({ assignee, durationMinutes, parentId })`
35
+ primitive:
36
+
37
+ ```ts
38
+ const step1 = await conditionLT<Step1 & { $resolution?: EscalationResolution }>(sig1, {
39
+ role: STEP1_ROLE, /* … */ schemaVersion: 1,
40
+ });
41
+ const owner = step1.$resolution?.resolvedBy; // who resolved step 1
42
+ const parent = step1.$resolution?.escalationId; // step 1's id — the correlation key
43
+
44
+ await conditionLT<Step2>(sig2, {
45
+ role: STEP2_ROLE,
46
+ assignee: owner, // born assigned — no create-then-claim race
47
+ durationMinutes: 30, // a hard claim, so it stays with the owner
48
+ parentId: parent, // the escalation the owner is on when they submit
49
+ schemaVersion: 1,
50
+ });
51
+ ```
52
+
53
+ The engine emits a `claimed` event for the born-assigned row carrying, in a
54
+ single definitive statement:
55
+
56
+ - `data.assigned_to` — who it went to,
57
+ - `data.parent_id` — the escalation it descends from,
58
+ - `assigned_at_creation: true` — that this was a directed, system-issued
59
+ assignment, not an interactive claim.
60
+
61
+ The dashboard navigates only when all three line up with the viewer and the page
62
+ they are on: `assigned_to === me`, `parent_id ===` the escalation on screen, and
63
+ `assigned_at_creation === true`. An unrelated assignment or a claim the viewer
64
+ made themselves can never redirect them.
65
+
66
+ `durationMinutes` matters: an `assignee` with no window is a soft routing hint
67
+ that others may still claim, so a directed hand-off arms a claim window to keep
68
+ the follow-on with its owner.
69
+
70
+ ## Where "done" goes — `x-lt-transition-done`
71
+
72
+ A step reached via a forward transition can't rely on `history.back()` — there is
73
+ no meaningful "back". So a terminal step (or any form) can declare where to go on
74
+ submit:
75
+
76
+ ```jsonc
77
+ { "x-lt-transition-done": "/escalations/available?role=onboarding-step-1" }
78
+ ```
79
+
80
+ The value is an href template with the same `{{domain.path}}` interpolation and
81
+ routing rules as [`x-lt-href`](./x-lt-embed.md): an internal path navigates in-app,
82
+ anything else opens externally. It can be a plain page or a **rich faceted
83
+ worklist** URL (facets, role, assignment) — e.g. drop the operator onto the queue
84
+ of items still waiting. It is purely client-side: no server call, no event.
85
+
86
+ Resolution order on submit: `x-lt-transition` (wait for the hand-off) →
87
+ `x-lt-transition-done` (go to the declared destination) → `history.back()`. On a
88
+ transition step, `x-lt-transition-done` is also where the wait lands if the
89
+ follow-on never arrives.
90
+
91
+ ## If the live event is missed
92
+
93
+ Event delivery is at-most-once: a crash between the commit and the publish drops
94
+ the event. When the wait exceeds `x-lt-transition-max-wait-seconds`, the page
95
+ runs a precise fallback — the child of this escalation assigned to the viewer
96
+ (`parent_id` + `assigned_to`) — and lands on it if present; otherwise it returns
97
+ to the list.
98
+
99
+ ## Reference
100
+
101
+ The `transition-chain` example workflow (`examples/workflows/transition-chain`)
102
+ is a three-step onboarding wizard: step 1 is open to the pool, and steps 2 and 3
103
+ are born assigned to the owner. Steps 1 and 2 opt into the hand-off; step 3 is
104
+ terminal. See also `x-lt-submit-guard` in [x-lt-embed.md](./x-lt-embed.md) for
105
+ the sibling top-level form token.
@@ -20,6 +20,8 @@ This works because the form is data: a JSON Schema stored on the role, versioned
20
20
  | Sections, columns, ordering, side-panel help | Layout keywords | [x-lt-layout.md](hitl/x-lt-layout.md) |
21
21
  | Runtime-driven items, files, signatures, SOP blocks | Widgets | [x-lt-widget.md](hitl/x-lt-widget.md) |
22
22
  | A role-authored list page — document views, facet tables, entity card boards | List schema | [x-lt-list-schema.md](hitl/x-lt-list-schema.md) |
23
+ | Rename the resolve footer, or claim-and-submit in one gesture | Footer tokens | [x-lt-footer.md](hitl/x-lt-footer.md) |
24
+ | Block the resolve until embedded work drains, then auto-close when it does | `x-lt-submit-guard` | [x-lt-embed.md](hitl/x-lt-embed.md) |
23
25
  | A fully custom UI nothing above can express | Iframe viewport | [iframe.md](hitl/iframe.md) |
24
26
 
25
27
  ---
@@ -84,6 +86,8 @@ Ordered as a learning path — each file adds one capability to the same form:
84
86
  | Layout, ordering, sections, binding, help panel | [x-lt-layout.md](hitl/x-lt-layout.md) |
85
87
  | Custom widgets (checklist, file upload, code editor, signature, markdown) | [x-lt-widget.md](hitl/x-lt-widget.md) |
86
88
  | List schema (`active-history`, `active`, `facet-table`, `facet-board` cards) | [x-lt-list-schema.md](hitl/x-lt-list-schema.md) |
89
+ | Embedded widgets (`link`, `escalation`, `escalation-list`) and the submit guard | [x-lt-embed.md](hitl/x-lt-embed.md) |
90
+ | Footer labels, claim-and-submit, and the list-driven "start" action | [x-lt-footer.md](hitl/x-lt-footer.md) |
87
91
  | Iframe viewport protocol | [iframe.md](hitl/iframe.md) |
88
92
  | Claim lifecycle, resolving from system code, outcome recording, cancellation | [resolution.md](hitl/resolution.md) |
89
93
  | Role routing, RBAC, scope, chains | [roles.md](hitl/roles.md) |
@@ -118,7 +122,12 @@ Ordered as a learning path — each file adds one capability to the same form:
118
122
  | `x-lt-help` | schema | Markdown guidance for the side panel's Help view |
119
123
  | `x-lt-context` | schema | Plain-text fallback for the Help view when `x-lt-help` is absent |
120
124
  | `x-lt-viewport` | schema | Replace the generated form with a custom iframe UI |
125
+ | `x-lt-submit-guard` | schema | Block the resolve while an embedded escalation query returns rows; `autoResolveWhenEmpty` auto-closes the claimed parent once it drains. Enforced isomorphically for `enforce_schema` roles |
126
+ | `x-lt-submit-on-claim` | schema | Claiming also resolves the form's seeded defaults in one gesture |
127
+ | `x-lt-labels` | schema | Per-target labels for the footer controls (`claim`, `cancel`, `submit`, `escalate`, `release`) |
128
+ | `x-lt-transition` | schema | Pause on a wait screen after resolve and hand off to the born-assigned follow-on |
121
129
  | `x-lt-columns` | schema (list) | Column definitions for `facet-table` layout |
130
+ | `x-lt-row-action` | schema (list) | Per-row list action: `claim` / `view`, or `submitOnClaim` to claim, submit, and transition straight from the list |
122
131
  | `x-lt-active` | schema (list) | Active-item card definition |
123
132
  | `x-lt-history` | schema (list) | History column definition |
124
133
  | `format` | field | Input specialization: `password`, `date`, `date-time`, `email`, `uri`, `textarea` |