railwatch 0.9.3 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (454) hide show
  1. checksums.yaml +4 -4
  2. data/AGENTS.md +37 -33
  3. data/CHANGELOG.md +66 -0
  4. data/README.md +51 -60
  5. data/config/routes.rb +0 -59
  6. data/docs/ai-and-mcp.md +9 -8
  7. data/docs/configuration.md +57 -71
  8. data/docs/faq.md +17 -25
  9. data/docs/getting-started.md +105 -117
  10. data/docs/replacing-nightwatch.md +8 -7
  11. data/docs/replacing-sentry.md +12 -16
  12. data/docs/security.md +14 -20
  13. data/docs/self-hosting.md +24 -22
  14. data/docs/testing.md +6 -14
  15. data/docs/troubleshooting.md +12 -46
  16. data/lib/generators/railwatch/install/install_generator.rb +12 -240
  17. data/lib/generators/railwatch/install/templates/initializer.rb.tt +10 -40
  18. data/lib/generators/railwatch/install/templates/post-deploy +0 -7
  19. data/lib/railwatch/authentication.rb +6 -5
  20. data/lib/railwatch/buffer.rb +9 -0
  21. data/lib/railwatch/configuration.rb +21 -151
  22. data/lib/railwatch/engine.rb +9 -118
  23. data/lib/railwatch/patches.rb +0 -11
  24. data/lib/railwatch/reporter.rb +92 -21
  25. data/lib/railwatch/sampler.rb +10 -2
  26. data/lib/railwatch/subscribers/process_info.rb +1 -2
  27. data/lib/railwatch/version.rb +1 -1
  28. data/lib/railwatch.rb +8 -64
  29. data/lib/tasks/railwatch_tasks.rake +3 -325
  30. data/llms.txt +23 -25
  31. metadata +3 -453
  32. data/app/channels/railwatch/environment_channel.rb +0 -62
  33. data/app/controllers/concerns/railwatch/telemetry_identity.rb +0 -25
  34. data/app/controllers/railwatch/alerts_controller.rb +0 -48
  35. data/app/controllers/railwatch/anomaly_rules_controller.rb +0 -31
  36. data/app/controllers/railwatch/attachments_controller.rb +0 -22
  37. data/app/controllers/railwatch/broadcasts_controller.rb +0 -15
  38. data/app/controllers/railwatch/cache_events_controller.rb +0 -30
  39. data/app/controllers/railwatch/commands_controller.rb +0 -16
  40. data/app/controllers/railwatch/comments_controller.rb +0 -11
  41. data/app/controllers/railwatch/dashboard_controller.rb +0 -70
  42. data/app/controllers/railwatch/deploys_controller.rb +0 -34
  43. data/app/controllers/railwatch/deprecations_controller.rb +0 -54
  44. data/app/controllers/railwatch/environment_scoped.rb +0 -81
  45. data/app/controllers/railwatch/exceptions_controller.rb +0 -52
  46. data/app/controllers/railwatch/executions_controller.rb +0 -13
  47. data/app/controllers/railwatch/issues_controller.rb +0 -258
  48. data/app/controllers/railwatch/jobs_controller.rb +0 -63
  49. data/app/controllers/railwatch/llm_calls_controller.rb +0 -124
  50. data/app/controllers/railwatch/logs_controller.rb +0 -40
  51. data/app/controllers/railwatch/mails_controller.rb +0 -19
  52. data/app/controllers/railwatch/notifications_controller.rb +0 -11
  53. data/app/controllers/railwatch/outgoing_requests_controller.rb +0 -19
  54. data/app/controllers/railwatch/overview_controller.rb +0 -38
  55. data/app/controllers/railwatch/people_controller.rb +0 -25
  56. data/app/controllers/railwatch/processes_controller.rb +0 -33
  57. data/app/controllers/railwatch/profiles_controller.rb +0 -65
  58. data/app/controllers/railwatch/queries_controller.rb +0 -59
  59. data/app/controllers/railwatch/releases_controller.rb +0 -75
  60. data/app/controllers/railwatch/requests_controller.rb +0 -37
  61. data/app/controllers/railwatch/saved_views_controller.rb +0 -53
  62. data/app/controllers/railwatch/scheduled_tasks_controller.rb +0 -45
  63. data/app/controllers/railwatch/spans_controller.rb +0 -47
  64. data/app/controllers/railwatch/storage_ops_controller.rb +0 -15
  65. data/app/controllers/railwatch/tenants_controller.rb +0 -44
  66. data/app/controllers/railwatch/thresholds_controller.rb +0 -47
  67. data/app/controllers/railwatch/traces_controller.rb +0 -72
  68. data/app/controllers/railwatch/transactions_controller.rb +0 -21
  69. data/app/controllers/railwatch/view_renders_controller.rb +0 -28
  70. data/app/controllers/railwatch/visits_controller.rb +0 -53
  71. data/app/frontend/components/app-content.tsx +0 -26
  72. data/app/frontend/components/app-logo-icon.tsx +0 -23
  73. data/app/frontend/components/app-logo.tsx +0 -14
  74. data/app/frontend/components/app-shell.tsx +0 -38
  75. data/app/frontend/components/app-sidebar-header.tsx +0 -54
  76. data/app/frontend/components/app-sidebar.tsx +0 -94
  77. data/app/frontend/components/app-wordmark.tsx +0 -29
  78. data/app/frontend/components/breadcrumbs.tsx +0 -46
  79. data/app/frontend/components/icon.tsx +0 -16
  80. data/app/frontend/components/input-error.tsx +0 -18
  81. data/app/frontend/components/nav-footer.tsx +0 -46
  82. data/app/frontend/components/nav-main.tsx +0 -41
  83. data/app/frontend/components/nav-user.tsx +0 -50
  84. data/app/frontend/components/railwatch/chart-hover.tsx +0 -34
  85. data/app/frontend/components/railwatch/chart-panel.tsx +0 -170
  86. data/app/frontend/components/railwatch/code.tsx +0 -28
  87. data/app/frontend/components/railwatch/command-palette.tsx +0 -132
  88. data/app/frontend/components/railwatch/copy-block.tsx +0 -52
  89. data/app/frontend/components/railwatch/copy-id.tsx +0 -49
  90. data/app/frontend/components/railwatch/cursor-load-more.tsx +0 -39
  91. data/app/frontend/components/railwatch/data-table.tsx +0 -195
  92. data/app/frontend/components/railwatch/digit-roll.tsx +0 -312
  93. data/app/frontend/components/railwatch/empty-state.tsx +0 -159
  94. data/app/frontend/components/railwatch/env-nav.tsx +0 -130
  95. data/app/frontend/components/railwatch/env-switcher.tsx +0 -145
  96. data/app/frontend/components/railwatch/filter-bar.tsx +0 -153
  97. data/app/frontend/components/railwatch/flamegraph.tsx +0 -324
  98. data/app/frontend/components/railwatch/frames.tsx +0 -295
  99. data/app/frontend/components/railwatch/json-viewer.tsx +0 -159
  100. data/app/frontend/components/railwatch/live-dot.tsx +0 -78
  101. data/app/frontend/components/railwatch/live-toggle.tsx +0 -76
  102. data/app/frontend/components/railwatch/metric-chart.tsx +0 -112
  103. data/app/frontend/components/railwatch/mobile-page-switcher.tsx +0 -89
  104. data/app/frontend/components/railwatch/onboarding.tsx +0 -91
  105. data/app/frontend/components/railwatch/origin-identity.tsx +0 -84
  106. data/app/frontend/components/railwatch/page-header.tsx +0 -42
  107. data/app/frontend/components/railwatch/percentile-picker.tsx +0 -18
  108. data/app/frontend/components/railwatch/relative-time.tsx +0 -18
  109. data/app/frontend/components/railwatch/saved-views.tsx +0 -232
  110. data/app/frontend/components/railwatch/segmented.tsx +0 -64
  111. data/app/frontend/components/railwatch/series-chart.tsx +0 -400
  112. data/app/frontend/components/railwatch/shortcuts-dialog.tsx +0 -89
  113. data/app/frontend/components/railwatch/signal-toast.tsx +0 -121
  114. data/app/frontend/components/railwatch/sort-header.tsx +0 -37
  115. data/app/frontend/components/railwatch/source-link.tsx +0 -57
  116. data/app/frontend/components/railwatch/sparkline-cell.tsx +0 -14
  117. data/app/frontend/components/railwatch/sql-block.tsx +0 -116
  118. data/app/frontend/components/railwatch/stat.tsx +0 -185
  119. data/app/frontend/components/railwatch/status-badge.tsx +0 -79
  120. data/app/frontend/components/railwatch/step-picker.tsx +0 -57
  121. data/app/frontend/components/railwatch/timeline.tsx +0 -405
  122. data/app/frontend/components/railwatch/utilisation-bar.tsx +0 -44
  123. data/app/frontend/components/railwatch/window-picker.tsx +0 -147
  124. data/app/frontend/components/ui/avatar.tsx +0 -51
  125. data/app/frontend/components/ui/badge.tsx +0 -46
  126. data/app/frontend/components/ui/breadcrumb.tsx +0 -109
  127. data/app/frontend/components/ui/button.tsx +0 -60
  128. data/app/frontend/components/ui/card.tsx +0 -92
  129. data/app/frontend/components/ui/chart.tsx +0 -374
  130. data/app/frontend/components/ui/checkbox.tsx +0 -32
  131. data/app/frontend/components/ui/collapsible.tsx +0 -31
  132. data/app/frontend/components/ui/command.tsx +0 -182
  133. data/app/frontend/components/ui/dialog.tsx +0 -158
  134. data/app/frontend/components/ui/dropdown-menu.tsx +0 -255
  135. data/app/frontend/components/ui/hover-card.tsx +0 -42
  136. data/app/frontend/components/ui/input.tsx +0 -21
  137. data/app/frontend/components/ui/label.tsx +0 -24
  138. data/app/frontend/components/ui/popover.tsx +0 -87
  139. data/app/frontend/components/ui/select.tsx +0 -185
  140. data/app/frontend/components/ui/separator.tsx +0 -28
  141. data/app/frontend/components/ui/sheet.tsx +0 -137
  142. data/app/frontend/components/ui/sidebar.tsx +0 -726
  143. data/app/frontend/components/ui/skeleton.tsx +0 -13
  144. data/app/frontend/components/ui/sonner.tsx +0 -41
  145. data/app/frontend/components/ui/table.tsx +0 -114
  146. data/app/frontend/components/ui/tabs.tsx +0 -91
  147. data/app/frontend/components/ui/textarea.tsx +0 -18
  148. data/app/frontend/components/ui/tooltip.tsx +0 -61
  149. data/app/frontend/components/user-info.tsx +0 -32
  150. data/app/frontend/components/user-menu-content.tsx +0 -94
  151. data/app/frontend/entrypoints/application.css +0 -244
  152. data/app/frontend/entrypoints/inertia.tsx +0 -92
  153. data/app/frontend/fonts/CommitMono-Bold.woff2 +0 -0
  154. data/app/frontend/fonts/CommitMono-Regular.woff2 +0 -0
  155. data/app/frontend/fonts/Roboto-Black.woff2 +0 -0
  156. data/app/frontend/fonts/Roboto-Bold.woff2 +0 -0
  157. data/app/frontend/fonts/Roboto-Medium.woff2 +0 -0
  158. data/app/frontend/fonts/Roboto-Regular.woff2 +0 -0
  159. data/app/frontend/hooks/use-appearance.tsx +0 -67
  160. data/app/frontend/hooks/use-clipboard.ts +0 -32
  161. data/app/frontend/hooks/use-flash.tsx +0 -23
  162. data/app/frontend/hooks/use-hotkeys.ts +0 -63
  163. data/app/frontend/hooks/use-initials.tsx +0 -15
  164. data/app/frontend/hooks/use-live.ts +0 -205
  165. data/app/frontend/hooks/use-mobile-navigation.ts +0 -8
  166. data/app/frontend/hooks/use-mobile.ts +0 -21
  167. data/app/frontend/hooks/use-percentile.ts +0 -24
  168. data/app/frontend/hooks/use-reduced-motion.ts +0 -25
  169. data/app/frontend/hooks/use-row-nav.ts +0 -106
  170. data/app/frontend/hooks/use-step.ts +0 -27
  171. data/app/frontend/hooks/use-ticker.ts +0 -12
  172. data/app/frontend/hooks/use-window.ts +0 -58
  173. data/app/frontend/layouts/app/app-sidebar-layout.tsx +0 -107
  174. data/app/frontend/layouts/app-layout.tsx +0 -21
  175. data/app/frontend/layouts/env-layout.tsx +0 -53
  176. data/app/frontend/layouts/persistent-layout.tsx +0 -18
  177. data/app/frontend/lib/cable.ts +0 -10
  178. data/app/frontend/lib/env-pages.ts +0 -236
  179. data/app/frontend/lib/execution-path.ts +0 -55
  180. data/app/frontend/lib/explain.ts +0 -50
  181. data/app/frontend/lib/filter.ts +0 -25
  182. data/app/frontend/lib/flamegraph.ts +0 -155
  183. data/app/frontend/lib/format.ts +0 -71
  184. data/app/frontend/lib/keyboard.ts +0 -18
  185. data/app/frontend/lib/mount.ts +0 -23
  186. data/app/frontend/lib/source-link.ts +0 -217
  187. data/app/frontend/lib/utils.ts +0 -6
  188. data/app/frontend/pages/alerts/index.tsx +0 -171
  189. data/app/frontend/pages/broadcasts/index.tsx +0 -171
  190. data/app/frontend/pages/cache_events/index.tsx +0 -127
  191. data/app/frontend/pages/commands/index.tsx +0 -143
  192. data/app/frontend/pages/deploys/index.tsx +0 -94
  193. data/app/frontend/pages/deploys/show.tsx +0 -309
  194. data/app/frontend/pages/deprecations/index.tsx +0 -176
  195. data/app/frontend/pages/exceptions/index.tsx +0 -271
  196. data/app/frontend/pages/executions/show.tsx +0 -821
  197. data/app/frontend/pages/issues/index.tsx +0 -399
  198. data/app/frontend/pages/issues/show.tsx +0 -1367
  199. data/app/frontend/pages/jobs/index.tsx +0 -381
  200. data/app/frontend/pages/jobs/klass.tsx +0 -215
  201. data/app/frontend/pages/llm_calls/index.tsx +0 -664
  202. data/app/frontend/pages/logs/index.tsx +0 -303
  203. data/app/frontend/pages/mails/index.tsx +0 -218
  204. data/app/frontend/pages/notifications/index.tsx +0 -161
  205. data/app/frontend/pages/outgoing_requests/index.tsx +0 -309
  206. data/app/frontend/pages/overview/show.tsx +0 -333
  207. data/app/frontend/pages/people/index.tsx +0 -102
  208. data/app/frontend/pages/people/show.tsx +0 -149
  209. data/app/frontend/pages/processes/index.tsx +0 -335
  210. data/app/frontend/pages/profiles/index.tsx +0 -110
  211. data/app/frontend/pages/profiles/show.tsx +0 -105
  212. data/app/frontend/pages/queries/index.tsx +0 -492
  213. data/app/frontend/pages/queries/show.tsx +0 -276
  214. data/app/frontend/pages/releases/index.tsx +0 -190
  215. data/app/frontend/pages/releases/release-health.tsx +0 -68
  216. data/app/frontend/pages/releases/release-path.ts +0 -25
  217. data/app/frontend/pages/releases/show.tsx +0 -262
  218. data/app/frontend/pages/requests/index.tsx +0 -235
  219. data/app/frontend/pages/requests/route.tsx +0 -159
  220. data/app/frontend/pages/scheduled_tasks/index.tsx +0 -220
  221. data/app/frontend/pages/spans/index.tsx +0 -229
  222. data/app/frontend/pages/spans/show.tsx +0 -220
  223. data/app/frontend/pages/storage_ops/index.tsx +0 -150
  224. data/app/frontend/pages/tenants/index.tsx +0 -236
  225. data/app/frontend/pages/tenants/show.tsx +0 -477
  226. data/app/frontend/pages/tenants/tenant-path.ts +0 -26
  227. data/app/frontend/pages/thresholds/index.tsx +0 -414
  228. data/app/frontend/pages/traces/show.tsx +0 -208
  229. data/app/frontend/pages/transactions/index.tsx +0 -220
  230. data/app/frontend/pages/view_renders/index.tsx +0 -241
  231. data/app/frontend/pages/visits/index.tsx +0 -321
  232. data/app/frontend/public/icon.png +0 -0
  233. data/app/frontend/public/icon.svg +0 -5
  234. data/app/frontend/routes/index.d.ts +0 -2136
  235. data/app/frontend/routes/index.js +0 -2112
  236. data/app/frontend/types/globals.d.ts +0 -9
  237. data/app/frontend/types/index.ts +0 -288
  238. data/app/frontend/types/vite-env.d.ts +0 -9
  239. data/app/helpers/railwatch/assets_helper.rb +0 -52
  240. data/app/jobs/railwatch/anomaly_scan_job.rb +0 -11
  241. data/app/jobs/railwatch/application_job.rb +0 -7
  242. data/app/jobs/railwatch/auto_resolve_issues_job.rb +0 -19
  243. data/app/jobs/railwatch/check_scheduled_tasks_job.rb +0 -113
  244. data/app/jobs/railwatch/detect_anomalies_job.rb +0 -171
  245. data/app/jobs/railwatch/detect_performance_issues_job.rb +0 -95
  246. data/app/jobs/railwatch/group_exceptions_job.rb +0 -91
  247. data/app/jobs/railwatch/optimize_telemetry_job.rb +0 -23
  248. data/app/jobs/railwatch/performance_scan_job.rb +0 -11
  249. data/app/jobs/railwatch/prune_telemetry_job.rb +0 -129
  250. data/app/jobs/railwatch/release_health_rollup_job.rb +0 -64
  251. data/app/jobs/railwatch/rollup_catchup_job.rb +0 -21
  252. data/app/jobs/railwatch/rollup_job.rb +0 -132
  253. data/app/jobs/railwatch/scheduled_task_scan_job.rb +0 -11
  254. data/app/models/concerns/railwatch/detection_snapshotting.rb +0 -20
  255. data/app/models/railwatch/alert.rb +0 -229
  256. data/app/models/railwatch/alert_rule.rb +0 -121
  257. data/app/models/railwatch/anomaly_rule.rb +0 -51
  258. data/app/models/railwatch/application.rb +0 -44
  259. data/app/models/railwatch/application_record.rb +0 -33
  260. data/app/models/railwatch/comment.rb +0 -36
  261. data/app/models/railwatch/deploy.rb +0 -67
  262. data/app/models/railwatch/environment.rb +0 -68
  263. data/app/models/railwatch/execution_presenter.rb +0 -185
  264. data/app/models/railwatch/filter_query.rb +0 -184
  265. data/app/models/railwatch/followup_receipt.rb +0 -27
  266. data/app/models/railwatch/ingest/batch.rb +0 -355
  267. data/app/models/railwatch/ingest/mapper.rb +0 -585
  268. data/app/models/railwatch/ingest/payload.rb +0 -96
  269. data/app/models/railwatch/ingest/rollup_absorber.rb +0 -170
  270. data/app/models/railwatch/ingest/writer.rb +0 -137
  271. data/app/models/railwatch/issue.rb +0 -277
  272. data/app/models/railwatch/issue_activity.rb +0 -23
  273. data/app/models/railwatch/issue_detection_presenter.rb +0 -309
  274. data/app/models/railwatch/issue_detection_snapshot.rb +0 -77
  275. data/app/models/railwatch/maintenance_task.rb +0 -53
  276. data/app/models/railwatch/saved_view.rb +0 -63
  277. data/app/models/railwatch/telemetry/aggregations.rb +0 -251
  278. data/app/models/railwatch/telemetry/attachment.rb +0 -31
  279. data/app/models/railwatch/telemetry/bounded_gzip.rb +0 -101
  280. data/app/models/railwatch/telemetry/broadcast.rb +0 -13
  281. data/app/models/railwatch/telemetry/cache_event.rb +0 -16
  282. data/app/models/railwatch/telemetry/child.rb +0 -53
  283. data/app/models/railwatch/telemetry/cursor_page.rb +0 -99
  284. data/app/models/railwatch/telemetry/deprecation.rb +0 -13
  285. data/app/models/railwatch/telemetry/enqueued_job.rb +0 -13
  286. data/app/models/railwatch/telemetry/exception.rb +0 -28
  287. data/app/models/railwatch/telemetry/execution.rb +0 -152
  288. data/app/models/railwatch/telemetry/export_delivery.rb +0 -32
  289. data/app/models/railwatch/telemetry/export_destination.rb +0 -66
  290. data/app/models/railwatch/telemetry/health_sample.rb +0 -72
  291. data/app/models/railwatch/telemetry/ingest_batch.rb +0 -31
  292. data/app/models/railwatch/telemetry/llm_call.rb +0 -37
  293. data/app/models/railwatch/telemetry/log.rb +0 -91
  294. data/app/models/railwatch/telemetry/mail.rb +0 -13
  295. data/app/models/railwatch/telemetry/n_plus_one.rb +0 -92
  296. data/app/models/railwatch/telemetry/notification.rb +0 -13
  297. data/app/models/railwatch/telemetry/outgoing_request.rb +0 -13
  298. data/app/models/railwatch/telemetry/person.rb +0 -50
  299. data/app/models/railwatch/telemetry/process.rb +0 -10
  300. data/app/models/railwatch/telemetry/profile.rb +0 -37
  301. data/app/models/railwatch/telemetry/query.rb +0 -57
  302. data/app/models/railwatch/telemetry/query_shape.rb +0 -45
  303. data/app/models/railwatch/telemetry/release_health.rb +0 -69
  304. data/app/models/railwatch/telemetry/rollup.rb +0 -157
  305. data/app/models/railwatch/telemetry/session.rb +0 -24
  306. data/app/models/railwatch/telemetry/span.rb +0 -19
  307. data/app/models/railwatch/telemetry/storage_op.rb +0 -13
  308. data/app/models/railwatch/telemetry/tenant.rb +0 -240
  309. data/app/models/railwatch/telemetry/transaction.rb +0 -13
  310. data/app/models/railwatch/telemetry/view_render.rb +0 -13
  311. data/app/models/railwatch/telemetry/visit.rb +0 -24
  312. data/app/models/railwatch/telemetry_record.rb +0 -107
  313. data/app/models/railwatch/threshold.rb +0 -66
  314. data/app/models/railwatch/user.rb +0 -47
  315. data/app/models/railwatch/viewer.rb +0 -13
  316. data/app/models/railwatch/window.rb +0 -66
  317. data/app/views/layouts/railwatch/dashboard.html.erb +0 -25
  318. data/db/railwatch_migrate/20260916000000_create_railwatch_tables.rb +0 -151
  319. data/db/railwatch_migrate/20260917000000_create_railwatch_maintenance_tasks.rb +0 -18
  320. data/db/railwatch_migrate/20260917120000_create_railwatch_followup_receipts.rb +0 -20
  321. data/db/railwatch_migrate/20260918120000_widen_host_user_ids.rb +0 -71
  322. data/db/railwatch_telemetry_migrate/20260903000000_enable_incremental_vacuum.rb +0 -62
  323. data/db/railwatch_telemetry_migrate/20260903000001_create_telemetry.rb +0 -481
  324. data/db/railwatch_telemetry_migrate/20260903000002_rename_tenant_to_app_tenant.rb +0 -14
  325. data/db/railwatch_telemetry_migrate/20260903000003_add_statement_count_to_transactions.rb +0 -9
  326. data/db/railwatch_telemetry_migrate/20260903000004_add_role_and_channel.rb +0 -10
  327. data/db/railwatch_telemetry_migrate/20260903000005_add_locals_to_exceptions.rb +0 -9
  328. data/db/railwatch_telemetry_migrate/20260903000006_add_spans_health_vitals_and_fts.rb +0 -82
  329. data/db/railwatch_telemetry_migrate/20260903000007_rename_span_attributes_to_payload.rb +0 -10
  330. data/db/railwatch_telemetry_migrate/20260903000008_add_profiles_and_attachments.rb +0 -60
  331. data/db/railwatch_telemetry_migrate/20260903000009_add_truncated_to_attachments.rb +0 -9
  332. data/db/railwatch_telemetry_migrate/20260903000010_create_sessions_and_release_health.rb +0 -51
  333. data/db/railwatch_telemetry_migrate/20260903000011_add_fingerprint_to_exceptions.rb +0 -11
  334. data/db/railwatch_telemetry_migrate/20260904000012_add_failed_to_broadcasts.rb +0 -10
  335. data/db/railwatch_telemetry_migrate/20260904010000_add_filter_cursor_indexes.rb +0 -37
  336. data/db/railwatch_telemetry_migrate/20260904020000_add_n_plus_ones_execution_id_index.rb +0 -11
  337. data/db/railwatch_telemetry_migrate/20260904120000_create_query_shapes.rb +0 -15
  338. data/db/railwatch_telemetry_migrate/20260906120000_add_backpressure_factor_to_ingest_batches.rb +0 -9
  339. data/db/railwatch_telemetry_migrate/20260907000000_rename_lantern_version_on_processes.rb +0 -10
  340. data/db/railwatch_telemetry_migrate/20260913000000_rename_nightrail_version_on_processes.rb +0 -9
  341. data/db/railwatch_telemetry_migrate/20260914000000_drop_orphan_durable_ingest_tables.rb +0 -18
  342. data/db/railwatch_telemetry_migrate/20260914010000_drop_orphan_durable_ingest_columns.rb +0 -25
  343. data/db/railwatch_telemetry_migrate/20260915000000_create_llm_calls.rb +0 -55
  344. data/db/railwatch_telemetry_migrate/20260915120000_add_detail_to_llm_calls.rb +0 -21
  345. data/db/railwatch_telemetry_migrate/20260915200000_add_explained_index_to_queries.rb +0 -16
  346. data/db/railwatch_telemetry_migrate/20260915210000_add_slowest_index_to_queries.rb +0 -18
  347. data/db/railwatch_telemetry_migrate/20260917010000_add_batch_ledger_to_ingest_batches.rb +0 -16
  348. data/db/railwatch_telemetry_migrate/20260919000100_create_export_queue.rb +0 -146
  349. data/db/railwatch_telemetry_migrate/20260922000000_add_covering_indexes_for_dashboard_aggregates.rb +0 -34
  350. data/db/railwatch_telemetry_migrate/20260923000000_add_people_index.rb +0 -15
  351. data/db/railwatch_telemetry_migrate/20260925000000_add_tenant_summary_index.rb +0 -17
  352. data/db/railwatch_telemetry_migrate/20261008000000_add_in_transaction_to_outgoing_requests.rb +0 -10
  353. data/docs/embedded.md +0 -503
  354. data/lib/puma/plugin/railwatch.rb +0 -215
  355. data/lib/railwatch/dashboard_assets.rb +0 -45
  356. data/lib/railwatch/embedded.rb +0 -50
  357. data/lib/railwatch/export/client.rb +0 -124
  358. data/lib/railwatch/export/lease.rb +0 -56
  359. data/lib/railwatch/export/outbox.rb +0 -361
  360. data/lib/railwatch/export/policy.rb +0 -79
  361. data/lib/railwatch/export/sender.rb +0 -130
  362. data/lib/railwatch/ingest_request_body_limit.rb +0 -10
  363. data/lib/railwatch/maintenance.rb +0 -194
  364. data/lib/railwatch/patches/migration_busy_timeout.rb +0 -73
  365. data/lib/railwatch/transport/local.rb +0 -78
  366. data/lib/railwatch/transport/socket.rb +0 -183
  367. data/lib/railwatch/writer.rb +0 -370
  368. data/public/railwatch/assets/CommitMono-Bold-D6h61ieg.woff2 +0 -0
  369. data/public/railwatch/assets/CommitMono-Regular-zr8w7Obm.woff2 +0 -0
  370. data/public/railwatch/assets/Roboto-Black-auA4GeOK.woff2 +0 -0
  371. data/public/railwatch/assets/Roboto-Bold-CJLnO8j1.woff2 +0 -0
  372. data/public/railwatch/assets/Roboto-Medium-Cm2bwKpj.woff2 +0 -0
  373. data/public/railwatch/assets/Roboto-Regular-Chaq1-PV.woff2 +0 -0
  374. data/public/railwatch/assets/app-layout-by7G3sa1.js +0 -41
  375. data/public/railwatch/assets/application-Cc5v_Vk9.css +0 -1
  376. data/public/railwatch/assets/arrow-up-DCZ7emux.js +0 -1
  377. data/public/railwatch/assets/braces-CykT5_5u.js +0 -1
  378. data/public/railwatch/assets/card-C-PPSA0g.js +0 -1
  379. data/public/railwatch/assets/chart-Cov79YC5.js +0 -39
  380. data/public/railwatch/assets/chart-hover-DdK4E-2h.js +0 -1
  381. data/public/railwatch/assets/chart-panel-BPaYRXJB.js +0 -1
  382. data/public/railwatch/assets/code-BYjC4YZ_.js +0 -1
  383. data/public/railwatch/assets/copy-id-LPfoj9cC.js +0 -1
  384. data/public/railwatch/assets/cursor-load-more-DSdhgpGl.js +0 -1
  385. data/public/railwatch/assets/data-table-CQ_YRWQs.js +0 -1
  386. data/public/railwatch/assets/env-layout-CdMWbUkm.js +0 -1
  387. data/public/railwatch/assets/execution-path-7MYt-Qbn.js +0 -1
  388. data/public/railwatch/assets/filter-bar-CrzpQ_vD.js +0 -1
  389. data/public/railwatch/assets/flamegraph-BIFEdTAg.js +0 -2
  390. data/public/railwatch/assets/format-B9SDkrWj.js +0 -1
  391. data/public/railwatch/assets/frames-C5t-x4f0.js +0 -1
  392. data/public/railwatch/assets/index--NQ7us-L.js +0 -1
  393. data/public/railwatch/assets/index-2kgYe_99.js +0 -1
  394. data/public/railwatch/assets/index-4YEPHxtO.js +0 -1
  395. data/public/railwatch/assets/index-AOCC1GDJ.js +0 -1
  396. data/public/railwatch/assets/index-BEo-u0eO.js +0 -1
  397. data/public/railwatch/assets/index-BJ1V3w2N.js +0 -1
  398. data/public/railwatch/assets/index-BPoHsBKb.js +0 -1
  399. data/public/railwatch/assets/index-BZzyGUM3.js +0 -1
  400. data/public/railwatch/assets/index-BgVq7yKL.js +0 -1
  401. data/public/railwatch/assets/index-BqFGEZvW.js +0 -1
  402. data/public/railwatch/assets/index-ByuHJ1CH.js +0 -1
  403. data/public/railwatch/assets/index-C2j50AL2.js +0 -1
  404. data/public/railwatch/assets/index-CLEdTkvW.js +0 -1
  405. data/public/railwatch/assets/index-CWgq8qBu.js +0 -1
  406. data/public/railwatch/assets/index-CXQ7_oVj.js +0 -2
  407. data/public/railwatch/assets/index-CmyYrjS2.js +0 -1
  408. data/public/railwatch/assets/index-Cn9_HjDo.js +0 -1
  409. data/public/railwatch/assets/index-CsMAm9UK.js +0 -1
  410. data/public/railwatch/assets/index-D0Kk_oGY.js +0 -1
  411. data/public/railwatch/assets/index-DC9ZptJh.js +0 -1
  412. data/public/railwatch/assets/index-DNzg7jmV.js +0 -1
  413. data/public/railwatch/assets/index-DQ8uJO5f.js +0 -1
  414. data/public/railwatch/assets/index-Deq14BxB.js +0 -1
  415. data/public/railwatch/assets/index-IaV3Blzp.js +0 -1
  416. data/public/railwatch/assets/index-TYNWcJQs.js +0 -1
  417. data/public/railwatch/assets/index-WonH2fcZ.js +0 -1
  418. data/public/railwatch/assets/index-WxWUaH_d.js +0 -1
  419. data/public/railwatch/assets/index-mUNrl4ky.js +0 -1
  420. data/public/railwatch/assets/inertia-DfNRARuA.js +0 -97
  421. data/public/railwatch/assets/json-viewer-DMsF5glp.js +0 -1
  422. data/public/railwatch/assets/klass-CmHYk5rz.js +0 -1
  423. data/public/railwatch/assets/origin-identity-1R3bqa3R.js +0 -1
  424. data/public/railwatch/assets/percentile-picker-73z5PAps.js +0 -1
  425. data/public/railwatch/assets/relative-time-Dsc_cCdX.js +0 -1
  426. data/public/railwatch/assets/release-health-BV5OaOWd.js +0 -1
  427. data/public/railwatch/assets/route-CWh58C7K.js +0 -1
  428. data/public/railwatch/assets/segmented-DB4zh-Am.js +0 -1
  429. data/public/railwatch/assets/select-DBKjFlOX.js +0 -1
  430. data/public/railwatch/assets/series-chart-BaiDG795.js +0 -1
  431. data/public/railwatch/assets/show-B4ICCFGh.js +0 -1
  432. data/public/railwatch/assets/show-B5lOU9Gv.js +0 -1
  433. data/public/railwatch/assets/show-BYPB74t4.js +0 -2
  434. data/public/railwatch/assets/show-C7A0m2M8.js +0 -1
  435. data/public/railwatch/assets/show-DT5X1zqE.js +0 -1
  436. data/public/railwatch/assets/show-D_NBdXsn.js +0 -2
  437. data/public/railwatch/assets/show-DgPCnRg8.js +0 -1
  438. data/public/railwatch/assets/show-Yl69HF0x.js +0 -1
  439. data/public/railwatch/assets/show-_QxuUQCm.js +0 -3
  440. data/public/railwatch/assets/show-g__jnN36.js +0 -1
  441. data/public/railwatch/assets/show-l4ztfjl9.js +0 -1
  442. data/public/railwatch/assets/sort-header-BcG8ulEH.js +0 -1
  443. data/public/railwatch/assets/source-link-B2183i2-.js +0 -1
  444. data/public/railwatch/assets/sparkline-cell-B47ipscB.js +0 -1
  445. data/public/railwatch/assets/stat-DT2hhsqS.js +0 -1
  446. data/public/railwatch/assets/status-badge-CmbRKlY7.js +0 -1
  447. data/public/railwatch/assets/tenant-path-C4rNGauE.js +0 -1
  448. data/public/railwatch/assets/use-clipboard-oTNeP4ax.js +0 -1
  449. data/public/railwatch/assets/use-live-CLZZj245.js +0 -1
  450. data/public/railwatch/icon.png +0 -0
  451. data/public/railwatch/icon.svg +0 -5
  452. data/public/railwatch/manifest.json +0 -1245
  453. data/public/railwatch/rails-vite.json +0 -1
  454. /data/{app/frontend/lib → lib/generators/railwatch/install/templates}/railwatch.ts +0 -0
