@hotmeshio/long-tail 0.1.3 → 0.1.5

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 (615) hide show
  1. package/README.md +118 -173
  2. package/build/examples/seed.js +1 -1
  3. package/build/examples/workflows/basic-echo/activities.d.ts +2 -2
  4. package/build/examples/workflows/basic-echo/activities.js +7 -7
  5. package/build/examples/workflows/basic-echo/index.js +1 -1
  6. package/build/examples/workflows/kitchen-sink/index.js +2 -2
  7. package/build/index.d.ts +12 -10
  8. package/build/index.js +15 -12
  9. package/build/lib/db/index.d.ts +18 -0
  10. package/build/{services → lib}/db/index.js +9 -0
  11. package/build/{services → lib}/db/migrate.js +3 -3
  12. package/build/{services → lib}/telemetry/honeycomb.d.ts +2 -2
  13. package/build/{services → lib}/telemetry/honeycomb.js +2 -2
  14. package/build/modules/defaults.d.ts +2 -0
  15. package/build/modules/defaults.js +3 -1
  16. package/build/routes/controlplane.js +1 -1
  17. package/build/routes/dba.js +4 -0
  18. package/build/routes/docs.d.ts +2 -0
  19. package/build/routes/docs.js +87 -0
  20. package/build/routes/escalations/bulk.js +120 -202
  21. package/build/routes/escalations/resolve.js +1 -1
  22. package/build/routes/escalations/single.js +1 -1
  23. package/build/routes/files.js +1 -1
  24. package/build/routes/index.js +2 -0
  25. package/build/routes/insight.js +2 -1
  26. package/build/routes/mcp.js +3 -2
  27. package/build/routes/oauth.js +1 -1
  28. package/build/routes/settings.js +4 -4
  29. package/build/routes/workflows/discovery.js +3 -3
  30. package/build/routes/workflows/invocation.js +1 -1
  31. package/build/routes/yaml-workflows/crud.js +1 -1
  32. package/build/routes/yaml-workflows/deployment.js +25 -0
  33. package/build/services/auth/bot-api-key.js +1 -1
  34. package/build/services/auth/index.d.ts +4 -0
  35. package/build/services/auth/index.js +17 -0
  36. package/build/services/auth/service-token.js +1 -1
  37. package/build/services/config/provider.js +1 -1
  38. package/build/services/config/read.js +1 -1
  39. package/build/services/config/write.js +1 -1
  40. package/build/services/controlplane/index.js +3 -4
  41. package/build/services/controlplane/quorum-bridge.js +2 -2
  42. package/build/services/cron/index.js +4 -5
  43. package/build/services/dba.d.ts +4 -0
  44. package/build/services/dba.js +3 -6
  45. package/build/services/escalation/bulk.js +1 -1
  46. package/build/services/escalation/crud.js +1 -1
  47. package/build/services/escalation/queries.js +1 -1
  48. package/build/services/export/client.js +2 -5
  49. package/build/services/export/index.js +14 -2
  50. package/build/services/hotmesh-utils.js +1 -1
  51. package/build/services/iam/bots.js +6 -12
  52. package/build/services/iam/context.d.ts +1 -1
  53. package/build/services/iam/context.js +5 -5
  54. package/build/services/iam/credentials.js +1 -1
  55. package/build/services/iam/ephemeral.js +8 -15
  56. package/build/services/iam/principal.js +3 -10
  57. package/build/services/iam/resolve.js +1 -1
  58. package/build/services/iam/sql.d.ts +10 -0
  59. package/build/services/iam/sql.js +42 -0
  60. package/build/services/insight/index.d.ts +1 -0
  61. package/build/services/insight/index.js +4 -6
  62. package/build/services/interceptor/activities/escalation.js +1 -1
  63. package/build/services/interceptor/activities/task.js +9 -6
  64. package/build/services/interceptor/activities/workflow.js +4 -5
  65. package/build/services/interceptor/activity-interceptor.d.ts +1 -1
  66. package/build/services/interceptor/activity-interceptor.js +5 -5
  67. package/build/services/interceptor/completion.js +1 -1
  68. package/build/services/interceptor/escalation.js +1 -1
  69. package/build/services/interceptor/index.js +4 -4
  70. package/build/services/interceptor/lifecycle.js +1 -1
  71. package/build/services/maintenance/index.js +4 -5
  72. package/build/services/mcp/adapter.js +1 -16
  73. package/build/services/mcp/client/connection.d.ts +1 -1
  74. package/build/services/mcp/client/connection.js +2 -2
  75. package/build/services/mcp/client/tools.js +1 -1
  76. package/build/services/mcp/db-server/index.js +1 -1
  77. package/build/services/mcp/db-server/tools.js +17 -4
  78. package/build/services/mcp/db.js +1 -1
  79. package/build/services/mcp/playwright-server/index.js +1 -1
  80. package/build/services/mcp/playwright-server/lifecycle.js +1 -1
  81. package/build/services/mcp/playwright-server/schemas.d.ts +2 -2
  82. package/build/services/mcp/playwright-server/tools.js +1 -1
  83. package/build/services/mcp/register-tool.d.ts +11 -0
  84. package/build/services/mcp/register-tool.js +15 -0
  85. package/build/services/mcp/server.js +1 -1
  86. package/build/services/mcp/sql.d.ts +6 -0
  87. package/build/services/mcp/sql.js +34 -1
  88. package/build/services/mcp/workflow-compiler-server.js +1 -1
  89. package/build/services/mcp/workflow-server.js +1 -1
  90. package/build/services/mcp-runs/execution-builder.js +8 -6
  91. package/build/services/mcp-runs/queries.js +2 -2
  92. package/build/services/mcp-runs/sql.d.ts +4 -1
  93. package/build/services/mcp-runs/sql.js +23 -2
  94. package/build/services/namespace/index.js +1 -1
  95. package/build/services/oauth/db.js +9 -37
  96. package/build/services/oauth/index.js +1 -1
  97. package/build/services/oauth/providers/registry.js +1 -1
  98. package/build/services/oauth/sql.d.ts +7 -0
  99. package/build/services/oauth/sql.js +32 -0
  100. package/build/services/orchestrator/index.js +3 -3
  101. package/build/services/role/index.js +1 -1
  102. package/build/services/task/crud.js +1 -1
  103. package/build/services/task/process.js +1 -1
  104. package/build/services/task/resolve.js +1 -1
  105. package/build/services/user/auth.js +1 -1
  106. package/build/services/user/crud.js +1 -1
  107. package/build/services/user/rbac.js +1 -1
  108. package/build/services/user/roles.js +1 -1
  109. package/build/services/user/sql.d.ts +2 -0
  110. package/build/services/user/sql.js +3 -1
  111. package/build/services/yaml-workflow/db-utils.js +1 -1
  112. package/build/services/yaml-workflow/db.js +1 -1
  113. package/build/services/yaml-workflow/deployer-helpers.js +1 -1
  114. package/build/services/yaml-workflow/deployer.js +4 -4
  115. package/build/services/yaml-workflow/generator.js +1 -1
  116. package/build/services/yaml-workflow/input-analyzer-helpers.d.ts +6 -0
  117. package/build/services/yaml-workflow/input-analyzer-helpers.js +36 -7
  118. package/build/services/yaml-workflow/input-analyzer.js +16 -3
  119. package/build/services/yaml-workflow/pipeline/analyze.js +1 -1
  120. package/build/services/yaml-workflow/pipeline/build/dag.js +10 -5
  121. package/build/services/yaml-workflow/pipeline/compile/llm-call.js +1 -1
  122. package/build/services/yaml-workflow/pipeline/extract.js +5 -3
  123. package/build/services/yaml-workflow/pipeline/index.d.ts +5 -0
  124. package/build/services/yaml-workflow/pipeline/index.js +22 -0
  125. package/build/services/yaml-workflow/pipeline/validate.js +2 -2
  126. package/build/services/yaml-workflow/workers/callbacks.js +1 -1
  127. package/build/services/yaml-workflow/workers/events.js +2 -2
  128. package/build/services/yaml-workflow/workers/register.js +8 -8
  129. package/build/start/adapters.js +7 -7
  130. package/build/start/index.js +4 -4
  131. package/build/start/server.js +1 -1
  132. package/build/start/workers.d.ts +1 -2
  133. package/build/start/workers.js +8 -7
  134. package/build/system/activities/claude-code.js +1 -1
  135. package/build/system/activities/file-storage.js +1 -1
  136. package/build/system/activities/knowledge.d.ts +58 -0
  137. package/build/system/activities/knowledge.js +128 -0
  138. package/build/system/activities/sql.d.ts +9 -0
  139. package/build/system/activities/sql.js +41 -0
  140. package/build/system/activities/triage/context.js +1 -1
  141. package/build/system/activities/triage/discovery.d.ts +2 -14
  142. package/build/system/activities/triage/discovery.js +5 -161
  143. package/build/system/activities/triage/llm.d.ts +1 -8
  144. package/build/system/activities/triage/llm.js +2 -28
  145. package/build/system/activities/triage/tools.d.ts +1 -17
  146. package/build/system/activities/triage/tools.js +8 -167
  147. package/build/system/index.js +5 -4
  148. package/build/system/mcp-servers/admin/escalations.d.ts +5 -0
  149. package/build/system/mcp-servers/admin/escalations.js +149 -0
  150. package/build/system/mcp-servers/admin/index.d.ts +31 -0
  151. package/build/system/mcp-servers/admin/index.js +80 -0
  152. package/build/system/mcp-servers/admin/maintenance.d.ts +5 -0
  153. package/build/system/mcp-servers/admin/maintenance.js +58 -0
  154. package/build/system/mcp-servers/admin/mcp-servers.d.ts +5 -0
  155. package/build/system/mcp-servers/admin/mcp-servers.js +146 -0
  156. package/build/system/mcp-servers/admin/schemas.d.ts +411 -0
  157. package/build/system/mcp-servers/admin/schemas.js +177 -0
  158. package/build/system/mcp-servers/admin/tasks.d.ts +5 -0
  159. package/build/system/mcp-servers/admin/tasks.js +112 -0
  160. package/build/system/mcp-servers/admin/users.d.ts +5 -0
  161. package/build/system/mcp-servers/admin/users.js +167 -0
  162. package/build/system/mcp-servers/admin/workflow-config.d.ts +9 -0
  163. package/build/system/mcp-servers/admin/workflow-config.js +118 -0
  164. package/build/system/mcp-servers/admin/workflows.d.ts +6 -0
  165. package/build/system/mcp-servers/admin/workflows.js +138 -0
  166. package/build/system/mcp-servers/admin/yaml-workflows.d.ts +8 -0
  167. package/build/system/mcp-servers/admin/yaml-workflows.js +237 -0
  168. package/build/system/mcp-servers/claude-code.js +1 -1
  169. package/build/system/mcp-servers/db-query/index.js +1 -1
  170. package/build/system/mcp-servers/db-query/tools.js +17 -4
  171. package/build/system/mcp-servers/docs.d.ts +5 -0
  172. package/build/system/mcp-servers/docs.js +147 -0
  173. package/build/system/mcp-servers/file-storage.js +1 -1
  174. package/build/system/mcp-servers/http-fetch.js +1 -1
  175. package/build/system/mcp-servers/human-queue.js +1 -1
  176. package/build/system/mcp-servers/knowledge.d.ts +4 -0
  177. package/build/system/mcp-servers/knowledge.js +137 -0
  178. package/build/system/mcp-servers/oauth.js +1 -1
  179. package/build/system/mcp-servers/playwright/browser-lifecycle.js +1 -1
  180. package/build/system/mcp-servers/playwright/index.js +1 -1
  181. package/build/system/mcp-servers/playwright/schemas.d.ts +19 -8
  182. package/build/system/mcp-servers/playwright/schemas.js +3 -0
  183. package/build/system/mcp-servers/playwright/tools-navigation.js +22 -9
  184. package/build/system/mcp-servers/playwright/tools-run-script.js +20 -3
  185. package/build/system/mcp-servers/playwright/vision-helper.d.ts +12 -0
  186. package/build/system/mcp-servers/playwright/vision-helper.js +81 -0
  187. package/build/system/mcp-servers/playwright-cli/helpers.js +2 -2
  188. package/build/system/mcp-servers/playwright-cli/index.js +1 -1
  189. package/build/system/mcp-servers/playwright-cli/schemas.d.ts +28 -28
  190. package/build/system/mcp-servers/playwright-cli/schemas.js +1 -1
  191. package/build/system/mcp-servers/playwright-cli/tools-auth.js +1 -1
  192. package/build/system/mcp-servers/playwright-cli/tools-capture.js +4 -2
  193. package/build/system/mcp-servers/translation.d.ts +14 -0
  194. package/build/system/mcp-servers/translation.js +130 -0
  195. package/build/system/mcp-servers/vision-prompts.d.ts +2 -0
  196. package/build/system/mcp-servers/vision-prompts.js +9 -0
  197. package/build/system/mcp-servers/{document-vision.d.ts → vision.d.ts} +3 -4
  198. package/build/system/mcp-servers/vision.js +221 -0
  199. package/build/system/mcp-servers/workflow-compiler.js +1 -1
  200. package/build/system/mcp-servers/workflow.js +1 -1
  201. package/build/system/seed/index.js +13 -2
  202. package/build/system/seed/server-definitions.d.ts +1954 -322
  203. package/build/system/seed/server-definitions.js +65 -34
  204. package/build/system/seed/tool-manifests-admin.d.ts +1645 -0
  205. package/build/system/seed/tool-manifests-admin.js +45 -0
  206. package/build/system/seed/tool-manifests-browser.d.ts +1 -1
  207. package/build/system/seed/tool-manifests-browser.js +3 -3
  208. package/build/system/seed/tool-manifests-data.d.ts +62 -21
  209. package/build/system/seed/tool-manifests-data.js +55 -17
  210. package/build/system/seed/tool-manifests-knowledge.d.ts +171 -0
  211. package/build/system/seed/tool-manifests-knowledge.js +94 -0
  212. package/build/system/workflows/mcp-deterministic/index.js +1 -1
  213. package/build/system/workflows/mcp-query/activities/discovery.d.ts +2 -20
  214. package/build/system/workflows/mcp-query/activities/discovery.js +5 -163
  215. package/build/system/workflows/mcp-query/activities/llm.d.ts +1 -7
  216. package/build/system/workflows/mcp-query/activities/llm.js +2 -27
  217. package/build/system/workflows/mcp-query/activities/tool-executor.d.ts +0 -4
  218. package/build/system/workflows/mcp-query/activities/tool-executor.js +2 -106
  219. package/build/system/workflows/mcp-query/activities/tool-loader.d.ts +0 -9
  220. package/build/system/workflows/mcp-query/activities/tool-loader.js +2 -87
  221. package/build/system/workflows/mcp-query/index.js +55 -5
  222. package/build/system/workflows/mcp-query/prompts.d.ts +1 -2
  223. package/build/system/workflows/mcp-query/prompts.js +5 -32
  224. package/build/system/workflows/mcp-query/strategy-advisors.d.ts +3 -14
  225. package/build/system/workflows/mcp-query/strategy-advisors.js +4 -107
  226. package/build/system/workflows/mcp-query/types.d.ts +2 -10
  227. package/build/system/workflows/mcp-query/types.js +0 -1
  228. package/build/system/workflows/mcp-query-router/index.js +1 -1
  229. package/build/system/workflows/mcp-triage/index.d.ts +2 -2
  230. package/build/system/workflows/mcp-triage/index.js +39 -7
  231. package/build/system/workflows/mcp-triage/prompts.js +7 -14
  232. package/build/system/workflows/mcp-triage-deterministic/index.js +1 -1
  233. package/build/system/workflows/mcp-triage-router/index.js +1 -1
  234. package/build/system/workflows/shared/discovery.d.ts +35 -0
  235. package/build/system/workflows/shared/discovery.js +175 -0
  236. package/build/system/workflows/shared/index.d.ts +7 -0
  237. package/build/system/workflows/shared/index.js +18 -0
  238. package/build/system/workflows/shared/llm-caller.d.ts +8 -0
  239. package/build/system/workflows/shared/llm-caller.js +31 -0
  240. package/build/system/workflows/shared/prompts.d.ts +2 -0
  241. package/build/system/workflows/shared/prompts.js +32 -0
  242. package/build/system/workflows/shared/strategy-advisors.d.ts +14 -0
  243. package/build/system/workflows/shared/strategy-advisors.js +109 -0
  244. package/build/system/workflows/shared/tool-executor.d.ts +11 -0
  245. package/build/system/workflows/shared/tool-executor.js +111 -0
  246. package/build/system/workflows/shared/tool-loader.d.ts +19 -0
  247. package/build/system/workflows/shared/tool-loader.js +94 -0
  248. package/build/system/workflows/shared/types.d.ts +9 -0
  249. package/build/system/workflows/shared/types.js +2 -0
  250. package/build/system/workflows/tool-result-guard.d.ts +14 -0
  251. package/build/system/workflows/tool-result-guard.js +78 -0
  252. package/build/tsconfig.tsbuildinfo +1 -1
  253. package/build/types/user.d.ts +2 -0
  254. package/build/vitest.config.d.ts +1 -1
  255. package/build/vitest.integration.config.d.ts +1 -1
  256. package/build/workers/index.js +2 -8
  257. package/dashboard/dist/assets/AdminDashboard-CTyAMUJR.js +2 -0
  258. package/dashboard/dist/assets/AdminDashboard-CTyAMUJR.js.map +1 -0
  259. package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js +2 -0
  260. package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js.map +1 -0
  261. package/dashboard/dist/assets/BotPicker-C51nKFEu.js +2 -0
  262. package/dashboard/dist/assets/{BotPicker-D6FYW1Gt.js.map → BotPicker-C51nKFEu.js.map} +1 -1
  263. package/dashboard/dist/assets/CollapsibleSection-BSyfd8uL.js +2 -0
  264. package/dashboard/dist/assets/{CollapsibleSection-Cxk4wvjT.js.map → CollapsibleSection-BSyfd8uL.js.map} +1 -1
  265. package/dashboard/dist/assets/ConfirmDeleteModal-CBdhia5T.js +2 -0
  266. package/dashboard/dist/assets/{ConfirmDeleteModal-FSXyKjaB.js.map → ConfirmDeleteModal-CBdhia5T.js.map} +1 -1
  267. package/dashboard/dist/assets/CopyableId-dGlewBCS.js +2 -0
  268. package/dashboard/dist/assets/{CopyableId-CBdxWfp8.js.map → CopyableId-dGlewBCS.js.map} +1 -1
  269. package/dashboard/dist/assets/CredentialsPage-CoBNFSAu.js +2 -0
  270. package/dashboard/dist/assets/{CredentialsPage-Ikzsot0w.js.map → CredentialsPage-CoBNFSAu.js.map} +1 -1
  271. package/dashboard/dist/assets/CustomDurationPicker-BataWFj8.js +2 -0
  272. package/dashboard/dist/assets/{CustomDurationPicker-CAninCbl.js.map → CustomDurationPicker-BataWFj8.js.map} +1 -1
  273. package/dashboard/dist/assets/DataTable-B3uf5CCo.js +2 -0
  274. package/dashboard/dist/assets/DataTable-B3uf5CCo.js.map +1 -0
  275. package/dashboard/dist/assets/ElapsedCell-G5oSwTpT.js +2 -0
  276. package/dashboard/dist/assets/ElapsedCell-G5oSwTpT.js.map +1 -0
  277. package/dashboard/dist/assets/EmptyState-BChBJNGS.js +2 -0
  278. package/dashboard/dist/assets/{EmptyState-2CmV-IaS.js.map → EmptyState-BChBJNGS.js.map} +1 -1
  279. package/dashboard/dist/assets/EscalationsOverview-CxUv8xjG.js +2 -0
  280. package/dashboard/dist/assets/{EscalationsOverview-GXYFPASS.js.map → EscalationsOverview-CxUv8xjG.js.map} +1 -1
  281. package/dashboard/dist/assets/EventTable-CVt8B0BZ.js +2 -0
  282. package/dashboard/dist/assets/{EventTable-B01oJf6Y.js.map → EventTable-CVt8B0BZ.js.map} +1 -1
  283. package/dashboard/dist/assets/FilterBar-CShf0oe7.js +2 -0
  284. package/dashboard/dist/assets/{FilterBar-Ck4K4rzu.js.map → FilterBar-CShf0oe7.js.map} +1 -1
  285. package/dashboard/dist/assets/McpOverview-CbaZRnJl.js +2 -0
  286. package/dashboard/dist/assets/{McpOverview-JkvRcX2e.js.map → McpOverview-CbaZRnJl.js.map} +1 -1
  287. package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js +5 -0
  288. package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js.map +1 -0
  289. package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js +2 -0
  290. package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js.map +1 -0
  291. package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js +2 -0
  292. package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js.map +1 -0
  293. package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js +2 -0
  294. package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js.map +1 -0
  295. package/dashboard/dist/assets/Modal-CI5RBPOQ.js +2 -0
  296. package/dashboard/dist/assets/{Modal-B4rbIVAn.js.map → Modal-CI5RBPOQ.js.map} +1 -1
  297. package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js +2 -0
  298. package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js.map +1 -0
  299. package/dashboard/dist/assets/PageHeader-SMD9qtOO.js +2 -0
  300. package/dashboard/dist/assets/PageHeader-SMD9qtOO.js.map +1 -0
  301. package/dashboard/dist/assets/PageHeaderWithStats-TikLQsTp.js +2 -0
  302. package/dashboard/dist/assets/PageHeaderWithStats-TikLQsTp.js.map +1 -0
  303. package/dashboard/dist/assets/PriorityBadge-CQ0EsLTA.js +2 -0
  304. package/dashboard/dist/assets/{PriorityBadge-DfQY9St9.js.map → PriorityBadge-CQ0EsLTA.js.map} +1 -1
  305. package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js +2 -0
  306. package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js.map +1 -0
  307. package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js +2 -0
  308. package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js.map +1 -0
  309. package/dashboard/dist/assets/RefreshButton-BcQDObrv.js +2 -0
  310. package/dashboard/dist/assets/RefreshButton-BcQDObrv.js.map +1 -0
  311. package/dashboard/dist/assets/RolePill-Crj4TH5p.js +2 -0
  312. package/dashboard/dist/assets/{RolePill-BTPa8L-P.js.map → RolePill-Crj4TH5p.js.map} +1 -1
  313. package/dashboard/dist/assets/RolesPage-C_RInUwS.js +2 -0
  314. package/dashboard/dist/assets/RolesPage-C_RInUwS.js.map +1 -0
  315. package/dashboard/dist/assets/RowActions-Cp5HyK_w.js +2 -0
  316. package/dashboard/dist/assets/{RowActions-Dg-Fsm5O.js.map → RowActions-Cp5HyK_w.js.map} +1 -1
  317. package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js +2 -0
  318. package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js.map +1 -0
  319. package/dashboard/dist/assets/StatCard-BKZLSgNV.js +2 -0
  320. package/dashboard/dist/assets/{StatCard-DlgF0CJC.js.map → StatCard-BKZLSgNV.js.map} +1 -1
  321. package/dashboard/dist/assets/StatusBadge-BYNGGZK5.js +2 -0
  322. package/dashboard/dist/assets/StatusBadge-BYNGGZK5.js.map +1 -0
  323. package/dashboard/dist/assets/StickyPagination-CTosgiU2.js +2 -0
  324. package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js.map → StickyPagination-CTosgiU2.js.map} +1 -1
  325. package/dashboard/dist/assets/SwimlaneTimeline-ylG5Ps1s.js +2 -0
  326. package/dashboard/dist/assets/SwimlaneTimeline-ylG5Ps1s.js.map +1 -0
  327. package/dashboard/dist/assets/TaskDetailPage-C9pDGdD2.js +2 -0
  328. package/dashboard/dist/assets/TaskDetailPage-C9pDGdD2.js.map +1 -0
  329. package/dashboard/dist/assets/TaskQueuePill-BtJbZTT0.js +2 -0
  330. package/dashboard/dist/assets/{TaskQueuePill-awmtb0qw.js.map → TaskQueuePill-BtJbZTT0.js.map} +1 -1
  331. package/dashboard/dist/assets/TasksListPage-DtFLUEhg.js +2 -0
  332. package/dashboard/dist/assets/{TasksListPage-C_QF23c1.js.map → TasksListPage-DtFLUEhg.js.map} +1 -1
  333. package/dashboard/dist/assets/TimeAgo-WuM6xImZ.js +2 -0
  334. package/dashboard/dist/assets/TimeAgo-WuM6xImZ.js.map +1 -0
  335. package/dashboard/dist/assets/TimestampCell-IVL_-Upy.js +2 -0
  336. package/dashboard/dist/assets/TimestampCell-IVL_-Upy.js.map +1 -0
  337. package/dashboard/dist/assets/UserName-DU9qeg13.js +2 -0
  338. package/dashboard/dist/assets/{UserName-DaP4YAKr.js.map → UserName-DU9qeg13.js.map} +1 -1
  339. package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js +2 -0
  340. package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js.map +1 -0
  341. package/dashboard/dist/assets/WorkflowPill-Diw8iWBP.js +2 -0
  342. package/dashboard/dist/assets/WorkflowPill-Diw8iWBP.js.map +1 -0
  343. package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js +2 -0
  344. package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js.map +1 -0
  345. package/dashboard/dist/assets/WorkflowsOverview-CPuvA4t3.js +2 -0
  346. package/dashboard/dist/assets/{WorkflowsOverview-D9OzzQqw.js.map → WorkflowsOverview-CPuvA4t3.js.map} +1 -1
  347. package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js +2 -0
  348. package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js.map +1 -0
  349. package/dashboard/dist/assets/{bots-BkKVMbUW.js → bots-BPiZXf2h.js} +2 -2
  350. package/dashboard/dist/assets/{bots-BkKVMbUW.js.map → bots-BPiZXf2h.js.map} +1 -1
  351. package/dashboard/dist/assets/constants-BHkpVaqx.js +2 -0
  352. package/dashboard/dist/assets/constants-BHkpVaqx.js.map +1 -0
  353. package/dashboard/dist/assets/escalation-DTY_OKRh.js +2 -0
  354. package/dashboard/dist/assets/escalation-DTY_OKRh.js.map +1 -0
  355. package/dashboard/dist/assets/escalation-columns-C91fHSkp.js +2 -0
  356. package/dashboard/dist/assets/{escalation-columns-D6aqStaY.js.map → escalation-columns-C91fHSkp.js.map} +1 -1
  357. package/dashboard/dist/assets/helpers-DBUZ9pnG.js +2 -0
  358. package/dashboard/dist/assets/helpers-DBUZ9pnG.js.map +1 -0
  359. package/dashboard/dist/assets/index-BOeA-gfK.js +17 -0
  360. package/dashboard/dist/assets/{index-X85K5bHC.js.map → index-BOeA-gfK.js.map} +1 -1
  361. package/dashboard/dist/assets/index-BZ6K_kmL.js +3 -0
  362. package/dashboard/dist/assets/index-BZ6K_kmL.js.map +1 -0
  363. package/dashboard/dist/assets/index-Bpm0yeoi.js +2 -0
  364. package/dashboard/dist/assets/index-Bpm0yeoi.js.map +1 -0
  365. package/dashboard/dist/assets/index-BtOwLI0K.js +2 -0
  366. package/dashboard/dist/assets/{index-DTPzZr_X.js.map → index-BtOwLI0K.js.map} +1 -1
  367. package/dashboard/dist/assets/index-CBF3ZvRZ.js +6 -0
  368. package/dashboard/dist/assets/index-CBF3ZvRZ.js.map +1 -0
  369. package/dashboard/dist/assets/index-CDWOfCmi.js +2 -0
  370. package/dashboard/dist/assets/index-CDWOfCmi.js.map +1 -0
  371. package/dashboard/dist/assets/index-Ce6sL__n.js +2 -0
  372. package/dashboard/dist/assets/index-Ce6sL__n.js.map +1 -0
  373. package/dashboard/dist/assets/index-DSzSoku1.js +283 -0
  374. package/dashboard/dist/assets/index-DSzSoku1.js.map +1 -0
  375. package/dashboard/dist/assets/index-D_qEAYrg.js +2 -0
  376. package/dashboard/dist/assets/index-D_qEAYrg.js.map +1 -0
  377. package/dashboard/dist/assets/index-gCy9XX3W.css +1 -0
  378. package/dashboard/dist/assets/mcp-BzVpaaKF.js +2 -0
  379. package/dashboard/dist/assets/{mcp-blCW6IL7.js.map → mcp-BzVpaaKF.js.map} +1 -1
  380. package/dashboard/dist/assets/mcp-query-wTuxTTCV.js +2 -0
  381. package/dashboard/dist/assets/mcp-query-wTuxTTCV.js.map +1 -0
  382. package/dashboard/dist/assets/{mcp-runs-ChPbpvXK.js → mcp-runs-DmXYJD19.js} +2 -2
  383. package/dashboard/dist/assets/{mcp-runs-ChPbpvXK.js.map → mcp-runs-DmXYJD19.js.map} +1 -1
  384. package/dashboard/dist/assets/namespaces-DoGa7jc7.js +2 -0
  385. package/dashboard/dist/assets/{namespaces-BgbaC3ow.js.map → namespaces-DoGa7jc7.js.map} +1 -1
  386. package/dashboard/dist/assets/{roles-ZNrqqnQl.js → roles-wCdQ2Z7k.js} +2 -2
  387. package/dashboard/dist/assets/{roles-ZNrqqnQl.js.map → roles-wCdQ2Z7k.js.map} +1 -1
  388. package/dashboard/dist/assets/settings-DDe_L7JT.js +2 -0
  389. package/dashboard/dist/assets/{settings-eBRSE0mQ.js.map → settings-DDe_L7JT.js.map} +1 -1
  390. package/dashboard/dist/assets/tasks-3Hih8Bt7.js +2 -0
  391. package/dashboard/dist/assets/{tasks-tRqClPns.js.map → tasks-3Hih8Bt7.js.map} +1 -1
  392. package/dashboard/dist/assets/{useFilterParams-BaXUAkYK.js → useFilterParams-BUyLHcx_.js} +2 -2
  393. package/dashboard/dist/assets/{useFilterParams-BaXUAkYK.js.map → useFilterParams-BUyLHcx_.js.map} +1 -1
  394. package/dashboard/dist/assets/{useNatsEvents-Xr43X1fG.js → useNatsEvents-DeGKHFTX.js} +2 -2
  395. package/dashboard/dist/assets/{useNatsEvents-Xr43X1fG.js.map → useNatsEvents-DeGKHFTX.js.map} +1 -1
  396. package/dashboard/dist/assets/{useYamlActivityEvents-BO51u8tm.js → useYamlActivityEvents-B5dHec6Y.js} +2 -2
  397. package/dashboard/dist/assets/{useYamlActivityEvents-BO51u8tm.js.map → useYamlActivityEvents-B5dHec6Y.js.map} +1 -1
  398. package/dashboard/dist/assets/{users-tMvNyOo8.js → users-BTagPmGW.js} +2 -2
  399. package/dashboard/dist/assets/{users-tMvNyOo8.js.map → users-BTagPmGW.js.map} +1 -1
  400. package/dashboard/dist/assets/{vendor-icons-ZTAKVwGc.js → vendor-icons-DCLlGYO9.js} +112 -57
  401. package/dashboard/dist/assets/vendor-icons-DCLlGYO9.js.map +1 -0
  402. package/dashboard/dist/assets/vendor-query-DLp59M9_.js +35 -0
  403. package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +1 -0
  404. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +26 -0
  405. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +1 -0
  406. package/dashboard/dist/assets/{workflows-Cc4VHcrp.js → workflows-B20dR3NE.js} +2 -2
  407. package/dashboard/dist/assets/{workflows-Cc4VHcrp.js.map → workflows-B20dR3NE.js.map} +1 -1
  408. package/dashboard/dist/assets/yaml-workflows-CaLPMQha.js +2 -0
  409. package/dashboard/dist/assets/yaml-workflows-CaLPMQha.js.map +1 -0
  410. package/dashboard/dist/index.html +5 -5
  411. package/docs/api/dba.md +81 -0
  412. package/docs/api/escalations.md +575 -0
  413. package/docs/api/exports.md +170 -0
  414. package/docs/api/maintenance.md +93 -0
  415. package/docs/api/mcp-runs.md +128 -0
  416. package/docs/api/mcp-servers.md +195 -0
  417. package/docs/api/namespaces.md +48 -0
  418. package/docs/api/roles.md +390 -0
  419. package/docs/api/service-accounts.md +188 -0
  420. package/docs/api/settings.md +33 -0
  421. package/docs/api/tasks.md +167 -0
  422. package/docs/api/users.md +180 -0
  423. package/docs/api/workflows.md +616 -0
  424. package/docs/api/yaml-workflows.md +312 -0
  425. package/docs/architecture.md +221 -0
  426. package/docs/auth.md +181 -0
  427. package/docs/cloud.md +272 -0
  428. package/docs/compilation.md +136 -0
  429. package/docs/contributing.md +56 -0
  430. package/docs/dashboard.md +145 -0
  431. package/docs/data.md +478 -0
  432. package/docs/escalation-strategies.md +264 -0
  433. package/docs/events.md +251 -0
  434. package/docs/iam.md +222 -0
  435. package/docs/img/01-login.png +0 -0
  436. package/docs/img/02-dashboard-home.png +0 -0
  437. package/docs/img/03-processes-list.png +0 -0
  438. package/docs/img/04-escalations-list.png +0 -0
  439. package/docs/img/05-mcp-servers.png +0 -0
  440. package/docs/img/06-mcp-pipelines.png +0 -0
  441. package/docs/img/07-workflows-list.png +0 -0
  442. package/docs/img/compilation/01-query-submit.png +0 -0
  443. package/docs/img/compilation/02-mcp-servers.png +0 -0
  444. package/docs/img/compilation/03-query-completed.png +0 -0
  445. package/docs/img/compilation/04-wizard-original.png +0 -0
  446. package/docs/img/compilation/05-wizard-timeline.png +0 -0
  447. package/docs/img/compilation/06-wizard-profile.png +0 -0
  448. package/docs/img/compilation/07-wizard-deploy.png +0 -0
  449. package/docs/img/compilation/08-wizard-test-modal.png +0 -0
  450. package/docs/img/compilation/09-wizard-test-compare.png +0 -0
  451. package/docs/img/compilation/10-wizard-verify.png +0 -0
  452. package/docs/logging.md +110 -0
  453. package/docs/maintenance.md +221 -0
  454. package/docs/mcp.md +715 -0
  455. package/docs/oauth-and-delegation.md +469 -0
  456. package/docs/telemetry.md +144 -0
  457. package/docs/workflows.md +695 -0
  458. package/lib/db/schemas/015_knowledge.sql +23 -0
  459. package/package.json +8 -9
  460. package/build/services/db/index.d.ts +0 -3
  461. package/build/services/mcp/vision-server.d.ts +0 -15
  462. package/build/services/mcp/vision-server.js +0 -214
  463. package/build/system/mcp-servers/document-vision.js +0 -228
  464. package/build/system/mcp-servers/prompts.d.ts +0 -4
  465. package/build/system/mcp-servers/prompts.js +0 -10
  466. package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js +0 -2
  467. package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js.map +0 -1
  468. package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js +0 -2
  469. package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js.map +0 -1
  470. package/dashboard/dist/assets/BotPicker-D6FYW1Gt.js +0 -2
  471. package/dashboard/dist/assets/CollapsibleSection-Cxk4wvjT.js +0 -2
  472. package/dashboard/dist/assets/ConfirmDeleteModal-FSXyKjaB.js +0 -2
  473. package/dashboard/dist/assets/CopyableId-CBdxWfp8.js +0 -2
  474. package/dashboard/dist/assets/CredentialsPage-Ikzsot0w.js +0 -2
  475. package/dashboard/dist/assets/CustomDurationPicker-CAninCbl.js +0 -2
  476. package/dashboard/dist/assets/DataTable-BDn1WBHS.js +0 -2
  477. package/dashboard/dist/assets/DataTable-BDn1WBHS.js.map +0 -1
  478. package/dashboard/dist/assets/EmptyState-2CmV-IaS.js +0 -2
  479. package/dashboard/dist/assets/EscalationsOverview-GXYFPASS.js +0 -2
  480. package/dashboard/dist/assets/EventTable-B01oJf6Y.js +0 -2
  481. package/dashboard/dist/assets/Field-DuFBAYhu.js +0 -2
  482. package/dashboard/dist/assets/Field-DuFBAYhu.js.map +0 -1
  483. package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +0 -2
  484. package/dashboard/dist/assets/McpOverview-JkvRcX2e.js +0 -2
  485. package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js +0 -2
  486. package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js.map +0 -1
  487. package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js +0 -2
  488. package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js.map +0 -1
  489. package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js +0 -2
  490. package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js.map +0 -1
  491. package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js +0 -2
  492. package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js.map +0 -1
  493. package/dashboard/dist/assets/Modal-B4rbIVAn.js +0 -2
  494. package/dashboard/dist/assets/OperatorDashboard-B56il28q.js +0 -2
  495. package/dashboard/dist/assets/OperatorDashboard-B56il28q.js.map +0 -1
  496. package/dashboard/dist/assets/PageHeader-CpWFly5S.js +0 -2
  497. package/dashboard/dist/assets/PageHeader-CpWFly5S.js.map +0 -1
  498. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
  499. package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js +0 -2
  500. package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js.map +0 -1
  501. package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js +0 -2
  502. package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js.map +0 -1
  503. package/dashboard/dist/assets/RolePill-BTPa8L-P.js +0 -2
  504. package/dashboard/dist/assets/RolesPage-9grZW7yR.js +0 -2
  505. package/dashboard/dist/assets/RolesPage-9grZW7yR.js.map +0 -1
  506. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
  507. package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js +0 -4
  508. package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js.map +0 -1
  509. package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
  510. package/dashboard/dist/assets/StatusBadge-TlC4jiig.js +0 -2
  511. package/dashboard/dist/assets/StatusBadge-TlC4jiig.js.map +0 -1
  512. package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +0 -2
  513. package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js +0 -2
  514. package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js.map +0 -1
  515. package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js +0 -2
  516. package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js.map +0 -1
  517. package/dashboard/dist/assets/TaskQueuePill-awmtb0qw.js +0 -2
  518. package/dashboard/dist/assets/TasksListPage-C_QF23c1.js +0 -2
  519. package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js +0 -2
  520. package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js.map +0 -1
  521. package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js +0 -2
  522. package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js.map +0 -1
  523. package/dashboard/dist/assets/UserName-DaP4YAKr.js +0 -2
  524. package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js +0 -5
  525. package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js.map +0 -1
  526. package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js +0 -2
  527. package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js.map +0 -1
  528. package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js +0 -2
  529. package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js.map +0 -1
  530. package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js +0 -2
  531. package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js.map +0 -1
  532. package/dashboard/dist/assets/WorkflowsOverview-D9OzzQqw.js +0 -2
  533. package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js +0 -3
  534. package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js.map +0 -1
  535. package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js +0 -2
  536. package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js.map +0 -1
  537. package/dashboard/dist/assets/constants-CgaZfe5d.js +0 -2
  538. package/dashboard/dist/assets/constants-CgaZfe5d.js.map +0 -1
  539. package/dashboard/dist/assets/escalation-columns-D6aqStaY.js +0 -2
  540. package/dashboard/dist/assets/escalation-qalymbKB.js +0 -2
  541. package/dashboard/dist/assets/escalation-qalymbKB.js.map +0 -1
  542. package/dashboard/dist/assets/format-gXZXQ-HJ.js +0 -2
  543. package/dashboard/dist/assets/format-gXZXQ-HJ.js.map +0 -1
  544. package/dashboard/dist/assets/helpers-0gSleuzT.js +0 -2
  545. package/dashboard/dist/assets/helpers-0gSleuzT.js.map +0 -1
  546. package/dashboard/dist/assets/index-BWvMHed7.js +0 -6
  547. package/dashboard/dist/assets/index-BWvMHed7.js.map +0 -1
  548. package/dashboard/dist/assets/index-BaszoPO_.css +0 -1
  549. package/dashboard/dist/assets/index-Cn2jyj9A.js +0 -2
  550. package/dashboard/dist/assets/index-Cn2jyj9A.js.map +0 -1
  551. package/dashboard/dist/assets/index-D8VH6K8B.js +0 -54
  552. package/dashboard/dist/assets/index-D8VH6K8B.js.map +0 -1
  553. package/dashboard/dist/assets/index-D9SYwJsi.js +0 -3
  554. package/dashboard/dist/assets/index-D9SYwJsi.js.map +0 -1
  555. package/dashboard/dist/assets/index-DTPzZr_X.js +0 -2
  556. package/dashboard/dist/assets/index-D_6AB5BE.js +0 -2
  557. package/dashboard/dist/assets/index-D_6AB5BE.js.map +0 -1
  558. package/dashboard/dist/assets/index-S9Ks2Lj2.js +0 -2
  559. package/dashboard/dist/assets/index-S9Ks2Lj2.js.map +0 -1
  560. package/dashboard/dist/assets/index-X85K5bHC.js +0 -17
  561. package/dashboard/dist/assets/index-rjmgHlSH.js +0 -2
  562. package/dashboard/dist/assets/index-rjmgHlSH.js.map +0 -1
  563. package/dashboard/dist/assets/mcp-blCW6IL7.js +0 -2
  564. package/dashboard/dist/assets/mcp-query-DoAyPbjC.js +0 -2
  565. package/dashboard/dist/assets/mcp-query-DoAyPbjC.js.map +0 -1
  566. package/dashboard/dist/assets/namespaces-BgbaC3ow.js +0 -2
  567. package/dashboard/dist/assets/settings-eBRSE0mQ.js +0 -2
  568. package/dashboard/dist/assets/tasks-tRqClPns.js +0 -2
  569. package/dashboard/dist/assets/vendor-icons-ZTAKVwGc.js.map +0 -1
  570. package/dashboard/dist/assets/vendor-query-B2UbickB.js +0 -18
  571. package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +0 -1
  572. package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js +0 -22
  573. package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js.map +0 -1
  574. package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js +0 -2
  575. package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js.map +0 -1
  576. /package/build/{services → lib}/db/migrate.d.ts +0 -0
  577. /package/build/{services → lib}/events/index.d.ts +0 -0
  578. /package/build/{services → lib}/events/index.js +0 -0
  579. /package/build/{services → lib}/events/memory.d.ts +0 -0
  580. /package/build/{services → lib}/events/memory.js +0 -0
  581. /package/build/{services → lib}/events/nats.d.ts +0 -0
  582. /package/build/{services → lib}/events/nats.js +0 -0
  583. /package/build/{services → lib}/events/publish.d.ts +0 -0
  584. /package/build/{services → lib}/events/publish.js +0 -0
  585. /package/build/{services → lib}/events/socketio.d.ts +0 -0
  586. /package/build/{services → lib}/events/socketio.js +0 -0
  587. /package/build/{services → lib}/logger/index.d.ts +0 -0
  588. /package/build/{services → lib}/logger/index.js +0 -0
  589. /package/build/{services → lib}/logger/pino.d.ts +0 -0
  590. /package/build/{services → lib}/logger/pino.js +0 -0
  591. /package/build/{services → lib}/storage/index.d.ts +0 -0
  592. /package/build/{services → lib}/storage/index.js +0 -0
  593. /package/build/{services → lib}/storage/local.d.ts +0 -0
  594. /package/build/{services → lib}/storage/local.js +0 -0
  595. /package/build/{services → lib}/storage/s3.d.ts +0 -0
  596. /package/build/{services → lib}/storage/s3.js +0 -0
  597. /package/build/{services → lib}/storage/types.d.ts +0 -0
  598. /package/build/{services → lib}/storage/types.js +0 -0
  599. /package/build/{services → lib}/telemetry/index.d.ts +0 -0
  600. /package/build/{services → lib}/telemetry/index.js +0 -0
  601. /package/{services → lib}/db/README.md +0 -0
  602. /package/{services → lib}/db/schemas/001_schema.sql +0 -0
  603. /package/{services → lib}/db/schemas/002_seed.sql +0 -0
  604. /package/{services → lib}/db/schemas/003_workflow_discovery.sql +0 -0
  605. /package/{services → lib}/db/schemas/004_query_router.sql +0 -0
  606. /package/{services → lib}/db/schemas/005_triage_router.sql +0 -0
  607. /package/{services → lib}/db/schemas/006_oauth.sql +0 -0
  608. /package/{services → lib}/db/schemas/007_security.sql +0 -0
  609. /package/{services → lib}/db/schemas/008_bot_accounts.sql +0 -0
  610. /package/{services → lib}/db/schemas/009_audit_trail.sql +0 -0
  611. /package/{services → lib}/db/schemas/010_credential_providers.sql +0 -0
  612. /package/{services → lib}/db/schemas/011_system_workflow_configs.sql +0 -0
  613. /package/{services → lib}/db/schemas/012_drop_modality.sql +0 -0
  614. /package/{services → lib}/db/schemas/013_execute_as.sql +0 -0
  615. /package/{services → lib}/db/schemas/014_ephemeral_credentials.sql +0 -0
