@hotmeshio/long-tail 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (809) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +262 -0
  3. package/build/examples/external-mcp-server/server.d.ts +17 -0
  4. package/build/examples/external-mcp-server/server.js +116 -0
  5. package/build/examples/index.d.ts +2 -0
  6. package/build/examples/index.js +7 -0
  7. package/build/examples/seed.d.ts +5 -0
  8. package/build/examples/seed.js +221 -0
  9. package/build/examples/types/envelopes.d.ts +34 -0
  10. package/build/examples/types/envelopes.js +8 -0
  11. package/build/examples/types/index.d.ts +10 -0
  12. package/build/examples/types/index.js +9 -0
  13. package/build/examples/types/resolvers.d.ts +27 -0
  14. package/build/examples/types/resolvers.js +9 -0
  15. package/build/examples/workers.d.ts +10 -0
  16. package/build/examples/workers.js +49 -0
  17. package/build/examples/workflows/basic-echo/activities.d.ts +20 -0
  18. package/build/examples/workflows/basic-echo/activities.js +55 -0
  19. package/build/examples/workflows/basic-echo/index.d.ts +14 -0
  20. package/build/examples/workflows/basic-echo/index.js +66 -0
  21. package/build/examples/workflows/kitchen-sink/activities.d.ts +40 -0
  22. package/build/examples/workflows/kitchen-sink/activities.js +46 -0
  23. package/build/examples/workflows/kitchen-sink/index.d.ts +22 -0
  24. package/build/examples/workflows/kitchen-sink/index.js +123 -0
  25. package/build/examples/workflows/review-content/activities.d.ts +10 -0
  26. package/build/examples/workflows/review-content/activities.js +44 -0
  27. package/build/examples/workflows/review-content/index.d.ts +10 -0
  28. package/build/examples/workflows/review-content/index.js +95 -0
  29. package/build/examples/workflows/review-content/types.d.ts +28 -0
  30. package/build/examples/workflows/review-content/types.js +2 -0
  31. package/build/index.d.ts +37 -0
  32. package/build/index.js +151 -0
  33. package/build/modules/auth.d.ts +58 -0
  34. package/build/modules/auth.js +163 -0
  35. package/build/modules/config.d.ts +19 -0
  36. package/build/modules/config.js +26 -0
  37. package/build/modules/defaults.d.ts +58 -0
  38. package/build/modules/defaults.js +95 -0
  39. package/build/modules/ltconfig.d.ts +21 -0
  40. package/build/modules/ltconfig.js +110 -0
  41. package/build/modules/maintenance.d.ts +18 -0
  42. package/build/modules/maintenance.js +47 -0
  43. package/build/routes/auth.d.ts +2 -0
  44. package/build/routes/auth.js +48 -0
  45. package/build/routes/bot-accounts.d.ts +2 -0
  46. package/build/routes/bot-accounts.js +280 -0
  47. package/build/routes/controlplane.d.ts +2 -0
  48. package/build/routes/controlplane.js +144 -0
  49. package/build/routes/dba.d.ts +2 -0
  50. package/build/routes/dba.js +86 -0
  51. package/build/routes/delegation.d.ts +2 -0
  52. package/build/routes/delegation.js +81 -0
  53. package/build/routes/escalations/bulk.d.ts +2 -0
  54. package/build/routes/escalations/bulk.js +324 -0
  55. package/build/routes/escalations/helpers.d.ts +5 -0
  56. package/build/routes/escalations/helpers.js +48 -0
  57. package/build/routes/escalations/index.d.ts +2 -0
  58. package/build/routes/escalations/index.js +20 -0
  59. package/build/routes/escalations/list.d.ts +2 -0
  60. package/build/routes/escalations/list.js +140 -0
  61. package/build/routes/escalations/resolve.d.ts +2 -0
  62. package/build/routes/escalations/resolve.js +240 -0
  63. package/build/routes/escalations/single.d.ts +2 -0
  64. package/build/routes/escalations/single.js +195 -0
  65. package/build/routes/exports.d.ts +2 -0
  66. package/build/routes/exports.js +163 -0
  67. package/build/routes/files.d.ts +2 -0
  68. package/build/routes/files.js +47 -0
  69. package/build/routes/index.d.ts +2 -0
  70. package/build/routes/index.js +52 -0
  71. package/build/routes/insight.d.ts +2 -0
  72. package/build/routes/insight.js +58 -0
  73. package/build/routes/maintenance.d.ts +2 -0
  74. package/build/routes/maintenance.js +38 -0
  75. package/build/routes/mcp-runs.d.ts +2 -0
  76. package/build/routes/mcp-runs.js +85 -0
  77. package/build/routes/mcp.d.ts +2 -0
  78. package/build/routes/mcp.js +264 -0
  79. package/build/routes/namespaces.d.ts +2 -0
  80. package/build/routes/namespaces.js +71 -0
  81. package/build/routes/oauth.d.ts +7 -0
  82. package/build/routes/oauth.js +217 -0
  83. package/build/routes/resolve.d.ts +9 -0
  84. package/build/routes/resolve.js +19 -0
  85. package/build/routes/roles.d.ts +2 -0
  86. package/build/routes/roles.js +195 -0
  87. package/build/routes/settings.d.ts +2 -0
  88. package/build/routes/settings.js +35 -0
  89. package/build/routes/tasks.d.ts +2 -0
  90. package/build/routes/tasks.js +133 -0
  91. package/build/routes/users.d.ts +2 -0
  92. package/build/routes/users.js +206 -0
  93. package/build/routes/workflows/config.d.ts +2 -0
  94. package/build/routes/workflows/config.js +123 -0
  95. package/build/routes/workflows/discovery.d.ts +2 -0
  96. package/build/routes/workflows/discovery.js +146 -0
  97. package/build/routes/workflows/index.d.ts +2 -0
  98. package/build/routes/workflows/index.js +18 -0
  99. package/build/routes/workflows/invocation.d.ts +2 -0
  100. package/build/routes/workflows/invocation.js +162 -0
  101. package/build/routes/yaml-workflows/crud.d.ts +2 -0
  102. package/build/routes/yaml-workflows/crud.js +276 -0
  103. package/build/routes/yaml-workflows/deployment.d.ts +2 -0
  104. package/build/routes/yaml-workflows/deployment.js +179 -0
  105. package/build/routes/yaml-workflows/helpers.d.ts +2 -0
  106. package/build/routes/yaml-workflows/helpers.js +8 -0
  107. package/build/routes/yaml-workflows/index.d.ts +2 -0
  108. package/build/routes/yaml-workflows/index.js +21 -0
  109. package/build/routes/yaml-workflows/versions.d.ts +2 -0
  110. package/build/routes/yaml-workflows/versions.js +116 -0
  111. package/build/scripts/process-helpers.d.ts +11 -0
  112. package/build/scripts/process-helpers.js +59 -0
  113. package/build/scripts/process.d.ts +18 -0
  114. package/build/scripts/process.js +191 -0
  115. package/build/scripts/token.d.ts +13 -0
  116. package/build/scripts/token.js +42 -0
  117. package/build/services/auth/bot-api-key.d.ts +32 -0
  118. package/build/services/auth/bot-api-key.js +112 -0
  119. package/build/services/auth/delegation.d.ts +20 -0
  120. package/build/services/auth/delegation.js +53 -0
  121. package/build/services/auth/service-token.d.ts +23 -0
  122. package/build/services/auth/service-token.js +105 -0
  123. package/build/services/config/cache.d.ts +2 -0
  124. package/build/services/config/cache.js +24 -0
  125. package/build/services/config/index.d.ts +4 -0
  126. package/build/services/config/index.js +13 -0
  127. package/build/services/config/provider.d.ts +2 -0
  128. package/build/services/config/provider.js +30 -0
  129. package/build/services/config/read.d.ts +3 -0
  130. package/build/services/config/read.js +68 -0
  131. package/build/services/config/sql.d.ts +14 -0
  132. package/build/services/config/sql.js +58 -0
  133. package/build/services/config/write.d.ts +5 -0
  134. package/build/services/config/write.js +61 -0
  135. package/build/services/controlplane/index.d.ts +47 -0
  136. package/build/services/controlplane/index.js +124 -0
  137. package/build/services/controlplane/quorum-bridge.d.ts +15 -0
  138. package/build/services/controlplane/quorum-bridge.js +62 -0
  139. package/build/services/controlplane/sql.d.ts +21 -0
  140. package/build/services/controlplane/sql.js +70 -0
  141. package/build/services/controlplane/types.d.ts +13 -0
  142. package/build/services/controlplane/types.js +3 -0
  143. package/build/services/cron/index.d.ts +46 -0
  144. package/build/services/cron/index.js +199 -0
  145. package/build/services/db/index.d.ts +3 -0
  146. package/build/services/db/index.js +19 -0
  147. package/build/services/db/migrate.d.ts +1 -0
  148. package/build/services/db/migrate.js +78 -0
  149. package/build/services/dba.d.ts +28 -0
  150. package/build/services/dba.js +32 -0
  151. package/build/services/escalation/bulk.d.ts +27 -0
  152. package/build/services/escalation/bulk.js +57 -0
  153. package/build/services/escalation/crud.d.ts +47 -0
  154. package/build/services/escalation/crud.js +150 -0
  155. package/build/services/escalation/index.d.ts +4 -0
  156. package/build/services/escalation/index.js +20 -0
  157. package/build/services/escalation/queries.d.ts +37 -0
  158. package/build/services/escalation/queries.js +163 -0
  159. package/build/services/escalation/sql.d.ts +21 -0
  160. package/build/services/escalation/sql.js +135 -0
  161. package/build/services/escalation/types.d.ts +43 -0
  162. package/build/services/escalation/types.js +13 -0
  163. package/build/services/escalation-strategy/default.d.ts +12 -0
  164. package/build/services/escalation-strategy/default.js +17 -0
  165. package/build/services/escalation-strategy/index.d.ts +21 -0
  166. package/build/services/escalation-strategy/index.js +32 -0
  167. package/build/services/escalation-strategy/mcp.d.ts +13 -0
  168. package/build/services/escalation-strategy/mcp.js +51 -0
  169. package/build/services/events/index.d.ts +37 -0
  170. package/build/services/events/index.js +64 -0
  171. package/build/services/events/memory.d.ts +27 -0
  172. package/build/services/events/memory.js +40 -0
  173. package/build/services/events/nats.d.ts +29 -0
  174. package/build/services/events/nats.js +50 -0
  175. package/build/services/events/publish.d.ts +72 -0
  176. package/build/services/events/publish.js +106 -0
  177. package/build/services/events/socketio.d.ts +33 -0
  178. package/build/services/events/socketio.js +70 -0
  179. package/build/services/export/client.d.ts +2 -0
  180. package/build/services/export/client.js +16 -0
  181. package/build/services/export/index.d.ts +39 -0
  182. package/build/services/export/index.js +158 -0
  183. package/build/services/export/post-process.d.ts +16 -0
  184. package/build/services/export/post-process.js +133 -0
  185. package/build/services/export/types.d.ts +25 -0
  186. package/build/services/export/types.js +2 -0
  187. package/build/services/hotmesh-utils.d.ts +61 -0
  188. package/build/services/hotmesh-utils.js +204 -0
  189. package/build/services/iam/activity.d.ts +52 -0
  190. package/build/services/iam/activity.js +59 -0
  191. package/build/services/iam/bots.d.ts +83 -0
  192. package/build/services/iam/bots.js +157 -0
  193. package/build/services/iam/context.d.ts +14 -0
  194. package/build/services/iam/context.js +61 -0
  195. package/build/services/iam/credentials.d.ts +42 -0
  196. package/build/services/iam/credentials.js +86 -0
  197. package/build/services/iam/envelope.d.ts +10 -0
  198. package/build/services/iam/envelope.js +32 -0
  199. package/build/services/iam/ephemeral.d.ts +50 -0
  200. package/build/services/iam/ephemeral.js +131 -0
  201. package/build/services/iam/index.d.ts +19 -0
  202. package/build/services/iam/index.js +37 -0
  203. package/build/services/iam/principal.d.ts +12 -0
  204. package/build/services/iam/principal.js +53 -0
  205. package/build/services/iam/resolve.d.ts +48 -0
  206. package/build/services/iam/resolve.js +89 -0
  207. package/build/services/insight/index.d.ts +30 -0
  208. package/build/services/insight/index.js +81 -0
  209. package/build/services/insight/prompts.d.ts +4 -0
  210. package/build/services/insight/prompts.js +15 -0
  211. package/build/services/interceptor/activities/config.d.ts +21 -0
  212. package/build/services/interceptor/activities/config.js +26 -0
  213. package/build/services/interceptor/activities/escalation.d.ts +58 -0
  214. package/build/services/interceptor/activities/escalation.js +110 -0
  215. package/build/services/interceptor/activities/index.d.ts +4 -0
  216. package/build/services/interceptor/activities/index.js +23 -0
  217. package/build/services/interceptor/activities/task.d.ts +65 -0
  218. package/build/services/interceptor/activities/task.js +168 -0
  219. package/build/services/interceptor/activities/workflow.d.ts +26 -0
  220. package/build/services/interceptor/activities/workflow.js +41 -0
  221. package/build/services/interceptor/activity-interceptor.d.ts +32 -0
  222. package/build/services/interceptor/activity-interceptor.js +86 -0
  223. package/build/services/interceptor/completion.d.ts +16 -0
  224. package/build/services/interceptor/completion.js +149 -0
  225. package/build/services/interceptor/context.d.ts +11 -0
  226. package/build/services/interceptor/context.js +20 -0
  227. package/build/services/interceptor/escalation.d.ts +26 -0
  228. package/build/services/interceptor/escalation.js +150 -0
  229. package/build/services/interceptor/index.d.ts +45 -0
  230. package/build/services/interceptor/index.js +160 -0
  231. package/build/services/interceptor/lifecycle.d.ts +44 -0
  232. package/build/services/interceptor/lifecycle.js +174 -0
  233. package/build/services/interceptor/state.d.ts +22 -0
  234. package/build/services/interceptor/state.js +36 -0
  235. package/build/services/interceptor/types.d.ts +43 -0
  236. package/build/services/interceptor/types.js +3 -0
  237. package/build/services/llm/detect.d.ts +16 -0
  238. package/build/services/llm/detect.js +33 -0
  239. package/build/services/llm/index.d.ts +34 -0
  240. package/build/services/llm/index.js +106 -0
  241. package/build/services/llm/providers/anthropic.d.ts +11 -0
  242. package/build/services/llm/providers/anthropic.js +85 -0
  243. package/build/services/llm/providers/openai.d.ts +9 -0
  244. package/build/services/llm/providers/openai.js +46 -0
  245. package/build/services/llm/translate.d.ts +66 -0
  246. package/build/services/llm/translate.js +192 -0
  247. package/build/services/llm/types.d.ts +64 -0
  248. package/build/services/llm/types.js +8 -0
  249. package/build/services/logger/index.d.ts +32 -0
  250. package/build/services/logger/index.js +69 -0
  251. package/build/services/logger/pino.d.ts +24 -0
  252. package/build/services/logger/pino.js +59 -0
  253. package/build/services/maintenance/index.d.ts +43 -0
  254. package/build/services/maintenance/index.js +183 -0
  255. package/build/services/mcp/adapter.d.ts +23 -0
  256. package/build/services/mcp/adapter.js +119 -0
  257. package/build/services/mcp/client/connection.d.ts +46 -0
  258. package/build/services/mcp/client/connection.js +280 -0
  259. package/build/services/mcp/client/index.d.ts +2 -0
  260. package/build/services/mcp/client/index.js +16 -0
  261. package/build/services/mcp/client/tools.d.ts +22 -0
  262. package/build/services/mcp/client/tools.js +118 -0
  263. package/build/services/mcp/db-server/index.d.ts +25 -0
  264. package/build/services/mcp/db-server/index.js +49 -0
  265. package/build/services/mcp/db-server/schemas.d.ts +52 -0
  266. package/build/services/mcp/db-server/schemas.js +34 -0
  267. package/build/services/mcp/db-server/tools.d.ts +5 -0
  268. package/build/services/mcp/db-server/tools.js +224 -0
  269. package/build/services/mcp/db.d.ts +26 -0
  270. package/build/services/mcp/db.js +141 -0
  271. package/build/services/mcp/index.d.ts +25 -0
  272. package/build/services/mcp/index.js +47 -0
  273. package/build/services/mcp/playwright-server/index.d.ts +14 -0
  274. package/build/services/mcp/playwright-server/index.js +25 -0
  275. package/build/services/mcp/playwright-server/lifecycle.d.ts +7 -0
  276. package/build/services/mcp/playwright-server/lifecycle.js +63 -0
  277. package/build/services/mcp/playwright-server/schemas.d.ts +81 -0
  278. package/build/services/mcp/playwright-server/schemas.js +48 -0
  279. package/build/services/mcp/playwright-server/tools.d.ts +2 -0
  280. package/build/services/mcp/playwright-server/tools.js +224 -0
  281. package/build/services/mcp/server.d.ts +26 -0
  282. package/build/services/mcp/server.js +286 -0
  283. package/build/services/mcp/sql.d.ts +12 -0
  284. package/build/services/mcp/sql.js +59 -0
  285. package/build/services/mcp/types.d.ts +17 -0
  286. package/build/services/mcp/types.js +3 -0
  287. package/build/services/mcp/vision-server.d.ts +15 -0
  288. package/build/services/mcp/vision-server.js +214 -0
  289. package/build/services/mcp/workflow-compiler-server.d.ts +15 -0
  290. package/build/services/mcp/workflow-compiler-server.js +206 -0
  291. package/build/services/mcp/workflow-server.d.ts +24 -0
  292. package/build/services/mcp/workflow-server.js +230 -0
  293. package/build/services/mcp-runs/enrichment.d.ts +12 -0
  294. package/build/services/mcp-runs/enrichment.js +39 -0
  295. package/build/services/mcp-runs/events.d.ts +6 -0
  296. package/build/services/mcp-runs/events.js +126 -0
  297. package/build/services/mcp-runs/execution-builder.d.ts +12 -0
  298. package/build/services/mcp-runs/execution-builder.js +100 -0
  299. package/build/services/mcp-runs/index.d.ts +4 -0
  300. package/build/services/mcp-runs/index.js +8 -0
  301. package/build/services/mcp-runs/queries.d.ts +28 -0
  302. package/build/services/mcp-runs/queries.js +71 -0
  303. package/build/services/mcp-runs/sql.d.ts +4 -0
  304. package/build/services/mcp-runs/sql.js +17 -0
  305. package/build/services/mcp-runs/types.d.ts +65 -0
  306. package/build/services/mcp-runs/types.js +2 -0
  307. package/build/services/namespace/index.d.ts +17 -0
  308. package/build/services/namespace/index.js +41 -0
  309. package/build/services/namespace/sql.d.ts +4 -0
  310. package/build/services/namespace/sql.js +23 -0
  311. package/build/services/namespace/types.d.ts +11 -0
  312. package/build/services/namespace/types.js +3 -0
  313. package/build/services/oauth/crypto.d.ts +19 -0
  314. package/build/services/oauth/crypto.js +95 -0
  315. package/build/services/oauth/db.d.ts +20 -0
  316. package/build/services/oauth/db.js +140 -0
  317. package/build/services/oauth/index.d.ts +12 -0
  318. package/build/services/oauth/index.js +77 -0
  319. package/build/services/oauth/providers/anthropic.d.ts +3 -0
  320. package/build/services/oauth/providers/anthropic.js +111 -0
  321. package/build/services/oauth/providers/github.d.ts +3 -0
  322. package/build/services/oauth/providers/github.js +46 -0
  323. package/build/services/oauth/providers/google.d.ts +3 -0
  324. package/build/services/oauth/providers/google.js +44 -0
  325. package/build/services/oauth/providers/index.d.ts +2 -0
  326. package/build/services/oauth/providers/index.js +7 -0
  327. package/build/services/oauth/providers/microsoft.d.ts +3 -0
  328. package/build/services/oauth/providers/microsoft.js +46 -0
  329. package/build/services/oauth/providers/mock.d.ts +3 -0
  330. package/build/services/oauth/providers/mock.js +76 -0
  331. package/build/services/oauth/providers/registry.d.ts +8 -0
  332. package/build/services/oauth/providers/registry.js +46 -0
  333. package/build/services/oauth/providers/types.d.ts +13 -0
  334. package/build/services/oauth/providers/types.js +2 -0
  335. package/build/services/oauth/state.d.ts +30 -0
  336. package/build/services/oauth/state.js +83 -0
  337. package/build/services/orchestrator/index.d.ts +23 -0
  338. package/build/services/orchestrator/index.js +156 -0
  339. package/build/services/orchestrator/types.d.ts +15 -0
  340. package/build/services/orchestrator/types.js +3 -0
  341. package/build/services/role/index.d.ts +47 -0
  342. package/build/services/role/index.js +136 -0
  343. package/build/services/role/sql.d.ts +14 -0
  344. package/build/services/role/sql.js +80 -0
  345. package/build/services/role/types.d.ts +11 -0
  346. package/build/services/role/types.js +3 -0
  347. package/build/services/storage/index.d.ts +12 -0
  348. package/build/services/storage/index.js +31 -0
  349. package/build/services/storage/local.d.ts +26 -0
  350. package/build/services/storage/local.js +129 -0
  351. package/build/services/storage/s3.d.ts +31 -0
  352. package/build/services/storage/s3.js +180 -0
  353. package/build/services/storage/types.d.ts +41 -0
  354. package/build/services/storage/types.js +2 -0
  355. package/build/services/task/crud.d.ts +21 -0
  356. package/build/services/task/crud.js +123 -0
  357. package/build/services/task/index.d.ts +4 -0
  358. package/build/services/task/index.js +20 -0
  359. package/build/services/task/process.d.ts +14 -0
  360. package/build/services/task/process.js +98 -0
  361. package/build/services/task/resolve.d.ts +12 -0
  362. package/build/services/task/resolve.js +49 -0
  363. package/build/services/task/sql.d.ts +19 -0
  364. package/build/services/task/sql.js +92 -0
  365. package/build/services/task/types.d.ts +56 -0
  366. package/build/services/task/types.js +9 -0
  367. package/build/services/telemetry/honeycomb.d.ts +53 -0
  368. package/build/services/telemetry/honeycomb.js +79 -0
  369. package/build/services/telemetry/index.d.ts +46 -0
  370. package/build/services/telemetry/index.js +68 -0
  371. package/build/services/user/auth.d.ts +7 -0
  372. package/build/services/user/auth.js +26 -0
  373. package/build/services/user/crud.d.ts +19 -0
  374. package/build/services/user/crud.js +151 -0
  375. package/build/services/user/index.d.ts +5 -0
  376. package/build/services/user/index.js +26 -0
  377. package/build/services/user/rbac.d.ts +15 -0
  378. package/build/services/user/rbac.js +32 -0
  379. package/build/services/user/roles.d.ts +7 -0
  380. package/build/services/user/roles.js +42 -0
  381. package/build/services/user/sql.d.ts +22 -0
  382. package/build/services/user/sql.js +45 -0
  383. package/build/services/user/types.d.ts +23 -0
  384. package/build/services/user/types.js +4 -0
  385. package/build/services/workers/registry.d.ts +10 -0
  386. package/build/services/workers/registry.js +26 -0
  387. package/build/services/workflow-invocation.d.ts +46 -0
  388. package/build/services/workflow-invocation.js +184 -0
  389. package/build/services/yaml-workflow/db-utils.d.ts +25 -0
  390. package/build/services/yaml-workflow/db-utils.js +93 -0
  391. package/build/services/yaml-workflow/db.d.ts +27 -0
  392. package/build/services/yaml-workflow/db.js +196 -0
  393. package/build/services/yaml-workflow/deployer-helpers.d.ts +13 -0
  394. package/build/services/yaml-workflow/deployer-helpers.js +133 -0
  395. package/build/services/yaml-workflow/deployer.d.ts +54 -0
  396. package/build/services/yaml-workflow/deployer.js +203 -0
  397. package/build/services/yaml-workflow/generator.d.ts +21 -0
  398. package/build/services/yaml-workflow/generator.js +117 -0
  399. package/build/services/yaml-workflow/index.d.ts +4 -0
  400. package/build/services/yaml-workflow/index.js +20 -0
  401. package/build/services/yaml-workflow/input-analyzer-helpers.d.ts +48 -0
  402. package/build/services/yaml-workflow/input-analyzer-helpers.js +183 -0
  403. package/build/services/yaml-workflow/input-analyzer.d.ts +30 -0
  404. package/build/services/yaml-workflow/input-analyzer.js +109 -0
  405. package/build/services/yaml-workflow/pattern-detector/array-source.d.ts +22 -0
  406. package/build/services/yaml-workflow/pattern-detector/array-source.js +120 -0
  407. package/build/services/yaml-workflow/pattern-detector/collapse.d.ts +27 -0
  408. package/build/services/yaml-workflow/pattern-detector/collapse.js +92 -0
  409. package/build/services/yaml-workflow/pattern-detector/index.d.ts +18 -0
  410. package/build/services/yaml-workflow/pattern-detector/index.js +22 -0
  411. package/build/services/yaml-workflow/pattern-detector/run-detection.d.ts +28 -0
  412. package/build/services/yaml-workflow/pattern-detector/run-detection.js +81 -0
  413. package/build/services/yaml-workflow/pattern-detector/types.d.ts +29 -0
  414. package/build/services/yaml-workflow/pattern-detector/types.js +8 -0
  415. package/build/services/yaml-workflow/pipeline/analyze.d.ts +11 -0
  416. package/build/services/yaml-workflow/pipeline/analyze.js +64 -0
  417. package/build/services/yaml-workflow/pipeline/build/dag.d.ts +25 -0
  418. package/build/services/yaml-workflow/pipeline/build/dag.js +254 -0
  419. package/build/services/yaml-workflow/pipeline/build/index.d.ts +20 -0
  420. package/build/services/yaml-workflow/pipeline/build/index.js +115 -0
  421. package/build/services/yaml-workflow/pipeline/build/iteration.d.ts +25 -0
  422. package/build/services/yaml-workflow/pipeline/build/iteration.js +231 -0
  423. package/build/services/yaml-workflow/pipeline/build/metadata.d.ts +15 -0
  424. package/build/services/yaml-workflow/pipeline/build/metadata.js +126 -0
  425. package/build/services/yaml-workflow/pipeline/build/transform.d.ts +17 -0
  426. package/build/services/yaml-workflow/pipeline/build/transform.js +94 -0
  427. package/build/services/yaml-workflow/pipeline/build/utils.d.ts +22 -0
  428. package/build/services/yaml-workflow/pipeline/build/utils.js +129 -0
  429. package/build/services/yaml-workflow/pipeline/build/wiring.d.ts +9 -0
  430. package/build/services/yaml-workflow/pipeline/build/wiring.js +148 -0
  431. package/build/services/yaml-workflow/pipeline/compile/index.d.ts +17 -0
  432. package/build/services/yaml-workflow/pipeline/compile/index.js +64 -0
  433. package/build/services/yaml-workflow/pipeline/compile/llm-call.d.ts +14 -0
  434. package/build/services/yaml-workflow/pipeline/compile/llm-call.js +153 -0
  435. package/build/services/yaml-workflow/pipeline/compile/parse-plan.d.ts +12 -0
  436. package/build/services/yaml-workflow/pipeline/compile/parse-plan.js +88 -0
  437. package/build/services/yaml-workflow/pipeline/compile/summarize.d.ts +39 -0
  438. package/build/services/yaml-workflow/pipeline/compile/summarize.js +174 -0
  439. package/build/services/yaml-workflow/pipeline/extract-helpers.d.ts +42 -0
  440. package/build/services/yaml-workflow/pipeline/extract-helpers.js +88 -0
  441. package/build/services/yaml-workflow/pipeline/extract.d.ts +24 -0
  442. package/build/services/yaml-workflow/pipeline/extract.js +235 -0
  443. package/build/services/yaml-workflow/pipeline/prompts.d.ts +15 -0
  444. package/build/services/yaml-workflow/pipeline/prompts.js +254 -0
  445. package/build/services/yaml-workflow/pipeline/validate.d.ts +12 -0
  446. package/build/services/yaml-workflow/pipeline/validate.js +111 -0
  447. package/build/services/yaml-workflow/sql.d.ts +19 -0
  448. package/build/services/yaml-workflow/sql.js +83 -0
  449. package/build/services/yaml-workflow/types.d.ts +223 -0
  450. package/build/services/yaml-workflow/types.js +8 -0
  451. package/build/services/yaml-workflow/workers/callbacks.d.ts +17 -0
  452. package/build/services/yaml-workflow/workers/callbacks.js +194 -0
  453. package/build/services/yaml-workflow/workers/events.d.ts +7 -0
  454. package/build/services/yaml-workflow/workers/events.js +49 -0
  455. package/build/services/yaml-workflow/workers/index.d.ts +4 -0
  456. package/build/services/yaml-workflow/workers/index.js +15 -0
  457. package/build/services/yaml-workflow/workers/register.d.ts +15 -0
  458. package/build/services/yaml-workflow/workers/register.js +233 -0
  459. package/build/services/yaml-workflow/workers/scope.d.ts +13 -0
  460. package/build/services/yaml-workflow/workers/scope.js +37 -0
  461. package/build/start/adapters.d.ts +6 -0
  462. package/build/start/adapters.js +80 -0
  463. package/build/start/config.d.ts +10 -0
  464. package/build/start/config.js +88 -0
  465. package/build/start/index.d.ts +21 -0
  466. package/build/start/index.js +87 -0
  467. package/build/start/server.d.ts +6 -0
  468. package/build/start/server.js +46 -0
  469. package/build/start/workers.d.ts +32 -0
  470. package/build/start/workers.js +144 -0
  471. package/build/system/activities/claude-code.d.ts +56 -0
  472. package/build/system/activities/claude-code.js +258 -0
  473. package/build/system/activities/file-storage.d.ts +31 -0
  474. package/build/system/activities/file-storage.js +71 -0
  475. package/build/system/activities/http.d.ts +27 -0
  476. package/build/system/activities/http.js +56 -0
  477. package/build/system/activities/oauth.d.ts +39 -0
  478. package/build/system/activities/oauth.js +33 -0
  479. package/build/system/activities/triage/cache.d.ts +7 -0
  480. package/build/system/activities/triage/cache.js +10 -0
  481. package/build/system/activities/triage/context.d.ts +21 -0
  482. package/build/system/activities/triage/context.js +92 -0
  483. package/build/system/activities/triage/discovery.d.ts +25 -0
  484. package/build/system/activities/triage/discovery.js +170 -0
  485. package/build/system/activities/triage/index.d.ts +5 -0
  486. package/build/system/activities/triage/index.js +22 -0
  487. package/build/system/activities/triage/llm.d.ts +9 -0
  488. package/build/system/activities/triage/llm.js +34 -0
  489. package/build/system/activities/triage/tools.d.ts +24 -0
  490. package/build/system/activities/triage/tools.js +178 -0
  491. package/build/system/index.d.ts +16 -0
  492. package/build/system/index.js +100 -0
  493. package/build/system/mcp-servers/claude-code.d.ts +17 -0
  494. package/build/system/mcp-servers/claude-code.js +110 -0
  495. package/build/system/mcp-servers/db-query/index.d.ts +25 -0
  496. package/build/system/mcp-servers/db-query/index.js +49 -0
  497. package/build/system/mcp-servers/db-query/schemas.d.ts +52 -0
  498. package/build/system/mcp-servers/db-query/schemas.js +34 -0
  499. package/build/system/mcp-servers/db-query/tools.d.ts +5 -0
  500. package/build/system/mcp-servers/db-query/tools.js +224 -0
  501. package/build/system/mcp-servers/document-vision.d.ts +15 -0
  502. package/build/system/mcp-servers/document-vision.js +228 -0
  503. package/build/system/mcp-servers/file-storage.d.ts +4 -0
  504. package/build/system/mcp-servers/file-storage.js +101 -0
  505. package/build/system/mcp-servers/http-fetch.d.ts +4 -0
  506. package/build/system/mcp-servers/http-fetch.js +100 -0
  507. package/build/system/mcp-servers/human-queue.d.ts +26 -0
  508. package/build/system/mcp-servers/human-queue.js +287 -0
  509. package/build/system/mcp-servers/oauth.d.ts +11 -0
  510. package/build/system/mcp-servers/oauth.js +100 -0
  511. package/build/system/mcp-servers/playwright/browser-lifecycle.d.ts +26 -0
  512. package/build/system/mcp-servers/playwright/browser-lifecycle.js +125 -0
  513. package/build/system/mcp-servers/playwright/index.d.ts +25 -0
  514. package/build/system/mcp-servers/playwright/index.js +42 -0
  515. package/build/system/mcp-servers/playwright/schemas.d.ts +383 -0
  516. package/build/system/mcp-servers/playwright/schemas.js +87 -0
  517. package/build/system/mcp-servers/playwright/tools-atomic.d.ts +2 -0
  518. package/build/system/mcp-servers/playwright/tools-atomic.js +9 -0
  519. package/build/system/mcp-servers/playwright/tools-navigation.d.ts +2 -0
  520. package/build/system/mcp-servers/playwright/tools-navigation.js +140 -0
  521. package/build/system/mcp-servers/playwright/tools-page-interaction.d.ts +2 -0
  522. package/build/system/mcp-servers/playwright/tools-page-interaction.js +162 -0
  523. package/build/system/mcp-servers/playwright/tools-run-script.d.ts +2 -0
  524. package/build/system/mcp-servers/playwright/tools-run-script.js +190 -0
  525. package/build/system/mcp-servers/playwright/types.d.ts +8 -0
  526. package/build/system/mcp-servers/playwright/types.js +30 -0
  527. package/build/system/mcp-servers/playwright-cli/helpers.d.ts +11 -0
  528. package/build/system/mcp-servers/playwright-cli/helpers.js +20 -0
  529. package/build/system/mcp-servers/playwright-cli/index.d.ts +4 -0
  530. package/build/system/mcp-servers/playwright-cli/index.js +15 -0
  531. package/build/system/mcp-servers/playwright-cli/schemas.d.ts +219 -0
  532. package/build/system/mcp-servers/playwright-cli/schemas.js +75 -0
  533. package/build/system/mcp-servers/playwright-cli/tools-auth.d.ts +2 -0
  534. package/build/system/mcp-servers/playwright-cli/tools-auth.js +183 -0
  535. package/build/system/mcp-servers/playwright-cli/tools-capture.d.ts +2 -0
  536. package/build/system/mcp-servers/playwright-cli/tools-capture.js +267 -0
  537. package/build/system/mcp-servers/prompts.d.ts +4 -0
  538. package/build/system/mcp-servers/prompts.js +10 -0
  539. package/build/system/mcp-servers/workflow-compiler.d.ts +15 -0
  540. package/build/system/mcp-servers/workflow-compiler.js +230 -0
  541. package/build/system/mcp-servers/workflow.d.ts +24 -0
  542. package/build/system/mcp-servers/workflow.js +231 -0
  543. package/build/system/seed/index.d.ts +7 -0
  544. package/build/system/seed/index.js +36 -0
  545. package/build/system/seed/server-definitions.d.ts +1460 -0
  546. package/build/system/seed/server-definitions.js +160 -0
  547. package/build/system/seed/tool-manifests-browser.d.ts +577 -0
  548. package/build/system/seed/tool-manifests-browser.js +158 -0
  549. package/build/system/seed/tool-manifests-data.d.ts +322 -0
  550. package/build/system/seed/tool-manifests-data.js +173 -0
  551. package/build/system/seed/tool-manifests-escalation.d.ts +173 -0
  552. package/build/system/seed/tool-manifests-escalation.js +76 -0
  553. package/build/system/seed/tool-manifests-workflows.d.ts +211 -0
  554. package/build/system/seed/tool-manifests-workflows.js +136 -0
  555. package/build/system/workflows/mcp-deterministic/activities.d.ts +6 -0
  556. package/build/system/workflows/mcp-deterministic/activities.js +56 -0
  557. package/build/system/workflows/mcp-deterministic/index.d.ts +9 -0
  558. package/build/system/workflows/mcp-deterministic/index.js +72 -0
  559. package/build/system/workflows/mcp-query/activities/caches.d.ts +7 -0
  560. package/build/system/workflows/mcp-query/activities/caches.js +10 -0
  561. package/build/system/workflows/mcp-query/activities/discovery.d.ts +31 -0
  562. package/build/system/workflows/mcp-query/activities/discovery.js +172 -0
  563. package/build/system/workflows/mcp-query/activities/index.d.ts +4 -0
  564. package/build/system/workflows/mcp-query/activities/index.js +13 -0
  565. package/build/system/workflows/mcp-query/activities/llm.d.ts +8 -0
  566. package/build/system/workflows/mcp-query/activities/llm.js +33 -0
  567. package/build/system/workflows/mcp-query/activities/tool-executor.d.ts +5 -0
  568. package/build/system/workflows/mcp-query/activities/tool-executor.js +112 -0
  569. package/build/system/workflows/mcp-query/activities/tool-loader.d.ts +14 -0
  570. package/build/system/workflows/mcp-query/activities/tool-loader.js +93 -0
  571. package/build/system/workflows/mcp-query/index.d.ts +14 -0
  572. package/build/system/workflows/mcp-query/index.js +227 -0
  573. package/build/system/workflows/mcp-query/prompts.d.ts +4 -0
  574. package/build/system/workflows/mcp-query/prompts.js +101 -0
  575. package/build/system/workflows/mcp-query/strategy-advisors.d.ts +14 -0
  576. package/build/system/workflows/mcp-query/strategy-advisors.js +109 -0
  577. package/build/system/workflows/mcp-query/types.d.ts +10 -0
  578. package/build/system/workflows/mcp-query/types.js +3 -0
  579. package/build/system/workflows/mcp-query-router/activities.d.ts +6 -0
  580. package/build/system/workflows/mcp-query-router/activities.js +12 -0
  581. package/build/system/workflows/mcp-query-router/index.d.ts +13 -0
  582. package/build/system/workflows/mcp-query-router/index.js +107 -0
  583. package/build/system/workflows/mcp-query-router/prompts.d.ts +1 -0
  584. package/build/system/workflows/mcp-query-router/prompts.js +8 -0
  585. package/build/system/workflows/mcp-triage/index.d.ts +31 -0
  586. package/build/system/workflows/mcp-triage/index.js +222 -0
  587. package/build/system/workflows/mcp-triage/prompts.d.ts +7 -0
  588. package/build/system/workflows/mcp-triage/prompts.js +159 -0
  589. package/build/system/workflows/mcp-triage/response-builders.d.ts +17 -0
  590. package/build/system/workflows/mcp-triage/response-builders.js +96 -0
  591. package/build/system/workflows/mcp-triage/response.d.ts +8 -0
  592. package/build/system/workflows/mcp-triage/response.js +157 -0
  593. package/build/system/workflows/mcp-triage/types.d.ts +20 -0
  594. package/build/system/workflows/mcp-triage/types.js +3 -0
  595. package/build/system/workflows/mcp-triage-deterministic/activities.d.ts +4 -0
  596. package/build/system/workflows/mcp-triage-deterministic/activities.js +8 -0
  597. package/build/system/workflows/mcp-triage-deterministic/index.d.ts +12 -0
  598. package/build/system/workflows/mcp-triage-deterministic/index.js +83 -0
  599. package/build/system/workflows/mcp-triage-router/activities.d.ts +9 -0
  600. package/build/system/workflows/mcp-triage-router/activities.js +15 -0
  601. package/build/system/workflows/mcp-triage-router/index.d.ts +13 -0
  602. package/build/system/workflows/mcp-triage-router/index.js +122 -0
  603. package/build/tsconfig.tsbuildinfo +1 -0
  604. package/build/types/auth.d.ts +34 -0
  605. package/build/types/auth.js +2 -0
  606. package/build/types/config.d.ts +48 -0
  607. package/build/types/config.js +2 -0
  608. package/build/types/delegation.d.ts +41 -0
  609. package/build/types/delegation.js +2 -0
  610. package/build/types/discovery.d.ts +12 -0
  611. package/build/types/discovery.js +3 -0
  612. package/build/types/envelope.d.ts +53 -0
  613. package/build/types/envelope.js +2 -0
  614. package/build/types/escalation-strategy.d.ts +37 -0
  615. package/build/types/escalation-strategy.js +2 -0
  616. package/build/types/escalation.d.ts +39 -0
  617. package/build/types/escalation.js +21 -0
  618. package/build/types/events.d.ts +65 -0
  619. package/build/types/events.js +2 -0
  620. package/build/types/export.d.ts +78 -0
  621. package/build/types/export.js +11 -0
  622. package/build/types/index.d.ts +21 -0
  623. package/build/types/index.js +6 -0
  624. package/build/types/logger.d.ts +26 -0
  625. package/build/types/logger.js +2 -0
  626. package/build/types/maintenance.d.ts +24 -0
  627. package/build/types/maintenance.js +2 -0
  628. package/build/types/mcp.d.ts +80 -0
  629. package/build/types/mcp.js +2 -0
  630. package/build/types/oauth.d.ts +74 -0
  631. package/build/types/oauth.js +2 -0
  632. package/build/types/startup.d.ts +110 -0
  633. package/build/types/startup.js +2 -0
  634. package/build/types/task.d.ts +39 -0
  635. package/build/types/task.js +2 -0
  636. package/build/types/telemetry.d.ts +32 -0
  637. package/build/types/telemetry.js +2 -0
  638. package/build/types/tool-context.d.ts +68 -0
  639. package/build/types/tool-context.js +14 -0
  640. package/build/types/user.d.ts +18 -0
  641. package/build/types/user.js +2 -0
  642. package/build/types/workflow.d.ts +35 -0
  643. package/build/types/workflow.js +2 -0
  644. package/build/types/yaml-workflow.d.ts +101 -0
  645. package/build/types/yaml-workflow.js +5 -0
  646. package/build/vitest.config.d.ts +2 -0
  647. package/build/vitest.config.js +32 -0
  648. package/build/vitest.integration.config.d.ts +2 -0
  649. package/build/vitest.integration.config.js +25 -0
  650. package/build/workers/index.d.ts +6 -0
  651. package/build/workers/index.js +20 -0
  652. package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js +2 -0
  653. package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js.map +1 -0
  654. package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js +2 -0
  655. package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js.map +1 -0
  656. package/dashboard/dist/assets/BotPicker-D6FYW1Gt.js +2 -0
  657. package/dashboard/dist/assets/BotPicker-D6FYW1Gt.js.map +1 -0
  658. package/dashboard/dist/assets/CollapsibleSection-Cxk4wvjT.js +2 -0
  659. package/dashboard/dist/assets/CollapsibleSection-Cxk4wvjT.js.map +1 -0
  660. package/dashboard/dist/assets/ConfirmDeleteModal-FSXyKjaB.js +2 -0
  661. package/dashboard/dist/assets/ConfirmDeleteModal-FSXyKjaB.js.map +1 -0
  662. package/dashboard/dist/assets/CopyableId-CBdxWfp8.js +2 -0
  663. package/dashboard/dist/assets/CopyableId-CBdxWfp8.js.map +1 -0
  664. package/dashboard/dist/assets/CredentialsPage-Ikzsot0w.js +2 -0
  665. package/dashboard/dist/assets/CredentialsPage-Ikzsot0w.js.map +1 -0
  666. package/dashboard/dist/assets/CustomDurationPicker-CAninCbl.js +2 -0
  667. package/dashboard/dist/assets/CustomDurationPicker-CAninCbl.js.map +1 -0
  668. package/dashboard/dist/assets/DataTable-BDn1WBHS.js +2 -0
  669. package/dashboard/dist/assets/DataTable-BDn1WBHS.js.map +1 -0
  670. package/dashboard/dist/assets/EmptyState-2CmV-IaS.js +2 -0
  671. package/dashboard/dist/assets/EmptyState-2CmV-IaS.js.map +1 -0
  672. package/dashboard/dist/assets/EscalationsOverview-GXYFPASS.js +2 -0
  673. package/dashboard/dist/assets/EscalationsOverview-GXYFPASS.js.map +1 -0
  674. package/dashboard/dist/assets/EventTable-B01oJf6Y.js +2 -0
  675. package/dashboard/dist/assets/EventTable-B01oJf6Y.js.map +1 -0
  676. package/dashboard/dist/assets/Field-DuFBAYhu.js +2 -0
  677. package/dashboard/dist/assets/Field-DuFBAYhu.js.map +1 -0
  678. package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +2 -0
  679. package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js.map +1 -0
  680. package/dashboard/dist/assets/McpOverview-JkvRcX2e.js +2 -0
  681. package/dashboard/dist/assets/McpOverview-JkvRcX2e.js.map +1 -0
  682. package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js +2 -0
  683. package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js.map +1 -0
  684. package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js +2 -0
  685. package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js.map +1 -0
  686. package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js +2 -0
  687. package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js.map +1 -0
  688. package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js +2 -0
  689. package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js.map +1 -0
  690. package/dashboard/dist/assets/Modal-B4rbIVAn.js +2 -0
  691. package/dashboard/dist/assets/Modal-B4rbIVAn.js.map +1 -0
  692. package/dashboard/dist/assets/OperatorDashboard-B56il28q.js +2 -0
  693. package/dashboard/dist/assets/OperatorDashboard-B56il28q.js.map +1 -0
  694. package/dashboard/dist/assets/PageHeader-CpWFly5S.js +2 -0
  695. package/dashboard/dist/assets/PageHeader-CpWFly5S.js.map +1 -0
  696. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +2 -0
  697. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js.map +1 -0
  698. package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js +2 -0
  699. package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js.map +1 -0
  700. package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js +2 -0
  701. package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js.map +1 -0
  702. package/dashboard/dist/assets/RolePill-BTPa8L-P.js +2 -0
  703. package/dashboard/dist/assets/RolePill-BTPa8L-P.js.map +1 -0
  704. package/dashboard/dist/assets/RolesPage-9grZW7yR.js +2 -0
  705. package/dashboard/dist/assets/RolesPage-9grZW7yR.js.map +1 -0
  706. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +2 -0
  707. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js.map +1 -0
  708. package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js +4 -0
  709. package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js.map +1 -0
  710. package/dashboard/dist/assets/StatCard-DlgF0CJC.js +2 -0
  711. package/dashboard/dist/assets/StatCard-DlgF0CJC.js.map +1 -0
  712. package/dashboard/dist/assets/StatusBadge-TlC4jiig.js +2 -0
  713. package/dashboard/dist/assets/StatusBadge-TlC4jiig.js.map +1 -0
  714. package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +2 -0
  715. package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js.map +1 -0
  716. package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js +2 -0
  717. package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js.map +1 -0
  718. package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js +2 -0
  719. package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js.map +1 -0
  720. package/dashboard/dist/assets/TaskQueuePill-awmtb0qw.js +2 -0
  721. package/dashboard/dist/assets/TaskQueuePill-awmtb0qw.js.map +1 -0
  722. package/dashboard/dist/assets/TasksListPage-C_QF23c1.js +2 -0
  723. package/dashboard/dist/assets/TasksListPage-C_QF23c1.js.map +1 -0
  724. package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js +2 -0
  725. package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js.map +1 -0
  726. package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js +2 -0
  727. package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js.map +1 -0
  728. package/dashboard/dist/assets/UserName-DaP4YAKr.js +2 -0
  729. package/dashboard/dist/assets/UserName-DaP4YAKr.js.map +1 -0
  730. package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js +5 -0
  731. package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js.map +1 -0
  732. package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js +2 -0
  733. package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js.map +1 -0
  734. package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js +2 -0
  735. package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js.map +1 -0
  736. package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js +2 -0
  737. package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js.map +1 -0
  738. package/dashboard/dist/assets/WorkflowsOverview-D9OzzQqw.js +2 -0
  739. package/dashboard/dist/assets/WorkflowsOverview-D9OzzQqw.js.map +1 -0
  740. package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js +3 -0
  741. package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js.map +1 -0
  742. package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js +2 -0
  743. package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js.map +1 -0
  744. package/dashboard/dist/assets/bots-BkKVMbUW.js +2 -0
  745. package/dashboard/dist/assets/bots-BkKVMbUW.js.map +1 -0
  746. package/dashboard/dist/assets/constants-CgaZfe5d.js +2 -0
  747. package/dashboard/dist/assets/constants-CgaZfe5d.js.map +1 -0
  748. package/dashboard/dist/assets/escalation-columns-D6aqStaY.js +2 -0
  749. package/dashboard/dist/assets/escalation-columns-D6aqStaY.js.map +1 -0
  750. package/dashboard/dist/assets/escalation-qalymbKB.js +2 -0
  751. package/dashboard/dist/assets/escalation-qalymbKB.js.map +1 -0
  752. package/dashboard/dist/assets/format-gXZXQ-HJ.js +2 -0
  753. package/dashboard/dist/assets/format-gXZXQ-HJ.js.map +1 -0
  754. package/dashboard/dist/assets/helpers-0gSleuzT.js +2 -0
  755. package/dashboard/dist/assets/helpers-0gSleuzT.js.map +1 -0
  756. package/dashboard/dist/assets/index-BWvMHed7.js +6 -0
  757. package/dashboard/dist/assets/index-BWvMHed7.js.map +1 -0
  758. package/dashboard/dist/assets/index-BaszoPO_.css +1 -0
  759. package/dashboard/dist/assets/index-Cn2jyj9A.js +2 -0
  760. package/dashboard/dist/assets/index-Cn2jyj9A.js.map +1 -0
  761. package/dashboard/dist/assets/index-D8VH6K8B.js +54 -0
  762. package/dashboard/dist/assets/index-D8VH6K8B.js.map +1 -0
  763. package/dashboard/dist/assets/index-D9SYwJsi.js +3 -0
  764. package/dashboard/dist/assets/index-D9SYwJsi.js.map +1 -0
  765. package/dashboard/dist/assets/index-DTPzZr_X.js +2 -0
  766. package/dashboard/dist/assets/index-DTPzZr_X.js.map +1 -0
  767. package/dashboard/dist/assets/index-D_6AB5BE.js +2 -0
  768. package/dashboard/dist/assets/index-D_6AB5BE.js.map +1 -0
  769. package/dashboard/dist/assets/index-S9Ks2Lj2.js +2 -0
  770. package/dashboard/dist/assets/index-S9Ks2Lj2.js.map +1 -0
  771. package/dashboard/dist/assets/index-X85K5bHC.js +17 -0
  772. package/dashboard/dist/assets/index-X85K5bHC.js.map +1 -0
  773. package/dashboard/dist/assets/index-rjmgHlSH.js +2 -0
  774. package/dashboard/dist/assets/index-rjmgHlSH.js.map +1 -0
  775. package/dashboard/dist/assets/mcp-blCW6IL7.js +2 -0
  776. package/dashboard/dist/assets/mcp-blCW6IL7.js.map +1 -0
  777. package/dashboard/dist/assets/mcp-query-DoAyPbjC.js +2 -0
  778. package/dashboard/dist/assets/mcp-query-DoAyPbjC.js.map +1 -0
  779. package/dashboard/dist/assets/mcp-runs-ChPbpvXK.js +2 -0
  780. package/dashboard/dist/assets/mcp-runs-ChPbpvXK.js.map +1 -0
  781. package/dashboard/dist/assets/namespaces-BgbaC3ow.js +2 -0
  782. package/dashboard/dist/assets/namespaces-BgbaC3ow.js.map +1 -0
  783. package/dashboard/dist/assets/roles-ZNrqqnQl.js +2 -0
  784. package/dashboard/dist/assets/roles-ZNrqqnQl.js.map +1 -0
  785. package/dashboard/dist/assets/settings-eBRSE0mQ.js +2 -0
  786. package/dashboard/dist/assets/settings-eBRSE0mQ.js.map +1 -0
  787. package/dashboard/dist/assets/tasks-tRqClPns.js +2 -0
  788. package/dashboard/dist/assets/tasks-tRqClPns.js.map +1 -0
  789. package/dashboard/dist/assets/useFilterParams-BaXUAkYK.js +2 -0
  790. package/dashboard/dist/assets/useFilterParams-BaXUAkYK.js.map +1 -0
  791. package/dashboard/dist/assets/useNatsEvents-Xr43X1fG.js +2 -0
  792. package/dashboard/dist/assets/useNatsEvents-Xr43X1fG.js.map +1 -0
  793. package/dashboard/dist/assets/useYamlActivityEvents-BO51u8tm.js +2 -0
  794. package/dashboard/dist/assets/useYamlActivityEvents-BO51u8tm.js.map +1 -0
  795. package/dashboard/dist/assets/users-tMvNyOo8.js +2 -0
  796. package/dashboard/dist/assets/users-tMvNyOo8.js.map +1 -0
  797. package/dashboard/dist/assets/vendor-icons-ZTAKVwGc.js +292 -0
  798. package/dashboard/dist/assets/vendor-icons-ZTAKVwGc.js.map +1 -0
  799. package/dashboard/dist/assets/vendor-query-B2UbickB.js +18 -0
  800. package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +1 -0
  801. package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js +22 -0
  802. package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js.map +1 -0
  803. package/dashboard/dist/assets/workflows-Cc4VHcrp.js +2 -0
  804. package/dashboard/dist/assets/workflows-Cc4VHcrp.js.map +1 -0
  805. package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js +2 -0
  806. package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js.map +1 -0
  807. package/dashboard/dist/index.html +20 -0
  808. package/dashboard/dist/logo512.png +0 -0
  809. package/package.json +96 -0
