@hotmeshio/long-tail 0.7.1 → 0.7.3

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 (229) hide show
  1. package/build/api/escalations/create.js +30 -9
  2. package/build/api/roles.d.ts +32 -0
  3. package/build/api/roles.js +73 -0
  4. package/build/bin/ltc.js +23 -0
  5. package/build/lib/cli/commands/roles.d.ts +17 -0
  6. package/build/lib/cli/commands/roles.js +102 -0
  7. package/build/lib/db/schemas/017_role_schema_versions.sql +40 -0
  8. package/build/lib/db/schemas/018_role_upstreams.sql +21 -0
  9. package/build/routes/roles.js +20 -0
  10. package/build/scripts/ortho-populate.d.ts +80 -8
  11. package/build/scripts/ortho-populate.js +204 -52
  12. package/build/sdk/index.d.ts +2 -0
  13. package/build/sdk/index.js +2 -0
  14. package/build/services/orchestrator/condition.d.ts +25 -1
  15. package/build/services/orchestrator/condition.js +29 -1
  16. package/build/services/role/index.d.ts +15 -1
  17. package/build/services/role/index.js +45 -1
  18. package/build/services/role/sql.d.ts +23 -2
  19. package/build/services/role/sql.js +93 -16
  20. package/build/services/role/types.d.ts +41 -0
  21. package/build/system/mcp-servers/admin/index.js +3 -3
  22. package/build/system/mcp-servers/admin/schemas.d.ts +25 -2
  23. package/build/system/mcp-servers/admin/schemas.js +11 -2
  24. package/build/system/mcp-servers/admin/users.js +42 -0
  25. package/build/system/mcp-servers/human-queue-schemas.d.ts +6 -0
  26. package/build/system/mcp-servers/human-queue-schemas.js +4 -0
  27. package/build/system/mcp-servers/human-queue.js +10 -2
  28. package/build/system/seed/tool-manifests-admin.d.ts +371 -0
  29. package/build/system/seed/tool-manifests-admin.js +3 -1
  30. package/build/tsconfig.tsbuildinfo +1 -1
  31. package/build/types/escalation.d.ts +16 -0
  32. package/build/types/escalation.js +17 -0
  33. package/dashboard/dist/assets/{AdminDashboard-Bg1HgukI.js → AdminDashboard-C9eE1VEp.js} +2 -2
  34. package/dashboard/dist/assets/{AdminDashboard-Bg1HgukI.js.map → AdminDashboard-C9eE1VEp.js.map} +1 -1
  35. package/dashboard/dist/assets/{AgentConfigPage-HBe_YDU_.js → AgentConfigPage-Ba8QfXM2.js} +2 -2
  36. package/dashboard/dist/assets/{AgentConfigPage-HBe_YDU_.js.map → AgentConfigPage-Ba8QfXM2.js.map} +1 -1
  37. package/dashboard/dist/assets/{AgentDetailPage-BsaiYbwL.js → AgentDetailPage-DVmec0CP.js} +2 -2
  38. package/dashboard/dist/assets/{AgentDetailPage-BsaiYbwL.js.map → AgentDetailPage-DVmec0CP.js.map} +1 -1
  39. package/dashboard/dist/assets/{AgentsPage-DhN2lIBh.js → AgentsPage-DNiCYMh3.js} +2 -2
  40. package/dashboard/dist/assets/{AgentsPage-DhN2lIBh.js.map → AgentsPage-DNiCYMh3.js.map} +1 -1
  41. package/dashboard/dist/assets/{AvailableEscalationsPage-_xcWvlIz.js → AvailableEscalationsPage-gDIF8ocC.js} +2 -2
  42. package/dashboard/dist/assets/{AvailableEscalationsPage-_xcWvlIz.js.map → AvailableEscalationsPage-gDIF8ocC.js.map} +1 -1
  43. package/dashboard/dist/assets/{BotPicker-DY6iUVC9.js → BotPicker-3wBcBavT.js} +2 -2
  44. package/dashboard/dist/assets/{BotPicker-DY6iUVC9.js.map → BotPicker-3wBcBavT.js.map} +1 -1
  45. package/dashboard/dist/assets/{CapabilitiesPage-w1owqsmN.js → CapabilitiesPage-WoPkND2y.js} +2 -2
  46. package/dashboard/dist/assets/{CapabilitiesPage-w1owqsmN.js.map → CapabilitiesPage-WoPkND2y.js.map} +1 -1
  47. package/dashboard/dist/assets/{CollapsibleSection-DIMGjlJ-.js → CollapsibleSection-Cx99mqNN.js} +2 -2
  48. package/dashboard/dist/assets/{CollapsibleSection-DIMGjlJ-.js.map → CollapsibleSection-Cx99mqNN.js.map} +1 -1
  49. package/dashboard/dist/assets/{CredentialsPage-D1OmMHux.js → CredentialsPage-DbNaoPbF.js} +2 -2
  50. package/dashboard/dist/assets/{CredentialsPage-D1OmMHux.js.map → CredentialsPage-DbNaoPbF.js.map} +1 -1
  51. package/dashboard/dist/assets/{CronLabel-CQy3DrUQ.js → CronLabel-DLW4_Zg4.js} +2 -2
  52. package/dashboard/dist/assets/{CronLabel-CQy3DrUQ.js.map → CronLabel-DLW4_Zg4.js.map} +1 -1
  53. package/dashboard/dist/assets/{CustomDurationPicker-BoBkl9tw.js → CustomDurationPicker-BRUFjkiu.js} +2 -2
  54. package/dashboard/dist/assets/{CustomDurationPicker-BoBkl9tw.js.map → CustomDurationPicker-BRUFjkiu.js.map} +1 -1
  55. package/dashboard/dist/assets/{DropZone-QXbiuU0b.js → DropZone-DEX0BBqt.js} +2 -2
  56. package/dashboard/dist/assets/{DropZone-QXbiuU0b.js.map → DropZone-DEX0BBqt.js.map} +1 -1
  57. package/dashboard/dist/assets/{ElapsedCell-Donjm9gT.js → ElapsedCell-BtmDQaym.js} +2 -2
  58. package/dashboard/dist/assets/{ElapsedCell-Donjm9gT.js.map → ElapsedCell-BtmDQaym.js.map} +1 -1
  59. package/dashboard/dist/assets/EscalationSchemaPage-Bm4yBEGN.js +9 -0
  60. package/dashboard/dist/assets/EscalationSchemaPage-Bm4yBEGN.js.map +1 -0
  61. package/dashboard/dist/assets/{EscalationsOverview-CvHIJ_GG.js → EscalationsOverview-B3xZwTQA.js} +2 -2
  62. package/dashboard/dist/assets/{EscalationsOverview-CvHIJ_GG.js.map → EscalationsOverview-B3xZwTQA.js.map} +1 -1
  63. package/dashboard/dist/assets/{EventTable-DpAXMmT3.js → EventTable-Bh9FKXLI.js} +2 -2
  64. package/dashboard/dist/assets/{EventTable-DpAXMmT3.js.map → EventTable-Bh9FKXLI.js.map} +1 -1
  65. package/dashboard/dist/assets/{GraphInvokePage-De1XVx5d.js → GraphInvokePage-ov_ANlaE.js} +2 -2
  66. package/dashboard/dist/assets/{GraphInvokePage-De1XVx5d.js.map → GraphInvokePage-ov_ANlaE.js.map} +1 -1
  67. package/dashboard/dist/assets/{HomePage-BYR5VXXw.js → HomePage-D0DV6izb.js} +2 -2
  68. package/dashboard/dist/assets/{HomePage-BYR5VXXw.js.map → HomePage-D0DV6izb.js.map} +1 -1
  69. package/dashboard/dist/assets/{ListToolbar-Bx7jGzPA.js → ListToolbar-FpcvqNkN.js} +2 -2
  70. package/dashboard/dist/assets/{ListToolbar-Bx7jGzPA.js.map → ListToolbar-FpcvqNkN.js.map} +1 -1
  71. package/dashboard/dist/assets/{McpOverview-DXRKcJN0.js → McpOverview-DcuRiAff.js} +2 -2
  72. package/dashboard/dist/assets/{McpOverview-DXRKcJN0.js.map → McpOverview-DcuRiAff.js.map} +1 -1
  73. package/dashboard/dist/assets/{McpQueryDetailPage-CmW15w5e.js → McpQueryDetailPage-BcYl67KP.js} +2 -2
  74. package/dashboard/dist/assets/{McpQueryDetailPage-CmW15w5e.js.map → McpQueryDetailPage-BcYl67KP.js.map} +1 -1
  75. package/dashboard/dist/assets/{McpQueryPage-BE6I011z.js → McpQueryPage-C3GDzqZM.js} +2 -2
  76. package/dashboard/dist/assets/{McpQueryPage-BE6I011z.js.map → McpQueryPage-C3GDzqZM.js.map} +1 -1
  77. package/dashboard/dist/assets/{McpRunDetailPage-Dsa3G3XQ.js → McpRunDetailPage-SzOyhDBW.js} +2 -2
  78. package/dashboard/dist/assets/{McpRunDetailPage-Dsa3G3XQ.js.map → McpRunDetailPage-SzOyhDBW.js.map} +1 -1
  79. package/dashboard/dist/assets/{McpRunsPage-uTbym66Y.js → McpRunsPage-BwgB6mRV.js} +2 -2
  80. package/dashboard/dist/assets/{McpRunsPage-uTbym66Y.js.map → McpRunsPage-BwgB6mRV.js.map} +1 -1
  81. package/dashboard/dist/assets/{NamespacePill-BGf0jHwE.js → NamespacePill-CwKdoyRM.js} +2 -2
  82. package/dashboard/dist/assets/{NamespacePill-BGf0jHwE.js.map → NamespacePill-CwKdoyRM.js.map} +1 -1
  83. package/dashboard/dist/assets/OperationsPage-BCr21p8I.js +2 -0
  84. package/dashboard/dist/assets/OperationsPage-BCr21p8I.js.map +1 -0
  85. package/dashboard/dist/assets/{OperatorDashboard-i8cxaDlk.js → OperatorDashboard-DSXh-yYw.js} +2 -2
  86. package/dashboard/dist/assets/{OperatorDashboard-i8cxaDlk.js.map → OperatorDashboard-DSXh-yYw.js.map} +1 -1
  87. package/dashboard/dist/assets/{PageHeader-BZJsEVOC.js → PageHeader-BhaWTWcM.js} +2 -2
  88. package/dashboard/dist/assets/{PageHeader-BZJsEVOC.js.map → PageHeader-BhaWTWcM.js.map} +1 -1
  89. package/dashboard/dist/assets/{PageHeaderWithStats-BWuD7s9c.js → PageHeaderWithStats-yex5WmHB.js} +2 -2
  90. package/dashboard/dist/assets/{PageHeaderWithStats-BWuD7s9c.js.map → PageHeaderWithStats-yex5WmHB.js.map} +1 -1
  91. package/dashboard/dist/assets/{ProcessDetailPage-CP7GZhgs.js → ProcessDetailPage-iIB1rwEt.js} +2 -2
  92. package/dashboard/dist/assets/{ProcessDetailPage-CP7GZhgs.js.map → ProcessDetailPage-iIB1rwEt.js.map} +1 -1
  93. package/dashboard/dist/assets/{ProcessesListPage-btsU6hBR.js → ProcessesListPage-BrqWR2zr.js} +2 -2
  94. package/dashboard/dist/assets/{ProcessesListPage-btsU6hBR.js.map → ProcessesListPage-BrqWR2zr.js.map} +1 -1
  95. package/dashboard/dist/assets/RoleDetailPage-DS37tJhq.js +11 -0
  96. package/dashboard/dist/assets/RoleDetailPage-DS37tJhq.js.map +1 -0
  97. package/dashboard/dist/assets/{RolePill-Pb9TKSQN.js → RolePill-Cl71eDUA.js} +2 -2
  98. package/dashboard/dist/assets/{RolePill-Pb9TKSQN.js.map → RolePill-Cl71eDUA.js.map} +1 -1
  99. package/dashboard/dist/assets/{RolesPage-1DBoEMsb.js → RolesPage-Bzp9FhAl.js} +2 -2
  100. package/dashboard/dist/assets/{RolesPage-1DBoEMsb.js.map → RolesPage-Bzp9FhAl.js.map} +1 -1
  101. package/dashboard/dist/assets/{RunAsSelector-Cp6j3FEY.js → RunAsSelector-DXbHRxQs.js} +2 -2
  102. package/dashboard/dist/assets/{RunAsSelector-Cp6j3FEY.js.map → RunAsSelector-DXbHRxQs.js.map} +1 -1
  103. package/dashboard/dist/assets/{StickyPagination-Pr8kawv8.js → StickyPagination-D8XuMSWD.js} +2 -2
  104. package/dashboard/dist/assets/{StickyPagination-Pr8kawv8.js.map → StickyPagination-D8XuMSWD.js.map} +1 -1
  105. package/dashboard/dist/assets/{StreamMessageDetail-BqmQ-N3y.js → StreamMessageDetail-D5v95pmz.js} +2 -2
  106. package/dashboard/dist/assets/{StreamMessageDetail-BqmQ-N3y.js.map → StreamMessageDetail-D5v95pmz.js.map} +1 -1
  107. package/dashboard/dist/assets/{SwimlaneTimeline-y1YmXrsj.js → SwimlaneTimeline-CUEf2R5R.js} +2 -2
  108. package/dashboard/dist/assets/{SwimlaneTimeline-y1YmXrsj.js.map → SwimlaneTimeline-CUEf2R5R.js.map} +1 -1
  109. package/dashboard/dist/assets/{TagInput-Df4myuYF.js → TagInput-B_WQiuer.js} +2 -2
  110. package/dashboard/dist/assets/{TagInput-Df4myuYF.js.map → TagInput-B_WQiuer.js.map} +1 -1
  111. package/dashboard/dist/assets/{TaskDetailPage-CT5rXHK5.js → TaskDetailPage-BJvKNwEe.js} +2 -2
  112. package/dashboard/dist/assets/{TaskDetailPage-CT5rXHK5.js.map → TaskDetailPage-BJvKNwEe.js.map} +1 -1
  113. package/dashboard/dist/assets/{TaskQueuePill-YalYdCNo.js → TaskQueuePill-Lgn2obNU.js} +2 -2
  114. package/dashboard/dist/assets/{TaskQueuePill-YalYdCNo.js.map → TaskQueuePill-Lgn2obNU.js.map} +1 -1
  115. package/dashboard/dist/assets/{TasksListPage-DOy6JlKS.js → TasksListPage-CM7BWh_h.js} +2 -2
  116. package/dashboard/dist/assets/{TasksListPage-DOy6JlKS.js.map → TasksListPage-CM7BWh_h.js.map} +1 -1
  117. package/dashboard/dist/assets/{TimeAgo-BAQwZSpq.js → TimeAgo-D1K7xKq5.js} +2 -2
  118. package/dashboard/dist/assets/{TimeAgo-BAQwZSpq.js.map → TimeAgo-D1K7xKq5.js.map} +1 -1
  119. package/dashboard/dist/assets/{TimestampCell-BK_jufns.js → TimestampCell-7G0echgP.js} +2 -2
  120. package/dashboard/dist/assets/{TimestampCell-BK_jufns.js.map → TimestampCell-7G0echgP.js.map} +1 -1
  121. package/dashboard/dist/assets/{ToolPill-VGpT6Quy.js → ToolPill-uVqcbHPE.js} +2 -2
  122. package/dashboard/dist/assets/{ToolPill-VGpT6Quy.js.map → ToolPill-uVqcbHPE.js.map} +1 -1
  123. package/dashboard/dist/assets/{ToolTestPanel-5PMQyUCe.js → ToolTestPanel-LxuJvURK.js} +2 -2
  124. package/dashboard/dist/assets/{ToolTestPanel-5PMQyUCe.js.map → ToolTestPanel-LxuJvURK.js.map} +1 -1
  125. package/dashboard/dist/assets/{TopicDetailPage-Cn1ShfR8.js → TopicDetailPage-JvAX6rrR.js} +2 -2
  126. package/dashboard/dist/assets/{TopicDetailPage-Cn1ShfR8.js.map → TopicDetailPage-JvAX6rrR.js.map} +1 -1
  127. package/dashboard/dist/assets/{TopicsPage-D67tjS8L.js → TopicsPage-tFT2AcTz.js} +2 -2
  128. package/dashboard/dist/assets/{TopicsPage-D67tjS8L.js.map → TopicsPage-tFT2AcTz.js.map} +1 -1
  129. package/dashboard/dist/assets/{UserName-Dsu1Jk4N.js → UserName-Djz0nmaZ.js} +2 -2
  130. package/dashboard/dist/assets/{UserName-Dsu1Jk4N.js.map → UserName-Djz0nmaZ.js.map} +1 -1
  131. package/dashboard/dist/assets/{WorkflowExecutionPage-BwQoOmUE.js → WorkflowExecutionPage-f53hilbI.js} +2 -2
  132. package/dashboard/dist/assets/{WorkflowExecutionPage-BwQoOmUE.js.map → WorkflowExecutionPage-f53hilbI.js.map} +1 -1
  133. package/dashboard/dist/assets/{WorkflowPill-pPUqmx6Q.js → WorkflowPill-IDjTRfQ8.js} +2 -2
  134. package/dashboard/dist/assets/{WorkflowPill-pPUqmx6Q.js.map → WorkflowPill-IDjTRfQ8.js.map} +1 -1
  135. package/dashboard/dist/assets/{WorkflowsDashboard-D3z7COgH.js → WorkflowsDashboard-DM9Xe665.js} +2 -2
  136. package/dashboard/dist/assets/{WorkflowsDashboard-D3z7COgH.js.map → WorkflowsDashboard-DM9Xe665.js.map} +1 -1
  137. package/dashboard/dist/assets/{WorkflowsOverview-C15JcxyY.js → WorkflowsOverview-CUGSrx9N.js} +2 -2
  138. package/dashboard/dist/assets/{WorkflowsOverview-C15JcxyY.js.map → WorkflowsOverview-CUGSrx9N.js.map} +1 -1
  139. package/dashboard/dist/assets/{YamlWorkflowDetailPage-BYq3t7E-.js → YamlWorkflowDetailPage-B1_yqxAw.js} +2 -2
  140. package/dashboard/dist/assets/{YamlWorkflowDetailPage-BYq3t7E-.js.map → YamlWorkflowDetailPage-B1_yqxAw.js.map} +1 -1
  141. package/dashboard/dist/assets/{YamlWorkflowsPage-B44WgwE_.js → YamlWorkflowsPage-NtGvqiu7.js} +2 -2
  142. package/dashboard/dist/assets/{YamlWorkflowsPage-B44WgwE_.js.map → YamlWorkflowsPage-NtGvqiu7.js.map} +1 -1
  143. package/dashboard/dist/assets/{agents-BRmmK6Y9.js → agents-tML6AjDj.js} +2 -2
  144. package/dashboard/dist/assets/{agents-BRmmK6Y9.js.map → agents-tML6AjDj.js.map} +1 -1
  145. package/dashboard/dist/assets/{bots-BD75mzGG.js → bots-Cb0WTwhY.js} +2 -2
  146. package/dashboard/dist/assets/{bots-BD75mzGG.js.map → bots-Cb0WTwhY.js.map} +1 -1
  147. package/dashboard/dist/assets/{capabilities-DDgC_Kds.js → capabilities-BGZogsi_.js} +2 -2
  148. package/dashboard/dist/assets/{capabilities-DDgC_Kds.js.map → capabilities-BGZogsi_.js.map} +1 -1
  149. package/dashboard/dist/assets/{controlplane-BJh12lMv.js → controlplane-B7VJTlZD.js} +2 -2
  150. package/dashboard/dist/assets/{controlplane-BJh12lMv.js.map → controlplane-B7VJTlZD.js.map} +1 -1
  151. package/dashboard/dist/assets/{escalation-DIJt2sgn.js → escalation-Bl-SQV_u.js} +2 -2
  152. package/dashboard/dist/assets/{escalation-DIJt2sgn.js.map → escalation-Bl-SQV_u.js.map} +1 -1
  153. package/dashboard/dist/assets/{escalation-columns-zl6E94Up.js → escalation-columns-BlJOswRx.js} +2 -2
  154. package/dashboard/dist/assets/{escalation-columns-zl6E94Up.js.map → escalation-columns-BlJOswRx.js.map} +1 -1
  155. package/dashboard/dist/assets/{index-BhznDv-4.js → index--WeZDfeN.js} +2 -2
  156. package/dashboard/dist/assets/{index-BhznDv-4.js.map → index--WeZDfeN.js.map} +1 -1
  157. package/dashboard/dist/assets/{index-DU7YumVJ.js → index-0o71lRuY.js} +2 -2
  158. package/dashboard/dist/assets/{index-DU7YumVJ.js.map → index-0o71lRuY.js.map} +1 -1
  159. package/dashboard/dist/assets/{index-CV4lEd4I.js → index-3A_5CL81.js} +2 -2
  160. package/dashboard/dist/assets/{index-CV4lEd4I.js.map → index-3A_5CL81.js.map} +1 -1
  161. package/dashboard/dist/assets/{index-DVVIeBBk.js → index-BorpZbZA.js} +2 -2
  162. package/dashboard/dist/assets/{index-DVVIeBBk.js.map → index-BorpZbZA.js.map} +1 -1
  163. package/dashboard/dist/assets/{index-CknKy4RA.js → index-CBv3UxF2.js} +2 -2
  164. package/dashboard/dist/assets/{index-CknKy4RA.js.map → index-CBv3UxF2.js.map} +1 -1
  165. package/dashboard/dist/assets/{index-BUbzfEA9.js → index-D0-8byNu.js} +2 -2
  166. package/dashboard/dist/assets/{index-BUbzfEA9.js.map → index-D0-8byNu.js.map} +1 -1
  167. package/dashboard/dist/assets/{index-j-C7g_Ej.js → index-DcbEIXit.js} +2 -2
  168. package/dashboard/dist/assets/{index-j-C7g_Ej.js.map → index-DcbEIXit.js.map} +1 -1
  169. package/dashboard/dist/assets/{index-DrUkTcn-.js → index-DfDfJivY.js} +2 -2
  170. package/dashboard/dist/assets/{index-DrUkTcn-.js.map → index-DfDfJivY.js.map} +1 -1
  171. package/dashboard/dist/assets/{index-CtDf8vvQ.js → index-Dgw1KKpq.js} +9 -9
  172. package/dashboard/dist/assets/index-Dgw1KKpq.js.map +1 -0
  173. package/dashboard/dist/assets/index-Il_g7kw5.js +6 -0
  174. package/dashboard/dist/assets/{index-DccCwyZl.js.map → index-Il_g7kw5.js.map} +1 -1
  175. package/dashboard/dist/assets/{index-B0kmiSmt.js → index-SCrD3l-K.js} +2 -2
  176. package/dashboard/dist/assets/{index-B0kmiSmt.js.map → index-SCrD3l-K.js.map} +1 -1
  177. package/dashboard/dist/assets/{index-CDPBXB4e.js → index-TiKh2Ctj.js} +2 -2
  178. package/dashboard/dist/assets/{index-CDPBXB4e.js.map → index-TiKh2Ctj.js.map} +1 -1
  179. package/dashboard/dist/assets/index-Wny0bRgq.css +1 -0
  180. package/dashboard/dist/assets/{index-CpgV4Kkp.js → index-e97M6GoI.js} +2 -2
  181. package/dashboard/dist/assets/{index-CpgV4Kkp.js.map → index-e97M6GoI.js.map} +1 -1
  182. package/dashboard/dist/assets/{knowledge-pNDWACXB.js → knowledge-CDzw4E6q.js} +2 -2
  183. package/dashboard/dist/assets/{knowledge-pNDWACXB.js.map → knowledge-CDzw4E6q.js.map} +1 -1
  184. package/dashboard/dist/assets/{mcp-xddLBwUW.js → mcp-D_-NQtnG.js} +2 -2
  185. package/dashboard/dist/assets/{mcp-xddLBwUW.js.map → mcp-D_-NQtnG.js.map} +1 -1
  186. package/dashboard/dist/assets/{mcp-query-CmNjvxTG.js → mcp-query-BqZXdf9A.js} +2 -2
  187. package/dashboard/dist/assets/{mcp-query-CmNjvxTG.js.map → mcp-query-BqZXdf9A.js.map} +1 -1
  188. package/dashboard/dist/assets/{pipelines-B05sd2nB.js → pipelines-CNLhgj8b.js} +2 -2
  189. package/dashboard/dist/assets/{pipelines-B05sd2nB.js.map → pipelines-CNLhgj8b.js.map} +1 -1
  190. package/dashboard/dist/assets/roles-CFD2eYap.js +2 -0
  191. package/dashboard/dist/assets/roles-CFD2eYap.js.map +1 -0
  192. package/dashboard/dist/assets/{tasks-Bm1OKrJA.js → tasks-DcSvF636.js} +2 -2
  193. package/dashboard/dist/assets/{tasks-Bm1OKrJA.js.map → tasks-DcSvF636.js.map} +1 -1
  194. package/dashboard/dist/assets/{topics-BVIqtmd4.js → topics-DI8TFSZv.js} +2 -2
  195. package/dashboard/dist/assets/{topics-BVIqtmd4.js.map → topics-DI8TFSZv.js.map} +1 -1
  196. package/dashboard/dist/assets/{useEventHooks-_qCzU74s.js → useEventHooks-DcIgMDh3.js} +2 -2
  197. package/dashboard/dist/assets/{useEventHooks-_qCzU74s.js.map → useEventHooks-DcIgMDh3.js.map} +1 -1
  198. package/dashboard/dist/assets/{useNamespace-CDnCSFpG.js → useNamespace-C88ZxGoX.js} +2 -2
  199. package/dashboard/dist/assets/{useNamespace-CDnCSFpG.js.map → useNamespace-C88ZxGoX.js.map} +1 -1
  200. package/dashboard/dist/assets/{useYamlActivityEvents-zrHMhaFM.js → useYamlActivityEvents-D2-yVjJ7.js} +2 -2
  201. package/dashboard/dist/assets/{useYamlActivityEvents-zrHMhaFM.js.map → useYamlActivityEvents-D2-yVjJ7.js.map} +1 -1
  202. package/dashboard/dist/assets/{users-BPBMZg27.js → users-C0WV36X8.js} +2 -2
  203. package/dashboard/dist/assets/{users-BPBMZg27.js.map → users-C0WV36X8.js.map} +1 -1
  204. package/dashboard/dist/assets/{vendor-icons-C1zVP_dv.js → vendor-icons-CEWCGPeJ.js} +76 -76
  205. package/dashboard/dist/assets/vendor-icons-CEWCGPeJ.js.map +1 -0
  206. package/dashboard/dist/assets/{workflows-CT6nTL1I.js → workflows-CkPv7xk-.js} +2 -2
  207. package/dashboard/dist/assets/{workflows-CT6nTL1I.js.map → workflows-CkPv7xk-.js.map} +1 -1
  208. package/dashboard/dist/assets/{yaml-workflows-CdfjkOKU.js → yaml-workflows-BjrMQLTK.js} +2 -2
  209. package/dashboard/dist/assets/{yaml-workflows-CdfjkOKU.js.map → yaml-workflows-BjrMQLTK.js.map} +1 -1
  210. package/dashboard/dist/index.html +3 -3
  211. package/docs/api/http/roles.md +62 -0
  212. package/docs/api/mcp/admin.md +32 -1
  213. package/docs/api/mcp/human-queue.md +2 -0
  214. package/docs/api/sdk/roles.md +39 -0
  215. package/docs/cli.md +13 -0
  216. package/docs/dashboard.md +66 -17
  217. package/docs/data.md +34 -0
  218. package/docs/hitl-guide.md +25 -3
  219. package/package.json +2 -2
  220. package/dashboard/dist/assets/OperationsPage-CAmiFHI6.js +0 -2
  221. package/dashboard/dist/assets/OperationsPage-CAmiFHI6.js.map +0 -1
  222. package/dashboard/dist/assets/RoleDetailPage-BB_e330f.js +0 -16
  223. package/dashboard/dist/assets/RoleDetailPage-BB_e330f.js.map +0 -1
  224. package/dashboard/dist/assets/index-BRtKQtQZ.css +0 -1
  225. package/dashboard/dist/assets/index-CtDf8vvQ.js.map +0 -1
  226. package/dashboard/dist/assets/index-DccCwyZl.js +0 -6
  227. package/dashboard/dist/assets/roles-bRgaMcdy.js +0 -2
  228. package/dashboard/dist/assets/roles-bRgaMcdy.js.map +0 -1
  229. package/dashboard/dist/assets/vendor-icons-C1zVP_dv.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{a as p,j as a}from"./vendor-query-B2UbickB.js";import{a as N}from"./vendor-react-CXumBFUA.js";import{u as P,a as T,b as F,S as C,c as M,d as O,e as $}from"./StreamMessageDetail-BqmQ-N3y.js";import{u as z}from"./useFilterParams-x-Dg0Vgz.js";import{u as A}from"./useNamespace-CDnCSFpG.js";import{b as D}from"./api-path-u2Jf9QXS.js";import{D as R}from"./DataTable-ZWgVQg7F.js";import{S as E}from"./StickyPagination-Pr8kawv8.js";import{F as L,b as u,a as b}from"./FilterBar-BQ2JGg8U.js";import{T as x}from"./TimestampCell-BK_jufns.js";import{P as U}from"./PageHeader-BZJsEVOC.js";import{L as I}from"./ListToolbar-Bx7jGzPA.js";import{X as f}from"./vendor-icons-C1zVP_dv.js";import"./index-CtDf8vvQ.js";import"./controlplane-BJh12lMv.js";import"./EmptyState-BcsfPq9T.js";function B(o,i){if(o.length<=i)return o;const s=Math.floor((i-1)/2);return`${o.slice(0,s)}…${o.slice(-s)}`}function oe(){const{namespace:o,available:i}=A("namespace"),{filters:s,setFilter:t,pagination:r,sort:n,setSort:_}=z({filters:{namespace:"",source:"worker",status:"",stream_name:"",msg_type:"",topic:"",workflow_name:"",jid:"",aid:""}}),[m,y]=p.useState(null),h=p.useMemo(()=>i.map(e=>({value:e,label:e})),[i]),{data:l,isLoading:j,refetch:v,isFetching:k}=P({namespace:s.namespace||o,source:s.source||"worker",limit:r.pageSize,offset:r.offset,sort_by:n.sort_by||"created_at",order:n.order||"desc",status:s.status||void 0,stream_name:s.stream_name||void 0,msg_type:s.msg_type||void 0,topic:s.topic||void 0,workflow_name:s.workflow_name||void 0,jid:s.jid||void 0,aid:s.aid||void 0}),d=(l==null?void 0:l.messages)??[],g=(l==null?void 0:l.total)??0,c=p.useMemo(()=>m?d.find(e=>e.id===m.id&&e.source===m.source)??m:null,[d,m]),S=!!c,w=[{key:"status",label:"Status",render:e=>a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:`w-2 h-2 rounded-full shrink-0 ${M[e.status]}`}),a.jsx("span",{className:"text-xs",children:O[e.status]})]}),className:"w-28"},{key:"source",label:"Source",render:e=>a.jsx("span",{className:$,children:e.source}),className:"w-20"},{key:"stream_name",label:"Stream",sortable:!0,render:e=>a.jsx("span",{className:"font-mono text-xs text-text-secondary truncate block max-w-[240px]",title:e.stream_name,children:e.stream_name})},{key:"msg_type",label:"Type",render:e=>a.jsx("span",{className:"text-xs text-text-secondary",children:e.msg_type||"—"}),className:"w-24"},{key:"created_at",label:"Created",sortable:!0,render:e=>a.jsx(x,{date:e.created_at}),className:"w-44"},{key:"reserved_at",label:"Reserved",render:e=>e.reserved_at?a.jsx(x,{date:e.reserved_at}):a.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-44"},{key:"expired_at",label:"Processed",render:e=>e.expired_at?a.jsx(x,{date:e.expired_at}):a.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-44"},{key:"priority",label:"Pri",sortable:!0,render:e=>a.jsx("span",{className:"text-xs text-text-secondary",children:e.priority}),className:"w-12 text-right"},{key:"retry_attempt",label:"Retries",render:e=>a.jsxs("span",{className:"text-xs text-text-secondary",children:[e.retry_attempt,"/",e.max_retry_attempts]}),className:"w-16"}];return a.jsxs("div",{children:[a.jsx(U,{title:"Messages",docsHash:"#docs:dashboard.md:messages"}),a.jsxs(L,{actions:a.jsx(I,{onRefresh:()=>v(),isFetching:k,apiPath:D("/controlplane/stream-messages",{namespace:s.namespace||o,source:s.source||"worker",limit:r.pageSize,offset:r.offset,sort_by:n.sort_by||"created_at",order:n.order||"desc",status:s.status||void 0,stream_name:s.stream_name||void 0,msg_type:s.msg_type||void 0,topic:s.topic||void 0,workflow_name:s.workflow_name||void 0,jid:s.jid||void 0,aid:s.aid||void 0})}),children:[a.jsx(u,{label:"Namespace",value:s.namespace,onChange:e=>t("namespace",e),options:h,required:!0}),a.jsx(u,{label:"Source",value:s.source,onChange:e=>t("source",e),options:T,required:!0}),a.jsx(u,{label:"Status",value:s.status,onChange:e=>t("status",e),options:F}),a.jsx(b,{label:"Stream",value:s.stream_name,onChange:e=>t("stream_name",e),placeholder:"Filter by stream name…"}),a.jsx(b,{label:"Job ID",value:s.jid,onChange:e=>t("jid",e),placeholder:"Filter by jid…"}),[{key:"topic",label:"Topic",value:s.topic},{key:"workflow_name",label:"Workflow",value:s.workflow_name},{key:"aid",label:"Activity",value:s.aid},{key:"msg_type",label:"Type",value:s.msg_type}].filter(e=>e.value).map(e=>a.jsxs("button",{onClick:()=>t(e.key,""),className:"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] font-mono rounded-full bg-accent/15 text-accent hover:bg-accent/25 transition-colors",title:`Clear ${e.label} filter: ${e.value}`,children:[e.label,": ",B(e.value,12),a.jsx(f,{className:"w-2.5 h-2.5"})]},e.key))]}),a.jsx(R,{columns:w,data:d,keyFn:e=>`${e.source}:${e.id}`,isLoading:j,emptyMessage:"No stream messages found",onRowClick:e=>y(e),activeRowKey:c?`${c.source}:${c.id}`:null,sort:n,onSort:_}),a.jsx(E,{page:r.page,totalPages:r.totalPages(g),onPageChange:r.setPage,total:g,pageSize:r.pageSize,onPageSizeChange:r.setPageSize}),S&&N.createPortal(a.jsxs("div",{className:"fixed right-0 bottom-0 w-[400px] z-40 border-l border-surface-border bg-surface overflow-y-auto shadow-lg",style:{top:"3.5rem"},children:[a.jsxs("div",{className:"sticky top-0 z-10 flex items-center justify-between px-4 py-3 bg-surface border-b border-surface-border/50",children:[a.jsx("span",{className:"text-xs font-medium text-text-primary",children:"Message Detail"}),a.jsx("button",{onClick:()=>y(null),className:"p-1 rounded hover:bg-surface-hover text-text-tertiary hover:text-text-primary transition-colors",title:"Close",children:a.jsx(f,{className:"w-4 h-4"})})]}),a.jsx("div",{className:"px-4 py-4",children:a.jsx(C,{message:c,filters:{onFilterStatus:e=>t("status",e),onFilterStreamName:e=>t("stream_name",e),onFilterMsgType:e=>t("msg_type",e),onFilterTopic:e=>t("topic",e),onFilterWorkflow:e=>t("workflow_name",e),onFilterJid:e=>t("jid",e),onFilterAid:e=>t("aid",e)}})})]}),document.body)]})}export{oe as StreamMessagesPage};