@@ -1 +0,0 @@
1
- import{c as se,u as ne,a2 as re,j as s,L as ae,f as oe}from"./inertia-DfNRARuA.js";import{V as ie,D as le}from"./chart-panel-BPaYRXJB.js";import{D as Z}from"./data-table-CQ_YRWQs.js";import{E as ee}from"./app-layout-by7G3sa1.js";import{P as ce,E as me}from"./env-layout-CdMWbUkm.js";import{S as T,a as ue}from"./stat-DT2hhsqS.js";import{S as de}from"./status-badge-CmbRKlY7.js";import{C as fe,a as pe,b as xe,c as he}from"./card-C-PPSA0g.js";import{c as Y,m as P,w as je}from"./format-B9SDkrWj.js";import{B as te}from"./braces-CykT5_5u.js";import"./series-chart-BaiDG795.js";import"./chart-hover-DdK4E-2h.js";import"./chart-Cov79YC5.js";import"./use-live-CLZZj245.js";import"./segmented-DB4zh-Am.js";import"./arrow-up-DCZ7emux.js";function ge(t){const e=se.c(5),{attributes:o}=t;let i;e[0]!==o?(i=Object.entries(o),e[0]=o,e[1]=i):i=e[1];const r=i;if(r.length===0){let n;return e[2]===Symbol.for("react.memo_cache_sentinel")?(n=s.jsx("span",{className:"text-muted-foreground text-xs",children:"–"}),e[2]=n):n=e[2],n}let a;return e[3]!==r?(a=s.jsx("span",{className:"flex flex-wrap gap-1",children:r.map(ye)}),e[3]=r,e[4]=a):a=e[4],a}function ye(t){const[e,o]=t;return s.jsxs("span",{className:"bg-muted rounded-sm px-1.5 font-mono text-[10px]",children:[e,"=",String(o)]},e)}function ze(t){const e=se.c(73),{environment:o,window:i}=ne().props,r=o.application_id,a=o.id,n=t.summary.current,V=t.name??"Span";let l;e[0]!==r||e[1]!==a||e[2]!==i?(l=re(r,a,{window:i}),e[0]=r,e[1]=a,e[2]=i,e[3]=l):l=e[3];let c;e[4]!==l?(c={title:"Spans",href:l},e[4]=l,e[5]=c):c=e[5];const W=t.name??"Span";let m;e[6]!==W?(m={title:W,href:"#"},e[6]=W,e[7]=m):m=e[7];let u;e[8]!==c||e[9]!==m?(u=[c,m],e[8]=c,e[9]=m,e[10]=u):u=e[10];const q=t.name??"Span";let d;e[11]!==q?(d=s.jsx(ce,{title:s.jsx("span",{className:"font-mono",children:q}),description:"Every recording of this span in the window."}),e[11]=q,e[12]=d):d=e[12];let f;e[13]!==n.count?(f=Y(n.count),e[13]=n.count,e[14]=f):f=e[14];let p;e[15]!==n.count||e[16]!==t.summary.previous.count?(p={current:n.count,previous:t.summary.previous.count,goodDirection:"up"},e[15]=n.count,e[16]=t.summary.previous.count,e[17]=p):p=e[17];let x;e[18]!==f||e[19]!==p?(x=s.jsx(T,{label:"Recorded",value:f,delta:p,deltaCaption:"vs previous period"}),e[18]=f,e[19]=p,e[20]=x):x=e[20];let h;e[21]!==n.errors?(h=Y(n.errors),e[21]=n.errors,e[22]=h):h=e[22];const F=n.errors?"destructive":void 0;let j;e[23]!==h||e[24]!==F?(j=s.jsx(T,{label:"Failed",value:h,tone:F}),e[23]=h,e[24]=F,e[25]=j):j=e[25];const I=n.p95/1e3;let g;e[26]!==I?(g=P(I,2),e[26]=I,e[27]=g):g=e[27];const z=n.p99/1e3;let C;e[28]!==z?(C=P(z,2),e[28]=z,e[29]=C):C=e[29];const G=`p99 ${C}`;let y;e[30]!==g||e[31]!==G?(y=s.jsx(T,{label:"p95",value:g,hint:G}),e[30]=g,e[31]=G,e[32]=y):y=e[32];const J=n.max/1e3;let b;e[33]!==J?(b=P(J,2),e[33]=J,e[34]=b):b=e[34];const Q=n.avg/1e3;let D;e[35]!==Q?(D=P(Q,2),e[35]=Q,e[36]=D):D=e[36];const U=`avg ${D}`;let v;e[37]!==b||e[38]!==U?(v=s.jsx(T,{label:"Max",value:b,hint:U}),e[37]=b,e[38]=U,e[39]=v):v=e[39];let _;e[40]!==x||e[41]!==j||e[42]!==y||e[43]!==v?(_=s.jsxs(ue,{children:[x,j,y,v]}),e[40]=x,e[41]=j,e[42]=y,e[43]=v,e[44]=_):_=e[44];let S;e[45]!==t.series?(S=s.jsxs("div",{className:"grid gap-4 lg:grid-cols-2",children:[s.jsx(ie,{legend:"outcome",label:"Recordings",seriesLabel:"Spans",data:t.series}),s.jsx(le,{label:"Duration",data:t.series})]}),e[45]=t.series,e[46]=S):S=e[46];let R;e[47]===Symbol.for("react.memo_cache_sentinel")?(R=s.jsx(xe,{children:s.jsx(he,{children:"Attributes"})}),e[47]=R):R=e[47];let L,M;e[48]===Symbol.for("react.memo_cache_sentinel")?(L=s.jsx(ee,{icon:te,title:"No attributes recorded",description:"Pass a hash to Railwatch.span to tag each recording."}),M=[{key:"k",header:"Key",cell:Pe},{key:"v",header:"Most common values",cell:ke},{key:"n",header:"Spans",align:"right",cell:Ne}],e[48]=L,e[49]=M):(L=e[48],M=e[49]);let w;e[50]!==t.facets?(w=s.jsxs(fe,{children:[R,s.jsx(pe,{children:s.jsx(Z,{rows:t.facets,rowKey:Ce,empty:L,columns:M})})]}),e[50]=t.facets,e[51]=w):w=e[51];let $,A,B;e[52]===Symbol.for("react.memo_cache_sentinel")?($=s.jsx(ee,{icon:te,title:"No recordings in this window",description:"Widen the time window to see older recordings of this span."}),A={key:"when",header:"When",cell:Se},B={key:"status",header:"Status",cell:_e},e[52]=$,e[53]=A,e[54]=B):($=e[52],A=e[53],B=e[54]);let N;e[55]!==r||e[56]!==a?(N={key:"in",hideOnMobile:!0,header:"In",cell:X=>X.execution_id?s.jsx(ae,{className:"font-mono text-xs hover:underline",href:oe(r,a,X.execution_id),children:X.execution_preview}):s.jsx("span",{className:"text-muted-foreground text-xs",children:"–"})},e[55]=r,e[56]=a,e[57]=N):N=e[57];let K,O;e[58]===Symbol.for("react.memo_cache_sentinel")?(K={key:"attrs",hideOnMobile:!0,header:"Attributes",cell:ve},O={key:"d",header:"Duration",align:"right",cell:be},e[58]=K,e[59]=O):(K=e[58],O=e[59]);let k;e[60]!==N?(k=[A,B,N,K,O],e[60]=N,e[61]=k):k=e[61];let E;e[62]!==t.samples||e[63]!==k?(E=s.jsx(Z,{rows:t.samples,rowKey:we,empty:$,columns:k}),e[62]=t.samples,e[63]=k,e[64]=E):E=e[64];let H;return e[65]!==V||e[66]!==_||e[67]!==S||e[68]!==w||e[69]!==E||e[70]!==u||e[71]!==d?(H=s.jsxs(me,{title:V,crumbs:u,children:[d,_,S,w,E]}),e[65]=V,e[66]=_,e[67]=S,e[68]=w,e[69]=E,e[70]=u,e[71]=d,e[72]=H):H=e[72],H}function be(t){return P(t.duration,2)}function ve(t){return s.jsx(ge,{attributes:t.attributes})}function _e(t){return s.jsx(de,{outcome:t.status})}function Se(t){return s.jsx("span",{className:"text-xs",children:je(t.occurred_at)})}function we(t){return t.id}function Ne(t){return Y(t.count)}function ke(t){return s.jsx("span",{className:"flex flex-wrap gap-1",children:t.values.map(Ee)})}function Ee(t){const[e,o]=t;return s.jsxs("span",{className:"bg-muted rounded-sm px-1.5 font-mono text-[10px]",children:[e,s.jsxs("span",{className:"text-muted-foreground",children:[" ×",o]})]},e)}function Pe(t){return s.jsx("span",{className:"font-mono text-xs",children:t.key})}function Ce(t){return t.key}export{ze as default};
@@ -1,3 +0,0 @@
1
- import{c as ge,u as je,P as _e,j as s,L as me,f as de,o as ue}from"./inertia-DfNRARuA.js";import{V as be,D as ye}from"./chart-panel-BPaYRXJB.js";import{M as xe}from"./code-BYjC4YZ_.js";import{C as we}from"./copy-id-LPfoj9cC.js";import{D as ne}from"./data-table-CQ_YRWQs.js";import{E as ve,a9 as Ee}from"./app-layout-by7G3sa1.js";import{P as Se,E as Ne}from"./env-layout-CdMWbUkm.js";import{S as X,a as Ce}from"./stat-DT2hhsqS.js";import{C as ie,a as re,b as oe,c as ae}from"./card-C-PPSA0g.js";import{c as fe,m as D,w as he}from"./format-B9SDkrWj.js";import"./series-chart-BaiDG795.js";import"./chart-hover-DdK4E-2h.js";import"./chart-Cov79YC5.js";import"./use-clipboard-oTNeP4ax.js";import"./use-live-CLZZj245.js";import"./segmented-DB4zh-Am.js";import"./arrow-up-DCZ7emux.js";const Le=[{test:/\bSCAN\b/i,skip:/\bUSING\s+(?:COVERING\s+)?INDEX\b/i,message:"Reads every row of the table — no index covers this filter."},{test:/\bSeq Scan\b/i,message:"Sequential scan — Postgres reads the whole table; an index on the filtered column avoids it."},{test:/\bUSING TEMP B-TREE\b/i,message:"Builds a temporary B-tree to sort — an index matching the ORDER BY removes it."},{test:/filesort/i,message:"Filesort — MySQL sorts the rows itself; an index matching the ORDER BY removes it."},{test:/\btype:\s*ALL\b/i,message:"Join type ALL — MySQL has no usable index and scans the whole table."}];function Re(t){return t.split(`
2
- `).flatMap((e,o)=>Le.filter(i=>i.test.test(e)&&!i.skip?.test(e)).map(i=>({line:o+1,message:i.message})))}function rt(t){const e=ge.c(86),{environment:o,window:i}=je().props,l=o.application_id,n=o.id,r=t.summary,a=t.explain?.plan??"";let q;e[0]!==a?(q=Re(a),e[0]=a,e[1]=q):q=e[1];const Y=q;let c;e[2]!==l||e[3]!==n||e[4]!==i?(c=_e(l,n,{window:i}),e[2]=l,e[3]=n,e[4]=i,e[5]=c):c=e[5];let m;e[6]!==c?(m={title:"Queries",href:c},e[6]=c,e[7]=m):m=e[7];let I;e[8]===Symbol.for("react.memo_cache_sentinel")?(I={title:"Query",href:"#"},e[8]=I):I=e[8];let d;e[9]!==m?(d=[m,I],e[9]=m,e[10]=d):d=e[10];let u;e[11]!==t.sql?(u=t.sql?s.jsx(we,{value:t.sql,label:"Copy SQL"}):void 0,e[11]=t.sql,e[12]=u):u=e[12];let x;e[13]!==u?(x=s.jsx(Se,{title:"Query",actions:u}),e[13]=u,e[14]=x):x=e[14];const J=t.sql??"No samples in this window.";let f;e[15]!==J?(f=s.jsx("pre",{className:"bg-muted/60 overflow-x-auto rounded-lg p-3 font-mono text-xs whitespace-pre-wrap",children:J}),e[15]=J,e[16]=f):f=e[16];let h;e[17]!==t.roles?(h=t.roles.length>0&&s.jsx("div",{className:"text-muted-foreground font-mono text-[11px]",children:t.roles.map(Ue).join(" · ")}),e[17]=t.roles,e[18]=h):h=e[18];let p;e[19]!==r.count?(p=fe(r.count),e[19]=r.count,e[20]=p):p=e[20];let g;e[21]!==p?(g=s.jsx(X,{label:"Executions",value:p}),e[21]=p,e[22]=g):g=e[22];const z=r.avg/1e3;let j;e[23]!==z?(j=D(z,2),e[23]=z,e[24]=j):j=e[24];let _;e[25]!==j?(_=s.jsx(X,{label:"Avg",value:j}),e[25]=j,e[26]=_):_=e[26];const Z=r.p95/1e3;let b;e[27]!==Z?(b=D(Z,2),e[27]=Z,e[28]=b):b=e[28];const ee=r.p99/1e3;let M;e[29]!==ee?(M=D(ee,2),e[29]=ee,e[30]=M):M=e[30];const te=`p99 ${M}`;let y;e[31]!==b||e[32]!==te?(y=s.jsx(X,{label:"p95",value:b,hint:te}),e[31]=b,e[32]=te,e[33]=y):y=e[33];const se=r.max/1e3;let w;e[34]!==se?(w=D(se,2),e[34]=se,e[35]=w):w=e[35];let v;e[36]!==w?(v=s.jsx(X,{label:"Max",value:w}),e[36]=w,e[37]=v):v=e[37];let E;e[38]!==g||e[39]!==_||e[40]!==y||e[41]!==v?(E=s.jsxs(Ce,{children:[g,_,y,v]}),e[38]=g,e[39]=_,e[40]=y,e[41]=v,e[42]=E):E=e[42];let T;e[43]===Symbol.for("react.memo_cache_sentinel")?(T=s.jsx(oe,{children:s.jsx(ae,{children:"Query plan"})}),e[43]=T):T=e[43];let S;e[44]!==l||e[45]!==n||e[46]!==t.explain||e[47]!==a||e[48]!==Y?(S=s.jsxs(ie,{children:[T,s.jsx(re,{children:t.explain?s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"text-muted-foreground mb-2 font-mono text-[11px]",children:[he(t.explain.occurred_at)," · ",D(t.explain.duration,2),t.explain.execution_id&&s.jsxs(s.Fragment,{children:[" · ",s.jsx(me,{className:"hover:underline",href:de(l,n,t.explain.execution_id),children:t.explain.execution_id})]})]}),s.jsx("div",{className:"bg-muted/60 overflow-x-auto rounded-lg p-3 font-mono text-xs",children:a.split(`
3
- `).map((Q,ce)=>{const le=Y.filter(pe=>pe.line===ce+1);return s.jsxs("div",{className:ue("py-0.5",le.length>0&&"border-warning border-l-2 pl-2"),children:[s.jsx("div",{className:ue("whitespace-pre",le.length>0&&"text-warning"),children:Q}),le.map(Oe)]},ce)})})]}):s.jsxs("p",{className:"text-muted-foreground text-xs",children:["Enable plans for slow queries with"," ",s.jsx(xe,{children:"RAILWATCH_CAPTURE_QUERY_EXPLAIN=true"})," (threshold"," ",s.jsx(xe,{children:"RAILWATCH_EXPLAIN_THRESHOLD_MS"}),", default 100ms)"]})})]}),e[44]=l,e[45]=n,e[46]=t.explain,e[47]=a,e[48]=Y,e[49]=S):S=e[49];let N;e[50]!==t.series?(N=s.jsxs("div",{className:"grid gap-4 lg:grid-cols-2",children:[s.jsx(be,{legend:"outcome",label:"Executions",seriesLabel:"Executions",data:t.series}),s.jsx(ye,{label:"Duration",data:t.series})]}),e[50]=t.series,e[51]=N):N=e[51];let B;e[52]===Symbol.for("react.memo_cache_sentinel")?(B=s.jsx(oe,{children:s.jsx(ae,{children:"Called from"})}),e[52]=B):B=e[52];let H,O;e[53]===Symbol.for("react.memo_cache_sentinel")?(H=s.jsx(ve,{icon:Ee,title:"No source captured",description:"A backtrace location wasn't available for this query."}),O=[{key:"s",header:"Source",cell:Be},{key:"n",header:"Count",align:"right",cell:Te}],e[53]=H,e[54]=O):(H=e[53],O=e[54]);let C;e[55]!==t.sources?(C=s.jsxs(ie,{children:[B,s.jsx(re,{children:s.jsx(ne,{rows:t.sources,rowKey:He,empty:H,columns:O})})]}),e[55]=t.sources,e[56]=C):C=e[56];let U;e[57]===Symbol.for("react.memo_cache_sentinel")?(U=s.jsx(oe,{children:s.jsx(ae,{children:"Executions"})}),e[57]=U):U=e[57];let W;e[58]===Symbol.for("react.memo_cache_sentinel")?(W=[{key:"c",header:"Execution",cell:Ie},{key:"n",header:"Count",align:"right",cell:qe}],e[58]=W):W=e[58];let L;e[59]!==t.callers?(L=s.jsxs(ie,{children:[U,s.jsx(re,{children:s.jsx(ne,{rows:t.callers,rowKey:Me,columns:W})})]}),e[59]=t.callers,e[60]=L):L=e[60];let R;e[61]!==C||e[62]!==L?(R=s.jsxs("div",{className:"grid gap-4 lg:grid-cols-2",children:[C,L]}),e[61]=C,e[62]=L,e[63]=R):R=e[63];let $;e[64]===Symbol.for("react.memo_cache_sentinel")?($={key:"when",header:"When",cell:De},e[64]=$):$=e[64];let k;e[65]!==l||e[66]!==n?(k={key:"in",header:"In",cell:Q=>Q.execution_id?s.jsx(me,{className:"font-mono text-xs hover:underline",href:de(l,n,Q.execution_id),children:Q.execution_preview}):s.jsx("span",{className:"text-muted-foreground text-xs",children:"–"})},e[65]=l,e[66]=n,e[67]=k):k=e[67];let F,G,K;e[68]===Symbol.for("react.memo_cache_sentinel")?(F={key:"rows",hideOnMobile:!0,header:"Rows",align:"right",cell:Ae},G={key:"conn",hideOnMobile:!0,header:"DB",cell:Pe},K={key:"d",header:"Duration",align:"right",cell:ke},e[68]=F,e[69]=G,e[70]=K):(F=e[68],G=e[69],K=e[70]);let P;e[71]!==k?(P=[$,k,F,G,K],e[71]=k,e[72]=P):P=e[72];let A;e[73]!==t.samples||e[74]!==P?(A=s.jsx(ne,{rows:t.samples,rowKey:Qe,columns:P}),e[73]=t.samples,e[74]=P,e[75]=A):A=e[75];let V;return e[76]!==E||e[77]!==S||e[78]!==N||e[79]!==R||e[80]!==d||e[81]!==A||e[82]!==x||e[83]!==f||e[84]!==h?(V=s.jsxs(Ne,{title:"Query",crumbs:d,children:[x,f,h,E,S,N,R,A]}),e[76]=E,e[77]=S,e[78]=N,e[79]=R,e[80]=d,e[81]=A,e[82]=x,e[83]=f,e[84]=h,e[85]=V):V=e[85],V}function ke(t){return D(t.duration,2)}function Pe(t){return t.connection}function Ae(t){return t.row_count??"–"}function De(t){return s.jsx("span",{className:"text-xs",children:he(t.occurred_at)})}function Qe(t){return t.id}function qe(t){const[,e]=t;return e}function Ie(t){const[e]=t;return s.jsx("span",{className:"font-mono text-xs",children:e})}function Me(t){const[e]=t;return e}function Te(t){const[,e]=t;return e}function Be(t){const[e]=t;return s.jsx("span",{className:"font-mono text-xs",children:e})}function He(t){const[e]=t;return e}function Oe(t){return s.jsx("div",{className:"text-warning/80 mt-0.5 text-[11px] whitespace-normal",children:t.message},t.message)}function Ue(t){const[e,o]=t;return`${e} ${fe(o)}`}export{rt as default};
@@ -1 +0,0 @@
1
- import{c as be,u as ke,r as ye,a9 as _e,j as n,L as Z,K as ve,C as we,f as he,d as xe,M as qe,i as Ne}from"./inertia-DfNRARuA.js";import{V as Ee,D as Re}from"./chart-panel-BPaYRXJB.js";import{D as se}from"./data-table-CQ_YRWQs.js";import{u as Me,E as Pe,P as Se}from"./env-layout-CdMWbUkm.js";import{a as De,S as Oe}from"./segmented-DB4zh-Am.js";import{S as Y,a as Le}from"./stat-DT2hhsqS.js";import{S as Te}from"./status-badge-CmbRKlY7.js";import{c as m,p as Ce,m as ee,w as pe,a as Ke}from"./format-B9SDkrWj.js";import"./series-chart-BaiDG795.js";import"./chart-hover-DdK4E-2h.js";import"./chart-Cov79YC5.js";import"./app-layout-by7G3sa1.js";import"./use-live-CLZZj245.js";import"./arrow-up-DCZ7emux.js";function wt(t){const e=be.c(167),{environment:de,window:u}=ke().props,{window:fe,label:ge}=Me(),[i,je]=ye.useState("routes"),r=de.application_id,l=de.id,s=t.summary.current,o=t.summary.previous,c=fe==="custom"?"vs previous period":`vs previous ${ge}`;let f,g,j,b,k,y,d,h,x,p;if(e[0]!==r||e[1]!==c||e[2]!==l||e[3]!==t.exceptions.length||e[4]!==t.jobs.length||e[5]!==t.links.logs||e[6]!==t.links.people||e[7]!==t.people.length||e[8]!==t.recent_requests.length||e[9]!==t.routes.length||e[10]!==t.series||e[11]!==t.tenant||e[12]!==o.errors||e[13]!==o.exceptions||e[14]!==o.p95||e[15]!==o.requests||e[16]!==s.errors||e[17]!==s.exceptions||e[18]!==s.failed_jobs||e[19]!==s.jobs||e[20]!==s.logs||e[21]!==s.p95||e[22]!==s.requests||e[23]!==s.users||e[24]!==i||e[25]!==u){const a=[{key:"routes",label:"Routes",badge:t.routes.length},{key:"jobs",label:"Jobs",badge:t.jobs.length},{key:"exceptions",label:"Exceptions",badge:t.exceptions.length},{key:"people",label:"Users",badge:t.people.length},{key:"requests",label:"Recent requests",badge:t.recent_requests.length}];g=Pe,y=t.tenant;let M;e[36]!==r||e[37]!==l||e[38]!==u?(M=_e(r,l,{window:u}),e[36]=r,e[37]=l,e[38]=u,e[39]=M):M=e[39];let P;e[40]!==M?(P={title:"Tenants",href:M},e[40]=M,e[41]=P):P=e[41];let S;e[42]!==t.tenant?(S={title:t.tenant,href:"#"},e[42]=t.tenant,e[43]=S):S=e[43],e[44]!==S||e[45]!==P?(d=[P,S],e[44]=S,e[45]=P,e[46]=d):d=e[46];let D;e[47]!==t.tenant?(D=n.jsx("span",{className:"font-mono",children:t.tenant}),e[47]=t.tenant,e[48]=D):D=e[48];let O;e[49]!==t.links.logs?(O=n.jsx(Z,{className:"text-xs underline",href:t.links.logs,children:"Logs"}),e[49]=t.links.logs,e[50]=O):O=e[50];let L;e[51]!==t.links.people?(L=n.jsx(Z,{className:"text-xs underline",href:t.links.people,children:"Users"}),e[51]=t.links.people,e[52]=L):L=e[52];let T;e[53]!==O||e[54]!==L?(T=n.jsxs(n.Fragment,{children:[O,L]}),e[53]=O,e[54]=L,e[55]=T):T=e[55],e[56]!==D||e[57]!==T?(h=n.jsx(Se,{title:D,actions:T}),e[56]=D,e[57]=T,e[58]=h):h=e[58];let C;e[59]!==s.requests?(C=m(s.requests),e[59]=s.requests,e[60]=C):C=e[60];let K;e[61]!==o.requests||e[62]!==s.requests?(K={current:s.requests,previous:o.requests,goodDirection:"up"},e[61]=o.requests,e[62]=s.requests,e[63]=K):K=e[63];let $;e[64]!==c||e[65]!==C||e[66]!==K?($=n.jsx(Y,{label:"Requests",value:C,delta:K,deltaCaption:c}),e[64]=c,e[65]=C,e[66]=K,e[67]=$):$=e[67];let A;e[68]!==s.errors||e[69]!==s.requests?(A=Ce(s.errors,s.requests),e[68]=s.errors,e[69]=s.requests,e[70]=A):A=e[70];const le=s.errors?"destructive":"success",oe=`${s.errors} of ${s.requests}`,ie=s.requests?s.errors/s.requests*100:0,ae=o.requests?o.errors/o.requests*100:0;let U;e[71]!==ie||e[72]!==ae?(U={current:ie,previous:ae,goodDirection:"down"},e[71]=ie,e[72]=ae,e[73]=U):U=e[73];let J;e[74]!==c||e[75]!==A||e[76]!==le||e[77]!==oe||e[78]!==U?(J=n.jsx(Y,{label:"5xx",value:A,tone:le,hint:oe,delta:U,deltaCaption:c}),e[74]=c,e[75]=A,e[76]=le,e[77]=oe,e[78]=U,e[79]=J):J=e[79];let W;e[80]!==s.p95?(W=ee(s.p95),e[80]=s.p95,e[81]=W):W=e[81];let F;e[82]!==o.p95||e[83]!==s.p95?(F={current:s.p95,previous:o.p95,goodDirection:"down"},e[82]=o.p95,e[83]=s.p95,e[84]=F):F=e[84];let I;e[85]!==c||e[86]!==W||e[87]!==F?(I=n.jsx(Y,{label:"p95",value:W,delta:F,deltaCaption:c}),e[85]=c,e[86]=W,e[87]=F,e[88]=I):I=e[88];let V;e[89]!==s.jobs?(V=m(s.jobs),e[89]=s.jobs,e[90]=V):V=e[90];const ce=`${s.failed_jobs} failed`,ue=s.failed_jobs?"destructive":"default";let B;e[91]!==V||e[92]!==ce||e[93]!==ue?(B=n.jsx(Y,{label:"Jobs",value:V,hint:ce,tone:ue}),e[91]=V,e[92]=ce,e[93]=ue,e[94]=B):B=e[94];let H;e[95]!==s.exceptions?(H=m(s.exceptions),e[95]=s.exceptions,e[96]=H):H=e[96];let z;e[97]!==o.exceptions||e[98]!==s.exceptions?(z={current:s.exceptions,previous:o.exceptions,goodDirection:"down"},e[97]=o.exceptions,e[98]=s.exceptions,e[99]=z):z=e[99];let G;e[100]!==c||e[101]!==H||e[102]!==z?(G=n.jsx(Y,{label:"Exceptions",value:H,delta:z,deltaCaption:c}),e[100]=c,e[101]=H,e[102]=z,e[103]=G):G=e[103];let Q;e[104]!==s.users?(Q=m(s.users),e[104]=s.users,e[105]=Q):Q=e[105];let re;e[106]!==s.logs?(re=m(s.logs),e[106]=s.logs,e[107]=re):re=e[107];const me=`${re} log lines`;let X;e[108]!==Q||e[109]!==me?(X=n.jsx(Y,{label:"Users",value:Q,hint:me}),e[108]=Q,e[109]=me,e[110]=X):X=e[110],e[111]!==$||e[112]!==J||e[113]!==I||e[114]!==B||e[115]!==G||e[116]!==X?(x=n.jsxs(Le,{children:[$,J,I,B,G,X]}),e[111]=$,e[112]=J,e[113]=I,e[114]=B,e[115]=G,e[116]=X,e[117]=x):x=e[117],e[118]!==t.series?(p=n.jsxs("div",{className:"grid gap-4 lg:grid-cols-2",children:[n.jsx(Ee,{label:"Requests",data:t.series}),n.jsx(Re,{label:"Latency",data:t.series})]}),e[118]=t.series,e[119]=p):p=e[119],k="-mx-3 [scrollbar-width:none] overflow-x-auto px-3 md:mx-0 md:px-0 [&::-webkit-scrollbar]:hidden",f=Oe,j="w-max",b=a.map(te=>n.jsxs(De,{mono:!1,active:i===te.key,onClick:()=>je(te.key),className:"gap-1.5 px-3",children:[te.label,n.jsx("span",{className:"opacity-60",children:m(te.badge)})]},te.key)),e[0]=r,e[1]=c,e[2]=l,e[3]=t.exceptions.length,e[4]=t.jobs.length,e[5]=t.links.logs,e[6]=t.links.people,e[7]=t.people.length,e[8]=t.recent_requests.length,e[9]=t.routes.length,e[10]=t.series,e[11]=t.tenant,e[12]=o.errors,e[13]=o.exceptions,e[14]=o.p95,e[15]=o.requests,e[16]=s.errors,e[17]=s.exceptions,e[18]=s.failed_jobs,e[19]=s.jobs,e[20]=s.logs,e[21]=s.p95,e[22]=s.requests,e[23]=s.users,e[24]=i,e[25]=u,e[26]=f,e[27]=g,e[28]=j,e[29]=b,e[30]=k,e[31]=y,e[32]=d,e[33]=h,e[34]=x,e[35]=p}else f=e[26],g=e[27],j=e[28],b=e[29],k=e[30],y=e[31],d=e[32],h=e[33],x=e[34],p=e[35];let _;e[120]!==f||e[121]!==j||e[122]!==b?(_=n.jsx(f,{className:j,children:b}),e[120]=f,e[121]=j,e[122]=b,e[123]=_):_=e[123];let v;e[124]!==k||e[125]!==_?(v=n.jsx("div",{className:k,children:_}),e[124]=k,e[125]=_,e[126]=v):v=e[126];let w;e[127]!==r||e[128]!==l||e[129]!==t.routes||e[130]!==i||e[131]!==u?(w=i==="routes"&&n.jsx(se,{rows:t.routes,rowKey:ct,empty:"No requests from this tenant in this window.",columns:[{key:"name",header:"Route",cell:a=>n.jsx(Z,{className:"font-mono text-xs hover:underline",href:ve(r,l,a.group_hash,{window:u}),children:a.name})},{key:"count",header:"Requests",align:"right",cell:at},{key:"errors",header:"5xx",align:"right",cell:it},{key:"avg",hideOnMobile:!0,header:"Avg",align:"right",cell:ot},{key:"max",hideOnMobile:!0,header:"Max",align:"right",cell:lt}]}),e[127]=r,e[128]=l,e[129]=t.routes,e[130]=i,e[131]=u,e[132]=w):w=e[132];let q;e[133]!==r||e[134]!==l||e[135]!==t.jobs||e[136]!==i||e[137]!==u?(q=i==="jobs"&&n.jsx(se,{rows:t.jobs,rowKey:rt,empty:"No job attempts from this tenant in this window.",columns:[{key:"name",header:"Job",cell:a=>n.jsx(Z,{className:"font-mono text-xs hover:underline",href:we(r,l,a.group_hash,{window:u}),children:a.name})},{key:"count",header:"Attempts",align:"right",cell:nt},{key:"failed",header:"Failed",align:"right",cell:st},{key:"avg",hideOnMobile:!0,header:"Avg",align:"right",cell:tt},{key:"max",hideOnMobile:!0,header:"Max",align:"right",cell:et}]}),e[133]=r,e[134]=l,e[135]=t.jobs,e[136]=i,e[137]=u,e[138]=q):q=e[138];let N;e[139]!==r||e[140]!==l||e[141]!==t.exceptions||e[142]!==i?(N=i==="exceptions"&&n.jsx(se,{rows:t.exceptions,rowKey:Ze,empty:"No exceptions from this tenant in this window.",columns:[{key:"when",header:"When",cell:Ye},{key:"class",header:"Class",cell:Xe},{key:"message",header:"Message",cell:Qe},{key:"issue",header:"Issue",cell:Ge},{key:"exe",hideOnMobile:!0,header:"Execution",cell:a=>a.execution_id?n.jsx(Z,{className:"font-mono text-xs hover:underline",href:he(r,l,a.execution_id),children:a.execution_id.slice(0,8)}):n.jsx("span",{className:"text-muted-foreground text-xs",children:"–"})}]}),e[139]=r,e[140]=l,e[141]=t.exceptions,e[142]=i,e[143]=N):N=e[143];let E;e[144]!==r||e[145]!==l||e[146]!==t.people||e[147]!==i?(E=i==="people"&&n.jsx(se,{rows:t.people,rowKey:ze,empty:"No users tagged with this tenant.",onRowClick:a=>xe.visit(qe(r,l,a.ref)),columns:[{key:"name",header:"User",cell:He},{key:"ref",hideOnMobile:!0,header:"Ref",cell:Be},{key:"seen",header:"Last seen",align:"right",cell:Ve}]}),e[144]=r,e[145]=l,e[146]=t.people,e[147]=i,e[148]=E):E=e[148];let R;e[149]!==r||e[150]!==l||e[151]!==t.recent_requests||e[152]!==i?(R=i==="requests"&&n.jsx(se,{rows:t.recent_requests,rowKey:Ie,empty:"No requests from this tenant in this window.",onRowClick:a=>xe.visit(he(r,l,a.execution_id)),columns:[{key:"when",header:"When",cell:Fe},{key:"name",header:"Route",cell:We},{key:"status",header:"Status",cell:Je},{key:"dur",header:"Duration",align:"right",cell:Ue},{key:"user",hideOnMobile:!0,header:"User",cell:Ae},{key:"ex",hideOnMobile:!0,header:"Exception",cell:$e}]}),e[149]=r,e[150]=l,e[151]=t.recent_requests,e[152]=i,e[153]=R):R=e[153];let ne;return e[154]!==g||e[155]!==w||e[156]!==q||e[157]!==N||e[158]!==E||e[159]!==R||e[160]!==y||e[161]!==d||e[162]!==h||e[163]!==x||e[164]!==p||e[165]!==v?(ne=n.jsxs(g,{title:y,crumbs:d,children:[h,x,p,v,w,q,N,E,R]}),e[154]=g,e[155]=w,e[156]=q,e[157]=N,e[158]=E,e[159]=R,e[160]=y,e[161]=d,e[162]=h,e[163]=x,e[164]=p,e[165]=v,e[166]=ne):ne=e[166],ne}function $e(t){return n.jsx("span",{className:"text-destructive line-clamp-1 text-xs",children:t.exception_preview??""})}function Ae(t){return n.jsx("span",{className:"font-mono text-xs",children:t.user_ref??"–"})}function Ue(t){return ee(t.duration)}function Je(t){return n.jsx(Te,{status:t.status})}function We(t){return n.jsx("span",{className:"font-mono text-xs",children:t.name})}function Fe(t){return n.jsx("span",{className:"text-xs tabular-nums",children:pe(t.occurred_at)})}function Ie(t){return t.execution_id}function Ve(t){return Ke(t.last_seen_at)}function Be(t){return n.jsx("span",{className:"font-mono text-xs",children:t.ref})}function He(t){return n.jsxs("span",{className:"text-xs",children:[n.jsx("span",{className:"font-medium",children:t.name}),t.email&&n.jsxs("span",{className:"text-muted-foreground",children:[" · ",t.email]})]})}function ze(t){return t.ref}function Ge(t){return t.issue_id?n.jsx(Z,{className:"font-mono text-xs hover:underline",href:Ne(t.issue_id),children:t.issue_key}):n.jsx("span",{className:"text-muted-foreground text-xs",children:"–"})}function Qe(t){return n.jsx("span",{className:"line-clamp-1 text-xs",children:t.message})}function Xe(t){return n.jsx("span",{className:"font-mono text-xs",children:t.class_name})}function Ye(t){return n.jsx("span",{className:"text-xs tabular-nums",children:pe(t.occurred_at)})}function Ze(t){return t.id}function et(t){return ee(t.max)}function tt(t){return ee(t.avg)}function st(t){return n.jsx("span",{className:t.failed?"text-destructive":"",children:m(t.failed)})}function nt(t){return m(t.count)}function rt(t){return t.group_hash}function lt(t){return ee(t.max)}function ot(t){return ee(t.avg)}function it(t){return n.jsx("span",{className:t.errors?"text-destructive":"",children:m(t.errors)})}function at(t){return m(t.count)}function ct(t){return t.group_hash}export{wt as default};
@@ -1 +0,0 @@
1
- import{c as $,u as P,j as i,o as N,L as I}from"./inertia-DfNRARuA.js";import{C as R}from"./copy-id-LPfoj9cC.js";import{E as q}from"./app-layout-by7G3sa1.js";import{P as C,E as K}from"./env-layout-CdMWbUkm.js";import{a as B,S as w}from"./stat-DT2hhsqS.js";import{K as H}from"./status-badge-CmbRKlY7.js";import{e as W}from"./execution-path-7MYt-Qbn.js";import{c as E,m as L,s as T}from"./format-B9SDkrWj.js";import"./use-clipboard-oTNeP4ax.js";import"./use-live-CLZZj245.js";import"./segmented-DB4zh-Am.js";import"./arrow-up-DCZ7emux.js";const A={request:"REQ",job_attempt:"JOB",scheduled_task:"TASK",command:"CMD",outgoing_request:"HTTP"};function M(t,e,s,h=0){return t.flatMap(g=>{const r=g.execution;return[{key:r.execution_id,depth:h,kind:r.kind,label:r.name,server:r.server,offset:r.offset,duration:r.duration,href:W({applicationId:e,environmentId:s,source:r.kind,executionId:r.execution_id}),failed:T(r.status,r.outcome)==="destructive"},...r.outgoing.map(a=>({key:`o-${a.id}`,depth:h+1,kind:"outgoing_request",label:`${a.method??""} ${a.url}`.trim(),server:null,offset:a.offset,duration:a.duration??0,href:null,failed:T(a.status_code)==="destructive"})),...M(g.children,e,s,h+1)]})}function D(t){const e=$.c(33),{row:s,scale:h}=t,g=`${s.depth*.75}rem`;let r;e[0]!==g?(r={paddingLeft:g},e[0]=g,e[1]=r):r=e[1];const a=s.failed?"destructive":"muted",p=A[s.kind]??s.kind;let l;e[2]!==a||e[3]!==p?(l=i.jsx(H,{tone:a,children:p}),e[2]=a,e[3]=p,e[4]=l):l=e[4];let n;e[5]!==s.label?(n=i.jsx("span",{className:"truncate font-mono",children:s.label}),e[5]=s.label,e[6]=n):n=e[6];let o;e[7]!==s.server?(o=s.server&&i.jsx("span",{className:"text-muted-foreground hidden shrink-0 font-mono text-[10px] sm:inline",children:s.server}),e[7]=s.server,e[8]=o):o=e[8];let c;e[9]!==r||e[10]!==l||e[11]!==n||e[12]!==o?(c=i.jsxs("span",{className:"col-start-1 row-start-1 flex min-w-0 items-center gap-1.5",style:r,children:[l,n,o]}),e[9]=r,e[10]=l,e[11]=n,e[12]=o,e[13]=c):c=e[13];let d;e[14]!==s.duration?(d=L(s.duration),e[14]=s.duration,e[15]=d):d=e[15];let f;e[16]!==d?(f=i.jsx("span",{className:"col-start-2 row-start-1 text-right font-mono tabular-nums md:col-start-3",children:d}),e[16]=d,e[17]=f):f=e[17];const j=s.failed?"bg-danger":s.href?"bg-primary":"bg-ok";let b;e[18]!==j?(b=N("block h-full rounded",j),e[18]=j,e[19]=b):b=e[19];const y=`${Math.min(99,s.offset/h*100)}%`,k=`${Math.max(.5,s.duration/h*100)}%`;let m;e[20]!==y||e[21]!==k?(m={marginLeft:y,width:k},e[20]=y,e[21]=k,e[22]=m):m=e[22];let u;e[23]!==b||e[24]!==m?(u=i.jsx("span",{className:"bg-muted/30 col-span-2 col-start-1 row-start-2 h-2 rounded md:col-span-1 md:col-start-2 md:row-start-1 md:h-3",children:i.jsx("span",{className:b,style:m})}),e[23]=b,e[24]=m,e[25]=u):u=e[25];let v;e[26]!==f||e[27]!==u||e[28]!==c?(v=i.jsxs(i.Fragment,{children:[c,f,u]}),e[26]=f,e[27]=u,e[28]=c,e[29]=v):v=e[29];const x=v;let _;return e[30]!==x||e[31]!==s.href?(_=s.href?i.jsx(I,{href:s.href,className:N("grid grid-cols-[1fr_4rem] items-center gap-x-2 gap-y-1 border-b px-2 py-1.5 text-xs last:border-b-0 md:grid-cols-[minmax(0,18rem)_1fr_4rem]","hover:bg-muted/40"),children:x}):i.jsx("div",{className:N("grid grid-cols-[1fr_4rem] items-center gap-x-2 gap-y-1 border-b px-2 py-1.5 text-xs last:border-b-0 md:grid-cols-[minmax(0,18rem)_1fr_4rem]","text-muted-foreground"),children:x}),e[30]=x,e[31]=s.href,e[32]=_):_=e[32],_}function re(t){const e=$.c(38),{environment:s}=P().props,h=s.application_id,g=s.id;let r,a,p,l,n,o,c;if(e[0]!==h||e[1]!==g||e[2]!==t.duration||e[3]!==t.roots||e[4]!==t.services||e[5]!==t.span_count||e[6]!==t.trace_id){const j=M(t.roots,h,g),b=j.filter(J),y=b.filter(F).length,k=Math.max(t.duration,1);r=K,l="Trace",e[14]===Symbol.for("react.memo_cache_sentinel")?(n=[{title:"Trace",href:"#"}],e[14]=n):n=e[14],e[15]!==t.trace_id?(o=i.jsx(C,{withWindow:!1,title:i.jsxs("span",{className:"flex min-w-0 items-center gap-1",children:[i.jsx("span",{className:"truncate font-mono text-base md:text-xl",children:t.trace_id}),i.jsx(R,{value:t.trace_id,label:""})]}),description:"Every execution that shares this trace id, nested by the call that started it."}),e[15]=t.trace_id,e[16]=o):o=e[16];let m;e[17]!==t.services.length?(m=E(t.services.length),e[17]=t.services.length,e[18]=m):m=e[18];let u;e[19]!==t.services?(u=t.services.join(" · "),e[19]=t.services,e[20]=u):u=e[20];let v;e[21]!==m||e[22]!==u?(v=i.jsx(w,{label:"Services",value:m,hint:u}),e[21]=m,e[22]=u,e[23]=v):v=e[23];let x;e[24]!==t.duration?(x=L(t.duration),e[24]=t.duration,e[25]=x):x=e[25];let _;e[26]!==x?(_=i.jsx(w,{label:"Total duration",value:x}),e[26]=x,e[27]=_):_=e[27],c=i.jsxs(B,{children:[i.jsx(w,{label:"Executions",value:E(b.length),hint:`${t.span_count} spans`}),v,_,i.jsx(w,{label:"Errors",value:E(y),tone:y?"destructive":void 0})]}),a="bg-card -mx-3 overflow-hidden border-y md:mx-0 md:rounded-lg md:border",p=j.length===0?i.jsx(q,{title:"Nothing in this trace",description:"No execution reported this trace id."}):j.map(S=>i.jsx(D,{row:S,scale:k},S.key)),e[0]=h,e[1]=g,e[2]=t.duration,e[3]=t.roots,e[4]=t.services,e[5]=t.span_count,e[6]=t.trace_id,e[7]=r,e[8]=a,e[9]=p,e[10]=l,e[11]=n,e[12]=o,e[13]=c}else r=e[7],a=e[8],p=e[9],l=e[10],n=e[11],o=e[12],c=e[13];let d;e[28]!==a||e[29]!==p?(d=i.jsx("div",{className:a,children:p}),e[28]=a,e[29]=p,e[30]=d):d=e[30];let f;return e[31]!==r||e[32]!==l||e[33]!==n||e[34]!==o||e[35]!==c||e[36]!==d?(f=i.jsxs(r,{title:l,crumbs:n,children:[o,c,d]}),e[31]=r,e[32]=l,e[33]=n,e[34]=o,e[35]=c,e[36]=d,e[37]=f):f=e[37],f}function F(t){return t.failed}function J(t){return t.href!==null}export{re as default};
@@ -1 +0,0 @@
1
- import{c as f,o as x,j as c}from"./inertia-DfNRARuA.js";import{A as p,a as u}from"./arrow-up-DCZ7emux.js";function b(m){const e=f.c(10),{label:n,active:o,dir:i,onClick:a}=m,l=o&&"text-foreground font-semibold";let t;e[0]!==l?(t=x("hover:text-foreground inline-flex items-center gap-1",l),e[0]=l,e[1]=t):t=e[1];let s;e[2]!==o||e[3]!==i?(s=o&&(i==="asc"?c.jsx(p,{className:"size-3"}):c.jsx(u,{className:"size-3"})),e[2]=o,e[3]=i,e[4]=s):s=e[4];let r;return e[5]!==n||e[6]!==a||e[7]!==t||e[8]!==s?(r=c.jsxs("button",{type:"button",onClick:a,className:t,children:[n,s]}),e[5]=n,e[6]=a,e[7]=t,e[8]=s,e[9]=r):r=e[9],r}export{b as S};
@@ -1 +0,0 @@
1
- function u(e){const t=(e??"").trim();return t===""?null:t}function p(e){return[...e].some(t=>{const n=t.codePointAt(0)??0;return n<=31||n>=127&&n<=159})}function R(e){let t=e;try{for(let n=e.length+1;n>0;n-=1){const r=decodeURIComponent(t);if(r===t)return t;t=r}}catch{return null}return null}function g(e){try{return e.split("/").map(encodeURIComponent).join("/")}catch{return null}}function b(e){return e.startsWith("/")||e.startsWith("\\")||/^[a-z]:[\\/]/iu.test(e)}function W(e){const t=u(e);if(!t||b(t))return null;const n=R(t);if(!n||b(n)||n.includes("\\")||p(n)||/%(?:2e|2f|5c)/iu.test(n)||n.split("/").some(c=>c===""||c==="."||c===".."))return null;const r=g(t);return r?{raw:t,encoded:r}:null}function x(e){const t=u((e??"").replace(/\/+$/,""));if(!t)return null;const n=g(t);return n?{raw:t,encoded:n}:null}function l(e){const t=u(e);if(!t||t==="@"||t.startsWith("/")||t.endsWith("/")||t.endsWith(".")||t.includes("//")||t.includes("..")||t.includes("@{")||t.includes("[")||p(t)||/[ ~^:?*\\]/u.test(t)||t.split("/").some(n=>n.startsWith(".")||n.endsWith(".lock")))return null;try{return{raw:t,encoded:encodeURIComponent(t)}}catch{return null}}function d(e){return u((e??"").replace(/\/+$/,"").replace(/\.git$/,""))}function w(e){const t=d(e);return t?t.includes("gitlab")?"gitlab":t.includes("github")?"github":null:null}function I({file:e,line:t,repositoryUrl:n,ref:r,defaultBranch:c,editor:o,editorRoot:C}){const s=W(e);if(!s)return null;if(o==="github"||o==="gitlab"){const h=d(n),m=l(u(r)??c);return!h||!m?null:`${h}/${o==="gitlab"?"-/blob":"blob"}/${m.encoded}/${s.encoded}${t?`#L${t}`:""}`}const a=x(C);if(!a)return null;const $=`${a.raw}/${s.raw}`,f=`${a.encoded}/${s.encoded}`,i=t?`:${t}`:"";switch(o){case"vscode":return`vscode://file${f}${i}`;case"cursor":return`cursor://file${f}${i}`;case"zed":return`zed://file${f}${i}`;case"rubymine":return`jetbrains://rubymine/navigate/reference?project=&path=${encodeURIComponent(`${$}${i}`)}`;case"textmate":return`txmt://open?url=${encodeURIComponent(`file://${$}`)}${t?`&line=${t}`:""}`;default:return null}}function P(e,t){const n=d(e),r=l(t);if(!n||!r)return null;switch(w(e)){case"github":return`${n}/commit/${r.encoded}`;case"gitlab":return`${n}/-/commit/${r.encoded}`;default:return null}}function y(e,t,n){const r=d(e),c=l(t),o=l(n);if(!r||!c||!o)return null;switch(w(e)){case"github":return`${r}/compare/${c.encoded}...${o.encoded}`;case"gitlab":return`${r}/-/compare/${c.encoded}...${o.encoded}`;default:return null}}export{P as a,y as c,I as s};
@@ -1 +0,0 @@
1
- import{c as a,j as i}from"./inertia-DfNRARuA.js";import{S as n}from"./series-chart-BaiDG795.js";function m(o){const e=a.c(3),{data:r,hoverKey:s}=o;let t;return e[0]!==r||e[1]!==s?(t=i.jsx(n,{data:r,className:"h-[10px] w-8",hoverKey:s}),e[0]=r,e[1]=s,e[2]=t):t=e[2],t}export{m as S};
@@ -1 +0,0 @@
1
- import{r as w,j as h,o as C,c as k,u as M}from"./inertia-DfNRARuA.js";import{a as D}from"./use-live-CLZZj245.js";import{A as I,a as O}from"./arrow-up-DCZ7emux.js";const T=300,F="cubic-bezier(.22, 1, .36, 1)",Y=2e3,$="inline-block h-[1.15em] overflow-hidden leading-[1.15em] align-top",U="inline-block h-[1.15em] overflow-visible leading-[1.15em] align-top text-center",P="block will-change-transform",E="block h-[1.15em] leading-[1.15em]",z="inline-block h-[1.15em] leading-[1.15em]";function N(o){const t=document.createElement("span");return t.className=o,t}function V(o){let t=o.length;for(;t>0&&!/[0-9]/.test(o[t-1]);)t--;return{digits:o.slice(0,t),suffix:o.slice(t)}}function q(o){const t=N(o?U:$);if(o)return{separator:!0,el:t,char:null};const u=N(P),s=N(E),i=N(E);return u.append(s,i),t.append(u),{separator:!1,el:t,strip:u,top:s,bottom:i,animation:null,char:null}}function G(o,{durationMs:t,easing:u}){const s=new Map;let i="";function d(e,r){e.animation?.cancel(),e.animation=null,e.top.textContent=r,e.bottom.textContent="",e.char=r}function R(e,r,m){if(typeof e.strip.animate!="function"){d(e,r);return}e.animation?.cancel();const a=e.char??r;m>0?(e.top.textContent=a,e.bottom.textContent=r):(e.top.textContent=r,e.bottom.textContent=a);const c=m>0?[{transform:"translateY(0)"},{transform:"translateY(-50%)"}]:[{transform:"translateY(-50%)"},{transform:"translateY(0)"}],n=e.strip.animate(c,{duration:t,easing:u,fill:"forwards"});e.animation=n,e.char=r,n.onfinish=()=>{e.animation===n&&d(e,r)}}function g(e){typeof e.el.animate=="function"&&e.el.animate([{opacity:0,transform:"translateY(0.35em)"},{opacity:1,transform:"none"}],{duration:t,easing:u})}return{paint(e,r){const{digits:m,suffix:a}=V(e),c=m.split(""),n=c.map((p,l)=>({key:c.length-1-l,char:p})),x=`${n.map(p=>p.key).join(",")}|${a}`,b=i==="";if(x!==i){const p=document.createDocumentFragment(),l=new Set;for(const{key:f,char:y}of n){l.add(f);const S=!/[0-9]/.test(y);let v=s.get(f);v?.separator!==S&&(v=q(S),s.set(f,v),!b&&r!==0&&g(v)),p.append(v.el)}for(const f of[...s.keys()])l.has(f)||s.delete(f);if(o.replaceChildren(p),a){const f=N(z);f.textContent=a,o.append(f)}i=x}for(const{key:p,char:l}of n){const f=s.get(p);!f||f.char===l||(f.separator?(f.el.textContent=l,f.char=l):f.char===null||r===0?d(f,l):R(f,l,r))}},destroy(){for(const e of s.values())e.separator||e.animation?.cancel()}}}function Q({value:o,format:t,className:u,durationMs:s=T,easing:i=F,minIntervalMs:d=Y}){const R=w.useRef(null),g=w.useRef(null),e=w.useRef(o),r=w.useRef(null),m=w.useRef(0),a=w.useRef(void 0),c=w.useRef({format:t,durationMs:s,easing:i,minIntervalMs:d});return w.useEffect(()=>{c.current={format:t,durationMs:s,easing:i,minIntervalMs:d}}),w.useEffect(()=>{const n=R.current;if(!n)return;const{format:x,durationMs:b,easing:p}=c.current,l=G(n,{durationMs:b,easing:p});return g.current=l,l.paint(x(e.current),0),()=>{clearTimeout(a.current),a.current=void 0,r.current=null,g.current=null,l.destroy()}},[]),w.useEffect(()=>{const n=g.current;if(!n||o===e.current)return;const x=l=>{m.current=Date.now(),n.paint(c.current.format(l),l>=e.current?1:-1),e.current=l},b=Date.now()-m.current,p=c.current.minIntervalMs-b;if(p<=0){x(o);return}r.current=o,a.current??=window.setTimeout(()=>{a.current=void 0;const l=r.current;r.current=null,l!==null&&l!==e.current&&x(l)},p)},[o]),h.jsx("span",{ref:R,className:C(u)})}const A="(prefers-reduced-motion: reduce)";function X(o){const t=window.matchMedia(A);return t.addEventListener("change",o),()=>{t.removeEventListener("change",o)}}function B(){return window.matchMedia(A).matches}function H(){return w.useSyncExternalStore(X,B,J)}function J(){return!0}function K(o){const t=k.c(15),{current:u,previous:s,goodDirection:i,caption:d}=o;if(!s)return null;const R=(u-s)/s*100;if(R===0)return null;const g=R>0?"up":"down",e=g===i,r=g==="up"?I:O,m=e?"text-live":"text-destructive";let a;t[0]!==m?(a=C("inline-flex items-center gap-0.5 font-mono text-xs tabular-nums",m),t[0]=m,t[1]=a):a=t[1];let c;t[2]!==r?(c=h.jsx(r,{className:"size-3"}),t[2]=r,t[3]=c):c=t[3];let n;t[4]!==R?(n=Math.abs(R).toFixed(1),t[4]=R,t[5]=n):n=t[5];let x;t[6]!==a||t[7]!==c||t[8]!==n?(x=h.jsxs("span",{className:a,children:[c,n,"%"]}),t[6]=a,t[7]=c,t[8]=n,t[9]=x):x=t[9];let b;t[10]!==d?(b=d&&h.jsx("span",{className:"text-muted-foreground text-[11px]",children:d}),t[10]=d,t[11]=b):b=t[11];let p;return t[12]!==x||t[13]!==b?(p=h.jsxs(h.Fragment,{children:[x,b]}),t[12]=x,t[13]=b,t[14]=p):p=t[14],p}function W(o){const t=k.c(16),{value:u,format:s}=o,{url:i}=M(),d=D(),R=H();let g;t[0]!==s||t[1]!==u?(g=s(u),t[0]=s,t[1]=u,t[2]=g):g=t[2];const e=g,r=d&&!R;let m;t[3]!==r||t[4]!==s||t[5]!==e||t[6]!==i||t[7]!==u?(m=r?h.jsx(Q,{value:u,format:s},i):e,t[3]=r,t[4]=s,t[5]=e,t[6]=i,t[7]=u,t[8]=m):m=t[8];let a;t[9]!==m?(a=h.jsx("span",{"aria-hidden":"true",children:m}),t[9]=m,t[10]=a):a=t[10];let c;t[11]!==e?(c=h.jsx("span",{className:"sr-only",children:e}),t[11]=e,t[12]=c):c=t[12];let n;return t[13]!==a||t[14]!==c?(n=h.jsxs(h.Fragment,{children:[a,c]}),t[13]=a,t[14]=c,t[15]=n):n=t[15],n}function nt(o){const t=k.c(28),{label:u,value:s,roll:i,hint:d,tone:R,delta:g,deltaCaption:e,card:r,className:m}=o,c=(r===void 0?!1:r)&&"bg-card rounded-lg border";let n;t[0]!==m||t[1]!==c?(n=C("flex min-w-0 flex-col gap-1 px-4 py-3",c,m),t[0]=m,t[1]=c,t[2]=n):n=t[2];let x;t[3]!==u?(x=h.jsx("div",{className:"label-caps truncate",children:u}),t[3]=u,t[4]=x):x=t[4];const b=R==="destructive"&&"text-destructive",p=R==="warning"&&"text-warning",l=R==="success"&&"text-live";let f;t[5]!==b||t[6]!==p||t[7]!==l?(f=C("text-xl font-semibold tracking-tight tabular-nums sm:text-2xl",b,p,l),t[5]=b,t[6]=p,t[7]=l,t[8]=f):f=t[8];let y;t[9]!==i||t[10]!==s?(y=i?h.jsx(W,{...i}):s,t[9]=i,t[10]=s,t[11]=y):y=t[11];let S;t[12]!==f||t[13]!==y?(S=h.jsx("div",{className:f,children:y}),t[12]=f,t[13]=y,t[14]=S):S=t[14];let v;t[15]!==g||t[16]!==e?(v=g&&h.jsx(K,{...g,caption:e}),t[15]=g,t[16]=e,t[17]=v):v=t[17];let j;t[18]!==S||t[19]!==v?(j=h.jsxs("div",{className:"flex flex-wrap items-baseline gap-x-2 gap-y-0.5",children:[S,v]}),t[18]=S,t[19]=v,t[20]=j):j=t[20];let L;t[21]!==d?(L=d&&h.jsx("div",{className:"text-muted-foreground truncate font-mono text-[11px]",children:d}),t[21]=d,t[22]=L):L=t[22];let _;return t[23]!==j||t[24]!==L||t[25]!==n||t[26]!==x?(_=h.jsxs("div",{className:n,children:[x,j,L]}),t[23]=j,t[24]=L,t[25]=n,t[26]=x,t[27]=_):_=t[27],_}function st(o){const t=k.c(5),{children:u,className:s}=o;let i;t[0]!==s?(i=C("bg-card divide-border grid grid-cols-2 divide-y overflow-hidden rounded-lg border sm:divide-x sm:divide-y-0","[&>*:nth-child(odd)]:border-r sm:[&>*:nth-child(odd)]:border-r-0","[&>*:nth-child(odd):last-child]:col-span-2 [&>*:nth-child(odd):last-child]:border-r-0 sm:[&>*:nth-child(odd):last-child]:col-span-1","sm:auto-cols-fr sm:grid-flow-col",s),t[0]=s,t[1]=i):i=t[1];let d;return t[2]!==u||t[3]!==i?(d=h.jsx("div",{className:i,children:u}),t[2]=u,t[3]=i,t[4]=d):d=t[4],d}export{nt as S,st as a};
@@ -1 +0,0 @@
1
- import{c as u,o as d,j as m}from"./inertia-DfNRARuA.js";import{B as g}from"./app-layout-by7G3sa1.js";import{s as x}from"./format-B9SDkrWj.js";const f={success:"border-live/30 bg-live/10 text-live",warning:"border-warning/40 bg-warning/10 text-warning",destructive:"border-danger/40 bg-danger/10 text-danger",muted:"border-border bg-muted text-muted-foreground"},v="rounded-sm px-1.5 font-mono text-[10px] tracking-wider uppercase";function j(c){const t=u.c(5),{status:e,outcome:i,label:o}=c,n=x(e,i),s=f[n];let r;t[0]!==s?(r=d(v,"tabular-nums",s),t[0]=s,t[1]=r):r=t[1];const a=o??i??e??"–";let l;return t[2]!==r||t[3]!==a?(l=m.jsx(g,{variant:"outline",className:r,children:a}),t[2]=r,t[3]=a,t[4]=l):l=t[4],l}function B(c){const t=u.c(5),{level:e}=c,o=f[e==="error"||e==="fatal"?"destructive":e==="warn"?"warning":e==="event"?"success":"muted"];let n;t[0]!==o?(n=d(v,o),t[0]=o,t[1]=n):n=t[1];let s;return t[2]!==e||t[3]!==n?(s=m.jsx(g,{variant:"outline",className:n,children:e}),t[2]=e,t[3]=n,t[4]=s):s=t[4],s}function N(c){const t=u.c(5),{status:e}=c,o=f[e==="open"?"destructive":e==="resolved"?"success":"muted"];let n;t[0]!==o?(n=d(v,o),t[0]=o,t[1]=n):n=t[1];let s;return t[2]!==e||t[3]!==n?(s=m.jsx(g,{variant:"outline",className:n,children:e}),t[2]=e,t[3]=n,t[4]=s):s=t[4],s}function h(c){const t=u.c(6),{children:e,tone:i,className:o}=c,s=f[i===void 0?"muted":i];let r;t[0]!==o||t[1]!==s?(r=d(v,s,o),t[0]=o,t[1]=s,t[2]=r):r=t[2];let a;return t[3]!==e||t[4]!==r?(a=m.jsx(g,{variant:"outline",className:r,children:e}),t[3]=e,t[4]=r,t[5]=a):a=t[5],a}export{N as I,h as K,B as L,j as S};
@@ -1 +0,0 @@
1
- import{am as p}from"./inertia-DfNRARuA.js";function s(n,a,r,e){const o=String(p(n,a,r,e)),[i,t]=o.split("?");return`${i.replace(/\./g,"%2E")}${t?`?${t}`:""}`}export{s as t};
@@ -1 +0,0 @@
1
- import{x as i,c as l,r as p}from"./inertia-DfNRARuA.js";const u=[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]],f=i("copy",u);function x(){const e=l.c(3),[o,c]=p.useState(null);let t;e[0]===Symbol.for("react.memo_cache_sentinel")?(t=async a=>{if(!navigator?.clipboard)return console.warn("Clipboard not supported"),!1;try{return await navigator.clipboard.writeText(a),c(a),!0}catch(s){return console.warn("Copy failed",s),c(null),!1}},e[0]=t):t=e[0];const n=t;let r;return e[1]!==o?(r=[o,n],e[1]=o,e[2]=r):r=e[2],r}export{f as C,x as u};
@@ -1 +0,0 @@
1
- import{r as c,c as rt,d as L}from"./inertia-DfNRARuA.js";var T={logger:typeof console<"u"?console:void 0,WebSocket:typeof WebSocket<"u"?WebSocket:void 0},i={log(...n){this.enabled&&(n.push(Date.now()),T.logger.log("[ActionCable]",...n))}};const g=()=>new Date().getTime(),C=n=>(g()-n)/1e3;class N{constructor(t){this.visibilityDidChange=this.visibilityDidChange.bind(this),this.connection=t,this.reconnectAttempts=0}start(){this.isRunning()||(this.startedAt=g(),delete this.stoppedAt,this.startPolling(),addEventListener("visibilitychange",this.visibilityDidChange),i.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`))}stop(){this.isRunning()&&(this.stoppedAt=g(),this.stopPolling(),removeEventListener("visibilitychange",this.visibilityDidChange),i.log("ConnectionMonitor stopped"))}isRunning(){return this.startedAt&&!this.stoppedAt}recordMessage(){this.pingedAt=g()}recordConnect(){this.reconnectAttempts=0,delete this.disconnectedAt,i.log("ConnectionMonitor recorded connect")}recordDisconnect(){this.disconnectedAt=g(),i.log("ConnectionMonitor recorded disconnect")}startPolling(){this.stopPolling(),this.poll()}stopPolling(){clearTimeout(this.pollTimeout)}poll(){this.pollTimeout=setTimeout((()=>{this.reconnectIfStale(),this.poll()}),this.getPollInterval())}getPollInterval(){const{staleThreshold:t,reconnectionBackoffRate:e}=this.constructor,s=Math.pow(1+e,Math.min(this.reconnectAttempts,10)),r=(this.reconnectAttempts===0?1:e)*Math.random();return t*1e3*s*(1+r)}reconnectIfStale(){this.connectionIsStale()&&(i.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${C(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`),this.reconnectAttempts++,this.disconnectedRecently()?i.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${C(this.disconnectedAt)} s`):(i.log("ConnectionMonitor reopening"),this.connection.reopen()))}get refreshedAt(){return this.pingedAt?this.pingedAt:this.startedAt}connectionIsStale(){return C(this.refreshedAt)>this.constructor.staleThreshold}disconnectedRecently(){return this.disconnectedAt&&C(this.disconnectedAt)<this.constructor.staleThreshold}visibilityDidChange(){document.visibilityState==="visible"&&setTimeout((()=>{(this.connectionIsStale()||!this.connection.isOpen())&&(i.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`),this.connection.reopen())}),200)}}N.staleThreshold=6;N.reconnectionBackoffRate=.15;var z={message_types:{welcome:"welcome",disconnect:"disconnect",ping:"ping",confirmation:"confirm_subscription",rejection:"reject_subscription"},default_mount_path:"/cable",protocols:["actioncable-v1-json","actioncable-unsupported"]};const{message_types:p,protocols:x}=z,ct=x.slice(0,x.length-1),V=[].indexOf;class I{constructor(t){this.open=this.open.bind(this),this.consumer=t,this.subscriptions=this.consumer.subscriptions,this.monitor=new N(this),this.disconnected=!0}send(t){return this.isOpen()?(this.webSocket.send(JSON.stringify(t)),!0):!1}open(){if(this.isActive())return i.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`),!1;{const t=[...x,...this.consumer.subprotocols||[]];return i.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${t}`),this.webSocket&&this.uninstallEventHandlers(),this.webSocket=new T.WebSocket(this.consumer.url,t),this.installEventHandlers(),this.monitor.start(),!0}}close({allowReconnect:t}={allowReconnect:!0}){if(t||this.monitor.stop(),this.isOpen())return this.webSocket.close()}reopen(){if(i.log(`Reopening WebSocket, current state is ${this.getState()}`),this.isActive())try{return this.close()}catch(t){i.log("Failed to reopen WebSocket",t)}finally{i.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`),setTimeout(this.open,this.constructor.reopenDelay)}else return this.open()}getProtocol(){if(this.webSocket)return this.webSocket.protocol}isOpen(){return this.isState("open")}isActive(){return this.isState("open","connecting")}triedToReconnect(){return this.monitor.reconnectAttempts>0}isProtocolSupported(){return V.call(ct,this.getProtocol())>=0}isState(...t){return V.call(t,this.getState())>=0}getState(){if(this.webSocket){for(let t in T.WebSocket)if(T.WebSocket[t]===this.webSocket.readyState)return t.toLowerCase()}return null}installEventHandlers(){for(let t in this.events){const e=this.events[t].bind(this);this.webSocket[`on${t}`]=e}}uninstallEventHandlers(){for(let t in this.events)this.webSocket[`on${t}`]=function(){}}}I.reopenDelay=500;I.prototype.events={message(n){if(!this.isProtocolSupported())return;const{identifier:t,message:e,reason:s,reconnect:o,type:r}=JSON.parse(n.data);switch(this.monitor.recordMessage(),r){case p.welcome:return this.triedToReconnect()&&(this.reconnectAttempted=!0),this.monitor.recordConnect(),this.subscriptions.reload();case p.disconnect:return i.log(`Disconnecting. Reason: ${s}`),this.close({allowReconnect:o});case p.ping:return null;case p.confirmation:return this.subscriptions.confirmSubscription(t),this.reconnectAttempted?(this.reconnectAttempted=!1,this.subscriptions.notify(t,"connected",{reconnected:!0})):this.subscriptions.notify(t,"connected",{reconnected:!1});case p.rejection:return this.subscriptions.reject(t);default:return this.subscriptions.notify(t,"received",e)}},open(){if(i.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`),this.disconnected=!1,!this.isProtocolSupported())return i.log("Protocol is unsupported. Stopping monitor and disconnecting."),this.close({allowReconnect:!1})},close(n){if(i.log("WebSocket onclose event"),!this.disconnected)return this.disconnected=!0,this.monitor.recordDisconnect(),this.subscriptions.notifyAll("disconnected",{willAttemptReconnect:this.monitor.isRunning()})},error(){i.log("WebSocket onerror event")}};const lt=function(n,t){if(t!=null)for(let e in t){const s=t[e];n[e]=s}return n};class at{constructor(t,e={},s){this.consumer=t,this.identifier=JSON.stringify(e),lt(this,s)}perform(t,e={}){return e.action=t,this.send(e)}send(t){return this.consumer.send({command:"message",identifier:this.identifier,data:JSON.stringify(t)})}unsubscribe(){return this.consumer.subscriptions.remove(this)}}class ut{constructor(t){this.subscriptions=t,this.pendingSubscriptions=[]}guarantee(t){this.pendingSubscriptions.indexOf(t)==-1?(i.log(`SubscriptionGuarantor guaranteeing ${t.identifier}`),this.pendingSubscriptions.push(t)):i.log(`SubscriptionGuarantor already guaranteeing ${t.identifier}`),this.startGuaranteeing()}forget(t){i.log(`SubscriptionGuarantor forgetting ${t.identifier}`),this.pendingSubscriptions=this.pendingSubscriptions.filter((e=>e!==t))}startGuaranteeing(){this.stopGuaranteeing(),this.retrySubscribing()}stopGuaranteeing(){clearTimeout(this.retryTimeout)}retrySubscribing(){this.retryTimeout=setTimeout((()=>{this.subscriptions&&typeof this.subscriptions.subscribe=="function"&&this.pendingSubscriptions.map((t=>{i.log(`SubscriptionGuarantor resubscribing ${t.identifier}`),this.subscriptions.subscribe(t)}))}),500)}}class ht{constructor(t){this.consumer=t,this.guarantor=new ut(this),this.subscriptions=[]}create(t,e){const s=t,o=typeof s=="object"?s:{channel:s},r=new at(this.consumer,o,e);return this.add(r)}add(t){return this.subscriptions.push(t),this.consumer.ensureActiveConnection(),this.notify(t,"initialized"),this.subscribe(t),t}remove(t){return this.forget(t),this.findAll(t.identifier).length||this.sendCommand(t,"unsubscribe"),t}reject(t){return this.findAll(t).map((e=>(this.forget(e),this.notify(e,"rejected"),e)))}forget(t){return this.guarantor.forget(t),this.subscriptions=this.subscriptions.filter((e=>e!==t)),t}findAll(t){return this.subscriptions.filter((e=>e.identifier===t))}reload(){return this.subscriptions.map((t=>this.subscribe(t)))}notifyAll(t,...e){return this.subscriptions.map((s=>this.notify(s,t,...e)))}notify(t,e,...s){let o;return typeof t=="string"?o=this.findAll(t):o=[t],o.map((r=>typeof r[e]=="function"?r[e](...s):void 0))}subscribe(t){this.sendCommand(t,"subscribe")&&this.guarantor.guarantee(t)}confirmSubscription(t){i.log(`Subscription confirmed ${t}`),this.findAll(t).map((e=>this.guarantor.forget(e)))}sendCommand(t,e){const{identifier:s}=t;return this.consumer.send({command:e,identifier:s})}}class dt{constructor(t){this._url=t,this.subscriptions=new ht(this),this.connection=new I(this),this.subprotocols=[]}get url(){return ft(this._url)}send(t){return this.connection.send(t)}connect(){return this.connection.open()}disconnect(){return this.connection.close({allowReconnect:!1})}ensureActiveConnection(){if(!this.connection.isActive())return this.connection.open()}addSubProtocol(t){this.subprotocols=[...this.subprotocols,t]}}function ft(n){if(typeof n=="function"&&(n=n()),n&&!/^wss?:/i.test(n)){const t=document.createElement("a");return t.href=n,t.href=t.href,t.protocol=t.protocol.replace("http","ws"),t.href}else return n}function pt(n=gt("url")||z.default_mount_path){return new dt(n)}function gt(n){const t=document.head.querySelector(`meta[name='action-cable-${n}']`);if(t)return t.getAttribute("content")}let q;function mt(){return q??=pt(),q}const bt=5e3,K="railwatch:live-paused";let j=!1;const G=new Set;function Y(n){if(j!==n){j=n;for(const t of G)t()}}function St(n){return G.add(n),()=>{G.delete(n)}}function Tt(){return c.useSyncExternalStore(St,vt,yt)}function yt(){return!1}function vt(){return j}function Et(n,t){const e=rt.c(19);let s;e[0]!==t?(s={},e[0]=t,e[1]=s):s=e[1];const{only:o,onEvent:r}=s,[h,E]=c.useState(!1),[_,H]=c.useState(null),[$,F]=c.useState(null),[Q,X]=c.useState(n);Q!==n&&(X(n),E(!1),H(null),F(null));const[l,Z]=c.useState(kt),J=c.useRef(o),B=c.useRef(r),P=c.useRef(l);let m;e[2]!==r||e[3]!==o||e[4]!==l?(m=()=>{J.current=o,B.current=r,P.current=l},e[2]=r,e[3]=o,e[4]=l,e[5]=m):m=e[5],c.useEffect(m);const D=c.useRef(Rt);let b,S;e[6]!==h||e[7]!==l?(b=()=>(Y(h&&!l),wt),S=[h,l],e[6]=h,e[7]=l,e[8]=b,e[9]=S):(b=e[8],S=e[9]),c.useEffect(b,S);let y;e[10]===Symbol.for("react.memo_cache_sentinel")?(y=function(u){P.current=u,localStorage.setItem(K,u?"1":"0"),Z(u),D.current()},e[10]=y):y=e[10];const tt=y;let v,A;e[11]!==n?(v=()=>{let d=!1,u=!1,M=!1,O=!1,W=-1/0,R,k;const et=function(){u=!1,M=!0,W=Date.now(),L.reload({only:J.current,onCancelToken:ot=>{k=()=>ot.cancel()},onSuccess:()=>{d||F(Date.now())},onFinish:()=>{k=void 0,M=!1,f()}})};function f(){if(clearTimeout(R),R=void 0,d||!u||M||O||P.current||document.visibilityState!=="visible")return;const a=bt-(Date.now()-W);a>0?R=setTimeout(f,a):et()}const U=function(){f()},nt=L.on("start",a=>{a.detail.visit.async||(O=!0,u=!1,W=Date.now(),k?.())}),it=L.on("finish",a=>{a.detail.visit.async||(O=!1,f())});document.addEventListener("visibilitychange",U),D.current=f;const st=mt().subscriptions.create({channel:"EnvironmentChannel",id:n},{connected:()=>{d||E(!0)},disconnected:()=>{d||E(!1)},received:a=>{d||(H(Date.now()),B.current?.(a),u=!0,f())}});return()=>{d=!0,k?.(),clearTimeout(R),nt(),it(),D.current=At,document.removeEventListener("visibilitychange",U),st.unsubscribe()}},A=[n],e[11]=n,e[12]=v,e[13]=A):(v=e[12],A=e[13]),c.useEffect(v,A);let w;return e[14]!==h||e[15]!==_||e[16]!==$||e[17]!==l?(w={connected:h,lastEventAt:_,lastRefreshedAt:$,paused:l,setPaused:tt},e[14]=h,e[15]=_,e[16]=$,e[17]=l,e[18]=w):w=e[18],w}function At(){}function wt(){return Y(!1)}function Rt(){}function kt(){return typeof window>"u"?!1:localStorage.getItem(K)==="1"}export{Tt as a,Et as u};
Binary file
@@ -1,5 +0,0 @@
1
- <svg width="512" height="512" viewBox="0 0 1254 1254" xmlns="http://www.w3.org/2000/svg">
2
- <rect width="1254" height="1254" rx="274" fill="#020E24"/>
3
- <path d="M 236 324.989 L 236 404.978 496.750 405.239 L 757.500 405.500 765.665 408.577 C 777.060 412.870, 784.110 417.355, 792.381 425.574 C 833.878 466.807, 812.048 538.520, 752.263 557.363 C 737.593 561.987, 732.018 562.115, 560.250 561.798 C 471.562 561.634, 399 561.557, 399 561.626 C 399 561.695, 406.313 568.648, 415.250 577.077 C 436.108 596.747, 508.719 665.823, 525 681.483 C 612.468 765.614, 693.318 845.033, 770.500 922.639 L 840.500 993.023 951.250 993.011 C 1012.163 993.005, 1062 992.732, 1062 992.404 C 1062 992.076, 1056.942 986.113, 1050.761 979.154 C 1039.889 966.913, 1035.649 962.220, 1005.428 928.979 C 997.688 920.465, 984.624 906.075, 976.396 897 C 933.021 849.161, 888.142 799.872, 868.953 779 C 857.071 766.075, 841.562 749.200, 834.490 741.500 C 827.417 733.800, 814.456 719.721, 805.686 710.213 C 796.916 700.705, 789.994 692.673, 790.303 692.363 C 790.613 692.054, 795.578 690.983, 801.338 689.983 C 895.506 673.637, 967.601 596.363, 980.578 497.866 C 982.637 482.242, 982.086 446.289, 979.576 432.500 C 960.757 329.105, 884.022 255.740, 784.576 246.063 C 777.168 245.342, 687.144 245, 504.826 245 L 236 245 236 324.989" fill="#fff"/>
4
- <path d="M 243.550 507.838 C 244.072 508.299, 247.425 510.859, 251 513.526 C 294.327 545.849, 358.703 617.861, 503.521 796 C 560.192 865.711, 593.994 908.954, 627.414 954.500 L 642.090 974.500 689.045 975 C 714.871 975.275, 736 975.275, 735.999 975 C 735.994 973.773, 698.564 930.428, 663.901 891.507 C 571.946 788.257, 436.131 649.261, 367.500 588.162 C 325.285 550.581, 286.033 524.106, 252.457 510.567 C 243.188 506.829, 241.991 506.462, 243.550 507.838 M 236 520 C 236 521.800, 236.667 522, 242.655 522 C 249.247 522, 249.293 521.981, 247.500 520 C 246.164 518.524, 244.420 518, 240.845 518 C 236.667 518, 236 518.275, 236 520 M 236 532.500 L 236 537 249.067 537 L 262.134 537 258.446 532.500 L 254.759 528 245.380 528 L 236 528 236 532.500 M 236 553.500 L 236 562 258.500 562 C 270.875 562, 280.991 561.663, 280.981 561.250 C 280.970 560.837, 278.237 557.013, 274.908 552.750 L 268.854 545 252.427 545 L 236 545 236 553.500 M 235.909 585 C 235.859 589.950, 235.777 595.462, 235.727 597.250 L 235.636 600.500 273.840 600.762 L 312.044 601.024 302.772 588.569 L 293.500 576.114 264.750 576.057 L 236 576 235.909 585 M 235.570 627.477 C 235.212 629.389, 234.979 637.714, 235.053 645.977 L 235.188 661 295.571 661 L 355.955 661 342.326 642.500 L 328.698 624 282.460 624 L 236.223 624 235.570 627.477 M 236 717.750 L 236 741.500 324.591 741.326 C 373.315 741.230, 413.343 740.990, 413.541 740.792 C 413.739 740.594, 406.184 729.985, 396.752 717.216 L 379.603 694 307.802 694 L 236 694 236 717.750 M 236.235 813.250 L 236.500 842.500 362.358 842.754 C 472.189 842.975, 488.146 842.822, 487.658 841.552 C 487.351 840.751, 477.621 827.475, 466.036 812.048 L 444.973 784 340.471 784 L 235.970 784 236.235 813.250 M 235.683 898.750 C 234.872 900.147, 235.511 973.844, 236.341 974.675 C 237.491 975.825, 392.185 976.287, 495.665 975.450 L 581.829 974.753 578.959 970.126 C 575.681 964.845, 552.884 930.825, 539.500 911.243 L 530.500 898.075 383.309 898.038 C 302.354 898.017, 235.922 898.337, 235.683 898.750" fill="#FFC22B"/>
5
- </svg>