@hotmeshio/long-tail 0.7.5 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (364) hide show
  1. package/build/api/workflows/config.d.ts +7 -1
  2. package/build/api/workflows/config.js +7 -1
  3. package/build/api/workflows/discovery.js +1 -4
  4. package/build/lib/db/schemas/020_workflow_certified.sql +34 -0
  5. package/build/modules/ltconfig.d.ts +3 -2
  6. package/build/modules/ltconfig.js +4 -4
  7. package/build/routes/workflows/config.js +1 -0
  8. package/build/services/config/cache.js +1 -0
  9. package/build/services/config/read.js +2 -0
  10. package/build/services/config/sql.d.ts +2 -2
  11. package/build/services/config/sql.js +6 -5
  12. package/build/services/config/write.js +13 -0
  13. package/build/services/escalation/bulk.d.ts +3 -1
  14. package/build/services/escalation/bulk.js +3 -1
  15. package/build/services/escalation/crud.d.ts +4 -3
  16. package/build/services/escalation/crud.js +4 -3
  17. package/build/start/workers.js +1 -0
  18. package/build/system/mcp-servers/admin/schemas.d.ts +3 -0
  19. package/build/system/mcp-servers/admin/schemas.js +3 -1
  20. package/build/system/mcp-servers/admin/workflow-config.js +1 -0
  21. package/build/types/config.d.ts +16 -0
  22. package/build/types/startup.d.ts +11 -1
  23. package/dashboard/dist/assets/AdminDashboard-Ck5-jV9T.js +2 -0
  24. package/dashboard/dist/assets/{AdminDashboard-Bgomc_jH.js.map → AdminDashboard-Ck5-jV9T.js.map} +1 -1
  25. package/dashboard/dist/assets/AgentConfigPage-DFiXRBWs.js +16 -0
  26. package/dashboard/dist/assets/AgentConfigPage-DFiXRBWs.js.map +1 -0
  27. package/dashboard/dist/assets/AgentDetailPage-BBgM_pMe.js +4 -0
  28. package/dashboard/dist/assets/AgentDetailPage-BBgM_pMe.js.map +1 -0
  29. package/dashboard/dist/assets/AgentsPage-DxwFuedf.js +2 -0
  30. package/dashboard/dist/assets/AgentsPage-DxwFuedf.js.map +1 -0
  31. package/dashboard/dist/assets/AvailableEscalationsPage-DNQbeIcn.js +2 -0
  32. package/dashboard/dist/assets/{AvailableEscalationsPage-C9DAtNGp.js.map → AvailableEscalationsPage-DNQbeIcn.js.map} +1 -1
  33. package/dashboard/dist/assets/BotPicker-mqwKVOE3.js +2 -0
  34. package/dashboard/dist/assets/{BotPicker-MnI3OyE7.js.map → BotPicker-mqwKVOE3.js.map} +1 -1
  35. package/dashboard/dist/assets/CapabilitiesPage-Biffm0kW.js +2 -0
  36. package/dashboard/dist/assets/CapabilitiesPage-Biffm0kW.js.map +1 -0
  37. package/dashboard/dist/assets/CollapsibleSection-Bn6Ks79X.js +2 -0
  38. package/dashboard/dist/assets/{CollapsibleSection-Ne-Q3QFM.js.map → CollapsibleSection-Bn6Ks79X.js.map} +1 -1
  39. package/dashboard/dist/assets/ConfirmDeleteModal-no0-c_1G.js +2 -0
  40. package/dashboard/dist/assets/{ConfirmDeleteModal-D9_1b4MW.js.map → ConfirmDeleteModal-no0-c_1G.js.map} +1 -1
  41. package/dashboard/dist/assets/CopyableId-DS6IDMIX.js +2 -0
  42. package/dashboard/dist/assets/{CopyableId-blg-gZvT.js.map → CopyableId-DS6IDMIX.js.map} +1 -1
  43. package/dashboard/dist/assets/CredentialsPage-C3NyncEB.js +2 -0
  44. package/dashboard/dist/assets/CredentialsPage-C3NyncEB.js.map +1 -0
  45. package/dashboard/dist/assets/CronLabel-DQWBx57H.js +2 -0
  46. package/dashboard/dist/assets/CronLabel-DQWBx57H.js.map +1 -0
  47. package/dashboard/dist/assets/CustomDurationPicker-DV42oZ1G.js +2 -0
  48. package/dashboard/dist/assets/{CustomDurationPicker-Cp1fgzPX.js.map → CustomDurationPicker-DV42oZ1G.js.map} +1 -1
  49. package/dashboard/dist/assets/DataTable-Bf4dgxll.js +2 -0
  50. package/dashboard/dist/assets/{DataTable-ZWgVQg7F.js.map → DataTable-Bf4dgxll.js.map} +1 -1
  51. package/dashboard/dist/assets/DropZone-CTSXBb3c.js +2 -0
  52. package/dashboard/dist/assets/{DropZone-CZDmNBn-.js.map → DropZone-CTSXBb3c.js.map} +1 -1
  53. package/dashboard/dist/assets/ElapsedCell-roy4G5SQ.js +2 -0
  54. package/dashboard/dist/assets/{ElapsedCell-Gr5UlUbn.js.map → ElapsedCell-roy4G5SQ.js.map} +1 -1
  55. package/dashboard/dist/assets/EmptyState-CLVm9KmA.js +2 -0
  56. package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js.map → EmptyState-CLVm9KmA.js.map} +1 -1
  57. package/dashboard/dist/assets/EscalationSchemaPage-DulCCxea.js +9 -0
  58. package/dashboard/dist/assets/EscalationSchemaPage-DulCCxea.js.map +1 -0
  59. package/dashboard/dist/assets/EscalationsOverview-DDwxn_mT.js +2 -0
  60. package/dashboard/dist/assets/{EscalationsOverview-BIZVnSBF.js.map → EscalationsOverview-DDwxn_mT.js.map} +1 -1
  61. package/dashboard/dist/assets/EventTable-BaLNvCew.js +2 -0
  62. package/dashboard/dist/assets/EventTable-BaLNvCew.js.map +1 -0
  63. package/dashboard/dist/assets/FilterBar-DEAbNQqp.js +2 -0
  64. package/dashboard/dist/assets/FilterBar-DEAbNQqp.js.map +1 -0
  65. package/dashboard/dist/assets/GraphInvokePage-BmM8r0R3.js +2 -0
  66. package/dashboard/dist/assets/GraphInvokePage-BmM8r0R3.js.map +1 -0
  67. package/dashboard/dist/assets/HomePage-Ds3PzWWr.js +2 -0
  68. package/dashboard/dist/assets/HomePage-Ds3PzWWr.js.map +1 -0
  69. package/dashboard/dist/assets/ListToolbar-Dviaskni.js +2 -0
  70. package/dashboard/dist/assets/{ListToolbar-CdmIvEIF.js.map → ListToolbar-Dviaskni.js.map} +1 -1
  71. package/dashboard/dist/assets/McpOverview-BBm66wbF.js +2 -0
  72. package/dashboard/dist/assets/{McpOverview-C-Ypezuv.js.map → McpOverview-BBm66wbF.js.map} +1 -1
  73. package/dashboard/dist/assets/McpQueryDetailPage-B6GJOMcz.js +5 -0
  74. package/dashboard/dist/assets/McpQueryDetailPage-B6GJOMcz.js.map +1 -0
  75. package/dashboard/dist/assets/McpQueryPage-C-8nIdBL.js +2 -0
  76. package/dashboard/dist/assets/McpQueryPage-C-8nIdBL.js.map +1 -0
  77. package/dashboard/dist/assets/McpRunDetailPage-CSq_0qqi.js +2 -0
  78. package/dashboard/dist/assets/{McpRunDetailPage-B1sCxKLD.js.map → McpRunDetailPage-CSq_0qqi.js.map} +1 -1
  79. package/dashboard/dist/assets/McpRunsPage-BdK8ahX7.js +2 -0
  80. package/dashboard/dist/assets/McpRunsPage-BdK8ahX7.js.map +1 -0
  81. package/dashboard/dist/assets/Modal-C6HI6btY.js +2 -0
  82. package/dashboard/dist/assets/{Modal-CSrxpXeM.js.map → Modal-C6HI6btY.js.map} +1 -1
  83. package/dashboard/dist/assets/NamespacePill-eGsbJBFa.js +2 -0
  84. package/dashboard/dist/assets/{NamespacePill-DlqBTvFR.js.map → NamespacePill-eGsbJBFa.js.map} +1 -1
  85. package/dashboard/dist/assets/OperationsPage-DODPFmf2.js +2 -0
  86. package/dashboard/dist/assets/OperationsPage-DODPFmf2.js.map +1 -0
  87. package/dashboard/dist/assets/OperatorDashboard-BbmgsOmQ.js +2 -0
  88. package/dashboard/dist/assets/{OperatorDashboard-YP6kP-f_.js.map → OperatorDashboard-BbmgsOmQ.js.map} +1 -1
  89. package/dashboard/dist/assets/PageHeader-DcgGV0Y2.js +2 -0
  90. package/dashboard/dist/assets/{PageHeader-CFta2VaS.js.map → PageHeader-DcgGV0Y2.js.map} +1 -1
  91. package/dashboard/dist/assets/PageHeaderWithStats-Cf8TYFRh.js +2 -0
  92. package/dashboard/dist/assets/PageHeaderWithStats-Cf8TYFRh.js.map +1 -0
  93. package/dashboard/dist/assets/PriorityBadge-a7u8C9uY.js +2 -0
  94. package/dashboard/dist/assets/{PriorityBadge-B4ykBH7f.js.map → PriorityBadge-a7u8C9uY.js.map} +1 -1
  95. package/dashboard/dist/assets/ProcessDetailPage-D80w44rV.js +2 -0
  96. package/dashboard/dist/assets/ProcessDetailPage-D80w44rV.js.map +1 -0
  97. package/dashboard/dist/assets/ProcessesListPage-BjW5xUkv.js +2 -0
  98. package/dashboard/dist/assets/{ProcessesListPage-BNhFwTLl.js.map → ProcessesListPage-BjW5xUkv.js.map} +1 -1
  99. package/dashboard/dist/assets/RoleDetailPage-oahg0cdT.js +11 -0
  100. package/dashboard/dist/assets/RoleDetailPage-oahg0cdT.js.map +1 -0
  101. package/dashboard/dist/assets/RolePill-BAeaQUXX.js +2 -0
  102. package/dashboard/dist/assets/RolePill-BAeaQUXX.js.map +1 -0
  103. package/dashboard/dist/assets/RolesPage-BI1Xtqq_.js +2 -0
  104. package/dashboard/dist/assets/RolesPage-BI1Xtqq_.js.map +1 -0
  105. package/dashboard/dist/assets/RowActions--m4F6GW8.js +2 -0
  106. package/dashboard/dist/assets/{RowActions-BA9L9djf.js.map → RowActions--m4F6GW8.js.map} +1 -1
  107. package/dashboard/dist/assets/RunAsSelector-DiGzSfiG.js +2 -0
  108. package/dashboard/dist/assets/{RunAsSelector-CokM3Ifp.js.map → RunAsSelector-DiGzSfiG.js.map} +1 -1
  109. package/dashboard/dist/assets/StatCard-DCPGFzCv.js +2 -0
  110. package/dashboard/dist/assets/StatCard-DCPGFzCv.js.map +1 -0
  111. package/dashboard/dist/assets/StatusBadge-mk-dJwPT.js +2 -0
  112. package/dashboard/dist/assets/{StatusBadge-D9MeQHrh.js.map → StatusBadge-mk-dJwPT.js.map} +1 -1
  113. package/dashboard/dist/assets/StickyPagination-Clm9H840.js +2 -0
  114. package/dashboard/dist/assets/{StickyPagination-_H2j2CAH.js.map → StickyPagination-Clm9H840.js.map} +1 -1
  115. package/dashboard/dist/assets/StreamMessageDetail-Bikvs1Cz.js +2 -0
  116. package/dashboard/dist/assets/StreamMessageDetail-Bikvs1Cz.js.map +1 -0
  117. package/dashboard/dist/assets/SwimlaneTimeline-C9X3IVqI.js +2 -0
  118. package/dashboard/dist/assets/SwimlaneTimeline-C9X3IVqI.js.map +1 -0
  119. package/dashboard/dist/assets/TagInput-DmJLnghg.js +2 -0
  120. package/dashboard/dist/assets/{TagInput-CQg-TrV9.js.map → TagInput-DmJLnghg.js.map} +1 -1
  121. package/dashboard/dist/assets/TaskDetailPage-C0tbiUi7.js +2 -0
  122. package/dashboard/dist/assets/TaskDetailPage-C0tbiUi7.js.map +1 -0
  123. package/dashboard/dist/assets/TaskQueuePill--1OX6egx.js +2 -0
  124. package/dashboard/dist/assets/{TaskQueuePill-DyvtL8X4.js.map → TaskQueuePill--1OX6egx.js.map} +1 -1
  125. package/dashboard/dist/assets/TasksListPage-DcYV-GMA.js +2 -0
  126. package/dashboard/dist/assets/{TasksListPage-B71FxvrY.js.map → TasksListPage-DcYV-GMA.js.map} +1 -1
  127. package/dashboard/dist/assets/TimeAgo-pYn3T9IZ.js +2 -0
  128. package/dashboard/dist/assets/{TimeAgo-JgT0U_sd.js.map → TimeAgo-pYn3T9IZ.js.map} +1 -1
  129. package/dashboard/dist/assets/TimestampCell-BPMCscic.js +2 -0
  130. package/dashboard/dist/assets/{TimestampCell-gEreK8Nn.js.map → TimestampCell-BPMCscic.js.map} +1 -1
  131. package/dashboard/dist/assets/ToolPill-BnF9lCUX.js +2 -0
  132. package/dashboard/dist/assets/{ToolPill-miuRcj1Q.js.map → ToolPill-BnF9lCUX.js.map} +1 -1
  133. package/dashboard/dist/assets/ToolTestPanel-Bw4z_Tya.js +2 -0
  134. package/dashboard/dist/assets/{ToolTestPanel-ChfHw9Aq.js.map → ToolTestPanel-Bw4z_Tya.js.map} +1 -1
  135. package/dashboard/dist/assets/TopicDetailPage-CtFztOnn.js +9 -0
  136. package/dashboard/dist/assets/TopicDetailPage-CtFztOnn.js.map +1 -0
  137. package/dashboard/dist/assets/TopicsPage-BXdc6pAU.js +2 -0
  138. package/dashboard/dist/assets/TopicsPage-BXdc6pAU.js.map +1 -0
  139. package/dashboard/dist/assets/UserName-R96NG6xB.js +2 -0
  140. package/dashboard/dist/assets/{UserName-uncbaKYf.js.map → UserName-R96NG6xB.js.map} +1 -1
  141. package/dashboard/dist/assets/WorkflowExecutionPage-DmRJabMQ.js +2 -0
  142. package/dashboard/dist/assets/{WorkflowExecutionPage-DwzLKTkt.js.map → WorkflowExecutionPage-DmRJabMQ.js.map} +1 -1
  143. package/dashboard/dist/assets/WorkflowPill-Cc2MlYbB.js +2 -0
  144. package/dashboard/dist/assets/WorkflowPill-Cc2MlYbB.js.map +1 -0
  145. package/dashboard/dist/assets/WorkflowsDashboard-uLU5ZToY.js +2 -0
  146. package/dashboard/dist/assets/WorkflowsDashboard-uLU5ZToY.js.map +1 -0
  147. package/dashboard/dist/assets/WorkflowsOverview-BhgE0RS8.js +2 -0
  148. package/dashboard/dist/assets/{WorkflowsOverview-ihhW8DiS.js.map → WorkflowsOverview-BhgE0RS8.js.map} +1 -1
  149. package/dashboard/dist/assets/YamlWorkflowDetailPage-CvIgB5y7.js +33 -0
  150. package/dashboard/dist/assets/{YamlWorkflowDetailPage-C61-8y-E.js.map → YamlWorkflowDetailPage-CvIgB5y7.js.map} +1 -1
  151. package/dashboard/dist/assets/YamlWorkflowsPage-DWnsgl2v.js +2 -0
  152. package/dashboard/dist/assets/{YamlWorkflowsPage-CMpgsLEo.js.map → YamlWorkflowsPage-DWnsgl2v.js.map} +1 -1
  153. package/dashboard/dist/assets/{agents-27sErp5R.js → agents-BpYMwrsB.js} +2 -2
  154. package/dashboard/dist/assets/{agents-27sErp5R.js.map → agents-BpYMwrsB.js.map} +1 -1
  155. package/dashboard/dist/assets/{bots-CPHuAvjW.js → bots-DI6Wqp5X.js} +2 -2
  156. package/dashboard/dist/assets/{bots-CPHuAvjW.js.map → bots-DI6Wqp5X.js.map} +1 -1
  157. package/dashboard/dist/assets/capabilities-BKZZb8eM.js +2 -0
  158. package/dashboard/dist/assets/{capabilities-BBTPqF-V.js.map → capabilities-BKZZb8eM.js.map} +1 -1
  159. package/dashboard/dist/assets/{controlplane-C9j2mwX8.js → controlplane-Djshb7fm.js} +2 -2
  160. package/dashboard/dist/assets/{controlplane-C9j2mwX8.js.map → controlplane-Djshb7fm.js.map} +1 -1
  161. package/dashboard/dist/assets/escalation-D8mrXtjS.js +2 -0
  162. package/dashboard/dist/assets/{escalation-CyJ_wz-f.js.map → escalation-D8mrXtjS.js.map} +1 -1
  163. package/dashboard/dist/assets/escalation-columns-CyLzgPkz.js +2 -0
  164. package/dashboard/dist/assets/escalation-columns-CyLzgPkz.js.map +1 -0
  165. package/dashboard/dist/assets/index-B5MAG4Uv.js +2 -0
  166. package/dashboard/dist/assets/{index-CCHGKErT.js.map → index-B5MAG4Uv.js.map} +1 -1
  167. package/dashboard/dist/assets/index-BfxiRwk2.js +6 -0
  168. package/dashboard/dist/assets/index-BfxiRwk2.js.map +1 -0
  169. package/dashboard/dist/assets/index-C71I-f5G.js +2 -0
  170. package/dashboard/dist/assets/{index-D9pi0fs6.js.map → index-C71I-f5G.js.map} +1 -1
  171. package/dashboard/dist/assets/index-CC4g-6QE.css +1 -0
  172. package/dashboard/dist/assets/index-CJb3dXku.js +2 -0
  173. package/dashboard/dist/assets/index-CJb3dXku.js.map +1 -0
  174. package/dashboard/dist/assets/index-CQtv2rj6.js +2 -0
  175. package/dashboard/dist/assets/index-CQtv2rj6.js.map +1 -0
  176. package/dashboard/dist/assets/index-CphzO7b8.js +2 -0
  177. package/dashboard/dist/assets/{index-CNprOGuS.js.map → index-CphzO7b8.js.map} +1 -1
  178. package/dashboard/dist/assets/index-CwAmiy_j.js +2 -0
  179. package/dashboard/dist/assets/index-CwAmiy_j.js.map +1 -0
  180. package/dashboard/dist/assets/index-DgCS2Frb.js +281 -0
  181. package/dashboard/dist/assets/index-DgCS2Frb.js.map +1 -0
  182. package/dashboard/dist/assets/index-DkbnD-Te.js +2 -0
  183. package/dashboard/dist/assets/{index-Dzqt3g-K.js.map → index-DkbnD-Te.js.map} +1 -1
  184. package/dashboard/dist/assets/index-Y6yj36QR.js +9 -0
  185. package/dashboard/dist/assets/index-Y6yj36QR.js.map +1 -0
  186. package/dashboard/dist/assets/index-eshNd6NY.js +6 -0
  187. package/dashboard/dist/assets/{index-BiLZJ43R.js.map → index-eshNd6NY.js.map} +1 -1
  188. package/dashboard/dist/assets/index-xn9fmkHC.js +2 -0
  189. package/dashboard/dist/assets/index-xn9fmkHC.js.map +1 -0
  190. package/dashboard/dist/assets/index-yxnQew1X.js +2 -0
  191. package/dashboard/dist/assets/index-yxnQew1X.js.map +1 -0
  192. package/dashboard/dist/assets/{knowledge-BErJA3Je.js → knowledge-C_1r0faY.js} +2 -2
  193. package/dashboard/dist/assets/{knowledge-BErJA3Je.js.map → knowledge-C_1r0faY.js.map} +1 -1
  194. package/dashboard/dist/assets/{mcp-Cx9L42EN.js → mcp-BtG54ZAx.js} +2 -2
  195. package/dashboard/dist/assets/{mcp-Cx9L42EN.js.map → mcp-BtG54ZAx.js.map} +1 -1
  196. package/dashboard/dist/assets/{mcp-query-Cf6kcBoW.js → mcp-query-CSdQWxmv.js} +2 -2
  197. package/dashboard/dist/assets/{mcp-query-Cf6kcBoW.js.map → mcp-query-CSdQWxmv.js.map} +1 -1
  198. package/dashboard/dist/assets/{pipelines-CFctrv71.js → pipelines-DVkwxN64.js} +2 -2
  199. package/dashboard/dist/assets/{pipelines-CFctrv71.js.map → pipelines-DVkwxN64.js.map} +1 -1
  200. package/dashboard/dist/assets/{roles-CCXZtqDr.js → roles-CpRcUIMm.js} +2 -2
  201. package/dashboard/dist/assets/{roles-CCXZtqDr.js.map → roles-CpRcUIMm.js.map} +1 -1
  202. package/dashboard/dist/assets/{tasks-BPNj8ZWL.js → tasks-DNdvW5H6.js} +2 -2
  203. package/dashboard/dist/assets/{tasks-BPNj8ZWL.js.map → tasks-DNdvW5H6.js.map} +1 -1
  204. package/dashboard/dist/assets/{topics-CR4UBuSV.js → topics-DNC77Chw.js} +2 -2
  205. package/dashboard/dist/assets/{topics-CR4UBuSV.js.map → topics-DNC77Chw.js.map} +1 -1
  206. package/dashboard/dist/assets/{useCollapsedSections-BU5HULGs.js → useCollapsedSections-CGNA5oKV.js} +2 -2
  207. package/dashboard/dist/assets/{useCollapsedSections-BU5HULGs.js.map → useCollapsedSections-CGNA5oKV.js.map} +1 -1
  208. package/dashboard/dist/assets/{useDebouncedValue-BA5S7V54.js → useDebouncedValue-DmL3uNt_.js} +2 -2
  209. package/dashboard/dist/assets/{useDebouncedValue-BA5S7V54.js.map → useDebouncedValue-DmL3uNt_.js.map} +1 -1
  210. package/dashboard/dist/assets/{useEventHooks-BgdnN8Rj.js → useEventHooks-CUUeBSH1.js} +2 -2
  211. package/dashboard/dist/assets/{useEventHooks-BgdnN8Rj.js.map → useEventHooks-CUUeBSH1.js.map} +1 -1
  212. package/dashboard/dist/assets/{useFilterParams-x-Dg0Vgz.js → useFilterParams-Ch-a71bE.js} +2 -2
  213. package/dashboard/dist/assets/{useFilterParams-x-Dg0Vgz.js.map → useFilterParams-Ch-a71bE.js.map} +1 -1
  214. package/dashboard/dist/assets/{useNamespace-BDsKfT0f.js → useNamespace-D-AjLnPK.js} +2 -2
  215. package/dashboard/dist/assets/{useNamespace-BDsKfT0f.js.map → useNamespace-D-AjLnPK.js.map} +1 -1
  216. package/dashboard/dist/assets/{useYamlActivityEvents-CWZwHIlR.js → useYamlActivityEvents-DRdetOb_.js} +2 -2
  217. package/dashboard/dist/assets/{useYamlActivityEvents-CWZwHIlR.js.map → useYamlActivityEvents-DRdetOb_.js.map} +1 -1
  218. package/dashboard/dist/assets/{users-BqmKVXR1.js → users-BUgdEsec.js} +2 -2
  219. package/dashboard/dist/assets/{users-BqmKVXR1.js.map → users-BUgdEsec.js.map} +1 -1
  220. package/dashboard/dist/assets/{vendor-icons-BaQqUm-e.js → vendor-icons-CNyYGNsk.js} +3 -3
  221. package/dashboard/dist/assets/{vendor-icons-BaQqUm-e.js.map → vendor-icons-CNyYGNsk.js.map} +1 -1
  222. package/dashboard/dist/assets/vendor-query-DLp59M9_.js +35 -0
  223. package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +1 -0
  224. package/dashboard/dist/assets/vendor-react-zA2lQFDs.js +26 -0
  225. package/dashboard/dist/assets/vendor-react-zA2lQFDs.js.map +1 -0
  226. package/dashboard/dist/assets/{workflows-Dps45zjk.js → workflows-BfyR5VJt.js} +2 -2
  227. package/dashboard/dist/assets/workflows-BfyR5VJt.js.map +1 -0
  228. package/dashboard/dist/assets/{yaml-workflows-DhlTkbvY.js → yaml-workflows-Bz7yEnhl.js} +2 -2
  229. package/dashboard/dist/assets/{yaml-workflows-DhlTkbvY.js.map → yaml-workflows-Bz7yEnhl.js.map} +1 -1
  230. package/dashboard/dist/index.html +5 -5
  231. package/docs/api/http/escalations.md +3 -3
  232. package/docs/api/http/workflows.md +2 -1
  233. package/docs/api/mcp/admin.md +13 -7
  234. package/docs/api/sdk/escalations.md +3 -1
  235. package/docs/api/sdk/workflows.md +3 -2
  236. package/docs/architecture.md +2 -2
  237. package/docs/dashboard.md +6 -5
  238. package/docs/iam.md +3 -3
  239. package/docs/workflows.md +7 -5
  240. package/package.json +2 -2
  241. package/dashboard/dist/assets/AdminDashboard-Bgomc_jH.js +0 -2
  242. package/dashboard/dist/assets/AgentConfigPage-C6gDgz21.js +0 -16
  243. package/dashboard/dist/assets/AgentConfigPage-C6gDgz21.js.map +0 -1
  244. package/dashboard/dist/assets/AgentDetailPage-0rrH5FmV.js +0 -4
  245. package/dashboard/dist/assets/AgentDetailPage-0rrH5FmV.js.map +0 -1
  246. package/dashboard/dist/assets/AgentsPage-DkIU2zed.js +0 -2
  247. package/dashboard/dist/assets/AgentsPage-DkIU2zed.js.map +0 -1
  248. package/dashboard/dist/assets/AvailableEscalationsPage-C9DAtNGp.js +0 -2
  249. package/dashboard/dist/assets/BotPicker-MnI3OyE7.js +0 -2
  250. package/dashboard/dist/assets/CapabilitiesPage-Cv_AD_5i.js +0 -2
  251. package/dashboard/dist/assets/CapabilitiesPage-Cv_AD_5i.js.map +0 -1
  252. package/dashboard/dist/assets/CollapsibleSection-Ne-Q3QFM.js +0 -2
  253. package/dashboard/dist/assets/ConfirmDeleteModal-D9_1b4MW.js +0 -2
  254. package/dashboard/dist/assets/CopyableId-blg-gZvT.js +0 -2
  255. package/dashboard/dist/assets/CredentialsPage-B3Mfwl22.js +0 -2
  256. package/dashboard/dist/assets/CredentialsPage-B3Mfwl22.js.map +0 -1
  257. package/dashboard/dist/assets/CronLabel-CtjUBRPo.js +0 -2
  258. package/dashboard/dist/assets/CronLabel-CtjUBRPo.js.map +0 -1
  259. package/dashboard/dist/assets/CustomDurationPicker-Cp1fgzPX.js +0 -2
  260. package/dashboard/dist/assets/DataTable-ZWgVQg7F.js +0 -2
  261. package/dashboard/dist/assets/DropZone-CZDmNBn-.js +0 -2
  262. package/dashboard/dist/assets/ElapsedCell-Gr5UlUbn.js +0 -2
  263. package/dashboard/dist/assets/EmptyState-BcsfPq9T.js +0 -2
  264. package/dashboard/dist/assets/EscalationSchemaPage-C5tuV6SJ.js +0 -9
  265. package/dashboard/dist/assets/EscalationSchemaPage-C5tuV6SJ.js.map +0 -1
  266. package/dashboard/dist/assets/EscalationsOverview-BIZVnSBF.js +0 -2
  267. package/dashboard/dist/assets/EventTable-90aUfsNr.js +0 -2
  268. package/dashboard/dist/assets/EventTable-90aUfsNr.js.map +0 -1
  269. package/dashboard/dist/assets/FilterBar-BQ2JGg8U.js +0 -2
  270. package/dashboard/dist/assets/FilterBar-BQ2JGg8U.js.map +0 -1
  271. package/dashboard/dist/assets/GraphInvokePage-Io5ZucT8.js +0 -2
  272. package/dashboard/dist/assets/GraphInvokePage-Io5ZucT8.js.map +0 -1
  273. package/dashboard/dist/assets/HomePage-Cu0vUzTF.js +0 -2
  274. package/dashboard/dist/assets/HomePage-Cu0vUzTF.js.map +0 -1
  275. package/dashboard/dist/assets/ListToolbar-CdmIvEIF.js +0 -2
  276. package/dashboard/dist/assets/McpOverview-C-Ypezuv.js +0 -2
  277. package/dashboard/dist/assets/McpQueryDetailPage-DdontKcj.js +0 -5
  278. package/dashboard/dist/assets/McpQueryDetailPage-DdontKcj.js.map +0 -1
  279. package/dashboard/dist/assets/McpQueryPage-D-1TaOGG.js +0 -2
  280. package/dashboard/dist/assets/McpQueryPage-D-1TaOGG.js.map +0 -1
  281. package/dashboard/dist/assets/McpRunDetailPage-B1sCxKLD.js +0 -2
  282. package/dashboard/dist/assets/McpRunsPage-eWJ7cDa3.js +0 -2
  283. package/dashboard/dist/assets/McpRunsPage-eWJ7cDa3.js.map +0 -1
  284. package/dashboard/dist/assets/Modal-CSrxpXeM.js +0 -2
  285. package/dashboard/dist/assets/NamespacePill-DlqBTvFR.js +0 -2
  286. package/dashboard/dist/assets/OperationsPage-C5phWL0O.js +0 -2
  287. package/dashboard/dist/assets/OperationsPage-C5phWL0O.js.map +0 -1
  288. package/dashboard/dist/assets/OperatorDashboard-YP6kP-f_.js +0 -2
  289. package/dashboard/dist/assets/PageHeader-CFta2VaS.js +0 -2
  290. package/dashboard/dist/assets/PageHeaderWithStats-CcVAji-7.js +0 -2
  291. package/dashboard/dist/assets/PageHeaderWithStats-CcVAji-7.js.map +0 -1
  292. package/dashboard/dist/assets/PriorityBadge-B4ykBH7f.js +0 -2
  293. package/dashboard/dist/assets/ProcessDetailPage-C_BXQvBs.js +0 -2
  294. package/dashboard/dist/assets/ProcessDetailPage-C_BXQvBs.js.map +0 -1
  295. package/dashboard/dist/assets/ProcessesListPage-BNhFwTLl.js +0 -2
  296. package/dashboard/dist/assets/RoleDetailPage-8GLNjj9I.js +0 -11
  297. package/dashboard/dist/assets/RoleDetailPage-8GLNjj9I.js.map +0 -1
  298. package/dashboard/dist/assets/RolePill-CXEyPMqb.js +0 -2
  299. package/dashboard/dist/assets/RolePill-CXEyPMqb.js.map +0 -1
  300. package/dashboard/dist/assets/RolesPage-B59tE2lZ.js +0 -2
  301. package/dashboard/dist/assets/RolesPage-B59tE2lZ.js.map +0 -1
  302. package/dashboard/dist/assets/RowActions-BA9L9djf.js +0 -2
  303. package/dashboard/dist/assets/RunAsSelector-CokM3Ifp.js +0 -2
  304. package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
  305. package/dashboard/dist/assets/StatCard-DlgF0CJC.js.map +0 -1
  306. package/dashboard/dist/assets/StatusBadge-D9MeQHrh.js +0 -2
  307. package/dashboard/dist/assets/StickyPagination-_H2j2CAH.js +0 -2
  308. package/dashboard/dist/assets/StreamMessageDetail-sSfHDYIa.js +0 -2
  309. package/dashboard/dist/assets/StreamMessageDetail-sSfHDYIa.js.map +0 -1
  310. package/dashboard/dist/assets/SwimlaneTimeline-LZWtfBK3.js +0 -2
  311. package/dashboard/dist/assets/SwimlaneTimeline-LZWtfBK3.js.map +0 -1
  312. package/dashboard/dist/assets/TagInput-CQg-TrV9.js +0 -2
  313. package/dashboard/dist/assets/TaskDetailPage-CHBV2V6R.js +0 -2
  314. package/dashboard/dist/assets/TaskDetailPage-CHBV2V6R.js.map +0 -1
  315. package/dashboard/dist/assets/TaskQueuePill-DyvtL8X4.js +0 -2
  316. package/dashboard/dist/assets/TasksListPage-B71FxvrY.js +0 -2
  317. package/dashboard/dist/assets/TimeAgo-JgT0U_sd.js +0 -2
  318. package/dashboard/dist/assets/TimestampCell-gEreK8Nn.js +0 -2
  319. package/dashboard/dist/assets/ToolPill-miuRcj1Q.js +0 -2
  320. package/dashboard/dist/assets/ToolTestPanel-ChfHw9Aq.js +0 -2
  321. package/dashboard/dist/assets/TopicDetailPage-DigI0HGt.js +0 -9
  322. package/dashboard/dist/assets/TopicDetailPage-DigI0HGt.js.map +0 -1
  323. package/dashboard/dist/assets/TopicsPage-BHjlFpPN.js +0 -2
  324. package/dashboard/dist/assets/TopicsPage-BHjlFpPN.js.map +0 -1
  325. package/dashboard/dist/assets/UserName-uncbaKYf.js +0 -2
  326. package/dashboard/dist/assets/WorkflowExecutionPage-DwzLKTkt.js +0 -2
  327. package/dashboard/dist/assets/WorkflowPill-BegV-iRF.js +0 -2
  328. package/dashboard/dist/assets/WorkflowPill-BegV-iRF.js.map +0 -1
  329. package/dashboard/dist/assets/WorkflowsDashboard-rpnGhGnl.js +0 -2
  330. package/dashboard/dist/assets/WorkflowsDashboard-rpnGhGnl.js.map +0 -1
  331. package/dashboard/dist/assets/WorkflowsOverview-ihhW8DiS.js +0 -2
  332. package/dashboard/dist/assets/YamlWorkflowDetailPage-C61-8y-E.js +0 -33
  333. package/dashboard/dist/assets/YamlWorkflowsPage-CMpgsLEo.js +0 -2
  334. package/dashboard/dist/assets/capabilities-BBTPqF-V.js +0 -2
  335. package/dashboard/dist/assets/escalation-CyJ_wz-f.js +0 -2
  336. package/dashboard/dist/assets/escalation-columns-DU4Jyxxo.js +0 -2
  337. package/dashboard/dist/assets/escalation-columns-DU4Jyxxo.js.map +0 -1
  338. package/dashboard/dist/assets/index-BBQggGcf.js +0 -2
  339. package/dashboard/dist/assets/index-BBQggGcf.js.map +0 -1
  340. package/dashboard/dist/assets/index-BHS-ubrT.js +0 -6
  341. package/dashboard/dist/assets/index-BHS-ubrT.js.map +0 -1
  342. package/dashboard/dist/assets/index-BVHXREYZ.js +0 -2
  343. package/dashboard/dist/assets/index-BVHXREYZ.js.map +0 -1
  344. package/dashboard/dist/assets/index-BiLZJ43R.js +0 -6
  345. package/dashboard/dist/assets/index-BoZydcaW.js +0 -63
  346. package/dashboard/dist/assets/index-BoZydcaW.js.map +0 -1
  347. package/dashboard/dist/assets/index-CCHGKErT.js +0 -2
  348. package/dashboard/dist/assets/index-CNprOGuS.js +0 -2
  349. package/dashboard/dist/assets/index-CZ6-l8_0.css +0 -1
  350. package/dashboard/dist/assets/index-CgeFUhUr.js +0 -2
  351. package/dashboard/dist/assets/index-CgeFUhUr.js.map +0 -1
  352. package/dashboard/dist/assets/index-ChniBGqD.js +0 -9
  353. package/dashboard/dist/assets/index-ChniBGqD.js.map +0 -1
  354. package/dashboard/dist/assets/index-CjXzZ19T.js +0 -2
  355. package/dashboard/dist/assets/index-CjXzZ19T.js.map +0 -1
  356. package/dashboard/dist/assets/index-D9pi0fs6.js +0 -2
  357. package/dashboard/dist/assets/index-DoivEaUZ.js +0 -2
  358. package/dashboard/dist/assets/index-DoivEaUZ.js.map +0 -1
  359. package/dashboard/dist/assets/index-Dzqt3g-K.js +0 -2
  360. package/dashboard/dist/assets/vendor-query-B2UbickB.js +0 -18
  361. package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +0 -1
  362. package/dashboard/dist/assets/vendor-react-CXumBFUA.js +0 -22
  363. package/dashboard/dist/assets/vendor-react-CXumBFUA.js.map +0 -1
  364. package/dashboard/dist/assets/workflows-Dps45zjk.js.map +0 -1
