@hotmeshio/long-tail 0.10.10 → 0.10.13

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 (322) hide show
  1. package/build/api/escalations/list.d.ts +1 -0
  2. package/build/api/escalations/list.js +12 -4
  3. package/build/api/escalations/metadata.d.ts +11 -0
  4. package/build/api/escalations/metadata.js +27 -7
  5. package/build/api/roles.d.ts +2 -0
  6. package/build/api/roles.js +4 -0
  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/025_ops_home_default.sql +11 -0
  14. package/build/lib/db/schemas/026_scan_codes.sql +51 -0
  15. package/build/lib/db/schemas/027_scan_codes_reindex.sql +23 -0
  16. package/build/lib/events/system-events.js +4 -0
  17. package/build/modules/features.d.ts +17 -0
  18. package/build/modules/features.js +2 -0
  19. package/build/routes/escalations/list.js +1 -0
  20. package/build/routes/index.js +2 -0
  21. package/build/routes/scan-codes.d.ts +2 -0
  22. package/build/routes/scan-codes.js +138 -0
  23. package/build/sdk/index.d.ts +4 -0
  24. package/build/services/escalation/crud.d.ts +1 -1
  25. package/build/services/escalation/crud.js +4 -2
  26. package/build/services/escalation/queries.d.ts +1 -0
  27. package/build/services/escalation/queries.js +2 -0
  28. package/build/services/escalation/sql.d.ts +11 -6
  29. package/build/services/escalation/sql.js +20 -20
  30. package/build/services/role/index.js +1 -0
  31. package/build/services/role/sql.d.ts +6 -2
  32. package/build/services/role/sql.js +11 -2
  33. package/build/services/role/types.d.ts +9 -0
  34. package/build/services/scan-code/index.d.ts +4 -0
  35. package/build/services/scan-code/index.js +21 -0
  36. package/build/services/scan-code/parse.d.ts +35 -0
  37. package/build/services/scan-code/parse.js +108 -0
  38. package/build/services/scan-code/read.d.ts +5 -0
  39. package/build/services/scan-code/read.js +50 -0
  40. package/build/services/scan-code/sql.d.ts +10 -0
  41. package/build/services/scan-code/sql.js +57 -0
  42. package/build/services/scan-code/validate.d.ts +12 -0
  43. package/build/services/scan-code/validate.js +78 -0
  44. package/build/services/scan-code/write.d.ts +26 -0
  45. package/build/services/scan-code/write.js +71 -0
  46. package/build/shared/form-validation/index.d.ts +1 -0
  47. package/build/shared/form-validation/index.js +1 -0
  48. package/build/shared/form-validation/x-lt-transition.d.ts +47 -0
  49. package/build/shared/form-validation/x-lt-transition.js +65 -0
  50. package/build/system/mcp-servers/admin/index.d.ts +1 -0
  51. package/build/system/mcp-servers/admin/index.js +5 -2
  52. package/build/system/mcp-servers/admin/scan-codes.d.ts +10 -0
  53. package/build/system/mcp-servers/admin/scan-codes.js +111 -0
  54. package/build/system/mcp-servers/admin/schemas.d.ts +235 -14
  55. package/build/system/mcp-servers/admin/schemas.js +51 -0
  56. package/build/system/mcp-servers/admin/users.js +1 -0
  57. package/build/system/seed/tool-manifests-admin.d.ts +1462 -0
  58. package/build/system/seed/tool-manifests-admin.js +7 -1
  59. package/build/tsconfig.tsbuildinfo +1 -1
  60. package/build/types/events.d.ts +9 -0
  61. package/build/types/index.d.ts +2 -0
  62. package/build/types/index.js +10 -1
  63. package/build/types/scan-code.d.ts +183 -0
  64. package/build/types/scan-code.js +80 -0
  65. package/build/types/startup.d.ts +14 -0
  66. package/dashboard/dist/assets/{AdminDashboard-cGYuppUP.js → AdminDashboard-Bv3pHBzn.js} +2 -2
  67. package/dashboard/dist/assets/{AdminDashboard-cGYuppUP.js.map → AdminDashboard-Bv3pHBzn.js.map} +1 -1
  68. package/dashboard/dist/assets/{AgentConfigPage-DwaUyoCy.js → AgentConfigPage-Dk2zlvDb.js} +6 -6
  69. package/dashboard/dist/assets/{AgentConfigPage-DwaUyoCy.js.map → AgentConfigPage-Dk2zlvDb.js.map} +1 -1
  70. package/dashboard/dist/assets/{AgentDetailPage-DxpFaltM.js → AgentDetailPage-DUno6EGs.js} +2 -2
  71. package/dashboard/dist/assets/{AgentDetailPage-DxpFaltM.js.map → AgentDetailPage-DUno6EGs.js.map} +1 -1
  72. package/dashboard/dist/assets/{AgentsPage-ByOoA8oT.js → AgentsPage-CToVu1qj.js} +2 -2
  73. package/dashboard/dist/assets/{AgentsPage-ByOoA8oT.js.map → AgentsPage-CToVu1qj.js.map} +1 -1
  74. package/dashboard/dist/assets/{AutoGrowTextarea-y-oNY51_.js → AutoGrowTextarea-DgEQeRQw.js} +2 -2
  75. package/dashboard/dist/assets/{AutoGrowTextarea-y-oNY51_.js.map → AutoGrowTextarea-DgEQeRQw.js.map} +1 -1
  76. package/dashboard/dist/assets/AvailableEscalationsPage-DldboL4W.js +2 -0
  77. package/dashboard/dist/assets/AvailableEscalationsPage-DldboL4W.js.map +1 -0
  78. package/dashboard/dist/assets/BotPicker-DQOpVB4M.js +2 -0
  79. package/dashboard/dist/assets/{BotPicker-Dohv8dhR.js.map → BotPicker-DQOpVB4M.js.map} +1 -1
  80. package/dashboard/dist/assets/{CapabilitiesPage-DeijFG3J.js → CapabilitiesPage-Dmf46PUJ.js} +2 -2
  81. package/dashboard/dist/assets/{CapabilitiesPage-DeijFG3J.js.map → CapabilitiesPage-Dmf46PUJ.js.map} +1 -1
  82. package/dashboard/dist/assets/{CollapsibleSection-BPNwS4eO.js → CollapsibleSection-CDADefUY.js} +2 -2
  83. package/dashboard/dist/assets/{CollapsibleSection-BPNwS4eO.js.map → CollapsibleSection-CDADefUY.js.map} +1 -1
  84. package/dashboard/dist/assets/{ConfirmDeleteModal-DD7SEMeX.js → ConfirmDeleteModal-CQsJUzEa.js} +2 -2
  85. package/dashboard/dist/assets/{ConfirmDeleteModal-DD7SEMeX.js.map → ConfirmDeleteModal-CQsJUzEa.js.map} +1 -1
  86. package/dashboard/dist/assets/{CopyableId-BpB-NvDh.js → CopyableId-4Lqlc5cU.js} +2 -2
  87. package/dashboard/dist/assets/{CopyableId-BpB-NvDh.js.map → CopyableId-4Lqlc5cU.js.map} +1 -1
  88. package/dashboard/dist/assets/CountdownTimer-DPjIkerB.js +2 -0
  89. package/dashboard/dist/assets/{CountdownTimer-BF71ldGF.js.map → CountdownTimer-DPjIkerB.js.map} +1 -1
  90. package/dashboard/dist/assets/{CredentialsPage-oeNmMzTM.js → CredentialsPage-8LIEvomi.js} +2 -2
  91. package/dashboard/dist/assets/{CredentialsPage-oeNmMzTM.js.map → CredentialsPage-8LIEvomi.js.map} +1 -1
  92. package/dashboard/dist/assets/{CronLabel-CebR1m2k.js → CronLabel-CK3WSsM5.js} +2 -2
  93. package/dashboard/dist/assets/{CronLabel-CebR1m2k.js.map → CronLabel-CK3WSsM5.js.map} +1 -1
  94. package/dashboard/dist/assets/{CustomDurationPicker-Bh9QdBVw.js → CustomDurationPicker-FPmlA6cE.js} +2 -2
  95. package/dashboard/dist/assets/{CustomDurationPicker-Bh9QdBVw.js.map → CustomDurationPicker-FPmlA6cE.js.map} +1 -1
  96. package/dashboard/dist/assets/{DataTable-BTu2AaEl.js → DataTable-Bir0Xs1p.js} +2 -2
  97. package/dashboard/dist/assets/{DataTable-BTu2AaEl.js.map → DataTable-Bir0Xs1p.js.map} +1 -1
  98. package/dashboard/dist/assets/{DropZone-Bavzt2QR.js → DropZone-CL9gA7pu.js} +2 -2
  99. package/dashboard/dist/assets/{DropZone-Bavzt2QR.js.map → DropZone-CL9gA7pu.js.map} +1 -1
  100. package/dashboard/dist/assets/{ElapsedCell-Caa6CU_y.js → ElapsedCell-BZVkVxE0.js} +2 -2
  101. package/dashboard/dist/assets/{ElapsedCell-Caa6CU_y.js.map → ElapsedCell-BZVkVxE0.js.map} +1 -1
  102. package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js → EmptyState-lpUFYfun.js} +2 -2
  103. package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js.map → EmptyState-lpUFYfun.js.map} +1 -1
  104. package/dashboard/dist/assets/{EscalationListSchemaPage-CAGfq0eK.js → EscalationListSchemaPage-kYLdUtZX.js} +3 -3
  105. package/dashboard/dist/assets/{EscalationListSchemaPage-CAGfq0eK.js.map → EscalationListSchemaPage-kYLdUtZX.js.map} +1 -1
  106. package/dashboard/dist/assets/{EscalationSchemaPage-qDD4ur6P.js → EscalationSchemaPage-kUmCDivo.js} +3 -3
  107. package/dashboard/dist/assets/{EscalationSchemaPage-qDD4ur6P.js.map → EscalationSchemaPage-kUmCDivo.js.map} +1 -1
  108. package/dashboard/dist/assets/{EscalationsOverview-CC1wRTzy.js → EscalationsOverview-D17auO-m.js} +2 -2
  109. package/dashboard/dist/assets/{EscalationsOverview-CC1wRTzy.js.map → EscalationsOverview-D17auO-m.js.map} +1 -1
  110. package/dashboard/dist/assets/{EventTable-4JeTcXr_.js → EventTable-CwPWl163.js} +2 -2
  111. package/dashboard/dist/assets/{EventTable-4JeTcXr_.js.map → EventTable-CwPWl163.js.map} +1 -1
  112. package/dashboard/dist/assets/{FilterBar-BOV8DWIO.js → FilterBar-D7GghUsU.js} +2 -2
  113. package/dashboard/dist/assets/{FilterBar-BOV8DWIO.js.map → FilterBar-D7GghUsU.js.map} +1 -1
  114. package/dashboard/dist/assets/{GraphInvokePage-C0i1speW.js → GraphInvokePage-D11uOnZi.js} +2 -2
  115. package/dashboard/dist/assets/{GraphInvokePage-C0i1speW.js.map → GraphInvokePage-D11uOnZi.js.map} +1 -1
  116. package/dashboard/dist/assets/HomePage-Bcq10Bxx.js +2 -0
  117. package/dashboard/dist/assets/HomePage-Bcq10Bxx.js.map +1 -0
  118. package/dashboard/dist/assets/ListToolbar-IPXsTb3Q.js +2 -0
  119. package/dashboard/dist/assets/ListToolbar-IPXsTb3Q.js.map +1 -0
  120. package/dashboard/dist/assets/{McpOverview-Chn2zIXr.js → McpOverview-Dx2j0KkF.js} +2 -2
  121. package/dashboard/dist/assets/{McpOverview-Chn2zIXr.js.map → McpOverview-Dx2j0KkF.js.map} +1 -1
  122. package/dashboard/dist/assets/{McpQueryDetailPage-Cv1FKrvw.js → McpQueryDetailPage-CzF_bna8.js} +3 -3
  123. package/dashboard/dist/assets/{McpQueryDetailPage-Cv1FKrvw.js.map → McpQueryDetailPage-CzF_bna8.js.map} +1 -1
  124. package/dashboard/dist/assets/{McpQueryPage-Dzn8JE4E.js → McpQueryPage-CNsuiw_q.js} +2 -2
  125. package/dashboard/dist/assets/{McpQueryPage-Dzn8JE4E.js.map → McpQueryPage-CNsuiw_q.js.map} +1 -1
  126. package/dashboard/dist/assets/{McpRunDetailPage-CuNtR4Ed.js → McpRunDetailPage-BJguEMS0.js} +2 -2
  127. package/dashboard/dist/assets/{McpRunDetailPage-CuNtR4Ed.js.map → McpRunDetailPage-BJguEMS0.js.map} +1 -1
  128. package/dashboard/dist/assets/{McpRunsPage-C8iifeKN.js → McpRunsPage-CK96s3Nt.js} +2 -2
  129. package/dashboard/dist/assets/{McpRunsPage-C8iifeKN.js.map → McpRunsPage-CK96s3Nt.js.map} +1 -1
  130. package/dashboard/dist/assets/{Modal-CA2Iv02H.js → Modal-BU7No9NH.js} +2 -2
  131. package/dashboard/dist/assets/{Modal-CA2Iv02H.js.map → Modal-BU7No9NH.js.map} +1 -1
  132. package/dashboard/dist/assets/{NamespacePill-ep9Zmokr.js → NamespacePill-B9Vc_Pz2.js} +2 -2
  133. package/dashboard/dist/assets/{NamespacePill-ep9Zmokr.js.map → NamespacePill-B9Vc_Pz2.js.map} +1 -1
  134. package/dashboard/dist/assets/OperationsPage-DvWrLuH6.js +2 -0
  135. package/dashboard/dist/assets/OperationsPage-DvWrLuH6.js.map +1 -0
  136. package/dashboard/dist/assets/OperatorDashboard-C-jE0IRA.js +2 -0
  137. package/dashboard/dist/assets/OperatorDashboard-C-jE0IRA.js.map +1 -0
  138. package/dashboard/dist/assets/{PageHeader-Bw8RNkqR.js → PageHeader-Ce4GcIYo.js} +2 -2
  139. package/dashboard/dist/assets/{PageHeader-Bw8RNkqR.js.map → PageHeader-Ce4GcIYo.js.map} +1 -1
  140. package/dashboard/dist/assets/{PageHeaderWithStats-NR_4idn6.js → PageHeaderWithStats-Ck0KZvXD.js} +2 -2
  141. package/dashboard/dist/assets/{PageHeaderWithStats-NR_4idn6.js.map → PageHeaderWithStats-Ck0KZvXD.js.map} +1 -1
  142. package/dashboard/dist/assets/{PersonaDetailPage-DKILoUqL.js → PersonaDetailPage-CJ6jqo7h.js} +2 -2
  143. package/dashboard/dist/assets/{PersonaDetailPage-DKILoUqL.js.map → PersonaDetailPage-CJ6jqo7h.js.map} +1 -1
  144. package/dashboard/dist/assets/{PersonasPage-qvzHTrFw.js → PersonasPage-D8hL3kL5.js} +2 -2
  145. package/dashboard/dist/assets/{PersonasPage-qvzHTrFw.js.map → PersonasPage-D8hL3kL5.js.map} +1 -1
  146. package/dashboard/dist/assets/{PriorityBadge-CCERr9vQ.js → PriorityBadge-BETdj4M-.js} +2 -2
  147. package/dashboard/dist/assets/{PriorityBadge-CCERr9vQ.js.map → PriorityBadge-BETdj4M-.js.map} +1 -1
  148. package/dashboard/dist/assets/{ProcessDetailPage-C3LfeKvi.js → ProcessDetailPage-Vnx8Z5_y.js} +2 -2
  149. package/dashboard/dist/assets/{ProcessDetailPage-C3LfeKvi.js.map → ProcessDetailPage-Vnx8Z5_y.js.map} +1 -1
  150. package/dashboard/dist/assets/{ProcessesListPage-OoZ_u4ty.js → ProcessesListPage-DRYtvS3N.js} +2 -2
  151. package/dashboard/dist/assets/{ProcessesListPage-OoZ_u4ty.js.map → ProcessesListPage-DRYtvS3N.js.map} +1 -1
  152. package/dashboard/dist/assets/RoleDetailPage-BKkUvTO-.js +8 -0
  153. package/dashboard/dist/assets/RoleDetailPage-BKkUvTO-.js.map +1 -0
  154. package/dashboard/dist/assets/{RolePill-TySZq7dB.js → RolePill-CnuBPhPw.js} +2 -2
  155. package/dashboard/dist/assets/{RolePill-TySZq7dB.js.map → RolePill-CnuBPhPw.js.map} +1 -1
  156. package/dashboard/dist/assets/RolesPage-BHzWK9n6.js +2 -0
  157. package/dashboard/dist/assets/{RolesPage-CNueMVuJ.js.map → RolesPage-BHzWK9n6.js.map} +1 -1
  158. package/dashboard/dist/assets/{RowActions-BA9L9djf.js → RowActions-eYrzgQSj.js} +2 -2
  159. package/dashboard/dist/assets/{RowActions-BA9L9djf.js.map → RowActions-eYrzgQSj.js.map} +1 -1
  160. package/dashboard/dist/assets/{RunAsSelector-CwWEpiSF.js → RunAsSelector-CS3KQ-BF.js} +2 -2
  161. package/dashboard/dist/assets/{RunAsSelector-CwWEpiSF.js.map → RunAsSelector-CS3KQ-BF.js.map} +1 -1
  162. package/dashboard/dist/assets/ScanCodesPage-BW4P4zWf.js +2 -0
  163. package/dashboard/dist/assets/ScanCodesPage-BW4P4zWf.js.map +1 -0
  164. package/dashboard/dist/assets/ScanSchemeDetailPage-BLykA4j-.js +2 -0
  165. package/dashboard/dist/assets/ScanSchemeDetailPage-BLykA4j-.js.map +1 -0
  166. package/dashboard/dist/assets/{ScopeBadge-C7Uixtmk.js → ScopeBadge-BUpYpS3x.js} +2 -2
  167. package/dashboard/dist/assets/{ScopeBadge-C7Uixtmk.js.map → ScopeBadge-BUpYpS3x.js.map} +1 -1
  168. package/dashboard/dist/assets/{StatCard-Ca-ngCaD.js → StatCard-BXQ8dD9Y.js} +2 -2
  169. package/dashboard/dist/assets/{StatCard-Ca-ngCaD.js.map → StatCard-BXQ8dD9Y.js.map} +1 -1
  170. package/dashboard/dist/assets/{StatusBadge-BwUvykDo.js → StatusBadge-DkgllZHv.js} +2 -2
  171. package/dashboard/dist/assets/{StatusBadge-BwUvykDo.js.map → StatusBadge-DkgllZHv.js.map} +1 -1
  172. package/dashboard/dist/assets/{StickyPagination-DvIF3kQK.js → StickyPagination-hMrnLXde.js} +2 -2
  173. package/dashboard/dist/assets/{StickyPagination-DvIF3kQK.js.map → StickyPagination-hMrnLXde.js.map} +1 -1
  174. package/dashboard/dist/assets/{StreamMessageDetail-DkFK_XGD.js → StreamMessageDetail-DyJyZwBl.js} +2 -2
  175. package/dashboard/dist/assets/{StreamMessageDetail-DkFK_XGD.js.map → StreamMessageDetail-DyJyZwBl.js.map} +1 -1
  176. package/dashboard/dist/assets/{SwimlaneTimeline-CMw-Et6h.js → SwimlaneTimeline-BlzV74V5.js} +2 -2
  177. package/dashboard/dist/assets/{SwimlaneTimeline-CMw-Et6h.js.map → SwimlaneTimeline-BlzV74V5.js.map} +1 -1
  178. package/dashboard/dist/assets/{TagInput-D8gSp48D.js → TagInput-BbZ25nNe.js} +2 -2
  179. package/dashboard/dist/assets/{TagInput-D8gSp48D.js.map → TagInput-BbZ25nNe.js.map} +1 -1
  180. package/dashboard/dist/assets/{TaskDetailPage-BhXuChOf.js → TaskDetailPage-B0p_Z4J_.js} +2 -2
  181. package/dashboard/dist/assets/{TaskDetailPage-BhXuChOf.js.map → TaskDetailPage-B0p_Z4J_.js.map} +1 -1
  182. package/dashboard/dist/assets/{TaskQueuePill-CHqolBmU.js → TaskQueuePill-D0QKBrN3.js} +2 -2
  183. package/dashboard/dist/assets/{TaskQueuePill-CHqolBmU.js.map → TaskQueuePill-D0QKBrN3.js.map} +1 -1
  184. package/dashboard/dist/assets/{TasksListPage-6JHQQ5QZ.js → TasksListPage-CiGR2QiQ.js} +2 -2
  185. package/dashboard/dist/assets/{TasksListPage-6JHQQ5QZ.js.map → TasksListPage-CiGR2QiQ.js.map} +1 -1
  186. package/dashboard/dist/assets/TimeAgo-D_DA9ucC.js +2 -0
  187. package/dashboard/dist/assets/{TimeAgo-CInx-vzY.js.map → TimeAgo-D_DA9ucC.js.map} +1 -1
  188. package/dashboard/dist/assets/{TimestampCell-Fq17Zrsu.js → TimestampCell-C7rkC9nh.js} +2 -2
  189. package/dashboard/dist/assets/{TimestampCell-Fq17Zrsu.js.map → TimestampCell-C7rkC9nh.js.map} +1 -1
  190. package/dashboard/dist/assets/{ToolPill-BbgMDhaE.js → ToolPill-8xY9rkoc.js} +2 -2
  191. package/dashboard/dist/assets/{ToolPill-BbgMDhaE.js.map → ToolPill-8xY9rkoc.js.map} +1 -1
  192. package/dashboard/dist/assets/{ToolTestPanel-DhjEe59s.js → ToolTestPanel-E8efYGYs.js} +2 -2
  193. package/dashboard/dist/assets/{ToolTestPanel-DhjEe59s.js.map → ToolTestPanel-E8efYGYs.js.map} +1 -1
  194. package/dashboard/dist/assets/{TopicDetailPage-DbIdmQpQ.js → TopicDetailPage-B455XrRc.js} +3 -3
  195. package/dashboard/dist/assets/{TopicDetailPage-DbIdmQpQ.js.map → TopicDetailPage-B455XrRc.js.map} +1 -1
  196. package/dashboard/dist/assets/{TopicsPage-CAP-GUbr.js → TopicsPage-1VAc29Qw.js} +2 -2
  197. package/dashboard/dist/assets/{TopicsPage-CAP-GUbr.js.map → TopicsPage-1VAc29Qw.js.map} +1 -1
  198. package/dashboard/dist/assets/UserName-DikzjQHJ.js +2 -0
  199. package/dashboard/dist/assets/{UserName-DggcLkSc.js.map → UserName-DikzjQHJ.js.map} +1 -1
  200. package/dashboard/dist/assets/{WorkflowExecutionPage-Bmra5fVt.js → WorkflowExecutionPage-C15GSAoe.js} +2 -2
  201. package/dashboard/dist/assets/{WorkflowExecutionPage-Bmra5fVt.js.map → WorkflowExecutionPage-C15GSAoe.js.map} +1 -1
  202. package/dashboard/dist/assets/{WorkflowPill-CcUUVugA.js → WorkflowPill-Da406nEj.js} +2 -2
  203. package/dashboard/dist/assets/{WorkflowPill-CcUUVugA.js.map → WorkflowPill-Da406nEj.js.map} +1 -1
  204. package/dashboard/dist/assets/{WorkflowsDashboard-BQsZAGYU.js → WorkflowsDashboard-BMQd_0tW.js} +2 -2
  205. package/dashboard/dist/assets/{WorkflowsDashboard-BQsZAGYU.js.map → WorkflowsDashboard-BMQd_0tW.js.map} +1 -1
  206. package/dashboard/dist/assets/{WorkflowsOverview-CeliraHZ.js → WorkflowsOverview-CdxjVifp.js} +2 -2
  207. package/dashboard/dist/assets/{WorkflowsOverview-CeliraHZ.js.map → WorkflowsOverview-CdxjVifp.js.map} +1 -1
  208. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DGxlonrV.js → YamlWorkflowDetailPage-DNVffIXa.js} +13 -13
  209. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DGxlonrV.js.map → YamlWorkflowDetailPage-DNVffIXa.js.map} +1 -1
  210. package/dashboard/dist/assets/{YamlWorkflowsPage-DnT8UiyQ.js → YamlWorkflowsPage-BGP8wuos.js} +2 -2
  211. package/dashboard/dist/assets/{YamlWorkflowsPage-DnT8UiyQ.js.map → YamlWorkflowsPage-BGP8wuos.js.map} +1 -1
  212. package/dashboard/dist/assets/{agents-mRV7m4sh.js → agents-BZJLIJ4h.js} +2 -2
  213. package/dashboard/dist/assets/{agents-mRV7m4sh.js.map → agents-BZJLIJ4h.js.map} +1 -1
  214. package/dashboard/dist/assets/{bots-SONCZlCM.js → bots-ClLcDGJb.js} +2 -2
  215. package/dashboard/dist/assets/{bots-SONCZlCM.js.map → bots-ClLcDGJb.js.map} +1 -1
  216. package/dashboard/dist/assets/capabilities-IaCcS7ge.js +2 -0
  217. package/dashboard/dist/assets/{capabilities-DZjCMN32.js.map → capabilities-IaCcS7ge.js.map} +1 -1
  218. package/dashboard/dist/assets/{controlplane-RQNXjna2.js → controlplane-Zi4m_MSx.js} +2 -2
  219. package/dashboard/dist/assets/{controlplane-RQNXjna2.js.map → controlplane-Zi4m_MSx.js.map} +1 -1
  220. package/dashboard/dist/assets/escalation-columns-BY2mg9DY.js +2 -0
  221. package/dashboard/dist/assets/escalation-columns-BY2mg9DY.js.map +1 -0
  222. package/dashboard/dist/assets/{index-ymm58cTW.js → index-BqGnhkh0.js} +2 -2
  223. package/dashboard/dist/assets/{index-ymm58cTW.js.map → index-BqGnhkh0.js.map} +1 -1
  224. package/dashboard/dist/assets/index-BzkE48xJ.js +6 -0
  225. package/dashboard/dist/assets/index-BzkE48xJ.js.map +1 -0
  226. package/dashboard/dist/assets/{index-CkeSxuZ0.js → index-C3o4OisO.js} +2 -2
  227. package/dashboard/dist/assets/{index-CkeSxuZ0.js.map → index-C3o4OisO.js.map} +1 -1
  228. package/dashboard/dist/assets/{index-DY_hlZCQ.js → index-CJu2PBNx.js} +2 -2
  229. package/dashboard/dist/assets/{index-DY_hlZCQ.js.map → index-CJu2PBNx.js.map} +1 -1
  230. package/dashboard/dist/assets/{index-DYKRtstT.js → index-CLmZaNTK.js} +2 -2
  231. package/dashboard/dist/assets/{index-DYKRtstT.js.map → index-CLmZaNTK.js.map} +1 -1
  232. package/dashboard/dist/assets/index-CfAi1OsI.js +65 -0
  233. package/dashboard/dist/assets/index-CfAi1OsI.js.map +1 -0
  234. package/dashboard/dist/assets/{index-CK-6m8e_.js → index-CmnNqpWg.js} +2 -2
  235. package/dashboard/dist/assets/{index-CK-6m8e_.js.map → index-CmnNqpWg.js.map} +1 -1
  236. package/dashboard/dist/assets/{index-DFJF8aWz.js → index-CvNBdkB1.js} +3 -3
  237. package/dashboard/dist/assets/{index-DFJF8aWz.js.map → index-CvNBdkB1.js.map} +1 -1
  238. package/dashboard/dist/assets/{index-DbZpL10z.js → index-D0zFReGL.js} +2 -2
  239. package/dashboard/dist/assets/{index-DbZpL10z.js.map → index-D0zFReGL.js.map} +1 -1
  240. package/dashboard/dist/assets/{index-C6GsrvX1.js → index-Dldi3Q3M.js} +2 -2
  241. package/dashboard/dist/assets/{index-C6GsrvX1.js.map → index-Dldi3Q3M.js.map} +1 -1
  242. package/dashboard/dist/assets/{index-DqsLfO-0.js → index-kiKZresb.js} +2 -2
  243. package/dashboard/dist/assets/{index-DqsLfO-0.js.map → index-kiKZresb.js.map} +1 -1
  244. package/dashboard/dist/assets/index-mKcQGi2B.js +3 -0
  245. package/dashboard/dist/assets/index-mKcQGi2B.js.map +1 -0
  246. package/dashboard/dist/assets/{index-CxVGlkK6.js → index-yGNt29V9.js} +2 -2
  247. package/dashboard/dist/assets/{index-CxVGlkK6.js.map → index-yGNt29V9.js.map} +1 -1
  248. package/dashboard/dist/assets/index-zQiUPfxA.css +1 -0
  249. package/dashboard/dist/assets/{knowledge-Bawo8u7l.js → knowledge-DWLxGTib.js} +2 -2
  250. package/dashboard/dist/assets/{knowledge-Bawo8u7l.js.map → knowledge-DWLxGTib.js.map} +1 -1
  251. package/dashboard/dist/assets/{mcp-CKIpbpRZ.js → mcp-B6AARZ2I.js} +2 -2
  252. package/dashboard/dist/assets/{mcp-CKIpbpRZ.js.map → mcp-B6AARZ2I.js.map} +1 -1
  253. package/dashboard/dist/assets/{mcp-query-vld4hYxQ.js → mcp-query-DrkvBU3a.js} +2 -2
  254. package/dashboard/dist/assets/{mcp-query-vld4hYxQ.js.map → mcp-query-DrkvBU3a.js.map} +1 -1
  255. package/dashboard/dist/assets/{personas-BsARc3df.js → personas-Cmz2SAEU.js} +2 -2
  256. package/dashboard/dist/assets/{personas-BsARc3df.js.map → personas-Cmz2SAEU.js.map} +1 -1
  257. package/dashboard/dist/assets/{pipelines-BTSL-5ko.js → pipelines-CSgfVCMy.js} +2 -2
  258. package/dashboard/dist/assets/{pipelines-BTSL-5ko.js.map → pipelines-CSgfVCMy.js.map} +1 -1
  259. package/dashboard/dist/assets/{tasks-DggQdNbj.js → tasks-UOtUkDk-.js} +2 -2
  260. package/dashboard/dist/assets/{tasks-DggQdNbj.js.map → tasks-UOtUkDk-.js.map} +1 -1
  261. package/dashboard/dist/assets/{topics-DzAKa34X.js → topics-Df5hGh6o.js} +2 -2
  262. package/dashboard/dist/assets/{topics-DzAKa34X.js.map → topics-Df5hGh6o.js.map} +1 -1
  263. package/dashboard/dist/assets/{useDebouncedValue-BA5S7V54.js → useDebouncedValue-C4P2jQuh.js} +2 -2
  264. package/dashboard/dist/assets/{useDebouncedValue-BA5S7V54.js.map → useDebouncedValue-C4P2jQuh.js.map} +1 -1
  265. package/dashboard/dist/assets/{useEventHooks-5uI9oI5W.js → useEventHooks-PDbuSJ12.js} +2 -2
  266. package/dashboard/dist/assets/{useEventHooks-5uI9oI5W.js.map → useEventHooks-PDbuSJ12.js.map} +1 -1
  267. package/dashboard/dist/assets/{useFilterParams-CvRyYHJN.js → useFilterParams-crmlBw_l.js} +2 -2
  268. package/dashboard/dist/assets/{useFilterParams-CvRyYHJN.js.map → useFilterParams-crmlBw_l.js.map} +1 -1
  269. package/dashboard/dist/assets/{useNamespace-CEKzFIqe.js → useNamespace-tZSOlge3.js} +2 -2
  270. package/dashboard/dist/assets/{useNamespace-CEKzFIqe.js.map → useNamespace-tZSOlge3.js.map} +1 -1
  271. package/dashboard/dist/assets/{useYamlActivityEvents-hHgX1Z50.js → useYamlActivityEvents-CINLzE32.js} +2 -2
  272. package/dashboard/dist/assets/{useYamlActivityEvents-hHgX1Z50.js.map → useYamlActivityEvents-CINLzE32.js.map} +1 -1
  273. package/dashboard/dist/assets/{users-AO8lUyNr.js → users-G8qwyZKS.js} +2 -2
  274. package/dashboard/dist/assets/{users-AO8lUyNr.js.map → users-G8qwyZKS.js.map} +1 -1
  275. package/dashboard/dist/assets/{vendor-icons-DN9yGSuM.js → vendor-icons-BpZiWH2f.js} +40 -40
  276. package/dashboard/dist/assets/vendor-icons-BpZiWH2f.js.map +1 -0
  277. package/dashboard/dist/assets/{vendor-query-B2UbickB.js → vendor-query-RUZdMvN6.js} +2 -2
  278. package/dashboard/dist/assets/{vendor-query-B2UbickB.js.map → vendor-query-RUZdMvN6.js.map} +1 -1
  279. package/dashboard/dist/assets/{vendor-react-BpdAFEQc.js → vendor-react-CdqEC2zv.js} +3 -3
  280. package/dashboard/dist/assets/{vendor-react-BpdAFEQc.js.map → vendor-react-CdqEC2zv.js.map} +1 -1
  281. package/dashboard/dist/assets/{workflows-PtnlRK09.js → workflows-DbPqi1TW.js} +2 -2
  282. package/dashboard/dist/assets/{workflows-PtnlRK09.js.map → workflows-DbPqi1TW.js.map} +1 -1
  283. package/dashboard/dist/assets/{yaml-workflows-DPu3Y8vG.js → yaml-workflows-DozD8hpR.js} +2 -2
  284. package/dashboard/dist/assets/{yaml-workflows-DPu3Y8vG.js.map → yaml-workflows-DozD8hpR.js.map} +1 -1
  285. package/dashboard/dist/index.html +5 -5
  286. package/docs/dashboard.md +9 -2
  287. package/docs/design-principles.md +4 -0
  288. package/docs/hitl/pinned-views.md +3 -3
  289. package/docs/hitl/x-lt-transition.md +105 -0
  290. package/docs/operations.md +1 -1
  291. package/docs/scan-codes.md +243 -0
  292. package/package.json +2 -2
  293. package/dashboard/dist/assets/AvailableEscalationsPage-C1vtTvqP.js +0 -2
  294. package/dashboard/dist/assets/AvailableEscalationsPage-C1vtTvqP.js.map +0 -1
  295. package/dashboard/dist/assets/BotPicker-Dohv8dhR.js +0 -2
  296. package/dashboard/dist/assets/CountdownTimer-BF71ldGF.js +0 -2
  297. package/dashboard/dist/assets/HomePage-HPCd8SjF.js +0 -2
  298. package/dashboard/dist/assets/HomePage-HPCd8SjF.js.map +0 -1
  299. package/dashboard/dist/assets/ListToolbar-BFHVOba6.js +0 -2
  300. package/dashboard/dist/assets/ListToolbar-BFHVOba6.js.map +0 -1
  301. package/dashboard/dist/assets/OperationsPage-flrZ-EJ9.js +0 -2
  302. package/dashboard/dist/assets/OperationsPage-flrZ-EJ9.js.map +0 -1
  303. package/dashboard/dist/assets/OperatorDashboard-Dhs2eo8p.js +0 -2
  304. package/dashboard/dist/assets/OperatorDashboard-Dhs2eo8p.js.map +0 -1
  305. package/dashboard/dist/assets/RoleDetailPage-D70jTLZm.js +0 -8
  306. package/dashboard/dist/assets/RoleDetailPage-D70jTLZm.js.map +0 -1
  307. package/dashboard/dist/assets/RolesPage-CNueMVuJ.js +0 -2
  308. package/dashboard/dist/assets/TimeAgo-CInx-vzY.js +0 -2
  309. package/dashboard/dist/assets/UserName-DggcLkSc.js +0 -2
  310. package/dashboard/dist/assets/capabilities-DZjCMN32.js +0 -2
  311. package/dashboard/dist/assets/escalation-columns-XLEcZRCg.js +0 -2
  312. package/dashboard/dist/assets/escalation-columns-XLEcZRCg.js.map +0 -1
  313. package/dashboard/dist/assets/index-2BwHxjCw.css +0 -1
  314. package/dashboard/dist/assets/index-D2CfSx_x.js +0 -5
  315. package/dashboard/dist/assets/index-D2CfSx_x.js.map +0 -1
  316. package/dashboard/dist/assets/index-Dh3CVChT.js +0 -63
  317. package/dashboard/dist/assets/index-Dh3CVChT.js.map +0 -1
  318. package/dashboard/dist/assets/index-iHV3d7o3.js +0 -6
  319. package/dashboard/dist/assets/index-iHV3d7o3.js.map +0 -1
  320. package/dashboard/dist/assets/role-display-Dvo2lDpU.js +0 -2
  321. package/dashboard/dist/assets/role-display-Dvo2lDpU.js.map +0 -1
  322. package/dashboard/dist/assets/vendor-icons-DN9yGSuM.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-Dh3CVChT.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-PtnlRK09.js.map
