@hotmeshio/long-tail 0.19.0 → 0.19.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 (318) hide show
  1. package/build/api/workflows/config.d.ts +5 -1
  2. package/build/api/workflows/config.js +9 -1
  3. package/build/api/workflows/index.d.ts +3 -0
  4. package/build/api/workflows/index.js +7 -1
  5. package/build/api/workflows/input-validation.d.ts +13 -0
  6. package/build/api/workflows/input-validation.js +38 -0
  7. package/build/api/workflows/invocable.d.ts +19 -0
  8. package/build/api/workflows/invocable.js +106 -0
  9. package/build/api/workflows/invocation.js +6 -0
  10. package/build/lib/db/schemas/034_workflow_input_schema.sql +13 -0
  11. package/build/routes/workflows/config.js +2 -0
  12. package/build/routes/workflows/discovery.js +14 -0
  13. package/build/services/config/cache.js +2 -0
  14. package/build/services/config/read.js +4 -0
  15. package/build/services/config/sql.d.ts +2 -2
  16. package/build/services/config/sql.js +7 -5
  17. package/build/services/config/write.js +11 -1
  18. package/build/services/interceptor/index.js +7 -0
  19. package/build/services/invocation-access.d.ts +18 -0
  20. package/build/services/invocation-access.js +32 -0
  21. package/build/services/workflow-invocation.js +4 -9
  22. package/build/shared/form-validation/index.d.ts +1 -0
  23. package/build/shared/form-validation/index.js +1 -0
  24. package/build/shared/form-validation/invoke-context.d.ts +7 -0
  25. package/build/shared/form-validation/invoke-context.js +11 -0
  26. package/build/shared/form-validation/validate-resolver-payload.d.ts +1 -1
  27. package/build/shared/form-validation/validate-resolver-payload.js +1 -0
  28. package/build/shared/form-validation/x-lt-help.d.ts +2 -2
  29. package/build/shared/form-validation/x-lt-help.js +2 -2
  30. package/build/shared/form-validation/x-lt-show-if.d.ts +1 -0
  31. package/build/shared/form-validation/x-lt-show-if.js +3 -0
  32. package/build/start/workers.js +2 -0
  33. package/build/system/mcp-servers/admin/workflows.js +15 -2
  34. package/build/tsconfig.tsbuildinfo +1 -1
  35. package/build/types/config.d.ts +6 -0
  36. package/build/types/index.d.ts +2 -0
  37. package/build/types/index.js +4 -1
  38. package/build/types/startup.d.ts +10 -0
  39. package/build/types/validation.d.ts +4 -2
  40. package/build/types/workflow-icons.d.ts +86 -0
  41. package/build/types/workflow-icons.js +92 -0
  42. package/dashboard/dist/assets/{AdminDashboard-DPkWtPc1.js → AdminDashboard-Drs-9TRM.js} +2 -2
  43. package/dashboard/dist/assets/{AdminDashboard-DPkWtPc1.js.map → AdminDashboard-Drs-9TRM.js.map} +1 -1
  44. package/dashboard/dist/assets/{AgentConfigPage-DRfnLiQS.js → AgentConfigPage-BDPDZ7-v.js} +3 -3
  45. package/dashboard/dist/assets/{AgentConfigPage-DRfnLiQS.js.map → AgentConfigPage-BDPDZ7-v.js.map} +1 -1
  46. package/dashboard/dist/assets/{AgentDetailPage-CufRZXnT.js → AgentDetailPage-CGBulM4_.js} +3 -3
  47. package/dashboard/dist/assets/{AgentDetailPage-CufRZXnT.js.map → AgentDetailPage-CGBulM4_.js.map} +1 -1
  48. package/dashboard/dist/assets/AgentsPage-D77JeViQ.js +2 -0
  49. package/dashboard/dist/assets/{AgentsPage-CoCWGhUd.js.map → AgentsPage-D77JeViQ.js.map} +1 -1
  50. package/dashboard/dist/assets/{AutoGrowTextarea-DgEQeRQw.js → AutoGrowTextarea-7X3T9La8.js} +2 -2
  51. package/dashboard/dist/assets/{AutoGrowTextarea-DgEQeRQw.js.map → AutoGrowTextarea-7X3T9La8.js.map} +1 -1
  52. package/dashboard/dist/assets/AvailableEscalationsPage-CqM_MOMy.js +2 -0
  53. package/dashboard/dist/assets/{AvailableEscalationsPage-BSqOctep.js.map → AvailableEscalationsPage-CqM_MOMy.js.map} +1 -1
  54. package/dashboard/dist/assets/{BotPicker-DMojDLlV.js → BotPicker-CC5vI_Sv.js} +2 -2
  55. package/dashboard/dist/assets/{BotPicker-DMojDLlV.js.map → BotPicker-CC5vI_Sv.js.map} +1 -1
  56. package/dashboard/dist/assets/BulkAssignModal-BXiJnlqt.js +2 -0
  57. package/dashboard/dist/assets/{BulkAssignModal-DYbM_6Or.js.map → BulkAssignModal-BXiJnlqt.js.map} +1 -1
  58. package/dashboard/dist/assets/{CapabilitiesPage-CDQ5JHNP.js → CapabilitiesPage-D9TC2iKy.js} +2 -2
  59. package/dashboard/dist/assets/{CapabilitiesPage-CDQ5JHNP.js.map → CapabilitiesPage-D9TC2iKy.js.map} +1 -1
  60. package/dashboard/dist/assets/{CollapsibleSection-D4VlCEbD.js → CollapsibleSection-D10lGw_u.js} +2 -2
  61. package/dashboard/dist/assets/{CollapsibleSection-D4VlCEbD.js.map → CollapsibleSection-D10lGw_u.js.map} +1 -1
  62. package/dashboard/dist/assets/{ConfirmDeleteModal-DnNHjJtD.js → ConfirmDeleteModal-BJdLN6No.js} +2 -2
  63. package/dashboard/dist/assets/{ConfirmDeleteModal-DnNHjJtD.js.map → ConfirmDeleteModal-BJdLN6No.js.map} +1 -1
  64. package/dashboard/dist/assets/{CopyableId-4Lqlc5cU.js → CopyableId-Bn02zYxt.js} +2 -2
  65. package/dashboard/dist/assets/{CopyableId-4Lqlc5cU.js.map → CopyableId-Bn02zYxt.js.map} +1 -1
  66. package/dashboard/dist/assets/CountdownTimer-D9B-BjQ7.js +2 -0
  67. package/dashboard/dist/assets/CountdownTimer-D9B-BjQ7.js.map +1 -0
  68. package/dashboard/dist/assets/{CredentialsPage-CSYZw-rL.js → CredentialsPage-hniUAFBK.js} +2 -2
  69. package/dashboard/dist/assets/{CredentialsPage-CSYZw-rL.js.map → CredentialsPage-hniUAFBK.js.map} +1 -1
  70. package/dashboard/dist/assets/{CronLabel-CpmqDrlJ.js → CronLabel-v9DCD2FX.js} +2 -2
  71. package/dashboard/dist/assets/{CronLabel-CpmqDrlJ.js.map → CronLabel-v9DCD2FX.js.map} +1 -1
  72. package/dashboard/dist/assets/{DataTable-DFPMeqyQ.js → DataTable-7C7riavf.js} +2 -2
  73. package/dashboard/dist/assets/{DataTable-DFPMeqyQ.js.map → DataTable-7C7riavf.js.map} +1 -1
  74. package/dashboard/dist/assets/{DropZone-BbXlQnYB.js → DropZone-XlcY8hEH.js} +2 -2
  75. package/dashboard/dist/assets/{DropZone-BbXlQnYB.js.map → DropZone-XlcY8hEH.js.map} +1 -1
  76. package/dashboard/dist/assets/{ElapsedCell-Cul22qBS.js → ElapsedCell-_xvVTK8N.js} +2 -2
  77. package/dashboard/dist/assets/{ElapsedCell-Cul22qBS.js.map → ElapsedCell-_xvVTK8N.js.map} +1 -1
  78. package/dashboard/dist/assets/{EmptyState-lpUFYfun.js → EmptyState-DgC_6njU.js} +2 -2
  79. package/dashboard/dist/assets/{EmptyState-lpUFYfun.js.map → EmptyState-DgC_6njU.js.map} +1 -1
  80. package/dashboard/dist/assets/{EntityTimelinePanel-CtzpJ-j2.js → EntityTimelinePanel-1lT3jkCM.js} +2 -2
  81. package/dashboard/dist/assets/{EntityTimelinePanel-CtzpJ-j2.js.map → EntityTimelinePanel-1lT3jkCM.js.map} +1 -1
  82. package/dashboard/dist/assets/{EscalationListSchemaPage-BZQ8Y_UH.js → EscalationListSchemaPage-BeQUTUEO.js} +3 -3
  83. package/dashboard/dist/assets/{EscalationListSchemaPage-BZQ8Y_UH.js.map → EscalationListSchemaPage-BeQUTUEO.js.map} +1 -1
  84. package/dashboard/dist/assets/EscalationListView-uuZRMSLB.js +2 -0
  85. package/dashboard/dist/assets/EscalationListView-uuZRMSLB.js.map +1 -0
  86. package/dashboard/dist/assets/{EscalationSchemaPage-CydTtq_A.js → EscalationSchemaPage-D4VlEwyS.js} +3 -3
  87. package/dashboard/dist/assets/{EscalationSchemaPage-CydTtq_A.js.map → EscalationSchemaPage-D4VlEwyS.js.map} +1 -1
  88. package/dashboard/dist/assets/{EscalationsOverview-DSYC0nI7.js → EscalationsOverview-Bx6Zrzm-.js} +2 -2
  89. package/dashboard/dist/assets/{EscalationsOverview-DSYC0nI7.js.map → EscalationsOverview-Bx6Zrzm-.js.map} +1 -1
  90. package/dashboard/dist/assets/{EventTable-s48cTXIw.js → EventTable-KEC3YWBf.js} +2 -2
  91. package/dashboard/dist/assets/{EventTable-s48cTXIw.js.map → EventTable-KEC3YWBf.js.map} +1 -1
  92. package/dashboard/dist/assets/{FilterBar-B61qKmFD.js → FilterBar-xwN_b5fj.js} +2 -2
  93. package/dashboard/dist/assets/{FilterBar-B61qKmFD.js.map → FilterBar-xwN_b5fj.js.map} +1 -1
  94. package/dashboard/dist/assets/{GraphInvokePage-DxZv_KC2.js → GraphInvokePage-DV7Y0fe2.js} +2 -2
  95. package/dashboard/dist/assets/{GraphInvokePage-DxZv_KC2.js.map → GraphInvokePage-DV7Y0fe2.js.map} +1 -1
  96. package/dashboard/dist/assets/HomePage-G785SWcW.js +2 -0
  97. package/dashboard/dist/assets/{HomePage-zK3VP_9g.js.map → HomePage-G785SWcW.js.map} +1 -1
  98. package/dashboard/dist/assets/ListToolbar-zPVYPg3W.js +2 -0
  99. package/dashboard/dist/assets/{ListToolbar-DaxloPQc.js.map → ListToolbar-zPVYPg3W.js.map} +1 -1
  100. package/dashboard/dist/assets/{McpOverview-Ciq8r6-p.js → McpOverview-CMGUq8hx.js} +2 -2
  101. package/dashboard/dist/assets/{McpOverview-Ciq8r6-p.js.map → McpOverview-CMGUq8hx.js.map} +1 -1
  102. package/dashboard/dist/assets/{McpQueryDetailPage-DIC0FEEb.js → McpQueryDetailPage-CdhLhaKn.js} +3 -3
  103. package/dashboard/dist/assets/{McpQueryDetailPage-DIC0FEEb.js.map → McpQueryDetailPage-CdhLhaKn.js.map} +1 -1
  104. package/dashboard/dist/assets/{McpQueryPage-BBy0NSNg.js → McpQueryPage-CNSNMagY.js} +2 -2
  105. package/dashboard/dist/assets/{McpQueryPage-BBy0NSNg.js.map → McpQueryPage-CNSNMagY.js.map} +1 -1
  106. package/dashboard/dist/assets/{McpRunDetailPage-BqKNmIyW.js → McpRunDetailPage-DBm8hUaW.js} +2 -2
  107. package/dashboard/dist/assets/{McpRunDetailPage-BqKNmIyW.js.map → McpRunDetailPage-DBm8hUaW.js.map} +1 -1
  108. package/dashboard/dist/assets/{McpRunsPage-D0RlOpzR.js → McpRunsPage-B6rb5QBf.js} +2 -2
  109. package/dashboard/dist/assets/{McpRunsPage-D0RlOpzR.js.map → McpRunsPage-B6rb5QBf.js.map} +1 -1
  110. package/dashboard/dist/assets/{NamespacePill-Dbtm9R2T.js → NamespacePill-Bb3revqD.js} +2 -2
  111. package/dashboard/dist/assets/{NamespacePill-Dbtm9R2T.js.map → NamespacePill-Bb3revqD.js.map} +1 -1
  112. package/dashboard/dist/assets/{OperationsPage-BX0SFizr.js → OperationsPage-Dxk1fAMg.js} +3 -3
  113. package/dashboard/dist/assets/{OperationsPage-BX0SFizr.js.map → OperationsPage-Dxk1fAMg.js.map} +1 -1
  114. package/dashboard/dist/assets/OperatorDashboard-DBOscDnf.js +2 -0
  115. package/dashboard/dist/assets/{OperatorDashboard-vXG0TjAQ.js.map → OperatorDashboard-DBOscDnf.js.map} +1 -1
  116. package/dashboard/dist/assets/{PageHeader-xB92ELs3.js → PageHeader-Di5Sz3an.js} +2 -2
  117. package/dashboard/dist/assets/{PageHeader-xB92ELs3.js.map → PageHeader-Di5Sz3an.js.map} +1 -1
  118. package/dashboard/dist/assets/{PageHeaderWithStats-DVo_qqn1.js → PageHeaderWithStats-DutKJ-h2.js} +2 -2
  119. package/dashboard/dist/assets/{PageHeaderWithStats-DVo_qqn1.js.map → PageHeaderWithStats-DutKJ-h2.js.map} +1 -1
  120. package/dashboard/dist/assets/{PersonaDetailPage-w5TXcn4Q.js → PersonaDetailPage-BGRdGpeR.js} +2 -2
  121. package/dashboard/dist/assets/{PersonaDetailPage-w5TXcn4Q.js.map → PersonaDetailPage-BGRdGpeR.js.map} +1 -1
  122. package/dashboard/dist/assets/{PersonasPage-Dzcinl1L.js → PersonasPage-DRzOZcVa.js} +2 -2
  123. package/dashboard/dist/assets/{PersonasPage-Dzcinl1L.js.map → PersonasPage-DRzOZcVa.js.map} +1 -1
  124. package/dashboard/dist/assets/{PriorityBadge-BETdj4M-.js → PriorityBadge-r33mpDju.js} +2 -2
  125. package/dashboard/dist/assets/{PriorityBadge-BETdj4M-.js.map → PriorityBadge-r33mpDju.js.map} +1 -1
  126. package/dashboard/dist/assets/{ProcessDetailPage-BVXieFX1.js → ProcessDetailPage-BLGjZXpM.js} +2 -2
  127. package/dashboard/dist/assets/{ProcessDetailPage-BVXieFX1.js.map → ProcessDetailPage-BLGjZXpM.js.map} +1 -1
  128. package/dashboard/dist/assets/ProcessesListPage-5NnysKFC.js +2 -0
  129. package/dashboard/dist/assets/{ProcessesListPage-CKKNpk4z.js.map → ProcessesListPage-5NnysKFC.js.map} +1 -1
  130. package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js +2 -0
  131. package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js.map +1 -0
  132. package/dashboard/dist/assets/{RoleDetailPage-BytSo-YE.js → RoleDetailPage-C_LIoe1j.js} +3 -3
  133. package/dashboard/dist/assets/{RoleDetailPage-BytSo-YE.js.map → RoleDetailPage-C_LIoe1j.js.map} +1 -1
  134. package/dashboard/dist/assets/{RolePill-CYpL3a2d.js → RolePill-DhnVPK4q.js} +2 -2
  135. package/dashboard/dist/assets/{RolePill-CYpL3a2d.js.map → RolePill-DhnVPK4q.js.map} +1 -1
  136. package/dashboard/dist/assets/RolesPage-BmW1LzkU.js +2 -0
  137. package/dashboard/dist/assets/{RolesPage-eayR9H4f.js.map → RolesPage-BmW1LzkU.js.map} +1 -1
  138. package/dashboard/dist/assets/{RowActions-eYrzgQSj.js → RowActions-Bdd7z4eB.js} +2 -2
  139. package/dashboard/dist/assets/{RowActions-eYrzgQSj.js.map → RowActions-Bdd7z4eB.js.map} +1 -1
  140. package/dashboard/dist/assets/RunAsSelector-BwZTJ4Yj.js +2 -0
  141. package/dashboard/dist/assets/{RunAsSelector-D7RPwaAl.js.map → RunAsSelector-BwZTJ4Yj.js.map} +1 -1
  142. package/dashboard/dist/assets/ScanCodesPage-FiYIYB-m.js +2 -0
  143. package/dashboard/dist/assets/{ScanCodesPage-C8-ZBXF5.js.map → ScanCodesPage-FiYIYB-m.js.map} +1 -1
  144. package/dashboard/dist/assets/{ScanSchemeDetailPage-tQhEgFKf.js → ScanSchemeDetailPage-BiAqtD-a.js} +2 -2
  145. package/dashboard/dist/assets/{ScanSchemeDetailPage-tQhEgFKf.js.map → ScanSchemeDetailPage-BiAqtD-a.js.map} +1 -1
  146. package/dashboard/dist/assets/ScanStationPage-8CdOtbCD.js +2 -0
  147. package/dashboard/dist/assets/{ScanStationPage-CuhqsBKo.js.map → ScanStationPage-8CdOtbCD.js.map} +1 -1
  148. package/dashboard/dist/assets/{ScopeBadge-BmNzZlSj.js → ScopeBadge-CXUg0FHo.js} +2 -2
  149. package/dashboard/dist/assets/{ScopeBadge-BmNzZlSj.js.map → ScopeBadge-CXUg0FHo.js.map} +1 -1
  150. package/dashboard/dist/assets/{SegmentedTabs-DXNzY05q.js → SegmentedTabs-BpJh4Hwn.js} +2 -2
  151. package/dashboard/dist/assets/{SegmentedTabs-DXNzY05q.js.map → SegmentedTabs-BpJh4Hwn.js.map} +1 -1
  152. package/dashboard/dist/assets/{StatCard-BXQ8dD9Y.js → StatCard-nWY4sndl.js} +2 -2
  153. package/dashboard/dist/assets/{StatCard-BXQ8dD9Y.js.map → StatCard-nWY4sndl.js.map} +1 -1
  154. package/dashboard/dist/assets/{StatusBadge-BDeUwPtb.js → StatusBadge-DHVwxre2.js} +2 -2
  155. package/dashboard/dist/assets/{StatusBadge-BDeUwPtb.js.map → StatusBadge-DHVwxre2.js.map} +1 -1
  156. package/dashboard/dist/assets/{StickyPagination-BIVTAMnP.js → StickyPagination-DRuqKhZt.js} +2 -2
  157. package/dashboard/dist/assets/{StickyPagination-BIVTAMnP.js.map → StickyPagination-DRuqKhZt.js.map} +1 -1
  158. package/dashboard/dist/assets/{StreamMessageDetail-CYSC2cO1.js → StreamMessageDetail-JwlbRiMn.js} +2 -2
  159. package/dashboard/dist/assets/{StreamMessageDetail-CYSC2cO1.js.map → StreamMessageDetail-JwlbRiMn.js.map} +1 -1
  160. package/dashboard/dist/assets/{SwimlaneTimeline-BMZAs_2K.js → SwimlaneTimeline-hu3c4bCJ.js} +2 -2
  161. package/dashboard/dist/assets/{SwimlaneTimeline-BMZAs_2K.js.map → SwimlaneTimeline-hu3c4bCJ.js.map} +1 -1
  162. package/dashboard/dist/assets/{TagInput-D1uszNd2.js → TagInput-BZ8vb2oW.js} +2 -2
  163. package/dashboard/dist/assets/{TagInput-D1uszNd2.js.map → TagInput-BZ8vb2oW.js.map} +1 -1
  164. package/dashboard/dist/assets/{TaskDetailPage-CVUDUU5Q.js → TaskDetailPage-NqVZF3jW.js} +2 -2
  165. package/dashboard/dist/assets/{TaskDetailPage-CVUDUU5Q.js.map → TaskDetailPage-NqVZF3jW.js.map} +1 -1
  166. package/dashboard/dist/assets/{TaskQueuePill-C2H8oRfn.js → TaskQueuePill-Bxir8WRl.js} +2 -2
  167. package/dashboard/dist/assets/{TaskQueuePill-C2H8oRfn.js.map → TaskQueuePill-Bxir8WRl.js.map} +1 -1
  168. package/dashboard/dist/assets/TasksListPage-BQNaSzCn.js +2 -0
  169. package/dashboard/dist/assets/{TasksListPage-DEQymbXC.js.map → TasksListPage-BQNaSzCn.js.map} +1 -1
  170. package/dashboard/dist/assets/TimeAgo-Cv35DOiI.js +2 -0
  171. package/dashboard/dist/assets/{TimeAgo-CCxP67Rb.js.map → TimeAgo-Cv35DOiI.js.map} +1 -1
  172. package/dashboard/dist/assets/{TimestampCell-CE5ZUYhV.js → TimestampCell-DHUXey9s.js} +2 -2
  173. package/dashboard/dist/assets/{TimestampCell-CE5ZUYhV.js.map → TimestampCell-DHUXey9s.js.map} +1 -1
  174. package/dashboard/dist/assets/{ToolPill-D-h8AoB8.js → ToolPill-FkgTXIhq.js} +2 -2
  175. package/dashboard/dist/assets/{ToolPill-D-h8AoB8.js.map → ToolPill-FkgTXIhq.js.map} +1 -1
  176. package/dashboard/dist/assets/{ToolTestPanel-BHuQTyBY.js → ToolTestPanel-DvuLFWqQ.js} +2 -2
  177. package/dashboard/dist/assets/{ToolTestPanel-BHuQTyBY.js.map → ToolTestPanel-DvuLFWqQ.js.map} +1 -1
  178. package/dashboard/dist/assets/{TopicDetailPage-SFuiludx.js → TopicDetailPage-TXX3QNSo.js} +3 -3
  179. package/dashboard/dist/assets/{TopicDetailPage-SFuiludx.js.map → TopicDetailPage-TXX3QNSo.js.map} +1 -1
  180. package/dashboard/dist/assets/{TopicsPage-DO8pUmng.js → TopicsPage-h-oyTeEJ.js} +2 -2
  181. package/dashboard/dist/assets/{TopicsPage-DO8pUmng.js.map → TopicsPage-h-oyTeEJ.js.map} +1 -1
  182. package/dashboard/dist/assets/{UserName-CsLnT75E.js → UserName-BceRCeDF.js} +2 -2
  183. package/dashboard/dist/assets/{UserName-CsLnT75E.js.map → UserName-BceRCeDF.js.map} +1 -1
  184. package/dashboard/dist/assets/WorkflowExecutionPage-CmHGcaN9.js +2 -0
  185. package/dashboard/dist/assets/{WorkflowExecutionPage-BttnEvOd.js.map → WorkflowExecutionPage-CmHGcaN9.js.map} +1 -1
  186. package/dashboard/dist/assets/{WorkflowPill-CZvBbkn4.js → WorkflowPill--AYMW7u_.js} +2 -2
  187. package/dashboard/dist/assets/WorkflowPill--AYMW7u_.js.map +1 -0
  188. package/dashboard/dist/assets/WorkflowsDashboard-B0r2lQXk.js +2 -0
  189. package/dashboard/dist/assets/{WorkflowsDashboard-BRboBhlK.js.map → WorkflowsDashboard-B0r2lQXk.js.map} +1 -1
  190. package/dashboard/dist/assets/WorkflowsOverview-BTMc2PJ_.js +2 -0
  191. package/dashboard/dist/assets/{WorkflowsOverview-CDFTYeQo.js.map → WorkflowsOverview-BTMc2PJ_.js.map} +1 -1
  192. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CmnZFevp.js → YamlWorkflowDetailPage-DUiCVnZp.js} +2 -2
  193. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CmnZFevp.js.map → YamlWorkflowDetailPage-DUiCVnZp.js.map} +1 -1
  194. package/dashboard/dist/assets/YamlWorkflowsPage-BAuXfwi0.js +2 -0
  195. package/dashboard/dist/assets/{YamlWorkflowsPage-Qq1jfcrH.js.map → YamlWorkflowsPage-BAuXfwi0.js.map} +1 -1
  196. package/dashboard/dist/assets/{agents-C7vUIO7e.js → agents-BvmLCk4h.js} +2 -2
  197. package/dashboard/dist/assets/{agents-C7vUIO7e.js.map → agents-BvmLCk4h.js.map} +1 -1
  198. package/dashboard/dist/assets/{bots-BaOblnW4.js → bots-f_tyhl4I.js} +2 -2
  199. package/dashboard/dist/assets/{bots-BaOblnW4.js.map → bots-f_tyhl4I.js.map} +1 -1
  200. package/dashboard/dist/assets/capabilities-DNo5bqLx.js +2 -0
  201. package/dashboard/dist/assets/{capabilities-RZpmDWoy.js.map → capabilities-DNo5bqLx.js.map} +1 -1
  202. package/dashboard/dist/assets/{controlplane-BwGdcwXR.js → controlplane-Dyyj2Irb.js} +2 -2
  203. package/dashboard/dist/assets/{controlplane-BwGdcwXR.js.map → controlplane-Dyyj2Irb.js.map} +1 -1
  204. package/dashboard/dist/assets/escalation-columns-DIigeTOK.js +2 -0
  205. package/dashboard/dist/assets/{escalation-columns-B4DG_5v8.js.map → escalation-columns-DIigeTOK.js.map} +1 -1
  206. package/dashboard/dist/assets/index-BMlQYOE1.js +67 -0
  207. package/dashboard/dist/assets/index-BMlQYOE1.js.map +1 -0
  208. package/dashboard/dist/assets/{index-BICLHYJJ.js → index-BNZknxFY.js} +2 -2
  209. package/dashboard/dist/assets/{index-BICLHYJJ.js.map → index-BNZknxFY.js.map} +1 -1
  210. package/dashboard/dist/assets/index-Bpvfr4OW.css +1 -0
  211. package/dashboard/dist/assets/{index-G3NmdMjt.js → index-C-Xr2V3F.js} +2 -2
  212. package/dashboard/dist/assets/{index-G3NmdMjt.js.map → index-C-Xr2V3F.js.map} +1 -1
  213. package/dashboard/dist/assets/index-CegPUKpc.js +3 -0
  214. package/dashboard/dist/assets/index-CegPUKpc.js.map +1 -0
  215. package/dashboard/dist/assets/{index-xNFTmmsv.js → index-CsKiRyhy.js} +2 -2
  216. package/dashboard/dist/assets/{index-xNFTmmsv.js.map → index-CsKiRyhy.js.map} +1 -1
  217. package/dashboard/dist/assets/index-D7ESqn22.js +2 -0
  218. package/dashboard/dist/assets/{index-IWufkcH9.js.map → index-D7ESqn22.js.map} +1 -1
  219. package/dashboard/dist/assets/{index-iegzyfMv.js → index-DL83W7Gu.js} +2 -2
  220. package/dashboard/dist/assets/{index-iegzyfMv.js.map → index-DL83W7Gu.js.map} +1 -1
  221. package/dashboard/dist/assets/index-DPLssnMW.js +6 -0
  222. package/dashboard/dist/assets/index-DPLssnMW.js.map +1 -0
  223. package/dashboard/dist/assets/{index-BuqpU6ow.js → index-DWse7ERF.js} +2 -2
  224. package/dashboard/dist/assets/{index-BuqpU6ow.js.map → index-DWse7ERF.js.map} +1 -1
  225. package/dashboard/dist/assets/index-DoETPlJP.js +11 -0
  226. package/dashboard/dist/assets/index-DoETPlJP.js.map +1 -0
  227. package/dashboard/dist/assets/{index-D9NtDRtp.js → index-DvxxrFBo.js} +2 -2
  228. package/dashboard/dist/assets/{index-D9NtDRtp.js.map → index-DvxxrFBo.js.map} +1 -1
  229. package/dashboard/dist/assets/{index-DU9-flEo.js → index-PcyGjmBm.js} +2 -2
  230. package/dashboard/dist/assets/{index-DU9-flEo.js.map → index-PcyGjmBm.js.map} +1 -1
  231. package/dashboard/dist/assets/{index-BQPUlmmz.js → index-e2X-s0EQ.js} +2 -2
  232. package/dashboard/dist/assets/{index-BQPUlmmz.js.map → index-e2X-s0EQ.js.map} +1 -1
  233. package/dashboard/dist/assets/{knowledge-CjwCbm3E.js → knowledge-Coo6CKzo.js} +2 -2
  234. package/dashboard/dist/assets/{knowledge-CjwCbm3E.js.map → knowledge-Coo6CKzo.js.map} +1 -1
  235. package/dashboard/dist/assets/{mcp-C-DMktCT.js → mcp-Cz5eFnP_.js} +2 -2
  236. package/dashboard/dist/assets/{mcp-C-DMktCT.js.map → mcp-Cz5eFnP_.js.map} +1 -1
  237. package/dashboard/dist/assets/{mcp-query-KBeBNHb4.js → mcp-query-BtnuO4LF.js} +2 -2
  238. package/dashboard/dist/assets/{mcp-query-KBeBNHb4.js.map → mcp-query-BtnuO4LF.js.map} +1 -1
  239. package/dashboard/dist/assets/{personas-B32sSCxm.js → personas-C2-LgpHQ.js} +2 -2
  240. package/dashboard/dist/assets/{personas-B32sSCxm.js.map → personas-C2-LgpHQ.js.map} +1 -1
  241. package/dashboard/dist/assets/{pipelines-DNLwDumm.js → pipelines-TuXQvUA-.js} +2 -2
  242. package/dashboard/dist/assets/{pipelines-DNLwDumm.js.map → pipelines-TuXQvUA-.js.map} +1 -1
  243. package/dashboard/dist/assets/resolver-payload-C1dXB3n6.js +2 -0
  244. package/dashboard/dist/assets/resolver-payload-C1dXB3n6.js.map +1 -0
  245. package/dashboard/dist/assets/seed-form-json-DvPsISxD.js +2 -0
  246. package/dashboard/dist/assets/seed-form-json-DvPsISxD.js.map +1 -0
  247. package/dashboard/dist/assets/{tasks-DrWSrjmj.js → tasks-OUzpu__z.js} +2 -2
  248. package/dashboard/dist/assets/{tasks-DrWSrjmj.js.map → tasks-OUzpu__z.js.map} +1 -1
  249. package/dashboard/dist/assets/{topics-DgzGU-vR.js → topics-B8bdrBaW.js} +2 -2
  250. package/dashboard/dist/assets/{topics-DgzGU-vR.js.map → topics-B8bdrBaW.js.map} +1 -1
  251. package/dashboard/dist/assets/useDebouncedValue-Cp5ZOtVE.js +2 -0
  252. package/dashboard/dist/assets/{useDebouncedValue-DG5JOj1F.js.map → useDebouncedValue-Cp5ZOtVE.js.map} +1 -1
  253. package/dashboard/dist/assets/{useFilterParams-crmlBw_l.js → useFilterParams-DBRw1Hcv.js} +2 -2
  254. package/dashboard/dist/assets/{useFilterParams-crmlBw_l.js.map → useFilterParams-DBRw1Hcv.js.map} +1 -1
  255. package/dashboard/dist/assets/{useNamespace-CdgF7Jxo.js → useNamespace-DtQe3wZ5.js} +2 -2
  256. package/dashboard/dist/assets/{useNamespace-CdgF7Jxo.js.map → useNamespace-DtQe3wZ5.js.map} +1 -1
  257. package/dashboard/dist/assets/{useYamlActivityEvents-BEaOtgSZ.js → useYamlActivityEvents-CS22c15X.js} +2 -2
  258. package/dashboard/dist/assets/{useYamlActivityEvents-BEaOtgSZ.js.map → useYamlActivityEvents-CS22c15X.js.map} +1 -1
  259. package/dashboard/dist/assets/{vendor-icons-BCWsItQ7.js → vendor-icons-DeBdvyKJ.js} +364 -144
  260. package/dashboard/dist/assets/vendor-icons-DeBdvyKJ.js.map +1 -0
  261. package/dashboard/dist/assets/vendor-query-DvWWuNIB.js +18 -0
  262. package/dashboard/dist/assets/vendor-query-DvWWuNIB.js.map +1 -0
  263. package/dashboard/dist/assets/{vendor-react-CdqEC2zv.js → vendor-react-_9U4mKFr.js} +2 -2
  264. package/dashboard/dist/assets/{vendor-react-CdqEC2zv.js.map → vendor-react-_9U4mKFr.js.map} +1 -1
  265. package/dashboard/dist/assets/{yaml-workflows-YASUDPo0.js → yaml-workflows-HQIki3hI.js} +2 -2
  266. package/dashboard/dist/assets/{yaml-workflows-YASUDPo0.js.map → yaml-workflows-HQIki3hI.js.map} +1 -1
  267. package/dashboard/dist/index.html +5 -5
  268. package/docs/api/http/workflows.md +25 -1
  269. package/docs/code-owned-configuration.md +1 -1
  270. package/docs/dashboard.md +45 -19
  271. package/docs/events.md +3 -1
  272. package/docs/faceted-routing.md +1 -1
  273. package/docs/hitl/iframe.md +35 -6
  274. package/docs/hitl/invoke-form.md +98 -0
  275. package/docs/hitl/x-lt-show-if.md +11 -0
  276. package/docs/hitl-guide.md +4 -2
  277. package/docs/iam.md +1 -1
  278. package/docs/scan-codes.md +13 -4
  279. package/docs/workflows.md +1 -1
  280. package/package.json +1 -1
  281. package/dashboard/dist/assets/AgentsPage-CoCWGhUd.js +0 -2
  282. package/dashboard/dist/assets/AvailableEscalationsPage-BSqOctep.js +0 -2
  283. package/dashboard/dist/assets/BulkAssignModal-DYbM_6Or.js +0 -2
  284. package/dashboard/dist/assets/CountdownTimer-DPHMBmgz.js +0 -2
  285. package/dashboard/dist/assets/CountdownTimer-DPHMBmgz.js.map +0 -1
  286. package/dashboard/dist/assets/HomePage-zK3VP_9g.js +0 -2
  287. package/dashboard/dist/assets/ListToolbar-DaxloPQc.js +0 -2
  288. package/dashboard/dist/assets/OperatorDashboard-vXG0TjAQ.js +0 -2
  289. package/dashboard/dist/assets/ProcessesListPage-CKKNpk4z.js +0 -2
  290. package/dashboard/dist/assets/RolesPage-eayR9H4f.js +0 -2
  291. package/dashboard/dist/assets/RunAsSelector-D7RPwaAl.js +0 -2
  292. package/dashboard/dist/assets/ScanCodesPage-C8-ZBXF5.js +0 -2
  293. package/dashboard/dist/assets/ScanStationPage-CuhqsBKo.js +0 -2
  294. package/dashboard/dist/assets/TasksListPage-DEQymbXC.js +0 -2
  295. package/dashboard/dist/assets/TimeAgo-CCxP67Rb.js +0 -2
  296. package/dashboard/dist/assets/WorkflowExecutionPage-BttnEvOd.js +0 -2
  297. package/dashboard/dist/assets/WorkflowPill-CZvBbkn4.js.map +0 -1
  298. package/dashboard/dist/assets/WorkflowsDashboard-BRboBhlK.js +0 -2
  299. package/dashboard/dist/assets/WorkflowsOverview-CDFTYeQo.js +0 -2
  300. package/dashboard/dist/assets/YamlWorkflowsPage-Qq1jfcrH.js +0 -2
  301. package/dashboard/dist/assets/capabilities-RZpmDWoy.js +0 -2
  302. package/dashboard/dist/assets/escalation-columns-B4DG_5v8.js +0 -2
  303. package/dashboard/dist/assets/index-8LIpvj2e.js +0 -3
  304. package/dashboard/dist/assets/index-8LIpvj2e.js.map +0 -1
  305. package/dashboard/dist/assets/index-BaC3sbJH.js +0 -67
  306. package/dashboard/dist/assets/index-BaC3sbJH.js.map +0 -1
  307. package/dashboard/dist/assets/index-CD6jtND1.css +0 -1
  308. package/dashboard/dist/assets/index-CsIw-ZLk.js +0 -6
  309. package/dashboard/dist/assets/index-CsIw-ZLk.js.map +0 -1
  310. package/dashboard/dist/assets/index-CtJkvX9e.js +0 -5
  311. package/dashboard/dist/assets/index-CtJkvX9e.js.map +0 -1
  312. package/dashboard/dist/assets/index-IWufkcH9.js +0 -2
  313. package/dashboard/dist/assets/useDebouncedValue-DG5JOj1F.js +0 -2
  314. package/dashboard/dist/assets/vendor-icons-BCWsItQ7.js.map +0 -1
  315. package/dashboard/dist/assets/vendor-query-RUZdMvN6.js +0 -18
  316. package/dashboard/dist/assets/vendor-query-RUZdMvN6.js.map +0 -1
  317. package/dashboard/dist/assets/workflows-CX_oarls.js +0 -2
  318. package/dashboard/dist/assets/workflows-CX_oarls.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{u as l,b as a,c as s}from"./vendor-query-RUZdMvN6.js";import{l as r}from"./index-BaC3sbJH.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-YASUDPo0.js.map
