@hotmeshio/long-tail 0.4.2 → 0.4.4

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 (252) hide show
  1. package/build/api/settings.js +4 -0
  2. package/build/lib/db/index.d.ts +1 -7
  3. package/build/lib/db/schemas/008_capability_reaction.sql +12 -0
  4. package/build/lib/db/schemas/009_file_topic_category.sql +10 -0
  5. package/build/lib/events/index.d.ts +9 -0
  6. package/build/lib/events/index.js +15 -0
  7. package/build/lib/events/nats.d.ts +15 -1
  8. package/build/lib/events/nats.js +44 -2
  9. package/build/lib/events/publish.d.ts +10 -0
  10. package/build/lib/events/publish.js +28 -0
  11. package/build/modules/config.d.ts +1 -7
  12. package/build/services/agent/subscription-sql.d.ts +3 -3
  13. package/build/services/agent/subscription-sql.js +7 -5
  14. package/build/services/agent/subscriptions.d.ts +3 -1
  15. package/build/services/agent/subscriptions.js +6 -0
  16. package/build/services/agent/trigger-registry.js +18 -0
  17. package/build/services/export/index.js +36 -2
  18. package/build/services/topics/system-topics.js +29 -0
  19. package/build/services/yaml-workflow/deployer.d.ts +1 -1
  20. package/build/services/yaml-workflow/deployer.js +2 -2
  21. package/build/services/yaml-workflow/invoke.d.ts +2 -0
  22. package/build/services/yaml-workflow/invoke.js +5 -1
  23. package/build/start/adapters.js +11 -9
  24. package/build/start/config.js +4 -0
  25. package/build/start/workers.js +12 -3
  26. package/build/system/index.js +16 -0
  27. package/build/system/mcp-servers/file-storage.js +18 -0
  28. package/build/system/workflows/capability-invoke/activities.d.ts +12 -0
  29. package/build/system/workflows/capability-invoke/activities.js +14 -0
  30. package/build/system/workflows/capability-invoke/index.d.ts +14 -0
  31. package/build/system/workflows/capability-invoke/index.js +74 -0
  32. package/build/tsconfig.tsbuildinfo +1 -1
  33. package/build/types/events.d.ts +13 -1
  34. package/build/types/startup.d.ts +7 -0
  35. package/dashboard/dist/assets/{AdminDashboard-C0_qN2h3.js → AdminDashboard-DISq0Tz8.js} +2 -2
  36. package/dashboard/dist/assets/{AdminDashboard-C0_qN2h3.js.map → AdminDashboard-DISq0Tz8.js.map} +1 -1
  37. package/dashboard/dist/assets/AgentConfigPage-DqaJpB3K.js +16 -0
  38. package/dashboard/dist/assets/AgentConfigPage-DqaJpB3K.js.map +1 -0
  39. package/dashboard/dist/assets/AgentDetailPage-BPzPk2GC.js +4 -0
  40. package/dashboard/dist/assets/AgentDetailPage-BPzPk2GC.js.map +1 -0
  41. package/dashboard/dist/assets/AgentsPage-CLcxJWjC.js +2 -0
  42. package/dashboard/dist/assets/AgentsPage-CLcxJWjC.js.map +1 -0
  43. package/dashboard/dist/assets/AvailableEscalationsPage-hOcjAAIj.js +2 -0
  44. package/dashboard/dist/assets/{AvailableEscalationsPage-DrarbHov.js.map → AvailableEscalationsPage-hOcjAAIj.js.map} +1 -1
  45. package/dashboard/dist/assets/{BotPicker-CvXQwE5Z.js → BotPicker-DuAZgHbJ.js} +2 -2
  46. package/dashboard/dist/assets/{BotPicker-CvXQwE5Z.js.map → BotPicker-DuAZgHbJ.js.map} +1 -1
  47. package/dashboard/dist/assets/CapabilitiesPage-PRel6TXd.js +2 -0
  48. package/dashboard/dist/assets/CapabilitiesPage-PRel6TXd.js.map +1 -0
  49. package/dashboard/dist/assets/{CollapsibleSection-D9F01Tny.js → CollapsibleSection-DnoUFQVf.js} +2 -2
  50. package/dashboard/dist/assets/{CollapsibleSection-D9F01Tny.js.map → CollapsibleSection-DnoUFQVf.js.map} +1 -1
  51. package/dashboard/dist/assets/CopyableId-D0SQ39nR.js +2 -0
  52. package/dashboard/dist/assets/CopyableId-D0SQ39nR.js.map +1 -0
  53. package/dashboard/dist/assets/{CredentialsPage-C-rjAIK3.js → CredentialsPage-CqedUU7b.js} +2 -2
  54. package/dashboard/dist/assets/{CredentialsPage-C-rjAIK3.js.map → CredentialsPage-CqedUU7b.js.map} +1 -1
  55. package/dashboard/dist/assets/{CronLabel-DnZF8_vw.js → CronLabel-CPEjE-mH.js} +2 -2
  56. package/dashboard/dist/assets/CronLabel-CPEjE-mH.js.map +1 -0
  57. package/dashboard/dist/assets/CustomDurationPicker-BIQWzbv0.js +2 -0
  58. package/dashboard/dist/assets/{CustomDurationPicker-BYDrcsYT.js.map → CustomDurationPicker-BIQWzbv0.js.map} +1 -1
  59. package/dashboard/dist/assets/{DropZone-BEW3jBzf.js → DropZone-e5EOL5gC.js} +2 -2
  60. package/dashboard/dist/assets/{DropZone-BEW3jBzf.js.map → DropZone-e5EOL5gC.js.map} +1 -1
  61. package/dashboard/dist/assets/ElapsedCell-CzVjr74Y.js +2 -0
  62. package/dashboard/dist/assets/{ElapsedCell-BkiVdGaJ.js.map → ElapsedCell-CzVjr74Y.js.map} +1 -1
  63. package/dashboard/dist/assets/{EscalationsOverview-Cg2SN0WK.js → EscalationsOverview-Bcrb44xJ.js} +2 -2
  64. package/dashboard/dist/assets/{EscalationsOverview-Cg2SN0WK.js.map → EscalationsOverview-Bcrb44xJ.js.map} +1 -1
  65. package/dashboard/dist/assets/EventTable-CGfJU7e1.js +2 -0
  66. package/dashboard/dist/assets/EventTable-CGfJU7e1.js.map +1 -0
  67. package/dashboard/dist/assets/{EventTopicPill-By-6sXDp.js → EventTopicPill-xJJnxvlP.js} +2 -2
  68. package/dashboard/dist/assets/{EventTopicPill-By-6sXDp.js.map → EventTopicPill-xJJnxvlP.js.map} +1 -1
  69. package/dashboard/dist/assets/{HomePage-74mCQ5nB.js → HomePage-BIzUcGW9.js} +2 -2
  70. package/dashboard/dist/assets/{HomePage-74mCQ5nB.js.map → HomePage-BIzUcGW9.js.map} +1 -1
  71. package/dashboard/dist/assets/{ListToolbar-DL1wEuvL.js → ListToolbar-DNAGFe14.js} +2 -2
  72. package/dashboard/dist/assets/{ListToolbar-DL1wEuvL.js.map → ListToolbar-DNAGFe14.js.map} +1 -1
  73. package/dashboard/dist/assets/{McpOverview-D34bLMuP.js → McpOverview-BpYk21es.js} +2 -2
  74. package/dashboard/dist/assets/{McpOverview-D34bLMuP.js.map → McpOverview-BpYk21es.js.map} +1 -1
  75. package/dashboard/dist/assets/{McpQueryDetailPage-gLGTGX6g.js → McpQueryDetailPage-DlrZiSuL.js} +2 -2
  76. package/dashboard/dist/assets/{McpQueryDetailPage-gLGTGX6g.js.map → McpQueryDetailPage-DlrZiSuL.js.map} +1 -1
  77. package/dashboard/dist/assets/{McpQueryPage-wPHJkhEp.js → McpQueryPage-COfPssO7.js} +2 -2
  78. package/dashboard/dist/assets/{McpQueryPage-wPHJkhEp.js.map → McpQueryPage-COfPssO7.js.map} +1 -1
  79. package/dashboard/dist/assets/McpRunDetailPage-Cra0nQSw.js +2 -0
  80. package/dashboard/dist/assets/McpRunDetailPage-Cra0nQSw.js.map +1 -0
  81. package/dashboard/dist/assets/{McpRunsPage-BUSxdydO.js → McpRunsPage-BlgcGN3k.js} +2 -2
  82. package/dashboard/dist/assets/{McpRunsPage-BUSxdydO.js.map → McpRunsPage-BlgcGN3k.js.map} +1 -1
  83. package/dashboard/dist/assets/{OperatorDashboard-CYCl2our.js → OperatorDashboard-BbO6cWzb.js} +2 -2
  84. package/dashboard/dist/assets/{OperatorDashboard-CYCl2our.js.map → OperatorDashboard-BbO6cWzb.js.map} +1 -1
  85. package/dashboard/dist/assets/{PageHeader-Bo0SpcCK.js → PageHeader-B_gV_jKk.js} +2 -2
  86. package/dashboard/dist/assets/{PageHeader-Bo0SpcCK.js.map → PageHeader-B_gV_jKk.js.map} +1 -1
  87. package/dashboard/dist/assets/{PageHeaderWithStats-7K5BdhOj.js → PageHeaderWithStats-D0I0nrnx.js} +2 -2
  88. package/dashboard/dist/assets/{PageHeaderWithStats-7K5BdhOj.js.map → PageHeaderWithStats-D0I0nrnx.js.map} +1 -1
  89. package/dashboard/dist/assets/ProcessDetailPage-s_iV8ICg.js +2 -0
  90. package/dashboard/dist/assets/{ProcessDetailPage-DzGacZpO.js.map → ProcessDetailPage-s_iV8ICg.js.map} +1 -1
  91. package/dashboard/dist/assets/{ProcessesListPage-Bmn33g_l.js → ProcessesListPage-MnLMnxAa.js} +2 -2
  92. package/dashboard/dist/assets/{ProcessesListPage-Bmn33g_l.js.map → ProcessesListPage-MnLMnxAa.js.map} +1 -1
  93. package/dashboard/dist/assets/{RolePill-BDzPFQUv.js → RolePill-BOBytzrP.js} +2 -2
  94. package/dashboard/dist/assets/{RolePill-BDzPFQUv.js.map → RolePill-BOBytzrP.js.map} +1 -1
  95. package/dashboard/dist/assets/{RolesPage-BTtaabkS.js → RolesPage-BH7KASM7.js} +2 -2
  96. package/dashboard/dist/assets/{RolesPage-BTtaabkS.js.map → RolesPage-BH7KASM7.js.map} +1 -1
  97. package/dashboard/dist/assets/{RunAsSelector-B1R8nJvE.js → RunAsSelector-_QbJKhlo.js} +2 -2
  98. package/dashboard/dist/assets/{RunAsSelector-B1R8nJvE.js.map → RunAsSelector-_QbJKhlo.js.map} +1 -1
  99. package/dashboard/dist/assets/{ServerName-CEOFF7UG.js → ServerName-uqa4eBqm.js} +2 -2
  100. package/dashboard/dist/assets/{ServerName-CEOFF7UG.js.map → ServerName-uqa4eBqm.js.map} +1 -1
  101. package/dashboard/dist/assets/SwimlaneTimeline-og79Llvs.js +2 -0
  102. package/dashboard/dist/assets/SwimlaneTimeline-og79Llvs.js.map +1 -0
  103. package/dashboard/dist/assets/{TagInput-VBY0xIwb.js → TagInput-D3f11sbM.js} +2 -2
  104. package/dashboard/dist/assets/{TagInput-VBY0xIwb.js.map → TagInput-D3f11sbM.js.map} +1 -1
  105. package/dashboard/dist/assets/{TaskDetailPage-CZw_F8y4.js → TaskDetailPage-DPV4ySd9.js} +2 -2
  106. package/dashboard/dist/assets/{TaskDetailPage-CZw_F8y4.js.map → TaskDetailPage-DPV4ySd9.js.map} +1 -1
  107. package/dashboard/dist/assets/{TaskQueuePill-DZykFijh.js → TaskQueuePill-Bc45J7X1.js} +2 -2
  108. package/dashboard/dist/assets/{TaskQueuePill-DZykFijh.js.map → TaskQueuePill-Bc45J7X1.js.map} +1 -1
  109. package/dashboard/dist/assets/{TasksListPage-D-vHndyV.js → TasksListPage-BYj3OqUi.js} +2 -2
  110. package/dashboard/dist/assets/{TasksListPage-D-vHndyV.js.map → TasksListPage-BYj3OqUi.js.map} +1 -1
  111. package/dashboard/dist/assets/TimeAgo-W7TdJpV-.js +2 -0
  112. package/dashboard/dist/assets/{TimeAgo-B6Gz4RAU.js.map → TimeAgo-W7TdJpV-.js.map} +1 -1
  113. package/dashboard/dist/assets/{TimestampCell-DZu9PtN2.js → TimestampCell-Bi2nc9Q_.js} +2 -2
  114. package/dashboard/dist/assets/{TimestampCell-DZu9PtN2.js.map → TimestampCell-Bi2nc9Q_.js.map} +1 -1
  115. package/dashboard/dist/assets/{ToolPill-RP2Tvlrx.js → ToolPill-CuoXcmhv.js} +2 -2
  116. package/dashboard/dist/assets/{ToolPill-RP2Tvlrx.js.map → ToolPill-CuoXcmhv.js.map} +1 -1
  117. package/dashboard/dist/assets/ToolTestPanel-Dl3C53zb.js +2 -0
  118. package/dashboard/dist/assets/ToolTestPanel-Dl3C53zb.js.map +1 -0
  119. package/dashboard/dist/assets/{TopicDetailPage-C5ZUZpU5.js → TopicDetailPage-CjaZn4WP.js} +2 -2
  120. package/dashboard/dist/assets/{TopicDetailPage-C5ZUZpU5.js.map → TopicDetailPage-CjaZn4WP.js.map} +1 -1
  121. package/dashboard/dist/assets/{TopicsPage-Cbc0nVj9.js → TopicsPage-BfsJEC1p.js} +2 -2
  122. package/dashboard/dist/assets/{TopicsPage-Cbc0nVj9.js.map → TopicsPage-BfsJEC1p.js.map} +1 -1
  123. package/dashboard/dist/assets/{UserName-YUoNrFAq.js → UserName-b4baWHM_.js} +2 -2
  124. package/dashboard/dist/assets/{UserName-YUoNrFAq.js.map → UserName-b4baWHM_.js.map} +1 -1
  125. package/dashboard/dist/assets/WorkflowExecutionPage-BGmJnXnk.js +2 -0
  126. package/dashboard/dist/assets/WorkflowExecutionPage-BGmJnXnk.js.map +1 -0
  127. package/dashboard/dist/assets/WorkflowPill-Bg2-0Hkg.js +2 -0
  128. package/dashboard/dist/assets/WorkflowPill-Bg2-0Hkg.js.map +1 -0
  129. package/dashboard/dist/assets/{WorkflowsDashboard-BFzCyvgv.js → WorkflowsDashboard-BzH7jMRu.js} +2 -2
  130. package/dashboard/dist/assets/{WorkflowsDashboard-BFzCyvgv.js.map → WorkflowsDashboard-BzH7jMRu.js.map} +1 -1
  131. package/dashboard/dist/assets/{WorkflowsOverview-C_y7JCg2.js → WorkflowsOverview-BcUgBvjD.js} +2 -2
  132. package/dashboard/dist/assets/{WorkflowsOverview-C_y7JCg2.js.map → WorkflowsOverview-BcUgBvjD.js.map} +1 -1
  133. package/dashboard/dist/assets/{YamlWorkflowsPage-CYQjp3JI.js → YamlWorkflowsPage-OhpCQJ0l.js} +2 -2
  134. package/dashboard/dist/assets/{YamlWorkflowsPage-CYQjp3JI.js.map → YamlWorkflowsPage-OhpCQJ0l.js.map} +1 -1
  135. package/dashboard/dist/assets/{agents-2pDPv2Ww.js → agents-Ce3HmPz4.js} +2 -2
  136. package/dashboard/dist/assets/{agents-2pDPv2Ww.js.map → agents-Ce3HmPz4.js.map} +1 -1
  137. package/dashboard/dist/assets/{bots-2uGZ2l7A.js → bots-B0BomNnf.js} +2 -2
  138. package/dashboard/dist/assets/{bots-2uGZ2l7A.js.map → bots-B0BomNnf.js.map} +1 -1
  139. package/dashboard/dist/assets/capabilities-t-w5N9K9.js +2 -0
  140. package/dashboard/dist/assets/capabilities-t-w5N9K9.js.map +1 -0
  141. package/dashboard/dist/assets/{controlplane-CQ29M7lK.js → controlplane-BrtAZnJM.js} +2 -2
  142. package/dashboard/dist/assets/{controlplane-CQ29M7lK.js.map → controlplane-BrtAZnJM.js.map} +1 -1
  143. package/dashboard/dist/assets/{escalation-DWOUjrgL.js → escalation-DilnDxw2.js} +2 -2
  144. package/dashboard/dist/assets/{escalation-DWOUjrgL.js.map → escalation-DilnDxw2.js.map} +1 -1
  145. package/dashboard/dist/assets/{escalation-columns-WrgLIl-W.js → escalation-columns-C0slywOY.js} +2 -2
  146. package/dashboard/dist/assets/{escalation-columns-WrgLIl-W.js.map → escalation-columns-C0slywOY.js.map} +1 -1
  147. package/dashboard/dist/assets/{helpers-LN5b1KBx.js → helpers-BMvPqQr8.js} +2 -2
  148. package/dashboard/dist/assets/{helpers-LN5b1KBx.js.map → helpers-BMvPqQr8.js.map} +1 -1
  149. package/dashboard/dist/assets/{index-ugekH3E2.js → index-30-pN97P.js} +2 -2
  150. package/dashboard/dist/assets/{index-ugekH3E2.js.map → index-30-pN97P.js.map} +1 -1
  151. package/dashboard/dist/assets/index-BPxglOYm.css +1 -0
  152. package/dashboard/dist/assets/{index-CFJc47B8.js → index-Bl9wzQ8Q.js} +2 -2
  153. package/dashboard/dist/assets/{index-CFJc47B8.js.map → index-Bl9wzQ8Q.js.map} +1 -1
  154. package/dashboard/dist/assets/{index-C_A76Dl1.js → index-BxOuF0hm.js} +2 -2
  155. package/dashboard/dist/assets/{index-C_A76Dl1.js.map → index-BxOuF0hm.js.map} +1 -1
  156. package/dashboard/dist/assets/{index-DqFfgd-7.js → index-Ck2QdJXT.js} +2 -2
  157. package/dashboard/dist/assets/{index-DqFfgd-7.js.map → index-Ck2QdJXT.js.map} +1 -1
  158. package/dashboard/dist/assets/{index-CvzfRxnj.js → index-DNmlrCAp.js} +2 -2
  159. package/dashboard/dist/assets/{index-CvzfRxnj.js.map → index-DNmlrCAp.js.map} +1 -1
  160. package/dashboard/dist/assets/index-DPW_i3fH.js +6 -0
  161. package/dashboard/dist/assets/index-DPW_i3fH.js.map +1 -0
  162. package/dashboard/dist/assets/{index-CBS8FBcp.js → index-DZX-E_3q.js} +24 -24
  163. package/dashboard/dist/assets/index-DZX-E_3q.js.map +1 -0
  164. package/dashboard/dist/assets/{index-CovZsMow.js → index-D_wqdvG_.js} +2 -2
  165. package/dashboard/dist/assets/{index-CovZsMow.js.map → index-D_wqdvG_.js.map} +1 -1
  166. package/dashboard/dist/assets/{index-CdNXBj7w.js → index-DnsVYMMg.js} +2 -2
  167. package/dashboard/dist/assets/{index-CdNXBj7w.js.map → index-DnsVYMMg.js.map} +1 -1
  168. package/dashboard/dist/assets/{index-BMo7wCw8.js → index-H5TlloTk.js} +2 -2
  169. package/dashboard/dist/assets/{index-BMo7wCw8.js.map → index-H5TlloTk.js.map} +1 -1
  170. package/dashboard/dist/assets/{index-dzxsXeMO.js → index-f-0Duls3.js} +2 -2
  171. package/dashboard/dist/assets/{index-dzxsXeMO.js.map → index-f-0Duls3.js.map} +1 -1
  172. package/dashboard/dist/assets/index-pIMl0mYp.js +2 -0
  173. package/dashboard/dist/assets/{index-CryoNbg0.js.map → index-pIMl0mYp.js.map} +1 -1
  174. package/dashboard/dist/assets/{index-J0dMfAmE.js → index-qNuxC8kX.js} +2 -2
  175. package/dashboard/dist/assets/{index-J0dMfAmE.js.map → index-qNuxC8kX.js.map} +1 -1
  176. package/dashboard/dist/assets/{knowledge-BhZk3Wy9.js → knowledge-D01NdF5h.js} +2 -2
  177. package/dashboard/dist/assets/{knowledge-BhZk3Wy9.js.map → knowledge-D01NdF5h.js.map} +1 -1
  178. package/dashboard/dist/assets/{mcp-FOHNY7Zj.js → mcp-CjXjDZI0.js} +2 -2
  179. package/dashboard/dist/assets/{mcp-FOHNY7Zj.js.map → mcp-CjXjDZI0.js.map} +1 -1
  180. package/dashboard/dist/assets/{mcp-query-BoNH5uCn.js → mcp-query-LlKQcWLJ.js} +2 -2
  181. package/dashboard/dist/assets/{mcp-query-BoNH5uCn.js.map → mcp-query-LlKQcWLJ.js.map} +1 -1
  182. package/dashboard/dist/assets/{mcp-runs-BhkGaw2y.js → mcp-runs-C0C54hU6.js} +2 -2
  183. package/dashboard/dist/assets/{mcp-runs-BhkGaw2y.js.map → mcp-runs-C0C54hU6.js.map} +1 -1
  184. package/dashboard/dist/assets/{namespaces-duQCQRHq.js → namespaces-6qWDXXJV.js} +2 -2
  185. package/dashboard/dist/assets/{namespaces-duQCQRHq.js.map → namespaces-6qWDXXJV.js.map} +1 -1
  186. package/dashboard/dist/assets/{roles-DW6lI_g5.js → roles-Dtj0uabn.js} +2 -2
  187. package/dashboard/dist/assets/{roles-DW6lI_g5.js.map → roles-Dtj0uabn.js.map} +1 -1
  188. package/dashboard/dist/assets/{tasks-C-QX245z.js → tasks-BevFBjZq.js} +2 -2
  189. package/dashboard/dist/assets/{tasks-C-QX245z.js.map → tasks-BevFBjZq.js.map} +1 -1
  190. package/dashboard/dist/assets/{topics-CAnsyo3w.js → topics-BMG5tx2g.js} +2 -2
  191. package/dashboard/dist/assets/{topics-CAnsyo3w.js.map → topics-BMG5tx2g.js.map} +1 -1
  192. package/dashboard/dist/assets/useCollapsedSections-BU5HULGs.js +2 -0
  193. package/dashboard/dist/assets/useCollapsedSections-BU5HULGs.js.map +1 -0
  194. package/dashboard/dist/assets/useEventHooks-CPyvFlVR.js +2 -0
  195. package/dashboard/dist/assets/useEventHooks-CPyvFlVR.js.map +1 -0
  196. package/dashboard/dist/assets/{useYamlActivityEvents-BTHFGIsD.js → useYamlActivityEvents-Bll8NPNQ.js} +2 -2
  197. package/dashboard/dist/assets/{useYamlActivityEvents-BTHFGIsD.js.map → useYamlActivityEvents-Bll8NPNQ.js.map} +1 -1
  198. package/dashboard/dist/assets/{users--D3LoFOD.js → users-XZ349b0r.js} +2 -2
  199. package/dashboard/dist/assets/{users--D3LoFOD.js.map → users-XZ349b0r.js.map} +1 -1
  200. package/dashboard/dist/assets/{vendor-icons-BNtvBbnj.js → vendor-icons-B_Yla7iD.js} +2 -2
  201. package/dashboard/dist/assets/{vendor-icons-BNtvBbnj.js.map → vendor-icons-B_Yla7iD.js.map} +1 -1
  202. package/dashboard/dist/assets/{workflows-MpNdzreD.js → workflows-Do-Eiv8f.js} +2 -2
  203. package/dashboard/dist/assets/{workflows-MpNdzreD.js.map → workflows-Do-Eiv8f.js.map} +1 -1
  204. package/dashboard/dist/assets/{yaml-workflows-CFhnJzQy.js → yaml-workflows-DolGRQ5f.js} +2 -2
  205. package/dashboard/dist/assets/{yaml-workflows-CFhnJzQy.js.map → yaml-workflows-DolGRQ5f.js.map} +1 -1
  206. package/dashboard/dist/index.html +3 -3
  207. package/docs/agents.md +38 -10
  208. package/docs/api/http/agents.md +12 -10
  209. package/docs/api/http/settings.md +4 -0
  210. package/docs/api/sdk/agents.md +4 -2
  211. package/docs/api/sdk/settings.md +2 -1
  212. package/docs/dashboard.md +1 -1
  213. package/docs/events.md +7 -0
  214. package/docs/hitl-guide.md +560 -0
  215. package/package.json +2 -2
  216. package/dashboard/dist/assets/AgentConfigPage-DG1zOIiz.js +0 -13
  217. package/dashboard/dist/assets/AgentConfigPage-DG1zOIiz.js.map +0 -1
  218. package/dashboard/dist/assets/AgentDetailPage-B5kaAJDM.js +0 -4
  219. package/dashboard/dist/assets/AgentDetailPage-B5kaAJDM.js.map +0 -1
  220. package/dashboard/dist/assets/AgentsPage-DJWSuoJA.js +0 -2
  221. package/dashboard/dist/assets/AgentsPage-DJWSuoJA.js.map +0 -1
  222. package/dashboard/dist/assets/AvailableEscalationsPage-DrarbHov.js +0 -2
  223. package/dashboard/dist/assets/CapabilitiesPage-BiL9QUxI.js +0 -2
  224. package/dashboard/dist/assets/CapabilitiesPage-BiL9QUxI.js.map +0 -1
  225. package/dashboard/dist/assets/CopyableId-DmLF-RqZ.js +0 -2
  226. package/dashboard/dist/assets/CopyableId-DmLF-RqZ.js.map +0 -1
  227. package/dashboard/dist/assets/CronLabel-DnZF8_vw.js.map +0 -1
  228. package/dashboard/dist/assets/CustomDurationPicker-BYDrcsYT.js +0 -2
  229. package/dashboard/dist/assets/ElapsedCell-BkiVdGaJ.js +0 -2
  230. package/dashboard/dist/assets/EventTable-B9wYf13g.js +0 -2
  231. package/dashboard/dist/assets/EventTable-B9wYf13g.js.map +0 -1
  232. package/dashboard/dist/assets/McpRunDetailPage-SoXudCbq.js +0 -2
  233. package/dashboard/dist/assets/McpRunDetailPage-SoXudCbq.js.map +0 -1
  234. package/dashboard/dist/assets/ProcessDetailPage-DzGacZpO.js +0 -2
  235. package/dashboard/dist/assets/SwimlaneTimeline-CU2ZD9cC.js +0 -2
  236. package/dashboard/dist/assets/SwimlaneTimeline-CU2ZD9cC.js.map +0 -1
  237. package/dashboard/dist/assets/TimeAgo-B6Gz4RAU.js +0 -2
  238. package/dashboard/dist/assets/ToolTestPanel-D4cgYW2p.js +0 -2
  239. package/dashboard/dist/assets/ToolTestPanel-D4cgYW2p.js.map +0 -1
  240. package/dashboard/dist/assets/WorkflowExecutionPage-CVGztAdK.js +0 -2
  241. package/dashboard/dist/assets/WorkflowExecutionPage-CVGztAdK.js.map +0 -1
  242. package/dashboard/dist/assets/WorkflowPill-pPuGH8v9.js +0 -2
  243. package/dashboard/dist/assets/WorkflowPill-pPuGH8v9.js.map +0 -1
  244. package/dashboard/dist/assets/index-CBS8FBcp.js.map +0 -1
  245. package/dashboard/dist/assets/index-ChGBlYKj.css +0 -1
  246. package/dashboard/dist/assets/index-CryoNbg0.js +0 -2
  247. package/dashboard/dist/assets/index-DDxZOINn.js +0 -5
  248. package/dashboard/dist/assets/index-DDxZOINn.js.map +0 -1
  249. package/dashboard/dist/assets/settings-wTRbazzw.js +0 -2
  250. package/dashboard/dist/assets/settings-wTRbazzw.js.map +0 -1
  251. package/dashboard/dist/assets/useEventHooks-C689a4F7.js +0 -2
  252. package/dashboard/dist/assets/useEventHooks-C689a4F7.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ServerName-CEOFF7UG.js","sources":["../../src/components/common/display/ServerName.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { Server, ExternalLink } from 'lucide-react';\n\ninterface ServerNameProps {\n name: string;\n serverId?: string;\n /** Strip the common \"long-tail-\" prefix for display */\n short?: boolean;\n}\n\n/**\n * Universal MCP server name display. Monospace with a subtle Server icon.\n * When `serverId` is provided, hovering reveals a nav icon and clicking\n * navigates to the server config page.\n */\nexport function ServerName({ name, serverId, short = true }: ServerNameProps) {\n const navigate = useNavigate();\n const display = short ? name.replace(/^long-tail-/, '') : name;\n\n if (serverId) {\n return (\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/servers/${serverId}`); }}\n className=\"group/srv inline-flex items-center gap-1 text-[11px] font-mono text-text-tertiary hover:text-accent transition-colors\"\n title={name}\n >\n <Server className=\"w-2.5 h-2.5 shrink-0 text-text-quaternary group-hover/srv:text-accent\" strokeWidth={1.5} />\n {display}\n <ExternalLink className=\"w-2 h-2 shrink-0 invisible group-hover/srv:visible text-accent\" strokeWidth={1.5} />\n </button>\n );\n }\n\n return (\n <span className=\"inline-flex items-center gap-1 text-[11px] font-mono text-text-tertiary\" title={name}>\n <Server className=\"w-2.5 h-2.5 shrink-0 text-text-quaternary\" strokeWidth={1.5} />\n {display}\n </span>\n );\n}\n"],"names":["ServerName","name","serverId","short","navigate","useNavigate","display","jsxs","e","jsx","Server","ExternalLink"],"mappings":"gJAeO,SAASA,EAAW,CAAE,KAAAC,EAAM,SAAAC,EAAU,MAAAC,EAAQ,IAAyB,CAC5E,MAAMC,EAAWC,EAAA,EACXC,EAAUH,EAAQF,EAAK,QAAQ,cAAe,EAAE,EAAIA,EAE1D,OAAIC,EAEAK,EAAAA,KAAC,SAAA,CACC,QAAUC,GAAM,CAAEA,EAAE,gBAAA,EAAmBJ,EAAS,gBAAgBF,CAAQ,EAAE,CAAG,EAC7E,UAAU,wHACV,MAAOD,EAEP,SAAA,CAAAQ,EAAAA,IAACC,EAAA,CAAO,UAAU,wEAAwE,YAAa,IAAK,EAC3GJ,EACDG,EAAAA,IAACE,EAAA,CAAa,UAAU,iEAAiE,YAAa,GAAA,CAAK,CAAA,CAAA,CAAA,EAM/GJ,EAAAA,KAAC,OAAA,CAAK,UAAU,0EAA0E,MAAON,EAC/F,SAAA,CAAAQ,EAAAA,IAACC,EAAA,CAAO,UAAU,4CAA4C,YAAa,IAAK,EAC/EJ,CAAA,EACH,CAEJ"}
1
+ {"version":3,"file":"ServerName-uqa4eBqm.js","sources":["../../src/components/common/display/ServerName.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { Server, ExternalLink } from 'lucide-react';\n\ninterface ServerNameProps {\n name: string;\n serverId?: string;\n /** Strip the common \"long-tail-\" prefix for display */\n short?: boolean;\n}\n\n/**\n * Universal MCP server name display. Monospace with a subtle Server icon.\n * When `serverId` is provided, hovering reveals a nav icon and clicking\n * navigates to the server config page.\n */\nexport function ServerName({ name, serverId, short = true }: ServerNameProps) {\n const navigate = useNavigate();\n const display = short ? name.replace(/^long-tail-/, '') : name;\n\n if (serverId) {\n return (\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/servers/${serverId}`); }}\n className=\"group/srv inline-flex items-center gap-1 text-[11px] font-mono text-text-tertiary hover:text-accent transition-colors\"\n title={name}\n >\n <Server className=\"w-2.5 h-2.5 shrink-0 text-text-quaternary group-hover/srv:text-accent\" strokeWidth={1.5} />\n {display}\n <ExternalLink className=\"w-2 h-2 shrink-0 invisible group-hover/srv:visible text-accent\" strokeWidth={1.5} />\n </button>\n );\n }\n\n return (\n <span className=\"inline-flex items-center gap-1 text-[11px] font-mono text-text-tertiary\" title={name}>\n <Server className=\"w-2.5 h-2.5 shrink-0 text-text-quaternary\" strokeWidth={1.5} />\n {display}\n </span>\n );\n}\n"],"names":["ServerName","name","serverId","short","navigate","useNavigate","display","jsxs","e","jsx","Server","ExternalLink"],"mappings":"gJAeO,SAASA,EAAW,CAAE,KAAAC,EAAM,SAAAC,EAAU,MAAAC,EAAQ,IAAyB,CAC5E,MAAMC,EAAWC,EAAA,EACXC,EAAUH,EAAQF,EAAK,QAAQ,cAAe,EAAE,EAAIA,EAE1D,OAAIC,EAEAK,EAAAA,KAAC,SAAA,CACC,QAAUC,GAAM,CAAEA,EAAE,gBAAA,EAAmBJ,EAAS,gBAAgBF,CAAQ,EAAE,CAAG,EAC7E,UAAU,wHACV,MAAOD,EAEP,SAAA,CAAAQ,EAAAA,IAACC,EAAA,CAAO,UAAU,wEAAwE,YAAa,IAAK,EAC3GJ,EACDG,EAAAA,IAACE,EAAA,CAAa,UAAU,iEAAiE,YAAa,GAAA,CAAK,CAAA,CAAA,CAAA,EAM/GJ,EAAAA,KAAC,OAAA,CAAK,UAAU,0EAA0E,MAAON,EAC/F,SAAA,CAAAQ,EAAAA,IAACC,EAAA,CAAO,UAAU,4CAA4C,YAAa,IAAK,EAC/EJ,CAAA,EACH,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{j as t,a as D}from"./vendor-query-B2UbickB.js";import{D as K,d as L,J as w,f as I,C as Y}from"./index-DZX-E_3q.js";import{S as J}from"./StatusBadge-XQlNFwmH.js";import{L as A}from"./vendor-react-CX88sFS5.js";function O(s){if(!s)return null;try{return JSON.parse(s)}catch{return s}}function z({event:s}){return t.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3",children:[s.attributes.activity_type&&t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Activity"}),t.jsx("p",{className:"text-xs font-mono text-text-primary",children:s.attributes.activity_type})]}),t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Kind"}),t.jsx("p",{className:"text-xs font-mono text-text-primary",children:s.attributes.kind})]}),s.duration_ms!==null&&t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Duration"}),t.jsx(K,{ms:s.duration_ms,className:"font-mono text-text-primary"})]}),t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Time"}),t.jsx(L,{date:s.event_time,format:"datetime",className:"font-mono text-text-primary"})]}),s.attributes.signal_name&&t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Signal"}),t.jsx("p",{className:"text-xs font-mono text-text-primary",children:s.attributes.signal_name})]}),s.attributes.awaited!==void 0&&t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Awaited"}),t.jsx("p",{className:"text-xs font-mono text-text-primary",children:s.attributes.awaited?"Yes":"No (fire-and-forget)"})]}),s.attributes.timeline_key&&t.jsxs("div",{className:"col-span-2",children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Timeline Key"}),t.jsx("p",{className:"text-xs font-mono text-text-primary truncate",title:s.attributes.timeline_key,children:s.attributes.timeline_key})]}),s.attributes.execution_index!==void 0&&t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Exec Index"}),t.jsx("p",{className:"text-xs font-mono text-text-primary",children:s.attributes.execution_index})]}),s.attributes.scheduled_event_id!=null&&t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Scheduled Event"}),t.jsxs("p",{className:"text-xs font-mono text-text-primary",children:["#",s.attributes.scheduled_event_id]})]}),s.attributes.wait_event_id!=null&&t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Wait Started"}),t.jsxs("p",{className:"text-xs font-mono text-text-primary",children:["Event #",s.attributes.wait_event_id]})]}),s.attributes.initiated_event_id!=null&&t.jsxs("div",{children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Initiated Event"}),t.jsxs("p",{className:"text-xs font-mono text-text-primary",children:["#",s.attributes.initiated_event_id]})]})]})}function B({event:s,childTask:i}){const r=i?O(i.envelope):null,d=i?O(i.data):null;return!i&&s.attributes.child_workflow_id?t.jsx("div",{className:"border-t border-surface-border pt-3",children:t.jsxs("div",{className:"flex items-center gap-3 flex-wrap",children:[t.jsx("span",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Child Workflow"}),t.jsx(A,{to:`/workflows/executions/${s.attributes.child_workflow_id}`,className:"text-xs font-mono text-accent hover:underline",onClick:c=>c.stopPropagation(),children:s.attributes.child_workflow_id})]})}):i?t.jsxs("div",{className:"space-y-3 border-t border-surface-border pt-3",children:[t.jsxs("div",{className:"flex items-center gap-3 flex-wrap",children:[t.jsx("span",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Child Workflow"}),t.jsx(A,{to:`/workflows/executions/${i.workflow_id}`,className:"text-xs font-mono text-accent hover:underline",onClick:c=>c.stopPropagation(),children:i.workflow_id}),t.jsx(J,{status:i.status}),i.completed_at&&t.jsxs("span",{className:"text-[10px] text-text-tertiary",children:["Completed ",t.jsx(L,{date:i.completed_at,format:"relative"})]})]}),(r!=null||d!=null)&&t.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[r!=null?t.jsx(w,{data:r,label:"Input (Envelope)",variant:"panel"}):t.jsx("div",{}),d!=null?t.jsx(w,{data:d,label:"Output (Result)",variant:"panel"}):t.jsx("div",{})]})]}):null}function G({event:s,childTask:i}){const r=s.attributes.input,d=s.attributes.result,c=s.category==="signal",x=s.category==="activity",o=s.category==="child_workflow",m=r!==void 0&&(x||o),p=!i&&d!==void 0&&(x||o),l=s.attributes.activity_type==="ltSignalParent"?"Signal Payload":"Result";return m||p?t.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[m?t.jsx(w,{data:r,label:"Input",variant:"panel"}):t.jsx("div",{}),p?t.jsx(w,{data:d,label:l,variant:"panel"}):t.jsx("div",{})]}):c&&r!==void 0?t.jsx(w,{data:r,label:"Signal Payload",variant:"panel"}):null}function H({event:s,childTask:i,pending:r=!1,onClose:d}){return t.jsxs("div",{className:"p-4 bg-surface-sunken rounded-md space-y-4",children:[t.jsxs("div",{className:"flex items-center justify-between gap-2",children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("p",{className:"font-mono font-medium text-sm text-text-primary",children:s.attributes.activity_type??s.attributes.signal_name??s.attributes.child_workflow_id??s.event_type}),r&&t.jsxs("span",{className:"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-status-warning/15 text-status-warning",children:[t.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse"}),"Pending"]})]}),d&&t.jsx("button",{onClick:d,className:"text-text-tertiary hover:text-text-primary text-xs",children:"Close"})]}),t.jsx(z,{event:s}),t.jsx(B,{event:s,childTask:i}),t.jsx(G,{event:s,childTask:i}),s.attributes.failure!==void 0&&t.jsx(w,{data:s.attributes.failure,label:"Failure"}),(()=>{const{kind:c,activity_type:x,result:o,timeline_key:m,execution_index:p,signal_name:l,input:_,child_workflow_id:N,awaited:g,wait_event_id:k,scheduled_event_id:h,initiated_event_id:u,failure:y,trace_id:v,span_id:E,...M}=s.attributes;return Object.keys(M).length>0?t.jsx(w,{data:M,label:"Attributes"}):null})()]})}const j={activity:{bar:"bg-blue-500",outline:"border border-blue-400/40 bg-blue-400/15",text:"text-blue-500",label:"Activities"},signal:{bar:"bg-emerald-500",outline:"border border-emerald-400/40 bg-emerald-400/15",text:"text-emerald-500",label:"Signals"},timer:{bar:"bg-status-warning",outline:"border border-amber-400/40 bg-amber-400/15",text:"text-status-warning",label:"Timers"},child_workflow:{bar:"bg-violet-500",outline:"border border-violet-400/40 bg-violet-400/15",text:"text-violet-500",label:"Child Workflows"}},F="bg-stripes animate-pulse opacity-70",X=new Set(["callLLM","callDbTool","callVisionTool","callMcpTool","getDBTools","getVisionTools"]);function q(s,i){if(!s||typeof s!="string")return s??"";if(s.length<=i)return s;const r=Math.floor((i-1)/2);return`${s.slice(0,r)}…${s.slice(s.length-r)}`}function Q(s){const i=[],r=new Map,d=new Map;for(const x of s){const o=x.attributes.timeline_key;if(!o)continue;const m=x.event_type;m==="activity_task_scheduled"||m==="timer_started"||m==="child_workflow_execution_started"||m==="signal_wait_started"?r.set(o,x):d.set(o,x)}const c=new Set;for(const x of s){const o=x.attributes.timeline_key;if(o&&c.has(o))continue;o&&c.add(o);const m=o?r.get(o):void 0,p=o?d.get(o):void 0,l=p||m||x,_=l.category,N=String(l.attributes.activity_type||l.attributes.signal_name||l.attributes.child_workflow_id||l.event_type||"unknown"),g=m||l,k=p,h=new Date(g.event_time).getTime();let u=null,y=null,v=!1;k?(u=new Date(k.event_time).getTime(),y=k.duration_ms??u-h):l.duration_ms!==null?(y=l.duration_ms,u=h+y):v=!0,i.push({category:_,name:N||l.event_type,startTime:h,endTime:u,duration:y,eventId:l.event_id,pending:v})}return i}function st({events:s,childTasks:i,outline:r}){const[d,c]=D.useState(new Set),[x,o]=D.useState(null),p=s.filter(e=>e.category!=="workflow");if(p.length===0)return null;const l=Q(p);if(l.length===0)return null;const _=Date.now(),N=l.flatMap(e=>{const n=[e.startTime];return e.endTime?n.push(e.endTime):n.push(_),n}),g=Math.min(...N),h=Math.max(...N)-g||1,u=new Map;for(const e of l){const n=`${e.category}:${e.name}`,a=e.startTime-g,b=(e.endTime?e.endTime-g:_-g)-a,S={eventId:e.eventId,startPct:a/h*100,widthPct:Math.max(b/h*100,.5),duration:e.duration,label:`${e.name} — ${e.duration!==null?I(e.duration):"pending"} — ${new Date(e.startTime).toLocaleTimeString()}`,eventTime:new Date(e.startTime).toISOString(),pending:e.pending};u.has(n)||u.set(n,{name:e.name,category:e.category,segments:[]}),u.get(n).segments.push(S)}const y=Array.from(u.values()),v=5,E=Array.from({length:v+1},(e,n)=>({pct:n/v*100,label:I(Math.round(n/v*h))})),M=[...new Set(l.map(e=>e.category))],R=e=>{if(!(i!=null&&i.length))return;const n=e.attributes.activity_type;if(n)return i.find(a=>a.workflow_type===n)},$=e=>{c(n=>{const a=new Set(n);return a.has(e)?a.delete(e):a.add(e),a})},C=l.map(e=>e.eventId),P=C.length>0&&C.every(e=>d.has(e)),V=()=>{c(P?new Set:new Set(C))},T=(e,n)=>{var a,f;return n?F:r?((a=j[e])==null?void 0:a.outline)??"border-text-tertiary bg-transparent":((f=j[e])==null?void 0:f.bar)??"bg-text-tertiary"},W=e=>{var n;return r?((n=j[e])==null?void 0:n.text)??"text-text-tertiary":"text-white"};return t.jsxs("div",{className:"px-6 py-6 mb-6",children:[t.jsxs("div",{className:"flex items-center gap-4 mb-4 flex-wrap",children:[t.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Execution Timeline"}),t.jsx("button",{onClick:V,className:"text-[10px] text-accent hover:underline",children:P?"Collapse all":"Expand all"}),t.jsxs("div",{className:"flex items-center gap-3 ml-auto",children:[M.map(e=>{var n,a,f;return t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("span",{className:`w-2 h-2 rounded-full ${r?`border ${((n=j[e])==null?void 0:n.outline)??"border-text-tertiary"}`:((a=j[e])==null?void 0:a.bar)??"bg-text-tertiary"}`}),t.jsx("span",{className:"text-[9px] text-text-tertiary",children:((f=j[e])==null?void 0:f.label)??e})]},e)}),l.some(e=>e.pending)&&t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("span",{className:"w-2 h-2 rounded-full bg-status-warning animate-pulse"}),t.jsx("span",{className:"text-[9px] text-text-tertiary",children:"Pending"})]})]})]}),t.jsxs("div",{className:"flex",children:[t.jsx("div",{className:"w-56 shrink-0"}),t.jsx("div",{className:"flex-1 relative h-6 border-b border-surface-border",children:E.map(e=>t.jsx("span",{className:"absolute text-[9px] font-mono text-text-tertiary -translate-x-1/2 bottom-1",style:{left:`${e.pct}%`},children:e.label},e.pct))})]}),y.map(e=>{const n=j[e.category];return t.jsxs("div",{children:[t.jsxs("div",{className:"flex items-center border-b border-surface-border",children:[t.jsxs("div",{className:"w-56 shrink-0 py-3 pr-4 flex items-center gap-2",children:[t.jsx("span",{className:`w-1.5 h-1.5 rounded-full shrink-0 ${(n==null?void 0:n.bar)??"bg-text-tertiary"}`}),t.jsx("p",{className:"text-xs font-mono text-text-secondary whitespace-nowrap overflow-hidden",title:e.name,children:q(e.name,28)}),X.has(e.name)&&t.jsx("span",{className:"shrink-0 text-accent/60",title:"MCP tool interaction",children:t.jsx("svg",{className:"w-3 h-3",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.663 17h4.674M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"})})})]}),t.jsxs("div",{className:"flex-1 relative h-10",children:[E.map(a=>t.jsx("div",{className:"absolute top-0 bottom-0 w-px bg-surface-border opacity-30",style:{left:`${a.pct}%`}},a.pct)),e.segments.map(a=>{const f=x===a.eventId,b=d.has(a.eventId),S=a.widthPct<3;return t.jsx("div",{className:`absolute top-2 h-6 rounded-sm cursor-pointer transition-all duration-200 origin-center ${b?`${T(e.category,a.pending)} ring-2 ring-accent ring-offset-1`:`${T(e.category,a.pending)} hover:opacity-80`}`,style:{left:`${a.startPct}%`,width:`${a.widthPct}%`,minWidth:"4px",...f&&S?{transform:"scaleX(4) scaleY(1.3) translateY(-2px)",zIndex:20,borderRadius:"4px"}:{zIndex:b?10:1}},title:a.label,onClick:()=>$(a.eventId),onMouseEnter:()=>o(a.eventId),onMouseLeave:()=>o(null),children:a.widthPct>8&&t.jsx("span",{className:`absolute inset-0 flex items-center px-1.5 text-[9px] font-mono ${W(e.category)} truncate`,children:a.duration!==null?I(a.duration):"pending"})},a.eventId)})]})]}),e.segments.map(a=>{const f=d.has(a.eventId),b=p.find(S=>S.event_id===a.eventId);return t.jsx(Y,{open:f,children:b&&t.jsx("div",{className:"py-3",children:t.jsx(H,{event:b,childTask:R(b),pending:a.pending,onClose:()=>$(b.event_id)})})},a.eventId)})]},`${e.category}:${e.name}`)})]})}export{H as E,st as S};
2
+ //# sourceMappingURL=SwimlaneTimeline-og79Llvs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SwimlaneTimeline-og79Llvs.js","sources":["../../src/pages/workflows/workflow-execution/EventMetadataGrid.tsx","../../src/pages/workflows/workflow-execution/EventDetailPanel.tsx","../../src/pages/workflows/workflow-execution/utils.ts","../../src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx"],"sourcesContent":["import { Link } from 'react-router-dom';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { DateValue } from '../../../components/common/display/DateValue';\nimport { DurationValue } from '../../../components/common/display/DurationValue';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\n\nfunction safeParseJson(raw: string | null | undefined): unknown {\n if (!raw) return null;\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\nexport function EventMetadataGrid({ event }: { event: WorkflowExecutionEvent }) {\n return (\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-3\">\n {event.attributes.activity_type && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Activity\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.activity_type}\n </p>\n </div>\n )}\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Kind\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.kind}\n </p>\n </div>\n {event.duration_ms !== null && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Duration\n </p>\n <DurationValue ms={event.duration_ms} className=\"font-mono text-text-primary\" />\n </div>\n )}\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Time\n </p>\n <DateValue date={event.event_time} format=\"datetime\" className=\"font-mono text-text-primary\" />\n </div>\n\n {event.attributes.signal_name && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Signal\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.signal_name}\n </p>\n </div>\n )}\n\n {event.attributes.awaited !== undefined && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Awaited\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.awaited ? 'Yes' : 'No (fire-and-forget)'}\n </p>\n </div>\n )}\n\n {event.attributes.timeline_key && (\n <div className=\"col-span-2\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Timeline Key\n </p>\n <p className=\"text-xs font-mono text-text-primary truncate\" title={event.attributes.timeline_key}>\n {event.attributes.timeline_key}\n </p>\n </div>\n )}\n\n {event.attributes.execution_index !== undefined && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Exec Index\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.execution_index}\n </p>\n </div>\n )}\n\n {event.attributes.scheduled_event_id != null && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Scheduled Event\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n #{event.attributes.scheduled_event_id}\n </p>\n </div>\n )}\n {event.attributes.wait_event_id != null && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Wait Started\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n Event #{event.attributes.wait_event_id}\n </p>\n </div>\n )}\n {event.attributes.initiated_event_id != null && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Initiated Event\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n #{event.attributes.initiated_event_id}\n </p>\n </div>\n )}\n </div>\n );\n}\n\nexport function ChildWorkflowSection({ event, childTask }: {\n event: WorkflowExecutionEvent;\n childTask?: LTTaskRecord;\n}) {\n const childInput = childTask ? safeParseJson(childTask.envelope) : null;\n const childOutput = childTask ? safeParseJson(childTask.data) : null;\n\n // Link-only (no matching task record)\n if (!childTask && event.attributes.child_workflow_id) {\n return (\n <div className=\"border-t border-surface-border pt-3\">\n <div className=\"flex items-center gap-3 flex-wrap\">\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Child Workflow\n </span>\n <Link\n to={`/workflows/executions/${event.attributes.child_workflow_id}`}\n className=\"text-xs font-mono text-accent hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n {event.attributes.child_workflow_id}\n </Link>\n </div>\n </div>\n );\n }\n\n // Full child task section\n if (childTask) {\n return (\n <div className=\"space-y-3 border-t border-surface-border pt-3\">\n <div className=\"flex items-center gap-3 flex-wrap\">\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Child Workflow\n </span>\n <Link\n to={`/workflows/executions/${childTask.workflow_id}`}\n className=\"text-xs font-mono text-accent hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n {childTask.workflow_id}\n </Link>\n <StatusBadge status={childTask.status} />\n {childTask.completed_at && (\n <span className=\"text-[10px] text-text-tertiary\">\n Completed <DateValue date={childTask.completed_at} format=\"relative\" />\n </span>\n )}\n </div>\n\n {(childInput != null || childOutput != null) && (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {childInput != null ? (\n <JsonViewer data={childInput} label=\"Input (Envelope)\" variant=\"panel\" />\n ) : <div />}\n {childOutput != null ? (\n <JsonViewer data={childOutput} label=\"Output (Result)\" variant=\"panel\" />\n ) : <div />}\n </div>\n )}\n </div>\n );\n }\n\n return null;\n}\n\nexport function EventPayloadSection({ event, childTask }: {\n event: WorkflowExecutionEvent;\n childTask?: LTTaskRecord;\n}) {\n const input = event.attributes.input;\n const result = event.attributes.result;\n const isSignal = event.category === 'signal';\n const isActivity = event.category === 'activity';\n const isChild = event.category === 'child_workflow';\n const hasInput = input !== undefined && (isActivity || isChild);\n const hasResult = !childTask && result !== undefined && (isActivity || isChild);\n const resultLabel = event.attributes.activity_type === 'ltSignalParent' ? 'Signal Payload' : 'Result';\n\n if (hasInput || hasResult) {\n return (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {hasInput ? (\n <JsonViewer data={input} label=\"Input\" variant=\"panel\" />\n ) : <div />}\n {hasResult ? (\n <JsonViewer data={result} label={resultLabel} variant=\"panel\" />\n ) : <div />}\n </div>\n );\n }\n\n if (isSignal && input !== undefined) {\n return <JsonViewer data={input} label=\"Signal Payload\" variant=\"panel\" />;\n }\n\n return null;\n}\n","import { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\nimport { EventMetadataGrid, ChildWorkflowSection, EventPayloadSection } from './EventMetadataGrid';\n\ninterface EventDetailPanelProps {\n event: WorkflowExecutionEvent;\n childTask?: LTTaskRecord;\n /** When true, show a \"Pending\" badge. Caller determines this from the full event list. */\n pending?: boolean;\n onClose?: () => void;\n}\n\n/**\n * Reusable detail panel for a workflow execution event.\n * Renders inline wherever placed — used by both SwimlaneTimeline\n * (below the lane row) and EventTable (below the event row).\n *\n * Shows rich detail for all event categories:\n * - Activities: activity_type, result, scheduled_event_id\n * - Signals: signal_name, payload, wait_event_id\n * - Timers: duration\n * - Child workflows: child_workflow_id link, awaited badge, result\n */\nexport function EventDetailPanel({ event, childTask, pending = false, onClose }: EventDetailPanelProps) {\n return (\n <div className=\"p-4 bg-surface-sunken rounded-md space-y-4\">\n {/* Header */}\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <p className=\"font-mono font-medium text-sm text-text-primary\">\n {event.attributes.activity_type\n ?? event.attributes.signal_name\n ?? event.attributes.child_workflow_id\n ?? event.event_type}\n </p>\n {pending && (\n <span className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-status-warning/15 text-status-warning\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse\" />\n Pending\n </span>\n )}\n </div>\n {onClose && (\n <button\n onClick={onClose}\n className=\"text-text-tertiary hover:text-text-primary text-xs\"\n >\n Close\n </button>\n )}\n </div>\n\n {/* Metadata grid */}\n <EventMetadataGrid event={event} />\n\n {/* Child workflow sections */}\n <ChildWorkflowSection event={event} childTask={childTask} />\n\n {/* Input / Result payload */}\n <EventPayloadSection event={event} childTask={childTask} />\n\n {/* Failure detail */}\n {event.attributes.failure !== undefined && (\n <JsonViewer data={event.attributes.failure} label=\"Failure\" />\n )}\n\n {/* Remaining attributes (exclude the fields shown above) */}\n {(() => {\n const {\n kind,\n activity_type,\n result,\n timeline_key,\n execution_index,\n signal_name,\n input,\n child_workflow_id,\n awaited,\n wait_event_id,\n scheduled_event_id,\n initiated_event_id,\n failure,\n trace_id,\n span_id,\n ...rest\n } = event.attributes;\n return Object.keys(rest).length > 0 ? (\n <JsonViewer data={rest} label=\"Attributes\" />\n ) : null;\n })()}\n </div>\n );\n}\n","export { formatDuration, formatDateTime } from '../../../lib/format';\n\nimport type { WorkflowExecutionEvent } from '../../../api/types';\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport interface Segment {\n eventId: number;\n startPct: number;\n widthPct: number;\n duration: number | null;\n label: string;\n eventTime: string;\n pending: boolean;\n}\n\nexport interface Lane {\n name: string;\n category: string;\n segments: Segment[];\n}\n\n// ── Constants ────────────────────────────────────────────────────────────────\n\nexport const CATEGORY_COLORS: Record<string, { bar: string; outline: string; text: string; label: string }> = {\n activity: { bar: 'bg-blue-500', outline: 'border border-blue-400/40 bg-blue-400/15', text: 'text-blue-500', label: 'Activities' },\n signal: { bar: 'bg-emerald-500', outline: 'border border-emerald-400/40 bg-emerald-400/15', text: 'text-emerald-500', label: 'Signals' },\n timer: { bar: 'bg-status-warning', outline: 'border border-amber-400/40 bg-amber-400/15', text: 'text-status-warning', label: 'Timers' },\n child_workflow: { bar: 'bg-violet-500', outline: 'border border-violet-400/40 bg-violet-400/15', text: 'text-violet-500', label: 'Child Workflows' },\n};\n\nexport const PENDING_CLASS = 'bg-stripes animate-pulse opacity-70';\n\n/** Activity names that indicate LLM/MCP tool interaction */\nexport const MCP_ACTIVITY_NAMES = new Set([\n 'callLLM', 'callDbTool', 'callVisionTool', 'callMcpTool', 'getDBTools', 'getVisionTools',\n]);\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\n/** Truncate a string in the middle, keeping the start and end visible. */\nexport function middleTruncate(str: string, maxLen: number): string {\n if (!str || typeof str !== 'string') return str ?? '';\n if (str.length <= maxLen) return str;\n const keep = Math.floor((maxLen - 1) / 2);\n return `${str.slice(0, keep)}…${str.slice(str.length - keep)}`;\n}\n\nexport interface TimelineSpan {\n category: string;\n name: string;\n startTime: number;\n endTime: number | null;\n duration: number | null;\n eventId: number;\n pending: boolean;\n}\n\n/**\n * Group paired events (scheduled→completed, started→fired, wait→signaled)\n * into a single span using timeline_key, or treat standalone events as points.\n */\nexport function buildTimelineSpans(events: WorkflowExecutionEvent[]): TimelineSpan[] {\n const spans: TimelineSpan[] = [];\n\n // Index scheduled/started events by timeline_key for pairing\n const startedMap = new Map<string, WorkflowExecutionEvent>();\n const completedMap = new Map<string, WorkflowExecutionEvent>();\n\n for (const evt of events) {\n const tlKey = evt.attributes.timeline_key;\n if (!tlKey) continue;\n const type = evt.event_type;\n\n if (type === 'activity_task_scheduled'\n || type === 'timer_started'\n || type === 'child_workflow_execution_started'\n || type === 'signal_wait_started') {\n startedMap.set(tlKey, evt);\n } else {\n completedMap.set(tlKey, evt);\n }\n }\n\n // Build spans from pairs\n const seen = new Set<string>();\n\n for (const evt of events) {\n const tlKey = evt.attributes.timeline_key;\n\n // Skip if no timeline_key or already processed\n if (tlKey && seen.has(tlKey)) continue;\n if (tlKey) seen.add(tlKey);\n\n const started = tlKey ? startedMap.get(tlKey) : undefined;\n const completed = tlKey ? completedMap.get(tlKey) : undefined;\n\n // Determine the representative event for this span\n const primary = completed || started || evt;\n const cat = primary.category;\n const name = String(primary.attributes.activity_type\n || primary.attributes.signal_name\n || primary.attributes.child_workflow_id\n || primary.event_type\n || 'unknown');\n\n const startEvt = started || primary;\n const endEvt = completed;\n\n const startMs = new Date(startEvt.event_time).getTime();\n let endMs: number | null = null;\n let dur: number | null = null;\n let pending = false;\n\n if (endEvt) {\n endMs = new Date(endEvt.event_time).getTime();\n dur = endEvt.duration_ms ?? (endMs - startMs);\n } else if (primary.duration_ms !== null) {\n dur = primary.duration_ms;\n endMs = startMs + dur;\n } else {\n // Pending — no completion event\n pending = true;\n }\n\n spans.push({\n category: cat,\n name: name || primary.event_type,\n startTime: startMs,\n endTime: endMs,\n duration: dur,\n eventId: primary.event_id,\n pending,\n });\n }\n\n return spans;\n}\n","import { useState } from 'react';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\nimport { EventDetailPanel } from './EventDetailPanel';\nimport {\n formatDuration,\n middleTruncate,\n buildTimelineSpans,\n CATEGORY_COLORS,\n PENDING_CLASS,\n MCP_ACTIVITY_NAMES,\n} from './utils';\nimport type { Segment, Lane } from './utils';\n\ninterface SwimlaneTimelineProps {\n events: WorkflowExecutionEvent[];\n childTasks?: LTTaskRecord[];\n /** Use outline-style bars (border + transparent fill) instead of solid fills */\n outline?: boolean;\n}\n\n// ── Component ────────────────────────────────────────────────────────────────\n\nexport function SwimlaneTimeline({ events, childTasks, outline }: SwimlaneTimelineProps) {\n const [selectedEvents, setSelectedEvents] = useState<Set<number>>(new Set());\n const [hoveredEvent, setHoveredEvent] = useState<number | null>(null);\n\n // Filter out workflow-level events (started/completed) — they aren't operations\n const timelineEvents = events.filter(\n (e) => e.category !== 'workflow',\n );\n\n // Show all activities (user + system), signals, timers, and child workflows.\n const displayEvents = timelineEvents;\n\n if (displayEvents.length === 0) return null;\n\n const spans = buildTimelineSpans(displayEvents);\n if (spans.length === 0) return null;\n\n // Compute time axis bounds\n const now = Date.now();\n const allTimes = spans.flatMap((s) => {\n const times = [s.startTime];\n if (s.endTime) times.push(s.endTime);\n else times.push(now); // pending extends to now\n return times;\n });\n const timeMin = Math.min(...allTimes);\n const timeMax = Math.max(...allTimes);\n const totalSpan = timeMax - timeMin || 1;\n\n // Group spans into lanes by \"category:name\"\n const laneMap = new Map<string, { name: string; category: string; segments: Segment[] }>();\n\n for (const span of spans) {\n const laneKey = `${span.category}:${span.name}`;\n const startOffset = span.startTime - timeMin;\n const endOffset = span.endTime ? span.endTime - timeMin : (now - timeMin);\n const widthMs = endOffset - startOffset;\n\n const segment: Segment = {\n eventId: span.eventId,\n startPct: (startOffset / totalSpan) * 100,\n widthPct: Math.max((widthMs / totalSpan) * 100, 0.5),\n duration: span.duration,\n label: `${span.name} — ${span.duration !== null ? formatDuration(span.duration) : 'pending'} — ${new Date(span.startTime).toLocaleTimeString()}`,\n eventTime: new Date(span.startTime).toISOString(),\n pending: span.pending,\n };\n\n if (!laneMap.has(laneKey)) {\n laneMap.set(laneKey, { name: span.name, category: span.category, segments: [] });\n }\n laneMap.get(laneKey)!.segments.push(segment);\n }\n\n const lanes: Lane[] = Array.from(laneMap.values());\n\n // Time axis ticks\n const tickCount = 5;\n const ticks = Array.from({ length: tickCount + 1 }, (_, i) => ({\n pct: (i / tickCount) * 100,\n label: formatDuration(Math.round((i / tickCount) * totalSpan)),\n }));\n\n // Active categories for legend\n const activeCategories = [...new Set(spans.map((s) => s.category))];\n\n /** Find a matching child task for an event */\n const findChildTask = (evt: WorkflowExecutionEvent): LTTaskRecord | undefined => {\n if (!childTasks?.length) return undefined;\n const activityType = evt.attributes.activity_type;\n if (!activityType) return undefined;\n return childTasks.find((t) => t.workflow_type === activityType);\n };\n\n const toggleEvent = (id: number) => {\n setSelectedEvents((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const allEventIds = spans.map((s) => s.eventId);\n const allExpanded = allEventIds.length > 0 && allEventIds.every((id) => selectedEvents.has(id));\n\n const toggleAll = () => {\n if (allExpanded) {\n setSelectedEvents(new Set());\n } else {\n setSelectedEvents(new Set(allEventIds));\n }\n };\n\n\n\n const barColor = (cat: string, pending: boolean) => {\n if (pending) return PENDING_CLASS;\n if (outline) return CATEGORY_COLORS[cat]?.outline ?? 'border-text-tertiary bg-transparent';\n return CATEGORY_COLORS[cat]?.bar ?? 'bg-text-tertiary';\n };\n\n const textColor = (cat: string) => {\n if (outline) return CATEGORY_COLORS[cat]?.text ?? 'text-text-tertiary';\n return 'text-white';\n };\n\n return (\n <div className=\"px-6 py-6 mb-6\">\n <div className=\"flex items-center gap-4 mb-4 flex-wrap\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Execution Timeline\n </p>\n <button onClick={toggleAll} className=\"text-[10px] text-accent hover:underline\">\n {allExpanded ? 'Collapse all' : 'Expand all'}\n </button>\n\n {/* Legend */}\n <div className=\"flex items-center gap-3 ml-auto\">\n {activeCategories.map((cat) => (\n <div key={cat} className=\"flex items-center gap-1\">\n <span className={`w-2 h-2 rounded-full ${outline ? `border ${CATEGORY_COLORS[cat]?.outline ?? 'border-text-tertiary'}` : CATEGORY_COLORS[cat]?.bar ?? 'bg-text-tertiary'}`} />\n <span className=\"text-[9px] text-text-tertiary\">\n {CATEGORY_COLORS[cat]?.label ?? cat}\n </span>\n </div>\n ))}\n {spans.some((s) => s.pending) && (\n <div className=\"flex items-center gap-1\">\n <span className=\"w-2 h-2 rounded-full bg-status-warning animate-pulse\" />\n <span className=\"text-[9px] text-text-tertiary\">Pending</span>\n </div>\n )}\n </div>\n </div>\n\n {/* Time axis */}\n <div className=\"flex\">\n <div className=\"w-56 shrink-0\" />\n <div className=\"flex-1 relative h-6 border-b border-surface-border\">\n {ticks.map((tick) => (\n <span\n key={tick.pct}\n className=\"absolute text-[9px] font-mono text-text-tertiary -translate-x-1/2 bottom-1\"\n style={{ left: `${tick.pct}%` }}\n >\n {tick.label}\n </span>\n ))}\n </div>\n </div>\n\n {/* Lanes */}\n {lanes.map((lane) => {\n const catColor = CATEGORY_COLORS[lane.category];\n\n return (\n <div key={`${lane.category}:${lane.name}`}>\n {/* Lane row */}\n <div className=\"flex items-center border-b border-surface-border\">\n <div className=\"w-56 shrink-0 py-3 pr-4 flex items-center gap-2\">\n <span className={`w-1.5 h-1.5 rounded-full shrink-0 ${catColor?.bar ?? 'bg-text-tertiary'}`} />\n <p\n className=\"text-xs font-mono text-text-secondary whitespace-nowrap overflow-hidden\"\n title={lane.name}\n >\n {middleTruncate(lane.name, 28)}\n </p>\n {MCP_ACTIVITY_NAMES.has(lane.name) && (\n <span className=\"shrink-0 text-accent/60\" title=\"MCP tool interaction\">\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.663 17h4.674M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\" />\n </svg>\n </span>\n )}\n </div>\n\n <div className=\"flex-1 relative h-10\">\n {ticks.map((tick) => (\n <div\n key={tick.pct}\n className=\"absolute top-0 bottom-0 w-px bg-surface-border opacity-30\"\n style={{ left: `${tick.pct}%` }}\n />\n ))}\n\n {lane.segments.map((seg) => {\n const isHovered = hoveredEvent === seg.eventId;\n const isSelected = selectedEvents.has(seg.eventId);\n const isNarrow = seg.widthPct < 3;\n return (\n <div\n key={seg.eventId}\n className={`absolute top-2 h-6 rounded-sm cursor-pointer transition-all duration-200 origin-center ${\n isSelected\n ? `${barColor(lane.category, seg.pending)} ring-2 ring-accent ring-offset-1`\n : `${barColor(lane.category, seg.pending)} hover:opacity-80`\n }`}\n style={{\n left: `${seg.startPct}%`,\n width: `${seg.widthPct}%`,\n minWidth: '4px',\n ...(isHovered && isNarrow ? {\n transform: 'scaleX(4) scaleY(1.3) translateY(-2px)',\n zIndex: 20,\n borderRadius: '4px',\n } : {\n zIndex: isSelected ? 10 : 1,\n }),\n }}\n title={seg.label}\n onClick={() => toggleEvent(seg.eventId)}\n onMouseEnter={() => setHoveredEvent(seg.eventId)}\n onMouseLeave={() => setHoveredEvent(null)}\n >\n {seg.widthPct > 8 && (\n <span className={`absolute inset-0 flex items-center px-1.5 text-[9px] font-mono ${textColor(lane.category)} truncate`}>\n {seg.duration !== null ? formatDuration(seg.duration) : 'pending'}\n </span>\n )}\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Inline detail panels */}\n {lane.segments.map((seg) => {\n const isOpen = selectedEvents.has(seg.eventId);\n const evt = displayEvents.find((e) => e.event_id === seg.eventId);\n return (\n <Collapsible key={seg.eventId} open={isOpen}>\n {evt && (\n <div className=\"py-3\">\n <EventDetailPanel\n event={evt}\n childTask={findChildTask(evt)}\n pending={seg.pending}\n onClose={() => toggleEvent(evt.event_id)}\n />\n </div>\n )}\n </Collapsible>\n );\n })}\n </div>\n );\n })}\n\n </div>\n );\n}\n"],"names":["safeParseJson","raw","EventMetadataGrid","event","jsxs","jsx","DurationValue","DateValue","ChildWorkflowSection","childTask","childInput","childOutput","Link","e","StatusBadge","JsonViewer","EventPayloadSection","input","result","isSignal","isActivity","isChild","hasInput","hasResult","resultLabel","EventDetailPanel","pending","onClose","kind","activity_type","timeline_key","execution_index","signal_name","child_workflow_id","awaited","wait_event_id","scheduled_event_id","initiated_event_id","failure","trace_id","span_id","rest","CATEGORY_COLORS","PENDING_CLASS","MCP_ACTIVITY_NAMES","middleTruncate","str","maxLen","keep","buildTimelineSpans","events","spans","startedMap","completedMap","evt","tlKey","type","seen","started","completed","primary","cat","name","startEvt","endEvt","startMs","endMs","dur","SwimlaneTimeline","childTasks","outline","selectedEvents","setSelectedEvents","useState","hoveredEvent","setHoveredEvent","displayEvents","now","allTimes","s","times","timeMin","totalSpan","laneMap","span","laneKey","startOffset","widthMs","segment","formatDuration","lanes","tickCount","ticks","_","i","activeCategories","findChildTask","activityType","t","toggleEvent","id","prev","next","allEventIds","allExpanded","toggleAll","barColor","_a","_b","textColor","tick","lane","catColor","seg","isHovered","isSelected","isNarrow","isOpen","Collapsible"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as p,j as a}from"./vendor-query-B2UbickB.js";import{X as m}from"./vendor-icons-BNtvBbnj.js";function d(t){return t.toLowerCase().replace(/[^a-z0-9-]/g,"").replace(/^-|-$/g,"")}function y({tags:t,onChange:o,placeholder:u="Add tag...",compact:x}){const[r,s]=p.useState(""),c=p.useRef(null),i=e=>{const n=d(e);n&&!t.includes(n)&&o([...t,n]),s("")},l=e=>{o(t.filter(n=>n!==e))},f=e=>{e.key==="Enter"||e.key===","?(e.preventDefault(),i(r)):e.key==="Backspace"&&!r&&t.length>0&&l(t[t.length-1])};return a.jsxs("div",{className:x?"flex flex-wrap items-center gap-1.5":"flex flex-wrap items-center gap-1.5 bg-surface-sunken border border-surface-border rounded-md px-2 py-1.5 focus-within:ring-1 focus-within:ring-accent-primary cursor-text",onClick:()=>{var e;return(e=c.current)==null?void 0:e.focus()},children:[t.map(e=>a.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium",children:[e,a.jsx("button",{type:"button",onClick:n=>{n.stopPropagation(),l(e)},className:"hover:text-status-error transition-colors",children:a.jsx(m,{className:"w-2.5 h-2.5"})})]},e)),a.jsx("input",{ref:c,type:"text",value:r,onChange:e=>s(e.target.value),onKeyDown:f,onBlur:()=>{r.trim()&&i(r)},placeholder:t.length===0?u:"",className:"flex-1 min-w-[80px] bg-transparent text-xs text-text-primary outline-none placeholder:text-text-tertiary"})]})}export{y as T};
2
- //# sourceMappingURL=TagInput-VBY0xIwb.js.map
1
+ import{a as p,j as a}from"./vendor-query-B2UbickB.js";import{X as m}from"./vendor-icons-B_Yla7iD.js";function d(t){return t.toLowerCase().replace(/[^a-z0-9-]/g,"").replace(/^-|-$/g,"")}function y({tags:t,onChange:o,placeholder:u="Add tag...",compact:x}){const[r,s]=p.useState(""),c=p.useRef(null),i=e=>{const n=d(e);n&&!t.includes(n)&&o([...t,n]),s("")},l=e=>{o(t.filter(n=>n!==e))},f=e=>{e.key==="Enter"||e.key===","?(e.preventDefault(),i(r)):e.key==="Backspace"&&!r&&t.length>0&&l(t[t.length-1])};return a.jsxs("div",{className:x?"flex flex-wrap items-center gap-1.5":"flex flex-wrap items-center gap-1.5 bg-surface-sunken border border-surface-border rounded-md px-2 py-1.5 focus-within:ring-1 focus-within:ring-accent-primary cursor-text",onClick:()=>{var e;return(e=c.current)==null?void 0:e.focus()},children:[t.map(e=>a.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium",children:[e,a.jsx("button",{type:"button",onClick:n=>{n.stopPropagation(),l(e)},className:"hover:text-status-error transition-colors",children:a.jsx(m,{className:"w-2.5 h-2.5"})})]},e)),a.jsx("input",{ref:c,type:"text",value:r,onChange:e=>s(e.target.value),onKeyDown:f,onBlur:()=>{r.trim()&&i(r)},placeholder:t.length===0?u:"",className:"flex-1 min-w-[80px] bg-transparent text-xs text-text-primary outline-none placeholder:text-text-tertiary"})]})}export{y as T};
2
+ //# sourceMappingURL=TagInput-D3f11sbM.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TagInput-VBY0xIwb.js","sources":["../../src/components/common/form/TagInput.tsx"],"sourcesContent":["import { useState, useRef, type KeyboardEvent } from 'react';\nimport { X } from 'lucide-react';\n\ninterface TagInputProps {\n tags: string[];\n onChange: (tags: string[]) => void;\n placeholder?: string;\n /** Show as compact inline pills (no border wrapper) */\n compact?: boolean;\n}\n\nfunction sanitizeTag(raw: string): string {\n return raw.toLowerCase().replace(/[^a-z0-9-]/g, '').replace(/^-|-$/g, '');\n}\n\nexport function TagInput({ tags, onChange, placeholder = 'Add tag...', compact }: TagInputProps) {\n const [input, setInput] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n const addTag = (raw: string) => {\n const tag = sanitizeTag(raw);\n if (tag && !tags.includes(tag)) {\n onChange([...tags, tag]);\n }\n setInput('');\n };\n\n const removeTag = (tag: string) => {\n onChange(tags.filter((t) => t !== tag));\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault();\n addTag(input);\n } else if (e.key === 'Backspace' && !input && tags.length > 0) {\n removeTag(tags[tags.length - 1]);\n }\n };\n\n return (\n <div\n className={\n compact\n ? 'flex flex-wrap items-center gap-1.5'\n : 'flex flex-wrap items-center gap-1.5 bg-surface-sunken border border-surface-border rounded-md px-2 py-1.5 focus-within:ring-1 focus-within:ring-accent-primary cursor-text'\n }\n onClick={() => inputRef.current?.focus()}\n >\n {tags.map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium\"\n >\n {tag}\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); removeTag(tag); }}\n className=\"hover:text-status-error transition-colors\"\n >\n <X className=\"w-2.5 h-2.5\" />\n </button>\n </span>\n ))}\n <input\n ref={inputRef}\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={() => { if (input.trim()) addTag(input); }}\n placeholder={tags.length === 0 ? placeholder : ''}\n className=\"flex-1 min-w-[80px] bg-transparent text-xs text-text-primary outline-none placeholder:text-text-tertiary\"\n />\n </div>\n );\n}\n"],"names":["sanitizeTag","raw","TagInput","tags","onChange","placeholder","compact","input","setInput","useState","inputRef","useRef","addTag","tag","removeTag","t","handleKeyDown","jsxs","_a","jsx","e","X"],"mappings":"qGAWA,SAASA,EAAYC,EAAqB,CACxC,OAAOA,EAAI,cAAc,QAAQ,cAAe,EAAE,EAAE,QAAQ,SAAU,EAAE,CAC1E,CAEO,SAASC,EAAS,CAAE,KAAAC,EAAM,SAAAC,EAAU,YAAAC,EAAc,aAAc,QAAAC,GAA0B,CAC/F,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAS,EAAE,EAC/BC,EAAWC,EAAAA,OAAyB,IAAI,EAExCC,EAAUX,GAAgB,CAC9B,MAAMY,EAAMb,EAAYC,CAAG,EACvBY,GAAO,CAACV,EAAK,SAASU,CAAG,GAC3BT,EAAS,CAAC,GAAGD,EAAMU,CAAG,CAAC,EAEzBL,EAAS,EAAE,CACb,EAEMM,EAAaD,GAAgB,CACjCT,EAASD,EAAK,OAAQY,GAAMA,IAAMF,CAAG,CAAC,CACxC,EAEMG,EAAiB,GAAuC,CACxD,EAAE,MAAQ,SAAW,EAAE,MAAQ,KACjC,EAAE,eAAA,EACFJ,EAAOL,CAAK,GACH,EAAE,MAAQ,aAAe,CAACA,GAASJ,EAAK,OAAS,GAC1DW,EAAUX,EAAKA,EAAK,OAAS,CAAC,CAAC,CAEnC,EAEA,OACEc,EAAAA,KAAC,MAAA,CACC,UACEX,EACI,sCACA,6KAEN,QAAS,IAAA,OAAM,OAAAY,EAAAR,EAAS,UAAT,YAAAQ,EAAkB,SAEhC,SAAA,CAAAf,EAAK,IAAKU,GACTI,EAAAA,KAAC,OAAA,CAEC,UAAU,2GAET,SAAA,CAAAJ,EACDM,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,QAAUC,GAAM,CAAEA,EAAE,gBAAA,EAAmBN,EAAUD,CAAG,CAAG,EACvD,UAAU,4CAEV,SAAAM,EAAAA,IAACE,EAAA,CAAE,UAAU,aAAA,CAAc,CAAA,CAAA,CAC7B,CAAA,EAVKR,CAAA,CAYR,EACDM,EAAAA,IAAC,QAAA,CACC,IAAKT,EACL,KAAK,OACL,MAAOH,EACP,SAAW,GAAMC,EAAS,EAAE,OAAO,KAAK,EACxC,UAAWQ,EACX,OAAQ,IAAM,CAAMT,EAAM,QAAQK,EAAOL,CAAK,CAAG,EACjD,YAAaJ,EAAK,SAAW,EAAIE,EAAc,GAC/C,UAAU,0GAAA,CAAA,CACZ,CAAA,CAAA,CAGN"}
1
+ {"version":3,"file":"TagInput-D3f11sbM.js","sources":["../../src/components/common/form/TagInput.tsx"],"sourcesContent":["import { useState, useRef, type KeyboardEvent } from 'react';\nimport { X } from 'lucide-react';\n\ninterface TagInputProps {\n tags: string[];\n onChange: (tags: string[]) => void;\n placeholder?: string;\n /** Show as compact inline pills (no border wrapper) */\n compact?: boolean;\n}\n\nfunction sanitizeTag(raw: string): string {\n return raw.toLowerCase().replace(/[^a-z0-9-]/g, '').replace(/^-|-$/g, '');\n}\n\nexport function TagInput({ tags, onChange, placeholder = 'Add tag...', compact }: TagInputProps) {\n const [input, setInput] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n const addTag = (raw: string) => {\n const tag = sanitizeTag(raw);\n if (tag && !tags.includes(tag)) {\n onChange([...tags, tag]);\n }\n setInput('');\n };\n\n const removeTag = (tag: string) => {\n onChange(tags.filter((t) => t !== tag));\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault();\n addTag(input);\n } else if (e.key === 'Backspace' && !input && tags.length > 0) {\n removeTag(tags[tags.length - 1]);\n }\n };\n\n return (\n <div\n className={\n compact\n ? 'flex flex-wrap items-center gap-1.5'\n : 'flex flex-wrap items-center gap-1.5 bg-surface-sunken border border-surface-border rounded-md px-2 py-1.5 focus-within:ring-1 focus-within:ring-accent-primary cursor-text'\n }\n onClick={() => inputRef.current?.focus()}\n >\n {tags.map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium\"\n >\n {tag}\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); removeTag(tag); }}\n className=\"hover:text-status-error transition-colors\"\n >\n <X className=\"w-2.5 h-2.5\" />\n </button>\n </span>\n ))}\n <input\n ref={inputRef}\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={() => { if (input.trim()) addTag(input); }}\n placeholder={tags.length === 0 ? placeholder : ''}\n className=\"flex-1 min-w-[80px] bg-transparent text-xs text-text-primary outline-none placeholder:text-text-tertiary\"\n />\n </div>\n );\n}\n"],"names":["sanitizeTag","raw","TagInput","tags","onChange","placeholder","compact","input","setInput","useState","inputRef","useRef","addTag","tag","removeTag","t","handleKeyDown","jsxs","_a","jsx","e","X"],"mappings":"qGAWA,SAASA,EAAYC,EAAqB,CACxC,OAAOA,EAAI,cAAc,QAAQ,cAAe,EAAE,EAAE,QAAQ,SAAU,EAAE,CAC1E,CAEO,SAASC,EAAS,CAAE,KAAAC,EAAM,SAAAC,EAAU,YAAAC,EAAc,aAAc,QAAAC,GAA0B,CAC/F,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAS,EAAE,EAC/BC,EAAWC,EAAAA,OAAyB,IAAI,EAExCC,EAAUX,GAAgB,CAC9B,MAAMY,EAAMb,EAAYC,CAAG,EACvBY,GAAO,CAACV,EAAK,SAASU,CAAG,GAC3BT,EAAS,CAAC,GAAGD,EAAMU,CAAG,CAAC,EAEzBL,EAAS,EAAE,CACb,EAEMM,EAAaD,GAAgB,CACjCT,EAASD,EAAK,OAAQY,GAAMA,IAAMF,CAAG,CAAC,CACxC,EAEMG,EAAiB,GAAuC,CACxD,EAAE,MAAQ,SAAW,EAAE,MAAQ,KACjC,EAAE,eAAA,EACFJ,EAAOL,CAAK,GACH,EAAE,MAAQ,aAAe,CAACA,GAASJ,EAAK,OAAS,GAC1DW,EAAUX,EAAKA,EAAK,OAAS,CAAC,CAAC,CAEnC,EAEA,OACEc,EAAAA,KAAC,MAAA,CACC,UACEX,EACI,sCACA,6KAEN,QAAS,IAAA,OAAM,OAAAY,EAAAR,EAAS,UAAT,YAAAQ,EAAkB,SAEhC,SAAA,CAAAf,EAAK,IAAKU,GACTI,EAAAA,KAAC,OAAA,CAEC,UAAU,2GAET,SAAA,CAAAJ,EACDM,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,QAAUC,GAAM,CAAEA,EAAE,gBAAA,EAAmBN,EAAUD,CAAG,CAAG,EACvD,UAAU,4CAEV,SAAAM,EAAAA,IAACE,EAAA,CAAE,UAAU,aAAA,CAAc,CAAA,CAAA,CAC7B,CAAA,EAVKR,CAAA,CAYR,EACDM,EAAAA,IAAC,QAAA,CACC,IAAKT,EACL,KAAK,OACL,MAAOH,EACP,SAAW,GAAMC,EAAS,EAAE,OAAO,KAAK,EACxC,UAAWQ,EACX,OAAQ,IAAM,CAAMT,EAAM,QAAQK,EAAOL,CAAK,CAAG,EACjD,YAAaJ,EAAK,SAAW,EAAIE,EAAc,GAC/C,UAAU,0GAAA,CAAA,CACZ,CAAA,CAAA,CAGN"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./vendor-query-B2UbickB.js";import{d as c}from"./tasks-C-QX245z.js";import{S as x}from"./StatusBadge-XQlNFwmH.js";import{P as m}from"./PriorityBadge-DfQY9St9.js";import{S as i,J as r}from"./index-CBS8FBcp.js";import{P as p}from"./PageHeader-Bo0SpcCK.js";import{e as j,L as u}from"./vendor-react-CX88sFS5.js";import"./vendor-icons-BNtvBbnj.js";function a({label:t,value:s}){return e.jsxs("div",{children:[e.jsx(i,{className:"mb-1",children:t}),e.jsx("div",{className:"text-sm text-text-primary",children:s??"—"})]})}function f({items:t}){return t.length===0?null:e.jsxs("div",{className:"relative",children:[e.jsx("div",{className:"absolute left-[7px] top-3 bottom-3 w-px bg-surface-border"}),e.jsx("div",{className:"space-y-0",children:t.map(s=>e.jsxs("div",{className:"relative flex gap-4 py-3",children:[e.jsx("div",{className:"relative z-10 mt-1",children:e.jsx("div",{className:`w-[15px] h-[15px] rounded-full border-2 ${s.category==="system"?"border-accent-muted bg-surface-raised":"border-accent bg-accent"}`})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-baseline gap-3",children:[e.jsx("p",{className:"text-sm text-text-primary",children:s.label}),s.timestamp&&e.jsx("time",{className:"text-[10px] text-text-tertiary font-mono shrink-0",children:new Date(s.timestamp).toLocaleTimeString()})]}),s.detail&&e.jsx("div",{className:"mt-1",children:s.detail})]})]},s.id))})]})}function S(){const{id:t}=j(),{data:s,isLoading:o}=c(t);if(o)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]});if(!s)return e.jsx("p",{className:"text-sm text-text-secondary",children:"Task not found."});const n=(s.milestones??[]).map((l,d)=>({id:d,label:l.name,timestamp:l.created_at,detail:e.jsx("span",{className:"text-xs text-text-secondary font-mono",children:typeof l.value=="object"?JSON.stringify(l.value):String(l.value)}),category:"user"}));return e.jsxs("div",{children:[e.jsx(p,{title:"Task Detail"}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-12",children:[e.jsxs("div",{className:"lg:col-span-2 space-y-10",children:[e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-3 gap-6",children:[e.jsx(a,{label:"Status",value:e.jsx(x,{status:s.status})}),e.jsx(a,{label:"Priority",value:e.jsx(m,{priority:s.priority})}),e.jsx(a,{label:"Workflow Type",value:e.jsx("span",{className:"font-mono text-xs",children:s.workflow_type})}),e.jsx(a,{label:"LT Type",value:e.jsx("span",{className:"font-mono text-xs",children:s.lt_type})}),e.jsx(a,{label:"Task Queue",value:e.jsx("span",{className:"font-mono text-xs",children:s.task_queue})}),e.jsx(a,{label:"Workflow ID",value:e.jsx("span",{className:"font-mono text-xs break-all",children:s.workflow_id})}),e.jsx(a,{label:"Started",value:s.started_at?new Date(s.started_at).toLocaleString():"—"}),e.jsx(a,{label:"Completed",value:s.completed_at?new Date(s.completed_at).toLocaleString():"—"}),e.jsx(a,{label:"Signal ID",value:e.jsx("span",{className:"font-mono text-xs break-all",children:s.signal_id})})]}),s.error&&e.jsxs("div",{children:[e.jsx(i,{className:"mb-2 text-status-error",children:"Error"}),e.jsx("p",{className:"text-sm text-text-primary font-mono",children:s.error})]}),n.length>0&&e.jsxs("div",{children:[e.jsx(i,{className:"mb-4",children:"Milestones"}),e.jsx(f,{items:n})]}),e.jsx(u,{to:`/workflows/executions/${s.workflow_id}`,className:"btn-secondary inline-block text-xs",children:"View Workflow Execution"})]}),e.jsxs("div",{className:"space-y-8",children:[e.jsx(r,{data:s.envelope,label:"Envelope"}),s.metadata&&e.jsx(r,{data:s.metadata,label:"Metadata"}),s.data&&e.jsx(r,{data:s.data,label:"Result Data"})]})]})]})}export{S as TaskDetailPage};
2
- //# sourceMappingURL=TaskDetailPage-CZw_F8y4.js.map
1
+ import{j as e}from"./vendor-query-B2UbickB.js";import{d as c}from"./tasks-BevFBjZq.js";import{S as x}from"./StatusBadge-XQlNFwmH.js";import{P as m}from"./PriorityBadge-DfQY9St9.js";import{S as i,J as r}from"./index-DZX-E_3q.js";import{P as p}from"./PageHeader-B_gV_jKk.js";import{e as j,L as u}from"./vendor-react-CX88sFS5.js";import"./vendor-icons-B_Yla7iD.js";function a({label:t,value:s}){return e.jsxs("div",{children:[e.jsx(i,{className:"mb-1",children:t}),e.jsx("div",{className:"text-sm text-text-primary",children:s??"—"})]})}function f({items:t}){return t.length===0?null:e.jsxs("div",{className:"relative",children:[e.jsx("div",{className:"absolute left-[7px] top-3 bottom-3 w-px bg-surface-border"}),e.jsx("div",{className:"space-y-0",children:t.map(s=>e.jsxs("div",{className:"relative flex gap-4 py-3",children:[e.jsx("div",{className:"relative z-10 mt-1",children:e.jsx("div",{className:`w-[15px] h-[15px] rounded-full border-2 ${s.category==="system"?"border-accent-muted bg-surface-raised":"border-accent bg-accent"}`})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-baseline gap-3",children:[e.jsx("p",{className:"text-sm text-text-primary",children:s.label}),s.timestamp&&e.jsx("time",{className:"text-[10px] text-text-tertiary font-mono shrink-0",children:new Date(s.timestamp).toLocaleTimeString()})]}),s.detail&&e.jsx("div",{className:"mt-1",children:s.detail})]})]},s.id))})]})}function S(){const{id:t}=j(),{data:s,isLoading:o}=c(t);if(o)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]});if(!s)return e.jsx("p",{className:"text-sm text-text-secondary",children:"Task not found."});const n=(s.milestones??[]).map((l,d)=>({id:d,label:l.name,timestamp:l.created_at,detail:e.jsx("span",{className:"text-xs text-text-secondary font-mono",children:typeof l.value=="object"?JSON.stringify(l.value):String(l.value)}),category:"user"}));return e.jsxs("div",{children:[e.jsx(p,{title:"Task Detail"}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-12",children:[e.jsxs("div",{className:"lg:col-span-2 space-y-10",children:[e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-3 gap-6",children:[e.jsx(a,{label:"Status",value:e.jsx(x,{status:s.status})}),e.jsx(a,{label:"Priority",value:e.jsx(m,{priority:s.priority})}),e.jsx(a,{label:"Workflow Type",value:e.jsx("span",{className:"font-mono text-xs",children:s.workflow_type})}),e.jsx(a,{label:"LT Type",value:e.jsx("span",{className:"font-mono text-xs",children:s.lt_type})}),e.jsx(a,{label:"Task Queue",value:e.jsx("span",{className:"font-mono text-xs",children:s.task_queue})}),e.jsx(a,{label:"Workflow ID",value:e.jsx("span",{className:"font-mono text-xs break-all",children:s.workflow_id})}),e.jsx(a,{label:"Started",value:s.started_at?new Date(s.started_at).toLocaleString():"—"}),e.jsx(a,{label:"Completed",value:s.completed_at?new Date(s.completed_at).toLocaleString():"—"}),e.jsx(a,{label:"Signal ID",value:e.jsx("span",{className:"font-mono text-xs break-all",children:s.signal_id})})]}),s.error&&e.jsxs("div",{children:[e.jsx(i,{className:"mb-2 text-status-error",children:"Error"}),e.jsx("p",{className:"text-sm text-text-primary font-mono",children:s.error})]}),n.length>0&&e.jsxs("div",{children:[e.jsx(i,{className:"mb-4",children:"Milestones"}),e.jsx(f,{items:n})]}),e.jsx(u,{to:`/workflows/executions/${s.workflow_id}`,className:"btn-secondary inline-block text-xs",children:"View Workflow Execution"})]}),e.jsxs("div",{className:"space-y-8",children:[e.jsx(r,{data:s.envelope,label:"Envelope"}),s.metadata&&e.jsx(r,{data:s.metadata,label:"Metadata"}),s.data&&e.jsx(r,{data:s.data,label:"Result Data"})]})]})]})}export{S as TaskDetailPage};
2
+ //# sourceMappingURL=TaskDetailPage-DPV4ySd9.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TaskDetailPage-CZw_F8y4.js","sources":["../../src/components/common/data/Field.tsx","../../src/components/common/display/Timeline.tsx","../../src/pages/workflows/TaskDetailPage.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { SectionLabel } from '../layout/SectionLabel';\n\ninterface FieldProps {\n label: string;\n value: ReactNode;\n}\n\nexport function Field({ label, value }: FieldProps) {\n return (\n <div>\n <SectionLabel className=\"mb-1\">{label}</SectionLabel>\n <div className=\"text-sm text-text-primary\">{value ?? '—'}</div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface TimelineItem {\n id: string | number;\n label: string;\n timestamp?: string;\n detail?: ReactNode;\n category?: 'system' | 'user';\n}\n\nexport function Timeline({ items }: { items: TimelineItem[] }) {\n if (items.length === 0) return null;\n\n return (\n <div className=\"relative\">\n {/* Vertical line */}\n <div className=\"absolute left-[7px] top-3 bottom-3 w-px bg-surface-border\" />\n\n <div className=\"space-y-0\">\n {items.map((item) => (\n <div key={item.id} className=\"relative flex gap-4 py-3\">\n {/* Dot */}\n <div className=\"relative z-10 mt-1\">\n <div\n className={`w-[15px] h-[15px] rounded-full border-2 ${\n item.category === 'system'\n ? 'border-accent-muted bg-surface-raised'\n : 'border-accent bg-accent'\n }`}\n />\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-baseline gap-3\">\n <p className=\"text-sm text-text-primary\">{item.label}</p>\n {item.timestamp && (\n <time className=\"text-[10px] text-text-tertiary font-mono shrink-0\">\n {new Date(item.timestamp).toLocaleTimeString()}\n </time>\n )}\n </div>\n {item.detail && <div className=\"mt-1\">{item.detail}</div>}\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { useParams, Link } from 'react-router-dom';\nimport { useTask } from '../../api/tasks';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport { PriorityBadge } from '../../components/common/display/PriorityBadge';\nimport { Field } from '../../components/common/data/Field';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { SectionLabel } from '../../components/common/layout/SectionLabel';\nimport { Timeline, type TimelineItem } from '../../components/common/display/Timeline';\n\nexport function TaskDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { data: task, isLoading } = useTask(id!);\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-40 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!task) {\n return <p className=\"text-sm text-text-secondary\">Task not found.</p>;\n }\n\n const milestoneItems: TimelineItem[] = (task.milestones ?? []).map((m, i) => ({\n id: i,\n label: m.name,\n timestamp: m.created_at,\n detail: (\n <span className=\"text-xs text-text-secondary font-mono\">\n {typeof m.value === 'object' ? JSON.stringify(m.value) : String(m.value)}\n </span>\n ),\n category: 'user' as const,\n }));\n\n return (\n <div>\n <PageHeader title=\"Task Detail\" />\n\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-12\">\n {/* Left column — metadata */}\n <div className=\"lg:col-span-2 space-y-10\">\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-6\">\n <Field label=\"Status\" value={<StatusBadge status={task.status} />} />\n <Field label=\"Priority\" value={<PriorityBadge priority={task.priority} />} />\n <Field label=\"Workflow Type\" value={<span className=\"font-mono text-xs\">{task.workflow_type}</span>} />\n <Field label=\"LT Type\" value={<span className=\"font-mono text-xs\">{task.lt_type}</span>} />\n <Field label=\"Task Queue\" value={<span className=\"font-mono text-xs\">{task.task_queue}</span>} />\n <Field label=\"Workflow ID\" value={<span className=\"font-mono text-xs break-all\">{task.workflow_id}</span>} />\n <Field label=\"Started\" value={task.started_at ? new Date(task.started_at).toLocaleString() : '—'} />\n <Field label=\"Completed\" value={task.completed_at ? new Date(task.completed_at).toLocaleString() : '—'} />\n <Field label=\"Signal ID\" value={<span className=\"font-mono text-xs break-all\">{task.signal_id}</span>} />\n </div>\n\n {task.error && (\n <div>\n <SectionLabel className=\"mb-2 text-status-error\">Error</SectionLabel>\n <p className=\"text-sm text-text-primary font-mono\">{task.error}</p>\n </div>\n )}\n\n {milestoneItems.length > 0 && (\n <div>\n <SectionLabel className=\"mb-4\">Milestones</SectionLabel>\n <Timeline items={milestoneItems} />\n </div>\n )}\n\n <Link\n to={`/workflows/executions/${task.workflow_id}`}\n className=\"btn-secondary inline-block text-xs\"\n >\n View Workflow Execution\n </Link>\n </div>\n\n {/* Right column — payloads */}\n <div className=\"space-y-8\">\n <JsonViewer data={task.envelope} label=\"Envelope\" />\n {task.metadata && <JsonViewer data={task.metadata} label=\"Metadata\" />}\n {task.data && <JsonViewer data={task.data} label=\"Result Data\" />}\n </div>\n </div>\n </div>\n );\n}\n"],"names":["Field","label","value","jsx","SectionLabel","Timeline","items","jsxs","item","TaskDetailPage","id","useParams","task","isLoading","useTask","milestoneItems","m","i","PageHeader","StatusBadge","PriorityBadge","Link","JsonViewer"],"mappings":"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"}
1
+ {"version":3,"file":"TaskDetailPage-DPV4ySd9.js","sources":["../../src/components/common/data/Field.tsx","../../src/components/common/display/Timeline.tsx","../../src/pages/workflows/TaskDetailPage.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { SectionLabel } from '../layout/SectionLabel';\n\ninterface FieldProps {\n label: string;\n value: ReactNode;\n}\n\nexport function Field({ label, value }: FieldProps) {\n return (\n <div>\n <SectionLabel className=\"mb-1\">{label}</SectionLabel>\n <div className=\"text-sm text-text-primary\">{value ?? '—'}</div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface TimelineItem {\n id: string | number;\n label: string;\n timestamp?: string;\n detail?: ReactNode;\n category?: 'system' | 'user';\n}\n\nexport function Timeline({ items }: { items: TimelineItem[] }) {\n if (items.length === 0) return null;\n\n return (\n <div className=\"relative\">\n {/* Vertical line */}\n <div className=\"absolute left-[7px] top-3 bottom-3 w-px bg-surface-border\" />\n\n <div className=\"space-y-0\">\n {items.map((item) => (\n <div key={item.id} className=\"relative flex gap-4 py-3\">\n {/* Dot */}\n <div className=\"relative z-10 mt-1\">\n <div\n className={`w-[15px] h-[15px] rounded-full border-2 ${\n item.category === 'system'\n ? 'border-accent-muted bg-surface-raised'\n : 'border-accent bg-accent'\n }`}\n />\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-baseline gap-3\">\n <p className=\"text-sm text-text-primary\">{item.label}</p>\n {item.timestamp && (\n <time className=\"text-[10px] text-text-tertiary font-mono shrink-0\">\n {new Date(item.timestamp).toLocaleTimeString()}\n </time>\n )}\n </div>\n {item.detail && <div className=\"mt-1\">{item.detail}</div>}\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { useParams, Link } from 'react-router-dom';\nimport { useTask } from '../../api/tasks';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport { PriorityBadge } from '../../components/common/display/PriorityBadge';\nimport { Field } from '../../components/common/data/Field';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { SectionLabel } from '../../components/common/layout/SectionLabel';\nimport { Timeline, type TimelineItem } from '../../components/common/display/Timeline';\n\nexport function TaskDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { data: task, isLoading } = useTask(id!);\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-40 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!task) {\n return <p className=\"text-sm text-text-secondary\">Task not found.</p>;\n }\n\n const milestoneItems: TimelineItem[] = (task.milestones ?? []).map((m, i) => ({\n id: i,\n label: m.name,\n timestamp: m.created_at,\n detail: (\n <span className=\"text-xs text-text-secondary font-mono\">\n {typeof m.value === 'object' ? JSON.stringify(m.value) : String(m.value)}\n </span>\n ),\n category: 'user' as const,\n }));\n\n return (\n <div>\n <PageHeader title=\"Task Detail\" />\n\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-12\">\n {/* Left column — metadata */}\n <div className=\"lg:col-span-2 space-y-10\">\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-6\">\n <Field label=\"Status\" value={<StatusBadge status={task.status} />} />\n <Field label=\"Priority\" value={<PriorityBadge priority={task.priority} />} />\n <Field label=\"Workflow Type\" value={<span className=\"font-mono text-xs\">{task.workflow_type}</span>} />\n <Field label=\"LT Type\" value={<span className=\"font-mono text-xs\">{task.lt_type}</span>} />\n <Field label=\"Task Queue\" value={<span className=\"font-mono text-xs\">{task.task_queue}</span>} />\n <Field label=\"Workflow ID\" value={<span className=\"font-mono text-xs break-all\">{task.workflow_id}</span>} />\n <Field label=\"Started\" value={task.started_at ? new Date(task.started_at).toLocaleString() : '—'} />\n <Field label=\"Completed\" value={task.completed_at ? new Date(task.completed_at).toLocaleString() : '—'} />\n <Field label=\"Signal ID\" value={<span className=\"font-mono text-xs break-all\">{task.signal_id}</span>} />\n </div>\n\n {task.error && (\n <div>\n <SectionLabel className=\"mb-2 text-status-error\">Error</SectionLabel>\n <p className=\"text-sm text-text-primary font-mono\">{task.error}</p>\n </div>\n )}\n\n {milestoneItems.length > 0 && (\n <div>\n <SectionLabel className=\"mb-4\">Milestones</SectionLabel>\n <Timeline items={milestoneItems} />\n </div>\n )}\n\n <Link\n to={`/workflows/executions/${task.workflow_id}`}\n className=\"btn-secondary inline-block text-xs\"\n >\n View Workflow Execution\n </Link>\n </div>\n\n {/* Right column — payloads */}\n <div className=\"space-y-8\">\n <JsonViewer data={task.envelope} label=\"Envelope\" />\n {task.metadata && <JsonViewer data={task.metadata} label=\"Metadata\" />}\n {task.data && <JsonViewer data={task.data} label=\"Result Data\" />}\n </div>\n </div>\n </div>\n );\n}\n"],"names":["Field","label","value","jsx","SectionLabel","Timeline","items","jsxs","item","TaskDetailPage","id","useParams","task","isLoading","useTask","milestoneItems","m","i","PageHeader","StatusBadge","PriorityBadge","Link","JsonViewer"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./vendor-query-B2UbickB.js";import{R as a}from"./vendor-icons-BNtvBbnj.js";function p({queue:t,size:s="sm"}){const r=s==="md"?"px-2.5 py-0.5 text-[11px] gap-1.5":"px-2 py-0.5 text-[10px] gap-1",o=s==="md"?"w-3 h-3":"w-2.5 h-2.5";return e.jsxs("span",{className:`inline-flex items-center ${r} font-mono border-y border-surface-border/50 text-text-secondary`,children:[e.jsx(a,{className:`${o} shrink-0 text-accent/75`}),t]})}export{p as T};
2
- //# sourceMappingURL=TaskQueuePill-DZykFijh.js.map
1
+ import{j as e}from"./vendor-query-B2UbickB.js";import{R as a}from"./vendor-icons-B_Yla7iD.js";function p({queue:t,size:s="sm"}){const r=s==="md"?"px-2.5 py-0.5 text-[11px] gap-1.5":"px-2 py-0.5 text-[10px] gap-1",o=s==="md"?"w-3 h-3":"w-2.5 h-2.5";return e.jsxs("span",{className:`inline-flex items-center ${r} font-mono border-y border-surface-border/50 text-text-secondary`,children:[e.jsx(a,{className:`${o} shrink-0 text-accent/75`}),t]})}export{p as T};
2
+ //# sourceMappingURL=TaskQueuePill-Bc45J7X1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TaskQueuePill-DZykFijh.js","sources":["../../src/components/common/display/TaskQueuePill.tsx"],"sourcesContent":["import { Radio } from 'lucide-react';\n\ninterface TaskQueuePillProps {\n queue: string;\n size?: 'sm' | 'md';\n}\n\nexport function TaskQueuePill({ queue, size = 'sm' }: TaskQueuePillProps) {\n const sizeClass = size === 'md'\n ? 'px-2.5 py-0.5 text-[11px] gap-1.5'\n : 'px-2 py-0.5 text-[10px] gap-1';\n const iconClass = size === 'md' ? 'w-3 h-3' : 'w-2.5 h-2.5';\n\n return (\n <span className={`inline-flex items-center ${sizeClass} font-mono border-y border-surface-border/50 text-text-secondary`}>\n <Radio className={`${iconClass} shrink-0 text-accent/75`} />\n {queue}\n </span>\n );\n}\n"],"names":["TaskQueuePill","queue","size","sizeClass","iconClass","jsxs","jsx","Radio"],"mappings":"8FAOO,SAASA,EAAc,CAAE,MAAAC,EAAO,KAAAC,EAAO,MAA4B,CACxE,MAAMC,EAAYD,IAAS,KACvB,oCACA,gCACEE,EAAYF,IAAS,KAAO,UAAY,cAE9C,OACEG,EAAAA,KAAC,OAAA,CAAK,UAAW,4BAA4BF,CAAS,mEACpD,SAAA,CAAAG,EAAAA,IAACC,EAAA,CAAM,UAAW,GAAGH,CAAS,2BAA4B,EACzDH,CAAA,EACH,CAEJ"}
1
+ {"version":3,"file":"TaskQueuePill-Bc45J7X1.js","sources":["../../src/components/common/display/TaskQueuePill.tsx"],"sourcesContent":["import { Radio } from 'lucide-react';\n\ninterface TaskQueuePillProps {\n queue: string;\n size?: 'sm' | 'md';\n}\n\nexport function TaskQueuePill({ queue, size = 'sm' }: TaskQueuePillProps) {\n const sizeClass = size === 'md'\n ? 'px-2.5 py-0.5 text-[11px] gap-1.5'\n : 'px-2 py-0.5 text-[10px] gap-1';\n const iconClass = size === 'md' ? 'w-3 h-3' : 'w-2.5 h-2.5';\n\n return (\n <span className={`inline-flex items-center ${sizeClass} font-mono border-y border-surface-border/50 text-text-secondary`}>\n <Radio className={`${iconClass} shrink-0 text-accent/75`} />\n {queue}\n </span>\n );\n}\n"],"names":["TaskQueuePill","queue","size","sizeClass","iconClass","jsxs","jsx","Radio"],"mappings":"8FAOO,SAASA,EAAc,CAAE,MAAAC,EAAO,KAAAC,EAAO,MAA4B,CACxE,MAAMC,EAAYD,IAAS,KACvB,oCACA,gCACEE,EAAYF,IAAS,KAAO,UAAY,cAE9C,OACEG,EAAAA,KAAC,OAAA,CAAK,UAAW,4BAA4BF,CAAS,mEACpD,SAAA,CAAAG,EAAAA,IAACC,EAAA,CAAM,UAAW,GAAGH,CAAS,2BAA4B,EACzDH,CAAA,EACH,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as t}from"./vendor-query-B2UbickB.js";import{c as u}from"./tasks-C-QX245z.js";import{u as g}from"./workflows-MpNdzreD.js";import{u as w}from"./useFilterParams-DZCAaBC7.js";import{D as y}from"./DataTable-D9yuBv0w.js";import{S as c}from"./StatusBadge-XQlNFwmH.js";import{P as k}from"./PriorityBadge-DfQY9St9.js";import{T as n}from"./TimeAgo-B6Gz4RAU.js";import{S as x}from"./StickyPagination-F9FZsRy9.js";import{F as P,b as p}from"./FilterBar-Ck4K4rzu.js";import{P as b}from"./PageHeader-Bo0SpcCK.js";import{W as _}from"./WorkflowPill-pPuGH8v9.js";import{c as j}from"./vendor-react-CX88sFS5.js";import"./index-CBS8FBcp.js";import"./vendor-icons-BNtvBbnj.js";import"./EmptyState-BcsfPq9T.js";const v=[{value:"pending",label:"Pending"},{value:"in_progress",label:"In Progress"},{value:"completed",label:"Completed"},{value:"needs_intervention",label:"Needs Intervention"},{value:"cancelled",label:"Cancelled"}],S=[{key:"status",label:"Status",render:e=>t.jsx(c,{status:e.status}),className:"w-40"},{key:"workflow_type",label:"Workflow Type",render:e=>t.jsx(_,{type:e.workflow_type})},{key:"lt_type",label:"LT Type",render:e=>t.jsx("span",{className:"text-text-secondary text-xs",children:e.lt_type})},{key:"priority",label:"Priority",render:e=>t.jsx(k,{priority:e.priority}),className:"w-20"},{key:"started_at",label:"Started",render:e=>t.jsx(n,{date:e.started_at}),className:"w-28"},{key:"updated_at",label:"Updated",render:e=>t.jsx(n,{date:e.updated_at}),className:"w-28"}];function O(){const e=j(),{filters:r,setFilter:l,pagination:s}=w({filters:{status:"",workflow_type:""}}),{data:m}=g(),d=[...new Set((m??[]).map(a=>a.workflow_type))].sort(),{data:o,isLoading:f}=u({status:r.status||void 0,workflow_type:r.workflow_type||void 0,limit:s.pageSize,offset:s.offset}),i=(o==null?void 0:o.total)??0;return t.jsxs("div",{children:[t.jsx(b,{title:"Tasks"}),t.jsxs(P,{children:[t.jsx(p,{label:"Status",value:r.status,onChange:a=>l("status",a),options:v}),t.jsx(p,{label:"Workflow Type",value:r.workflow_type,onChange:a=>l("workflow_type",a),options:d.map(a=>({value:a,label:a}))})]}),t.jsx(y,{columns:S,data:(o==null?void 0:o.tasks)??[],keyFn:a=>a.id,onRowClick:a=>e(`/workflows/tasks/detail/${a.id}`),isLoading:f,emptyMessage:"No tasks found"}),t.jsx(x,{page:s.page,totalPages:s.totalPages(i),onPageChange:s.setPage,total:i,pageSize:s.pageSize,onPageSizeChange:s.setPageSize})]})}export{O as TasksListPage};
2
- //# sourceMappingURL=TasksListPage-D-vHndyV.js.map
1
+ import{j as t}from"./vendor-query-B2UbickB.js";import{c as u}from"./tasks-BevFBjZq.js";import{u as g}from"./workflows-Do-Eiv8f.js";import{u as w}from"./useFilterParams-DZCAaBC7.js";import{D as y}from"./DataTable-D9yuBv0w.js";import{S as c}from"./StatusBadge-XQlNFwmH.js";import{P as k}from"./PriorityBadge-DfQY9St9.js";import{T as n}from"./TimeAgo-W7TdJpV-.js";import{S as x}from"./StickyPagination-F9FZsRy9.js";import{F as P,b as p}from"./FilterBar-Ck4K4rzu.js";import{P as b}from"./PageHeader-B_gV_jKk.js";import{W as _}from"./WorkflowPill-Bg2-0Hkg.js";import{c as j}from"./vendor-react-CX88sFS5.js";import"./index-DZX-E_3q.js";import"./vendor-icons-B_Yla7iD.js";import"./EmptyState-BcsfPq9T.js";const v=[{value:"pending",label:"Pending"},{value:"in_progress",label:"In Progress"},{value:"completed",label:"Completed"},{value:"needs_intervention",label:"Needs Intervention"},{value:"cancelled",label:"Cancelled"}],S=[{key:"status",label:"Status",render:e=>t.jsx(c,{status:e.status}),className:"w-40"},{key:"workflow_type",label:"Workflow Type",render:e=>t.jsx(_,{type:e.workflow_type})},{key:"lt_type",label:"LT Type",render:e=>t.jsx("span",{className:"text-text-secondary text-xs",children:e.lt_type})},{key:"priority",label:"Priority",render:e=>t.jsx(k,{priority:e.priority}),className:"w-20"},{key:"started_at",label:"Started",render:e=>t.jsx(n,{date:e.started_at}),className:"w-28"},{key:"updated_at",label:"Updated",render:e=>t.jsx(n,{date:e.updated_at}),className:"w-28"}];function O(){const e=j(),{filters:r,setFilter:l,pagination:s}=w({filters:{status:"",workflow_type:""}}),{data:m}=g(),d=[...new Set((m??[]).map(a=>a.workflow_type))].sort(),{data:o,isLoading:f}=u({status:r.status||void 0,workflow_type:r.workflow_type||void 0,limit:s.pageSize,offset:s.offset}),i=(o==null?void 0:o.total)??0;return t.jsxs("div",{children:[t.jsx(b,{title:"Tasks"}),t.jsxs(P,{children:[t.jsx(p,{label:"Status",value:r.status,onChange:a=>l("status",a),options:v}),t.jsx(p,{label:"Workflow Type",value:r.workflow_type,onChange:a=>l("workflow_type",a),options:d.map(a=>({value:a,label:a}))})]}),t.jsx(y,{columns:S,data:(o==null?void 0:o.tasks)??[],keyFn:a=>a.id,onRowClick:a=>e(`/workflows/tasks/detail/${a.id}`),isLoading:f,emptyMessage:"No tasks found"}),t.jsx(x,{page:s.page,totalPages:s.totalPages(i),onPageChange:s.setPage,total:i,pageSize:s.pageSize,onPageSizeChange:s.setPageSize})]})}export{O as TasksListPage};
2
+ //# sourceMappingURL=TasksListPage-BYj3OqUi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TasksListPage-D-vHndyV.js","sources":["../../src/pages/workflows/TasksListPage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { useTasks } from '../../api/tasks';\nimport { useWorkflowConfigs } from '../../api/workflows';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport { PriorityBadge } from '../../components/common/display/PriorityBadge';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport type { LTTaskRecord } from '../../api/types';\n\nconst statusOptions = [\n { value: 'pending', label: 'Pending' },\n { value: 'in_progress', label: 'In Progress' },\n { value: 'completed', label: 'Completed' },\n { value: 'needs_intervention', label: 'Needs Intervention' },\n { value: 'cancelled', label: 'Cancelled' },\n];\n\nconst columns: Column<LTTaskRecord>[] = [\n {\n key: 'status',\n label: 'Status',\n render: (row) => <StatusBadge status={row.status} />,\n className: 'w-40',\n },\n {\n key: 'workflow_type',\n label: 'Workflow Type',\n render: (row) => <WorkflowPill type={row.workflow_type} />,\n },\n {\n key: 'lt_type',\n label: 'LT Type',\n render: (row) => (\n <span className=\"text-text-secondary text-xs\">{row.lt_type}</span>\n ),\n },\n {\n key: 'priority',\n label: 'Priority',\n render: (row) => <PriorityBadge priority={row.priority} />,\n className: 'w-20',\n },\n {\n key: 'started_at',\n label: 'Started',\n render: (row) => <TimeAgo date={row.started_at} />,\n className: 'w-28',\n },\n {\n key: 'updated_at',\n label: 'Updated',\n render: (row) => <TimeAgo date={row.updated_at} />,\n className: 'w-28',\n },\n];\n\nexport function TasksListPage() {\n const navigate = useNavigate();\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '', workflow_type: '' },\n });\n\n const { data: configs } = useWorkflowConfigs();\n const workflowTypes = [...new Set((configs ?? []).map((c) => c.workflow_type))].sort();\n\n const { data, isLoading } = useTasks({\n status: filters.status || undefined,\n workflow_type: filters.workflow_type || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n\n return (\n <div>\n <PageHeader title=\"Tasks\" />\n\n <FilterBar>\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={statusOptions}\n />\n <FilterSelect\n label=\"Workflow Type\"\n value={filters.workflow_type}\n onChange={(v) => setFilter('workflow_type', v)}\n options={workflowTypes.map((t) => ({ value: t, label: t }))}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={data?.tasks ?? []}\n keyFn={(row) => row.id}\n onRowClick={(row) => navigate(`/workflows/tasks/detail/${row.id}`)}\n isLoading={isLoading}\n emptyMessage=\"No tasks found\"\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":["statusOptions","columns","row","StatusBadge","WorkflowPill","jsx","PriorityBadge","TimeAgo","TasksListPage","navigate","useNavigate","filters","setFilter","pagination","useFilterParams","configs","useWorkflowConfigs","workflowTypes","c","data","isLoading","useTasks","total","PageHeader","FilterBar","FilterSelect","v","t","DataTable","StickyPagination"],"mappings":"0rBAcA,MAAMA,EAAgB,CACpB,CAAE,MAAO,UAAW,MAAO,SAAA,EAC3B,CAAE,MAAO,cAAe,MAAO,aAAA,EAC/B,CAAE,MAAO,YAAa,MAAO,WAAA,EAC7B,CAAE,MAAO,qBAAsB,MAAO,oBAAA,EACtC,CAAE,MAAO,YAAa,MAAO,WAAA,CAC/B,EAEMC,EAAkC,CACtC,CACE,IAAK,SACL,MAAO,SACP,OAASC,SAASC,EAAA,CAAY,OAAQD,EAAI,OAAQ,EAClD,UAAW,MAAA,EAEb,CACE,IAAK,gBACL,MAAO,gBACP,OAASA,SAASE,EAAA,CAAa,KAAMF,EAAI,aAAA,CAAe,CAAA,EAE1D,CACE,IAAK,UACL,MAAO,UACP,OAASA,GACPG,EAAAA,IAAC,QAAK,UAAU,8BAA+B,WAAI,OAAA,CAAQ,CAAA,EAG/D,CACE,IAAK,WACL,MAAO,WACP,OAASH,SAASI,EAAA,CAAc,SAAUJ,EAAI,SAAU,EACxD,UAAW,MAAA,EAEb,CACE,IAAK,aACL,MAAO,UACP,OAASA,SAASK,EAAA,CAAQ,KAAML,EAAI,WAAY,EAChD,UAAW,MAAA,EAEb,CACE,IAAK,aACL,MAAO,UACP,OAASA,SAASK,EAAA,CAAQ,KAAML,EAAI,WAAY,EAChD,UAAW,MAAA,CAEf,EAEO,SAASM,GAAgB,CAC9B,MAAMC,EAAWC,EAAA,EACX,CAAE,QAAAC,EAAS,UAAAC,EAAW,WAAAC,CAAA,EAAeC,EAAgB,CACzD,QAAS,CAAE,OAAQ,GAAI,cAAe,EAAA,CAAG,CAC1C,EAEK,CAAE,KAAMC,CAAA,EAAYC,EAAA,EACpBC,EAAgB,CAAC,GAAG,IAAI,KAAKF,GAAW,CAAA,GAAI,IAAKG,GAAMA,EAAE,aAAa,CAAC,CAAC,EAAE,KAAA,EAE1E,CAAE,KAAAC,EAAM,UAAAC,CAAA,EAAcC,EAAS,CACnC,OAAQV,EAAQ,QAAU,OAC1B,cAAeA,EAAQ,eAAiB,OACxC,MAAOE,EAAW,SAClB,OAAQA,EAAW,MAAA,CACpB,EAEKS,GAAQH,GAAA,YAAAA,EAAM,QAAS,EAE7B,cACG,MAAA,CACC,SAAA,CAAAd,EAAAA,IAACkB,EAAA,CAAW,MAAM,OAAA,CAAQ,SAEzBC,EAAA,CACC,SAAA,CAAAnB,EAAAA,IAACoB,EAAA,CACC,MAAM,SACN,MAAOd,EAAQ,OACf,SAAWe,GAAMd,EAAU,SAAUc,CAAC,EACtC,QAAS1B,CAAA,CAAA,EAEXK,EAAAA,IAACoB,EAAA,CACC,MAAM,gBACN,MAAOd,EAAQ,cACf,SAAWe,GAAMd,EAAU,gBAAiBc,CAAC,EAC7C,QAAST,EAAc,IAAKU,IAAO,CAAE,MAAOA,EAAG,MAAOA,GAAI,CAAA,CAAA,CAC5D,EACF,EAEAtB,EAAAA,IAACuB,EAAA,CACC,QAAA3B,EACA,MAAMkB,GAAA,YAAAA,EAAM,QAAS,CAAA,EACrB,MAAQjB,GAAQA,EAAI,GACpB,WAAaA,GAAQO,EAAS,2BAA2BP,EAAI,EAAE,EAAE,EACjE,UAAAkB,EACA,aAAa,gBAAA,CAAA,EAGff,EAAAA,IAACwB,EAAA,CACC,KAAMhB,EAAW,KACjB,WAAYA,EAAW,WAAWS,CAAK,EACvC,aAAcT,EAAW,QACzB,MAAAS,EACA,SAAUT,EAAW,SACrB,iBAAkBA,EAAW,WAAA,CAAA,CAC/B,EACF,CAEJ"}
1
+ {"version":3,"file":"TasksListPage-BYj3OqUi.js","sources":["../../src/pages/workflows/TasksListPage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { useTasks } from '../../api/tasks';\nimport { useWorkflowConfigs } from '../../api/workflows';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport { PriorityBadge } from '../../components/common/display/PriorityBadge';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport type { LTTaskRecord } from '../../api/types';\n\nconst statusOptions = [\n { value: 'pending', label: 'Pending' },\n { value: 'in_progress', label: 'In Progress' },\n { value: 'completed', label: 'Completed' },\n { value: 'needs_intervention', label: 'Needs Intervention' },\n { value: 'cancelled', label: 'Cancelled' },\n];\n\nconst columns: Column<LTTaskRecord>[] = [\n {\n key: 'status',\n label: 'Status',\n render: (row) => <StatusBadge status={row.status} />,\n className: 'w-40',\n },\n {\n key: 'workflow_type',\n label: 'Workflow Type',\n render: (row) => <WorkflowPill type={row.workflow_type} />,\n },\n {\n key: 'lt_type',\n label: 'LT Type',\n render: (row) => (\n <span className=\"text-text-secondary text-xs\">{row.lt_type}</span>\n ),\n },\n {\n key: 'priority',\n label: 'Priority',\n render: (row) => <PriorityBadge priority={row.priority} />,\n className: 'w-20',\n },\n {\n key: 'started_at',\n label: 'Started',\n render: (row) => <TimeAgo date={row.started_at} />,\n className: 'w-28',\n },\n {\n key: 'updated_at',\n label: 'Updated',\n render: (row) => <TimeAgo date={row.updated_at} />,\n className: 'w-28',\n },\n];\n\nexport function TasksListPage() {\n const navigate = useNavigate();\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '', workflow_type: '' },\n });\n\n const { data: configs } = useWorkflowConfigs();\n const workflowTypes = [...new Set((configs ?? []).map((c) => c.workflow_type))].sort();\n\n const { data, isLoading } = useTasks({\n status: filters.status || undefined,\n workflow_type: filters.workflow_type || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n\n return (\n <div>\n <PageHeader title=\"Tasks\" />\n\n <FilterBar>\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={statusOptions}\n />\n <FilterSelect\n label=\"Workflow Type\"\n value={filters.workflow_type}\n onChange={(v) => setFilter('workflow_type', v)}\n options={workflowTypes.map((t) => ({ value: t, label: t }))}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={data?.tasks ?? []}\n keyFn={(row) => row.id}\n onRowClick={(row) => navigate(`/workflows/tasks/detail/${row.id}`)}\n isLoading={isLoading}\n emptyMessage=\"No tasks found\"\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":["statusOptions","columns","row","StatusBadge","WorkflowPill","jsx","PriorityBadge","TimeAgo","TasksListPage","navigate","useNavigate","filters","setFilter","pagination","useFilterParams","configs","useWorkflowConfigs","workflowTypes","c","data","isLoading","useTasks","total","PageHeader","FilterBar","FilterSelect","v","t","DataTable","StickyPagination"],"mappings":"0rBAcA,MAAMA,EAAgB,CACpB,CAAE,MAAO,UAAW,MAAO,SAAA,EAC3B,CAAE,MAAO,cAAe,MAAO,aAAA,EAC/B,CAAE,MAAO,YAAa,MAAO,WAAA,EAC7B,CAAE,MAAO,qBAAsB,MAAO,oBAAA,EACtC,CAAE,MAAO,YAAa,MAAO,WAAA,CAC/B,EAEMC,EAAkC,CACtC,CACE,IAAK,SACL,MAAO,SACP,OAASC,SAASC,EAAA,CAAY,OAAQD,EAAI,OAAQ,EAClD,UAAW,MAAA,EAEb,CACE,IAAK,gBACL,MAAO,gBACP,OAASA,SAASE,EAAA,CAAa,KAAMF,EAAI,aAAA,CAAe,CAAA,EAE1D,CACE,IAAK,UACL,MAAO,UACP,OAASA,GACPG,EAAAA,IAAC,QAAK,UAAU,8BAA+B,WAAI,OAAA,CAAQ,CAAA,EAG/D,CACE,IAAK,WACL,MAAO,WACP,OAASH,SAASI,EAAA,CAAc,SAAUJ,EAAI,SAAU,EACxD,UAAW,MAAA,EAEb,CACE,IAAK,aACL,MAAO,UACP,OAASA,SAASK,EAAA,CAAQ,KAAML,EAAI,WAAY,EAChD,UAAW,MAAA,EAEb,CACE,IAAK,aACL,MAAO,UACP,OAASA,SAASK,EAAA,CAAQ,KAAML,EAAI,WAAY,EAChD,UAAW,MAAA,CAEf,EAEO,SAASM,GAAgB,CAC9B,MAAMC,EAAWC,EAAA,EACX,CAAE,QAAAC,EAAS,UAAAC,EAAW,WAAAC,CAAA,EAAeC,EAAgB,CACzD,QAAS,CAAE,OAAQ,GAAI,cAAe,EAAA,CAAG,CAC1C,EAEK,CAAE,KAAMC,CAAA,EAAYC,EAAA,EACpBC,EAAgB,CAAC,GAAG,IAAI,KAAKF,GAAW,CAAA,GAAI,IAAKG,GAAMA,EAAE,aAAa,CAAC,CAAC,EAAE,KAAA,EAE1E,CAAE,KAAAC,EAAM,UAAAC,CAAA,EAAcC,EAAS,CACnC,OAAQV,EAAQ,QAAU,OAC1B,cAAeA,EAAQ,eAAiB,OACxC,MAAOE,EAAW,SAClB,OAAQA,EAAW,MAAA,CACpB,EAEKS,GAAQH,GAAA,YAAAA,EAAM,QAAS,EAE7B,cACG,MAAA,CACC,SAAA,CAAAd,EAAAA,IAACkB,EAAA,CAAW,MAAM,OAAA,CAAQ,SAEzBC,EAAA,CACC,SAAA,CAAAnB,EAAAA,IAACoB,EAAA,CACC,MAAM,SACN,MAAOd,EAAQ,OACf,SAAWe,GAAMd,EAAU,SAAUc,CAAC,EACtC,QAAS1B,CAAA,CAAA,EAEXK,EAAAA,IAACoB,EAAA,CACC,MAAM,gBACN,MAAOd,EAAQ,cACf,SAAWe,GAAMd,EAAU,gBAAiBc,CAAC,EAC7C,QAAST,EAAc,IAAKU,IAAO,CAAE,MAAOA,EAAG,MAAOA,GAAI,CAAA,CAAA,CAC5D,EACF,EAEAtB,EAAAA,IAACuB,EAAA,CACC,QAAA3B,EACA,MAAMkB,GAAA,YAAAA,EAAM,QAAS,CAAA,EACrB,MAAQjB,GAAQA,EAAI,GACpB,WAAaA,GAAQO,EAAS,2BAA2BP,EAAI,EAAE,EAAE,EACjE,UAAAkB,EACA,aAAa,gBAAA,CAAA,EAGff,EAAAA,IAACwB,EAAA,CACC,KAAMhB,EAAW,KACjB,WAAYA,EAAW,WAAWS,CAAK,EACvC,aAAcT,EAAW,QACzB,MAAAS,EACA,SAAUT,EAAW,SACrB,iBAAkBA,EAAW,WAAA,CAAA,CAC/B,EACF,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{j as o}from"./vendor-query-B2UbickB.js";import{d as e}from"./index-DZX-E_3q.js";function i({date:r,className:t=""}){return o.jsx(e,{date:r,format:"relative",className:t})}export{i as T};
2
+ //# sourceMappingURL=TimeAgo-W7TdJpV-.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimeAgo-B6Gz4RAU.js","sources":["../../src/components/common/display/TimeAgo.tsx"],"sourcesContent":["import { DateValue } from './DateValue';\n\n/**\n * Relative time display (\"5 minutes ago\").\n * Thin wrapper around DateValue for backward compatibility.\n */\nexport function TimeAgo({ date, className = '' }: { date: string; className?: string }) {\n return <DateValue date={date} format=\"relative\" className={className} />;\n}\n"],"names":["TimeAgo","date","className","jsx","DateValue"],"mappings":"uFAMO,SAASA,EAAQ,CAAE,KAAAC,EAAM,UAAAC,EAAY,IAA4C,CACtF,OAAOC,EAAAA,IAACC,EAAA,CAAU,KAAAH,EAAY,OAAO,WAAW,UAAAC,EAAsB,CACxE"}
1
+ {"version":3,"file":"TimeAgo-W7TdJpV-.js","sources":["../../src/components/common/display/TimeAgo.tsx"],"sourcesContent":["import { DateValue } from './DateValue';\n\n/**\n * Relative time display (\"5 minutes ago\").\n * Thin wrapper around DateValue for backward compatibility.\n */\nexport function TimeAgo({ date, className = '' }: { date: string; className?: string }) {\n return <DateValue date={date} format=\"relative\" className={className} />;\n}\n"],"names":["TimeAgo","date","className","jsx","DateValue"],"mappings":"uFAMO,SAASA,EAAQ,CAAE,KAAAC,EAAM,UAAAC,EAAY,IAA4C,CACtF,OAAOC,EAAAA,IAACC,EAAA,CAAU,KAAAH,EAAY,OAAO,WAAW,UAAAC,EAAsB,CACxE"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./vendor-query-B2UbickB.js";import{c as r}from"./index-CBS8FBcp.js";function o({date:t}){return e.jsxs("div",{children:[e.jsx(r,{date:t,format:"relative"}),e.jsxs("p",{className:"text-[9px] font-mono text-text-secondary mt-0.5 whitespace-nowrap",children:[new Date(t).toISOString().replace("T"," ").slice(0,19)," UTC"]})]})}export{o as T};
2
- //# sourceMappingURL=TimestampCell-DZu9PtN2.js.map
1
+ import{j as e}from"./vendor-query-B2UbickB.js";import{d as r}from"./index-DZX-E_3q.js";function o({date:t}){return e.jsxs("div",{children:[e.jsx(r,{date:t,format:"relative"}),e.jsxs("p",{className:"text-[9px] font-mono text-text-secondary mt-0.5 whitespace-nowrap",children:[new Date(t).toISOString().replace("T"," ").slice(0,19)," UTC"]})]})}export{o as T};
2
+ //# sourceMappingURL=TimestampCell-Bi2nc9Q_.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimestampCell-DZu9PtN2.js","sources":["../../src/components/common/display/TimestampCell.tsx"],"sourcesContent":["import { DateValue } from './DateValue';\n\ninterface TimestampCellProps {\n date: string;\n}\n\n/**\n * Standard timestamp cell for data tables.\n * Shows friendly \"ago\" text with UTC timestamp below.\n */\nexport function TimestampCell({ date }: TimestampCellProps) {\n return (\n <div>\n <DateValue date={date} format=\"relative\" />\n <p className=\"text-[9px] font-mono text-text-secondary mt-0.5 whitespace-nowrap\">\n {new Date(date).toISOString().replace('T', ' ').slice(0, 19)} UTC\n </p>\n </div>\n );\n}\n"],"names":["TimestampCell","date","jsx","DateValue","jsxs"],"mappings":"uFAUO,SAASA,EAAc,CAAE,KAAAC,GAA4B,CAC1D,cACG,MAAA,CACC,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAU,KAAAF,EAAY,OAAO,UAAA,CAAW,EACzCG,EAAAA,KAAC,IAAA,CAAE,UAAU,oEACV,SAAA,CAAA,IAAI,KAAKH,CAAI,EAAE,cAAc,QAAQ,IAAK,GAAG,EAAE,MAAM,EAAG,EAAE,EAAE,MAAA,CAAA,CAC/D,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"TimestampCell-Bi2nc9Q_.js","sources":["../../src/components/common/display/TimestampCell.tsx"],"sourcesContent":["import { DateValue } from './DateValue';\n\ninterface TimestampCellProps {\n date: string;\n}\n\n/**\n * Standard timestamp cell for data tables.\n * Shows friendly \"ago\" text with UTC timestamp below.\n */\nexport function TimestampCell({ date }: TimestampCellProps) {\n return (\n <div>\n <DateValue date={date} format=\"relative\" />\n <p className=\"text-[9px] font-mono text-text-secondary mt-0.5 whitespace-nowrap\">\n {new Date(date).toISOString().replace('T', ' ').slice(0, 19)} UTC\n </p>\n </div>\n );\n}\n"],"names":["TimestampCell","date","jsx","DateValue","jsxs"],"mappings":"uFAUO,SAASA,EAAc,CAAE,KAAAC,GAA4B,CAC1D,cACG,MAAA,CACC,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAU,KAAAF,EAAY,OAAO,UAAA,CAAW,EACzCG,EAAAA,KAAC,IAAA,CAAE,UAAU,oEACV,SAAA,CAAA,IAAI,KAAKH,CAAI,EAAE,cAAc,QAAQ,IAAK,GAAG,EAAE,MAAM,EAAG,EAAE,EAAE,MAAA,CAAA,CAC/D,CAAA,EACF,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as o}from"./vendor-query-B2UbickB.js";import{ab as a}from"./vendor-icons-BNtvBbnj.js";const f=["Describe","Discover","Compile","Deploy","Test","Verify"];function c(t){return t?t.status==="completed"?"completed":t.status==="failed"?"failed":"in_progress":"pending"}function m(t){const e=t.match(/```json\s*([\s\S]*?)```/)||t.match(/\{[\s\S]*?\n\}/);if(!e)return null;try{return JSON.parse((e[1]??e[0]).trim())}catch{return null}}const l=new Set(["token","authorization","bearer_token","access_token","api_token"]);function d(t){if(!(t!=null&&t.properties))return{};const e={},r=sessionStorage.getItem("lt_token")||"";for(const[s,i]of Object.entries(t.properties)){const n=i;n.default!==void 0?e[s]=n.default:l.has(s.toLowerCase())&&n.type==="string"?e[s]=r:n.type==="string"?e[s]="":n.type==="number"||n.type==="integer"?e[s]=n.minimum??0:n.type==="boolean"?e[s]=!1:n.type==="object"?e[s]={}:n.type==="array"?e[s]=[]:e[s]=null}return e}function x({name:t,size:e="sm"}){const r=e==="md"?"px-2 py-0.5 text-[12px] gap-1.5":"px-1.5 py-px text-[11px] gap-1",s=e==="md"?"w-2.5 h-2.5":"w-2 h-2";return o.jsxs("span",{className:`inline-flex items-center ${r} font-mono text-text-secondary bg-surface-sunken/50 rounded-md`,children:[o.jsx(a,{className:`${s} shrink-0 text-text-quaternary`,strokeWidth:1.5}),t]})}export{f as S,x as T,d as b,m as e,c as m};
2
- //# sourceMappingURL=ToolPill-RP2Tvlrx.js.map
1
+ import{j as o}from"./vendor-query-B2UbickB.js";import{ac as a}from"./vendor-icons-B_Yla7iD.js";const c=["Describe","Discover","Compile","Deploy","Test","Verify"];function f(t){return t?t.status==="completed"?"completed":t.status==="failed"?"failed":"in_progress":"pending"}function m(t){const e=t.match(/```json\s*([\s\S]*?)```/)||t.match(/\{[\s\S]*?\n\}/);if(!e)return null;try{return JSON.parse((e[1]??e[0]).trim())}catch{return null}}const l=new Set(["token","authorization","bearer_token","access_token","api_token"]);function d(t){if(!(t!=null&&t.properties))return{};const e={},r=sessionStorage.getItem("lt_token")||"";for(const[s,i]of Object.entries(t.properties)){const n=i;n.default!==void 0?e[s]=n.default:l.has(s.toLowerCase())&&n.type==="string"?e[s]=r:n.type==="string"?e[s]="":n.type==="number"||n.type==="integer"?e[s]=n.minimum??0:n.type==="boolean"?e[s]=!1:n.type==="object"?e[s]={}:n.type==="array"?e[s]=[]:e[s]=null}return e}function x({name:t,size:e="sm"}){const r=e==="md"?"px-2 py-0.5 text-[12px] gap-1.5":"px-1.5 py-px text-[11px] gap-1",s=e==="md"?"w-2.5 h-2.5":"w-2 h-2";return o.jsxs("span",{className:`inline-flex items-center ${r} font-mono text-text-secondary bg-surface-sunken/50 rounded-md`,children:[o.jsx(a,{className:`${s} shrink-0 text-text-quaternary`,strokeWidth:1.5}),t]})}export{c as S,x as T,d as b,m as e,f as m};
2
+ //# sourceMappingURL=ToolPill-CuoXcmhv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolPill-RP2Tvlrx.js","sources":["../../src/pages/mcp/mcp-query-detail/helpers.ts","../../src/components/common/display/ToolPill.tsx"],"sourcesContent":["// ── Shared helpers for MCP Query Detail wizard panels ────────────────────────\n\nexport type Step = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport const STEP_LABELS_BASE = ['Describe', 'Discover', 'Compile', 'Deploy', 'Test', 'Verify'] as const;\n\nexport function mapStatus(exec: { status?: string } | undefined): string {\n if (!exec) return 'pending';\n if (exec.status === 'completed') return 'completed';\n if (exec.status === 'failed') return 'failed';\n return 'in_progress';\n}\n\nexport function extractJsonFromSummary(summary: string): Record<string, unknown> | null {\n const match = summary.match(/```json\\s*([\\s\\S]*?)```/) || summary.match(/\\{[\\s\\S]*?\\n\\}/);\n if (!match) return null;\n try { return JSON.parse((match[1] ?? match[0]).trim()); } catch { return null; }\n}\n\n// ── Helpers migrated from yaml-workflow-detail ───────────────────────────────\n\nexport type Section = 'invoke' | 'tools' | 'config';\n\n/** Keys that should auto-fill with the current session token when building test input skeletons. */\nconst TOKEN_FIELD_NAMES = new Set(['token', 'authorization', 'bearer_token', 'access_token', 'api_token']);\n\nexport function buildSkeleton(schema: Record<string, any>): Record<string, any> {\n if (!schema?.properties) return {};\n const result: Record<string, any> = {};\n // Auto-fill token fields with the current session token so test invocations\n // always use a fresh credential instead of requiring manual paste.\n const sessionToken = sessionStorage.getItem('lt_token') || '';\n for (const [key, prop] of Object.entries(schema.properties)) {\n const p = prop as any;\n if (p.default !== undefined) result[key] = p.default;\n else if (TOKEN_FIELD_NAMES.has(key.toLowerCase()) && p.type === 'string') result[key] = sessionToken;\n else if (p.type === 'string') result[key] = '';\n else if (p.type === 'number' || p.type === 'integer') result[key] = p.minimum ?? 0;\n else if (p.type === 'boolean') result[key] = false;\n else if (p.type === 'object') result[key] = {};\n else if (p.type === 'array') result[key] = [];\n else result[key] = null;\n }\n return result;\n}\n\nexport function inferFieldType(schemaProp: any): string {\n if (!schemaProp) return 'string';\n return schemaProp.type || 'string';\n}\n\nexport const metadataLabels: Record<string, string> = {\n app: 'MCP Workflow Server', tpc: 'MCP Workflow Tool', vrs: 'Version', ngn: 'Engine ID',\n jid: 'Job ID', gid: 'Run ID', aid: 'Activity ID', ts: 'Time Series',\n jc: 'Created', ju: 'Updated', trc: 'Trace ID', js: 'Job Status',\n};\n\nexport const jobStatusLabels: Record<number, string> = { 0: 'Completed', 1: 'Pending', 2: 'Error' };\n\nexport function parseCompactTimestamp(val: string): string {\n const match = val.match(/^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})\\.(\\d+)$/);\n if (!match) return val;\n const [, y, mo, d, h, mi, s, ms] = match;\n return `${y}-${mo}-${d} ${h}:${mi}:${s}.${ms}`;\n}\n\nexport function formatMetadataValue(key: string, value: unknown): string {\n if (key === 'js' && typeof value === 'number') return jobStatusLabels[value] ?? `Unknown (${value})`;\n if ((key === 'jc' || key === 'ju') && typeof value === 'string') return parseCompactTimestamp(value);\n return String(value ?? '');\n}\n\nexport function sourceLabel(s: string | undefined) {\n if (s === 'llm') return 'LLM';\n if (s === 'db') return 'DB';\n return 'MCP';\n}\n\nexport function sourceColor(s: string | undefined) {\n if (s === 'llm') return 'bg-purple-500/10 text-purple-400 border-purple-500/20';\n return 'bg-accent-primary/10 text-accent border-accent-primary/20';\n}\n","import { Wrench } from 'lucide-react';\n\ninterface ToolPillProps {\n name: string;\n size?: 'sm' | 'md';\n}\n\n/**\n * Universal MCP tool pill — displays a tool name with a subtle wrench icon.\n * Used across Capabilities page, MCP Server Tools, Pipeline Tools, etc.\n */\nexport function ToolPill({ name, size = 'sm' }: ToolPillProps) {\n const sizeClass = size === 'md'\n ? 'px-2 py-0.5 text-[12px] gap-1.5'\n : 'px-1.5 py-px text-[11px] 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-secondary bg-surface-sunken/50 rounded-md`}>\n <Wrench className={`${iconClass} shrink-0 text-text-quaternary`} strokeWidth={1.5} />\n {name}\n </span>\n );\n}\n"],"names":["STEP_LABELS_BASE","mapStatus","exec","extractJsonFromSummary","summary","match","TOKEN_FIELD_NAMES","buildSkeleton","schema","result","sessionToken","key","prop","p","ToolPill","name","size","sizeClass","iconClass","jsxs","jsx","Wrench"],"mappings":"+FAIO,MAAMA,EAAmB,CAAC,WAAY,WAAY,UAAW,SAAU,OAAQ,QAAQ,EAEvF,SAASC,EAAUC,EAA+C,CACvE,OAAKA,EACDA,EAAK,SAAW,YAAoB,YACpCA,EAAK,SAAW,SAAiB,SAC9B,cAHW,SAIpB,CAEO,SAASC,EAAuBC,EAAiD,CACtF,MAAMC,EAAQD,EAAQ,MAAM,yBAAyB,GAAKA,EAAQ,MAAM,gBAAgB,EACxF,GAAI,CAACC,EAAO,OAAO,KACnB,GAAI,CAAE,OAAO,KAAK,OAAOA,EAAM,CAAC,GAAKA,EAAM,CAAC,GAAG,MAAM,CAAG,MAAQ,CAAE,OAAO,IAAM,CACjF,CAOA,MAAMC,MAAwB,IAAI,CAAC,QAAS,gBAAiB,eAAgB,eAAgB,WAAW,CAAC,EAElG,SAASC,EAAcC,EAAkD,CAC9E,GAAI,EAACA,GAAA,MAAAA,EAAQ,YAAY,MAAO,CAAA,EAChC,MAAMC,EAA8B,CAAA,EAG9BC,EAAe,eAAe,QAAQ,UAAU,GAAK,GAC3D,SAAW,CAACC,EAAKC,CAAI,IAAK,OAAO,QAAQJ,EAAO,UAAU,EAAG,CAC3D,MAAMK,EAAID,EACNC,EAAE,UAAY,OAAWJ,EAAOE,CAAG,EAAIE,EAAE,QACpCP,EAAkB,IAAIK,EAAI,YAAA,CAAa,GAAKE,EAAE,OAAS,SAAUJ,EAAOE,CAAG,EAAID,EAC/EG,EAAE,OAAS,SAAUJ,EAAOE,CAAG,EAAI,GACnCE,EAAE,OAAS,UAAYA,EAAE,OAAS,UAAWJ,EAAOE,CAAG,EAAIE,EAAE,SAAW,EACxEA,EAAE,OAAS,UAAWJ,EAAOE,CAAG,EAAI,GACpCE,EAAE,OAAS,SAAUJ,EAAOE,CAAG,EAAI,CAAA,EACnCE,EAAE,OAAS,QAASJ,EAAOE,CAAG,EAAI,CAAA,EACtCF,EAAOE,CAAG,EAAI,IACrB,CACA,OAAOF,CACT,CCjCO,SAASK,EAAS,CAAE,KAAAC,EAAM,KAAAC,EAAO,MAAuB,CAC7D,MAAMC,EAAYD,IAAS,KACvB,kCACA,iCACEE,EAAYF,IAAS,KAAO,cAAgB,UAElD,OACEG,EAAAA,KAAC,OAAA,CAAK,UAAW,4BAA4BF,CAAS,iEACpD,SAAA,CAAAG,MAACC,GAAO,UAAW,GAAGH,CAAS,iCAAkC,YAAa,IAAK,EAClFH,CAAA,EACH,CAEJ"}
1
+ {"version":3,"file":"ToolPill-CuoXcmhv.js","sources":["../../src/pages/mcp/mcp-query-detail/helpers.ts","../../src/components/common/display/ToolPill.tsx"],"sourcesContent":["// ── Shared helpers for MCP Query Detail wizard panels ────────────────────────\n\nexport type Step = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport const STEP_LABELS_BASE = ['Describe', 'Discover', 'Compile', 'Deploy', 'Test', 'Verify'] as const;\n\nexport function mapStatus(exec: { status?: string } | undefined): string {\n if (!exec) return 'pending';\n if (exec.status === 'completed') return 'completed';\n if (exec.status === 'failed') return 'failed';\n return 'in_progress';\n}\n\nexport function extractJsonFromSummary(summary: string): Record<string, unknown> | null {\n const match = summary.match(/```json\\s*([\\s\\S]*?)```/) || summary.match(/\\{[\\s\\S]*?\\n\\}/);\n if (!match) return null;\n try { return JSON.parse((match[1] ?? match[0]).trim()); } catch { return null; }\n}\n\n// ── Helpers migrated from yaml-workflow-detail ───────────────────────────────\n\nexport type Section = 'invoke' | 'tools' | 'config';\n\n/** Keys that should auto-fill with the current session token when building test input skeletons. */\nconst TOKEN_FIELD_NAMES = new Set(['token', 'authorization', 'bearer_token', 'access_token', 'api_token']);\n\nexport function buildSkeleton(schema: Record<string, any>): Record<string, any> {\n if (!schema?.properties) return {};\n const result: Record<string, any> = {};\n // Auto-fill token fields with the current session token so test invocations\n // always use a fresh credential instead of requiring manual paste.\n const sessionToken = sessionStorage.getItem('lt_token') || '';\n for (const [key, prop] of Object.entries(schema.properties)) {\n const p = prop as any;\n if (p.default !== undefined) result[key] = p.default;\n else if (TOKEN_FIELD_NAMES.has(key.toLowerCase()) && p.type === 'string') result[key] = sessionToken;\n else if (p.type === 'string') result[key] = '';\n else if (p.type === 'number' || p.type === 'integer') result[key] = p.minimum ?? 0;\n else if (p.type === 'boolean') result[key] = false;\n else if (p.type === 'object') result[key] = {};\n else if (p.type === 'array') result[key] = [];\n else result[key] = null;\n }\n return result;\n}\n\nexport function inferFieldType(schemaProp: any): string {\n if (!schemaProp) return 'string';\n return schemaProp.type || 'string';\n}\n\nexport const metadataLabels: Record<string, string> = {\n app: 'MCP Workflow Server', tpc: 'MCP Workflow Tool', vrs: 'Version', ngn: 'Engine ID',\n jid: 'Job ID', gid: 'Run ID', aid: 'Activity ID', ts: 'Time Series',\n jc: 'Created', ju: 'Updated', trc: 'Trace ID', js: 'Job Status',\n};\n\nexport const jobStatusLabels: Record<number, string> = { 0: 'Completed', 1: 'Pending', 2: 'Error' };\n\nexport function parseCompactTimestamp(val: string): string {\n const match = val.match(/^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})\\.(\\d+)$/);\n if (!match) return val;\n const [, y, mo, d, h, mi, s, ms] = match;\n return `${y}-${mo}-${d} ${h}:${mi}:${s}.${ms}`;\n}\n\nexport function formatMetadataValue(key: string, value: unknown): string {\n if (key === 'js' && typeof value === 'number') return jobStatusLabels[value] ?? `Unknown (${value})`;\n if ((key === 'jc' || key === 'ju') && typeof value === 'string') return parseCompactTimestamp(value);\n return String(value ?? '');\n}\n\nexport function sourceLabel(s: string | undefined) {\n if (s === 'llm') return 'LLM';\n if (s === 'db') return 'DB';\n return 'MCP';\n}\n\nexport function sourceColor(s: string | undefined) {\n if (s === 'llm') return 'bg-purple-500/10 text-purple-400 border-purple-500/20';\n return 'bg-accent-primary/10 text-accent border-accent-primary/20';\n}\n","import { Wrench } from 'lucide-react';\n\ninterface ToolPillProps {\n name: string;\n size?: 'sm' | 'md';\n}\n\n/**\n * Universal MCP tool pill — displays a tool name with a subtle wrench icon.\n * Used across Capabilities page, MCP Server Tools, Pipeline Tools, etc.\n */\nexport function ToolPill({ name, size = 'sm' }: ToolPillProps) {\n const sizeClass = size === 'md'\n ? 'px-2 py-0.5 text-[12px] gap-1.5'\n : 'px-1.5 py-px text-[11px] 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-secondary bg-surface-sunken/50 rounded-md`}>\n <Wrench className={`${iconClass} shrink-0 text-text-quaternary`} strokeWidth={1.5} />\n {name}\n </span>\n );\n}\n"],"names":["STEP_LABELS_BASE","mapStatus","exec","extractJsonFromSummary","summary","match","TOKEN_FIELD_NAMES","buildSkeleton","schema","result","sessionToken","key","prop","p","ToolPill","name","size","sizeClass","iconClass","jsxs","jsx","Wrench"],"mappings":"+FAIO,MAAMA,EAAmB,CAAC,WAAY,WAAY,UAAW,SAAU,OAAQ,QAAQ,EAEvF,SAASC,EAAUC,EAA+C,CACvE,OAAKA,EACDA,EAAK,SAAW,YAAoB,YACpCA,EAAK,SAAW,SAAiB,SAC9B,cAHW,SAIpB,CAEO,SAASC,EAAuBC,EAAiD,CACtF,MAAMC,EAAQD,EAAQ,MAAM,yBAAyB,GAAKA,EAAQ,MAAM,gBAAgB,EACxF,GAAI,CAACC,EAAO,OAAO,KACnB,GAAI,CAAE,OAAO,KAAK,OAAOA,EAAM,CAAC,GAAKA,EAAM,CAAC,GAAG,MAAM,CAAG,MAAQ,CAAE,OAAO,IAAM,CACjF,CAOA,MAAMC,MAAwB,IAAI,CAAC,QAAS,gBAAiB,eAAgB,eAAgB,WAAW,CAAC,EAElG,SAASC,EAAcC,EAAkD,CAC9E,GAAI,EAACA,GAAA,MAAAA,EAAQ,YAAY,MAAO,CAAA,EAChC,MAAMC,EAA8B,CAAA,EAG9BC,EAAe,eAAe,QAAQ,UAAU,GAAK,GAC3D,SAAW,CAACC,EAAKC,CAAI,IAAK,OAAO,QAAQJ,EAAO,UAAU,EAAG,CAC3D,MAAMK,EAAID,EACNC,EAAE,UAAY,OAAWJ,EAAOE,CAAG,EAAIE,EAAE,QACpCP,EAAkB,IAAIK,EAAI,YAAA,CAAa,GAAKE,EAAE,OAAS,SAAUJ,EAAOE,CAAG,EAAID,EAC/EG,EAAE,OAAS,SAAUJ,EAAOE,CAAG,EAAI,GACnCE,EAAE,OAAS,UAAYA,EAAE,OAAS,UAAWJ,EAAOE,CAAG,EAAIE,EAAE,SAAW,EACxEA,EAAE,OAAS,UAAWJ,EAAOE,CAAG,EAAI,GACpCE,EAAE,OAAS,SAAUJ,EAAOE,CAAG,EAAI,CAAA,EACnCE,EAAE,OAAS,QAASJ,EAAOE,CAAG,EAAI,CAAA,EACtCF,EAAOE,CAAG,EAAI,IACrB,CACA,OAAOF,CACT,CCjCO,SAASK,EAAS,CAAE,KAAAC,EAAM,KAAAC,EAAO,MAAuB,CAC7D,MAAMC,EAAYD,IAAS,KACvB,kCACA,iCACEE,EAAYF,IAAS,KAAO,cAAgB,UAElD,OACEG,EAAAA,KAAC,OAAA,CAAK,UAAW,4BAA4BF,CAAS,iEACpD,SAAA,CAAAG,MAACC,GAAO,UAAW,GAAGH,CAAS,iCAAkC,YAAa,IAAK,EAClFH,CAAA,EACH,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{a as m,j as e}from"./vendor-query-B2UbickB.js";import{h as k}from"./mcp-CjXjDZI0.js";import{J as A}from"./index-DZX-E_3q.js";import{R as L}from"./RunAsSelector-_QbJKhlo.js";import{b as z,T as F}from"./ToolPill-CuoXcmhv.js";import{S as I}from"./ServerName-uqa4eBqm.js";import{X as M,ab as _,P as B,a3 as J,a8 as D}from"./vendor-icons-B_Yla7iD.js";import{L as E}from"./vendor-react-CX88sFS5.js";function U({error:n}){const r=n instanceof Error?n.message:"";return r.startsWith("No credential found for provider")?e.jsxs("div",{className:"bg-status-warning/10 border border-status-warning/30 rounded-md px-3 py-2 flex items-start gap-2",children:[e.jsx(D,{size:14,className:"text-status-warning mt-0.5 shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[11px] font-medium text-text-primary mb-0.5",children:"Credential required"}),e.jsx("p",{className:"text-[11px] text-text-secondary mb-1",children:r}),e.jsxs(E,{to:"/credentials",className:"text-[11px] text-accent hover:underline inline-flex items-center gap-1",children:["Go to Credentials ",e.jsx(J,{size:10})]})]})]}):e.jsx("div",{className:"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2",children:e.jsx("p",{className:"text-[11px] text-status-error",children:r||"Tool call failed"})})}function $({data:n}){const r=n==null?void 0:n.result,a=r==null?void 0:r.job_id,u=(r==null?void 0:r.namespace)||"longtail";return a?e.jsxs(E,{to:`/mcp/executions/${encodeURIComponent(a)}?namespace=${encodeURIComponent(u)}`,className:"inline-flex items-center gap-1.5 text-xs text-accent hover:underline",children:[e.jsx(J,{size:12}),"View Execution"]}):null}const N="input text-xs",R="label";function K({value:n,onChange:r,className:a}){const[u,t]=m.useState(n.join(", ")),o=()=>r(u.split(",").map(c=>c.trim()).filter(Boolean));return m.useEffect(()=>{t(n.join(", "))},[JSON.stringify(n)]),e.jsx("input",{type:"text",value:u,onChange:c=>t(c.target.value),onBlur:o,onKeyDown:c=>{c.key==="Enter"&&(c.preventDefault(),o())},placeholder:"comma-separated values",className:a})}function ee({serverId:n,serverName:r,tool:a,onClose:u}){const t=k(),[o,c]=m.useState(!1),[x,p]=m.useState({}),[g,b]=m.useState(""),[S,y]=m.useState(""),[v,O]=m.useState("");m.useEffect(()=>{const s=z(a.inputSchema);p(s),b(JSON.stringify(s,null,2)),c(!1),y(""),t.reset()},[a.name,n]);const q=!!t.data||!!t.error,T=()=>{if(!o)b(JSON.stringify(x,null,2));else try{p(JSON.parse(g))}catch{}c(!o)},P=()=>{y(""),t.reset();let s;if(o)try{s=JSON.parse(g)}catch{y("Invalid JSON");return}else s={...x};t.mutate({serverId:n,toolName:a.name,arguments:s,...v?{execute_as:v}:{}})};return e.jsxs("div",{className:"border-l border-surface-border bg-surface-raised",children:[e.jsxs("div",{className:"flex items-start justify-between px-4 py-3 border-b border-surface-border/50 shrink-0",children:[e.jsxs("div",{className:"min-w-0 space-y-1",children:[e.jsx(I,{name:r,serverId:n,short:!1}),e.jsx("div",{children:e.jsx(F,{name:a.name,size:"md"})})]}),e.jsx("button",{onClick:u,className:"p-1 text-text-quaternary hover:text-text-primary shrink-0 ml-2",children:e.jsx(M,{className:"w-3.5 h-3.5"})})]}),e.jsxs("div",{className:"px-4 py-4 space-y-5",children:[a.description&&e.jsx("div",{className:"border-l-2 border-accent/30 pl-3 py-1",children:e.jsx("p",{className:"text-[11px] text-text-secondary leading-relaxed italic",children:a.description})}),e.jsxs("div",{children:[e.jsx("label",{className:R,children:"run as"}),e.jsx(L,{selected:v,onChange:O})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("span",{className:"text-[10px] text-text-quaternary",children:"Parameters"}),e.jsx("button",{onClick:T,className:"text-[10px] text-accent/70 hover:text-accent transition-colors",children:o?"Form view":"JSON view"})]}),o?e.jsx("textarea",{value:g,onChange:s=>b(s.target.value),className:"input-json w-full",rows:6,spellCheck:!1}):e.jsxs("div",{className:"space-y-3",children:[Object.entries(x).sort(([s],[i])=>{var f;const l=((f=a.inputSchema)==null?void 0:f.required)??[],j=l.indexOf(s),h=l.indexOf(i);return j!==-1&&h!==-1?j-h:j!==-1?-1:h!==-1?1:s.localeCompare(i)}).map(([s,i])=>{var f,C,w;const l=(C=(f=a.inputSchema)==null?void 0:f.properties)==null?void 0:C[s],j=l==null?void 0:l.description,h=(((w=a.inputSchema)==null?void 0:w.required)??[]).includes(s);return e.jsxs("div",{children:[e.jsxs("label",{className:R,children:[s,h&&e.jsx("span",{className:"text-accent/50 ml-0.5",children:"*"})]}),typeof i=="boolean"?e.jsxs("select",{value:String(i),onChange:d=>p({...x,[s]:d.target.value==="true"}),className:N,children:[e.jsx("option",{value:"true",children:"true"}),e.jsx("option",{value:"false",children:"false"})]}):Array.isArray(i)?e.jsx(K,{value:i,onChange:d=>p({...x,[s]:d}),className:N}):typeof i=="object"&&i!==null?e.jsx("textarea",{value:JSON.stringify(i,null,2),onChange:d=>{try{p({...x,[s]:JSON.parse(d.target.value)})}catch{}},className:`${N} min-h-[48px] font-mono resize-y`}):e.jsx("input",{type:typeof i=="number"?"number":"text",value:String(i??""),onChange:d=>p({...x,[s]:typeof i=="number"?Number(d.target.value):d.target.value}),className:N,placeholder:(l==null?void 0:l.type)==="string"&&(l==null?void 0:l.example)||""}),j&&e.jsx("p",{className:"text-[9px] text-text-quaternary/70 mt-0.5 leading-snug",children:j})]},s)}),Object.keys(x).length===0&&e.jsx("p",{className:"text-[11px] text-text-quaternary",children:"No parameters"})]}),S&&e.jsx("p",{className:"text-[11px] text-status-error mt-1",children:S})]}),e.jsx("button",{onClick:P,disabled:t.isPending,className:"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5",children:t.isPending?"Running...":q?e.jsxs(e.Fragment,{children:[e.jsx(_,{size:12})," Re-run"]}):e.jsxs(e.Fragment,{children:[e.jsx(B,{size:12})," Run"]})}),t.isPending&&e.jsxs("div",{className:"animate-pulse",children:[e.jsx("p",{className:"text-[10px] text-text-quaternary mb-1",children:"Response"}),e.jsx("div",{className:"h-20 bg-surface-sunken/50 rounded-md"})]}),t.data?e.jsxs("div",{className:"space-y-2",children:[e.jsx(A,{data:t.data,label:"Response",defaultCollapsed:!0}),e.jsx($,{data:t.data})]}):null,t.error?e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] text-text-quaternary mb-1",children:"Response"}),e.jsx(U,{error:t.error})]}):null]})]})}export{ee as T};
2
+ //# sourceMappingURL=ToolTestPanel-Dl3C53zb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolTestPanel-Dl3C53zb.js","sources":["../../src/components/common/test/ToolTestPanel.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport { X, RotateCcw, Play, ExternalLink, KeyRound } from 'lucide-react';\nimport { useCallMcpTool } from '../../../api/mcp';\nimport { JsonViewer } from '../data/JsonViewer';\nimport { RunAsSelector } from '../form/RunAsSelector';\nimport { ToolPill } from '../display/ToolPill';\nimport { ServerName } from '../display/ServerName';\nimport type { McpToolManifest } from '../../../api/types';\nimport { buildSkeleton } from '../../../pages/mcp/mcp-query-detail/helpers';\n\nfunction ToolErrorDisplay({ error }: { error: Error | null }) {\n const msg = error instanceof Error ? error.message : '';\n if (msg.startsWith('No credential found for provider')) {\n return (\n <div className=\"bg-status-warning/10 border border-status-warning/30 rounded-md px-3 py-2 flex items-start gap-2\">\n <KeyRound size={14} className=\"text-status-warning mt-0.5 shrink-0\" />\n <div>\n <p className=\"text-[11px] font-medium text-text-primary mb-0.5\">Credential required</p>\n <p className=\"text-[11px] text-text-secondary mb-1\">{msg}</p>\n <Link to=\"/credentials\" className=\"text-[11px] text-accent hover:underline inline-flex items-center gap-1\">\n Go to Credentials <ExternalLink size={10} />\n </Link>\n </div>\n </div>\n );\n }\n return (\n <div className=\"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2\">\n <p className=\"text-[11px] text-status-error\">{msg || 'Tool call failed'}</p>\n </div>\n );\n}\n\nfunction ExecutionLink({ data }: { data: unknown }) {\n const res = (data as any)?.result;\n const jobId = res?.job_id;\n const ns = res?.namespace || 'longtail';\n if (!jobId) return null;\n return (\n <Link\n to={`/mcp/executions/${encodeURIComponent(jobId)}?namespace=${encodeURIComponent(ns)}`}\n className=\"inline-flex items-center gap-1.5 text-xs text-accent hover:underline\"\n >\n <ExternalLink size={12} />\n View Execution\n </Link>\n );\n}\n\ninterface ToolTestPanelProps {\n serverId: string;\n serverName: string;\n tool: McpToolManifest;\n onClose: () => void;\n}\n\nconst INPUT_CLS = 'input text-xs';\nconst LABEL_CLS = 'label';\n\n/** Text input for array fields — commits on blur or Enter, allows commas while typing */\nfunction ArrayInput({ value, onChange, className }: { value: any[]; onChange: (v: string[]) => void; className: string }) {\n const [raw, setRaw] = useState(value.join(', '));\n const commit = () => onChange(raw.split(',').map((s) => s.trim()).filter(Boolean));\n // Sync if parent value changes externally\n useEffect(() => { setRaw(value.join(', ')); }, [JSON.stringify(value)]); // eslint-disable-line\n return (\n <input\n type=\"text\"\n value={raw}\n onChange={(e) => setRaw(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); commit(); } }}\n placeholder=\"comma-separated values\"\n className={className}\n />\n );\n}\n\nexport function ToolTestPanel({ serverId, serverName, tool, onClose }: ToolTestPanelProps) {\n const callTool = useCallMcpTool();\n const [jsonMode, setJsonMode] = useState(false);\n const [fields, setFields] = useState<Record<string, any>>({});\n const [argsJson, setArgsJson] = useState('');\n const [jsonError, setJsonError] = useState('');\n const [executeAs, setExecuteAs] = useState('');\n\n useEffect(() => {\n const skeleton = buildSkeleton(tool.inputSchema);\n setFields(skeleton);\n setArgsJson(JSON.stringify(skeleton, null, 2));\n setJsonMode(false);\n setJsonError('');\n callTool.reset();\n }, [tool.name, serverId]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const hasResult = !!callTool.data || !!callTool.error;\n\n const toggleMode = () => {\n if (!jsonMode) {\n setArgsJson(JSON.stringify(fields, null, 2));\n } else {\n try { setFields(JSON.parse(argsJson)); } catch { /* keep fields */ }\n }\n setJsonMode(!jsonMode);\n };\n\n const handleRun = () => {\n setJsonError('');\n callTool.reset();\n let parsed: Record<string, unknown>;\n if (jsonMode) {\n try { parsed = JSON.parse(argsJson); } catch { setJsonError('Invalid JSON'); return; }\n } else {\n parsed = { ...fields };\n }\n callTool.mutate({\n serverId,\n toolName: tool.name,\n arguments: parsed,\n ...(executeAs ? { execute_as: executeAs } : {}),\n });\n };\n\n return (\n <div className=\"border-l border-surface-border bg-surface-raised\">\n {/* Header */}\n <div className=\"flex items-start justify-between px-4 py-3 border-b border-surface-border/50 shrink-0\">\n <div className=\"min-w-0 space-y-1\">\n <ServerName name={serverName} serverId={serverId} short={false} />\n <div><ToolPill name={tool.name} size=\"md\" /></div>\n </div>\n <button onClick={onClose} className=\"p-1 text-text-quaternary hover:text-text-primary shrink-0 ml-2\">\n <X className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n\n {/* Scrollable body */}\n <div className=\"px-4 py-4 space-y-5\">\n {tool.description && (\n <div className=\"border-l-2 border-accent/30 pl-3 py-1\">\n <p className=\"text-[11px] text-text-secondary leading-relaxed italic\">{tool.description}</p>\n </div>\n )}\n\n {/* Run as */}\n <div>\n <label className={LABEL_CLS}>run as</label>\n <RunAsSelector selected={executeAs} onChange={setExecuteAs} />\n </div>\n\n {/* Form / JSON toggle input */}\n <div>\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-[10px] text-text-quaternary\">Parameters</span>\n <button onClick={toggleMode} className=\"text-[10px] text-accent/70 hover:text-accent transition-colors\">\n {jsonMode ? 'Form view' : 'JSON view'}\n </button>\n </div>\n\n {jsonMode ? (\n <textarea\n value={argsJson}\n onChange={(e) => setArgsJson(e.target.value)}\n className=\"input-json w-full\"\n rows={6}\n spellCheck={false}\n />\n ) : (\n <div className=\"space-y-3\">\n {Object.entries(fields).sort(([a], [b]) => {\n const req = (tool.inputSchema?.required ?? []) as string[];\n const ai = req.indexOf(a);\n const bi = req.indexOf(b);\n if (ai !== -1 && bi !== -1) return ai - bi;\n if (ai !== -1) return -1;\n if (bi !== -1) return 1;\n return a.localeCompare(b);\n }).map(([key, value]) => {\n const propSchema = tool.inputSchema?.properties?.[key];\n const hint = propSchema?.description;\n const isRequired = (tool.inputSchema?.required ?? []).includes(key);\n return (\n <div key={key}>\n <label className={LABEL_CLS}>\n {key}\n {isRequired && <span className=\"text-accent/50 ml-0.5\">*</span>}\n </label>\n {typeof value === 'boolean' ? (\n <select\n value={String(value)}\n onChange={(e) => setFields({ ...fields, [key]: e.target.value === 'true' })}\n className={INPUT_CLS}\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : Array.isArray(value) ? (\n <ArrayInput\n value={value as any[]}\n onChange={(v) => setFields({ ...fields, [key]: v })}\n className={INPUT_CLS}\n />\n ) : typeof value === 'object' && value !== null ? (\n <textarea\n value={JSON.stringify(value, null, 2)}\n onChange={(e) => { try { setFields({ ...fields, [key]: JSON.parse(e.target.value) }); } catch { /* invalid */ } }}\n className={`${INPUT_CLS} min-h-[48px] font-mono resize-y`}\n />\n ) : (\n <input\n type={typeof value === 'number' ? 'number' : 'text'}\n value={String(value ?? '')}\n onChange={(e) => setFields({ ...fields, [key]: typeof value === 'number' ? Number(e.target.value) : e.target.value })}\n className={INPUT_CLS}\n placeholder={propSchema?.type === 'string' ? propSchema?.example || '' : ''}\n />\n )}\n {hint && <p className=\"text-[9px] text-text-quaternary/70 mt-0.5 leading-snug\">{hint}</p>}\n </div>\n );\n })}\n {Object.keys(fields).length === 0 && (\n <p className=\"text-[11px] text-text-quaternary\">No parameters</p>\n )}\n </div>\n )}\n {jsonError && <p className=\"text-[11px] text-status-error mt-1\">{jsonError}</p>}\n </div>\n\n {/* Run button */}\n <button\n onClick={handleRun}\n disabled={callTool.isPending}\n className=\"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5\"\n >\n {callTool.isPending ? (\n 'Running...'\n ) : hasResult ? (\n <><RotateCcw size={12} /> Re-run</>\n ) : (\n <><Play size={12} /> Run</>\n )}\n </button>\n\n {/* Response */}\n {callTool.isPending && (\n <div className=\"animate-pulse\">\n <p className=\"text-[10px] text-text-quaternary mb-1\">Response</p>\n <div className=\"h-20 bg-surface-sunken/50 rounded-md\" />\n </div>\n )}\n {callTool.data ? (\n <div className=\"space-y-2\">\n <JsonViewer data={callTool.data as Record<string, unknown>} label=\"Response\" defaultCollapsed />\n <ExecutionLink data={callTool.data} />\n </div>\n ) : null}\n {callTool.error ? (\n <div>\n <p className=\"text-[10px] text-text-quaternary mb-1\">Response</p>\n <ToolErrorDisplay error={callTool.error as Error | null} />\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n"],"names":["ToolErrorDisplay","error","msg","jsxs","jsx","KeyRound","Link","ExternalLink","ExecutionLink","data","res","jobId","ns","INPUT_CLS","LABEL_CLS","ArrayInput","value","onChange","className","raw","setRaw","useState","commit","s","useEffect","e","ToolTestPanel","serverId","serverName","tool","onClose","callTool","useCallMcpTool","jsonMode","setJsonMode","fields","setFields","argsJson","setArgsJson","jsonError","setJsonError","executeAs","setExecuteAs","skeleton","buildSkeleton","hasResult","toggleMode","handleRun","parsed","ServerName","ToolPill","X","RunAsSelector","a","b","req","_a","ai","bi","key","propSchema","_b","hint","isRequired","_c","v","Fragment","RotateCcw","Play","JsonViewer"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import{a as c,j as e}from"./vendor-query-B2UbickB.js";import{a as U,b as $,c as B}from"./topics-CAnsyo3w.js";import{c as h,J as C}from"./index-CBS8FBcp.js";import{L as I}from"./ListToolbar-DL1wEuvL.js";import{R as n,B as M,J as z,n as A,aL as V,X as G,T as H,a as _}from"./vendor-icons-BNtvBbnj.js";import{e as K,c as X}from"./vendor-react-CX88sFS5.js";const Y={task:"bg-blue-400/15 text-blue-400",workflow:"bg-accent/15 text-accent",escalation:"bg-amber-400/15 text-amber-400",activity:"bg-cyan-400/15 text-cyan-400",knowledge:"bg-violet-400/15 text-violet-400",agent:"bg-emerald-400/15 text-emerald-400",app:"bg-rose-400/15 text-rose-400",milestone:"bg-violet-400/15 text-violet-400"};function l({icon:r,color:d,children:i}){return e.jsxs("div",{className:"flex items-center gap-2 mb-3 pb-2 border-b border-surface-border",children:[e.jsx(r,{className:`w-4 h-4 ${d}`,strokeWidth:1.5}),e.jsx("h2",{className:"text-xs font-semibold uppercase tracking-widest text-accent/80",children:i})]})}function ne(){var w,S,k;const{topic:r}=K(),d=r?decodeURIComponent(r):null,i=X(),{data:t,isLoading:T,refetch:u,isFetching:E}=U(d),j=$(),q=B(),[a,x]=c.useState(!1),[g,f]=c.useState(""),[b,N]=c.useState(""),[m,y]=c.useState(""),[v,o]=c.useState("");if(T)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]});if(!t)return e.jsxs("div",{className:"flex flex-col items-center justify-center py-20 text-center",children:[e.jsx(n,{className:"w-12 h-12 text-text-quaternary mb-4",strokeWidth:1}),e.jsx("h2",{className:"text-lg font-medium text-text-primary mb-2",children:"Topic not found"})]});const P=t.source==="system",D=!t.managed,O=Y[t.category]??"bg-zinc-400/15 text-zinc-400",R=()=>{f(t.description??""),N((t.tags??[]).join(", ")),y(t.payload_schema?JSON.stringify(t.payload_schema,null,2):""),o(""),x(!0)},J=()=>x(!1),W=()=>{const s=b.split(",").map(L=>L.trim()).filter(Boolean);let p;if(m.trim())try{p=JSON.parse(m),o("")}catch{o("Invalid JSON");return}j.mutate({topic:t.topic,description:g,tags:s,...p!==void 0?{payload_schema:p}:{}},{onSuccess:()=>{x(!1),u()}})},F=()=>{confirm(`Delete topic "${t.topic}"?
1
+ import{a as c,j as e}from"./vendor-query-B2UbickB.js";import{a as U,b as $,c as B}from"./topics-BMG5tx2g.js";import{d as h,J as C}from"./index-DZX-E_3q.js";import{L as I}from"./ListToolbar-DNAGFe14.js";import{R as n,B as M,J as z,n as A,aL as V,X as G,T as H,a as _}from"./vendor-icons-B_Yla7iD.js";import{e as K,c as X}from"./vendor-react-CX88sFS5.js";const Y={task:"bg-blue-400/15 text-blue-400",workflow:"bg-accent/15 text-accent",escalation:"bg-amber-400/15 text-amber-400",activity:"bg-cyan-400/15 text-cyan-400",knowledge:"bg-violet-400/15 text-violet-400",agent:"bg-emerald-400/15 text-emerald-400",app:"bg-rose-400/15 text-rose-400",milestone:"bg-violet-400/15 text-violet-400"};function l({icon:r,color:d,children:i}){return e.jsxs("div",{className:"flex items-center gap-2 mb-3 pb-2 border-b border-surface-border",children:[e.jsx(r,{className:`w-4 h-4 ${d}`,strokeWidth:1.5}),e.jsx("h2",{className:"text-xs font-semibold uppercase tracking-widest text-accent/80",children:i})]})}function ne(){var w,S,k;const{topic:r}=K(),d=r?decodeURIComponent(r):null,i=X(),{data:t,isLoading:T,refetch:u,isFetching:E}=U(d),j=$(),q=B(),[a,x]=c.useState(!1),[g,f]=c.useState(""),[b,N]=c.useState(""),[m,y]=c.useState(""),[v,o]=c.useState("");if(T)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]});if(!t)return e.jsxs("div",{className:"flex flex-col items-center justify-center py-20 text-center",children:[e.jsx(n,{className:"w-12 h-12 text-text-quaternary mb-4",strokeWidth:1}),e.jsx("h2",{className:"text-lg font-medium text-text-primary mb-2",children:"Topic not found"})]});const P=t.source==="system",D=!t.managed,O=Y[t.category]??"bg-zinc-400/15 text-zinc-400",R=()=>{f(t.description??""),N((t.tags??[]).join(", ")),y(t.payload_schema?JSON.stringify(t.payload_schema,null,2):""),o(""),x(!0)},J=()=>x(!1),W=()=>{const s=b.split(",").map(L=>L.trim()).filter(Boolean);let p;if(m.trim())try{p=JSON.parse(m),o("")}catch{o("Invalid JSON");return}j.mutate({topic:t.topic,description:g,tags:s,...p!==void 0?{payload_schema:p}:{}},{onSuccess:()=>{x(!1),u()}})},F=()=>{confirm(`Delete topic "${t.topic}"?
2
2
 
3
3
  This removes it from the catalog. Active subscriptions are not affected.`)&&q.mutate(t.topic,{onSuccess:()=>i("/topics")})};return e.jsxs("div",{className:"max-w-3xl",children:[e.jsxs("div",{className:"flex items-start justify-between mb-6",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[e.jsx(n,{className:"w-5 h-5 text-accent",strokeWidth:1.5}),e.jsx("h1",{className:"text-lg font-mono font-medium text-text-primary",children:t.topic}),e.jsx("button",{onClick:()=>{window.location.hash="#docs:topics.md"},className:"text-text-quaternary hover:text-accent transition-colors",title:"Topic docs",children:e.jsx(M,{className:"w-4 h-4",strokeWidth:1.5})})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:`inline-flex items-center px-2 py-0.5 rounded text-[10px] font-medium ${O}`,children:t.category}),e.jsxs("span",{className:"text-[10px] font-mono text-text-quaternary",children:["source: ",t.source]}),t.last_seen_at&&e.jsxs("span",{className:"text-[10px] text-text-quaternary",children:["last seen ",e.jsx(h,{date:t.last_seen_at})]})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(I,{onRefresh:()=>u(),isFetching:E,apiPath:`/topics/by-name/${encodeURIComponent(t.topic)}`}),!a&&D&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{onClick:R,className:"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors",children:[e.jsx(z,{className:"w-3 h-3"})," Edit"]}),!P&&e.jsxs("button",{onClick:F,className:"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-red-400/60 hover:text-red-400 hover:bg-red-600/10 transition-colors",children:[e.jsx(A,{className:"w-3 h-3"})," Delete"]})]}),a&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{onClick:W,disabled:j.isPending,className:"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors",children:[e.jsx(V,{className:"w-3 h-3"})," Save"]}),e.jsxs("button",{onClick:J,className:"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-text-tertiary hover:text-text-primary hover:bg-surface-hover transition-colors",children:[e.jsx(G,{className:"w-3 h-3"})," Cancel"]})]})]})]}),e.jsx("div",{className:"mb-8",children:a?e.jsxs("div",{children:[e.jsx("label",{className:"section-header",children:"Description"}),e.jsx("textarea",{value:g,onChange:s=>f(s.target.value),rows:3,className:"input resize-none",placeholder:"What this topic represents"})]}):t.description?e.jsx("p",{className:"text-sm text-text-secondary leading-relaxed",children:t.description}):e.jsx("p",{className:"text-sm text-text-quaternary italic",children:"No description"})}),e.jsx("div",{className:"mb-8",children:a?e.jsxs("div",{children:[e.jsx("label",{className:"section-header",children:"Tags"}),e.jsx("input",{type:"text",value:b,onChange:s=>N(s.target.value),placeholder:"lifecycle, core, error",className:"input font-mono"}),e.jsx("p",{className:"hint",children:"Comma-separated. Used for filtering in the catalog."})]}):((w=t.tags)==null?void 0:w.length)>0?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(H,{className:"w-3 h-3 text-text-quaternary",strokeWidth:1.5}),t.tags.map(s=>e.jsx("span",{className:"inline-flex items-center px-2 py-0.5 rounded text-[10px] font-mono text-text-tertiary bg-surface-sunken",children:s},s))]}):null}),e.jsx("div",{className:"mb-8",children:a?e.jsxs("div",{children:[e.jsx("label",{className:"section-header",children:"Payload Schema"}),e.jsx("textarea",{value:m,onChange:s=>{y(s.target.value),o("")},rows:12,className:"input-json w-full",placeholder:`{
4
4
  "type": "object",
@@ -6,4 +6,4 @@ This removes it from the catalog. Active subscriptions are not affected.`)&&q.mu
6
6
  "orderId": { "type": "string" }
7
7
  }
8
8
  }`}),v&&e.jsx("p",{className:"text-[10px] text-red-400 mt-1",children:v}),e.jsx("p",{className:"hint",children:"JSON Schema describing the event.data shape. Shown in subscription editor as field reference."})]}):t.payload_schema?e.jsxs(e.Fragment,{children:[e.jsx(l,{icon:n,color:"text-accent",children:"Payload Schema"}),e.jsx(C,{data:t.payload_schema})]}):e.jsxs(e.Fragment,{children:[e.jsx(l,{icon:n,color:"text-accent",children:"Payload Schema"}),e.jsx("p",{className:"text-[11px] text-text-quaternary",children:"No schema defined. Click Edit to add one."})]})}),t.example_payload&&e.jsxs("div",{className:"mb-8",children:[e.jsx(l,{icon:n,color:"text-cyan-400",children:"Example Payload"}),e.jsx(C,{data:t.example_payload})]}),e.jsxs("div",{className:"mb-8",children:[e.jsxs(l,{icon:_,color:"text-emerald-400",children:["Subscribers (",((S=t.subscribers)==null?void 0:S.length)??0,")"]}),(k=t.subscribers)!=null&&k.length?e.jsx("div",{className:"space-y-1",children:t.subscribers.map(s=>e.jsxs("div",{className:"flex items-center justify-between py-2 px-3 rounded-md hover:bg-surface-hover transition-colors",children:[e.jsxs("button",{onClick:()=>i(`/agents/${s.agent_id}`),className:"flex items-center gap-2 text-left min-w-0",children:[e.jsx(_,{className:"w-3 h-3 text-emerald-400 shrink-0",strokeWidth:1.5}),e.jsx("span",{className:"text-xs text-text-primary hover:text-accent transition-colors",children:s.agent_name})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-[10px] font-mono text-text-quaternary",children:s.topic}),e.jsx("span",{className:"text-[10px] text-text-tertiary",children:s.reaction_type})]})]},s.id))}):e.jsx("p",{className:"text-[11px] text-text-quaternary py-2",children:"No agents are subscribed to this topic."})]}),e.jsxs("div",{className:"text-[10px] text-text-quaternary space-y-1 pt-4 border-t border-surface-border",children:[e.jsxs("p",{children:["Created ",e.jsx(h,{date:t.created_at})]}),e.jsxs("p",{children:["Updated ",e.jsx(h,{date:t.updated_at})]})]})]})}export{ne as TopicDetailPage};
9
- //# sourceMappingURL=TopicDetailPage-C5ZUZpU5.js.map
9
+ //# sourceMappingURL=TopicDetailPage-CjaZn4WP.js.map