@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
@@ -35,7 +35,9 @@ export declare function getWorkflowConfig(input: {
35
35
  * @param input.invocation_roles — roles that can invoke this workflow
36
36
  * @param input.consumes — workflow types whose data this workflow consumes
37
37
  * @param input.tool_tags — MCP tool tags for discovery
38
- * @param input.envelope_schema — JSON Schema for envelope.data validation
38
+ * @param input.envelope_schema — JSON template that pre-fills the invoke form
39
+ * @param input.input_schema — x-lt-* JSON Schema for the rich invoke form; invoke validates data against it
40
+ * @param input.icon — curated icon name (WORKFLOW_ICONS); anything else is refused
39
41
  * @param input.resolver_schema — JSON Schema for resolver payload validation
40
42
  * @param input.cron_schedule — cron expression for scheduled execution
41
43
  * @returns `{ status: 200, data: <saved config> }`
@@ -53,6 +55,8 @@ export declare function upsertWorkflowConfig(input: {
53
55
  consumes?: string[];
54
56
  tool_tags?: string[];
55
57
  envelope_schema?: any;
58
+ input_schema?: any;
59
+ icon?: string | null;
56
60
  resolver_schema?: any;
57
61
  cron_schedule?: string | null;
58
62
  read_safe?: boolean;
@@ -38,6 +38,7 @@ exports.getWorkflowConfig = getWorkflowConfig;
38
38
  exports.upsertWorkflowConfig = upsertWorkflowConfig;
39
39
  exports.deleteWorkflowConfig = deleteWorkflowConfig;
40
40
  const configService = __importStar(require("../../services/config"));
41
+ const workflow_icons_1 = require("../../types/workflow-icons");
41
42
  const cron_1 = require("../../services/cron");
42
43
  const ltconfig_1 = require("../../modules/ltconfig");
43
44
  /**
@@ -93,13 +94,18 @@ async function getWorkflowConfig(input) {
93
94
  * @param input.invocation_roles — roles that can invoke this workflow
94
95
  * @param input.consumes — workflow types whose data this workflow consumes
95
96
  * @param input.tool_tags — MCP tool tags for discovery
96
- * @param input.envelope_schema — JSON Schema for envelope.data validation
97
+ * @param input.envelope_schema — JSON template that pre-fills the invoke form
98
+ * @param input.input_schema — x-lt-* JSON Schema for the rich invoke form; invoke validates data against it
99
+ * @param input.icon — curated icon name (WORKFLOW_ICONS); anything else is refused
97
100
  * @param input.resolver_schema — JSON Schema for resolver payload validation
98
101
  * @param input.cron_schedule — cron expression for scheduled execution
99
102
  * @returns `{ status: 200, data: <saved config> }`
100
103
  */
101
104
  async function upsertWorkflowConfig(input) {
102
105
  try {
106
+ if (input.icon && !(0, workflow_icons_1.isWorkflowIcon)(input.icon)) {
107
+ return { status: 400, error: `Unknown workflow icon "${input.icon}"; choose one of WORKFLOW_ICONS` };
108
+ }
103
109
  // Validate cron expression before persisting
104
110
  if (input.cron_schedule) {
105
111
  const { validateCronSchedule } = await Promise.resolve().then(() => __importStar(require('../../services/cron')));
@@ -118,6 +124,8 @@ async function upsertWorkflowConfig(input) {
118
124
  consumes: input.consumes ?? [],
119
125
  tool_tags: input.tool_tags ?? [],
120
126
  envelope_schema: input.envelope_schema ?? null,
127
+ input_schema: input.input_schema ?? null,
128
+ icon: input.icon ?? null,
121
129
  resolver_schema: input.resolver_schema ?? null,
122
130
  cron_schedule: input.cron_schedule ?? null,
123
131
  read_safe: input.read_safe ?? false,
@@ -1,3 +1,6 @@
1
1
  export { invokeWorkflow, getWorkflowStatus, getWorkflowResult, terminateWorkflow, exportWorkflow, } from './invocation';
2
2
  export { listWorkers, listDiscoveredWorkflows, getCronStatus, } from './discovery';
3
+ export { listInvocableWorkflows, WORKFLOW_TIERS } from './invocable';
4
+ export type { InvocableWorkflowEntry, WorkflowTier } from './invocable';
5
+ export { checkInvokeInput, inputValidationFailure } from './input-validation';
3
6
  export { listWorkflowConfigs, getWorkflowConfig, upsertWorkflowConfig, deleteWorkflowConfig, } from './config';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.deleteWorkflowConfig = exports.upsertWorkflowConfig = exports.getWorkflowConfig = exports.listWorkflowConfigs = exports.getCronStatus = exports.listDiscoveredWorkflows = exports.listWorkers = exports.exportWorkflow = exports.terminateWorkflow = exports.getWorkflowResult = exports.getWorkflowStatus = exports.invokeWorkflow = void 0;
3
+ exports.deleteWorkflowConfig = exports.upsertWorkflowConfig = exports.getWorkflowConfig = exports.listWorkflowConfigs = exports.inputValidationFailure = exports.checkInvokeInput = exports.WORKFLOW_TIERS = exports.listInvocableWorkflows = exports.getCronStatus = exports.listDiscoveredWorkflows = exports.listWorkers = exports.exportWorkflow = exports.terminateWorkflow = exports.getWorkflowResult = exports.getWorkflowStatus = exports.invokeWorkflow = void 0;
4
4
  var invocation_1 = require("./invocation");
5
5
  Object.defineProperty(exports, "invokeWorkflow", { enumerable: true, get: function () { return invocation_1.invokeWorkflow; } });
6
6
  Object.defineProperty(exports, "getWorkflowStatus", { enumerable: true, get: function () { return invocation_1.getWorkflowStatus; } });
@@ -11,6 +11,12 @@ var discovery_1 = require("./discovery");
11
11
  Object.defineProperty(exports, "listWorkers", { enumerable: true, get: function () { return discovery_1.listWorkers; } });
12
12
  Object.defineProperty(exports, "listDiscoveredWorkflows", { enumerable: true, get: function () { return discovery_1.listDiscoveredWorkflows; } });
13
13
  Object.defineProperty(exports, "getCronStatus", { enumerable: true, get: function () { return discovery_1.getCronStatus; } });
14
+ var invocable_1 = require("./invocable");
15
+ Object.defineProperty(exports, "listInvocableWorkflows", { enumerable: true, get: function () { return invocable_1.listInvocableWorkflows; } });
16
+ Object.defineProperty(exports, "WORKFLOW_TIERS", { enumerable: true, get: function () { return invocable_1.WORKFLOW_TIERS; } });
17
+ var input_validation_1 = require("./input-validation");
18
+ Object.defineProperty(exports, "checkInvokeInput", { enumerable: true, get: function () { return input_validation_1.checkInvokeInput; } });
19
+ Object.defineProperty(exports, "inputValidationFailure", { enumerable: true, get: function () { return input_validation_1.inputValidationFailure; } });
14
20
  var config_1 = require("./config");
15
21
  Object.defineProperty(exports, "listWorkflowConfigs", { enumerable: true, get: function () { return config_1.listWorkflowConfigs; } });
16
22
  Object.defineProperty(exports, "getWorkflowConfig", { enumerable: true, get: function () { return config_1.getWorkflowConfig; } });
@@ -0,0 +1,13 @@
1
+ import { type LTValidationErrorBody } from '../../types/validation';
2
+ import type { LTWorkflowConfig } from '../../types/config';
3
+ import type { LTApiResult } from '../../types/sdk';
4
+ /**
5
+ * The invoke input gate. A workflow that declares input_schema has its
6
+ * submitted data validated by the same shared pass the dashboard form runs,
7
+ * so a payload the form accepts is accepted here and a rejection lists the
8
+ * exact violations the form would show. No schema, no gate; a data value
9
+ * that is not an object is left to the service's own 400.
10
+ */
11
+ export declare function checkInvokeInput(config: Pick<LTWorkflowConfig, 'workflow_type' | 'input_schema'> | null | undefined, data: unknown, metadata: Record<string, unknown> | null | undefined): LTValidationErrorBody | null;
12
+ /** The canonical 422 result; the route serializes `data` as the body. */
13
+ export declare function inputValidationFailure(body: LTValidationErrorBody): LTApiResult;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkInvokeInput = checkInvokeInput;
4
+ exports.inputValidationFailure = inputValidationFailure;
5
+ const validate_resolver_payload_1 = require("../../shared/form-validation/validate-resolver-payload");
6
+ const invoke_context_1 = require("../../shared/form-validation/invoke-context");
7
+ const validation_1 = require("../../types/validation");
8
+ function isPlainObject(value) {
9
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
10
+ }
11
+ /**
12
+ * The invoke input gate. A workflow that declares input_schema has its
13
+ * submitted data validated by the same shared pass the dashboard form runs,
14
+ * so a payload the form accepts is accepted here and a rejection lists the
15
+ * exact violations the form would show. No schema, no gate; a data value
16
+ * that is not an object is left to the service's own 400.
17
+ */
18
+ function checkInvokeInput(config, data, metadata) {
19
+ const schema = config?.input_schema;
20
+ if (!schema || !isPlainObject(data))
21
+ return null;
22
+ const violations = (0, validate_resolver_payload_1.validateResolverPayload)(schema, data, (0, invoke_context_1.buildInvokeFormContext)(metadata));
23
+ if (violations.length === 0)
24
+ return null;
25
+ const n = violations.length;
26
+ return {
27
+ error: `data failed input schema validation (${n} violation${n === 1 ? '' : 's'})`,
28
+ code: validation_1.LT_ERROR_CODES.SCHEMA_VALIDATION,
29
+ violations,
30
+ role: null,
31
+ schemaVersion: null,
32
+ workflowType: config.workflow_type,
33
+ };
34
+ }
35
+ /** The canonical 422 result; the route serializes `data` as the body. */
36
+ function inputValidationFailure(body) {
37
+ return { status: 422, error: body.error, code: body.code, data: body };
38
+ }
@@ -0,0 +1,19 @@
1
+ import type { LTWorkflowConfig } from '../../types/config';
2
+ import type { LTApiResult, LTApiAuth } from '../../types/sdk';
3
+ export declare const WORKFLOW_TIERS: {
4
+ readonly DURABLE: "durable";
5
+ readonly REGISTERED: "registered";
6
+ readonly CERTIFIED: "certified";
7
+ };
8
+ export type WorkflowTier = (typeof WORKFLOW_TIERS)[keyof typeof WORKFLOW_TIERS];
9
+ export type InvocableWorkflowEntry = LTWorkflowConfig & {
10
+ tier: WorkflowTier;
11
+ };
12
+ /**
13
+ * The workflows the caller may invoke, decided by the same predicate the
14
+ * invoke gate runs. Callers with global access also see active durable
15
+ * workers that carry no registration row, as the invoke gate admits them.
16
+ *
17
+ * @returns `{ status: 200, data: { workflows: InvocableWorkflowEntry[] } }`
18
+ */
19
+ export declare function listInvocableWorkflows(auth: LTApiAuth): Promise<LTApiResult>;
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.WORKFLOW_TIERS = void 0;
37
+ exports.listInvocableWorkflows = listInvocableWorkflows;
38
+ const configService = __importStar(require("../../services/config"));
39
+ const userService = __importStar(require("../../services/user"));
40
+ const invocation_access_1 = require("../../services/invocation-access");
41
+ const registry_1 = require("../../services/workers/registry");
42
+ exports.WORKFLOW_TIERS = {
43
+ DURABLE: 'durable',
44
+ REGISTERED: 'registered',
45
+ CERTIFIED: 'certified',
46
+ };
47
+ function tierOf(config) {
48
+ if (!config)
49
+ return exports.WORKFLOW_TIERS.DURABLE;
50
+ return config.certified ? exports.WORKFLOW_TIERS.CERTIFIED : exports.WORKFLOW_TIERS.REGISTERED;
51
+ }
52
+ /** An active worker with no registration row, shaped like a config so one list type serves the page. */
53
+ function durableEntry(workflowType, taskQueue) {
54
+ return {
55
+ workflow_type: workflowType,
56
+ invocable: true,
57
+ certified: false,
58
+ task_queue: taskQueue,
59
+ default_role: 'reviewer',
60
+ description: null,
61
+ roles: [],
62
+ invocation_roles: [],
63
+ consumes: [],
64
+ tool_tags: [],
65
+ envelope_schema: null,
66
+ input_schema: null,
67
+ icon: null,
68
+ resolver_schema: null,
69
+ cron_schedule: null,
70
+ execute_as: null,
71
+ read_safe: false,
72
+ tier: exports.WORKFLOW_TIERS.DURABLE,
73
+ };
74
+ }
75
+ /**
76
+ * The workflows the caller may invoke, decided by the same predicate the
77
+ * invoke gate runs. Callers with global access also see active durable
78
+ * workers that carry no registration row, as the invoke gate admits them.
79
+ *
80
+ * @returns `{ status: 200, data: { workflows: InvocableWorkflowEntry[] } }`
81
+ */
82
+ async function listInvocableWorkflows(auth) {
83
+ try {
84
+ const [configs, user] = await Promise.all([
85
+ configService.listWorkflowConfigs(),
86
+ auth.userId ? userService.getUser(auth.userId) : Promise.resolve(null),
87
+ ]);
88
+ const roles = user?.roles ?? [];
89
+ const workflows = configs
90
+ .filter((c) => (0, invocation_access_1.canInvokeWorkflow)(c, roles, auth.role))
91
+ .map((c) => ({ ...c, tier: tierOf(c) }));
92
+ if ((0, invocation_access_1.hasGlobalInvocationAccess)(roles, auth.role)) {
93
+ const registered = new Set(configs.map((c) => c.workflow_type));
94
+ for (const [name, { taskQueue }] of (0, registry_1.getRegisteredWorkers)()) {
95
+ if (registered.has(name) || registry_1.SYSTEM_WORKFLOWS.has(name))
96
+ continue;
97
+ workflows.push(durableEntry(name, taskQueue));
98
+ }
99
+ }
100
+ workflows.sort((a, b) => a.workflow_type.localeCompare(b.workflow_type));
101
+ return { status: 200, data: { workflows } };
102
+ }
103
+ catch (err) {
104
+ return { status: 500, error: err.message };
105
+ }
106
+ }
@@ -43,6 +43,8 @@ const exportService = __importStar(require("../../services/export"));
43
43
  const task_1 = require("../../services/task");
44
44
  const workflow_invocation_1 = require("../../services/workflow-invocation");
45
45
  const crud_1 = require("../../services/escalation/crud");
46
+ const configService = __importStar(require("../../services/config"));
47
+ const input_validation_1 = require("./input-validation");
46
48
  function isResolveError(err) {
47
49
  return err?.message?.includes('Cannot resolve workflow');
48
50
  }
@@ -60,6 +62,10 @@ function isResolveError(err) {
60
62
  async function invokeWorkflow(input, auth) {
61
63
  try {
62
64
  await (0, workflow_invocation_1.checkInvocationRoles)(input.type, auth.userId, auth.role);
65
+ const config = await configService.getWorkflowConfig(input.type);
66
+ const violation = (0, input_validation_1.checkInvokeInput)(config, input.data, input.metadata);
67
+ if (violation)
68
+ return (0, input_validation_1.inputValidationFailure)(violation);
63
69
  const result = await (0, workflow_invocation_1.invokeWorkflow)({
64
70
  workflowType: input.type,
65
71
  data: input.data || {},
@@ -0,0 +1,13 @@
1
+ -- Migration 034: workflow input form and icon
2
+ --
3
+ -- Two opt-in columns on the workflow registration:
4
+ -- input_schema — an x-lt-* JSON Schema the dashboard renders as the invoke
5
+ -- form and the invoke API validates submitted data against.
6
+ -- NULL keeps the legacy envelope_schema template form.
7
+ -- icon — a curated icon name (WORKFLOW_ICONS) shown in place of the
8
+ -- tier glyph on the Invoke page and registry. NULL keeps the
9
+ -- tier glyph.
10
+
11
+ ALTER TABLE lt_config_workflows
12
+ ADD COLUMN IF NOT EXISTS input_schema JSONB,
13
+ ADD COLUMN IF NOT EXISTS icon TEXT;
@@ -73,6 +73,8 @@ router.put('/:type/config', auth_1.requireAdmin, async (req, res) => {
73
73
  consumes: req.body.consumes,
74
74
  tool_tags: req.body.tool_tags,
75
75
  envelope_schema: req.body.envelope_schema,
76
+ input_schema: req.body.input_schema,
77
+ icon: req.body.icon,
76
78
  resolver_schema: req.body.resolver_schema,
77
79
  cron_schedule: req.body.cron_schedule,
78
80
  });
@@ -60,6 +60,20 @@ router.get('/discovered', async (req, res) => {
60
60
  });
61
61
  res.status(result.status).json(result.data ?? { error: result.error });
62
62
  });
63
+ // ── Invocable for the caller ────────────────────────────────────────────────
64
+ /**
65
+ * GET /api/workflows/invocable
66
+ * The workflows the calling user may invoke, decided by the invoke gate's
67
+ * own predicate. Drives the dashboard Invoke page and its nav entry.
68
+ */
69
+ router.get('/invocable', async (req, res) => {
70
+ const result = await api.listInvocableWorkflows({
71
+ userId: req.auth?.userId ?? '',
72
+ role: req.auth?.role,
73
+ scopes: req.auth?.scopes,
74
+ });
75
+ res.status(result.status).json(result.data ?? { error: result.error });
76
+ });
63
77
  // ── Cron status ─────────────────────────────────────────────────────────────
64
78
  /**
65
79
  * GET /api/workflows/cron/status
@@ -16,6 +16,8 @@ async function loadAllConfigs() {
16
16
  consumes: c.consumes,
17
17
  toolTags: c.tool_tags || [],
18
18
  envelopeSchema: c.envelope_schema ?? null,
19
+ inputSchema: c.input_schema ?? null,
20
+ icon: c.icon ?? null,
19
21
  resolverSchema: c.resolver_schema ?? null,
20
22
  cronSchedule: c.cron_schedule ?? null,
21
23
  executeAs: c.execute_as ?? null,
@@ -26,6 +26,8 @@ async function getWorkflowConfig(workflowType) {
26
26
  consumes: wf.consumes || [],
27
27
  tool_tags: wf.tool_tags || [],
28
28
  envelope_schema: wf.envelope_schema ?? null,
29
+ input_schema: wf.input_schema ?? null,
30
+ icon: wf.icon ?? null,
29
31
  resolver_schema: wf.resolver_schema ?? null,
30
32
  cron_schedule: wf.cron_schedule ?? null,
31
33
  execute_as: wf.execute_as ?? null,
@@ -64,6 +66,8 @@ async function listWorkflowConfigs() {
64
66
  consumes: wf.consumes || [],
65
67
  tool_tags: wf.tool_tags || [],
66
68
  envelope_schema: wf.envelope_schema ?? null,
69
+ input_schema: wf.input_schema ?? null,
70
+ icon: wf.icon ?? null,
67
71
  resolver_schema: wf.resolver_schema ?? null,
68
72
  cron_schedule: wf.cron_schedule ?? null,
69
73
  execute_as: wf.execute_as ?? null,
@@ -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, certified, read_safe)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)\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,\n read_safe = EXCLUDED.read_safe";
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, read_safe, input_schema, icon)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)\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,\n read_safe = EXCLUDED.read_safe,\n input_schema = EXCLUDED.input_schema,\n icon = EXCLUDED.icon";
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, certified, read_safe)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)\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, read_safe, input_schema, icon)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)\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, certified, read_safe)
27
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)
26
+ (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe, input_schema, icon)
27
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)
28
28
  ON CONFLICT (workflow_type) DO UPDATE SET
29
29
  invocable = EXCLUDED.invocable,
30
30
  task_queue = EXCLUDED.task_queue,
@@ -37,7 +37,9 @@ ON CONFLICT (workflow_type) DO UPDATE SET
37
37
  tool_tags = EXCLUDED.tool_tags,
38
38
  execute_as = EXCLUDED.execute_as,
39
39
  certified = EXCLUDED.certified,
40
- read_safe = EXCLUDED.read_safe`;
40
+ read_safe = EXCLUDED.read_safe,
41
+ input_schema = EXCLUDED.input_schema,
42
+ icon = EXCLUDED.icon`;
41
43
  exports.DELETE_CONFIG_ROLES = `\
42
44
  DELETE FROM lt_config_roles WHERE workflow_type = $1`;
43
45
  exports.INSERT_CONFIG_ROLE = `\
@@ -53,8 +55,8 @@ DELETE FROM lt_config_workflows WHERE workflow_type = $1`;
53
55
  // ------------------------------------------------------------------ //
54
56
  exports.SEED_WORKFLOW_CONFIG = `\
55
57
  INSERT INTO lt_config_workflows
56
- (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe)
57
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)
58
+ (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe, input_schema, icon)
59
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)
58
60
  ON CONFLICT (workflow_type) DO NOTHING`;
59
61
  exports.SEED_CONFIG_ROLE = `\
60
62
  INSERT INTO lt_config_roles (workflow_type, role) VALUES ($1, $2)
@@ -53,6 +53,8 @@ async function replaceWorkflowConfig(config, certified) {
53
53
  config.execute_as ?? null,
54
54
  certified,
55
55
  config.read_safe ?? false,
56
+ config.input_schema ?? null,
57
+ config.icon ?? null,
56
58
  ]);
57
59
  // Replace roles
58
60
  await client.query(sql_1.DELETE_CONFIG_ROLES, [config.workflow_type]);
@@ -114,6 +116,8 @@ async function seedWorkflowConfig(config) {
114
116
  config.execute_as ?? null,
115
117
  resolveCertified(config),
116
118
  config.read_safe ?? false,
119
+ config.input_schema ?? null,
120
+ config.icon ?? null,
117
121
  ]);
118
122
  const inserted = (rowCount ?? 0) > 0;
119
123
  if (inserted) {
@@ -144,6 +148,10 @@ async function seedWorkflowConfig(config) {
144
148
  drifts.push('envelope_schema');
145
149
  if (JSON.stringify(config.resolver_schema) !== JSON.stringify(existing.resolver_schema))
146
150
  drifts.push('resolver_schema');
151
+ if (JSON.stringify(config.input_schema ?? null) !== JSON.stringify(existing.input_schema ?? null))
152
+ drifts.push('input_schema');
153
+ if ((config.icon ?? null) !== (existing.icon ?? null))
154
+ drifts.push('icon');
147
155
  if (drifts.length) {
148
156
  logger_1.loggerRegistry.warn(`[long-tail] config drift: ${config.workflow_type} — ${drifts.join(', ')} differ between code and DB`);
149
157
  }
@@ -181,7 +189,9 @@ async function applyWorkflowConfig(config) {
181
189
  sortedEqual(existing.roles ?? [], config.roles ?? []) &&
182
190
  sortedEqual(existing.invocation_roles ?? [], config.invocation_roles ?? []) &&
183
191
  (0, node_util_1.isDeepStrictEqual)(existing.envelope_schema ?? null, config.envelope_schema ?? null) &&
184
- (0, node_util_1.isDeepStrictEqual)(existing.resolver_schema ?? null, config.resolver_schema ?? null);
192
+ (0, node_util_1.isDeepStrictEqual)(existing.resolver_schema ?? null, config.resolver_schema ?? null) &&
193
+ (0, node_util_1.isDeepStrictEqual)(existing.input_schema ?? null, config.input_schema ?? null) &&
194
+ (existing.icon ?? null) === (config.icon ?? null);
185
195
  if (unchanged)
186
196
  return 'unchanged';
187
197
  }
@@ -47,6 +47,11 @@ const context_2 = require("../iam/context");
47
47
  const publish_1 = require("../../lib/events/publish");
48
48
  const envelope_1 = require("../iam/envelope");
49
49
  const DEFAULT_ACTIVITY_QUEUE = 'lt-interceptor';
50
+ /** The result payload a completed event carries: the workflow's `data` when it returned the envelope shape. */
51
+ function resultData(result) {
52
+ const data = result?.data;
53
+ return data && typeof data === 'object' && !Array.isArray(data) ? data : undefined;
54
+ }
50
55
  /**
51
56
  * Register the Long Tail interceptors in a single call.
52
57
  *
@@ -120,6 +125,7 @@ function createLTInterceptor(options) {
120
125
  workflowName: wf.workflowName,
121
126
  taskQueue: taskQueue0,
122
127
  status: 'completed',
128
+ data: resultData(result0),
123
129
  });
124
130
  return result0;
125
131
  }
@@ -138,6 +144,7 @@ function createLTInterceptor(options) {
138
144
  workflowName: wf.workflowName,
139
145
  taskQueue: taskQueue2,
140
146
  status: 'completed',
147
+ data: resultData(result2),
141
148
  });
142
149
  return result2;
143
150
  }
@@ -0,0 +1,18 @@
1
+ import type { LTWorkflowConfig } from '../types/config';
2
+ export interface InvocationRoleGrant {
3
+ role: string;
4
+ type: string;
5
+ }
6
+ export declare const INVOCATION_ROLE_TYPES: {
7
+ readonly SUPERADMIN: "superadmin";
8
+ readonly ADMIN: "admin";
9
+ };
10
+ export declare const ADMIN_ROLE = "admin";
11
+ /** Superadmin anywhere, or the named admin role held as admin type, invokes every workflow. */
12
+ export declare function hasGlobalInvocationAccess(roles: readonly InvocationRoleGrant[], authRole?: string): boolean;
13
+ /**
14
+ * The one invocation predicate, shared by the invoke gate and the per-caller
15
+ * list so the two can never disagree. An empty invocation_roles list opens
16
+ * the workflow to every authenticated caller.
17
+ */
18
+ export declare function canInvokeWorkflow(config: Pick<LTWorkflowConfig, 'invocable' | 'invocation_roles'>, roles: readonly InvocationRoleGrant[], authRole?: string): boolean;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ADMIN_ROLE = exports.INVOCATION_ROLE_TYPES = void 0;
4
+ exports.hasGlobalInvocationAccess = hasGlobalInvocationAccess;
5
+ exports.canInvokeWorkflow = canInvokeWorkflow;
6
+ exports.INVOCATION_ROLE_TYPES = {
7
+ SUPERADMIN: 'superadmin',
8
+ ADMIN: 'admin',
9
+ };
10
+ exports.ADMIN_ROLE = 'admin';
11
+ /** Superadmin anywhere, or the named admin role held as admin type, invokes every workflow. */
12
+ function hasGlobalInvocationAccess(roles, authRole) {
13
+ if (authRole === exports.INVOCATION_ROLE_TYPES.SUPERADMIN)
14
+ return true;
15
+ return roles.some((r) => r.type === exports.INVOCATION_ROLE_TYPES.SUPERADMIN)
16
+ || roles.some((r) => r.role === exports.ADMIN_ROLE && r.type === exports.INVOCATION_ROLE_TYPES.ADMIN);
17
+ }
18
+ /**
19
+ * The one invocation predicate, shared by the invoke gate and the per-caller
20
+ * list so the two can never disagree. An empty invocation_roles list opens
21
+ * the workflow to every authenticated caller.
22
+ */
23
+ function canInvokeWorkflow(config, roles, authRole) {
24
+ if (!config.invocable)
25
+ return false;
26
+ if (config.invocation_roles.length === 0)
27
+ return true;
28
+ if (hasGlobalInvocationAccess(roles, authRole))
29
+ return true;
30
+ const held = new Set(roles.map((r) => r.role));
31
+ return config.invocation_roles.some((r) => held.has(r));
32
+ }
@@ -46,6 +46,7 @@ exports.InvocationError = void 0;
46
46
  exports.invokeWorkflow = invokeWorkflow;
47
47
  exports.checkInvocationRoles = checkInvocationRoles;
48
48
  const hotmesh_1 = require("@hotmeshio/hotmesh");
49
+ const invocation_access_1 = require("./invocation-access");
49
50
  const workers_1 = require("../workers");
50
51
  const configService = __importStar(require("./config"));
51
52
  const userService = __importStar(require("./user"));
@@ -152,15 +153,9 @@ async function checkInvocationRoles(workflowType, userId, authRole) {
152
153
  if (!user) {
153
154
  throw new InvocationError('User not registered', 403);
154
155
  }
155
- const userRoles = user.roles.map((r) => r.role);
156
- const hasInvocationRole = wfConfig.invocation_roles.some((r) => userRoles.includes(r));
157
- if (!hasInvocationRole) {
158
- // superadmin and admin/admin bypass role checks
159
- const hasGlobalAccess = user.roles.some((r) => r.type === 'superadmin')
160
- || user.roles.some((r) => r.role === 'admin' && r.type === 'admin');
161
- if (!hasGlobalAccess) {
162
- throw new InvocationError('Insufficient role for invocation', 403);
163
- }
156
+ // invocable is resolveTaskQueue's concern; this gate decides roles only.
157
+ if (!(0, invocation_access_1.canInvokeWorkflow)({ ...wfConfig, invocable: true }, user.roles, authRole)) {
158
+ throw new InvocationError('Insufficient role for invocation', 403);
164
159
  }
165
160
  }
166
161
  /**
@@ -19,3 +19,4 @@ export * from './x-lt-options';
19
19
  export * from './ctx-path';
20
20
  export * from './field-validator';
21
21
  export * from './validate-resolver-payload';
22
+ export * from './invoke-context';
@@ -35,3 +35,4 @@ __exportStar(require("./x-lt-options"), exports);
35
35
  __exportStar(require("./ctx-path"), exports);
36
36
  __exportStar(require("./field-validator"), exports);
37
37
  __exportStar(require("./validate-resolver-payload"), exports);
38
+ __exportStar(require("./invoke-context"), exports);
@@ -0,0 +1,7 @@
1
+ import type { ResolverValidationContext } from './validate-resolver-payload';
2
+ /**
3
+ * The context an invoke form validates and renders against. The pass itself
4
+ * supplies the live values under `input` and `resolver`; the envelope
5
+ * metadata is the only other domain an invoke form can reference.
6
+ */
7
+ export declare function buildInvokeFormContext(metadata: Record<string, unknown> | null | undefined): ResolverValidationContext;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildInvokeFormContext = buildInvokeFormContext;
4
+ /**
5
+ * The context an invoke form validates and renders against. The pass itself
6
+ * supplies the live values under `input` and `resolver`; the envelope
7
+ * metadata is the only other domain an invoke form can reference.
8
+ */
9
+ function buildInvokeFormContext(metadata) {
10
+ return { metadata: metadata ?? {} };
11
+ }
@@ -31,7 +31,7 @@ export type { FieldError } from './field-validator';
31
31
  * dynamic constraints against. `resolver` is supplied by the pass itself
32
32
  * (the flat form values under validation) — callers provide the rest.
33
33
  */
34
- export type ResolverValidationContext = Omit<ShowIfContext, 'resolver'>;
34
+ export type ResolverValidationContext = Omit<ShowIfContext, 'resolver' | 'input'>;
35
35
  /**
36
36
  * Validate FLAT form values against the form schema. This is the dashboard's
37
37
  * entry point (the values the user edits, keyed by field name).
@@ -44,6 +44,7 @@ function validateResolverForm(schema, formValues, ctx) {
44
44
  const liveCtx = {
45
45
  ...(ctx ?? {}),
46
46
  resolver: formValues,
47
+ input: formValues,
47
48
  };
48
49
  const errors = [];
49
50
  for (const [field, fieldSchema] of Object.entries(properties)) {
@@ -1,5 +1,5 @@
1
- /** The token domains a help template may reference. */
2
- export declare const HELP_DOMAINS: readonly ["escalation", "metadata", "envelope", "payload", "resolver", "lookup"];
1
+ /** The token domains a help template may reference. `input` is the invoke-form name for the live values `resolver` also carries. */
2
+ export declare const HELP_DOMAINS: readonly ["escalation", "metadata", "envelope", "payload", "resolver", "lookup", "input"];
3
3
  export type HelpDomain = (typeof HELP_DOMAINS)[number];
4
4
  export type HelpTokenContext = Partial<Record<HelpDomain, Record<string, unknown> | null>>;
5
5
  /** Replace every `{{domain.path}}` token with its value from the context. */