@hotmeshio/long-tail 0.1.14 → 0.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. package/README.md +15 -0
  2. package/build/api/escalations/bulk.d.ts +78 -0
  3. package/build/api/escalations/bulk.js +279 -0
  4. package/build/api/escalations/claim.d.ts +30 -0
  5. package/build/api/escalations/claim.js +121 -0
  6. package/build/api/escalations/create.d.ts +29 -0
  7. package/build/api/escalations/create.js +101 -0
  8. package/build/api/escalations/helpers.d.ts +10 -0
  9. package/build/api/escalations/helpers.js +80 -0
  10. package/build/api/escalations/index.d.ts +6 -0
  11. package/build/api/escalations/index.js +26 -0
  12. package/build/api/escalations/list.d.ts +75 -0
  13. package/build/api/escalations/list.js +170 -0
  14. package/build/api/escalations/resolve.d.ts +18 -0
  15. package/build/api/escalations/resolve.js +243 -0
  16. package/build/api/escalations/single.d.ts +37 -0
  17. package/build/api/escalations/single.js +123 -0
  18. package/build/api/files.d.ts +3 -0
  19. package/build/api/files.js +18 -1
  20. package/build/api/knowledge.d.ts +36 -0
  21. package/build/api/knowledge.js +112 -0
  22. package/build/api/mcp/index.d.ts +2 -0
  23. package/build/api/mcp/index.js +16 -0
  24. package/build/api/{mcp.d.ts → mcp/servers.d.ts} +1 -33
  25. package/build/api/{mcp.js → mcp/servers.js} +4 -65
  26. package/build/api/mcp/tools.d.ts +33 -0
  27. package/build/api/mcp/tools.js +64 -0
  28. package/build/api/settings.js +9 -1
  29. package/build/api/workflows/config.d.ts +64 -0
  30. package/build/api/workflows/config.js +142 -0
  31. package/build/api/workflows/discovery.d.ts +29 -0
  32. package/build/api/workflows/discovery.js +153 -0
  33. package/build/api/workflows/index.d.ts +3 -0
  34. package/build/api/workflows/index.js +18 -0
  35. package/build/api/workflows/invocation.d.ts +67 -0
  36. package/build/api/workflows/invocation.js +188 -0
  37. package/build/api/yaml-workflows/cron.d.ts +39 -0
  38. package/build/api/yaml-workflows/cron.js +127 -0
  39. package/build/api/{yaml-workflows.d.ts → yaml-workflows/crud.d.ts} +22 -146
  40. package/build/api/{yaml-workflows.js → yaml-workflows/crud.js} +77 -378
  41. package/build/api/yaml-workflows/deploy.d.ts +71 -0
  42. package/build/api/yaml-workflows/deploy.js +223 -0
  43. package/build/api/yaml-workflows/helpers.d.ts +2 -0
  44. package/build/api/yaml-workflows/helpers.js +8 -0
  45. package/build/api/yaml-workflows/index.d.ts +4 -0
  46. package/build/api/yaml-workflows/index.js +27 -0
  47. package/build/api/yaml-workflows/versions.d.ts +43 -0
  48. package/build/api/yaml-workflows/versions.js +124 -0
  49. package/build/bin/ltc.d.ts +2 -0
  50. package/build/bin/ltc.js +220 -0
  51. package/build/examples/seed-data.d.ts +55 -0
  52. package/build/examples/seed-data.js +161 -0
  53. package/build/examples/seed.js +7 -164
  54. package/build/lib/cli/auth.d.ts +23 -0
  55. package/build/lib/cli/auth.js +167 -0
  56. package/build/lib/cli/client.d.ts +6 -0
  57. package/build/lib/cli/client.js +31 -0
  58. package/build/lib/cli/commands/escalations.d.ts +19 -0
  59. package/build/lib/cli/commands/escalations.js +69 -0
  60. package/build/lib/cli/commands/knowledge.d.ts +18 -0
  61. package/build/lib/cli/commands/knowledge.js +87 -0
  62. package/build/lib/cli/commands/mcp.d.ts +8 -0
  63. package/build/lib/cli/commands/mcp.js +33 -0
  64. package/build/lib/cli/commands/pipelines.d.ts +16 -0
  65. package/build/lib/cli/commands/pipelines.js +67 -0
  66. package/build/lib/cli/commands/status.d.ts +1 -0
  67. package/build/lib/cli/commands/status.js +28 -0
  68. package/build/lib/cli/commands/users.d.ts +7 -0
  69. package/build/lib/cli/commands/users.js +25 -0
  70. package/build/lib/cli/commands/workflows.d.ts +16 -0
  71. package/build/lib/cli/commands/workflows.js +104 -0
  72. package/build/lib/cli/compile.d.ts +2 -0
  73. package/build/lib/cli/compile.js +165 -0
  74. package/build/lib/cli/format.d.ts +23 -0
  75. package/build/lib/cli/format.js +94 -0
  76. package/build/lib/cli/init.d.ts +1 -0
  77. package/build/lib/cli/init.js +61 -0
  78. package/build/lib/cli/output.d.ts +27 -0
  79. package/build/lib/cli/output.js +126 -0
  80. package/build/lib/cli/scanner.d.ts +10 -0
  81. package/build/lib/cli/scanner.js +164 -0
  82. package/build/lib/cli/types.d.ts +16 -0
  83. package/build/lib/cli/types.js +2 -0
  84. package/build/lib/logger/index.d.ts +0 -9
  85. package/build/lib/logger/index.js +9 -4
  86. package/build/lib/storage/index.js +2 -2
  87. package/build/routes/file-browser.js +14 -0
  88. package/build/routes/index.js +2 -0
  89. package/build/routes/knowledge.d.ts +2 -0
  90. package/build/routes/knowledge.js +141 -0
  91. package/build/routes/yaml-workflows/crud.js +9 -0
  92. package/build/sdk/index.d.ts +17 -0
  93. package/build/sdk/index.js +19 -0
  94. package/build/services/mcp/client/connection-dispatch.d.ts +18 -0
  95. package/build/services/mcp/client/connection-dispatch.js +78 -0
  96. package/build/services/mcp/client/connection-lifecycle.d.ts +48 -0
  97. package/build/services/mcp/client/connection-lifecycle.js +296 -0
  98. package/build/services/mcp/client/connection-test.d.ts +10 -0
  99. package/build/services/mcp/client/connection-test.js +49 -0
  100. package/build/services/mcp/client/connection.d.ts +3 -68
  101. package/build/services/mcp/client/connection.js +15 -393
  102. package/build/services/mcp/server-lifecycle.d.ts +27 -0
  103. package/build/services/mcp/server-lifecycle.js +49 -0
  104. package/build/services/mcp/server-tools.d.ts +13 -0
  105. package/build/services/mcp/server-tools.js +287 -0
  106. package/build/services/mcp/server.d.ts +2 -26
  107. package/build/services/mcp/server.js +7 -315
  108. package/build/services/yaml-workflow/builder-regenerate.d.ts +25 -0
  109. package/build/services/yaml-workflow/builder-regenerate.js +111 -0
  110. package/build/services/yaml-workflow/db-versions.d.ts +17 -0
  111. package/build/services/yaml-workflow/db-versions.js +76 -0
  112. package/build/services/yaml-workflow/db.d.ts +3 -13
  113. package/build/services/yaml-workflow/db.js +15 -71
  114. package/build/services/yaml-workflow/deployer-helpers.js +48 -17
  115. package/build/services/yaml-workflow/durable-compiler/index.d.ts +22 -0
  116. package/build/services/yaml-workflow/durable-compiler/index.js +168 -0
  117. package/build/services/yaml-workflow/durable-compiler/parser.d.ts +12 -0
  118. package/build/services/yaml-workflow/durable-compiler/parser.js +110 -0
  119. package/build/services/yaml-workflow/durable-compiler/prompts.d.ts +18 -0
  120. package/build/services/yaml-workflow/durable-compiler/prompts.js +570 -0
  121. package/build/services/yaml-workflow/durable-compiler/types.d.ts +51 -0
  122. package/build/services/yaml-workflow/durable-compiler/types.js +5 -0
  123. package/build/services/yaml-workflow/pipeline/build/dag-assembly.d.ts +17 -0
  124. package/build/services/yaml-workflow/pipeline/build/dag-assembly.js +192 -0
  125. package/build/services/yaml-workflow/pipeline/build/dag.d.ts +4 -13
  126. package/build/services/yaml-workflow/pipeline/build/dag.js +9 -185
  127. package/build/services/yaml-workflow/pipeline/prompt-templates.d.ts +10 -0
  128. package/build/services/yaml-workflow/pipeline/prompt-templates.js +270 -0
  129. package/build/services/yaml-workflow/pipeline/prompts.d.ts +3 -6
  130. package/build/services/yaml-workflow/pipeline/prompts.js +8 -263
  131. package/build/start/workers.js +6 -5
  132. package/build/system/activities/file-storage.d.ts +4 -0
  133. package/build/system/activities/file-storage.js +7 -1
  134. package/build/system/activities/knowledge.d.ts +23 -0
  135. package/build/system/activities/knowledge.js +50 -10
  136. package/build/system/activities/sql.d.ts +3 -0
  137. package/build/system/activities/sql.js +25 -1
  138. package/build/system/mcp-servers/file-storage.js +3 -1
  139. package/build/system/mcp-servers/human-queue-schemas.d.ts +91 -0
  140. package/build/system/mcp-servers/human-queue-schemas.js +42 -0
  141. package/build/system/mcp-servers/human-queue.d.ts +2 -6
  142. package/build/system/mcp-servers/human-queue.js +9 -51
  143. package/build/system/mcp-servers/knowledge.js +43 -9
  144. package/build/system/mcp-servers/workflow-compiler.js +54 -0
  145. package/build/system/workflows/mcp-triage/activities-proxy.d.ts +21 -0
  146. package/build/system/workflows/mcp-triage/activities-proxy.js +70 -0
  147. package/build/system/workflows/mcp-triage/index.js +17 -75
  148. package/build/system/workflows/mcp-workflow-planner/activities/persist.d.ts +1 -0
  149. package/build/system/workflows/mcp-workflow-planner/activities/persist.js +1 -0
  150. package/build/system/workflows/mcp-workflow-planner/index.js +2 -0
  151. package/build/tsconfig.tsbuildinfo +1 -1
  152. package/dashboard/dist/assets/{AdminDashboard-Cngijp4Q.js → AdminDashboard-NLryl1_B.js} +2 -2
  153. package/dashboard/dist/assets/{AdminDashboard-Cngijp4Q.js.map → AdminDashboard-NLryl1_B.js.map} +1 -1
  154. package/dashboard/dist/assets/AvailableEscalationsPage-6vexlrk3.js +2 -0
  155. package/dashboard/dist/assets/AvailableEscalationsPage-6vexlrk3.js.map +1 -0
  156. package/dashboard/dist/assets/{BotPicker-B8Uvw9Si.js → BotPicker-DWhn0tr1.js} +2 -2
  157. package/dashboard/dist/assets/{BotPicker-B8Uvw9Si.js.map → BotPicker-DWhn0tr1.js.map} +1 -1
  158. package/dashboard/dist/assets/{CollapsibleSection-DiFPuWOY.js → CollapsibleSection-CgYgQiOc.js} +2 -2
  159. package/dashboard/dist/assets/{CollapsibleSection-DiFPuWOY.js.map → CollapsibleSection-CgYgQiOc.js.map} +1 -1
  160. package/dashboard/dist/assets/{ConfirmDeleteModal-CpXG9uyu.js → ConfirmDeleteModal-DCKAPXD3.js} +2 -2
  161. package/dashboard/dist/assets/{ConfirmDeleteModal-CpXG9uyu.js.map → ConfirmDeleteModal-DCKAPXD3.js.map} +1 -1
  162. package/dashboard/dist/assets/{CopyableId-DKsTR9lK.js → CopyableId-DXkaAOYk.js} +2 -2
  163. package/dashboard/dist/assets/{CopyableId-DKsTR9lK.js.map → CopyableId-DXkaAOYk.js.map} +1 -1
  164. package/dashboard/dist/assets/{CredentialsPage-DlS7Kf40.js → CredentialsPage-B361BOfU.js} +2 -2
  165. package/dashboard/dist/assets/{CredentialsPage-DlS7Kf40.js.map → CredentialsPage-B361BOfU.js.map} +1 -1
  166. package/dashboard/dist/assets/{CustomDurationPicker-B-9eW3pm.js → CustomDurationPicker-D2G1ldiF.js} +2 -2
  167. package/dashboard/dist/assets/{CustomDurationPicker-B-9eW3pm.js.map → CustomDurationPicker-D2G1ldiF.js.map} +1 -1
  168. package/dashboard/dist/assets/{DataTable-DkOokbtL.js → DataTable-DXSUbA26.js} +2 -2
  169. package/dashboard/dist/assets/{DataTable-DkOokbtL.js.map → DataTable-DXSUbA26.js.map} +1 -1
  170. package/dashboard/dist/assets/{ElapsedCell-DVtHqM-5.js → ElapsedCell-CQGqkXP_.js} +2 -2
  171. package/dashboard/dist/assets/{ElapsedCell-DVtHqM-5.js.map → ElapsedCell-CQGqkXP_.js.map} +1 -1
  172. package/dashboard/dist/assets/{EmptyState-C7KIMIbE.js → EmptyState-Dep92Wkg.js} +2 -2
  173. package/dashboard/dist/assets/{EmptyState-C7KIMIbE.js.map → EmptyState-Dep92Wkg.js.map} +1 -1
  174. package/dashboard/dist/assets/{EscalationsOverview-BMKBlkPx.js → EscalationsOverview-DVEFVjs7.js} +2 -2
  175. package/dashboard/dist/assets/{EscalationsOverview-BMKBlkPx.js.map → EscalationsOverview-DVEFVjs7.js.map} +1 -1
  176. package/dashboard/dist/assets/{EventTable-BYZ5OVdQ.js → EventTable-BMJAPkMi.js} +2 -2
  177. package/dashboard/dist/assets/{EventTable-BYZ5OVdQ.js.map → EventTable-BMJAPkMi.js.map} +1 -1
  178. package/dashboard/dist/assets/{FilterBar-C5r3n6YO.js → FilterBar-DbVbCzH2.js} +2 -2
  179. package/dashboard/dist/assets/{FilterBar-C5r3n6YO.js.map → FilterBar-DbVbCzH2.js.map} +1 -1
  180. package/dashboard/dist/assets/{ListToolbar-BGUajIsW.js → ListToolbar-0XNuXj0M.js} +2 -2
  181. package/dashboard/dist/assets/{ListToolbar-BGUajIsW.js.map → ListToolbar-0XNuXj0M.js.map} +1 -1
  182. package/dashboard/dist/assets/{McpOverview-B_kJYHea.js → McpOverview-CeYnCzBN.js} +2 -2
  183. package/dashboard/dist/assets/{McpOverview-B_kJYHea.js.map → McpOverview-CeYnCzBN.js.map} +1 -1
  184. package/dashboard/dist/assets/McpQueryDetailPage-t3qW3QNa.js +5 -0
  185. package/dashboard/dist/assets/McpQueryDetailPage-t3qW3QNa.js.map +1 -0
  186. package/dashboard/dist/assets/{McpQueryPage-BgAq_bQg.js → McpQueryPage-CfUcdzaj.js} +2 -2
  187. package/dashboard/dist/assets/{McpQueryPage-BgAq_bQg.js.map → McpQueryPage-CfUcdzaj.js.map} +1 -1
  188. package/dashboard/dist/assets/{McpRunDetailPage-B8c0OszR.js → McpRunDetailPage-CZtodW_Z.js} +2 -2
  189. package/dashboard/dist/assets/{McpRunDetailPage-B8c0OszR.js.map → McpRunDetailPage-CZtodW_Z.js.map} +1 -1
  190. package/dashboard/dist/assets/{McpRunsPage-BY8C6k78.js → McpRunsPage-Dzgq7HGt.js} +2 -2
  191. package/dashboard/dist/assets/{McpRunsPage-BY8C6k78.js.map → McpRunsPage-Dzgq7HGt.js.map} +1 -1
  192. package/dashboard/dist/assets/{Modal-E1yRnCeW.js → Modal-yyhUeKoA.js} +2 -2
  193. package/dashboard/dist/assets/{Modal-E1yRnCeW.js.map → Modal-yyhUeKoA.js.map} +1 -1
  194. package/dashboard/dist/assets/{OperatorDashboard-C8MSTzey.js → OperatorDashboard-Ceh7OQtZ.js} +2 -2
  195. package/dashboard/dist/assets/{OperatorDashboard-C8MSTzey.js.map → OperatorDashboard-Ceh7OQtZ.js.map} +1 -1
  196. package/dashboard/dist/assets/{PageHeader-Cm5HBQF_.js → PageHeader-CZ9a8cpr.js} +2 -2
  197. package/dashboard/dist/assets/{PageHeader-Cm5HBQF_.js.map → PageHeader-CZ9a8cpr.js.map} +1 -1
  198. package/dashboard/dist/assets/{PageHeaderWithStats-CNmWJFSN.js → PageHeaderWithStats-BJuNs5NM.js} +2 -2
  199. package/dashboard/dist/assets/{PageHeaderWithStats-CNmWJFSN.js.map → PageHeaderWithStats-BJuNs5NM.js.map} +1 -1
  200. package/dashboard/dist/assets/{PriorityBadge-HSI4RVhs.js → PriorityBadge-BrPikMFy.js} +2 -2
  201. package/dashboard/dist/assets/{PriorityBadge-HSI4RVhs.js.map → PriorityBadge-BrPikMFy.js.map} +1 -1
  202. package/dashboard/dist/assets/{ProcessDetailPage-Dln8622H.js → ProcessDetailPage-2miaYd8G.js} +2 -2
  203. package/dashboard/dist/assets/{ProcessDetailPage-Dln8622H.js.map → ProcessDetailPage-2miaYd8G.js.map} +1 -1
  204. package/dashboard/dist/assets/{ProcessesListPage-bIsd9N_h.js → ProcessesListPage-DqpRDqjk.js} +2 -2
  205. package/dashboard/dist/assets/{ProcessesListPage-bIsd9N_h.js.map → ProcessesListPage-DqpRDqjk.js.map} +1 -1
  206. package/dashboard/dist/assets/{RolePill-BVUp2bF0.js → RolePill-DxbJMfJu.js} +2 -2
  207. package/dashboard/dist/assets/{RolePill-BVUp2bF0.js.map → RolePill-DxbJMfJu.js.map} +1 -1
  208. package/dashboard/dist/assets/RolesPage-CYHRo21-.js +2 -0
  209. package/dashboard/dist/assets/{RolesPage-kH-Njt25.js.map → RolesPage-CYHRo21-.js.map} +1 -1
  210. package/dashboard/dist/assets/{RowActions-DbUJPfaW.js → RowActions-DurFwIwe.js} +2 -2
  211. package/dashboard/dist/assets/{RowActions-DbUJPfaW.js.map → RowActions-DurFwIwe.js.map} +1 -1
  212. package/dashboard/dist/assets/RunAsSelector-CNKraP6u.js +2 -0
  213. package/dashboard/dist/assets/RunAsSelector-CNKraP6u.js.map +1 -0
  214. package/dashboard/dist/assets/{StatCard-Bs3JbyAz.js → StatCard-CKplpK3w.js} +2 -2
  215. package/dashboard/dist/assets/{StatCard-Bs3JbyAz.js.map → StatCard-CKplpK3w.js.map} +1 -1
  216. package/dashboard/dist/assets/{StatusBadge-CakDdsCw.js → StatusBadge-Dm0V1dNN.js} +2 -2
  217. package/dashboard/dist/assets/{StatusBadge-CakDdsCw.js.map → StatusBadge-Dm0V1dNN.js.map} +1 -1
  218. package/dashboard/dist/assets/{StepIndicator-Cd_SG_yA.js → StepIndicator-Dicx0WTZ.js} +2 -2
  219. package/dashboard/dist/assets/{StepIndicator-Cd_SG_yA.js.map → StepIndicator-Dicx0WTZ.js.map} +1 -1
  220. package/dashboard/dist/assets/{StickyPagination-Bz0C18nC.js → StickyPagination-B2jYvU3-.js} +2 -2
  221. package/dashboard/dist/assets/{StickyPagination-Bz0C18nC.js.map → StickyPagination-B2jYvU3-.js.map} +1 -1
  222. package/dashboard/dist/assets/SwimlaneTimeline-ClwumkT1.js +2 -0
  223. package/dashboard/dist/assets/SwimlaneTimeline-ClwumkT1.js.map +1 -0
  224. package/dashboard/dist/assets/{TagInput-ClFhXG-U.js → TagInput-CypDZ6Kl.js} +2 -2
  225. package/dashboard/dist/assets/{TagInput-ClFhXG-U.js.map → TagInput-CypDZ6Kl.js.map} +1 -1
  226. package/dashboard/dist/assets/{TaskDetailPage-SuMBdARt.js → TaskDetailPage-DooDNJGT.js} +2 -2
  227. package/dashboard/dist/assets/{TaskDetailPage-SuMBdARt.js.map → TaskDetailPage-DooDNJGT.js.map} +1 -1
  228. package/dashboard/dist/assets/{TaskQueuePill-lJR1JW_W.js → TaskQueuePill-C1hZ-j31.js} +2 -2
  229. package/dashboard/dist/assets/{TaskQueuePill-lJR1JW_W.js.map → TaskQueuePill-C1hZ-j31.js.map} +1 -1
  230. package/dashboard/dist/assets/{TasksListPage-Dkq1Vtbt.js → TasksListPage-D7CdkAeg.js} +2 -2
  231. package/dashboard/dist/assets/{TasksListPage-Dkq1Vtbt.js.map → TasksListPage-D7CdkAeg.js.map} +1 -1
  232. package/dashboard/dist/assets/{TimeAgo-DgfDZ1pl.js → TimeAgo-B5LXB2aj.js} +2 -2
  233. package/dashboard/dist/assets/{TimeAgo-DgfDZ1pl.js.map → TimeAgo-B5LXB2aj.js.map} +1 -1
  234. package/dashboard/dist/assets/{TimestampCell-MpHZ1hMD.js → TimestampCell-Crb9b0Gw.js} +2 -2
  235. package/dashboard/dist/assets/{TimestampCell-MpHZ1hMD.js.map → TimestampCell-Crb9b0Gw.js.map} +1 -1
  236. package/dashboard/dist/assets/{UserName-DqsosA4B.js → UserName-OPg-nkRa.js} +2 -2
  237. package/dashboard/dist/assets/{UserName-DqsosA4B.js.map → UserName-OPg-nkRa.js.map} +1 -1
  238. package/dashboard/dist/assets/{WorkflowExecutionPage-CVlg38C3.js → WorkflowExecutionPage-CcLVrs9b.js} +2 -2
  239. package/dashboard/dist/assets/{WorkflowExecutionPage-CVlg38C3.js.map → WorkflowExecutionPage-CcLVrs9b.js.map} +1 -1
  240. package/dashboard/dist/assets/{WorkflowPill-CRpZhjGR.js → WorkflowPill-CCV4MMj7.js} +2 -2
  241. package/dashboard/dist/assets/{WorkflowPill-CRpZhjGR.js.map → WorkflowPill-CCV4MMj7.js.map} +1 -1
  242. package/dashboard/dist/assets/{WorkflowsDashboard-Ugzbs8mV.js → WorkflowsDashboard-DB1SncBi.js} +2 -2
  243. package/dashboard/dist/assets/{WorkflowsDashboard-Ugzbs8mV.js.map → WorkflowsDashboard-DB1SncBi.js.map} +1 -1
  244. package/dashboard/dist/assets/{WorkflowsOverview-CIp_lTNl.js → WorkflowsOverview-DvShiYJV.js} +2 -2
  245. package/dashboard/dist/assets/{WorkflowsOverview-CIp_lTNl.js.map → WorkflowsOverview-DvShiYJV.js.map} +1 -1
  246. package/dashboard/dist/assets/YamlWorkflowsPage-DCBoMeGI.js +2 -0
  247. package/dashboard/dist/assets/YamlWorkflowsPage-DCBoMeGI.js.map +1 -0
  248. package/dashboard/dist/assets/{bots-DPfUpVqI.js → bots-Dqos20NE.js} +2 -2
  249. package/dashboard/dist/assets/{bots-DPfUpVqI.js.map → bots-Dqos20NE.js.map} +1 -1
  250. package/dashboard/dist/assets/{escalation-RrCDbMC3.js → escalation-A0CsbvNV.js} +2 -2
  251. package/dashboard/dist/assets/{escalation-RrCDbMC3.js.map → escalation-A0CsbvNV.js.map} +1 -1
  252. package/dashboard/dist/assets/{escalation-columns-CDGa9wsD.js → escalation-columns-BpBJN6k4.js} +2 -2
  253. package/dashboard/dist/assets/{escalation-columns-CDGa9wsD.js.map → escalation-columns-BpBJN6k4.js.map} +1 -1
  254. package/dashboard/dist/assets/{helpers-ZSKqdkdS.js → helpers-CmznCuAx.js} +2 -2
  255. package/dashboard/dist/assets/{helpers-ZSKqdkdS.js.map → helpers-CmznCuAx.js.map} +1 -1
  256. package/dashboard/dist/assets/index-BIeYV5QK.js +2 -0
  257. package/dashboard/dist/assets/index-BIeYV5QK.js.map +1 -0
  258. package/dashboard/dist/assets/index-BYwD3kHN.js +5 -0
  259. package/dashboard/dist/assets/index-BYwD3kHN.js.map +1 -0
  260. package/dashboard/dist/assets/index-C5TUqJu0.css +1 -0
  261. package/dashboard/dist/assets/{index-DX6zxr6t.js → index-C8-UaN4N.js} +2 -2
  262. package/dashboard/dist/assets/{index-DX6zxr6t.js.map → index-C8-UaN4N.js.map} +1 -1
  263. package/dashboard/dist/assets/index-CAj5LT9H.js +15 -0
  264. package/dashboard/dist/assets/index-CAj5LT9H.js.map +1 -0
  265. package/dashboard/dist/assets/index-CjxHCVxl.js +2 -0
  266. package/dashboard/dist/assets/{index-C90ZPzXk.js.map → index-CjxHCVxl.js.map} +1 -1
  267. package/dashboard/dist/assets/index-Cr0Rqsj7.js +2 -0
  268. package/dashboard/dist/assets/index-Cr0Rqsj7.js.map +1 -0
  269. package/dashboard/dist/assets/index-DZHNte4o.js +2 -0
  270. package/dashboard/dist/assets/{index-K40Qw1tk.js.map → index-DZHNte4o.js.map} +1 -1
  271. package/dashboard/dist/assets/{index-DNytWfSZ.js → index-VnYkWW8r.js} +2 -2
  272. package/dashboard/dist/assets/{index-DNytWfSZ.js.map → index-VnYkWW8r.js.map} +1 -1
  273. package/dashboard/dist/assets/{index-BbI2dzhJ.js → index-XGOmZ117.js} +2 -2
  274. package/dashboard/dist/assets/{index-BbI2dzhJ.js.map → index-XGOmZ117.js.map} +1 -1
  275. package/dashboard/dist/assets/index-ZjOUzWhc.js +2 -0
  276. package/dashboard/dist/assets/index-ZjOUzWhc.js.map +1 -0
  277. package/dashboard/dist/assets/{index-Cmgrk7PQ.js → index-puKKZ5l8.js} +71 -71
  278. package/dashboard/dist/assets/index-puKKZ5l8.js.map +1 -0
  279. package/dashboard/dist/assets/{index-BmVCyB6C.js → index-t5frSddy.js} +2 -2
  280. package/dashboard/dist/assets/{index-BmVCyB6C.js.map → index-t5frSddy.js.map} +1 -1
  281. package/dashboard/dist/assets/{mcp-CNE44TSp.js → mcp-DrWymhSu.js} +2 -2
  282. package/dashboard/dist/assets/{mcp-CNE44TSp.js.map → mcp-DrWymhSu.js.map} +1 -1
  283. package/dashboard/dist/assets/{mcp-query-RQX0uN-5.js → mcp-query-BhUxVEMS.js} +2 -2
  284. package/dashboard/dist/assets/{mcp-query-RQX0uN-5.js.map → mcp-query-BhUxVEMS.js.map} +1 -1
  285. package/dashboard/dist/assets/{mcp-runs-0w40bdz-.js → mcp-runs-DUfz4mLd.js} +2 -2
  286. package/dashboard/dist/assets/{mcp-runs-0w40bdz-.js.map → mcp-runs-DUfz4mLd.js.map} +1 -1
  287. package/dashboard/dist/assets/{namespaces-BbmdXuPp.js → namespaces-Cm6AY5sh.js} +2 -2
  288. package/dashboard/dist/assets/{namespaces-BbmdXuPp.js.map → namespaces-Cm6AY5sh.js.map} +1 -1
  289. package/dashboard/dist/assets/{roles-DoHYlhWH.js → roles-2v1Kc7BJ.js} +2 -2
  290. package/dashboard/dist/assets/{roles-DoHYlhWH.js.map → roles-2v1Kc7BJ.js.map} +1 -1
  291. package/dashboard/dist/assets/{settings-BAiJiCHS.js → settings-DTQNp6tH.js} +2 -2
  292. package/dashboard/dist/assets/{settings-BAiJiCHS.js.map → settings-DTQNp6tH.js.map} +1 -1
  293. package/dashboard/dist/assets/{tasks-CvroqHtm.js → tasks-CS1rgG1s.js} +2 -2
  294. package/dashboard/dist/assets/{tasks-CvroqHtm.js.map → tasks-CS1rgG1s.js.map} +1 -1
  295. package/dashboard/dist/assets/useEventHooks-BjXX8x3a.js +2 -0
  296. package/dashboard/dist/assets/{useEventHooks-BHMbzR_y.js.map → useEventHooks-BjXX8x3a.js.map} +1 -1
  297. package/dashboard/dist/assets/useYamlActivityEvents-BeR-nVWQ.js +2 -0
  298. package/dashboard/dist/assets/{useYamlActivityEvents-D56KV14X.js.map → useYamlActivityEvents-BeR-nVWQ.js.map} +1 -1
  299. package/dashboard/dist/assets/{users-CxIMy_xw.js → users-DYsdQ7Md.js} +2 -2
  300. package/dashboard/dist/assets/{users-CxIMy_xw.js.map → users-DYsdQ7Md.js.map} +1 -1
  301. package/dashboard/dist/assets/{vendor-icons-AFGxSeQS.js → vendor-icons-CWl44VA6.js} +77 -77
  302. package/dashboard/dist/assets/vendor-icons-CWl44VA6.js.map +1 -0
  303. package/dashboard/dist/assets/{workflows-yR9yais7.js → workflows-2QAXh3UD.js} +2 -2
  304. package/dashboard/dist/assets/{workflows-yR9yais7.js.map → workflows-2QAXh3UD.js.map} +1 -1
  305. package/dashboard/dist/assets/{yaml-workflows-QVF2MZ0l.js → yaml-workflows-sx8-UEE3.js} +2 -2
  306. package/dashboard/dist/assets/{yaml-workflows-QVF2MZ0l.js.map → yaml-workflows-sx8-UEE3.js.map} +1 -1
  307. package/dashboard/dist/index.html +3 -3
  308. package/docs/api/http/file-browser.md +101 -0
  309. package/docs/api/http/knowledge.md +203 -0
  310. package/docs/api/http/settings.md +6 -4
  311. package/docs/api/sdk/files.md +68 -0
  312. package/docs/api/sdk/knowledge.md +126 -0
  313. package/docs/api/sdk/settings.md +3 -2
  314. package/docs/cli.md +171 -0
  315. package/docs/compilation.md +16 -0
  316. package/docs/compiler.md +311 -0
  317. package/docs/events.md +19 -0
  318. package/docs/workflows.md +19 -0
  319. package/package.json +13 -2
  320. package/build/api/escalations.d.ts +0 -271
  321. package/build/api/escalations.js +0 -932
  322. package/build/api/workflows.d.ts +0 -158
  323. package/build/api/workflows.js +0 -414
  324. package/dashboard/dist/assets/AvailableEscalationsPage-CpBfGV1h.js +0 -2
  325. package/dashboard/dist/assets/AvailableEscalationsPage-CpBfGV1h.js.map +0 -1
  326. package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js +0 -5
  327. package/dashboard/dist/assets/McpQueryDetailPage-Czsmovqw.js.map +0 -1
  328. package/dashboard/dist/assets/RolesPage-kH-Njt25.js +0 -2
  329. package/dashboard/dist/assets/SwimlaneTimeline-Cfe-xQRX.js +0 -2
  330. package/dashboard/dist/assets/SwimlaneTimeline-Cfe-xQRX.js.map +0 -1
  331. package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js +0 -2
  332. package/dashboard/dist/assets/YamlWorkflowsPage-BICF0fRO.js.map +0 -1
  333. package/dashboard/dist/assets/helpers-rMEcLwKs.js +0 -2
  334. package/dashboard/dist/assets/helpers-rMEcLwKs.js.map +0 -1
  335. package/dashboard/dist/assets/index-ABcJHHlN.js +0 -5
  336. package/dashboard/dist/assets/index-ABcJHHlN.js.map +0 -1
  337. package/dashboard/dist/assets/index-B91h_jZ0.js +0 -15
  338. package/dashboard/dist/assets/index-B91h_jZ0.js.map +0 -1
  339. package/dashboard/dist/assets/index-C1E5GTs9.js +0 -2
  340. package/dashboard/dist/assets/index-C1E5GTs9.js.map +0 -1
  341. package/dashboard/dist/assets/index-C90ZPzXk.js +0 -2
  342. package/dashboard/dist/assets/index-Cmgrk7PQ.js.map +0 -1
  343. package/dashboard/dist/assets/index-DeX-ezqf.css +0 -1
  344. package/dashboard/dist/assets/index-K40Qw1tk.js +0 -2
  345. package/dashboard/dist/assets/index-lCyNr5Xk.js +0 -2
  346. package/dashboard/dist/assets/index-lCyNr5Xk.js.map +0 -1
  347. package/dashboard/dist/assets/useEventHooks-BHMbzR_y.js +0 -2
  348. package/dashboard/dist/assets/useYamlActivityEvents-D56KV14X.js +0 -2
  349. package/dashboard/dist/assets/vendor-icons-AFGxSeQS.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"RolesPage-kH-Njt25.js","sources":["../../src/pages/admin/roles/CreateRoleModal.tsx","../../src/pages/admin/roles/EscalationPanel.tsx","../../src/pages/admin/roles/RoleColumns.tsx","../../src/pages/admin/roles/RolesPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useCreateRole } from '../../../api/roles';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateRoleModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createRole = useCreateRole();\n const [roleName, setRoleName] = useState('');\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) {\n setRoleName('');\n createRole.reset();\n }\n }\n\n const handleCreate = () => {\n const trimmed = roleName.trim().toLowerCase();\n if (!trimmed) return;\n createRole.mutate(trimmed, { onSuccess: onClose });\n };\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Role\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Role Name (required)\n </label>\n <input\n type=\"text\"\n value={roleName}\n onChange={(e) => setRoleName(e.target.value)}\n placeholder=\"e.g., reviewer\"\n className=\"input text-xs w-full\"\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleCreate();\n }}\n />\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n Lowercase letters, numbers, hyphens, and underscores only.\n </p>\n </div>\n\n {createRole.error && (\n <p className=\"text-xs text-status-error\">{(createRole.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!roleName.trim() || createRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {createRole.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useMemo } from 'react';\nimport {\n useEscalationChains,\n useAddEscalationChain,\n useRemoveEscalationChain,\n} from '../../../api/roles';\n\nexport function EscalationPanel({\n selectedRole,\n allRoles,\n}: {\n selectedRole: string | null;\n allRoles: string[];\n}) {\n const { data: chainsData } = useEscalationChains();\n const addChain = useAddEscalationChain();\n const removeChain = useRemoveEscalationChain();\n const [newTarget, setNewTarget] = useState('');\n\n const chains = chainsData?.chains ?? [];\n\n const targets = useMemo(() => {\n if (!selectedRole) return [];\n return chains.filter((c) => c.source_role === selectedRole).map((c) => c.target_role);\n }, [chains, selectedRole]);\n\n const available = useMemo(() => {\n if (!selectedRole) return [];\n return allRoles.filter((r) => r !== selectedRole && r !== 'superadmin' && !targets.includes(r));\n }, [allRoles, selectedRole, targets]);\n\n const handleAdd = () => {\n if (!selectedRole || !newTarget.trim()) return;\n addChain.mutate(\n { source_role: selectedRole, target_role: newTarget.trim() },\n { onSuccess: () => setNewTarget('') },\n );\n };\n\n const handleRemove = (target: string) => {\n if (!selectedRole) return;\n removeChain.mutate({ source_role: selectedRole, target_role: target });\n };\n\n const isSuperAdmin = selectedRole === 'superadmin';\n\n return (\n <div className=\"border-l border-surface-border pl-6 min-h-[300px]\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4\">\n Escalation Routing\n </p>\n\n {!selectedRole ? (\n <p className=\"text-xs text-text-tertiary\">\n Select a role to manage its escalation targets.\n </p>\n ) : isSuperAdmin ? (\n <div>\n <p className=\"text-sm font-mono text-text-primary mb-2\">{selectedRole}</p>\n <p className=\"text-xs text-text-tertiary\">\n Superadmins can escalate to any role implicitly.\n </p>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-sm font-mono text-text-primary\">{selectedRole}</p>\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">Can escalate to:</p>\n </div>\n\n {targets.length === 0 ? (\n <p className=\"text-xs text-text-tertiary\">\n No escalation targets configured.\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-2\">\n {targets.map((target) => (\n <span\n key={target}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary font-mono\"\n >\n {target}\n <button\n onClick={() => handleRemove(target)}\n className=\"text-text-tertiary hover:text-status-error transition-colors\"\n title={`Remove ${target}`}\n >\n &times;\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"pt-3 border-t border-surface-border\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n Add Target\n </p>\n <div className=\"flex items-center gap-2\">\n <select\n value={newTarget}\n onChange={(e) => setNewTarget(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <button\n onClick={handleAdd}\n disabled={!newTarget || addChain.isPending}\n className=\"btn-primary text-xs\"\n >\n {addChain.isPending ? 'Adding...' : 'Add'}\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { Trash2 } from 'lucide-react';\nimport { type RoleDetail } from '../../../api/roles';\nimport { type Column } from '../../../components/common/data/DataTable';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\n\nexport function getRoleColumns(\n onDelete: (row: RoleDetail) => void,\n): Column<RoleDetail>[] {\n return [\n {\n key: 'role',\n label: 'Role',\n render: (row) => <RolePill role={row.role} />,\n },\n {\n key: 'user_count',\n label: 'Users',\n render: (row) =>\n row.user_count > 0\n ? <span className=\"text-text-primary\">{row.user_count}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-24 text-right',\n },\n {\n key: 'chain_count',\n label: 'Escalations',\n render: (row) =>\n row.chain_count > 0\n ? <span className=\"text-text-primary\">{row.chain_count}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-28 text-right',\n },\n {\n key: 'workflow_count',\n label: 'Workflows',\n render: (row) =>\n row.workflow_count > 0\n ? <span className=\"text-text-primary\">{row.workflow_count}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-28 text-right',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => {\n const inUse = row.user_count > 0 || row.chain_count > 0 || row.workflow_count > 0;\n if (inUse) return null;\n return (\n <RowActionGroup>\n <RowAction\n icon={Trash2}\n title=\"Delete role\"\n onClick={() => onDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n );\n },\n className: 'w-16 text-right',\n },\n ];\n}\n","import { useState, useMemo } from 'react';\nimport { useRoleDetails, useDeleteRole, type RoleDetail } from '../../../api/roles';\nimport { DataTable } from '../../../components/common/data/DataTable';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { CreateRoleModal } from './CreateRoleModal';\nimport { EscalationPanel } from './EscalationPanel';\nimport { getRoleColumns } from './RoleColumns';\n\nexport function RolesPage() {\n const { data, isLoading } = useRoleDetails();\n const deleteRole = useDeleteRole();\n\n const [showCreate, setShowCreate] = useState(false);\n const [confirmDelete, setConfirmDelete] = useState<RoleDetail | null>(null);\n const [selectedRole, setSelectedRole] = useState<string | null>(null);\n\n const roles = data?.roles ?? [];\n const allRoleNames = useMemo(() => roles.map((r) => r.role), [roles]);\n\n const columns = getRoleColumns((row) => setConfirmDelete(row));\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteRole.mutate(confirmDelete.role, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n return (\n <div>\n <PageHeader\n title=\"Roles\"\n actions={\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Role\n </button>\n }\n />\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6\">\n <div>\n <DataTable\n columns={columns}\n data={roles}\n keyFn={(row) => row.role}\n isLoading={isLoading}\n emptyMessage=\"No roles found\"\n onRowClick={(row) => setSelectedRole(row.role)}\n activeRowKey={selectedRole}\n />\n </div>\n\n <EscalationPanel selectedRole={selectedRole} allRoles={allRoleNames} />\n </div>\n\n <CreateRoleModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete Role\"\n description={\n <>\n Delete role{' '}\n <span className=\"font-medium font-mono text-text-primary\">\n {confirmDelete?.role}\n </span>\n ? This action cannot be undone.\n </>\n }\n isPending={deleteRole.isPending}\n error={deleteRole.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["CreateRoleModal","open","onClose","createRole","useCreateRole","roleName","setRoleName","useState","prevOpen","setPrevOpen","handleCreate","trimmed","jsxDEV","Modal","e","EscalationPanel","selectedRole","allRoles","chainsData","useEscalationChains","addChain","useAddEscalationChain","removeChain","useRemoveEscalationChain","newTarget","setNewTarget","chains","targets","useMemo","c","available","r","handleAdd","handleRemove","target","isSuperAdmin","getRoleColumns","onDelete","row","RolePill","RowActionGroup","RowAction","Trash2","RolesPage","data","isLoading","useRoleDetails","deleteRole","useDeleteRole","showCreate","setShowCreate","confirmDelete","setConfirmDelete","setSelectedRole","roles","allRoleNames","columns","handleDelete","PageHeader","DataTable","ConfirmDeleteModal","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"RolesPage-CYHRo21-.js","sources":["../../src/pages/admin/roles/CreateRoleModal.tsx","../../src/pages/admin/roles/EscalationPanel.tsx","../../src/pages/admin/roles/RoleColumns.tsx","../../src/pages/admin/roles/RolesPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useCreateRole } from '../../../api/roles';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateRoleModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createRole = useCreateRole();\n const [roleName, setRoleName] = useState('');\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) {\n setRoleName('');\n createRole.reset();\n }\n }\n\n const handleCreate = () => {\n const trimmed = roleName.trim().toLowerCase();\n if (!trimmed) return;\n createRole.mutate(trimmed, { onSuccess: onClose });\n };\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Role\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Role Name (required)\n </label>\n <input\n type=\"text\"\n value={roleName}\n onChange={(e) => setRoleName(e.target.value)}\n placeholder=\"e.g., reviewer\"\n className=\"input text-xs w-full\"\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleCreate();\n }}\n />\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n Lowercase letters, numbers, hyphens, and underscores only.\n </p>\n </div>\n\n {createRole.error && (\n <p className=\"text-xs text-status-error\">{(createRole.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!roleName.trim() || createRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {createRole.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useMemo } from 'react';\nimport {\n useEscalationChains,\n useAddEscalationChain,\n useRemoveEscalationChain,\n} from '../../../api/roles';\n\nexport function EscalationPanel({\n selectedRole,\n allRoles,\n}: {\n selectedRole: string | null;\n allRoles: string[];\n}) {\n const { data: chainsData } = useEscalationChains();\n const addChain = useAddEscalationChain();\n const removeChain = useRemoveEscalationChain();\n const [newTarget, setNewTarget] = useState('');\n\n const chains = chainsData?.chains ?? [];\n\n const targets = useMemo(() => {\n if (!selectedRole) return [];\n return chains.filter((c) => c.source_role === selectedRole).map((c) => c.target_role);\n }, [chains, selectedRole]);\n\n const available = useMemo(() => {\n if (!selectedRole) return [];\n return allRoles.filter((r) => r !== selectedRole && r !== 'superadmin' && !targets.includes(r));\n }, [allRoles, selectedRole, targets]);\n\n const handleAdd = () => {\n if (!selectedRole || !newTarget.trim()) return;\n addChain.mutate(\n { source_role: selectedRole, target_role: newTarget.trim() },\n { onSuccess: () => setNewTarget('') },\n );\n };\n\n const handleRemove = (target: string) => {\n if (!selectedRole) return;\n removeChain.mutate({ source_role: selectedRole, target_role: target });\n };\n\n const isSuperAdmin = selectedRole === 'superadmin';\n\n return (\n <div className=\"border-l border-surface-border pl-6 min-h-[300px]\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4\">\n Escalation Routing\n </p>\n\n {!selectedRole ? (\n <p className=\"text-xs text-text-tertiary\">\n Select a role to manage its escalation targets.\n </p>\n ) : isSuperAdmin ? (\n <div>\n <p className=\"text-sm font-mono text-text-primary mb-2\">{selectedRole}</p>\n <p className=\"text-xs text-text-tertiary\">\n Superadmins can escalate to any role implicitly.\n </p>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-sm font-mono text-text-primary\">{selectedRole}</p>\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">Can escalate to:</p>\n </div>\n\n {targets.length === 0 ? (\n <p className=\"text-xs text-text-tertiary\">\n No escalation targets configured.\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-2\">\n {targets.map((target) => (\n <span\n key={target}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary font-mono\"\n >\n {target}\n <button\n onClick={() => handleRemove(target)}\n className=\"text-text-tertiary hover:text-status-error transition-colors\"\n title={`Remove ${target}`}\n >\n &times;\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"pt-3 border-t border-surface-border\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n Add Target\n </p>\n <div className=\"flex items-center gap-2\">\n <select\n value={newTarget}\n onChange={(e) => setNewTarget(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <button\n onClick={handleAdd}\n disabled={!newTarget || addChain.isPending}\n className=\"btn-primary text-xs\"\n >\n {addChain.isPending ? 'Adding...' : 'Add'}\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { Trash2 } from 'lucide-react';\nimport { type RoleDetail } from '../../../api/roles';\nimport { type Column } from '../../../components/common/data/DataTable';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\n\nexport function getRoleColumns(\n onDelete: (row: RoleDetail) => void,\n): Column<RoleDetail>[] {\n return [\n {\n key: 'role',\n label: 'Role',\n render: (row) => <RolePill role={row.role} />,\n },\n {\n key: 'user_count',\n label: 'Users',\n render: (row) =>\n row.user_count > 0\n ? <span className=\"text-text-primary\">{row.user_count}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-24 text-right',\n },\n {\n key: 'chain_count',\n label: 'Escalations',\n render: (row) =>\n row.chain_count > 0\n ? <span className=\"text-text-primary\">{row.chain_count}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-28 text-right',\n },\n {\n key: 'workflow_count',\n label: 'Workflows',\n render: (row) =>\n row.workflow_count > 0\n ? <span className=\"text-text-primary\">{row.workflow_count}</span>\n : <span className=\"text-text-tertiary\">0</span>,\n className: 'w-28 text-right',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => {\n const inUse = row.user_count > 0 || row.chain_count > 0 || row.workflow_count > 0;\n if (inUse) return null;\n return (\n <RowActionGroup>\n <RowAction\n icon={Trash2}\n title=\"Delete role\"\n onClick={() => onDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n );\n },\n className: 'w-16 text-right',\n },\n ];\n}\n","import { useState, useMemo } from 'react';\nimport { useRoleDetails, useDeleteRole, type RoleDetail } from '../../../api/roles';\nimport { DataTable } from '../../../components/common/data/DataTable';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { CreateRoleModal } from './CreateRoleModal';\nimport { EscalationPanel } from './EscalationPanel';\nimport { getRoleColumns } from './RoleColumns';\n\nexport function RolesPage() {\n const { data, isLoading } = useRoleDetails();\n const deleteRole = useDeleteRole();\n\n const [showCreate, setShowCreate] = useState(false);\n const [confirmDelete, setConfirmDelete] = useState<RoleDetail | null>(null);\n const [selectedRole, setSelectedRole] = useState<string | null>(null);\n\n const roles = data?.roles ?? [];\n const allRoleNames = useMemo(() => roles.map((r) => r.role), [roles]);\n\n const columns = getRoleColumns((row) => setConfirmDelete(row));\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteRole.mutate(confirmDelete.role, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n return (\n <div>\n <PageHeader\n title=\"Roles\"\n actions={\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Role\n </button>\n }\n />\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6\">\n <div>\n <DataTable\n columns={columns}\n data={roles}\n keyFn={(row) => row.role}\n isLoading={isLoading}\n emptyMessage=\"No roles found\"\n onRowClick={(row) => setSelectedRole(row.role)}\n activeRowKey={selectedRole}\n />\n </div>\n\n <EscalationPanel selectedRole={selectedRole} allRoles={allRoleNames} />\n </div>\n\n <CreateRoleModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete Role\"\n description={\n <>\n Delete role{' '}\n <span className=\"font-medium font-mono text-text-primary\">\n {confirmDelete?.role}\n </span>\n ? This action cannot be undone.\n </>\n }\n isPending={deleteRole.isPending}\n error={deleteRole.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["CreateRoleModal","open","onClose","createRole","useCreateRole","roleName","setRoleName","useState","prevOpen","setPrevOpen","handleCreate","trimmed","jsxDEV","Modal","e","EscalationPanel","selectedRole","allRoles","chainsData","useEscalationChains","addChain","useAddEscalationChain","removeChain","useRemoveEscalationChain","newTarget","setNewTarget","chains","targets","useMemo","c","available","r","handleAdd","handleRemove","target","isSuperAdmin","getRoleColumns","onDelete","row","RolePill","RowActionGroup","RowAction","Trash2","RolesPage","data","isLoading","useRoleDetails","deleteRole","useDeleteRole","showCreate","setShowCreate","confirmDelete","setConfirmDelete","setSelectedRole","roles","allRoleNames","columns","handleDelete","PageHeader","DataTable","ConfirmDeleteModal","Fragment"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as t}from"./index-Cmgrk7PQ.js";function r({icon:o,title:s,onClick:a,colorClass:n="text-text-tertiary hover:text-accent",alwaysVisible:i}){return t.jsxDEV("button",{onClick:e=>{e.stopPropagation(),a(e)},className:`transition-opacity ${i?"opacity-100":"opacity-0 group-hover/row:opacity-100"} ${n}`,title:s,children:t.jsxDEV(o,{className:"w-[18px] h-[18px]",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/RowActions.tsx",lineNumber:32,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/RowActions.tsx",lineNumber:22,columnNumber:5},this)}function m({children:o}){return t.jsxDEV("span",{className:"flex items-center justify-end gap-2.5",children:o},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/RowActions.tsx",lineNumber:42,columnNumber:5},this)}export{m as R,r as a};
2
- //# sourceMappingURL=RowActions-DbUJPfaW.js.map
1
+ import{j as t}from"./index-puKKZ5l8.js";function r({icon:o,title:s,onClick:a,colorClass:n="text-text-tertiary hover:text-accent",alwaysVisible:i}){return t.jsxDEV("button",{onClick:e=>{e.stopPropagation(),a(e)},className:`transition-opacity ${i?"opacity-100":"opacity-0 group-hover/row:opacity-100"} ${n}`,title:s,children:t.jsxDEV(o,{className:"w-[18px] h-[18px]",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/RowActions.tsx",lineNumber:32,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/RowActions.tsx",lineNumber:22,columnNumber:5},this)}function m({children:o}){return t.jsxDEV("span",{className:"flex items-center justify-end gap-2.5",children:o},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/RowActions.tsx",lineNumber:42,columnNumber:5},this)}export{m as R,r as a};
2
+ //# sourceMappingURL=RowActions-DurFwIwe.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RowActions-DbUJPfaW.js","sources":["../../src/components/common/layout/RowActions.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\n/**\n * Ephemeral icon button that appears on row hover.\n * Uses `group-hover/row:opacity-100` to show on hover — rows must have `group/row`.\n */\nexport function RowAction({\n icon: Icon,\n title,\n onClick,\n colorClass = 'text-text-tertiary hover:text-accent',\n alwaysVisible,\n}: {\n icon: LucideIcon;\n title: string;\n onClick: (e: React.MouseEvent) => void;\n colorClass?: string;\n alwaysVisible?: boolean;\n}) {\n return (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onClick(e);\n }}\n className={`transition-opacity ${\n alwaysVisible ? 'opacity-100' : 'opacity-0 group-hover/row:opacity-100'\n } ${colorClass}`}\n title={title}\n >\n <Icon className=\"w-[18px] h-[18px]\" strokeWidth={1.5} />\n </button>\n );\n}\n\n/**\n * Container for one or more RowAction icons in the last table column.\n */\nexport function RowActionGroup({ children }: { children: ReactNode }) {\n return (\n <span className=\"flex items-center justify-end gap-2.5\">\n {children}\n </span>\n );\n}\n"],"names":["RowAction","Icon","title","onClick","colorClass","alwaysVisible","jsxDEV","RowActionGroup","children"],"mappings":"wCAOO,SAASA,EAAU,CACxB,KAAMC,EACN,MAAAC,EACA,QAAAC,EACA,WAAAC,EAAa,uCACb,cAAAC,CACF,EAMG,CACD,OACEC,EAAAA,OAAC,SAAA,CACC,QAAU,GAAM,CACd,EAAE,gBAAA,EACFH,EAAQ,CAAC,CACX,EACA,UAAW,sBACTE,EAAgB,cAAgB,uCAClC,IAAID,CAAU,GACd,MAAAF,EAEA,SAAAI,EAAAA,OAACL,EAAA,CAAK,UAAU,oBAAoB,YAAa,GAAA,EAAjD,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAsD,CAAA,EAVxD,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAaJ,CAKO,SAASM,EAAe,CAAE,SAAAC,GAAqC,CACpE,OACEF,EAAAA,OAAC,OAAA,CAAK,UAAU,wCACb,SAAAE,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAEJ"}
1
+ {"version":3,"file":"RowActions-DurFwIwe.js","sources":["../../src/components/common/layout/RowActions.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\n/**\n * Ephemeral icon button that appears on row hover.\n * Uses `group-hover/row:opacity-100` to show on hover — rows must have `group/row`.\n */\nexport function RowAction({\n icon: Icon,\n title,\n onClick,\n colorClass = 'text-text-tertiary hover:text-accent',\n alwaysVisible,\n}: {\n icon: LucideIcon;\n title: string;\n onClick: (e: React.MouseEvent) => void;\n colorClass?: string;\n alwaysVisible?: boolean;\n}) {\n return (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onClick(e);\n }}\n className={`transition-opacity ${\n alwaysVisible ? 'opacity-100' : 'opacity-0 group-hover/row:opacity-100'\n } ${colorClass}`}\n title={title}\n >\n <Icon className=\"w-[18px] h-[18px]\" strokeWidth={1.5} />\n </button>\n );\n}\n\n/**\n * Container for one or more RowAction icons in the last table column.\n */\nexport function RowActionGroup({ children }: { children: ReactNode }) {\n return (\n <span className=\"flex items-center justify-end gap-2.5\">\n {children}\n </span>\n );\n}\n"],"names":["RowAction","Icon","title","onClick","colorClass","alwaysVisible","jsxDEV","RowActionGroup","children"],"mappings":"wCAOO,SAASA,EAAU,CACxB,KAAMC,EACN,MAAAC,EACA,QAAAC,EACA,WAAAC,EAAa,uCACb,cAAAC,CACF,EAMG,CACD,OACEC,EAAAA,OAAC,SAAA,CACC,QAAU,GAAM,CACd,EAAE,gBAAA,EACFH,EAAQ,CAAC,CACX,EACA,UAAW,sBACTE,EAAgB,cAAgB,uCAClC,IAAID,CAAU,GACd,MAAAF,EAEA,SAAAI,EAAAA,OAACL,EAAA,CAAK,UAAU,oBAAoB,YAAa,GAAA,EAAjD,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAsD,CAAA,EAVxD,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAaJ,CAKO,SAASM,EAAe,CAAE,SAAAC,GAAqC,CACpE,OACEF,EAAAA,OAAC,OAAA,CAAK,UAAU,wCACb,SAAAE,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{i as a,j as o}from"./index-puKKZ5l8.js";import{B as i}from"./BotPicker-DWhn0tr1.js";import{a4 as c,a5 as l}from"./vendor-icons-CWl44VA6.js";const N=["Describe","Discover","Compile","Deploy","Test","Verify"];function b(e){return e?e.status==="completed"?"completed":e.status==="failed"?"failed":"in_progress":"pending"}function x(e){const s=e.match(/```json\s*([\s\S]*?)```/)||e.match(/\{[\s\S]*?\n\}/);if(!s)return null;try{return JSON.parse((s[1]??s[0]).trim())}catch{return null}}const u=new Set(["token","authorization","bearer_token","access_token","api_token"]);function h(e){if(!(e!=null&&e.properties))return{};const s={},r=sessionStorage.getItem("lt_token")||"";for(const[n,m]of Object.entries(e.properties)){const t=m;t.default!==void 0?s[n]=t.default:u.has(n.toLowerCase())&&t.type==="string"?s[n]=r:t.type==="string"?s[n]="":t.type==="number"||t.type==="integer"?s[n]=t.minimum??0:t.type==="boolean"?s[n]=!1:t.type==="object"?s[n]={}:t.type==="array"?s[n]=[]:s[n]=null}return s}function S({selected:e,onChange:s}){const{user:r,isSuperAdmin:n,hasRoleType:m}=a(),t=n||m("admin");return o.jsxDEV("div",{className:"px-2.5 py-2 rounded-md bg-accent/[0.06] border border-accent/20",children:t?o.jsxDEV("div",{className:"space-y-1",children:[o.jsxDEV("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Run as"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RunAsSelector.tsx",lineNumber:18,columnNumber:11},this),o.jsxDEV(i,{selected:e,onChange:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RunAsSelector.tsx",lineNumber:19,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/RunAsSelector.tsx",lineNumber:17,columnNumber:9},this):o.jsxDEV("div",{className:"flex items-center gap-1.5",children:e?o.jsxDEV(o.Fragment,{children:[o.jsxDEV(c,{className:"w-3 h-3 text-accent/75 shrink-0",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RunAsSelector.tsx",lineNumber:25,columnNumber:15},this),o.jsxDEV("span",{className:"text-[10px] text-text-secondary",children:["Running as ",o.jsxDEV("span",{className:"font-medium text-accent font-mono",children:e},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RunAsSelector.tsx",lineNumber:27,columnNumber:28},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/RunAsSelector.tsx",lineNumber:26,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/RunAsSelector.tsx",lineNumber:24,columnNumber:13},this):o.jsxDEV(o.Fragment,{children:[o.jsxDEV(l,{className:"w-3 h-3 text-accent/75 shrink-0",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RunAsSelector.tsx",lineNumber:32,columnNumber:15},this),o.jsxDEV("span",{className:"text-[10px] text-text-secondary",children:["Running as ",o.jsxDEV("span",{className:"font-medium text-accent",children:(r==null?void 0:r.displayName)||(r==null?void 0:r.userId)||"you"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RunAsSelector.tsx",lineNumber:34,columnNumber:28},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/RunAsSelector.tsx",lineNumber:33,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/RunAsSelector.tsx",lineNumber:31,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RunAsSelector.tsx",lineNumber:22,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RunAsSelector.tsx",lineNumber:15,columnNumber:5},this)}export{S as R,N as S,h as b,x as e,b as m};
2
+ //# sourceMappingURL=RunAsSelector-CNKraP6u.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunAsSelector-CNKraP6u.js","sources":["../../src/pages/mcp/mcp-query-detail/helpers.ts","../../src/components/common/form/RunAsSelector.tsx"],"sourcesContent":["// ── Shared helpers for MCP Query Detail wizard panels ────────────────────────\n\nexport type Step = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport const STEP_LABELS_BASE = ['Describe', 'Discover', 'Compile', 'Deploy', 'Test', 'Verify'] as const;\n\nexport function mapStatus(exec: { status?: string } | undefined): string {\n if (!exec) return 'pending';\n if (exec.status === 'completed') return 'completed';\n if (exec.status === 'failed') return 'failed';\n return 'in_progress';\n}\n\nexport function extractJsonFromSummary(summary: string): Record<string, unknown> | null {\n const match = summary.match(/```json\\s*([\\s\\S]*?)```/) || summary.match(/\\{[\\s\\S]*?\\n\\}/);\n if (!match) return null;\n try { return JSON.parse((match[1] ?? match[0]).trim()); } catch { return null; }\n}\n\n// ── Helpers migrated from yaml-workflow-detail ───────────────────────────────\n\nexport type Section = 'invoke' | 'tools' | 'config';\n\n/** Keys that should auto-fill with the current session token when building test input skeletons. */\nconst TOKEN_FIELD_NAMES = new Set(['token', 'authorization', 'bearer_token', 'access_token', 'api_token']);\n\nexport function buildSkeleton(schema: Record<string, any>): Record<string, any> {\n if (!schema?.properties) return {};\n const result: Record<string, any> = {};\n // Auto-fill token fields with the current session token so test invocations\n // always use a fresh credential instead of requiring manual paste.\n const sessionToken = sessionStorage.getItem('lt_token') || '';\n for (const [key, prop] of Object.entries(schema.properties)) {\n const p = prop as any;\n if (p.default !== undefined) result[key] = p.default;\n else if (TOKEN_FIELD_NAMES.has(key.toLowerCase()) && p.type === 'string') result[key] = sessionToken;\n else if (p.type === 'string') result[key] = '';\n else if (p.type === 'number' || p.type === 'integer') result[key] = p.minimum ?? 0;\n else if (p.type === 'boolean') result[key] = false;\n else if (p.type === 'object') result[key] = {};\n else if (p.type === 'array') result[key] = [];\n else result[key] = null;\n }\n return result;\n}\n\nexport function inferFieldType(schemaProp: any): string {\n if (!schemaProp) return 'string';\n return schemaProp.type || 'string';\n}\n\nexport const metadataLabels: Record<string, string> = {\n app: 'MCP Workflow Server', tpc: 'MCP Workflow Tool', vrs: 'Version', ngn: 'Engine ID',\n jid: 'Job ID', gid: 'Run ID', aid: 'Activity ID', ts: 'Time Series',\n jc: 'Created', ju: 'Updated', trc: 'Trace ID', js: 'Job Status',\n};\n\nexport const jobStatusLabels: Record<number, string> = { 0: 'Completed', 1: 'Pending', 2: 'Error' };\n\nexport function parseCompactTimestamp(val: string): string {\n const match = val.match(/^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})\\.(\\d+)$/);\n if (!match) return val;\n const [, y, mo, d, h, mi, s, ms] = match;\n return `${y}-${mo}-${d} ${h}:${mi}:${s}.${ms}`;\n}\n\nexport function formatMetadataValue(key: string, value: unknown): string {\n if (key === 'js' && typeof value === 'number') return jobStatusLabels[value] ?? `Unknown (${value})`;\n if ((key === 'jc' || key === 'ju') && typeof value === 'string') return parseCompactTimestamp(value);\n return String(value ?? '');\n}\n\nexport function sourceLabel(s: string | undefined) {\n if (s === 'llm') return 'LLM';\n if (s === 'db') return 'DB';\n return 'MCP';\n}\n\nexport function sourceColor(s: string | undefined) {\n if (s === 'llm') return 'bg-purple-500/10 text-purple-400 border-purple-500/20';\n return 'bg-accent-primary/10 text-accent border-accent-primary/20';\n}\n","import { Bot, UserCircle } from 'lucide-react';\nimport { BotPicker } from './BotPicker';\nimport { useAuth } from '../../../hooks/useAuth';\n\ninterface RunAsSelectorProps {\n selected: string;\n onChange: (botExternalId: string) => void;\n}\n\nexport function RunAsSelector({ selected, onChange }: RunAsSelectorProps) {\n const { user, isSuperAdmin, hasRoleType } = useAuth();\n const isAdmin = isSuperAdmin || hasRoleType('admin');\n\n return (\n <div className=\"px-2.5 py-2 rounded-md bg-accent/[0.06] border border-accent/20\">\n {isAdmin ? (\n <div className=\"space-y-1\">\n <label className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">Run as</label>\n <BotPicker selected={selected} onChange={onChange} />\n </div>\n ) : (\n <div className=\"flex items-center gap-1.5\">\n {selected ? (\n <>\n <Bot className=\"w-3 h-3 text-accent/75 shrink-0\" strokeWidth={1.5} />\n <span className=\"text-[10px] text-text-secondary\">\n Running as <span className=\"font-medium text-accent font-mono\">{selected}</span>\n </span>\n </>\n ) : (\n <>\n <UserCircle className=\"w-3 h-3 text-accent/75 shrink-0\" strokeWidth={1.5} />\n <span className=\"text-[10px] text-text-secondary\">\n Running as <span className=\"font-medium text-accent\">{user?.displayName || user?.userId || 'you'}</span>\n </span>\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"names":["STEP_LABELS_BASE","mapStatus","exec","extractJsonFromSummary","summary","match","TOKEN_FIELD_NAMES","buildSkeleton","schema","result","sessionToken","key","prop","p","RunAsSelector","selected","onChange","user","isSuperAdmin","hasRoleType","useAuth","isAdmin","jsxDEV","BotPicker","Fragment","Bot","UserCircle"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./index-Cmgrk7PQ.js";function i({label:m,value:n,sub:a,dotClass:t,colorClass:d="text-text-primary",onClick:r}){const s=e.jsxDEV(e.Fragment,{children:[e.jsxDEV("div",{className:"flex items-center gap-2 mb-1",children:[t&&e.jsxDEV("span",{className:`w-2 h-2 rounded-full ${t}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:21,columnNumber:22},this),e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:m},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:22,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:20,columnNumber:7},this),e.jsxDEV("p",{className:`text-2xl font-light tabular-nums ${d}`,children:n},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:26,columnNumber:7},this),a&&e.jsxDEV("p",{className:"text-xs text-text-tertiary mt-1",children:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:27,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:19,columnNumber:5},this),o="bg-surface-raised border border-surface-border rounded-md p-4 text-left";return r?e.jsxDEV("button",{onClick:r,className:`${o} hover:border-accent/40 transition-colors`,children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:35,columnNumber:7},this):e.jsxDEV("div",{className:o,children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:41,columnNumber:10},this)}export{i as S};
2
- //# sourceMappingURL=StatCard-Bs3JbyAz.js.map
1
+ import{j as e}from"./index-puKKZ5l8.js";function i({label:m,value:n,sub:a,dotClass:t,colorClass:d="text-text-primary",onClick:r}){const s=e.jsxDEV(e.Fragment,{children:[e.jsxDEV("div",{className:"flex items-center gap-2 mb-1",children:[t&&e.jsxDEV("span",{className:`w-2 h-2 rounded-full ${t}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:21,columnNumber:22},this),e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:m},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:22,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:20,columnNumber:7},this),e.jsxDEV("p",{className:`text-2xl font-light tabular-nums ${d}`,children:n},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:26,columnNumber:7},this),a&&e.jsxDEV("p",{className:"text-xs text-text-tertiary mt-1",children:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:27,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:19,columnNumber:5},this),o="bg-surface-raised border border-surface-border rounded-md p-4 text-left";return r?e.jsxDEV("button",{onClick:r,className:`${o} hover:border-accent/40 transition-colors`,children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:35,columnNumber:7},this):e.jsxDEV("div",{className:o,children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StatCard.tsx",lineNumber:41,columnNumber:10},this)}export{i as S};
2
+ //# sourceMappingURL=StatCard-CKplpK3w.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StatCard-Bs3JbyAz.js","sources":["../../src/components/common/data/StatCard.tsx"],"sourcesContent":["interface StatCardProps {\n label: string;\n value: string | number;\n sub?: string;\n dotClass?: string;\n colorClass?: string;\n onClick?: () => void;\n}\n\nexport function StatCard({\n label,\n value,\n sub,\n dotClass,\n colorClass = 'text-text-primary',\n onClick,\n}: StatCardProps) {\n const content = (\n <>\n <div className=\"flex items-center gap-2 mb-1\">\n {dotClass && <span className={`w-2 h-2 rounded-full ${dotClass}`} />}\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n {label}\n </p>\n </div>\n <p className={`text-2xl font-light tabular-nums ${colorClass}`}>{value}</p>\n {sub && <p className=\"text-xs text-text-tertiary mt-1\">{sub}</p>}\n </>\n );\n\n const base = 'bg-surface-raised border border-surface-border rounded-md p-4 text-left';\n\n if (onClick) {\n return (\n <button onClick={onClick} className={`${base} hover:border-accent/40 transition-colors`}>\n {content}\n </button>\n );\n }\n\n return <div className={base}>{content}</div>;\n}\n"],"names":["StatCard","label","value","sub","dotClass","colorClass","onClick","content","jsxDEV","Fragment","base"],"mappings":"wCASO,SAASA,EAAS,CACvB,MAAAC,EACA,MAAAC,EACA,IAAAC,EACA,SAAAC,EACA,WAAAC,EAAa,oBACb,QAAAC,CACF,EAAkB,CAChB,MAAMC,EACJC,EAAAA,OAAAC,EAAAA,SAAA,CACE,SAAA,CAAAD,EAAAA,OAAC,MAAA,CAAI,UAAU,+BACZ,SAAA,CAAAJ,GAAYI,EAAAA,OAAC,OAAA,CAAK,UAAW,wBAAwBJ,CAAQ,EAAA,EAAjD,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAqD,EAClEI,SAAC,IAAA,CAAE,UAAU,yEACV,SAAAP,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAAA,CAAA,EAJF,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAKA,WACC,IAAA,CAAE,UAAW,oCAAoCI,CAAU,GAAK,SAAAH,GAAjE,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAuE,EACtEC,GAAOK,EAAAA,OAAC,IAAA,CAAE,UAAU,kCAAmC,SAAAL,CAAA,EAAhD,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAoD,CAAA,CAAA,EAR9D,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IASA,EAGIO,EAAO,0EAEb,OAAIJ,WAEC,SAAA,CAAO,QAAAA,EAAkB,UAAW,GAAGI,CAAI,4CACzC,SAAAH,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,EAIGC,EAAAA,OAAC,MAAA,CAAI,UAAWE,EAAO,SAAAH,CAAA,EAAvB,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA+B,CACxC"}
1
+ {"version":3,"file":"StatCard-CKplpK3w.js","sources":["../../src/components/common/data/StatCard.tsx"],"sourcesContent":["interface StatCardProps {\n label: string;\n value: string | number;\n sub?: string;\n dotClass?: string;\n colorClass?: string;\n onClick?: () => void;\n}\n\nexport function StatCard({\n label,\n value,\n sub,\n dotClass,\n colorClass = 'text-text-primary',\n onClick,\n}: StatCardProps) {\n const content = (\n <>\n <div className=\"flex items-center gap-2 mb-1\">\n {dotClass && <span className={`w-2 h-2 rounded-full ${dotClass}`} />}\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n {label}\n </p>\n </div>\n <p className={`text-2xl font-light tabular-nums ${colorClass}`}>{value}</p>\n {sub && <p className=\"text-xs text-text-tertiary mt-1\">{sub}</p>}\n </>\n );\n\n const base = 'bg-surface-raised border border-surface-border rounded-md p-4 text-left';\n\n if (onClick) {\n return (\n <button onClick={onClick} className={`${base} hover:border-accent/40 transition-colors`}>\n {content}\n </button>\n );\n }\n\n return <div className={base}>{content}</div>;\n}\n"],"names":["StatCard","label","value","sub","dotClass","colorClass","onClick","content","jsxDEV","Fragment","base"],"mappings":"wCASO,SAASA,EAAS,CACvB,MAAAC,EACA,MAAAC,EACA,IAAAC,EACA,SAAAC,EACA,WAAAC,EAAa,oBACb,QAAAC,CACF,EAAkB,CAChB,MAAMC,EACJC,EAAAA,OAAAC,EAAAA,SAAA,CACE,SAAA,CAAAD,EAAAA,OAAC,MAAA,CAAI,UAAU,+BACZ,SAAA,CAAAJ,GAAYI,EAAAA,OAAC,OAAA,CAAK,UAAW,wBAAwBJ,CAAQ,EAAA,EAAjD,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAqD,EAClEI,SAAC,IAAA,CAAE,UAAU,yEACV,SAAAP,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAAA,CAAA,EAJF,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAKA,WACC,IAAA,CAAE,UAAW,oCAAoCI,CAAU,GAAK,SAAAH,GAAjE,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAuE,EACtEC,GAAOK,EAAAA,OAAC,IAAA,CAAE,UAAU,kCAAmC,SAAAL,CAAA,EAAhD,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAoD,CAAA,CAAA,EAR9D,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IASA,EAGIO,EAAO,0EAEb,OAAIJ,WAEC,SAAA,CAAO,QAAAA,EAAkB,UAAW,GAAGI,CAAI,4CACzC,SAAAH,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,EAIGC,EAAAA,OAAC,MAAA,CAAI,UAAWE,EAAO,SAAAH,CAAA,EAAvB,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA+B,CACxC"}
@@ -1,2 +1,2 @@
1
- import{j as s}from"./index-Cmgrk7PQ.js";const n={pending:"bg-status-pending",in_progress:"bg-status-active animate-pulse",completed:"bg-status-success",resolved:"bg-status-success",needs_intervention:"bg-status-error",failed:"bg-status-error",cancelled:"bg-accent-muted",draft:"bg-status-draft",deployed:"bg-status-active",active:"bg-status-success",archived:"bg-text-tertiary"},d={pending:"Pending",in_progress:"In Progress",completed:"Completed",resolved:"Resolved",needs_intervention:"Needs Intervention",failed:"Failed",cancelled:"Cancelled",draft:"Draft",deployed:"Deployed",active:"Active",archived:"Archived"};function r({status:e}){const t=n[e]??"bg-status-pending",a=d[e]??e;return s.jsxDEV("span",{className:"inline-flex items-center gap-2",children:[s.jsxDEV("span",{className:`w-2 h-2 rounded-full ${t}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/StatusBadge.tsx",lineNumber:39,columnNumber:7},this),s.jsxDEV("span",{className:"text-xs text-text-secondary",children:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/StatusBadge.tsx",lineNumber:40,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/StatusBadge.tsx",lineNumber:38,columnNumber:5},this)}export{r as S};
2
- //# sourceMappingURL=StatusBadge-CakDdsCw.js.map
1
+ import{j as s}from"./index-puKKZ5l8.js";const n={pending:"bg-status-pending",in_progress:"bg-status-active animate-pulse",completed:"bg-status-success",resolved:"bg-status-success",needs_intervention:"bg-status-error",failed:"bg-status-error",cancelled:"bg-accent-muted",draft:"bg-status-draft",deployed:"bg-status-active",active:"bg-status-success",archived:"bg-text-tertiary"},d={pending:"Pending",in_progress:"In Progress",completed:"Completed",resolved:"Resolved",needs_intervention:"Needs Intervention",failed:"Failed",cancelled:"Cancelled",draft:"Draft",deployed:"Deployed",active:"Active",archived:"Archived"};function r({status:e}){const t=n[e]??"bg-status-pending",a=d[e]??e;return s.jsxDEV("span",{className:"inline-flex items-center gap-2",children:[s.jsxDEV("span",{className:`w-2 h-2 rounded-full ${t}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/StatusBadge.tsx",lineNumber:39,columnNumber:7},this),s.jsxDEV("span",{className:"text-xs text-text-secondary",children:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/StatusBadge.tsx",lineNumber:40,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/StatusBadge.tsx",lineNumber:38,columnNumber:5},this)}export{r as S};
2
+ //# sourceMappingURL=StatusBadge-Dm0V1dNN.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StatusBadge-CakDdsCw.js","sources":["../../src/components/common/display/StatusBadge.tsx"],"sourcesContent":["import type { LTTaskStatus, LTEscalationStatus } from '../../../api/types';\n\ntype Status = LTTaskStatus | LTEscalationStatus | string;\n\nconst statusStyles: Record<string, string> = {\n pending: 'bg-status-pending',\n in_progress: 'bg-status-active animate-pulse',\n completed: 'bg-status-success',\n resolved: 'bg-status-success',\n needs_intervention: 'bg-status-error',\n failed: 'bg-status-error',\n cancelled: 'bg-accent-muted',\n draft: 'bg-status-draft',\n deployed: 'bg-status-active',\n active: 'bg-status-success',\n archived: 'bg-text-tertiary',\n};\n\nconst statusLabels: Record<string, string> = {\n pending: 'Pending',\n in_progress: 'In Progress',\n completed: 'Completed',\n resolved: 'Resolved',\n needs_intervention: 'Needs Intervention',\n failed: 'Failed',\n cancelled: 'Cancelled',\n draft: 'Draft',\n deployed: 'Deployed',\n active: 'Active',\n archived: 'Archived',\n};\n\nexport function StatusBadge({ status }: { status: Status }) {\n const dotClass = statusStyles[status] ?? 'bg-status-pending';\n const label = statusLabels[status] ?? status;\n\n return (\n <span className=\"inline-flex items-center gap-2\">\n <span className={`w-2 h-2 rounded-full ${dotClass}`} />\n <span className=\"text-xs text-text-secondary\">{label}</span>\n </span>\n );\n}\n"],"names":["statusStyles","statusLabels","StatusBadge","status","dotClass","label","jsxDEV"],"mappings":"wCAIA,MAAMA,EAAuC,CAC3C,QAAS,oBACT,YAAa,iCACb,UAAW,oBACX,SAAU,oBACV,mBAAoB,kBACpB,OAAQ,kBACR,UAAW,kBACX,MAAO,kBACP,SAAU,mBACV,OAAQ,oBACR,SAAU,kBACZ,EAEMC,EAAuC,CAC3C,QAAS,UACT,YAAa,cACb,UAAW,YACX,SAAU,WACV,mBAAoB,qBACpB,OAAQ,SACR,UAAW,YACX,MAAO,QACP,SAAU,WACV,OAAQ,SACR,SAAU,UACZ,EAEO,SAASC,EAAY,CAAE,OAAAC,GAA8B,CAC1D,MAAMC,EAAWJ,EAAaG,CAAM,GAAK,oBACnCE,EAAQJ,EAAaE,CAAM,GAAKA,EAEtC,OACEG,EAAAA,OAAC,OAAA,CAAK,UAAU,iCACd,SAAA,CAAAA,SAAC,OAAA,CAAK,UAAW,wBAAwBF,CAAQ,EAAA,EAAjD,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAqD,EACrDE,SAAC,OAAA,CAAK,UAAU,8BAA+B,SAAAD,CAAA,EAA/C,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAqD,CAAA,CAAA,EAFvD,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAEJ"}
1
+ {"version":3,"file":"StatusBadge-Dm0V1dNN.js","sources":["../../src/components/common/display/StatusBadge.tsx"],"sourcesContent":["import type { LTTaskStatus, LTEscalationStatus } from '../../../api/types';\n\ntype Status = LTTaskStatus | LTEscalationStatus | string;\n\nconst statusStyles: Record<string, string> = {\n pending: 'bg-status-pending',\n in_progress: 'bg-status-active animate-pulse',\n completed: 'bg-status-success',\n resolved: 'bg-status-success',\n needs_intervention: 'bg-status-error',\n failed: 'bg-status-error',\n cancelled: 'bg-accent-muted',\n draft: 'bg-status-draft',\n deployed: 'bg-status-active',\n active: 'bg-status-success',\n archived: 'bg-text-tertiary',\n};\n\nconst statusLabels: Record<string, string> = {\n pending: 'Pending',\n in_progress: 'In Progress',\n completed: 'Completed',\n resolved: 'Resolved',\n needs_intervention: 'Needs Intervention',\n failed: 'Failed',\n cancelled: 'Cancelled',\n draft: 'Draft',\n deployed: 'Deployed',\n active: 'Active',\n archived: 'Archived',\n};\n\nexport function StatusBadge({ status }: { status: Status }) {\n const dotClass = statusStyles[status] ?? 'bg-status-pending';\n const label = statusLabels[status] ?? status;\n\n return (\n <span className=\"inline-flex items-center gap-2\">\n <span className={`w-2 h-2 rounded-full ${dotClass}`} />\n <span className=\"text-xs text-text-secondary\">{label}</span>\n </span>\n );\n}\n"],"names":["statusStyles","statusLabels","StatusBadge","status","dotClass","label","jsxDEV"],"mappings":"wCAIA,MAAMA,EAAuC,CAC3C,QAAS,oBACT,YAAa,iCACb,UAAW,oBACX,SAAU,oBACV,mBAAoB,kBACpB,OAAQ,kBACR,UAAW,kBACX,MAAO,kBACP,SAAU,mBACV,OAAQ,oBACR,SAAU,kBACZ,EAEMC,EAAuC,CAC3C,QAAS,UACT,YAAa,cACb,UAAW,YACX,SAAU,WACV,mBAAoB,qBACpB,OAAQ,SACR,UAAW,YACX,MAAO,QACP,SAAU,WACV,OAAQ,SACR,SAAU,UACZ,EAEO,SAASC,EAAY,CAAE,OAAAC,GAA8B,CAC1D,MAAMC,EAAWJ,EAAaG,CAAM,GAAK,oBACnCE,EAAQJ,EAAaE,CAAM,GAAKA,EAEtC,OACEG,EAAAA,OAAC,OAAA,CAAK,UAAU,iCACd,SAAA,CAAAA,SAAC,OAAA,CAAK,UAAW,wBAAwBF,CAAQ,EAAA,EAAjD,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAqD,EACrDE,SAAC,OAAA,CAAK,UAAU,8BAA+B,SAAAD,CAAA,EAA/C,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAqD,CAAA,CAAA,EAFvD,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./index-Cmgrk7PQ.js";function l({steps:m,currentStep:s,onStepClick:a}){return e.jsxDEV("div",{className:"flex items-center justify-center gap-1 pb-4 border-b border-surface-border mb-4",children:m.map((n,t)=>{const c=t<s,o=t===s,r=!!a;return e.jsxDEV("div",{className:"flex items-center gap-1",children:[t>0&&e.jsxDEV("div",{className:`w-4 h-px ${c?"bg-accent":"bg-surface-border"}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:17,columnNumber:15},this),e.jsxDEV("button",{type:"button",onClick:r?()=>a(t):void 0,className:`flex items-center gap-1 ${r?"cursor-pointer":"cursor-default"}`,children:[e.jsxDEV("span",{className:`w-5 h-5 rounded-full text-[10px] font-semibold flex items-center justify-center shrink-0 transition-colors ${o?"bg-accent text-text-inverse":c?"bg-accent-muted text-accent":"bg-surface-sunken text-text-tertiary"} ${r&&!o?"hover:bg-accent-muted hover:text-accent":""}`,children:t+1},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:24,columnNumber:15},this),e.jsxDEV("span",{className:`text-[10px] font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${o?"text-text-primary":"text-text-tertiary"} ${r&&!o?"hover:text-text-primary":""}`,children:n},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:35,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:19,columnNumber:13},this)]},n,!0,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:15,columnNumber:11},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:9,columnNumber:5},this)}export{l as S};
2
- //# sourceMappingURL=StepIndicator-Cd_SG_yA.js.map
1
+ import{j as e}from"./index-puKKZ5l8.js";function l({steps:m,currentStep:s,onStepClick:a}){return e.jsxDEV("div",{className:"flex items-center justify-center gap-1 pb-4 border-b border-surface-border mb-4",children:m.map((n,t)=>{const c=t<s,o=t===s,r=!!a;return e.jsxDEV("div",{className:"flex items-center gap-1",children:[t>0&&e.jsxDEV("div",{className:`w-4 h-px ${c?"bg-accent":"bg-surface-border"}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:17,columnNumber:15},this),e.jsxDEV("button",{type:"button",onClick:r?()=>a(t):void 0,className:`flex items-center gap-1 ${r?"cursor-pointer":"cursor-default"}`,children:[e.jsxDEV("span",{className:`w-5 h-5 rounded-full text-[10px] font-semibold flex items-center justify-center shrink-0 transition-colors ${o?"bg-accent text-text-inverse":c?"bg-accent-muted text-accent":"bg-surface-sunken text-text-tertiary"} ${r&&!o?"hover:bg-accent-muted hover:text-accent":""}`,children:t+1},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:24,columnNumber:15},this),e.jsxDEV("span",{className:`text-[10px] font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${o?"text-text-primary":"text-text-tertiary"} ${r&&!o?"hover:text-text-primary":""}`,children:n},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:35,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:19,columnNumber:13},this)]},n,!0,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:15,columnNumber:11},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:9,columnNumber:5},this)}export{l as S};
2
+ //# sourceMappingURL=StepIndicator-Dicx0WTZ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StepIndicator-Cd_SG_yA.js","sources":["../../src/components/common/layout/StepIndicator.tsx"],"sourcesContent":["interface StepIndicatorProps {\n steps: string[];\n currentStep: number;\n onStepClick?: (step: number) => void;\n}\n\nexport function StepIndicator({ steps, currentStep, onStepClick }: StepIndicatorProps) {\n return (\n <div className=\"flex items-center justify-center gap-1 pb-4 border-b border-surface-border mb-4\">\n {steps.map((label, i) => {\n const done = i < currentStep;\n const active = i === currentStep;\n const clickable = !!onStepClick;\n return (\n <div key={label} className=\"flex items-center gap-1\">\n {i > 0 && (\n <div className={`w-4 h-px ${done ? 'bg-accent' : 'bg-surface-border'}`} />\n )}\n <button\n type=\"button\"\n onClick={clickable ? () => onStepClick(i) : undefined}\n className={`flex items-center gap-1 ${clickable ? 'cursor-pointer' : 'cursor-default'}`}\n >\n <span\n className={`w-5 h-5 rounded-full text-[10px] font-semibold flex items-center justify-center shrink-0 transition-colors ${\n active\n ? 'bg-accent text-text-inverse'\n : done\n ? 'bg-accent-muted text-accent'\n : 'bg-surface-sunken text-text-tertiary'\n } ${clickable && !active ? 'hover:bg-accent-muted hover:text-accent' : ''}`}\n >\n {i + 1}\n </span>\n <span\n className={`text-[10px] font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${\n active ? 'text-text-primary' : 'text-text-tertiary'\n } ${clickable && !active ? 'hover:text-text-primary' : ''}`}\n >\n {label}\n </span>\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":["StepIndicator","steps","currentStep","onStepClick","jsxDEV","label","i","done","active","clickable"],"mappings":"wCAMO,SAASA,EAAc,CAAE,MAAAC,EAAO,YAAAC,EAAa,YAAAC,GAAmC,CACrF,OACEC,SAAC,OAAI,UAAU,kFACZ,WAAM,IAAI,CAACC,EAAOC,IAAM,CACvB,MAAMC,EAAOD,EAAIJ,EACXM,EAASF,IAAMJ,EACfO,EAAY,CAAC,CAACN,EACpB,OACEC,EAAAA,OAAC,MAAA,CAAgB,UAAU,0BACxB,SAAA,CAAAE,EAAI,YACF,MAAA,CAAI,UAAW,YAAYC,EAAO,YAAc,mBAAmB,EAAA,EAApE,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAwE,EAE1EH,EAAAA,OAAC,SAAA,CACC,KAAK,SACL,QAASK,EAAY,IAAMN,EAAYG,CAAC,EAAI,OAC5C,UAAW,2BAA2BG,EAAY,iBAAmB,gBAAgB,GAErF,SAAA,CAAAL,EAAAA,OAAC,OAAA,CACC,UAAW,8GACTI,EACI,8BACAD,EACE,8BACA,sCACR,IAAIE,GAAa,CAACD,EAAS,0CAA4C,EAAE,GAExE,SAAAF,EAAI,CAAA,EATP,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,EAWAF,EAAAA,OAAC,OAAA,CACC,UAAW,0FACTI,EAAS,oBAAsB,oBACjC,IAAIC,GAAa,CAACD,EAAS,0BAA4B,EAAE,GAExD,SAAAH,CAAA,EALH,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAtBF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAuBA,CAAA,EA3BQA,EAAV,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IA4BA,CAEJ,CAAC,CAAA,EApCH,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,EAAA,aAAA,CAAA,EAAA,IAqCA,CAEJ"}
1
+ {"version":3,"file":"StepIndicator-Dicx0WTZ.js","sources":["../../src/components/common/layout/StepIndicator.tsx"],"sourcesContent":["interface StepIndicatorProps {\n steps: string[];\n currentStep: number;\n onStepClick?: (step: number) => void;\n}\n\nexport function StepIndicator({ steps, currentStep, onStepClick }: StepIndicatorProps) {\n return (\n <div className=\"flex items-center justify-center gap-1 pb-4 border-b border-surface-border mb-4\">\n {steps.map((label, i) => {\n const done = i < currentStep;\n const active = i === currentStep;\n const clickable = !!onStepClick;\n return (\n <div key={label} className=\"flex items-center gap-1\">\n {i > 0 && (\n <div className={`w-4 h-px ${done ? 'bg-accent' : 'bg-surface-border'}`} />\n )}\n <button\n type=\"button\"\n onClick={clickable ? () => onStepClick(i) : undefined}\n className={`flex items-center gap-1 ${clickable ? 'cursor-pointer' : 'cursor-default'}`}\n >\n <span\n className={`w-5 h-5 rounded-full text-[10px] font-semibold flex items-center justify-center shrink-0 transition-colors ${\n active\n ? 'bg-accent text-text-inverse'\n : done\n ? 'bg-accent-muted text-accent'\n : 'bg-surface-sunken text-text-tertiary'\n } ${clickable && !active ? 'hover:bg-accent-muted hover:text-accent' : ''}`}\n >\n {i + 1}\n </span>\n <span\n className={`text-[10px] font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${\n active ? 'text-text-primary' : 'text-text-tertiary'\n } ${clickable && !active ? 'hover:text-text-primary' : ''}`}\n >\n {label}\n </span>\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":["StepIndicator","steps","currentStep","onStepClick","jsxDEV","label","i","done","active","clickable"],"mappings":"wCAMO,SAASA,EAAc,CAAE,MAAAC,EAAO,YAAAC,EAAa,YAAAC,GAAmC,CACrF,OACEC,SAAC,OAAI,UAAU,kFACZ,WAAM,IAAI,CAACC,EAAOC,IAAM,CACvB,MAAMC,EAAOD,EAAIJ,EACXM,EAASF,IAAMJ,EACfO,EAAY,CAAC,CAACN,EACpB,OACEC,EAAAA,OAAC,MAAA,CAAgB,UAAU,0BACxB,SAAA,CAAAE,EAAI,YACF,MAAA,CAAI,UAAW,YAAYC,EAAO,YAAc,mBAAmB,EAAA,EAApE,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAwE,EAE1EH,EAAAA,OAAC,SAAA,CACC,KAAK,SACL,QAASK,EAAY,IAAMN,EAAYG,CAAC,EAAI,OAC5C,UAAW,2BAA2BG,EAAY,iBAAmB,gBAAgB,GAErF,SAAA,CAAAL,EAAAA,OAAC,OAAA,CACC,UAAW,8GACTI,EACI,8BACAD,EACE,8BACA,sCACR,IAAIE,GAAa,CAACD,EAAS,0CAA4C,EAAE,GAExE,SAAAF,EAAI,CAAA,EATP,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,EAWAF,EAAAA,OAAC,OAAA,CACC,UAAW,0FACTI,EAAS,oBAAsB,oBACjC,IAAIC,GAAa,CAACD,EAAS,0BAA4B,EAAE,GAExD,SAAAH,CAAA,EALH,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAtBF,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAuBA,CAAA,EA3BQA,EAAV,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IA4BA,CAEJ,CAAC,CAAA,EApCH,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,EAAA,aAAA,CAAA,EAAA,IAqCA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./index-Cmgrk7PQ.js";const l=[10,25,50,100];function d({page:t,totalPages:s,onPageChange:i,total:n,pageSize:o,onPageSizeChange:m}){if(n===0)return null;const r=(t-1)*o+1,c=Math.min(t*o,n);return e.jsxDEV("div",{className:"flex items-center justify-between pt-4",children:[e.jsxDEV("div",{className:"flex items-center gap-4",children:[e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:[r,"–",c," of ",n]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:28,columnNumber:9},this),m&&e.jsxDEV("select",{value:o,onChange:a=>m(parseInt(a.target.value)),className:"select text-xs py-1",children:l.map(a=>e.jsxDEV("option",{value:a,children:[a," / page"]},a,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:38,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:32,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:27,columnNumber:7},this),s>1&&e.jsxDEV("div",{className:"flex items-center gap-1",children:[e.jsxDEV("button",{onClick:()=>i(t-1),disabled:t<=1,className:"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed",children:"Previous"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:47,columnNumber:11},this),e.jsxDEV("span",{className:"px-3 text-xs text-text-secondary",children:[t," / ",s]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:54,columnNumber:11},this),e.jsxDEV("button",{onClick:()=>i(t+1),disabled:t>=s,className:"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed",children:"Next"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:57,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:46,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:26,columnNumber:5},this)}function b(t){return t.total===0?null:e.jsxDEV("div",{className:"sticky bg-surface/95 backdrop-blur-sm border-t border-surface-border -mx-10 px-10 pt-2 pb-4",style:{bottom:"calc(var(--feed-height, 0px) - 8px)"},children:e.jsxDEV(d,{...t},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StickyPagination.tsx",lineNumber:17,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StickyPagination.tsx",lineNumber:16,columnNumber:5},this)}export{b as S};
2
- //# sourceMappingURL=StickyPagination-Bz0C18nC.js.map
1
+ import{j as e}from"./index-puKKZ5l8.js";const l=[10,25,50,100];function d({page:t,totalPages:s,onPageChange:i,total:n,pageSize:o,onPageSizeChange:m}){if(n===0)return null;const r=(t-1)*o+1,c=Math.min(t*o,n);return e.jsxDEV("div",{className:"flex items-center justify-between pt-4",children:[e.jsxDEV("div",{className:"flex items-center gap-4",children:[e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:[r,"–",c," of ",n]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:28,columnNumber:9},this),m&&e.jsxDEV("select",{value:o,onChange:a=>m(parseInt(a.target.value)),className:"select text-xs py-1",children:l.map(a=>e.jsxDEV("option",{value:a,children:[a," / page"]},a,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:38,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:32,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:27,columnNumber:7},this),s>1&&e.jsxDEV("div",{className:"flex items-center gap-1",children:[e.jsxDEV("button",{onClick:()=>i(t-1),disabled:t<=1,className:"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed",children:"Previous"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:47,columnNumber:11},this),e.jsxDEV("span",{className:"px-3 text-xs text-text-secondary",children:[t," / ",s]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:54,columnNumber:11},this),e.jsxDEV("button",{onClick:()=>i(t+1),disabled:t>=s,className:"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed",children:"Next"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:57,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:46,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/Pagination.tsx",lineNumber:26,columnNumber:5},this)}function b(t){return t.total===0?null:e.jsxDEV("div",{className:"sticky bg-surface/95 backdrop-blur-sm border-t border-surface-border -mx-10 px-10 pt-2 pb-4",style:{bottom:"calc(var(--feed-height, 0px) - 8px)"},children:e.jsxDEV(d,{...t},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StickyPagination.tsx",lineNumber:17,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/StickyPagination.tsx",lineNumber:16,columnNumber:5},this)}export{b as S};
2
+ //# sourceMappingURL=StickyPagination-B2jYvU3-.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StickyPagination-Bz0C18nC.js","sources":["../../src/components/common/data/Pagination.tsx","../../src/components/common/data/StickyPagination.tsx"],"sourcesContent":["const PAGE_SIZE_OPTIONS = [10, 25, 50, 100];\n\ninterface PaginationProps {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n total: number;\n pageSize: number;\n onPageSizeChange?: (size: number) => void;\n}\n\nexport function Pagination({\n page,\n totalPages,\n onPageChange,\n total,\n pageSize,\n onPageSizeChange,\n}: PaginationProps) {\n if (total === 0) return null;\n\n const start = (page - 1) * pageSize + 1;\n const end = Math.min(page * pageSize, total);\n\n return (\n <div className=\"flex items-center justify-between pt-4\">\n <div className=\"flex items-center gap-4\">\n <p className=\"text-xs text-text-tertiary\">\n {start}&ndash;{end} of {total}\n </p>\n {onPageSizeChange && (\n <select\n value={pageSize}\n onChange={(e) => onPageSizeChange(parseInt(e.target.value))}\n className=\"select text-xs py-1\"\n >\n {PAGE_SIZE_OPTIONS.map((size) => (\n <option key={size} value={size}>\n {size} / page\n </option>\n ))}\n </select>\n )}\n </div>\n {totalPages > 1 && (\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => onPageChange(page - 1)}\n disabled={page <= 1}\n className=\"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n Previous\n </button>\n <span className=\"px-3 text-xs text-text-secondary\">\n {page} / {totalPages}\n </span>\n <button\n onClick={() => onPageChange(page + 1)}\n disabled={page >= totalPages}\n className=\"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n Next\n </button>\n </div>\n )}\n </div>\n );\n}\n","import { Pagination } from './Pagination';\n\ninterface StickyPaginationProps {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n total: number;\n pageSize: number;\n onPageSizeChange?: (size: number) => void;\n}\n\nexport function StickyPagination(props: StickyPaginationProps) {\n if (props.total === 0) return null;\n\n return (\n <div className=\"sticky bg-surface/95 backdrop-blur-sm border-t border-surface-border -mx-10 px-10 pt-2 pb-4\" style={{ bottom: 'calc(var(--feed-height, 0px) - 8px)' }}>\n <Pagination {...props} />\n </div>\n );\n}\n"],"names":["PAGE_SIZE_OPTIONS","Pagination","page","totalPages","onPageChange","total","pageSize","onPageSizeChange","start","end","jsxDEV","e","size","StickyPagination","props"],"mappings":"wCAAA,MAAMA,EAAoB,CAAC,GAAI,GAAI,GAAI,GAAG,EAWnC,SAASC,EAAW,CACzB,KAAAC,EACA,WAAAC,EACA,aAAAC,EACA,MAAAC,EACA,SAAAC,EACA,iBAAAC,CACF,EAAoB,CAClB,GAAIF,IAAU,EAAG,OAAO,KAExB,MAAMG,GAASN,EAAO,GAAKI,EAAW,EAChCG,EAAM,KAAK,IAAIP,EAAOI,EAAUD,CAAK,EAE3C,OACEK,EAAAA,OAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAA,EAAAA,OAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,OAAC,IAAA,CAAE,UAAU,6BACV,SAAA,CAAAF,EAAM,IAAQC,EAAI,OAAKJ,CAAA,CAAA,EAD1B,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,EACCE,GACCG,EAAAA,OAAC,SAAA,CACC,MAAOJ,EACP,SAAWK,GAAMJ,EAAiB,SAASI,EAAE,OAAO,KAAK,CAAC,EAC1D,UAAU,sBAET,WAAkB,IAAKC,GACtBF,SAAC,SAAA,CAAkB,MAAOE,EACvB,SAAA,CAAAA,EAAK,SAAA,CAAA,EADKA,EAAb,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CACD,CAAA,EATH,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAUA,CAAA,EAfJ,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAiBA,EACCT,EAAa,GACZO,SAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,OAAC,SAAA,CACC,QAAS,IAAMN,EAAaF,EAAO,CAAC,EACpC,SAAUA,GAAQ,EAClB,UAAU,oEACX,SAAA,UAAA,EAJD,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,EAOAQ,EAAAA,OAAC,OAAA,CAAK,UAAU,mCACb,SAAA,CAAAR,EAAK,MAAIC,CAAA,CAAA,EADZ,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,EACAO,EAAAA,OAAC,SAAA,CACC,QAAS,IAAMN,EAAaF,EAAO,CAAC,EACpC,SAAUA,GAAQC,EAClB,UAAU,oEACX,SAAA,MAAA,EAJD,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAjBF,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAkBA,CAAA,CAAA,EAtCJ,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAwCA,CAEJ,CCxDO,SAASU,EAAiBC,EAA8B,CAC7D,OAAIA,EAAM,QAAU,EAAU,KAG5BJ,EAAAA,OAAC,MAAA,CAAI,UAAU,8FAA8F,MAAO,CAAE,OAAQ,qCAAA,EAC5H,SAAAA,EAAAA,OAACT,EAAA,CAAY,GAAGa,CAAA,EAAhB,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAuB,CAAA,EADzB,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAEJ"}
1
+ {"version":3,"file":"StickyPagination-B2jYvU3-.js","sources":["../../src/components/common/data/Pagination.tsx","../../src/components/common/data/StickyPagination.tsx"],"sourcesContent":["const PAGE_SIZE_OPTIONS = [10, 25, 50, 100];\n\ninterface PaginationProps {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n total: number;\n pageSize: number;\n onPageSizeChange?: (size: number) => void;\n}\n\nexport function Pagination({\n page,\n totalPages,\n onPageChange,\n total,\n pageSize,\n onPageSizeChange,\n}: PaginationProps) {\n if (total === 0) return null;\n\n const start = (page - 1) * pageSize + 1;\n const end = Math.min(page * pageSize, total);\n\n return (\n <div className=\"flex items-center justify-between pt-4\">\n <div className=\"flex items-center gap-4\">\n <p className=\"text-xs text-text-tertiary\">\n {start}&ndash;{end} of {total}\n </p>\n {onPageSizeChange && (\n <select\n value={pageSize}\n onChange={(e) => onPageSizeChange(parseInt(e.target.value))}\n className=\"select text-xs py-1\"\n >\n {PAGE_SIZE_OPTIONS.map((size) => (\n <option key={size} value={size}>\n {size} / page\n </option>\n ))}\n </select>\n )}\n </div>\n {totalPages > 1 && (\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => onPageChange(page - 1)}\n disabled={page <= 1}\n className=\"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n Previous\n </button>\n <span className=\"px-3 text-xs text-text-secondary\">\n {page} / {totalPages}\n </span>\n <button\n onClick={() => onPageChange(page + 1)}\n disabled={page >= totalPages}\n className=\"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n Next\n </button>\n </div>\n )}\n </div>\n );\n}\n","import { Pagination } from './Pagination';\n\ninterface StickyPaginationProps {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n total: number;\n pageSize: number;\n onPageSizeChange?: (size: number) => void;\n}\n\nexport function StickyPagination(props: StickyPaginationProps) {\n if (props.total === 0) return null;\n\n return (\n <div className=\"sticky bg-surface/95 backdrop-blur-sm border-t border-surface-border -mx-10 px-10 pt-2 pb-4\" style={{ bottom: 'calc(var(--feed-height, 0px) - 8px)' }}>\n <Pagination {...props} />\n </div>\n );\n}\n"],"names":["PAGE_SIZE_OPTIONS","Pagination","page","totalPages","onPageChange","total","pageSize","onPageSizeChange","start","end","jsxDEV","e","size","StickyPagination","props"],"mappings":"wCAAA,MAAMA,EAAoB,CAAC,GAAI,GAAI,GAAI,GAAG,EAWnC,SAASC,EAAW,CACzB,KAAAC,EACA,WAAAC,EACA,aAAAC,EACA,MAAAC,EACA,SAAAC,EACA,iBAAAC,CACF,EAAoB,CAClB,GAAIF,IAAU,EAAG,OAAO,KAExB,MAAMG,GAASN,EAAO,GAAKI,EAAW,EAChCG,EAAM,KAAK,IAAIP,EAAOI,EAAUD,CAAK,EAE3C,OACEK,EAAAA,OAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAA,EAAAA,OAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,OAAC,IAAA,CAAE,UAAU,6BACV,SAAA,CAAAF,EAAM,IAAQC,EAAI,OAAKJ,CAAA,CAAA,EAD1B,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,EACCE,GACCG,EAAAA,OAAC,SAAA,CACC,MAAOJ,EACP,SAAWK,GAAMJ,EAAiB,SAASI,EAAE,OAAO,KAAK,CAAC,EAC1D,UAAU,sBAET,WAAkB,IAAKC,GACtBF,SAAC,SAAA,CAAkB,MAAOE,EACvB,SAAA,CAAAA,EAAK,SAAA,CAAA,EADKA,EAAb,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CACD,CAAA,EATH,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAUA,CAAA,EAfJ,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAiBA,EACCT,EAAa,GACZO,SAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,OAAC,SAAA,CACC,QAAS,IAAMN,EAAaF,EAAO,CAAC,EACpC,SAAUA,GAAQ,EAClB,UAAU,oEACX,SAAA,UAAA,EAJD,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,EAOAQ,EAAAA,OAAC,OAAA,CAAK,UAAU,mCACb,SAAA,CAAAR,EAAK,MAAIC,CAAA,CAAA,EADZ,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,EACAO,EAAAA,OAAC,SAAA,CACC,QAAS,IAAMN,EAAaF,EAAO,CAAC,EACpC,SAAUA,GAAQC,EAClB,UAAU,oEACX,SAAA,MAAA,EAJD,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAjBF,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAkBA,CAAA,CAAA,EAtCJ,OAAA,GAAA,CAAA,SAAA,2DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAwCA,CAEJ,CCxDO,SAASU,EAAiBC,EAA8B,CAC7D,OAAIA,EAAM,QAAU,EAAU,KAG5BJ,EAAAA,OAAC,MAAA,CAAI,UAAU,8FAA8F,MAAO,CAAE,OAAQ,qCAAA,EAC5H,SAAAA,EAAAA,OAACT,EAAA,CAAY,GAAGa,CAAA,EAAhB,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAuB,CAAA,EADzB,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{j as e,D as O,c as $,J as v,f as M,C as L}from"./index-puKKZ5l8.js";import{a as W}from"./vendor-query-DLp59M9_.js";import{S as R}from"./StatusBadge-Dm0V1dNN.js";import{L as P}from"./vendor-react-Co3Y8ikm.js";function C(a){if(!a)return null;try{return JSON.parse(a)}catch{return a}}function K({event:a}){return e.jsxDEV("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3",children:[a.attributes.activity_type&&e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Activity"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:22,columnNumber:11},this),e.jsxDEV("p",{className:"text-xs font-mono text-text-primary",children:a.attributes.activity_type},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:25,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:21,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Kind"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:31,columnNumber:9},this),e.jsxDEV("p",{className:"text-xs font-mono text-text-primary",children:a.attributes.kind},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:34,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:30,columnNumber:7},this),a.duration_ms!==null&&e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Duration"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:40,columnNumber:11},this),e.jsxDEV(O,{ms:a.duration_ms,className:"font-mono text-text-primary"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:43,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:39,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Time"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:47,columnNumber:9},this),e.jsxDEV($,{date:a.event_time,format:"datetime",className:"font-mono text-text-primary"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:50,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:46,columnNumber:7},this),a.attributes.signal_name&&e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Signal"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:55,columnNumber:11},this),e.jsxDEV("p",{className:"text-xs font-mono text-text-primary",children:a.attributes.signal_name},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:58,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:54,columnNumber:9},this),a.attributes.awaited!==void 0&&e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Awaited"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:66,columnNumber:11},this),e.jsxDEV("p",{className:"text-xs font-mono text-text-primary",children:a.attributes.awaited?"Yes":"No (fire-and-forget)"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:69,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:65,columnNumber:9},this),a.attributes.timeline_key&&e.jsxDEV("div",{className:"col-span-2",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Timeline Key"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:77,columnNumber:11},this),e.jsxDEV("p",{className:"text-xs font-mono text-text-primary truncate",title:a.attributes.timeline_key,children:a.attributes.timeline_key},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:80,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:76,columnNumber:9},this),a.attributes.execution_index!==void 0&&e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Exec Index"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:88,columnNumber:11},this),e.jsxDEV("p",{className:"text-xs font-mono text-text-primary",children:a.attributes.execution_index},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:91,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:87,columnNumber:9},this),a.attributes.scheduled_event_id!=null&&e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Scheduled Event"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:99,columnNumber:11},this),e.jsxDEV("p",{className:"text-xs font-mono text-text-primary",children:["#",a.attributes.scheduled_event_id]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:102,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:98,columnNumber:9},this),a.attributes.wait_event_id!=null&&e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Wait Started"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:109,columnNumber:11},this),e.jsxDEV("p",{className:"text-xs font-mono text-text-primary",children:["Event #",a.attributes.wait_event_id]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:112,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:108,columnNumber:9},this),a.attributes.initiated_event_id!=null&&e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Initiated Event"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:119,columnNumber:11},this),e.jsxDEV("p",{className:"text-xs font-mono text-text-primary",children:["#",a.attributes.initiated_event_id]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:122,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:118,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:19,columnNumber:5},this)}function J({event:a,childTask:i}){const o=i?C(i.envelope):null,d=i?C(i.data):null;return!i&&a.attributes.child_workflow_id?e.jsxDEV("div",{className:"border-t border-surface-border pt-3",children:e.jsxDEV("div",{className:"flex items-center gap-3 flex-wrap",children:[e.jsxDEV("span",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Child Workflow"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:143,columnNumber:11},this),e.jsxDEV(P,{to:`/workflows/executions/${a.attributes.child_workflow_id}`,className:"text-xs font-mono text-accent hover:underline",onClick:u=>u.stopPropagation(),children:a.attributes.child_workflow_id},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:146,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:142,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:141,columnNumber:7},this):i?e.jsxDEV("div",{className:"space-y-3 border-t border-surface-border pt-3",children:[e.jsxDEV("div",{className:"flex items-center gap-3 flex-wrap",children:[e.jsxDEV("span",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Child Workflow"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:163,columnNumber:11},this),e.jsxDEV(P,{to:`/workflows/executions/${i.workflow_id}`,className:"text-xs font-mono text-accent hover:underline",onClick:u=>u.stopPropagation(),children:i.workflow_id},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:166,columnNumber:11},this),e.jsxDEV(R,{status:i.status},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:173,columnNumber:11},this),i.completed_at&&e.jsxDEV("span",{className:"text-[10px] text-text-tertiary",children:["Completed ",e.jsxDEV($,{date:i.completed_at,format:"relative"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:176,columnNumber:25},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:175,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:162,columnNumber:9},this),(o!=null||d!=null)&&e.jsxDEV("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[o!=null?e.jsxDEV(v,{data:o,label:"Input (Envelope)",variant:"panel"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:184,columnNumber:15},this):e.jsxDEV("div",{},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:185,columnNumber:17},this),d!=null?e.jsxDEV(v,{data:d,label:"Output (Result)",variant:"panel"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:187,columnNumber:15},this):e.jsxDEV("div",{},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:188,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:182,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:161,columnNumber:7},this):null}function B({event:a,childTask:i}){const o=a.attributes.input,d=a.attributes.result,u=a.category==="signal",c=a.category==="activity",l=a.category==="child_workflow",n=o!==void 0&&(c||l),p=!i&&d!==void 0&&(c||l),m=a.attributes.activity_type==="ltSignalParent"?"Signal Payload":"Result";return n||p?e.jsxDEV("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[n?e.jsxDEV(v,{data:o,label:"Input",variant:"panel"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:215,columnNumber:11},this):e.jsxDEV("div",{},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:216,columnNumber:13},this),p?e.jsxDEV(v,{data:d,label:m,variant:"panel"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:218,columnNumber:11},this):e.jsxDEV("div",{},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:219,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:213,columnNumber:7},this):u&&o!==void 0?e.jsxDEV(v,{data:o,label:"Signal Payload",variant:"panel"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventMetadataGrid.tsx",lineNumber:225,columnNumber:12},this):null}function Y({event:a,childTask:i,pending:o=!1,onClose:d}){return e.jsxDEV("div",{className:"p-4 bg-surface-sunken rounded-md space-y-4",children:[e.jsxDEV("div",{className:"flex items-center justify-between gap-2",children:[e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("p",{className:"font-mono font-medium text-sm text-text-primary",children:a.attributes.activity_type??a.attributes.signal_name??a.attributes.child_workflow_id??a.event_type},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventDetailPanel.tsx",lineNumber:30,columnNumber:11},this),o&&e.jsxDEV("span",{className:"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-status-warning/15 text-status-warning",children:[e.jsxDEV("span",{className:"w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventDetailPanel.tsx",lineNumber:38,columnNumber:15},this),"Pending"]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventDetailPanel.tsx",lineNumber:37,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventDetailPanel.tsx",lineNumber:29,columnNumber:9},this),d&&e.jsxDEV("button",{onClick:d,className:"text-text-tertiary hover:text-text-primary text-xs",children:"Close"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventDetailPanel.tsx",lineNumber:44,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventDetailPanel.tsx",lineNumber:28,columnNumber:7},this),e.jsxDEV(K,{event:a},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventDetailPanel.tsx",lineNumber:54,columnNumber:7},this),e.jsxDEV(J,{event:a,childTask:i},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventDetailPanel.tsx",lineNumber:57,columnNumber:7},this),e.jsxDEV(B,{event:a,childTask:i},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventDetailPanel.tsx",lineNumber:60,columnNumber:7},this),a.attributes.failure!==void 0&&e.jsxDEV(v,{data:a.attributes.failure,label:"Failure"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventDetailPanel.tsx",lineNumber:64,columnNumber:9},this),(()=>{const{kind:u,activity_type:c,result:l,timeline_key:n,execution_index:p,signal_name:m,input:N,child_workflow_id:V,awaited:k,wait_event_id:w,scheduled_event_id:g,initiated_event_id:f,failure:x,trace_id:D,span_id:S,...y}=a.attributes;return Object.keys(y).length>0?e.jsxDEV(v,{data:y,label:"Attributes"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventDetailPanel.tsx",lineNumber:88,columnNumber:11},this):null})()]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventDetailPanel.tsx",lineNumber:26,columnNumber:5},this)}const h={activity:{bar:"bg-blue-500",outline:"border-blue-500 bg-transparent",text:"text-blue-500",label:"Activities"},signal:{bar:"bg-emerald-500",outline:"border-emerald-500 bg-transparent",text:"text-emerald-500",label:"Signals"},timer:{bar:"bg-status-warning",outline:"border-status-warning bg-transparent",text:"text-status-warning",label:"Timers"},child_workflow:{bar:"bg-violet-500",outline:"border-violet-500 bg-transparent",text:"text-violet-500",label:"Child Workflows"}},z="bg-stripes animate-pulse opacity-70",F=new Set(["callLLM","callDbTool","callVisionTool","callMcpTool","getDBTools","getVisionTools"]);function H(a,i){if(a.length<=i)return a;const o=Math.floor((i-1)/2);return`${a.slice(0,o)}…${a.slice(a.length-o)}`}function q(a){const i=[],o=new Map,d=new Map;for(const c of a){const l=c.attributes.timeline_key;if(!l)continue;const n=c.event_type;n==="activity_task_scheduled"||n==="timer_started"||n==="child_workflow_execution_started"||n==="signal_wait_started"?o.set(l,c):d.set(l,c)}const u=new Set;for(const c of a){const l=c.attributes.timeline_key;if(l&&u.has(l))continue;l&&u.add(l);const n=l?o.get(l):void 0,p=l?d.get(l):void 0,m=p||n||c,N=m.category,V=m.attributes.activity_type||m.attributes.signal_name||m.attributes.child_workflow_id||m.event_type,k=n||m,w=p,g=new Date(k.event_time).getTime();let f=null,x=null,D=!1;w?(f=new Date(w.event_time).getTime(),x=w.duration_ms??f-g):m.duration_ms!==null?(x=m.duration_ms,f=g+x):D=!0,i.push({category:N,name:V||m.event_type,startTime:g,endTime:f,duration:x,eventId:m.event_id,pending:D})}return i}function ee({events:a,childTasks:i,outline:o}){const[d,u]=W.useState(new Set),l=a.filter(t=>t.category!=="workflow");if(l.length===0)return null;const n=q(l);if(n.length===0)return null;const p=Date.now(),m=n.flatMap(t=>{const r=[t.startTime];return t.endTime?r.push(t.endTime):r.push(p),r}),N=Math.min(...m),k=Math.max(...m)-N||1,w=new Map;for(const t of n){const r=`${t.category}:${t.name}`,s=t.startTime-N,E=(t.endTime?t.endTime-N:p-N)-s,_={eventId:t.eventId,startPct:s/k*100,widthPct:Math.max(E/k*100,.5),duration:t.duration,label:`${t.name} — ${t.duration!==null?M(t.duration):"pending"} — ${new Date(t.startTime).toLocaleTimeString()}`,eventTime:new Date(t.startTime).toISOString(),pending:t.pending};w.has(r)||w.set(r,{name:t.name,category:t.category,segments:[]}),w.get(r).segments.push(_)}const g=Array.from(w.values()),f=5,x=Array.from({length:f+1},(t,r)=>({pct:r/f*100,label:M(Math.round(r/f*k))})),D=[...new Set(n.map(t=>t.category))],S=t=>{if(!(i!=null&&i.length))return;const r=t.attributes.activity_type;if(r)return i.find(s=>s.workflow_type===r)},y=t=>{u(r=>{const s=new Set(r);return s.has(t)?s.delete(t):s.add(t),s})},j=n.map(t=>t.eventId),G=j.length>0&&j.every(t=>d.has(t)),I=()=>{u(G?new Set:new Set(j))},T=(t,r)=>{var s,b;return r?z:o?((s=h[t])==null?void 0:s.outline)??"border-text-tertiary bg-transparent":((b=h[t])==null?void 0:b.bar)??"bg-text-tertiary"},A=t=>{var r;return o?((r=h[t])==null?void 0:r.text)??"text-text-tertiary":"text-white"};return e.jsxDEV("div",{className:"px-6 py-6 mb-6",children:[e.jsxDEV("div",{className:"flex items-center gap-4 mb-4 flex-wrap",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Execution Timeline"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:133,columnNumber:9},this),e.jsxDEV("button",{onClick:I,className:"text-[10px] text-accent hover:underline",children:G?"Collapse all":"Expand all"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:136,columnNumber:9},this),e.jsxDEV("div",{className:"flex items-center gap-3 ml-auto",children:[D.map(t=>{var r,s,b;return e.jsxDEV("div",{className:"flex items-center gap-1",children:[e.jsxDEV("span",{className:`w-2 h-2 rounded-full ${o?`border ${((r=h[t])==null?void 0:r.outline)??"border-text-tertiary"}`:((s=h[t])==null?void 0:s.bar)??"bg-text-tertiary"}`},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:144,columnNumber:15},this),e.jsxDEV("span",{className:"text-[9px] text-text-tertiary",children:((b=h[t])==null?void 0:b.label)??t},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:145,columnNumber:15},this)]},t,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:143,columnNumber:13},this)}),n.some(t=>t.pending)&&e.jsxDEV("div",{className:"flex items-center gap-1",children:[e.jsxDEV("span",{className:"w-2 h-2 rounded-full bg-status-warning animate-pulse"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:152,columnNumber:15},this),e.jsxDEV("span",{className:"text-[9px] text-text-tertiary",children:"Pending"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:153,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:151,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:141,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:132,columnNumber:7},this),e.jsxDEV("div",{className:"flex",children:[e.jsxDEV("div",{className:"w-56 shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:161,columnNumber:9},this),e.jsxDEV("div",{className:"flex-1 relative h-6 border-b border-surface-border",children:x.map(t=>e.jsxDEV("span",{className:"absolute text-[9px] font-mono text-text-tertiary -translate-x-1/2 bottom-1",style:{left:`${t.pct}%`},children:t.label},t.pct,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:164,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:162,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:160,columnNumber:7},this),g.map(t=>{const r=h[t.category];return e.jsxDEV("div",{children:[e.jsxDEV("div",{className:"flex items-center border-b border-surface-border",children:[e.jsxDEV("div",{className:"w-56 shrink-0 py-3 pr-4 flex items-center gap-2",children:[e.jsxDEV("span",{className:`w-1.5 h-1.5 rounded-full shrink-0 ${(r==null?void 0:r.bar)??"bg-text-tertiary"}`},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:184,columnNumber:17},this),e.jsxDEV("p",{className:"text-xs font-mono text-text-secondary whitespace-nowrap overflow-hidden",title:t.name,children:H(t.name,28)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:185,columnNumber:17},this),F.has(t.name)&&e.jsxDEV("span",{className:"shrink-0 text-accent/60",title:"MCP tool interaction",children:e.jsxDEV("svg",{className:"w-3 h-3",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.663 17h4.674M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:194,columnNumber:23},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:193,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:192,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:183,columnNumber:15},this),e.jsxDEV("div",{className:"flex-1 relative h-10",children:[x.map(s=>e.jsxDEV("div",{className:"absolute top-0 bottom-0 w-px bg-surface-border opacity-30",style:{left:`${s.pct}%`}},s.pct,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:202,columnNumber:19},this)),t.segments.map(s=>e.jsxDEV("div",{className:`absolute top-2 h-6 rounded-sm cursor-pointer transition-all duration-200 ${o?"border-2":""} ${d.has(s.eventId)?`${T(t.category,s.pending)} ring-2 ring-accent ring-offset-1`:`${T(t.category,s.pending)} hover:opacity-80`}`,style:{left:`${s.startPct}%`,width:`${s.widthPct}%`,minWidth:"4px"},title:s.label,onClick:()=>y(s.eventId),children:s.widthPct>8&&e.jsxDEV("span",{className:`absolute inset-0 flex items-center px-1.5 text-[9px] font-mono ${A(t.category)} truncate`,children:s.duration!==null?M(s.duration):"pending"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:226,columnNumber:23},this)},s.eventId,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:210,columnNumber:19},this))]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:200,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:182,columnNumber:13},this),t.segments.map(s=>{const b=d.has(s.eventId),E=l.find(_=>_.event_id===s.eventId);return e.jsxDEV(L,{open:b,children:E&&e.jsxDEV("div",{className:"py-3",children:e.jsxDEV(Y,{event:E,childTask:S(E),pending:s.pending,onClose:()=>y(E.event_id)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:243,columnNumber:23},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:242,columnNumber:21},this)},s.eventId,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:240,columnNumber:17},this)})]},`${t.category}:${t.name}`,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:180,columnNumber:11},this)})]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx",lineNumber:131,columnNumber:5},this)}export{Y as E,ee as S};
2
+ //# sourceMappingURL=SwimlaneTimeline-ClwumkT1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SwimlaneTimeline-ClwumkT1.js","sources":["../../src/pages/workflows/workflow-execution/EventMetadataGrid.tsx","../../src/pages/workflows/workflow-execution/EventDetailPanel.tsx","../../src/pages/workflows/workflow-execution/utils.ts","../../src/pages/workflows/workflow-execution/SwimlaneTimeline.tsx"],"sourcesContent":["import { Link } from 'react-router-dom';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { DateValue } from '../../../components/common/display/DateValue';\nimport { DurationValue } from '../../../components/common/display/DurationValue';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\n\nfunction safeParseJson(raw: string | null | undefined): unknown {\n if (!raw) return null;\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\nexport function EventMetadataGrid({ event }: { event: WorkflowExecutionEvent }) {\n return (\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-3\">\n {event.attributes.activity_type && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Activity\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.activity_type}\n </p>\n </div>\n )}\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Kind\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.kind}\n </p>\n </div>\n {event.duration_ms !== null && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Duration\n </p>\n <DurationValue ms={event.duration_ms} className=\"font-mono text-text-primary\" />\n </div>\n )}\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Time\n </p>\n <DateValue date={event.event_time} format=\"datetime\" className=\"font-mono text-text-primary\" />\n </div>\n\n {event.attributes.signal_name && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Signal\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.signal_name}\n </p>\n </div>\n )}\n\n {event.attributes.awaited !== undefined && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Awaited\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.awaited ? 'Yes' : 'No (fire-and-forget)'}\n </p>\n </div>\n )}\n\n {event.attributes.timeline_key && (\n <div className=\"col-span-2\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Timeline Key\n </p>\n <p className=\"text-xs font-mono text-text-primary truncate\" title={event.attributes.timeline_key}>\n {event.attributes.timeline_key}\n </p>\n </div>\n )}\n\n {event.attributes.execution_index !== undefined && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Exec Index\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n {event.attributes.execution_index}\n </p>\n </div>\n )}\n\n {event.attributes.scheduled_event_id != null && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Scheduled Event\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n #{event.attributes.scheduled_event_id}\n </p>\n </div>\n )}\n {event.attributes.wait_event_id != null && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Wait Started\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n Event #{event.attributes.wait_event_id}\n </p>\n </div>\n )}\n {event.attributes.initiated_event_id != null && (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Initiated Event\n </p>\n <p className=\"text-xs font-mono text-text-primary\">\n #{event.attributes.initiated_event_id}\n </p>\n </div>\n )}\n </div>\n );\n}\n\nexport function ChildWorkflowSection({ event, childTask }: {\n event: WorkflowExecutionEvent;\n childTask?: LTTaskRecord;\n}) {\n const childInput = childTask ? safeParseJson(childTask.envelope) : null;\n const childOutput = childTask ? safeParseJson(childTask.data) : null;\n\n // Link-only (no matching task record)\n if (!childTask && event.attributes.child_workflow_id) {\n return (\n <div className=\"border-t border-surface-border pt-3\">\n <div className=\"flex items-center gap-3 flex-wrap\">\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Child Workflow\n </span>\n <Link\n to={`/workflows/executions/${event.attributes.child_workflow_id}`}\n className=\"text-xs font-mono text-accent hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n {event.attributes.child_workflow_id}\n </Link>\n </div>\n </div>\n );\n }\n\n // Full child task section\n if (childTask) {\n return (\n <div className=\"space-y-3 border-t border-surface-border pt-3\">\n <div className=\"flex items-center gap-3 flex-wrap\">\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Child Workflow\n </span>\n <Link\n to={`/workflows/executions/${childTask.workflow_id}`}\n className=\"text-xs font-mono text-accent hover:underline\"\n onClick={(e) => e.stopPropagation()}\n >\n {childTask.workflow_id}\n </Link>\n <StatusBadge status={childTask.status} />\n {childTask.completed_at && (\n <span className=\"text-[10px] text-text-tertiary\">\n Completed <DateValue date={childTask.completed_at} format=\"relative\" />\n </span>\n )}\n </div>\n\n {(childInput != null || childOutput != null) && (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {childInput != null ? (\n <JsonViewer data={childInput} label=\"Input (Envelope)\" variant=\"panel\" />\n ) : <div />}\n {childOutput != null ? (\n <JsonViewer data={childOutput} label=\"Output (Result)\" variant=\"panel\" />\n ) : <div />}\n </div>\n )}\n </div>\n );\n }\n\n return null;\n}\n\nexport function EventPayloadSection({ event, childTask }: {\n event: WorkflowExecutionEvent;\n childTask?: LTTaskRecord;\n}) {\n const input = event.attributes.input;\n const result = event.attributes.result;\n const isSignal = event.category === 'signal';\n const isActivity = event.category === 'activity';\n const isChild = event.category === 'child_workflow';\n const hasInput = input !== undefined && (isActivity || isChild);\n const hasResult = !childTask && result !== undefined && (isActivity || isChild);\n const resultLabel = event.attributes.activity_type === 'ltSignalParent' ? 'Signal Payload' : 'Result';\n\n if (hasInput || hasResult) {\n return (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {hasInput ? (\n <JsonViewer data={input} label=\"Input\" variant=\"panel\" />\n ) : <div />}\n {hasResult ? (\n <JsonViewer data={result} label={resultLabel} variant=\"panel\" />\n ) : <div />}\n </div>\n );\n }\n\n if (isSignal && input !== undefined) {\n return <JsonViewer data={input} label=\"Signal Payload\" variant=\"panel\" />;\n }\n\n return null;\n}\n","import { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\nimport { EventMetadataGrid, ChildWorkflowSection, EventPayloadSection } from './EventMetadataGrid';\n\ninterface EventDetailPanelProps {\n event: WorkflowExecutionEvent;\n childTask?: LTTaskRecord;\n /** When true, show a \"Pending\" badge. Caller determines this from the full event list. */\n pending?: boolean;\n onClose?: () => void;\n}\n\n/**\n * Reusable detail panel for a workflow execution event.\n * Renders inline wherever placed — used by both SwimlaneTimeline\n * (below the lane row) and EventTable (below the event row).\n *\n * Shows rich detail for all event categories:\n * - Activities: activity_type, result, scheduled_event_id\n * - Signals: signal_name, payload, wait_event_id\n * - Timers: duration\n * - Child workflows: child_workflow_id link, awaited badge, result\n */\nexport function EventDetailPanel({ event, childTask, pending = false, onClose }: EventDetailPanelProps) {\n return (\n <div className=\"p-4 bg-surface-sunken rounded-md space-y-4\">\n {/* Header */}\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <p className=\"font-mono font-medium text-sm text-text-primary\">\n {event.attributes.activity_type\n ?? event.attributes.signal_name\n ?? event.attributes.child_workflow_id\n ?? event.event_type}\n </p>\n {pending && (\n <span className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-status-warning/15 text-status-warning\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse\" />\n Pending\n </span>\n )}\n </div>\n {onClose && (\n <button\n onClick={onClose}\n className=\"text-text-tertiary hover:text-text-primary text-xs\"\n >\n Close\n </button>\n )}\n </div>\n\n {/* Metadata grid */}\n <EventMetadataGrid event={event} />\n\n {/* Child workflow sections */}\n <ChildWorkflowSection event={event} childTask={childTask} />\n\n {/* Input / Result payload */}\n <EventPayloadSection event={event} childTask={childTask} />\n\n {/* Failure detail */}\n {event.attributes.failure !== undefined && (\n <JsonViewer data={event.attributes.failure} label=\"Failure\" />\n )}\n\n {/* Remaining attributes (exclude the fields shown above) */}\n {(() => {\n const {\n kind,\n activity_type,\n result,\n timeline_key,\n execution_index,\n signal_name,\n input,\n child_workflow_id,\n awaited,\n wait_event_id,\n scheduled_event_id,\n initiated_event_id,\n failure,\n trace_id,\n span_id,\n ...rest\n } = event.attributes;\n return Object.keys(rest).length > 0 ? (\n <JsonViewer data={rest} label=\"Attributes\" />\n ) : null;\n })()}\n </div>\n );\n}\n","export { formatDuration, formatDateTime } from '../../../lib/format';\n\nimport type { WorkflowExecutionEvent } from '../../../api/types';\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport interface Segment {\n eventId: number;\n startPct: number;\n widthPct: number;\n duration: number | null;\n label: string;\n eventTime: string;\n pending: boolean;\n}\n\nexport interface Lane {\n name: string;\n category: string;\n segments: Segment[];\n}\n\n// ── Constants ────────────────────────────────────────────────────────────────\n\nexport const CATEGORY_COLORS: Record<string, { bar: string; outline: string; text: string; label: string }> = {\n activity: { bar: 'bg-blue-500', outline: 'border-blue-500 bg-transparent', text: 'text-blue-500', label: 'Activities' },\n signal: { bar: 'bg-emerald-500', outline: 'border-emerald-500 bg-transparent', text: 'text-emerald-500', label: 'Signals' },\n timer: { bar: 'bg-status-warning', outline: 'border-status-warning bg-transparent', text: 'text-status-warning', label: 'Timers' },\n child_workflow: { bar: 'bg-violet-500', outline: 'border-violet-500 bg-transparent', text: 'text-violet-500', label: 'Child Workflows' },\n};\n\nexport const PENDING_CLASS = 'bg-stripes animate-pulse opacity-70';\n\n/** Activity names that indicate LLM/MCP tool interaction */\nexport const MCP_ACTIVITY_NAMES = new Set([\n 'callLLM', 'callDbTool', 'callVisionTool', 'callMcpTool', 'getDBTools', 'getVisionTools',\n]);\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\n/** Truncate a string in the middle, keeping the start and end visible. */\nexport function middleTruncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n const keep = Math.floor((maxLen - 1) / 2);\n return `${str.slice(0, keep)}…${str.slice(str.length - keep)}`;\n}\n\nexport interface TimelineSpan {\n category: string;\n name: string;\n startTime: number;\n endTime: number | null;\n duration: number | null;\n eventId: number;\n pending: boolean;\n}\n\n/**\n * Group paired events (scheduled→completed, started→fired, wait→signaled)\n * into a single span using timeline_key, or treat standalone events as points.\n */\nexport function buildTimelineSpans(events: WorkflowExecutionEvent[]): TimelineSpan[] {\n const spans: TimelineSpan[] = [];\n\n // Index scheduled/started events by timeline_key for pairing\n const startedMap = new Map<string, WorkflowExecutionEvent>();\n const completedMap = new Map<string, WorkflowExecutionEvent>();\n\n for (const evt of events) {\n const tlKey = evt.attributes.timeline_key;\n if (!tlKey) continue;\n const type = evt.event_type;\n\n if (type === 'activity_task_scheduled'\n || type === 'timer_started'\n || type === 'child_workflow_execution_started'\n || type === 'signal_wait_started') {\n startedMap.set(tlKey, evt);\n } else {\n completedMap.set(tlKey, evt);\n }\n }\n\n // Build spans from pairs\n const seen = new Set<string>();\n\n for (const evt of events) {\n const tlKey = evt.attributes.timeline_key;\n\n // Skip if no timeline_key or already processed\n if (tlKey && seen.has(tlKey)) continue;\n if (tlKey) seen.add(tlKey);\n\n const started = tlKey ? startedMap.get(tlKey) : undefined;\n const completed = tlKey ? completedMap.get(tlKey) : undefined;\n\n // Determine the representative event for this span\n const primary = completed || started || evt;\n const cat = primary.category;\n const name = primary.attributes.activity_type\n || primary.attributes.signal_name\n || primary.attributes.child_workflow_id\n || primary.event_type;\n\n const startEvt = started || primary;\n const endEvt = completed;\n\n const startMs = new Date(startEvt.event_time).getTime();\n let endMs: number | null = null;\n let dur: number | null = null;\n let pending = false;\n\n if (endEvt) {\n endMs = new Date(endEvt.event_time).getTime();\n dur = endEvt.duration_ms ?? (endMs - startMs);\n } else if (primary.duration_ms !== null) {\n dur = primary.duration_ms;\n endMs = startMs + dur;\n } else {\n // Pending — no completion event\n pending = true;\n }\n\n spans.push({\n category: cat,\n name: name || primary.event_type,\n startTime: startMs,\n endTime: endMs,\n duration: dur,\n eventId: primary.event_id,\n pending,\n });\n }\n\n return spans;\n}\n","import { useState } from 'react';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\nimport { EventDetailPanel } from './EventDetailPanel';\nimport {\n formatDuration,\n middleTruncate,\n buildTimelineSpans,\n CATEGORY_COLORS,\n PENDING_CLASS,\n MCP_ACTIVITY_NAMES,\n} from './utils';\nimport type { Segment, Lane } from './utils';\n\ninterface SwimlaneTimelineProps {\n events: WorkflowExecutionEvent[];\n childTasks?: LTTaskRecord[];\n /** Use outline-style bars (border + transparent fill) instead of solid fills */\n outline?: boolean;\n}\n\n// ── Component ────────────────────────────────────────────────────────────────\n\nexport function SwimlaneTimeline({ events, childTasks, outline }: SwimlaneTimelineProps) {\n const [selectedEvents, setSelectedEvents] = useState<Set<number>>(new Set());\n\n // Filter out workflow-level events (started/completed) — they aren't operations\n const timelineEvents = events.filter(\n (e) => e.category !== 'workflow',\n );\n\n // Show all activities (user + system), signals, timers, and child workflows.\n const displayEvents = timelineEvents;\n\n if (displayEvents.length === 0) return null;\n\n const spans = buildTimelineSpans(displayEvents);\n if (spans.length === 0) return null;\n\n // Compute time axis bounds\n const now = Date.now();\n const allTimes = spans.flatMap((s) => {\n const times = [s.startTime];\n if (s.endTime) times.push(s.endTime);\n else times.push(now); // pending extends to now\n return times;\n });\n const timeMin = Math.min(...allTimes);\n const timeMax = Math.max(...allTimes);\n const totalSpan = timeMax - timeMin || 1;\n\n // Group spans into lanes by \"category:name\"\n const laneMap = new Map<string, { name: string; category: string; segments: Segment[] }>();\n\n for (const span of spans) {\n const laneKey = `${span.category}:${span.name}`;\n const startOffset = span.startTime - timeMin;\n const endOffset = span.endTime ? span.endTime - timeMin : (now - timeMin);\n const widthMs = endOffset - startOffset;\n\n const segment: Segment = {\n eventId: span.eventId,\n startPct: (startOffset / totalSpan) * 100,\n widthPct: Math.max((widthMs / totalSpan) * 100, 0.5),\n duration: span.duration,\n label: `${span.name} — ${span.duration !== null ? formatDuration(span.duration) : 'pending'} — ${new Date(span.startTime).toLocaleTimeString()}`,\n eventTime: new Date(span.startTime).toISOString(),\n pending: span.pending,\n };\n\n if (!laneMap.has(laneKey)) {\n laneMap.set(laneKey, { name: span.name, category: span.category, segments: [] });\n }\n laneMap.get(laneKey)!.segments.push(segment);\n }\n\n const lanes: Lane[] = Array.from(laneMap.values());\n\n // Time axis ticks\n const tickCount = 5;\n const ticks = Array.from({ length: tickCount + 1 }, (_, i) => ({\n pct: (i / tickCount) * 100,\n label: formatDuration(Math.round((i / tickCount) * totalSpan)),\n }));\n\n // Active categories for legend\n const activeCategories = [...new Set(spans.map((s) => s.category))];\n\n /** Find a matching child task for an event */\n const findChildTask = (evt: WorkflowExecutionEvent): LTTaskRecord | undefined => {\n if (!childTasks?.length) return undefined;\n const activityType = evt.attributes.activity_type;\n if (!activityType) return undefined;\n return childTasks.find((t) => t.workflow_type === activityType);\n };\n\n const toggleEvent = (id: number) => {\n setSelectedEvents((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const allEventIds = spans.map((s) => s.eventId);\n const allExpanded = allEventIds.length > 0 && allEventIds.every((id) => selectedEvents.has(id));\n\n const toggleAll = () => {\n if (allExpanded) {\n setSelectedEvents(new Set());\n } else {\n setSelectedEvents(new Set(allEventIds));\n }\n };\n\n\n\n const barColor = (cat: string, pending: boolean) => {\n if (pending) return PENDING_CLASS;\n if (outline) return CATEGORY_COLORS[cat]?.outline ?? 'border-text-tertiary bg-transparent';\n return CATEGORY_COLORS[cat]?.bar ?? 'bg-text-tertiary';\n };\n\n const textColor = (cat: string) => {\n if (outline) return CATEGORY_COLORS[cat]?.text ?? 'text-text-tertiary';\n return 'text-white';\n };\n\n return (\n <div className=\"px-6 py-6 mb-6\">\n <div className=\"flex items-center gap-4 mb-4 flex-wrap\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Execution Timeline\n </p>\n <button onClick={toggleAll} className=\"text-[10px] text-accent hover:underline\">\n {allExpanded ? 'Collapse all' : 'Expand all'}\n </button>\n\n {/* Legend */}\n <div className=\"flex items-center gap-3 ml-auto\">\n {activeCategories.map((cat) => (\n <div key={cat} className=\"flex items-center gap-1\">\n <span className={`w-2 h-2 rounded-full ${outline ? `border ${CATEGORY_COLORS[cat]?.outline ?? 'border-text-tertiary'}` : CATEGORY_COLORS[cat]?.bar ?? 'bg-text-tertiary'}`} />\n <span className=\"text-[9px] text-text-tertiary\">\n {CATEGORY_COLORS[cat]?.label ?? cat}\n </span>\n </div>\n ))}\n {spans.some((s) => s.pending) && (\n <div className=\"flex items-center gap-1\">\n <span className=\"w-2 h-2 rounded-full bg-status-warning animate-pulse\" />\n <span className=\"text-[9px] text-text-tertiary\">Pending</span>\n </div>\n )}\n </div>\n </div>\n\n {/* Time axis */}\n <div className=\"flex\">\n <div className=\"w-56 shrink-0\" />\n <div className=\"flex-1 relative h-6 border-b border-surface-border\">\n {ticks.map((tick) => (\n <span\n key={tick.pct}\n className=\"absolute text-[9px] font-mono text-text-tertiary -translate-x-1/2 bottom-1\"\n style={{ left: `${tick.pct}%` }}\n >\n {tick.label}\n </span>\n ))}\n </div>\n </div>\n\n {/* Lanes */}\n {lanes.map((lane) => {\n const catColor = CATEGORY_COLORS[lane.category];\n\n return (\n <div key={`${lane.category}:${lane.name}`}>\n {/* Lane row */}\n <div className=\"flex items-center border-b border-surface-border\">\n <div className=\"w-56 shrink-0 py-3 pr-4 flex items-center gap-2\">\n <span className={`w-1.5 h-1.5 rounded-full shrink-0 ${catColor?.bar ?? 'bg-text-tertiary'}`} />\n <p\n className=\"text-xs font-mono text-text-secondary whitespace-nowrap overflow-hidden\"\n title={lane.name}\n >\n {middleTruncate(lane.name, 28)}\n </p>\n {MCP_ACTIVITY_NAMES.has(lane.name) && (\n <span className=\"shrink-0 text-accent/60\" title=\"MCP tool interaction\">\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.663 17h4.674M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\" />\n </svg>\n </span>\n )}\n </div>\n\n <div className=\"flex-1 relative h-10\">\n {ticks.map((tick) => (\n <div\n key={tick.pct}\n className=\"absolute top-0 bottom-0 w-px bg-surface-border opacity-30\"\n style={{ left: `${tick.pct}%` }}\n />\n ))}\n\n {lane.segments.map((seg) => (\n <div\n key={seg.eventId}\n className={`absolute top-2 h-6 rounded-sm cursor-pointer transition-all duration-200 ${outline ? 'border-2' : ''} ${\n selectedEvents.has(seg.eventId)\n ? `${barColor(lane.category, seg.pending)} ring-2 ring-accent ring-offset-1`\n : `${barColor(lane.category, seg.pending)} hover:opacity-80`\n }`}\n style={{\n left: `${seg.startPct}%`,\n width: `${seg.widthPct}%`,\n minWidth: '4px',\n }}\n title={seg.label}\n onClick={() => toggleEvent(seg.eventId)}\n >\n {seg.widthPct > 8 && (\n <span className={`absolute inset-0 flex items-center px-1.5 text-[9px] font-mono ${textColor(lane.category)} truncate`}>\n {seg.duration !== null ? formatDuration(seg.duration) : 'pending'}\n </span>\n )}\n </div>\n ))}\n </div>\n </div>\n\n {/* Inline detail panels */}\n {lane.segments.map((seg) => {\n const isOpen = selectedEvents.has(seg.eventId);\n const evt = displayEvents.find((e) => e.event_id === seg.eventId);\n return (\n <Collapsible key={seg.eventId} open={isOpen}>\n {evt && (\n <div className=\"py-3\">\n <EventDetailPanel\n event={evt}\n childTask={findChildTask(evt)}\n pending={seg.pending}\n onClose={() => toggleEvent(evt.event_id)}\n />\n </div>\n )}\n </Collapsible>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":["safeParseJson","raw","EventMetadataGrid","event","jsxDEV","DurationValue","DateValue","ChildWorkflowSection","childTask","childInput","childOutput","Link","e","StatusBadge","JsonViewer","EventPayloadSection","input","result","isSignal","isActivity","isChild","hasInput","hasResult","resultLabel","EventDetailPanel","pending","onClose","kind","activity_type","timeline_key","execution_index","signal_name","child_workflow_id","awaited","wait_event_id","scheduled_event_id","initiated_event_id","failure","trace_id","span_id","rest","CATEGORY_COLORS","PENDING_CLASS","MCP_ACTIVITY_NAMES","middleTruncate","str","maxLen","keep","buildTimelineSpans","events","spans","startedMap","completedMap","evt","tlKey","type","seen","started","completed","primary","cat","name","startEvt","endEvt","startMs","endMs","dur","SwimlaneTimeline","childTasks","outline","selectedEvents","setSelectedEvents","useState","displayEvents","now","allTimes","s","times","timeMin","totalSpan","laneMap","span","laneKey","startOffset","widthMs","segment","formatDuration","lanes","tickCount","ticks","_","i","activeCategories","findChildTask","activityType","t","toggleEvent","id","prev","next","allEventIds","allExpanded","toggleAll","barColor","_a","_b","textColor","tick","lane","catColor","seg","isOpen","Collapsible"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as o}from"./index-Cmgrk7PQ.js";import{a as l}from"./vendor-query-DLp59M9_.js";import{X as d}from"./vendor-icons-AFGxSeQS.js";function x(t){return t.toLowerCase().replace(/[^a-z0-9-]/g,"").replace(/^-|-$/g,"")}function g({tags:t,onChange:a,placeholder:p="Add tag...",compact:u}){const[r,s]=l.useState(""),m=l.useRef(null),c=e=>{const n=x(e);n&&!t.includes(n)&&a([...t,n]),s("")},i=e=>{a(t.filter(n=>n!==e))},f=e=>{e.key==="Enter"||e.key===","?(e.preventDefault(),c(r)):e.key==="Backspace"&&!r&&t.length>0&&i(t[t.length-1])};return o.jsxDEV("div",{className:u?"flex flex-wrap items-center gap-1.5":"flex flex-wrap items-center gap-1.5 bg-surface-sunken border border-surface-border rounded-md px-2 py-1.5 focus-within:ring-1 focus-within:ring-accent-primary cursor-text",onClick:()=>{var e;return(e=m.current)==null?void 0:e.focus()},children:[t.map(e=>o.jsxDEV("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium",children:[e,o.jsxDEV("button",{type:"button",onClick:n=>{n.stopPropagation(),i(e)},className:"hover:text-status-error transition-colors",children:o.jsxDEV(d,{className:"w-2.5 h-2.5"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/TagInput.tsx",lineNumber:61,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/TagInput.tsx",lineNumber:56,columnNumber:11},this)]},e,!0,{fileName:"/app/dashboard/src/components/common/form/TagInput.tsx",lineNumber:51,columnNumber:9},this)),o.jsxDEV("input",{ref:m,type:"text",value:r,onChange:e=>s(e.target.value),onKeyDown:f,onBlur:()=>{r.trim()&&c(r)},placeholder:t.length===0?p:"",className:"flex-1 min-w-[80px] bg-transparent text-xs text-text-primary outline-none placeholder:text-text-tertiary"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/TagInput.tsx",lineNumber:65,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/TagInput.tsx",lineNumber:42,columnNumber:5},this)}export{g as T};
2
- //# sourceMappingURL=TagInput-ClFhXG-U.js.map
1
+ import{j as o}from"./index-puKKZ5l8.js";import{a as l}from"./vendor-query-DLp59M9_.js";import{X as d}from"./vendor-icons-CWl44VA6.js";function x(t){return t.toLowerCase().replace(/[^a-z0-9-]/g,"").replace(/^-|-$/g,"")}function g({tags:t,onChange:a,placeholder:p="Add tag...",compact:u}){const[r,s]=l.useState(""),m=l.useRef(null),c=e=>{const n=x(e);n&&!t.includes(n)&&a([...t,n]),s("")},i=e=>{a(t.filter(n=>n!==e))},f=e=>{e.key==="Enter"||e.key===","?(e.preventDefault(),c(r)):e.key==="Backspace"&&!r&&t.length>0&&i(t[t.length-1])};return o.jsxDEV("div",{className:u?"flex flex-wrap items-center gap-1.5":"flex flex-wrap items-center gap-1.5 bg-surface-sunken border border-surface-border rounded-md px-2 py-1.5 focus-within:ring-1 focus-within:ring-accent-primary cursor-text",onClick:()=>{var e;return(e=m.current)==null?void 0:e.focus()},children:[t.map(e=>o.jsxDEV("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium",children:[e,o.jsxDEV("button",{type:"button",onClick:n=>{n.stopPropagation(),i(e)},className:"hover:text-status-error transition-colors",children:o.jsxDEV(d,{className:"w-2.5 h-2.5"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/TagInput.tsx",lineNumber:61,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/TagInput.tsx",lineNumber:56,columnNumber:11},this)]},e,!0,{fileName:"/app/dashboard/src/components/common/form/TagInput.tsx",lineNumber:51,columnNumber:9},this)),o.jsxDEV("input",{ref:m,type:"text",value:r,onChange:e=>s(e.target.value),onKeyDown:f,onBlur:()=>{r.trim()&&c(r)},placeholder:t.length===0?p:"",className:"flex-1 min-w-[80px] bg-transparent text-xs text-text-primary outline-none placeholder:text-text-tertiary"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/TagInput.tsx",lineNumber:65,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/TagInput.tsx",lineNumber:42,columnNumber:5},this)}export{g as T};
2
+ //# sourceMappingURL=TagInput-CypDZ6Kl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TagInput-ClFhXG-U.js","sources":["../../src/components/common/form/TagInput.tsx"],"sourcesContent":["import { useState, useRef, type KeyboardEvent } from 'react';\nimport { X } from 'lucide-react';\n\ninterface TagInputProps {\n tags: string[];\n onChange: (tags: string[]) => void;\n placeholder?: string;\n /** Show as compact inline pills (no border wrapper) */\n compact?: boolean;\n}\n\nfunction sanitizeTag(raw: string): string {\n return raw.toLowerCase().replace(/[^a-z0-9-]/g, '').replace(/^-|-$/g, '');\n}\n\nexport function TagInput({ tags, onChange, placeholder = 'Add tag...', compact }: TagInputProps) {\n const [input, setInput] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n const addTag = (raw: string) => {\n const tag = sanitizeTag(raw);\n if (tag && !tags.includes(tag)) {\n onChange([...tags, tag]);\n }\n setInput('');\n };\n\n const removeTag = (tag: string) => {\n onChange(tags.filter((t) => t !== tag));\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault();\n addTag(input);\n } else if (e.key === 'Backspace' && !input && tags.length > 0) {\n removeTag(tags[tags.length - 1]);\n }\n };\n\n return (\n <div\n className={\n compact\n ? 'flex flex-wrap items-center gap-1.5'\n : 'flex flex-wrap items-center gap-1.5 bg-surface-sunken border border-surface-border rounded-md px-2 py-1.5 focus-within:ring-1 focus-within:ring-accent-primary cursor-text'\n }\n onClick={() => inputRef.current?.focus()}\n >\n {tags.map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium\"\n >\n {tag}\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); removeTag(tag); }}\n className=\"hover:text-status-error transition-colors\"\n >\n <X className=\"w-2.5 h-2.5\" />\n </button>\n </span>\n ))}\n <input\n ref={inputRef}\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={() => { if (input.trim()) addTag(input); }}\n placeholder={tags.length === 0 ? placeholder : ''}\n className=\"flex-1 min-w-[80px] bg-transparent text-xs text-text-primary outline-none placeholder:text-text-tertiary\"\n />\n </div>\n );\n}\n"],"names":["sanitizeTag","raw","TagInput","tags","onChange","placeholder","compact","input","setInput","useState","inputRef","useRef","addTag","tag","removeTag","t","handleKeyDown","jsxDEV","_a","e","X"],"mappings":"sIAWA,SAASA,EAAYC,EAAqB,CACxC,OAAOA,EAAI,cAAc,QAAQ,cAAe,EAAE,EAAE,QAAQ,SAAU,EAAE,CAC1E,CAEO,SAASC,EAAS,CAAE,KAAAC,EAAM,SAAAC,EAAU,YAAAC,EAAc,aAAc,QAAAC,GAA0B,CAC/F,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAS,EAAE,EAC/BC,EAAWC,EAAAA,OAAyB,IAAI,EAExCC,EAAUX,GAAgB,CAC9B,MAAMY,EAAMb,EAAYC,CAAG,EACvBY,GAAO,CAACV,EAAK,SAASU,CAAG,GAC3BT,EAAS,CAAC,GAAGD,EAAMU,CAAG,CAAC,EAEzBL,EAAS,EAAE,CACb,EAEMM,EAAaD,GAAgB,CACjCT,EAASD,EAAK,OAAQY,GAAMA,IAAMF,CAAG,CAAC,CACxC,EAEMG,EAAiB,GAAuC,CACxD,EAAE,MAAQ,SAAW,EAAE,MAAQ,KACjC,EAAE,eAAA,EACFJ,EAAOL,CAAK,GACH,EAAE,MAAQ,aAAe,CAACA,GAASJ,EAAK,OAAS,GAC1DW,EAAUX,EAAKA,EAAK,OAAS,CAAC,CAAC,CAEnC,EAEA,OACEc,EAAAA,OAAC,MAAA,CACC,UACEX,EACI,sCACA,6KAEN,QAAS,IAAA,OAAM,OAAAY,EAAAR,EAAS,UAAT,YAAAQ,EAAkB,SAEhC,SAAA,CAAAf,EAAK,IAAKU,GACTI,EAAAA,OAAC,OAAA,CAEC,UAAU,2GAET,SAAA,CAAAJ,EACDI,EAAAA,OAAC,SAAA,CACC,KAAK,SACL,QAAUE,GAAM,CAAEA,EAAE,gBAAA,EAAmBL,EAAUD,CAAG,CAAG,EACvD,UAAU,4CAEV,SAAAI,EAAAA,OAACG,EAAA,CAAE,UAAU,aAAA,EAAb,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA2B,CAAA,EAL7B,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAVKP,EADP,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAaD,EACDI,EAAAA,OAAC,QAAA,CACC,IAAKP,EACL,KAAK,OACL,MAAOH,EACP,SAAW,GAAMC,EAAS,EAAE,OAAO,KAAK,EACxC,UAAWQ,EACX,OAAQ,IAAM,CAAMT,EAAM,QAAQK,EAAOL,CAAK,CAAG,EACjD,YAAaJ,EAAK,SAAW,EAAIE,EAAc,GAC/C,UAAU,0GAAA,EARZ,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CASA,CAAA,EAhCF,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAmCJ"}
1
+ {"version":3,"file":"TagInput-CypDZ6Kl.js","sources":["../../src/components/common/form/TagInput.tsx"],"sourcesContent":["import { useState, useRef, type KeyboardEvent } from 'react';\nimport { X } from 'lucide-react';\n\ninterface TagInputProps {\n tags: string[];\n onChange: (tags: string[]) => void;\n placeholder?: string;\n /** Show as compact inline pills (no border wrapper) */\n compact?: boolean;\n}\n\nfunction sanitizeTag(raw: string): string {\n return raw.toLowerCase().replace(/[^a-z0-9-]/g, '').replace(/^-|-$/g, '');\n}\n\nexport function TagInput({ tags, onChange, placeholder = 'Add tag...', compact }: TagInputProps) {\n const [input, setInput] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n const addTag = (raw: string) => {\n const tag = sanitizeTag(raw);\n if (tag && !tags.includes(tag)) {\n onChange([...tags, tag]);\n }\n setInput('');\n };\n\n const removeTag = (tag: string) => {\n onChange(tags.filter((t) => t !== tag));\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault();\n addTag(input);\n } else if (e.key === 'Backspace' && !input && tags.length > 0) {\n removeTag(tags[tags.length - 1]);\n }\n };\n\n return (\n <div\n className={\n compact\n ? 'flex flex-wrap items-center gap-1.5'\n : 'flex flex-wrap items-center gap-1.5 bg-surface-sunken border border-surface-border rounded-md px-2 py-1.5 focus-within:ring-1 focus-within:ring-accent-primary cursor-text'\n }\n onClick={() => inputRef.current?.focus()}\n >\n {tags.map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full bg-accent/10 text-accent text-[11px] font-medium\"\n >\n {tag}\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); removeTag(tag); }}\n className=\"hover:text-status-error transition-colors\"\n >\n <X className=\"w-2.5 h-2.5\" />\n </button>\n </span>\n ))}\n <input\n ref={inputRef}\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={() => { if (input.trim()) addTag(input); }}\n placeholder={tags.length === 0 ? placeholder : ''}\n className=\"flex-1 min-w-[80px] bg-transparent text-xs text-text-primary outline-none placeholder:text-text-tertiary\"\n />\n </div>\n );\n}\n"],"names":["sanitizeTag","raw","TagInput","tags","onChange","placeholder","compact","input","setInput","useState","inputRef","useRef","addTag","tag","removeTag","t","handleKeyDown","jsxDEV","_a","e","X"],"mappings":"sIAWA,SAASA,EAAYC,EAAqB,CACxC,OAAOA,EAAI,cAAc,QAAQ,cAAe,EAAE,EAAE,QAAQ,SAAU,EAAE,CAC1E,CAEO,SAASC,EAAS,CAAE,KAAAC,EAAM,SAAAC,EAAU,YAAAC,EAAc,aAAc,QAAAC,GAA0B,CAC/F,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAS,EAAE,EAC/BC,EAAWC,EAAAA,OAAyB,IAAI,EAExCC,EAAUX,GAAgB,CAC9B,MAAMY,EAAMb,EAAYC,CAAG,EACvBY,GAAO,CAACV,EAAK,SAASU,CAAG,GAC3BT,EAAS,CAAC,GAAGD,EAAMU,CAAG,CAAC,EAEzBL,EAAS,EAAE,CACb,EAEMM,EAAaD,GAAgB,CACjCT,EAASD,EAAK,OAAQY,GAAMA,IAAMF,CAAG,CAAC,CACxC,EAEMG,EAAiB,GAAuC,CACxD,EAAE,MAAQ,SAAW,EAAE,MAAQ,KACjC,EAAE,eAAA,EACFJ,EAAOL,CAAK,GACH,EAAE,MAAQ,aAAe,CAACA,GAASJ,EAAK,OAAS,GAC1DW,EAAUX,EAAKA,EAAK,OAAS,CAAC,CAAC,CAEnC,EAEA,OACEc,EAAAA,OAAC,MAAA,CACC,UACEX,EACI,sCACA,6KAEN,QAAS,IAAA,OAAM,OAAAY,EAAAR,EAAS,UAAT,YAAAQ,EAAkB,SAEhC,SAAA,CAAAf,EAAK,IAAKU,GACTI,EAAAA,OAAC,OAAA,CAEC,UAAU,2GAET,SAAA,CAAAJ,EACDI,EAAAA,OAAC,SAAA,CACC,KAAK,SACL,QAAUE,GAAM,CAAEA,EAAE,gBAAA,EAAmBL,EAAUD,CAAG,CAAG,EACvD,UAAU,4CAEV,SAAAI,EAAAA,OAACG,EAAA,CAAE,UAAU,aAAA,EAAb,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA2B,CAAA,EAL7B,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAVKP,EADP,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAaD,EACDI,EAAAA,OAAC,QAAA,CACC,IAAKP,EACL,KAAK,OACL,MAAOH,EACP,SAAW,GAAMC,EAAS,EAAE,OAAO,KAAK,EACxC,UAAWQ,EACX,OAAQ,IAAM,CAAMT,EAAM,QAAQK,EAAOL,CAAK,CAAG,EACjD,YAAaJ,EAAK,SAAW,EAAIE,EAAc,GAC/C,UAAU,0GAAA,EARZ,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CASA,CAAA,EAhCF,OAAA,GAAA,CAAA,SAAA,yDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAmCJ"}