1
+ import{u as n,b as t,c as u}from"./vendor-query-RUZdMvN6.js";import{d as s}from"./index-CfAi1OsI.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-DbPqi1TW.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflows-PtnlRK09.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-DbPqi1TW.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-Dh3CVChT.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-DPu3Y8vG.js.map
1
+ import{u as l,b as a,c as s}from"./vendor-query-RUZdMvN6.js";import{d as r}from"./index-CfAi1OsI.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-DozD8hpR.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"yaml-workflows-DPu3Y8vG.js","sources":["../../src/api/yaml-workflows.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { LTYamlWorkflowRecord, LTYamlWorkflowStatus, LTYamlWorkflowVersion } from './types';\n\ninterface YamlWorkflowListResponse {\n workflows: LTYamlWorkflowRecord[];\n total: number;\n}\n\ninterface YamlWorkflowFilters {\n status?: LTYamlWorkflowStatus;\n graph_topic?: string;\n app_id?: string;\n search?: string;\n set_id?: string;\n limit?: number;\n offset?: number;\n}\n\nexport function useYamlWorkflows(filters: YamlWorkflowFilters = {}) {\n const params = new URLSearchParams();\n if (filters.status) params.set('status', filters.status);\n if (filters.graph_topic) params.set('graph_topic', filters.graph_topic);\n if (filters.app_id) params.set('app_id', filters.app_id);\n if (filters.search) params.set('search', filters.search);\n if (filters.set_id) params.set('set_id', filters.set_id);\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', filters],\n queryFn: () => apiFetch(`/yaml-workflows?${params}`),\n });\n}\n\nexport function useYamlWorkflowAppIds() {\n return useQuery<{ app_ids: string[] }>({\n queryKey: ['yamlWorkflowAppIds'],\n queryFn: () => apiFetch('/yaml-workflows/app-ids'),\n });\n}\n\nexport function useYamlWorkflowByTopic(graphTopic: string | undefined, appId?: string) {\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', 'byTopic', graphTopic, appId],\n queryFn: () => {\n const params = new URLSearchParams({ graph_topic: graphTopic!, limit: '1' });\n if (appId) params.set('app_id', appId);\n return apiFetch(`/yaml-workflows?${params}`);\n },\n enabled: !!graphTopic,\n });\n}\n\nexport function useYamlWorkflow(id: string) {\n return useQuery<LTYamlWorkflowRecord>({\n queryKey: ['yamlWorkflows', id],\n queryFn: () => apiFetch(`/yaml-workflows/${id}`),\n enabled: !!id,\n });\n}\n\nexport function useCreateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: {\n workflow_id: string;\n task_queue: string;\n workflow_name: string;\n name: string;\n description?: string;\n app_id?: string;\n subscribes?: string;\n tags?: string[];\n compilation_feedback?: string;\n }) =>\n apiFetch<LTYamlWorkflowRecord>('/yaml-workflows', {\n method: 'POST',\n body: JSON.stringify(input),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeployYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/deploy`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useActivateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/activate`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useInvokeYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, data, sync, execute_as }: { id: string; data: Record<string, unknown>; sync?: boolean; execute_as?: string }) =>\n apiFetch<{ result?: unknown; job_id?: string }>(`/yaml-workflows/${id}/invoke`, {\n method: 'POST',\n body: JSON.stringify({ data, sync, ...(execute_as ? { execute_as } : {}) }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRegenerateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, task_queue, compilation_feedback }: { id: string; task_queue?: string; compilation_feedback?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/regenerate`, {\n method: 'POST',\n body: JSON.stringify({ task_queue, compilation_feedback }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useArchiveYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/archive`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRestoreYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/restore`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflow'], refetchType: 'all' });\n },\n });\n}\n\nexport function useUpdateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, ...updates }: { id: string; yaml_content?: string; name?: string; description?: string; input_schema?: Record<string, unknown>; output_schema?: Record<string, unknown>; tags?: string[]; app_id?: string; graph_topic?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}`, {\n method: 'PUT',\n body: JSON.stringify(updates),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeleteYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<{ deleted: boolean }>(`/yaml-workflows/${id}`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Cron scheduling ─────────────────────────────────────────────\n\nexport function useSetYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, cron_schedule, cron_envelope, execute_as }: {\n id: string;\n cron_schedule: string;\n cron_envelope?: Record<string, unknown> | null;\n execute_as?: string | null;\n }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'PUT',\n body: JSON.stringify({ cron_schedule, cron_envelope, execute_as }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useClearYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Version history ─────────────────────────────────────────────\n\nexport function useYamlWorkflowVersions(id: string) {\n return useQuery<{ versions: LTYamlWorkflowVersion[]; total: number }>({\n queryKey: ['yamlWorkflows', id, 'versions'],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions`),\n enabled: !!id,\n });\n}\n\nexport function useYamlWorkflowVersion(id: string, version: number | null) {\n return useQuery<LTYamlWorkflowVersion>({\n queryKey: ['yamlWorkflows', id, 'versions', version],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions/${version}`),\n enabled: !!id && version !== null,\n });\n}\n"],"names":["useYamlWorkflows","filters","params","useQuery","apiFetch","useYamlWorkflowAppIds","useYamlWorkflow","id","useCreateYamlWorkflow","queryClient","useQueryClient","useMutation","input","useDeployYamlWorkflow","useActivateYamlWorkflow","useInvokeYamlWorkflow","data","sync","execute_as","useRegenerateYamlWorkflow","task_queue","compilation_feedback","useArchiveYamlWorkflow","useRestoreYamlWorkflow","useUpdateYamlWorkflow","updates","useDeleteYamlWorkflow","useYamlWorkflowVersions","useYamlWorkflowVersion","version"],"mappings":"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"}
1
+ {"version":3,"file":"yaml-workflows-DozD8hpR.js","sources":["../../src/api/yaml-workflows.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { LTYamlWorkflowRecord, LTYamlWorkflowStatus, LTYamlWorkflowVersion } from './types';\n\ninterface YamlWorkflowListResponse {\n workflows: LTYamlWorkflowRecord[];\n total: number;\n}\n\ninterface YamlWorkflowFilters {\n status?: LTYamlWorkflowStatus;\n graph_topic?: string;\n app_id?: string;\n search?: string;\n set_id?: string;\n limit?: number;\n offset?: number;\n}\n\nexport function useYamlWorkflows(filters: YamlWorkflowFilters = {}) {\n const params = new URLSearchParams();\n if (filters.status) params.set('status', filters.status);\n if (filters.graph_topic) params.set('graph_topic', filters.graph_topic);\n if (filters.app_id) params.set('app_id', filters.app_id);\n if (filters.search) params.set('search', filters.search);\n if (filters.set_id) params.set('set_id', filters.set_id);\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', filters],\n queryFn: () => apiFetch(`/yaml-workflows?${params}`),\n });\n}\n\nexport function useYamlWorkflowAppIds() {\n return useQuery<{ app_ids: string[] }>({\n queryKey: ['yamlWorkflowAppIds'],\n queryFn: () => apiFetch('/yaml-workflows/app-ids'),\n });\n}\n\nexport function useYamlWorkflowByTopic(graphTopic: string | undefined, appId?: string) {\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', 'byTopic', graphTopic, appId],\n queryFn: () => {\n const params = new URLSearchParams({ graph_topic: graphTopic!, limit: '1' });\n if (appId) params.set('app_id', appId);\n return apiFetch(`/yaml-workflows?${params}`);\n },\n enabled: !!graphTopic,\n });\n}\n\nexport function useYamlWorkflow(id: string) {\n return useQuery<LTYamlWorkflowRecord>({\n queryKey: ['yamlWorkflows', id],\n queryFn: () => apiFetch(`/yaml-workflows/${id}`),\n enabled: !!id,\n });\n}\n\nexport function useCreateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: {\n workflow_id: string;\n task_queue: string;\n workflow_name: string;\n name: string;\n description?: string;\n app_id?: string;\n subscribes?: string;\n tags?: string[];\n compilation_feedback?: string;\n }) =>\n apiFetch<LTYamlWorkflowRecord>('/yaml-workflows', {\n method: 'POST',\n body: JSON.stringify(input),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeployYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/deploy`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useActivateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/activate`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useInvokeYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, data, sync, execute_as }: { id: string; data: Record<string, unknown>; sync?: boolean; execute_as?: string }) =>\n apiFetch<{ result?: unknown; job_id?: string }>(`/yaml-workflows/${id}/invoke`, {\n method: 'POST',\n body: JSON.stringify({ data, sync, ...(execute_as ? { execute_as } : {}) }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRegenerateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, task_queue, compilation_feedback }: { id: string; task_queue?: string; compilation_feedback?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/regenerate`, {\n method: 'POST',\n body: JSON.stringify({ task_queue, compilation_feedback }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useArchiveYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/archive`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRestoreYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/restore`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflow'], refetchType: 'all' });\n },\n });\n}\n\nexport function useUpdateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, ...updates }: { id: string; yaml_content?: string; name?: string; description?: string; input_schema?: Record<string, unknown>; output_schema?: Record<string, unknown>; tags?: string[]; app_id?: string; graph_topic?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}`, {\n method: 'PUT',\n body: JSON.stringify(updates),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeleteYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<{ deleted: boolean }>(`/yaml-workflows/${id}`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Cron scheduling ─────────────────────────────────────────────\n\nexport function useSetYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, cron_schedule, cron_envelope, execute_as }: {\n id: string;\n cron_schedule: string;\n cron_envelope?: Record<string, unknown> | null;\n execute_as?: string | null;\n }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'PUT',\n body: JSON.stringify({ cron_schedule, cron_envelope, execute_as }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useClearYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Version history ─────────────────────────────────────────────\n\nexport function useYamlWorkflowVersions(id: string) {\n return useQuery<{ versions: LTYamlWorkflowVersion[]; total: number }>({\n queryKey: ['yamlWorkflows', id, 'versions'],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions`),\n enabled: !!id,\n });\n}\n\nexport function useYamlWorkflowVersion(id: string, version: number | null) {\n return useQuery<LTYamlWorkflowVersion>({\n queryKey: ['yamlWorkflows', id, 'versions', version],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions/${version}`),\n enabled: !!id && version !== null,\n });\n}\n"],"names":["useYamlWorkflows","filters","params","useQuery","apiFetch","useYamlWorkflowAppIds","useYamlWorkflow","id","useCreateYamlWorkflow","queryClient","useQueryClient","useMutation","input","useDeployYamlWorkflow","useActivateYamlWorkflow","useInvokeYamlWorkflow","data","sync","execute_as","useRegenerateYamlWorkflow","task_queue","compilation_feedback","useArchiveYamlWorkflow","useRestoreYamlWorkflow","useUpdateYamlWorkflow","updates","useDeleteYamlWorkflow","useYamlWorkflowVersions","useYamlWorkflowVersion","version"],"mappings":"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"}
@@ -8,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-Dh3CVChT.js"></script>
12
- <link rel="modulepreload" crossorigin href="./assets/vendor-query-B2UbickB.js">
13
- <link rel="modulepreload" crossorigin href="./assets/vendor-react-BpdAFEQc.js">
14
- <link rel="modulepreload" crossorigin href="./assets/vendor-icons-DN9yGSuM.js">
15
- <link rel="stylesheet" crossorigin href="./assets/index-2BwHxjCw.css">
11
+ <script type="module" crossorigin src="./assets/index-CfAi1OsI.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-BpZiWH2f.js">
15
+ <link rel="stylesheet" crossorigin href="./assets/index-zQiUPfxA.css">
16
16
  </head>
17
17
  <body>
18
18
  <div id="root"></div>
package/docs/dashboard.md CHANGED
@@ -12,7 +12,7 @@ The reactive, event-driven surface — where operations watch the floor and buil
12
12
 
13
13
  | Page | Route | Purpose |
14
14
  |------|-------|---------|
15
- | **Pace Board** | `/operations` | COO shop-floor view — pace chart of actual-vs-target flow across every station role, station table with live metrics, and the station detail panel. Visible to any user with ops or builder access. |
15
+ | **Pace Board** | `/operations` | COO shop-floor view — pace chart of actual-vs-target flow across every station role, station table with live metrics, and the station detail panel. Readable by every login (aggregate counts and trends) while `features.publicPaceBoard`, default on, stands. |
16
16
  | **Event Topics** | `/topics` | Topic catalog — browse all known event topics with descriptions, schemas, and subscriber counts. |
17
17
  | **Agents** | `/agents` | Autonomous event-driven automations (labeled **Automations** when AI is not configured). Configure subscriptions, schedules, and knowledge domains. |
18
18
  | **Capabilities** | `/capabilities` | Browse MCP tools grouped by capability category, with a live run panel. |
@@ -82,7 +82,7 @@ The top navigation bar contains:
82
82
 
83
83
  ## Home — Recent Activity
84
84
 
85
- The home page mirrors the navigation. Row 1 reflects the two header escalation links: **All Escalations** and **My Escalations**, each showing the five most recent items. Row 2 reflects the Orchestrate story and is tiered by role: superadmins and engineers see the **Pace Board** chart at a glance (click through to `/operations`) beside the five most recent **Procedural** and **Graph** executions; admins who don't see workflows get the Pace Board spanning the full row; operators see row 1 only.
85
+ The home page leads with the **Pace Board** for every login — the operational heartbeat on top, **All Escalations** and **My Escalations** panels below (each server-scoped to what the viewer may see). A role flagged **Home Segment** (Role Detail Pace Board settings) picks which sequence the home board opens on; unset, the first sequence leads. When a deployment sets `features.publicPaceBoard: false`, homes re-tier: admins keep this layout, engineers see escalation panels beside their recent **Procedural** and **Graph** executions, and operators get their per-lane task-queue cards.
86
86
 
87
87
  ## Key Pages
88
88
 
@@ -331,6 +331,7 @@ Messages are read-only. Status is derived from timestamps: pending (no timestamp
331
331
 
332
332
  The central queue for all escalation activity across every workflow.
333
333
 
334
+ - **Title = queue selector** — the page title reads as the selected role's friendly title, or "All Escalations" when unfiltered; clicking it switches queues over the same `?role=` param the filter bar mirrors. The **My Escalations** personal inbox (`/escalations/queue`) carries the identical control, titling itself "My Escalations" or the filtered role's title.
334
335
  - **Filter bar** — filter by status (pending/claimed/resolved), role, workflow type, priority, and time window.
335
336
  - **Columns:** Escalation ID, workflow type, role, status, priority, created time, and claimed-by user.
336
337
  - **Rich list view** — when the list is scoped to exactly one role (`?role=<role>`) and that role owns a [list schema](#escalations-list-schema), a role-authored view renders in place of the table (the live item as a card, plus a load-on-demand history), with a **Table view** toggle back to the columns.
@@ -450,6 +451,12 @@ The Inbox icon in the header shows a badge count when the current user has pendi
450
451
 
451
452
  The bottom bar contains a collapsible live event stream showing workflow start/completion events, task state transitions, escalation activity, and activity checkpoints. Events stream via NATS subscription.
452
453
 
454
+ ### Claim Hand-off
455
+
456
+ The shell monitors the role-scoped `claimed` events across the viewer's roles; when one carries `assigned_to = viewer`, the dashboard navigates to that escalation's detail page. Pre-assignment is the system saying "this is yours next," and the UI honors it: a resolve → side-effect → follow-on chain (e.g. submit, a label prints, the harvest task opens) lands the user on the next step instead of history's previous page.
457
+
458
+ Workflows need no UI coupling — assigning the follow-on escalation to the resolving user is the whole contract. The gesture is naturally idempotent: a claim the user made themselves resolves to the page their click already opened.
459
+
453
460
  ### Contextual Documentation
454
461
 
455
462
  Each page header includes a documentation icon that opens the in-app docs drawer to the relevant section. The drawer supports navigation history, anchor linking, and markdown rendering.
@@ -35,6 +35,10 @@ Chroma is spent, not spread.
35
35
  inverted — never a flat white page with white sections.
36
36
  - **The accent appears in small doses**: links, buttons, checks, pills,
37
37
  section labels, focus states. Because it is scarce, it reads as "act here."
38
+ Icon links follow the same rule in every theme: clickable glyphs (toolbar
39
+ icons, view toggles) render through the `.icon-link` recipe — muted accent
40
+ at rest, full accent on hover — never a neutral text tone, which reads as
41
+ a static mark.
38
42
  - **Dark themes are the same principle, inverted** — near-black neutral
39
43
  surfaces, the identical accent discipline. Midnight is not a different
40
44
  design; it is the same design at night.
@@ -26,13 +26,13 @@ The merge is a single guarded statement (no read-then-write) and the document is
26
26
 
27
27
  ## The Pinned Section
28
28
 
29
- Pins render as a **Pinned** nav section: the user's own pins first, in stored order (drag to reorder, ✕ to remove), then role-provided defaults. **Pin this view** on the escalations list captures the live filter set into a new pin, prompting only for a label.
29
+ Pins render as first-class nav sections: each role's pins sit under the role's **display title**, styled exactly like the built-in categories (Monitor, Orchestrate, Storage) — the same composition the persona config screen previews. There is no "Pinned" umbrella; the role names are the categories. The user's own pins, when present, lead as their own **Pinned** section (stored order, drag to reorder, ✕ to remove). A section heading exists only over visible pins (a role whose pins are all hidden or promoted contributes no heading) and pins sit flush at the nav's left edge — the heading labels, it never indents. Every pin carries its full label as a tooltip. **Pin this view** on the escalations list captures the live filter set into a new pin, prompting only for a label.
30
30
 
31
- `badge: true` renders a live count beside the label using the same server-side predicate the pin opens onto (the pin's URL is parsed back into its query and counted with `limit: 1`) so the badge and the list always agree, including `jeopardy=1` pins. Counts refresh on escalation events, and a pin whose URL isn't a countable escalations list renders without a badge.
31
+ `badge: true` renders a live count as bare superscript digits on the row's right rail — tabular, right-aligned so counts read as a column — using the same server-side predicate the pin opens onto (the pin's URL is parsed back into its query and counted with `limit: 1`), so the badge and the list always agree, including `jeopardy=1` pins. Counts refresh on escalation events, and a pin whose URL isn't a countable escalations list renders without a badge.
32
32
 
33
33
  ## Role Default Pins
34
34
 
35
- A role may declare `default_pins: [{ label, url, badge? }]` (edited on Role Detail → Default Pins). Members see them in their Pinned section from first login, marked as role-provided, and may:
35
+ A role may declare `default_pins: [{ label, url, badge? }]` (edited on Role Detail → Default Pins). Members see them in their Pinned section from first login, grouped under the role's display title, and may:
36
36
 
37
37
  - **Promote** — copy into their own pins (an own pin with the same label supersedes the role default)
38
38
  - **Hide** — dismiss it (recorded in `hiddenRolePins`)
@@ -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.
@@ -123,4 +123,4 @@ See [MCP Admin Tools — Ortho Pipeline](api/mcp/admin.md#ortho-pipeline) for th
123
123
 
124
124
  ## Navigation
125
125
 
126
- The Operations entry lives in the choreography sidebar (the left rail visible on `/operations` and `/escalations`), separate from the Admin sidebar. The `/operations` route admits admin-type users, superadmins, and engineers the same audience the sidebar shows the entry to.
126
+ The Operations entry lives in the choreography sidebar (the left rail visible on `/operations` and `/escalations`), separate from the Admin sidebar. The `/operations` route admits every authenticated user — the board is aggregate counts and trends, readonly by nature. Station metrics span all roles for any login while the `features.publicPaceBoard` flag (default on) stands; a deployment that sets it false (e.g. one provisioning external one-time accounts) narrows metrics back to role membership and the board back to admin-type users and superadmins.
@@ -0,0 +1,243 @@
1
+ # Scan Codes
2
+
3
+ A code printed on a physical object drives the platform from the factory
4
+ floor. Scanning it locates the object's digital twin — the escalation row
5
+ that represents it — checks the twin is in an expected queue and state, and
6
+ runs a configured action: open it, claim it, resolve it with a canned
7
+ payload, re-home it to another queue, or cancel it. The whole gesture is one
8
+ scan on an iPad with a paired scanner.
9
+
10
+ The escalation surface makes this tractable. Every work item lives in a role
11
+ queue with a small set of states, a universal metadata query language, and a
12
+ canonical action surface. A scan is an **ECA rule** over that surface:
13
+
14
+ - **Event** — a code arrives from an input source.
15
+ - **Condition** — an ordered list of queries against the queue
16
+ (role, status, availability, metadata facets).
17
+ - **Action** — the platform verb the first matching query runs.
18
+
19
+ ## Contents
20
+
21
+ - [The code](#the-code)
22
+ - [Schemes](#schemes)
23
+ - [Rules and steps](#rules-and-steps)
24
+ - [Confirmation](#confirmation)
25
+ - [The fallback screen](#the-fallback-screen)
26
+ - [Executing a scan](#executing-a-scan)
27
+ - [Capture on the dashboard](#capture-on-the-dashboard)
28
+ - [Scanner setup](#scanner-setup)
29
+ - [Admin configuration](#admin-configuration)
30
+ - [The printer demo](#the-printer-demo)
31
+
32
+ ## The code
33
+
34
+ A scan code encodes three parts: `version : category : target`.
35
+
36
+ | Part | Width | Meaning |
37
+ |------|-------|---------|
38
+ | version | 2 digits (10–99) | Selects the **scheme** — what the target identifies and how the code parses. Two digits so a code never starts with a leading zero. |
39
+ | category | 1 digit (0–9) | Selects the **rule** — what scanning this code does |
40
+ | target | scheme-defined | The value matched against the scheme's metadata facet |
41
+
42
+ `10:1:75949975930` reads: scheme 10, rule 1, target `75949975930`.
43
+
44
+ Both indices are assigned automatically as you add named entries — operators
45
+ name schemes and actions, never pick numbers.
46
+
47
+ ## Schemes
48
+
49
+ A scheme (`lt_config_scan_schemes`, indexed 10–99) declares:
50
+
51
+ - **`target_facet`** — the escalation metadata key the target resolves
52
+ against (`serialNumber`, `assetTag`, `batchId`…). The physical label and
53
+ the digital twin share this value; the scan is the join.
54
+ - **`encoding`** — how the code string parses:
55
+ - `delimited` — text separated by a single character (default `:`), e.g.
56
+ `10:1:SN-123`. Use with Code 128, QR, or DataMatrix labels; targets may
57
+ be any text.
58
+ - `fixed` — digits only with a declared target width, e.g.
59
+ `1015949975930`. Fits UPC-A/EAN/ITF labels; a trailing check digit is
60
+ accepted. Two digits of version + one of category + `target_length`
61
+ digits of target.
62
+
63
+ ## Rules and steps
64
+
65
+ A rule (`lt_config_scan_actions`) is a friendly name — print it beside the
66
+ physical code — plus an **ordered list of steps** and a fallback. Execution
67
+ walks the steps; the first step whose query matches runs its verb and
68
+ answers.
69
+
70
+ Each step:
71
+
72
+ ```jsonc
73
+ {
74
+ "query": {
75
+ "roles": ["printer-fleet"], // expected queue(s)
76
+ "status": "pending", // pending | resolved | cancelled
77
+ "availability": "available", // available | claimed | mine | any
78
+ "facets": { "state": "printing" } // extra metadata guards
79
+ },
80
+ "cardinality": "first", // first | many
81
+ "verb": "resolve",
82
+ "confirm": { "prompt": "…?" }, // optional user confirmation
83
+ "params": { /* verb-specific */ }
84
+ }
85
+ ```
86
+
87
+ Verbs are the canonical escalation actions:
88
+
89
+ | Verb | Effect | Params |
90
+ |------|--------|--------|
91
+ | `show-detail` | Open the item's detail page | — |
92
+ | `show-list` | Open the list filtered to all matches | — |
93
+ | `claim` / `claim-show-detail` | Atomic claim (and open) | `durationMinutes`, `metadata` |
94
+ | `release` | Release the caller's own claim | — |
95
+ | `resolve` | Atomic claim + resolve with a canned payload | `resolverPayload`, `metadata` |
96
+ | `escalate` | Create an escalation in another queue, optionally closing the located one | `targetRole`, `closeCurrent`, `escalationType`, `description`, `metadata` |
97
+ | `cancel` | Claim-as-lock, then cancel | — |
98
+
99
+ String values inside `resolverPayload` and `metadata` interpolate
100
+ `{scan.target}`, `{scan.category}`, and `{scan.scannedAt}`. Every mutating
101
+ verb stamps provenance facets onto the row it touches — `scanScheme`,
102
+ `scanCategory`, `scanActionName`, `scannedAt` — so scan-driven transitions
103
+ stay queryable.
104
+
105
+ Ordering is the power move: put the expected state first and a broad
106
+ `show-detail` last. A machine whose twin is in the wrong queue still answers
107
+ the scan — with where the twin actually is. **The scan is also a state
108
+ query.**
109
+
110
+ Mutations are atomic. Claim, resolve, and cancel ride the single-statement
111
+ by-metadata operations; the caller's role scope folds into the same SQL
112
+ filter as the step's role guard. Two people scanning the same code
113
+ concurrently produce exactly one transition — the second scan reports a
114
+ conflict or falls through to the locator step.
115
+
116
+ ## Confirmation
117
+
118
+ A step carrying `confirm` locates instead of acting. The scan answers
119
+ `confirm_required` with the located escalation and a pending-action
120
+ descriptor; the dashboard opens the item's detail page and raises the
121
+ rule's prompt ("Cancel this printer's current state and send it home to
122
+ servicing?"). Confirming fires the standard per-id endpoint — the same
123
+ guarded call every other surface uses.
124
+
125
+ ## The fallback screen
126
+
127
+ When no step matches, the response carries the rule's `fallback`: markdown
128
+ for the operator ("**No twin found for this serial.** Register it through
129
+ the onboarding surface…") and optionally a route to land on. The scan panel
130
+ renders the markdown; a configured route navigates.
131
+
132
+ ## Executing a scan
133
+
134
+ `POST /api/scan-codes/execute` takes `{ "code": "10:1:SN-123" }` and runs
135
+ as the calling user under normal RBAC. Every terminal state is a structured
136
+ 200 outcome:
137
+
138
+ | Outcome | Meaning |
139
+ |---------|---------|
140
+ | `executed` | A step matched and its action ran |
141
+ | `matched_list` | A `show-list` step matched; `escalations` + `listQuery` included |
142
+ | `confirm_required` | A confirm step located its target; `pendingAction` included |
143
+ | `no_match_fallback` | No step matched; `fallback` included |
144
+ | `unconfigured` | Unknown or disabled scheme version / category |
145
+ | `invalid_code` | The string parses under no enabled scheme |
146
+ | `forbidden` | The caller's roles bar the matched action |
147
+ | `conflict` | A concurrent actor won the row |
148
+
149
+ The endpoint is source-agnostic — anything that produces a string can drive
150
+ it: a barcode scanner, an RFID reader, a camera decode, an MCP tool
151
+ (`execute_scan_code`), or a curl.
152
+
153
+ ## Capture on the dashboard
154
+
155
+ Scan surfaces are **opt-in**. The deployment turns them on with
156
+ `features.scanCodes: true` in the `start()` config (default false, like every
157
+ `features` flag surfaced through `/api/settings`); when on, every persona
158
+ gets the header scan affordance, the panel, and the global capture. The
159
+ easter-egg Features panel carries a local **Scan input** override to test
160
+ either state on one browser. The execute and config APIs work regardless —
161
+ the flag gates the dashboard surface.
162
+
163
+ When enabled, the dashboard listens for scans globally — any page, any focus
164
+ state. A scanner paired as an HID keyboard "types" its decode and finishes
165
+ with Enter; capture is **pattern-anchored**: a capture-phase window listener
166
+ accumulates keystrokes freely, and when the terminator arrives it checks
167
+ whether the recent keys end with a scan-code shape
168
+ (`[1-9][0-9]:[0-9]:target` or the digits-only fixed form).
169
+
170
+ - On a match, the terminator is swallowed, the code's characters are
171
+ stripped back out of whatever editable held focus (byte-exact, at the
172
+ cursor), and the code executes. Cursor focus never diverts a scan.
173
+ - Scanner pacing is irrelevant: slow Bluetooth HID links, Shift-chorded
174
+ capitals and colons, and mid-burst stalls all capture, because nothing has
175
+ to be recognized mid-flight. The one tunable is the **key gap limit**
176
+ (default 500 ms in the scan panel) separating distinct typing episodes.
177
+ - Typing a valid code and pressing Enter fires it too, anywhere — that is
178
+ the contract: the scanner is a keyboard, so the keyboard is a scanner.
179
+ - Scanners with no suffix programmed work through **quiet-period auto-fire**:
180
+ a full code shape typed at scanner speed (avg ≤ 50 ms/key) followed by
181
+ 300 ms of silence fires without a terminator. Hand-typed codes never
182
+ auto-fire — humans type slower than the ceiling; they submit on Enter.
183
+ - Delimited targets carry `a-z A-Z 0-9 . _ -`; lowercase is the recommended
184
+ label vocabulary. Case is preserved — metadata matching is case-sensitive.
185
+
186
+ Capture sources are pluggable (`dashboard/src/lib/scan-sources/`): the
187
+ keyboard wedge is one provider behind a `ScanSource` contract; an RFID or
188
+ camera provider plugs into the same dispatch pipeline.
189
+
190
+ The **scan panel** (barcode button in the header) carries a manual entry
191
+ field — type or paste a code to execute it with zero hardware — the last
192
+ scan's outcome, and the capture settings.
193
+
194
+ ## Scanner setup
195
+
196
+ Any keyboard-wedge scanner works as shipped, over USB or Bluetooth HID, with
197
+ any symbology it decodes (UPC-A/EAN, Code 128, QR, DataMatrix, PDF417). The
198
+ decoded string arrives as keystrokes regardless of symbology, so `delimited`
199
+ codes print colons literally.
200
+
201
+ An **Enter suffix** on the scanner gives the crispest capture (the code
202
+ fires the instant the suffix arrives); scanners without one fire after the
203
+ quiet period. The scan panel's diagnostics view traces every keydown the
204
+ capture sees — the tool for pinning any scanner's stream shape.
205
+
206
+ Label guidance: QR or DataMatrix survive small corner labels and floor
207
+ grime best; Code 128 suits wider flat labels; `fixed` encoding packs into
208
+ UPC-A where numeric-only labels are already in circulation.
209
+
210
+ ## Admin configuration
211
+
212
+ **Admin → Scan Codes** lists your schemes. Add a scheme, name it, and point it
213
+ at a target facet — its two-digit index is assigned for you. A scheme's detail
214
+ page lists its actions; **Add an action** opens the rule editor:
215
+
216
+ 1. **Name it** — the friendly label printed beside the physical code.
217
+ 2. **Order the conditions** — each step picks a queue, a held-by filter,
218
+ and its action; steps reorder with arrows. First match wins.
219
+ 3. **Set the fallback** — markdown for the no-match screen.
220
+
221
+ The same CRUD rides `PUT/GET/DELETE /api/scan-codes/schemes/:version[/actions/:category]`
222
+ (admin) and the admin MCP tools `list_scan_schemes`, `upsert_scan_scheme`,
223
+ `upsert_scan_rule`, `delete_scan_rule`, `execute_scan_code`. Incoherent
224
+ rules fail the write with the exact problem — an `escalate` step names its
225
+ `targetRole`, a `resolve` step carries its payload.
226
+
227
+ ## The printer demo
228
+
229
+ The example seed (`examples/seed-scan-codes.ts`) configures scheme 10 over
230
+ the [printer-twin](../examples/workflows/printer-twin/) farm: the target
231
+ facet is the twin's `serialNumber`, and four rules map to the four corners
232
+ of each machine:
233
+
234
+ | Corner | Code | Rule |
235
+ |--------|------|------|
236
+ | upper-left | `10:0:<serial>` | **Send Printer Home** — cancel the twin's fleet row (confirmed); the twin escalates to its service surface |
237
+ | upper-right | `10:1:<serial>` | **Collect Print** — resolve the in-flight `printing` row as success |
238
+ | lower-right | `10:2:<serial>` | **Print Failed** — resolve the `printing` row as fail; plate cleared, machine reset |
239
+ | lower-left | `10:3:<serial>` | **Offline for Service** — cancel the fleet row and open a service item in the servicer queue |
240
+
241
+ Each rule ends on a broad `show-detail` and the "no twin found" fallback.
242
+ Walk it hardware-free: run the twin farm, open the scan panel, and paste
243
+ `10:1:<a-printing-serial>`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hotmeshio/long-tail",
3
- "version": "0.10.10",
3
+ "version": "0.10.13",
4
4
  "description": "Long Tail Workflows — Durable AI workflows with human-in-the-loop escalation. Powered by PostgreSQL.",
5
5
  "main": "./build/index.js",
6
6
  "types": "./build/index.d.ts",
@@ -72,7 +72,7 @@
72
72
  "@anthropic-ai/sdk": "^0.92.0",
73
73
  "@aws-sdk/client-s3": "^3.1017.0",
74
74
  "@aws-sdk/s3-request-presigner": "^3.1045.0",
75
- "@hotmeshio/hotmesh": "^0.26.3",
75
+ "@hotmeshio/hotmesh": "^0.27.0",
76
76
  "@modelcontextprotocol/sdk": "^1.27.1",
77
77
  "@opentelemetry/exporter-trace-otlp-proto": "^0.215.0",
78
78
  "@opentelemetry/resources": "^2.5.1",