@@ -0,0 +1,6 @@
1
+ import{j as e,a as h}from"./vendor-query-B2UbickB.js";import{u as L,c as $,d as q,e as B,f as z,b as H}from"./workflows-Cc4VHcrp.js";import{P as U}from"./PageHeader-CpWFly5S.js";import{S as C,f as W}from"./index-D8VH6K8B.js";import{D as V}from"./DataTable-BDn1WBHS.js";import{B as G}from"./BotPicker-D6FYW1Gt.js";import{T as K}from"./TimeAgo-UPG6DoH8.js";import{S as Q}from"./StatusBadge-TlC4jiig.js";import{q as X,d as Y,r as T,s as Z,P as ee,p as te}from"./vendor-icons-ZTAKVwGc.js";import{L as se,e as ae,b as D}from"./vendor-react-Cw8Gy8NJ.js";import"./EmptyState-2CmV-IaS.js";import"./bots-BkKVMbUW.js";import"./format-gXZXQ-HJ.js";function R({children:t,className:n=""}){return e.jsx("span",{className:`px-2 py-0.5 text-[10px] bg-surface-sunken rounded-full text-text-secondary ${n}`,children:t})}const P=`{
2
+ "data": {},
3
+ "metadata": {}
4
+ }`;function ne(t){return typeof t=="boolean"?"boolean":typeof t=="number"?"number":Array.isArray(t)?"array":t!==null&&typeof t=="object"?"object":"string"}function I(t){if(!t)return[];const n=t.data;return!n||typeof n!="object"?[]:Object.entries(n).map(([i,o])=>({key:i,type:ne(o),defaultValue:o}))}function J(t){return{...t}}function F(t,n){return JSON.stringify({data:t,metadata:n},null,2)}const re={"* * * * *":"Every minute","*/5 * * * *":"Every 5 minutes","*/15 * * * *":"Every 15 minutes","*/30 * * * *":"Every 30 minutes","0 * * * *":"Every hour","0 */2 * * *":"Every 2 hours","0 */6 * * *":"Every 6 hours","0 */12 * * *":"Every 12 hours","0 0 * * *":"Daily at midnight","0 9 * * *":"Daily at 9 AM","0 9 * * 1-5":"Weekdays at 9 AM","0 0 * * 0":"Weekly (Sunday midnight)","0 0 1 * *":"Monthly (1st at midnight)","0 2 * * *":"Daily at 2 AM"};function A(t){return re[t]??""}const oe=[["*/15 * * * *","Every 15 min"],["0 * * * *","Every hour"],["0 */6 * * *","Every 6 hours"],["0 9 * * *","Daily 9 AM"],["0 9 * * 1-5","Weekdays 9 AM"],["0 0 * * 0","Weekly (Sun)"]];function le(t){const n=t==null?void 0:t.data;if(!n||typeof n!="object"||Array.isArray(n))return null;const i=Object.entries(n);return i.length===0||!i.every(([,s])=>typeof s=="string"||typeof s=="number"||typeof s=="boolean"||s===null)?null:i.map(([s,l])=>({key:s,value:l===null?"":String(l),type:l===null?"string":typeof l}))}const ce=[{key:"workflow_id",label:"Workflow ID",render:t=>e.jsx("span",{className:"font-mono text-[11px] text-text-secondary",children:t.workflow_id.length>40?`${t.workflow_id.slice(0,40)}...`:t.workflow_id})},{key:"status",label:"Status",render:t=>e.jsx(Q,{status:t.status}),className:"w-28"},{key:"created_at",label:"Started",render:t=>e.jsx(K,{date:t.created_at}),className:"w-32"}];function ie({configs:t,selectedType:n,onSelect:i,certifiedTypes:o}){return e.jsxs("div",{children:[e.jsx(C,{className:"mb-6",children:"Select Workflow"}),e.jsx("div",{children:t.map(s=>{const l=n===s.workflow_type,u=o.has(s.workflow_type);return e.jsxs("button",{onClick:()=>i(s),className:`w-full text-left py-4 border-b border-surface-border transition-colors duration-150 ${l?"border-l-2 border-l-accent pl-4":"pl-0 hover:text-text-primary"}`,children:[e.jsxs("div",{className:"flex items-center gap-2",children:[u?e.jsx(X,{className:"w-3.5 h-3.5 shrink-0 text-status-success"}):e.jsx(Y,{className:"w-3.5 h-3.5 shrink-0 text-accent/75"}),e.jsx("p",{className:`text-sm font-mono ${l?"font-medium text-accent":"text-text-secondary"}`,children:s.workflow_type}),s.execute_as&&e.jsxs("span",{className:"inline-flex items-center gap-0.5 px-1.5 py-0.5 text-[9px] bg-accent/10 text-accent rounded",children:[e.jsx(T,{className:"w-2.5 h-2.5"}),s.execute_as]})]}),s.description&&e.jsx("p",{className:"text-[11px] text-text-tertiary mt-1 leading-relaxed",children:s.description}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-1 opacity-60",children:s.task_queue})]},s.workflow_type)})})]})}function xe({selectedConfig:t,isJsonMode:n,hasFormView:i,jsonInput:o,formFields:s,dataFields:l,onJsonChange:u,onToggleMode:N,onUpdateFormField:f,onSetFormFields:y}){return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-baseline justify-between mb-2",children:[e.jsx("label",{className:"block text-xs text-text-secondary",children:"Envelope"}),e.jsxs("div",{className:"flex items-center gap-3",children:[i&&e.jsx("button",{type:"button",onClick:N,className:"text-[10px] text-accent hover:underline",children:n?"Form view":"JSON view"}),t.envelope_schema?e.jsx("span",{className:"text-[10px] text-accent",children:"Pre-filled from workflow config"}):e.jsx("span",{className:"text-[10px] text-status-warning",children:"No template"})]})]}),!t.envelope_schema&&e.jsx("div",{className:"bg-surface-sunken border border-surface-border rounded px-4 py-3 mb-3",children:e.jsxs("p",{className:"text-xs text-text-secondary leading-relaxed",children:["This workflow has no input template. Edit the JSON directly below, or register it as a ",e.jsx(se,{to:"/workflows/registry/new",className:"text-status-success hover:underline",children:"certified workflow"})," in the Workflow Registry for pre-filled fields and form-based input."]})}),n||!i?e.jsx("textarea",{value:o,onChange:c=>u(c.target.value),className:"input font-mono text-xs",rows:12,spellCheck:!1}):e.jsx("div",{className:"space-y-3",children:l.map(({key:c,type:m})=>{var b,k;const x=s[c],j=typeof x=="string"?x:JSON.stringify(x??(m==="array"?[]:{}),null,2),g=Math.min(20,Math.max(4,((k=(b=j==null?void 0:j.split)==null?void 0:b.call(j,`
5
+ `))==null?void 0:k.length)??4));return e.jsxs("div",{children:[e.jsxs("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:[c,e.jsx("span",{className:"ml-2 font-normal normal-case",children:m})]}),m==="boolean"?e.jsxs("select",{value:String(x??!1),onChange:w=>f(c,w.target.value,m),className:"select text-xs w-full",children:[e.jsx("option",{value:"true",children:"true"}),e.jsx("option",{value:"false",children:"false"})]}):m==="object"||m==="array"?e.jsx("textarea",{value:j,onChange:w=>{try{f(c,JSON.parse(w.target.value),m)}catch{y({...s,[c]:w.target.value})}},className:"input font-mono text-[11px] w-full leading-relaxed",rows:g,spellCheck:!1}):e.jsx("input",{type:m==="number"?"number":"text",value:String(x??""),onChange:w=>f(c,w.target.value,m),className:"input text-xs w-full"})]},c)})}),e.jsxs("p",{className:"text-[10px] text-text-tertiary mt-1.5",children:["The envelope wraps your workflow input. ",e.jsx("code",{className:"text-accent/80",children:"data"})," holds workflow-specific fields; ",e.jsx("code",{className:"text-accent/80",children:"metadata"})," is optional context."]})]})}function de({mode:t,onChange:n}){const i=(o,s,l)=>e.jsxs("button",{onClick:()=>n(o),className:`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${t===o?"bg-accent/10 text-accent font-medium":"text-text-tertiary hover:text-text-secondary hover:bg-surface-hover"}`,children:[s,l]});return e.jsxs("div",{className:"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit",children:[i("now",e.jsx(ee,{className:"w-3.5 h-3.5"}),"Start Now"),i("schedule",e.jsx(te,{className:"w-3.5 h-3.5"}),"Schedule")]})}function ue({config:t,overrideBot:n,onOverrideChange:i,showOverride:o}){const{user:s}=W(),l=n||t.execute_as;return e.jsxs("div",{className:"bg-surface-sunken rounded-lg px-4 py-3 space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-[10px] text-text-tertiary uppercase tracking-wider font-medium",children:"Running as"}),l&&!n&&e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"configured default"}),n&&e.jsx("span",{className:"text-[9px] text-accent",children:"admin override"})]}),e.jsx("div",{className:"flex items-center gap-1.5",children:l?e.jsxs(e.Fragment,{children:[e.jsx(T,{className:"w-3.5 h-3.5 text-accent/70"}),e.jsx("span",{className:"text-xs text-text-primary font-mono",children:l})]}):e.jsxs(e.Fragment,{children:[e.jsx(Z,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-xs text-text-primary",children:(s==null?void 0:s.displayName)||(s==null?void 0:s.username)||"you"})]})}),o&&i&&e.jsxs("div",{className:"pt-1 border-t border-surface-border",children:[e.jsx("label",{className:"text-[10px] text-text-tertiary mb-1 block",children:"Override identity"}),e.jsx(G,{selected:n??"",onChange:i,placeholder:t.execute_as?`Default: ${t.execute_as}`:"Invoking user (default)"})]})]})}function me({selected:t,activeTypes:n}){const i=D(),o=z(),[s,l]=h.useState(""),[u,N]=h.useState(""),[f,y]=h.useState(""),[c,m]=h.useState("json"),x=h.useMemo(()=>t!=null&&t.envelope_schema?JSON.stringify(t.envelope_schema,null,2):P,[t==null?void 0:t.envelope_schema]),j=u!==x,g=h.useMemo(()=>{try{return JSON.parse(u)}catch{return null}},[u]),b=h.useMemo(()=>g?le(g):null,[g]);h.useEffect(()=>{l(t.cron_schedule??""),N(t.envelope_schema?JSON.stringify(t.envelope_schema,null,2):P),y(""),m("json"),o.reset()},[t.workflow_type]);const{data:k,isLoading:w}=H({entity:t.workflow_type,limit:10}),p=()=>{let a;try{a=JSON.parse(u)}catch{y("Invalid JSON in envelope");return}y(""),o.mutate({config:t,cron_schedule:s.trim()||null,envelope_schema:a})},S=()=>{l(""),o.mutate({config:t,cron_schedule:null})},O=()=>{N(x),y("")},E=(a,r)=>{if(!g)return;const d={...g.data??{}},v=d[a];typeof v=="number"?d[a]=r===""?0:Number(r):typeof v=="boolean"?d[a]=r==="true":d[a]=r,N(JSON.stringify({...g,data:d},null,2))};return e.jsxs("div",{className:"space-y-8",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(C,{children:t.workflow_type}),t.cron_schedule&&e.jsx(R,{className:n.has(t.workflow_type)?"bg-status-success/10 text-status-success":"bg-surface-sunken text-text-tertiary",children:n.has(t.workflow_type)?"active":"inactive"})]}),t.description&&e.jsx("p",{className:"text-xs text-text-tertiary mt-2 leading-relaxed",children:t.description})]}),e.jsx("div",{className:"bg-surface-sunken rounded-lg px-4 py-3",children:e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"text-[10px] text-text-tertiary uppercase tracking-wider font-medium mr-2",children:"Cron runs as"}),e.jsx(T,{className:"w-3.5 h-3.5 text-accent/70"}),e.jsx("span",{className:"text-xs text-text-primary font-mono",children:t.execute_as??"lt-system"}),!t.execute_as&&e.jsx("span",{className:"text-[9px] text-text-tertiary ml-1",children:"system bot"})]})}),e.jsxs("div",{children:[e.jsx(C,{className:"mb-3",children:"Schedule"}),e.jsxs("div",{className:"flex gap-3 items-start",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("input",{type:"text",value:s,onChange:a=>{l(a.target.value),o.reset()},placeholder:"0 */6 * * *",className:"input font-mono text-sm w-full"}),s.trim()&&A(s.trim())&&e.jsx("p",{className:"text-xs text-text-secondary mt-1.5",children:A(s.trim())})]}),e.jsx("button",{onClick:p,disabled:o.isPending,className:"btn-primary text-xs shrink-0",children:o.isPending?"Saving...":"Save"}),t.cron_schedule&&e.jsx("button",{onClick:S,disabled:o.isPending,className:"btn-ghost text-xs text-status-error shrink-0",children:"Clear"})]}),o.isSuccess&&e.jsx("p",{className:"text-[10px] text-status-success mt-2",children:"Schedule updated"}),o.error&&e.jsx("p",{className:"text-[10px] text-status-error mt-2",children:o.error.message})]}),e.jsxs("div",{className:"bg-surface-sunken rounded-lg p-4",children:[e.jsx(C,{className:"mb-2",children:"Common Patterns"}),e.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 gap-x-6 gap-y-1.5",children:oe.map(([a,r])=>e.jsxs("button",{type:"button",onClick:()=>{l(a),o.reset()},className:"flex items-center gap-2 text-left py-0.5 group",children:[e.jsx("code",{className:"font-mono text-[11px] text-accent group-hover:text-accent-hover",children:a}),e.jsx("span",{className:"text-[10px] text-text-tertiary",children:r})]},a))})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-baseline justify-between mb-2",children:[e.jsx(C,{children:"Cron Envelope"}),e.jsxs("div",{className:"flex items-center gap-3",children:[j&&e.jsx("button",{type:"button",onClick:O,className:"text-[10px] text-status-warning hover:text-status-warning/80 transition-colors",children:"Reset to default"}),b&&e.jsxs("div",{className:"flex rounded overflow-hidden border border-surface-border",children:[e.jsx("button",{type:"button",onClick:()=>m("form"),className:`px-2 py-0.5 text-[10px] transition-colors ${c==="form"?"bg-accent/10 text-accent":"text-text-tertiary hover:text-text-secondary"}`,children:"Form"}),e.jsx("button",{type:"button",onClick:()=>m("json"),className:`px-2 py-0.5 text-[10px] transition-colors ${c==="json"?"bg-accent/10 text-accent":"text-text-tertiary hover:text-text-secondary"}`,children:"JSON"})]})]})]}),e.jsx("p",{className:"text-[10px] text-text-tertiary mb-3",children:"This envelope is sent as the workflow input on each cron invocation."}),c==="form"&&b?e.jsx("div",{className:"space-y-3",children:b.map(({key:a,value:r,type:d})=>e.jsxs("div",{children:[e.jsx("label",{className:"block text-[11px] text-text-secondary mb-1 font-mono",children:a}),d==="boolean"?e.jsxs("select",{value:r,onChange:v=>E(a,v.target.value),className:"input text-xs w-full",children:[e.jsx("option",{value:"true",children:"true"}),e.jsx("option",{value:"false",children:"false"})]}):e.jsx("input",{type:d==="number"?"number":"text",value:r,onChange:v=>E(a,v.target.value),className:"input text-xs font-mono w-full"})]},a))}):e.jsx("textarea",{value:u,onChange:a=>{N(a.target.value),y("")},className:"input font-mono text-xs w-full",rows:10,spellCheck:!1}),f&&e.jsx("p",{className:"text-[10px] text-status-error mt-2",children:f}),j&&e.jsx("p",{className:"text-[10px] text-accent mt-1.5",children:"Envelope has been customized. Changes will be saved with the schedule."})]}),e.jsxs("div",{children:[e.jsx(C,{className:"mb-3",children:"Recent Executions"}),e.jsx(V,{columns:ce,data:(k==null?void 0:k.jobs)??[],keyFn:a=>a.workflow_id,onRowClick:a=>i(`/workflows/executions/${a.workflow_id}`),isLoading:w,emptyMessage:"No executions yet"})]})]})}function pe({selected:t,executionsPath:n}){const i=D(),{isSuperAdmin:o,hasRoleType:s}=W(),l=o||s("admin"),u=B(),[N,f]=h.useState(P),[y,c]=h.useState(""),[m,x]=h.useState({}),[j,g]=h.useState(!1),[b,k]=h.useState(""),w=h.useMemo(()=>I(t.envelope_schema??null),[t.envelope_schema]),p=w.length>0,S=h.useMemo(()=>{if(!t.envelope_schema)return{};const r=t.envelope_schema.metadata;return r&&typeof r=="object"?r:{}},[t.envelope_schema]);h.useEffect(()=>{var v;c(""),u.reset();const r=sessionStorage.getItem("lt:invoke:prefill");if(r){sessionStorage.removeItem("lt:invoke:prefill"),f(r);try{const _=JSON.parse(r),M=(_==null?void 0:_.data)??_;M&&typeof M=="object"&&x(J(M))}catch{}g(!0),k("");return}const d=t.envelope_schema?JSON.stringify(t.envelope_schema,null,2):P;f(d),(v=t.envelope_schema)!=null&&v.data&&typeof t.envelope_schema.data=="object"?x(J(t.envelope_schema.data)):x({}),g(!I(t.envelope_schema??null).length),k("")},[t.workflow_type]);const O=()=>{if(j)try{const r=JSON.parse(N);r.data&&typeof r.data=="object"&&x(J(r.data))}catch{}else f(F(m,S));g(!j)},E=(r,d,v)=>{let _=d;v==="number"?_=d===""?0:Number(d):v==="boolean"&&(_=d==="true"||d===!0);const M={...m,[r]:_};x(M),f(F(M,S))},a=async()=>{c("");let r;try{r=JSON.parse(N)}catch{c("Invalid JSON");return}const{data:d,metadata:v}=r;if(!d||typeof d!="object"){c('Envelope must include a "data" object');return}try{await u.mutateAsync({workflowType:t.workflow_type,data:d,metadata:v??void 0,...b?{execute_as:b}:{}}),i(n)}catch{}};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(C,{children:t.workflow_type}),e.jsx("div",{className:"flex gap-2",children:t.roles.map(r=>e.jsx(R,{children:r},r))})]}),t.description&&e.jsx("p",{className:"text-sm text-text-secondary mt-2 leading-relaxed",children:t.description})]}),e.jsx(ue,{config:t,overrideBot:b,onOverrideChange:k,showOverride:l}),e.jsx(xe,{selectedConfig:t,isJsonMode:j,hasFormView:p,jsonInput:N,formFields:m,dataFields:w,onJsonChange:r=>{f(r),c("")},onToggleMode:O,onUpdateFormField:E,onSetFormFields:x}),y&&e.jsx("p",{className:"text-xs text-status-error",children:y}),u.error&&e.jsx("p",{className:"text-xs text-status-error",children:u.error.message}),u.isSuccess&&e.jsx("p",{className:"text-xs text-status-success",children:"Workflow started"}),e.jsx("button",{onClick:a,disabled:u.isPending,className:"btn-primary",children:u.isPending?"Starting...":"Start Workflow"})]})}function he({tier:t}){const[n,i]=ae(),{data:o,isLoading:s}=L(),{data:l,isLoading:u}=$(),{data:N}=q(),f=n.get("mode")||"now",y=n.get("type")??"",c=o??[],m=h.useMemo(()=>new Set(c.filter(p=>p.invocable).map(p=>p.workflow_type)),[c]),x=h.useMemo(()=>{const p=c.filter(a=>a.invocable),S=new Set(c.map(a=>a.workflow_type)),E=(l??[]).filter(a=>a.active&&!S.has(a.workflow_type)).map(a=>({workflow_type:a.workflow_type,task_queue:a.task_queue??"",invocable:!0,description:null,default_role:"reviewer",roles:[],invocation_roles:[],consumes:[],envelope_schema:null,resolver_schema:null,cron_schedule:null,execute_as:null}));return[...p,...E]},[c,l]),j=x.find(p=>p.workflow_type===y),g=new Set((N??[]).filter(p=>p.active).map(p=>p.workflow_type)),b="/workflows/executions";h.useEffect(()=>{x.length===1&&!n.get("type")&&i({type:x[0].workflow_type,mode:f},{replace:!0})},[x.length]);const k=p=>{const S={mode:p};y&&(S.type=y),i(S,{replace:!0})},w=p=>{i({type:p.workflow_type,mode:f},{replace:!0})};return s||u?e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]}):e.jsxs("div",{children:[e.jsx(U,{title:"Invoke Workflow",actions:e.jsx(de,{mode:f,onChange:k})}),x.length===0?e.jsxs("div",{className:"py-16 text-center",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:"No invocable workflows"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:"Mark workflows as invocable in the registry, or start the server with examples enabled."})]}):e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-12",children:[e.jsx(ie,{configs:x,selectedType:y,onSelect:w,certifiedTypes:m}),e.jsx("div",{className:"lg:col-span-2",children:y&&j?f==="now"?e.jsx(pe,{selected:j,executionsPath:b}):e.jsx(me,{selected:j,activeTypes:g}):e.jsx("div",{className:"py-16 text-center",children:e.jsx("p",{className:"text-sm text-text-tertiary",children:"Select a workflow to begin"})})})]})]})}function Me(){return e.jsx(he,{tier:"durable"})}export{Me as DurableInvokePage,he as StartWorkflowPage};
6
+ //# sourceMappingURL=index-BWvMHed7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-BWvMHed7.js","sources":["../../src/components/common/display/Pill.tsx","../../src/pages/workflows/start/helpers.ts","../../src/pages/workflows/cron/helpers.tsx","../../src/pages/workflows/start/WorkflowSelector.tsx","../../src/pages/workflows/start/EnvelopeEditor.tsx","../../src/pages/workflows/start/StartWorkflowPage.tsx","../../src/pages/workflows/start/DurableInvokePage.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\ninterface PillProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function Pill({ children, className = '' }: PillProps) {\n return (\n <span className={`px-2 py-0.5 text-[10px] bg-surface-sunken rounded-full text-text-secondary ${className}`}>\n {children}\n </span>\n );\n}\n","export const DEFAULT_ENVELOPE = '{\\n \"data\": {},\\n \"metadata\": {}\\n}';\n\n/** Infer a simple field type from a value. */\nexport function inferTypeFromValue(value: unknown): string {\n if (typeof value === 'boolean') return 'boolean';\n if (typeof value === 'number') return 'number';\n if (Array.isArray(value)) return 'array';\n if (value !== null && typeof value === 'object') return 'object';\n return 'string';\n}\n\n/** Extract the data keys from an envelope_schema and their inferred types. */\nexport function extractDataFields(\n schema: Record<string, unknown> | null,\n): { key: string; type: string; defaultValue: unknown }[] {\n if (!schema) return [];\n const data = schema.data;\n if (!data || typeof data !== 'object') return [];\n return Object.entries(data as Record<string, unknown>).map(([key, value]) => ({\n key,\n type: inferTypeFromValue(value),\n defaultValue: value,\n }));\n}\n\n/** Build form field values from data object. */\nexport function dataToFields(data: Record<string, unknown>): Record<string, unknown> {\n return { ...data };\n}\n\n/** Build full envelope JSON string from form fields + metadata. */\nexport function fieldsToJson(\n fields: Record<string, unknown>,\n metadata: Record<string, unknown>,\n): string {\n return JSON.stringify({ data: fields, metadata }, null, 2);\n}\n","import type { LTJob } from '../../../api/types';\nimport type { Column } from '../../../components/common/data/DataTable';\nimport { TimeAgo } from '../../../components/common/display/TimeAgo';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\n\n// -- Cron descriptions -------------------------------------------------------\n\nconst CRON_DESCRIPTIONS: Record<string, string> = {\n '* * * * *': 'Every minute',\n '*/5 * * * *': 'Every 5 minutes',\n '*/15 * * * *': 'Every 15 minutes',\n '*/30 * * * *': 'Every 30 minutes',\n '0 * * * *': 'Every hour',\n '0 */2 * * *': 'Every 2 hours',\n '0 */6 * * *': 'Every 6 hours',\n '0 */12 * * *': 'Every 12 hours',\n '0 0 * * *': 'Daily at midnight',\n '0 9 * * *': 'Daily at 9 AM',\n '0 9 * * 1-5': 'Weekdays at 9 AM',\n '0 0 * * 0': 'Weekly (Sunday midnight)',\n '0 0 1 * *': 'Monthly (1st at midnight)',\n '0 2 * * *': 'Daily at 2 AM',\n};\n\nexport function describeCron(expr: string): string {\n return CRON_DESCRIPTIONS[expr] ?? '';\n}\n\nexport const COMMON_PATTERNS: [string, string][] = [\n ['*/15 * * * *', 'Every 15 min'],\n ['0 * * * *', 'Every hour'],\n ['0 */6 * * *', 'Every 6 hours'],\n ['0 9 * * *', 'Daily 9 AM'],\n ['0 9 * * 1-5', 'Weekdays 9 AM'],\n ['0 0 * * 0', 'Weekly (Sun)'],\n];\n\nexport const DEFAULT_ENVELOPE = '{\\n \"data\": {},\\n \"metadata\": {}\\n}';\n\n// -- Envelope helpers ---------------------------------------------------------\n\n/** Extract simple string/number/boolean keys from `data` for form view. */\nexport function extractFormFields(\n envelope: Record<string, unknown>,\n): { key: string; value: string; type: string }[] | null {\n const data = envelope?.data;\n if (!data || typeof data !== 'object' || Array.isArray(data)) return null;\n const entries = Object.entries(data as Record<string, unknown>);\n if (entries.length === 0) return null;\n // Only show form if all values are scalar\n const allScalar = entries.every(\n ([, v]) => typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean' || v === null,\n );\n if (!allScalar) return null;\n return entries.map(([key, value]) => ({\n key,\n value: value === null ? '' : String(value),\n type: value === null ? 'string' : typeof value,\n }));\n}\n\n// -- Recent jobs table columns ------------------------------------------------\n\nexport const jobColumns: Column<LTJob>[] = [\n {\n key: 'workflow_id',\n label: 'Workflow ID',\n render: (row) => (\n <span className=\"font-mono text-[11px] text-text-secondary\">\n {row.workflow_id.length > 40\n ? `${row.workflow_id.slice(0, 40)}...`\n : row.workflow_id}\n </span>\n ),\n },\n {\n key: 'status',\n label: 'Status',\n render: (row) => <StatusBadge status={row.status} />,\n className: 'w-28',\n },\n {\n key: 'created_at',\n label: 'Started',\n render: (row) => <TimeAgo date={row.created_at} />,\n className: 'w-32',\n },\n];\n","import { Bot, ShieldCheck, Workflow } from 'lucide-react';\nimport { SectionLabel } from '../../../components/common/layout/SectionLabel';\nimport type { LTWorkflowConfig } from '../../../api/types';\n\nexport function WorkflowSelector({\n configs,\n selectedType,\n onSelect,\n certifiedTypes,\n}: {\n configs: LTWorkflowConfig[];\n selectedType: string;\n onSelect: (config: LTWorkflowConfig) => void;\n certifiedTypes: Set<string>;\n}) {\n return (\n <div>\n <SectionLabel className=\"mb-6\">Select Workflow</SectionLabel>\n <div>\n {configs.map((config) => {\n const isSelected = selectedType === config.workflow_type;\n const isCertified = certifiedTypes.has(config.workflow_type);\n return (\n <button\n key={config.workflow_type}\n onClick={() => onSelect(config)}\n className={`w-full text-left py-4 border-b border-surface-border transition-colors duration-150 ${\n isSelected\n ? 'border-l-2 border-l-accent pl-4'\n : 'pl-0 hover:text-text-primary'\n }`}\n >\n <div className=\"flex items-center gap-2\">\n {isCertified\n ? <ShieldCheck className=\"w-3.5 h-3.5 shrink-0 text-status-success\" />\n : <Workflow className=\"w-3.5 h-3.5 shrink-0 text-accent/75\" />}\n <p className={`text-sm font-mono ${isSelected ? 'font-medium text-accent' : 'text-text-secondary'}`}>\n {config.workflow_type}\n </p>\n {config.execute_as && (\n <span className=\"inline-flex items-center gap-0.5 px-1.5 py-0.5 text-[9px] bg-accent/10 text-accent rounded\">\n <Bot className=\"w-2.5 h-2.5\" />\n {config.execute_as}\n </span>\n )}\n </div>\n {config.description && (\n <p className=\"text-[11px] text-text-tertiary mt-1 leading-relaxed\">\n {config.description}\n </p>\n )}\n <p className=\"text-[10px] text-text-tertiary mt-1 opacity-60\">\n {config.task_queue}\n </p>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import { Link } from 'react-router-dom';\nimport type { LTWorkflowConfig } from '../../../api/types';\n\ninterface DataField {\n key: string;\n type: string;\n defaultValue: unknown;\n}\n\nexport function EnvelopeEditor({\n selectedConfig,\n isJsonMode,\n hasFormView,\n jsonInput,\n formFields,\n dataFields,\n onJsonChange,\n onToggleMode,\n onUpdateFormField,\n onSetFormFields,\n}: {\n selectedConfig: LTWorkflowConfig;\n isJsonMode: boolean;\n hasFormView: boolean;\n jsonInput: string;\n formFields: Record<string, unknown>;\n dataFields: DataField[];\n onJsonChange: (value: string) => void;\n onToggleMode: () => void;\n onUpdateFormField: (key: string, value: unknown, type: string) => void;\n onSetFormFields: (fields: Record<string, unknown>) => void;\n}) {\n return (\n <div>\n <div className=\"flex items-baseline justify-between mb-2\">\n <label className=\"block text-xs text-text-secondary\">\n Envelope\n </label>\n <div className=\"flex items-center gap-3\">\n {hasFormView && (\n <button\n type=\"button\"\n onClick={onToggleMode}\n className=\"text-[10px] text-accent hover:underline\"\n >\n {isJsonMode ? 'Form view' : 'JSON view'}\n </button>\n )}\n {selectedConfig.envelope_schema ? (\n <span className=\"text-[10px] text-accent\">\n Pre-filled from workflow config\n </span>\n ) : (\n <span className=\"text-[10px] text-status-warning\">\n No template\n </span>\n )}\n </div>\n </div>\n\n {!selectedConfig.envelope_schema && (\n <div className=\"bg-surface-sunken border border-surface-border rounded px-4 py-3 mb-3\">\n <p className=\"text-xs text-text-secondary leading-relaxed\">\n This workflow has no input template. Edit the JSON directly below, or register it as a <Link to=\"/workflows/registry/new\" className=\"text-status-success hover:underline\">certified workflow</Link> in the Workflow Registry for pre-filled fields and form-based input.\n </p>\n </div>\n )}\n\n {isJsonMode || !hasFormView ? (\n /* JSON view */\n <textarea\n value={jsonInput}\n onChange={(e) => onJsonChange(e.target.value)}\n className=\"input font-mono text-xs\"\n rows={12}\n spellCheck={false}\n />\n ) : (\n /* Form view */\n <div className=\"space-y-3\">\n {dataFields.map(({ key, type }) => {\n const value = formFields[key];\n const jsonValue =\n typeof value === 'string'\n ? value\n : JSON.stringify(\n value ?? (type === 'array' ? [] : {}),\n null,\n 2,\n );\n const textareaRows = Math.min(\n 20,\n Math.max(4, (jsonValue?.split?.('\\n')?.length ?? 4)),\n );\n return (\n <div key={key}>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n {key}\n <span className=\"ml-2 font-normal normal-case\">\n {type}\n </span>\n </label>\n {type === 'boolean' ? (\n <select\n value={String(value ?? false)}\n onChange={(e) =>\n onUpdateFormField(key, e.target.value, type)\n }\n className=\"select text-xs w-full\"\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : type === 'object' || type === 'array' ? (\n <textarea\n value={jsonValue}\n onChange={(e) => {\n try {\n onUpdateFormField(\n key,\n JSON.parse(e.target.value),\n type,\n );\n } catch {\n // Keep raw text without syncing to JSON\n onSetFormFields({\n ...formFields,\n [key]: e.target.value,\n });\n }\n }}\n className=\"input font-mono text-[11px] w-full leading-relaxed\"\n rows={textareaRows}\n spellCheck={false}\n />\n ) : (\n <input\n type={type === 'number' ? 'number' : 'text'}\n value={String(value ?? '')}\n onChange={(e) =>\n onUpdateFormField(key, e.target.value, type)\n }\n className=\"input text-xs w-full\"\n />\n )}\n </div>\n );\n })}\n </div>\n )}\n <p className=\"text-[10px] text-text-tertiary mt-1.5\">\n The envelope wraps your workflow input. <code className=\"text-accent/80\">data</code> holds workflow-specific fields; <code className=\"text-accent/80\">metadata</code> is optional context.\n </p>\n </div>\n );\n}\n","import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport { Play, Clock, Bot, UserCircle } from 'lucide-react';\nimport { useWorkflowConfigs, useDiscoveredWorkflows, useInvokeWorkflow, useCronStatus, useSetCronSchedule, useJobs } from '../../../api/workflows';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { SectionLabel } from '../../../components/common/layout/SectionLabel';\nimport { Pill } from '../../../components/common/display/Pill';\nimport { DataTable } from '../../../components/common/data/DataTable';\nimport { BotPicker } from '../../../components/common/form/BotPicker';\nimport { useAuth } from '../../../hooks/useAuth';\nimport type { LTWorkflowConfig } from '../../../api/types';\nimport {\n DEFAULT_ENVELOPE,\n extractDataFields,\n dataToFields,\n fieldsToJson,\n} from './helpers';\nimport { describeCron, COMMON_PATTERNS, extractFormFields, jobColumns } from '../cron/helpers';\nimport { WorkflowSelector } from './WorkflowSelector';\nimport { EnvelopeEditor } from './EnvelopeEditor';\n\nexport type InvokeTier = 'certified' | 'durable';\ntype Mode = 'now' | 'schedule';\n\n// ── Mode toggle ─────────────────────────────────────────────────────────────\n\nfunction ModeToggle({ mode, onChange }: { mode: Mode; onChange: (m: Mode) => void }) {\n const btn = (m: Mode, icon: React.ReactNode, label: string) => (\n <button\n onClick={() => onChange(m)}\n className={`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${\n mode === m\n ? 'bg-accent/10 text-accent font-medium'\n : 'text-text-tertiary hover:text-text-secondary hover:bg-surface-hover'\n }`}\n >\n {icon}\n {label}\n </button>\n );\n\n return (\n <div className=\"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit\">\n {btn('now', <Play className=\"w-3.5 h-3.5\" />, 'Start Now')}\n {btn('schedule', <Clock className=\"w-3.5 h-3.5\" />, 'Schedule')}\n </div>\n );\n}\n\n// ── Identity summary ────────────────────────────────────────────────────────\n\nfunction IdentitySummary({\n config,\n overrideBot,\n onOverrideChange,\n showOverride,\n}: {\n config: LTWorkflowConfig;\n overrideBot?: string;\n onOverrideChange?: (botExternalId: string) => void;\n showOverride?: boolean;\n}) {\n const { user } = useAuth();\n const effectiveBot = overrideBot || config.execute_as;\n\n return (\n <div className=\"bg-surface-sunken rounded-lg px-4 py-3 space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[10px] text-text-tertiary uppercase tracking-wider font-medium\">Running as</span>\n {effectiveBot && !overrideBot && (\n <span className=\"text-[9px] text-text-tertiary\">configured default</span>\n )}\n {overrideBot && (\n <span className=\"text-[9px] text-accent\">admin override</span>\n )}\n </div>\n <div className=\"flex items-center gap-1.5\">\n {effectiveBot ? (\n <>\n <Bot className=\"w-3.5 h-3.5 text-accent/70\" />\n <span className=\"text-xs text-text-primary font-mono\">{effectiveBot}</span>\n </>\n ) : (\n <>\n <UserCircle className=\"w-3.5 h-3.5 text-text-tertiary\" />\n <span className=\"text-xs text-text-primary\">\n {user?.displayName || user?.username || 'you'}\n </span>\n </>\n )}\n </div>\n {showOverride && onOverrideChange && (\n <div className=\"pt-1 border-t border-surface-border\">\n <label className=\"text-[10px] text-text-tertiary mb-1 block\">Override identity</label>\n <BotPicker\n selected={overrideBot ?? ''}\n onChange={onOverrideChange}\n placeholder={config.execute_as ? `Default: ${config.execute_as}` : 'Invoking user (default)'}\n />\n </div>\n )}\n </div>\n );\n}\n\n// ── Schedule panel ──────────────────────────────────────────────────────────\n\nfunction SchedulePanel({\n selected,\n activeTypes,\n}: {\n selected: LTWorkflowConfig;\n activeTypes: Set<string>;\n}) {\n const navigate = useNavigate();\n const setCron = useSetCronSchedule();\n\n const [cronInput, setCronInput] = useState('');\n const [envelopeInput, setEnvelopeInput] = useState('');\n const [envelopeError, setEnvelopeError] = useState('');\n const [viewMode, setViewMode] = useState<'json' | 'form'>('json');\n\n const defaultEnvelope = useMemo(() => {\n if (!selected?.envelope_schema) return DEFAULT_ENVELOPE;\n return JSON.stringify(selected.envelope_schema, null, 2);\n }, [selected?.envelope_schema]);\n\n const isEnvelopeModified = envelopeInput !== defaultEnvelope;\n\n const parsedEnvelope = useMemo(() => {\n try {\n return JSON.parse(envelopeInput) as Record<string, unknown>;\n } catch {\n return null;\n }\n }, [envelopeInput]);\n\n const formFields = useMemo(\n () => (parsedEnvelope ? extractFormFields(parsedEnvelope) : null),\n [parsedEnvelope],\n );\n\n useEffect(() => {\n setCronInput(selected.cron_schedule ?? '');\n setEnvelopeInput(\n selected.envelope_schema\n ? JSON.stringify(selected.envelope_schema, null, 2)\n : DEFAULT_ENVELOPE,\n );\n setEnvelopeError('');\n setViewMode('json');\n setCron.reset();\n }, [selected.workflow_type]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const { data: jobsData, isLoading: jobsLoading } = useJobs({\n entity: selected.workflow_type,\n limit: 10,\n });\n\n const handleSave = () => {\n let envelopeSchema: Record<string, unknown> | undefined;\n try {\n envelopeSchema = JSON.parse(envelopeInput);\n } catch {\n setEnvelopeError('Invalid JSON in envelope');\n return;\n }\n setEnvelopeError('');\n setCron.mutate({\n config: selected,\n cron_schedule: cronInput.trim() || null,\n envelope_schema: envelopeSchema,\n });\n };\n\n const handleClear = () => {\n setCronInput('');\n setCron.mutate({ config: selected, cron_schedule: null });\n };\n\n const handleResetEnvelope = () => {\n setEnvelopeInput(defaultEnvelope);\n setEnvelopeError('');\n };\n\n const handleFormFieldChange = (key: string, value: string) => {\n if (!parsedEnvelope) return;\n const data = { ...((parsedEnvelope.data as Record<string, unknown>) ?? {}) };\n const original = data[key];\n if (typeof original === 'number') data[key] = value === '' ? 0 : Number(value);\n else if (typeof original === 'boolean') data[key] = value === 'true';\n else data[key] = value;\n setEnvelopeInput(JSON.stringify({ ...parsedEnvelope, data }, null, 2));\n };\n\n return (\n <div className=\"space-y-8\">\n {/* Header */}\n <div>\n <div className=\"flex items-center gap-3\">\n <SectionLabel>{selected.workflow_type}</SectionLabel>\n {selected.cron_schedule && (\n <Pill className={activeTypes.has(selected.workflow_type)\n ? 'bg-status-success/10 text-status-success'\n : 'bg-surface-sunken text-text-tertiary'\n }>\n {activeTypes.has(selected.workflow_type) ? 'active' : 'inactive'}\n </Pill>\n )}\n </div>\n {selected.description && (\n <p className=\"text-xs text-text-tertiary mt-2 leading-relaxed\">\n {selected.description}\n </p>\n )}\n </div>\n\n {/* Cron execution identity */}\n <div className=\"bg-surface-sunken rounded-lg px-4 py-3\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-[10px] text-text-tertiary uppercase tracking-wider font-medium mr-2\">Cron runs as</span>\n <Bot className=\"w-3.5 h-3.5 text-accent/70\" />\n <span className=\"text-xs text-text-primary font-mono\">\n {selected.execute_as ?? 'lt-system'}\n </span>\n {!selected.execute_as && (\n <span className=\"text-[9px] text-text-tertiary ml-1\">system bot</span>\n )}\n </div>\n </div>\n\n {/* Cron editor */}\n <div>\n <SectionLabel className=\"mb-3\">Schedule</SectionLabel>\n <div className=\"flex gap-3 items-start\">\n <div className=\"flex-1\">\n <input\n type=\"text\"\n value={cronInput}\n onChange={(e) => { setCronInput(e.target.value); setCron.reset(); }}\n placeholder=\"0 */6 * * *\"\n className=\"input font-mono text-sm w-full\"\n />\n {cronInput.trim() && describeCron(cronInput.trim()) && (\n <p className=\"text-xs text-text-secondary mt-1.5\">\n {describeCron(cronInput.trim())}\n </p>\n )}\n </div>\n <button onClick={handleSave} disabled={setCron.isPending} className=\"btn-primary text-xs shrink-0\">\n {setCron.isPending ? 'Saving...' : 'Save'}\n </button>\n {selected.cron_schedule && (\n <button onClick={handleClear} disabled={setCron.isPending} className=\"btn-ghost text-xs text-status-error shrink-0\">\n Clear\n </button>\n )}\n </div>\n {setCron.isSuccess && <p className=\"text-[10px] text-status-success mt-2\">Schedule updated</p>}\n {setCron.error && <p className=\"text-[10px] text-status-error mt-2\">{setCron.error.message}</p>}\n </div>\n\n {/* Common patterns */}\n <div className=\"bg-surface-sunken rounded-lg p-4\">\n <SectionLabel className=\"mb-2\">Common Patterns</SectionLabel>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-x-6 gap-y-1.5\">\n {COMMON_PATTERNS.map(([expr, desc]) => (\n <button\n key={expr}\n type=\"button\"\n onClick={() => { setCronInput(expr); setCron.reset(); }}\n className=\"flex items-center gap-2 text-left py-0.5 group\"\n >\n <code className=\"font-mono text-[11px] text-accent group-hover:text-accent-hover\">{expr}</code>\n <span className=\"text-[10px] text-text-tertiary\">{desc}</span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Cron Envelope editor */}\n <div>\n <div className=\"flex items-baseline justify-between mb-2\">\n <SectionLabel>Cron Envelope</SectionLabel>\n <div className=\"flex items-center gap-3\">\n {isEnvelopeModified && (\n <button type=\"button\" onClick={handleResetEnvelope} className=\"text-[10px] text-status-warning hover:text-status-warning/80 transition-colors\">\n Reset to default\n </button>\n )}\n {formFields && (\n <div className=\"flex rounded overflow-hidden border border-surface-border\">\n <button type=\"button\" onClick={() => setViewMode('form')} className={`px-2 py-0.5 text-[10px] transition-colors ${viewMode === 'form' ? 'bg-accent/10 text-accent' : 'text-text-tertiary hover:text-text-secondary'}`}>Form</button>\n <button type=\"button\" onClick={() => setViewMode('json')} className={`px-2 py-0.5 text-[10px] transition-colors ${viewMode === 'json' ? 'bg-accent/10 text-accent' : 'text-text-tertiary hover:text-text-secondary'}`}>JSON</button>\n </div>\n )}\n </div>\n </div>\n <p className=\"text-[10px] text-text-tertiary mb-3\">\n This envelope is sent as the workflow input on each cron invocation.\n </p>\n\n {viewMode === 'form' && formFields ? (\n <div className=\"space-y-3\">\n {formFields.map(({ key, value, type }) => (\n <div key={key}>\n <label className=\"block text-[11px] text-text-secondary mb-1 font-mono\">{key}</label>\n {type === 'boolean' ? (\n <select value={value} onChange={(e) => handleFormFieldChange(key, e.target.value)} className=\"input text-xs w-full\">\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : (\n <input type={type === 'number' ? 'number' : 'text'} value={value} onChange={(e) => handleFormFieldChange(key, e.target.value)} className=\"input text-xs font-mono w-full\" />\n )}\n </div>\n ))}\n </div>\n ) : (\n <textarea\n value={envelopeInput}\n onChange={(e) => { setEnvelopeInput(e.target.value); setEnvelopeError(''); }}\n className=\"input font-mono text-xs w-full\"\n rows={10}\n spellCheck={false}\n />\n )}\n\n {envelopeError && <p className=\"text-[10px] text-status-error mt-2\">{envelopeError}</p>}\n {isEnvelopeModified && <p className=\"text-[10px] text-accent mt-1.5\">Envelope has been customized. Changes will be saved with the schedule.</p>}\n </div>\n\n {/* Recent executions */}\n <div>\n <SectionLabel className=\"mb-3\">Recent Executions</SectionLabel>\n <DataTable\n columns={jobColumns}\n data={jobsData?.jobs ?? []}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/workflows/executions/${row.workflow_id}`)}\n isLoading={jobsLoading}\n emptyMessage=\"No executions yet\"\n />\n </div>\n </div>\n );\n}\n\n// ── Start Now panel ─────────────────────────────────────────────────────────\n\nfunction StartNowPanel({ selected, executionsPath }: { selected: LTWorkflowConfig; executionsPath: string }) {\n const navigate = useNavigate();\n const { isSuperAdmin, hasRoleType } = useAuth();\n const isAdmin = isSuperAdmin || hasRoleType('admin');\n const invokeMutation = useInvokeWorkflow();\n const [jsonInput, setJsonInput] = useState(DEFAULT_ENVELOPE);\n const [parseError, setParseError] = useState('');\n const [formFields, setFormFields] = useState<Record<string, unknown>>({});\n const [isJsonMode, setIsJsonMode] = useState(false);\n const [overrideBot, setOverrideBot] = useState('');\n\n const dataFields = useMemo(\n () => extractDataFields(selected.envelope_schema ?? null),\n [selected.envelope_schema],\n );\n const hasFormView = dataFields.length > 0;\n\n const schemaMetadata = useMemo(() => {\n if (!selected.envelope_schema) return {};\n const md = selected.envelope_schema.metadata;\n return md && typeof md === 'object' ? (md as Record<string, unknown>) : {};\n }, [selected.envelope_schema]);\n\n useEffect(() => {\n setParseError('');\n invokeMutation.reset();\n\n // Check for prefilled input from restart (sessionStorage)\n const prefill = sessionStorage.getItem('lt:invoke:prefill');\n if (prefill) {\n sessionStorage.removeItem('lt:invoke:prefill');\n setJsonInput(prefill);\n try {\n const parsed = JSON.parse(prefill);\n const data = parsed?.data ?? parsed;\n if (data && typeof data === 'object') setFormFields(dataToFields(data));\n } catch { /* use as-is */ }\n setIsJsonMode(true);\n setOverrideBot('');\n return;\n }\n\n const json = selected.envelope_schema\n ? JSON.stringify(selected.envelope_schema, null, 2)\n : DEFAULT_ENVELOPE;\n setJsonInput(json);\n if (selected.envelope_schema?.data && typeof selected.envelope_schema.data === 'object') {\n setFormFields(dataToFields(selected.envelope_schema.data as Record<string, unknown>));\n } else {\n setFormFields({});\n }\n setIsJsonMode(!extractDataFields(selected.envelope_schema ?? null).length);\n setOverrideBot('');\n }, [selected.workflow_type]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleToggleMode = () => {\n if (isJsonMode) {\n try {\n const parsed = JSON.parse(jsonInput);\n if (parsed.data && typeof parsed.data === 'object') setFormFields(dataToFields(parsed.data));\n } catch { /* keep existing */ }\n } else {\n setJsonInput(fieldsToJson(formFields, schemaMetadata));\n }\n setIsJsonMode(!isJsonMode);\n };\n\n const updateFormField = (key: string, value: unknown, type: string) => {\n let parsed = value;\n if (type === 'number') parsed = value === '' ? 0 : Number(value);\n else if (type === 'boolean') parsed = value === 'true' || value === true;\n const updated = { ...formFields, [key]: parsed };\n setFormFields(updated);\n setJsonInput(fieldsToJson(updated, schemaMetadata));\n };\n\n const handleInvoke = async () => {\n setParseError('');\n let envelope: Record<string, unknown>;\n try {\n envelope = JSON.parse(jsonInput);\n } catch {\n setParseError('Invalid JSON');\n return;\n }\n const { data, metadata } = envelope;\n if (!data || typeof data !== 'object') {\n setParseError('Envelope must include a \"data\" object');\n return;\n }\n try {\n await invokeMutation.mutateAsync({\n workflowType: selected.workflow_type,\n data: data as Record<string, unknown>,\n metadata: (metadata as Record<string, unknown>) ?? undefined,\n ...(overrideBot ? { execute_as: overrideBot } : {}),\n });\n navigate(executionsPath);\n } catch { /* error via mutation */ }\n };\n\n return (\n <div className=\"space-y-6\">\n <div>\n <div className=\"flex items-center justify-between\">\n <SectionLabel>{selected.workflow_type}</SectionLabel>\n <div className=\"flex gap-2\">\n {selected.roles.map((r) => (\n <Pill key={r}>{r}</Pill>\n ))}\n </div>\n </div>\n {selected.description && (\n <p className=\"text-sm text-text-secondary mt-2 leading-relaxed\">\n {selected.description}\n </p>\n )}\n </div>\n\n <IdentitySummary\n config={selected}\n overrideBot={overrideBot}\n onOverrideChange={setOverrideBot}\n showOverride={isAdmin}\n />\n\n <EnvelopeEditor\n selectedConfig={selected}\n isJsonMode={isJsonMode}\n hasFormView={hasFormView}\n jsonInput={jsonInput}\n formFields={formFields}\n dataFields={dataFields}\n onJsonChange={(v) => { setJsonInput(v); setParseError(''); }}\n onToggleMode={handleToggleMode}\n onUpdateFormField={updateFormField}\n onSetFormFields={setFormFields}\n />\n\n {parseError && <p className=\"text-xs text-status-error\">{parseError}</p>}\n {invokeMutation.error && <p className=\"text-xs text-status-error\">{invokeMutation.error.message}</p>}\n {invokeMutation.isSuccess && <p className=\"text-xs text-status-success\">Workflow started</p>}\n\n <button onClick={handleInvoke} disabled={invokeMutation.isPending} className=\"btn-primary\">\n {invokeMutation.isPending ? 'Starting...' : 'Start Workflow'}\n </button>\n </div>\n );\n}\n\n// ── Page ────────────────────────────────────────────────────────────────────\n\nexport function StartWorkflowPage({ tier: _tier }: { tier?: InvokeTier }) {\n const [searchParams, setSearchParams] = useSearchParams();\n const { data: configsData, isLoading } = useWorkflowConfigs();\n const { data: discoveredData, isLoading: discoveredLoading } = useDiscoveredWorkflows();\n const { data: cronEntries } = useCronStatus();\n\n const mode = (searchParams.get('mode') as Mode) || 'now';\n const selectedType = searchParams.get('type') ?? '';\n\n const configs: LTWorkflowConfig[] = configsData ?? [];\n\n // Certified = has config with invocable: true\n const certifiedTypes = useMemo(\n () => new Set(configs.filter((c) => c.invocable).map((c) => c.workflow_type)),\n [configs],\n );\n\n // Build unified workflow list: certified configs + active durable workers\n const invocableConfigs = useMemo(() => {\n const certified = configs.filter((c) => c.invocable);\n const registeredTypes = new Set(configs.map((c) => c.workflow_type));\n const discovered = discoveredData ?? [];\n const durable = discovered\n .filter((dw) => dw.active && !registeredTypes.has(dw.workflow_type))\n .map((dw) => ({\n workflow_type: dw.workflow_type,\n task_queue: dw.task_queue ?? '',\n invocable: true,\n description: null,\n default_role: 'reviewer',\n roles: [],\n invocation_roles: [],\n consumes: [],\n envelope_schema: null,\n resolver_schema: null,\n cron_schedule: null,\n execute_as: null,\n } satisfies LTWorkflowConfig));\n return [...certified, ...durable];\n }, [configs, discoveredData]);\n\n const selectedConfig = invocableConfigs.find((c) => c.workflow_type === selectedType);\n\n const activeTypes = new Set(\n (cronEntries ?? []).filter((e) => e.active).map((e) => e.workflow_type),\n );\n\n const executionsPath = '/workflows/executions';\n\n // Auto-select first workflow if only one exists\n useEffect(() => {\n if (invocableConfigs.length === 1 && !searchParams.get('type')) {\n setSearchParams({ type: invocableConfigs[0].workflow_type, mode }, { replace: true });\n }\n }, [invocableConfigs.length]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const setMode = (m: Mode) => {\n const params: Record<string, string> = { mode: m };\n if (selectedType) params.type = selectedType;\n setSearchParams(params, { replace: true });\n };\n\n const handleSelect = (config: LTWorkflowConfig) => {\n setSearchParams({ type: config.workflow_type, mode }, { replace: true });\n };\n\n if (isLoading || discoveredLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-40 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n return (\n <div>\n <PageHeader\n title=\"Invoke Workflow\"\n actions={<ModeToggle mode={mode} onChange={setMode} />}\n />\n\n {invocableConfigs.length === 0 ? (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-primary mb-1\">No invocable workflows</p>\n <p className=\"text-xs text-text-tertiary\">Mark workflows as invocable in the registry, or start the server with examples enabled.</p>\n </div>\n ) : (\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-12\">\n <WorkflowSelector\n configs={invocableConfigs}\n selectedType={selectedType}\n onSelect={handleSelect}\n certifiedTypes={certifiedTypes}\n />\n\n <div className=\"lg:col-span-2\">\n {selectedType && selectedConfig ? (\n mode === 'now' ? (\n <StartNowPanel selected={selectedConfig} executionsPath={executionsPath} />\n ) : (\n <SchedulePanel selected={selectedConfig} activeTypes={activeTypes} />\n )\n ) : (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-tertiary\">\n Select a workflow to begin\n </p>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { StartWorkflowPage } from './StartWorkflowPage';\n\nexport function DurableInvokePage() {\n return <StartWorkflowPage tier=\"durable\" />;\n}\n"],"names":["Pill","children","className","DEFAULT_ENVELOPE","inferTypeFromValue","value","extractDataFields","schema","data","key","dataToFields","fieldsToJson","fields","metadata","CRON_DESCRIPTIONS","describeCron","expr","COMMON_PATTERNS","extractFormFields","envelope","entries","v","jobColumns","row","jsx","StatusBadge","TimeAgo","WorkflowSelector","configs","selectedType","onSelect","certifiedTypes","SectionLabel","config","isSelected","isCertified","jsxs","ShieldCheck","Workflow","Bot","EnvelopeEditor","selectedConfig","isJsonMode","hasFormView","jsonInput","formFields","dataFields","onJsonChange","onToggleMode","onUpdateFormField","onSetFormFields","Link","e","type","jsonValue","textareaRows","_b","_a","ModeToggle","mode","onChange","btn","m","icon","label","Play","Clock","IdentitySummary","overrideBot","onOverrideChange","showOverride","user","useAuth","effectiveBot","Fragment","UserCircle","BotPicker","SchedulePanel","selected","activeTypes","navigate","useNavigate","setCron","useSetCronSchedule","cronInput","setCronInput","useState","envelopeInput","setEnvelopeInput","envelopeError","setEnvelopeError","viewMode","setViewMode","defaultEnvelope","useMemo","isEnvelopeModified","parsedEnvelope","useEffect","jobsData","jobsLoading","useJobs","handleSave","envelopeSchema","handleClear","handleResetEnvelope","handleFormFieldChange","original","desc","DataTable","StartNowPanel","executionsPath","isSuperAdmin","hasRoleType","isAdmin","invokeMutation","useInvokeWorkflow","setJsonInput","parseError","setParseError","setFormFields","setIsJsonMode","setOverrideBot","schemaMetadata","md","prefill","parsed","json","handleToggleMode","updateFormField","updated","handleInvoke","StartWorkflowPage","_tier","searchParams","setSearchParams","useSearchParams","configsData","isLoading","useWorkflowConfigs","discoveredData","discoveredLoading","useDiscoveredWorkflows","cronEntries","useCronStatus","c","invocableConfigs","certified","registeredTypes","durable","dw","setMode","params","handleSelect","PageHeader","DurableInvokePage"],"mappings":"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"}
@@ -0,0 +1 @@
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}}
@@ -0,0 +1,2 @@
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
@@ -0,0 +1 @@
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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"}