@@ -1 +0,0 @@
1
- *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Plus Jakarta Sans,system-ui,-apple-system,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,Fira Code,ui-monospace,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}body{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*{--tw-border-opacity: 1;border-color:rgb(224 218 240 / var(--tw-border-opacity, 1))}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.btn-primary{border-radius:.375rem;--tw-bg-opacity: 1;background-color:rgb(108 71 255 / var(--tw-bg-opacity, 1));padding:.625rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-primary:hover{--tw-bg-opacity: 1;background-color:rgb(88 53 219 / var(--tw-bg-opacity, 1))}.btn-secondary{border-radius:.375rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(224 218 240 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.625rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-secondary:hover{--tw-bg-opacity: 1;background-color:rgb(247 244 255 / var(--tw-bg-opacity, 1))}.btn-ghost{border-radius:.375rem;padding:.625rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(91 81 115 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-ghost:hover{--tw-bg-opacity: 1;background-color:rgb(247 244 255 / var(--tw-bg-opacity, 1))}.row-hover{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.1s}.row-hover:hover{--tw-bg-opacity: 1;background-color:rgb(247 244 255 / var(--tw-bg-opacity, 1))}.\!input{width:100%;border-radius:.375rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(224 218 240 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.625rem .875rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\!input::-moz-placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.\!input::placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.\!input:focus{--tw-border-opacity: 1;border-color:rgb(108 71 255 / var(--tw-border-opacity, 1));outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-color: rgb(108 71 255 / .3)}.input{width:100%;border-radius:.375rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(224 218 240 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.625rem .875rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.input::-moz-placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.input::placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.input:focus{--tw-border-opacity: 1;border-color:rgb(108 71 255 / var(--tw-border-opacity, 1));outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-color: rgb(108 71 255 / .3)}.select{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.375rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(224 218 240 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.625rem .875rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.select:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-color: rgb(108 71 255 / .3)}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.-left-\[3px\]{left:-3px}.-right-1{right:-.25rem}.-right-3{right:-.75rem}.-top-1{top:-.25rem}.-top-2\.5{top:-.625rem}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.bottom-3{bottom:.75rem}.left-0{left:0}.left-2\.5{left:.625rem}.left-\[7px\]{left:7px}.right-0{right:0}.right-2{right:.5rem}.top-0{top:0}.top-1\/2{top:50%}.top-14{top:3.5rem}.top-2{top:.5rem}.top-3{top:.75rem}.top-6{top:1.5rem}.top-\[2\.75rem\]{top:2.75rem}.top-full{top:100%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.col-span-2{grid-column:span 2 / span 2}.-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.mx-0\.5{margin-left:.125rem;margin-right:.125rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-1\.5{margin-left:.375rem;margin-right:.375rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.-ml-1{margin-left:-.25rem}.-ml-10{margin-left:-2.5rem}.-ml-8{margin-left:-2rem}.-ml-\[12\.5rem\]{margin-left:-12.5rem}.-ml-\[9\.75rem\]{margin-left:-9.75rem}.-mt-1{margin-top:-.25rem}.-mt-6{margin-top:-1.5rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-7{margin-left:1.75rem}.ml-9{margin-left:2.25rem}.ml-\[19px\]{margin-left:19px}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-40{height:10rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-60{height:15rem}.h-8{height:2rem}.h-\[12\.5rem\]{height:12.5rem}.h-\[15px\]{height:15px}.h-\[16rem\]{height:16rem}.h-\[18px\]{height:18px}.h-\[7px\]{height:7px}.h-\[80px\]{height:80px}.h-\[9px\]{height:9px}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-48{max-height:12rem}.max-h-60{max-height:15rem}.max-h-64{max-height:16rem}.max-h-80{max-height:20rem}.max-h-\[200px\]{max-height:200px}.max-h-\[400px\]{max-height:400px}.max-h-\[50vh\]{max-height:50vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[calc\(100vh-8rem\)\]{max-height:calc(100vh - 8rem)}.min-h-\[100px\]{min-height:100px}.min-h-\[160px\]{min-height:160px}.min-h-\[200px\]{min-height:200px}.min-h-\[300px\]{min-height:300px}.min-h-\[34px\]{min-height:34px}.min-h-\[360px\]{min-height:360px}.min-h-\[60px\]{min-height:60px}.min-h-\[80px\]{min-height:80px}.min-h-\[calc\(100vh-12rem\)\]{min-height:calc(100vh - 12rem)}.min-h-\[calc\(100vh-9rem\)\]{min-height:calc(100vh - 9rem)}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-1\/4{width:25%}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-2\/3{width:66.666667%}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-60{width:15rem}.w-64{width:16rem}.w-8{width:2rem}.w-\[12\.5rem\]{width:12.5rem}.w-\[15px\]{width:15px}.w-\[16rem\]{width:16rem}.w-\[18px\]{width:18px}.w-\[22rem\]{width:22rem}.w-\[28rem\]{width:28rem}.w-\[7px\]{width:7px}.w-\[9px\]{width:9px}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-4{min-width:1rem}.min-w-\[80px\]{min-width:80px}.max-w-0{max-width:0px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-\[120px\]{max-width:120px}.max-w-\[150px\]{max-width:150px}.max-w-\[280px\]{max-width:280px}.max-w-dashboard{max-width:1440px}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-\[60vh\]{--tw-translate-y: -60vh;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[120vw\]{--tw-translate-x: 120vw;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-\[120deg\]{--tw-rotate: -120deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-\[3\]{--tw-scale-x: 3;--tw-scale-y: 3;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-\[triage-glow_6s_ease-in-out_infinite\]{animation:triage-glow 6s ease-in-out infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize-y{resize:vertical}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-\[3fr_1fr\]{grid-template-columns:3fr 1fr}.grid-rows-\[0fr\]{grid-template-rows:0fr}.grid-rows-\[1fr\]{grid-template-rows:1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-10{gap:2.5rem}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-y-0{row-gap:0px}.gap-y-1{row-gap:.25rem}.gap-y-1\.5{row-gap:.375rem}.gap-y-2{row-gap:.5rem}.gap-y-3{row-gap:.75rem}.gap-y-4{row-gap:1rem}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-surface-border>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(224 218 240 / var(--tw-divide-opacity, 1))}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-accent{--tw-border-opacity: 1;border-color:rgb(108 71 255 / var(--tw-border-opacity, 1))}.border-accent-faint{--tw-border-opacity: 1;border-color:rgb(232 226 248 / var(--tw-border-opacity, 1))}.border-accent-muted{--tw-border-opacity: 1;border-color:rgb(200 190 240 / var(--tw-border-opacity, 1))}.border-accent-muted\/40{border-color:#c8bef066}.border-accent\/20{border-color:#6c47ff33}.border-accent\/30{border-color:#6c47ff4d}.border-amber-600{--tw-border-opacity: 1;border-color:rgb(217 119 6 / var(--tw-border-opacity, 1))}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-emerald-500{--tw-border-opacity: 1;border-color:rgb(16 185 129 / var(--tw-border-opacity, 1))}.border-emerald-500\/20{border-color:#10b98133}.border-purple-500\/20{border-color:#a855f733}.border-status-draft{--tw-border-opacity: 1;border-color:rgb(234 88 12 / var(--tw-border-opacity, 1))}.border-status-error{--tw-border-opacity: 1;border-color:rgb(220 38 38 / var(--tw-border-opacity, 1))}.border-status-error\/20{border-color:#dc262633}.border-status-pending\/30{border-color:#f59e0b4d}.border-status-success{--tw-border-opacity: 1;border-color:rgb(22 163 74 / var(--tw-border-opacity, 1))}.border-status-success\/30{border-color:#16a34a4d}.border-status-warning{--tw-border-opacity: 1;border-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.border-status-warning\/20{border-color:#f59e0b33}.border-status-warning\/30{border-color:#f59e0b4d}.border-surface-border{--tw-border-opacity: 1;border-color:rgb(224 218 240 / var(--tw-border-opacity, 1))}.border-surface-border\/30{border-color:#e0daf04d}.border-surface-border\/50{border-color:#e0daf080}.border-text-inverse{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.border-text-tertiary{--tw-border-opacity: 1;border-color:rgb(145 138 171 / var(--tw-border-opacity, 1))}.border-violet-500{--tw-border-opacity: 1;border-color:rgb(139 92 246 / var(--tw-border-opacity, 1))}.border-white\/70{border-color:#ffffffb3}.border-l-accent{--tw-border-opacity: 1;border-left-color:rgb(108 71 255 / var(--tw-border-opacity, 1))}.border-t-transparent{border-top-color:transparent}.bg-accent{--tw-bg-opacity: 1;background-color:rgb(108 71 255 / var(--tw-bg-opacity, 1))}.bg-accent-faint{--tw-bg-opacity: 1;background-color:rgb(232 226 248 / var(--tw-bg-opacity, 1))}.bg-accent-faint\/50{background-color:#e8e2f880}.bg-accent-muted{--tw-bg-opacity: 1;background-color:rgb(200 190 240 / var(--tw-bg-opacity, 1))}.bg-accent-muted\/20{background-color:#c8bef033}.bg-accent\/10{background-color:#6c47ff1a}.bg-accent\/20{background-color:#6c47ff33}.bg-accent\/5{background-color:#6c47ff0d}.bg-accent\/60{background-color:#6c47ff99}.bg-accent\/\[0\.06\]{background-color:#6c47ff0f}.bg-accent\/\[0\.08\]{background-color:#6c47ff14}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-500\/10{background-color:#3b82f61a}.bg-blue-500\/70{background-color:#3b82f6b3}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-emerald-500\/10{background-color:#10b9811a}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-purple-500\/10{background-color:#a855f71a}.bg-status-active{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-status-draft{--tw-bg-opacity: 1;background-color:rgb(234 88 12 / var(--tw-bg-opacity, 1))}.bg-status-draft\/30{background-color:#ea580c4d}.bg-status-error{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-status-error\/10{background-color:#dc26261a}.bg-status-pending{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-status-pending\/10{background-color:#f59e0b1a}.bg-status-success{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-status-success\/10{background-color:#16a34a1a}.bg-status-success\/20{background-color:#16a34a33}.bg-status-success\/30{background-color:#16a34a4d}.bg-status-warning{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-status-warning\/10{background-color:#f59e0b1a}.bg-status-warning\/15{background-color:#f59e0b26}.bg-status-warning\/5{background-color:#f59e0b0d}.bg-surface{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-surface-border{--tw-bg-opacity: 1;background-color:rgb(224 218 240 / var(--tw-bg-opacity, 1))}.bg-surface-border\/60{background-color:#e0daf099}.bg-surface-hover{--tw-bg-opacity: 1;background-color:rgb(247 244 255 / var(--tw-bg-opacity, 1))}.bg-surface-hover\/30{background-color:#f7f4ff4d}.bg-surface-raised{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-surface-raised\/50{background-color:#ffffff80}.bg-surface-sunken{--tw-bg-opacity: 1;background-color:rgb(245 245 247 / var(--tw-bg-opacity, 1))}.bg-surface-sunken\/20{background-color:#f5f5f733}.bg-surface-sunken\/30{background-color:#f5f5f74d}.bg-surface-sunken\/50{background-color:#f5f5f780}.bg-surface\/90{background-color:#ffffffe6}.bg-surface\/95{background-color:#fffffff2}.bg-text-primary\/30{background-color:#1e15354d}.bg-text-tertiary{--tw-bg-opacity: 1;background-color:rgb(145 138 171 / var(--tw-bg-opacity, 1))}.bg-text-tertiary\/30{background-color:#918aab4d}.bg-transparent{background-color:transparent}.bg-violet-500{--tw-bg-opacity: 1;background-color:rgb(139 92 246 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.fill-status-active{fill:#2563eb}.fill-status-error{fill:#dc2626}.fill-status-success{fill:#16a34a}.fill-status-warning{fill:#f59e0b}.fill-text-tertiary{fill:#918aab}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-10{padding:2.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-0{padding-bottom:0}.pb-10{padding-bottom:2.5rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-6{padding-bottom:1.5rem}.pb-60{padding-bottom:15rem}.pl-0{padding-left:0}.pl-11{padding-left:2.75rem}.pl-14{padding-left:3.5rem}.pl-16{padding-left:4rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-52{padding-left:13rem}.pl-6{padding-left:1.5rem}.pl-8{padding-left:2rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-6{padding-right:1.5rem}.pr-7{padding-right:1.75rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-24{padding-top:6rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.pt-\[36px\]{padding-top:36px}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:JetBrains Mono,Fira Code,ui-monospace,monospace}.font-sans{font-family:Plus Jakarta Sans,system-ui,-apple-system,sans-serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[1\.5rem\]{font-size:1.5rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[36px\]{font-size:36px}.text-\[44px\]{font-size:44px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.15em\]{letter-spacing:.15em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-accent{--tw-text-opacity: 1;color:rgb(108 71 255 / var(--tw-text-opacity, 1))}.text-accent-muted{--tw-text-opacity: 1;color:rgb(200 190 240 / var(--tw-text-opacity, 1))}.text-accent\/60{color:#6c47ff99}.text-accent\/70{color:#6c47ffb3}.text-accent\/75{color:#6c47ffbf}.text-accent\/80{color:#6c47ffcc}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-500\/70{color:#3b82f6b3}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-purple-400{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.text-status-active{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-status-error{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-status-pending{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-status-success{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-status-success\/70{color:#16a34ab3}.text-status-warning{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-text-inverse{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-text-primary{--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1))}.text-text-secondary{--tw-text-opacity: 1;color:rgb(91 81 115 / var(--tw-text-opacity, 1))}.text-text-tertiary{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.text-text-tertiary\/30{color:#918aab4d}.text-text-tertiary\/40{color:#918aab66}.text-text-tertiary\/50{color:#918aab80}.text-text-tertiary\/60{color:#918aab99}.text-violet-400{--tw-text-opacity: 1;color:rgb(167 139 250 / var(--tw-text-opacity, 1))}.text-violet-500{--tw-text-opacity: 1;color:rgb(139 92 246 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.line-through{text-decoration-line:line-through}.decoration-text-tertiary\/30{text-decoration-color:#918aab4d}.accent-accent{accent-color:#6C47FF}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-accent{--tw-ring-opacity: 1;--tw-ring-color: rgb(108 71 255 / var(--tw-ring-opacity, 1))}.ring-offset-1{--tw-ring-offset-width: 1px}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-\[2px\]{--tw-backdrop-blur: blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[grid-template-rows\]{transition-property:grid-template-rows;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-\[1500ms\]{transition-duration:1.5s}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@keyframes fadeIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes triage-glow{0%{box-shadow:0 0 3px #6c47ff26}8.3%{box-shadow:0 0 10px 2px #6c47ff66}16.7%,to{box-shadow:0 0 3px #6c47ff26}}.animate-page-enter{animation:fadeIn .15s ease-out both}@keyframes pageFade{0%{opacity:0}to{opacity:1}}.animate-page-in{animation:pageFade .2s ease-out both}.bg-stripes{background-image:repeating-linear-gradient(-45deg,transparent,transparent 3px,rgba(255,255,255,.15) 3px,rgba(255,255,255,.15) 6px);background-color:var(--color-status-warning, #f59e0b)}.placeholder\:text-text-tertiary::-moz-placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.placeholder\:text-text-tertiary::placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.last\:border-b-0:last-child{border-bottom-width:0px}.focus-within\:ring-1:focus-within{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.hover\:border-accent\/40:hover{border-color:#6c47ff66}.hover\:border-accent\/50:hover{border-color:#6c47ff80}.hover\:bg-accent-muted:hover{--tw-bg-opacity: 1;background-color:rgb(200 190 240 / var(--tw-bg-opacity, 1))}.hover\:bg-accent\/20:hover{background-color:#6c47ff33}.hover\:bg-accent\/30:hover{background-color:#6c47ff4d}.hover\:bg-accent\/90:hover{background-color:#6c47ffe6}.hover\:bg-accent\/\[0\.04\]:hover{background-color:#6c47ff0a}.hover\:bg-emerald-500\/20:hover{background-color:#10b98133}.hover\:bg-status-error\/20:hover{background-color:#dc262633}.hover\:bg-status-error\/80:hover{background-color:#dc2626cc}.hover\:bg-status-success\/20:hover{background-color:#16a34a33}.hover\:bg-surface-hover:hover{--tw-bg-opacity: 1;background-color:rgb(247 244 255 / var(--tw-bg-opacity, 1))}.hover\:bg-surface-hover\/50:hover{background-color:#f7f4ff80}.hover\:bg-surface-raised:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:bg-surface-sunken:hover{--tw-bg-opacity: 1;background-color:rgb(245 245 247 / var(--tw-bg-opacity, 1))}.hover\:bg-surface-sunken\/40:hover{background-color:#f5f5f766}.hover\:text-accent:hover{--tw-text-opacity: 1;color:rgb(108 71 255 / var(--tw-text-opacity, 1))}.hover\:text-accent\/80:hover{color:#6c47ffcc}.hover\:text-blue-500:hover{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.hover\:text-status-error:hover{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.hover\:text-status-success:hover{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.hover\:text-status-warning:hover{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.hover\:text-status-warning\/80:hover{color:#f59e0bcc}.hover\:text-text-primary:hover{--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1))}.hover\:text-text-secondary:hover{--tw-text-opacity: 1;color:rgb(91 81 115 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.focus\:border-accent:focus{--tw-border-opacity: 1;border-color:rgb(108 71 255 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-inset:focus{--tw-ring-inset: inset}.focus\:ring-accent:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(108 71 255 / var(--tw-ring-opacity, 1))}.focus\:ring-accent\/40:focus{--tw-ring-color: rgb(108 71 255 / .4)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:no-underline:disabled{text-decoration-line:none}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:bg-accent\/20{background-color:#6c47ff33}.group\/section:hover .group-hover\/section\:text-text-tertiary{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-accent{--tw-text-opacity: 1;color:rgb(108 71 255 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-accent-hover{--tw-text-opacity: 1;color:rgb(88 53 219 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-text-primary{--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:underline{text-decoration-line:underline}.group\/key:hover .group-hover\/key\:opacity-100,.group\/row:hover .group-hover\/row\:opacity-100{opacity:1}.group\/sorthead:hover .group-hover\/sorthead\:opacity-40{opacity:.4}.group\/task:hover .group-hover\/task\:opacity-100,.group\/trace:hover .group-hover\/trace\:opacity-100,.group:hover .group-hover\:opacity-100{opacity:1}@media(min-width:640px){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:1024px){.lg\:col-span-2{grid-column:span 2 / span 2}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-\[1fr_200px\]{grid-template-columns:1fr 200px}.lg\:grid-cols-\[1fr_220px\]{grid-template-columns:1fr 220px}.lg\:grid-cols-\[1fr_320px\]{grid-template-columns:1fr 320px}.lg\:grid-cols-\[1fr_340px\]{grid-template-columns:1fr 340px}.lg\:grid-cols-\[1fr_360px\]{grid-template-columns:1fr 360px}.lg\:border-l{border-left-width:1px}.lg\:border-surface-border{--tw-border-opacity: 1;border-color:rgb(224 218 240 / var(--tw-border-opacity, 1))}.lg\:pl-12{padding-left:3rem}.lg\:pl-8{padding-left:2rem}}
@@ -1,2 +0,0 @@
1
- import{u as B,c as z,b as oe,j as e,a as d}from"./vendor-query-B2UbickB.js";import{P as ie}from"./PageHeader-CpWFly5S.js";import{D as ce}from"./DataTable-BDn1WBHS.js";import{a as F,u as de,C as A,J as ue,S as V}from"./index-D8VH6K8B.js";import{F as xe,b as q}from"./FilterBar-Ck4K4rzu.js";import{u as pe}from"./useFilterParams-BaXUAkYK.js";import{T as me}from"./TaskQueuePill-awmtb0qw.js";import{S as E}from"./StatCard-DlgF0CJC.js";import{M as he}from"./Modal-B4rbIVAn.js";import{R as ge,S as fe,O as be,E as ye,Q as je}from"./vendor-icons-ZTAKVwGc.js";import"./EmptyState-2CmV-IaS.js";import"./vendor-react-Cw8Gy8NJ.js";function ke(){return F("/controlplane/apps")}function Ne(t){return F(`/controlplane/rollcall?app_id=${encodeURIComponent(t)}`)}function ve(t){return F("/controlplane/throttle",{method:"POST",body:JSON.stringify(t)})}function we(t){return F("/controlplane/subscribe",{method:"POST",body:JSON.stringify(t)})}function Ce(t,n,l){let o=`/controlplane/streams?app_id=${encodeURIComponent(t)}&duration=${encodeURIComponent(n)}`;return F(o)}function Se(){return B({queryKey:["controlplane","apps"],queryFn:ke,staleTime:6e4})}function Te(t,n){return B({queryKey:["controlplane","rollcall",t],queryFn:()=>Ne(t),enabled:!!t,refetchInterval:n??!1})}function _e(){const t=oe();return z({mutationFn:ve,onSuccess:()=>{t.invalidateQueries({queryKey:["controlplane","rollcall"]})}})}function $e(t,n,l,o){return B({queryKey:["controlplane","streams",t,n,""],queryFn:()=>Ce(t,n),enabled:!!t,staleTime:15e3,refetchInterval:o??!1})}function Me(){return z({mutationFn:we})}const Ee=[{label:"15m",value:"15m"},{label:"30m",value:"30m"},{label:"1h",value:"1h"},{label:"1d",value:"1d"},{label:"7d",value:"7d"}],Re={pong:"text-status-success",ping:"text-accent",throttle:"text-status-warning",job:"text-purple-400",work:"text-text-secondary",activate:"text-status-error",cron:"text-text-tertiary",user:"text-text-secondary"},Fe=250;function N(t){return!!t.worker_topic}function Pe(t){return typeof t.throttle=="number"&&t.throttle!==0}function K(t){return t===void 0||t===0?"Normal":t===-1?"Paused":t>=864e5?`${(t/864e5).toFixed(0)}d`:t>=36e5?`${(t/36e5).toFixed(1)}h`:t>=6e4?`${(t/6e4).toFixed(1)}m`:t>=1e3?`${(t/1e3).toFixed(1)}s`:`${t}ms`}function Oe(t,n){if(!t||!n)return"—";const l=parseFloat(t),o=parseFloat(n);return isNaN(l)||isNaN(o)?"—":`${(l-o).toFixed(1)} / ${l.toFixed(1)} GB`}function qe(t){return t.replace(/^hmsh:[^:]+:x:/,"")||"(engine)"}const D=[{key:"pong",label:"Pong",description:"Roll call responses"},{key:"ping",label:"Ping",description:"Roll call broadcasts"},{key:"throttle",label:"Throttle",description:"Throttle commands"},{key:"job",label:"Job",description:"Job lifecycle events"},{key:"work",label:"Work",description:"Worker dispatch events"},{key:"activate",label:"Activate",description:"Worker activation"},{key:"cron",label:"Cron",description:"Cron schedule triggers"},{key:"user",label:"User",description:"User-defined messages"}],Ae=[{value:"all",label:"All Nodes"},{value:"workers",label:"Workers"},{value:"engines",label:"Engines"}];function R(t){return`${t.engine_id}-${t.worker_topic||"engine"}`}function Be({profiles:t,selectedIds:n,toggleAll:l,toggleCheckbox:o}){return[{key:"select",label:e.jsx("input",{type:"checkbox",checked:t.length>0&&n.size===t.length,onChange:l,className:"rounded"}),render:s=>e.jsx("input",{type:"checkbox",checked:n.has(R(s)),onChange:a=>{a.stopPropagation(),o(s)},onClick:a=>a.stopPropagation(),className:"rounded"}),className:"w-10"},{key:"type",label:"Type",render:s=>e.jsx("span",{className:`text-xs ${N(s)?"text-text-secondary":"text-blue-500"}`,children:N(s)?"Worker":"Engine"}),className:"w-20"},{key:"worker_topic",label:"Task Queue",render:s=>N(s)?e.jsx(me,{queue:s.worker_topic}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-64"},{key:"engine_id",label:"Engine/Worker ID",render:s=>e.jsx("span",{className:"text-xs font-mono text-text-tertiary",children:s.engine_id}),className:"w-48"},{key:"throttle",label:"Throttle",render:s=>{const a=s.throttle;return a===-1?e.jsx("span",{className:"text-xs text-status-error font-medium",children:"Paused"}):a&&a>0?e.jsx("span",{className:"text-xs text-status-warning font-medium",children:K(a)}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"0"})},className:"w-24"},{key:"memory",label:"Memory",render:s=>{var a,p;return e.jsx("span",{className:"text-xs font-mono text-text-tertiary",children:Oe((a=s.system)==null?void 0:a.TotalMemoryGB,(p=s.system)==null?void 0:p.FreeMemoryGB)})},className:"w-36"}]}function Ie({engineCount:t,workerCount:n,pending:l,byStream:o,activeDuration:s}){const a=o.filter(r=>r.stream_type==="engine").reduce((r,g)=>r+g.count,0),p=o.filter(r=>r.stream_type==="worker").reduce((r,g)=>r+g.count,0);return e.jsxs("div",{className:"grid grid-cols-5 gap-4 mb-8",children:[e.jsx(E,{label:"Engines",value:t}),e.jsx(E,{label:"Workers",value:n}),e.jsx(E,{label:"Pending",value:l,colorClass:l?"text-status-warning":"text-text-primary"}),e.jsx(E,{label:`Engine Msgs (${s})`,value:a.toLocaleString(),colorClass:"text-blue-500"}),e.jsx(E,{label:`Worker Msgs (${s})`,value:p.toLocaleString()})]})}function Qe({activeAppId:t,allProfiles:n,profiles:l}){const o=_e(),[s,a]=d.useState(new Set),[p,r]=d.useState(!1),[g,j]=d.useState([]);d.useEffect(()=>{a(new Set)},[t]);const m=d.useCallback(c=>{a(u=>{const y=new Set(u),k=R(c);return y.has(k)?y.delete(k):y.add(k),y})},[]),C=d.useCallback(()=>{s.size===l.length?a(new Set):a(new Set(l.map(R)))},[l,s.size]),b=d.useMemo(()=>{const c=l.filter(h=>s.has(R(h)));if(c.length===0)return[];if(c.length===n.length)return[{label:"Entire Mesh"}];const u=c.filter(h=>!N(h)),y=c.filter(N),k=n.filter(h=>!N(h)),v=[];if(u.length>0)if(u.length===k.length)v.push({label:"All Engines",topic:u[0].stream||""});else for(const h of u)v.push({label:`Engine ${h.engine_id.slice(0,10)}...`,guid:h.engine_id});const _=new Map;for(const h of y){const $=h.worker_topic;_.has($)||_.set($,[]),_.get($).push(h)}for(const[h,$]of _){const O=n.filter(w=>w.worker_topic===h);if($.length===O.length)v.push({label:h,topic:h});else for(const w of $)v.push({label:`${h} ${w.engine_id.slice(0,10)}...`,guid:w.engine_id})}return v},[l,n,s]);return{selectedIds:s,setSelectedIds:a,toggleCheckbox:m,toggleAll:C,throttleModalOpen:p,throttleTargets:g,selectedThrottleTargets:b,throttleMutation:o,handleBulkThrottle:c=>{const u=g.length>0?g:b;for(const y of u)o.mutate({appId:t,throttle:c,...y.topic?{topic:y.topic}:{},...y.guid?{guid:y.guid}:{}});r(!1),j([])},handleRowClick:c=>{const u=N(c)?`${c.worker_topic} ${c.engine_id.slice(0,10)}...`:`Engine ${c.engine_id.slice(0,10)}...`;j([{label:u,guid:c.engine_id}]),r(!0)},handleBulkThrottleOpen:()=>{j(b),r(!0)},closeThrottleModal:()=>{r(!1),j([])}}}const Le=[{label:"Resume",ms:0},{label:"0.5s",ms:500},{label:"1s",ms:1e3},{label:"5s",ms:5e3},{label:"30s",ms:3e4},{label:"Pause",ms:-1}];function We({target:t}){const n=t.label==="Entire Mesh",l=t.label==="All Engines"||t.label.startsWith("Engine "),o=n?"bg-status-error/10 text-status-error":l?"bg-blue-500/10 text-blue-500":"bg-accent/[0.06] text-text-secondary",s=t.guid?"guid":t.topic?"topic":"mesh";return e.jsxs("span",{className:`inline-flex items-center gap-1.5 px-2 py-0.5 text-[10px] font-medium rounded-lg ${o}`,children:[t.label,e.jsx("span",{className:"text-[8px] opacity-50",children:s})]})}function Je({open:t,onClose:n,targets:l,onApply:o,isPending:s}){const[a,p]=d.useState("0");return e.jsx(he,{open:t,onClose:n,title:"Adjust Throttle",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Targets"}),e.jsx("div",{className:"flex flex-wrap gap-1.5",children:l.map((r,g)=>e.jsx(We,{target:r},r.guid||r.topic||g))})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Presets"}),e.jsx("div",{className:"flex flex-wrap gap-2",children:Le.map(r=>e.jsx("button",{onClick:()=>{p(r.ms===-1?"-1":String(r.ms/1e3)),o(r.ms)},disabled:s,className:`px-3 py-1.5 text-xs rounded transition-colors ${r.ms===-1?"bg-status-error/10 text-status-error hover:bg-status-error/20":r.ms===0?"bg-status-success/10 text-status-success hover:bg-status-success/20":"bg-surface-sunken text-text-secondary hover:bg-surface-hover"} disabled:opacity-50`,children:r.label},r.label))})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Custom (seconds between messages)"}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("input",{type:"number",step:"0.1",min:"-1",value:a,onChange:r=>p(r.target.value),className:"input text-xs py-1.5 px-3 w-28"}),e.jsx("button",{onClick:()=>{const r=parseFloat(a);isNaN(r)||o(r===-1?-1:Math.round(r*1e3))},disabled:s,className:"btn-primary text-xs py-1.5 px-4 disabled:opacity-50",children:"Apply"})]}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-1",children:"0 = resume, -1 = pause indefinitely"})]})]})})}function Ue({selectedCount:t,onClear:n,onThrottle:l,isPending:o}){return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-3 bg-accent/5 border border-accent/20 rounded-lg mb-4",children:[e.jsxs("span",{className:"text-xs font-medium text-accent",children:[t," selected"]}),e.jsx("div",{className:"w-px h-5 bg-surface-border"}),e.jsx("button",{onClick:l,disabled:o,className:"btn-secondary text-xs py-1.5 disabled:opacity-50",children:"Adjust Throttle..."}),e.jsx("div",{className:"flex-1"}),e.jsx("button",{onClick:n,className:"text-xs text-text-tertiary hover:text-text-primary transition-colors",children:"Clear"})]})}function Ve({byStream:t,onNodeFilter:n,onQueueFilter:l}){const[o,s]=d.useState(!1);if(d.useEffect(()=>{s(!1);const m=requestAnimationFrame(()=>s(!0));return()=>cancelAnimationFrame(m)},[t]),t.length===0)return e.jsx("p",{className:"text-xs text-text-tertiary py-4 text-center",children:"No activity in this period"});const a=t.filter(m=>m.stream_type==="engine"),p=t.filter(m=>m.stream_type==="worker"),r=Math.max(...t.map(m=>m.count)),g=m=>{const C=r>0?m.count/r*100:0,b=m.stream_type==="engine",S=b?"(engine)":qe(m.stream_name),T=b?"bg-blue-500/70":"bg-accent/60",M=b?"text-blue-500":"text-text-tertiary",x=!b&&l;return e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:`text-[9px] font-mono ${M} w-36 truncate text-right shrink-0 ${x?"cursor-pointer hover:underline hover:text-accent":""}`,title:m.stream_name,onClick:x?()=>l(m.stream_name):void 0,children:S}),e.jsx("div",{className:"flex-1 h-4 bg-surface-sunken rounded overflow-hidden",children:e.jsx("div",{className:`h-full ${T} rounded transition-all duration-500 ease-out`,style:{width:o?`${C}%`:"0%"}})}),e.jsx("span",{className:"text-[10px] font-mono tabular-nums text-text-secondary w-12 text-right shrink-0",children:m.count.toLocaleString()})]},`${m.stream_type}-${m.stream_name}`)},j="text-[9px] uppercase tracking-widest font-semibold mb-1 cursor-pointer hover:underline";return e.jsxs("div",{className:"space-y-1.5",children:[a.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("p",{className:`${j} text-blue-500/70 hover:text-blue-500`,onClick:()=>n==null?void 0:n("engines"),children:"Engine Queue"}),a.map(g),p.length>0&&e.jsx("div",{className:"h-2"})]}),p.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("p",{className:`${j} text-accent/70 hover:text-accent`,onClick:()=>n==null?void 0:n("workers"),children:"Worker Queues"}),p.map(g)]})]})}let ze=0;function Ke({event:t}){var o,s,a;const[n,l]=d.useState(!1);return e.jsxs("div",{className:"border-b border-surface-border/50 last:border-b-0",children:[e.jsxs("button",{onClick:()=>l(!n),className:"flex items-center gap-2 py-1.5 w-full text-left hover:bg-surface-hover/50 transition-colors",children:[e.jsx("span",{className:"text-[9px] font-mono text-text-tertiary whitespace-nowrap tabular-nums shrink-0",children:new Date(t.timestamp).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}),e.jsx("span",{className:`text-[9px] font-medium px-1 py-0.5 rounded ${Re[t.type]||"text-text-tertiary"} bg-surface-sunken whitespace-nowrap shrink-0`,children:t.type}),e.jsxs("span",{className:"text-[9px] text-text-tertiary font-mono flex-1 min-w-0 break-all",children:[(o=t.data)!=null&&o.guid?String(t.data.guid):"",(s=t.data)!=null&&s.topic?` ${String(t.data.topic)}`:"",t.type==="throttle"?` → ${K((a=t.data)==null?void 0:a.throttle)}`:""]}),e.jsx("svg",{className:`w-2.5 h-2.5 text-text-tertiary shrink-0 transition-transform duration-150 ${n?"rotate-180":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})]}),e.jsx(A,{open:n,children:e.jsx("div",{className:"pb-2",children:e.jsx(ue,{data:t.data})})})]})}function De({channels:t,onToggle:n,customFilter:l,onCustomFilterChange:o}){return e.jsxs("div",{className:"space-y-3 pb-3 border-b border-surface-border mb-3",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Channels"}),e.jsx("p",{className:"text-[9px] text-text-tertiary",children:"Unchecked channels are dropped before buffering"})]}),e.jsx("div",{className:"grid grid-cols-2 gap-1",children:D.map(s=>e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer py-0.5",children:[e.jsx("input",{type:"checkbox",checked:t.has(s.key),onChange:()=>n(s.key),className:"w-3 h-3 rounded border-border accent-accent"}),e.jsx("span",{className:"text-[10px] text-text-secondary",title:s.description,children:s.label})]},s.key))}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Text Filter"}),e.jsx("input",{type:"text",value:l,onChange:s=>o(s.target.value),placeholder:"pong",className:"input text-[10px] font-mono py-1 px-2 w-full"}),e.jsxs("p",{className:"text-[9px] text-text-tertiary mt-1",children:["Filter by event type, e.g. ",e.jsx("span",{className:"font-mono",children:"pong"}),", ",e.jsx("span",{className:"font-mono",children:"throttle"}),", or any text in the event data."]})]})]})}function Ge({bridgeActive:t,onEventsActive:n}){const[l,o]=d.useState(!1),[s,a]=d.useState(!1),[p,r]=d.useState([]),[g,j]=d.useState(()=>new Set(D.map(x=>x.key))),[m,C]=d.useState(""),b=d.useRef(g);d.useEffect(()=>{b.current=g},[g]);const S=d.useRef(m);d.useEffect(()=>{S.current=m},[m]);const T=x=>{j(c=>{const u=new Set(c);return u.has(x)?u.delete(x):u.add(x),u})};de("lt.events.mesh.>",d.useCallback(x=>{var y;const c=((y=x.type)==null?void 0:y.replace("mesh.",""))||"unknown";if(!b.current.has(c))return;const u=S.current;u&&!`${c} ${JSON.stringify(x.data||x)}`.toLowerCase().includes(u.toLowerCase())||(n==null||n(!0),r(k=>[{id:++ze,type:c,timestamp:x.timestamp||new Date().toISOString(),data:x.data||x},...k].slice(0,Fe)))},[]));const M=()=>r([]);return e.jsxs("div",{className:"border-l border-surface-border pl-6 pt-4 min-h-[300px] sticky top-14 self-start max-h-[calc(100vh-8rem)] flex flex-col",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Event Stream"}),e.jsx(ge,{className:`w-3 h-3 ${t?"text-status-success animate-pulse":"text-text-tertiary"}`}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:t?"Live":"..."}),e.jsxs("span",{className:"ml-auto flex items-center gap-1",children:[e.jsx("button",{onClick:()=>{o(x=>!x),a(!1)},className:`p-1 rounded transition-colors ${l?"text-accent bg-accent/10":"text-text-tertiary hover:text-text-primary"}`,title:"Configure channels",children:e.jsx(fe,{className:"w-3.5 h-3.5"})}),e.jsx("button",{onClick:()=>{a(x=>!x),o(!1)},className:`p-1 rounded transition-colors ${s?"text-accent bg-accent/10":"text-text-tertiary hover:text-text-primary"}`,title:"View raw JSON",children:e.jsx(be,{className:"w-3.5 h-3.5"})}),p.length>0&&e.jsx("button",{onClick:M,className:"p-1 rounded text-text-tertiary hover:text-text-primary transition-colors",title:"Clear events",children:e.jsx(ye,{className:"w-3.5 h-3.5"})})]})]}),e.jsx(A,{open:l,children:e.jsx(De,{channels:g,onToggle:T,customFilter:m,onCustomFilterChange:C})}),e.jsx(A,{open:s,children:e.jsx("div",{className:"pb-3 border-b border-surface-border mb-3",children:e.jsx("pre",{className:"text-[9px] font-mono text-text-tertiary bg-surface-sunken rounded-lg p-3 max-h-[50vh] overflow-auto whitespace-pre-wrap",children:JSON.stringify(p.slice(0,50),null,2)})})}),p.length>0&&e.jsxs("p",{className:"text-[9px] text-text-tertiary mb-2",children:[p.length," events"]}),e.jsx("div",{className:"flex-1 overflow-y-auto",children:p.length===0?e.jsx("p",{className:"text-xs text-text-tertiary py-6 text-center",children:t?"Waiting for events...":"Subscribing..."}):p.map(x=>e.jsx(Ke,{event:x},x.id))})]})}function it(){var U;const{data:t}=Se(),n=(t==null?void 0:t.apps)??[],{filters:l,setFilter:o}=pe({filters:{app_id:"",duration:"1h",nodes:"",queue:""}}),s=((U=n[0])==null?void 0:U.appId)??"durable",a=l.app_id||s,p=l.duration||"1h",r=l.nodes||"all",g=Me(),[j,m]=d.useState(!1),C=j?15e3:6e4,{data:b,isLoading:S,error:T,refetch:M,isFetching:x}=Te(a,C),{data:c}=$e(a,p,void 0,C),u=d.useMemo(()=>[...(b==null?void 0:b.profiles)??[]].sort((f,P)=>{const ae=f.worker_topic||f.stream||"",le=P.worker_topic||P.stream||"";return!f.worker_topic&&P.worker_topic?-1:f.worker_topic&&!P.worker_topic?1:ae.localeCompare(le)}),[b==null?void 0:b.profiles]),y=u.filter(i=>!i.worker_topic).length,k=u.filter(N).length,v=u.filter(Pe).length,_=l.queue||"",h=d.useMemo(()=>{let i=u;return r==="workers"?i=i.filter(N):r==="engines"&&(i=i.filter(f=>!N(f))),_&&(i=i.filter(f=>f.worker_topic===_)),i},[u,r,_]),$=d.useMemo(()=>{const i=new Set(n.map(f=>f.appId));return a&&i.add(a),[...i].sort().map(f=>({value:f,label:f}))},[n,a]),O=d.useMemo(()=>{const i=new Set;for(const f of u)f.worker_topic&&i.add(f.worker_topic);return[...i].sort().map(f=>({value:f,label:f}))},[u]),{selectedIds:w,setSelectedIds:G,toggleCheckbox:I,toggleAll:Q,throttleModalOpen:H,throttleTargets:L,selectedThrottleTargets:X,throttleMutation:W,handleBulkThrottle:Y,handleRowClick:Z,handleBulkThrottleOpen:ee,closeThrottleModal:te}=Qe({activeAppId:a,allProfiles:u,profiles:h}),se=d.useMemo(()=>Be({profiles:h,selectedIds:w,toggleAll:Q,toggleCheckbox:I}),[h,w,Q,I]),[J,ne]=d.useState(!1),re=d.useCallback(()=>{g.mutate({appId:a},{onSuccess:()=>ne(!0)})},[a,g]);return d.useEffect(()=>{!J&&a&&re()},[a]),e.jsxs("div",{children:[e.jsx(ie,{title:"Task Queues"}),e.jsxs(xe,{actions:e.jsx("div",{className:"flex items-center gap-1",children:Ee.map(i=>e.jsx("button",{onClick:()=>o("duration",i.value),className:`px-3 py-1 text-xs rounded-full transition-colors ${p===i.value?"bg-accent text-text-inverse":"text-text-tertiary hover:text-text-primary hover:bg-surface-hover"}`,children:i.label},i.value))}),children:[e.jsx(q,{label:"Application",value:l.app_id,onChange:i=>o("app_id",i),options:$}),e.jsx(q,{label:"Nodes",value:l.nodes,onChange:i=>o("nodes",i),options:Ae}),e.jsx(q,{label:"Queue",value:l.queue,onChange:i=>o("queue",i),options:O}),e.jsxs("button",{onClick:()=>M(),disabled:x,className:"flex items-center gap-1.5 px-3 py-1.5 text-xs text-text-tertiary hover:text-text-primary transition-colors disabled:opacity-50",children:[e.jsx(je,{className:`w-3.5 h-3.5 ${x?"animate-spin":""}`}),"Roll Call"]})]}),T&&e.jsx("div",{className:"mb-6 px-4 py-3 rounded bg-status-error/10 border border-status-error/20",children:e.jsx("p",{className:"text-xs text-status-error font-medium",children:T.message==="Session expired"?"Session expired — please log in again.":`Failed to load mesh data: ${T.message}`})}),e.jsx(Ie,{engineCount:y,workerCount:k,pending:(c==null?void 0:c.pending)??0,byStream:(c==null?void 0:c.byStream)??[],activeDuration:p}),e.jsxs(V,{className:"mb-3",children:["Stream Volume (",p,")"]}),e.jsx("div",{className:"mb-8",children:e.jsx(Ve,{byStream:(c==null?void 0:c.byStream)??[],onNodeFilter:i=>o("nodes",i),onQueueFilter:i=>{o("nodes","workers"),o("queue",i)}})}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_340px] gap-6",children:[e.jsxs("div",{children:[e.jsxs(V,{className:"mb-4",children:[r==="engines"?"Engine Nodes":r==="workers"?"Worker Nodes":"Mesh Nodes",e.jsxs("span",{className:"ml-2 text-text-tertiary font-normal text-xs",children:[h.length,r!=="all"?` of ${u.length}`:""]}),v>0&&e.jsxs("span",{className:"ml-2 text-status-warning font-normal",children:["(",v," throttled)"]})]}),w.size>0&&e.jsx(Ue,{selectedCount:w.size,onClear:()=>G(new Set),onThrottle:ee,isPending:W.isPending}),e.jsx(ce,{columns:se,data:h,keyFn:R,onRowClick:Z,isLoading:S,emptyMessage:S?"Discovering mesh nodes...":'No nodes found. Click "Roll Call" to discover.'})]}),e.jsx(Ge,{bridgeActive:J,onEventsActive:()=>m(!0)})]}),e.jsx(Je,{open:H,onClose:te,targets:L.length>0?L:X,onApply:Y,isPending:W.isPending})]})}export{it as ControlPlanePage};
2
- //# sourceMappingURL=index-Cn2jyj9A.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-Cn2jyj9A.js","sources":["../../src/api/controlplane.ts","../../src/pages/admin/controlplane/helpers.ts","../../src/pages/admin/controlplane/columns.tsx","../../src/pages/admin/controlplane/MeshStatCards.tsx","../../src/pages/admin/controlplane/useMeshSelection.ts","../../src/pages/admin/controlplane/ThrottleModal.tsx","../../src/pages/admin/controlplane/MeshBulkActionBar.tsx","../../src/pages/admin/controlplane/StreamVolumeChart.tsx","../../src/pages/admin/controlplane/QuorumFeed.tsx","../../src/pages/admin/controlplane/ControlPlanePage.tsx"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\nexport interface ControlPlaneApp {\n appId: string;\n}\n\nexport interface QuorumProfile {\n namespace: string;\n app_id: string;\n engine_id: string;\n entity?: string;\n worker_topic?: string;\n stream?: string;\n stream_depth?: number;\n counts?: Record<string, number>;\n inited?: string;\n timestamp?: string;\n throttle?: number;\n reclaimDelay?: number;\n reclaimCount?: number;\n system?: {\n TotalMemoryGB: string;\n FreeMemoryGB: string;\n UsedMemoryGB: string;\n CPULoad: Array<Record<string, string>>;\n NetworkStats: Array<Record<string, unknown>>;\n };\n signature?: string;\n}\n\n// ── API functions ───────────────────────────────────────────────────────────\n\nfunction fetchApps() {\n return apiFetch<{ apps: ControlPlaneApp[] }>('/controlplane/apps');\n}\n\nfunction fetchRollCall(appId: string) {\n return apiFetch<{ profiles: QuorumProfile[] }>(`/controlplane/rollcall?app_id=${encodeURIComponent(appId)}`);\n}\n\nfunction postThrottle(body: { appId: string; throttle: number; topic?: string; guid?: string }) {\n return apiFetch<{ success: boolean }>('/controlplane/throttle', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n}\n\nfunction postSubscribe(body: { appId: string }) {\n return apiFetch<{ subscribed: boolean; appId: string }>('/controlplane/subscribe', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n}\n\nexport interface StreamStats {\n pending: number;\n processed: number;\n byStream: Array<{ stream_type: 'engine' | 'worker'; stream_name: string; count: number }>;\n}\n\nfunction fetchStreamStats(appId: string, duration: string, stream?: string) {\n let url = `/controlplane/streams?app_id=${encodeURIComponent(appId)}&duration=${encodeURIComponent(duration)}`;\n if (stream) url += `&stream=${encodeURIComponent(stream)}`;\n return apiFetch<StreamStats>(url);\n}\n\n// ── Hooks ───────────────────────────────────────────────────────────────────\n\nexport function useControlPlaneApps() {\n return useQuery({\n queryKey: ['controlplane', 'apps'],\n queryFn: fetchApps,\n staleTime: 60_000,\n });\n}\n\nexport function useRollCall(appId: string, refetchInterval?: number | false) {\n return useQuery({\n queryKey: ['controlplane', 'rollcall', appId],\n queryFn: () => fetchRollCall(appId),\n enabled: !!appId,\n refetchInterval: refetchInterval ?? false,\n });\n}\n\nexport function useThrottle() {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: postThrottle,\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['controlplane', 'rollcall'] });\n },\n });\n}\n\nexport function useStreamStats(appId: string, duration: string, stream?: string, refetchInterval?: number | false) {\n return useQuery({\n queryKey: ['controlplane', 'streams', appId, duration, stream ?? ''],\n queryFn: () => fetchStreamStats(appId, duration, stream),\n enabled: !!appId,\n staleTime: 15_000,\n refetchInterval: refetchInterval ?? false,\n });\n}\n\nexport function useSubscribeMesh() {\n return useMutation({\n mutationFn: postSubscribe,\n });\n}\n","import type { QuorumProfile } from '../../../api/controlplane';\n\nexport const DURATIONS = [\n { label: '15m', value: '15m' },\n { label: '30m', value: '30m' },\n { label: '1h', value: '1h' },\n { label: '1d', value: '1d' },\n { label: '7d', value: '7d' },\n] as const;\n\nexport type Duration = (typeof DURATIONS)[number]['value'];\n\nexport interface QuorumEvent {\n id: number;\n type: string;\n timestamp: string;\n data: Record<string, unknown>;\n}\n\nexport const EVENT_TYPE_COLORS: Record<string, string> = {\n pong: 'text-status-success',\n ping: 'text-accent',\n throttle: 'text-status-warning',\n job: 'text-purple-400',\n work: 'text-text-secondary',\n activate: 'text-status-error',\n cron: 'text-text-tertiary',\n user: 'text-text-secondary',\n};\n\nexport const MAX_EVENTS = 250;\n\nexport function isWorker(p: QuorumProfile): boolean {\n return !!p.worker_topic;\n}\n\nexport function isThrottled(p: QuorumProfile): boolean {\n return typeof p.throttle === 'number' && p.throttle !== 0;\n}\n\nexport function formatThrottleHuman(ms?: number): string {\n if (ms === undefined || ms === 0) return 'Normal';\n if (ms === -1) return 'Paused';\n if (ms >= 86_400_000) return `${(ms / 86_400_000).toFixed(0)}d`;\n if (ms >= 3_600_000) return `${(ms / 3_600_000).toFixed(1)}h`;\n if (ms >= 60_000) return `${(ms / 60_000).toFixed(1)}m`;\n if (ms >= 1000) return `${(ms / 1000).toFixed(1)}s`;\n return `${ms}ms`;\n}\n\nexport function formatMemory(total?: string, free?: string): string {\n if (!total || !free) return '—';\n const t = parseFloat(total);\n const f = parseFloat(free);\n if (isNaN(t) || isNaN(f)) return '—';\n return `${(t - f).toFixed(1)} / ${t.toFixed(1)} GB`;\n}\n\nexport function stripStreamPrefix(name: string): string {\n return name.replace(/^hmsh:[^:]+:x:/, '') || '(engine)';\n}\n\n/** Engine streams have no suffix after hmsh:{app}:x: */\nexport function isEngineStream(streamName: string): boolean {\n return stripStreamPrefix(streamName) === '(engine)';\n}\n\nexport type NodeFilter = 'all' | 'workers' | 'engines';\n\n/** Known quorum message types published via the bridge. */\nexport const QUORUM_CHANNELS = [\n { key: 'pong', label: 'Pong', description: 'Roll call responses' },\n { key: 'ping', label: 'Ping', description: 'Roll call broadcasts' },\n { key: 'throttle', label: 'Throttle', description: 'Throttle commands' },\n { key: 'job', label: 'Job', description: 'Job lifecycle events' },\n { key: 'work', label: 'Work', description: 'Worker dispatch events' },\n { key: 'activate', label: 'Activate', description: 'Worker activation' },\n { key: 'cron', label: 'Cron', description: 'Cron schedule triggers' },\n { key: 'user', label: 'User', description: 'User-defined messages' },\n] as const;\n\n/** Typed throttle target with display label and API params. */\nexport interface ThrottleTarget {\n label: string;\n /** API param: topic-based throttle (queues, all engines) */\n topic?: string;\n /** API param: guid-based throttle (single engine/worker) */\n guid?: string;\n}\n\nexport const NODE_FILTER_OPTIONS = [\n { value: 'all', label: 'All Nodes' },\n { value: 'workers', label: 'Workers' },\n { value: 'engines', label: 'Engines' },\n] as const;\n\nexport function rowKey(p: QuorumProfile): string {\n return `${p.engine_id}-${p.worker_topic || 'engine'}`;\n}\n","import type { Column } from '../../../components/common/data/DataTable';\nimport { TaskQueuePill } from '../../../components/common/display/TaskQueuePill';\nimport type { QuorumProfile } from '../../../api/controlplane';\nimport { isWorker, formatThrottleHuman, formatMemory, rowKey } from './helpers';\n\ninterface ColumnOptions {\n profiles: QuorumProfile[];\n selectedIds: Set<string>;\n toggleAll: () => void;\n toggleCheckbox: (profile: QuorumProfile) => void;\n}\n\nexport function getMeshColumns({\n profiles,\n selectedIds,\n toggleAll,\n toggleCheckbox,\n}: ColumnOptions): Column<QuorumProfile>[] {\n return [\n {\n key: 'select',\n label: (\n <input\n type=\"checkbox\"\n checked={profiles.length > 0 && selectedIds.size === profiles.length}\n onChange={toggleAll}\n className=\"rounded\"\n />\n ) as any,\n render: (row) => (\n <input\n type=\"checkbox\"\n checked={selectedIds.has(rowKey(row))}\n onChange={(e) => { e.stopPropagation(); toggleCheckbox(row); }}\n onClick={(e) => e.stopPropagation()}\n className=\"rounded\"\n />\n ),\n className: 'w-10',\n },\n {\n key: 'type',\n label: 'Type',\n render: (row) => (\n <span className={`text-xs ${isWorker(row) ? 'text-text-secondary' : 'text-blue-500'}`}>\n {isWorker(row) ? 'Worker' : 'Engine'}\n </span>\n ),\n className: 'w-20',\n },\n {\n key: 'worker_topic',\n label: 'Task Queue',\n render: (row) => {\n if (!isWorker(row)) return <span className=\"text-xs text-text-tertiary\">—</span>;\n return <TaskQueuePill queue={row.worker_topic!} />;\n },\n className: 'w-64',\n },\n {\n key: 'engine_id',\n label: 'Engine/Worker ID',\n render: (row) => (\n <span className=\"text-xs font-mono text-text-tertiary\">\n {row.engine_id}\n </span>\n ),\n className: 'w-48',\n },\n {\n key: 'throttle',\n label: 'Throttle',\n render: (row) => {\n const t = row.throttle;\n if (t === -1) return <span className=\"text-xs text-status-error font-medium\">Paused</span>;\n if (t && t > 0) return <span className=\"text-xs text-status-warning font-medium\">{formatThrottleHuman(t)}</span>;\n return <span className=\"text-xs text-text-tertiary\">0</span>;\n },\n className: 'w-24',\n },\n {\n key: 'memory',\n label: 'Memory',\n render: (row) => (\n <span className=\"text-xs font-mono text-text-tertiary\">\n {formatMemory(row.system?.TotalMemoryGB, row.system?.FreeMemoryGB)}\n </span>\n ),\n className: 'w-36',\n },\n ];\n}\n","import { StatCard } from '../../../components/common/data/StatCard';\nimport type { Duration } from './helpers';\n\ninterface StreamStat {\n stream_type: string;\n count: number;\n}\n\ninterface MeshStatCardsProps {\n engineCount: number;\n workerCount: number;\n pending: number;\n byStream: StreamStat[];\n activeDuration: Duration;\n}\n\nexport function MeshStatCards({\n engineCount,\n workerCount,\n pending,\n byStream,\n activeDuration,\n}: MeshStatCardsProps) {\n const engineProcessed = byStream\n .filter((s) => s.stream_type === 'engine')\n .reduce((sum, s) => sum + s.count, 0);\n const workerProcessed = byStream\n .filter((s) => s.stream_type === 'worker')\n .reduce((sum, s) => sum + s.count, 0);\n\n return (\n <div className=\"grid grid-cols-5 gap-4 mb-8\">\n <StatCard label=\"Engines\" value={engineCount} />\n <StatCard label=\"Workers\" value={workerCount} />\n <StatCard\n label=\"Pending\"\n value={pending}\n colorClass={pending ? 'text-status-warning' : 'text-text-primary'}\n />\n <StatCard\n label={`Engine Msgs (${activeDuration})`}\n value={engineProcessed.toLocaleString()}\n colorClass=\"text-blue-500\"\n />\n <StatCard\n label={`Worker Msgs (${activeDuration})`}\n value={workerProcessed.toLocaleString()}\n />\n </div>\n );\n}\n","import { useState, useCallback, useEffect, useMemo } from 'react';\n\nimport type { QuorumProfile } from '../../../api/controlplane';\nimport { useThrottle } from '../../../api/controlplane';\nimport { isWorker, rowKey, type ThrottleTarget } from './helpers';\n\ninterface UseMeshSelectionOptions {\n activeAppId: string;\n allProfiles: QuorumProfile[];\n profiles: QuorumProfile[];\n}\n\nexport function useMeshSelection({\n activeAppId,\n allProfiles,\n profiles,\n}: UseMeshSelectionOptions) {\n const throttleMutation = useThrottle();\n\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const [throttleModalOpen, setThrottleModalOpen] = useState(false);\n const [throttleTargets, setThrottleTargets] = useState<ThrottleTarget[]>([]);\n\n useEffect(() => { setSelectedIds(new Set()); }, [activeAppId]);\n\n const toggleCheckbox = useCallback((profile: QuorumProfile) => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n const key = rowKey(profile);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n }, []);\n\n const toggleAll = useCallback(() => {\n if (selectedIds.size === profiles.length) {\n setSelectedIds(new Set());\n } else {\n setSelectedIds(new Set(profiles.map(rowKey)));\n }\n }, [profiles, selectedIds.size]);\n\n /**\n * Build throttle targets from checkbox selection.\n *\n * Smart grouping:\n * - All nodes selected -> no topic/guid (entire mesh)\n * - All engines selected -> topic = engine stream (all engines)\n * - All workers on a queue selected -> topic = queue (all workers on queue)\n * - Subset of a group -> individual guid targets\n */\n const selectedThrottleTargets = useMemo((): ThrottleTarget[] => {\n const selected = profiles.filter((p) => selectedIds.has(rowKey(p)));\n if (selected.length === 0) return [];\n\n // All nodes -> entire mesh\n if (selected.length === allProfiles.length) {\n return [{ label: 'Entire Mesh' }];\n }\n\n const engines = selected.filter((p) => !isWorker(p));\n const workers = selected.filter(isWorker);\n const allEngines = allProfiles.filter((p) => !isWorker(p));\n const targets: ThrottleTarget[] = [];\n\n // Engines\n if (engines.length > 0) {\n if (engines.length === allEngines.length) {\n targets.push({ label: 'All Engines', topic: engines[0].stream || '' });\n } else {\n for (const e of engines) {\n targets.push({ label: `Engine ${e.engine_id.slice(0, 10)}...`, guid: e.engine_id });\n }\n }\n }\n\n // Workers — group by queue, then decide per-queue\n const queues = new Map<string, QuorumProfile[]>();\n for (const w of workers) {\n const q = w.worker_topic!;\n if (!queues.has(q)) queues.set(q, []);\n queues.get(q)!.push(w);\n }\n for (const [queue, members] of queues) {\n const allOnQueue = allProfiles.filter((p) => p.worker_topic === queue);\n if (members.length === allOnQueue.length) {\n targets.push({ label: queue, topic: queue });\n } else {\n for (const w of members) {\n targets.push({ label: `${queue} ${w.engine_id.slice(0, 10)}...`, guid: w.engine_id });\n }\n }\n }\n\n return targets;\n }, [profiles, allProfiles, selectedIds]);\n\n // ── Throttle handlers ─────────────────────────────────────────\n const handleBulkThrottle = (ms: number) => {\n const targets = throttleTargets.length > 0 ? throttleTargets : selectedThrottleTargets;\n for (const t of targets) {\n throttleMutation.mutate({\n appId: activeAppId,\n throttle: ms,\n ...(t.topic ? { topic: t.topic } : {}),\n ...(t.guid ? { guid: t.guid } : {}),\n });\n }\n setThrottleModalOpen(false);\n setThrottleTargets([]);\n };\n\n const handleRowClick = (profile: QuorumProfile) => {\n const label = isWorker(profile)\n ? `${profile.worker_topic} ${profile.engine_id.slice(0, 10)}...`\n : `Engine ${profile.engine_id.slice(0, 10)}...`;\n setThrottleTargets([{ label, guid: profile.engine_id }]);\n setThrottleModalOpen(true);\n };\n\n const handleBulkThrottleOpen = () => {\n setThrottleTargets(selectedThrottleTargets);\n setThrottleModalOpen(true);\n };\n\n const closeThrottleModal = () => {\n setThrottleModalOpen(false);\n setThrottleTargets([]);\n };\n\n return {\n selectedIds,\n setSelectedIds,\n toggleCheckbox,\n toggleAll,\n throttleModalOpen,\n throttleTargets,\n selectedThrottleTargets,\n throttleMutation,\n handleBulkThrottle,\n handleRowClick,\n handleBulkThrottleOpen,\n closeThrottleModal,\n };\n}\n","import { useState } from 'react';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { ThrottleTarget } from './helpers';\n\ninterface ThrottleModalProps {\n open: boolean;\n onClose: () => void;\n targets: ThrottleTarget[];\n onApply: (ms: number) => void;\n isPending: boolean;\n}\n\nconst PRESETS = [\n { label: 'Resume', ms: 0 },\n { label: '0.5s', ms: 500 },\n { label: '1s', ms: 1000 },\n { label: '5s', ms: 5000 },\n { label: '30s', ms: 30000 },\n { label: 'Pause', ms: -1 },\n];\n\nfunction TargetPill({ target }: { target: ThrottleTarget }) {\n const isMesh = target.label === 'Entire Mesh';\n const isEngine = target.label === 'All Engines' || target.label.startsWith('Engine ');\n const color = isMesh\n ? 'bg-status-error/10 text-status-error'\n : isEngine\n ? 'bg-blue-500/10 text-blue-500'\n : 'bg-accent/[0.06] text-text-secondary';\n const scope = target.guid ? 'guid' : target.topic ? 'topic' : 'mesh';\n\n return (\n <span className={`inline-flex items-center gap-1.5 px-2 py-0.5 text-[10px] font-medium rounded-lg ${color}`}>\n {target.label}\n <span className=\"text-[8px] opacity-50\">{scope}</span>\n </span>\n );\n}\n\nexport function ThrottleModal({ open, onClose, targets, onApply, isPending }: ThrottleModalProps) {\n const [seconds, setSeconds] = useState('0');\n\n return (\n <Modal open={open} onClose={onClose} title=\"Adjust Throttle\">\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Targets</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {targets.map((t, i) => (\n <TargetPill key={t.guid || t.topic || i} target={t} />\n ))}\n </div>\n </div>\n\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Presets</p>\n <div className=\"flex flex-wrap gap-2\">\n {PRESETS.map((p) => (\n <button\n key={p.label}\n onClick={() => { setSeconds(p.ms === -1 ? '-1' : String(p.ms / 1000)); onApply(p.ms); }}\n disabled={isPending}\n className={`px-3 py-1.5 text-xs rounded transition-colors ${\n p.ms === -1\n ? 'bg-status-error/10 text-status-error hover:bg-status-error/20'\n : p.ms === 0\n ? 'bg-status-success/10 text-status-success hover:bg-status-success/20'\n : 'bg-surface-sunken text-text-secondary hover:bg-surface-hover'\n } disabled:opacity-50`}\n >\n {p.label}\n </button>\n ))}\n </div>\n </div>\n\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n Custom (seconds between messages)\n </p>\n <div className=\"flex items-center gap-3\">\n <input\n type=\"number\"\n step=\"0.1\"\n min=\"-1\"\n value={seconds}\n onChange={(e) => setSeconds(e.target.value)}\n className=\"input text-xs py-1.5 px-3 w-28\"\n />\n <button\n onClick={() => {\n const s = parseFloat(seconds);\n if (isNaN(s)) return;\n onApply(s === -1 ? -1 : Math.round(s * 1000));\n }}\n disabled={isPending}\n className=\"btn-primary text-xs py-1.5 px-4 disabled:opacity-50\"\n >\n Apply\n </button>\n </div>\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n 0 = resume, -1 = pause indefinitely\n </p>\n </div>\n </div>\n </Modal>\n );\n}\n","interface MeshBulkActionBarProps {\n selectedCount: number;\n onClear: () => void;\n onThrottle: () => void;\n isPending: boolean;\n}\n\nexport function MeshBulkActionBar({ selectedCount, onClear, onThrottle, isPending }: MeshBulkActionBarProps) {\n return (\n <div className=\"flex flex-wrap items-center gap-3 px-4 py-3 bg-accent/5 border border-accent/20 rounded-lg mb-4\">\n <span className=\"text-xs font-medium text-accent\">\n {selectedCount} selected\n </span>\n <div className=\"w-px h-5 bg-surface-border\" />\n <button\n onClick={onThrottle}\n disabled={isPending}\n className=\"btn-secondary text-xs py-1.5 disabled:opacity-50\"\n >\n Adjust Throttle...\n </button>\n <div className=\"flex-1\" />\n <button\n onClick={onClear}\n className=\"text-xs text-text-tertiary hover:text-text-primary transition-colors\"\n >\n Clear\n </button>\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { stripStreamPrefix, type NodeFilter } from './helpers';\n\ninterface StreamEntry {\n stream_type: 'engine' | 'worker';\n stream_name: string;\n count: number;\n}\n\ninterface StreamVolumeChartProps {\n byStream: StreamEntry[];\n onNodeFilter?: (filter: NodeFilter) => void;\n onQueueFilter?: (queue: string) => void;\n}\n\nexport function StreamVolumeChart({ byStream, onNodeFilter, onQueueFilter }: StreamVolumeChartProps) {\n const [animated, setAnimated] = useState(false);\n\n useEffect(() => {\n setAnimated(false);\n const raf = requestAnimationFrame(() => setAnimated(true));\n return () => cancelAnimationFrame(raf);\n }, [byStream]);\n\n if (byStream.length === 0) {\n return <p className=\"text-xs text-text-tertiary py-4 text-center\">No activity in this period</p>;\n }\n\n const engineStreams = byStream.filter((s) => s.stream_type === 'engine');\n const workerStreams = byStream.filter((s) => s.stream_type === 'worker');\n const maxCount = Math.max(...byStream.map((s) => s.count));\n\n const renderBar = (s: StreamEntry) => {\n const pct = maxCount > 0 ? (s.count / maxCount) * 100 : 0;\n const isEngine = s.stream_type === 'engine';\n const label = isEngine ? '(engine)' : stripStreamPrefix(s.stream_name);\n const barColor = isEngine ? 'bg-blue-500/70' : 'bg-accent/60';\n const labelColor = isEngine ? 'text-blue-500' : 'text-text-tertiary';\n const clickable = !isEngine && onQueueFilter;\n\n return (\n <div key={`${s.stream_type}-${s.stream_name}`} className=\"flex items-center gap-3\">\n <span\n className={`text-[9px] font-mono ${labelColor} w-36 truncate text-right shrink-0 ${\n clickable ? 'cursor-pointer hover:underline hover:text-accent' : ''\n }`}\n title={s.stream_name}\n onClick={clickable ? () => onQueueFilter(s.stream_name) : undefined}\n >\n {label}\n </span>\n <div className=\"flex-1 h-4 bg-surface-sunken rounded overflow-hidden\">\n <div\n className={`h-full ${barColor} rounded transition-all duration-500 ease-out`}\n style={{ width: animated ? `${pct}%` : '0%' }}\n />\n </div>\n <span className=\"text-[10px] font-mono tabular-nums text-text-secondary w-12 text-right shrink-0\">\n {s.count.toLocaleString()}\n </span>\n </div>\n );\n };\n\n const labelCls = 'text-[9px] uppercase tracking-widest font-semibold mb-1 cursor-pointer hover:underline';\n\n return (\n <div className=\"space-y-1.5\">\n {engineStreams.length > 0 && (\n <>\n <p\n className={`${labelCls} text-blue-500/70 hover:text-blue-500`}\n onClick={() => onNodeFilter?.('engines')}\n >\n Engine Queue\n </p>\n {engineStreams.map(renderBar)}\n {workerStreams.length > 0 && <div className=\"h-2\" />}\n </>\n )}\n {workerStreams.length > 0 && (\n <>\n <p\n className={`${labelCls} text-accent/70 hover:text-accent`}\n onClick={() => onNodeFilter?.('workers')}\n >\n Worker Queues\n </p>\n {workerStreams.map(renderBar)}\n </>\n )}\n </div>\n );\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { Radio, Settings, Eraser, Code } from 'lucide-react';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport { useEventSubscription } from '../../../hooks/useEventContext';\nimport {\n EVENT_TYPE_COLORS,\n QUORUM_CHANNELS,\n MAX_EVENTS,\n formatThrottleHuman,\n type QuorumEvent,\n} from './helpers';\n\nlet eventCounter = 0;\n\n// ── Event row ───────────────────────────────────────────────────────────────\n\nfunction QuorumEventRow({ event }: { event: QuorumEvent }) {\n const [expanded, setExpanded] = useState(false);\n\n return (\n <div className=\"border-b border-surface-border/50 last:border-b-0\">\n <button\n onClick={() => setExpanded(!expanded)}\n className=\"flex items-center gap-2 py-1.5 w-full text-left hover:bg-surface-hover/50 transition-colors\"\n >\n <span className=\"text-[9px] font-mono text-text-tertiary whitespace-nowrap tabular-nums shrink-0\">\n {new Date(event.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' })}\n </span>\n <span className={`text-[9px] font-medium px-1 py-0.5 rounded ${EVENT_TYPE_COLORS[event.type] || 'text-text-tertiary'} bg-surface-sunken whitespace-nowrap shrink-0`}>\n {event.type}\n </span>\n <span className=\"text-[9px] text-text-tertiary font-mono flex-1 min-w-0 break-all\">\n {event.data?.guid ? String(event.data.guid) : ''}\n {event.data?.topic ? ` ${String(event.data.topic)}` : ''}\n {event.type === 'throttle' ? ` → ${formatThrottleHuman(event.data?.throttle as number)}` : ''}\n </span>\n <svg\n className={`w-2.5 h-2.5 text-text-tertiary shrink-0 transition-transform duration-150 ${expanded ? 'rotate-180' : ''}`}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n <Collapsible open={expanded}>\n <div className=\"pb-2\">\n <JsonViewer data={event.data} />\n </div>\n </Collapsible>\n </div>\n );\n}\n\n// ── Config panel ────────────────────────────────────────────────────────────\n\ninterface ConfigPanelProps {\n channels: Set<string>;\n onToggle: (key: string) => void;\n customFilter: string;\n onCustomFilterChange: (v: string) => void;\n}\n\nfunction ConfigPanel({ channels, onToggle, customFilter, onCustomFilterChange }: ConfigPanelProps) {\n return (\n <div className=\"space-y-3 pb-3 border-b border-surface-border mb-3\">\n <div className=\"flex items-center gap-2 mb-1\">\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Channels\n </p>\n <p className=\"text-[9px] text-text-tertiary\">\n Unchecked channels are dropped before buffering\n </p>\n </div>\n <div className=\"grid grid-cols-2 gap-1\">\n {QUORUM_CHANNELS.map((ch) => (\n <label key={ch.key} className=\"flex items-center gap-2 cursor-pointer py-0.5\">\n <input\n type=\"checkbox\"\n checked={channels.has(ch.key)}\n onChange={() => onToggle(ch.key)}\n className=\"w-3 h-3 rounded border-border accent-accent\"\n />\n <span className=\"text-[10px] text-text-secondary\" title={ch.description}>\n {ch.label}\n </span>\n </label>\n ))}\n </div>\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Text Filter\n </p>\n <input\n type=\"text\"\n value={customFilter}\n onChange={(e) => onCustomFilterChange(e.target.value)}\n placeholder=\"pong\"\n className=\"input text-[10px] font-mono py-1 px-2 w-full\"\n />\n <p className=\"text-[9px] text-text-tertiary mt-1\">\n Filter by event type, e.g. <span className=\"font-mono\">pong</span>, <span className=\"font-mono\">throttle</span>, or any text in the event data.\n </p>\n </div>\n </div>\n );\n}\n\n// ── Feed panel ──────────────────────────────────────────────────────────────\n\ninterface QuorumFeedProps {\n bridgeActive: boolean;\n onEventsActive?: (active: boolean) => void;\n}\n\nexport function QuorumFeed({ bridgeActive, onEventsActive }: QuorumFeedProps) {\n const [showConfig, setShowConfig] = useState(false);\n const [showRaw, setShowRaw] = useState(false);\n const [events, setEvents] = useState<QuorumEvent[]>([]);\n const [channels, setChannels] = useState<Set<string>>(\n () => new Set(QUORUM_CHANNELS.map((c) => c.key)),\n );\n const [customFilter, setCustomFilter] = useState('');\n\n // Keep a ref to channels so the NATS callback reads the latest without re-subscribing\n const channelsRef = useRef(channels);\n useEffect(() => { channelsRef.current = channels; }, [channels]);\n const customFilterRef = useRef(customFilter);\n useEffect(() => { customFilterRef.current = customFilter; }, [customFilter]);\n\n const toggleChannel = (key: string) => {\n setChannels((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n };\n\n // Subscribe to NATS and filter on intake (before buffer)\n useEventSubscription('lt.events.mesh.>', useCallback((raw: any) => {\n const type = raw.type?.replace('mesh.', '') || 'unknown';\n\n // Channel filter: drop events for unchecked channels at intake\n if (!channelsRef.current.has(type)) return;\n\n // Text filter: if set, match against type or stringified data\n const cf = customFilterRef.current;\n if (cf) {\n const haystack = `${type} ${JSON.stringify(raw.data || raw)}`.toLowerCase();\n if (!haystack.includes(cf.toLowerCase())) return;\n }\n\n onEventsActive?.(true);\n setEvents((prev) => {\n const next = [{\n id: ++eventCounter,\n type,\n timestamp: raw.timestamp || new Date().toISOString(),\n data: raw.data || raw,\n }, ...prev];\n return next.slice(0, MAX_EVENTS);\n });\n }, []));\n\n const handleClear = () => setEvents([]);\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px] sticky top-14 self-start max-h-[calc(100vh-8rem)] flex flex-col\">\n {/* Header */}\n <div className=\"flex items-center gap-2 mb-3\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Event Stream\n </p>\n <Radio className={`w-3 h-3 ${bridgeActive ? 'text-status-success animate-pulse' : 'text-text-tertiary'}`} />\n <span className=\"text-[9px] text-text-tertiary\">\n {bridgeActive ? 'Live' : '...'}\n </span>\n\n <span className=\"ml-auto flex items-center gap-1\">\n <button\n onClick={() => { setShowConfig((v) => !v); setShowRaw(false); }}\n className={`p-1 rounded transition-colors ${showConfig ? 'text-accent bg-accent/10' : 'text-text-tertiary hover:text-text-primary'}`}\n title=\"Configure channels\"\n >\n <Settings className=\"w-3.5 h-3.5\" />\n </button>\n <button\n onClick={() => { setShowRaw((v) => !v); setShowConfig(false); }}\n className={`p-1 rounded transition-colors ${showRaw ? 'text-accent bg-accent/10' : 'text-text-tertiary hover:text-text-primary'}`}\n title=\"View raw JSON\"\n >\n <Code className=\"w-3.5 h-3.5\" />\n </button>\n {events.length > 0 && (\n <button\n onClick={handleClear}\n className=\"p-1 rounded text-text-tertiary hover:text-text-primary transition-colors\"\n title=\"Clear events\"\n >\n <Eraser className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </span>\n </div>\n\n {/* Config panel (animated) */}\n <Collapsible open={showConfig}>\n <ConfigPanel\n channels={channels}\n onToggle={toggleChannel}\n customFilter={customFilter}\n onCustomFilterChange={setCustomFilter}\n />\n </Collapsible>\n\n {/* Raw JSON view */}\n <Collapsible open={showRaw}>\n <div className=\"pb-3 border-b border-surface-border mb-3\">\n <pre className=\"text-[9px] font-mono text-text-tertiary bg-surface-sunken rounded-lg p-3 max-h-[50vh] overflow-auto whitespace-pre-wrap\">\n {JSON.stringify(events.slice(0, 50), null, 2)}\n </pre>\n </div>\n </Collapsible>\n\n {/* Event count */}\n {events.length > 0 && (\n <p className=\"text-[9px] text-text-tertiary mb-2\">\n {events.length} events\n </p>\n )}\n\n {/* Event list */}\n <div className=\"flex-1 overflow-y-auto\">\n {events.length === 0 ? (\n <p className=\"text-xs text-text-tertiary py-6 text-center\">\n {bridgeActive ? 'Waiting for events...' : 'Subscribing...'}\n </p>\n ) : (\n events.map((evt) => (\n <QuorumEventRow key={evt.id} event={evt} />\n ))\n )}\n </div>\n </div>\n );\n}\n","import { useMemo, useState, useCallback, useEffect } from 'react';\nimport { RefreshCw } from 'lucide-react';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { DataTable } from '../../../components/common/data/DataTable';\nimport { SectionLabel } from '../../../components/common/layout/SectionLabel';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport {\n useControlPlaneApps,\n useRollCall,\n useStreamStats,\n useSubscribeMesh,\n} from '../../../api/controlplane';\nimport {\n DURATIONS,\n isWorker,\n isThrottled,\n rowKey,\n NODE_FILTER_OPTIONS,\n type Duration,\n type NodeFilter,\n} from './helpers';\nimport { getMeshColumns } from './columns';\nimport { MeshStatCards } from './MeshStatCards';\nimport { useMeshSelection } from './useMeshSelection';\nimport { ThrottleModal } from './ThrottleModal';\nimport { MeshBulkActionBar } from './MeshBulkActionBar';\nimport { StreamVolumeChart } from './StreamVolumeChart';\nimport { QuorumFeed } from './QuorumFeed';\n\nexport function ControlPlanePage() {\n const { data: appsData } = useControlPlaneApps();\n const apps = appsData?.apps ?? [];\n\n const { filters, setFilter } = useFilterParams({\n filters: { app_id: '', duration: '1h', nodes: '', queue: '' },\n });\n\n const firstAppId = apps[0]?.appId ?? 'durable';\n const activeAppId = filters.app_id || firstAppId;\n const activeDuration = (filters.duration || '1h') as Duration;\n const activeNodeFilter = (filters.nodes || 'all') as NodeFilter;\n\n const subscribeMesh = useSubscribeMesh();\n\n // ── Auto-refresh: 15s when events flowing, 60s otherwise ───\n const [eventsActive, setEventsActive] = useState(false);\n const refreshInterval = eventsActive ? 15_000 : 60_000;\n\n const { data: rollCallData, isLoading, error: rollCallError, refetch, isFetching } = useRollCall(activeAppId, refreshInterval);\n const { data: streamStats } = useStreamStats(activeAppId, activeDuration, undefined, refreshInterval);\n\n // ── All profiles (sorted) ───────────────────────────────────\n const allProfiles = useMemo(() => {\n const raw = rollCallData?.profiles ?? [];\n return [...raw].sort((a, b) => {\n const ta = a.worker_topic || a.stream || '';\n const tb = b.worker_topic || b.stream || '';\n if (!a.worker_topic && b.worker_topic) return -1;\n if (a.worker_topic && !b.worker_topic) return 1;\n return ta.localeCompare(tb);\n });\n }, [rollCallData?.profiles]);\n\n // ── Counts from all profiles ────────────────────────────────\n const engineCount = allProfiles.filter((p) => !p.worker_topic).length;\n const workerCount = allProfiles.filter(isWorker).length;\n const throttledCount = allProfiles.filter(isThrottled).length;\n\n // ── Filtered profiles for table ─────────────────────────────\n const activeQueue = filters.queue || '';\n\n const profiles = useMemo(() => {\n let result = allProfiles;\n if (activeNodeFilter === 'workers') result = result.filter(isWorker);\n else if (activeNodeFilter === 'engines') result = result.filter((p) => !isWorker(p));\n if (activeQueue) result = result.filter((p) => p.worker_topic === activeQueue);\n return result;\n }, [allProfiles, activeNodeFilter, activeQueue]);\n\n const appOptions = useMemo(() => {\n const ids = new Set(apps.map((a) => a.appId));\n if (activeAppId) ids.add(activeAppId);\n return [...ids].sort().map((id) => ({ value: id, label: id }));\n }, [apps, activeAppId]);\n\n const queueOptions = useMemo(() => {\n const queues = new Set<string>();\n for (const p of allProfiles) {\n if (p.worker_topic) queues.add(p.worker_topic);\n }\n return [...queues].sort().map((q) => ({ value: q, label: q }));\n }, [allProfiles]);\n\n // ── Selection + throttle logic ─────────────────────────────\n const {\n selectedIds,\n setSelectedIds,\n toggleCheckbox,\n toggleAll,\n throttleModalOpen,\n throttleTargets,\n selectedThrottleTargets,\n throttleMutation,\n handleBulkThrottle,\n handleRowClick,\n handleBulkThrottleOpen,\n closeThrottleModal,\n } = useMeshSelection({ activeAppId, allProfiles, profiles });\n\n // ── Column definitions ─────────────────────────────────────\n const columns = useMemo(\n () => getMeshColumns({ profiles, selectedIds, toggleAll, toggleCheckbox }),\n [profiles, selectedIds, toggleAll, toggleCheckbox],\n );\n\n // ── Quorum bridge ────────────────────────────────────────────\n const [bridgeActive, setBridgeActive] = useState(false);\n\n const handleStartBridge = useCallback(() => {\n subscribeMesh.mutate({ appId: activeAppId }, {\n onSuccess: () => setBridgeActive(true),\n });\n }, [activeAppId, subscribeMesh]);\n\n useEffect(() => {\n if (!bridgeActive && activeAppId) {\n handleStartBridge();\n }\n }, [activeAppId]); // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <div>\n <PageHeader title=\"Task Queues\" />\n\n <FilterBar\n actions={\n <div className=\"flex items-center gap-1\">\n {DURATIONS.map((d) => (\n <button\n key={d.value}\n onClick={() => setFilter('duration', d.value)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n activeDuration === d.value\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n }\n >\n <FilterSelect\n label=\"Application\"\n value={filters.app_id}\n onChange={(v) => setFilter('app_id', v)}\n options={appOptions}\n />\n <FilterSelect\n label=\"Nodes\"\n value={filters.nodes}\n onChange={(v) => setFilter('nodes', v)}\n options={NODE_FILTER_OPTIONS as any}\n />\n <FilterSelect\n label=\"Queue\"\n value={filters.queue}\n onChange={(v) => setFilter('queue', v)}\n options={queueOptions}\n />\n <button\n onClick={() => refetch()}\n disabled={isFetching}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs text-text-tertiary hover:text-text-primary transition-colors disabled:opacity-50\"\n >\n <RefreshCw className={`w-3.5 h-3.5 ${isFetching ? 'animate-spin' : ''}`} />\n Roll Call\n </button>\n </FilterBar>\n\n {/* Error banner */}\n {rollCallError && (\n <div className=\"mb-6 px-4 py-3 rounded bg-status-error/10 border border-status-error/20\">\n <p className=\"text-xs text-status-error font-medium\">\n {rollCallError.message === 'Session expired'\n ? 'Session expired — please log in again.'\n : `Failed to load mesh data: ${rollCallError.message}`}\n </p>\n </div>\n )}\n\n {/* Summary cards */}\n <MeshStatCards\n engineCount={engineCount}\n workerCount={workerCount}\n pending={streamStats?.pending ?? 0}\n byStream={streamStats?.byStream ?? []}\n activeDuration={activeDuration}\n />\n\n {/* Stream volume chart */}\n <SectionLabel className=\"mb-3\">Stream Volume ({activeDuration})</SectionLabel>\n <div className=\"mb-8\">\n <StreamVolumeChart\n byStream={streamStats?.byStream ?? []}\n onNodeFilter={(f) => setFilter('nodes', f)}\n onQueueFilter={(q) => { setFilter('nodes', 'workers'); setFilter('queue', q); }}\n />\n </div>\n\n {/* Main content: table (left) + quorum feed (right) */}\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_340px] gap-6\">\n <div>\n <SectionLabel className=\"mb-4\">\n {activeNodeFilter === 'engines' ? 'Engine Nodes' : activeNodeFilter === 'workers' ? 'Worker Nodes' : 'Mesh Nodes'}\n <span className=\"ml-2 text-text-tertiary font-normal text-xs\">\n {profiles.length}{activeNodeFilter !== 'all' ? ` of ${allProfiles.length}` : ''}\n </span>\n {throttledCount > 0 && (\n <span className=\"ml-2 text-status-warning font-normal\">({throttledCount} throttled)</span>\n )}\n </SectionLabel>\n\n {selectedIds.size > 0 && (\n <MeshBulkActionBar\n selectedCount={selectedIds.size}\n onClear={() => setSelectedIds(new Set())}\n onThrottle={handleBulkThrottleOpen}\n isPending={throttleMutation.isPending}\n />\n )}\n\n <DataTable\n columns={columns}\n data={profiles}\n keyFn={rowKey}\n onRowClick={handleRowClick}\n isLoading={isLoading}\n emptyMessage={isLoading ? 'Discovering mesh nodes...' : 'No nodes found. Click \"Roll Call\" to discover.'}\n />\n </div>\n\n <QuorumFeed bridgeActive={bridgeActive} onEventsActive={() => setEventsActive(true)} />\n </div>\n\n <ThrottleModal\n open={throttleModalOpen}\n onClose={closeThrottleModal}\n targets={throttleTargets.length > 0 ? throttleTargets : selectedThrottleTargets}\n onApply={handleBulkThrottle}\n isPending={throttleMutation.isPending}\n />\n </div>\n );\n}\n"],"names":["fetchApps","apiFetch","fetchRollCall","appId","postThrottle","body","postSubscribe","fetchStreamStats","duration","stream","url","useControlPlaneApps","useQuery","useRollCall","refetchInterval","useThrottle","qc","useQueryClient","useMutation","useStreamStats","useSubscribeMesh","DURATIONS","EVENT_TYPE_COLORS","MAX_EVENTS","isWorker","p","isThrottled","formatThrottleHuman","ms","formatMemory","total","free","t","f","stripStreamPrefix","name","QUORUM_CHANNELS","NODE_FILTER_OPTIONS","rowKey","getMeshColumns","profiles","selectedIds","toggleAll","toggleCheckbox","jsx","row","e","TaskQueuePill","_a","_b","MeshStatCards","engineCount","workerCount","pending","byStream","activeDuration","engineProcessed","s","sum","workerProcessed","jsxs","StatCard","useMeshSelection","activeAppId","allProfiles","throttleMutation","setSelectedIds","useState","throttleModalOpen","setThrottleModalOpen","throttleTargets","setThrottleTargets","useEffect","useCallback","profile","prev","next","key","selectedThrottleTargets","useMemo","selected","engines","workers","allEngines","targets","queues","w","q","queue","members","allOnQueue","label","PRESETS","TargetPill","target","isMesh","isEngine","color","scope","ThrottleModal","open","onClose","onApply","isPending","seconds","setSeconds","Modal","i","MeshBulkActionBar","selectedCount","onClear","onThrottle","StreamVolumeChart","onNodeFilter","onQueueFilter","animated","setAnimated","raf","engineStreams","workerStreams","maxCount","renderBar","pct","barColor","labelColor","clickable","labelCls","Fragment","eventCounter","QuorumEventRow","event","expanded","setExpanded","_c","Collapsible","JsonViewer","ConfigPanel","channels","onToggle","customFilter","onCustomFilterChange","ch","QuorumFeed","bridgeActive","onEventsActive","showConfig","setShowConfig","showRaw","setShowRaw","events","setEvents","setChannels","c","setCustomFilter","channelsRef","useRef","customFilterRef","toggleChannel","useEventSubscription","raw","type","cf","handleClear","Radio","v","Settings","Code","Eraser","evt","ControlPlanePage","appsData","apps","filters","setFilter","useFilterParams","firstAppId","activeNodeFilter","subscribeMesh","eventsActive","setEventsActive","refreshInterval","rollCallData","isLoading","rollCallError","refetch","isFetching","streamStats","a","b","ta","tb","throttledCount","activeQueue","result","appOptions","ids","id","queueOptions","handleBulkThrottle","handleRowClick","handleBulkThrottleOpen","closeThrottleModal","columns","setBridgeActive","handleStartBridge","PageHeader","FilterBar","d","FilterSelect","RefreshCw","SectionLabel","DataTable"],"mappings":"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"}