@hotmeshio/long-tail 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/build/api/domain.d.ts +14 -0
  2. package/build/api/domain.js +76 -0
  3. package/build/api/escalations/cancel.js +16 -1
  4. package/build/api/escalations/helpers.js +5 -0
  5. package/build/lib/db/schemas/030_domain_dictionary.sql +18 -0
  6. package/build/lib/events/escalation-wire.d.ts +9 -0
  7. package/build/lib/events/escalation-wire.js +69 -0
  8. package/build/lib/events/system-events.js +13 -5
  9. package/build/lib/json-path/pick.d.ts +14 -0
  10. package/build/lib/json-path/pick.js +51 -0
  11. package/build/routes/domain.d.ts +2 -0
  12. package/build/routes/domain.js +62 -0
  13. package/build/routes/index.js +2 -0
  14. package/build/routes/mcp-endpoint.js +4 -1
  15. package/build/services/domain/index.d.ts +4 -0
  16. package/build/services/domain/index.js +14 -0
  17. package/build/services/domain/read.d.ts +21 -0
  18. package/build/services/domain/read.js +78 -0
  19. package/build/services/domain/seed.d.ts +11 -0
  20. package/build/services/domain/seed.js +65 -0
  21. package/build/services/domain/sql.d.ts +10 -0
  22. package/build/services/domain/sql.js +29 -0
  23. package/build/services/domain/validate.d.ts +29 -0
  24. package/build/services/domain/validate.js +50 -0
  25. package/build/services/domain/write.d.ts +23 -0
  26. package/build/services/domain/write.js +43 -0
  27. package/build/services/escalation/aggregate-validate.js +6 -0
  28. package/build/services/escalation/crud.js +16 -12
  29. package/build/services/escalation/facet-sql.js +10 -0
  30. package/build/services/mcp/db-server/schemas.d.ts +1 -1
  31. package/build/services/mcp/external-server.js +65 -27
  32. package/build/services/role/index.d.ts +2 -0
  33. package/build/services/role/index.js +7 -0
  34. package/build/services/role/sql.d.ts +1 -0
  35. package/build/services/role/sql.js +3 -1
  36. package/build/services/role/types.d.ts +17 -1
  37. package/build/services/role/types.js +16 -0
  38. package/build/start/workers.js +6 -0
  39. package/build/system/index.js +17 -0
  40. package/build/system/mcp-servers/admin/domain-context.d.ts +14 -0
  41. package/build/system/mcp-servers/admin/domain-context.js +220 -0
  42. package/build/system/mcp-servers/admin/exports.js +7 -4
  43. package/build/system/mcp-servers/admin/index.js +5 -5
  44. package/build/system/mcp-servers/admin/pipelines.js +9 -3
  45. package/build/system/mcp-servers/admin/schemas.d.ts +61 -32
  46. package/build/system/mcp-servers/admin/schemas.js +23 -5
  47. package/build/system/mcp-servers/admin/workflows.js +26 -0
  48. package/build/system/mcp-servers/db-query/schemas.d.ts +1 -1
  49. package/build/system/mcp-servers/human-queue-schemas.d.ts +1 -1
  50. package/build/system/seed/tool-manifests-admin.d.ts +115 -969
  51. package/build/system/seed/tool-manifests-admin.js +8 -10
  52. package/build/tsconfig.tsbuildinfo +1 -1
  53. package/build/types/domain-manifest.d.ts +77 -0
  54. package/build/types/domain-manifest.js +16 -0
  55. package/build/types/facets.d.ts +8 -0
  56. package/build/types/index.d.ts +2 -1
  57. package/build/types/index.js +2 -1
  58. package/build/types/startup.d.ts +10 -0
  59. package/dashboard/dist/assets/{AdminDashboard-DJ3LJQ09.js → AdminDashboard-CahUELrr.js} +2 -2
  60. package/dashboard/dist/assets/{AdminDashboard-DJ3LJQ09.js.map → AdminDashboard-CahUELrr.js.map} +1 -1
  61. package/dashboard/dist/assets/{AgentConfigPage-BMMvaD0z.js → AgentConfigPage-CkMv-cTV.js} +2 -2
  62. package/dashboard/dist/assets/{AgentConfigPage-BMMvaD0z.js.map → AgentConfigPage-CkMv-cTV.js.map} +1 -1
  63. package/dashboard/dist/assets/{AgentDetailPage-C6wfsnRe.js → AgentDetailPage-ZGea3Z4A.js} +2 -2
  64. package/dashboard/dist/assets/{AgentDetailPage-C6wfsnRe.js.map → AgentDetailPage-ZGea3Z4A.js.map} +1 -1
  65. package/dashboard/dist/assets/{AgentsPage-Cwqka7nE.js → AgentsPage-BMWSUJGi.js} +2 -2
  66. package/dashboard/dist/assets/{AgentsPage-Cwqka7nE.js.map → AgentsPage-BMWSUJGi.js.map} +1 -1
  67. package/dashboard/dist/assets/AvailableEscalationsPage-BjsbfsWW.js +2 -0
  68. package/dashboard/dist/assets/AvailableEscalationsPage-BjsbfsWW.js.map +1 -0
  69. package/dashboard/dist/assets/{BotPicker-BBkJBXZB.js → BotPicker-DN8tq7pz.js} +2 -2
  70. package/dashboard/dist/assets/{BotPicker-BBkJBXZB.js.map → BotPicker-DN8tq7pz.js.map} +1 -1
  71. package/dashboard/dist/assets/CapabilitiesPage-EAO3Ae0S.js +2 -0
  72. package/dashboard/dist/assets/CapabilitiesPage-EAO3Ae0S.js.map +1 -0
  73. package/dashboard/dist/assets/{CollapsibleSection-B3FsrHwH.js → CollapsibleSection-J-RejbjG.js} +2 -2
  74. package/dashboard/dist/assets/{CollapsibleSection-B3FsrHwH.js.map → CollapsibleSection-J-RejbjG.js.map} +1 -1
  75. package/dashboard/dist/assets/{CountdownTimer-B3nCqJdC.js → CountdownTimer-Dw8N9tmQ.js} +2 -2
  76. package/dashboard/dist/assets/{CountdownTimer-B3nCqJdC.js.map → CountdownTimer-Dw8N9tmQ.js.map} +1 -1
  77. package/dashboard/dist/assets/{CredentialsPage-Bv875IHe.js → CredentialsPage-CTurxwRn.js} +2 -2
  78. package/dashboard/dist/assets/{CredentialsPage-Bv875IHe.js.map → CredentialsPage-CTurxwRn.js.map} +1 -1
  79. package/dashboard/dist/assets/{CronLabel-CSzjWuwj.js → CronLabel-DZ5TmIQG.js} +2 -2
  80. package/dashboard/dist/assets/{CronLabel-CSzjWuwj.js.map → CronLabel-DZ5TmIQG.js.map} +1 -1
  81. package/dashboard/dist/assets/{CustomDurationPicker-CCpqf3e4.js → CustomDurationPicker-BES_FTrm.js} +2 -2
  82. package/dashboard/dist/assets/{CustomDurationPicker-CCpqf3e4.js.map → CustomDurationPicker-BES_FTrm.js.map} +1 -1
  83. package/dashboard/dist/assets/{DropZone-CJkk-U3o.js → DropZone-BWD9aGOz.js} +2 -2
  84. package/dashboard/dist/assets/{DropZone-CJkk-U3o.js.map → DropZone-BWD9aGOz.js.map} +1 -1
  85. package/dashboard/dist/assets/{ElapsedCell-WV6pUaKo.js → ElapsedCell-CIGRporU.js} +2 -2
  86. package/dashboard/dist/assets/{ElapsedCell-WV6pUaKo.js.map → ElapsedCell-CIGRporU.js.map} +1 -1
  87. package/dashboard/dist/assets/EntityTimelinePanel-CKIFsDOB.js +2 -0
  88. package/dashboard/dist/assets/EntityTimelinePanel-CKIFsDOB.js.map +1 -0
  89. package/dashboard/dist/assets/{EscalationListSchemaPage-CTQCALw4.js → EscalationListSchemaPage-DOrv-quD.js} +2 -2
  90. package/dashboard/dist/assets/{EscalationListSchemaPage-CTQCALw4.js.map → EscalationListSchemaPage-DOrv-quD.js.map} +1 -1
  91. package/dashboard/dist/assets/{EscalationSchemaPage-D_UgP0pv.js → EscalationSchemaPage-DAOVAxAM.js} +2 -2
  92. package/dashboard/dist/assets/{EscalationSchemaPage-D_UgP0pv.js.map → EscalationSchemaPage-DAOVAxAM.js.map} +1 -1
  93. package/dashboard/dist/assets/{EscalationsOverview-DuIUyxr0.js → EscalationsOverview-B27sDn5O.js} +2 -2
  94. package/dashboard/dist/assets/{EscalationsOverview-DuIUyxr0.js.map → EscalationsOverview-B27sDn5O.js.map} +1 -1
  95. package/dashboard/dist/assets/{EventTable-BV6unphX.js → EventTable-Co1d40Qq.js} +2 -2
  96. package/dashboard/dist/assets/{EventTable-BV6unphX.js.map → EventTable-Co1d40Qq.js.map} +1 -1
  97. package/dashboard/dist/assets/{FilterBar-DYFgzXNB.js → FilterBar-2ZfU21EA.js} +2 -2
  98. package/dashboard/dist/assets/{FilterBar-DYFgzXNB.js.map → FilterBar-2ZfU21EA.js.map} +1 -1
  99. package/dashboard/dist/assets/{GraphInvokePage-BGHVUipJ.js → GraphInvokePage-pdvc9VSv.js} +2 -2
  100. package/dashboard/dist/assets/{GraphInvokePage-BGHVUipJ.js.map → GraphInvokePage-pdvc9VSv.js.map} +1 -1
  101. package/dashboard/dist/assets/{HomePage-B-S2cK3E.js → HomePage-CLlDsBnw.js} +2 -2
  102. package/dashboard/dist/assets/{HomePage-B-S2cK3E.js.map → HomePage-CLlDsBnw.js.map} +1 -1
  103. package/dashboard/dist/assets/{ListToolbar-Bl7F3A28.js → ListToolbar-DMremj2e.js} +2 -2
  104. package/dashboard/dist/assets/{ListToolbar-Bl7F3A28.js.map → ListToolbar-DMremj2e.js.map} +1 -1
  105. package/dashboard/dist/assets/{McpOverview-_T9IsCD_.js → McpOverview-BhztmhoL.js} +2 -2
  106. package/dashboard/dist/assets/{McpOverview-_T9IsCD_.js.map → McpOverview-BhztmhoL.js.map} +1 -1
  107. package/dashboard/dist/assets/{McpQueryDetailPage-DtsVqKPw.js → McpQueryDetailPage-BseZfrhc.js} +2 -2
  108. package/dashboard/dist/assets/{McpQueryDetailPage-DtsVqKPw.js.map → McpQueryDetailPage-BseZfrhc.js.map} +1 -1
  109. package/dashboard/dist/assets/{McpQueryPage-DX5u-1bx.js → McpQueryPage-DMzkble7.js} +2 -2
  110. package/dashboard/dist/assets/{McpQueryPage-DX5u-1bx.js.map → McpQueryPage-DMzkble7.js.map} +1 -1
  111. package/dashboard/dist/assets/{McpRunDetailPage-BhcqqtYS.js → McpRunDetailPage-DqaBQAnn.js} +2 -2
  112. package/dashboard/dist/assets/{McpRunDetailPage-BhcqqtYS.js.map → McpRunDetailPage-DqaBQAnn.js.map} +1 -1
  113. package/dashboard/dist/assets/{McpRunsPage-L-1y8wnX.js → McpRunsPage-Du8GnHFv.js} +2 -2
  114. package/dashboard/dist/assets/{McpRunsPage-L-1y8wnX.js.map → McpRunsPage-Du8GnHFv.js.map} +1 -1
  115. package/dashboard/dist/assets/{NamespacePill-in1SLd0W.js → NamespacePill-C09QuOEz.js} +2 -2
  116. package/dashboard/dist/assets/{NamespacePill-in1SLd0W.js.map → NamespacePill-C09QuOEz.js.map} +1 -1
  117. package/dashboard/dist/assets/OperationsPage-CL2feqwS.js +3 -0
  118. package/dashboard/dist/assets/OperationsPage-CL2feqwS.js.map +1 -0
  119. package/dashboard/dist/assets/{OperatorDashboard-CIbDzOlh.js → OperatorDashboard-BHiGQZN_.js} +2 -2
  120. package/dashboard/dist/assets/{OperatorDashboard-CIbDzOlh.js.map → OperatorDashboard-BHiGQZN_.js.map} +1 -1
  121. package/dashboard/dist/assets/{PageHeader-BJgWMZtw.js → PageHeader-B7YJxa4o.js} +2 -2
  122. package/dashboard/dist/assets/{PageHeader-BJgWMZtw.js.map → PageHeader-B7YJxa4o.js.map} +1 -1
  123. package/dashboard/dist/assets/{PageHeaderWithStats-Ccio4vyG.js → PageHeaderWithStats-gT-5ovJh.js} +2 -2
  124. package/dashboard/dist/assets/{PageHeaderWithStats-Ccio4vyG.js.map → PageHeaderWithStats-gT-5ovJh.js.map} +1 -1
  125. package/dashboard/dist/assets/{PersonaDetailPage-BOaf0TW1.js → PersonaDetailPage-D6GGZgUS.js} +2 -2
  126. package/dashboard/dist/assets/{PersonaDetailPage-BOaf0TW1.js.map → PersonaDetailPage-D6GGZgUS.js.map} +1 -1
  127. package/dashboard/dist/assets/PersonasPage-BQYCdmAs.js +2 -0
  128. package/dashboard/dist/assets/PersonasPage-BQYCdmAs.js.map +1 -0
  129. package/dashboard/dist/assets/{ProcessDetailPage-DN9NqfeP.js → ProcessDetailPage-P45jOLim.js} +2 -2
  130. package/dashboard/dist/assets/{ProcessDetailPage-DN9NqfeP.js.map → ProcessDetailPage-P45jOLim.js.map} +1 -1
  131. package/dashboard/dist/assets/{ProcessesListPage-CfQEWaD4.js → ProcessesListPage-CgdzgCY6.js} +2 -2
  132. package/dashboard/dist/assets/{ProcessesListPage-CfQEWaD4.js.map → ProcessesListPage-CgdzgCY6.js.map} +1 -1
  133. package/dashboard/dist/assets/{RoleDetailPage-BC5HL7ls.js → RoleDetailPage-Dme2pa9z.js} +2 -2
  134. package/dashboard/dist/assets/{RoleDetailPage-BC5HL7ls.js.map → RoleDetailPage-Dme2pa9z.js.map} +1 -1
  135. package/dashboard/dist/assets/{RolePill-BNAP-uK6.js → RolePill-CtYI1_k1.js} +2 -2
  136. package/dashboard/dist/assets/{RolePill-BNAP-uK6.js.map → RolePill-CtYI1_k1.js.map} +1 -1
  137. package/dashboard/dist/assets/RolesPage-Ci7_PbPt.js +2 -0
  138. package/dashboard/dist/assets/RolesPage-Ci7_PbPt.js.map +1 -0
  139. package/dashboard/dist/assets/{RunAsSelector-twbuX7fB.js → RunAsSelector-CB0pV097.js} +2 -2
  140. package/dashboard/dist/assets/{RunAsSelector-twbuX7fB.js.map → RunAsSelector-CB0pV097.js.map} +1 -1
  141. package/dashboard/dist/assets/{ScanCodesPage-CPNg6K--.js → ScanCodesPage-DpbPhAj1.js} +2 -2
  142. package/dashboard/dist/assets/{ScanCodesPage-CPNg6K--.js.map → ScanCodesPage-DpbPhAj1.js.map} +1 -1
  143. package/dashboard/dist/assets/ScanSchemeDetailPage-CGnMGlt0.js +2 -0
  144. package/dashboard/dist/assets/ScanSchemeDetailPage-CGnMGlt0.js.map +1 -0
  145. package/dashboard/dist/assets/ScanStationPage-BTeV7TGy.js +2 -0
  146. package/dashboard/dist/assets/ScanStationPage-BTeV7TGy.js.map +1 -0
  147. package/dashboard/dist/assets/{ScopeBadge-BG7KkZ8Q.js → ScopeBadge-B76rOtA0.js} +2 -2
  148. package/dashboard/dist/assets/{ScopeBadge-BG7KkZ8Q.js.map → ScopeBadge-B76rOtA0.js.map} +1 -1
  149. package/dashboard/dist/assets/{StickyPagination-DIeYMPPd.js → StickyPagination-DH-0JEyx.js} +2 -2
  150. package/dashboard/dist/assets/{StickyPagination-DIeYMPPd.js.map → StickyPagination-DH-0JEyx.js.map} +1 -1
  151. package/dashboard/dist/assets/{StreamMessageDetail-gU4CUeQI.js → StreamMessageDetail-u-pDrHfS.js} +2 -2
  152. package/dashboard/dist/assets/{StreamMessageDetail-gU4CUeQI.js.map → StreamMessageDetail-u-pDrHfS.js.map} +1 -1
  153. package/dashboard/dist/assets/{SwimlaneTimeline-Br-nBA4l.js → SwimlaneTimeline-vN1N8BGy.js} +2 -2
  154. package/dashboard/dist/assets/{SwimlaneTimeline-Br-nBA4l.js.map → SwimlaneTimeline-vN1N8BGy.js.map} +1 -1
  155. package/dashboard/dist/assets/{TagInput-CvM5n6ww.js → TagInput-BQAPOp17.js} +2 -2
  156. package/dashboard/dist/assets/{TagInput-CvM5n6ww.js.map → TagInput-BQAPOp17.js.map} +1 -1
  157. package/dashboard/dist/assets/{TaskDetailPage-_9cr_R0u.js → TaskDetailPage-CAQm6avs.js} +2 -2
  158. package/dashboard/dist/assets/{TaskDetailPage-_9cr_R0u.js.map → TaskDetailPage-CAQm6avs.js.map} +1 -1
  159. package/dashboard/dist/assets/{TaskQueuePill-D4JPHXOq.js → TaskQueuePill-C2NImrwl.js} +2 -2
  160. package/dashboard/dist/assets/{TaskQueuePill-D4JPHXOq.js.map → TaskQueuePill-C2NImrwl.js.map} +1 -1
  161. package/dashboard/dist/assets/{TasksListPage-DVENC9Jp.js → TasksListPage-C1bT3DT9.js} +2 -2
  162. package/dashboard/dist/assets/{TasksListPage-DVENC9Jp.js.map → TasksListPage-C1bT3DT9.js.map} +1 -1
  163. package/dashboard/dist/assets/{TimeAgo-C9yYnOui.js → TimeAgo-qZxkJ8Am.js} +2 -2
  164. package/dashboard/dist/assets/{TimeAgo-C9yYnOui.js.map → TimeAgo-qZxkJ8Am.js.map} +1 -1
  165. package/dashboard/dist/assets/{TimestampCell-DoB8cYgw.js → TimestampCell-CC3dz6FG.js} +2 -2
  166. package/dashboard/dist/assets/{TimestampCell-DoB8cYgw.js.map → TimestampCell-CC3dz6FG.js.map} +1 -1
  167. package/dashboard/dist/assets/{ToolPill-BUjbC-Tj.js → ToolPill-FOZm67TS.js} +2 -2
  168. package/dashboard/dist/assets/{ToolPill-BUjbC-Tj.js.map → ToolPill-FOZm67TS.js.map} +1 -1
  169. package/dashboard/dist/assets/{ToolTestPanel-CBtsIP8K.js → ToolTestPanel-C3sSQUvw.js} +2 -2
  170. package/dashboard/dist/assets/{ToolTestPanel-CBtsIP8K.js.map → ToolTestPanel-C3sSQUvw.js.map} +1 -1
  171. package/dashboard/dist/assets/{TopicDetailPage-mR4Jaz83.js → TopicDetailPage-ClI0I8Mu.js} +2 -2
  172. package/dashboard/dist/assets/{TopicDetailPage-mR4Jaz83.js.map → TopicDetailPage-ClI0I8Mu.js.map} +1 -1
  173. package/dashboard/dist/assets/{TopicsPage-CP7HFxIC.js → TopicsPage-CNf2VZud.js} +2 -2
  174. package/dashboard/dist/assets/{TopicsPage-CP7HFxIC.js.map → TopicsPage-CNf2VZud.js.map} +1 -1
  175. package/dashboard/dist/assets/{UserName-BnLF6yhz.js → UserName-BdMHmyL3.js} +2 -2
  176. package/dashboard/dist/assets/{UserName-BnLF6yhz.js.map → UserName-BdMHmyL3.js.map} +1 -1
  177. package/dashboard/dist/assets/{WorkflowExecutionPage-xL956RZi.js → WorkflowExecutionPage-Ba4mYFoW.js} +2 -2
  178. package/dashboard/dist/assets/{WorkflowExecutionPage-xL956RZi.js.map → WorkflowExecutionPage-Ba4mYFoW.js.map} +1 -1
  179. package/dashboard/dist/assets/{WorkflowPill-tXU0-eXu.js → WorkflowPill-C5TEWlfO.js} +2 -2
  180. package/dashboard/dist/assets/{WorkflowPill-tXU0-eXu.js.map → WorkflowPill-C5TEWlfO.js.map} +1 -1
  181. package/dashboard/dist/assets/{WorkflowsDashboard-B-u7zFKM.js → WorkflowsDashboard-ImEm16tX.js} +2 -2
  182. package/dashboard/dist/assets/{WorkflowsDashboard-B-u7zFKM.js.map → WorkflowsDashboard-ImEm16tX.js.map} +1 -1
  183. package/dashboard/dist/assets/{WorkflowsOverview-CqZVarK-.js → WorkflowsOverview-BpWyV_tj.js} +2 -2
  184. package/dashboard/dist/assets/{WorkflowsOverview-CqZVarK-.js.map → WorkflowsOverview-BpWyV_tj.js.map} +1 -1
  185. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DiFLavW0.js → YamlWorkflowDetailPage-BFBlw1YY.js} +2 -2
  186. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DiFLavW0.js.map → YamlWorkflowDetailPage-BFBlw1YY.js.map} +1 -1
  187. package/dashboard/dist/assets/{YamlWorkflowsPage-BuQM6uZA.js → YamlWorkflowsPage-C9gxapRg.js} +2 -2
  188. package/dashboard/dist/assets/{YamlWorkflowsPage-BuQM6uZA.js.map → YamlWorkflowsPage-C9gxapRg.js.map} +1 -1
  189. package/dashboard/dist/assets/{agents-DU9GPovp.js → agents-BJQtJTiz.js} +2 -2
  190. package/dashboard/dist/assets/{agents-DU9GPovp.js.map → agents-BJQtJTiz.js.map} +1 -1
  191. package/dashboard/dist/assets/{bots-Cy-Hmg7w.js → bots-DDlU1gMy.js} +2 -2
  192. package/dashboard/dist/assets/{bots-Cy-Hmg7w.js.map → bots-DDlU1gMy.js.map} +1 -1
  193. package/dashboard/dist/assets/{capabilities-sSJJqrp-.js → capabilities-qYrUpdid.js} +2 -2
  194. package/dashboard/dist/assets/{capabilities-sSJJqrp-.js.map → capabilities-qYrUpdid.js.map} +1 -1
  195. package/dashboard/dist/assets/{controlplane-TVCjDHQ-.js → controlplane-DnJ1VDTs.js} +2 -2
  196. package/dashboard/dist/assets/{controlplane-TVCjDHQ-.js.map → controlplane-DnJ1VDTs.js.map} +1 -1
  197. package/dashboard/dist/assets/{escalation-columns-BpkjKYGd.js → escalation-columns-BCnVWr_n.js} +2 -2
  198. package/dashboard/dist/assets/{escalation-columns-BpkjKYGd.js.map → escalation-columns-BCnVWr_n.js.map} +1 -1
  199. package/dashboard/dist/assets/{index-Dy-MMYti.js → index-04QQsxMp.js} +2 -2
  200. package/dashboard/dist/assets/{index-Dy-MMYti.js.map → index-04QQsxMp.js.map} +1 -1
  201. package/dashboard/dist/assets/{index-fgBDhnI6.js → index-B5q8ksfv.js} +2 -2
  202. package/dashboard/dist/assets/{index-fgBDhnI6.js.map → index-B5q8ksfv.js.map} +1 -1
  203. package/dashboard/dist/assets/{index-CtwbQ_-m.js → index-BAqQSgxn.js} +2 -2
  204. package/dashboard/dist/assets/{index-CtwbQ_-m.js.map → index-BAqQSgxn.js.map} +1 -1
  205. package/dashboard/dist/assets/{index-DOai950R.js → index-BHbO4F8Z.js} +2 -2
  206. package/dashboard/dist/assets/{index-DOai950R.js.map → index-BHbO4F8Z.js.map} +1 -1
  207. package/dashboard/dist/assets/{index-DTtHNC-D.js → index-BUpB9ezn.js} +2 -2
  208. package/dashboard/dist/assets/{index-DTtHNC-D.js.map → index-BUpB9ezn.js.map} +1 -1
  209. package/dashboard/dist/assets/{index-errgQT5x.js → index-C991QfUN.js} +23 -23
  210. package/dashboard/dist/assets/index-C991QfUN.js.map +1 -0
  211. package/dashboard/dist/assets/{index-7BP6FaCZ.js → index-CFlmubaP.js} +2 -2
  212. package/dashboard/dist/assets/{index-7BP6FaCZ.js.map → index-CFlmubaP.js.map} +1 -1
  213. package/dashboard/dist/assets/{index-BYNN9N1T.js → index-CroJTX8g.js} +2 -2
  214. package/dashboard/dist/assets/{index-BYNN9N1T.js.map → index-CroJTX8g.js.map} +1 -1
  215. package/dashboard/dist/assets/{index-BE0phFw0.js → index-CtAPxA03.js} +2 -2
  216. package/dashboard/dist/assets/{index-BE0phFw0.js.map → index-CtAPxA03.js.map} +1 -1
  217. package/dashboard/dist/assets/{index-CLPVqbVY.js → index-D-5F3Bw-.js} +2 -2
  218. package/dashboard/dist/assets/{index-CLPVqbVY.js.map → index-D-5F3Bw-.js.map} +1 -1
  219. package/dashboard/dist/assets/index-DhRdWzz0.js +6 -0
  220. package/dashboard/dist/assets/index-DhRdWzz0.js.map +1 -0
  221. package/dashboard/dist/assets/{index-DsWnVyVN.js → index-KotwPxGB.js} +2 -2
  222. package/dashboard/dist/assets/{index-DsWnVyVN.js.map → index-KotwPxGB.js.map} +1 -1
  223. package/dashboard/dist/assets/{index-Cfv86_L9.js → index-LiLVAQzB.js} +2 -2
  224. package/dashboard/dist/assets/{index-Cfv86_L9.js.map → index-LiLVAQzB.js.map} +1 -1
  225. package/dashboard/dist/assets/index-cFHoANSG.css +1 -0
  226. package/dashboard/dist/assets/{knowledge-arh4NfmL.js → knowledge-CnMeg8Rw.js} +2 -2
  227. package/dashboard/dist/assets/{knowledge-arh4NfmL.js.map → knowledge-CnMeg8Rw.js.map} +1 -1
  228. package/dashboard/dist/assets/{mcp-QGf5jHCo.js → mcp-CHPSFv7m.js} +2 -2
  229. package/dashboard/dist/assets/{mcp-QGf5jHCo.js.map → mcp-CHPSFv7m.js.map} +1 -1
  230. package/dashboard/dist/assets/{mcp-query-BEJN1nMZ.js → mcp-query-C19EGwdN.js} +2 -2
  231. package/dashboard/dist/assets/{mcp-query-BEJN1nMZ.js.map → mcp-query-C19EGwdN.js.map} +1 -1
  232. package/dashboard/dist/assets/{personas-DYtw1COf.js → personas-Br1Vo2S3.js} +2 -2
  233. package/dashboard/dist/assets/{personas-DYtw1COf.js.map → personas-Br1Vo2S3.js.map} +1 -1
  234. package/dashboard/dist/assets/{pipelines-Byi6PnbE.js → pipelines-QMrFoJZX.js} +2 -2
  235. package/dashboard/dist/assets/{pipelines-Byi6PnbE.js.map → pipelines-QMrFoJZX.js.map} +1 -1
  236. package/dashboard/dist/assets/{tasks-D0SQdENz.js → tasks-Doy_7cGX.js} +2 -2
  237. package/dashboard/dist/assets/{tasks-D0SQdENz.js.map → tasks-Doy_7cGX.js.map} +1 -1
  238. package/dashboard/dist/assets/{topics-DgDv5ZXP.js → topics-BcJS4G09.js} +2 -2
  239. package/dashboard/dist/assets/{topics-DgDv5ZXP.js.map → topics-BcJS4G09.js.map} +1 -1
  240. package/dashboard/dist/assets/{useEventHooks-DZaYzE7s.js → useEventHooks-ldE5o0ok.js} +2 -2
  241. package/dashboard/dist/assets/{useEventHooks-DZaYzE7s.js.map → useEventHooks-ldE5o0ok.js.map} +1 -1
  242. package/dashboard/dist/assets/{useNamespace-C1OqiNXN.js → useNamespace-CCu8fZc6.js} +2 -2
  243. package/dashboard/dist/assets/{useNamespace-C1OqiNXN.js.map → useNamespace-CCu8fZc6.js.map} +1 -1
  244. package/dashboard/dist/assets/{useYamlActivityEvents-CkmXDm-Z.js → useYamlActivityEvents-DDrXwFXX.js} +2 -2
  245. package/dashboard/dist/assets/{useYamlActivityEvents-CkmXDm-Z.js.map → useYamlActivityEvents-DDrXwFXX.js.map} +1 -1
  246. package/dashboard/dist/assets/{users-D4DCFPH1.js → users-BvKhSq1i.js} +2 -2
  247. package/dashboard/dist/assets/{users-D4DCFPH1.js.map → users-BvKhSq1i.js.map} +1 -1
  248. package/dashboard/dist/assets/{vendor-icons-BxuyFxH2.js → vendor-icons-Aw7bzBxa.js} +142 -137
  249. package/dashboard/dist/assets/vendor-icons-Aw7bzBxa.js.map +1 -0
  250. package/dashboard/dist/assets/{workflows-qyc0ku_5.js → workflows-D09ysQF1.js} +2 -2
  251. package/dashboard/dist/assets/{workflows-qyc0ku_5.js.map → workflows-D09ysQF1.js.map} +1 -1
  252. package/dashboard/dist/assets/{yaml-workflows-DWFww9Xn.js → yaml-workflows-BFHrxEl4.js} +2 -2
  253. package/dashboard/dist/assets/{yaml-workflows-DWFww9Xn.js.map → yaml-workflows-BFHrxEl4.js.map} +1 -1
  254. package/dashboard/dist/index.html +3 -3
  255. package/docs/domain-dictionary.md +115 -0
  256. package/docs/events.md +8 -0
  257. package/package.json +1 -1
  258. package/build/system/mcp-servers/admin/ortho.d.ts +0 -10
  259. package/build/system/mcp-servers/admin/ortho.js +0 -242
  260. package/dashboard/dist/assets/AvailableEscalationsPage-CVlG_AVC.js +0 -2
  261. package/dashboard/dist/assets/AvailableEscalationsPage-CVlG_AVC.js.map +0 -1
  262. package/dashboard/dist/assets/CapabilitiesPage-wxmE4917.js +0 -2
  263. package/dashboard/dist/assets/CapabilitiesPage-wxmE4917.js.map +0 -1
  264. package/dashboard/dist/assets/EntityTimelinePanel-DrL86Yrf.js +0 -2
  265. package/dashboard/dist/assets/EntityTimelinePanel-DrL86Yrf.js.map +0 -1
  266. package/dashboard/dist/assets/OperationsPage-i8KcDpKo.js +0 -3
  267. package/dashboard/dist/assets/OperationsPage-i8KcDpKo.js.map +0 -1
  268. package/dashboard/dist/assets/PersonasPage-DSdRb90f.js +0 -2
  269. package/dashboard/dist/assets/PersonasPage-DSdRb90f.js.map +0 -1
  270. package/dashboard/dist/assets/RolesPage-DCnW0VmD.js +0 -2
  271. package/dashboard/dist/assets/RolesPage-DCnW0VmD.js.map +0 -1
  272. package/dashboard/dist/assets/ScanSchemeDetailPage-DyLmCamO.js +0 -2
  273. package/dashboard/dist/assets/ScanSchemeDetailPage-DyLmCamO.js.map +0 -1
  274. package/dashboard/dist/assets/ScanStationPage-DoZccU5B.js +0 -2
  275. package/dashboard/dist/assets/ScanStationPage-DoZccU5B.js.map +0 -1
  276. package/dashboard/dist/assets/index-5TblaCXQ.css +0 -1
  277. package/dashboard/dist/assets/index-B7IaBPBg.js +0 -6
  278. package/dashboard/dist/assets/index-B7IaBPBg.js.map +0 -1
  279. package/dashboard/dist/assets/index-errgQT5x.js.map +0 -1
  280. package/dashboard/dist/assets/vendor-icons-BxuyFxH2.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{j as e}from"./vendor-query-RUZdMvN6.js";import{P as j}from"./PageHeader-BJgWMZtw.js";import{D as _}from"./DataTable-Bir0Xs1p.js";import{F as v,b as f}from"./FilterBar-DYFgzXNB.js";import{S as P}from"./StickyPagination-DIeYMPPd.js";import{L as N}from"./ListToolbar-Bl7F3A28.js";import{b as C}from"./api-path-u2Jf9QXS.js";import{T as h}from"./TimestampCell-DoB8cYgw.js";import{E as $}from"./ElapsedCell-WV6pUaKo.js";import{W}from"./WorkflowPill-tXU0-eXu.js";import{E as S}from"./EmptyState-lpUFYfun.js";import{R as c}from"./RowActions-eYrzgQSj.js";import{u as q}from"./useFilterParams-crmlBw_l.js";import{b as T}from"./useEventHooks-DZaYzE7s.js";import{u as D}from"./mcp-query-BEJN1nMZ.js";import{k as y,Y as B,_ as g,$ as k,a0 as F,a1 as L}from"./vendor-icons-BxuyFxH2.js";import{u as M}from"./vendor-react-CdqEC2zv.js";import"./index-errgQT5x.js";const E={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"};function p(s){return s.status==="completed"||Number(s.status)===0?"completed":s.is_live?"in_progress":"failed"}function R(s){return[{key:"workflow_id",label:"Workflow ID / Type",render:t=>{const o=p(t),a=E[o]??"bg-status-pending",l=o==="in_progress"?" animate-pulse":"";return e.jsxs("div",{className:"flex items-start gap-2 min-w-0",children:[e.jsx("span",{className:`w-2.5 h-2.5 shrink-0 rounded-full dot-ring mt-1 ${a}${l}`,title:o}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"font-mono text-xs text-text-primary truncate block",children:t.workflow_id}),e.jsx("div",{className:"mt-0.5",children:e.jsx(W,{type:t.entity||"unknown"})})]})]})}},{key:"created_at",label:"Created",render:t=>e.jsx(h,{date:t.created_at}),className:"w-40",sortable:!0},{key:"updated_at",label:"Updated",render:t=>e.jsx(h,{date:t.updated_at}),className:"w-40",sortable:!0},{key:"duration",label:"Duration",render:t=>{const o=p(t);return e.jsx($,{startDate:t.created_at,endDate:o==="in_progress"?null:t.updated_at,isLive:o==="in_progress"})},className:"w-28"},{key:"actions",label:"",className:"w-28",render:t=>{const a=p(t)==="completed",l=t.entity==="mcpWorkflowBuilder";if(t.entity==="mcpWorkflowPlanner"){const r=t.set_id?`/mcp/queries/${t.workflow_id}?mode=plan&set_id=${t.set_id}`:`/mcp/queries/${t.workflow_id}?mode=plan`;return e.jsxs(c,{children:[e.jsx("button",{onClick:n=>{n.stopPropagation(),s(`${r}&step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Plan",children:e.jsx(B,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:n=>{n.stopPropagation(),s(`${r}&step=2`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${a?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:a?"Build":"Planning...",disabled:!a,children:e.jsx(g,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]})}return l?e.jsxs(c,{children:[e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?mode=builder&step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Describe",children:e.jsx(k,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?mode=builder&step=2`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${a?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:a?"Profile":"Building...",disabled:!a,children:e.jsx(F,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]}):e.jsxs(c,{children:[e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Describe",children:e.jsx(k,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=2`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-status-warning transition-all",title:"Discover",children:e.jsx(L,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=3`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${a?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:a?"Compile":"Complete discovery first",disabled:!a,children:e.jsx(g,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]})}}]}function ae(){const s=M(),t=R(s),{filters:o,setFilter:a,pagination:l,sort:d,setSort:r}=q({filters:{search:"",status:"",type:""},pageSize:20}),{data:n,isLoading:m,refetch:b}=D({limit:l.pageSize,offset:l.offset,search:o.search,status:o.status,entity:o.type||void 0});T();const u=(n==null?void 0:n.jobs)??[],x=(n==null?void 0:n.total)??0;return e.jsxs(e.Fragment,{children:[e.jsx(j,{title:"MCP Tool Designer",docsHash:"#docs:dashboard.md:mcp-tool-designer",actions:e.jsxs("button",{onClick:()=>s("/mcp/queries/new"),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(y,{className:"w-3.5 h-3.5",strokeWidth:1.5}),"Create New MCP Tool"]})}),e.jsxs(v,{actions:e.jsx(N,{onRefresh:()=>b(),apiPath:C("/workflow-states/jobs",{entity:o.type||"mcpQuery,mcpTriage,mcpWorkflowPlanner",limit:l.pageSize,offset:l.offset,sort_by:"created_at",order:"desc",status:o.status||void 0,search:o.search||void 0})}),children:[e.jsx(f,{label:"Type",value:o.type,onChange:i=>a("type",i),options:[{value:"mcpQuery",label:"Discovery"},{value:"mcpWorkflowPlanner",label:"Build"},{value:"mcpTriage",label:"Triage"}]}),e.jsx(f,{label:"Status",value:o.status,onChange:i=>a("status",i),options:[{value:"completed",label:"Completed"},{value:"running",label:"Running"},{value:"failed",label:"Failed"}]})]}),e.jsx(_,{columns:t,data:u,keyFn:i=>i.workflow_id,onRowClick:i=>{if(i.entity==="mcpWorkflowPlanner"){const w=i.set_id?`/mcp/queries/${i.workflow_id}?mode=plan&set_id=${i.set_id}`:`/mcp/queries/${i.workflow_id}?mode=plan`;s(w)}else i.entity==="mcpWorkflowBuilder"?s(`/mcp/queries/${i.workflow_id}?mode=builder`):s(`/mcp/queries/${i.workflow_id}`)},isLoading:m,emptyMessage:"",sort:d,onSort:r}),!m&&u.length===0&&e.jsx("div",{className:"cursor-pointer",onClick:()=>s("/mcp/queries/new"),children:e.jsx(S,{icon:y,title:"No tool designs yet",description:"Click to create your first MCP tool"})}),e.jsx(P,{page:l.page,pageSize:l.pageSize,total:x,totalPages:l.totalPages(x),onPageChange:l.setPage})]})}export{ae as McpQueryPage};