1
+ import{u as l,b as a,c as s}from"./vendor-query-DvWWuNIB.js";import{m as r}from"./index-BMlQYOE1.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-HQIki3hI.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"yaml-workflows-YASUDPo0.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-HQIki3hI.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-BaC3sbJH.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-BCWsItQ7.js">
15
- <link rel="stylesheet" crossorigin href="./assets/index-CD6jtND1.css">
11
+ <script type="module" crossorigin src="./assets/index-BMlQYOE1.js"></script>
12
+ <link rel="modulepreload" crossorigin href="./assets/vendor-query-DvWWuNIB.js">
13
+ <link rel="modulepreload" crossorigin href="./assets/vendor-react-_9U4mKFr.js">
14
+ <link rel="modulepreload" crossorigin href="./assets/vendor-icons-DeBdvyKJ.js">
15
+ <link rel="stylesheet" crossorigin href="./assets/index-Bpvfr4OW.css">
16
16
  </head>
17
17
  <body>
18
18
  <div id="root"></div>
@@ -139,7 +139,9 @@ PUT /api/workflows/:type/config
139
139
  | `consumes` | `string[]` | `[]` | Workflow types whose completed data this workflow receives via `envelope.lt.providers` |
140
140
  | `execute_as` | `string \| null` | `null` | Service account `external_id` to run as (overrides invoker identity) |
