@hotmeshio/long-tail 0.16.2 → 0.17.0

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 (222) hide show
  1. package/build/api/exports.d.ts +15 -0
  2. package/build/api/exports.js +35 -0
  3. package/build/api/users.d.ts +31 -1
  4. package/build/api/users.js +54 -1
  5. package/build/bin/ltc.js +11 -0
  6. package/build/lib/cli/commands/users.d.ts +11 -0
  7. package/build/lib/cli/commands/users.js +59 -0
  8. package/build/lib/cli/commands/workflows.d.ts +3 -0
  9. package/build/lib/cli/commands/workflows.js +22 -0
  10. package/build/routes/exports.js +11 -0
  11. package/build/routes/users.js +26 -0
  12. package/build/sdk/index.d.ts +3 -0
  13. package/build/sdk/index.js +3 -0
  14. package/build/services/export/index.d.ts +19 -0
  15. package/build/services/export/index.js +53 -33
  16. package/build/services/user/crud.d.ts +32 -1
  17. package/build/services/user/crud.js +108 -0
  18. package/build/services/user/index.d.ts +2 -2
  19. package/build/services/user/index.js +5 -1
  20. package/build/services/user/sql.d.ts +16 -0
  21. package/build/services/user/sql.js +33 -1
  22. package/build/services/user/types.d.ts +11 -0
  23. package/build/shared/form-validation/field-validator.d.ts +8 -6
  24. package/build/shared/form-validation/field-validator.js +23 -15
  25. package/build/shared/form-validation/x-lt-options.js +35 -21
  26. package/build/system/mcp-servers/admin/exports.js +15 -0
  27. package/build/system/mcp-servers/admin/schemas.d.ts +37 -14
  28. package/build/system/mcp-servers/admin/schemas.js +12 -3
  29. package/build/system/mcp-servers/admin/users.js +26 -0
  30. package/build/system/seed/tool-manifests-admin.d.ts +445 -0
  31. package/build/system/seed/tool-manifests-admin.js +2 -0
  32. package/dashboard/dist/assets/{AdminDashboard-BrOvvDHF.js → AdminDashboard-Bx5G6Qb_.js} +2 -2
  33. package/dashboard/dist/assets/{AdminDashboard-BrOvvDHF.js.map → AdminDashboard-Bx5G6Qb_.js.map} +1 -1
  34. package/dashboard/dist/assets/{AgentConfigPage-CtVq8J0L.js → AgentConfigPage-S-YfPwCG.js} +2 -2
  35. package/dashboard/dist/assets/{AgentConfigPage-CtVq8J0L.js.map → AgentConfigPage-S-YfPwCG.js.map} +1 -1
  36. package/dashboard/dist/assets/{AgentDetailPage-DTfTQDug.js → AgentDetailPage-pFVqLY4c.js} +2 -2
  37. package/dashboard/dist/assets/{AgentDetailPage-DTfTQDug.js.map → AgentDetailPage-pFVqLY4c.js.map} +1 -1
  38. package/dashboard/dist/assets/{AgentsPage-vCTc3Qvj.js → AgentsPage-DjAluFkM.js} +2 -2
  39. package/dashboard/dist/assets/{AgentsPage-vCTc3Qvj.js.map → AgentsPage-DjAluFkM.js.map} +1 -1
  40. package/dashboard/dist/assets/{AvailableEscalationsPage-DJODShd7.js → AvailableEscalationsPage-BHsRZk4v.js} +2 -2
  41. package/dashboard/dist/assets/{AvailableEscalationsPage-DJODShd7.js.map → AvailableEscalationsPage-BHsRZk4v.js.map} +1 -1
  42. package/dashboard/dist/assets/{BotPicker-GU44inXA.js → BotPicker-h2YrxQS2.js} +2 -2
  43. package/dashboard/dist/assets/{BotPicker-GU44inXA.js.map → BotPicker-h2YrxQS2.js.map} +1 -1
  44. package/dashboard/dist/assets/{BulkAssignModal-ChqzG6FY.js → BulkAssignModal-CNKZBgK5.js} +2 -2
  45. package/dashboard/dist/assets/{BulkAssignModal-ChqzG6FY.js.map → BulkAssignModal-CNKZBgK5.js.map} +1 -1
  46. package/dashboard/dist/assets/{CapabilitiesPage-Y2hycdPY.js → CapabilitiesPage-DGsnIiJi.js} +2 -2
  47. package/dashboard/dist/assets/{CapabilitiesPage-Y2hycdPY.js.map → CapabilitiesPage-DGsnIiJi.js.map} +1 -1
  48. package/dashboard/dist/assets/{CollapsibleSection-CmCwt_Rs.js → CollapsibleSection-ptEsXSl6.js} +2 -2
  49. package/dashboard/dist/assets/{CollapsibleSection-CmCwt_Rs.js.map → CollapsibleSection-ptEsXSl6.js.map} +1 -1
  50. package/dashboard/dist/assets/{CountdownTimer-Bx2XXJOd.js → CountdownTimer-Cvif0QtN.js} +2 -2
  51. package/dashboard/dist/assets/{CountdownTimer-Bx2XXJOd.js.map → CountdownTimer-Cvif0QtN.js.map} +1 -1
  52. package/dashboard/dist/assets/{CredentialsPage-CoX_PNBe.js → CredentialsPage-CwKUAtAR.js} +2 -2
  53. package/dashboard/dist/assets/{CredentialsPage-CoX_PNBe.js.map → CredentialsPage-CwKUAtAR.js.map} +1 -1
  54. package/dashboard/dist/assets/{CronLabel-CVYKRipP.js → CronLabel-B9RbqMR-.js} +2 -2
  55. package/dashboard/dist/assets/{CronLabel-CVYKRipP.js.map → CronLabel-B9RbqMR-.js.map} +1 -1
  56. package/dashboard/dist/assets/{ElapsedCell-jRURiCRW.js → ElapsedCell-BirS3yZq.js} +2 -2
  57. package/dashboard/dist/assets/{ElapsedCell-jRURiCRW.js.map → ElapsedCell-BirS3yZq.js.map} +1 -1
  58. package/dashboard/dist/assets/{EntityTimelinePanel-G6nzvgpl.js → EntityTimelinePanel-D3QNqDiL.js} +2 -2
  59. package/dashboard/dist/assets/{EntityTimelinePanel-G6nzvgpl.js.map → EntityTimelinePanel-D3QNqDiL.js.map} +1 -1
  60. package/dashboard/dist/assets/{EscalationListSchemaPage-D-rVTQ1m.js → EscalationListSchemaPage-Bke-30FY.js} +2 -2
  61. package/dashboard/dist/assets/{EscalationListSchemaPage-D-rVTQ1m.js.map → EscalationListSchemaPage-Bke-30FY.js.map} +1 -1
  62. package/dashboard/dist/assets/{EscalationSchemaPage-CV0R_xY9.js → EscalationSchemaPage-CTFE9vko.js} +2 -2
  63. package/dashboard/dist/assets/{EscalationSchemaPage-CV0R_xY9.js.map → EscalationSchemaPage-CTFE9vko.js.map} +1 -1
  64. package/dashboard/dist/assets/{EscalationsOverview-DMdx15CQ.js → EscalationsOverview-C2FaSmXk.js} +2 -2
  65. package/dashboard/dist/assets/{EscalationsOverview-DMdx15CQ.js.map → EscalationsOverview-C2FaSmXk.js.map} +1 -1
  66. package/dashboard/dist/assets/{EventTable-CIvsdt-q.js → EventTable-zFqzbEdC.js} +2 -2
  67. package/dashboard/dist/assets/{EventTable-CIvsdt-q.js.map → EventTable-zFqzbEdC.js.map} +1 -1
  68. package/dashboard/dist/assets/{FilterBar-DWYGkVRH.js → FilterBar-fwUqeM-5.js} +2 -2
  69. package/dashboard/dist/assets/{FilterBar-DWYGkVRH.js.map → FilterBar-fwUqeM-5.js.map} +1 -1
  70. package/dashboard/dist/assets/{GraphInvokePage-BGHlXh4r.js → GraphInvokePage-CA_XYI2W.js} +2 -2
  71. package/dashboard/dist/assets/{GraphInvokePage-BGHlXh4r.js.map → GraphInvokePage-CA_XYI2W.js.map} +1 -1
  72. package/dashboard/dist/assets/{HomePage-BHOnp8SK.js → HomePage-C2HnqdFX.js} +2 -2
  73. package/dashboard/dist/assets/{HomePage-BHOnp8SK.js.map → HomePage-C2HnqdFX.js.map} +1 -1
  74. package/dashboard/dist/assets/{ListToolbar-iOgn_db5.js → ListToolbar-BEogxu1f.js} +2 -2
  75. package/dashboard/dist/assets/{ListToolbar-iOgn_db5.js.map → ListToolbar-BEogxu1f.js.map} +1 -1
  76. package/dashboard/dist/assets/{McpOverview-Be9sMKCA.js → McpOverview-CdMR-5qh.js} +2 -2
  77. package/dashboard/dist/assets/{McpOverview-Be9sMKCA.js.map → McpOverview-CdMR-5qh.js.map} +1 -1
  78. package/dashboard/dist/assets/{McpQueryDetailPage-BIgpmGJN.js → McpQueryDetailPage-BXo4UjJF.js} +2 -2
  79. package/dashboard/dist/assets/{McpQueryDetailPage-BIgpmGJN.js.map → McpQueryDetailPage-BXo4UjJF.js.map} +1 -1
  80. package/dashboard/dist/assets/{McpQueryPage-Okcxw_Um.js → McpQueryPage-BvvM0Ya1.js} +2 -2
  81. package/dashboard/dist/assets/{McpQueryPage-Okcxw_Um.js.map → McpQueryPage-BvvM0Ya1.js.map} +1 -1
  82. package/dashboard/dist/assets/{McpRunDetailPage-DT8kOfih.js → McpRunDetailPage-5eaJeupC.js} +2 -2
  83. package/dashboard/dist/assets/{McpRunDetailPage-DT8kOfih.js.map → McpRunDetailPage-5eaJeupC.js.map} +1 -1
  84. package/dashboard/dist/assets/{McpRunsPage-BXhoP77D.js → McpRunsPage-B5_-3NUF.js} +2 -2
  85. package/dashboard/dist/assets/{McpRunsPage-BXhoP77D.js.map → McpRunsPage-B5_-3NUF.js.map} +1 -1
  86. package/dashboard/dist/assets/{OperationsPage-rVhC8JPv.js → OperationsPage-CJXTw02Z.js} +2 -2
  87. package/dashboard/dist/assets/{OperationsPage-rVhC8JPv.js.map → OperationsPage-CJXTw02Z.js.map} +1 -1
  88. package/dashboard/dist/assets/{OperatorDashboard-CIt061hu.js → OperatorDashboard-Dx7639os.js} +2 -2
  89. package/dashboard/dist/assets/{OperatorDashboard-CIt061hu.js.map → OperatorDashboard-Dx7639os.js.map} +1 -1
  90. package/dashboard/dist/assets/{PersonaDetailPage-r46uNF4E.js → PersonaDetailPage-BHQ44UIu.js} +2 -2
  91. package/dashboard/dist/assets/{PersonaDetailPage-r46uNF4E.js.map → PersonaDetailPage-BHQ44UIu.js.map} +1 -1
  92. package/dashboard/dist/assets/{PersonasPage-CayYv9-j.js → PersonasPage-Cnmb4uox.js} +2 -2
  93. package/dashboard/dist/assets/{PersonasPage-CayYv9-j.js.map → PersonasPage-Cnmb4uox.js.map} +1 -1
  94. package/dashboard/dist/assets/{ProcessDetailPage-dn7lkM4c.js → ProcessDetailPage-CZ09xiWf.js} +2 -2
  95. package/dashboard/dist/assets/{ProcessDetailPage-dn7lkM4c.js.map → ProcessDetailPage-CZ09xiWf.js.map} +1 -1
  96. package/dashboard/dist/assets/{ProcessesListPage-DOp5J6Be.js → ProcessesListPage-BT76_7bW.js} +2 -2
  97. package/dashboard/dist/assets/{ProcessesListPage-DOp5J6Be.js.map → ProcessesListPage-BT76_7bW.js.map} +1 -1
  98. package/dashboard/dist/assets/{RoleDetailPage-DOlNoiAK.js → RoleDetailPage-CDsJKPvV.js} +2 -2
  99. package/dashboard/dist/assets/{RoleDetailPage-DOlNoiAK.js.map → RoleDetailPage-CDsJKPvV.js.map} +1 -1
  100. package/dashboard/dist/assets/{RolesPage-DPppT6Zl.js → RolesPage-D2cV92bL.js} +2 -2
  101. package/dashboard/dist/assets/{RolesPage-DPppT6Zl.js.map → RolesPage-D2cV92bL.js.map} +1 -1
  102. package/dashboard/dist/assets/{RunAsSelector-BgntKfSA.js → RunAsSelector-Cvi8x8xx.js} +2 -2
  103. package/dashboard/dist/assets/{RunAsSelector-BgntKfSA.js.map → RunAsSelector-Cvi8x8xx.js.map} +1 -1
  104. package/dashboard/dist/assets/{ScanCodesPage-DPm1lG79.js → ScanCodesPage-BWt_iRCu.js} +2 -2
  105. package/dashboard/dist/assets/{ScanCodesPage-DPm1lG79.js.map → ScanCodesPage-BWt_iRCu.js.map} +1 -1
  106. package/dashboard/dist/assets/{ScanSchemeDetailPage-CuoG89q1.js → ScanSchemeDetailPage-C6mRYkxL.js} +2 -2
  107. package/dashboard/dist/assets/{ScanSchemeDetailPage-CuoG89q1.js.map → ScanSchemeDetailPage-C6mRYkxL.js.map} +1 -1
  108. package/dashboard/dist/assets/{ScanStationPage-2SLXqqs0.js → ScanStationPage-YQiijAKy.js} +2 -2
  109. package/dashboard/dist/assets/{ScanStationPage-2SLXqqs0.js.map → ScanStationPage-YQiijAKy.js.map} +1 -1
  110. package/dashboard/dist/assets/{StickyPagination-Bc_Mzu_R.js → StickyPagination-BsbSade1.js} +2 -2
  111. package/dashboard/dist/assets/{StickyPagination-Bc_Mzu_R.js.map → StickyPagination-BsbSade1.js.map} +1 -1
  112. package/dashboard/dist/assets/{StreamMessageDetail-S1cnLGkf.js → StreamMessageDetail-jczXwuBw.js} +2 -2
  113. package/dashboard/dist/assets/{StreamMessageDetail-S1cnLGkf.js.map → StreamMessageDetail-jczXwuBw.js.map} +1 -1
  114. package/dashboard/dist/assets/{SwimlaneTimeline-BUu2sPmY.js → SwimlaneTimeline-DSO6QXmX.js} +2 -2
  115. package/dashboard/dist/assets/{SwimlaneTimeline-BUu2sPmY.js.map → SwimlaneTimeline-DSO6QXmX.js.map} +1 -1
  116. package/dashboard/dist/assets/{TaskDetailPage-BMfNNtbN.js → TaskDetailPage-DWLfcAF4.js} +2 -2
  117. package/dashboard/dist/assets/{TaskDetailPage-BMfNNtbN.js.map → TaskDetailPage-DWLfcAF4.js.map} +1 -1
  118. package/dashboard/dist/assets/{TasksListPage-BmNnopOU.js → TasksListPage-B0at3vJ3.js} +2 -2
  119. package/dashboard/dist/assets/{TasksListPage-BmNnopOU.js.map → TasksListPage-B0at3vJ3.js.map} +1 -1
  120. package/dashboard/dist/assets/{TimeAgo-Dip7gQQx.js → TimeAgo-poxwErGl.js} +2 -2
  121. package/dashboard/dist/assets/{TimeAgo-Dip7gQQx.js.map → TimeAgo-poxwErGl.js.map} +1 -1
  122. package/dashboard/dist/assets/{TimestampCell-DRAYnIrx.js → TimestampCell-Be6tvFQd.js} +2 -2
  123. package/dashboard/dist/assets/{TimestampCell-DRAYnIrx.js.map → TimestampCell-Be6tvFQd.js.map} +1 -1
  124. package/dashboard/dist/assets/{ToolTestPanel-CQVYC3Ba.js → ToolTestPanel-CYOqnqMz.js} +2 -2
  125. package/dashboard/dist/assets/{ToolTestPanel-CQVYC3Ba.js.map → ToolTestPanel-CYOqnqMz.js.map} +1 -1
  126. package/dashboard/dist/assets/{TopicDetailPage-Bmtwuksg.js → TopicDetailPage-C82WIKaU.js} +2 -2
  127. package/dashboard/dist/assets/{TopicDetailPage-Bmtwuksg.js.map → TopicDetailPage-C82WIKaU.js.map} +1 -1
  128. package/dashboard/dist/assets/{TopicsPage-DIgF7-mJ.js → TopicsPage-COH547ZD.js} +2 -2
  129. package/dashboard/dist/assets/{TopicsPage-DIgF7-mJ.js.map → TopicsPage-COH547ZD.js.map} +1 -1
  130. package/dashboard/dist/assets/{UserName-DNKFz7X9.js → UserName-D2SoVbe9.js} +2 -2
  131. package/dashboard/dist/assets/{UserName-DNKFz7X9.js.map → UserName-D2SoVbe9.js.map} +1 -1
  132. package/dashboard/dist/assets/{WorkflowExecutionPage-DraIBNpl.js → WorkflowExecutionPage-C82Q-TYC.js} +2 -2
  133. package/dashboard/dist/assets/{WorkflowExecutionPage-DraIBNpl.js.map → WorkflowExecutionPage-C82Q-TYC.js.map} +1 -1
  134. package/dashboard/dist/assets/{WorkflowsDashboard-BH7kmFjM.js → WorkflowsDashboard-DDWwCT-v.js} +2 -2
  135. package/dashboard/dist/assets/{WorkflowsDashboard-BH7kmFjM.js.map → WorkflowsDashboard-DDWwCT-v.js.map} +1 -1
  136. package/dashboard/dist/assets/{WorkflowsOverview-C98pCjQX.js → WorkflowsOverview-DdKRtWdK.js} +2 -2
  137. package/dashboard/dist/assets/{WorkflowsOverview-C98pCjQX.js.map → WorkflowsOverview-DdKRtWdK.js.map} +1 -1
  138. package/dashboard/dist/assets/{YamlWorkflowDetailPage-BWQjXenZ.js → YamlWorkflowDetailPage-D3qvyy_4.js} +2 -2
  139. package/dashboard/dist/assets/{YamlWorkflowDetailPage-BWQjXenZ.js.map → YamlWorkflowDetailPage-D3qvyy_4.js.map} +1 -1
  140. package/dashboard/dist/assets/{YamlWorkflowsPage-BGTI_sdP.js → YamlWorkflowsPage-BJsxZOBC.js} +2 -2
  141. package/dashboard/dist/assets/{YamlWorkflowsPage-BGTI_sdP.js.map → YamlWorkflowsPage-BJsxZOBC.js.map} +1 -1
  142. package/dashboard/dist/assets/{agents-DfMrlw54.js → agents-OQHCkIfJ.js} +2 -2
  143. package/dashboard/dist/assets/{agents-DfMrlw54.js.map → agents-OQHCkIfJ.js.map} +1 -1
  144. package/dashboard/dist/assets/{bots-B9zS0z7D.js → bots-e8jsNOf4.js} +2 -2
  145. package/dashboard/dist/assets/{bots-B9zS0z7D.js.map → bots-e8jsNOf4.js.map} +1 -1
  146. package/dashboard/dist/assets/{capabilities-DkLM1xgH.js → capabilities-CEo0AB79.js} +2 -2
  147. package/dashboard/dist/assets/{capabilities-DkLM1xgH.js.map → capabilities-CEo0AB79.js.map} +1 -1
  148. package/dashboard/dist/assets/{controlplane-SJK1yvbm.js → controlplane-CD6ti-QB.js} +2 -2
  149. package/dashboard/dist/assets/{controlplane-SJK1yvbm.js.map → controlplane-CD6ti-QB.js.map} +1 -1
  150. package/dashboard/dist/assets/{escalation-columns-BvAylNM1.js → escalation-columns-CUtDSbxl.js} +2 -2
  151. package/dashboard/dist/assets/{escalation-columns-BvAylNM1.js.map → escalation-columns-CUtDSbxl.js.map} +1 -1
  152. package/dashboard/dist/assets/{index-DSfY8oDp.js → index-B0C6wSrQ.js} +2 -2
  153. package/dashboard/dist/assets/{index-DSfY8oDp.js.map → index-B0C6wSrQ.js.map} +1 -1
  154. package/dashboard/dist/assets/index-B2aiEKtM.js +2 -0
  155. package/dashboard/dist/assets/index-B2aiEKtM.js.map +1 -0
  156. package/dashboard/dist/assets/{index-DKXOIcO3.js → index-B76fjEom.js} +2 -2
  157. package/dashboard/dist/assets/{index-DKXOIcO3.js.map → index-B76fjEom.js.map} +1 -1
  158. package/dashboard/dist/assets/{index-DvmyIGeZ.js → index-BYIN0l5M.js} +2 -2
  159. package/dashboard/dist/assets/{index-DvmyIGeZ.js.map → index-BYIN0l5M.js.map} +1 -1
  160. package/dashboard/dist/assets/{index-CXe2d5kg.js → index-Bf4IPu7I.js} +2 -2
  161. package/dashboard/dist/assets/{index-CXe2d5kg.js.map → index-Bf4IPu7I.js.map} +1 -1
  162. package/dashboard/dist/assets/index-BpwkKV5f.js +3 -0
  163. package/dashboard/dist/assets/index-BpwkKV5f.js.map +1 -0
  164. package/dashboard/dist/assets/{index-Cw-V0VhS.js → index-BsP7vujM.js} +2 -2
  165. package/dashboard/dist/assets/{index-Cw-V0VhS.js.map → index-BsP7vujM.js.map} +1 -1
  166. package/dashboard/dist/assets/{index-PjiXOVdw.js → index-C8VhbKFU.js} +2 -2
  167. package/dashboard/dist/assets/{index-PjiXOVdw.js.map → index-C8VhbKFU.js.map} +1 -1
  168. package/dashboard/dist/assets/{index-D2IRxjSf.js → index-COUj4v_W.js} +2 -2
  169. package/dashboard/dist/assets/{index-D2IRxjSf.js.map → index-COUj4v_W.js.map} +1 -1
  170. package/dashboard/dist/assets/{index-ClVNU3G3.js → index-CTZEzzN3.js} +2 -2
  171. package/dashboard/dist/assets/{index-ClVNU3G3.js.map → index-CTZEzzN3.js.map} +1 -1
  172. package/dashboard/dist/assets/{index-DazfFRUx.js → index-DIHr2CvI.js} +2 -2
  173. package/dashboard/dist/assets/{index-DazfFRUx.js.map → index-DIHr2CvI.js.map} +1 -1
  174. package/dashboard/dist/assets/{index-zrTQcPjB.js → index-DSdqso-_.js} +3 -3
  175. package/dashboard/dist/assets/{index-zrTQcPjB.js.map → index-DSdqso-_.js.map} +1 -1
  176. package/dashboard/dist/assets/{index-CLxuBb17.js → index-VsZyCFz8.js} +2 -2
  177. package/dashboard/dist/assets/{index-CLxuBb17.js.map → index-VsZyCFz8.js.map} +1 -1
  178. package/dashboard/dist/assets/{index-CJV2pWNH.css → index-fUqvRHOe.css} +1 -1
  179. package/dashboard/dist/assets/{knowledge-BNp6MH-4.js → knowledge-C89zT4Qe.js} +2 -2
  180. package/dashboard/dist/assets/{knowledge-BNp6MH-4.js.map → knowledge-C89zT4Qe.js.map} +1 -1
  181. package/dashboard/dist/assets/{mcp-Bb1k5rv-.js → mcp-BLKHykZS.js} +2 -2
  182. package/dashboard/dist/assets/{mcp-Bb1k5rv-.js.map → mcp-BLKHykZS.js.map} +1 -1
  183. package/dashboard/dist/assets/{mcp-query-QVakMQnS.js → mcp-query-CfiqUNDV.js} +2 -2
  184. package/dashboard/dist/assets/{mcp-query-QVakMQnS.js.map → mcp-query-CfiqUNDV.js.map} +1 -1
  185. package/dashboard/dist/assets/{personas-DV2JUjVj.js → personas-B1HzC94M.js} +2 -2
  186. package/dashboard/dist/assets/{personas-DV2JUjVj.js.map → personas-B1HzC94M.js.map} +1 -1
  187. package/dashboard/dist/assets/{pipelines-BkVB7Q0p.js → pipelines-C73X50ES.js} +2 -2
  188. package/dashboard/dist/assets/{pipelines-BkVB7Q0p.js.map → pipelines-C73X50ES.js.map} +1 -1
  189. package/dashboard/dist/assets/{tasks-DvYWcASM.js → tasks-DHbFpQk4.js} +2 -2
  190. package/dashboard/dist/assets/{tasks-DvYWcASM.js.map → tasks-DHbFpQk4.js.map} +1 -1
  191. package/dashboard/dist/assets/{topics-B9zXFuVG.js → topics-Fu8qCUOd.js} +2 -2
  192. package/dashboard/dist/assets/{topics-B9zXFuVG.js.map → topics-Fu8qCUOd.js.map} +1 -1
  193. package/dashboard/dist/assets/{useEventHooks-JDpifqGZ.js → useEventHooks-DL3Vhz4g.js} +2 -2
  194. package/dashboard/dist/assets/{useEventHooks-JDpifqGZ.js.map → useEventHooks-DL3Vhz4g.js.map} +1 -1
  195. package/dashboard/dist/assets/{useNamespace-Bqr-LdWx.js → useNamespace-CpO5Hogb.js} +2 -2
  196. package/dashboard/dist/assets/{useNamespace-Bqr-LdWx.js.map → useNamespace-CpO5Hogb.js.map} +1 -1
  197. package/dashboard/dist/assets/{useYamlActivityEvents-n3naCEbw.js → useYamlActivityEvents-BwIl6_d2.js} +2 -2
  198. package/dashboard/dist/assets/{useYamlActivityEvents-n3naCEbw.js.map → useYamlActivityEvents-BwIl6_d2.js.map} +1 -1
  199. package/dashboard/dist/assets/users-C0ke1Z-8.js +2 -0
  200. package/dashboard/dist/assets/users-C0ke1Z-8.js.map +1 -0
  201. package/dashboard/dist/assets/{workflows-D8uMBPvQ.js → workflows-DR9OQcuq.js} +2 -2
  202. package/dashboard/dist/assets/{workflows-D8uMBPvQ.js.map → workflows-DR9OQcuq.js.map} +1 -1
  203. package/dashboard/dist/assets/{yaml-workflows-DVDOQM3Y.js → yaml-workflows-DjEHh9Wy.js} +2 -2
  204. package/dashboard/dist/assets/{yaml-workflows-DVDOQM3Y.js.map → yaml-workflows-DjEHh9Wy.js.map} +1 -1
  205. package/dashboard/dist/index.html +2 -2
  206. package/docs/api/http/users.md +53 -1
  207. package/docs/api/http/workflows.md +35 -0
  208. package/docs/api/mcp/admin.md +31 -0
  209. package/docs/api/sdk/users.md +24 -0
  210. package/docs/api/sdk/workflows.md +21 -0
  211. package/docs/dashboard.md +1 -1
  212. package/docs/hitl/lookups.md +10 -0
  213. package/docs/hitl/x-lt-validation.md +2 -1
  214. package/docs/hitl/x-lt-widget.md +1 -1
  215. package/docs/hitl-guide.md +2 -2
  216. package/package.json +2 -2
  217. package/dashboard/dist/assets/index-DTZxHZJO.js +0 -3
  218. package/dashboard/dist/assets/index-DTZxHZJO.js.map +0 -1
  219. package/dashboard/dist/assets/index-DamcWcqG.js +0 -2
  220. package/dashboard/dist/assets/index-DamcWcqG.js.map +0 -1
  221. package/dashboard/dist/assets/users-BNXLRVTS.js +0 -2
  222. package/dashboard/dist/assets/users-BNXLRVTS.js.map +0 -1
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.UserPropertyValidationError = exports.UserPropertyConflictError = void 0;
6
7
  exports.attachRoles = attachRoles;