2
- //# sourceMappingURL=McpQueryPage-DX5u-1bx.js.map
1
+ import{j as e}from"./vendor-query-RUZdMvN6.js";import{P as j}from"./PageHeader-B7YJxa4o.js";import{D as _}from"./DataTable-Bir0Xs1p.js";import{F as v,b as f}from"./FilterBar-2ZfU21EA.js";import{S as P}from"./StickyPagination-DH-0JEyx.js";import{L as N}from"./ListToolbar-DMremj2e.js";import{b as C}from"./api-path-u2Jf9QXS.js";import{T as h}from"./TimestampCell-CC3dz6FG.js";import{E as $}from"./ElapsedCell-CIGRporU.js";import{W}from"./WorkflowPill-C5TEWlfO.js";import{E as S}from"./EmptyState-lpUFYfun.js";import{R as c}from"./RowActions-eYrzgQSj.js";import{u as q}from"./useFilterParams-crmlBw_l.js";import{b as T}from"./useEventHooks-ldE5o0ok.js";import{u as D}from"./mcp-query-C19EGwdN.js";import{k as y,Y as B,_ as g,$ as k,a0 as F,a1 as L}from"./vendor-icons-Aw7bzBxa.js";import{u as M}from"./vendor-react-CdqEC2zv.js";import"./index-C991QfUN.js";const E={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"};function p(s){return s.status==="completed"||Number(s.status)===0?"completed":s.is_live?"in_progress":"failed"}function R(s){return[{key:"workflow_id",label:"Workflow ID / Type",render:t=>{const o=p(t),a=E[o]??"bg-status-pending",l=o==="in_progress"?" animate-pulse":"";return e.jsxs("div",{className:"flex items-start gap-2 min-w-0",children:[e.jsx("span",{className:`w-2.5 h-2.5 shrink-0 rounded-full dot-ring mt-1 ${a}${l}`,title:o}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"font-mono text-xs text-text-primary truncate block",children:t.workflow_id}),e.jsx("div",{className:"mt-0.5",children:e.jsx(W,{type:t.entity||"unknown"})})]})]})}},{key:"created_at",label:"Created",render:t=>e.jsx(h,{date:t.created_at}),className:"w-40",sortable:!0},{key:"updated_at",label:"Updated",render:t=>e.jsx(h,{date:t.updated_at}),className:"w-40",sortable:!0},{key:"duration",label:"Duration",render:t=>{const o=p(t);return e.jsx($,{startDate:t.created_at,endDate:o==="in_progress"?null:t.updated_at,isLive:o==="in_progress"})},className:"w-28"},{key:"actions",label:"",className:"w-28",render:t=>{const a=p(t)==="completed",l=t.entity==="mcpWorkflowBuilder";if(t.entity==="mcpWorkflowPlanner"){const r=t.set_id?`/mcp/queries/${t.workflow_id}?mode=plan&set_id=${t.set_id}`:`/mcp/queries/${t.workflow_id}?mode=plan`;return e.jsxs(c,{children:[e.jsx("button",{onClick:n=>{n.stopPropagation(),s(`${r}&step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Plan",children:e.jsx(B,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:n=>{n.stopPropagation(),s(`${r}&step=2`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${a?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:a?"Build":"Planning...",disabled:!a,children:e.jsx(g,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]})}return l?e.jsxs(c,{children:[e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?mode=builder&step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Describe",children:e.jsx(k,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?mode=builder&step=2`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${a?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:a?"Profile":"Building...",disabled:!a,children:e.jsx(F,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]}):e.jsxs(c,{children:[e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Describe",children:e.jsx(k,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=2`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-status-warning transition-all",title:"Discover",children:e.jsx(L,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=3`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${a?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:a?"Compile":"Complete discovery first",disabled:!a,children:e.jsx(g,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]})}}]}function ae(){const s=M(),t=R(s),{filters:o,setFilter:a,pagination:l,sort:d,setSort:r}=q({filters:{search:"",status:"",type:""},pageSize:20}),{data:n,isLoading:m,refetch:b}=D({limit:l.pageSize,offset:l.offset,search:o.search,status:o.status,entity:o.type||void 0});T();const u=(n==null?void 0:n.jobs)??[],x=(n==null?void 0:n.total)??0;return e.jsxs(e.Fragment,{children:[e.jsx(j,{title:"MCP Tool Designer",docsHash:"#docs:dashboard.md:mcp-tool-designer",actions:e.jsxs("button",{onClick:()=>s("/mcp/queries/new"),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(y,{className:"w-3.5 h-3.5",strokeWidth:1.5}),"Create New MCP Tool"]})}),e.jsxs(v,{actions:e.jsx(N,{onRefresh:()=>b(),apiPath:C("/workflow-states/jobs",{entity:o.type||"mcpQuery,mcpTriage,mcpWorkflowPlanner",limit:l.pageSize,offset:l.offset,sort_by:"created_at",order:"desc",status:o.status||void 0,search:o.search||void 0})}),children:[e.jsx(f,{label:"Type",value:o.type,onChange:i=>a("type",i),options:[{value:"mcpQuery",label:"Discovery"},{value:"mcpWorkflowPlanner",label:"Build"},{value:"mcpTriage",label:"Triage"}]}),e.jsx(f,{label:"Status",value:o.status,onChange:i=>a("status",i),options:[{value:"completed",label:"Completed"},{value:"running",label:"Running"},{value:"failed",label:"Failed"}]})]}),e.jsx(_,{columns:t,data:u,keyFn:i=>i.workflow_id,onRowClick:i=>{if(i.entity==="mcpWorkflowPlanner"){const w=i.set_id?`/mcp/queries/${i.workflow_id}?mode=plan&set_id=${i.set_id}`:`/mcp/queries/${i.workflow_id}?mode=plan`;s(w)}else i.entity==="mcpWorkflowBuilder"?s(`/mcp/queries/${i.workflow_id}?mode=builder`):s(`/mcp/queries/${i.workflow_id}`)},isLoading:m,emptyMessage:"",sort:d,onSort:r}),!m&&u.length===0&&e.jsx("div",{className:"cursor-pointer",onClick:()=>s("/mcp/queries/new"),children:e.jsx(S,{icon:y,title:"No tool designs yet",description:"Click to create your first MCP tool"})}),e.jsx(P,{page:l.page,pageSize:l.pageSize,total:x,totalPages:l.totalPages(x),onPageChange:l.setPage})]})}export{ae as McpQueryPage};
2
+ //# sourceMappingURL=McpQueryPage-DMzkble7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"McpQueryPage-DX5u-1bx.js","sources":["../../src/pages/mcp/McpQueryPage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { MessageSquare, Lightbulb, Layers, Wand2, Settings, GitBranch } from 'lucide-react';\n\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { buildApiPath } from '../../lib/api-path';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { EmptyState } from '../../components/common/display/EmptyState';\nimport { RowActionGroup } from '../../components/common/layout/RowActions';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { useMcpQueryJobs } from '../../api/mcp-query';\nimport type { LTJob } from '../../api/types';\n\nconst STATUS_DOT: Record<string, string> = {\n in_progress: 'bg-status-active',\n completed: 'bg-status-success',\n failed: 'bg-status-error',\n};\n\nfunction mapStatus(job: LTJob): string {\n if (job.status === 'completed') return 'completed';\n if (Number(job.status) === 0) return 'completed';\n if (job.is_live) return 'in_progress';\n return 'failed';\n}\n\nfunction buildColumns(navigate: ReturnType<typeof useNavigate>): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Workflow ID / Type',\n render: (row) => {\n const s = mapStatus(row);\n const dotClass = STATUS_DOT[s] ?? 'bg-status-pending';\n const pulseClass = s === 'in_progress' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-start gap-2 min-w-0\">\n <span className={`w-2.5 h-2.5 shrink-0 rounded-full dot-ring mt-1 ${dotClass}${pulseClass}`} title={s} />\n <div className=\"min-w-0\">\n <span className=\"font-mono text-xs text-text-primary truncate block\">\n {row.workflow_id}\n </span>\n <div className=\"mt-0.5\">\n <WorkflowPill type={row.entity || 'unknown'} />\n </div>\n </div>\n </div>\n );\n },\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n sortable: true,\n },\n {\n key: 'updated_at',\n label: 'Updated',\n render: (row) => <TimestampCell date={row.updated_at} />,\n className: 'w-40',\n sortable: true,\n },\n {\n key: 'duration',\n label: 'Duration',\n render: (row) => {\n const s = mapStatus(row);\n return (\n <ElapsedCell\n startDate={row.created_at}\n endDate={s === 'in_progress' ? null : row.updated_at}\n isLive={s === 'in_progress'}\n />\n );\n },\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n className: 'w-28',\n render: (row) => {\n const s = mapStatus(row);\n const isComplete = s === 'completed';\n const isBuilder = row.entity === 'mcpWorkflowBuilder';\n const isPlanner = row.entity === 'mcpWorkflowPlanner';\n\n if (isPlanner) {\n const planUrl = row.set_id\n ? `/mcp/queries/${row.workflow_id}?mode=plan&set_id=${row.set_id}`\n : `/mcp/queries/${row.workflow_id}?mode=plan`;\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`${planUrl}&step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Plan\"\n >\n <GitBranch className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`${planUrl}&step=2`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Build' : 'Planning...'}\n disabled={!isComplete}\n >\n <Layers className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n }\n\n if (isBuilder) {\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?mode=builder&step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Describe\"\n >\n <MessageSquare className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?mode=builder&step=2`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Profile' : 'Building...'}\n disabled={!isComplete}\n >\n <Settings className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n }\n\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Describe\"\n >\n <MessageSquare className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=2`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-status-warning transition-all\"\n title=\"Discover\"\n >\n <Lightbulb className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=3`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Compile' : 'Complete discovery first'}\n disabled={!isComplete}\n >\n <Layers className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n },\n },\n ];\n}\n\nexport function McpQueryPage() {\n const navigate = useNavigate();\n const columns = buildColumns(navigate);\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', status: '', type: '' },\n pageSize: 20,\n });\n\n const { data, isLoading, refetch } = useMcpQueryJobs({\n limit: pagination.pageSize,\n offset: pagination.offset,\n search: filters.search,\n status: filters.status,\n entity: filters.type || undefined,\n });\n\n useWorkflowListEvents();\n\n const jobs = data?.jobs ?? [];\n const total = data?.total ?? 0;\n\n return (\n <>\n <PageHeader\n title=\"MCP Tool Designer\"\n docsHash=\"#docs:dashboard.md:mcp-tool-designer\"\n actions={\n <button\n onClick={() => navigate('/mcp/queries/new')}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <Wand2 className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n Create New MCP Tool\n </button>\n }\n />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n apiPath={buildApiPath('/workflow-states/jobs', {\n entity: filters.type || 'mcpQuery,mcpTriage,mcpWorkflowPlanner',\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: 'created_at',\n order: 'desc',\n status: filters.status || undefined,\n search: filters.search || undefined,\n })}\n />\n }>\n <FilterSelect\n label=\"Type\"\n value={filters.type}\n onChange={(v) => setFilter('type', v)}\n options={[\n { value: 'mcpQuery', label: 'Discovery' },\n { value: 'mcpWorkflowPlanner', label: 'Build' },\n { value: 'mcpTriage', label: 'Triage' },\n ]}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'completed', label: 'Completed' },\n { value: 'running', label: 'Running' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => {\n if (row.entity === 'mcpWorkflowPlanner') {\n const url = row.set_id\n ? `/mcp/queries/${row.workflow_id}?mode=plan&set_id=${row.set_id}`\n : `/mcp/queries/${row.workflow_id}?mode=plan`;\n navigate(url);\n } else if (row.entity === 'mcpWorkflowBuilder') {\n navigate(`/mcp/queries/${row.workflow_id}?mode=builder`);\n } else {\n navigate(`/mcp/queries/${row.workflow_id}`);\n }\n }}\n isLoading={isLoading}\n emptyMessage=\"\"\n sort={sort}\n onSort={setSort}\n />\n\n {!isLoading && jobs.length === 0 && (\n <div className=\"cursor-pointer\" onClick={() => navigate('/mcp/queries/new')}>\n <EmptyState icon={Wand2} title=\"No tool designs yet\" description=\"Click to create your first MCP tool\" />\n </div>\n )}\n\n <StickyPagination\n page={pagination.page}\n pageSize={pagination.pageSize}\n total={total}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n />\n </>\n );\n}\n"],"names":["STATUS_DOT","mapStatus","job","buildColumns","navigate","row","s","dotClass","pulseClass","jsxs","jsx","WorkflowPill","TimestampCell","ElapsedCell","isComplete","isBuilder","planUrl","RowActionGroup","e","GitBranch","Layers","MessageSquare","Settings","Lightbulb","McpQueryPage","useNavigate","columns","filters","setFilter","pagination","sort","setSort","useFilterParams","data","isLoading","refetch","useMcpQueryJobs","useWorkflowListEvents","jobs","total","Fragment","PageHeader","Wand2","FilterBar","ListToolbar","buildApiPath","FilterSelect","v","DataTable","url","EmptyState","StickyPagination"],"mappings":"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"}
1
+ {"version":3,"file":"McpQueryPage-DMzkble7.js","sources":["../../src/pages/mcp/McpQueryPage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { MessageSquare, Lightbulb, Layers, Wand2, Settings, GitBranch } from 'lucide-react';\n\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { buildApiPath } from '../../lib/api-path';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { EmptyState } from '../../components/common/display/EmptyState';\nimport { RowActionGroup } from '../../components/common/layout/RowActions';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { useMcpQueryJobs } from '../../api/mcp-query';\nimport type { LTJob } from '../../api/types';\n\nconst STATUS_DOT: Record<string, string> = {\n in_progress: 'bg-status-active',\n completed: 'bg-status-success',\n failed: 'bg-status-error',\n};\n\nfunction mapStatus(job: LTJob): string {\n if (job.status === 'completed') return 'completed';\n if (Number(job.status) === 0) return 'completed';\n if (job.is_live) return 'in_progress';\n return 'failed';\n}\n\nfunction buildColumns(navigate: ReturnType<typeof useNavigate>): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Workflow ID / Type',\n render: (row) => {\n const s = mapStatus(row);\n const dotClass = STATUS_DOT[s] ?? 'bg-status-pending';\n const pulseClass = s === 'in_progress' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-start gap-2 min-w-0\">\n <span className={`w-2.5 h-2.5 shrink-0 rounded-full dot-ring mt-1 ${dotClass}${pulseClass}`} title={s} />\n <div className=\"min-w-0\">\n <span className=\"font-mono text-xs text-text-primary truncate block\">\n {row.workflow_id}\n </span>\n <div className=\"mt-0.5\">\n <WorkflowPill type={row.entity || 'unknown'} />\n </div>\n </div>\n </div>\n );\n },\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n sortable: true,\n },\n {\n key: 'updated_at',\n label: 'Updated',\n render: (row) => <TimestampCell date={row.updated_at} />,\n className: 'w-40',\n sortable: true,\n },\n {\n key: 'duration',\n label: 'Duration',\n render: (row) => {\n const s = mapStatus(row);\n return (\n <ElapsedCell\n startDate={row.created_at}\n endDate={s === 'in_progress' ? null : row.updated_at}\n isLive={s === 'in_progress'}\n />\n );\n },\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n className: 'w-28',\n render: (row) => {\n const s = mapStatus(row);\n const isComplete = s === 'completed';\n const isBuilder = row.entity === 'mcpWorkflowBuilder';\n const isPlanner = row.entity === 'mcpWorkflowPlanner';\n\n if (isPlanner) {\n const planUrl = row.set_id\n ? `/mcp/queries/${row.workflow_id}?mode=plan&set_id=${row.set_id}`\n : `/mcp/queries/${row.workflow_id}?mode=plan`;\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`${planUrl}&step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Plan\"\n >\n <GitBranch className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`${planUrl}&step=2`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Build' : 'Planning...'}\n disabled={!isComplete}\n >\n <Layers className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n }\n\n if (isBuilder) {\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?mode=builder&step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Describe\"\n >\n <MessageSquare className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?mode=builder&step=2`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Profile' : 'Building...'}\n disabled={!isComplete}\n >\n <Settings className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n }\n\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Describe\"\n >\n <MessageSquare className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=2`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-status-warning transition-all\"\n title=\"Discover\"\n >\n <Lightbulb className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=3`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Compile' : 'Complete discovery first'}\n disabled={!isComplete}\n >\n <Layers className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n },\n },\n ];\n}\n\nexport function McpQueryPage() {\n const navigate = useNavigate();\n const columns = buildColumns(navigate);\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', status: '', type: '' },\n pageSize: 20,\n });\n\n const { data, isLoading, refetch } = useMcpQueryJobs({\n limit: pagination.pageSize,\n offset: pagination.offset,\n search: filters.search,\n status: filters.status,\n entity: filters.type || undefined,\n });\n\n useWorkflowListEvents();\n\n const jobs = data?.jobs ?? [];\n const total = data?.total ?? 0;\n\n return (\n <>\n <PageHeader\n title=\"MCP Tool Designer\"\n docsHash=\"#docs:dashboard.md:mcp-tool-designer\"\n actions={\n <button\n onClick={() => navigate('/mcp/queries/new')}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <Wand2 className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n Create New MCP Tool\n </button>\n }\n />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n apiPath={buildApiPath('/workflow-states/jobs', {\n entity: filters.type || 'mcpQuery,mcpTriage,mcpWorkflowPlanner',\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: 'created_at',\n order: 'desc',\n status: filters.status || undefined,\n search: filters.search || undefined,\n })}\n />\n }>\n <FilterSelect\n label=\"Type\"\n value={filters.type}\n onChange={(v) => setFilter('type', v)}\n options={[\n { value: 'mcpQuery', label: 'Discovery' },\n { value: 'mcpWorkflowPlanner', label: 'Build' },\n { value: 'mcpTriage', label: 'Triage' },\n ]}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'completed', label: 'Completed' },\n { value: 'running', label: 'Running' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => {\n if (row.entity === 'mcpWorkflowPlanner') {\n const url = row.set_id\n ? `/mcp/queries/${row.workflow_id}?mode=plan&set_id=${row.set_id}`\n : `/mcp/queries/${row.workflow_id}?mode=plan`;\n navigate(url);\n } else if (row.entity === 'mcpWorkflowBuilder') {\n navigate(`/mcp/queries/${row.workflow_id}?mode=builder`);\n } else {\n navigate(`/mcp/queries/${row.workflow_id}`);\n }\n }}\n isLoading={isLoading}\n emptyMessage=\"\"\n sort={sort}\n onSort={setSort}\n />\n\n {!isLoading && jobs.length === 0 && (\n <div className=\"cursor-pointer\" onClick={() => navigate('/mcp/queries/new')}>\n <EmptyState icon={Wand2} title=\"No tool designs yet\" description=\"Click to create your first MCP tool\" />\n </div>\n )}\n\n <StickyPagination\n page={pagination.page}\n pageSize={pagination.pageSize}\n total={total}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n />\n </>\n );\n}\n"],"names":["STATUS_DOT","mapStatus","job","buildColumns","navigate","row","s","dotClass","pulseClass","jsxs","jsx","WorkflowPill","TimestampCell","ElapsedCell","isComplete","isBuilder","planUrl","RowActionGroup","e","GitBranch","Layers","MessageSquare","Settings","Lightbulb","McpQueryPage","useNavigate","columns","filters","setFilter","pagination","sort","setSort","useFilterParams","data","isLoading","refetch","useMcpQueryJobs","useWorkflowListEvents","jobs","total","Fragment","PageHeader","Wand2","FilterBar","ListToolbar","buildApiPath","FilterSelect","v","DataTable","url","EmptyState","StickyPagination"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as e,b as V,a as m}from"./vendor-query-RUZdMvN6.js";import{b as J,c as B}from"./pipelines-Byi6PnbE.js";import{P as n,b as y,D as F,c as O,d as U,u as $,e as H,J as S,N as K}from"./index-errgQT5x.js";import{P as k}from"./PageHeader-BJgWMZtw.js";import{S as Q}from"./SegmentedTabs-DXNzY05q.js";import{u as W,E as q}from"./EventTable-BV6unphX.js";import{L as z}from"./ListToolbar-Bl7F3A28.js";import{S as X}from"./SwimlaneTimeline-Br-nBA4l.js";import{S as Y}from"./StatusBadge-DkgllZHv.js";import{C as _}from"./CopyableId-4Lqlc5cU.js";import{J as T,K as G,O as Z,Q as ee,V as se,s as te}from"./vendor-icons-BxuyFxH2.js";import{e as ae,f as le}from"./vendor-react-CdqEC2zv.js";import"./FilterBar-DYFgzXNB.js";import"./StreamMessageDetail-gU4CUeQI.js";const ne={running:"in_progress",completed:"completed",failed:"failed"};function ie({execution:s,namespace:c,traceUrl:t,headerActions:o,open:a}){const{summary:l}=s,i=[{id:"details",icon:T,label:"Details",content:e.jsxs("dl",{className:"space-y-3.5",children:[e.jsx(n,{label:"Status",children:e.jsx(Y,{status:ne[s.status]??s.status})}),e.jsx(n,{label:"Server",children:e.jsx("span",{className:"font-mono",children:c||"—"})}),e.jsx(n,{label:"Tool",children:e.jsx("span",{className:"font-mono",children:s.workflow_type||"—"})}),e.jsx(n,{label:"Workflow ID",children:e.jsx(_,{bare:!0,value:s.workflow_id})}),e.jsx(n,{label:"Started",children:s.start_time?e.jsx(y,{date:s.start_time,format:"datetime"}):e.jsx("span",{className:"text-text-tertiary",children:"--"})}),e.jsx(n,{label:"Completed",children:s.close_time?e.jsx(y,{date:s.close_time,format:"datetime"}):e.jsx("span",{className:"text-text-tertiary",children:"--"})}),e.jsx(n,{label:"Duration",children:e.jsx(F,{ms:s.duration_ms,className:"font-mono"})}),s.trace_id&&e.jsx(n,{label:"Trace",children:e.jsx(_,{bare:!0,value:s.trace_id,href:t?t.replace("{traceId}",s.trace_id):void 0,external:!0})}),e.jsx(n,{label:"Tools",children:l.activities.user}),e.jsx(n,{label:"System",children:l.activities.system}),l.child_workflows.total>0&&e.jsx(n,{label:"Children",children:l.child_workflows.total}),l.timers>0&&e.jsx(n,{label:"Timers",children:l.timers}),l.signals>0&&e.jsx(n,{label:"Signals",children:l.signals})]})}];return e.jsx(O,{open:a,width:384,className:"h-full",children:e.jsx("div",{className:"h-full pl-6",children:e.jsx(U,{views:i,activeId:"details",onViewChange:()=>{},headerActions:o,stickyClassName:"h-full min-h-0",labelInline:!0})})})}const re=["details","timeline","events"],P="lt:mcp-run-detail:tab";function oe({isRunning:s,onTerminate:c}){const[t,o]=m.useState(!1),a=m.useRef(null);return m.useEffect(()=>{if(!t)return;const l=i=>{a.current&&!a.current.contains(i.target)&&o(!1)};return document.addEventListener("mousedown",l),()=>document.removeEventListener("mousedown",l)},[t]),s?e.jsxs("div",{className:"relative",ref:a,children:[e.jsxs("button",{onClick:()=>o(!t),className:"flex items-center gap-0.5 pl-2 pr-1 py-1 rounded-md text-2xs font-medium text-accent hover:text-accent-hover hover:bg-surface-hover transition-colors",title:"Actions",children:["Actions",e.jsx(te,{className:`w-3 h-3 transition-transform ${t?"rotate-180":""}`})]}),t&&e.jsx("div",{className:"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-[100]",children:e.jsx("button",{onClick:()=>{c(),o(!1)},className:"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover",children:"Terminate"})})]}):null}function ye(){var g,w;const{jobId:s}=ae(),[c]=le(),t=c.get("namespace")||"",o=V(),{data:a,isLoading:l,error:i,refetch:b,isFetching:E}=J(s,t),x=B(),{data:p}=$(),{isCollapsed:I,toggle:C}=W("mcp-run-detail"),h=!I("side-panel"),A=((g=p==null?void 0:p.telemetry)==null?void 0:g.traceUrl)??null,[d,D]=m.useState(()=>{try{const r=localStorage.getItem(P);return r&&re.includes(r)?r:"details"}catch{return"details"}}),R=r=>{D(r);try{localStorage.setItem(P,r)}catch{}},M=m.useCallback(r=>{!s||r.workflowId!==s||o.invalidateQueries({queryKey:["mcpRunExecution",s]})},[s,o]);if(H(`${K}.system.>`,M),l)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-60 bg-surface-sunken rounded"})]});if(i||!a)return e.jsxs("div",{children:[e.jsx(k,{title:"Pipeline Execution"}),e.jsxs("div",{className:"mt-4 text-center py-8",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:(w=i==null?void 0:i.message)!=null&&w.includes("expired")?"Execution data is no longer available":"Unable to load execution"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:(i==null?void 0:i.message)??"The run could not be resolved."})]})]});const{events:f}=a,j=f.find(r=>{var N;return r.category==="activity"&&((N=r.attributes.kind)==null?void 0:N.includes("completed"))}),L=(j==null?void 0:j.attributes.result)??null,u=a.result,v=(u==null?void 0:u.data)??u??null;return e.jsxs("div",{className:"flex-1 min-h-0 min-w-0 flex items-stretch -mt-8 -mr-page-x -mb-16",children:[e.jsxs("div",{className:"flex-1 min-w-0 flex flex-col min-h-0",children:[e.jsxs("div",{className:"shrink-0 pt-8 pr-page-x",children:[e.jsx(k,{title:"Pipeline Execution",actions:e.jsx("button",{onClick:()=>C("side-panel"),className:"text-accent/60 hover:text-accent transition-colors",title:h?"Hide side panel":"Show side panel",children:h?e.jsx(G,{className:"w-5 h-5",strokeWidth:1.5}):e.jsx(Z,{className:"w-5 h-5",strokeWidth:1.5})})}),x.error&&e.jsxs("p",{className:"text-xs text-status-error py-2",children:["Interrupt failed: ",x.error.message]}),e.jsx("div",{className:"mt-2",children:e.jsx(Q,{"aria-label":"Execution section",active:d,onChange:R,tabs:[{key:"details",label:"Details",icon:e.jsx(T,{className:"w-3.5 h-3.5"})},{key:"timeline",label:"Execution Timeline",icon:e.jsx(ee,{className:"w-3.5 h-3.5"})},{key:"events",label:"Events",icon:e.jsx(se,{className:"w-3.5 h-3.5"})}]})})]}),e.jsxs("div",{className:"flex-1 min-h-0 overflow-y-auto pr-page-x pt-6 pb-16 animate-page-in",children:[d==="details"&&e.jsx("div",{className:"@container",children:e.jsxs("div",{className:"grid grid-cols-1 @form-cols:grid-cols-2 gap-4",children:[e.jsx(S,{data:L??{},label:"Input"}),v!==null&&e.jsx(S,{data:v,label:"Result"})]})}),d==="timeline"&&e.jsx(X,{events:f,outline:!0,jid:s,appId:t||"durable"}),d==="events"&&e.jsx(q,{events:f,jid:s,appId:t||"durable"})]},d)]}),e.jsx(ie,{execution:a,namespace:t,traceUrl:A,headerActions:e.jsxs(e.Fragment,{children:[e.jsx(z,{onRefresh:()=>b(),isFetching:E,apiPath:`/pipelines/${s}/execution?app_id=${t}`}),e.jsx(oe,{isRunning:a.status==="running",onTerminate:()=>{confirm("Interrupt this pipeline execution? This cannot be undone.")&&x.mutate({jobId:a.workflow_id,topic:a.workflow_type,appId:t},{onSuccess:()=>b()})}})]}),open:h})]})}export{ye as McpRunDetailPage};
2
- //# sourceMappingURL=McpRunDetailPage-BhcqqtYS.js.map
1
+ import{j as e,b as V,a as m}from"./vendor-query-RUZdMvN6.js";import{b as J,c as B}from"./pipelines-QMrFoJZX.js";import{P as n,b as y,D as F,c as O,d as U,u as $,e as H,J as S,N as K}from"./index-C991QfUN.js";import{P as k}from"./PageHeader-B7YJxa4o.js";import{S as Q}from"./SegmentedTabs-DXNzY05q.js";import{u as W,E as q}from"./EventTable-Co1d40Qq.js";import{L as z}from"./ListToolbar-DMremj2e.js";import{S as X}from"./SwimlaneTimeline-vN1N8BGy.js";import{S as Y}from"./StatusBadge-DkgllZHv.js";import{C as _}from"./CopyableId-4Lqlc5cU.js";import{J as T,K as G,O as Z,Q as ee,V as se,s as te}from"./vendor-icons-Aw7bzBxa.js";import{e as ae,f as le}from"./vendor-react-CdqEC2zv.js";import"./FilterBar-2ZfU21EA.js";import"./StreamMessageDetail-u-pDrHfS.js";const ne={running:"in_progress",completed:"completed",failed:"failed"};function ie({execution:s,namespace:c,traceUrl:t,headerActions:o,open:a}){const{summary:l}=s,i=[{id:"details",icon:T,label:"Details",content:e.jsxs("dl",{className:"space-y-3.5",children:[e.jsx(n,{label:"Status",children:e.jsx(Y,{status:ne[s.status]??s.status})}),e.jsx(n,{label:"Server",children:e.jsx("span",{className:"font-mono",children:c||"—"})}),e.jsx(n,{label:"Tool",children:e.jsx("span",{className:"font-mono",children:s.workflow_type||"—"})}),e.jsx(n,{label:"Workflow ID",children:e.jsx(_,{bare:!0,value:s.workflow_id})}),e.jsx(n,{label:"Started",children:s.start_time?e.jsx(y,{date:s.start_time,format:"datetime"}):e.jsx("span",{className:"text-text-tertiary",children:"--"})}),e.jsx(n,{label:"Completed",children:s.close_time?e.jsx(y,{date:s.close_time,format:"datetime"}):e.jsx("span",{className:"text-text-tertiary",children:"--"})}),e.jsx(n,{label:"Duration",children:e.jsx(F,{ms:s.duration_ms,className:"font-mono"})}),s.trace_id&&e.jsx(n,{label:"Trace",children:e.jsx(_,{bare:!0,value:s.trace_id,href:t?t.replace("{traceId}",s.trace_id):void 0,external:!0})}),e.jsx(n,{label:"Tools",children:l.activities.user}),e.jsx(n,{label:"System",children:l.activities.system}),l.child_workflows.total>0&&e.jsx(n,{label:"Children",children:l.child_workflows.total}),l.timers>0&&e.jsx(n,{label:"Timers",children:l.timers}),l.signals>0&&e.jsx(n,{label:"Signals",children:l.signals})]})}];return e.jsx(O,{open:a,width:384,className:"h-full",children:e.jsx("div",{className:"h-full pl-6",children:e.jsx(U,{views:i,activeId:"details",onViewChange:()=>{},headerActions:o,stickyClassName:"h-full min-h-0",labelInline:!0})})})}const re=["details","timeline","events"],P="lt:mcp-run-detail:tab";function oe({isRunning:s,onTerminate:c}){const[t,o]=m.useState(!1),a=m.useRef(null);return m.useEffect(()=>{if(!t)return;const l=i=>{a.current&&!a.current.contains(i.target)&&o(!1)};return document.addEventListener("mousedown",l),()=>document.removeEventListener("mousedown",l)},[t]),s?e.jsxs("div",{className:"relative",ref:a,children:[e.jsxs("button",{onClick:()=>o(!t),className:"flex items-center gap-0.5 pl-2 pr-1 py-1 rounded-md text-2xs font-medium text-accent hover:text-accent-hover hover:bg-surface-hover transition-colors",title:"Actions",children:["Actions",e.jsx(te,{className:`w-3 h-3 transition-transform ${t?"rotate-180":""}`})]}),t&&e.jsx("div",{className:"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-[100]",children:e.jsx("button",{onClick:()=>{c(),o(!1)},className:"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover",children:"Terminate"})})]}):null}function ye(){var g,w;const{jobId:s}=ae(),[c]=le(),t=c.get("namespace")||"",o=V(),{data:a,isLoading:l,error:i,refetch:b,isFetching:E}=J(s,t),x=B(),{data:p}=$(),{isCollapsed:I,toggle:C}=W("mcp-run-detail"),h=!I("side-panel"),A=((g=p==null?void 0:p.telemetry)==null?void 0:g.traceUrl)??null,[d,D]=m.useState(()=>{try{const r=localStorage.getItem(P);return r&&re.includes(r)?r:"details"}catch{return"details"}}),R=r=>{D(r);try{localStorage.setItem(P,r)}catch{}},M=m.useCallback(r=>{!s||r.workflowId!==s||o.invalidateQueries({queryKey:["mcpRunExecution",s]})},[s,o]);if(H(`${K}.system.>`,M),l)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-60 bg-surface-sunken rounded"})]});if(i||!a)return e.jsxs("div",{children:[e.jsx(k,{title:"Pipeline Execution"}),e.jsxs("div",{className:"mt-4 text-center py-8",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:(w=i==null?void 0:i.message)!=null&&w.includes("expired")?"Execution data is no longer available":"Unable to load execution"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:(i==null?void 0:i.message)??"The run could not be resolved."})]})]});const{events:f}=a,j=f.find(r=>{var N;return r.category==="activity"&&((N=r.attributes.kind)==null?void 0:N.includes("completed"))}),L=(j==null?void 0:j.attributes.result)??null,u=a.result,v=(u==null?void 0:u.data)??u??null;return e.jsxs("div",{className:"flex-1 min-h-0 min-w-0 flex items-stretch -mt-8 -mr-page-x -mb-16",children:[e.jsxs("div",{className:"flex-1 min-w-0 flex flex-col min-h-0",children:[e.jsxs("div",{className:"shrink-0 pt-8 pr-page-x",children:[e.jsx(k,{title:"Pipeline Execution",actions:e.jsx("button",{onClick:()=>C("side-panel"),className:"text-accent/60 hover:text-accent transition-colors",title:h?"Hide side panel":"Show side panel",children:h?e.jsx(G,{className:"w-5 h-5",strokeWidth:1.5}):e.jsx(Z,{className:"w-5 h-5",strokeWidth:1.5})})}),x.error&&e.jsxs("p",{className:"text-xs text-status-error py-2",children:["Interrupt failed: ",x.error.message]}),e.jsx("div",{className:"mt-2",children:e.jsx(Q,{"aria-label":"Execution section",active:d,onChange:R,tabs:[{key:"details",label:"Details",icon:e.jsx(T,{className:"w-3.5 h-3.5"})},{key:"timeline",label:"Execution Timeline",icon:e.jsx(ee,{className:"w-3.5 h-3.5"})},{key:"events",label:"Events",icon:e.jsx(se,{className:"w-3.5 h-3.5"})}]})})]}),e.jsxs("div",{className:"flex-1 min-h-0 overflow-y-auto pr-page-x pt-6 pb-16 animate-page-in",children:[d==="details"&&e.jsx("div",{className:"@container",children:e.jsxs("div",{className:"grid grid-cols-1 @form-cols:grid-cols-2 gap-4",children:[e.jsx(S,{data:L??{},label:"Input"}),v!==null&&e.jsx(S,{data:v,label:"Result"})]})}),d==="timeline"&&e.jsx(X,{events:f,outline:!0,jid:s,appId:t||"durable"}),d==="events"&&e.jsx(q,{events:f,jid:s,appId:t||"durable"})]},d)]}),e.jsx(ie,{execution:a,namespace:t,traceUrl:A,headerActions:e.jsxs(e.Fragment,{children:[e.jsx(z,{onRefresh:()=>b(),isFetching:E,apiPath:`/pipelines/${s}/execution?app_id=${t}`}),e.jsx(oe,{isRunning:a.status==="running",onTerminate:()=>{confirm("Interrupt this pipeline execution? This cannot be undone.")&&x.mutate({jobId:a.workflow_id,topic:a.workflow_type,appId:t},{onSuccess:()=>b()})}})]}),open:h})]})}export{ye as McpRunDetailPage};
2
+ //# sourceMappingURL=McpRunDetailPage-DqaBQAnn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"McpRunDetailPage-BhcqqtYS.js","sources":["../../src/pages/mcp/McpExecutionSidePanel.tsx","../../src/pages/mcp/McpRunDetailPage.tsx"],"sourcesContent":["import { Info } from 'lucide-react';\nimport { SlidePanel, SlidePanelViews, PanelField, type SlidePanelView } from '../../components/common/layout/SlidePanel';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport { CopyableId } from '../../components/common/display/CopyableId';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { DurationValue } from '../../components/common/display/DurationValue';\n\nconst STATUS_MAP: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\n/**\n * The pipeline-execution detail side panel — the run's facts beside the timeline,\n * the same shell the workflow-execution page uses. Identity, timing, the trace\n * link, and the activity counts that used to sit in a header card now live here;\n * the page's Actions menu and refresh toolbar ride the panel's header row.\n */\nexport function McpExecutionSidePanel({ execution, namespace, traceUrl, headerActions, open }: {\n execution: {\n workflow_id: string;\n workflow_type: string;\n status: string;\n start_time?: string | null;\n close_time?: string | null;\n duration_ms?: number | null;\n trace_id?: string | null;\n summary: {\n activities: { user: number; system: number };\n child_workflows: { total: number };\n timers: number;\n signals: number;\n };\n };\n namespace: string;\n traceUrl: string | null;\n /** Page controls (toolbar, Actions menu) shown at the right of the panel header. */\n headerActions?: React.ReactNode;\n open: boolean;\n}) {\n const { summary } = execution;\n\n const views: SlidePanelView[] = [\n {\n id: 'details',\n icon: Info,\n label: 'Details',\n content: (\n <dl className=\"space-y-3.5\">\n <PanelField label=\"Status\"><StatusBadge status={STATUS_MAP[execution.status] ?? execution.status} /></PanelField>\n <PanelField label=\"Server\"><span className=\"font-mono\">{namespace || '—'}</span></PanelField>\n <PanelField label=\"Tool\"><span className=\"font-mono\">{execution.workflow_type || '—'}</span></PanelField>\n <PanelField label=\"Workflow ID\"><CopyableId bare value={execution.workflow_id} /></PanelField>\n <PanelField label=\"Started\">\n {execution.start_time\n ? <DateValue date={execution.start_time} format=\"datetime\" />\n : <span className=\"text-text-tertiary\">--</span>}\n </PanelField>\n <PanelField label=\"Completed\">\n {execution.close_time\n ? <DateValue date={execution.close_time} format=\"datetime\" />\n : <span className=\"text-text-tertiary\">--</span>}\n </PanelField>\n <PanelField label=\"Duration\"><DurationValue ms={execution.duration_ms} className=\"font-mono\" /></PanelField>\n {execution.trace_id && (\n <PanelField label=\"Trace\">\n <CopyableId\n bare\n value={execution.trace_id}\n href={traceUrl ? traceUrl.replace('{traceId}', execution.trace_id) : undefined}\n external\n />\n </PanelField>\n )}\n <PanelField label=\"Tools\">{summary.activities.user}</PanelField>\n <PanelField label=\"System\">{summary.activities.system}</PanelField>\n {summary.child_workflows.total > 0 && <PanelField label=\"Children\">{summary.child_workflows.total}</PanelField>}\n {summary.timers > 0 && <PanelField label=\"Timers\">{summary.timers}</PanelField>}\n {summary.signals > 0 && <PanelField label=\"Signals\">{summary.signals}</PanelField>}\n </dl>\n ),\n },\n ];\n\n return (\n <SlidePanel open={open} width={384} className=\"h-full\">\n <div className=\"h-full pl-6\">\n <SlidePanelViews\n views={views}\n activeId=\"details\"\n onViewChange={() => {}}\n headerActions={headerActions}\n stickyClassName=\"h-full min-h-0\"\n labelInline\n />\n </div>\n </SlidePanel>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useMcpRunExecution, useInterruptJob } from '../../api/pipelines';\nimport { useSettings } from '../../api/settings';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { SegmentedTabs } from '../../components/common/layout/SegmentedTabs';\nimport { useCollapsedSections } from '../../hooks/useCollapsedSections';\nimport { useEventSubscription } from '../../hooks/useEventContext';\nimport { NATS_SUBJECT_PREFIX } from '../../lib/nats/config';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { PanelRightClose, PanelRightOpen, ChevronDown, Info, Activity, List } from 'lucide-react';\n\nimport { SwimlaneTimeline } from '../workflows/workflow-execution/SwimlaneTimeline';\nimport { EventTable } from '../workflows/workflow-execution/EventTable';\nimport { McpExecutionSidePanel } from './McpExecutionSidePanel';\n\ntype McpTab = 'details' | 'timeline' | 'events';\nconst MCP_TABS = ['details', 'timeline', 'events'] as const;\nconst MCP_TAB_KEY = 'lt:mcp-run-detail:tab';\n\n// ── Actions dropdown ────────────────────────────────────────────────────────\n\nfunction ActionsDropdown({ isRunning, onTerminate }: {\n isRunning: boolean;\n onTerminate: () => void;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n if (!isRunning) return null;\n\n return (\n <div className=\"relative\" ref={ref}>\n <button\n onClick={() => setOpen(!open)}\n className=\"flex items-center gap-0.5 pl-2 pr-1 py-1 rounded-md text-2xs font-medium text-accent hover:text-accent-hover hover:bg-surface-hover transition-colors\"\n title=\"Actions\"\n >\n Actions\n <ChevronDown className={`w-3 h-3 transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n {open && (\n <div className=\"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-[100]\">\n <button\n onClick={() => { onTerminate(); setOpen(false); }}\n className=\"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover\"\n >\n Terminate\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// ── Main page ────────────────────────────────────────────────────────────────\n\nexport function McpRunDetailPage() {\n const { jobId } = useParams<{ jobId: string }>();\n const [searchParams] = useSearchParams();\n const namespace = searchParams.get('namespace') || '';\n const queryClient = useQueryClient();\n const { data: execution, isLoading, error, refetch, isFetching } = useMcpRunExecution(jobId!, namespace);\n const interruptMutation = useInterruptJob();\n const { data: settings } = useSettings();\n const { isCollapsed, toggle } = useCollapsedSections('mcp-run-detail');\n\n const sidePanelOpen = !isCollapsed('side-panel');\n const traceUrl = settings?.telemetry?.traceUrl ?? null;\n\n // The main content is a segmented switch, not an accordion: one section at a\n // time, tabs at the top, the choice persisted across visits.\n const [tab, setTab] = useState<McpTab>(() => {\n try {\n const saved = localStorage.getItem(MCP_TAB_KEY) as McpTab | null;\n return saved && MCP_TABS.includes(saved) ? saved : 'details';\n } catch {\n return 'details';\n }\n });\n const selectTab = (next: McpTab) => {\n setTab(next);\n try { localStorage.setItem(MCP_TAB_KEY, next); } catch { /* private mode */ }\n };\n\n // Subscribe to activity events for this job — refetch execution on each step\n const activityHandler = useCallback((event: any) => {\n if (!jobId || event.workflowId !== jobId) return;\n queryClient.invalidateQueries({ queryKey: ['mcpRunExecution', jobId] });\n }, [jobId, queryClient]);\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.>`, activityHandler);\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (error || !execution) {\n return (\n <div>\n <PageHeader title=\"Pipeline Execution\" />\n <div className=\"mt-4 text-center py-8\">\n <p className=\"text-sm text-text-primary mb-1\">\n {(error as Error)?.message?.includes('expired')\n ? 'Execution data is no longer available'\n : 'Unable to load execution'}\n </p>\n <p className=\"text-xs text-text-tertiary\">\n {(error as Error)?.message ?? 'The run could not be resolved.'}\n </p>\n </div>\n </div>\n );\n }\n\n const { events } = execution;\n\n // The trigger activity's result is the effective input to the flow —\n // it accepts outside job input and provides it to descendant activities.\n const triggerCompleted = events.find(\n (e) => e.category === 'activity' && e.attributes.kind?.includes('completed'),\n );\n const triggerInput = triggerCompleted?.attributes.result ?? null;\n\n // Unwrap result — the `data` field is what users care about\n const rawResult = execution.result as Record<string, unknown> | null | undefined;\n const result = rawResult?.data ?? rawResult ?? null;\n\n return (\n // Two fixed-height columns, like the workflow-execution page: the header and\n // tabs stay put while only the active section scrolls, and the panel is\n // affixed with its own internal scroll and bleeds to the page edge.\n <div className=\"flex-1 min-h-0 min-w-0 flex items-stretch -mt-8 -mr-page-x -mb-16\">\n <div className=\"flex-1 min-w-0 flex flex-col min-h-0\">\n {/* Fixed header: title + the panel toggle, then the tab strip. Facts,\n the toolbar, and the Actions menu all live in the panel. */}\n <div className=\"shrink-0 pt-8 pr-page-x\">\n <PageHeader\n title=\"Pipeline Execution\"\n actions={\n <button\n onClick={() => toggle('side-panel')}\n className=\"text-accent/60 hover:text-accent transition-colors\"\n title={sidePanelOpen ? 'Hide side panel' : 'Show side panel'}\n >\n {sidePanelOpen\n ? <PanelRightClose className=\"w-5 h-5\" strokeWidth={1.5} />\n : <PanelRightOpen className=\"w-5 h-5\" strokeWidth={1.5} />}\n </button>\n }\n />\n\n {interruptMutation.error && (\n <p className=\"text-xs text-status-error py-2\">\n Interrupt failed: {(interruptMutation.error as Error).message}\n </p>\n )}\n\n <div className=\"mt-2\">\n <SegmentedTabs<McpTab>\n aria-label=\"Execution section\"\n active={tab}\n onChange={selectTab}\n tabs={[\n { key: 'details', label: 'Details', icon: <Info className=\"w-3.5 h-3.5\" /> },\n { key: 'timeline', label: 'Execution Timeline', icon: <Activity className=\"w-3.5 h-3.5\" /> },\n { key: 'events', label: 'Events', icon: <List className=\"w-3.5 h-3.5\" /> },\n ]}\n />\n </div>\n </div>\n\n {/* Only the active section scrolls; the key restarts the reveal and\n resets the scroll position on each switch. */}\n <div key={tab} className=\"flex-1 min-h-0 overflow-y-auto pr-page-x pt-6 pb-16 animate-page-in\">\n {tab === 'details' && (\n <div className=\"@container\">\n <div className=\"grid grid-cols-1 @form-cols:grid-cols-2 gap-4\">\n <JsonViewer data={triggerInput ?? {}} label=\"Input\" />\n {result !== null && <JsonViewer data={result} label=\"Result\" />}\n </div>\n </div>\n )}\n {tab === 'timeline' && (\n <SwimlaneTimeline events={events} outline jid={jobId} appId={namespace || 'durable'} />\n )}\n {tab === 'events' && (\n <EventTable events={events} jid={jobId} appId={namespace || 'durable'} />\n )}\n </div>\n </div>\n\n <McpExecutionSidePanel\n execution={execution}\n namespace={namespace}\n traceUrl={traceUrl}\n headerActions={\n <>\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/pipelines/${jobId}/execution?app_id=${namespace}`}\n />\n <ActionsDropdown\n isRunning={execution.status === 'running'}\n onTerminate={() => {\n if (confirm('Interrupt this pipeline execution? This cannot be undone.')) {\n interruptMutation.mutate(\n { jobId: execution.workflow_id, topic: execution.workflow_type, appId: namespace },\n { onSuccess: () => refetch() },\n );\n }\n }}\n />\n </>\n }\n open={sidePanelOpen}\n />\n </div>\n );\n}\n"],"names":["STATUS_MAP","McpExecutionSidePanel","execution","namespace","traceUrl","headerActions","open","summary","views","Info","jsxs","jsx","PanelField","StatusBadge","CopyableId","DateValue","DurationValue","SlidePanel","SlidePanelViews","MCP_TABS","MCP_TAB_KEY","ActionsDropdown","isRunning","onTerminate","setOpen","useState","ref","useRef","useEffect","handler","e","ChevronDown","McpRunDetailPage","jobId","useParams","searchParams","useSearchParams","queryClient","useQueryClient","isLoading","error","refetch","isFetching","useMcpRunExecution","interruptMutation","useInterruptJob","settings","useSettings","isCollapsed","toggle","useCollapsedSections","sidePanelOpen","_a","tab","setTab","saved","selectTab","next","activityHandler","useCallback","event","useEventSubscription","NATS_SUBJECT_PREFIX","PageHeader","_b","events","triggerCompleted","triggerInput","rawResult","result","PanelRightClose","PanelRightOpen","SegmentedTabs","Activity","List","JsonViewer","SwimlaneTimeline","EventTable","Fragment","ListToolbar"],"mappings":"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"}
1
+ {"version":3,"file":"McpRunDetailPage-DqaBQAnn.js","sources":["../../src/pages/mcp/McpExecutionSidePanel.tsx","../../src/pages/mcp/McpRunDetailPage.tsx"],"sourcesContent":["import { Info } from 'lucide-react';\nimport { SlidePanel, SlidePanelViews, PanelField, type SlidePanelView } from '../../components/common/layout/SlidePanel';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport { CopyableId } from '../../components/common/display/CopyableId';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { DurationValue } from '../../components/common/display/DurationValue';\n\nconst STATUS_MAP: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\n/**\n * The pipeline-execution detail side panel — the run's facts beside the timeline,\n * the same shell the workflow-execution page uses. Identity, timing, the trace\n * link, and the activity counts that used to sit in a header card now live here;\n * the page's Actions menu and refresh toolbar ride the panel's header row.\n */\nexport function McpExecutionSidePanel({ execution, namespace, traceUrl, headerActions, open }: {\n execution: {\n workflow_id: string;\n workflow_type: string;\n status: string;\n start_time?: string | null;\n close_time?: string | null;\n duration_ms?: number | null;\n trace_id?: string | null;\n summary: {\n activities: { user: number; system: number };\n child_workflows: { total: number };\n timers: number;\n signals: number;\n };\n };\n namespace: string;\n traceUrl: string | null;\n /** Page controls (toolbar, Actions menu) shown at the right of the panel header. */\n headerActions?: React.ReactNode;\n open: boolean;\n}) {\n const { summary } = execution;\n\n const views: SlidePanelView[] = [\n {\n id: 'details',\n icon: Info,\n label: 'Details',\n content: (\n <dl className=\"space-y-3.5\">\n <PanelField label=\"Status\"><StatusBadge status={STATUS_MAP[execution.status] ?? execution.status} /></PanelField>\n <PanelField label=\"Server\"><span className=\"font-mono\">{namespace || '—'}</span></PanelField>\n <PanelField label=\"Tool\"><span className=\"font-mono\">{execution.workflow_type || '—'}</span></PanelField>\n <PanelField label=\"Workflow ID\"><CopyableId bare value={execution.workflow_id} /></PanelField>\n <PanelField label=\"Started\">\n {execution.start_time\n ? <DateValue date={execution.start_time} format=\"datetime\" />\n : <span className=\"text-text-tertiary\">--</span>}\n </PanelField>\n <PanelField label=\"Completed\">\n {execution.close_time\n ? <DateValue date={execution.close_time} format=\"datetime\" />\n : <span className=\"text-text-tertiary\">--</span>}\n </PanelField>\n <PanelField label=\"Duration\"><DurationValue ms={execution.duration_ms} className=\"font-mono\" /></PanelField>\n {execution.trace_id && (\n <PanelField label=\"Trace\">\n <CopyableId\n bare\n value={execution.trace_id}\n href={traceUrl ? traceUrl.replace('{traceId}', execution.trace_id) : undefined}\n external\n />\n </PanelField>\n )}\n <PanelField label=\"Tools\">{summary.activities.user}</PanelField>\n <PanelField label=\"System\">{summary.activities.system}</PanelField>\n {summary.child_workflows.total > 0 && <PanelField label=\"Children\">{summary.child_workflows.total}</PanelField>}\n {summary.timers > 0 && <PanelField label=\"Timers\">{summary.timers}</PanelField>}\n {summary.signals > 0 && <PanelField label=\"Signals\">{summary.signals}</PanelField>}\n </dl>\n ),\n },\n ];\n\n return (\n <SlidePanel open={open} width={384} className=\"h-full\">\n <div className=\"h-full pl-6\">\n <SlidePanelViews\n views={views}\n activeId=\"details\"\n onViewChange={() => {}}\n headerActions={headerActions}\n stickyClassName=\"h-full min-h-0\"\n labelInline\n />\n </div>\n </SlidePanel>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useMcpRunExecution, useInterruptJob } from '../../api/pipelines';\nimport { useSettings } from '../../api/settings';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { SegmentedTabs } from '../../components/common/layout/SegmentedTabs';\nimport { useCollapsedSections } from '../../hooks/useCollapsedSections';\nimport { useEventSubscription } from '../../hooks/useEventContext';\nimport { NATS_SUBJECT_PREFIX } from '../../lib/nats/config';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { PanelRightClose, PanelRightOpen, ChevronDown, Info, Activity, List } from 'lucide-react';\n\nimport { SwimlaneTimeline } from '../workflows/workflow-execution/SwimlaneTimeline';\nimport { EventTable } from '../workflows/workflow-execution/EventTable';\nimport { McpExecutionSidePanel } from './McpExecutionSidePanel';\n\ntype McpTab = 'details' | 'timeline' | 'events';\nconst MCP_TABS = ['details', 'timeline', 'events'] as const;\nconst MCP_TAB_KEY = 'lt:mcp-run-detail:tab';\n\n// ── Actions dropdown ────────────────────────────────────────────────────────\n\nfunction ActionsDropdown({ isRunning, onTerminate }: {\n isRunning: boolean;\n onTerminate: () => void;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n if (!isRunning) return null;\n\n return (\n <div className=\"relative\" ref={ref}>\n <button\n onClick={() => setOpen(!open)}\n className=\"flex items-center gap-0.5 pl-2 pr-1 py-1 rounded-md text-2xs font-medium text-accent hover:text-accent-hover hover:bg-surface-hover transition-colors\"\n title=\"Actions\"\n >\n Actions\n <ChevronDown className={`w-3 h-3 transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n {open && (\n <div className=\"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-[100]\">\n <button\n onClick={() => { onTerminate(); setOpen(false); }}\n className=\"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover\"\n >\n Terminate\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// ── Main page ────────────────────────────────────────────────────────────────\n\nexport function McpRunDetailPage() {\n const { jobId } = useParams<{ jobId: string }>();\n const [searchParams] = useSearchParams();\n const namespace = searchParams.get('namespace') || '';\n const queryClient = useQueryClient();\n const { data: execution, isLoading, error, refetch, isFetching } = useMcpRunExecution(jobId!, namespace);\n const interruptMutation = useInterruptJob();\n const { data: settings } = useSettings();\n const { isCollapsed, toggle } = useCollapsedSections('mcp-run-detail');\n\n const sidePanelOpen = !isCollapsed('side-panel');\n const traceUrl = settings?.telemetry?.traceUrl ?? null;\n\n // The main content is a segmented switch, not an accordion: one section at a\n // time, tabs at the top, the choice persisted across visits.\n const [tab, setTab] = useState<McpTab>(() => {\n try {\n const saved = localStorage.getItem(MCP_TAB_KEY) as McpTab | null;\n return saved && MCP_TABS.includes(saved) ? saved : 'details';\n } catch {\n return 'details';\n }\n });\n const selectTab = (next: McpTab) => {\n setTab(next);\n try { localStorage.setItem(MCP_TAB_KEY, next); } catch { /* private mode */ }\n };\n\n // Subscribe to activity events for this job — refetch execution on each step\n const activityHandler = useCallback((event: any) => {\n if (!jobId || event.workflowId !== jobId) return;\n queryClient.invalidateQueries({ queryKey: ['mcpRunExecution', jobId] });\n }, [jobId, queryClient]);\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.>`, activityHandler);\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (error || !execution) {\n return (\n <div>\n <PageHeader title=\"Pipeline Execution\" />\n <div className=\"mt-4 text-center py-8\">\n <p className=\"text-sm text-text-primary mb-1\">\n {(error as Error)?.message?.includes('expired')\n ? 'Execution data is no longer available'\n : 'Unable to load execution'}\n </p>\n <p className=\"text-xs text-text-tertiary\">\n {(error as Error)?.message ?? 'The run could not be resolved.'}\n </p>\n </div>\n </div>\n );\n }\n\n const { events } = execution;\n\n // The trigger activity's result is the effective input to the flow —\n // it accepts outside job input and provides it to descendant activities.\n const triggerCompleted = events.find(\n (e) => e.category === 'activity' && e.attributes.kind?.includes('completed'),\n );\n const triggerInput = triggerCompleted?.attributes.result ?? null;\n\n // Unwrap result — the `data` field is what users care about\n const rawResult = execution.result as Record<string, unknown> | null | undefined;\n const result = rawResult?.data ?? rawResult ?? null;\n\n return (\n // Two fixed-height columns, like the workflow-execution page: the header and\n // tabs stay put while only the active section scrolls, and the panel is\n // affixed with its own internal scroll and bleeds to the page edge.\n <div className=\"flex-1 min-h-0 min-w-0 flex items-stretch -mt-8 -mr-page-x -mb-16\">\n <div className=\"flex-1 min-w-0 flex flex-col min-h-0\">\n {/* Fixed header: title + the panel toggle, then the tab strip. Facts,\n the toolbar, and the Actions menu all live in the panel. */}\n <div className=\"shrink-0 pt-8 pr-page-x\">\n <PageHeader\n title=\"Pipeline Execution\"\n actions={\n <button\n onClick={() => toggle('side-panel')}\n className=\"text-accent/60 hover:text-accent transition-colors\"\n title={sidePanelOpen ? 'Hide side panel' : 'Show side panel'}\n >\n {sidePanelOpen\n ? <PanelRightClose className=\"w-5 h-5\" strokeWidth={1.5} />\n : <PanelRightOpen className=\"w-5 h-5\" strokeWidth={1.5} />}\n </button>\n }\n />\n\n {interruptMutation.error && (\n <p className=\"text-xs text-status-error py-2\">\n Interrupt failed: {(interruptMutation.error as Error).message}\n </p>\n )}\n\n <div className=\"mt-2\">\n <SegmentedTabs<McpTab>\n aria-label=\"Execution section\"\n active={tab}\n onChange={selectTab}\n tabs={[\n { key: 'details', label: 'Details', icon: <Info className=\"w-3.5 h-3.5\" /> },\n { key: 'timeline', label: 'Execution Timeline', icon: <Activity className=\"w-3.5 h-3.5\" /> },\n { key: 'events', label: 'Events', icon: <List className=\"w-3.5 h-3.5\" /> },\n ]}\n />\n </div>\n </div>\n\n {/* Only the active section scrolls; the key restarts the reveal and\n resets the scroll position on each switch. */}\n <div key={tab} className=\"flex-1 min-h-0 overflow-y-auto pr-page-x pt-6 pb-16 animate-page-in\">\n {tab === 'details' && (\n <div className=\"@container\">\n <div className=\"grid grid-cols-1 @form-cols:grid-cols-2 gap-4\">\n <JsonViewer data={triggerInput ?? {}} label=\"Input\" />\n {result !== null && <JsonViewer data={result} label=\"Result\" />}\n </div>\n </div>\n )}\n {tab === 'timeline' && (\n <SwimlaneTimeline events={events} outline jid={jobId} appId={namespace || 'durable'} />\n )}\n {tab === 'events' && (\n <EventTable events={events} jid={jobId} appId={namespace || 'durable'} />\n )}\n </div>\n </div>\n\n <McpExecutionSidePanel\n execution={execution}\n namespace={namespace}\n traceUrl={traceUrl}\n headerActions={\n <>\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/pipelines/${jobId}/execution?app_id=${namespace}`}\n />\n <ActionsDropdown\n isRunning={execution.status === 'running'}\n onTerminate={() => {\n if (confirm('Interrupt this pipeline execution? This cannot be undone.')) {\n interruptMutation.mutate(\n { jobId: execution.workflow_id, topic: execution.workflow_type, appId: namespace },\n { onSuccess: () => refetch() },\n );\n }\n }}\n />\n </>\n }\n open={sidePanelOpen}\n />\n </div>\n );\n}\n"],"names":["STATUS_MAP","McpExecutionSidePanel","execution","namespace","traceUrl","headerActions","open","summary","views","Info","jsxs","jsx","PanelField","StatusBadge","CopyableId","DateValue","DurationValue","SlidePanel","SlidePanelViews","MCP_TABS","MCP_TAB_KEY","ActionsDropdown","isRunning","onTerminate","setOpen","useState","ref","useRef","useEffect","handler","e","ChevronDown","McpRunDetailPage","jobId","useParams","searchParams","useSearchParams","queryClient","useQueryClient","isLoading","error","refetch","isFetching","useMcpRunExecution","interruptMutation","useInterruptJob","settings","useSettings","isCollapsed","toggle","useCollapsedSections","sidePanelOpen","_a","tab","setTab","saved","selectTab","next","activityHandler","useCallback","event","useEventSubscription","NATS_SUBJECT_PREFIX","PageHeader","_b","events","triggerCompleted","triggerInput","rawResult","result","PanelRightClose","PanelRightOpen","SegmentedTabs","Activity","List","JsonViewer","SwimlaneTimeline","EventTable","Fragment","ListToolbar"],"mappings":"ovBAOA,MAAMA,GAAqC,CACzC,QAAS,cACT,UAAW,YACX,OAAQ,QACV,EAQO,SAASC,GAAsB,CAAE,UAAAC,EAAW,UAAAC,EAAW,SAAAC,EAAU,cAAAC,EAAe,KAAAC,GAqBpF,CACD,KAAM,CAAE,QAAAC,GAAYL,EAEdM,EAA0B,CAC9B,CACE,GAAI,UACJ,KAAMC,EACN,MAAO,UACP,QACEC,EAAAA,KAAC,KAAA,CAAG,UAAU,cACZ,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAW,MAAM,SAAS,SAAAD,EAAAA,IAACE,EAAA,CAAY,OAAQb,GAAWE,EAAU,MAAM,GAAKA,EAAU,MAAA,CAAQ,EAAE,EACpGS,EAAAA,IAACC,EAAA,CAAW,MAAM,SAAS,SAAAD,EAAAA,IAAC,QAAK,UAAU,YAAa,SAAAR,GAAa,GAAA,CAAI,CAAA,CAAO,EAChFQ,EAAAA,IAACC,EAAA,CAAW,MAAM,OAAO,SAAAD,EAAAA,IAAC,OAAA,CAAK,UAAU,YAAa,SAAAT,EAAU,eAAiB,GAAA,CAAI,EAAO,EAC5FS,EAAAA,IAACC,EAAA,CAAW,MAAM,cAAc,SAAAD,EAAAA,IAACG,EAAA,CAAW,KAAI,GAAC,MAAOZ,EAAU,WAAA,CAAa,CAAA,CAAE,QAChFU,EAAA,CAAW,MAAM,UACf,SAAAV,EAAU,iBACNa,EAAA,CAAU,KAAMb,EAAU,WAAY,OAAO,WAAW,EACzDS,EAAAA,IAAC,QAAK,UAAU,qBAAqB,cAAE,CAAA,CAC7C,QACCC,EAAA,CAAW,MAAM,YACf,SAAAV,EAAU,iBACNa,EAAA,CAAU,KAAMb,EAAU,WAAY,OAAO,WAAW,EACzDS,EAAAA,IAAC,QAAK,UAAU,qBAAqB,cAAE,CAAA,CAC7C,EACAA,EAAAA,IAACC,EAAA,CAAW,MAAM,WAAW,SAAAD,EAAAA,IAACK,EAAA,CAAc,GAAId,EAAU,YAAa,UAAU,WAAA,CAAY,CAAA,CAAE,EAC9FA,EAAU,UACTS,MAACC,EAAA,CAAW,MAAM,QAChB,SAAAD,EAAAA,IAACG,EAAA,CACC,KAAI,GACJ,MAAOZ,EAAU,SACjB,KAAME,EAAWA,EAAS,QAAQ,YAAaF,EAAU,QAAQ,EAAI,OACrE,SAAQ,EAAA,CAAA,EAEZ,QAEDU,EAAA,CAAW,MAAM,QAAS,SAAAL,EAAQ,WAAW,KAAK,QAClDK,EAAA,CAAW,MAAM,SAAU,SAAAL,EAAQ,WAAW,OAAO,EACrDA,EAAQ,gBAAgB,MAAQ,GAAKI,EAAAA,IAACC,GAAW,MAAM,WAAY,SAAAL,EAAQ,gBAAgB,KAAA,CAAM,EACjGA,EAAQ,OAAS,GAAKI,EAAAA,IAACC,GAAW,MAAM,SAAU,WAAQ,MAAA,CAAO,EACjEL,EAAQ,QAAU,GAAKI,EAAAA,IAACC,GAAW,MAAM,UAAW,WAAQ,OAAA,CAAQ,CAAA,CAAA,CACvE,CAAA,CAEJ,EAGF,OACED,EAAAA,IAACM,EAAA,CAAW,KAAAX,EAAY,MAAO,IAAK,UAAU,SAC5C,SAAAK,EAAAA,IAAC,MAAA,CAAI,UAAU,cACb,SAAAA,EAAAA,IAACO,EAAA,CACC,MAAAV,EACA,SAAS,UACT,aAAc,IAAM,CAAC,EACrB,cAAAH,EACA,gBAAgB,iBAChB,YAAW,EAAA,CAAA,EAEf,CAAA,CACF,CAEJ,CChFA,MAAMc,GAAW,CAAC,UAAW,WAAY,QAAQ,EAC3CC,EAAc,wBAIpB,SAASC,GAAgB,CAAE,UAAAC,EAAW,YAAAC,GAGnC,CACD,KAAM,CAACjB,EAAMkB,CAAO,EAAIC,EAAAA,SAAS,EAAK,EAChCC,EAAMC,EAAAA,OAAuB,IAAI,EAWvC,OATAC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACtB,EAAM,OACX,MAAMuB,EAAWC,GAAkB,CAC7BJ,EAAI,SAAW,CAACA,EAAI,QAAQ,SAASI,EAAE,MAAc,GAAGN,EAAQ,EAAK,CAC3E,EACA,gBAAS,iBAAiB,YAAaK,CAAO,EACvC,IAAM,SAAS,oBAAoB,YAAaA,CAAO,CAChE,EAAG,CAACvB,CAAI,CAAC,EAEJgB,EAGHZ,EAAAA,KAAC,MAAA,CAAI,UAAU,WAAW,IAAAgB,EACxB,SAAA,CAAAhB,EAAAA,KAAC,SAAA,CACC,QAAS,IAAMc,EAAQ,CAAClB,CAAI,EAC5B,UAAU,wJACV,MAAM,UACP,SAAA,CAAA,gBAEEyB,GAAA,CAAY,UAAW,gCAAgCzB,EAAO,aAAe,EAAE,EAAA,CAAI,CAAA,CAAA,CAAA,EAErFA,GACCK,EAAAA,IAAC,MAAA,CAAI,UAAU,yGACb,SAAAA,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM,CAAEY,EAAA,EAAeC,EAAQ,EAAK,CAAG,EAChD,UAAU,oFACX,SAAA,WAAA,CAAA,CAED,CACF,CAAA,EAEJ,EAtBqB,IAwBzB,CAIO,SAASQ,IAAmB,SACjC,KAAM,CAAE,MAAAC,CAAA,EAAUC,GAAA,EACZ,CAACC,CAAY,EAAIC,GAAA,EACjBjC,EAAYgC,EAAa,IAAI,WAAW,GAAK,GAC7CE,EAAcC,EAAA,EACd,CAAE,KAAMpC,EAAW,UAAAqC,EAAW,MAAAC,EAAO,QAAAC,EAAS,WAAAC,GAAeC,EAAmBV,EAAQ9B,CAAS,EACjGyC,EAAoBC,EAAA,EACpB,CAAE,KAAMC,CAAA,EAAaC,EAAA,EACrB,CAAE,YAAAC,EAAa,OAAAC,GAAWC,EAAqB,gBAAgB,EAE/DC,EAAgB,CAACH,EAAY,YAAY,EACzC5C,IAAWgD,EAAAN,GAAA,YAAAA,EAAU,YAAV,YAAAM,EAAqB,WAAY,KAI5C,CAACC,EAAKC,CAAM,EAAI7B,EAAAA,SAAiB,IAAM,CAC3C,GAAI,CACF,MAAM8B,EAAQ,aAAa,QAAQnC,CAAW,EAC9C,OAAOmC,GAASpC,GAAS,SAASoC,CAAK,EAAIA,EAAQ,SACrD,MAAQ,CACN,MAAO,SACT,CACF,CAAC,EACKC,EAAaC,GAAiB,CAClCH,EAAOG,CAAI,EACX,GAAI,CAAE,aAAa,QAAQrC,EAAaqC,CAAI,CAAG,MAAQ,CAAqB,CAC9E,EAGMC,EAAkBC,cAAaC,GAAe,CAC9C,CAAC3B,GAAS2B,EAAM,aAAe3B,GACnCI,EAAY,kBAAkB,CAAE,SAAU,CAAC,kBAAmBJ,CAAK,EAAG,CACxE,EAAG,CAACA,EAAOI,CAAW,CAAC,EAGvB,GAFAwB,EAAqB,GAAGC,CAAmB,YAAaJ,CAAe,EAEnEnB,EACF,OACE7B,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,oCAAA,CAAqC,EACpDA,EAAAA,IAAC,MAAA,CAAI,UAAU,gCAAA,CAAiC,CAAA,EAClD,EAIJ,GAAI6B,GAAS,CAACtC,EACZ,cACG,MAAA,CACC,SAAA,CAAAS,EAAAA,IAACoD,EAAA,CAAW,MAAM,oBAAA,CAAqB,EACvCrD,EAAAA,KAAC,MAAA,CAAI,UAAU,wBACb,SAAA,CAAAC,EAAAA,IAAC,IAAA,CAAE,UAAU,iCACT,UAAAqD,EAAAxB,GAAA,YAAAA,EAAiB,UAAjB,MAAAwB,EAA0B,SAAS,WACjC,wCACA,0BAAA,CACN,QACC,IAAA,CAAE,UAAU,6BACT,UAAAxB,GAAA,YAAAA,EAAiB,UAAW,gCAAA,CAChC,CAAA,CAAA,CACF,CAAA,EACF,EAIJ,KAAM,CAAE,OAAAyB,GAAW/D,EAIbgE,EAAmBD,EAAO,KAC7BnC,UAAM,OAAAA,EAAE,WAAa,cAAcsB,EAAAtB,EAAE,WAAW,OAAb,YAAAsB,EAAmB,SAAS,cAAW,EAEvEe,GAAeD,GAAA,YAAAA,EAAkB,WAAW,SAAU,KAGtDE,EAAYlE,EAAU,OACtBmE,GAASD,GAAA,YAAAA,EAAW,OAAQA,GAAa,KAE/C,OAIE1D,EAAAA,KAAC,MAAA,CAAI,UAAU,oEACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,uCAGb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAACoD,EAAA,CACC,MAAM,qBACN,QACEpD,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMsC,EAAO,YAAY,EAClC,UAAU,qDACV,MAAOE,EAAgB,kBAAoB,kBAE1C,SAAAA,EACGxC,EAAAA,IAAC2D,EAAA,CAAgB,UAAU,UAAU,YAAa,GAAA,CAAK,EACvD3D,EAAAA,IAAC4D,EAAA,CAAe,UAAU,UAAU,YAAa,GAAA,CAAK,CAAA,CAAA,CAC5D,CAAA,EAIH3B,EAAkB,OACjBlC,OAAC,IAAA,CAAE,UAAU,iCAAiC,SAAA,CAAA,qBACxBkC,EAAkB,MAAgB,OAAA,EACxD,EAGFjC,EAAAA,IAAC,MAAA,CAAI,UAAU,OACb,SAAAA,EAAAA,IAAC6D,EAAA,CACC,aAAW,oBACX,OAAQnB,EACR,SAAUG,EACV,KAAM,CACJ,CAAE,IAAK,UAAW,MAAO,UAAW,KAAM7C,EAAAA,IAACF,EAAA,CAAK,UAAU,aAAA,CAAc,CAAA,EACxE,CAAE,IAAK,WAAY,MAAO,qBAAsB,KAAME,EAAAA,IAAC8D,GAAA,CAAS,UAAU,aAAA,CAAc,CAAA,EACxF,CAAE,IAAK,SAAU,MAAO,SAAU,KAAM9D,EAAAA,IAAC+D,GAAA,CAAK,UAAU,cAAc,CAAA,CAAG,CAC3E,CAAA,CACF,CACF,CAAA,EACF,EAIAhE,EAAAA,KAAC,MAAA,CAAc,UAAU,sEACtB,SAAA,CAAA2C,IAAQ,iBACN,MAAA,CAAI,UAAU,aACb,SAAA3C,EAAAA,KAAC,MAAA,CAAI,UAAU,gDACb,SAAA,CAAAC,EAAAA,IAACgE,GAAW,KAAMR,GAAgB,GAAI,MAAM,QAAQ,EACnDE,IAAW,MAAQ1D,EAAAA,IAACgE,GAAW,KAAMN,EAAQ,MAAM,QAAA,CAAS,CAAA,CAAA,CAC/D,CAAA,CACF,EAEDhB,IAAQ,YACP1C,EAAAA,IAACiE,EAAA,CAAiB,OAAAX,EAAgB,QAAO,GAAC,IAAKhC,EAAO,MAAO9B,GAAa,SAAA,CAAW,EAEtFkD,IAAQ,UACP1C,MAACkE,EAAA,CAAW,OAAAZ,EAAgB,IAAKhC,EAAO,MAAO9B,GAAa,SAAA,CAAW,CAAA,CAAA,EAbjEkD,CAeV,CAAA,EACF,EAEA1C,EAAAA,IAACV,GAAA,CACC,UAAAC,EACA,UAAAC,EACA,SAAAC,EACA,cACEM,EAAAA,KAAAoE,WAAA,CACE,SAAA,CAAAnE,EAAAA,IAACoE,EAAA,CACC,UAAW,IAAMtC,EAAA,EACjB,WAAAC,EACA,QAAS,cAAcT,CAAK,qBAAqB9B,CAAS,EAAA,CAAA,EAE5DQ,EAAAA,IAACU,GAAA,CACC,UAAWnB,EAAU,SAAW,UAChC,YAAa,IAAM,CACb,QAAQ,2DAA2D,GACrE0C,EAAkB,OAChB,CAAE,MAAO1C,EAAU,YAAa,MAAOA,EAAU,cAAe,MAAOC,CAAA,EACvE,CAAE,UAAW,IAAMsC,EAAA,CAAQ,CAAE,CAGnC,CAAA,CAAA,CACF,EACF,EAEF,KAAMU,CAAA,CAAA,CACR,CAAA,CACF,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{a as d,j as s}from"./vendor-query-RUZdMvN6.js";import{a as R,u as T}from"./pipelines-Byi6PnbE.js";import{a as M}from"./yaml-workflows-DWFww9Xn.js";import{u as z}from"./useFilterParams-crmlBw_l.js";import{u as E}from"./useNamespace-C1OqiNXN.js";import{b as $}from"./api-path-u2Jf9QXS.js";import{D as A}from"./DataTable-Bir0Xs1p.js";import{W as L}from"./WorkflowPill-tXU0-eXu.js";import{E as U}from"./ElapsedCell-WV6pUaKo.js";import{b}from"./index-errgQT5x.js";import{P as W}from"./PageHeader-BJgWMZtw.js";import{F as H,b as g}from"./FilterBar-DYFgzXNB.js";import{S as I}from"./StickyPagination-DIeYMPPd.js";import{L as O}from"./ListToolbar-Bl7F3A28.js";import{R as B,a as q}from"./RowActions-eYrzgQSj.js";import{H as G}from"./vendor-icons-BxuyFxH2.js";import{u as V}from"./vendor-react-CdqEC2zv.js";import"./controlplane-TVCjDHQ-.js";import"./EmptyState-lpUFYfun.js";const Y={running:"in_progress",completed:"completed",failed:"failed"},D={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},J={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function K(x,f){return[{key:"workflow_id",label:"Run ID",render:t=>{const a=D[Y[t.status]??t.status]??"bg-status-pending",n=t.status==="running"?" animate-pulse":"";return s.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[s.jsx("span",{className:`w-2.5 h-2.5 shrink-0 rounded-full dot-ring ${a}${n}`,title:t.status}),s.jsx("span",{className:"font-mono text-xs text-text-primary truncate",children:t.workflow_id})]})}},{key:"entity",label:"Tool",render:t=>t.entity?s.jsx(L,{type:t.entity,variant:"pipeline",size:"xs"}):s.jsx("span",{className:"text-2xs text-text-tertiary",children:"—"}),className:"w-44 shrink-0"},{key:"created_at",label:"Created",sortable:!0,render:t=>s.jsx(b,{date:t.created_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32"},{key:"updated_at",label:"Updated",sortable:!0,render:t=>s.jsx(b,{date:t.updated_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32"},{key:"duration",label:"Duration",render:t=>s.jsx(U,{startDate:t.created_at,endDate:t.status==="running"?null:t.updated_at,isLive:t.status==="running"}),className:"w-28"},{key:"actions",label:"",render:t=>s.jsxs(B,{children:[s.jsx(q,{icon:G,title:`Filter by ${t.entity}`,onClick:()=>x(t.entity)}),s.jsx("button",{onClick:a=>{a.stopPropagation(),f(t.status)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity",title:`Filter by ${t.status}`,children:s.jsx("svg",{className:`w-[18px] h-[18px] ${J[t.status]??"text-text-tertiary"} hover:opacity-70`,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,children:s.jsx("circle",{cx:"12",cy:"12",r:"6"})})})]}),className:"w-24 text-right"}]}function ge(){const x=V(),{namespace:f,available:t}=E("namespace"),{filters:a,setFilter:n,setFilters:v,pagination:o,sort:u,setSort:j}=z({filters:{search:"",entity:"",status:"",namespace:""}}),[m,_]=d.useState(a.search);d.useEffect(()=>{if(m===a.search)return;const e=setTimeout(()=>n("search",m),300);return()=>clearTimeout(e)},[m,n,a.search]);const{data:l}=M(),h=d.useMemo(()=>{const e=new Set(t);for(const r of(l==null?void 0:l.app_ids)??[])e.add(r);return[...e].sort()},[t,l==null?void 0:l.app_ids]),i=a.namespace||f,{data:c}=R(i),{data:p,isLoading:k,refetch:S,isFetching:N}=T({app_id:i,limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:u.sort_by||"created_at",order:u.order||"desc"}),y=(p==null?void 0:p.total)??0,w=(p==null?void 0:p.jobs)??[],C=K(e=>n("entity",e),e=>n("status",e)),P=d.useMemo(()=>{const e=new Set(h);return i&&e.add(i),[...e].sort().map(r=>({value:r,label:r}))},[h,i]),F=d.useMemo(()=>{const e=new Set((c==null?void 0:c.entities)??[]);return a.entity&&!e.has(a.entity)&&e.add(a.entity),[...e].sort().map(r=>({value:r,label:r}))},[c==null?void 0:c.entities,a.entity]);return s.jsxs("div",{children:[s.jsx(W,{title:"Pipeline Executions",docsHash:"#docs:dashboard.md:graph-executions"}),s.jsxs(H,{actions:s.jsx(O,{onRefresh:()=>S(),isFetching:N,apiPath:$("/pipelines",{app_id:i,limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,status:a.status||void 0,search:a.search||void 0,sort_by:u.sort_by||"created_at",order:u.order||"desc"})}),children:[s.jsx(g,{label:"Namespace",value:i,onChange:e=>{v({namespace:e,entity:""})},options:P,required:!0}),s.jsx("input",{type:"text",placeholder:"Search run ID...",value:m,onChange:e=>_(e.target.value),className:"input text-2xs py-1 px-2 w-56"}),s.jsx(g,{label:"Tool",value:a.entity,onChange:e=>n("entity",e),options:F}),s.jsx(g,{label:"Status",value:a.status,onChange:e=>n("status",e),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]})]}),s.jsx(A,{columns:C,data:w,keyFn:e=>e.workflow_id,onRowClick:e=>x(`/mcp/executions/${encodeURIComponent(e.workflow_id)}?namespace=${i}`),isLoading:k,emptyMessage:"No pipeline executions found",sort:u,onSort:j}),s.jsx(I,{page:o.page,totalPages:o.totalPages(y),onPageChange:o.setPage,total:y,pageSize:o.pageSize,onPageSizeChange:o.setPageSize})]})}export{ge as McpRunsPage};
2
- //# sourceMappingURL=McpRunsPage-L-1y8wnX.js.map
1
+ import{a as d,j as s}from"./vendor-query-RUZdMvN6.js";import{a as R,u as T}from"./pipelines-QMrFoJZX.js";import{a as M}from"./yaml-workflows-BFHrxEl4.js";import{u as z}from"./useFilterParams-crmlBw_l.js";import{u as E}from"./useNamespace-CCu8fZc6.js";import{b as $}from"./api-path-u2Jf9QXS.js";import{D as A}from"./DataTable-Bir0Xs1p.js";import{W as L}from"./WorkflowPill-C5TEWlfO.js";import{E as U}from"./ElapsedCell-CIGRporU.js";import{b}from"./index-C991QfUN.js";import{P as W}from"./PageHeader-B7YJxa4o.js";import{F as H,b as g}from"./FilterBar-2ZfU21EA.js";import{S as I}from"./StickyPagination-DH-0JEyx.js";import{L as O}from"./ListToolbar-DMremj2e.js";import{R as B,a as q}from"./RowActions-eYrzgQSj.js";import{H as G}from"./vendor-icons-Aw7bzBxa.js";import{u as V}from"./vendor-react-CdqEC2zv.js";import"./controlplane-DnJ1VDTs.js";import"./EmptyState-lpUFYfun.js";const Y={running:"in_progress",completed:"completed",failed:"failed"},D={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},J={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function K(x,f){return[{key:"workflow_id",label:"Run ID",render:t=>{const a=D[Y[t.status]??t.status]??"bg-status-pending",n=t.status==="running"?" animate-pulse":"";return s.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[s.jsx("span",{className:`w-2.5 h-2.5 shrink-0 rounded-full dot-ring ${a}${n}`,title:t.status}),s.jsx("span",{className:"font-mono text-xs text-text-primary truncate",children:t.workflow_id})]})}},{key:"entity",label:"Tool",render:t=>t.entity?s.jsx(L,{type:t.entity,variant:"pipeline",size:"xs"}):s.jsx("span",{className:"text-2xs text-text-tertiary",children:"—"}),className:"w-44 shrink-0"},{key:"created_at",label:"Created",sortable:!0,render:t=>s.jsx(b,{date:t.created_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32"},{key:"updated_at",label:"Updated",sortable:!0,render:t=>s.jsx(b,{date:t.updated_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32"},{key:"duration",label:"Duration",render:t=>s.jsx(U,{startDate:t.created_at,endDate:t.status==="running"?null:t.updated_at,isLive:t.status==="running"}),className:"w-28"},{key:"actions",label:"",render:t=>s.jsxs(B,{children:[s.jsx(q,{icon:G,title:`Filter by ${t.entity}`,onClick:()=>x(t.entity)}),s.jsx("button",{onClick:a=>{a.stopPropagation(),f(t.status)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity",title:`Filter by ${t.status}`,children:s.jsx("svg",{className:`w-[18px] h-[18px] ${J[t.status]??"text-text-tertiary"} hover:opacity-70`,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,children:s.jsx("circle",{cx:"12",cy:"12",r:"6"})})})]}),className:"w-24 text-right"}]}function ge(){const x=V(),{namespace:f,available:t}=E("namespace"),{filters:a,setFilter:n,setFilters:v,pagination:o,sort:u,setSort:j}=z({filters:{search:"",entity:"",status:"",namespace:""}}),[m,_]=d.useState(a.search);d.useEffect(()=>{if(m===a.search)return;const e=setTimeout(()=>n("search",m),300);return()=>clearTimeout(e)},[m,n,a.search]);const{data:l}=M(),h=d.useMemo(()=>{const e=new Set(t);for(const r of(l==null?void 0:l.app_ids)??[])e.add(r);return[...e].sort()},[t,l==null?void 0:l.app_ids]),i=a.namespace||f,{data:c}=R(i),{data:p,isLoading:k,refetch:S,isFetching:N}=T({app_id:i,limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:u.sort_by||"created_at",order:u.order||"desc"}),y=(p==null?void 0:p.total)??0,w=(p==null?void 0:p.jobs)??[],C=K(e=>n("entity",e),e=>n("status",e)),P=d.useMemo(()=>{const e=new Set(h);return i&&e.add(i),[...e].sort().map(r=>({value:r,label:r}))},[h,i]),F=d.useMemo(()=>{const e=new Set((c==null?void 0:c.entities)??[]);return a.entity&&!e.has(a.entity)&&e.add(a.entity),[...e].sort().map(r=>({value:r,label:r}))},[c==null?void 0:c.entities,a.entity]);return s.jsxs("div",{children:[s.jsx(W,{title:"Pipeline Executions",docsHash:"#docs:dashboard.md:graph-executions"}),s.jsxs(H,{actions:s.jsx(O,{onRefresh:()=>S(),isFetching:N,apiPath:$("/pipelines",{app_id:i,limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,status:a.status||void 0,search:a.search||void 0,sort_by:u.sort_by||"created_at",order:u.order||"desc"})}),children:[s.jsx(g,{label:"Namespace",value:i,onChange:e=>{v({namespace:e,entity:""})},options:P,required:!0}),s.jsx("input",{type:"text",placeholder:"Search run ID...",value:m,onChange:e=>_(e.target.value),className:"input text-2xs py-1 px-2 w-56"}),s.jsx(g,{label:"Tool",value:a.entity,onChange:e=>n("entity",e),options:F}),s.jsx(g,{label:"Status",value:a.status,onChange:e=>n("status",e),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]})]}),s.jsx(A,{columns:C,data:w,keyFn:e=>e.workflow_id,onRowClick:e=>x(`/mcp/executions/${encodeURIComponent(e.workflow_id)}?namespace=${i}`),isLoading:k,emptyMessage:"No pipeline executions found",sort:u,onSort:j}),s.jsx(I,{page:o.page,totalPages:o.totalPages(y),onPageChange:o.setPage,total:y,pageSize:o.pageSize,onPageSizeChange:o.setPageSize})]})}export{ge as McpRunsPage};
2
+ //# sourceMappingURL=McpRunsPage-Du8GnHFv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"McpRunsPage-L-1y8wnX.js","sources":["../../src/pages/mcp/McpRunsPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Filter } from 'lucide-react';\nimport { useMcpRuns, useMcpEntities } from '../../api/pipelines';\nimport { useYamlWorkflowAppIds } from '../../api/yaml-workflows';\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 { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport type { LTJob } from '../../api/types';\n\nconst statusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nconst STATUS_DOT: Record<string, string> = {\n in_progress: 'bg-status-active',\n completed: 'bg-status-success',\n failed: 'bg-status-error',\n};\n\nconst STATUS_COLORS: Record<string, string> = {\n running: 'text-status-active',\n completed: 'text-status-success',\n failed: 'text-status-error',\n};\n\nfunction buildColumns(\n onFilterEntity: (entity: string) => void,\n onFilterStatus: (status: string) => void,\n): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Run ID',\n render: (row) => {\n const dotClass = STATUS_DOT[statusMap[row.status] ?? row.status] ?? 'bg-status-pending';\n const pulseClass = row.status === 'running' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className={`w-2.5 h-2.5 shrink-0 rounded-full dot-ring ${dotClass}${pulseClass}`} title={row.status} />\n <span className=\"font-mono text-xs text-text-primary truncate\">{row.workflow_id}</span>\n </div>\n );\n },\n },\n {\n key: 'entity',\n label: 'Tool',\n render: (row) => row.entity\n ? <WorkflowPill type={row.entity} variant=\"pipeline\" size=\"xs\" />\n : <span className=\"text-2xs text-text-tertiary\">—</span>,\n className: 'w-44 shrink-0',\n },\n {\n key: 'created_at',\n label: 'Created',\n sortable: true,\n render: (row) => <DateValue date={row.created_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\n },\n {\n key: 'updated_at',\n label: 'Updated',\n sortable: true,\n render: (row) => <DateValue date={row.updated_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\n },\n {\n key: 'duration',\n label: 'Duration',\n render: (row) => (\n <ElapsedCell\n startDate={row.created_at}\n endDate={row.status === 'running' ? null : row.updated_at}\n isLive={row.status === 'running'}\n />\n ),\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Filter}\n title={`Filter by ${row.entity}`}\n onClick={() => onFilterEntity(row.entity)}\n />\n <button\n onClick={(e) => { e.stopPropagation(); onFilterStatus(row.status); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity\"\n title={`Filter by ${row.status}`}\n >\n <svg className={`w-[18px] h-[18px] ${STATUS_COLORS[row.status] ?? 'text-text-tertiary'} hover:opacity-70`} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}>\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n </svg>\n </button>\n </RowActionGroup>\n ),\n className: 'w-24 text-right',\n },\n ];\n}\n\nexport function McpRunsPage() {\n const navigate = useNavigate();\n const { namespace: hookNamespace, available } = useNamespace('namespace');\n const { filters, setFilter, setFilters, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', entity: '', status: '', namespace: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const { data: appIdData } = useYamlWorkflowAppIds();\n\n // Merge real HotMesh namespaces (from controlplane/apps) with YAML workflow app_ids\n const allNamespaceNames = useMemo(() => {\n const set = new Set(available);\n for (const id of appIdData?.app_ids ?? []) {\n set.add(id);\n }\n return [...set].sort();\n }, [available, appIdData?.app_ids]);\n\n const activeNamespace = filters.namespace || hookNamespace;\n const { data: entitiesData } = useMcpEntities(activeNamespace);\n\n const { data: runsData, isLoading, refetch, isFetching } = useMcpRuns({\n app_id: activeNamespace,\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n });\n\n const total = runsData?.total ?? 0;\n const jobs = runsData?.jobs ?? [];\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n );\n\n const namespaces = useMemo(() => {\n const set = new Set(allNamespaceNames);\n if (activeNamespace) set.add(activeNamespace);\n return [...set].sort().map((id) => ({ value: id, label: id }));\n }, [allNamespaceNames, activeNamespace]);\n\n const entities = useMemo(() => {\n const known = new Set(entitiesData?.entities ?? []);\n if (filters.entity && !known.has(filters.entity)) known.add(filters.entity);\n return [...known].sort().map((e) => ({ value: e, label: e }));\n }, [entitiesData?.entities, filters.entity]);\n\n return (\n <div>\n <PageHeader title=\"Pipeline Executions\" docsHash=\"#docs:dashboard.md:graph-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={buildApiPath('/pipelines', {\n app_id: activeNamespace,\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n status: filters.status || undefined,\n search: filters.search || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n })}\n />\n }>\n <FilterSelect\n label=\"Namespace\"\n value={activeNamespace}\n onChange={(v) => {\n setFilters({ namespace: v, entity: '' });\n }}\n options={namespaces}\n required\n />\n <input\n type=\"text\"\n placeholder=\"Search run ID...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-2xs py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Tool\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'running', label: 'Running' },\n { value: 'completed', label: 'Completed' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/mcp/executions/${encodeURIComponent(row.workflow_id)}?namespace=${activeNamespace}`)}\n isLoading={isLoading}\n emptyMessage=\"No pipeline executions found\"\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 </div>\n );\n}\n"],"names":["statusMap","STATUS_DOT","STATUS_COLORS","buildColumns","onFilterEntity","onFilterStatus","row","dotClass","pulseClass","jsxs","jsx","WorkflowPill","DateValue","ElapsedCell","RowActionGroup","RowAction","Filter","e","McpRunsPage","navigate","useNavigate","hookNamespace","available","useNamespace","filters","setFilter","setFilters","pagination","sort","setSort","useFilterParams","searchInput","setSearchInput","useState","useEffect","timer","appIdData","useYamlWorkflowAppIds","allNamespaceNames","useMemo","set","id","activeNamespace","entitiesData","useMcpEntities","runsData","isLoading","refetch","isFetching","useMcpRuns","total","jobs","columns","entity","status","namespaces","entities","known","PageHeader","FilterBar","ListToolbar","buildApiPath","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
1
+ {"version":3,"file":"McpRunsPage-Du8GnHFv.js","sources":["../../src/pages/mcp/McpRunsPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Filter } from 'lucide-react';\nimport { useMcpRuns, useMcpEntities } from '../../api/pipelines';\nimport { useYamlWorkflowAppIds } from '../../api/yaml-workflows';\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 { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport type { LTJob } from '../../api/types';\n\nconst statusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nconst STATUS_DOT: Record<string, string> = {\n in_progress: 'bg-status-active',\n completed: 'bg-status-success',\n failed: 'bg-status-error',\n};\n\nconst STATUS_COLORS: Record<string, string> = {\n running: 'text-status-active',\n completed: 'text-status-success',\n failed: 'text-status-error',\n};\n\nfunction buildColumns(\n onFilterEntity: (entity: string) => void,\n onFilterStatus: (status: string) => void,\n): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Run ID',\n render: (row) => {\n const dotClass = STATUS_DOT[statusMap[row.status] ?? row.status] ?? 'bg-status-pending';\n const pulseClass = row.status === 'running' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className={`w-2.5 h-2.5 shrink-0 rounded-full dot-ring ${dotClass}${pulseClass}`} title={row.status} />\n <span className=\"font-mono text-xs text-text-primary truncate\">{row.workflow_id}</span>\n </div>\n );\n },\n },\n {\n key: 'entity',\n label: 'Tool',\n render: (row) => row.entity\n ? <WorkflowPill type={row.entity} variant=\"pipeline\" size=\"xs\" />\n : <span className=\"text-2xs text-text-tertiary\">—</span>,\n className: 'w-44 shrink-0',\n },\n {\n key: 'created_at',\n label: 'Created',\n sortable: true,\n render: (row) => <DateValue date={row.created_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\n },\n {\n key: 'updated_at',\n label: 'Updated',\n sortable: true,\n render: (row) => <DateValue date={row.updated_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\n },\n {\n key: 'duration',\n label: 'Duration',\n render: (row) => (\n <ElapsedCell\n startDate={row.created_at}\n endDate={row.status === 'running' ? null : row.updated_at}\n isLive={row.status === 'running'}\n />\n ),\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Filter}\n title={`Filter by ${row.entity}`}\n onClick={() => onFilterEntity(row.entity)}\n />\n <button\n onClick={(e) => { e.stopPropagation(); onFilterStatus(row.status); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity\"\n title={`Filter by ${row.status}`}\n >\n <svg className={`w-[18px] h-[18px] ${STATUS_COLORS[row.status] ?? 'text-text-tertiary'} hover:opacity-70`} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}>\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n </svg>\n </button>\n </RowActionGroup>\n ),\n className: 'w-24 text-right',\n },\n ];\n}\n\nexport function McpRunsPage() {\n const navigate = useNavigate();\n const { namespace: hookNamespace, available } = useNamespace('namespace');\n const { filters, setFilter, setFilters, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', entity: '', status: '', namespace: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const { data: appIdData } = useYamlWorkflowAppIds();\n\n // Merge real HotMesh namespaces (from controlplane/apps) with YAML workflow app_ids\n const allNamespaceNames = useMemo(() => {\n const set = new Set(available);\n for (const id of appIdData?.app_ids ?? []) {\n set.add(id);\n }\n return [...set].sort();\n }, [available, appIdData?.app_ids]);\n\n const activeNamespace = filters.namespace || hookNamespace;\n const { data: entitiesData } = useMcpEntities(activeNamespace);\n\n const { data: runsData, isLoading, refetch, isFetching } = useMcpRuns({\n app_id: activeNamespace,\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n });\n\n const total = runsData?.total ?? 0;\n const jobs = runsData?.jobs ?? [];\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n );\n\n const namespaces = useMemo(() => {\n const set = new Set(allNamespaceNames);\n if (activeNamespace) set.add(activeNamespace);\n return [...set].sort().map((id) => ({ value: id, label: id }));\n }, [allNamespaceNames, activeNamespace]);\n\n const entities = useMemo(() => {\n const known = new Set(entitiesData?.entities ?? []);\n if (filters.entity && !known.has(filters.entity)) known.add(filters.entity);\n return [...known].sort().map((e) => ({ value: e, label: e }));\n }, [entitiesData?.entities, filters.entity]);\n\n return (\n <div>\n <PageHeader title=\"Pipeline Executions\" docsHash=\"#docs:dashboard.md:graph-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={buildApiPath('/pipelines', {\n app_id: activeNamespace,\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n status: filters.status || undefined,\n search: filters.search || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n })}\n />\n }>\n <FilterSelect\n label=\"Namespace\"\n value={activeNamespace}\n onChange={(v) => {\n setFilters({ namespace: v, entity: '' });\n }}\n options={namespaces}\n required\n />\n <input\n type=\"text\"\n placeholder=\"Search run ID...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-2xs py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Tool\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'running', label: 'Running' },\n { value: 'completed', label: 'Completed' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/mcp/executions/${encodeURIComponent(row.workflow_id)}?namespace=${activeNamespace}`)}\n isLoading={isLoading}\n emptyMessage=\"No pipeline executions found\"\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 </div>\n );\n}\n"],"names":["statusMap","STATUS_DOT","STATUS_COLORS","buildColumns","onFilterEntity","onFilterStatus","row","dotClass","pulseClass","jsxs","jsx","WorkflowPill","DateValue","ElapsedCell","RowActionGroup","RowAction","Filter","e","McpRunsPage","navigate","useNavigate","hookNamespace","available","useNamespace","filters","setFilter","setFilters","pagination","sort","setSort","useFilterParams","searchInput","setSearchInput","useState","useEffect","timer","appIdData","useYamlWorkflowAppIds","allNamespaceNames","useMemo","set","id","activeNamespace","entitiesData","useMcpEntities","runsData","isLoading","refetch","isFetching","useMcpRuns","total","jobs","columns","entity","status","namespaces","entities","known","PageHeader","FilterBar","ListToolbar","buildApiPath","FilterSelect","v","DataTable","StickyPagination"],"mappings":"y2BAmBA,MAAMA,EAAoC,CACxC,QAAS,cACT,UAAW,YACX,OAAQ,QACV,EAEMC,EAAqC,CACzC,YAAa,mBACb,UAAW,oBACX,OAAQ,iBACV,EAEMC,EAAwC,CAC5C,QAAS,qBACT,UAAW,sBACX,OAAQ,mBACV,EAEA,SAASC,EACPC,EACAC,EACiB,CACjB,MAAO,CACL,CACE,IAAK,cACL,MAAO,SACP,OAASC,GAAQ,CACf,MAAMC,EAAWN,EAAWD,EAAUM,EAAI,MAAM,GAAKA,EAAI,MAAM,GAAK,oBAC9DE,EAAaF,EAAI,SAAW,UAAY,iBAAmB,GACjE,OACEG,EAAAA,KAAC,MAAA,CAAI,UAAU,kCACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAW,8CAA8CH,CAAQ,GAAGC,CAAU,GAAI,MAAOF,EAAI,MAAA,CAAQ,EAC3GI,EAAAA,IAAC,OAAA,CAAK,UAAU,+CAAgD,WAAI,WAAA,CAAY,CAAA,EAClF,CAEJ,CAAA,EAEF,CACE,IAAK,SACL,MAAO,OACP,OAASJ,GAAQA,EAAI,OACjBI,MAACC,GAAa,KAAML,EAAI,OAAQ,QAAQ,WAAW,KAAK,KAAK,QAC5D,OAAA,CAAK,UAAU,8BAA8B,SAAA,IAAC,EACnD,UAAW,eAAA,EAEb,CACE,IAAK,aACL,MAAO,UACP,SAAU,GACV,OAASA,GAAQI,MAACE,EAAA,CAAU,KAAMN,EAAI,WAAY,OAAO,WAAW,UAAU,+CAAA,CAAgD,EAC9H,UAAW,MAAA,EAEb,CACE,IAAK,aACL,MAAO,UACP,SAAU,GACV,OAASA,GAAQI,MAACE,EAAA,CAAU,KAAMN,EAAI,WAAY,OAAO,WAAW,UAAU,+CAAA,CAAgD,EAC9H,UAAW,MAAA,EAEb,CACE,IAAK,WACL,MAAO,WACP,OAASA,GACPI,EAAAA,IAACG,EAAA,CACC,UAAWP,EAAI,WACf,QAASA,EAAI,SAAW,UAAY,KAAOA,EAAI,WAC/C,OAAQA,EAAI,SAAW,SAAA,CAAA,EAG3B,UAAW,MAAA,EAEb,CACE,IAAK,UACL,MAAO,GACP,OAASA,GACPG,EAAAA,KAACK,EAAA,CACC,SAAA,CAAAJ,EAAAA,IAACK,EAAA,CACC,KAAMC,EACN,MAAO,aAAaV,EAAI,MAAM,GAC9B,QAAS,IAAMF,EAAeE,EAAI,MAAM,CAAA,CAAA,EAE1CI,EAAAA,IAAC,SAAA,CACC,QAAUO,GAAM,CAAEA,EAAE,gBAAA,EAAmBZ,EAAeC,EAAI,MAAM,CAAG,EACnE,UAAU,2DACV,MAAO,aAAaA,EAAI,MAAM,GAE9B,SAAAI,EAAAA,IAAC,MAAA,CAAI,UAAW,qBAAqBR,EAAcI,EAAI,MAAM,GAAK,oBAAoB,oBAAqB,QAAQ,YAAY,KAAK,OAAO,OAAO,eAAe,YAAa,IAC5K,SAAAI,EAAAA,IAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,GAAA,CAAI,CAAA,CAChC,CAAA,CAAA,CACF,EACF,EAEF,UAAW,iBAAA,CACb,CAEJ,CAEO,SAASQ,IAAc,CAC5B,MAAMC,EAAWC,EAAA,EACX,CAAE,UAAWC,EAAe,UAAAC,CAAA,EAAcC,EAAa,WAAW,EAClE,CAAE,QAAAC,EAAS,UAAAC,EAAW,WAAAC,EAAY,WAAAC,EAAY,KAAAC,EAAM,QAAAC,CAAA,EAAYC,EAAgB,CACpF,QAAS,CAAE,OAAQ,GAAI,OAAQ,GAAI,OAAQ,GAAI,UAAW,EAAA,CAAG,CAC9D,EAEK,CAACC,EAAaC,CAAc,EAAIC,EAAAA,SAAST,EAAQ,MAAM,EAE7DU,EAAAA,UAAU,IAAM,CACd,GAAIH,IAAgBP,EAAQ,OAAQ,OACpC,MAAMW,EAAQ,WAAW,IAAMV,EAAU,SAAUM,CAAW,EAAG,GAAG,EACpE,MAAO,IAAM,aAAaI,CAAK,CACjC,EAAG,CAACJ,EAAaN,EAAWD,EAAQ,MAAM,CAAC,EAE3C,KAAM,CAAE,KAAMY,CAAA,EAAcC,EAAA,EAGtBC,EAAoBC,EAAAA,QAAQ,IAAM,CACtC,MAAMC,EAAM,IAAI,IAAIlB,CAAS,EAC7B,UAAWmB,KAAML,GAAA,YAAAA,EAAW,UAAW,CAAA,EACrCI,EAAI,IAAIC,CAAE,EAEZ,MAAO,CAAC,GAAGD,CAAG,EAAE,KAAA,CAClB,EAAG,CAAClB,EAAWc,GAAA,YAAAA,EAAW,OAAO,CAAC,EAE5BM,EAAkBlB,EAAQ,WAAaH,EACvC,CAAE,KAAMsB,GAAiBC,EAAeF,CAAe,EAEvD,CAAE,KAAMG,EAAU,UAAAC,EAAW,QAAAC,EAAS,WAAAC,CAAA,EAAeC,EAAW,CACpE,OAAQP,EACR,MAAOf,EAAW,SAClB,OAAQA,EAAW,OACnB,OAAQH,EAAQ,QAAU,OAC1B,OAAQA,EAAQ,QAAU,OAC1B,OAAQA,EAAQ,QAAU,OAC1B,QAASI,EAAK,SAAW,aACzB,MAAOA,EAAK,OAAS,MAAA,CACtB,EAEKsB,GAAQL,GAAA,YAAAA,EAAU,QAAS,EAC3BM,GAAON,GAAA,YAAAA,EAAU,OAAQ,CAAA,EAEzBO,EAAUjD,EACbkD,GAAW5B,EAAU,SAAU4B,CAAM,EACrCC,GAAW7B,EAAU,SAAU6B,CAAM,CAAA,EAGlCC,EAAahB,EAAAA,QAAQ,IAAM,CAC/B,MAAMC,EAAM,IAAI,IAAIF,CAAiB,EACrC,OAAII,GAAiBF,EAAI,IAAIE,CAAe,EACrC,CAAC,GAAGF,CAAG,EAAE,OAAO,IAAKC,IAAQ,CAAE,MAAOA,EAAI,MAAOA,GAAK,CAC/D,EAAG,CAACH,EAAmBI,CAAe,CAAC,EAEjCc,EAAWjB,EAAAA,QAAQ,IAAM,CAC7B,MAAMkB,EAAQ,IAAI,KAAId,GAAA,YAAAA,EAAc,WAAY,CAAA,CAAE,EAClD,OAAInB,EAAQ,QAAU,CAACiC,EAAM,IAAIjC,EAAQ,MAAM,GAAGiC,EAAM,IAAIjC,EAAQ,MAAM,EACnE,CAAC,GAAGiC,CAAK,EAAE,OAAO,IAAKxC,IAAO,CAAE,MAAOA,EAAG,MAAOA,GAAI,CAC9D,EAAG,CAAC0B,GAAA,YAAAA,EAAc,SAAUnB,EAAQ,MAAM,CAAC,EAE3C,cACG,MAAA,CACC,SAAA,CAAAd,EAAAA,IAACgD,EAAA,CAAW,MAAM,sBAAsB,SAAS,sCAAsC,EAEvFjD,OAACkD,GAAU,QACTjD,EAAAA,IAACkD,EAAA,CACC,UAAW,IAAMb,EAAA,EACjB,WAAAC,EACA,QAASa,EAAa,aAAc,CAClC,OAAQnB,EACR,MAAOf,EAAW,SAClB,OAAQA,EAAW,OACnB,OAAQH,EAAQ,QAAU,OAC1B,OAAQA,EAAQ,QAAU,OAC1B,OAAQA,EAAQ,QAAU,OAC1B,QAASI,EAAK,SAAW,aACzB,MAAOA,EAAK,OAAS,MAAA,CACtB,CAAA,CAAA,EAGH,SAAA,CAAAlB,EAAAA,IAACoD,EAAA,CACC,MAAM,YACN,MAAOpB,EACP,SAAWqB,GAAM,CACfrC,EAAW,CAAE,UAAWqC,EAAG,OAAQ,GAAI,CACzC,EACA,QAASR,EACT,SAAQ,EAAA,CAAA,EAEV7C,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,YAAY,mBACZ,MAAOqB,EACP,SAAW,GAAMC,EAAe,EAAE,OAAO,KAAK,EAC9C,UAAU,+BAAA,CAAA,EAEZtB,EAAAA,IAACoD,EAAA,CACC,MAAM,OACN,MAAOtC,EAAQ,OACf,SAAWuC,GAAMtC,EAAU,SAAUsC,CAAC,EACtC,QAASP,CAAA,CAAA,EAEX9C,EAAAA,IAACoD,EAAA,CACC,MAAM,SACN,MAAOtC,EAAQ,OACf,SAAWuC,GAAMtC,EAAU,SAAUsC,CAAC,EACtC,QAAS,CACP,CAAE,MAAO,UAAW,MAAO,SAAA,EAC3B,CAAE,MAAO,YAAa,MAAO,WAAA,EAC7B,CAAE,MAAO,SAAU,MAAO,QAAA,CAAS,CACrC,CAAA,CACF,EACF,EAEArD,EAAAA,IAACsD,EAAA,CACC,QAAAZ,EACA,KAAMD,EACN,MAAQ7C,GAAQA,EAAI,YACpB,WAAaA,GAAQa,EAAS,mBAAmB,mBAAmBb,EAAI,WAAW,CAAC,cAAcoC,CAAe,EAAE,EACnH,UAAAI,EACA,aAAa,+BACb,KAAAlB,EACA,OAAQC,CAAA,CAAA,EAGVnB,EAAAA,IAACuD,EAAA,CACC,KAAMtC,EAAW,KACjB,WAAYA,EAAW,WAAWuB,CAAK,EACvC,aAAcvB,EAAW,QACzB,MAAAuB,EACA,SAAUvB,EAAW,SACrB,iBAAkBA,EAAW,WAAA,CAAA,CAC/B,EACF,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as t}from"./vendor-query-RUZdMvN6.js";import{_ as r}from"./vendor-icons-BxuyFxH2.js";function m({namespace:e,size:s="sm"}){const a=s==="md"?"px-2 py-0.5 text-xs gap-1.5":"px-1.5 py-px text-2xs gap-1",n=s==="md"?"w-2.5 h-2.5":"w-2 h-2";return t.jsxs("span",{className:`inline-flex items-center ${a} font-mono text-text-tertiary bg-surface-sunken/50 rounded-md`,children:[t.jsx(r,{className:`${n} shrink-0 text-text-quaternary`,strokeWidth:1.5}),e]})}export{m as N};
2
- //# sourceMappingURL=NamespacePill-in1SLd0W.js.map
1
+ import{j as t}from"./vendor-query-RUZdMvN6.js";import{_ as r}from"./vendor-icons-Aw7bzBxa.js";function m({namespace:e,size:s="sm"}){const a=s==="md"?"px-2 py-0.5 text-xs gap-1.5":"px-1.5 py-px text-2xs gap-1",n=s==="md"?"w-2.5 h-2.5":"w-2 h-2";return t.jsxs("span",{className:`inline-flex items-center ${a} font-mono text-text-tertiary bg-surface-sunken/50 rounded-md`,children:[t.jsx(r,{className:`${n} shrink-0 text-text-quaternary`,strokeWidth:1.5}),e]})}export{m as N};
2
+ //# sourceMappingURL=NamespacePill-C09QuOEz.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NamespacePill-in1SLd0W.js","sources":["../../src/components/common/display/NamespacePill.tsx"],"sourcesContent":["import { Layers } from 'lucide-react';\n\ninterface NamespacePillProps {\n namespace: string;\n size?: 'sm' | 'md';\n}\n\n/**\n * The namespace a workflow belongs to — `graph` for graph flows in the graph\n * app, `durable` for procedural workflows. A subtle attribute pill, never a card.\n */\nexport function NamespacePill({ namespace, size = 'sm' }: NamespacePillProps) {\n const sizeClass = size === 'md'\n ? 'px-2 py-0.5 text-xs gap-1.5'\n : 'px-1.5 py-px text-2xs gap-1';\n const iconClass = size === 'md' ? 'w-2.5 h-2.5' : 'w-2 h-2';\n\n return (\n <span className={`inline-flex items-center ${sizeClass} font-mono text-text-tertiary bg-surface-sunken/50 rounded-md`}>\n <Layers className={`${iconClass} shrink-0 text-text-quaternary`} strokeWidth={1.5} />\n {namespace}\n </span>\n );\n}\n"],"names":["NamespacePill","namespace","size","sizeClass","iconClass","jsxs","jsx","Layers"],"mappings":"8FAWO,SAASA,EAAc,CAAE,UAAAC,EAAW,KAAAC,EAAO,MAA4B,CAC5E,MAAMC,EAAYD,IAAS,KACvB,8BACA,8BACEE,EAAYF,IAAS,KAAO,cAAgB,UAElD,OACEG,EAAAA,KAAC,OAAA,CAAK,UAAW,4BAA4BF,CAAS,gEACpD,SAAA,CAAAG,MAACC,GAAO,UAAW,GAAGH,CAAS,iCAAkC,YAAa,IAAK,EAClFH,CAAA,EACH,CAEJ"}
1
+ {"version":3,"file":"NamespacePill-C09QuOEz.js","sources":["../../src/components/common/display/NamespacePill.tsx"],"sourcesContent":["import { Layers } from 'lucide-react';\n\ninterface NamespacePillProps {\n namespace: string;\n size?: 'sm' | 'md';\n}\n\n/**\n * The namespace a workflow belongs to — `graph` for graph flows in the graph\n * app, `durable` for procedural workflows. A subtle attribute pill, never a card.\n */\nexport function NamespacePill({ namespace, size = 'sm' }: NamespacePillProps) {\n const sizeClass = size === 'md'\n ? 'px-2 py-0.5 text-xs gap-1.5'\n : 'px-1.5 py-px text-2xs gap-1';\n const iconClass = size === 'md' ? 'w-2.5 h-2.5' : 'w-2 h-2';\n\n return (\n <span className={`inline-flex items-center ${sizeClass} font-mono text-text-tertiary bg-surface-sunken/50 rounded-md`}>\n <Layers className={`${iconClass} shrink-0 text-text-quaternary`} strokeWidth={1.5} />\n {namespace}\n </span>\n );\n}\n"],"names":["NamespacePill","namespace","size","sizeClass","iconClass","jsxs","jsx","Layers"],"mappings":"8FAWO,SAASA,EAAc,CAAE,UAAAC,EAAW,KAAAC,EAAO,MAA4B,CAC5E,MAAMC,EAAYD,IAAS,KACvB,8BACA,8BACEE,EAAYF,IAAS,KAAO,cAAgB,UAElD,OACEG,EAAAA,KAAC,OAAA,CAAK,UAAW,4BAA4BF,CAAS,gEACpD,SAAA,CAAAG,MAACC,GAAO,UAAW,GAAGH,CAAS,iCAAkC,YAAa,IAAK,EAClFH,CAAA,EACH,CAEJ"}