@hotmeshio/long-tail 0.1.14 → 0.1.15

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 (349) hide show
  1. package/README.md +15 -0
  2. package/build/api/escalations/bulk.d.ts +78 -0
  3. package/build/api/escalations/bulk.js +279 -0
  4. package/build/api/escalations/claim.d.ts +30 -0
  5. package/build/api/escalations/claim.js +121 -0
  6. package/build/api/escalations/create.d.ts +29 -0
  7. package/build/api/escalations/create.js +101 -0
  8. package/build/api/escalations/helpers.d.ts +10 -0
  9. package/build/api/escalations/helpers.js +80 -0
  10. package/build/api/escalations/index.d.ts +6 -0
  11. package/build/api/escalations/index.js +26 -0
  12. package/build/api/escalations/list.d.ts +75 -0
  13. package/build/api/escalations/list.js +170 -0
  14. package/build/api/escalations/resolve.d.ts +18 -0
  15. package/build/api/escalations/resolve.js +243 -0
  16. package/build/api/escalations/single.d.ts +37 -0
  17. package/build/api/escalations/single.js +123 -0
  18. package/build/api/files.d.ts +3 -0
  19. package/build/api/files.js +18 -1
  20. package/build/api/knowledge.d.ts +36 -0
  21. package/build/api/knowledge.js +112 -0
  22. package/build/api/mcp/index.d.ts +2 -0
  23. package/build/api/mcp/index.js +16 -0
  24. package/build/api/{mcp.d.ts → mcp/servers.d.ts} +1 -33
  25. package/build/api/{mcp.js → mcp/servers.js} +4 -65
  26. package/build/api/mcp/tools.d.ts +33 -0
  27. package/build/api/mcp/tools.js +64 -0
  28. package/build/api/settings.js +9 -1
  29. package/build/api/workflows/config.d.ts +64 -0
  30. package/build/api/workflows/config.js +142 -0
  31. package/build/api/workflows/discovery.d.ts +29 -0
  32. package/build/api/workflows/discovery.js +153 -0
  33. package/build/api/workflows/index.d.ts +3 -0
  34. package/build/api/workflows/index.js +18 -0
  35. package/build/api/workflows/invocation.d.ts +67 -0
  36. package/build/api/workflows/invocation.js +188 -0
  37. package/build/api/yaml-workflows/cron.d.ts +39 -0
  38. package/build/api/yaml-workflows/cron.js +127 -0
  39. package/build/api/{yaml-workflows.d.ts → yaml-workflows/crud.d.ts} +22 -146
  40. package/build/api/{yaml-workflows.js → yaml-workflows/crud.js} +77 -378
  41. package/build/api/yaml-workflows/deploy.d.ts +71 -0
  42. package/build/api/yaml-workflows/deploy.js +223 -0
  43. package/build/api/yaml-workflows/helpers.d.ts +2 -0
  44. package/build/api/yaml-workflows/helpers.js +8 -0
  45. package/build/api/yaml-workflows/index.d.ts +4 -0
  46. package/build/api/yaml-workflows/index.js +27 -0
  47. package/build/api/yaml-workflows/versions.d.ts +43 -0
  48. package/build/api/yaml-workflows/versions.js +124 -0
  49. package/build/bin/ltc.d.ts +2 -0
  50. package/build/bin/ltc.js +220 -0
  51. package/build/examples/seed-data.d.ts +55 -0
  52. package/build/examples/seed-data.js +161 -0
  53. package/build/examples/seed.js +7 -164
  54. package/build/lib/cli/auth.d.ts +23 -0
  55. package/build/lib/cli/auth.js +167 -0
  56. package/build/lib/cli/client.d.ts +6 -0
  57. package/build/lib/cli/client.js +31 -0
  58. package/build/lib/cli/commands/escalations.d.ts +19 -0
  59. package/build/lib/cli/commands/escalations.js +69 -0
  60. package/build/lib/cli/commands/knowledge.d.ts +18 -0
  61. package/build/lib/cli/commands/knowledge.js +87 -0
  62. package/build/lib/cli/commands/mcp.d.ts +8 -0
  63. package/build/lib/cli/commands/mcp.js +33 -0
  64. package/build/lib/cli/commands/pipelines.d.ts +16 -0
  65. package/build/lib/cli/commands/pipelines.js +67 -0
  66. package/build/lib/cli/commands/status.d.ts +1 -0
  67. package/build/lib/cli/commands/status.js +28 -0
  68. package/build/lib/cli/commands/users.d.ts +7 -0
  69. package/build/lib/cli/commands/users.js +25 -0
  70. package/build/lib/cli/commands/workflows.d.ts +16 -0
  71. package/build/lib/cli/commands/workflows.js +104 -0
  72. package/build/lib/cli/compile.d.ts +2 -0
  73. package/build/lib/cli/compile.js +165 -0
  74. package/build/lib/cli/format.d.ts +23 -0
  75. package/build/lib/cli/format.js +94 -0
  76. package/build/lib/cli/init.d.ts +1 -0
  77. package/build/lib/cli/init.js +61 -0
  78. package/build/lib/cli/output.d.ts +27 -0
  79. package/build/lib/cli/output.js +126 -0
  80. package/build/lib/cli/scanner.d.ts +10 -0
  81. package/build/lib/cli/scanner.js +164 -0
  82. package/build/lib/cli/types.d.ts +16 -0
  83. package/build/lib/cli/types.js +2 -0
  84. package/build/lib/logger/index.d.ts +0 -9
  85. package/build/lib/logger/index.js +9 -4
  86. package/build/lib/storage/index.js +2 -2
  87. package/build/routes/file-browser.js +14 -0
  88. package/build/routes/index.js +2 -0
  89. package/build/routes/knowledge.d.ts +2 -0
  90. package/build/routes/knowledge.js +141 -0
  91. package/build/routes/yaml-workflows/crud.js +9 -0
  92. package/build/sdk/index.d.ts +17 -0
  93. package/build/sdk/index.js +19 -0
  94. package/build/services/mcp/client/connection-dispatch.d.ts +18 -0
  95. package/build/services/mcp/client/connection-dispatch.js +78 -0
  96. package/build/services/mcp/client/connection-lifecycle.d.ts +48 -0
  97. package/build/services/mcp/client/connection-lifecycle.js +296 -0
  98. package/build/services/mcp/client/connection-test.d.ts +10 -0
  99. package/build/services/mcp/client/connection-test.js +49 -0
  100. package/build/services/mcp/client/connection.d.ts +3 -68
  101. package/build/services/mcp/client/connection.js +15 -393
  102. package/build/services/mcp/server-lifecycle.d.ts +27 -0
  103. package/build/services/mcp/server-lifecycle.js +49 -0
  104. package/build/services/mcp/server-tools.d.ts +13 -0
  105. package/build/services/mcp/server-tools.js +287 -0
  106. package/build/services/mcp/server.d.ts +2 -26
  107. package/build/services/mcp/server.js +7 -315
  108. package/build/services/yaml-workflow/builder-regenerate.d.ts +25 -0
  109. package/build/services/yaml-workflow/builder-regenerate.js +111 -0
  110. package/build/services/yaml-workflow/db-versions.d.ts +17 -0
  111. package/build/services/yaml-workflow/db-versions.js +76 -0
  112. package/build/services/yaml-workflow/db.d.ts +3 -13
  113. package/build/services/yaml-workflow/db.js +15 -71
  114. package/build/services/yaml-workflow/deployer-helpers.js +48 -17
  115. package/build/services/yaml-workflow/durable-compiler/index.d.ts +22 -0
  116. package/build/services/yaml-workflow/durable-compiler/index.js +168 -0
  117. package/build/services/yaml-workflow/durable-compiler/parser.d.ts +12 -0
  118. package/build/services/yaml-workflow/durable-compiler/parser.js +110 -0
  119. package/build/services/yaml-workflow/durable-compiler/prompts.d.ts +18 -0
  120. package/build/services/yaml-workflow/durable-compiler/prompts.js +570 -0
  121. package/build/services/yaml-workflow/durable-compiler/types.d.ts +51 -0
  122. package/build/services/yaml-workflow/durable-compiler/types.js +5 -0
  123. package/build/services/yaml-workflow/pipeline/build/dag-assembly.d.ts +17 -0
  124. package/build/services/yaml-workflow/pipeline/build/dag-assembly.js +192 -0
  125. package/build/services/yaml-workflow/pipeline/build/dag.d.ts +4 -13
  126. package/build/services/yaml-workflow/pipeline/build/dag.js +9 -185
  127. package/build/services/yaml-workflow/pipeline/prompt-templates.d.ts +10 -0
  128. package/build/services/yaml-workflow/pipeline/prompt-templates.js +270 -0
  129. package/build/services/yaml-workflow/pipeline/prompts.d.ts +3 -6
  130. package/build/services/yaml-workflow/pipeline/prompts.js +8 -263
  131. package/build/start/workers.js +6 -5
  132. package/build/system/activities/file-storage.d.ts +4 -0
  133. package/build/system/activities/file-storage.js +7 -1
  134. package/build/system/activities/knowledge.d.ts +23 -0
  135. package/build/system/activities/knowledge.js +50 -10
  136. package/build/system/activities/sql.d.ts +3 -0
  137. package/build/system/activities/sql.js +25 -1
  138. package/build/system/mcp-servers/file-storage.js +3 -1
  139. package/build/system/mcp-servers/human-queue-schemas.d.ts +91 -0
  140. package/build/system/mcp-servers/human-queue-schemas.js +42 -0
  141. package/build/system/mcp-servers/human-queue.d.ts +2 -6
  142. package/build/system/mcp-servers/human-queue.js +9 -51
  143. package/build/system/mcp-servers/knowledge.js +43 -9
  144. package/build/system/mcp-servers/workflow-compiler.js +54 -0
  145. package/build/system/workflows/mcp-triage/activities-proxy.d.ts +21 -0
  146. package/build/system/workflows/mcp-triage/activities-proxy.js +70 -0
  147. package/build/system/workflows/mcp-triage/index.js +17 -75
  148. package/build/system/workflows/mcp-workflow-planner/activities/persist.d.ts +1 -0
  149. package/build/system/workflows/mcp-workflow-planner/activities/persist.js +1 -0
  150. package/build/system/workflows/mcp-workflow-planner/index.js +2 -0
  151. package/build/tsconfig.tsbuildinfo +1 -1
  152. package/dashboard/dist/assets/{AdminDashboard-Cngijp4Q.js → AdminDashboard-NLryl1_B.js} +2 -2
  153. package/dashboard/dist/assets/{AdminDashboard-Cngijp4Q.js.map → AdminDashboard-NLryl1_B.js.map} +1 -1
  154. package/dashboard/dist/assets/AvailableEscalationsPage-6vexlrk3.js +2 -0
  155. package/dashboard/dist/assets/AvailableEscalationsPage-6vexlrk3.js.map +1 -0
  156. package/dashboard/dist/assets/{BotPicker-B8Uvw9Si.js → BotPicker-DWhn0tr1.js} +2 -2
  157. package/dashboard/dist/assets/{BotPicker-B8Uvw9Si.js.map → BotPicker-DWhn0tr1.js.map} +1 -1
  158. package/dashboard/dist/assets/{CollapsibleSection-DiFPuWOY.js → CollapsibleSection-CgYgQiOc.js} +2 -2
  159. package/dashboard/dist/assets/{CollapsibleSection-DiFPuWOY.js.map → CollapsibleSection-CgYgQiOc.js.map} +1 -1
  160. package/dashboard/dist/assets/{ConfirmDeleteModal-CpXG9uyu.js → ConfirmDeleteModal-DCKAPXD3.js} +2 -2
  161. package/dashboard/dist/assets/{ConfirmDeleteModal-CpXG9uyu.js.map → ConfirmDeleteModal-DCKAPXD3.js.map} +1 -1
  162. package/dashboard/dist/assets/{CopyableId-DKsTR9lK.js → CopyableId-DXkaAOYk.js} +2 -2
  163. package/dashboard/dist/assets/{CopyableId-DKsTR9lK.js.map → CopyableId-DXkaAOYk.js.map} +1 -1
  164. package/dashboard/dist/assets/{CredentialsPage-DlS7Kf40.js → CredentialsPage-B361BOfU.js} +2 -2
  165. package/dashboard/dist/assets/{CredentialsPage-DlS7Kf40.js.map → CredentialsPage-B361BOfU.js.map} +1 -1
  166. package/dashboard/dist/assets/{CustomDurationPicker-B-9eW3pm.js → CustomDurationPicker-D2G1ldiF.js} +2 -2
  167. package/dashboard/dist/assets/{CustomDurationPicker-B-9eW3pm.js.map → CustomDurationPicker-D2G1ldiF.js.map} +1 -1
  168. package/dashboard/dist/assets/{DataTable-DkOokbtL.js → DataTable-DXSUbA26.js} +2 -2
  169. package/dashboard/dist/assets/{DataTable-DkOokbtL.js.map → DataTable-DXSUbA26.js.map} +1 -1
  170. package/dashboard/dist/assets/{ElapsedCell-DVtHqM-5.js → ElapsedCell-CQGqkXP_.js} +2 -2
  171. package/dashboard/dist/assets/{ElapsedCell-DVtHqM-5.js.map → ElapsedCell-CQGqkXP_.js.map} +1 -1
  172. package/dashboard/dist/assets/{EmptyState-C7KIMIbE.js → EmptyState-Dep92Wkg.js} +2 -2
  173. package/dashboard/dist/assets/{EmptyState-C7KIMIbE.js.map → EmptyState-Dep92Wkg.js.map} +1 -1
  174. package/dashboard/dist/assets/{EscalationsOverview-BMKBlkPx.js → EscalationsOverview-DVEFVjs7.js} +2 -2
  175. package/dashboard/dist/assets/{EscalationsOverview-BMKBlkPx.js.map → EscalationsOverview-DVEFVjs7.js.map} +1 -1
  176. package/dashboard/dist/assets/{EventTable-BYZ5OVdQ.js → EventTable-BMJAPkMi.js} +2 -2
  177. package/dashboard/dist/assets/{EventTable-BYZ5OVdQ.js.map → EventTable-BMJAPkMi.js.map} +1 -1
  178. package/dashboard/dist/assets/{FilterBar-C5r3n6YO.js → FilterBar-DbVbCzH2.js} +2 -2
  179. package/dashboard/dist/assets/{FilterBar-C5r3n6YO.js.map → FilterBar-DbVbCzH2.js.map} +1 -1
  180. package/dashboard/dist/assets/{ListToolbar-BGUajIsW.js → ListToolbar-0XNuXj0M.js} +2 -2
  181. package/dashboard/dist/assets/{ListToolbar-BGUajIsW.js.map → ListToolbar-0XNuXj0M.js.map} +1 -1
  182. package/dashboard/dist/assets/{McpOverview-B_kJYHea.js → McpOverview-CeYnCzBN.js} +2 -2
  183. package/dashboard/dist/assets/{McpOverview-B_kJYHea.js.map → McpOverview-CeYnCzBN.js.map} +1 -1
  184. package/dashboard/dist/assets/McpQueryDetailPage-t3qW3QNa.js +5 -0
  185. package/dashboard/dist/assets/McpQueryDetailPage-t3qW3QNa.js.map +1 -0
  186. package/dashboard/dist/assets/{McpQueryPage-BgAq_bQg.js → McpQueryPage-CfUcdzaj.js} +2 -2
  187. package/dashboard/dist/assets/{McpQueryPage-BgAq_bQg.js.map → McpQueryPage-CfUcdzaj.js.map} +1 -1
  188. package/dashboard/dist/assets/{McpRunDetailPage-B8c0OszR.js → McpRunDetailPage-CZtodW_Z.js} +2 -2
  189. package/dashboard/dist/assets/{McpRunDetailPage-B8c0OszR.js.map → McpRunDetailPage-CZtodW_Z.js.map} +1 -1
  190. package/dashboard/dist/assets/{McpRunsPage-BY8C6k78.js → McpRunsPage-Dzgq7HGt.js} +2 -2
  191. package/dashboard/dist/assets/{McpRunsPage-BY8C6k78.js.map → McpRunsPage-Dzgq7HGt.js.map} +1 -1
  192. package/dashboard/dist/assets/{Modal-E1yRnCeW.js → Modal-yyhUeKoA.js} +2 -2
  193. package/dashboard/dist/assets/{Modal-E1yRnCeW.js.map → Modal-yyhUeKoA.js.map} +1 -1
  194. package/dashboard/dist/assets/{OperatorDashboard-C8MSTzey.js → OperatorDashboard-Ceh7OQtZ.js} +2 -2
  195. package/dashboard/dist/assets/{OperatorDashboard-C8MSTzey.js.map → OperatorDashboard-Ceh7OQtZ.js.map} +1 -1
  196. package/dashboard/dist/assets/{PageHeader-Cm5HBQF_.js → PageHeader-CZ9a8cpr.js} +2 -2
  197. package/dashboard/dist/assets/{PageHeader-Cm5HBQF_.js.map → PageHeader-CZ9a8cpr.js.map} +1 -1
  198. package/dashboard/dist/assets/{PageHeaderWithStats-CNmWJFSN.js → PageHeaderWithStats-BJuNs5NM.js} +2 -2
  199. package/dashboard/dist/assets/{PageHeaderWithStats-CNmWJFSN.js.map → PageHeaderWithStats-BJuNs5NM.js.map} +1 -1
  200. package/dashboard/dist/assets/{PriorityBadge-HSI4RVhs.js → PriorityBadge-BrPikMFy.js} +2 -2
  201. package/dashboard/dist/assets/{PriorityBadge-HSI4RVhs.js.map → PriorityBadge-BrPikMFy.js.map} +1 -1
  202. package/dashboard/dist/assets/{ProcessDetailPage-Dln8622H.js → ProcessDetailPage-2miaYd8G.js} +2 -2
  203. package/dashboard/dist/assets/{ProcessDetailPage-Dln8622H.js.map → ProcessDetailPage-2miaYd8G.js.map} +1 -1
  204. package/dashboard/dist/assets/{ProcessesListPage-bIsd9N_h.js → ProcessesListPage-DqpRDqjk.js} +2 -2
  205. package/dashboard/dist/assets/{ProcessesListPage-bIsd9N_h.js.map → ProcessesListPage-DqpRDqjk.js.map} +1 -1
  206. package/dashboard/dist/assets/{RolePill-BVUp2bF0.js → RolePill-DxbJMfJu.js} +2 -2
  207. package/dashboard/dist/assets/{RolePill-BVUp2bF0.js.map → RolePill-DxbJMfJu.js.map} +1 -1
  208. package/dashboard/dist/assets/RolesPage-CYHRo21-.js +2 -0
  209. package/dashboard/dist/assets/{RolesPage-kH-Njt25.js.map → RolesPage-CYHRo21-.js.map} +1 -1
  210. package/dashboard/dist/assets/{RowActions-DbUJPfaW.js → RowActions-DurFwIwe.js} +2 -2
  211. package/dashboard/dist/assets/{RowActions-DbUJPfaW.js.map → RowActions-DurFwIwe.js.map} +1 -1
  212. package/dashboard/dist/assets/RunAsSelector-CNKraP6u.js +2 -0
  213. package/dashboard/dist/assets/RunAsSelector-CNKraP6u.js.map +1 -0
  214. package/dashboard/dist/assets/{StatCard-Bs3JbyAz.js → StatCard-CKplpK3w.js} +2 -2
  215. package/dashboard/dist/assets/{StatCard-Bs3JbyAz.js.map → StatCard-CKplpK3w.js.map} +1 -1
  216. package/dashboard/dist/assets/{StatusBadge-CakDdsCw.js → StatusBadge-Dm0V1dNN.js} +2 -2
  217. package/dashboard/dist/assets/{StatusBadge-CakDdsCw.js.map → StatusBadge-Dm0V1dNN.js.map} +1 -1
  218. package/dashboard/dist/assets/{StepIndicator-Cd_SG_yA.js → StepIndicator-Dicx0WTZ.js} +2 -2
  219. package/dashboard/dist/assets/{StepIndicator-Cd_SG_yA.js.map → StepIndicator-Dicx0WTZ.js.map} +1 -1
  220. package/dashboard/dist/assets/{StickyPagination-Bz0C18nC.js → StickyPagination-B2jYvU3-.js} +2 -2
  221. package/dashboard/dist/assets/{StickyPagination-Bz0C18nC.js.map → StickyPagination-B2jYvU3-.js.map} +1 -1
  222. package/dashboard/dist/assets/SwimlaneTimeline-ClwumkT1.js +2 -0
  223. package/dashboard/dist/assets/SwimlaneTimeline-ClwumkT1.js.map +1 -0
  224. package/dashboard/dist/assets/{TagInput-ClFhXG-U.js → TagInput-CypDZ6Kl.js} +2 -2
  225. package/dashboard/dist/assets/{TagInput-ClFhXG-U.js.map → TagInput-CypDZ6Kl.js.map} +1 -1
  226. package/dashboard/dist/assets/{TaskDetailPage-SuMBdARt.js → TaskDetailPage-DooDNJGT.js} +2 -2
  227. package/dashboard/dist/assets/{TaskDetailPage-SuMBdARt.js.map → TaskDetailPage-DooDNJGT.js.map} +1 -1
  228. package/dashboard/dist/assets/{TaskQueuePill-lJR1JW_W.js → TaskQueuePill-C1hZ-j31.js} +2 -2
  229. package/dashboard/dist/assets/{TaskQueuePill-lJR1JW_W.js.map → TaskQueuePill-C1hZ-j31.js.map} +1 -1
  230. package/dashboard/dist/assets/{TasksListPage-Dkq1Vtbt.js → TasksListPage-D7CdkAeg.js} +2 -2
  231. package/dashboard/dist/assets/{TasksListPage-Dkq1Vtbt.js.map → TasksListPage-D7CdkAeg.js.map} +1 -1
  232. package/dashboard/dist/assets/{TimeAgo-DgfDZ1pl.js → TimeAgo-B5LXB2aj.js} +2 -2
  233. package/dashboard/dist/assets/{TimeAgo-DgfDZ1pl.js.map → TimeAgo-B5LXB2aj.js.map} +1 -1
  234. package/dashboard/dist/assets/{TimestampCell-MpHZ1hMD.js → TimestampCell-Crb9b0Gw.js} +2 -2
  235. package/dashboard/dist/assets/{TimestampCell-MpHZ1hMD.js.map → TimestampCell-Crb9b0Gw.js.map} +1 -1
  236. package/dashboard/dist/assets/{UserName-DqsosA4B.js → UserName-OPg-nkRa.js} +2 -2
  237. package/dashboard/dist/assets/{UserName-DqsosA4B.js.map → UserName-OPg-nkRa.js.map} +1 -1
  238. package/dashboard/dist/assets/{WorkflowExecutionPage-CVlg38C3.js → WorkflowExecutionPage-CcLVrs9b.js} +2 -2
  239. package/dashboard/dist/assets/{WorkflowExecutionPage-CVlg38C3.js.map → WorkflowExecutionPage-CcLVrs9b.js.map} +1 -1
  240. package/dashboard/dist/assets/{WorkflowPill-CRpZhjGR.js → WorkflowPill-CCV4MMj7.js} +2 -2
  241. package/dashboard/dist/assets/{WorkflowPill-CRpZhjGR.js.map → WorkflowPill-CCV4MMj7.js.map} +1 -1
  242. package/dashboard/dist/assets/{WorkflowsDashboard-Ugzbs8mV.js → WorkflowsDashboard-DB1SncBi.js} +2 -2
  243. package/dashboard/dist/assets/{WorkflowsDashboard-Ugzbs8mV.js.map → WorkflowsDashboard-DB1SncBi.js.map} +1 -1
  244. package/dashboard/dist/assets/{WorkflowsOverview-CIp_lTNl.js → WorkflowsOverview-DvShiYJV.js} +2 -2
  245. package/dashboard/dist/assets/{WorkflowsOverview-CIp_lTNl.js.map → WorkflowsOverview-DvShiYJV.js.map} +1 -1
  246. package/dashboard/dist/assets/YamlWorkflowsPage-DCBoMeGI.js +2 -0
  247. package/dashboard/dist/assets/YamlWorkflowsPage-DCBoMeGI.js.map +1 -0
  248. package/dashboard/dist/assets/{bots-DPfUpVqI.js → bots-Dqos20NE.js} +2 -2
  249. package/dashboard/dist/assets/{bots-DPfUpVqI.js.map → bots-Dqos20NE.js.map} +1 -1
  250. package/dashboard/dist/assets/{escalation-RrCDbMC3.js → escalation-A0CsbvNV.js} +2 -2
  251. package/dashboard/dist/assets/{escalation-RrCDbMC3.js.map → escalation-A0CsbvNV.js.map} +1 -1
  252. package/dashboard/dist/assets/{escalation-columns-CDGa9wsD.js → escalation-columns-BpBJN6k4.js} +2 -2
  253. package/dashboard/dist/assets/{escalation-columns-CDGa9wsD.js.map → escalation-columns-BpBJN6k4.js.map} +1 -1
  254. package/dashboard/dist/assets/{helpers-ZSKqdkdS.js → helpers-CmznCuAx.js} +2 -2
  255. package/dashboard/dist/assets/{helpers-ZSKqdkdS.js.map → helpers-CmznCuAx.js.map} +1 -1
  256. package/dashboard/dist/assets/index-BIeYV5QK.js +2 -0
  257. package/dashboard/dist/assets/index-BIeYV5QK.js.map +1 -0
  258. package/dashboard/dist/assets/index-BYwD3kHN.js +5 -0
  259. package/dashboard/dist/assets/index-BYwD3kHN.js.map +1 -0
  260. package/dashboard/dist/assets/index-C5TUqJu0.css +1 -0
  261. package/dashboard/dist/assets/{index-DX6zxr6t.js → index-C8-UaN4N.js} +2 -2
  262. package/dashboard/dist/assets/{index-DX6zxr6t.js.map → index-C8-UaN4N.js.map} +1 -1
  263. package/dashboard/dist/assets/index-CAj5LT9H.js +15 -0
  264. package/dashboard/dist/assets/index-CAj5LT9H.js.map +1 -0
  265. package/dashboard/dist/assets/index-CjxHCVxl.js +2 -0
  266. package/dashboard/dist/assets/{index-C90ZPzXk.js.map → index-CjxHCVxl.js.map} +1 -1
  267. package/dashboard/dist/assets/index-Cr0Rqsj7.js +2 -0
  268. package/dashboard/dist/assets/index-Cr0Rqsj7.js.map +1 -0
  269. package/dashboard/dist/assets/index-DZHNte4o.js +2 -0
  270. package/dashboard/dist/assets/{index-K40Qw1tk.js.map → index-DZHNte4o.js.map} +1 -1
  271. package/dashboard/dist/assets/{index-DNytWfSZ.js → index-VnYkWW8r.js} +2 -2
  272. package/dashboard/dist/assets/{index-DNytWfSZ.js.map → index-VnYkWW8r.js.map} +1 -1
  273. package/dashboard/dist/assets/{index-BbI2dzhJ.js → index-XGOmZ117.js} +2 -2
  274. package/dashboard/dist/assets/{index-BbI2dzhJ.js.map → index-XGOmZ117.js.map} +1 -1
  275. package/dashboard/dist/assets/index-ZjOUzWhc.js +2 -0
  276. package/dashboard/dist/assets/index-ZjOUzWhc.js.map +1 -0
  277. package/dashboard/dist/assets/{index-Cmgrk7PQ.js → index-puKKZ5l8.js} +71 -71
  278. package/dashboard/dist/assets/index-puKKZ5l8.js.map +1 -0
  279. package/dashboard/dist/assets/{index-BmVCyB6C.js → index-t5frSddy.js} +2 -2
  280. package/dashboard/dist/assets/{index-BmVCyB6C.js.map → index-t5frSddy.js.map} +1 -1
  281. package/dashboard/dist/assets/{mcp-CNE44TSp.js → mcp-DrWymhSu.js} +2 -2
  282. package/dashboard/dist/assets/{mcp-CNE44TSp.js.map → mcp-DrWymhSu.js.map} +1 -1
  283. package/dashboard/dist/assets/{mcp-query-RQX0uN-5.js → mcp-query-BhUxVEMS.js} +2 -2
  284. package/dashboard/dist/assets/{mcp-query-RQX0uN-5.js.map → mcp-query-BhUxVEMS.js.map} +1 -1
  285. package/dashboard/dist/assets/{mcp-runs-0w40bdz-.js → mcp-runs-DUfz4mLd.js} +2 -2
  286. package/dashboard/dist/assets/{mcp-runs-0w40bdz-.js.map → mcp-runs-DUfz4mLd.js.map} +1 -1
  287. package/dashboard/dist/assets/{namespaces-BbmdXuPp.js → namespaces-Cm6AY5sh.js} +2 -2
  288. package/dashboard/dist/assets/{namespaces-BbmdXuPp.js.map → namespaces-Cm6AY5sh.js.map} +1 -1
  289. package/dashboard/dist/assets/{roles-DoHYlhWH.js → roles-2v1Kc7BJ.js} +2 -2
  290. package/dashboard/dist/assets/{roles-DoHYlhWH.js.map → roles-2v1Kc7BJ.js.map} +1 -1
  291. package/dashboard/dist/assets/{settings-BAiJiCHS.js → settings-DTQNp6tH.js} +2 -2
  292. package/dashboard/dist/assets/{settings-BAiJiCHS.js.map → settings-DTQNp6tH.js.map} +1 -1
  293. package/dashboard/dist/assets/{tasks-CvroqHtm.js → tasks-CS1rgG1s.js} +2 -2
  294. package/dashboard/dist/assets/{tasks-CvroqHtm.js.map → tasks-CS1rgG1s.js.map} +1 -1
  295. package/dashboard/dist/assets/useEventHooks-BjXX8x3a.js +2 -0
  296. package/dashboard/dist/assets/{useEventHooks-BHMbzR_y.js.map → useEventHooks-BjXX8x3a.js.map} +1 -1
  297. package/dashboard/dist/assets/useYamlActivityEvents-BeR-nVWQ.js +2 -0
  298. package/dashboard/dist/assets/{useYamlActivityEvents-D56KV14X.js.map → useYamlActivityEvents-BeR-nVWQ.js.map} +1 -1
  299. package/dashboard/dist/assets/{users-CxIMy_xw.js → users-DYsdQ7Md.js} +2 -2
  300. package/dashboard/dist/assets/{users-CxIMy_xw.js.map → users-DYsdQ7Md.js.map} +1 -1
  301. package/dashboard/dist/assets/{vendor-icons-AFGxSeQS.js → vendor-icons-CWl44VA6.js} +77 -77
  302. package/dashboard/dist/assets/vendor-icons-CWl44VA6.js.map +1 -0
  303. package/dashboard/dist/assets/{workflows-yR9yais7.js → workflows-2QAXh3UD.js} +2 -2
  304. package/dashboard/dist/assets/{workflows-yR9yais7.js.map → workflows-2QAXh3UD.js.map} +1 -1
  305. package/dashboard/dist/assets/{yaml-workflows-QVF2MZ0l.js → yaml-workflows-sx8-UEE3.js} +2 -2
  306. package/dashboard/dist/assets/{yaml-workflows-QVF2MZ0l.js.map → yaml-workflows-sx8-UEE3.js.map} +1 -1
  307. package/dashboard/dist/index.html +3 -3
  308. package/docs/api/http/file-browser.md +101 -0
  309. package/docs/api/http/knowledge.md +203 -0
  310. package/docs/api/http/settings.md +6 -4
  311. package/docs/api/sdk/files.md +68 -0
  312. package/docs/api/sdk/knowledge.md +126 -0
  313. package/docs/api/sdk/settings.md +3 -2
  314. package/docs/cli.md +171 -0
  315. package/docs/compilation.md +16 -0
  316. package/docs/compiler.md +311 -0
  317. package/docs/events.md +19 -0
  318. package/docs/workflows.md +19 -0
  319. package/package.json +13 -2
  320. package/build/api/escalations.d.ts +0 -271
  321. package/build/api/escalations.js +0 -932
  322. package/build/api/workflows.d.ts +0 -158
  323. package/build/api/workflows.js +0 -414
  324. package/dashboard/dist/assets/AvailableEscalationsPage-CpBfGV1h.js +0 -2
  325. package/dashboard/dist/assets/AvailableEscalationsPage-CpBfGV1h.js.map +0 -1
  326. package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js +0 -5
  327. package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js.map +0 -1
  328. package/dashboard/dist/assets/RolesPage-kH-Njt25.js +0 -2
  329. package/dashboard/dist/assets/SwimlaneTimeline-Cfe-xQRX.js +0 -2
  330. package/dashboard/dist/assets/SwimlaneTimeline-Cfe-xQRX.js.map +0 -1
  331. package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js +0 -2
  332. package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js.map +0 -1
  333. package/dashboard/dist/assets/helpers-rMEcLwKs.js +0 -2
  334. package/dashboard/dist/assets/helpers-rMEcLwKs.js.map +0 -1
  335. package/dashboard/dist/assets/index-ABcJHHlN.js +0 -5
  336. package/dashboard/dist/assets/index-ABcJHHlN.js.map +0 -1
  337. package/dashboard/dist/assets/index-B91h_jZ0.js +0 -15
  338. package/dashboard/dist/assets/index-B91h_jZ0.js.map +0 -1
  339. package/dashboard/dist/assets/index-C1E5GTs9.js +0 -2
  340. package/dashboard/dist/assets/index-C1E5GTs9.js.map +0 -1
  341. package/dashboard/dist/assets/index-C90ZPzXk.js +0 -2
  342. package/dashboard/dist/assets/index-Cmgrk7PQ.js.map +0 -1
  343. package/dashboard/dist/assets/index-DeX-ezqf.css +0 -1
  344. package/dashboard/dist/assets/index-K40Qw1tk.js +0 -2
  345. package/dashboard/dist/assets/index-lCyNr5Xk.js +0 -2
  346. package/dashboard/dist/assets/index-lCyNr5Xk.js.map +0 -1
  347. package/dashboard/dist/assets/useEventHooks-BHMbzR_y.js +0 -2
  348. package/dashboard/dist/assets/useYamlActivityEvents-D56KV14X.js +0 -2
  349. package/dashboard/dist/assets/vendor-icons-AFGxSeQS.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index-DNytWfSZ.js","sources":["../../src/pages/mcp/servers/detail/server-form-types.ts","../../src/pages/mcp/servers/detail/TransportStep.tsx","../../src/pages/mcp/servers/detail/DiscoveryStep.tsx","../../src/pages/mcp/servers/detail/TestStep.tsx","../../src/pages/mcp/servers/detail/ReviewStep.tsx","../../src/pages/mcp/servers/detail/McpServerDetailPage.tsx"],"sourcesContent":["import type { McpServerRecord, McpToolManifest } from '../../../../api/types';\n\nexport interface ServerFormState {\n name: string;\n description: string;\n mode: 'in-process' | 'network' | 'local-process';\n transport_type: 'stdio' | 'sse' | 'streamable-http';\n // stdio fields\n command: string;\n args: string;\n env_vars: string;\n // network fields\n url: string;\n // shared\n auto_connect: boolean;\n tags: string[];\n compile_hints: string;\n credential_providers: string[];\n discovered_tools: McpToolManifest[] | null;\n}\n\nexport const EMPTY_FORM: ServerFormState = {\n name: '',\n description: '',\n mode: 'network',\n transport_type: 'sse',\n command: '',\n args: '',\n env_vars: '{}',\n url: '',\n auto_connect: false,\n tags: [],\n compile_hints: '',\n credential_providers: [],\n discovered_tools: null,\n};\n\nexport function serverToForm(s: McpServerRecord): ServerFormState {\n const config = s.transport_config ?? {};\n const isBuiltin = !!(config as any).builtin;\n\n let mode: ServerFormState['mode'] = 'network';\n if (isBuiltin) mode = 'in-process';\n else if (s.transport_type === 'stdio') mode = 'local-process';\n\n return {\n name: s.name,\n description: s.description ?? '',\n mode,\n transport_type: s.transport_type,\n command: (config as any).command ?? '',\n args: ((config as any).args ?? []).join(', '),\n env_vars: (config as any).env ? JSON.stringify((config as any).env, null, 2) : '{}',\n url: (config as any).url ?? '',\n auto_connect: s.auto_connect,\n tags: s.tags ?? [],\n compile_hints: (s as any).compile_hints ?? '',\n credential_providers: s.credential_providers ?? [],\n discovered_tools: s.tool_manifest ?? null,\n };\n}\n\nexport function formToPayload(form: ServerFormState) {\n let transport_config: Record<string, unknown> = {};\n\n if (form.mode === 'local-process') {\n transport_config = {\n command: form.command.trim(),\n args: form.args.split(',').map((a) => a.trim()).filter(Boolean),\n env: form.env_vars.trim() ? JSON.parse(form.env_vars) : undefined,\n };\n } else if (form.mode === 'network') {\n transport_config = { url: form.url.trim() };\n }\n // in-process: transport_config stays empty (server manages it)\n\n return {\n name: form.name.trim(),\n description: form.description.trim() || undefined,\n transport_type: form.mode === 'local-process' ? 'stdio' as const : form.transport_type,\n transport_config,\n auto_connect: form.auto_connect,\n tags: form.tags,\n compile_hints: form.compile_hints.trim() || undefined,\n credential_providers: form.credential_providers.length > 0 ? form.credential_providers : undefined,\n };\n}\n\nexport const STEP_LABELS = ['Transport', 'Discovery', 'Test', 'Review'];\n\nexport function isStepValid(step: number, form: ServerFormState): boolean {\n if (step === 1) {\n if (!form.name.trim()) return false;\n if (form.mode === 'network' && !form.url.trim()) return false;\n if (form.mode === 'local-process' && !form.command.trim()) return false;\n return true;\n }\n return true;\n}\n\nexport const labelCls = 'block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1';\nexport const hintCls = 'text-[10px] text-text-tertiary mt-2 leading-relaxed';\n","import type { ServerFormState } from './server-form-types';\nimport { labelCls, hintCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n set: (field: keyof ServerFormState, value: any) => void;\n isBuiltin: boolean;\n}\n\nconst modes = [\n { value: 'in-process', label: 'In-Process', hint: 'Built-in server running inside the app' },\n { value: 'network', label: 'Network Service', hint: 'Remote server via SSE or Streamable HTTP' },\n { value: 'local-process', label: 'Local Process', hint: 'Spawn a local command via stdio' },\n] as const;\n\nexport function TransportStep({ form, set, isBuiltin }: Props) {\n return (\n <div className=\"space-y-5\">\n {/* Mode selector */}\n <div>\n <label className={labelCls}>Connection Mode</label>\n <div className=\"grid grid-cols-3 gap-3 mt-1\">\n {modes.map((m) => {\n const active = form.mode === m.value;\n const disabled = isBuiltin && m.value !== 'in-process';\n return (\n <button\n key={m.value}\n type=\"button\"\n disabled={disabled}\n onClick={() => {\n set('mode', m.value);\n if (m.value === 'local-process') set('transport_type', 'stdio');\n if (m.value === 'network') set('transport_type', 'sse');\n }}\n className={`text-left p-3 rounded-md border transition-colors ${\n active\n ? 'border-accent bg-accent/5'\n : disabled\n ? 'border-surface-border bg-surface-sunken opacity-50 cursor-not-allowed'\n : 'border-surface-border hover:border-text-tertiary cursor-pointer'\n }`}\n >\n <span className={`text-xs font-medium ${active ? 'text-accent' : 'text-text-primary'}`}>\n {m.label}\n </span>\n <span className=\"block text-[10px] text-text-tertiary mt-0.5\">{m.hint}</span>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Name + Description (always shown) */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className={labelCls}>Name</label>\n <input\n type=\"text\"\n value={form.name}\n onChange={(e) => set('name', e.target.value)}\n placeholder=\"e.g., vision-server\"\n className=\"input text-xs w-full\"\n disabled={isBuiltin}\n />\n </div>\n <div>\n <label className={labelCls}>Description</label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"Optional description\"\n className=\"input text-xs w-full\"\n />\n </div>\n </div>\n\n {/* In-Process: read-only info */}\n {form.mode === 'in-process' && (\n <div>\n <p className={hintCls}>\n This server runs in-process via InMemoryTransport. Transport is managed automatically — no configuration needed.\n </p>\n </div>\n )}\n\n {/* Network: URL + transport toggle */}\n {form.mode === 'network' && (\n <>\n <div>\n <label className={labelCls}>Server URL</label>\n <input\n type=\"text\"\n value={form.url}\n onChange={(e) => set('url', e.target.value)}\n placeholder=\"https://mcp-server.example.com/sse\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className={labelCls}>Transport Protocol</label>\n <div className=\"flex gap-2 mt-1\">\n {(['sse', 'streamable-http'] as const).map((t) => (\n <button\n key={t}\n type=\"button\"\n onClick={() => set('transport_type', t)}\n className={`px-3 py-1.5 text-xs rounded-md border transition-colors ${\n form.transport_type === t\n ? 'border-accent bg-accent/5 text-accent font-medium'\n : 'border-surface-border text-text-secondary hover:border-text-tertiary'\n }`}\n >\n {t === 'sse' ? 'SSE' : 'Streamable HTTP'}\n </button>\n ))}\n </div>\n </div>\n </>\n )}\n\n {/* Local Process: command + args + env */}\n {form.mode === 'local-process' && (\n <>\n <div>\n <label className={labelCls}>Command</label>\n <input\n type=\"text\"\n value={form.command}\n onChange={(e) => set('command', e.target.value)}\n placeholder=\"e.g., npx\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className={labelCls}>Arguments (comma-separated)</label>\n <input\n type=\"text\"\n value={form.args}\n onChange={(e) => set('args', e.target.value)}\n placeholder=\"e.g., -y, @modelcontextprotocol/server-filesystem, /tmp\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className={labelCls}>Environment Variables (JSON)</label>\n <textarea\n value={form.env_vars}\n onChange={(e) => set('env_vars', e.target.value)}\n className=\"input font-mono text-[11px] w-full leading-relaxed\"\n rows={3}\n spellCheck={false}\n />\n </div>\n </>\n )}\n\n {/* Auto-connect */}\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={form.auto_connect}\n onChange={(e) => set('auto_connect', e.target.checked)}\n className=\"w-4 h-4 rounded border-border accent-accent\"\n />\n <span className=\"text-xs text-text-primary\">Auto-connect on startup</span>\n </label>\n </div>\n );\n}\n","import { useState, type KeyboardEvent } from 'react';\nimport { X } from 'lucide-react';\nimport { TagInput } from '../../../../components/common/form/TagInput';\nimport type { ServerFormState } from './server-form-types';\nimport { labelCls, hintCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n set: (field: keyof ServerFormState, value: any) => void;\n}\n\nexport function DiscoveryStep({ form, set }: Props) {\n const [cpInput, setCpInput] = useState('');\n\n const addProvider = (raw: string) => {\n const v = raw.trim().toLowerCase();\n if (v && !form.credential_providers.includes(v)) {\n set('credential_providers', [...form.credential_providers, v]);\n }\n setCpInput('');\n };\n\n const removeProvider = (p: string) => {\n set('credential_providers', form.credential_providers.filter((x) => x !== p));\n };\n\n const handleCpKey = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault();\n addProvider(cpInput);\n } else if (e.key === 'Backspace' && !cpInput && form.credential_providers.length > 0) {\n removeProvider(form.credential_providers[form.credential_providers.length - 1]);\n }\n };\n\n return (\n <div className=\"space-y-5\">\n {/* Tags */}\n <div>\n <label className={labelCls}>Tags</label>\n <TagInput\n tags={form.tags}\n onChange={(tags) => set('tags', tags)}\n placeholder=\"Add tag (e.g., database, analytics)...\"\n />\n <p className={hintCls}>\n Tags enable tool discovery. Workflows filter available MCP servers by tags to find relevant tools.\n </p>\n </div>\n\n {/* Compile Hints */}\n <div>\n <label className={labelCls}>Compile Hints</label>\n <textarea\n value={form.compile_hints}\n onChange={(e) => set('compile_hints', e.target.value)}\n placeholder=\"Guidance for the workflow compiler when generating YAML from this server's tools...\"\n className=\"input text-xs w-full leading-relaxed\"\n rows={4}\n spellCheck={false}\n />\n <p className={hintCls}>\n Free-form text that guides the workflow compiler. Describe how tools should be composed, sequenced, or parameterized.\n </p>\n </div>\n\n {/* Credential Providers */}\n <div>\n <label className={labelCls}>Credential Providers</label>\n <div className=\"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\">\n {form.credential_providers.map((p) => (\n <span\n key={p}\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 {p}\n <button\n type=\"button\"\n onClick={() => removeProvider(p)}\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 type=\"text\"\n value={cpInput}\n onChange={(e) => setCpInput(e.target.value)}\n onKeyDown={handleCpKey}\n onBlur={() => { if (cpInput.trim()) addProvider(cpInput); }}\n placeholder={form.credential_providers.length === 0 ? 'Add provider (e.g., github, slack)...' : ''}\n className=\"flex-1 min-w-[80px] bg-transparent text-xs text-text-primary outline-none placeholder:text-text-tertiary\"\n />\n </div>\n <p className={hintCls}>\n IAM credential providers required by this server's tools. Users will be prompted to connect these before tool execution.\n </p>\n </div>\n </div>\n );\n}\n","import { CheckCircle2, XCircle, Loader2 } from 'lucide-react';\nimport { useTestConnection } from '../../../../api/mcp';\nimport type { ServerFormState } from './server-form-types';\nimport { formToPayload } from './server-form-types';\nimport { hintCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n set: (field: keyof ServerFormState, value: any) => void;\n}\n\nexport function TestStep({ form, set }: Props) {\n const test = useTestConnection();\n const isInProcess = form.mode === 'in-process';\n\n const handleTest = () => {\n const payload = formToPayload(form);\n test.mutate(\n { transport_type: payload.transport_type, transport_config: payload.transport_config },\n {\n onSuccess: (result) => {\n if (result.success) {\n set('discovered_tools', result.tools);\n }\n },\n },\n );\n };\n\n const result = test.data;\n const tools = form.discovered_tools ?? result?.tools ?? [];\n\n return (\n <div className=\"space-y-5\">\n {isInProcess ? (\n <div>\n <p className=\"text-sm text-text-secondary\">\n In-process servers connect lazily on first tool call. No connection test needed.\n </p>\n {form.discovered_tools && form.discovered_tools.length > 0 && (\n <div className=\"mt-4\">\n <p className=\"text-xs text-text-tertiary mb-2\">\n {form.discovered_tools.length} tool{form.discovered_tools.length !== 1 ? 's' : ''} cached from last connection\n </p>\n <ToolList tools={form.discovered_tools} />\n </div>\n )}\n </div>\n ) : (\n <>\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={handleTest}\n disabled={test.isPending}\n className=\"btn-primary text-xs\"\n >\n {test.isPending ? (\n <span className=\"flex items-center gap-1.5\">\n <Loader2 className=\"w-3 h-3 animate-spin\" />\n Connecting...\n </span>\n ) : (\n 'Test Connection'\n )}\n </button>\n {result?.success && (\n <span className=\"flex items-center gap-1 text-xs text-status-success\">\n <CheckCircle2 className=\"w-3.5 h-3.5\" />\n Connected — {tools.length} tool{tools.length !== 1 ? 's' : ''} discovered\n </span>\n )}\n {result && !result.success && (\n <span className=\"flex items-center gap-1 text-xs text-status-error\">\n <XCircle className=\"w-3.5 h-3.5\" />\n {result.error || 'Connection failed'}\n </span>\n )}\n </div>\n\n {tools.length > 0 && (\n <div>\n <p className=\"text-xs text-text-tertiary mb-2\">Discovered tools</p>\n <ToolList tools={tools} />\n </div>\n )}\n\n <p className={hintCls}>\n Tests connectivity by connecting to the server and listing available tools. The server must be reachable from this machine.\n </p>\n </>\n )}\n </div>\n );\n}\n\nfunction ToolList({ tools }: { tools: { name: string; description?: string }[] }) {\n return (\n <div className=\"max-h-[280px] overflow-y-auto border border-surface-border rounded-md divide-y divide-surface-border\">\n {tools.map((t) => (\n <div key={t.name} className=\"px-3 py-2\">\n <span className=\"text-xs font-medium text-text-primary font-mono\">{t.name}</span>\n {t.description && (\n <span className=\"block text-[10px] text-text-tertiary mt-0.5 line-clamp-2\">{t.description}</span>\n )}\n </div>\n ))}\n </div>\n );\n}\n","import type { ServerFormState } from './server-form-types';\nimport { labelCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n}\n\nconst modeLabels: Record<string, string> = {\n 'in-process': 'In-Process',\n 'network': 'Network Service',\n 'local-process': 'Local Process',\n};\n\nconst transportLabels: Record<string, string> = {\n stdio: 'stdio',\n sse: 'SSE',\n 'streamable-http': 'Streamable HTTP',\n};\n\nexport function ReviewStep({ form }: Props) {\n const tools = form.discovered_tools ?? [];\n\n return (\n <div className=\"space-y-4\">\n <Row label=\"Name\" value={form.name} />\n {form.description && <Row label=\"Description\" value={form.description} />}\n <Row label=\"Mode\" value={modeLabels[form.mode] ?? form.mode} />\n\n {form.mode === 'network' && (\n <>\n <Row label=\"Transport\" value={transportLabels[form.transport_type] ?? form.transport_type} />\n <Row label=\"URL\" value={form.url} mono />\n </>\n )}\n {form.mode === 'local-process' && (\n <>\n <Row label=\"Command\" value={form.command} mono />\n {form.args && <Row label=\"Args\" value={form.args} mono />}\n </>\n )}\n\n <Row label=\"Auto-connect\" value={form.auto_connect ? 'Yes' : 'No'} />\n\n {form.tags.length > 0 && (\n <div>\n <label className={labelCls}>Tags</label>\n <div className=\"flex flex-wrap gap-1.5 mt-1\">\n {form.tags.map((t) => (\n <span key={t} className=\"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium\">\n {t}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {form.credential_providers.length > 0 && (\n <div>\n <label className={labelCls}>Credential Providers</label>\n <div className=\"flex flex-wrap gap-1.5 mt-1\">\n {form.credential_providers.map((p) => (\n <span key={p} className=\"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium\">\n {p}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {form.compile_hints && <Row label=\"Compile Hints\" value={form.compile_hints} />}\n\n {tools.length > 0 && (\n <Row label=\"Discovered Tools\" value={`${tools.length} tool${tools.length !== 1 ? 's' : ''}`} />\n )}\n </div>\n );\n}\n\nfunction Row({ label, value, mono }: { label: string; value: string; mono?: boolean }) {\n return (\n <div>\n <label className={labelCls}>{label}</label>\n <p className={`text-xs text-text-primary mt-0.5 ${mono ? 'font-mono' : ''}`}>{value}</p>\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useParams, useNavigate, useSearchParams } from 'react-router-dom';\nimport { useMcpServer, useCreateMcpServer, useUpdateMcpServer } from '../../../../api/mcp';\nimport { StepIndicator } from '../../../../components/common/layout/StepIndicator';\nimport { PageHeader } from '../../../../components/common/layout/PageHeader';\nimport {\n EMPTY_FORM,\n serverToForm,\n formToPayload,\n STEP_LABELS,\n isStepValid,\n} from './server-form-types';\nimport type { ServerFormState } from './server-form-types';\nimport { TransportStep } from './TransportStep';\nimport { DiscoveryStep } from './DiscoveryStep';\nimport { TestStep } from './TestStep';\nimport { ReviewStep } from './ReviewStep';\n\nexport function McpServerDetailPage() {\n const { serverId } = useParams<{ serverId: string }>();\n const isNew = !serverId;\n const navigate = useNavigate();\n const { data: existing, isLoading } = useMcpServer(serverId ?? '');\n const createServer = useCreateMcpServer();\n const updateServer = useUpdateMcpServer();\n\n const [form, setForm] = useState<ServerFormState>(EMPTY_FORM);\n const [initialized, setInitialized] = useState(false);\n const [saveError, setSaveError] = useState('');\n\n // Step via URL search param\n const [searchParams, setSearchParams] = useSearchParams();\n const step = parseInt(searchParams.get('step') || '1', 10);\n const setStep = useCallback((s: number) => {\n setSearchParams((prev) => {\n const next = new URLSearchParams(prev);\n next.set('step', String(s));\n return next;\n }, { replace: false });\n }, [setSearchParams]);\n\n // Initialize form from existing record\n useEffect(() => {\n if (initialized) return;\n if (isNew) {\n setForm(EMPTY_FORM);\n setInitialized(true);\n return;\n }\n if (existing) {\n setForm(serverToForm(existing));\n setInitialized(true);\n }\n }, [existing, isNew, initialized]);\n\n const set = (field: keyof ServerFormState, value: any) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n const isBuiltin = !!(existing?.transport_config as any)?.builtin;\n\n // Save\n const handleSave = () => {\n setSaveError('');\n const payload = formToPayload(form);\n\n if (existing) {\n updateServer.mutate(\n { id: existing.id, ...payload },\n { onSuccess: () => navigate('/mcp/servers') },\n );\n } else {\n createServer.mutate(payload, {\n onSuccess: () => navigate('/mcp/servers'),\n onError: (err) => setSaveError(err.message),\n });\n }\n };\n\n if (!isNew && 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-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!isNew && !existing && !isLoading) {\n return <p className=\"text-sm text-text-secondary\">Server not found.</p>;\n }\n\n const isLast = step === STEP_LABELS.length;\n const isPending = createServer.isPending || updateServer.isPending;\n const error = saveError || (createServer.error as Error | null)?.message || (updateServer.error as Error | null)?.message;\n\n return (\n <div>\n <PageHeader title={isNew ? 'Register MCP Server' : existing?.name ?? ''} />\n\n <div className=\"max-w-3xl\">\n <StepIndicator steps={STEP_LABELS} currentStep={step - 1} onStepClick={(i) => setStep(i + 1)} />\n\n <div className=\"min-h-[360px] py-2\">\n {step === 1 && <TransportStep form={form} set={set} isBuiltin={isBuiltin} />}\n {step === 2 && <DiscoveryStep form={form} set={set} />}\n {step === 3 && <TestStep form={form} set={set} />}\n {step === 4 && <ReviewStep form={form} />}\n </div>\n\n {error && (\n <p className=\"text-xs text-status-error mt-4\">{error}</p>\n )}\n\n {/* Navigation */}\n <div className=\"flex justify-between items-center pt-4 border-t border-surface-border mt-4\">\n <div>\n {step > 1 && (\n <button onClick={() => setStep(step - 1)} className=\"btn-secondary text-xs\">\n Back\n </button>\n )}\n </div>\n <div className=\"flex gap-3\">\n <button onClick={() => navigate('/mcp/servers')} className=\"btn-ghost text-xs\">\n Cancel\n </button>\n {isLast ? (\n <button\n onClick={handleSave}\n disabled={!isStepValid(step, form) || isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Saving...' : existing ? 'Save' : 'Register'}\n </button>\n ) : (\n <button\n onClick={() => setStep(step + 1)}\n disabled={!isStepValid(step, form)}\n className=\"btn-primary text-xs\"\n >\n Next\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"names":["EMPTY_FORM","serverToForm","config","isBuiltin","mode","formToPayload","form","transport_config","a","STEP_LABELS","isStepValid","step","labelCls","hintCls","modes","TransportStep","set","jsxDEV","m","active","disabled","e","Fragment","t","DiscoveryStep","cpInput","setCpInput","useState","addProvider","raw","v","removeProvider","p","x","handleCpKey","TagInput","tags","X","TestStep","test","useTestConnection","isInProcess","handleTest","payload","result","tools","ToolList","Loader2","CheckCircle2","XCircle","modeLabels","transportLabels","ReviewStep","Row","label","value","mono","McpServerDetailPage","serverId","useParams","isNew","navigate","useNavigate","existing","isLoading","useMcpServer","createServer","useCreateMcpServer","updateServer","useUpdateMcpServer","setForm","initialized","setInitialized","saveError","setSaveError","searchParams","setSearchParams","useSearchParams","setStep","useCallback","s","prev","next","useEffect","field","f","_a","handleSave","err","isLast","isPending","error","_b","_c","PageHeader","StepIndicator","i"],"mappings":"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"}
1
+ {"version":3,"file":"index-VnYkWW8r.js","sources":["../../src/pages/mcp/servers/detail/server-form-types.ts","../../src/pages/mcp/servers/detail/TransportStep.tsx","../../src/pages/mcp/servers/detail/DiscoveryStep.tsx","../../src/pages/mcp/servers/detail/TestStep.tsx","../../src/pages/mcp/servers/detail/ReviewStep.tsx","../../src/pages/mcp/servers/detail/McpServerDetailPage.tsx"],"sourcesContent":["import type { McpServerRecord, McpToolManifest } from '../../../../api/types';\n\nexport interface ServerFormState {\n name: string;\n description: string;\n mode: 'in-process' | 'network' | 'local-process';\n transport_type: 'stdio' | 'sse' | 'streamable-http';\n // stdio fields\n command: string;\n args: string;\n env_vars: string;\n // network fields\n url: string;\n // shared\n auto_connect: boolean;\n tags: string[];\n compile_hints: string;\n credential_providers: string[];\n discovered_tools: McpToolManifest[] | null;\n}\n\nexport const EMPTY_FORM: ServerFormState = {\n name: '',\n description: '',\n mode: 'network',\n transport_type: 'sse',\n command: '',\n args: '',\n env_vars: '{}',\n url: '',\n auto_connect: false,\n tags: [],\n compile_hints: '',\n credential_providers: [],\n discovered_tools: null,\n};\n\nexport function serverToForm(s: McpServerRecord): ServerFormState {\n const config = s.transport_config ?? {};\n const isBuiltin = !!(config as any).builtin;\n\n let mode: ServerFormState['mode'] = 'network';\n if (isBuiltin) mode = 'in-process';\n else if (s.transport_type === 'stdio') mode = 'local-process';\n\n return {\n name: s.name,\n description: s.description ?? '',\n mode,\n transport_type: s.transport_type,\n command: (config as any).command ?? '',\n args: ((config as any).args ?? []).join(', '),\n env_vars: (config as any).env ? JSON.stringify((config as any).env, null, 2) : '{}',\n url: (config as any).url ?? '',\n auto_connect: s.auto_connect,\n tags: s.tags ?? [],\n compile_hints: (s as any).compile_hints ?? '',\n credential_providers: s.credential_providers ?? [],\n discovered_tools: s.tool_manifest ?? null,\n };\n}\n\nexport function formToPayload(form: ServerFormState) {\n let transport_config: Record<string, unknown> = {};\n\n if (form.mode === 'local-process') {\n transport_config = {\n command: form.command.trim(),\n args: form.args.split(',').map((a) => a.trim()).filter(Boolean),\n env: form.env_vars.trim() ? JSON.parse(form.env_vars) : undefined,\n };\n } else if (form.mode === 'network') {\n transport_config = { url: form.url.trim() };\n }\n // in-process: transport_config stays empty (server manages it)\n\n return {\n name: form.name.trim(),\n description: form.description.trim() || undefined,\n transport_type: form.mode === 'local-process' ? 'stdio' as const : form.transport_type,\n transport_config,\n auto_connect: form.auto_connect,\n tags: form.tags,\n compile_hints: form.compile_hints.trim() || undefined,\n credential_providers: form.credential_providers.length > 0 ? form.credential_providers : undefined,\n };\n}\n\nexport const STEP_LABELS = ['Transport', 'Discovery', 'Test', 'Review'];\n\nexport function isStepValid(step: number, form: ServerFormState): boolean {\n if (step === 1) {\n if (!form.name.trim()) return false;\n if (form.mode === 'network' && !form.url.trim()) return false;\n if (form.mode === 'local-process' && !form.command.trim()) return false;\n return true;\n }\n return true;\n}\n\nexport const labelCls = 'block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1';\nexport const hintCls = 'text-[10px] text-text-tertiary mt-2 leading-relaxed';\n","import type { ServerFormState } from './server-form-types';\nimport { labelCls, hintCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n set: (field: keyof ServerFormState, value: any) => void;\n isBuiltin: boolean;\n}\n\nconst modes = [\n { value: 'in-process', label: 'In-Process', hint: 'Built-in server running inside the app' },\n { value: 'network', label: 'Network Service', hint: 'Remote server via SSE or Streamable HTTP' },\n { value: 'local-process', label: 'Local Process', hint: 'Spawn a local command via stdio' },\n] as const;\n\nexport function TransportStep({ form, set, isBuiltin }: Props) {\n return (\n <div className=\"space-y-5\">\n {/* Mode selector */}\n <div>\n <label className={labelCls}>Connection Mode</label>\n <div className=\"grid grid-cols-3 gap-3 mt-1\">\n {modes.map((m) => {\n const active = form.mode === m.value;\n const disabled = isBuiltin && m.value !== 'in-process';\n return (\n <button\n key={m.value}\n type=\"button\"\n disabled={disabled}\n onClick={() => {\n set('mode', m.value);\n if (m.value === 'local-process') set('transport_type', 'stdio');\n if (m.value === 'network') set('transport_type', 'sse');\n }}\n className={`text-left p-3 rounded-md border transition-colors ${\n active\n ? 'border-accent bg-accent/5'\n : disabled\n ? 'border-surface-border bg-surface-sunken opacity-50 cursor-not-allowed'\n : 'border-surface-border hover:border-text-tertiary cursor-pointer'\n }`}\n >\n <span className={`text-xs font-medium ${active ? 'text-accent' : 'text-text-primary'}`}>\n {m.label}\n </span>\n <span className=\"block text-[10px] text-text-tertiary mt-0.5\">{m.hint}</span>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Name + Description (always shown) */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className={labelCls}>Name</label>\n <input\n type=\"text\"\n value={form.name}\n onChange={(e) => set('name', e.target.value)}\n placeholder=\"e.g., vision-server\"\n className=\"input text-xs w-full\"\n disabled={isBuiltin}\n />\n </div>\n <div>\n <label className={labelCls}>Description</label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"Optional description\"\n className=\"input text-xs w-full\"\n />\n </div>\n </div>\n\n {/* In-Process: read-only info */}\n {form.mode === 'in-process' && (\n <div>\n <p className={hintCls}>\n This server runs in-process via InMemoryTransport. Transport is managed automatically — no configuration needed.\n </p>\n </div>\n )}\n\n {/* Network: URL + transport toggle */}\n {form.mode === 'network' && (\n <>\n <div>\n <label className={labelCls}>Server URL</label>\n <input\n type=\"text\"\n value={form.url}\n onChange={(e) => set('url', e.target.value)}\n placeholder=\"https://mcp-server.example.com/sse\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className={labelCls}>Transport Protocol</label>\n <div className=\"flex gap-2 mt-1\">\n {(['sse', 'streamable-http'] as const).map((t) => (\n <button\n key={t}\n type=\"button\"\n onClick={() => set('transport_type', t)}\n className={`px-3 py-1.5 text-xs rounded-md border transition-colors ${\n form.transport_type === t\n ? 'border-accent bg-accent/5 text-accent font-medium'\n : 'border-surface-border text-text-secondary hover:border-text-tertiary'\n }`}\n >\n {t === 'sse' ? 'SSE' : 'Streamable HTTP'}\n </button>\n ))}\n </div>\n </div>\n </>\n )}\n\n {/* Local Process: command + args + env */}\n {form.mode === 'local-process' && (\n <>\n <div>\n <label className={labelCls}>Command</label>\n <input\n type=\"text\"\n value={form.command}\n onChange={(e) => set('command', e.target.value)}\n placeholder=\"e.g., npx\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className={labelCls}>Arguments (comma-separated)</label>\n <input\n type=\"text\"\n value={form.args}\n onChange={(e) => set('args', e.target.value)}\n placeholder=\"e.g., -y, @modelcontextprotocol/server-filesystem, /tmp\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className={labelCls}>Environment Variables (JSON)</label>\n <textarea\n value={form.env_vars}\n onChange={(e) => set('env_vars', e.target.value)}\n className=\"input font-mono text-[11px] w-full leading-relaxed\"\n rows={3}\n spellCheck={false}\n />\n </div>\n </>\n )}\n\n {/* Auto-connect */}\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={form.auto_connect}\n onChange={(e) => set('auto_connect', e.target.checked)}\n className=\"w-4 h-4 rounded border-border accent-accent\"\n />\n <span className=\"text-xs text-text-primary\">Auto-connect on startup</span>\n </label>\n </div>\n );\n}\n","import { useState, type KeyboardEvent } from 'react';\nimport { X } from 'lucide-react';\nimport { TagInput } from '../../../../components/common/form/TagInput';\nimport type { ServerFormState } from './server-form-types';\nimport { labelCls, hintCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n set: (field: keyof ServerFormState, value: any) => void;\n}\n\nexport function DiscoveryStep({ form, set }: Props) {\n const [cpInput, setCpInput] = useState('');\n\n const addProvider = (raw: string) => {\n const v = raw.trim().toLowerCase();\n if (v && !form.credential_providers.includes(v)) {\n set('credential_providers', [...form.credential_providers, v]);\n }\n setCpInput('');\n };\n\n const removeProvider = (p: string) => {\n set('credential_providers', form.credential_providers.filter((x) => x !== p));\n };\n\n const handleCpKey = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault();\n addProvider(cpInput);\n } else if (e.key === 'Backspace' && !cpInput && form.credential_providers.length > 0) {\n removeProvider(form.credential_providers[form.credential_providers.length - 1]);\n }\n };\n\n return (\n <div className=\"space-y-5\">\n {/* Tags */}\n <div>\n <label className={labelCls}>Tags</label>\n <TagInput\n tags={form.tags}\n onChange={(tags) => set('tags', tags)}\n placeholder=\"Add tag (e.g., database, analytics)...\"\n />\n <p className={hintCls}>\n Tags enable tool discovery. Workflows filter available MCP servers by tags to find relevant tools.\n </p>\n </div>\n\n {/* Compile Hints */}\n <div>\n <label className={labelCls}>Compile Hints</label>\n <textarea\n value={form.compile_hints}\n onChange={(e) => set('compile_hints', e.target.value)}\n placeholder=\"Guidance for the workflow compiler when generating YAML from this server's tools...\"\n className=\"input text-xs w-full leading-relaxed\"\n rows={4}\n spellCheck={false}\n />\n <p className={hintCls}>\n Free-form text that guides the workflow compiler. Describe how tools should be composed, sequenced, or parameterized.\n </p>\n </div>\n\n {/* Credential Providers */}\n <div>\n <label className={labelCls}>Credential Providers</label>\n <div className=\"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\">\n {form.credential_providers.map((p) => (\n <span\n key={p}\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 {p}\n <button\n type=\"button\"\n onClick={() => removeProvider(p)}\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 type=\"text\"\n value={cpInput}\n onChange={(e) => setCpInput(e.target.value)}\n onKeyDown={handleCpKey}\n onBlur={() => { if (cpInput.trim()) addProvider(cpInput); }}\n placeholder={form.credential_providers.length === 0 ? 'Add provider (e.g., github, slack)...' : ''}\n className=\"flex-1 min-w-[80px] bg-transparent text-xs text-text-primary outline-none placeholder:text-text-tertiary\"\n />\n </div>\n <p className={hintCls}>\n IAM credential providers required by this server's tools. Users will be prompted to connect these before tool execution.\n </p>\n </div>\n </div>\n );\n}\n","import { CheckCircle2, XCircle, Loader2 } from 'lucide-react';\nimport { useTestConnection } from '../../../../api/mcp';\nimport type { ServerFormState } from './server-form-types';\nimport { formToPayload } from './server-form-types';\nimport { hintCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n set: (field: keyof ServerFormState, value: any) => void;\n}\n\nexport function TestStep({ form, set }: Props) {\n const test = useTestConnection();\n const isInProcess = form.mode === 'in-process';\n\n const handleTest = () => {\n const payload = formToPayload(form);\n test.mutate(\n { transport_type: payload.transport_type, transport_config: payload.transport_config },\n {\n onSuccess: (result) => {\n if (result.success) {\n set('discovered_tools', result.tools);\n }\n },\n },\n );\n };\n\n const result = test.data;\n const tools = form.discovered_tools ?? result?.tools ?? [];\n\n return (\n <div className=\"space-y-5\">\n {isInProcess ? (\n <div>\n <p className=\"text-sm text-text-secondary\">\n In-process servers connect lazily on first tool call. No connection test needed.\n </p>\n {form.discovered_tools && form.discovered_tools.length > 0 && (\n <div className=\"mt-4\">\n <p className=\"text-xs text-text-tertiary mb-2\">\n {form.discovered_tools.length} tool{form.discovered_tools.length !== 1 ? 's' : ''} cached from last connection\n </p>\n <ToolList tools={form.discovered_tools} />\n </div>\n )}\n </div>\n ) : (\n <>\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={handleTest}\n disabled={test.isPending}\n className=\"btn-primary text-xs\"\n >\n {test.isPending ? (\n <span className=\"flex items-center gap-1.5\">\n <Loader2 className=\"w-3 h-3 animate-spin\" />\n Connecting...\n </span>\n ) : (\n 'Test Connection'\n )}\n </button>\n {result?.success && (\n <span className=\"flex items-center gap-1 text-xs text-status-success\">\n <CheckCircle2 className=\"w-3.5 h-3.5\" />\n Connected — {tools.length} tool{tools.length !== 1 ? 's' : ''} discovered\n </span>\n )}\n {result && !result.success && (\n <span className=\"flex items-center gap-1 text-xs text-status-error\">\n <XCircle className=\"w-3.5 h-3.5\" />\n {result.error || 'Connection failed'}\n </span>\n )}\n </div>\n\n {tools.length > 0 && (\n <div>\n <p className=\"text-xs text-text-tertiary mb-2\">Discovered tools</p>\n <ToolList tools={tools} />\n </div>\n )}\n\n <p className={hintCls}>\n Tests connectivity by connecting to the server and listing available tools. The server must be reachable from this machine.\n </p>\n </>\n )}\n </div>\n );\n}\n\nfunction ToolList({ tools }: { tools: { name: string; description?: string }[] }) {\n return (\n <div className=\"max-h-[280px] overflow-y-auto border border-surface-border rounded-md divide-y divide-surface-border\">\n {tools.map((t) => (\n <div key={t.name} className=\"px-3 py-2\">\n <span className=\"text-xs font-medium text-text-primary font-mono\">{t.name}</span>\n {t.description && (\n <span className=\"block text-[10px] text-text-tertiary mt-0.5 line-clamp-2\">{t.description}</span>\n )}\n </div>\n ))}\n </div>\n );\n}\n","import type { ServerFormState } from './server-form-types';\nimport { labelCls } from './server-form-types';\n\ninterface Props {\n form: ServerFormState;\n}\n\nconst modeLabels: Record<string, string> = {\n 'in-process': 'In-Process',\n 'network': 'Network Service',\n 'local-process': 'Local Process',\n};\n\nconst transportLabels: Record<string, string> = {\n stdio: 'stdio',\n sse: 'SSE',\n 'streamable-http': 'Streamable HTTP',\n};\n\nexport function ReviewStep({ form }: Props) {\n const tools = form.discovered_tools ?? [];\n\n return (\n <div className=\"space-y-4\">\n <Row label=\"Name\" value={form.name} />\n {form.description && <Row label=\"Description\" value={form.description} />}\n <Row label=\"Mode\" value={modeLabels[form.mode] ?? form.mode} />\n\n {form.mode === 'network' && (\n <>\n <Row label=\"Transport\" value={transportLabels[form.transport_type] ?? form.transport_type} />\n <Row label=\"URL\" value={form.url} mono />\n </>\n )}\n {form.mode === 'local-process' && (\n <>\n <Row label=\"Command\" value={form.command} mono />\n {form.args && <Row label=\"Args\" value={form.args} mono />}\n </>\n )}\n\n <Row label=\"Auto-connect\" value={form.auto_connect ? 'Yes' : 'No'} />\n\n {form.tags.length > 0 && (\n <div>\n <label className={labelCls}>Tags</label>\n <div className=\"flex flex-wrap gap-1.5 mt-1\">\n {form.tags.map((t) => (\n <span key={t} className=\"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium\">\n {t}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {form.credential_providers.length > 0 && (\n <div>\n <label className={labelCls}>Credential Providers</label>\n <div className=\"flex flex-wrap gap-1.5 mt-1\">\n {form.credential_providers.map((p) => (\n <span key={p} className=\"px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium\">\n {p}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {form.compile_hints && <Row label=\"Compile Hints\" value={form.compile_hints} />}\n\n {tools.length > 0 && (\n <Row label=\"Discovered Tools\" value={`${tools.length} tool${tools.length !== 1 ? 's' : ''}`} />\n )}\n </div>\n );\n}\n\nfunction Row({ label, value, mono }: { label: string; value: string; mono?: boolean }) {\n return (\n <div>\n <label className={labelCls}>{label}</label>\n <p className={`text-xs text-text-primary mt-0.5 ${mono ? 'font-mono' : ''}`}>{value}</p>\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { useParams, useNavigate, useSearchParams } from 'react-router-dom';\nimport { useMcpServer, useCreateMcpServer, useUpdateMcpServer } from '../../../../api/mcp';\nimport { StepIndicator } from '../../../../components/common/layout/StepIndicator';\nimport { PageHeader } from '../../../../components/common/layout/PageHeader';\nimport {\n EMPTY_FORM,\n serverToForm,\n formToPayload,\n STEP_LABELS,\n isStepValid,\n} from './server-form-types';\nimport type { ServerFormState } from './server-form-types';\nimport { TransportStep } from './TransportStep';\nimport { DiscoveryStep } from './DiscoveryStep';\nimport { TestStep } from './TestStep';\nimport { ReviewStep } from './ReviewStep';\n\nexport function McpServerDetailPage() {\n const { serverId } = useParams<{ serverId: string }>();\n const isNew = !serverId;\n const navigate = useNavigate();\n const { data: existing, isLoading } = useMcpServer(serverId ?? '');\n const createServer = useCreateMcpServer();\n const updateServer = useUpdateMcpServer();\n\n const [form, setForm] = useState<ServerFormState>(EMPTY_FORM);\n const [initialized, setInitialized] = useState(false);\n const [saveError, setSaveError] = useState('');\n\n // Step via URL search param\n const [searchParams, setSearchParams] = useSearchParams();\n const step = parseInt(searchParams.get('step') || '1', 10);\n const setStep = useCallback((s: number) => {\n setSearchParams((prev) => {\n const next = new URLSearchParams(prev);\n next.set('step', String(s));\n return next;\n }, { replace: false });\n }, [setSearchParams]);\n\n // Initialize form from existing record\n useEffect(() => {\n if (initialized) return;\n if (isNew) {\n setForm(EMPTY_FORM);\n setInitialized(true);\n return;\n }\n if (existing) {\n setForm(serverToForm(existing));\n setInitialized(true);\n }\n }, [existing, isNew, initialized]);\n\n const set = (field: keyof ServerFormState, value: any) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n const isBuiltin = !!(existing?.transport_config as any)?.builtin;\n\n // Save\n const handleSave = () => {\n setSaveError('');\n const payload = formToPayload(form);\n\n if (existing) {\n updateServer.mutate(\n { id: existing.id, ...payload },\n { onSuccess: () => navigate('/mcp/servers') },\n );\n } else {\n createServer.mutate(payload, {\n onSuccess: () => navigate('/mcp/servers'),\n onError: (err) => setSaveError(err.message),\n });\n }\n };\n\n if (!isNew && 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-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!isNew && !existing && !isLoading) {\n return <p className=\"text-sm text-text-secondary\">Server not found.</p>;\n }\n\n const isLast = step === STEP_LABELS.length;\n const isPending = createServer.isPending || updateServer.isPending;\n const error = saveError || (createServer.error as Error | null)?.message || (updateServer.error as Error | null)?.message;\n\n return (\n <div>\n <PageHeader title={isNew ? 'Register MCP Server' : existing?.name ?? ''} />\n\n <div className=\"max-w-3xl\">\n <StepIndicator steps={STEP_LABELS} currentStep={step - 1} onStepClick={(i) => setStep(i + 1)} />\n\n <div className=\"min-h-[360px] py-2\">\n {step === 1 && <TransportStep form={form} set={set} isBuiltin={isBuiltin} />}\n {step === 2 && <DiscoveryStep form={form} set={set} />}\n {step === 3 && <TestStep form={form} set={set} />}\n {step === 4 && <ReviewStep form={form} />}\n </div>\n\n {error && (\n <p className=\"text-xs text-status-error mt-4\">{error}</p>\n )}\n\n {/* Navigation */}\n <div className=\"flex justify-between items-center pt-4 border-t border-surface-border mt-4\">\n <div>\n {step > 1 && (\n <button onClick={() => setStep(step - 1)} className=\"btn-secondary text-xs\">\n Back\n </button>\n )}\n </div>\n <div className=\"flex gap-3\">\n <button onClick={() => navigate('/mcp/servers')} className=\"btn-ghost text-xs\">\n Cancel\n </button>\n {isLast ? (\n <button\n onClick={handleSave}\n disabled={!isStepValid(step, form) || isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Saving...' : existing ? 'Save' : 'Register'}\n </button>\n ) : (\n <button\n onClick={() => setStep(step + 1)}\n disabled={!isStepValid(step, form)}\n className=\"btn-primary text-xs\"\n >\n Next\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"names":["EMPTY_FORM","serverToForm","config","isBuiltin","mode","formToPayload","form","transport_config","a","STEP_LABELS","isStepValid","step","labelCls","hintCls","modes","TransportStep","set","jsxDEV","m","active","disabled","e","Fragment","t","DiscoveryStep","cpInput","setCpInput","useState","addProvider","raw","v","removeProvider","p","x","handleCpKey","TagInput","tags","X","TestStep","test","useTestConnection","isInProcess","handleTest","payload","result","tools","ToolList","Loader2","CheckCircle2","XCircle","modeLabels","transportLabels","ReviewStep","Row","label","value","mono","McpServerDetailPage","serverId","useParams","isNew","navigate","useNavigate","existing","isLoading","useMcpServer","createServer","useCreateMcpServer","updateServer","useUpdateMcpServer","setForm","initialized","setInitialized","saveError","setSaveError","searchParams","setSearchParams","useSearchParams","setStep","useCallback","s","prev","next","useEffect","field","f","_a","handleSave","err","isLast","isPending","error","_b","_c","PageHeader","StepIndicator","i"],"mappings":"6ZAqBO,MAAMA,EAA8B,CACzC,KAAM,GACN,YAAa,GACb,KAAM,UACN,eAAgB,MAChB,QAAS,GACT,KAAM,GACN,SAAU,KACV,IAAK,GACL,aAAc,GACd,KAAM,CAAA,EACN,cAAe,GACf,qBAAsB,CAAA,EACtB,iBAAkB,IACpB,EAEO,SAASC,EAAa,EAAqC,CAChE,MAAMC,EAAS,EAAE,kBAAoB,CAAA,EAC/BC,EAAY,CAAC,CAAED,EAAe,QAEpC,IAAIE,EAAgC,UACpC,OAAID,EAAWC,EAAO,aACb,EAAE,iBAAmB,UAASA,EAAO,iBAEvC,CACL,KAAM,EAAE,KACR,YAAa,EAAE,aAAe,GAC9B,KAAAA,EACA,eAAgB,EAAE,eAClB,QAAUF,EAAe,SAAW,GACpC,MAAQA,EAAe,MAAQ,CAAA,GAAI,KAAK,IAAI,EAC5C,SAAWA,EAAe,IAAM,KAAK,UAAWA,EAAe,IAAK,KAAM,CAAC,EAAI,KAC/E,IAAMA,EAAe,KAAO,GAC5B,aAAc,EAAE,aAChB,KAAM,EAAE,MAAQ,CAAA,EAChB,cAAgB,EAAU,eAAiB,GAC3C,qBAAsB,EAAE,sBAAwB,CAAA,EAChD,iBAAkB,EAAE,eAAiB,IAAA,CAEzC,CAEO,SAASG,EAAcC,EAAuB,CACnD,IAAIC,EAA4C,CAAA,EAEhD,OAAID,EAAK,OAAS,gBAChBC,EAAmB,CACjB,QAASD,EAAK,QAAQ,KAAA,EACtB,KAAMA,EAAK,KAAK,MAAM,GAAG,EAAE,IAAKE,GAAMA,EAAE,KAAA,CAAM,EAAE,OAAO,OAAO,EAC9D,IAAKF,EAAK,SAAS,KAAA,EAAS,KAAK,MAAMA,EAAK,QAAQ,EAAI,MAAA,EAEjDA,EAAK,OAAS,YACvBC,EAAmB,CAAE,IAAKD,EAAK,IAAI,MAAK,GAInC,CACL,KAAMA,EAAK,KAAK,KAAA,EAChB,YAAaA,EAAK,YAAY,KAAA,GAAU,OACxC,eAAgBA,EAAK,OAAS,gBAAkB,QAAmBA,EAAK,eACxE,iBAAAC,EACA,aAAcD,EAAK,aACnB,KAAMA,EAAK,KACX,cAAeA,EAAK,cAAc,KAAA,GAAU,OAC5C,qBAAsBA,EAAK,qBAAqB,OAAS,EAAIA,EAAK,qBAAuB,MAAA,CAE7F,CAEO,MAAMG,EAAc,CAAC,YAAa,YAAa,OAAQ,QAAQ,EAE/D,SAASC,EAAYC,EAAcL,EAAgC,CACxE,OAAIK,IAAS,EACP,GAACL,EAAK,KAAK,KAAA,GACXA,EAAK,OAAS,WAAa,CAACA,EAAK,IAAI,KAAA,GACrCA,EAAK,OAAS,iBAAmB,CAACA,EAAK,QAAQ,KAAA,GAG9C,EACT,CAEO,MAAMM,EAAW,oFACXC,EAAU,sDC5FjBC,GAAQ,CACZ,CAAE,MAAO,aAAc,MAAO,aAAc,KAAM,wCAAA,EAClD,CAAE,MAAO,UAAW,MAAO,kBAAmB,KAAM,0CAAA,EACpD,CAAE,MAAO,gBAAiB,MAAO,gBAAiB,KAAM,iCAAA,CAC1D,EAEO,SAASC,GAAc,CAAE,KAAAT,EAAM,IAAAU,EAAK,UAAAb,GAAoB,CAC7D,OACEc,EAAAA,OAAC,MAAA,CAAI,UAAU,YAEb,SAAA,CAAAA,SAAC,MAAA,CACC,SAAA,CAAAA,SAAC,QAAA,CAAM,UAAWL,EAAU,SAAA,iBAAA,EAA5B,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA2C,WAC1C,MAAA,CAAI,UAAU,8BACZ,SAAAE,GAAM,IAAKI,GAAM,CAChB,MAAMC,EAASb,EAAK,OAASY,EAAE,MACzBE,EAAWjB,GAAae,EAAE,QAAU,aAC1C,OACED,EAAAA,OAAC,SAAA,CAEC,KAAK,SACL,SAAAG,EACA,QAAS,IAAM,CACbJ,EAAI,OAAQE,EAAE,KAAK,EACfA,EAAE,QAAU,iBAAiBF,EAAI,iBAAkB,OAAO,EAC1DE,EAAE,QAAU,WAAWF,EAAI,iBAAkB,KAAK,CACxD,EACA,UAAW,qDACTG,EACI,4BACAC,EACE,wEACA,iEACR,GAEA,SAAA,CAAAH,EAAAA,OAAC,OAAA,CAAK,UAAW,uBAAuBE,EAAS,cAAgB,mBAAmB,GACjF,WAAE,KAAA,EADL,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,EACAF,SAAC,OAAA,CAAK,UAAU,8CAA+C,WAAE,IAAA,EAAjE,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAsE,CAAA,CAAA,EAnBjEC,EAAE,MADT,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAuBJ,CAAC,CAAA,EA5BH,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IA6BA,CAAA,CAAA,EA/BF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAgCA,EAGAD,EAAAA,OAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAAA,SAAC,MAAA,CACC,SAAA,CAAAA,SAAC,QAAA,CAAM,UAAWL,EAAU,SAAA,MAAA,EAA5B,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAgC,EAChCK,EAAAA,OAAC,QAAA,CACC,KAAK,OACL,MAAOX,EAAK,KACZ,SAAWe,GAAML,EAAI,OAAQK,EAAE,OAAO,KAAK,EAC3C,YAAY,sBACZ,UAAU,uBACV,SAAUlB,CAAA,EANZ,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAOA,CAAA,EATF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAUA,WACC,MAAA,CACC,SAAA,CAAAc,SAAC,QAAA,CAAM,UAAWL,EAAU,SAAA,aAAA,EAA5B,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAuC,EACvCK,EAAAA,OAAC,QAAA,CACC,KAAK,OACL,MAAOX,EAAK,YACZ,SAAWe,GAAML,EAAI,cAAeK,EAAE,OAAO,KAAK,EAClD,YAAY,uBACZ,UAAU,sBAAA,EALZ,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EARF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IASA,CAAA,CAAA,EArBF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAsBA,EAGCf,EAAK,OAAS,cACbW,EAAAA,OAAC,OACC,SAAAA,EAAAA,OAAC,IAAA,CAAE,UAAWJ,EAAS,SAAA,kHAAA,EAAvB,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CAAA,EAHF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAIA,EAIDP,EAAK,OAAS,WACbW,EAAAA,OAAAK,EAAAA,SAAA,CACE,SAAA,CAAAL,SAAC,MAAA,CACC,SAAA,CAAAA,SAAC,QAAA,CAAM,UAAWL,EAAU,SAAA,YAAA,EAA5B,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAsC,EACtCK,EAAAA,OAAC,QAAA,CACC,KAAK,OACL,MAAOX,EAAK,IACZ,SAAWe,GAAML,EAAI,MAAOK,EAAE,OAAO,KAAK,EAC1C,YAAY,qCACZ,UAAU,gCAAA,EALZ,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EARF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IASA,WACC,MAAA,CACC,SAAA,CAAAJ,SAAC,QAAA,CAAM,UAAWL,EAAU,SAAA,oBAAA,EAA5B,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAA8C,EAC9CK,EAAAA,OAAC,MAAA,CAAI,UAAU,kBACX,SAAA,CAAC,MAAO,iBAAiB,EAAY,IAAKM,GAC1CN,EAAAA,OAAC,SAAA,CAEC,KAAK,SACL,QAAS,IAAMD,EAAI,iBAAkBO,CAAC,EACtC,UAAW,2DACTjB,EAAK,iBAAmBiB,EACpB,oDACA,sEACN,GAEC,SAAAA,IAAM,MAAQ,MAAQ,iBAAA,EATlBA,EADP,GAAA,CAAA,SAAA,gEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,CAYD,CAAA,EAdH,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAeA,CAAA,CAAA,EAjBF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAkBA,CAAA,CAAA,EA7BF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IA8BA,EAIDjB,EAAK,OAAS,iBACbW,EAAAA,OAAAK,EAAAA,SAAA,CACE,SAAA,CAAAL,SAAC,MAAA,CACC,SAAA,CAAAA,SAAC,QAAA,CAAM,UAAWL,EAAU,SAAA,SAAA,EAA5B,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAmC,EACnCK,EAAAA,OAAC,QAAA,CACC,KAAK,OACL,MAAOX,EAAK,QACZ,SAAWe,GAAML,EAAI,UAAWK,EAAE,OAAO,KAAK,EAC9C,YAAY,YACZ,UAAU,gCAAA,EALZ,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EARF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IASA,WACC,MAAA,CACC,SAAA,CAAAJ,SAAC,QAAA,CAAM,UAAWL,EAAU,SAAA,6BAAA,EAA5B,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAuD,EACvDK,EAAAA,OAAC,QAAA,CACC,KAAK,OACL,MAAOX,EAAK,KACZ,SAAWe,GAAML,EAAI,OAAQK,EAAE,OAAO,KAAK,EAC3C,YAAY,0DACZ,UAAU,gCAAA,EALZ,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EARF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IASA,WACC,MAAA,CACC,SAAA,CAAAJ,SAAC,QAAA,CAAM,UAAWL,EAAU,SAAA,8BAAA,EAA5B,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAwD,EACxDK,EAAAA,OAAC,WAAA,CACC,MAAOX,EAAK,SACZ,SAAWe,GAAML,EAAI,WAAYK,EAAE,OAAO,KAAK,EAC/C,UAAU,qDACV,KAAM,EACN,WAAY,EAAA,EALd,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EARF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IASA,CAAA,CAAA,EA9BF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IA+BA,EAIFJ,EAAAA,OAAC,QAAA,CAAM,UAAU,yCACf,SAAA,CAAAA,EAAAA,OAAC,QAAA,CACC,KAAK,WACL,QAASX,EAAK,aACd,SAAWe,GAAML,EAAI,eAAgBK,EAAE,OAAO,OAAO,EACrD,UAAU,6CAAA,EAJZ,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAAA,EAMAJ,SAAC,OAAA,CAAK,UAAU,4BAA4B,SAAA,yBAAA,EAA5C,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAAmE,CAAA,CAAA,EAPrE,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAQA,CAAA,CAAA,EAtJF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAuJA,CAEJ,CC/JO,SAASO,GAAc,CAAE,KAAAlB,EAAM,IAAAU,GAAc,CAClD,KAAM,CAACS,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAE,EAEnCC,EAAeC,GAAgB,CACnC,MAAMC,EAAID,EAAI,KAAA,EAAO,YAAA,EACjBC,GAAK,CAACxB,EAAK,qBAAqB,SAASwB,CAAC,GAC5Cd,EAAI,uBAAwB,CAAC,GAAGV,EAAK,qBAAsBwB,CAAC,CAAC,EAE/DJ,EAAW,EAAE,CACf,EAEMK,EAAkBC,GAAc,CACpChB,EAAI,uBAAwBV,EAAK,qBAAqB,OAAQ2B,GAAMA,IAAMD,CAAC,CAAC,CAC9E,EAEME,EAAeb,GAAuC,CACtDA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,KACjCA,EAAE,eAAA,EACFO,EAAYH,CAAO,GACVJ,EAAE,MAAQ,aAAe,CAACI,GAAWnB,EAAK,qBAAqB,OAAS,GACjFyB,EAAezB,EAAK,qBAAqBA,EAAK,qBAAqB,OAAS,CAAC,CAAC,CAElF,EAEA,OACEW,EAAAA,OAAC,MAAA,CAAI,UAAU,YAEb,SAAA,CAAAA,SAAC,MAAA,CACC,SAAA,CAAAA,SAAC,QAAA,CAAM,UAAWL,EAAU,SAAA,MAAA,EAA5B,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAgC,EAChCK,EAAAA,OAACkB,EAAA,CACC,KAAM7B,EAAK,KACX,SAAW8B,GAASpB,EAAI,OAAQoB,CAAI,EACpC,YAAY,wCAAA,EAHd,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,EAKAnB,SAAC,IAAA,CAAE,UAAWJ,EAAS,SAAA,oGAAA,EAAvB,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAAA,CAAA,EATF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAUA,WAGC,MAAA,CACC,SAAA,CAAAI,SAAC,QAAA,CAAM,UAAWL,EAAU,SAAA,eAAA,EAA5B,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAyC,EACzCK,EAAAA,OAAC,WAAA,CACC,MAAOX,EAAK,cACZ,SAAWe,GAAML,EAAI,gBAAiBK,EAAE,OAAO,KAAK,EACpD,YAAY,sFACZ,UAAU,uCACV,KAAM,EACN,WAAY,EAAA,EANd,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,EAQAJ,SAAC,IAAA,CAAE,UAAWJ,EAAS,SAAA,uHAAA,EAAvB,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAAA,CAAA,EAZF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAaA,WAGC,MAAA,CACC,SAAA,CAAAI,SAAC,QAAA,CAAM,UAAWL,EAAU,SAAA,sBAAA,EAA5B,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAgD,EAChDK,EAAAA,OAAC,MAAA,CAAI,UAAU,iKACZ,SAAA,CAAAX,EAAK,qBAAqB,IAAK0B,GAC9Bf,EAAAA,OAAC,OAAA,CAEC,UAAU,2GAET,SAAA,CAAAe,EACDf,EAAAA,OAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAMc,EAAeC,CAAC,EAC/B,UAAU,4CAEV,SAAAf,EAAAA,OAACoB,EAAA,CAAE,UAAU,aAAA,EAAb,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA2B,CAAA,EAL7B,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAVKL,EADP,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAaD,EACDf,EAAAA,OAAC,QAAA,CACC,KAAK,OACL,MAAOQ,EACP,SAAWJ,GAAMK,EAAWL,EAAE,OAAO,KAAK,EAC1C,UAAWa,EACX,OAAQ,IAAM,CAAMT,EAAQ,QAAQG,EAAYH,CAAO,CAAG,EAC1D,YAAanB,EAAK,qBAAqB,SAAW,EAAI,wCAA0C,GAChG,UAAU,0GAAA,EAPZ,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAQA,CAAA,EAxBF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAyBA,EACAW,SAAC,IAAA,CAAE,UAAWJ,EAAS,SAAA,0HAAA,EAAvB,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAAA,CAAA,EA9BF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IA+BA,CAAA,CAAA,EA9DF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IA+DA,CAEJ,CC1FO,SAASyB,GAAS,CAAE,KAAAhC,EAAM,IAAAU,GAAc,CAC7C,MAAMuB,EAAOC,EAAA,EACPC,EAAcnC,EAAK,OAAS,aAE5BoC,EAAa,IAAM,CACvB,MAAMC,EAAUtC,EAAcC,CAAI,EAClCiC,EAAK,OACH,CAAE,eAAgBI,EAAQ,eAAgB,iBAAkBA,EAAQ,gBAAA,EACpE,CACE,UAAYC,GAAW,CACjBA,EAAO,SACT5B,EAAI,mBAAoB4B,EAAO,KAAK,CAExC,CAAA,CACF,CAEJ,EAEMA,EAASL,EAAK,KACdM,EAAQvC,EAAK,mBAAoBsC,GAAA,YAAAA,EAAQ,QAAS,CAAA,EAExD,gBACG,MAAA,CAAI,UAAU,YACZ,SAAAH,WACE,MAAA,CACC,SAAA,CAAAxB,SAAC,IAAA,CAAE,UAAU,8BAA8B,SAAA,kFAAA,EAA3C,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,EACCX,EAAK,kBAAoBA,EAAK,iBAAiB,OAAS,GACvDW,EAAAA,OAAC,MAAA,CAAI,UAAU,OACb,SAAA,CAAAA,EAAAA,OAAC,IAAA,CAAE,UAAU,kCACV,SAAA,CAAAX,EAAK,iBAAiB,OAAO,QAAMA,EAAK,iBAAiB,SAAW,EAAI,IAAM,GAAG,8BAAA,CAAA,EADpF,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,EACAW,EAAAA,OAAC6B,EAAA,CAAS,MAAOxC,EAAK,gBAAA,EAAtB,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAwC,CAAA,CAAA,EAJ1C,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAKA,CAAA,CAAA,EAVJ,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAYA,EAEAW,EAAAA,OAAAK,EAAAA,SAAA,CACE,SAAA,CAAAL,EAAAA,OAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,OAAC,SAAA,CACC,KAAK,SACL,QAASyB,EACT,SAAUH,EAAK,UACf,UAAU,sBAET,SAAAA,EAAK,UACJtB,EAAAA,OAAC,OAAA,CAAK,UAAU,4BACd,SAAA,CAAAA,EAAAA,OAAC8B,EAAA,CAAQ,UAAU,sBAAA,EAAnB,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA0C,EAAE,eAAA,CAAA,EAD9C,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAGA,EAEA,iBAAA,EAZJ,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,GAeCH,GAAA,YAAAA,EAAQ,UACP3B,SAAC,OAAA,CAAK,UAAU,sDACd,SAAA,CAAAA,EAAAA,OAAC+B,EAAA,CAAa,UAAU,aAAA,EAAxB,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAsC,EAAE,eAC3BH,EAAM,OAAO,QAAMA,EAAM,SAAW,EAAI,IAAM,GAAG,aAAA,CAAA,EAFhE,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAGA,EAEDD,GAAU,CAACA,EAAO,SACjB3B,EAAAA,OAAC,OAAA,CAAK,UAAU,oDACd,SAAA,CAAAA,EAAAA,OAACgC,EAAA,CAAQ,UAAU,aAAA,EAAnB,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAiC,EAChCL,EAAO,OAAS,mBAAA,CAAA,EAFnB,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAGA,CAAA,CAAA,EA1BJ,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IA4BA,EAECC,EAAM,OAAS,GACd5B,EAAAA,OAAC,MAAA,CACC,SAAA,CAAAA,SAAC,IAAA,CAAE,UAAU,kCAAkC,SAAA,kBAAA,EAA/C,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA+D,EAC/DA,EAAAA,OAAC6B,GAAS,MAAAD,CAAA,EAAV,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAwB,CAAA,CAAA,EAF1B,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAGA,EAGF5B,SAAC,IAAA,CAAE,UAAWJ,EAAS,SAAA,6HAAA,EAAvB,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CAAA,CAAA,EAxCF,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAyCA,CAAA,EAzDJ,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IA2DA,CAEJ,CAEA,SAASiC,EAAS,CAAE,MAAAD,GAA8D,CAChF,OACE5B,EAAAA,OAAC,MAAA,CAAI,UAAU,uGACZ,SAAA4B,EAAM,IAAKtB,GACVN,EAAAA,OAAC,MAAA,CAAiB,UAAU,YAC1B,SAAA,CAAAA,SAAC,OAAA,CAAK,UAAU,kDAAmD,SAAAM,EAAE,IAAA,EAArE,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAA0E,EACzEA,EAAE,aACDN,SAAC,QAAK,UAAU,2DAA4D,WAAE,aAA9E,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAA0F,CAAA,GAHpFM,EAAE,KAAZ,GAAA,CAAA,SAAA,2DAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAKA,CACD,GARH,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IASA,CAEJ,CCtGA,MAAM2B,GAAqC,CACzC,aAAc,aACd,QAAW,kBACX,gBAAiB,eACnB,EAEMC,GAA0C,CAC9C,MAAO,QACP,IAAK,MACL,kBAAmB,iBACrB,EAEO,SAASC,GAAW,CAAE,KAAA9C,GAAe,CAC1C,MAAMuC,EAAQvC,EAAK,kBAAoB,CAAA,EAEvC,OACEW,EAAAA,OAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,SAACoC,EAAA,CAAI,MAAM,OAAO,MAAO/C,EAAK,IAAA,EAA9B,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAoC,EACnCA,EAAK,aAAeW,SAACoC,EAAA,CAAI,MAAM,cAAc,MAAO/C,EAAK,aAArC,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAkD,EACvEW,EAAAA,OAACoC,EAAA,CAAI,MAAM,OAAO,MAAOH,GAAW5C,EAAK,IAAI,GAAKA,EAAK,IAAA,EAAvD,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA6D,EAE5DA,EAAK,OAAS,WACbW,EAAAA,OAAAK,EAAAA,SAAA,CACE,SAAA,CAAAL,EAAAA,OAACoC,EAAA,CAAI,MAAM,YAAY,MAAOF,GAAgB7C,EAAK,cAAc,GAAKA,EAAK,cAAA,EAA3E,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA2F,EAC3FW,EAAAA,OAACoC,GAAI,MAAM,MAAM,MAAO/C,EAAK,IAAK,KAAI,IAAtC,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAuC,CAAA,CAAA,EAFzC,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,EAEDA,EAAK,OAAS,iBACbW,EAAAA,OAAAK,EAAAA,SAAA,CACE,SAAA,CAAAL,EAAAA,OAACoC,GAAI,MAAM,UAAU,MAAO/C,EAAK,QAAS,KAAI,IAA9C,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA+C,EAC9CA,EAAK,MAAQW,EAAAA,OAACoC,EAAA,CAAI,MAAM,OAAO,MAAO/C,EAAK,KAAM,KAAI,EAAA,EAAxC,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAyC,CAAA,CAAA,EAFzD,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,EAGFW,EAAAA,OAACoC,GAAI,MAAM,eAAe,MAAO/C,EAAK,aAAe,MAAQ,MAA7D,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAmE,EAElEA,EAAK,KAAK,OAAS,YACjB,MAAA,CACC,SAAA,CAAAW,SAAC,QAAA,CAAM,UAAWL,EAAU,SAAA,MAAA,EAA5B,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAgC,EAChCK,SAAC,MAAA,CAAI,UAAU,8BACZ,WAAK,KAAK,IAAK,GACdA,SAAC,OAAA,CAAa,UAAU,4EACrB,YADQ,EAAX,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CACD,GALH,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAMA,CAAA,CAAA,EARF,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IASA,EAGDX,EAAK,qBAAqB,OAAS,YACjC,MAAA,CACC,SAAA,CAAAW,SAAC,QAAA,CAAM,UAAWL,EAAU,SAAA,sBAAA,EAA5B,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAgD,EAChDK,SAAC,MAAA,CAAI,UAAU,8BACZ,WAAK,qBAAqB,IAAKe,GAC9Bf,SAAC,OAAA,CAAa,UAAU,4EACrB,YADQe,EAAX,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CACD,GALH,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAMA,CAAA,CAAA,EARF,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IASA,EAGD1B,EAAK,eAAiBW,SAACoC,EAAA,CAAI,MAAM,gBAAgB,MAAO/C,EAAK,eAAvC,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAsD,EAE5EuC,EAAM,OAAS,GACd5B,SAACoC,EAAA,CAAI,MAAM,mBAAmB,MAAO,GAAGR,EAAM,MAAM,QAAQA,EAAM,SAAW,EAAI,IAAM,EAAE,EAAA,EAAzF,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA6F,CAAA,CAAA,EAjDjG,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAmDA,CAEJ,CAEA,SAASQ,EAAI,CAAE,MAAAC,EAAO,MAAAC,EAAO,KAAAC,GAA0D,CACrF,gBACG,MAAA,CACC,SAAA,CAAAvC,SAAC,QAAA,CAAM,UAAWL,EAAW,SAAA0C,CAAA,EAA7B,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAmC,EACnCrC,EAAAA,OAAC,KAAE,UAAW,oCAAoCuC,EAAO,YAAc,EAAE,GAAK,SAAAD,CAAA,EAA9E,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAoF,CAAA,CAAA,EAFtF,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAEJ,CCnEO,SAASE,IAAsB,WACpC,KAAM,CAAE,SAAAC,CAAA,EAAaC,EAAA,EACfC,EAAQ,CAACF,EACTG,EAAWC,EAAA,EACX,CAAE,KAAMC,EAAU,UAAAC,GAAcC,EAAaP,GAAY,EAAE,EAC3DQ,EAAeC,EAAA,EACfC,EAAeC,EAAA,EAEf,CAAC/D,EAAMgE,CAAO,EAAI3C,EAAAA,SAA0B3B,CAAU,EACtD,CAACuE,EAAaC,CAAc,EAAI7C,EAAAA,SAAS,EAAK,EAC9C,CAAC8C,EAAWC,CAAY,EAAI/C,EAAAA,SAAS,EAAE,EAGvC,CAACgD,EAAcC,CAAe,EAAIC,EAAA,EAClClE,EAAO,SAASgE,EAAa,IAAI,MAAM,GAAK,IAAK,EAAE,EACnDG,EAAUC,cAAaC,GAAc,CACzCJ,EAAiBK,GAAS,CACxB,MAAMC,EAAO,IAAI,gBAAgBD,CAAI,EACrC,OAAAC,EAAK,IAAI,OAAQ,OAAOF,CAAC,CAAC,EACnBE,CACT,EAAG,CAAE,QAAS,GAAO,CACvB,EAAG,CAACN,CAAe,CAAC,EAGpBO,EAAAA,UAAU,IAAM,CACd,GAAI,CAAAZ,EACJ,IAAIX,EAAO,CACTU,EAAQtE,CAAU,EAClBwE,EAAe,EAAI,EACnB,MACF,CACIT,IACFO,EAAQrE,EAAa8D,CAAQ,CAAC,EAC9BS,EAAe,EAAI,GAEvB,EAAG,CAACT,EAAUH,EAAOW,CAAW,CAAC,EAEjC,MAAMvD,EAAM,CAACoE,EAA8B7B,IACzCe,EAASe,IAAO,CAAE,GAAGA,EAAG,CAACD,CAAK,EAAG7B,GAAQ,EAErCpD,EAAY,CAAC,GAAEmF,EAAAvB,GAAA,YAAAA,EAAU,mBAAV,MAAAuB,EAAoC,SAGnDC,EAAa,IAAM,CACvBb,EAAa,EAAE,EACf,MAAM/B,EAAUtC,EAAcC,CAAI,EAE9ByD,EACFK,EAAa,OACX,CAAE,GAAIL,EAAS,GAAI,GAAGpB,CAAA,EACtB,CAAE,UAAW,IAAMkB,EAAS,cAAc,CAAA,CAAE,EAG9CK,EAAa,OAAOvB,EAAS,CAC3B,UAAW,IAAMkB,EAAS,cAAc,EACxC,QAAU2B,GAAQd,EAAac,EAAI,OAAO,CAAA,CAC3C,CAEL,EAEA,GAAI,CAAC5B,GAASI,EACZ,OACE/C,EAAAA,OAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,OAAC,MAAA,CAAI,UAAU,oCAAA,EAAf,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAoD,EACpDA,EAAAA,OAAC,MAAA,CAAI,UAAU,gCAAA,EAAf,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAgD,CAAA,CAAA,EAFlD,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,EAIJ,GAAI,CAAC2C,GAAS,CAACG,GAAY,CAACC,EAC1B,OAAO/C,EAAAA,OAAC,IAAA,CAAE,UAAU,8BAA8B,SAAA,mBAAA,EAA3C,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA4D,EAGrE,MAAMwE,EAAS9E,IAASF,EAAY,OAC9BiF,EAAYxB,EAAa,WAAaE,EAAa,UACnDuB,EAAQlB,KAAcmB,EAAA1B,EAAa,QAAb,YAAA0B,EAAqC,YAAYC,EAAAzB,EAAa,QAAb,YAAAyB,EAAqC,SAElH,gBACG,MAAA,CACC,SAAA,CAAA5E,EAAAA,OAAC6E,GAAW,MAAOlC,EAAQ,uBAAwBG,GAAA,YAAAA,EAAU,OAAQ,IAArE,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAyE,EAEzE9C,EAAAA,OAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,EAAAA,OAAC8E,EAAA,CAAc,MAAOtF,EAAa,YAAaE,EAAO,EAAG,YAAcqF,GAAMlB,EAAQkB,EAAI,CAAC,CAAA,EAA3F,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAA8F,EAE9F/E,EAAAA,OAAC,MAAA,CAAI,UAAU,qBACZ,SAAA,CAAAN,IAAS,GAAKM,EAAAA,OAACF,GAAA,CAAc,KAAAT,EAAY,IAAAU,EAAU,UAAAb,CAAA,EAArC,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAA2D,EACzEQ,IAAS,GAAKM,EAAAA,OAACO,GAAA,CAAc,KAAAlB,EAAY,IAAAU,CAAA,EAA3B,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAqC,EACnDL,IAAS,GAAKM,EAAAA,OAACqB,GAAA,CAAS,KAAAhC,EAAY,IAAAU,CAAA,EAAtB,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAgC,EAC9CL,IAAS,GAAKM,SAACmC,GAAA,CAAW,KAAA9C,CAAA,EAAZ,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAwB,CAAA,CAAA,EAJzC,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAKA,EAECqF,GACC1E,EAAAA,OAAC,IAAA,CAAE,UAAU,iCAAkC,SAAA0E,CAAA,EAA/C,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAqD,EAIvD1E,EAAAA,OAAC,MAAA,CAAI,UAAU,6EACb,SAAA,CAAAA,SAAC,MAAA,CACE,SAAAN,EAAO,GACNM,EAAAA,OAAC,SAAA,CAAO,QAAS,IAAM6D,EAAQnE,EAAO,CAAC,EAAG,UAAU,wBAAwB,SAAA,MAAA,EAA5E,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,CAAA,EAJJ,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAMA,EACAM,EAAAA,OAAC,MAAA,CAAI,UAAU,aACb,SAAA,CAAAA,EAAAA,OAAC,SAAA,CAAO,QAAS,IAAM4C,EAAS,cAAc,EAAG,UAAU,oBAAoB,SAAA,QAAA,EAA/E,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,EACC4B,EACCxE,EAAAA,OAAC,SAAA,CACC,QAASsE,EACT,SAAU,CAAC7E,EAAYC,EAAML,CAAI,GAAKoF,EACtC,UAAU,sBAET,SAAAA,EAAY,YAAc3B,EAAW,OAAS,UAAA,EALjD,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,EAQA9C,EAAAA,OAAC,SAAA,CACC,QAAS,IAAM6D,EAAQnE,EAAO,CAAC,EAC/B,SAAU,CAACD,EAAYC,EAAML,CAAI,EACjC,UAAU,sBACX,SAAA,MAAA,EAJD,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAnBJ,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAqBA,CAAA,CAAA,EA7BF,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IA8BA,CAAA,CAAA,EA7CF,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IA8CA,CAAA,CAAA,EAjDF,OAAA,GAAA,CAAA,SAAA,sEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAkDA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{b as x,j as e}from"./index-Cmgrk7PQ.js";import{c as D,u as C,b as T,a as c}from"./vendor-query-DLp59M9_.js";import{P as M}from"./PageHeader-Cm5HBQF_.js";import{M as R}from"./Modal-E1yRnCeW.js";import{R as J,C as y}from"./constants-BHkpVaqx.js";import{ai as N,k as O,$ as A}from"./vendor-icons-AFGxSeQS.js";import"./vendor-react-Co3Y8ikm.js";function F(){return C({queryKey:["maintenance"],queryFn:()=>x("/config/maintenance")})}function I(){const a=T();return D({mutationFn:s=>x("/config/maintenance",{method:"PUT",body:JSON.stringify(s)}),onSuccess:()=>{a.invalidateQueries({queryKey:["maintenance"]})}})}function _(){return D({mutationFn:a=>x("/dba/prune",{method:"POST",body:JSON.stringify(a)})})}function h({checked:a,onToggle:s,label:t,hint:n,value:l,onChange:m}){return e.jsxDEV("div",{className:"flex items-center gap-4",children:[e.jsxDEV("label",{className:"flex items-center gap-2.5 cursor-pointer w-64 shrink-0",children:[e.jsxDEV("input",{type:"checkbox",checked:a,onChange:r=>s(r.target.checked),className:"w-4 h-4 rounded border-border accent-accent shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:17,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("span",{className:"text-xs text-text-primary",children:t},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:24,columnNumber:11},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary",children:n},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:25,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:23,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:16,columnNumber:7},this),e.jsxDEV("select",{value:l,onChange:r=>m(r.target.value),disabled:!a,className:`select text-xs w-36 transition-opacity ${a?"":"opacity-40 cursor-not-allowed"}`,children:J.map(r=>e.jsxDEV("option",{value:r.value,children:r.label},r.value,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:35,columnNumber:11},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:28,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:15,columnNumber:5},this)}function v({checked:a,onChange:s,label:t,description:n}){return e.jsxDEV("label",{className:"flex items-start gap-2.5 cursor-pointer",children:[e.jsxDEV("input",{type:"checkbox",checked:a,onChange:l=>s(l.target.checked),className:"w-4 h-4 mt-0.5 rounded border-border accent-accent shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:52,columnNumber:7},this),e.jsxDEV("div",{children:[e.jsxDEV("span",{className:"text-xs text-text-primary",children:t},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:59,columnNumber:9},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary",children:n},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:60,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:58,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:51,columnNumber:5},this)}function q(){return e.jsxDEV("div",{className:"flex items-start gap-2 mt-2 px-3 py-2 rounded bg-surface-sunken",children:[e.jsxDEV(N,{className:"w-3.5 h-3.5 text-text-tertiary shrink-0 mt-0.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:71,columnNumber:7},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary leading-relaxed",children:"Stripping preserves workflow results and timeline data needed for the execution detail view. Transient jobs are internal bookkeeping that accumulates over time."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:72,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:70,columnNumber:5},this)}const g={pruneJobs:!0,expire:"30 days",engineStreams:!0,engineStreamsExpire:"1 day",workerStreams:!0,workerStreamsExpire:"90 days",stripAttributes:!1,pruneTransient:!1};function S(a){return a.pruneJobs||a.engineStreams||a.workerStreams||a.stripAttributes||a.pruneTransient}function V({fields:a,onChange:s}){const t=(n,l)=>s({...a,[n]:l});return e.jsxDEV("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_auto] gap-10",children:[e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Delete Expired Data"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:121,columnNumber:9},this),e.jsxDEV("div",{className:"space-y-3",children:[e.jsxDEV(h,{checked:a.pruneJobs,onToggle:n=>t("pruneJobs",n),label:"Jobs",hint:"Hard-delete completed job rows",value:a.expire,onChange:n=>t("expire",n)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:125,columnNumber:11},this),e.jsxDEV(h,{checked:a.engineStreams,onToggle:n=>t("engineStreams",n),label:"Engine streams",hint:"Internal routing (prune aggressively)",value:a.engineStreamsExpire,onChange:n=>t("engineStreamsExpire",n)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:130,columnNumber:11},this),e.jsxDEV(h,{checked:a.workerStreams,onToggle:n=>t("workerStreams",n),label:"Worker streams",hint:"Activity payloads for execution playback",value:a.workerStreamsExpire,onChange:n=>t("workerStreamsExpire",n)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:135,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:124,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:120,columnNumber:7},this),e.jsxDEV("div",{className:"lg:w-72",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Cleanup"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:145,columnNumber:9},this),e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV(v,{checked:a.stripAttributes,onChange:n=>t("stripAttributes",n),label:"Strip execution artifacts",description:"Remove step-level detail from completed jobs. Return data and export history are preserved."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:149,columnNumber:11},this),e.jsxDEV(v,{checked:a.pruneTransient,onChange:n=>t("pruneTransient",n),label:"Delete transient jobs",description:"Orphaned jobs without an entity type. Usually safe to remove."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:154,columnNumber:11},this),e.jsxDEV(q,{},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:159,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:148,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:144,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:118,columnNumber:5},this)}function u({label:a,value:s}){return e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-lg font-light text-text-primary",children:s.toLocaleString()},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:9,columnNumber:7},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary",children:a},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:10,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:8,columnNumber:5},this)}function $(){const a=_(),[s,t]=c.useState(g),[n,l]=c.useState(null),[m,r]=c.useState(!1),i=()=>{l(null),a.mutate({expire:s.expire,jobs:s.pruneJobs,engineStreams:s.engineStreams,engineStreamsExpire:s.engineStreamsExpire,workerStreams:s.workerStreams,workerStreamsExpire:s.workerStreamsExpire,attributes:s.stripAttributes,pruneTransient:s.pruneTransient},{onSuccess:d=>{l(d),r(!1)}})};return e.jsxDEV("div",{className:"space-y-8",children:[e.jsxDEV(V,{fields:s,onChange:t},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:45,columnNumber:7},this),e.jsxDEV("div",{className:"flex items-center justify-between pt-2 border-t border-surface-border",children:[e.jsxDEV("p",{className:"text-[10px] text-text-tertiary",children:S(s)?"This action permanently deletes data and cannot be undone.":"Select at least one operation to enable pruning."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:49,columnNumber:9},this),e.jsxDEV("button",{onClick:()=>r(!0),disabled:!S(s)||a.isPending,className:"bg-status-error text-white px-4 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity disabled:opacity-40 shrink-0",children:a.isPending?"Pruning...":"Prune Now"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:54,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:48,columnNumber:7},this),n&&e.jsxDEV("div",{className:"bg-surface-sunken rounded-md px-4 py-3",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Results"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:66,columnNumber:11},this),e.jsxDEV("div",{className:"flex flex-wrap gap-6",children:[n.jobs!=null&&n.jobs>0&&e.jsxDEV(u,{label:"Jobs deleted",value:n.jobs},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:70,columnNumber:56},this),n.engineStreams!=null&&n.engineStreams>0&&e.jsxDEV(u,{label:"Engine streams",value:n.engineStreams},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:71,columnNumber:74},this),n.workerStreams!=null&&n.workerStreams>0&&e.jsxDEV(u,{label:"Worker streams",value:n.workerStreams},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:72,columnNumber:74},this),n.streams!=null&&n.engineStreams==null&&n.streams>0&&e.jsxDEV(u,{label:"Streams",value:n.streams},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:73,columnNumber:94},this),n.attributes!=null&&n.attributes>0&&e.jsxDEV(u,{label:"Artifacts stripped",value:n.attributes},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:74,columnNumber:68},this),n.transient!=null&&n.transient>0&&e.jsxDEV(u,{label:"Transient deleted",value:n.transient},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:75,columnNumber:66},this),n.marked!=null&&n.marked>0&&e.jsxDEV(u,{label:"Marked pruned",value:n.marked},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:76,columnNumber:60},this),Object.values(n).every(d=>!d||d===0)&&e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:"Nothing to prune within the selected retention windows."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:78,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:69,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:65,columnNumber:9},this),a.error&&e.jsxDEV("p",{className:"text-xs text-status-error",children:a.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:85,columnNumber:9},this),e.jsxDEV(R,{open:m,onClose:()=>r(!1),title:"Confirm Prune",children:e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("p",{className:"text-sm text-text-secondary",children:"This will permanently delete data. This action cannot be undone."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:91,columnNumber:11},this),e.jsxDEV("ul",{className:"text-xs text-text-secondary space-y-1 list-disc list-inside",children:[s.pruneJobs&&e.jsxDEV("li",{children:["Delete jobs older than ",s.expire]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:95,columnNumber:34},this),s.engineStreams&&e.jsxDEV("li",{children:["Delete engine streams older than ",s.engineStreamsExpire]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:96,columnNumber:38},this),s.workerStreams&&e.jsxDEV("li",{children:["Delete worker streams older than ",s.workerStreamsExpire]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:97,columnNumber:38},this),s.stripAttributes&&e.jsxDEV("li",{children:"Strip execution artifacts from completed jobs"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:98,columnNumber:40},this),s.pruneTransient&&e.jsxDEV("li",{children:"Delete transient (entity-less) jobs"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:99,columnNumber:39},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:94,columnNumber:11},this),e.jsxDEV("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsxDEV("button",{onClick:()=>r(!1),className:"btn-secondary text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:102,columnNumber:13},this),e.jsxDEV("button",{onClick:i,className:"bg-status-error text-white px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity",disabled:a.isPending,children:a.isPending?"Pruning...":"Confirm Prune"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:103,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:101,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:90,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:89,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:44,columnNumber:5},this)}function E(a){var r;if(!((r=a==null?void 0:a.rules)!=null&&r.length))return g;const s=a.rules,t=s.find(i=>i.target==="streams"&&i.action==="delete"),n=s.find(i=>i.target==="jobs"&&i.action==="delete"&&i.hasEntity===!1),l=s.find(i=>i.target==="jobs"&&i.action==="prune"&&i.hasEntity===!0),m=s.find(i=>i.target==="jobs"&&i.action==="delete"&&i.pruned===!0);return{pruneJobs:!!m,expire:(m==null?void 0:m.olderThan)??"180 days",engineStreams:!!t,engineStreamsExpire:(t==null?void 0:t.olderThan)??"1 day",workerStreams:!!t,workerStreamsExpire:(t==null?void 0:t.olderThan)??"90 days",stripAttributes:!!l,pruneTransient:!!n}}function U(a){const s=[];return a.engineStreams&&s.push({target:"streams",action:"delete",olderThan:a.engineStreamsExpire}),a.workerStreams&&a.workerStreamsExpire!==a.engineStreamsExpire&&s.push({target:"streams",action:"delete",olderThan:a.workerStreamsExpire}),a.pruneTransient&&s.push({target:"jobs",action:"delete",olderThan:a.expire,hasEntity:!1}),a.stripAttributes&&s.push({target:"jobs",action:"prune",olderThan:a.expire,hasEntity:!0}),a.pruneJobs&&s.push({target:"jobs",action:"delete",olderThan:a.expire,pruned:!0}),s}function j(a){var s;return((s=y.find(t=>t.value===a))==null?void 0:s.label)??""}function W(){const{data:a,isLoading:s}=F(),t=I(),[n,l]=c.useState(""),[m,r]=c.useState(g),[i,d]=c.useState(""),p=c.useCallback(()=>{a!=null&&a.config&&(l(a.config.schedule),r(E(a.config)),d(JSON.stringify({schedule:a.config.schedule,fields:E(a.config)})))},[a]);c.useEffect(()=>{p()},[p]);const k=JSON.stringify({schedule:n,fields:m}),f=i!==""&&k!==i,b=(a==null?void 0:a.active)??!1,P=()=>{const o=U(m);t.mutate({schedule:n,rules:o},{onSuccess:()=>{d(JSON.stringify({schedule:n,fields:m}))}})},w=()=>{p()};return s?e.jsxDEV("div",{className:"animate-pulse h-40 bg-surface-sunken rounded"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:99,columnNumber:12},this):e.jsxDEV("div",{className:"space-y-8",children:[e.jsxDEV("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_auto] gap-10",children:[e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Schedule"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:107,columnNumber:11},this),e.jsxDEV("div",{className:"flex items-end gap-4",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] text-text-tertiary mb-1",children:"Cron Expression"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:112,columnNumber:15},this),e.jsxDEV("input",{type:"text",value:n,onChange:o=>l(o.target.value),placeholder:"0 2 * * *",className:"input text-xs font-mono w-48"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:113,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:111,columnNumber:13},this),e.jsxDEV("div",{children:e.jsxDEV("div",{className:"flex items-center gap-1.5 h-8",children:[e.jsxDEV("span",{className:`w-1.5 h-1.5 rounded-full ${b?"bg-status-success":"bg-text-tertiary"}`},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:123,columnNumber:17},this),e.jsxDEV("span",{className:`text-xs ${b?"text-status-success":"text-text-tertiary"}`,children:b?"Active":"Inactive"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:124,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:122,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:121,columnNumber:13},this),j(n)&&e.jsxDEV("p",{className:"text-xs text-text-tertiary h-8 flex items-center",children:j(n)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:130,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:110,columnNumber:11},this),e.jsxDEV("div",{className:"flex flex-wrap gap-1.5 mt-3",children:y.map(o=>e.jsxDEV("button",{type:"button",onClick:()=>l(o.value),className:`px-2.5 py-1 text-[10px] rounded-full transition-colors ${n===o.value?"bg-accent/10 text-accent font-medium":"bg-surface-sunken text-text-tertiary hover:text-text-secondary"}`,children:o.label},o.value,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:137,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:135,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:106,columnNumber:9},this),e.jsxDEV("div",{className:"lg:w-72",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"How It Works"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:154,columnNumber:11},this),e.jsxDEV("div",{className:"flex items-start gap-2 px-3 py-2 rounded bg-surface-sunken",children:[e.jsxDEV(N,{className:"w-3.5 h-3.5 text-text-tertiary shrink-0 mt-0.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:158,columnNumber:13},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary leading-relaxed",children:"Rules execute sequentially on each cron cycle. Engine streams can be pruned aggressively since they only contain internal routing data. Worker streams should be retained longer to preserve execution playback and input enrichment."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:159,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:157,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:153,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:105,columnNumber:7},this),e.jsxDEV(V,{fields:m,onChange:r},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:169,columnNumber:7},this),e.jsxDEV("div",{className:"flex items-center justify-between pt-2 border-t border-surface-border",children:[e.jsxDEV("div",{className:"flex items-center gap-3",children:[f&&e.jsxDEV("button",{onClick:w,className:"text-[10px] text-text-tertiary hover:text-text-primary transition-colors",children:"Revert changes"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:175,columnNumber:13},this),t.error&&e.jsxDEV("p",{className:"text-xs text-status-error",children:t.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:183,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:173,columnNumber:9},this),e.jsxDEV("button",{onClick:P,disabled:!f||!n.trim()||t.isPending,className:"btn-primary text-xs disabled:opacity-40 shrink-0",children:t.isPending?"Saving...":"Save Schedule"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:186,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:172,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:103,columnNumber:5},this)}function L({mode:a,onChange:s}){const t=(n,l,m)=>e.jsxDEV("button",{onClick:()=>s(n),className:`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${a===n?"bg-accent/10 text-accent font-medium":"text-text-tertiary hover:text-text-secondary hover:bg-surface-hover"}`,children:[l,m]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:11,columnNumber:5},this);return e.jsxDEV("div",{className:"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit",children:[t("prune",e.jsxDEV(O,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:26,columnNumber:21},this),"Prune Now"),t("schedule",e.jsxDEV(A,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:27,columnNumber:24},this),"Schedule")]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:25,columnNumber:5},this)}function Y(){const[a,s]=c.useState("schedule");return e.jsxDEV("div",{children:[e.jsxDEV(M,{title:"DB Maintenance",actions:e.jsxDEV(L,{mode:a,onChange:s},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:39,columnNumber:18},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:37,columnNumber:7},this),e.jsxDEV("div",{className:"flex items-start gap-2 px-4 py-3 mb-8 rounded-md bg-accent/5 border border-accent/10",children:[e.jsxDEV(N,{className:"w-4 h-4 text-accent shrink-0 mt-0.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:43,columnNumber:9},this),e.jsxDEV("p",{className:"text-xs text-text-secondary leading-relaxed",children:"Completed process data grows indefinitely. Schedule regular pruning to keep the database lean and queries fast. Worker streams are retained longer than engine streams to preserve execution playback."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:44,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:42,columnNumber:7},this),a==="prune"?e.jsxDEV($,{},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:51,columnNumber:27},this):e.jsxDEV(W,{},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:51,columnNumber:46},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:36,columnNumber:5},this)}export{Y as MaintenancePage};
2
- //# sourceMappingURL=index-BbI2dzhJ.js.map
1
+ import{b as x,j as e}from"./index-puKKZ5l8.js";import{c as D,u as C,b as T,a as c}from"./vendor-query-DLp59M9_.js";import{P as M}from"./PageHeader-CZ9a8cpr.js";import{M as R}from"./Modal-yyhUeKoA.js";import{R as J,C as y}from"./constants-BHkpVaqx.js";import{af as N,l as O,$ as A}from"./vendor-icons-CWl44VA6.js";import"./vendor-react-Co3Y8ikm.js";function F(){return C({queryKey:["maintenance"],queryFn:()=>x("/config/maintenance")})}function I(){const a=T();return D({mutationFn:s=>x("/config/maintenance",{method:"PUT",body:JSON.stringify(s)}),onSuccess:()=>{a.invalidateQueries({queryKey:["maintenance"]})}})}function _(){return D({mutationFn:a=>x("/dba/prune",{method:"POST",body:JSON.stringify(a)})})}function h({checked:a,onToggle:s,label:t,hint:n,value:l,onChange:m}){return e.jsxDEV("div",{className:"flex items-center gap-4",children:[e.jsxDEV("label",{className:"flex items-center gap-2.5 cursor-pointer w-64 shrink-0",children:[e.jsxDEV("input",{type:"checkbox",checked:a,onChange:r=>s(r.target.checked),className:"w-4 h-4 rounded border-border accent-accent shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:17,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("span",{className:"text-xs text-text-primary",children:t},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:24,columnNumber:11},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary",children:n},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:25,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:23,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:16,columnNumber:7},this),e.jsxDEV("select",{value:l,onChange:r=>m(r.target.value),disabled:!a,className:`select text-xs w-36 transition-opacity ${a?"":"opacity-40 cursor-not-allowed"}`,children:J.map(r=>e.jsxDEV("option",{value:r.value,children:r.label},r.value,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:35,columnNumber:11},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:28,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:15,columnNumber:5},this)}function v({checked:a,onChange:s,label:t,description:n}){return e.jsxDEV("label",{className:"flex items-start gap-2.5 cursor-pointer",children:[e.jsxDEV("input",{type:"checkbox",checked:a,onChange:l=>s(l.target.checked),className:"w-4 h-4 mt-0.5 rounded border-border accent-accent shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:52,columnNumber:7},this),e.jsxDEV("div",{children:[e.jsxDEV("span",{className:"text-xs text-text-primary",children:t},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:59,columnNumber:9},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary",children:n},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:60,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:58,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:51,columnNumber:5},this)}function q(){return e.jsxDEV("div",{className:"flex items-start gap-2 mt-2 px-3 py-2 rounded bg-surface-sunken",children:[e.jsxDEV(N,{className:"w-3.5 h-3.5 text-text-tertiary shrink-0 mt-0.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:71,columnNumber:7},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary leading-relaxed",children:"Stripping preserves workflow results and timeline data needed for the execution detail view. Transient jobs are internal bookkeeping that accumulates over time."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:72,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:70,columnNumber:5},this)}const g={pruneJobs:!0,expire:"30 days",engineStreams:!0,engineStreamsExpire:"1 day",workerStreams:!0,workerStreamsExpire:"90 days",stripAttributes:!1,pruneTransient:!1};function S(a){return a.pruneJobs||a.engineStreams||a.workerStreams||a.stripAttributes||a.pruneTransient}function V({fields:a,onChange:s}){const t=(n,l)=>s({...a,[n]:l});return e.jsxDEV("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_auto] gap-10",children:[e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Delete Expired Data"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:121,columnNumber:9},this),e.jsxDEV("div",{className:"space-y-3",children:[e.jsxDEV(h,{checked:a.pruneJobs,onToggle:n=>t("pruneJobs",n),label:"Jobs",hint:"Hard-delete completed job rows",value:a.expire,onChange:n=>t("expire",n)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:125,columnNumber:11},this),e.jsxDEV(h,{checked:a.engineStreams,onToggle:n=>t("engineStreams",n),label:"Engine streams",hint:"Internal routing (prune aggressively)",value:a.engineStreamsExpire,onChange:n=>t("engineStreamsExpire",n)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:130,columnNumber:11},this),e.jsxDEV(h,{checked:a.workerStreams,onToggle:n=>t("workerStreams",n),label:"Worker streams",hint:"Activity payloads for execution playback",value:a.workerStreamsExpire,onChange:n=>t("workerStreamsExpire",n)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:135,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:124,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:120,columnNumber:7},this),e.jsxDEV("div",{className:"lg:w-72",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Cleanup"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:145,columnNumber:9},this),e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV(v,{checked:a.stripAttributes,onChange:n=>t("stripAttributes",n),label:"Strip execution artifacts",description:"Remove step-level detail from completed jobs. Return data and export history are preserved."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:149,columnNumber:11},this),e.jsxDEV(v,{checked:a.pruneTransient,onChange:n=>t("pruneTransient",n),label:"Delete transient jobs",description:"Orphaned jobs without an entity type. Usually safe to remove."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:154,columnNumber:11},this),e.jsxDEV(q,{},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:159,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:148,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:144,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/controls.tsx",lineNumber:118,columnNumber:5},this)}function u({label:a,value:s}){return e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-lg font-light text-text-primary",children:s.toLocaleString()},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:9,columnNumber:7},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary",children:a},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:10,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:8,columnNumber:5},this)}function $(){const a=_(),[s,t]=c.useState(g),[n,l]=c.useState(null),[m,r]=c.useState(!1),i=()=>{l(null),a.mutate({expire:s.expire,jobs:s.pruneJobs,engineStreams:s.engineStreams,engineStreamsExpire:s.engineStreamsExpire,workerStreams:s.workerStreams,workerStreamsExpire:s.workerStreamsExpire,attributes:s.stripAttributes,pruneTransient:s.pruneTransient},{onSuccess:d=>{l(d),r(!1)}})};return e.jsxDEV("div",{className:"space-y-8",children:[e.jsxDEV(V,{fields:s,onChange:t},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:45,columnNumber:7},this),e.jsxDEV("div",{className:"flex items-center justify-between pt-2 border-t border-surface-border",children:[e.jsxDEV("p",{className:"text-[10px] text-text-tertiary",children:S(s)?"This action permanently deletes data and cannot be undone.":"Select at least one operation to enable pruning."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:49,columnNumber:9},this),e.jsxDEV("button",{onClick:()=>r(!0),disabled:!S(s)||a.isPending,className:"bg-status-error text-white px-4 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity disabled:opacity-40 shrink-0",children:a.isPending?"Pruning...":"Prune Now"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:54,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:48,columnNumber:7},this),n&&e.jsxDEV("div",{className:"bg-surface-sunken rounded-md px-4 py-3",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Results"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:66,columnNumber:11},this),e.jsxDEV("div",{className:"flex flex-wrap gap-6",children:[n.jobs!=null&&n.jobs>0&&e.jsxDEV(u,{label:"Jobs deleted",value:n.jobs},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:70,columnNumber:56},this),n.engineStreams!=null&&n.engineStreams>0&&e.jsxDEV(u,{label:"Engine streams",value:n.engineStreams},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:71,columnNumber:74},this),n.workerStreams!=null&&n.workerStreams>0&&e.jsxDEV(u,{label:"Worker streams",value:n.workerStreams},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:72,columnNumber:74},this),n.streams!=null&&n.engineStreams==null&&n.streams>0&&e.jsxDEV(u,{label:"Streams",value:n.streams},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:73,columnNumber:94},this),n.attributes!=null&&n.attributes>0&&e.jsxDEV(u,{label:"Artifacts stripped",value:n.attributes},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:74,columnNumber:68},this),n.transient!=null&&n.transient>0&&e.jsxDEV(u,{label:"Transient deleted",value:n.transient},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:75,columnNumber:66},this),n.marked!=null&&n.marked>0&&e.jsxDEV(u,{label:"Marked pruned",value:n.marked},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:76,columnNumber:60},this),Object.values(n).every(d=>!d||d===0)&&e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:"Nothing to prune within the selected retention windows."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:78,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:69,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:65,columnNumber:9},this),a.error&&e.jsxDEV("p",{className:"text-xs text-status-error",children:a.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:85,columnNumber:9},this),e.jsxDEV(R,{open:m,onClose:()=>r(!1),title:"Confirm Prune",children:e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("p",{className:"text-sm text-text-secondary",children:"This will permanently delete data. This action cannot be undone."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:91,columnNumber:11},this),e.jsxDEV("ul",{className:"text-xs text-text-secondary space-y-1 list-disc list-inside",children:[s.pruneJobs&&e.jsxDEV("li",{children:["Delete jobs older than ",s.expire]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:95,columnNumber:34},this),s.engineStreams&&e.jsxDEV("li",{children:["Delete engine streams older than ",s.engineStreamsExpire]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:96,columnNumber:38},this),s.workerStreams&&e.jsxDEV("li",{children:["Delete worker streams older than ",s.workerStreamsExpire]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:97,columnNumber:38},this),s.stripAttributes&&e.jsxDEV("li",{children:"Strip execution artifacts from completed jobs"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:98,columnNumber:40},this),s.pruneTransient&&e.jsxDEV("li",{children:"Delete transient (entity-less) jobs"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:99,columnNumber:39},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:94,columnNumber:11},this),e.jsxDEV("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsxDEV("button",{onClick:()=>r(!1),className:"btn-secondary text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:102,columnNumber:13},this),e.jsxDEV("button",{onClick:i,className:"bg-status-error text-white px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity",disabled:a.isPending,children:a.isPending?"Pruning...":"Confirm Prune"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:103,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:101,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:90,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:89,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/PruneSection.tsx",lineNumber:44,columnNumber:5},this)}function E(a){var r;if(!((r=a==null?void 0:a.rules)!=null&&r.length))return g;const s=a.rules,t=s.find(i=>i.target==="streams"&&i.action==="delete"),n=s.find(i=>i.target==="jobs"&&i.action==="delete"&&i.hasEntity===!1),l=s.find(i=>i.target==="jobs"&&i.action==="prune"&&i.hasEntity===!0),m=s.find(i=>i.target==="jobs"&&i.action==="delete"&&i.pruned===!0);return{pruneJobs:!!m,expire:(m==null?void 0:m.olderThan)??"180 days",engineStreams:!!t,engineStreamsExpire:(t==null?void 0:t.olderThan)??"1 day",workerStreams:!!t,workerStreamsExpire:(t==null?void 0:t.olderThan)??"90 days",stripAttributes:!!l,pruneTransient:!!n}}function U(a){const s=[];return a.engineStreams&&s.push({target:"streams",action:"delete",olderThan:a.engineStreamsExpire}),a.workerStreams&&a.workerStreamsExpire!==a.engineStreamsExpire&&s.push({target:"streams",action:"delete",olderThan:a.workerStreamsExpire}),a.pruneTransient&&s.push({target:"jobs",action:"delete",olderThan:a.expire,hasEntity:!1}),a.stripAttributes&&s.push({target:"jobs",action:"prune",olderThan:a.expire,hasEntity:!0}),a.pruneJobs&&s.push({target:"jobs",action:"delete",olderThan:a.expire,pruned:!0}),s}function j(a){var s;return((s=y.find(t=>t.value===a))==null?void 0:s.label)??""}function W(){const{data:a,isLoading:s}=F(),t=I(),[n,l]=c.useState(""),[m,r]=c.useState(g),[i,d]=c.useState(""),p=c.useCallback(()=>{a!=null&&a.config&&(l(a.config.schedule),r(E(a.config)),d(JSON.stringify({schedule:a.config.schedule,fields:E(a.config)})))},[a]);c.useEffect(()=>{p()},[p]);const k=JSON.stringify({schedule:n,fields:m}),f=i!==""&&k!==i,b=(a==null?void 0:a.active)??!1,P=()=>{const o=U(m);t.mutate({schedule:n,rules:o},{onSuccess:()=>{d(JSON.stringify({schedule:n,fields:m}))}})},w=()=>{p()};return s?e.jsxDEV("div",{className:"animate-pulse h-40 bg-surface-sunken rounded"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:99,columnNumber:12},this):e.jsxDEV("div",{className:"space-y-8",children:[e.jsxDEV("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_auto] gap-10",children:[e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Schedule"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:107,columnNumber:11},this),e.jsxDEV("div",{className:"flex items-end gap-4",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] text-text-tertiary mb-1",children:"Cron Expression"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:112,columnNumber:15},this),e.jsxDEV("input",{type:"text",value:n,onChange:o=>l(o.target.value),placeholder:"0 2 * * *",className:"input text-xs font-mono w-48"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:113,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:111,columnNumber:13},this),e.jsxDEV("div",{children:e.jsxDEV("div",{className:"flex items-center gap-1.5 h-8",children:[e.jsxDEV("span",{className:`w-1.5 h-1.5 rounded-full ${b?"bg-status-success":"bg-text-tertiary"}`},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:123,columnNumber:17},this),e.jsxDEV("span",{className:`text-xs ${b?"text-status-success":"text-text-tertiary"}`,children:b?"Active":"Inactive"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:124,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:122,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:121,columnNumber:13},this),j(n)&&e.jsxDEV("p",{className:"text-xs text-text-tertiary h-8 flex items-center",children:j(n)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:130,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:110,columnNumber:11},this),e.jsxDEV("div",{className:"flex flex-wrap gap-1.5 mt-3",children:y.map(o=>e.jsxDEV("button",{type:"button",onClick:()=>l(o.value),className:`px-2.5 py-1 text-[10px] rounded-full transition-colors ${n===o.value?"bg-accent/10 text-accent font-medium":"bg-surface-sunken text-text-tertiary hover:text-text-secondary"}`,children:o.label},o.value,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:137,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:135,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:106,columnNumber:9},this),e.jsxDEV("div",{className:"lg:w-72",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"How It Works"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:154,columnNumber:11},this),e.jsxDEV("div",{className:"flex items-start gap-2 px-3 py-2 rounded bg-surface-sunken",children:[e.jsxDEV(N,{className:"w-3.5 h-3.5 text-text-tertiary shrink-0 mt-0.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:158,columnNumber:13},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary leading-relaxed",children:"Rules execute sequentially on each cron cycle. Engine streams can be pruned aggressively since they only contain internal routing data. Worker streams should be retained longer to preserve execution playback and input enrichment."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:159,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:157,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:153,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:105,columnNumber:7},this),e.jsxDEV(V,{fields:m,onChange:r},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:169,columnNumber:7},this),e.jsxDEV("div",{className:"flex items-center justify-between pt-2 border-t border-surface-border",children:[e.jsxDEV("div",{className:"flex items-center gap-3",children:[f&&e.jsxDEV("button",{onClick:w,className:"text-[10px] text-text-tertiary hover:text-text-primary transition-colors",children:"Revert changes"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:175,columnNumber:13},this),t.error&&e.jsxDEV("p",{className:"text-xs text-status-error",children:t.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:183,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:173,columnNumber:9},this),e.jsxDEV("button",{onClick:P,disabled:!f||!n.trim()||t.isPending,className:"btn-primary text-xs disabled:opacity-40 shrink-0",children:t.isPending?"Saving...":"Save Schedule"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:186,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:172,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/ScheduleSection.tsx",lineNumber:103,columnNumber:5},this)}function L({mode:a,onChange:s}){const t=(n,l,m)=>e.jsxDEV("button",{onClick:()=>s(n),className:`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${a===n?"bg-accent/10 text-accent font-medium":"text-text-tertiary hover:text-text-secondary hover:bg-surface-hover"}`,children:[l,m]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:11,columnNumber:5},this);return e.jsxDEV("div",{className:"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit",children:[t("prune",e.jsxDEV(O,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:26,columnNumber:21},this),"Prune Now"),t("schedule",e.jsxDEV(A,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:27,columnNumber:24},this),"Schedule")]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:25,columnNumber:5},this)}function Y(){const[a,s]=c.useState("schedule");return e.jsxDEV("div",{children:[e.jsxDEV(M,{title:"DB Maintenance",actions:e.jsxDEV(L,{mode:a,onChange:s},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:39,columnNumber:18},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:37,columnNumber:7},this),e.jsxDEV("div",{className:"flex items-start gap-2 px-4 py-3 mb-8 rounded-md bg-accent/5 border border-accent/10",children:[e.jsxDEV(N,{className:"w-4 h-4 text-accent shrink-0 mt-0.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:43,columnNumber:9},this),e.jsxDEV("p",{className:"text-xs text-text-secondary leading-relaxed",children:"Completed process data grows indefinitely. Schedule regular pruning to keep the database lean and queries fast. Worker streams are retained longer than engine streams to preserve execution playback."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:44,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:42,columnNumber:7},this),a==="prune"?e.jsxDEV($,{},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:51,columnNumber:27},this):e.jsxDEV(W,{},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:51,columnNumber:46},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/maintenance/MaintenancePage.tsx",lineNumber:36,columnNumber:5},this)}export{Y as MaintenancePage};
2
+ //# sourceMappingURL=index-XGOmZ117.js.map