141
141
  | `tool_tags` | `string[]` | `[]` | MCP tool tags for scoped tool discovery |
142
- | `envelope_schema` | `object \| null` | `null` | JSON Schema for the workflow input envelope |
142
+ | `envelope_schema` | `object \| null` | `null` | Example envelope that pre-fills the legacy invoke form |
143
+ | `input_schema` | `object \| null` | `null` | x-lt-* JSON Schema for the rich invoke form; `POST /:type/invoke` validates `data` against it. See [Invoke forms](../../hitl/invoke-form.md). |
144
+ | `icon` | `string \| null` | `null` | Curated icon name from `WORKFLOW_ICONS`; unknown names are refused with `400` |
143
145
  | `resolver_schema` | `object \| null` | `null` | **Deprecated** legacy fallback only. The escalation form is owned by the target role as a versioned `form_schema`. |
144
146
  | `cron_schedule` | `string \| null` | `null` | Cron expression for scheduled execution (e.g., `"0 9 * * *"`) |
145
147
 
@@ -241,11 +243,32 @@ The workflow starts on its configured `task_queue` with a generated workflow ID
241
243
  | `403` | `{ "error": "User not registered" }` | RBAC check failed — no matching user |
242
244
  | `403` | `{ "error": "Insufficient role for invocation" }` | User lacks a required invocation role |