@@ -22,11 +22,16 @@ export declare function getWorkflowConfig(input: {
22
22
  *
23
23
  * @param input.type — workflow type name
24
24
  * @param input.invocable — whether the workflow can be started via the API
25
+ * @param input.certified — explicit HITL certification (interceptor treatment).
26
+ * Omitted → derived from roles/consumes presence, preserving the behavior of
27
+ * callers that predate the explicit flag.
25
28
  * @param input.task_queue — HotMesh task queue
26
29
  * @param input.default_role — default escalation role
27
30
  * @param input.description — human-readable description
28
31
  * @param input.execute_as — service account for proxy invocation
29
- * @param input.roles — roles that can resolve escalations
32
+ * @param input.roles — interceptor default for who resolves interceptor-raised
33
+ * escalations (deprecated as formalization — the escalation's role carries
34
+ * the versioned schema and takes precedence)
30
35
  * @param input.invocation_roles — roles that can invoke this workflow
31
36
  * @param input.consumes — workflow types whose data this workflow consumes
32
37
  * @param input.tool_tags — MCP tool tags for discovery
@@ -38,6 +43,7 @@ export declare function getWorkflowConfig(input: {
38
43
  export declare function upsertWorkflowConfig(input: {
39
44
  type: string;
40
45
  invocable?: boolean;
46
+ certified?: boolean;
41
47
  task_queue?: string | null;
42
48
  default_role?: string;
43
49
  description?: string | null;
@@ -80,11 +80,16 @@ async function getWorkflowConfig(input) {
80
80
  *
81
81
  * @param input.type — workflow type name
82
82
  * @param input.invocable — whether the workflow can be started via the API
83
+ * @param input.certified — explicit HITL certification (interceptor treatment).
84
+ * Omitted → derived from roles/consumes presence, preserving the behavior of
85
+ * callers that predate the explicit flag.
83
86
  * @param input.task_queue — HotMesh task queue
84
87
  * @param input.default_role — default escalation role
85
88
  * @param input.description — human-readable description
86
89
  * @param input.execute_as — service account for proxy invocation
87
- * @param input.roles — roles that can resolve escalations
90
+ * @param input.roles — interceptor default for who resolves interceptor-raised
91
+ * escalations (deprecated as formalization — the escalation's role carries
92
+ * the versioned schema and takes precedence)
88
93
  * @param input.invocation_roles — roles that can invoke this workflow
89
94
  * @param input.consumes — workflow types whose data this workflow consumes
90
95
  * @param input.tool_tags — MCP tool tags for discovery
@@ -103,6 +108,7 @@ async function upsertWorkflowConfig(input) {
103
108
  const config = await configService.upsertWorkflowConfig({
104
109
  workflow_type: input.type,
105
110
  invocable: input.invocable ?? false,
111
+ certified: input.certified,
106
112
  task_queue: input.task_queue ?? null,
107
113
  default_role: input.default_role ?? 'reviewer',
108
114
  description: input.description ?? null,
@@ -105,10 +105,7 @@ async function listDiscoveredWorkflows(input) {
105
105
  .map((workflowType) => {
106
106
  const config = configMap.get(workflowType);
107
107
  const worker = activeWorkers.get(workflowType);
108
- const hasCertification = !!(config &&
109
- ((config.roles?.length ?? 0) > 0 ||
110
- (config.consumes?.length ?? 0) > 0));
111
- const tier = !config ? 'durable' : hasCertification ? 'certified' : 'configured';
108
+ const tier = !config ? 'durable' : config.certified ? 'certified' : 'registered';
112
109
  return {
113
110
  workflow_type: workflowType,
114
111
  task_queue: config?.task_queue ?? worker?.taskQueue ?? null,
@@ -0,0 +1,34 @@
1
+ -- Migration 020: Explicit workflow certification
2
+ --
3
+ -- Certification becomes a declared property of the workflow registration,
4
+ -- stored on the row. Before this, the tier was derived: a registered workflow
5
+ -- counted as certified whenever it had escalation roles or consumes — so
6
+ -- demoting a certified workflow to plain registered meant deleting its
7
+ -- escalation roles and provider references. With the explicit flag, the three
8
+ -- tiers are direct states:
9
+ --
10
+ -- default — no row in lt_config_workflows (ad-hoc durable workflow)
11
+ -- registered — row exists, certified = false (invocation + entry schema)
12
+ -- certified — row exists, certified = true (interceptor: task tracking,
13
+ -- escalation handling, re-run detection)
14
+ --
15
+ -- Escalation formalization (who resolves, with what schema) belongs to the
16
+ -- escalation and its role — roles carry the versioned escalation schema and
17
+ -- take precedence. The workflow-level roles/resolver_schema remain as
18
+ -- interceptor defaults only.
19
+ --
20
+ -- The backfill runs once (schema_migrations tracked): rows that were
21
+ -- implicitly certified under the derived rule keep their tier.
22
+
23
+ ALTER TABLE lt_config_workflows
24
+ ADD COLUMN IF NOT EXISTS certified BOOLEAN NOT NULL DEFAULT false;
25
+
26
+ UPDATE lt_config_workflows w
27
+ SET certified = true
28
+ WHERE certified = false
29
+ AND (
30
+ cardinality(w.consumes) > 0
31
+ OR EXISTS (
32
+ SELECT 1 FROM lt_config_roles r WHERE r.workflow_type = w.workflow_type
33
+ )
34
+ );
@@ -19,8 +19,9 @@ declare class LTConfigCache {
19
19
  *
20
20
  * The interceptor uses this to decide whether to wrap the workflow
21
21
  * with task tracking, escalation handling, and re-run detection.
22
- * Configured-but-not-certified workflows (no roles, no consumes)
23
- * return null so the interceptor skips them.
22
+ * Certification is the explicit `certified` flag on the registration
23
+ * registered-but-not-certified workflows return null so the interceptor
24
+ * skips them.
24
25
  */
25
26
  getResolvedConfig(name: string): Promise<LTResolvedConfig | null>;
26
27
  /**
@@ -106,15 +106,15 @@ class LTConfigCache {
106
106
  *
107
107
  * The interceptor uses this to decide whether to wrap the workflow
108
108
  * with task tracking, escalation handling, and re-run detection.
109
- * Configured-but-not-certified workflows (no roles, no consumes)
110
- * return null so the interceptor skips them.
109
+ * Certification is the explicit `certified` flag on the registration
110
+ * registered-but-not-certified workflows return null so the interceptor
111
+ * skips them.
111
112
  */
112
113
  async getResolvedConfig(name) {
113
114
  const config = await this.get(name);
114
115
  if (!config)
115
116
  return null;
116
- const isCertified = (config.roles?.length ?? 0) > 0 || (config.consumes?.length ?? 0) > 0;
117
- return isCertified ? config : null;
117
+ return config.certified ? config : null;
118
118
  }
119
119
  /**
120
120
  * Get the config for any workflow REGISTERED in lt_config_workflows (a row
@@ -63,6 +63,7 @@ router.put('/:type/config', auth_1.requireAdmin, async (req, res) => {
63
63
  const result = await api.upsertWorkflowConfig({
64
64
  type: req.params.type,
65
65
  invocable: req.body.invocable,
66
+ certified: req.body.certified,
66
67
  task_queue: req.body.task_queue,
67
68
  default_role: req.body.default_role,
68
69
  description: req.body.description,
@@ -8,6 +8,7 @@ async function loadAllConfigs() {
8
8
  for (const c of configs) {
9
9
  map.set(c.workflow_type, {
10
10
  invocable: c.invocable,
11
+ certified: c.certified ?? false,
11
12
  taskQueue: c.task_queue,
12
13
  role: c.default_role,
13
14
  roles: c.roles,
@@ -17,6 +17,7 @@ async function getWorkflowConfig(workflowType) {
17
17
  return {
18
18
  workflow_type: wf.workflow_type,
19
19
  invocable: wf.invocable,
20
+ certified: wf.certified ?? false,
20
21
  task_queue: wf.task_queue,
21
22
  default_role: wf.default_role,
22
23
  description: wf.description,
@@ -53,6 +54,7 @@ async function listWorkflowConfigs() {
53
54
  return wfResult.rows.map((wf) => ({
54
55
  workflow_type: wf.workflow_type,
55
56
  invocable: wf.invocable,
57
+ certified: wf.certified ?? false,
56
58
  task_queue: wf.task_queue,
57
59
  default_role: wf.default_role,
58
60
  description: wf.description,
@@ -5,13 +5,13 @@ export declare const LIST_ALL_WORKFLOWS = "SELECT * FROM lt_config_workflows ORD
5
5
  export declare const LIST_ALL_ROLES = "SELECT * FROM lt_config_roles ORDER BY workflow_type, role";
6
6
  export declare const LIST_ALL_INVOCATION_ROLES = "SELECT * FROM lt_config_invocation_roles ORDER BY workflow_type, role";
7
7
  export declare const ENSURE_ROLE_EXISTS = "INSERT INTO lt_roles (role) VALUES ($1) ON CONFLICT DO NOTHING";
8
- export declare const UPSERT_WORKFLOW = "INSERT INTO lt_config_workflows\n (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)\nON CONFLICT (workflow_type) DO UPDATE SET\n invocable = EXCLUDED.invocable,\n task_queue = EXCLUDED.task_queue,\n default_role = EXCLUDED.default_role,\n description = EXCLUDED.description,\n consumes = EXCLUDED.consumes,\n envelope_schema = EXCLUDED.envelope_schema,\n resolver_schema = EXCLUDED.resolver_schema,\n cron_schedule = EXCLUDED.cron_schedule,\n tool_tags = EXCLUDED.tool_tags,\n execute_as = EXCLUDED.execute_as";
8
+ export declare const UPSERT_WORKFLOW = "INSERT INTO lt_config_workflows\n (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\nON CONFLICT (workflow_type) DO UPDATE SET\n invocable = EXCLUDED.invocable,\n task_queue = EXCLUDED.task_queue,\n default_role = EXCLUDED.default_role,\n description = EXCLUDED.description,\n consumes = EXCLUDED.consumes,\n envelope_schema = EXCLUDED.envelope_schema,\n resolver_schema = EXCLUDED.resolver_schema,\n cron_schedule = EXCLUDED.cron_schedule,\n tool_tags = EXCLUDED.tool_tags,\n execute_as = EXCLUDED.execute_as,\n certified = EXCLUDED.certified";
9
9
  export declare const DELETE_CONFIG_ROLES = "DELETE FROM lt_config_roles WHERE workflow_type = $1";
10
10
  export declare const INSERT_CONFIG_ROLE = "INSERT INTO lt_config_roles (workflow_type, role) VALUES ($1, $2)";
11
11
  export declare const DELETE_INVOCATION_ROLES = "DELETE FROM lt_config_invocation_roles WHERE workflow_type = $1";
12
12
  export declare const INSERT_INVOCATION_ROLE = "INSERT INTO lt_config_invocation_roles (workflow_type, role) VALUES ($1, $2)";
13
13
  export declare const DELETE_WORKFLOW = "DELETE FROM lt_config_workflows WHERE workflow_type = $1";
14
- export declare const SEED_WORKFLOW_CONFIG = "INSERT INTO lt_config_workflows\n (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)\nON CONFLICT (workflow_type) DO NOTHING";
14
+ export declare const SEED_WORKFLOW_CONFIG = "INSERT INTO lt_config_workflows\n (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\nON CONFLICT (workflow_type) DO NOTHING";
15
15
  export declare const SEED_CONFIG_ROLE = "INSERT INTO lt_config_roles (workflow_type, role) VALUES ($1, $2)\nON CONFLICT (workflow_type, role) DO NOTHING";
16
16
  export declare const SEED_INVOCATION_ROLE = "INSERT INTO lt_config_invocation_roles (workflow_type, role) VALUES ($1, $2)\nON CONFLICT (workflow_type, role) DO NOTHING";
17
17
  export declare const GET_PROVIDER_DATA = "SELECT workflow_type, data, completed_at\n FROM lt_tasks\n WHERE origin_id = $1\n AND workflow_type = ANY($2)\n AND status = 'completed'\n ORDER BY completed_at DESC";
@@ -23,8 +23,8 @@ exports.ENSURE_ROLE_EXISTS = `\
23
23
  INSERT INTO lt_roles (role) VALUES ($1) ON CONFLICT DO NOTHING`;
24
24
  exports.UPSERT_WORKFLOW = `\
25
25
  INSERT INTO lt_config_workflows
26
- (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as)
27
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
26
+ (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified)
27
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
28
28
  ON CONFLICT (workflow_type) DO UPDATE SET
29
29
  invocable = EXCLUDED.invocable,
30
30
  task_queue = EXCLUDED.task_queue,
@@ -35,7 +35,8 @@ ON CONFLICT (workflow_type) DO UPDATE SET
35
35
  resolver_schema = EXCLUDED.resolver_schema,
36
36
  cron_schedule = EXCLUDED.cron_schedule,
37
37
  tool_tags = EXCLUDED.tool_tags,
38
- execute_as = EXCLUDED.execute_as`;
38
+ execute_as = EXCLUDED.execute_as,
39
+ certified = EXCLUDED.certified`;
39
40
  exports.DELETE_CONFIG_ROLES = `\
40
41
  DELETE FROM lt_config_roles WHERE workflow_type = $1`;
41
42
  exports.INSERT_CONFIG_ROLE = `\
@@ -51,8 +52,8 @@ DELETE FROM lt_config_workflows WHERE workflow_type = $1`;
51
52
  // ------------------------------------------------------------------ //
52
53
  exports.SEED_WORKFLOW_CONFIG = `\
53
54
  INSERT INTO lt_config_workflows
54
- (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as)
55
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
55
+ (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified)
56
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
56
57
  ON CONFLICT (workflow_type) DO NOTHING`;
57
58
  exports.SEED_CONFIG_ROLE = `\
58
59
  INSERT INTO lt_config_roles (workflow_type, role) VALUES ($1, $2)
@@ -7,6 +7,15 @@ const db_1 = require("../../lib/db");
7
7
  const read_1 = require("./read");
8
8
  const logger_1 = require("../../lib/logger");
9
9
  const sql_1 = require("./sql");
10
+ /**
11
+ * Certification fallback for writers that omit the explicit flag (older SDKs,
12
+ * seed blocks without `certified`): derived from roles/consumes presence —
13
+ * the rule that governed the tier before the flag existed.
14
+ */
15
+ function resolveCertified(config) {
16
+ return (config.certified ??
17
+ ((config.roles?.length ?? 0) > 0 || (config.consumes?.length ?? 0) > 0));
18
+ }
10
19
  async function upsertWorkflowConfig(config) {
11
20
  const pool = (0, db_1.getPool)();
12
21
  const client = await pool.connect();
@@ -34,6 +43,7 @@ async function upsertWorkflowConfig(config) {
34
43
  config.cron_schedule ?? null,
35
44
  config.tool_tags || [],
36
45
  config.execute_as ?? null,
46
+ resolveCertified(config),
37
47
  ]);
38
48
  // Replace roles
39
49
  await client.query(sql_1.DELETE_CONFIG_ROLES, [config.workflow_type]);
@@ -90,6 +100,7 @@ async function seedWorkflowConfig(config) {
90
100
  config.cron_schedule ?? null,
91
101
  config.tool_tags || [],
92
102
  config.execute_as ?? null,
103
+ resolveCertified(config),
93
104
  ]);
94
105
  const inserted = (rowCount ?? 0) > 0;
95
106
  if (inserted) {
@@ -110,6 +121,8 @@ async function seedWorkflowConfig(config) {
110
121
  drifts.push('description');
111
122
  if (config.invocable !== existing.invocable)
112
123
  drifts.push('invocable');
124
+ if (resolveCertified(config) !== existing.certified)
125
+ drifts.push('certified');
113
126
  if (config.default_role !== existing.default_role)
114
127
  drifts.push('default_role');
115
128
  if (JSON.stringify(config.envelope_schema) !== JSON.stringify(existing.envelope_schema))
@@ -32,6 +32,8 @@ export declare function bulkCancelEscalations(ids: string[]): Promise<{
32
32
  /**
33
33
  * Bulk resolve escalations for AI triage.
34
34
  * Returns full records so the caller can start triage workflows. No signal is
35
- * delivered — the triage workflow takes over handling.
35
+ * delivered — the triage workflow takes over handling. Rows backing a live
36
+ * `condition()` waiter (`signal_key` set) are skipped by the store and stay
37
+ * `pending`; only the returned rows enter triage.
36
38
  */
37
39
  export declare function bulkResolveForTriage(ids: string[], hint?: string): Promise<LTEscalationRecord[]>;
@@ -65,7 +65,9 @@ async function bulkCancelEscalations(ids) {
65
65
  /**
66
66
  * Bulk resolve escalations for AI triage.
67
67
  * Returns full records so the caller can start triage workflows. No signal is
68
- * delivered — the triage workflow takes over handling.
68
+ * delivered — the triage workflow takes over handling. Rows backing a live
69
+ * `condition()` waiter (`signal_key` set) are skipped by the store and stay
70
+ * `pending`; only the returned rows enter triage.
69
71
  */
70
72
  async function bulkResolveForTriage(ids, hint) {
71
73
  if (ids.length === 0)
@@ -30,9 +30,10 @@ export declare function resolveEscalation(id: string, resolverPayload: Record<st
30
30
  * Use this over a per-row `resolveEscalation` loop when every row takes the SAME
31
31
  * resolverPayload and the rows are woken collectively (or are bookkeeping rows with
32
32
  * no signal_key). NOTE: unlike the single `resolve`, this does NOT deliver per-row
33
- * signals — `resolveMany` is UPDATE-only. Do not use it for signal_key adverts whose
34
- * resolution must wake a parked workflow; those require the per-row `resolveEscalation`
35
- * (which delivers the signal).
33
+ * signals — `resolveMany` is UPDATE-only, and the store enforces it: rows with
34
+ * `signal_key` set (live `condition()` waiters) are skipped, stay `pending`, and
35
+ * drop out of the return set. Waking a parked workflow requires the per-row
36
+ * `resolveEscalation` (which delivers the signal).
36
37
  */
37
38
  export declare function resolveEscalationsByIds(ids: string[], resolverPayload: Record<string, any>, metadata?: Record<string, any>): Promise<LTEscalationRecord[]>;
38
39
  /**
@@ -140,9 +140,10 @@ async function resolveEscalation(id, resolverPayload, metadata) {
140
140
  * Use this over a per-row `resolveEscalation` loop when every row takes the SAME
141
141
  * resolverPayload and the rows are woken collectively (or are bookkeeping rows with
142
142
  * no signal_key). NOTE: unlike the single `resolve`, this does NOT deliver per-row
143
- * signals — `resolveMany` is UPDATE-only. Do not use it for signal_key adverts whose
144
- * resolution must wake a parked workflow; those require the per-row `resolveEscalation`
145
- * (which delivers the signal).
143
+ * signals — `resolveMany` is UPDATE-only, and the store enforces it: rows with
144
+ * `signal_key` set (live `condition()` waiters) are skipped, stay `pending`, and
145
+ * drop out of the return set. Waking a parked workflow requires the per-row
146
+ * `resolveEscalation` (which delivers the signal).
146
147
  */
147
148
  async function resolveEscalationsByIds(ids, resolverPayload, metadata) {
148
149
  if (ids.length === 0)
@@ -173,6 +173,7 @@ async function startWorkers(startConfig, workers, builtinMcpServerFactories) {
173
173
  workflow_type: workflowType,
174
174
  task_queue: w.taskQueue,
175
175
  invocable: c.invocable ?? false,
176
+ certified: c.certified,
176
177
  default_role: c.defaultRole ?? 'reviewer',
177
178
  description: c.description ?? null,
178
179
  roles: c.roles ?? [],
@@ -234,6 +234,7 @@ export declare const listWorkflowConfigsSchema: z.ZodObject<{}, "strip", z.ZodTy
234
234
  export declare const upsertWorkflowConfigSchema: z.ZodObject<{
235
235
  workflow_type: z.ZodString;
236
236
  invocable: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
237
+ certified: z.ZodOptional<z.ZodBoolean>;
237
238
  task_queue: z.ZodDefault<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
238
239
  default_role: z.ZodDefault<z.ZodOptional<z.ZodString>>;
239
240
  description: z.ZodDefault<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
@@ -259,8 +260,10 @@ export declare const upsertWorkflowConfigSchema: z.ZodObject<{
259
260
  resolver_schema: Record<string, any> | null;
260
261
  cron_schedule: string | null;
261
262
  execute_as: string | null;
263
+ certified?: boolean | undefined;
262
264
  }, {
263
265
  workflow_type: string;
266
+ certified?: boolean | undefined;
264
267
  invocable?: boolean | undefined;
265
268
  task_queue?: string | null | undefined;
266
269
  default_role?: string | undefined;
@@ -103,6 +103,8 @@ exports.listWorkflowConfigsSchema = zod_1.z.object({});
103
103
  exports.upsertWorkflowConfigSchema = zod_1.z.object({
104
104
  workflow_type: zod_1.z.string().describe('Workflow function name'),
105
105
  invocable: zod_1.z.boolean().optional().default(false),
106
+ certified: zod_1.z.boolean().optional()
107
+ .describe('Explicit HITL certification (interceptor treatment). Omitted → derived from roles/consumes presence.'),
106
108
  task_queue: zod_1.z.string().nullable().optional().default(null),
107
109
  default_role: zod_1.z.string().optional().default('reviewer'),
108
110
  description: zod_1.z.string().nullable().optional().default(null),
@@ -117,7 +119,7 @@ exports.upsertWorkflowConfigSchema = zod_1.z.object({
117
119
  cron_schedule: zod_1.z.string().nullable().optional().default(null),
118
120
  });
119
121
  exports.deleteWorkflowConfigSchema = zod_1.z.object({
120
- workflow_type: zod_1.z.string().describe('Workflow type to de-certify'),
122
+ workflow_type: zod_1.z.string().describe('Workflow type to unregister (deletes the registration row)'),
121
123
  });
122
124
  // ── workflows (routes/workflows/invocation.ts + discovery.ts) ───────────────
123
125
  exports.listDiscoveredWorkflowsSchema = zod_1.z.object({
@@ -75,6 +75,7 @@ function registerWorkflowConfigTools(server) {
75
75
  const config = await configService.upsertWorkflowConfig({
76
76
  workflow_type: args.workflow_type,
77
77
  invocable: args.invocable,
78
+ certified: args.certified,
78
79
  task_queue: args.task_queue,
79
80
  default_role: args.default_role,
80
81
  description: args.description,
@@ -5,9 +5,23 @@
5
5
  export interface LTWorkflowConfig {
6
6
  workflow_type: string;
7
7
  invocable: boolean;
8
+ /**
9
+ * Explicit certification. Certified workflows get the interceptor: task
10
+ * tracking, escalation handling, re-run detection. Stored on the row —
11
+ * demoting to plain registered flips this flag and keeps every other
12
+ * field intact. Always present on reads; optional on writes, where an
13
+ * omitted value derives from roles/consumes presence (the pre-flag rule).
14
+ */
15
+ certified?: boolean;
8
16
  task_queue: string | null;
9
17
  default_role: string;
10
18
  description: string | null;
19
+ /**
20
+ * @deprecated Escalation formalization belongs to the escalation and its
21
+ * role — roles carry the versioned escalation schema and take precedence.
22
+ * This list remains only as the interceptor default for who can claim and
23
+ * resolve interceptor-raised escalations.
24
+ */
11
25
  roles: string[];
12
26
  invocation_roles: string[];
13
27
  consumes: string[];
@@ -24,6 +38,8 @@ export interface LTWorkflowConfig {
24
38
  */
25
39
  export interface LTResolvedConfig {
26
40
  invocable: boolean;
41
+ /** Explicit certification — gates the interceptor treatment. */
42
+ certified: boolean;
27
43
  taskQueue: string | null;
28
44
  role: string;
29
45
  roles: string[];
@@ -19,11 +19,21 @@ export interface LTWorkerConfig {
19
19
  description?: string;
20
20
  /** Allow invocation from the dashboard / API. Default: false. */
21
21
  invocable?: boolean;
22
+ /**
23
+ * Certify for HITL escalation — the interceptor wraps the workflow with
24
+ * task tracking, escalation handling, and re-run detection. Omitted →
25
+ * derived from roles/consumes presence (the pre-flag behavior).
26
+ */
27
+ certified?: boolean;
22
28
  /** Roles allowed to invoke this workflow. */
23
29
  invocationRoles?: string[];
24
30
  /** Default role for escalations. Default: 'reviewer'. */
25
31
  defaultRole?: string;
26
- /** Roles that can claim and resolve escalations (certifies the workflow for HITL). */
32
+ /**
33
+ * Interceptor default for who can claim and resolve interceptor-raised
34
+ * escalations. Escalation formalization lives with the escalation's role
35
+ * (versioned schema) and takes precedence over this list.
36
+ */
27
37
  roles?: string[];
28
38
  /** JSON template that pre-fills the dashboard invocation form. */
29
39
  envelopeSchema?: Record<string, any>;
@@ -0,0 +1,2 @@
1
+ import{v as n,j as o}from"./index-DgCS2Frb.js";import{c as m}from"./tasks-DNdvW5H6.js";import{f as d}from"./useEventHooks-CUUeBSH1.js";import{u}from"./mcp-BtG54ZAx.js";import{P as c}from"./PageHeaderWithStats-Cf8TYFRh.js";import"./vendor-query-DLp59M9_.js";import"./vendor-react-zA2lQFDs.js";import"./vendor-icons-CNyYGNsk.js";function N(){var e;d();const{data:a}=m({limit:1}),{data:t}=n({status:"pending",limit:1}),{data:s}=u(),i=((e=s==null?void 0:s.servers)==null?void 0:e.filter(l=>l.status==="connected").length)??0,r=s?`${i}/${s.total}`:"—";return o.jsxDEV("div",{children:o.jsxDEV(c,{title:"Admin",stats:[{label:"Tasks",value:(a==null?void 0:a.total)??"—"},{label:"Pending Escalations",value:(t==null?void 0:t.total)??"—",dotClass:"bg-status-pending"},{label:"MCP Servers",value:r},{label:"System",value:"Healthy",dotClass:"bg-status-success"}]},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/AdminDashboard.tsx",lineNumber:19,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/AdminDashboard.tsx",lineNumber:18,columnNumber:5},this)}export{N as AdminDashboard};
2
+ //# sourceMappingURL=AdminDashboard-Ck5-jV9T.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdminDashboard-Bgomc_jH.js","sources":["../../src/pages/admin/AdminDashboard.tsx"],"sourcesContent":["import { useTasks } from '../../api/tasks';\nimport { useEscalations } from '../../api/escalations';\nimport { useEscalationListEvents } from '../../hooks/useEventHooks';\nimport { useMcpServers } from '../../api/mcp';\nimport { PageHeaderWithStats } from '../../components/common/layout/PageHeaderWithStats';\n\nexport function AdminDashboard() {\n useEscalationListEvents();\n const { data: taskData } = useTasks({ limit: 1 });\n const { data: pendingEsc } = useEscalations({ status: 'pending', limit: 1 });\n const { data: mcpData } = useMcpServers();\n\n const connectedServers =\n mcpData?.servers?.filter((s) => s.status === 'connected').length ?? 0;\n const mcpLabel = mcpData ? `${connectedServers}/${mcpData.total}` : '—';\n\n return (\n <div>\n <PageHeaderWithStats\n title=\"Admin\"\n stats={[\n { label: 'Tasks', value: taskData?.total ?? '—' },\n { label: 'Pending Escalations', value: pendingEsc?.total ?? '—', dotClass: 'bg-status-pending' },\n { label: 'MCP Servers', value: mcpLabel },\n { label: 'System', value: 'Healthy', dotClass: 'bg-status-success' },\n ]}\n />\n </div>\n );\n}\n"],"names":["AdminDashboard","useEscalationListEvents","taskData","useTasks","pendingEsc","useEscalations","mcpData","useMcpServers","connectedServers","_a","s","mcpLabel","jsx","PageHeaderWithStats"],"mappings":"4UAMO,SAASA,GAAiB,OAC/BC,EAAA,EACA,KAAM,CAAE,KAAMC,CAAA,EAAaC,EAAS,CAAE,MAAO,EAAG,EAC1C,CAAE,KAAMC,CAAA,EAAeC,EAAe,CAAE,OAAQ,UAAW,MAAO,EAAG,EACrE,CAAE,KAAMC,CAAA,EAAYC,EAAA,EAEpBC,IACJC,EAAAH,GAAA,YAAAA,EAAS,UAAT,YAAAG,EAAkB,OAAQC,GAAMA,EAAE,SAAW,aAAa,SAAU,EAChEC,EAAWL,EAAU,GAAGE,CAAgB,IAAIF,EAAQ,KAAK,GAAK,IAEpE,aACG,MAAA,CACC,SAAAM,EAAAA,IAACC,EAAA,CACC,MAAM,QACN,MAAO,CACL,CAAE,MAAO,QAAS,OAAOX,GAAA,YAAAA,EAAU,QAAS,GAAA,EAC5C,CAAE,MAAO,sBAAuB,OAAOE,GAAA,YAAAA,EAAY,QAAS,IAAK,SAAU,mBAAA,EAC3E,CAAE,MAAO,cAAe,MAAOO,CAAA,EAC/B,CAAE,MAAO,SAAU,MAAO,UAAW,SAAU,mBAAA,CAAoB,CACrE,CAAA,EAEJ,CAEJ"}
1
+ {"version":3,"file":"AdminDashboard-Ck5-jV9T.js","sources":["../../src/pages/admin/AdminDashboard.tsx"],"sourcesContent":["import { useTasks } from '../../api/tasks';\nimport { useEscalations } from '../../api/escalations';\nimport { useEscalationListEvents } from '../../hooks/useEventHooks';\nimport { useMcpServers } from '../../api/mcp';\nimport { PageHeaderWithStats } from '../../components/common/layout/PageHeaderWithStats';\n\nexport function AdminDashboard() {\n useEscalationListEvents();\n const { data: taskData } = useTasks({ limit: 1 });\n const { data: pendingEsc } = useEscalations({ status: 'pending', limit: 1 });\n const { data: mcpData } = useMcpServers();\n\n const connectedServers =\n mcpData?.servers?.filter((s) => s.status === 'connected').length ?? 0;\n const mcpLabel = mcpData ? `${connectedServers}/${mcpData.total}` : '—';\n\n return (\n <div>\n <PageHeaderWithStats\n title=\"Admin\"\n stats={[\n { label: 'Tasks', value: taskData?.total ?? '—' },\n { label: 'Pending Escalations', value: pendingEsc?.total ?? '—', dotClass: 'bg-status-pending' },\n { label: 'MCP Servers', value: mcpLabel },\n { label: 'System', value: 'Healthy', dotClass: 'bg-status-success' },\n ]}\n />\n </div>\n );\n}\n"],"names":["AdminDashboard","useEscalationListEvents","taskData","useTasks","pendingEsc","useEscalations","mcpData","useMcpServers","connectedServers","_a","s","mcpLabel","jsxDEV","PageHeaderWithStats"],"mappings":"uUAMO,SAASA,GAAiB,OAC/BC,EAAA,EACA,KAAM,CAAE,KAAMC,CAAA,EAAaC,EAAS,CAAE,MAAO,EAAG,EAC1C,CAAE,KAAMC,CAAA,EAAeC,EAAe,CAAE,OAAQ,UAAW,MAAO,EAAG,EACrE,CAAE,KAAMC,CAAA,EAAYC,EAAA,EAEpBC,IACJC,EAAAH,GAAA,YAAAA,EAAS,UAAT,YAAAG,EAAkB,OAAQC,GAAMA,EAAE,SAAW,aAAa,SAAU,EAChEC,EAAWL,EAAU,GAAGE,CAAgB,IAAIF,EAAQ,KAAK,GAAK,IAEpE,gBACG,MAAA,CACC,SAAAM,EAAAA,OAACC,EAAA,CACC,MAAM,QACN,MAAO,CACL,CAAE,MAAO,QAAS,OAAOX,GAAA,YAAAA,EAAU,QAAS,GAAA,EAC5C,CAAE,MAAO,sBAAuB,OAAOE,GAAA,YAAAA,EAAY,QAAS,IAAK,SAAU,mBAAA,EAC3E,CAAE,MAAO,cAAe,MAAOO,CAAA,EAC/B,CAAE,MAAO,SAAU,MAAO,UAAW,SAAU,mBAAA,CAAoB,CACrE,EAPF,OAAA,GAAA,CAAA,SAAA,oDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAQA,EATF,OAAA,GAAA,CAAA,SAAA,oDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAUA,CAEJ"}