2
- //# sourceMappingURL=index-B0kmiSmt.js.map
1
+ import{a as p,j as a}from"./vendor-query-B2UbickB.js";import{a as N}from"./vendor-react-CXumBFUA.js";import{u as P,a as T,b as F,S as C,c as M,d as O,e as $}from"./StreamMessageDetail-D5v95pmz.js";import{u as z}from"./useFilterParams-x-Dg0Vgz.js";import{u as A}from"./useNamespace-C88ZxGoX.js";import{b as D}from"./api-path-u2Jf9QXS.js";import{D as R}from"./DataTable-ZWgVQg7F.js";import{S as E}from"./StickyPagination-D8XuMSWD.js";import{F as L,b as u,a as b}from"./FilterBar-BQ2JGg8U.js";import{T as x}from"./TimestampCell-7G0echgP.js";import{P as U}from"./PageHeader-BhaWTWcM.js";import{L as I}from"./ListToolbar-FpcvqNkN.js";import{X as f}from"./vendor-icons-CEWCGPeJ.js";import"./index-Dgw1KKpq.js";import"./controlplane-B7VJTlZD.js";import"./EmptyState-BcsfPq9T.js";function B(o,i){if(o.length<=i)return o;const s=Math.floor((i-1)/2);return`${o.slice(0,s)}…${o.slice(-s)}`}function oe(){const{namespace:o,available:i}=A("namespace"),{filters:s,setFilter:t,pagination:r,sort:n,setSort:_}=z({filters:{namespace:"",source:"worker",status:"",stream_name:"",msg_type:"",topic:"",workflow_name:"",jid:"",aid:""}}),[m,y]=p.useState(null),h=p.useMemo(()=>i.map(e=>({value:e,label:e})),[i]),{data:l,isLoading:j,refetch:v,isFetching:k}=P({namespace:s.namespace||o,source:s.source||"worker",limit:r.pageSize,offset:r.offset,sort_by:n.sort_by||"created_at",order:n.order||"desc",status:s.status||void 0,stream_name:s.stream_name||void 0,msg_type:s.msg_type||void 0,topic:s.topic||void 0,workflow_name:s.workflow_name||void 0,jid:s.jid||void 0,aid:s.aid||void 0}),d=(l==null?void 0:l.messages)??[],g=(l==null?void 0:l.total)??0,c=p.useMemo(()=>m?d.find(e=>e.id===m.id&&e.source===m.source)??m:null,[d,m]),S=!!c,w=[{key:"status",label:"Status",render:e=>a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:`w-2 h-2 rounded-full shrink-0 ${M[e.status]}`}),a.jsx("span",{className:"text-xs",children:O[e.status]})]}),className:"w-28"},{key:"source",label:"Source",render:e=>a.jsx("span",{className:$,children:e.source}),className:"w-20"},{key:"stream_name",label:"Stream",sortable:!0,render:e=>a.jsx("span",{className:"font-mono text-xs text-text-secondary truncate block max-w-[240px]",title:e.stream_name,children:e.stream_name})},{key:"msg_type",label:"Type",render:e=>a.jsx("span",{className:"text-xs text-text-secondary",children:e.msg_type||"—"}),className:"w-24"},{key:"created_at",label:"Created",sortable:!0,render:e=>a.jsx(x,{date:e.created_at}),className:"w-44"},{key:"reserved_at",label:"Reserved",render:e=>e.reserved_at?a.jsx(x,{date:e.reserved_at}):a.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-44"},{key:"expired_at",label:"Processed",render:e=>e.expired_at?a.jsx(x,{date:e.expired_at}):a.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-44"},{key:"priority",label:"Pri",sortable:!0,render:e=>a.jsx("span",{className:"text-xs text-text-secondary",children:e.priority}),className:"w-12 text-right"},{key:"retry_attempt",label:"Retries",render:e=>a.jsxs("span",{className:"text-xs text-text-secondary",children:[e.retry_attempt,"/",e.max_retry_attempts]}),className:"w-16"}];return a.jsxs("div",{children:[a.jsx(U,{title:"Messages",docsHash:"#docs:dashboard.md:messages"}),a.jsxs(L,{actions:a.jsx(I,{onRefresh:()=>v(),isFetching:k,apiPath:D("/controlplane/stream-messages",{namespace:s.namespace||o,source:s.source||"worker",limit:r.pageSize,offset:r.offset,sort_by:n.sort_by||"created_at",order:n.order||"desc",status:s.status||void 0,stream_name:s.stream_name||void 0,msg_type:s.msg_type||void 0,topic:s.topic||void 0,workflow_name:s.workflow_name||void 0,jid:s.jid||void 0,aid:s.aid||void 0})}),children:[a.jsx(u,{label:"Namespace",value:s.namespace,onChange:e=>t("namespace",e),options:h,required:!0}),a.jsx(u,{label:"Source",value:s.source,onChange:e=>t("source",e),options:T,required:!0}),a.jsx(u,{label:"Status",value:s.status,onChange:e=>t("status",e),options:F}),a.jsx(b,{label:"Stream",value:s.stream_name,onChange:e=>t("stream_name",e),placeholder:"Filter by stream name…"}),a.jsx(b,{label:"Job ID",value:s.jid,onChange:e=>t("jid",e),placeholder:"Filter by jid…"}),[{key:"topic",label:"Topic",value:s.topic},{key:"workflow_name",label:"Workflow",value:s.workflow_name},{key:"aid",label:"Activity",value:s.aid},{key:"msg_type",label:"Type",value:s.msg_type}].filter(e=>e.value).map(e=>a.jsxs("button",{onClick:()=>t(e.key,""),className:"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] font-mono rounded-full bg-accent/15 text-accent hover:bg-accent/25 transition-colors",title:`Clear ${e.label} filter: ${e.value}`,children:[e.label,": ",B(e.value,12),a.jsx(f,{className:"w-2.5 h-2.5"})]},e.key))]}),a.jsx(R,{columns:w,data:d,keyFn:e=>`${e.source}:${e.id}`,isLoading:j,emptyMessage:"No stream messages found",onRowClick:e=>y(e),activeRowKey:c?`${c.source}:${c.id}`:null,sort:n,onSort:_}),a.jsx(E,{page:r.page,totalPages:r.totalPages(g),onPageChange:r.setPage,total:g,pageSize:r.pageSize,onPageSizeChange:r.setPageSize}),S&&N.createPortal(a.jsxs("div",{className:"fixed right-0 bottom-0 w-[400px] z-40 border-l border-surface-border bg-surface overflow-y-auto shadow-lg",style:{top:"3.5rem"},children:[a.jsxs("div",{className:"sticky top-0 z-10 flex items-center justify-between px-4 py-3 bg-surface border-b border-surface-border/50",children:[a.jsx("span",{className:"text-xs font-medium text-text-primary",children:"Message Detail"}),a.jsx("button",{onClick:()=>y(null),className:"p-1 rounded hover:bg-surface-hover text-text-tertiary hover:text-text-primary transition-colors",title:"Close",children:a.jsx(f,{className:"w-4 h-4"})})]}),a.jsx("div",{className:"px-4 py-4",children:a.jsx(C,{message:c,filters:{onFilterStatus:e=>t("status",e),onFilterStreamName:e=>t("stream_name",e),onFilterMsgType:e=>t("msg_type",e),onFilterTopic:e=>t("topic",e),onFilterWorkflow:e=>t("workflow_name",e),onFilterJid:e=>t("jid",e),onFilterAid:e=>t("aid",e)}})})]}),document.body)]})}export{oe as StreamMessagesPage};
2
+ //# sourceMappingURL=index-SCrD3l-K.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-B0kmiSmt.js","sources":["../../src/pages/admin/streams/StreamMessagesPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from 'lucide-react';\nimport { useStreamMessages, type StreamMessage } from '../../../api/stream-messages';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { useNamespace } from '../../../hooks/useNamespace';\nimport { buildApiPath } from '../../../lib/api-path';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect, FilterInput } from '../../../components/common/data/FilterBar';\nimport { TimestampCell } from '../../../components/common/display/TimestampCell';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../../components/common/data/ListToolbar';\nimport { StreamMessageDetail } from './StreamMessageDetail';\nimport { STATUS_DOT, STATUS_LABEL, STATUS_OPTIONS, SOURCE_OPTIONS, SOURCE_BADGE } from './constants';\n\nfunction truncateMiddle(str: string, max: number): string {\n if (str.length <= max) return str;\n const half = Math.floor((max - 1) / 2);\n return `${str.slice(0, half)}…${str.slice(-half)}`;\n}\n\nexport function StreamMessagesPage() {\n const { namespace, available } = useNamespace('namespace');\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { namespace: '', source: 'worker', status: '', stream_name: '', msg_type: '', topic: '', workflow_name: '', jid: '', aid: '' },\n });\n\n const [selected, setSelected] = useState<StreamMessage | null>(null);\n\n const namespaceOptions = useMemo(\n () => available.map((id) => ({ value: id, label: id })),\n [available],\n );\n\n const { data, isLoading, refetch, isFetching } = useStreamMessages({\n namespace: filters.namespace || namespace,\n source: (filters.source as 'engine' | 'worker') || 'worker',\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n status: (filters.status as any) || undefined,\n stream_name: filters.stream_name || undefined,\n msg_type: filters.msg_type || undefined,\n topic: filters.topic || undefined,\n workflow_name: filters.workflow_name || undefined,\n jid: filters.jid || undefined,\n aid: filters.aid || undefined,\n });\n\n const messages = data?.messages ?? [];\n const total = data?.total ?? 0;\n\n const activeMessage = useMemo(() => {\n if (!selected) return null;\n return messages.find((m) => m.id === selected.id && m.source === selected.source) ?? selected;\n }, [messages, selected]);\n\n const panelOpen = !!activeMessage;\n\n const columns: Column<StreamMessage>[] = [\n {\n key: 'status',\n label: 'Status',\n render: (row) => (\n <div className=\"flex items-center gap-2\">\n <span className={`w-2 h-2 rounded-full shrink-0 ${STATUS_DOT[row.status]}`} />\n <span className=\"text-xs\">{STATUS_LABEL[row.status]}</span>\n </div>\n ),\n className: 'w-28',\n },\n {\n key: 'source',\n label: 'Source',\n render: (row) => <span className={SOURCE_BADGE}>{row.source}</span>,\n className: 'w-20',\n },\n {\n key: 'stream_name',\n label: 'Stream',\n sortable: true,\n render: (row) => (\n <span className=\"font-mono text-xs text-text-secondary truncate block max-w-[240px]\" title={row.stream_name}>\n {row.stream_name}\n </span>\n ),\n },\n {\n key: 'msg_type',\n label: 'Type',\n render: (row) => (\n <span className=\"text-xs text-text-secondary\">{row.msg_type || '—'}</span>\n ),\n className: 'w-24',\n },\n {\n key: 'created_at',\n label: 'Created',\n sortable: true,\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-44',\n },\n {\n key: 'reserved_at',\n label: 'Reserved',\n render: (row) => row.reserved_at ? <TimestampCell date={row.reserved_at} /> : <span className=\"text-xs text-text-tertiary\">—</span>,\n className: 'w-44',\n },\n {\n key: 'expired_at',\n label: 'Processed',\n render: (row) => row.expired_at ? <TimestampCell date={row.expired_at} /> : <span className=\"text-xs text-text-tertiary\">—</span>,\n className: 'w-44',\n },\n {\n key: 'priority',\n label: 'Pri',\n sortable: true,\n render: (row) => <span className=\"text-xs text-text-secondary\">{row.priority}</span>,\n className: 'w-12 text-right',\n },\n {\n key: 'retry_attempt',\n label: 'Retries',\n render: (row) => (\n <span className=\"text-xs text-text-secondary\">\n {row.retry_attempt}/{row.max_retry_attempts}\n </span>\n ),\n className: 'w-16',\n },\n ];\n\n return (\n <div>\n <PageHeader title=\"Messages\" docsHash=\"#docs:dashboard.md:messages\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={buildApiPath('/controlplane/stream-messages', {\n namespace: filters.namespace || namespace,\n source: filters.source || 'worker',\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n status: filters.status || undefined,\n stream_name: filters.stream_name || undefined,\n msg_type: filters.msg_type || undefined,\n topic: filters.topic || undefined,\n workflow_name: filters.workflow_name || undefined,\n jid: filters.jid || undefined,\n aid: filters.aid || undefined,\n })}\n />\n }>\n <FilterSelect\n label=\"Namespace\"\n value={filters.namespace}\n onChange={(v) => setFilter('namespace', v)}\n options={namespaceOptions}\n required\n />\n <FilterSelect\n label=\"Source\"\n value={filters.source}\n onChange={(v) => setFilter('source', v)}\n options={SOURCE_OPTIONS}\n required\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n <FilterInput\n label=\"Stream\"\n value={filters.stream_name}\n onChange={(v) => setFilter('stream_name', v)}\n placeholder=\"Filter by stream name…\"\n />\n <FilterInput\n label=\"Job ID\"\n value={filters.jid}\n onChange={(v) => setFilter('jid', v)}\n placeholder=\"Filter by jid…\"\n />\n {/* Active dimension filter pills — inline in the sticky bar */}\n {[\n { key: 'topic', label: 'Topic', value: filters.topic },\n { key: 'workflow_name', label: 'Workflow', value: filters.workflow_name },\n { key: 'aid', label: 'Activity', value: filters.aid },\n { key: 'msg_type', label: 'Type', value: filters.msg_type },\n ].filter((f) => f.value).map((f) => (\n <button\n key={f.key}\n onClick={() => setFilter(f.key as any, '')}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] font-mono rounded-full bg-accent/15 text-accent hover:bg-accent/25 transition-colors\"\n title={`Clear ${f.label} filter: ${f.value}`}\n >\n {f.label}: {truncateMiddle(f.value, 12)}\n <X className=\"w-2.5 h-2.5\" />\n </button>\n ))}\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={messages}\n keyFn={(row) => `${row.source}:${row.id}`}\n isLoading={isLoading}\n emptyMessage=\"No stream messages found\"\n onRowClick={(row) => setSelected(row)}\n activeRowKey={activeMessage ? `${activeMessage.source}:${activeMessage.id}` : null}\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n\n {/* Detail panel — portaled to body so fixed positioning works */}\n {panelOpen && createPortal(\n <div className=\"fixed right-0 bottom-0 w-[400px] z-40 border-l border-surface-border bg-surface overflow-y-auto shadow-lg\" style={{ top: '3.5rem' }}>\n <div className=\"sticky top-0 z-10 flex items-center justify-between px-4 py-3 bg-surface border-b border-surface-border/50\">\n <span className=\"text-xs font-medium text-text-primary\">Message Detail</span>\n <button\n onClick={() => setSelected(null)}\n className=\"p-1 rounded hover:bg-surface-hover text-text-tertiary hover:text-text-primary transition-colors\"\n title=\"Close\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n <div className=\"px-4 py-4\">\n <StreamMessageDetail\n message={activeMessage}\n filters={{\n onFilterStatus: (v) => setFilter('status', v),\n onFilterStreamName: (v) => setFilter('stream_name', v),\n onFilterMsgType: (v) => setFilter('msg_type', v),\n onFilterTopic: (v) => setFilter('topic', v),\n onFilterWorkflow: (v) => setFilter('workflow_name', v),\n onFilterJid: (v) => setFilter('jid', v),\n onFilterAid: (v) => setFilter('aid', v),\n }}\n />\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n}\n"],"names":["truncateMiddle","str","max","half","StreamMessagesPage","namespace","available","useNamespace","filters","setFilter","pagination","sort","setSort","useFilterParams","selected","setSelected","useState","namespaceOptions","useMemo","id","data","isLoading","refetch","isFetching","useStreamMessages","messages","total","activeMessage","m","panelOpen","columns","row","jsxs","jsx","STATUS_DOT","STATUS_LABEL","SOURCE_BADGE","TimestampCell","PageHeader","FilterBar","ListToolbar","buildApiPath","FilterSelect","v","SOURCE_OPTIONS","STATUS_OPTIONS","FilterInput","f","X","DataTable","StickyPagination","createPortal","StreamMessageDetail"],"mappings":"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"}
1
+ {"version":3,"file":"index-SCrD3l-K.js","sources":["../../src/pages/admin/streams/StreamMessagesPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from 'lucide-react';\nimport { useStreamMessages, type StreamMessage } from '../../../api/stream-messages';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { useNamespace } from '../../../hooks/useNamespace';\nimport { buildApiPath } from '../../../lib/api-path';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect, FilterInput } from '../../../components/common/data/FilterBar';\nimport { TimestampCell } from '../../../components/common/display/TimestampCell';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../../components/common/data/ListToolbar';\nimport { StreamMessageDetail } from './StreamMessageDetail';\nimport { STATUS_DOT, STATUS_LABEL, STATUS_OPTIONS, SOURCE_OPTIONS, SOURCE_BADGE } from './constants';\n\nfunction truncateMiddle(str: string, max: number): string {\n if (str.length <= max) return str;\n const half = Math.floor((max - 1) / 2);\n return `${str.slice(0, half)}…${str.slice(-half)}`;\n}\n\nexport function StreamMessagesPage() {\n const { namespace, available } = useNamespace('namespace');\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { namespace: '', source: 'worker', status: '', stream_name: '', msg_type: '', topic: '', workflow_name: '', jid: '', aid: '' },\n });\n\n const [selected, setSelected] = useState<StreamMessage | null>(null);\n\n const namespaceOptions = useMemo(\n () => available.map((id) => ({ value: id, label: id })),\n [available],\n );\n\n const { data, isLoading, refetch, isFetching } = useStreamMessages({\n namespace: filters.namespace || namespace,\n source: (filters.source as 'engine' | 'worker') || 'worker',\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n status: (filters.status as any) || undefined,\n stream_name: filters.stream_name || undefined,\n msg_type: filters.msg_type || undefined,\n topic: filters.topic || undefined,\n workflow_name: filters.workflow_name || undefined,\n jid: filters.jid || undefined,\n aid: filters.aid || undefined,\n });\n\n const messages = data?.messages ?? [];\n const total = data?.total ?? 0;\n\n const activeMessage = useMemo(() => {\n if (!selected) return null;\n return messages.find((m) => m.id === selected.id && m.source === selected.source) ?? selected;\n }, [messages, selected]);\n\n const panelOpen = !!activeMessage;\n\n const columns: Column<StreamMessage>[] = [\n {\n key: 'status',\n label: 'Status',\n render: (row) => (\n <div className=\"flex items-center gap-2\">\n <span className={`w-2 h-2 rounded-full shrink-0 ${STATUS_DOT[row.status]}`} />\n <span className=\"text-xs\">{STATUS_LABEL[row.status]}</span>\n </div>\n ),\n className: 'w-28',\n },\n {\n key: 'source',\n label: 'Source',\n render: (row) => <span className={SOURCE_BADGE}>{row.source}</span>,\n className: 'w-20',\n },\n {\n key: 'stream_name',\n label: 'Stream',\n sortable: true,\n render: (row) => (\n <span className=\"font-mono text-xs text-text-secondary truncate block max-w-[240px]\" title={row.stream_name}>\n {row.stream_name}\n </span>\n ),\n },\n {\n key: 'msg_type',\n label: 'Type',\n render: (row) => (\n <span className=\"text-xs text-text-secondary\">{row.msg_type || '—'}</span>\n ),\n className: 'w-24',\n },\n {\n key: 'created_at',\n label: 'Created',\n sortable: true,\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-44',\n },\n {\n key: 'reserved_at',\n label: 'Reserved',\n render: (row) => row.reserved_at ? <TimestampCell date={row.reserved_at} /> : <span className=\"text-xs text-text-tertiary\">—</span>,\n className: 'w-44',\n },\n {\n key: 'expired_at',\n label: 'Processed',\n render: (row) => row.expired_at ? <TimestampCell date={row.expired_at} /> : <span className=\"text-xs text-text-tertiary\">—</span>,\n className: 'w-44',\n },\n {\n key: 'priority',\n label: 'Pri',\n sortable: true,\n render: (row) => <span className=\"text-xs text-text-secondary\">{row.priority}</span>,\n className: 'w-12 text-right',\n },\n {\n key: 'retry_attempt',\n label: 'Retries',\n render: (row) => (\n <span className=\"text-xs text-text-secondary\">\n {row.retry_attempt}/{row.max_retry_attempts}\n </span>\n ),\n className: 'w-16',\n },\n ];\n\n return (\n <div>\n <PageHeader title=\"Messages\" docsHash=\"#docs:dashboard.md:messages\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={buildApiPath('/controlplane/stream-messages', {\n namespace: filters.namespace || namespace,\n source: filters.source || 'worker',\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n status: filters.status || undefined,\n stream_name: filters.stream_name || undefined,\n msg_type: filters.msg_type || undefined,\n topic: filters.topic || undefined,\n workflow_name: filters.workflow_name || undefined,\n jid: filters.jid || undefined,\n aid: filters.aid || undefined,\n })}\n />\n }>\n <FilterSelect\n label=\"Namespace\"\n value={filters.namespace}\n onChange={(v) => setFilter('namespace', v)}\n options={namespaceOptions}\n required\n />\n <FilterSelect\n label=\"Source\"\n value={filters.source}\n onChange={(v) => setFilter('source', v)}\n options={SOURCE_OPTIONS}\n required\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n <FilterInput\n label=\"Stream\"\n value={filters.stream_name}\n onChange={(v) => setFilter('stream_name', v)}\n placeholder=\"Filter by stream name…\"\n />\n <FilterInput\n label=\"Job ID\"\n value={filters.jid}\n onChange={(v) => setFilter('jid', v)}\n placeholder=\"Filter by jid…\"\n />\n {/* Active dimension filter pills — inline in the sticky bar */}\n {[\n { key: 'topic', label: 'Topic', value: filters.topic },\n { key: 'workflow_name', label: 'Workflow', value: filters.workflow_name },\n { key: 'aid', label: 'Activity', value: filters.aid },\n { key: 'msg_type', label: 'Type', value: filters.msg_type },\n ].filter((f) => f.value).map((f) => (\n <button\n key={f.key}\n onClick={() => setFilter(f.key as any, '')}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] font-mono rounded-full bg-accent/15 text-accent hover:bg-accent/25 transition-colors\"\n title={`Clear ${f.label} filter: ${f.value}`}\n >\n {f.label}: {truncateMiddle(f.value, 12)}\n <X className=\"w-2.5 h-2.5\" />\n </button>\n ))}\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={messages}\n keyFn={(row) => `${row.source}:${row.id}`}\n isLoading={isLoading}\n emptyMessage=\"No stream messages found\"\n onRowClick={(row) => setSelected(row)}\n activeRowKey={activeMessage ? `${activeMessage.source}:${activeMessage.id}` : null}\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n\n {/* Detail panel — portaled to body so fixed positioning works */}\n {panelOpen && createPortal(\n <div className=\"fixed right-0 bottom-0 w-[400px] z-40 border-l border-surface-border bg-surface overflow-y-auto shadow-lg\" style={{ top: '3.5rem' }}>\n <div className=\"sticky top-0 z-10 flex items-center justify-between px-4 py-3 bg-surface border-b border-surface-border/50\">\n <span className=\"text-xs font-medium text-text-primary\">Message Detail</span>\n <button\n onClick={() => setSelected(null)}\n className=\"p-1 rounded hover:bg-surface-hover text-text-tertiary hover:text-text-primary transition-colors\"\n title=\"Close\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n <div className=\"px-4 py-4\">\n <StreamMessageDetail\n message={activeMessage}\n filters={{\n onFilterStatus: (v) => setFilter('status', v),\n onFilterStreamName: (v) => setFilter('stream_name', v),\n onFilterMsgType: (v) => setFilter('msg_type', v),\n onFilterTopic: (v) => setFilter('topic', v),\n onFilterWorkflow: (v) => setFilter('workflow_name', v),\n onFilterJid: (v) => setFilter('jid', v),\n onFilterAid: (v) => setFilter('aid', v),\n }}\n />\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n}\n"],"names":["truncateMiddle","str","max","half","StreamMessagesPage","namespace","available","useNamespace","filters","setFilter","pagination","sort","setSort","useFilterParams","selected","setSelected","useState","namespaceOptions","useMemo","id","data","isLoading","refetch","isFetching","useStreamMessages","messages","total","activeMessage","m","panelOpen","columns","row","jsxs","jsx","STATUS_DOT","STATUS_LABEL","SOURCE_BADGE","TimestampCell","PageHeader","FilterBar","ListToolbar","buildApiPath","FilterSelect","v","SOURCE_OPTIONS","STATUS_OPTIONS","FilterInput","f","X","DataTable","StickyPagination","createPortal","StreamMessageDetail"],"mappings":"owBAgBA,SAASA,EAAeC,EAAaC,EAAqB,CACxD,GAAID,EAAI,QAAUC,EAAK,OAAOD,EAC9B,MAAME,EAAO,KAAK,OAAOD,EAAM,GAAK,CAAC,EACrC,MAAO,GAAGD,EAAI,MAAM,EAAGE,CAAI,CAAC,IAAIF,EAAI,MAAM,CAACE,CAAI,CAAC,EAClD,CAEO,SAASC,IAAqB,CACnC,KAAM,CAAE,UAAAC,EAAW,UAAAC,GAAcC,EAAa,WAAW,EAEnD,CAAE,QAAAC,EAAS,UAAAC,EAAW,WAAAC,EAAY,KAAAC,EAAM,QAAAC,CAAA,EAAYC,EAAgB,CACxE,QAAS,CAAE,UAAW,GAAI,OAAQ,SAAU,OAAQ,GAAI,YAAa,GAAI,SAAU,GAAI,MAAO,GAAI,cAAe,GAAI,IAAK,GAAI,IAAK,EAAA,CAAG,CACvI,EAEK,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAA+B,IAAI,EAE7DC,EAAmBC,EAAAA,QACvB,IAAMZ,EAAU,IAAKa,IAAQ,CAAE,MAAOA,EAAI,MAAOA,CAAA,EAAK,EACtD,CAACb,CAAS,CAAA,EAGN,CAAE,KAAAc,EAAM,UAAAC,EAAW,QAAAC,EAAS,WAAAC,CAAA,EAAeC,EAAkB,CACjE,UAAWhB,EAAQ,WAAaH,EAChC,OAASG,EAAQ,QAAkC,SACnD,MAAOE,EAAW,SAClB,OAAQA,EAAW,OACnB,QAASC,EAAK,SAAW,aACzB,MAAOA,EAAK,OAAS,OACrB,OAASH,EAAQ,QAAkB,OACnC,YAAaA,EAAQ,aAAe,OACpC,SAAUA,EAAQ,UAAY,OAC9B,MAAOA,EAAQ,OAAS,OACxB,cAAeA,EAAQ,eAAiB,OACxC,IAAKA,EAAQ,KAAO,OACpB,IAAKA,EAAQ,KAAO,MAAA,CACrB,EAEKiB,GAAWL,GAAA,YAAAA,EAAM,WAAY,CAAA,EAC7BM,GAAQN,GAAA,YAAAA,EAAM,QAAS,EAEvBO,EAAgBT,EAAAA,QAAQ,IACvBJ,EACEW,EAAS,KAAMG,GAAMA,EAAE,KAAOd,EAAS,IAAMc,EAAE,SAAWd,EAAS,MAAM,GAAKA,EAD/D,KAErB,CAACW,EAAUX,CAAQ,CAAC,EAEjBe,EAAY,CAAC,CAACF,EAEdG,EAAmC,CACvC,CACE,IAAK,SACL,MAAO,SACP,OAASC,GACPC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,MAAC,QAAK,UAAW,iCAAiCC,EAAWH,EAAI,MAAM,CAAC,GAAI,QAC3E,OAAA,CAAK,UAAU,UAAW,SAAAI,EAAaJ,EAAI,MAAM,CAAA,CAAE,CAAA,EACtD,EAEF,UAAW,MAAA,EAEb,CACE,IAAK,SACL,MAAO,SACP,OAASA,GAAQE,EAAAA,IAAC,QAAK,UAAWG,EAAe,WAAI,OAAO,EAC5D,UAAW,MAAA,EAEb,CACE,IAAK,cACL,MAAO,SACP,SAAU,GACV,OAASL,GACPE,MAAC,OAAA,CAAK,UAAU,qEAAqE,MAAOF,EAAI,YAC7F,SAAAA,EAAI,WAAA,CACP,CAAA,EAGJ,CACE,IAAK,WACL,MAAO,OACP,OAASA,GACPE,EAAAA,IAAC,QAAK,UAAU,8BAA+B,SAAAF,EAAI,UAAY,GAAA,CAAI,EAErE,UAAW,MAAA,EAEb,CACE,IAAK,aACL,MAAO,UACP,SAAU,GACV,OAASA,SAASM,EAAA,CAAc,KAAMN,EAAI,WAAY,EACtD,UAAW,MAAA,EAEb,CACE,IAAK,cACL,MAAO,WACP,OAASA,GAAQA,EAAI,YAAcE,MAACI,EAAA,CAAc,KAAMN,EAAI,YAAa,EAAKE,EAAAA,IAAC,OAAA,CAAK,UAAU,6BAA6B,SAAA,IAAC,EAC5H,UAAW,MAAA,EAEb,CACE,IAAK,aACL,MAAO,YACP,OAASF,GAAQA,EAAI,WAAaE,MAACI,EAAA,CAAc,KAAMN,EAAI,WAAY,EAAKE,EAAAA,IAAC,OAAA,CAAK,UAAU,6BAA6B,SAAA,IAAC,EAC1H,UAAW,MAAA,EAEb,CACE,IAAK,WACL,MAAO,MACP,SAAU,GACV,OAASF,GAAQE,EAAAA,IAAC,QAAK,UAAU,8BAA+B,WAAI,SAAS,EAC7E,UAAW,iBAAA,EAEb,CACE,IAAK,gBACL,MAAO,UACP,OAASF,GACPC,EAAAA,KAAC,OAAA,CAAK,UAAU,8BACb,SAAA,CAAAD,EAAI,cAAc,IAAEA,EAAI,kBAAA,EAC3B,EAEF,UAAW,MAAA,CACb,EAGF,cACG,MAAA,CACC,SAAA,CAAAE,EAAAA,IAACK,EAAA,CAAW,MAAM,WAAW,SAAS,8BAA8B,EAEpEN,OAACO,GAAU,QACTN,EAAAA,IAACO,EAAA,CACC,UAAW,IAAMlB,EAAA,EACjB,WAAAC,EACA,QAASkB,EAAa,gCAAiC,CACrD,UAAWjC,EAAQ,WAAaH,EAChC,OAAQG,EAAQ,QAAU,SAC1B,MAAOE,EAAW,SAClB,OAAQA,EAAW,OACnB,QAASC,EAAK,SAAW,aACzB,MAAOA,EAAK,OAAS,OACrB,OAAQH,EAAQ,QAAU,OAC1B,YAAaA,EAAQ,aAAe,OACpC,SAAUA,EAAQ,UAAY,OAC9B,MAAOA,EAAQ,OAAS,OACxB,cAAeA,EAAQ,eAAiB,OACxC,IAAKA,EAAQ,KAAO,OACpB,IAAKA,EAAQ,KAAO,MAAA,CACrB,CAAA,CAAA,EAGH,SAAA,CAAAyB,EAAAA,IAACS,EAAA,CACC,MAAM,YACN,MAAOlC,EAAQ,UACf,SAAWmC,GAAMlC,EAAU,YAAakC,CAAC,EACzC,QAAS1B,EACT,SAAQ,EAAA,CAAA,EAEVgB,EAAAA,IAACS,EAAA,CACC,MAAM,SACN,MAAOlC,EAAQ,OACf,SAAWmC,GAAMlC,EAAU,SAAUkC,CAAC,EACtC,QAASC,EACT,SAAQ,EAAA,CAAA,EAEVX,EAAAA,IAACS,EAAA,CACC,MAAM,SACN,MAAOlC,EAAQ,OACf,SAAWmC,GAAMlC,EAAU,SAAUkC,CAAC,EACtC,QAASE,CAAA,CAAA,EAEXZ,EAAAA,IAACa,EAAA,CACC,MAAM,SACN,MAAOtC,EAAQ,YACf,SAAWmC,GAAMlC,EAAU,cAAekC,CAAC,EAC3C,YAAY,wBAAA,CAAA,EAEdV,EAAAA,IAACa,EAAA,CACC,MAAM,SACN,MAAOtC,EAAQ,IACf,SAAWmC,GAAMlC,EAAU,MAAOkC,CAAC,EACnC,YAAY,gBAAA,CAAA,EAGb,CACC,CAAE,IAAK,QAAS,MAAO,QAAS,MAAOnC,EAAQ,KAAA,EAC/C,CAAE,IAAK,gBAAiB,MAAO,WAAY,MAAOA,EAAQ,aAAA,EAC1D,CAAE,IAAK,MAAO,MAAO,WAAY,MAAOA,EAAQ,GAAA,EAChD,CAAE,IAAK,WAAY,MAAO,OAAQ,MAAOA,EAAQ,QAAA,CAAS,EAC1D,OAAQuC,GAAMA,EAAE,KAAK,EAAE,IAAKA,GAC5Bf,EAAAA,KAAC,SAAA,CAEC,QAAS,IAAMvB,EAAUsC,EAAE,IAAY,EAAE,EACzC,UAAU,8IACV,MAAO,SAASA,EAAE,KAAK,YAAYA,EAAE,KAAK,GAEzC,SAAA,CAAAA,EAAE,MAAM,KAAG/C,EAAe+C,EAAE,MAAO,EAAE,EACtCd,EAAAA,IAACe,EAAA,CAAE,UAAU,aAAA,CAAc,CAAA,CAAA,EANtBD,EAAE,GAAA,CAQV,CAAA,EACH,EAEAd,EAAAA,IAACgB,EAAA,CACC,QAAAnB,EACA,KAAML,EACN,MAAQM,GAAQ,GAAGA,EAAI,MAAM,IAAIA,EAAI,EAAE,GACvC,UAAAV,EACA,aAAa,2BACb,WAAaU,GAAQhB,EAAYgB,CAAG,EACpC,aAAcJ,EAAgB,GAAGA,EAAc,MAAM,IAAIA,EAAc,EAAE,GAAK,KAC9E,KAAAhB,EACA,OAAQC,CAAA,CAAA,EAGVqB,EAAAA,IAACiB,EAAA,CACC,KAAMxC,EAAW,KACjB,WAAYA,EAAW,WAAWgB,CAAK,EACvC,aAAchB,EAAW,QACzB,MAAAgB,EACA,SAAUhB,EAAW,SACrB,iBAAkBA,EAAW,WAAA,CAAA,EAI9BmB,GAAasB,EAAAA,aACZnB,OAAC,OAAI,UAAU,4GAA4G,MAAO,CAAE,IAAK,UACvI,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,6GACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,wCAAwC,SAAA,iBAAc,EACtEA,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMlB,EAAY,IAAI,EAC/B,UAAU,kGACV,MAAM,QAEN,SAAAkB,EAAAA,IAACe,EAAA,CAAE,UAAU,SAAA,CAAU,CAAA,CAAA,CACzB,EACF,EACAf,EAAAA,IAAC,MAAA,CAAI,UAAU,YACb,SAAAA,EAAAA,IAACmB,EAAA,CACC,QAASzB,EACT,QAAS,CACP,eAAiBgB,GAAMlC,EAAU,SAAUkC,CAAC,EAC5C,mBAAqBA,GAAMlC,EAAU,cAAekC,CAAC,EACrD,gBAAkBA,GAAMlC,EAAU,WAAYkC,CAAC,EAC/C,cAAgBA,GAAMlC,EAAU,QAASkC,CAAC,EAC1C,iBAAmBA,GAAMlC,EAAU,gBAAiBkC,CAAC,EACrD,YAAcA,GAAMlC,EAAU,MAAOkC,CAAC,EACtC,YAAcA,GAAMlC,EAAU,MAAOkC,CAAC,CAAA,CACxC,CAAA,CACF,CACF,CAAA,EACF,EACA,SAAS,IAAA,CACX,EACF,CAEJ"}
@@ -1,4 +1,4 @@
1
- import{a as m,j as e}from"./vendor-query-B2UbickB.js";import{d as V,h as X,u as Y,i as Z,b as ee}from"./workflows-CT6nTL1I.js";import{C as te}from"./ConfirmDeleteModal-D9_1b4MW.js";import{R as L}from"./RolePill-Pb9TKSQN.js";import{W as se}from"./WorkflowPill-pPUqmx6Q.js";import{P as re}from"./PageHeader-BZJsEVOC.js";import{ai as ne,t as O,ab as ae,aj as D,ad as $,ak as oe,P as Q,al as le,am as M,y as ie,U as F,X as z,i as B,V as H,W as T,C as ce}from"./vendor-icons-C1zVP_dv.js";import{c as G,e as de,f as xe}from"./vendor-react-CXumBFUA.js";import{u as me}from"./roles-bRgaMcdy.js";import{B as ue}from"./BotPicker-DY6iUVC9.js";import{N as pe}from"./NamespacePill-BGf0jHwE.js";import"./index-CtDf8vvQ.js";import"./Modal-CSrxpXeM.js";import"./bots-BD75mzGG.js";function he({tier:t}){return t==="certified"?e.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-medium text-status-success",children:[e.jsx($,{className:"w-3 h-3"}),"Certified"]}):t==="configured"?e.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-medium text-text-secondary",children:[e.jsx(ie,{className:"w-3 h-3"}),"Configured"]}):e.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-medium text-text-quaternary",children:[e.jsx(D,{className:"w-3 h-3"}),"Durable"]})}function De(){const t=G(),{data:n,isLoading:x}=V(),h=X(),[d,j]=m.useState(""),[a,u]=m.useState(null),[f,g]=m.useState(null),l=n??[],s=m.useMemo(()=>[...new Set(l.map(o=>o.task_queue).filter(Boolean))].sort(),[l]),i=m.useMemo(()=>{const o=d.toLowerCase().trim();return(a?[a]:s).map(w=>({queue:w,workflows:l.filter(b=>{var C;return b.task_queue===w&&(!o||b.workflow_type.toLowerCase().includes(o)||((C=b.description)==null?void 0:C.toLowerCase().includes(o)))})})).filter(w=>w.workflows.length>0)},[l,s,d,a]),p=m.useMemo(()=>{const o=d.toLowerCase().trim();return a?[]:l.filter(c=>{var w;return!c.task_queue&&(!o||c.workflow_type.toLowerCase().includes(o)||((w=c.description)==null?void 0:w.toLowerCase().includes(o)))})},[l,d,a]),N=o=>{o.registered?t(`/workflows/registry/${encodeURIComponent(o.workflow_type)}`):t(`/workflows/registry/new?workflow_type=${encodeURIComponent(o.workflow_type)}&task_queue=${encodeURIComponent(o.task_queue??"")}`)},_=()=>{f&&h.mutate(f,{onSuccess:()=>g(null)})};return e.jsxs("div",{children:[e.jsx(re,{title:"Registered Workflows",docsHash:"#docs:dashboard.md:workflow-registry",actions:e.jsx("button",{onClick:()=>t("/workflows/registry/new"),className:"btn-primary text-xs",children:"Register Workflow"})}),!x&&s.length>0&&e.jsx("div",{className:"sticky top-0 z-20 bg-surface pt-3 pb-3",children:e.jsxs("div",{className:"bg-[#F7F7F7] rounded-lg px-5 pt-3 pb-3 flex items-center gap-5",children:[e.jsxs("button",{onClick:()=>u(null),className:`flex flex-col items-center gap-1 transition-colors ${a===null?"text-accent":"text-text-quaternary hover:text-text-secondary"}`,children:[e.jsx(ne,{className:"w-3 h-3",strokeWidth:1.5}),e.jsx("span",{className:"text-[9px] font-medium",children:"All"})]}),s.map(o=>{const c=a===o,w=o.length>16?o.slice(0,14)+"…":o;return e.jsxs("button",{onClick:()=>u(c?null:o),className:`flex flex-col items-center gap-1 transition-colors ${c?"text-accent":"text-text-quaternary hover:text-text-secondary"}`,title:o,children:[e.jsx(O,{className:"w-3 h-3",strokeWidth:1.5}),e.jsx("span",{className:"text-[9px] font-medium",children:w})]},o)}),e.jsx("span",{className:"flex-1"}),e.jsxs("div",{className:"relative",children:[e.jsx(ae,{className:"absolute left-0 top-1/2 -translate-y-1/2 w-3 h-3 text-text-quaternary"}),e.jsx("input",{type:"text",value:d,onChange:o=>j(o.target.value),placeholder:`Search ${l.length} workflows…`,className:"pl-5 py-1 text-sm bg-transparent border-b border-surface-border/60 text-text-primary placeholder:text-text-quaternary focus:outline-none focus:border-accent/50 transition-colors w-52"})]})]})}),x?e.jsx(fe,{}):i.length===0&&p.length===0?e.jsx("p",{className:"text-sm text-text-tertiary mt-8",children:d||a?"No workflows match your filter.":"No workflows discovered yet."}):e.jsxs("div",{className:"space-y-10",children:[i.map(({queue:o,workflows:c})=>e.jsxs("div",{children:[e.jsxs("div",{className:"sticky top-[78px] z-10 bg-surface flex items-center gap-2 py-2 mb-2 border-b border-surface-border",children:[e.jsx(O,{className:"w-3 h-3 text-accent",strokeWidth:1.5}),e.jsx("h2",{className:"section-h2",children:o}),e.jsx("span",{className:"text-xs text-text-quaternary",children:c.length})]}),e.jsx(U,{}),e.jsx("div",{className:"divide-y divide-surface-border/30",children:c.map(w=>e.jsx(J,{wf:w,onRowClick:N,onDelete:g,onNavigate:t},w.workflow_type))})]},o)),p.length>0&&e.jsxs("div",{children:[e.jsxs("div",{className:"sticky top-[78px] z-10 bg-surface flex items-center gap-2 py-2 mb-2 border-b border-surface-border",children:[e.jsx(D,{className:"w-3 h-3 text-text-quaternary",strokeWidth:1.5}),e.jsx("h2",{className:"section-h2",children:"No Queue"}),e.jsx("span",{className:"text-xs text-text-quaternary",children:p.length})]}),e.jsx(U,{}),e.jsx("div",{className:"divide-y divide-surface-border/30",children:p.map(o=>e.jsx(J,{wf:o,onRowClick:N,onDelete:g,onNavigate:t},o.workflow_type))})]})]}),e.jsx(te,{open:!!f,onClose:()=>g(null),onConfirm:_,title:"De-certify Workflow",description:e.jsxs(e.Fragment,{children:["Remove certification from"," ",e.jsx("span",{className:"font-mono font-medium text-text-primary",children:f}),"? This removes interceptor guarantees, escalation chains, and invocation role constraints. The workflow will continue running as a standard durable workflow."]}),isPending:h.isPending,error:h.error})]})}const K="grid grid-cols-[minmax(0,1fr)_7rem_13rem_4.5rem] gap-x-6 items-start";function U(){return e.jsxs("div",{className:`${K} px-3 pb-2 pt-1`,children:[e.jsx("span",{className:"text-[10px] font-medium text-text-quaternary",children:"Workflow"}),e.jsx("span",{className:"text-[10px] font-medium text-text-quaternary",children:"Tier"}),e.jsx("span",{className:"text-[10px] font-medium text-text-quaternary",children:"Access"}),e.jsx("span",{})]})}function J({wf:t,onRowClick:n,onDelete:x,onNavigate:h}){const d=t.roles??[],j=t.invocation_roles??[];return e.jsxs("div",{role:"button",tabIndex:0,onClick:()=>n(t),onKeyDown:a=>{(a.key==="Enter"||a.key===" ")&&n(t)},className:`group ${K} py-2.5 px-3 -mx-3 rounded-md cursor-pointer transition-colors`,children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx(se,{type:t.workflow_type,size:"md",variant:t.tier==="certified"?"certified":t.tier==="configured"?"configured":"durable"}),t.description&&e.jsx("p",{className:"mt-0.5 text-[10px] text-text-tertiary group-hover:text-text-secondary leading-snug line-clamp-2 transition-colors",children:t.description})]}),e.jsx("div",{className:"pt-0.5",children:e.jsx(he,{tier:t.tier??"durable"})}),e.jsxs("div",{className:"min-w-0 space-y-1 pt-0.5",children:[d.length>0&&e.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[e.jsx("span",{title:"Escalation roles",children:e.jsx($,{className:"w-3 h-3 text-text-quaternary shrink-0"})}),d.map(a=>e.jsx(L,{role:a},`e-${a}`))]}),j.length>0&&e.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[e.jsx("span",{title:"Invocation roles",children:e.jsx(oe,{className:"w-3 h-3 text-text-quaternary shrink-0"})}),j.map(a=>e.jsx(L,{role:a},`i-${a}`))]}),d.length===0&&j.length===0&&e.jsx("span",{className:"text-xs text-text-quaternary",children:"—"})]}),e.jsxs("div",{className:"flex items-center justify-end gap-2.5 pt-0.5 opacity-0 group-hover:opacity-100 transition-opacity",children:[t.invocable&&e.jsx("button",{title:"Invoke workflow",onClick:a=>{a.stopPropagation(),h(`/workflows/start?type=${encodeURIComponent(t.workflow_type)}&mode=now`)},className:"text-text-quaternary hover:text-status-success transition-colors",children:e.jsx(Q,{className:"w-3.5 h-3.5"})}),t.tier==="durable"&&e.jsx("button",{title:"Configure workflow",onClick:a=>{a.stopPropagation(),h(`/workflows/registry/new?workflow_type=${encodeURIComponent(t.workflow_type)}&task_queue=${encodeURIComponent(t.task_queue??"")}`)},className:"text-text-quaternary hover:text-status-info transition-colors",children:e.jsx(D,{className:"w-3.5 h-3.5"})}),t.tier==="configured"&&e.jsx("button",{title:"Certify workflow",onClick:a=>{a.stopPropagation(),h(`/workflows/registry/${encodeURIComponent(t.workflow_type)}`)},className:"text-text-quaternary hover:text-status-success transition-colors",children:e.jsx(le,{className:"w-3.5 h-3.5"})}),t.registered&&e.jsx("button",{title:"Remove configuration",onClick:a=>{a.stopPropagation(),x(t.workflow_type)},className:"text-text-quaternary hover:text-status-warning transition-colors",children:e.jsx(M,{className:"w-3.5 h-3.5"})})]})]})}function fe(){return e.jsx("div",{className:"animate-pulse space-y-8 mt-4",children:[1,2].map(t=>e.jsxs("div",{children:[e.jsx("div",{className:"h-4 bg-surface-sunken rounded w-36 mb-4"}),e.jsx("div",{className:"space-y-4",children:[1,2,3].map(n=>e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("div",{className:"h-3 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-3 bg-surface-sunken rounded w-full"})]},n))})]},t))})}function P({selected:t,onChange:n,single:x,placeholder:h}){const{data:d}=me(),j=(d==null?void 0:d.roles)??[],[a,u]=m.useState(!1),f=m.useRef(null);m.useEffect(()=>{const i=p=>{f.current&&!f.current.contains(p.target)&&u(!1)};return document.addEventListener("mousedown",i),()=>document.removeEventListener("mousedown",i)},[]);const g=i=>{x?(n(t.includes(i)?[]:[i]),u(!1)):n(t.includes(i)?t.filter(p=>p!==i):[...t,i])},l=i=>{n(t.filter(p=>p!==i))},s=h??(x?"Select role...":"Add roles...");return e.jsxs("div",{ref:f,className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>u(!a),className:"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none",children:[t.length===0&&e.jsx("span",{className:"text-xs text-text-tertiary",children:s}),t.map(i=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px]",children:[e.jsx(F,{className:"w-2.5 h-2.5 shrink-0 text-accent/75"}),i,e.jsx("span",{role:"button",onClick:p=>{p.stopPropagation(),l(i)},className:"ml-0.5 hover:text-status-error transition-colors",children:e.jsx(z,{className:"w-2.5 h-2.5"})})]},i)),e.jsx(B,{className:`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${a?"rotate-180":""}`})]}),a&&e.jsx("div",{className:"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto",children:j.length===0?e.jsx("p",{className:"px-3 py-2 text-xs text-text-tertiary",children:"No roles defined"}):j.map(i=>{const p=t.includes(i);return e.jsxs("button",{type:"button",onClick:()=>g(i),className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${p?"bg-accent/[0.06] text-accent":"text-text-primary hover:bg-surface-sunken"}`,children:[e.jsx(F,{className:"w-3 h-3 shrink-0 text-accent/60"}),e.jsx("span",{className:"flex-1",children:i}),p&&e.jsx(H,{className:"w-3 h-3 shrink-0"})]},i)})})]})}function we({options:t,selected:n,onChange:x,placeholder:h}){const[d,j]=m.useState(!1),a=m.useRef(null);m.useEffect(()=>{const l=s=>{a.current&&!a.current.contains(s.target)&&j(!1)};return document.addEventListener("mousedown",l),()=>document.removeEventListener("mousedown",l)},[]);const u=l=>{x(n.includes(l)?n.filter(s=>s!==l):[...n,l])},f=l=>{x(n.filter(s=>s!==l))},g=h??"Add workflows...";return e.jsxs("div",{ref:a,className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>j(!d),className:"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none",children:[n.length===0&&e.jsx("span",{className:"text-xs text-text-tertiary",children:g}),n.map(l=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px] font-mono",children:[e.jsx(T,{className:"w-2.5 h-2.5 shrink-0 text-accent/75"}),l,e.jsx("span",{role:"button",onClick:s=>{s.stopPropagation(),f(l)},className:"ml-0.5 hover:text-status-error transition-colors",children:e.jsx(z,{className:"w-2.5 h-2.5"})})]},l)),e.jsx(B,{className:`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${d?"rotate-180":""}`})]}),d&&e.jsx("div",{className:"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto",children:t.length===0?e.jsx("p",{className:"px-3 py-2 text-xs text-text-tertiary",children:"No registered workflows"}):t.map(l=>{const s=n.includes(l);return e.jsxs("button",{type:"button",onClick:()=>u(l),className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs font-mono transition-colors ${s?"bg-accent/[0.06] text-accent":"text-text-primary hover:bg-surface-sunken"}`,children:[e.jsx(T,{className:"w-3 h-3 shrink-0 text-accent/60"}),e.jsx("span",{className:"flex-1",children:l}),s&&e.jsx(H,{className:"w-3 h-3 shrink-0"})]},l)})})]})}function q(t){return t.split(",").map(n=>n.trim()).filter(Boolean)}const W={workflow_type:"",description:"",task_queue:"",default_role:"reviewer",invocable:!1,roles:"",invocation_roles:"",consumes:"",envelope_schema:"",resolver_schema:"",cron_schedule:"",execute_as:"",certified:!1};function je(t){const n=(t.roles??[]).join(", "),x=(t.consumes??[]).join(", ");return{workflow_type:t.workflow_type,description:t.description??"",task_queue:t.task_queue??"",default_role:t.default_role,invocable:t.invocable,roles:n,invocation_roles:(t.invocation_roles??[]).join(", "),consumes:x,envelope_schema:t.envelope_schema?JSON.stringify(t.envelope_schema,null,2):"",resolver_schema:t.resolver_schema?JSON.stringify(t.resolver_schema,null,2):"",cron_schedule:t.cron_schedule??"",execute_as:t.execute_as??"",certified:!!(n||x)}}function S(t){if(!t.trim())return!0;try{return JSON.parse(t),!0}catch{return!1}}function E({icon:t,color:n,children:x}){return e.jsxs("div",{className:"flex items-center gap-2 mb-4 pb-2 border-b border-surface-border",children:[e.jsx(t,{className:`w-4 h-4 ${n}`,strokeWidth:1.5}),e.jsx("h2",{className:"section-h2",children:x})]})}function v({label:t,hint:n,children:x}){return e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"label",children:t}),x,n&&e.jsx("p",{className:"hint",children:n})]})}const A="input-json w-full";function R(t){return q(t)}function I(t){return t.join(", ")}const ge=new Set(["mcpQuery","mcpDeterministic","mcpQueryRouter","mcpTriage","mcpTriageRouter","mcpTriageDeterministic","insightQuery"]);function $e(){const{workflowType:t}=de(),n=!t,x=G(),[h]=xe(),{data:d,isLoading:j}=Y(),a=Z(),u=(d==null?void 0:d.find(r=>r.workflow_type===t))??null,{data:f}=ee({limit:500}),g=m.useMemo(()=>{const r=new Set((d??[]).map(y=>y.workflow_type));return[...new Set(((f==null?void 0:f.jobs)??[]).map(y=>y.entity))].filter(y=>!r.has(y)&&!ge.has(y)).sort()},[d,f]),l=m.useMemo(()=>{if(!n)return W;const r=h.get("workflow_type")??"",k=h.get("task_queue")??"";return r||k?{...W,workflow_type:r,task_queue:k}:W},[n,h]),[s,i]=m.useState(l),[p,N]=m.useState(""),[_,o]=m.useState(!1),c=m.useCallback((r,k)=>i(y=>({...y,[r]:k})),[]);m.useEffect(()=>{if(!_){if(n){i(l),o(!0);return}u&&(i(je(u)),o(!0))}},[u,n,_,l]);const w=()=>{if(!s.workflow_type.trim())return;N("");let r=null,k=null;try{s.envelope_schema.trim()&&(r=JSON.parse(s.envelope_schema))}catch{N("Invalid JSON in Envelope Schema");return}try{s.resolver_schema.trim()&&(k=JSON.parse(s.resolver_schema))}catch{N("Invalid JSON in Resolver Schema");return}a.mutate({workflow_type:s.workflow_type.trim(),description:s.description.trim()||null,task_queue:s.task_queue.trim()||null,default_role:s.default_role.trim()||"reviewer",invocable:s.invocable,roles:q(s.roles),invocation_roles:q(s.invocation_roles),consumes:q(s.consumes),envelope_schema:r,resolver_schema:k,cron_schedule:s.cron_schedule.trim()||null,execute_as:s.execute_as.trim()||null},{onSuccess:()=>x("/workflows/registry")})};if(j)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]});if(!n&&!u)return e.jsx("p",{className:"text-sm text-text-secondary",children:"Config not found."});const b=!!s.workflow_type.trim()&&S(s.envelope_schema)&&S(s.resolver_schema),C=n&&!s.workflow_type&&g.length>0;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-start justify-between mb-8",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-light font-mono text-text-primary",children:n?"New Workflow":(u==null?void 0:u.workflow_type)??""}),u&&e.jsx("div",{className:"flex items-center gap-2 mt-2",children:e.jsx(pe,{namespace:"durable"})})]}),e.jsxs("div",{className:"flex items-center gap-3 mt-1",children:[e.jsx("button",{onClick:()=>x("/workflows/registry"),className:"btn-ghost text-xs",children:"Cancel"}),e.jsx("button",{onClick:w,disabled:!b||a.isPending,className:"btn-primary text-xs",children:a.isPending?"Saving…":n?"Register":"Save"})]})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-x-14 gap-y-10",children:[e.jsxs("div",{children:[e.jsx(E,{icon:ce,color:"text-accent",children:"Identity"}),e.jsxs("div",{className:"space-y-5",children:[e.jsx(v,{label:"Workflow Type",hint:"Register a workflow to configure invocation and HITL escalation routing.",children:C?e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-xs text-text-secondary",children:"Select a durable workflow to register:"}),e.jsx("div",{className:"grid gap-1",children:g.map(r=>e.jsx("button",{onClick:()=>c("workflow_type",r),className:"flex items-center gap-2 px-3 py-2 text-left text-xs font-mono rounded-md border border-surface-border hover:border-accent/50 hover:bg-accent/[0.04] transition-colors",children:r},r))}),e.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[e.jsx("span",{className:"text-[10px] text-text-tertiary",children:"or"}),e.jsx("input",{type:"text",onChange:r=>c("workflow_type",r.target.value),placeholder:"Enter type manually",className:"input font-mono flex-1"})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",value:s.workflow_type,onChange:r=>c("workflow_type",r.target.value),disabled:!n,placeholder:"reviewContent",className:"input font-mono w-full"}),n&&s.workflow_type&&g.length>0&&e.jsx("button",{onClick:()=>c("workflow_type",""),className:"text-[10px] text-accent hover:underline mt-1",children:"Choose from durable workflows"})]})}),e.jsx(v,{label:"Description",children:e.jsx("input",{type:"text",value:s.description,onChange:r=>c("description",r.target.value),placeholder:"Describe what this workflow does",className:"input text-xs w-full"})}),e.jsx(v,{label:"Task Queue",hint:"Durable task queue this workflow listens on.",children:e.jsx("input",{type:"text",value:s.task_queue,onChange:r=>c("task_queue",r.target.value),placeholder:"lt-review",className:"input font-mono w-full"})})]})]}),e.jsxs("div",{children:[e.jsx(E,{icon:Q,color:"text-emerald-400",children:"Invocation"}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:s.invocable,onChange:r=>c("invocable",r.target.checked),className:"w-4 h-4 rounded border-border accent-accent"}),e.jsx("span",{className:"text-xs text-text-primary font-medium",children:"Invocable"})]}),e.jsx("p",{className:"hint",children:"Allow this workflow to be started from the dashboard or API."})]}),s.invocable?e.jsxs(e.Fragment,{children:[e.jsx(v,{label:"Run As",hint:"Bot identity to run under. Default runs as the invoking user.",children:e.jsx(ue,{selected:s.execute_as,onChange:r=>c("execute_as",r)})}),e.jsx(v,{label:"Invocation Roles",hint:"Only users with these roles can start this workflow. Empty = all authenticated users.",children:e.jsx(P,{selected:R(s.invocation_roles),onChange:r=>c("invocation_roles",I(r)),placeholder:"Select roles…"})}),e.jsxs(v,{label:"Envelope Schema",hint:e.jsxs(e.Fragment,{children:["Pre-fills the JSON editor when invoking. Include ",e.jsx("code",{className:"font-mono",children:"data"})," (input) and optional ",e.jsx("code",{className:"font-mono",children:"metadata"}),"."]}),children:[e.jsx("textarea",{value:s.envelope_schema,onChange:r=>c("envelope_schema",r.target.value),placeholder:`{
1
+ import{a as m,j as e}from"./vendor-query-B2UbickB.js";import{d as V,h as X,u as Y,i as Z,b as ee}from"./workflows-CkPv7xk-.js";import{C as te}from"./ConfirmDeleteModal-D9_1b4MW.js";import{R as L}from"./RolePill-Cl71eDUA.js";import{W as se}from"./WorkflowPill-IDjTRfQ8.js";import{P as re}from"./PageHeader-BhaWTWcM.js";import{ai as ne,t as O,ab as ae,aj as D,ad as $,ak as oe,P as Q,al as le,am as M,y as ie,U as F,X as z,i as B,V as H,W as T,C as ce}from"./vendor-icons-CEWCGPeJ.js";import{c as G,e as de,f as xe}from"./vendor-react-CXumBFUA.js";import{u as me}from"./roles-CFD2eYap.js";import{B as ue}from"./BotPicker-3wBcBavT.js";import{N as pe}from"./NamespacePill-CwKdoyRM.js";import"./index-Dgw1KKpq.js";import"./Modal-CSrxpXeM.js";import"./bots-Cb0WTwhY.js";function he({tier:t}){return t==="certified"?e.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-medium text-status-success",children:[e.jsx($,{className:"w-3 h-3"}),"Certified"]}):t==="configured"?e.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-medium text-text-secondary",children:[e.jsx(ie,{className:"w-3 h-3"}),"Configured"]}):e.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-medium text-text-quaternary",children:[e.jsx(D,{className:"w-3 h-3"}),"Durable"]})}function De(){const t=G(),{data:n,isLoading:x}=V(),h=X(),[d,j]=m.useState(""),[a,u]=m.useState(null),[f,g]=m.useState(null),l=n??[],s=m.useMemo(()=>[...new Set(l.map(o=>o.task_queue).filter(Boolean))].sort(),[l]),i=m.useMemo(()=>{const o=d.toLowerCase().trim();return(a?[a]:s).map(w=>({queue:w,workflows:l.filter(b=>{var C;return b.task_queue===w&&(!o||b.workflow_type.toLowerCase().includes(o)||((C=b.description)==null?void 0:C.toLowerCase().includes(o)))})})).filter(w=>w.workflows.length>0)},[l,s,d,a]),p=m.useMemo(()=>{const o=d.toLowerCase().trim();return a?[]:l.filter(c=>{var w;return!c.task_queue&&(!o||c.workflow_type.toLowerCase().includes(o)||((w=c.description)==null?void 0:w.toLowerCase().includes(o)))})},[l,d,a]),N=o=>{o.registered?t(`/workflows/registry/${encodeURIComponent(o.workflow_type)}`):t(`/workflows/registry/new?workflow_type=${encodeURIComponent(o.workflow_type)}&task_queue=${encodeURIComponent(o.task_queue??"")}`)},_=()=>{f&&h.mutate(f,{onSuccess:()=>g(null)})};return e.jsxs("div",{children:[e.jsx(re,{title:"Registered Workflows",docsHash:"#docs:dashboard.md:workflow-registry",actions:e.jsx("button",{onClick:()=>t("/workflows/registry/new"),className:"btn-primary text-xs",children:"Register Workflow"})}),!x&&s.length>0&&e.jsx("div",{className:"sticky top-0 z-20 bg-surface pt-3 pb-3",children:e.jsxs("div",{className:"bg-[#F7F7F7] rounded-lg px-5 pt-3 pb-3 flex items-center gap-5",children:[e.jsxs("button",{onClick:()=>u(null),className:`flex flex-col items-center gap-1 transition-colors ${a===null?"text-accent":"text-text-quaternary hover:text-text-secondary"}`,children:[e.jsx(ne,{className:"w-3 h-3",strokeWidth:1.5}),e.jsx("span",{className:"text-[9px] font-medium",children:"All"})]}),s.map(o=>{const c=a===o,w=o.length>16?o.slice(0,14)+"…":o;return e.jsxs("button",{onClick:()=>u(c?null:o),className:`flex flex-col items-center gap-1 transition-colors ${c?"text-accent":"text-text-quaternary hover:text-text-secondary"}`,title:o,children:[e.jsx(O,{className:"w-3 h-3",strokeWidth:1.5}),e.jsx("span",{className:"text-[9px] font-medium",children:w})]},o)}),e.jsx("span",{className:"flex-1"}),e.jsxs("div",{className:"relative",children:[e.jsx(ae,{className:"absolute left-0 top-1/2 -translate-y-1/2 w-3 h-3 text-text-quaternary"}),e.jsx("input",{type:"text",value:d,onChange:o=>j(o.target.value),placeholder:`Search ${l.length} workflows…`,className:"pl-5 py-1 text-sm bg-transparent border-b border-surface-border/60 text-text-primary placeholder:text-text-quaternary focus:outline-none focus:border-accent/50 transition-colors w-52"})]})]})}),x?e.jsx(fe,{}):i.length===0&&p.length===0?e.jsx("p",{className:"text-sm text-text-tertiary mt-8",children:d||a?"No workflows match your filter.":"No workflows discovered yet."}):e.jsxs("div",{className:"space-y-10",children:[i.map(({queue:o,workflows:c})=>e.jsxs("div",{children:[e.jsxs("div",{className:"sticky top-[78px] z-10 bg-surface flex items-center gap-2 py-2 mb-2 border-b border-surface-border",children:[e.jsx(O,{className:"w-3 h-3 text-accent",strokeWidth:1.5}),e.jsx("h2",{className:"section-h2",children:o}),e.jsx("span",{className:"text-xs text-text-quaternary",children:c.length})]}),e.jsx(U,{}),e.jsx("div",{className:"divide-y divide-surface-border/30",children:c.map(w=>e.jsx(J,{wf:w,onRowClick:N,onDelete:g,onNavigate:t},w.workflow_type))})]},o)),p.length>0&&e.jsxs("div",{children:[e.jsxs("div",{className:"sticky top-[78px] z-10 bg-surface flex items-center gap-2 py-2 mb-2 border-b border-surface-border",children:[e.jsx(D,{className:"w-3 h-3 text-text-quaternary",strokeWidth:1.5}),e.jsx("h2",{className:"section-h2",children:"No Queue"}),e.jsx("span",{className:"text-xs text-text-quaternary",children:p.length})]}),e.jsx(U,{}),e.jsx("div",{className:"divide-y divide-surface-border/30",children:p.map(o=>e.jsx(J,{wf:o,onRowClick:N,onDelete:g,onNavigate:t},o.workflow_type))})]})]}),e.jsx(te,{open:!!f,onClose:()=>g(null),onConfirm:_,title:"De-certify Workflow",description:e.jsxs(e.Fragment,{children:["Remove certification from"," ",e.jsx("span",{className:"font-mono font-medium text-text-primary",children:f}),"? This removes interceptor guarantees, escalation chains, and invocation role constraints. The workflow will continue running as a standard durable workflow."]}),isPending:h.isPending,error:h.error})]})}const K="grid grid-cols-[minmax(0,1fr)_7rem_13rem_4.5rem] gap-x-6 items-start";function U(){return e.jsxs("div",{className:`${K} px-3 pb-2 pt-1`,children:[e.jsx("span",{className:"text-[10px] font-medium text-text-quaternary",children:"Workflow"}),e.jsx("span",{className:"text-[10px] font-medium text-text-quaternary",children:"Tier"}),e.jsx("span",{className:"text-[10px] font-medium text-text-quaternary",children:"Access"}),e.jsx("span",{})]})}function J({wf:t,onRowClick:n,onDelete:x,onNavigate:h}){const d=t.roles??[],j=t.invocation_roles??[];return e.jsxs("div",{role:"button",tabIndex:0,onClick:()=>n(t),onKeyDown:a=>{(a.key==="Enter"||a.key===" ")&&n(t)},className:`group ${K} py-2.5 px-3 -mx-3 rounded-md cursor-pointer transition-colors`,children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx(se,{type:t.workflow_type,size:"md",variant:t.tier==="certified"?"certified":t.tier==="configured"?"configured":"durable"}),t.description&&e.jsx("p",{className:"mt-0.5 text-[10px] text-text-tertiary group-hover:text-text-secondary leading-snug line-clamp-2 transition-colors",children:t.description})]}),e.jsx("div",{className:"pt-0.5",children:e.jsx(he,{tier:t.tier??"durable"})}),e.jsxs("div",{className:"min-w-0 space-y-1 pt-0.5",children:[d.length>0&&e.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[e.jsx("span",{title:"Escalation roles",children:e.jsx($,{className:"w-3 h-3 text-text-quaternary shrink-0"})}),d.map(a=>e.jsx(L,{role:a},`e-${a}`))]}),j.length>0&&e.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[e.jsx("span",{title:"Invocation roles",children:e.jsx(oe,{className:"w-3 h-3 text-text-quaternary shrink-0"})}),j.map(a=>e.jsx(L,{role:a},`i-${a}`))]}),d.length===0&&j.length===0&&e.jsx("span",{className:"text-xs text-text-quaternary",children:"—"})]}),e.jsxs("div",{className:"flex items-center justify-end gap-2.5 pt-0.5 opacity-0 group-hover:opacity-100 transition-opacity",children:[t.invocable&&e.jsx("button",{title:"Invoke workflow",onClick:a=>{a.stopPropagation(),h(`/workflows/start?type=${encodeURIComponent(t.workflow_type)}&mode=now`)},className:"text-text-quaternary hover:text-status-success transition-colors",children:e.jsx(Q,{className:"w-3.5 h-3.5"})}),t.tier==="durable"&&e.jsx("button",{title:"Configure workflow",onClick:a=>{a.stopPropagation(),h(`/workflows/registry/new?workflow_type=${encodeURIComponent(t.workflow_type)}&task_queue=${encodeURIComponent(t.task_queue??"")}`)},className:"text-text-quaternary hover:text-status-info transition-colors",children:e.jsx(D,{className:"w-3.5 h-3.5"})}),t.tier==="configured"&&e.jsx("button",{title:"Certify workflow",onClick:a=>{a.stopPropagation(),h(`/workflows/registry/${encodeURIComponent(t.workflow_type)}`)},className:"text-text-quaternary hover:text-status-success transition-colors",children:e.jsx(le,{className:"w-3.5 h-3.5"})}),t.registered&&e.jsx("button",{title:"Remove configuration",onClick:a=>{a.stopPropagation(),x(t.workflow_type)},className:"text-text-quaternary hover:text-status-warning transition-colors",children:e.jsx(M,{className:"w-3.5 h-3.5"})})]})]})}function fe(){return e.jsx("div",{className:"animate-pulse space-y-8 mt-4",children:[1,2].map(t=>e.jsxs("div",{children:[e.jsx("div",{className:"h-4 bg-surface-sunken rounded w-36 mb-4"}),e.jsx("div",{className:"space-y-4",children:[1,2,3].map(n=>e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("div",{className:"h-3 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-3 bg-surface-sunken rounded w-full"})]},n))})]},t))})}function P({selected:t,onChange:n,single:x,placeholder:h}){const{data:d}=me(),j=(d==null?void 0:d.roles)??[],[a,u]=m.useState(!1),f=m.useRef(null);m.useEffect(()=>{const i=p=>{f.current&&!f.current.contains(p.target)&&u(!1)};return document.addEventListener("mousedown",i),()=>document.removeEventListener("mousedown",i)},[]);const g=i=>{x?(n(t.includes(i)?[]:[i]),u(!1)):n(t.includes(i)?t.filter(p=>p!==i):[...t,i])},l=i=>{n(t.filter(p=>p!==i))},s=h??(x?"Select role...":"Add roles...");return e.jsxs("div",{ref:f,className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>u(!a),className:"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none",children:[t.length===0&&e.jsx("span",{className:"text-xs text-text-tertiary",children:s}),t.map(i=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px]",children:[e.jsx(F,{className:"w-2.5 h-2.5 shrink-0 text-accent/75"}),i,e.jsx("span",{role:"button",onClick:p=>{p.stopPropagation(),l(i)},className:"ml-0.5 hover:text-status-error transition-colors",children:e.jsx(z,{className:"w-2.5 h-2.5"})})]},i)),e.jsx(B,{className:`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${a?"rotate-180":""}`})]}),a&&e.jsx("div",{className:"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto",children:j.length===0?e.jsx("p",{className:"px-3 py-2 text-xs text-text-tertiary",children:"No roles defined"}):j.map(i=>{const p=t.includes(i);return e.jsxs("button",{type:"button",onClick:()=>g(i),className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${p?"bg-accent/[0.06] text-accent":"text-text-primary hover:bg-surface-sunken"}`,children:[e.jsx(F,{className:"w-3 h-3 shrink-0 text-accent/60"}),e.jsx("span",{className:"flex-1",children:i}),p&&e.jsx(H,{className:"w-3 h-3 shrink-0"})]},i)})})]})}function we({options:t,selected:n,onChange:x,placeholder:h}){const[d,j]=m.useState(!1),a=m.useRef(null);m.useEffect(()=>{const l=s=>{a.current&&!a.current.contains(s.target)&&j(!1)};return document.addEventListener("mousedown",l),()=>document.removeEventListener("mousedown",l)},[]);const u=l=>{x(n.includes(l)?n.filter(s=>s!==l):[...n,l])},f=l=>{x(n.filter(s=>s!==l))},g=h??"Add workflows...";return e.jsxs("div",{ref:a,className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>j(!d),className:"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none",children:[n.length===0&&e.jsx("span",{className:"text-xs text-text-tertiary",children:g}),n.map(l=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px] font-mono",children:[e.jsx(T,{className:"w-2.5 h-2.5 shrink-0 text-accent/75"}),l,e.jsx("span",{role:"button",onClick:s=>{s.stopPropagation(),f(l)},className:"ml-0.5 hover:text-status-error transition-colors",children:e.jsx(z,{className:"w-2.5 h-2.5"})})]},l)),e.jsx(B,{className:`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${d?"rotate-180":""}`})]}),d&&e.jsx("div",{className:"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto",children:t.length===0?e.jsx("p",{className:"px-3 py-2 text-xs text-text-tertiary",children:"No registered workflows"}):t.map(l=>{const s=n.includes(l);return e.jsxs("button",{type:"button",onClick:()=>u(l),className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs font-mono transition-colors ${s?"bg-accent/[0.06] text-accent":"text-text-primary hover:bg-surface-sunken"}`,children:[e.jsx(T,{className:"w-3 h-3 shrink-0 text-accent/60"}),e.jsx("span",{className:"flex-1",children:l}),s&&e.jsx(H,{className:"w-3 h-3 shrink-0"})]},l)})})]})}function q(t){return t.split(",").map(n=>n.trim()).filter(Boolean)}const W={workflow_type:"",description:"",task_queue:"",default_role:"reviewer",invocable:!1,roles:"",invocation_roles:"",consumes:"",envelope_schema:"",resolver_schema:"",cron_schedule:"",execute_as:"",certified:!1};function je(t){const n=(t.roles??[]).join(", "),x=(t.consumes??[]).join(", ");return{workflow_type:t.workflow_type,description:t.description??"",task_queue:t.task_queue??"",default_role:t.default_role,invocable:t.invocable,roles:n,invocation_roles:(t.invocation_roles??[]).join(", "),consumes:x,envelope_schema:t.envelope_schema?JSON.stringify(t.envelope_schema,null,2):"",resolver_schema:t.resolver_schema?JSON.stringify(t.resolver_schema,null,2):"",cron_schedule:t.cron_schedule??"",execute_as:t.execute_as??"",certified:!!(n||x)}}function S(t){if(!t.trim())return!0;try{return JSON.parse(t),!0}catch{return!1}}function E({icon:t,color:n,children:x}){return e.jsxs("div",{className:"flex items-center gap-2 mb-4 pb-2 border-b border-surface-border",children:[e.jsx(t,{className:`w-4 h-4 ${n}`,strokeWidth:1.5}),e.jsx("h2",{className:"section-h2",children:x})]})}function v({label:t,hint:n,children:x}){return e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"label",children:t}),x,n&&e.jsx("p",{className:"hint",children:n})]})}const A="input-json w-full";function R(t){return q(t)}function I(t){return t.join(", ")}const ge=new Set(["mcpQuery","mcpDeterministic","mcpQueryRouter","mcpTriage","mcpTriageRouter","mcpTriageDeterministic","insightQuery"]);function $e(){const{workflowType:t}=de(),n=!t,x=G(),[h]=xe(),{data:d,isLoading:j}=Y(),a=Z(),u=(d==null?void 0:d.find(r=>r.workflow_type===t))??null,{data:f}=ee({limit:500}),g=m.useMemo(()=>{const r=new Set((d??[]).map(y=>y.workflow_type));return[...new Set(((f==null?void 0:f.jobs)??[]).map(y=>y.entity))].filter(y=>!r.has(y)&&!ge.has(y)).sort()},[d,f]),l=m.useMemo(()=>{if(!n)return W;const r=h.get("workflow_type")??"",k=h.get("task_queue")??"";return r||k?{...W,workflow_type:r,task_queue:k}:W},[n,h]),[s,i]=m.useState(l),[p,N]=m.useState(""),[_,o]=m.useState(!1),c=m.useCallback((r,k)=>i(y=>({...y,[r]:k})),[]);m.useEffect(()=>{if(!_){if(n){i(l),o(!0);return}u&&(i(je(u)),o(!0))}},[u,n,_,l]);const w=()=>{if(!s.workflow_type.trim())return;N("");let r=null,k=null;try{s.envelope_schema.trim()&&(r=JSON.parse(s.envelope_schema))}catch{N("Invalid JSON in Envelope Schema");return}try{s.resolver_schema.trim()&&(k=JSON.parse(s.resolver_schema))}catch{N("Invalid JSON in Resolver Schema");return}a.mutate({workflow_type:s.workflow_type.trim(),description:s.description.trim()||null,task_queue:s.task_queue.trim()||null,default_role:s.default_role.trim()||"reviewer",invocable:s.invocable,roles:q(s.roles),invocation_roles:q(s.invocation_roles),consumes:q(s.consumes),envelope_schema:r,resolver_schema:k,cron_schedule:s.cron_schedule.trim()||null,execute_as:s.execute_as.trim()||null},{onSuccess:()=>x("/workflows/registry")})};if(j)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]});if(!n&&!u)return e.jsx("p",{className:"text-sm text-text-secondary",children:"Config not found."});const b=!!s.workflow_type.trim()&&S(s.envelope_schema)&&S(s.resolver_schema),C=n&&!s.workflow_type&&g.length>0;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-start justify-between mb-8",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-light font-mono text-text-primary",children:n?"New Workflow":(u==null?void 0:u.workflow_type)??""}),u&&e.jsx("div",{className:"flex items-center gap-2 mt-2",children:e.jsx(pe,{namespace:"durable"})})]}),e.jsxs("div",{className:"flex items-center gap-3 mt-1",children:[e.jsx("button",{onClick:()=>x("/workflows/registry"),className:"btn-ghost text-xs",children:"Cancel"}),e.jsx("button",{onClick:w,disabled:!b||a.isPending,className:"btn-primary text-xs",children:a.isPending?"Saving…":n?"Register":"Save"})]})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-x-14 gap-y-10",children:[e.jsxs("div",{children:[e.jsx(E,{icon:ce,color:"text-accent",children:"Identity"}),e.jsxs("div",{className:"space-y-5",children:[e.jsx(v,{label:"Workflow Type",hint:"Register a workflow to configure invocation and HITL escalation routing.",children:C?e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-xs text-text-secondary",children:"Select a durable workflow to register:"}),e.jsx("div",{className:"grid gap-1",children:g.map(r=>e.jsx("button",{onClick:()=>c("workflow_type",r),className:"flex items-center gap-2 px-3 py-2 text-left text-xs font-mono rounded-md border border-surface-border hover:border-accent/50 hover:bg-accent/[0.04] transition-colors",children:r},r))}),e.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[e.jsx("span",{className:"text-[10px] text-text-tertiary",children:"or"}),e.jsx("input",{type:"text",onChange:r=>c("workflow_type",r.target.value),placeholder:"Enter type manually",className:"input font-mono flex-1"})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",value:s.workflow_type,onChange:r=>c("workflow_type",r.target.value),disabled:!n,placeholder:"reviewContent",className:"input font-mono w-full"}),n&&s.workflow_type&&g.length>0&&e.jsx("button",{onClick:()=>c("workflow_type",""),className:"text-[10px] text-accent hover:underline mt-1",children:"Choose from durable workflows"})]})}),e.jsx(v,{label:"Description",children:e.jsx("input",{type:"text",value:s.description,onChange:r=>c("description",r.target.value),placeholder:"Describe what this workflow does",className:"input text-xs w-full"})}),e.jsx(v,{label:"Task Queue",hint:"Durable task queue this workflow listens on.",children:e.jsx("input",{type:"text",value:s.task_queue,onChange:r=>c("task_queue",r.target.value),placeholder:"lt-review",className:"input font-mono w-full"})})]})]}),e.jsxs("div",{children:[e.jsx(E,{icon:Q,color:"text-emerald-400",children:"Invocation"}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:s.invocable,onChange:r=>c("invocable",r.target.checked),className:"w-4 h-4 rounded border-border accent-accent"}),e.jsx("span",{className:"text-xs text-text-primary font-medium",children:"Invocable"})]}),e.jsx("p",{className:"hint",children:"Allow this workflow to be started from the dashboard or API."})]}),s.invocable?e.jsxs(e.Fragment,{children:[e.jsx(v,{label:"Run As",hint:"Bot identity to run under. Default runs as the invoking user.",children:e.jsx(ue,{selected:s.execute_as,onChange:r=>c("execute_as",r)})}),e.jsx(v,{label:"Invocation Roles",hint:"Only users with these roles can start this workflow. Empty = all authenticated users.",children:e.jsx(P,{selected:R(s.invocation_roles),onChange:r=>c("invocation_roles",I(r)),placeholder:"Select roles…"})}),e.jsxs(v,{label:"Envelope Schema",hint:e.jsxs(e.Fragment,{children:["Pre-fills the JSON editor when invoking. Include ",e.jsx("code",{className:"font-mono",children:"data"})," (input) and optional ",e.jsx("code",{className:"font-mono",children:"metadata"}),"."]}),children:[e.jsx("textarea",{value:s.envelope_schema,onChange:r=>c("envelope_schema",r.target.value),placeholder:`{
2
2
  "data": {},