243
245
  | `404` | `{ "error": "Workflow not found" }` | No config exists for this type |
246
+ | `422` | `{ "error": "data failed input schema validation (n violations)", "code": "schema_validation", "violations": [{ "field", "message" }], "role": null, "schemaVersion": null, "workflowType" }` | The config declares `input_schema` and `data` violates it |
244
247
 
245
248
  **Authorization:**
246
249
 
247
250
  When `invocation_roles` is empty, any authenticated user can invoke. When set, the user must hold at least one of the listed roles (checked against `lt_user_roles` via the user's `external_id`). Superadmins bypass this check.
248
251
 
252
+ ### List the caller's invokable workflows
253
+
254
+ ```
255
+ GET /api/workflows/invocable
256
+ ```
257
+
258
+ Every workflow the calling user may invoke, decided by the same predicate the invoke gate runs. Superadmins and `admin`/`admin` also receive active durable workers that carry no registration row.
259
+
260
+ **Response 200:**
261
+
262
+ ```json
263
+ {
264
+ "workflows": [
265
+ { "workflow_type": "fleetTools", "task_queue": "long-tail-examples", "tier": "registered", "invocable": true, "invocation_roles": ["printer-fleet"], "input_schema": { "...": "..." }, "envelope_schema": { "data": {}, "metadata": { "source": "dashboard" } }, "description": "..." }
266
+ ]
267
+ }
268
+ ```
269
+
270
+ Each entry is the full config row plus `tier` (`durable`, `registered`, `certified`). The dashboard Invoke Tool page and its nav entry read this list.
271
+
249
272
  ---
250
273
 
251
274
  ## Observation
@@ -632,6 +655,7 @@ Interrupt a running workflow. The workflow is immediately terminated.
632
655
  | `GET` | `/workers` | any | List active in-memory workers with registration status |
633
656
  | `GET` | `/discovered` | any | Unified list of workers, entities, and configs |
634
657
  | `GET` | `/cron/status` | any | List cron-configured workflows and active status |
658
+ | `GET` | `/invocable` | any | The caller's invokable workflows with tier |
635
659
  | `GET` | `/config` | any | List all workflow configurations |
636
660
  | `GET` | `/:type/config` | any | Get a single workflow configuration |
637
661
  | `PUT` | `/:type/config` | admin | Create or replace a workflow configuration |
@@ -57,7 +57,7 @@ The domain dictionary's override lives beside its path:
57
57
 
58
58
  | Surface | Declared via | Code-owned apply writes | Left alone (runtime state) |
59
59
  |---|---|---|---|
60
- | Workflow profiles | `workers[].config` | full profile incl. role lists (replace semantics) | task history, escalations |
60
+ | Workflow profiles | `workers[].config` | full profile incl. role lists and `input_schema` (replace semantics) | task history, escalations |
61
61
  | Roles | `roles[]` | declared fields only (PATCH); escalation targets replace | membership, undeclared fields |
62
62
  | Topics | `topics[]` | whole catalog entry (`managed: true`) | `last_seen_at` |
63
63
  | MCP servers | `mcp.serverFactories[].config` | description, tags, category, compile hints, credential providers | tool manifest, connection status |
package/docs/dashboard.md CHANGED
@@ -32,7 +32,7 @@ Each flavor exposes the same shape: configure, invoke, executions.
32
32
  | Page | Route | Purpose |
33
33
  |------|-------|---------|
34
34
  | **Procedural → Registry** | `/workflows/registry` | All discovered workflows with tier, queue, and access columns. Configure, certify, or invoke from here. |
35
- | **Procedural → Invoke** | `/workflows/durable/invoke` | Start any invocable procedural workflow. Two-panel layout with workflow selector and envelope editor. |
35
+ | **Procedural → Invoke Tool** | `/workflows/durable/invoke` | Start a tool the caller may invoke. Grouped list beside the form; rich x-lt-* forms when a workflow declares `inputSchema`. Builders reach it under Orchestrate, everyone else under Tools. |
36
36
  | **Procedural → Executions** | `/workflows/executions` | All procedural runs with status, duration, and tier. Click through to task records and escalation history. |
37
37
  | **Graph → Configure** | `/mcp/workflows` | Graph workflows available to the orchestrator — compiled deterministic YAML DAGs, grouped by namespace. |
38
38
  | **Graph → Invoke** | `/mcp/workflows/invoke` | Start any active graph flow. Same two-panel layout as procedural invoke. |
@@ -65,6 +65,8 @@ The LLM authoring add-on. Appears when an Anthropic key is configured.
65
65
 
66
66
  ### Infrastructure
67
67
 
68
+ Builder-only and off by default. A superadmin or engineer opts in per browser with the **Infrastructure** toggle in the easter-egg Features panel (Ctrl or Cmd click the logo); the section then joins the sidebar. The pages themselves stay reachable by URL under the builder guard.
69
+
68
70
  Builder-only.
69
71
 
70
72
  | Page | Route | Purpose |
@@ -78,7 +80,7 @@ Builder-only.
78
80
  The top navigation bar contains:
79
81
 
80
82
  - **Home logo** — links to the home page (`/`), Recent Activity.
81
- - **Search bar** — the opt-in global lookup: type an id or facet value, pick a facet, and land on the matching escalation or a filtered queue. Off by default; enable via `search` in `start()` config or `LT_SEARCH_BAR`. See [Global search](#global-search).
83
+ - **Search and run bar** — one input, two verbs: find an escalation by id, workflow, or a configured facet, or run a scan rule against a typed target. Search is opt-in via `search` in `start()` config or `LT_SEARCH_BAR`; run modes ride `features.scanCodes`. See [Search and run](#search-and-run).
82
84
  - **all** — links to `/escalations/available` with a live count of unclaimed escalations.
83
85
  - **mine** — links to `/escalations/queue` with a live count of escalations assigned to you.
84
86
  - **scan** (Barcode icon) — opens the scan panel for manual code entry and capture settings, shown when `features.scanCodes` stands. See [Scan Codes](#scan-codes).
@@ -117,26 +119,34 @@ workers: [
117
119
  certified: true,
118
120
  roles: ['reviewer', 'admin'],
119
121
  envelopeSchema: { data: { field1: '', field2: 0 } },
122
+ inputSchema: MY_INPUT_FORM, // x-lt-* form for the Invoke Tool page; see Invoke forms
120
123
  resolverSchema: { approved: true, notes: '' }, // deprecated legacy fallback — the escalation form is owned by the target role as a versioned form_schema
121
124
  },
122
125
  },
123
126
  ]
124
127
  ```
125
128
 
129
+ The detail page has three columns. **Identity** carries the type, an **Icon** picker with a filter over the curated `WORKFLOW_ICONS` set (the chosen glyph leads the workflow's row and heading on the Invoke Tool page in place of the tier glyph), the description, and the queue. **Invocation** edits the roles and the **Input Form**; with an input form declared, the envelope field narrows to the `metadata` stamped on every run. **Preview** renders that form live from the editor as operators will meet it, interactive so conditional sections can be walked before saving. **Unregister** sits with the header actions beside Cancel and Save. See [Invoke forms](hitl/invoke-form.md).
130
+
126
131
  **API:** `GET /api/workflows/discovered` returns the unified list. `PUT /api/workflows/:type/config` creates or updates a config entry. `DELETE /api/workflows/:type/config` removes it.
127
132
 
128
- ### Invoke Workflow
133
+ ### Invoke Tool
134
+
135
+ Accessible at `/workflows/durable/invoke` to anyone the server lists an invokable workflow for. The server decides the list with the same predicate the invoke gate runs (`invocationRoles` on each config; empty means every authenticated user; superadmin and admin see everything, including active durable workers with no registration). Builders keep **Invoke Tool** under Orchestrate; every other persona gets a **Tools** nav section with the same **Invoke Tool** entry that appears only when the list is non-empty, and the route sends a caller with nothing to invoke home.
129
136
 
130
- Accessible at `/workflows/durable/invoke`. A two-panel page for starting any invocable procedural workflow. The left panel lists invocable workflows grouped by task queue, with a queue select and search in the filter bar; each row carries its tier badge, and workflows with an active cron schedule show a clock icon. Selecting a workflow syncs `?type=<WorkflowType>` to the URL and opens the invocation form on the right:
137
+ Every invokable workflow is presented as a tool. The list of tools takes the left quarter of the row, grouped by task queue, with the prompt **Choose a tool to begin** until one is selected. Names read as titles (`fleetTools` shows as **Fleet Tools**, queues the same way) and each row leads with the workflow's icon, or its tier glyph when none is declared. The first row is preselected, `?type=<WorkflowType>` tracks the choice, and every choice is a history entry, so the page opens on a form and the back button retraces picks. The form fills the rest of the row, its heading and Submit staying put while the body scrolls:
131
138
 
132
- - **Identity summary** — who will execute: the current user, the workflow's configured `execute_as` bot ("configured default"), or, for admins and superadmins, an override chosen from the bot picker ("admin override"). The invocation runs under that identity's `_scope`.
139
+ - **Heading and description** — the icon and title, with the identifier, tier, and queue as metadata, then the config's one-line description. Keep reference material in `x-lt-help`; it appears in the side panel on demand.
140
+ - **Identity summary** — who will execute: the current user, the workflow's configured `execute_as` bot ("configured default"), or, for admins and superadmins, an override chosen from the bot picker ("admin override").
133
141
  - **Certification checkbox** — for a certified workflow, stamps `metadata.certified` on this one run.
134
- - **Envelope editor** — the envelope is `{ data, metadata }`: `data` holds the workflow input, `metadata` optional context. Two modes that stay in sync: a **Form view** that auto-generates a field per `envelope_schema.data` key (type inferred — text, number, boolean, object) and a raw **JSON view**. When a workflow has no `envelope_schema`, a banner links to the registry to add one.
135
- - **Start Workflow** button calls the invoke endpoint and navigates to the executions list.
142
+ - **The form** — a workflow that declares `inputSchema` renders the x-lt-* form: sections, two columns, conditional fields and instruction blocks, and a side panel with **Instructions** (the interpolated `x-lt-help`) and **Issues** (violations, click to focus). Every other workflow renders the envelope template form from `envelopeSchema`, with its Form and JSON views. See [Invoke forms](hitl/invoke-form.md).
143
+ - **Submit** — posts `{ data, metadata }` to the invoke endpoint. The page stays put, reports the started id, and subscribes to that run's `system.workflow.{id}.completed` and `.failed` events, so the outcome and the workflow's returned `data` appear beside Submit without leaving the page. One click disarms the button until the person chooses **Submit again**. While live events are off, a warning beside the button offers a reconnect, since the result could not arrive otherwise. Builders also get a **View workflow** link to its execution. A `422` from the input schema gate lands in the Issues view.
136
144
 
137
- Recurring (cron) execution is owned by Automations schedule workflows from the Agents page. The graph equivalent, **Graph → Invoke** (`/mcp/workflows/invoke`), starts a compiled YAML flow from the same shape.
145
+ Below 1280px the list folds into a select and the form takes the full width.
138
146
 
139
- **API:** `POST /api/workflows/:type/invoke` starts a workflow (body `{ data, metadata?, execute_as? }`, returns `202` with the workflow id). `GET /api/workflows/discovered` backs the list; `GET /api/workflows/:type/config` supplies the envelope schema and identity.
147
+ Recurring (cron) execution is owned by Automations schedule workflows from the Agents page. The graph equivalent, **Graph Invoke** (`/mcp/workflows/invoke`), starts a compiled YAML flow.
148
+
149
+ **API:** `GET /api/workflows/invocable` backs the list and the nav. `POST /api/workflows/:type/invoke` starts a workflow (body `{ data, metadata?, execute_as? }`, returns `202` with the workflow id; `422` with the canonical validation body when `input_schema` rejects the data).
140
150
 
141
151
  ### MCP Tool Designer
142
152
 
@@ -553,15 +563,18 @@ markdown body. Each user dismisses per-browser.
553
563
  Role targeting scopes display, never access: the live event reaches every
554
564
  authenticated subscriber, so announcement bodies must never carry secrets.
555
565
 
556
- ### Global search
566
+ ### Search and run
567
+
568
+ The header bar is one input with two verbs, chosen by the type chip that
569
+ trails it. **Find** modes look an escalation up; **Run** modes execute a scan
570
+ code composed from a chosen rule plus the typed target. The bar appears when
571
+ either verb is enabled and offers whichever modes the deployment provides.
557
572
 
558
- An opt-in header search bar for one-gesture lookups across every escalation
559
- of any status. Configure it in the `start()` config —
573
+ **Find** is the opt-in global search. Configure it in the `start()` config
560
574
  `search: { enabled: true, facets: ['orderId', 'po'] }` — or by env
561
- (`LT_SEARCH_BAR=true`, `LT_SEARCH_FACETS=orderId,po`; env wins). The picklist
575
+ (`LT_SEARCH_BAR=true`, `LT_SEARCH_FACETS=orderId,po`; env wins). The chip
562
576
  always offers `escalationId` and `workflowId` (long-tail-owned lookups) ahead
563
- of the configured metadata facets, and remembers the last-used facet per
564
- device.
577
+ of the configured metadata facets.
565
578
 
566
579
  - A metadata facet lands on the escalation list filtered by that facet across
567
580
  all statuses, newest first (the same deep link as clicking a facet value).
@@ -570,10 +583,23 @@ device.
570
583
  - `workflowId` opens the workflow's single escalation, lists several to pick
571
584
  from, or links straight to the workflow execution when none exist.
572
585
 
573
- Kiosk sessions see the bar too a station can dump a PO or order id and jump
574
- straight to it; RBAC read scope bounds what any search can return. See
575
- [Faceted Routing](faceted-routing.md) a search is a one-gesture facet deep
576
- link.
586
+ **Run** appears when `features.scanCodes` is on. Every enabled rule of every
587
+ enabled action scheme is a mode, grouped by scheme; pick one and the bar
588
+ shows its code head (`10:1:`) ahead of the input and names the target facet
589
+ in the placeholder. Type the target and press Enter: the bar composes
590
+ `10:1:<target>` and executes it through the same pipeline a scanner uses, so
591
+ the outcome navigates, confirms, or answers exactly as a physical scan would.
592
+ An outcome that answers in place (a fallback, a conflict, a closed row) is
593
+ narrated right under the bar. A whole code pasted into a Run mode executes
594
+ as-is; fixed-encoding rules accept digits only and say so inline. The menu
595
+ footer opens the scan panel for scanner settings and the barcode preview.
596
+ See [Scan codes](scan-codes.md).
597
+
598
+ The chip remembers the last-used mode per device. Kiosk sessions see the bar
599
+ too — a station can dump a PO or order id and jump straight to it, or run a
600
+ rule against a serial it can read but not scan; RBAC bounds what any search or
601
+ run can reach. See [Faceted Routing](faceted-routing.md) — a search is a
602
+ one-gesture facet deep link.
577
603
 
578
604
  ### Inbox
579
605
 
package/docs/events.md CHANGED
@@ -30,6 +30,8 @@ await start({
30
30
 
31
31
  The dashboard auto-detects its event transport via `GET /api/settings`. By default, Socket.IO is reported — it works in-process with no additional infrastructure.
32
32
 
33
+ The connection follows the session. It opens the moment a login lands, whether the person signed in with credentials or arrived through the host's SSO exchange, closes on logout, and presents the token current at each reconnect, so a refreshed token never strands the socket. The footer's event indicator turns green while connected and amber while not; clicking it while amber reloads the page.
34
+
33
35
  For multi-container deployments where the API and workers run as separate processes, set `EVENT_TRANSPORT=nats` to tell the dashboard to connect via NATS WebSocket instead of Socket.IO:
34
36
 
35
37
  ```yaml
@@ -69,7 +71,7 @@ System families declare the fields they populate. Which fields exist is a functi
69
71
 
70
72
  | Family | Subject | Adds |
71
73
  |---|---|---|
72
- | workflow | `system.workflow.{id}.{started\|completed\|failed}` | `workflowId`, `workflowName`, `taskQueue`, `status` |
74
+ | workflow | `system.workflow.{id}.{started\|completed\|failed}` | `workflowId`, `workflowName`, `taskQueue`, `status`; `completed` carries the workflow's returned `data` |
73
75
  | task | `system.task.{taskId}.{created\|started\|completed\|escalated\|failed}` | + `taskId` |
74
76
  | escalation | `system.escalation.{role}.{id}.{created\|resolved\|claimed\|released\|cancelled\|reassigned\|expired}` | `escalationId`, `role` (+ workflow context), `status` |
75
77
  | activity | `system.activity.{wfId}.{activity}.{started\|completed\|failed}` | `activityName` (+ workflow context) |
@@ -125,7 +125,7 @@ A bound link variable also **scopes the Pace Board** — the same device value
125
125
  narrows the board's station counts, time-in-state mix, and entity timelines,
126
126
  not just the pins. See [Operations — Scoping the board](operations.md#scoping-the-board).
127
127
 
128
- The dashboard's [global search bar](dashboard.md#global-search) is the
128
+ The dashboard's [global search bar](dashboard.md#search-and-run) is the
129
129
  one-gesture sibling of this surface: a configured facet name plus a value
130
130
  lands on the same all-status faceted list a deep link produces.
131
131
 
@@ -20,21 +20,47 @@ When `x-lt-viewport` is present, the dashboard renders an iframe instead of the
20
20
 
21
21
  ---
22
22
 
23
+ ## Stage URLs
24
+
25
+ `src` is the editor: it renders full-bleed once the viewer holds the claim. Two optional URLs show the embedded app at the other stages of the item's life, inside the standard page with its title and action bar:
26
+
27
+ ```json
28
+ {
29
+ "x-lt-viewport": {
30
+ "type": "iframe",
31
+ "src": "https://your-app.example.com/design?workbenchId={workbenchId}",
32
+ "onPending": "https://your-app.example.com/preview?workbenchId={workbenchId}",
33
+ "onResolved": "https://your-app.example.com/summary?stl={stl_url}"
34
+ }
35
+ }
36
+ ```
37
+
38
+ | Stage | When | URL | The embed |
39
+ |-------|------|-----|-----------|
40
+ | `pending` | Pending and not workable by the viewer: available, or claimed by someone else | `onPending` | Shows; the action bar carries Claim |
41
+ | `claimed` | Pending and workable by the viewer | `src` | Works; `lt:submit` resolves |
42
+ | `resolved` | Resolved | `onResolved` | Shows the outcome |
43
+
44
+ Pending and resolved embeds are read-only: the parent drops `lt:submit` and `lt:escalate` from them and never sends `lt:validate`. Every `lt:init` carries `stage`, so one app can serve all three URLs and branch on it. Leave a stage URL out to keep the default surface — the claim affordance while pending, the submitted values once resolved. A cancelled item always renders the default surface.
45
+
46
+ ---
47
+
23
48
  ## URL Token Substitution
24
49
 
25
- The `src` value supports `{key}` tokens — single-brace, flat key lookup. The dashboard expands them at render time using values merged from three sources, in priority order:
50
+ Every stage URL supports `{key}` tokens — single-brace, flat key lookup. The dashboard expands them at render time using values merged from four sources, in priority order:
26
51
 
27
52
  | Priority | Source | Field |
28
53
  |----------|--------|-------|
29
- | 1 (highest) | `escalation_payload` | Per-escalation context set by the workflow |
30
- | 2 | `envelope` | Input envelope set by the workflow |
31
- | 3 (lowest) | `metadata` | Row metadata |
54
+ | 1 (highest) | `resolver_payload` | The submitted resolution populated once resolved, so `onResolved` can point at the outcome |
55
+ | 2 | `escalation_payload` | Per-escalation context set by the workflow |
56
+ | 3 | `envelope` | Input envelope set by the workflow |
57
+ | 4 (lowest) | `metadata` | Row metadata |
32
58
 
33
59
  Keys present in multiple sources resolve from the highest-priority one. A key with no match is left as `{key}` in the final URL.
34
60
 
35
61
  ### Example — CAD designer workbench
36
62
 
37
- The `cad-designer` role embeds a WebGL editor. Each escalation carries `workbenchId` and `companyId` in its payload; the dashboard injects them into the iframe URL at render time:
63
+ The `cad-designer` role embeds a WebGL editor at `/design` while claimed and its QC view at `/qc` before the claim and after the resolve. Each escalation carries `workbenchId` and `companyId` in its payload; the dashboard injects them into every stage URL at render time:
38
64
 
39
65
  ```typescript
40
66
  // Form schema on the role
@@ -42,6 +68,8 @@ const WORKBENCH_FORM_SCHEMA = {
42
68
  'x-lt-viewport': {
43
69
  type: 'iframe',
44
70
  src: `${BASE_URL}/design?workbenchId={workbenchId}&companyId={companyId}`,
71
+ onPending: `${BASE_URL}/qc?workbenchId={workbenchId}&companyId={companyId}`,
72
+ onResolved: `${BASE_URL}/qc?workbenchId={workbenchId}&companyId={companyId}`,
45
73
  },
46
74
  properties: {
47
75
  stl_url: {
@@ -68,7 +96,7 @@ At render time the dashboard produces:
68
96
  https://editor.internal/design?workbenchId=wb-123&companyId=co-456
69
97
  ```
70
98
 
71
- `{workbenchId}` and `{companyId}` are resolved from `escalation_payload`, which has the highest priority — so even if the same keys appear in `envelope` or `metadata`, the payload values win.
99
+ `{workbenchId}` and `{companyId}` are resolved from `escalation_payload`, which outranks `envelope` and `metadata` — so even if the same keys appear there, the payload values win.
72
100
 
73
101
  ### Common token patterns
74
102
 
@@ -104,6 +132,7 @@ Communication happens via `window.postMessage`.
104
132
  workflow_type: string | null,
105
133
  },
106
134
  schema: Record<string, unknown>, // The full form schema
135
+ stage: 'pending' | 'claimed' | 'resolved', // Which stage URL this embed serves
107
136
  }
108
137
 
109
138
  // Optional: parent requests the iframe to submit
@@ -0,0 +1,98 @@
1
+ # Invoke Forms
2
+
3
+ A workflow's invoke form can be the same rich, versioned form the escalation surfaces use. Declare `inputSchema` on the worker config and the Invoke Tool page renders it with the full [x-lt-* vocabulary](../hitl-guide.md#full-vocabulary-quick-reference): two-column layout, sections, column groups, conditional display, instruction blocks, dynamic options, and a help panel. The submitted `data` is the x-lt-bind mapped payload, and the invoke API validates it against the same schema with the same shared pass, so a payload the form accepts is accepted by the API, and a rejection lists the exact violations the form shows.
4
+
5
+ Without `inputSchema`, the page renders the envelope template form from `envelopeSchema` exactly as before. Nothing changes for existing deployments until a workflow opts in.
6
+
7
+ ## Declaring the form
8
+
9
+ ```typescript
10
+ const fleetToolsConfig: LTWorkerConfig = {
11
+ description: '**Fleet tools** — one form, four tools for one machine.',
12
+ invocable: true,
13
+ invocationRoles: ['printer-fleet', 'print-servicer'],
14
+ envelopeSchema: { data: {}, metadata: { source: 'dashboard' } },
15
+ inputSchema: FLEET_TOOLS_INPUT_SCHEMA,
16
+ icon: WORKFLOW_ICONS.WRENCH,
17
+ };
18
+ ```
19
+
20
+ Workflow names read as titles on the page: `fleetTools` shows as **Fleet Tools**, and queue names the same way, with the identifiers kept as metadata beside them.
21
+
22
+ | Field | Role in the invoke |
23
+ |---|---|
24
+ | `inputSchema` | The form. JSON Schema `properties` plus x-lt-* tokens. Rendered by the Invoke Tool page; enforced by the invoke API. |
25
+ | `envelopeSchema.metadata` | The `metadata` stamped on every run from this form. `envelopeSchema.data` is ignored when `inputSchema` is present. |
26
+ | `invocationRoles` | Who sees the workflow on the Invoke Tool page and who may start it. Empty means every authenticated user. |
27
+ | `description` | One line at the top of the form column, markdown allowed. Keep the reference material in `x-lt-help`, which appears in the side panel on demand. |
28
+ | `icon` | A curated icon from `WORKFLOW_ICONS` (`icon: WORKFLOW_ICONS.WRENCH`). Leads the workflow's row and heading in place of the tier glyph so operators tell tools apart at a glance. The registry offers the same set as a picker. |
29
+
30
+ The registry detail page edits the same schema under **Input Form** in its Invocation column, beside a live preview of the form, and the registration wizard offers the field for new entries. The reference is [`examples/workflows/fleet-tools/forms.ts`](../../examples/workflows/fleet-tools/forms.ts): a `serialNumber` and an `action` decision, then one section per action that appears only when that action is chosen, each carrying its own knobs and its own instruction block.
31
+
32
+ ## Form values, payload, and domains
33
+
34
+ The form edits flat values keyed by property name. On submit, `x-lt-bind` maps them into the nested `data` the workflow receives:
35
+
36
+ ```jsonc
37
+ // properties
38
+ "serialNumber": { "x-lt-bind": "printer.serialNumber" },
39
+ "action": { "x-lt-bind": "tool.action" },
40
+ "copies": { "x-lt-bind": "tool.details.copies", "x-lt-showIf": "input.action=reprint-label" }
41
+
42
+ // POST /api/workflows/fleetTools/invoke
43
+ { "data": { "printer": { "serialNumber": "printer-07" }, "tool": { "action": "reprint-label", "details": { "copies": 2 } } },
44
+ "metadata": { "source": "dashboard" } }
45
+ ```
46
+
47
+ Conditions and help tokens read the live form under the `input` domain: `x-lt-showIf: "input.action=retire"`, `{{input.serialNumber}}`. `resolver` names the same values, so a schema written for an escalation form works unchanged. The only other domain an invoke form can read is `metadata`, the envelope metadata declared above.
48
+
49
+ Hidden conditional fields still submit their defaults, as on every x-lt-* form. Treat empty as absent in the workflow.
50
+
51
+ ## Conditional instructions
52
+
53
+ An instruction is a read-only markdown field. Give it the same `x-lt-showIf` as the knobs it explains and it arrives with them:
54
+
55
+ ```jsonc
56
+ "powerCycleFirst": {
57
+ "type": "string",
58
+ "x-lt-widget": "markdown",
59
+ "readOnly": true,
60
+ "default": "**Power cycle first.** Most stalls clear on a restart.",
61
+ "x-lt-section": "Report the machine offline",
62
+ "x-lt-showIf": ["input.action=report-offline", "!input.powerCycled"]
63
+ }
64
+ ```
65
+
66
+ An array of conditions requires every one, so the prompt belongs to its tool and still reacts to the checkbox.
67
+
68
+ `x-lt-help` on the schema root is the longer reference for the side panel: markdown, tables, and `{{input.*}}` tokens that re-interpolate as the operator types.
69
+
70
+ ## The Invoke Tool page
71
+
72
+ The page is open to anyone the server lists an invokable workflow for. Builders reach **Invoke Tool** under Orchestrate; every other persona gets a **Tools** section in the nav that appears only when there is something to invoke. Each invokable workflow is a tool; the list sits on the left, grouped by task queue, with the first workflow preselected; the form takes the rest of the row. Below 1280px the list folds into a select and the form takes the full width.
73
+
74
+ The form's side panel carries two views: **Instructions**, the interpolated `x-lt-help`, and **Issues**, the current violations, each click focusing its field. A server rejection lands in the same Issues view.
75
+
76
+ Once a run starts, the page subscribes to `system.workflow.{workflowId}.completed` and `.failed` for that id. The outcome and the workflow's returned `data` render beside Submit, so a tool's answer comes back to the person who asked for it. Submit disarms after one click until the person chooses to submit again, and a warning offers to reconnect live events when they are off.
77
+
78
+ ## The server contract
79
+
80
+ `POST /api/workflows/:type/invoke` validates `data` against `input_schema` after the role check and before anything starts. A rejection is the canonical 422 body used by every schema gate:
81
+
82
+ ```json
83
+ {
84
+ "error": "data failed input schema validation (2 violations)",
85
+ "code": "schema_validation",
86
+ "violations": [
87
+ { "field": "serialNumber", "message": "Required" },
88
+ { "field": "action", "message": "Required" }
89
+ ],
90
+ "role": null,
91
+ "schemaVersion": null,
92
+ "workflowType": "fleetTools"
93
+ }
94
+ ```
95
+
96
+ The MCP tools `invoke_workflow` and `invoke_workflow_read_safe` run the same gate and return the body as an error result. The gate reads bound paths from the nested `data`, skips fields a `x-lt-showIf` hides, and applies every validation keyword the form applies.
97
+
98
+ `GET /api/workflows/invocable` returns the caller's invokable workflows with their tier. The list and the gate share one predicate, so the page never offers a workflow the API would refuse.
@@ -21,6 +21,16 @@ Compare the resolved value's string form against a literal:
21
21
 
22
22
  The expected value is the raw remainder after the operator (trimmed; no quoting). Numbers and booleans compare via their string form (`metadata.count=3`, `metadata.live=true`). An absent value compares as the empty string — so `=X` is false and `!=X` is true when the path is missing. `resolver.` conditions react live as the user edits, exactly like the truthy form — this is what drives per-designation sub-surfaces on verdict forms (different fields for send-to-design vs send-to-printing).
23
23
 
24
+ ### Several conditions
25
+
26
+ Pass an array to require every condition. The field shows only when all hold:
27
+
28
+ ```json
29
+ "x-lt-showIf": ["input.action=report-offline", "!input.powerCycled"]
30
+ ```
31
+
32
+ Each entry uses the same grammar as a single condition. A hidden field is skipped by validation exactly as with one condition.
33
+
24
34
  ### Domains
25
35
 
26
36
  | Domain | Resolves against |
@@ -30,6 +40,7 @@ The expected value is the raw remainder after the operator (trimmed; no quoting)
30
40
  | `envelope` | The workflow-sent input envelope |
31
41
  | `escalation` | Top-level escalation row fields (`role`, `status`, `priority`, …) |
32
42
  | `resolver` | The submitted resolver payload — **live**: reacts in real time as the user edits the form |
43
+ | `input` | The same live form values under the invoke form's name (see [invoke-form.md](invoke-form.md)) |
33
44
 
34
45
  Conditions based on `metadata`, `payload`, `envelope`, and `escalation` are static (read from the stored row). Conditions based on `resolver` are dynamic — the field appears or disappears immediately as the user edits a sibling field, without a page reload.
35
46
 
@@ -24,6 +24,7 @@ This works because the form is data: a JSON Schema stored on the role, versioned
24
24
  | Rename the resolve footer, or claim-and-submit in one gesture | Footer tokens | [x-lt-footer.md](hitl/x-lt-footer.md) |
25
25
  | Block the resolve until embedded work drains, then auto-close when it does | `x-lt-submit-guard` | [x-lt-embed.md](hitl/x-lt-embed.md) |
26
26
  | A fully custom UI nothing above can express | Iframe viewport | [iframe.md](hitl/iframe.md) |
27
+ | The same rich form for starting a workflow from the Invoke Tool page | `inputSchema` on the worker config | [invoke-form.md](hitl/invoke-form.md) |
27
28
 
28
29
  ---
29
30
 
@@ -103,6 +104,7 @@ Ordered as a learning path — each file adds one capability to the same form:
103
104
 
104
105
  | Keyword | Level | Purpose |
105
106
  |---------|-------|---------|
107
+ | `input.*` | domain | The live form values on the Invoke surface (alias of `resolver.*`) for `x-lt-showIf`, `x-lt-help`, and `x-lt-options` |
106
108
  | `x-lt-widget` | field | Rich control: `file-upload`, `code-editor`, `signature`, `rich-text`, `markdown`, `checklist`, `attachment` (alias `image`) |
107
109
  | `x-lt-source` | field | Data path for context-driven widgets: `"domain.path"` or an ordered array of paths (first to resolve wins); may embed `{{domain.path}}` interpolation segments |
108
110
  | `x-lt-require-all` | field | Checklist completion guard — every item must be checked, except items declared `required: false` |
@@ -113,7 +115,7 @@ Ordered as a learning path — each file adds one capability to the same form:
113
115
  | `accept` | field | File-type filter for `file-upload` (e.g. `".pdf,.png"`) |
114
116
  | `x-lt-bind` | field | Path in the resolver payload (e.g. `"customer.email"`) |
115
117
  | `x-lt-span` | field | Column span in a `two-column` layout (`2` = full width) |
116
- | `x-lt-showIf` | field | Show field when a value is truthy at `domain.path`; prefix `!` to invert; `=VALUE` / `!=VALUE` compare the string form |
118
+ | `x-lt-showIf` | field | Show field when a value is truthy at `domain.path`; prefix `!` to invert; `=VALUE` / `!=VALUE` compare the string form; an array requires every condition |
117
119
  | `x-lt-hide-if-empty` | field | `true` — suppress the field when its value is null, `""`, `false`, or `0` |
118
120
  | `x-lt-section` | field | Section group label |
119
121
  | `x-lt-options` | field | Dynamic select options — resolves a `"domain.path"` (or an ordered array of paths, first to resolve wins) to the field's option list (scalars or `{ value, label }`); static `enum` wins; `{{domain.path}}` segments make cascading selects |
@@ -128,7 +130,7 @@ Ordered as a learning path — each file adds one capability to the same form:
128
130
  | `x-lt-card` | schema (list) | `facet-board`: per-entity card — `{ title, state?, fields? }`; fields accept `format: "age"` |
129
131
  | `x-lt-help` | schema | Markdown guidance for the side panel's Help view |
130
132
  | `x-lt-context` | schema | Plain-text fallback for the Help view when `x-lt-help` is absent |
131
- | `x-lt-viewport` | schema | Replace the generated form with a custom iframe UI |
133
+ | `x-lt-viewport` | schema | Replace the generated form with a custom iframe UI; `src` is the editor, `onPending` / `onResolved` show the embed at the other stages |
132
134
  | `x-lt-submit-guard` | schema | Block the resolve while an embedded escalation query returns rows; `autoResolveWhenEmpty` auto-closes the claimed parent once it drains. Enforced isomorphically for `enforce_schema` roles |
133
135
  | `x-lt-submit-on-claim` | schema | Claiming also resolves the form's seeded defaults in one gesture |
134
136
  | `x-lt-labels` | schema | Per-target labels for the footer controls (`claim`, `cancel`, `submit`, `release`) |
package/docs/iam.md CHANGED
@@ -259,7 +259,7 @@ The dashboard surfaces IAM across four pages:
259
259
 
260
260
  **Accounts** (`/admin/users`) — unified management for User Accounts and Service Accounts via tab toggle. Create service accounts, assign roles, generate API keys. The key generation flow displays the raw key once; it cannot be retrieved after dismissal.
261
261
 
262
- **Invoke Workflow** (`/workflows/start`) — all invocable workflows in a single list with visual tier distinction. Certified workflows show the green shield; durable workflows show the standard icon. Both support Start Now and Schedule (cron).
262
+ **Invoke Tool** (`/workflows/start`) — all invocable workflows in a single list with visual tier distinction. Certified workflows show the green shield; durable workflows show the standard icon. Both support Start Now and Schedule (cron).
263
263
 
264
264
  **Connections** (`/credentials`) — each user manages their OAuth provider connections. Status, credential type, and expiry are visible. Users connect or revoke providers here.
265
265