7
8
  exports.createUser = createUser;
8
9
  exports.getUser = getUser;
@@ -10,11 +11,15 @@ exports.getUserByExternalId = getUserByExternalId;
10
11
  exports.getUserByEmail = getUserByEmail;
11
12
  exports.getUserByMetadataValue = getUserByMetadataValue;
12
13
  exports.updateUser = updateUser;
14
+ exports.getIdentityPropertyKeys = getIdentityPropertyKeys;
15
+ exports.patchUserProperties = patchUserProperties;
13
16
  exports.deleteUser = deleteUser;
14
17
  exports.listUsers = listUsers;
15
18
  const bcryptjs_1 = __importDefault(require("bcryptjs"));
16
19
  const db_1 = require("../../lib/db");
17
20
  const sql_1 = require("./sql");
21
+ const scan_code_1 = require("../scan-code");
22
+ const scan_code_2 = require("../../types/scan-code");
18
23
  const scope_1 = require("./scope");
19
24
  // ─── Private helpers (exported for internal use by auth.ts) ──────────────────
20
25
  async function attachRoles(user) {
@@ -143,6 +148,109 @@ async function updateUser(id, input) {
143
148
  return null;
144
149
  return attachRoles(rows[0]);
145
150
  }
151
+ /** A property write that would create an ambiguous identity binding. */
152
+ class UserPropertyConflictError extends Error {
153
+ constructor(key) {
154
+ super(`"${key}" value is already bound to another active user`);
155
+ this.status = 409;
156
+ this.name = 'UserPropertyConflictError';
157
+ }
158
+ }
159
+ exports.UserPropertyConflictError = UserPropertyConflictError;
160
+ /** A malformed property patch — rejected before any write. */
161
+ class UserPropertyValidationError extends Error {
162
+ constructor(message) {
163
+ super(message);
164
+ this.status = 400;
165
+ this.name = 'UserPropertyValidationError';
166
+ }
167
+ }
168
+ exports.UserPropertyValidationError = UserPropertyValidationError;
169
+ /**
170
+ * The lt_users.metadata keys the platform itself resolves identities against:
171
+ * every enabled identity scan scheme's target_facet (e.g. badge_id). Writes
172
+ * to these keys carry a uniqueness guard; the dashboard marks them as system
173
+ * properties.
174
+ */
175
+ async function getIdentityPropertyKeys() {
176
+ const schemes = await (0, scan_code_1.listScanSchemes)();
177
+ return [...new Set(schemes
178
+ .filter((s) => s.enabled && s.kind === scan_code_2.SCAN_SCHEME_KINDS.IDENTITY)
179
+ .map((s) => s.target_facet))];
180
+ }
181
+ /**
182
+ * Atomic per-key patch of the user's properties dictionary (lt_users.metadata).
183
+ * One statement — never read-merge-write: concurrent patches of different
184
+ * keys both land, a rename never opens a key-absent window, and deleting is
185
+ * explicit (`remove`) — an absent key means keep. Precedence on collision:
186
+ * set > rename > existing. Values are raw JSON, so numbers/booleans/objects
187
+ * round-trip typed.
188
+ *
189
+ * Identity-binding keys (getIdentityPropertyKeys) additionally assert, in the
190
+ * same statement, that no OTHER active user carries the value — the
191
+ * write-side counterpart of getUserByMetadataValue's ambiguity throw.
192
+ * A tripped guard raises UserPropertyConflictError (409).
193
+ */
194
+ async function patchUserProperties(id, ops) {
195
+ const set = ops.set ?? {};
196
+ const remove = ops.remove ?? [];
197
+ const rename = ops.rename ?? {};
198
+ const setKeys = Object.keys(set);
199
+ const renameEntries = Object.entries(rename);
200
+ if (setKeys.length === 0 && remove.length === 0 && renameEntries.length === 0) {
201
+ throw new UserPropertyValidationError('A property patch requires at least one set, remove, or rename');
202
+ }
203
+ for (const key of [...setKeys, ...remove, ...renameEntries.flat()]) {
204
+ if (typeof key !== 'string' || key.trim().length === 0) {
205
+ throw new UserPropertyValidationError('Property keys must be non-empty strings');
206
+ }
207
+ }
208
+ for (const key of setKeys) {
209
+ if (remove.includes(key)) {
210
+ throw new UserPropertyValidationError(`"${key}" cannot be both set and removed in one patch`);
211
+ }
212
+ }
213
+ for (const [prev, next] of renameEntries) {
214
+ if (prev === next) {
215
+ throw new UserPropertyValidationError(`Renaming "${prev}" to itself is not a change`);
216
+ }
217
+ }
218
+ const renameTargets = renameEntries.map(([, next]) => next);
219
+ if (new Set(renameTargets).size !== renameTargets.length) {
220
+ throw new UserPropertyValidationError('Two properties cannot be renamed to the same key');
221
+ }
222
+ // Identity bindings resolve people — their values must be scalar and, for
223
+ // ACTIVE users, unique. The guard rides the same statement.
224
+ const identityKeys = await getIdentityPropertyKeys();
225
+ const guard = {};
226
+ for (const key of identityKeys) {
227
+ if (key in set) {
228
+ const value = set[key];
229
+ if (typeof value !== 'string' && typeof value !== 'number') {
230
+ throw new UserPropertyValidationError(`"${key}" is an identity binding — its value must be a string or number`);
231
+ }
232
+ guard[key] = String(value);
233
+ }
234
+ }
235
+ const removeAll = [...new Set([...remove, ...renameEntries.map(([prev]) => prev)])];
236
+ const renamePairs = renameEntries.map(([prev, next]) => ({ prev, next }));
237
+ const pool = (0, db_1.getPool)();
238
+ const { rows } = await pool.query(sql_1.PATCH_USER_PROPERTIES, [
239
+ id,
240
+ removeAll,
241
+ JSON.stringify(renamePairs),
242
+ JSON.stringify(set),
243
+ JSON.stringify(guard),
244
+ ]);
245
+ if (rows[0])
246
+ return attachRoles(rows[0]);
247
+ const exists = await pool.query(sql_1.VERIFY_USER_BY_ID, [id]);
248
+ if (!exists.rows[0])
249
+ return null;
250
+ // The user exists, so the identity guard is what blocked the write. Name
251
+ // the first guarded key for the caller; the row was not touched.
252
+ throw new UserPropertyConflictError(Object.keys(guard)[0] ?? 'identity binding');
253
+ }
146
254
  async function deleteUser(id) {
147
255
  const pool = (0, db_1.getPool)();
148
256
  const { rowCount } = await pool.query(sql_1.DELETE_USER_BY_ID, [id]);
@@ -1,5 +1,5 @@
1
- export { CreateUserInput, UpdateUserInput, VALID_ROLE_TYPES } from './types';
2
- export { createUser, getUser, getUserByExternalId, getUserByEmail, getUserByMetadataValue, updateUser, deleteUser, listUsers, } from './crud';
1
+ export { CreateUserInput, UpdateUserInput, UserPropertyOps, VALID_ROLE_TYPES } from './types';
2
+ export { createUser, getUser, getUserByExternalId, getUserByEmail, getUserByMetadataValue, updateUser, patchUserProperties, getIdentityPropertyKeys, UserPropertyConflictError, UserPropertyValidationError, deleteUser, listUsers, } from './crud';
3
3
  export { isValidRoleType, addUserRole, grantRoleIfAbsent, removeUserRole, getUserRoles, hasRole, hasRoleType, } from './roles';
4
4
  export { isSuperAdmin, isGroupAdmin, canManageRole, hasGlobalEscalationAccess, hasRolesAsAdmin, getRoleScope, getRoleWriteScope } from './rbac';
5
5
  export { READ_SCOPES, WRITE_SCOPES, DEFAULT_READ_SCOPE, DEFAULT_WRITE_SCOPE, isValidReadScope, isValidWriteScope, isValidScopePair, effectiveScope, } from './scope';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PREFERENCES_MAX_BYTES = exports.patchPreferences = exports.getPreferences = exports.seedAdmin = exports.verifyPassword = exports.effectiveScope = exports.isValidScopePair = exports.isValidWriteScope = exports.isValidReadScope = exports.DEFAULT_WRITE_SCOPE = exports.DEFAULT_READ_SCOPE = exports.WRITE_SCOPES = exports.READ_SCOPES = exports.getRoleWriteScope = exports.getRoleScope = exports.hasRolesAsAdmin = exports.hasGlobalEscalationAccess = exports.canManageRole = exports.isGroupAdmin = exports.isSuperAdmin = exports.hasRoleType = exports.hasRole = exports.getUserRoles = exports.removeUserRole = exports.grantRoleIfAbsent = exports.addUserRole = exports.isValidRoleType = exports.listUsers = exports.deleteUser = exports.updateUser = exports.getUserByMetadataValue = exports.getUserByEmail = exports.getUserByExternalId = exports.getUser = exports.createUser = exports.VALID_ROLE_TYPES = void 0;
3
+ exports.PREFERENCES_MAX_BYTES = exports.patchPreferences = exports.getPreferences = exports.seedAdmin = exports.verifyPassword = exports.effectiveScope = exports.isValidScopePair = exports.isValidWriteScope = exports.isValidReadScope = exports.DEFAULT_WRITE_SCOPE = exports.DEFAULT_READ_SCOPE = exports.WRITE_SCOPES = exports.READ_SCOPES = exports.getRoleWriteScope = exports.getRoleScope = exports.hasRolesAsAdmin = exports.hasGlobalEscalationAccess = exports.canManageRole = exports.isGroupAdmin = exports.isSuperAdmin = exports.hasRoleType = exports.hasRole = exports.getUserRoles = exports.removeUserRole = exports.grantRoleIfAbsent = exports.addUserRole = exports.isValidRoleType = exports.listUsers = exports.deleteUser = exports.UserPropertyValidationError = exports.UserPropertyConflictError = exports.getIdentityPropertyKeys = exports.patchUserProperties = exports.updateUser = exports.getUserByMetadataValue = exports.getUserByEmail = exports.getUserByExternalId = exports.getUser = exports.createUser = exports.VALID_ROLE_TYPES = void 0;
4
4
  var types_1 = require("./types");
5
5
  Object.defineProperty(exports, "VALID_ROLE_TYPES", { enumerable: true, get: function () { return types_1.VALID_ROLE_TYPES; } });
6
6
  var crud_1 = require("./crud");
@@ -10,6 +10,10 @@ Object.defineProperty(exports, "getUserByExternalId", { enumerable: true, get: f
10
10
  Object.defineProperty(exports, "getUserByEmail", { enumerable: true, get: function () { return crud_1.getUserByEmail; } });
11
11
  Object.defineProperty(exports, "getUserByMetadataValue", { enumerable: true, get: function () { return crud_1.getUserByMetadataValue; } });
12
12
  Object.defineProperty(exports, "updateUser", { enumerable: true, get: function () { return crud_1.updateUser; } });
13
+ Object.defineProperty(exports, "patchUserProperties", { enumerable: true, get: function () { return crud_1.patchUserProperties; } });
14
+ Object.defineProperty(exports, "getIdentityPropertyKeys", { enumerable: true, get: function () { return crud_1.getIdentityPropertyKeys; } });
15
+ Object.defineProperty(exports, "UserPropertyConflictError", { enumerable: true, get: function () { return crud_1.UserPropertyConflictError; } });
16
+ Object.defineProperty(exports, "UserPropertyValidationError", { enumerable: true, get: function () { return crud_1.UserPropertyValidationError; } });
13
17
  Object.defineProperty(exports, "deleteUser", { enumerable: true, get: function () { return crud_1.deleteUser; } });
14
18
  Object.defineProperty(exports, "listUsers", { enumerable: true, get: function () { return crud_1.listUsers; } });
15
19
  var roles_1 = require("./roles");
@@ -28,6 +28,22 @@ export declare const GET_USER_BY_ID = "SELECT * FROM lt_users WHERE id = $1";
28
28
  export declare const GET_USERS_BY_METADATA_VALUE = "SELECT * FROM lt_users WHERE metadata->>$1 = $2 AND status = 'active' LIMIT 2";
29
29
  /** Check if a user exists by id. Lightweight — returns only the id column. */
30
30
  export declare const VERIFY_USER_BY_ID = "SELECT id FROM lt_users WHERE id = $1 LIMIT 1";
31
+ /**
32
+ * Atomic per-key patch of the user's properties dictionary — ONE statement,
33
+ * never read-merge-write. Composition (later wins on key collision):
34
+ *
35
+ * base minus ($2: removed keys ∪ rename old-names)
36
+ * || renames ($3: [{prev,next}] — each carries the OLD value, skipped when
37
+ * the source key is absent)
38
+ * || sets ($4: typed JSON values)
39
+ *
40
+ * $5 is the identity-binding guard: {key: value} pairs that must not already
41
+ * belong to ANOTHER active user (the write-side counterpart of the
42
+ * resolver's ambiguity throw in GET_USERS_BY_METADATA_VALUE). Zero rows
43
+ * back means the user is missing OR the guard tripped — the caller
44
+ * distinguishes with VERIFY_USER_BY_ID.
45
+ */
46
+ export declare const PATCH_USER_PROPERTIES = "\n UPDATE lt_users SET metadata = (\n (COALESCE(metadata, '{}'::jsonb) - $2::text[])\n || COALESCE((\n SELECT jsonb_object_agg(r.next, COALESCE(lt_users.metadata, '{}'::jsonb) -> r.prev)\n FROM jsonb_to_recordset($3::jsonb) AS r(prev text, next text)\n WHERE COALESCE(lt_users.metadata, '{}'::jsonb) ? r.prev\n ), '{}'::jsonb)\n || $4::jsonb\n )\n WHERE id = $1\n AND NOT EXISTS (\n SELECT 1\n FROM lt_users u2, jsonb_each_text($5::jsonb) AS g(k, v)\n WHERE u2.id <> $1 AND u2.status = 'active' AND u2.metadata ->> g.k = g.v\n )\n RETURNING *";
31
47
  /** Fetch user + roles in a single query. Returns one row per role (or one row with nulls if no roles). */
32
48
  export declare const GET_USER_WITH_ROLES = "SELECT u.id, u.external_id, u.display_name, u.status, u.metadata,\n r.role, r.type AS role_type, r.read_scope, r.write_scope\n FROM lt_users u\n LEFT JOIN lt_user_roles r ON r.user_id = u.id\n WHERE u.external_id = $1\n ORDER BY r.created_at";
33
49
  export declare const DELETE_USER_BY_ID = "DELETE FROM lt_users WHERE id = $1";
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  // ─── Shared queries (used by multiple modules) ──────────────────────────────
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.IS_GROUP_ADMIN = exports.GET_ROLE_SCOPE = exports.HAS_ROLE_TYPE = exports.HAS_ROLE = exports.DELETE_USER_ROLE = exports.INSERT_USER_ROLE_IF_ABSENT = exports.UPSERT_USER_ROLE = exports.GET_ROLES_BY_USER_IDS = exports.DELETE_USER_BY_ID = exports.GET_USER_WITH_ROLES = exports.VERIFY_USER_BY_ID = exports.GET_USERS_BY_METADATA_VALUE = exports.GET_USER_BY_ID = exports.GET_USER_BY_EMAIL = exports.CREATE_USER_WITH_ROLES = exports.GET_USER_BY_EXTERNAL_ID = exports.GET_ROLES_BY_USER_ID = exports.ENSURE_ROLE_EXISTS = void 0;
4
+ exports.IS_GROUP_ADMIN = exports.GET_ROLE_SCOPE = exports.HAS_ROLE_TYPE = exports.HAS_ROLE = exports.DELETE_USER_ROLE = exports.INSERT_USER_ROLE_IF_ABSENT = exports.UPSERT_USER_ROLE = exports.GET_ROLES_BY_USER_IDS = exports.DELETE_USER_BY_ID = exports.GET_USER_WITH_ROLES = exports.PATCH_USER_PROPERTIES = exports.VERIFY_USER_BY_ID = exports.GET_USERS_BY_METADATA_VALUE = exports.GET_USER_BY_ID = exports.GET_USER_BY_EMAIL = exports.CREATE_USER_WITH_ROLES = exports.GET_USER_BY_EXTERNAL_ID = exports.GET_ROLES_BY_USER_ID = exports.ENSURE_ROLE_EXISTS = void 0;
5
5
  /** Ensure a role name exists in the lt_roles lookup table (FK target). */
6
6
  exports.ENSURE_ROLE_EXISTS = 'INSERT INTO lt_roles (role) VALUES ($1) ON CONFLICT DO NOTHING';
7
7
  /** Fetch roles for a single user, ordered by creation time. granted_by_persona
@@ -50,6 +50,38 @@ exports.GET_USER_BY_ID = 'SELECT * FROM lt_users WHERE id = $1';
50
50
  exports.GET_USERS_BY_METADATA_VALUE = `SELECT * FROM lt_users WHERE metadata->>$1 = $2 AND status = 'active' LIMIT 2`;
51
51
  /** Check if a user exists by id. Lightweight — returns only the id column. */
52
52
  exports.VERIFY_USER_BY_ID = 'SELECT id FROM lt_users WHERE id = $1 LIMIT 1';
53
+ /**
54
+ * Atomic per-key patch of the user's properties dictionary — ONE statement,
55
+ * never read-merge-write. Composition (later wins on key collision):
56
+ *
57
+ * base minus ($2: removed keys ∪ rename old-names)
58
+ * || renames ($3: [{prev,next}] — each carries the OLD value, skipped when
59
+ * the source key is absent)
60
+ * || sets ($4: typed JSON values)
61
+ *
62
+ * $5 is the identity-binding guard: {key: value} pairs that must not already
63
+ * belong to ANOTHER active user (the write-side counterpart of the
64
+ * resolver's ambiguity throw in GET_USERS_BY_METADATA_VALUE). Zero rows
65
+ * back means the user is missing OR the guard tripped — the caller
66
+ * distinguishes with VERIFY_USER_BY_ID.
67
+ */
68
+ exports.PATCH_USER_PROPERTIES = `
69
+ UPDATE lt_users SET metadata = (
70
+ (COALESCE(metadata, '{}'::jsonb) - $2::text[])
71
+ || COALESCE((
72
+ SELECT jsonb_object_agg(r.next, COALESCE(lt_users.metadata, '{}'::jsonb) -> r.prev)
73
+ FROM jsonb_to_recordset($3::jsonb) AS r(prev text, next text)
74
+ WHERE COALESCE(lt_users.metadata, '{}'::jsonb) ? r.prev
75
+ ), '{}'::jsonb)
76
+ || $4::jsonb
77
+ )
78
+ WHERE id = $1
79
+ AND NOT EXISTS (
80
+ SELECT 1
81
+ FROM lt_users u2, jsonb_each_text($5::jsonb) AS g(k, v)
82
+ WHERE u2.id <> $1 AND u2.status = 'active' AND u2.metadata ->> g.k = g.v
83
+ )
84
+ RETURNING *`;
53
85
  /** Fetch user + roles in a single query. Returns one row per role (or one row with nulls if no roles). */
54
86
  exports.GET_USER_WITH_ROLES = `SELECT u.id, u.external_id, u.display_name, u.status, u.metadata,
55
87
  r.role, r.type AS role_type, r.read_scope, r.write_scope
@@ -24,5 +24,16 @@ export interface UpdateUserInput {
24
24
  display_name?: string;
25
25
  password?: string;
26
26
  status?: LTUserStatus;
27
+ /** Wholesale REPLACE of the properties dictionary — for per-key edits use patchUserProperties. */
27
28
  metadata?: Record<string, any>;
28
29
  }
30
+ /**
31
+ * One atomic patch of the user's properties dictionary. Deleting is explicit
32
+ * (`remove`) — a key absent from the patch is kept. `rename` preserves the
33
+ * value. Precedence on collision: set > rename > existing.
34
+ */
35
+ export interface UserPropertyOps {
36
+ set?: Record<string, unknown>;
37
+ remove?: string[];
38
+ rename?: Record<string, string>;
39
+ }
@@ -8,13 +8,15 @@ interface ChecklistItem {
8
8
  required?: boolean;
9
9
  }
10
10
  /**
11
- * Resolve a checklist widget's item definitions from its `x-lt-source`
12
- * "domain.path" against the escalation context. Paths may embed
13
- * `{{domain.path}}` interpolation segments (cascading sources). Missing
14
- * domain/path, an unresolved segment, or a non-array value yields an empty
15
- * list.
11
+ * Resolve a checklist widget's item definitions from its `x-lt-source`
12
+ * a "domain.path" or an ORDERED array of paths — against the escalation
13
+ * context. With an array, the first entry that resolves to a non-empty item
14
+ * list wins, so lookup-backed and envelope-embedded rows render the same
15
+ * shared schema interchangeably. Paths may embed `{{domain.path}}`
16
+ * interpolation segments (cascading sources); an entry that cannot resolve
17
+ * falls through to the next. Nothing resolvable yields an empty list.
16
18
  */
17
- export declare function resolveChecklistItems(sourcePath: unknown, ctx: Record<string, unknown> | undefined): ChecklistItem[];
19
+ export declare function resolveChecklistItems(source: unknown, ctx: Record<string, unknown> | undefined): ChecklistItem[];
18
20
  export declare const X_LT_DEFAULT_CHECKED = "x-lt-default-checked";
19
21
  /**
20
22
  * The checklist's first-load default (`x-lt-default-checked`): every resolved
@@ -10,24 +10,32 @@ exports.validateField = validateField;
10
10
  const x_lt_options_1 = require("./x-lt-options");
11
11
  const ctx_path_1 = require("./ctx-path");
12
12
  /**
13
- * Resolve a checklist widget's item definitions from its `x-lt-source`
14
- * "domain.path" against the escalation context. Paths may embed
15
- * `{{domain.path}}` interpolation segments (cascading sources). Missing
16
- * domain/path, an unresolved segment, or a non-array value yields an empty
17
- * list.
13
+ * Resolve a checklist widget's item definitions from its `x-lt-source`
14
+ * a "domain.path" or an ORDERED array of paths — against the escalation
15
+ * context. With an array, the first entry that resolves to a non-empty item
16
+ * list wins, so lookup-backed and envelope-embedded rows render the same
17
+ * shared schema interchangeably. Paths may embed `{{domain.path}}`
18
+ * interpolation segments (cascading sources); an entry that cannot resolve
19
+ * falls through to the next. Nothing resolvable yields an empty list.
18
20
  */
19
- function resolveChecklistItems(sourcePath, ctx) {
20
- if (typeof sourcePath !== 'string' || !ctx)
21
+ function resolveChecklistItems(source, ctx) {
22
+ const paths = (typeof source === 'string' ? [source] : Array.isArray(source) ? source : [])
23
+ .filter((p) => typeof p === 'string' && p.length > 0);
24
+ if (paths.length === 0 || !ctx)
21
25
  return [];
22
- let concrete = sourcePath;
23
- if ((0, ctx_path_1.hasInterpolation)(sourcePath)) {
24
- const resolved = (0, ctx_path_1.interpolatePath)(sourcePath, ctx);
25
- if (resolved === null)
26
- return [];
27
- concrete = resolved;
26
+ for (const sourcePath of paths) {
27
+ let concrete = sourcePath;
28
+ if ((0, ctx_path_1.hasInterpolation)(sourcePath)) {
29
+ const resolved = (0, ctx_path_1.interpolatePath)(sourcePath, ctx);
30
+ if (resolved === null)
31
+ continue;
32
+ concrete = resolved;
33
+ }
34
+ const cur = (0, ctx_path_1.resolveCtxPath)(concrete, ctx);
35
+ if (Array.isArray(cur) && cur.length > 0)
36
+ return cur;
28
37
  }
29
- const cur = (0, ctx_path_1.resolveCtxPath)(concrete, ctx);
30
- return Array.isArray(cur) ? cur : [];
38
+ return [];
31
39
  }
32
40
  exports.X_LT_DEFAULT_CHECKED = 'x-lt-default-checked';
33
41
  /**
@@ -10,10 +10,18 @@ exports.resolveFieldOptions = resolveFieldOptions;
10
10
  * offer a different legal set per escalation (e.g. `[1..N]` where N rides the
11
11
  * envelope, or a versioned knowledge lookup under the `lookup` domain).
12
12
  *
13
- * x-lt-options "domain.path" — e.g. "envelope.left_quantity_options"
14
- * paths may embed {{domain.path}} interpolation segments —
13
+ * x-lt-options "domain.path" or an ORDERED array of paths — e.g.
14
+ * "envelope.left_quantity_options" or
15
+ * ["lookup.reasons.items", "envelope.reject_reason_items"].
16
+ * With an array, the first entry that resolves to options
17
+ * wins, so lookup-backed and envelope-embedded rows render
18
+ * the same shared schema interchangeably (a parked row
19
+ * falls through to the envelope it already carries).
20
+ * Paths may embed {{domain.path}} interpolation segments —
15
21
  * e.g. "lookup.geo.regions.{{resolver.country}}" — making
16
- * the option list follow another answer (cascading selects)
22
+ * the option list follow another answer (cascading selects);
23
+ * an entry whose interpolation cannot resolve falls through
24
+ * to the next entry.
17
25
  *
18
26
  * Object entries separate what the submitter SEES from what the payload
19
27
  * STORES: the select renders the label and emits the value (a DB-backed pick
@@ -62,24 +70,30 @@ function resolveFieldOptions(fieldSchema, ctx) {
62
70
  if (Array.isArray(staticEnum) && staticEnum.length > 0) {
63
71
  return staticEnum.map((v) => ({ value: v, label: String(v) }));
64
72
  }
65
- const sourcePath = fieldSchema[exports.X_LT_OPTIONS];
66
- if (typeof sourcePath !== 'string')
73
+ const token = fieldSchema[exports.X_LT_OPTIONS];
74
+ const paths = (typeof token === 'string' ? [token] : Array.isArray(token) ? token : [])
75
+ .filter((p) => typeof p === 'string' && p.length > 0);
76
+ if (paths.length === 0)
67
77
  return undefined;
68
- // Interpolated tokens are a standing contract: even unresolvable, the field
69
- // stays a (disabled) select and fails closed. Plain paths keep the legacy
70
- // undefined-on-miss reading.
71
- const dynamic = (0, ctx_path_1.hasInterpolation)(sourcePath);
72
- const miss = dynamic ? [] : undefined;
73
- let concrete = sourcePath;
74
- if (dynamic) {
75
- const resolved = (0, ctx_path_1.interpolatePath)(sourcePath, ctx);
76
- if (resolved === null)
77
- return miss;
78
- concrete = resolved;
78
+ // Interpolated entries are a standing contract: when nothing resolves, the
79
+ // field stays a (disabled) select and fails closed a cascade child never
80
+ // becomes free text. All-plain-path tokens keep the legacy undefined-on-miss
81
+ // reading (the field falls back to its typed plain input).
82
+ const miss = paths.some(ctx_path_1.hasInterpolation) ? [] : undefined;
83
+ for (const sourcePath of paths) {
84
+ let concrete = sourcePath;
85
+ if ((0, ctx_path_1.hasInterpolation)(sourcePath)) {
86
+ const resolved = (0, ctx_path_1.interpolatePath)(sourcePath, ctx);
87
+ if (resolved === null)
88
+ continue;
89
+ concrete = resolved;
90
+ }
91
+ const cur = (0, ctx_path_1.resolveCtxPath)(concrete, ctx);
92
+ if (!Array.isArray(cur))
93
+ continue;
94
+ const options = cur.map(toOption).filter((o) => o !== null);
95
+ if (options.length > 0)
96
+ return options;
79
97
  }
80
- const cur = (0, ctx_path_1.resolveCtxPath)(concrete, ctx);
81
- if (!Array.isArray(cur))
82
- return miss;
83
- const options = cur.map(toOption).filter((o) => o !== null);
84
- return options.length > 0 ? options : miss;
98
+ return miss;
85
99
  }
@@ -89,6 +89,21 @@ function registerExportTools(server) {
89
89
  }
90
90
  return { content: [{ type: 'text', text: JSON.stringify((0, pick_1.pickPaths)(result.data, args.select)) }] };
91
91
  });
92
+ // mirrors GET /api/workflow-states/:workflowId/envelopes
93
+ server.registerTool('get_workflow_envelopes', {
94
+ title: 'Get Workflow Envelopes',
95
+ description: 'The workflow\'s input and output envelopes — two narrow lookups, no event ' +
96
+ 'stream. Output is null with status running until the workflow completes; a ' +
97
+ 'failed run carries its error message. The token-cheap read when you only ' +
98
+ 'need what went in and what came out.',
99
+ inputSchema: schemas_1.getWorkflowEnvelopesSchema,
100
+ }, async (args) => {
101
+ const result = await api.getWorkflowEnvelopes({ workflowId: args.workflow_id });
102
+ if (result.error) {
103
+ return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
104
+ }
105
+ return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
106
+ });
92
107
  // mirrors GET /api/workflow-states/:workflowId/status
93
108
  server.registerTool('get_export_status', {
94
109
  title: 'Get Workflow Status',
@@ -555,6 +555,22 @@ export declare const removeUserRoleSchema: z.ZodObject<{
555
555
  role: string;
556
556
  user_id: string;
557
557
  }>;
558
+ export declare const patchUserPropertiesSchema: z.ZodObject<{
559
+ user_id: z.ZodString;
560
+ set: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
561
+ remove: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
562
+ rename: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
563
+ }, "strip", z.ZodTypeAny, {
564
+ user_id: string;
565
+ set?: Record<string, any> | undefined;
566
+ remove?: string[] | undefined;
567
+ rename?: Record<string, string> | undefined;
568
+ }, {
569
+ user_id: string;
570
+ set?: Record<string, any> | undefined;
571
+ remove?: string[] | undefined;
572
+ rename?: Record<string, string> | undefined;
573
+ }>;
558
574
  export declare const listRolesSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
559
575
  export declare const createRoleSchema: z.ZodObject<{
560
576
  role: z.ZodString;
@@ -1420,6 +1436,13 @@ export declare const getExportStatusSchema: z.ZodObject<{
1420
1436
  }, {
1421
1437
  workflow_id: string;
1422
1438
  }>;
1439
+ export declare const getWorkflowEnvelopesSchema: z.ZodObject<{
1440
+ workflow_id: z.ZodString;
1441
+ }, "strip", z.ZodTypeAny, {
1442
+ workflow_id: string;
1443
+ }, {
1444
+ workflow_id: string;
1445
+ }>;
1423
1446
  export declare const diagnoseJobSchema: z.ZodObject<{
1424
1447
  workflow_id: z.ZodString;
1425
1448
  app_id: z.ZodDefault<z.ZodOptional<z.ZodString>>;
@@ -1803,17 +1826,17 @@ export declare const aggregateByFacetsSchema: z.ZodObject<{
1803
1826
  to: string;
1804
1827
  }>;
1805
1828
  }, "strip", z.ZodTypeAny, {
1829
+ kind: "dwell";
1806
1830
  window: {
1807
1831
  from: string;
1808
1832
  to: string;
1809
1833
  };
1810
- kind: "dwell";
1811
1834
  }, {
1835
+ kind: "dwell";
1812
1836
  window: {
1813
1837
  from: string;
1814
1838
  to: string;
1815
1839
  };
1816
- kind: "dwell";
1817
1840
  }>]>;
1818
1841
  distinctBy: z.ZodOptional<z.ZodString>;
1819
1842
  states: z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -1894,11 +1917,11 @@ export declare const aggregateByFacetsSchema: z.ZodObject<{
1894
1917
  kind: "membership";
1895
1918
  asOf?: string | undefined;
1896
1919
  } | {
1920
+ kind: "dwell";
1897
1921
  window: {
1898
1922
  from: string;
1899
1923
  to: string;
1900
1924
  };
1901
- kind: "dwell";
1902
1925
  };
1903
1926
  limit?: number | undefined;
1904
1927
  offset?: number | undefined;
@@ -1943,11 +1966,11 @@ export declare const aggregateByFacetsSchema: z.ZodObject<{
1943
1966
  kind: "membership";
1944
1967
  asOf?: string | undefined;
1945
1968
  } | {
1969
+ kind: "dwell";
1946
1970
  window: {
1947
1971
  from: string;
1948
1972
  to: string;
1949
1973
  };
1950
- kind: "dwell";
1951
1974
  };
1952
1975
  limit?: number | undefined;
1953
1976
  offset?: number | undefined;
@@ -2174,9 +2197,9 @@ export declare const upsertScanSchemeSchema: z.ZodObject<{
2174
2197
  description?: string | undefined;
2175
2198
  enabled?: boolean | undefined;
2176
2199
  encoding?: "fixed" | "delimited" | undefined;
2177
- kind?: "action" | "identity" | undefined;
2178
2200
  delimiter?: string | undefined;
2179
2201
  target_length?: number | undefined;
2202
+ kind?: "action" | "identity" | undefined;
2180
2203
  grant_ttl_seconds?: number | undefined;
2181
2204
  grant_max_uses?: number | undefined;
2182
2205
  }, {
@@ -2186,9 +2209,9 @@ export declare const upsertScanSchemeSchema: z.ZodObject<{
2186
2209
  description?: string | undefined;
2187
2210
  enabled?: boolean | undefined;
2188
2211
  encoding?: "fixed" | "delimited" | undefined;
2189
- kind?: "action" | "identity" | undefined;
2190
2212
  delimiter?: string | undefined;
2191
2213
  target_length?: number | undefined;
2214
+ kind?: "action" | "identity" | undefined;
2192
2215
  grant_ttl_seconds?: number | undefined;
2193
2216
  grant_max_uses?: number | undefined;
2194
2217
  }>;
@@ -2408,21 +2431,21 @@ export declare const upsertScanRuleSchema: z.ZodObject<{
2408
2431
  markdown: z.ZodOptional<z.ZodString>;
2409
2432
  route: z.ZodOptional<z.ZodString>;
2410
2433
  }, "strip", z.ZodTypeAny, {
2411
- route?: string | undefined;
2412
2434
  markdown?: string | undefined;
2413
- }, {
2414
2435
  route?: string | undefined;
2436
+ }, {
2415
2437
  markdown?: string | undefined;
2438
+ route?: string | undefined;
2416
2439
  }>>;
2417
2440
  notPrimed: z.ZodOptional<z.ZodObject<{
2418
2441
  markdown: z.ZodOptional<z.ZodString>;
2419
2442
  route: z.ZodOptional<z.ZodString>;
2420
2443
  }, "strip", z.ZodTypeAny, {
2421
- route?: string | undefined;
2422
2444
  markdown?: string | undefined;
2423
- }, {
2424
2445
  route?: string | undefined;
2446
+ }, {
2425
2447
  markdown?: string | undefined;
2448
+ route?: string | undefined;
2426
2449
  }>>;
2427
2450
  enabled: z.ZodOptional<z.ZodBoolean>;
2428
2451
  }, "strip", z.ZodTypeAny, {
@@ -2473,12 +2496,12 @@ export declare const upsertScanRuleSchema: z.ZodObject<{
2473
2496
  }[];
2474
2497
  enabled?: boolean | undefined;
2475
2498
  fallback?: {
2476
- route?: string | undefined;
2477
2499
  markdown?: string | undefined;
2500
+ route?: string | undefined;
2478
2501
  } | undefined;
2479
2502
  notPrimed?: {
2480
- route?: string | undefined;
2481
2503
  markdown?: string | undefined;
2504
+ route?: string | undefined;
2482
2505
  } | undefined;
2483
2506
  }, {
2484
2507
  name: string;
@@ -2528,12 +2551,12 @@ export declare const upsertScanRuleSchema: z.ZodObject<{
2528
2551
  }[];
2529
2552
  enabled?: boolean | undefined;
2530
2553
  fallback?: {
2531
- route?: string | undefined;
2532
2554
  markdown?: string | undefined;
2555
+ route?: string | undefined;
2533
2556
  } | undefined;
2534
2557
  notPrimed?: {
2535
- route?: string | undefined;
2536
2558
  markdown?: string | undefined;
2559
+ route?: string | undefined;
2537
2560
  } | undefined;
2538
2561
  }>;
2539
2562
  export declare const deleteScanRuleSchema: z.ZodObject<{
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.assignPersonaSchema = exports.unlinkPersonaRoleSchema = exports.linkPersonaRoleSchema = exports.deletePersonaSchema = exports.updatePersonaSchema = exports.createPersonaSchema = exports.getPersonaSchema = exports.listPersonasSchema = exports.listRoleSchemaVersionsSchema = exports.getRoleSchemaSchema = exports.updateRoleSchema = exports.addEscalationChainSchema = exports.createRoleSchema = exports.listRolesSchema = exports.removeUserRoleSchema = exports.addUserRoleSchema = exports.createUserSchema = exports.listUsersSchema = exports.invokeYamlWorkflowSchema = exports.deployYamlWorkflowSchema = exports.createYamlWorkflowSchema = exports.getYamlWorkflowSchema = exports.listYamlWorkflowsSchema = exports.disconnectMcpServerSchema = exports.connectMcpServerSchema = exports.updateMcpServerSchema = exports.listMcpServersSchema = exports.getDomainContextSchema = exports.terminateWorkflowSchema = exports.getWorkflowStatusSchema = exports.invokeWorkflowSchema = exports.listDiscoveredWorkflowsSchema = exports.deleteWorkflowConfigSchema = exports.upsertWorkflowConfigSchema = exports.listWorkflowConfigsSchema = exports.bulkTriageSchema = exports.releaseExpiredClaimsSchema = exports.bulkCancelSchema = exports.cancelEscalationSchema = exports.escalateEscalationSchema = exports.resolveBySignalKeySchema = exports.resolveEscalationSchema = exports.releaseEscalationSchema = exports.claimEscalationSchema = exports.getEscalationStatsSchema = exports.getEscalationsByWorkflowSchema = exports.getEscalationSchema = exports.findEscalationsSchema = exports.getProcessDetailSchema = exports.findTasksSchema = void 0;
4
- exports.resolveByIdsSchema = exports.facetQuerySchema = exports.findOrphanedSignalsSchema = exports.findStalledJobsSchema = exports.diagnoseJobSchema = exports.getExportStatusSchema = exports.exportWorkflowExecutionSchema = exports.exportWorkflowStateSchema = exports.listExportJobsSchema = exports.getSettingsSchema = exports.updatePrioritySchema = exports.bulkEscalateSchema = exports.bulkUnassignSchema = exports.bulkAssignSchema = exports.bulkClaimSchema = exports.resolveByMetadataSchema = exports.claimByMetadataSchema = exports.findByMetadataSchema = exports.deleteTopicSchema = exports.updateTopicSchema = exports.createTopicSchema = exports.getTopicSchema = exports.listTopicsSchema = exports.interruptJobSchema = exports.getJobExecutionSchema = exports.listPipelineJobsSchema = exports.listPipelineEntitiesSchema = exports.listStreamMessagesSchema = exports.getStreamStatsSchema = exports.applyThrottleSchema = exports.rollCallSchema = exports.listAppsSchema = exports.revokeBotKeySchema = exports.createBotApiKeySchema = exports.deleteBotSchema = exports.updateBotSchema = exports.createBotSchema = exports.getBotSchema = exports.listBotsSchema = exports.deleteAgentSubscriptionSchema = exports.createAgentSubscriptionSchema = exports.listAgentSubscriptionsSchema = exports.deleteAgentSchema = exports.updateAgentSchema = exports.createAgentSchema = exports.getAgentSchema = exports.listAgentsSchema = exports.pruneSchema = exports.getUserPersonasSchema = exports.unassignPersonaSchema = void 0;
5
- exports.deleteScanRuleSchema = exports.upsertScanRuleSchema = exports.upsertScanSchemeSchema = exports.listScanSchemesSchema = exports.executeScanChoiceSchema = exports.executeScanCodeSchema = exports.timelineByFacetSchema = exports.aggregateByFacetsSchema = exports.claimByFacetsSchema = exports.claimGroupsSchema = exports.searchByFacetsSchema = void 0;
3
+ exports.unlinkPersonaRoleSchema = exports.linkPersonaRoleSchema = exports.deletePersonaSchema = exports.updatePersonaSchema = exports.createPersonaSchema = exports.getPersonaSchema = exports.listPersonasSchema = exports.listRoleSchemaVersionsSchema = exports.getRoleSchemaSchema = exports.updateRoleSchema = exports.addEscalationChainSchema = exports.createRoleSchema = exports.listRolesSchema = exports.patchUserPropertiesSchema = exports.removeUserRoleSchema = exports.addUserRoleSchema = exports.createUserSchema = exports.listUsersSchema = exports.invokeYamlWorkflowSchema = exports.deployYamlWorkflowSchema = exports.createYamlWorkflowSchema = exports.getYamlWorkflowSchema = exports.listYamlWorkflowsSchema = exports.disconnectMcpServerSchema = exports.connectMcpServerSchema = exports.updateMcpServerSchema = exports.listMcpServersSchema = exports.getDomainContextSchema = exports.terminateWorkflowSchema = exports.getWorkflowStatusSchema = exports.invokeWorkflowSchema = exports.listDiscoveredWorkflowsSchema = exports.deleteWorkflowConfigSchema = exports.upsertWorkflowConfigSchema = exports.listWorkflowConfigsSchema = exports.bulkTriageSchema = exports.releaseExpiredClaimsSchema = exports.bulkCancelSchema = exports.cancelEscalationSchema = exports.escalateEscalationSchema = exports.resolveBySignalKeySchema = exports.resolveEscalationSchema = exports.releaseEscalationSchema = exports.claimEscalationSchema = exports.getEscalationStatsSchema = exports.getEscalationsByWorkflowSchema = exports.getEscalationSchema = exports.findEscalationsSchema = exports.getProcessDetailSchema = exports.findTasksSchema = void 0;
4
+ exports.findOrphanedSignalsSchema = exports.findStalledJobsSchema = exports.diagnoseJobSchema = exports.getWorkflowEnvelopesSchema = exports.getExportStatusSchema = exports.exportWorkflowExecutionSchema = exports.exportWorkflowStateSchema = exports.listExportJobsSchema = exports.getSettingsSchema = exports.updatePrioritySchema = exports.bulkEscalateSchema = exports.bulkUnassignSchema = exports.bulkAssignSchema = exports.bulkClaimSchema = exports.resolveByMetadataSchema = exports.claimByMetadataSchema = exports.findByMetadataSchema = exports.deleteTopicSchema = exports.updateTopicSchema = exports.createTopicSchema = exports.getTopicSchema = exports.listTopicsSchema = exports.interruptJobSchema = exports.getJobExecutionSchema = exports.listPipelineJobsSchema = exports.listPipelineEntitiesSchema = exports.listStreamMessagesSchema = exports.getStreamStatsSchema = exports.applyThrottleSchema = exports.rollCallSchema = exports.listAppsSchema = exports.revokeBotKeySchema = exports.createBotApiKeySchema = exports.deleteBotSchema = exports.updateBotSchema = exports.createBotSchema = exports.getBotSchema = exports.listBotsSchema = exports.deleteAgentSubscriptionSchema = exports.createAgentSubscriptionSchema = exports.listAgentSubscriptionsSchema = exports.deleteAgentSchema = exports.updateAgentSchema = exports.createAgentSchema = exports.getAgentSchema = exports.listAgentsSchema = exports.pruneSchema = exports.getUserPersonasSchema = exports.unassignPersonaSchema = exports.assignPersonaSchema = void 0;
5
+ exports.deleteScanRuleSchema = exports.upsertScanRuleSchema = exports.upsertScanSchemeSchema = exports.listScanSchemesSchema = exports.executeScanChoiceSchema = exports.executeScanCodeSchema = exports.timelineByFacetSchema = exports.aggregateByFacetsSchema = exports.claimByFacetsSchema = exports.claimGroupsSchema = exports.searchByFacetsSchema = exports.resolveByIdsSchema = exports.facetQuerySchema = void 0;
6
6
  /**
7
7
  * Zod schemas for the admin MCP server tools.
8
8
  *
@@ -240,6 +240,12 @@ exports.removeUserRoleSchema = zod_1.z.object({
240
240
  user_id: zod_1.z.string().describe('User UUID'),
241
241
  role: zod_1.z.string().describe('Role to remove'),
242
242
  });
243
+ exports.patchUserPropertiesSchema = zod_1.z.object({
244
+ user_id: zod_1.z.string().describe('User UUID'),
245
+ set: zod_1.z.record(zod_1.z.any()).optional().describe('Properties to set — typed JSON values'),
246
+ remove: zod_1.z.array(zod_1.z.string()).optional().describe('Property keys to delete'),
247
+ rename: zod_1.z.record(zod_1.z.string()).optional().describe('{ oldKey: newKey } renames — values preserved'),
248
+ });
243
249
  // ── roles (routes/roles.ts) ─────────────────────────────────────────────────
244
250
  exports.listRolesSchema = zod_1.z.object({});
245
251
  exports.createRoleSchema = zod_1.z.object({
@@ -579,6 +585,9 @@ exports.exportWorkflowExecutionSchema = zod_1.z.object({
579
585
  exports.getExportStatusSchema = zod_1.z.object({
580
586
  workflow_id: zod_1.z.string().describe('Workflow ID to check export status'),
581
587
  });
588
+ exports.getWorkflowEnvelopesSchema = zod_1.z.object({
589
+ workflow_id: zod_1.z.string().describe('Workflow ID whose input/output envelopes to fetch'),
590
+ });
582
591
  // ── Diagnostics ───────────────────────────────────────────────────────────────
583
592
  exports.diagnoseJobSchema = zod_1.z.object({
584
593
  workflow_id: zod_1.z.string().describe('Workflow ID to diagnose'),