3
3
  "metadata": {}
4
4
  }`,className:A,rows:8,spellCheck:!1}),s.envelope_schema.trim()&&!S(s.envelope_schema)&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:"Invalid JSON"})]})]}):e.jsxs("p",{className:"text-[11px] text-text-tertiary py-2",children:["Enable ",e.jsx("span",{className:"font-medium text-text-secondary",children:"Invocable"})," to configure invocation roles and an input template."]})]})]}),e.jsxs("div",{children:[e.jsx(E,{icon:$,color:"text-violet-400",children:"Certification"}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs(v,{label:"Resolver Schema",hint:e.jsxs(e.Fragment,{children:["Default form for resolving escalations. Use ",e.jsx("code",{className:"font-mono",children:"properties"})," with ",e.jsx("code",{className:"font-mono",children:"type"}),", ",e.jsx("code",{className:"font-mono",children:"default"}),", ",e.jsx("code",{className:"font-mono",children:"description"}),"."]}),children:[e.jsx("textarea",{value:s.resolver_schema,onChange:r=>c("resolver_schema",r.target.value),placeholder:`{
@@ -6,4 +6,4 @@ import{a as m,j as e}from"./vendor-query-B2UbickB.js";import{d as V,h as X,u as
6
6
  "approved": { "type": "boolean", "default": false }
7
7
  }
8
8
  }`,className:A,rows:6,spellCheck:!1}),s.resolver_schema.trim()&&!S(s.resolver_schema)&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:"Invalid JSON"})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:s.certified,onChange:r=>c("certified",r.target.checked),className:"w-4 h-4 rounded border-border accent-accent"}),e.jsx("span",{className:"text-xs text-text-primary font-medium",children:"Certify for HITL Escalation"})]}),e.jsx("p",{className:"hint",children:"Certified workflows use the interceptor — failures escalate to human reviewers."})]}),s.certified?e.jsxs(e.Fragment,{children:[e.jsx(v,{label:"Default Escalation Role",hint:"Users assigned escalations by default.",children:e.jsx(P,{selected:R(s.default_role),onChange:r=>c("default_role",r[0]??""),single:!0,placeholder:"Select role…"})}),e.jsx(v,{label:"Escalation Roles",hint:"Users who can claim and resolve escalations.",children:e.jsx(P,{selected:R(s.roles),onChange:r=>c("roles",I(r)),placeholder:"Select roles…"})}),e.jsx(v,{label:"Consumes",hint:"Upstream workflows whose output is injected into this workflow's envelope.",children:e.jsx(we,{options:(d??[]).map(r=>r.workflow_type).filter(r=>r!==s.workflow_type),selected:R(s.consumes),onChange:r=>c("consumes",I(r)),placeholder:"Select dependencies…"})})]}):e.jsxs("p",{className:"text-[11px] text-text-tertiary py-2",children:["Enable ",e.jsx("span",{className:"font-medium text-text-secondary",children:"Certify"})," to add automatic escalation routing and role-based resolution."]}),u&&e.jsx("div",{className:"pt-4 border-t border-surface-border/50",children:e.jsxs("button",{onClick:()=>x("/workflows/registry"),className:"flex items-center gap-1.5 text-[11px] text-status-warning hover:underline",title:"Remove configuration",children:[e.jsx(M,{className:"w-3 h-3"})," Remove configuration"]})})]})]})]}),(p||a.error)&&e.jsx("p",{className:"text-xs text-status-error mt-8",children:p||a.error.message})]})}export{$e as WorkflowConfigDetailPage,De as WorkflowConfigsPage};
9
- //# sourceMappingURL=index-CDPBXB4e.js.map
9
+ //# sourceMappingURL=index-TiKh2Ctj.js.map