railwatch 0.6.0 → 0.7.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.
- checksums.yaml +4 -4
- data/AGENTS.md +42 -26
- data/CHANGELOG.md +41 -0
- data/README.md +40 -29
- data/app/frontend/components/app-content.tsx +26 -0
- data/app/frontend/components/app-logo-icon.tsx +23 -0
- data/app/frontend/components/app-logo.tsx +14 -0
- data/app/frontend/components/app-shell.tsx +38 -0
- data/app/frontend/components/app-sidebar-header.tsx +54 -0
- data/app/frontend/components/app-sidebar.tsx +94 -0
- data/app/frontend/components/app-wordmark.tsx +29 -0
- data/app/frontend/components/breadcrumbs.tsx +46 -0
- data/app/frontend/components/icon.tsx +16 -0
- data/app/frontend/components/input-error.tsx +18 -0
- data/app/frontend/components/nav-footer.tsx +46 -0
- data/app/frontend/components/nav-main.tsx +41 -0
- data/app/frontend/components/nav-user.tsx +50 -0
- data/app/frontend/components/railwatch/chart-hover.tsx +34 -0
- data/app/frontend/components/railwatch/chart-panel.tsx +170 -0
- data/app/frontend/components/railwatch/code.tsx +28 -0
- data/app/frontend/components/railwatch/command-palette.tsx +132 -0
- data/app/frontend/components/railwatch/copy-block.tsx +52 -0
- data/app/frontend/components/railwatch/copy-id.tsx +49 -0
- data/app/frontend/components/railwatch/cursor-load-more.tsx +39 -0
- data/app/frontend/components/railwatch/data-table.tsx +195 -0
- data/app/frontend/components/railwatch/digit-roll.tsx +312 -0
- data/app/frontend/components/railwatch/empty-state.tsx +159 -0
- data/app/frontend/components/railwatch/env-nav.tsx +130 -0
- data/app/frontend/components/railwatch/env-switcher.tsx +145 -0
- data/app/frontend/components/railwatch/filter-bar.tsx +153 -0
- data/app/frontend/components/railwatch/flamegraph.tsx +324 -0
- data/app/frontend/components/railwatch/frames.tsx +295 -0
- data/app/frontend/components/railwatch/json-viewer.tsx +159 -0
- data/app/frontend/components/railwatch/live-dot.tsx +78 -0
- data/app/frontend/components/railwatch/live-toggle.tsx +76 -0
- data/app/frontend/components/railwatch/metric-chart.tsx +112 -0
- data/app/frontend/components/railwatch/mobile-page-switcher.tsx +89 -0
- data/app/frontend/components/railwatch/onboarding.tsx +91 -0
- data/app/frontend/components/railwatch/origin-identity.tsx +84 -0
- data/app/frontend/components/railwatch/page-header.tsx +42 -0
- data/app/frontend/components/railwatch/percentile-picker.tsx +18 -0
- data/app/frontend/components/railwatch/relative-time.tsx +18 -0
- data/app/frontend/components/railwatch/saved-views.tsx +232 -0
- data/app/frontend/components/railwatch/segmented.tsx +64 -0
- data/app/frontend/components/railwatch/series-chart.tsx +400 -0
- data/app/frontend/components/railwatch/shortcuts-dialog.tsx +89 -0
- data/app/frontend/components/railwatch/signal-toast.tsx +121 -0
- data/app/frontend/components/railwatch/sort-header.tsx +37 -0
- data/app/frontend/components/railwatch/source-link.tsx +57 -0
- data/app/frontend/components/railwatch/sparkline-cell.tsx +14 -0
- data/app/frontend/components/railwatch/sql-block.tsx +116 -0
- data/app/frontend/components/railwatch/stat.tsx +173 -0
- data/app/frontend/components/railwatch/status-badge.tsx +79 -0
- data/app/frontend/components/railwatch/step-picker.tsx +57 -0
- data/app/frontend/components/railwatch/timeline.tsx +405 -0
- data/app/frontend/components/railwatch/utilisation-bar.tsx +44 -0
- data/app/frontend/components/railwatch/window-picker.tsx +147 -0
- data/app/frontend/components/ui/avatar.tsx +51 -0
- data/app/frontend/components/ui/badge.tsx +46 -0
- data/app/frontend/components/ui/breadcrumb.tsx +109 -0
- data/app/frontend/components/ui/button.tsx +60 -0
- data/app/frontend/components/ui/card.tsx +92 -0
- data/app/frontend/components/ui/chart.tsx +374 -0
- data/app/frontend/components/ui/checkbox.tsx +32 -0
- data/app/frontend/components/ui/collapsible.tsx +31 -0
- data/app/frontend/components/ui/command.tsx +182 -0
- data/app/frontend/components/ui/dialog.tsx +158 -0
- data/app/frontend/components/ui/dropdown-menu.tsx +255 -0
- data/app/frontend/components/ui/hover-card.tsx +42 -0
- data/app/frontend/components/ui/input.tsx +21 -0
- data/app/frontend/components/ui/label.tsx +24 -0
- data/app/frontend/components/ui/popover.tsx +87 -0
- data/app/frontend/components/ui/select.tsx +185 -0
- data/app/frontend/components/ui/separator.tsx +28 -0
- data/app/frontend/components/ui/sheet.tsx +137 -0
- data/app/frontend/components/ui/sidebar.tsx +726 -0
- data/app/frontend/components/ui/skeleton.tsx +13 -0
- data/app/frontend/components/ui/sonner.tsx +41 -0
- data/app/frontend/components/ui/table.tsx +114 -0
- data/app/frontend/components/ui/tabs.tsx +91 -0
- data/app/frontend/components/ui/textarea.tsx +18 -0
- data/app/frontend/components/ui/tooltip.tsx +61 -0
- data/app/frontend/components/user-info.tsx +32 -0
- data/app/frontend/components/user-menu-content.tsx +94 -0
- data/app/frontend/entrypoints/application.css +244 -0
- data/app/frontend/entrypoints/inertia.tsx +95 -0
- data/app/frontend/fonts/CommitMono-Bold.woff2 +0 -0
- data/app/frontend/fonts/CommitMono-Regular.woff2 +0 -0
- data/app/frontend/fonts/Roboto-Black.woff2 +0 -0
- data/app/frontend/fonts/Roboto-Bold.woff2 +0 -0
- data/app/frontend/fonts/Roboto-Medium.woff2 +0 -0
- data/app/frontend/fonts/Roboto-Regular.woff2 +0 -0
- data/app/frontend/hooks/use-appearance.tsx +67 -0
- data/app/frontend/hooks/use-clipboard.ts +32 -0
- data/app/frontend/hooks/use-flash.tsx +23 -0
- data/app/frontend/hooks/use-hotkeys.ts +63 -0
- data/app/frontend/hooks/use-initials.tsx +15 -0
- data/app/frontend/hooks/use-live.ts +179 -0
- data/app/frontend/hooks/use-mobile-navigation.ts +8 -0
- data/app/frontend/hooks/use-mobile.ts +21 -0
- data/app/frontend/hooks/use-percentile.ts +24 -0
- data/app/frontend/hooks/use-reduced-motion.ts +25 -0
- data/app/frontend/hooks/use-row-nav.ts +106 -0
- data/app/frontend/hooks/use-step.ts +27 -0
- data/app/frontend/hooks/use-ticker.ts +12 -0
- data/app/frontend/hooks/use-window.ts +58 -0
- data/app/frontend/layouts/app/app-sidebar-layout.tsx +107 -0
- data/app/frontend/layouts/app-layout.tsx +21 -0
- data/app/frontend/layouts/env-layout.tsx +53 -0
- data/app/frontend/layouts/persistent-layout.tsx +18 -0
- data/app/frontend/lib/cable.ts +10 -0
- data/app/frontend/lib/env-pages.ts +236 -0
- data/app/frontend/lib/execution-path.ts +55 -0
- data/app/frontend/lib/explain.ts +50 -0
- data/app/frontend/lib/filter.ts +25 -0
- data/app/frontend/lib/flamegraph.ts +155 -0
- data/app/frontend/lib/format.ts +71 -0
- data/app/frontend/lib/keyboard.ts +18 -0
- data/app/frontend/lib/source-link.ts +217 -0
- data/app/frontend/lib/utils.ts +6 -0
- data/app/frontend/pages/alerts/index.tsx +171 -0
- data/app/frontend/pages/broadcasts/index.tsx +171 -0
- data/app/frontend/pages/cache_events/index.tsx +127 -0
- data/app/frontend/pages/commands/index.tsx +143 -0
- data/app/frontend/pages/deploys/index.tsx +94 -0
- data/app/frontend/pages/deploys/show.tsx +309 -0
- data/app/frontend/pages/deprecations/index.tsx +176 -0
- data/app/frontend/pages/exceptions/index.tsx +271 -0
- data/app/frontend/pages/executions/show.tsx +821 -0
- data/app/frontend/pages/issues/index.tsx +399 -0
- data/app/frontend/pages/issues/show.tsx +1367 -0
- data/app/frontend/pages/jobs/index.tsx +381 -0
- data/app/frontend/pages/jobs/klass.tsx +215 -0
- data/app/frontend/pages/llm_calls/index.tsx +664 -0
- data/app/frontend/pages/logs/index.tsx +303 -0
- data/app/frontend/pages/mails/index.tsx +218 -0
- data/app/frontend/pages/notifications/index.tsx +161 -0
- data/app/frontend/pages/outgoing_requests/index.tsx +309 -0
- data/app/frontend/pages/overview/show.tsx +333 -0
- data/app/frontend/pages/people/index.tsx +102 -0
- data/app/frontend/pages/people/show.tsx +149 -0
- data/app/frontend/pages/processes/index.tsx +335 -0
- data/app/frontend/pages/profiles/index.tsx +110 -0
- data/app/frontend/pages/profiles/show.tsx +105 -0
- data/app/frontend/pages/queries/index.tsx +492 -0
- data/app/frontend/pages/queries/show.tsx +276 -0
- data/app/frontend/pages/releases/index.tsx +190 -0
- data/app/frontend/pages/releases/release-health.tsx +68 -0
- data/app/frontend/pages/releases/release-path.ts +25 -0
- data/app/frontend/pages/releases/show.tsx +262 -0
- data/app/frontend/pages/requests/index.tsx +235 -0
- data/app/frontend/pages/requests/route.tsx +159 -0
- data/app/frontend/pages/scheduled_tasks/index.tsx +220 -0
- data/app/frontend/pages/spans/index.tsx +229 -0
- data/app/frontend/pages/spans/show.tsx +220 -0
- data/app/frontend/pages/storage_ops/index.tsx +150 -0
- data/app/frontend/pages/tenants/index.tsx +236 -0
- data/app/frontend/pages/tenants/show.tsx +477 -0
- data/app/frontend/pages/tenants/tenant-path.ts +26 -0
- data/app/frontend/pages/thresholds/index.tsx +414 -0
- data/app/frontend/pages/traces/show.tsx +208 -0
- data/app/frontend/pages/transactions/index.tsx +220 -0
- data/app/frontend/pages/view_renders/index.tsx +241 -0
- data/app/frontend/pages/visits/index.tsx +321 -0
- data/app/frontend/public/icon.png +0 -0
- data/app/frontend/public/icon.svg +5 -0
- data/app/frontend/routes/index.d.ts +2136 -0
- data/app/frontend/routes/index.js +2112 -0
- data/app/frontend/types/globals.d.ts +9 -0
- data/app/frontend/types/index.ts +288 -0
- data/app/frontend/types/vite-env.d.ts +9 -0
- data/app/jobs/railwatch/rollup_job.rb +3 -1
- data/app/models/railwatch/ingest/rollup_absorber.rb +1 -1
- data/docs/ai-and-mcp.md +9 -3
- data/docs/configuration.md +68 -27
- data/docs/embedded.md +76 -43
- data/docs/faq.md +22 -10
- data/docs/getting-started.md +116 -41
- data/docs/records.md +13 -10
- data/docs/replacing-nightwatch.md +16 -14
- data/docs/replacing-sentry.md +19 -10
- data/docs/security.md +24 -3
- data/docs/self-hosting.md +9 -1
- data/docs/testing.md +14 -4
- data/docs/troubleshooting.md +62 -23
- data/lib/generators/railwatch/install/install_generator.rb +5 -4
- data/lib/generators/railwatch/install/templates/initializer.rb.tt +2 -2
- data/lib/railwatch/version.rb +1 -1
- data/lib/railwatch.rb +8 -3
- data/llms.txt +21 -18
- data/public/railwatch/assets/app-layout-LvxN9xSS.js +41 -0
- data/public/railwatch/assets/application-Cc5v_Vk9.css +1 -0
- data/public/railwatch/assets/{arrow-up-EmePsTKP.js → arrow-up-DG01k9AL.js} +1 -1
- data/public/railwatch/assets/{braces-iZ7MEfYP.js → braces-C3w7pfxS.js} +1 -1
- data/public/railwatch/assets/{card-DqdEEKcJ.js → card-Dpwlr0uY.js} +1 -1
- data/public/railwatch/assets/{chart-C4k7Ub9W.js → chart-DJHv3R7W.js} +1 -1
- data/public/railwatch/assets/{chart-hover-2yZG3w2u.js → chart-hover-CEH-DtXO.js} +1 -1
- data/public/railwatch/assets/{chart-panel-CONkZcn9.js → chart-panel-CUdIzJvk.js} +1 -1
- data/public/railwatch/assets/code-BRZprwun.js +1 -0
- data/public/railwatch/assets/copy-id-CwhGGiwF.js +1 -0
- data/public/railwatch/assets/cursor-load-more-uF1_955Q.js +1 -0
- data/public/railwatch/assets/data-table-DYi-N0hm.js +1 -0
- data/public/railwatch/assets/env-layout-HdcOaPPX.js +1 -0
- data/public/railwatch/assets/{execution-path-DWovhgLi.js → execution-path-CElXXFO_.js} +1 -1
- data/public/railwatch/assets/filter-bar-DEv0G_34.js +1 -0
- data/public/railwatch/assets/{flamegraph-BNbNIuKT.js → flamegraph-SKD9yxW9.js} +2 -2
- data/public/railwatch/assets/frames-CUpyJQDy.js +1 -0
- data/public/railwatch/assets/index-2W-ppwap.js +1 -0
- data/public/railwatch/assets/index-74ocuU5d.js +1 -0
- data/public/railwatch/assets/{index-Zkt4W_CM.js → index-B8NA62Lz.js} +2 -2
- data/public/railwatch/assets/index-BBCEkLqp.js +1 -0
- data/public/railwatch/assets/index-BDcglJzX.js +1 -0
- data/public/railwatch/assets/index-B_KFb9LS.js +1 -0
- data/public/railwatch/assets/index-BqK_VKom.js +1 -0
- data/public/railwatch/assets/index-BxCXBHP2.js +1 -0
- data/public/railwatch/assets/index-C1jc1OoH.js +1 -0
- data/public/railwatch/assets/index-C7zREldp.js +1 -0
- data/public/railwatch/assets/index-CEetm4oC.js +1 -0
- data/public/railwatch/assets/index-CIaZkokF.js +1 -0
- data/public/railwatch/assets/index-CNH85TZp.js +1 -0
- data/public/railwatch/assets/index-Ce4SB5AB.js +1 -0
- data/public/railwatch/assets/index-CiRMSYMn.js +1 -0
- data/public/railwatch/assets/index-CjxXgOs-.js +1 -0
- data/public/railwatch/assets/index-ClL-PYEV.js +1 -0
- data/public/railwatch/assets/index-CteZ6fop.js +1 -0
- data/public/railwatch/assets/index-CvqfEExO.js +1 -0
- data/public/railwatch/assets/index-CxTLT-Qh.js +1 -0
- data/public/railwatch/assets/index-DJd3OUSd.js +1 -0
- data/public/railwatch/assets/index-DPD-rLp6.js +1 -0
- data/public/railwatch/assets/index-DYK_dps4.js +1 -0
- data/public/railwatch/assets/index-DrayARrI.js +1 -0
- data/public/railwatch/assets/index-HRXGir-0.js +1 -0
- data/public/railwatch/assets/index-UJOUALr_.js +1 -0
- data/public/railwatch/assets/index-d-3J7gQ5.js +1 -0
- data/public/railwatch/assets/index-oQrvBpOm.js +1 -0
- data/public/railwatch/assets/inertia-FoqYZAk8.js +97 -0
- data/public/railwatch/assets/json-viewer-CxqMojEm.js +1 -0
- data/public/railwatch/assets/klass-DEF-Vat5.js +1 -0
- data/public/railwatch/assets/origin-identity-Y6gvfQVR.js +1 -0
- data/public/railwatch/assets/{percentile-picker-BxIVblBw.js → percentile-picker-E2aUdLxx.js} +1 -1
- data/public/railwatch/assets/relative-time-DcJbkKlN.js +1 -0
- data/public/railwatch/assets/{release-health-Cb1tMOOO.js → release-health-C8WSCDKD.js} +1 -1
- data/public/railwatch/assets/route-qO5vX1p-.js +1 -0
- data/public/railwatch/assets/{segmented-C4oWE73o.js → segmented-BWee8uc9.js} +1 -1
- data/public/railwatch/assets/select-G7rNBzv0.js +1 -0
- data/public/railwatch/assets/series-chart-C5nXIUc5.js +1 -0
- data/public/railwatch/assets/show-BEWisLQw.js +1 -0
- data/public/railwatch/assets/show-BEa9PGu1.js +2 -0
- data/public/railwatch/assets/{show-gtwKsTsl.js → show-BiT_Aloc.js} +3 -3
- data/public/railwatch/assets/show-BpCO49d3.js +1 -0
- data/public/railwatch/assets/show-CH7yxt7R.js +1 -0
- data/public/railwatch/assets/show-CTO8Lvd2.js +1 -0
- data/public/railwatch/assets/show-DnYsDMUt.js +2 -0
- data/public/railwatch/assets/show-DyzHM527.js +1 -0
- data/public/railwatch/assets/show-Nfpxs8su.js +1 -0
- data/public/railwatch/assets/show-ddjUMo9G.js +1 -0
- data/public/railwatch/assets/show-ksjbSzDH.js +1 -0
- data/public/railwatch/assets/{sort-header-CPM6fhXv.js → sort-header-uOq5VlrB.js} +1 -1
- data/public/railwatch/assets/{sparkline-cell-CXCxXPWt.js → sparkline-cell-DgGij0cu.js} +1 -1
- data/public/railwatch/assets/stat-BTzNKTm2.js +1 -0
- data/public/railwatch/assets/status-badge-BDkOXa-C.js +1 -0
- data/public/railwatch/assets/{tenant-path-C4aM_cO0.js → tenant-path-DU0ezKSU.js} +1 -1
- data/public/railwatch/assets/{use-clipboard-C1ApSwzA.js → use-clipboard-DoENmlWY.js} +1 -1
- data/public/railwatch/assets/{use-live-DWwLg1Nj.js → use-live-CE_fN5_6.js} +1 -1
- data/public/railwatch/manifest.json +612 -1591
- metadata +242 -117
- data/public/railwatch/assets/app-layout-2xAKndVD.js +0 -1
- data/public/railwatch/assets/app-wordmark-Bt6XqURo.js +0 -1
- data/public/railwatch/assets/appearance-DyCfeh9o.js +0 -1
- data/public/railwatch/assets/application-B7h1MIhi.css +0 -1
- data/public/railwatch/assets/auth-layout-BuwogWMZ.js +0 -1
- data/public/railwatch/assets/badge-Dv7I-ebP.js +0 -1
- data/public/railwatch/assets/checkbox-DKbThbxr.js +0 -1
- data/public/railwatch/assets/code-CYahYQHZ.js +0 -1
- data/public/railwatch/assets/copy-DaQMJWoT.js +0 -1
- data/public/railwatch/assets/copy-block-CbJum9s8.js +0 -1
- data/public/railwatch/assets/copy-id-JmvLfkmx.js +0 -1
- data/public/railwatch/assets/cursor-load-more-C1ylbqqL.js +0 -1
- data/public/railwatch/assets/data-table-CVKR2wkq.js +0 -1
- data/public/railwatch/assets/edit-BXF5oNYA.js +0 -1
- data/public/railwatch/assets/edit-BwSEVrTG.js +0 -8
- data/public/railwatch/assets/edit-D5BRDwLT.js +0 -1
- data/public/railwatch/assets/empty-state-Bn48Gplm.js +0 -1
- data/public/railwatch/assets/env-layout-CKLL8Ds7.js +0 -1
- data/public/railwatch/assets/filter-bar-xcbJC93z.js +0 -1
- data/public/railwatch/assets/frames-Bk39xfJG.js +0 -1
- data/public/railwatch/assets/google-sign-in-button-B5as2ps1.js +0 -1
- data/public/railwatch/assets/index-Atp1FTgX.js +0 -1
- data/public/railwatch/assets/index-B-FXAo1w.js +0 -1
- data/public/railwatch/assets/index-B0xgzHuN.js +0 -1
- data/public/railwatch/assets/index-BDVShWMs.js +0 -1
- data/public/railwatch/assets/index-BRvRkfob.js +0 -1
- data/public/railwatch/assets/index-BVWapDeB.js +0 -1
- data/public/railwatch/assets/index-Bd4YpOIO.js +0 -1
- data/public/railwatch/assets/index-BeQw69GM.js +0 -1
- data/public/railwatch/assets/index-BfitxVBv.js +0 -1
- data/public/railwatch/assets/index-C-EwH4lO.js +0 -1
- data/public/railwatch/assets/index-C8JIdb3_.js +0 -1
- data/public/railwatch/assets/index-CBFCtJAR.js +0 -1
- data/public/railwatch/assets/index-CDXlITyG.js +0 -1
- data/public/railwatch/assets/index-COd9lT84.js +0 -1
- data/public/railwatch/assets/index-C_hQmVTP.js +0 -1
- data/public/railwatch/assets/index-CcennT28.js +0 -1
- data/public/railwatch/assets/index-CiaeS-n7.js +0 -1
- data/public/railwatch/assets/index-CrA7jBTK.js +0 -1
- data/public/railwatch/assets/index-D0mKj3Hg.js +0 -1
- data/public/railwatch/assets/index-DV5MdmpY.js +0 -1
- data/public/railwatch/assets/index-DaE-1xhx.js +0 -1
- data/public/railwatch/assets/index-DdVg9LKX.js +0 -1
- data/public/railwatch/assets/index-DeLtMWou.js +0 -1
- data/public/railwatch/assets/index-DiQ4mqT_.js +0 -1
- data/public/railwatch/assets/index-LKgpCzoR.js +0 -1
- data/public/railwatch/assets/index-S0NVaLj9.js +0 -1
- data/public/railwatch/assets/index-Vj93BTR5.js +0 -1
- data/public/railwatch/assets/index-XjXcV-EO.js +0 -1
- data/public/railwatch/assets/index-aPCZX-pW.js +0 -1
- data/public/railwatch/assets/index-cTzBycCg.js +0 -1
- data/public/railwatch/assets/index-dpG-19ZN.js +0 -1
- data/public/railwatch/assets/index-gCvuyG1l.js +0 -1
- data/public/railwatch/assets/index-o1xqGvLo.js +0 -1
- data/public/railwatch/assets/index-w_skgMmK.js +0 -1
- data/public/railwatch/assets/inertia-CqnzqPVD.js +0 -97
- data/public/railwatch/assets/input-error-ByT28UdP.js +0 -1
- data/public/railwatch/assets/json-viewer-Bnu9RsJL.js +0 -1
- data/public/railwatch/assets/klass-nLiBV-Az.js +0 -1
- data/public/railwatch/assets/label-1nSzpSB6.js +0 -1
- data/public/railwatch/assets/layout-D7lE1Doo.js +0 -1
- data/public/railwatch/assets/live-dot-UdzOfzJb.js +0 -41
- data/public/railwatch/assets/nav-BRCgp2w3.js +0 -1
- data/public/railwatch/assets/new-C60G72DR.js +0 -1
- data/public/railwatch/assets/new-COyDKOOb.js +0 -1
- data/public/railwatch/assets/new-Cd9zPNJ8.js +0 -1
- data/public/railwatch/assets/new-DMJGKjmH.js +0 -1
- data/public/railwatch/assets/new-Omvf-c9s.js +0 -1
- data/public/railwatch/assets/new-vjRzERL3.js +0 -1
- data/public/railwatch/assets/onboarding-gUjJQc-6.js +0 -1
- data/public/railwatch/assets/origin-identity-M1YUPYS0.js +0 -1
- data/public/railwatch/assets/relative-time-DQ4kjowZ.js +0 -1
- data/public/railwatch/assets/route-BJkoEm7r.js +0 -1
- data/public/railwatch/assets/select-ocdQJdQo.js +0 -1
- data/public/railwatch/assets/separator-Ct2UcZ2x.js +0 -1
- data/public/railwatch/assets/series-chart-D6upsrSn.js +0 -1
- data/public/railwatch/assets/show-B4bwI9x2.js +0 -2
- data/public/railwatch/assets/show-BAjfddEn.js +0 -6
- data/public/railwatch/assets/show-BLJOyLb_.js +0 -1
- data/public/railwatch/assets/show-BoVyMQS6.js +0 -1
- data/public/railwatch/assets/show-Bsu1rvnK.js +0 -1
- data/public/railwatch/assets/show-C6OiJ6Hr.js +0 -1
- data/public/railwatch/assets/show-C8TkpEgm.js +0 -1
- data/public/railwatch/assets/show-CBFBiBY2.js +0 -1
- data/public/railwatch/assets/show-CEhPVMMT.js +0 -1
- data/public/railwatch/assets/show-CV-lG2b6.js +0 -2
- data/public/railwatch/assets/show-CX_pab9S.js +0 -2
- data/public/railwatch/assets/show-D6lgzL6n.js +0 -1
- data/public/railwatch/assets/show-DDVsv-uS.js +0 -1
- data/public/railwatch/assets/show-Dwiq-8hA.js +0 -1
- data/public/railwatch/assets/show-eKazflRI.js +0 -1
- data/public/railwatch/assets/show-yEOrk6Pt.js +0 -1
- data/public/railwatch/assets/stat-BNEfE8X1.js +0 -1
- data/public/railwatch/assets/status-badge-D0aylrM5.js +0 -1
- data/public/railwatch/assets/text-link-CP4lqUi6.js +0 -1
- data/public/railwatch/assets/textarea-DzJo2ds4.js +0 -1
- data/public/railwatch/assets/timeline-BNcJ9PMc.js +0 -1
- data/public/railwatch/assets/transition-BX2M1iaq.js +0 -5
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as le,u as ae,j as r,e as oe,ab as ne,a1 as ce,L as me}from"./inertia-CqnzqPVD.js";import{C as de}from"./chart-hover-2yZG3w2u.js";import{V as ue,D as fe}from"./chart-panel-CONkZcn9.js";import{D as he}from"./data-table-CVKR2wkq.js";import{E as xe}from"./empty-state-Bn48Gplm.js";import{F as pe}from"./filter-bar-xcbJC93z.js";import{P as ye,E as ge}from"./env-layout-CKLL8Ds7.js";import{u as ve,P as be}from"./percentile-picker-BxIVblBw.js";import{S as ke,Z as je}from"./app-layout-2xAKndVD.js";import{S as M}from"./sort-header-CPM6fhXv.js";import{S as _e}from"./sparkline-cell-CXCxXPWt.js";import{m as re,c as Z,p as qe}from"./format-B9SDkrWj.js";import"./series-chart-D6upsrSn.js";import"./chart-C4k7Ub9W.js";import"./badge-Dv7I-ebP.js";import"./app-wordmark-Bt6XqURo.js";import"./use-live-DWwLg1Nj.js";import"./live-dot-UdzOfzJb.js";import"./index-BDVShWMs.js";import"./index-C-EwH4lO.js";import"./segmented-C4oWE73o.js";import"./label-1nSzpSB6.js";import"./checkbox-DKbThbxr.js";import"./arrow-up-EmePsTKP.js";function it(t){const e=le.c(95),{environment:se,window:a}=ae().props,{percentile:o}=ve(),n=se.application_id,c=se.id;let O;e[0]!==n||e[1]!==c||e[2]!==t.dir||e[3]!==t.q||e[4]!==t.sort||e[5]!==a?(O=s=>oe.visit(ne(n,c,{window:a,sort:t.sort,dir:t.dir,q:t.q||void 0,...s}),{preserveState:!0}),e[0]=n,e[1]=c,e[2]=t.dir,e[3]=t.q,e[4]=t.sort,e[5]=a,e[6]=O):O=e[6];const m=O;let H;e[7]!==t.dir||e[8]!==t.sort||e[9]!==m?(H=s=>m({sort:s,dir:t.sort===s&&t.dir==="desc"?"asc":"desc"}),e[7]=t.dir,e[8]=t.sort,e[9]=m,e[10]=H):H=e[10];const i=H;let N;e[11]!==n||e[12]!==c||e[13]!==a?(N=s=>ce(n,c,s.group_hash,{window:a}),e[11]=n,e[12]=c,e[13]=a,e[14]=N):N=e[14];const l=N;let D;e[15]===Symbol.for("react.memo_cache_sentinel")?(D=r.jsx(ye,{title:"Requests",description:"Every route your app served, with error rates and percentiles.",actions:r.jsxs(r.Fragment,{children:[r.jsx(ke,{page:"requests"}),r.jsx(be,{})]})}),e[15]=D):D=e[15];let L;e[16]===Symbol.for("react.memo_cache_sentinel")?(L={key:"method",label:"Method",options:["GET","POST","PUT","PATCH","DELETE"]},e[16]=L):L=e[16];let A;e[17]===Symbol.for("react.memo_cache_sentinel")?(A=[L,{key:"status",label:"Status",options:["2xx","3xx","4xx","5xx"]},{key:"route",label:"Route"}],e[17]=A):A=e[17];let d;e[18]!==m?(d=s=>m({q:s||void 0}),e[18]=m,e[19]=d):d=e[19];let u;e[20]!==t.q||e[21]!==d?(u=r.jsx(pe,{value:t.q,fields:A,onChange:d,placeholder:"method:GET status:5xx route:/widgets"}),e[20]=t.q,e[21]=d,e[22]=u):u=e[22];let f;e[23]!==t.deploys||e[24]!==t.series?(f=r.jsx(ue,{label:"Requests",data:t.series,deploys:t.deploys}),e[23]=t.deploys,e[24]=t.series,e[25]=f):f=e[25];let h;e[26]!==t.deploys||e[27]!==t.series||e[28]!==o?(h=r.jsx(fe,{label:"Latency",data:t.series,deploys:t.deploys,percentile:o}),e[26]=t.deploys,e[27]=t.series,e[28]=o,e[29]=h):h=e[29];let x;e[30]!==f||e[31]!==h?(x=r.jsxs("div",{className:"grid gap-4 lg:grid-cols-2",children:[f,h]}),e[30]=f,e[31]=h,e[32]=x):x=e[32];let F;e[33]===Symbol.for("react.memo_cache_sentinel")?(F=r.jsx(xe,{icon:je,title:"No requests in this window",description:"HTTP requests to your app appear here as they're reported."}),e[33]=F):F=e[33];let p;e[34]!==l?(p={onOpen:(s,ie)=>ie?.newTab?globalThis.window.open(l(s),"_blank"):oe.visit(l(s))},e[34]=l,e[35]=p):p=e[35];let y;e[36]!==l?(y={key:"name",header:"Route",grow:!0,cell:s=>r.jsx(me,{className:"font-mono text-xs hover:underline",href:l(s),title:s.name,children:s.name})},e[36]=l,e[37]=y):y=e[37];let K,V,B;e[38]===Symbol.for("react.memo_cache_sentinel")?(K={key:"trend",hideOnMobile:!0,header:"Trend",cell:Me},V={key:"ok",hideOnMobile:!0,header:"2xx",align:"right",cell:Re},B={key:"4xx",hideOnMobile:!0,header:"4xx",align:"right",cell:Ce},e[38]=K,e[39]=V,e[40]=B):(K=e[38],V=e[39],B=e[40]);const $=t.sort==="errors",z=t.dir==="asc"?"asc":"desc";let g;e[41]!==i?(g=()=>i("errors"),e[41]=i,e[42]=g):g=e[42];let v;e[43]!==$||e[44]!==z||e[45]!==g?(v={key:"5xx",header:r.jsx(M,{label:"5xx",active:$,dir:z,onClick:g}),align:"right",cell:Te},e[43]=$,e[44]=z,e[45]=g,e[46]=v):v=e[46];const I=t.sort==="count",J=t.dir==="asc"?"asc":"desc";let b;e[47]!==i?(b=()=>i("count"),e[47]=i,e[48]=b):b=e[48];let k;e[49]!==I||e[50]!==J||e[51]!==b?(k={key:"total",header:r.jsx(M,{label:"Total",active:I,dir:J,onClick:b}),align:"right",cell:we},e[49]=I,e[50]=J,e[51]=b,e[52]=k):k=e[52];let G;e[53]===Symbol.for("react.memo_cache_sentinel")?(G={key:"err",hideOnMobile:!0,header:"Error %",align:"right",cell:Ee},e[53]=G):G=e[53];const Q=t.sort==="avg",W=t.dir==="asc"?"asc":"desc";let j;e[54]!==i?(j=()=>i("avg"),e[54]=i,e[55]=j):j=e[55];let _;e[56]!==Q||e[57]!==W||e[58]!==j?(_={key:"avg",hideOnMobile:!0,header:r.jsx(M,{label:"Avg",active:Q,dir:W,onClick:j}),align:"right",cell:Se},e[56]=Q,e[57]=W,e[58]=j,e[59]=_):_=e[59];const X=t.sort===o,Y=t.dir==="asc"?"asc":"desc";let q;e[60]!==o||e[61]!==i?(q=()=>i(o),e[60]=o,e[61]=i,e[62]=q):q=e[62];let P;e[63]!==o||e[64]!==X||e[65]!==Y||e[66]!==q?(P=r.jsx(M,{label:o,active:X,dir:Y,onClick:q}),e[63]=o,e[64]=X,e[65]=Y,e[66]=q,e[67]=P):P=e[67];let S;e[68]!==o?(S=s=>r.jsx("span",{className:"font-semibold",children:re(s[o])}),e[68]=o,e[69]=S):S=e[69];let E;e[70]!==o||e[71]!==P||e[72]!==S?(E={key:o,header:P,align:"right",cell:S},e[70]=o,e[71]=P,e[72]=S,e[73]=E):E=e[73];const ee=t.sort==="max",te=t.dir==="asc"?"asc":"desc";let w;e[74]!==i?(w=()=>i("max"),e[74]=i,e[75]=w):w=e[75];let T;e[76]!==ee||e[77]!==te||e[78]!==w?(T={key:"max",hideOnMobile:!0,header:r.jsx(M,{label:"Max",active:ee,dir:te,onClick:w}),align:"right",cell:Pe},e[76]=ee,e[77]=te,e[78]=w,e[79]=T):T=e[79];let C;e[80]!==y||e[81]!==v||e[82]!==k||e[83]!==_||e[84]!==E||e[85]!==T?(C=[y,K,V,B,v,k,G,_,E,T],e[80]=y,e[81]=v,e[82]=k,e[83]=_,e[84]=E,e[85]=T,e[86]=C):C=e[86];let R;e[87]!==t.routes||e[88]!==p||e[89]!==C?(R=r.jsx(he,{rows:t.routes,rowKey:He,empty:F,hoverKey:Oe,keyboardNav:p,columns:C}),e[87]=t.routes,e[88]=p,e[89]=C,e[90]=R):R=e[90];let U;return e[91]!==x||e[92]!==R||e[93]!==u?(U=r.jsx(ge,{title:"Requests",children:r.jsxs(de,{children:[D,u,x,R]})}),e[91]=x,e[92]=R,e[93]=u,e[94]=U):U=e[94],U}function Pe(t){return re(t.max)}function Se(t){return re(t.avg)}function Ee(t){return qe(t.errors,t.count)}function we(t){return Z(t.count)}function Te(t){return r.jsx("span",{className:t.errors?"text-destructive":"",children:Z(t.errors)})}function Ce(t){return Z(t.client_errors)}function Re(t){return Z(t.count-t.errors-t.client_errors)}function Me(t){return r.jsx(_e,{data:t.sparkline,hoverKey:t.group_hash})}function Oe(t){return t.group_hash}function He(t){return t.group_hash}export{it as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as D,x as L,j as t,H as O,L as S,g as q,e as k,m as B,o as R,i as z,h as H}from"./inertia-CqnzqPVD.js";import{D as M}from"./data-table-CVKR2wkq.js";import{E as T}from"./empty-state-Bn48Gplm.js";import{L as $}from"./live-dot-UdzOfzJb.js";import{S as I}from"./sparkline-cell-CXCxXPWt.js";import{S as b,a as F}from"./stat-BNEfE8X1.js";import{B as C}from"./badge-Dv7I-ebP.js";import{B as E}from"./app-wordmark-Bt6XqURo.js";import{C as y,a as N,b as A,c as K}from"./card-DqdEEKcJ.js";import{O as U,A as W,P as G}from"./app-layout-2xAKndVD.js";import{c as w,a as P}from"./format-B9SDkrWj.js";import"./chart-hover-2yZG3w2u.js";import"./index-BDVShWMs.js";import"./index-C-EwH4lO.js";import"./series-chart-D6upsrSn.js";import"./chart-C4k7Ub9W.js";import"./use-live-DWwLg1Nj.js";import"./arrow-up-EmePsTKP.js";import"./checkbox-DKbThbxr.js";import"./label-1nSzpSB6.js";function Ne(s){const e=D.c(32);let d,u;e[0]===Symbol.for("react.memo_cache_sentinel")?(d=[{title:"Dashboard",href:L()}],u=t.jsx(O,{title:"Dashboard"}),e[0]=d,e[1]=u):(d=e[0],u=e[1]);let i;e[2]!==s.overview_apps.length?(i=t.jsx(b,{label:"Applications",value:s.overview_apps.length}),e[2]=s.overview_apps.length,e[3]=i):i=e[3];const g=s.recent_issues.length?"destructive":"success";let a;e[4]!==s.recent_issues.length||e[5]!==g?(a=t.jsx(b,{label:"Open issues",value:s.recent_issues.length,tone:g}),e[4]=s.recent_issues.length,e[5]=g,e[6]=a):a=e[6];let r;e[7]!==s.usage.events_this_month?(r=w(s.usage.events_this_month),e[7]=s.usage.events_this_month,e[8]=r):r=e[8];let h;e[9]!==s.usage.quota?(h=w(s.usage.quota),e[9]=s.usage.quota,e[10]=h):h=e[10];const v=`of ${h} on ${s.usage.plan}`;let n;e[11]!==r||e[12]!==v?(n=t.jsx(b,{label:"Events this month",value:r,hint:v}),e[11]=r,e[12]=v,e[13]=n):n=e[13];let l;e[14]!==i||e[15]!==a||e[16]!==n?(l=t.jsxs(F,{children:[i,a,n]}),e[14]=i,e[15]=a,e[16]=n,e[17]=l):l=e[17];let o;e[18]!==s.overview_apps?(o=s.overview_apps.map(te),e[18]=s.overview_apps,e[19]=o):o=e[19];let x;e[20]===Symbol.for("react.memo_cache_sentinel")?(x=t.jsx(y,{className:"border-dashed",children:t.jsx(N,{className:"flex h-full items-center justify-center pt-6",children:t.jsx(E,{variant:"outline",onClick:se,children:"Add application"})})}),e[20]=x):x=e[20];let c;e[21]!==o?(c=t.jsxs("div",{className:"grid gap-4 md:grid-cols-2 xl:grid-cols-3",children:[o,x]}),e[21]=o,e[22]=c):c=e[22];let f;e[23]===Symbol.for("react.memo_cache_sentinel")?(f=t.jsx(A,{children:t.jsx(K,{children:"Recent open issues"})}),e[23]=f):f=e[23];let p;e[24]===Symbol.for("react.memo_cache_sentinel")?(p=t.jsx(T,{icon:U,title:"No open issues",description:"Issues are opened when a request, job, or exception starts repeating."}),e[24]=p):p=e[24];let _;e[25]===Symbol.for("react.memo_cache_sentinel")?(_=[{key:"k",header:"Issue",cell:Y},{key:"t",header:"Title",cell:X},{key:"w",hideOnMobile:!0,header:"Where",cell:V},{key:"n",hideOnMobile:!0,header:"Events",align:"right",cell:Q},{key:"l",header:"Last",align:"right",cell:J}],e[25]=_):_=e[25];let m;e[26]!==s.recent_issues?(m=t.jsxs(y,{children:[f,t.jsx(N,{children:t.jsx(M,{rows:s.recent_issues,rowKey:ee,empty:p,onRowClick:Z,columns:_})})]}),e[26]=s.recent_issues,e[27]=m):m=e[27];let j;return e[28]!==c||e[29]!==m||e[30]!==l?(j=t.jsxs(W,{breadcrumbs:d,children:[u,t.jsxs("div",{className:"flex flex-1 flex-col gap-4 p-3 md:gap-5 md:px-6 md:pt-2 md:pb-6",children:[l,c,m]})]}),e[28]=c,e[29]=m,e[30]=l,e[31]=j):j=e[31],j}function J(s){return P(s.last_seen_at)}function Q(s){return w(s.occurrences)}function V(s){return t.jsxs("span",{className:"text-xs",children:[s.application," · ",s.environment]})}function X(s){return t.jsx("span",{className:"line-clamp-1 text-xs",children:s.title})}function Y(s){return t.jsx("span",{className:"font-mono text-xs font-semibold",children:s.key})}function Z(s){return k.visit(z(s.id))}function ee(s){return s.id}function se(){return k.visit(H())}function te(s){return t.jsxs(y,{children:[t.jsxs(A,{className:"flex-row items-center justify-between",children:[t.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[t.jsx("span",{className:"bg-muted flex size-8 shrink-0 items-center justify-center rounded-md font-mono text-xs font-semibold",children:s.name.slice(0,2).toUpperCase()}),t.jsxs("div",{className:"min-w-0",children:[t.jsx(S,{className:"block truncate text-sm font-semibold hover:underline",href:q(s.id),children:s.name}),t.jsx("div",{className:"label-caps",children:s.issue_prefix})]})]}),t.jsxs(E,{size:"sm",variant:"outline",className:"h-7 text-xs",onClick:()=>k.visit(B(s.id)),children:[t.jsx(G,{className:"size-3"}),"Environment"]})]}),t.jsx(N,{className:"space-y-2",children:s.environments.map(e=>t.jsxs(S,{href:R(s.id,e.id),className:"hover:bg-muted flex items-center justify-between rounded-md border px-3 py-2 text-sm",children:[t.jsxs("span",{className:"flex flex-1 items-center gap-2",children:[t.jsx($,{lastSeenAt:e.paused?null:e.last_seen_at,thresholdMs:6e5}),e.name]}),t.jsx(I,{data:e.request_sparkline}),t.jsxs("span",{className:"text-muted-foreground flex items-center gap-2 text-xs",children:[e.error_rate>0&&t.jsxs(C,{variant:"destructive",children:[(e.error_rate*100).toFixed(1),"% err"]}),e.open_issues>0&&t.jsx(C,{variant:"destructive",children:e.open_issues}),e.last_seen_at?P(e.last_seen_at):"no data"]})]},e.id))})]},s.id)}export{Ne as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as p,u,j as s,H as x,L as f,a7 as h,aI as j}from"./inertia-CqnzqPVD.js";import{H as g,S as v}from"./layout-D7lE1Doo.js";import{B as y}from"./badge-Dv7I-ebP.js";import{B as S}from"./app-wordmark-Bt6XqURo.js";import{A as N}from"./app-layout-2xAKndVD.js";import"./separator-Ct2UcZ2x.js";import"./index-BDVShWMs.js";import"./live-dot-UdzOfzJb.js";import"./index-C-EwH4lO.js";import"./checkbox-DKbThbxr.js";import"./label-1nSzpSB6.js";const d=[{title:"Sessions",href:j()}];function R(m){const e=p.c(9),{sessions:n}=m,{auth:a}=u().props;let r;e[0]===Symbol.for("react.memo_cache_sentinel")?(r=s.jsx(x,{title:d[d.length-1].title}),e[0]=r):r=e[0];let l;e[1]===Symbol.for("react.memo_cache_sentinel")?(l=s.jsx(g,{title:"Sessions",description:"Manage your active sessions across devices"}),e[1]=l):l=e[1];let i;if(e[2]!==a||e[3]!==n){let c;e[5]!==a?(c=t=>s.jsx("div",{className:"flex flex-col space-y-2 rounded-lg border p-4",children:s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsxs("div",{className:"space-y-1",children:[s.jsxs("p",{className:"font-medium",children:[t.user_agent,t.id===a.session.id&&s.jsx(y,{variant:"secondary",className:"ml-2",children:"Current"})]}),s.jsxs("p",{className:"text-muted-foreground text-sm",children:["IP: ",t.ip_address]}),s.jsxs("p",{className:"text-muted-foreground text-sm",children:["Active since:"," ",new Date(t.created_at).toLocaleString()]})]}),t.id!==a.session.id&&s.jsx(S,{variant:"destructive",asChild:!0,children:s.jsx(f,{method:"delete",href:h({id:t.id}),as:"button",children:"Log out"})})]})},t.id),e[5]=a,e[6]=c):c=e[6],i=n.map(c),e[2]=a,e[3]=n,e[4]=i}else i=e[4];let o;return e[7]!==i?(o=s.jsxs(N,{breadcrumbs:d,children:[r,s.jsx(v,{children:s.jsxs("div",{className:"space-y-6",children:[l,s.jsx("div",{className:"space-y-4",children:i})]})})]}),e[7]=i,e[8]=o):o=e[8],o}export{R as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as N,j as s,r as v,C as z,L as ae,M as ue,N as pe,u as fe,H as xe}from"./inertia-CqnzqPVD.js";import{C as oe,a as ie,b as ge}from"./card-DqdEEKcJ.js";import{D as be,a as je,b as ye,c as we,L as ve,B as Ne}from"./live-dot-UdzOfzJb.js";import{R as Se,M as _e,a as ke}from"./nav-BRCgp2w3.js";import{B as ne}from"./app-wordmark-Bt6XqURo.js";import{H as Ce,a as Ee,b as $e}from"./copy-DaQMJWoT.js";import{S as Ae}from"./empty-state-Bn48Gplm.js";import{S as J,a as Re}from"./stat-BNEfE8X1.js";import{I as Te}from"./status-badge-D0aylrM5.js";import{T as Ie}from"./timeline-BNcJ9PMc.js";import{C as Le}from"./index-C-EwH4lO.js";import"./index-BDVShWMs.js";import"./use-live-DWwLg1Nj.js";import"./arrow-up-EmePsTKP.js";import"./badge-Dv7I-ebP.js";import"./format-B9SDkrWj.js";const Me='claude mcp add railwatch --transport http https://railwatch.rebulk.com/mcp --header "Authorization: Bearer $RAILWATCH_MCP_TOKEN"';function Pe(){const e=N.c(4);let t,o,n;e[0]===Symbol.for("react.memo_cache_sentinel")?(t=s.jsx("p",{className:"text-primary mb-2 font-mono text-[11px] tracking-[0.2em] uppercase",children:"MCP"}),o=s.jsx("h2",{className:"text-2xl font-bold tracking-tight",children:"Works with your AI assistant"}),n=s.jsx("p",{className:"text-muted-foreground mt-2",children:"Railwatch speaks MCP, so Claude Code, Cursor, VS Code, and Zed can read your production data directly — issues, slow routes, query plans, stack profiles, logs, deploys. It ships prompts too: point one at an issue key and it pulls the occurrence, the timeline around it, and the deploy it started after. Writes are attributed to you, so a comment or a status change an assistant makes is signed in the issue's activity feed."}),e[0]=t,e[1]=o,e[2]=n):(t=e[0],o=e[1],n=e[2]);let a;return e[3]===Symbol.for("react.memo_cache_sentinel")?(a=s.jsxs("section",{className:"mx-auto max-w-2xl px-6 pb-16 text-center",children:[t,o,n,s.jsx(oe,{className:"mt-6 text-left",children:s.jsxs(ie,{children:[s.jsx("p",{className:"text-muted-foreground font-mono text-sm",children:"# one line, then ask it what broke today"}),s.jsx("p",{className:"mt-1 font-mono text-sm break-all",children:Me})]})})]}),e[3]=a):a=e[3],a}const De=[{title:"Requests",description:"Every route's throughput, latency percentiles, and status codes, down to a single request's waterfall.",image:"requests",alt:"The Requests page: throughput and latency charts over a table of every route with its 2xx, 4xx, 5xx counts, error rate, and p95"},{title:"Jobs & scheduled tasks",description:"Queue depth, retries, and run history for Active Job and your recurring tasks.",image:"jobs",alt:"The Jobs page: attempts per hour split into processed and failed, a queue table with average wait, and the most recent runs"},{title:"Queries & N+1s",description:"Slow queries and N+1 patterns grouped by source location, not buried in a log line.",image:"queries",alt:"The Queries page: two N+1 patterns with a suggested fix and the source line, above every SQL shape ranked by count and p95"},{title:"Exceptions → Issues",description:"Exceptions are grouped into Issues that track occurrences, assignees, and status over time.",image:"issues",alt:"An issue page: a resolved NoMethodError with the raising line of source highlighted, its breadcrumbs, and the alerts it sent"},{title:"Inertia visits",description:"Page-by-page render and payload size, so a slow visit is obvious before support tickets show up.",image:"visits",alt:"The Inertia visits page: p75 web vitals, visits per hour, and a table of components with visit count, LCP, INP, and p95"},{title:"Deploy comparison",description:"Every chart is annotated with deploys, so a regression points straight at the change that caused it.",image:"deploys",alt:"A deploy page: the commits it shipped, its crash-free rate, and request p95, error rate, and job failures for the hour before and after"},{title:"Alerts",description:"Threshold and issue alerts delivered where your team already works.",image:"alerts",alt:"The Alerts page: new, resolved, and threshold alerts delivered to Slack and email, newest first"},{title:"MCP / API",description:"A JSON-RPC MCP endpoint and a token-authenticated API, so your AI assistant can query production directly.",image:"mcp",alt:"A request page with its Copy as Markdown button: the same timeline an assistant reads over MCP"}];function Oe(){const e=N.c(9),[t,o]=v.useState(null);let n;e[0]===Symbol.for("react.memo_cache_sentinel")?(n=s.jsx("div",{className:"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4",children:De.map(l=>{const{title:m,description:f,image:h,alt:g}=l;return s.jsxs("div",{className:"bg-card flex flex-col overflow-hidden rounded-lg border",children:[s.jsx("button",{type:"button",onClick:()=>o(l),className:"group relative aspect-[4/3] w-full cursor-zoom-in overflow-hidden border-b bg-[#020618] text-left","aria-label":`Open a full screenshot of ${m}`,children:s.jsx("img",{src:`/marketing/${h}.webp`,alt:g,loading:"lazy",width:1200,height:900,className:"h-full w-full object-cover object-top transition-transform duration-500 ease-out group-hover:scale-[1.03] motion-reduce:transition-none"})}),s.jsxs("div",{className:"space-y-1 px-4 py-3",children:[s.jsx("h3",{className:"text-sm font-semibold",children:m}),s.jsx("p",{className:"text-muted-foreground text-[13px] leading-snug",children:f})]})]},m)})}),e[0]=n):n=e[0];const a=t!==null;let c;e[1]===Symbol.for("react.memo_cache_sentinel")?(c=l=>!l&&o(null),e[1]=c):c=e[1];let i;e[2]!==t?(i=t&&s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"border-b px-5 py-3",children:[s.jsx(be,{className:"text-base",children:t.title}),s.jsx(je,{children:t.description})]}),s.jsx("img",{src:`/marketing/${t.image}-full.webp`,alt:t.alt,width:1920,height:1200,className:"block max-h-[calc(92vh-4.5rem)] w-full object-contain object-top"})]}),e[2]=t,e[3]=i):i=e[3];let d;e[4]!==i?(d=s.jsx(ye,{className:"bg-background max-h-[92vh] w-[min(96vw,1400px)] gap-0 overflow-hidden p-0 sm:max-w-none",children:i}),e[4]=i,e[5]=d):d=e[5];let r;return e[6]!==a||e[7]!==d?(r=s.jsxs("section",{className:"mx-auto max-w-5xl px-6 pb-16",children:[n,s.jsx(we,{open:a,onOpenChange:c,children:d})]}),e[6]=a,e[7]=d,e[8]=r):r=e[8],r}const de=v.createContext("departed"),me=()=>v.useContext(de),qe=[["approaching",100],["braking",2300],["held",3300],["caution",6400],["clear",7200],["departed",8300]],ze=3200,Fe=1800,He={arriving:"clear",approaching:"clear",braking:"clear",held:"stop",caution:"caution",clear:"clear",departed:"clear"};function he(){const[e]=v.useState(Be);return e}function Be(){return typeof window<"u"&&!window.matchMedia("(prefers-reduced-motion: reduce)").matches}function We(){const e=he(),[t,o]=v.useState(e?"arriving":"departed");return v.useEffect(()=>{if(!e)return;const n=qe.map(([a,c])=>setTimeout(()=>o(a),c));return()=>n.forEach(clearTimeout)},[]),{stage:t,animated:e}}const Ge=72,le=13.5,re=112,Ue=14;function Je(e,t,o,n){let a=0,[c,i]=e;for(let d=1;d<=64;d++){const r=d/64,l=1-r,m=l*l*l*e[0]+3*l*l*r*t[0]+3*l*r*r*o[0]+r*r*r*n[0],f=l*l*l*e[1]+3*l*l*r*t[1]+3*l*r*r*o[1]+r*r*r*n[1];a+=Math.hypot(m-c,f-i),c=m,i=f}return a}function Qe(e){const t=e.querySelector("h1"),o=e.querySelector("[data-hero-strip]");if(!t||!o)return null;const n=e.getBoundingClientRect(),a=t.getBoundingClientRect(),c=o.getBoundingClientRect(),i=n.width,d=n.height,r=i<768,l=i/2,m=r?10:Math.max(16,l-520),f=c.top-n.top+60,h=Ge,g=l+(r?120:220),u=[l-(r?30:60),a.top-n.top+a.height+4],b=[m,f-h],x=b[1]-u[1],y=[u[0]-x*.55,u[1]+x*.32],p=[m,b[1]-x*.42],w=Je(u,y,p,b),j=Math.PI*h/2,S=g-Ue-re/2,_=w+j+(S-(m+h)),C=w+j+(i+re+40-(m+h));return{w:i,h:d,p0:u,c1:y,c2:p,p3:b,xL:m,yL:f,r:h,cx:l,xSignal:g,yFadeTop:u[1],yFadeFull:u[1]+x*.7,stop:_,total:C}}function Q(e,t){const[o,n]=e.p0,a=e.r+t,c=t;return[`M ${o+c*.5} ${n-c*.85}`,`C ${e.c1[0]+c*.5} ${e.c1[1]-c*.85}, ${e.c2[0]-t} ${e.c2[1]}, ${e.p3[0]-t} ${e.p3[1]}`,`A ${a} ${a} 0 0 0 ${e.xL+e.r} ${e.yL+t}`,`L ${e.w+re+40} ${e.yL+t}`].join(" ")}const K=[{at:-41,w:30},{at:-4,w:34},{at:37,w:38}],Ke=K.length-1,Ve=1;function Xe(e){const t=N.c(14),{index:o,held:n,style:a}=e,c=K[o],i=-c.w/2;let d;t[0]!==c.w||t[1]!==i?(d=s.jsx("rect",{x:i,y:"-7",width:c.w,height:"14",rx:"3",fill:"currentColor"}),t[0]=c.w,t[1]=i,t[2]=d):d=t[2];let r;t[3]!==c.w||t[4]!==o?(r=o===Ke&&s.jsx("rect",{x:c.w/2-6,y:"-4",width:"4",height:"8",rx:"1",className:"text-primary",fill:"currentColor"}),t[3]=c.w,t[4]=o,t[5]=r):r=t[5];let l;t[6]!==n||t[7]!==o?(l=o===Ve&&s.jsx("rect",{x:"-5",y:"-25",width:"10",height:"10",transform:"rotate(45 0 -20)",className:z("transition-opacity duration-300",n?"opacity-100":"opacity-0"),fill:"rgb(239 68 68)"}),t[6]=n,t[7]=o,t[8]=l):l=t[8];let m;return t[9]!==a||t[10]!==d||t[11]!==r||t[12]!==l?(m=s.jsxs("g",{className:"text-foreground/85",style:a,children:[d,r,l]}),t[9]=a,t[10]=d,t[11]=r,t[12]=l,t[13]=m):m=t[13],m}function Ye(e){const t=N.c(3),{children:o}=e,{stage:n}=We();let a;return t[0]!==o||t[1]!==n?(a=s.jsx(de.Provider,{value:n,children:o}),t[0]=o,t[1]=n,t[2]=a):a=t[2],a}function Ze(e){const t=N.c(21),{children:o}=e,n=v.useRef(null),[a,c]=v.useState(null),i=me(),d=he(),r=v.useId();let l,m;t[0]===Symbol.for("react.memo_cache_sentinel")?(l=()=>{const p=n.current;if(!p)return;const w=()=>c(Qe(p));w();const j=new ResizeObserver(w);return j.observe(p),()=>j.disconnect()},m=[],t[0]=l,t[1]=m):(l=t[0],m=t[1]),v.useEffect(l,m);const f=i==="held";let h,g,u;if(t[2]!==d||t[3]!==f||t[4]!==a||t[5]!==r||t[6]!==i){let p;if(a)e:switch(i){case"arriving":{p={distance:0};break e}case"approaching":case"braking":case"held":case"caution":{p={distance:a.stop,transition:`offset-distance ${ze}ms cubic-bezier(.45,.05,.25,1)`};break e}case"clear":{p={distance:a.stop+120,transition:"offset-distance 900ms ease-in-out"};break e}case"departed":p={distance:a.total,transition:`offset-distance ${Fe}ms cubic-bezier(.4,0,.8,.6)`}}const w=j=>a&&p?{offsetPath:`path("${Q(a,0)}")`,offsetRotate:"auto",offsetDistance:`${p.distance+K[j].at}px`,transition:p.transition}:void 0;h=n,g="relative overflow-hidden",u=a&&s.jsxs("svg",{"aria-hidden":!0,className:"text-foreground/30 pointer-events-none absolute inset-0 z-0 h-full w-full [mask-image:linear-gradient(to_right,black_86%,transparent)]",width:a.w,height:a.h,viewBox:`0 0 ${a.w} ${a.h}`,children:[s.jsxs("defs",{children:[s.jsxs("linearGradient",{id:`${r}-fade`,gradientUnits:"userSpaceOnUse",x1:"0",y1:a.yFadeTop,x2:"0",y2:a.yFadeFull,children:[s.jsx("stop",{offset:"0",stopColor:"white",stopOpacity:"0"}),s.jsx("stop",{offset:"1",stopColor:"white",stopOpacity:"1"})]}),s.jsx("mask",{id:r,maskUnits:"userSpaceOnUse",x:"0",y:"0",width:a.w,height:a.h,children:s.jsx("rect",{width:a.w,height:a.h,fill:`url(#${r}-fade)`})})]}),s.jsxs("g",{mask:`url(#${r})`,children:[s.jsx("path",{d:Q(a,0),fill:"none",stroke:"currentColor",strokeWidth:"30",strokeDasharray:"4 18"}),s.jsx("path",{d:Q(a,le/2),fill:"none",stroke:"currentColor",strokeWidth:"2.5"}),s.jsx("path",{d:Q(a,-le/2),fill:"none",stroke:"currentColor",strokeWidth:"2.5"}),d&&K.map((j,S)=>s.jsx(Xe,{index:S,held:f,style:w(S)},S))]})]}),t[2]=d,t[3]=f,t[4]=a,t[5]=r,t[6]=i,t[7]=h,t[8]=g,t[9]=u}else h=t[7],g=t[8],u=t[9];let b;t[10]!==o?(b=s.jsx("div",{className:"relative z-10",children:o}),t[10]=o,t[11]=b):b=t[11];let x;t[12]!==a||t[13]!==i?(x=a&&s.jsx(s.Fragment,{children:s.jsx("div",{className:"pointer-events-none absolute z-10 h-0 w-0",style:{left:a.xSignal,top:a.yL},"aria-hidden":!0,children:s.jsx(Ae,{aspect:He[i],className:"left-0 md:left-0"})})}),t[12]=a,t[13]=i,t[14]=x):x=t[14];let y;return t[15]!==h||t[16]!==g||t[17]!==u||t[18]!==b||t[19]!==x?(y=s.jsxs("div",{ref:h,className:g,children:[u,b,x]}),t[15]=h,t[16]=g,t[17]=u,t[18]=b,t[19]=x,t[20]=y):y=t[20],y}function et(e){const t=N.c(11),{signedIn:o}=e;let n;t[0]===Symbol.for("react.memo_cache_sentinel")?(n=s.jsxs("p",{className:"text-primary mb-5 flex items-baseline justify-center gap-3 font-mono text-[11px] tracking-[0.2em] uppercase",children:["Built by",s.jsx("a",{href:"https://rebulk.com",className:"text-foreground hover:text-primary transition-colors",children:s.jsx(Se,{className:"h-2.5 w-auto"})})]}),t[0]=n):n=t[0];let a,c;t[1]===Symbol.for("react.memo_cache_sentinel")?(a=s.jsxs("h1",{className:"text-5xl font-black tracking-tight text-balance sm:text-6xl",children:[Ce,s.jsx("span",{className:"text-primary",children:Ee})]}),c=s.jsx("p",{className:"text-muted-foreground mx-auto mt-5 max-w-xl text-lg text-balance",children:$e}),t[1]=a,t[2]=c):(a=t[1],c=t[2]);let i;t[3]!==o?(i=o?s.jsx(ne,{asChild:!0,size:"lg",children:s.jsx(ae,{href:"/dashboard",children:"Open dashboard"})}):s.jsx(ne,{asChild:!0,size:"lg",children:s.jsx(ae,{href:ue(),children:"Get started"})}),t[3]=o,t[4]=i):i=t[4];let d;t[5]===Symbol.for("react.memo_cache_sentinel")?(d=s.jsx(ne,{asChild:!0,variant:"outline",size:"lg",children:s.jsx(ae,{href:pe(),children:"Read the docs"})}),t[5]=d):d=t[5];let r;t[6]!==i?(r=s.jsxs("div",{className:"mt-8 flex items-center justify-center gap-3",children:[i,d]}),t[6]=i,t[7]=r):r=t[7];let l;t[8]===Symbol.for("react.memo_cache_sentinel")?(l=s.jsx("div",{className:"mt-6 h-32","data-hero-strip":!0}),t[8]=l):l=t[8];let m;return t[9]!==r?(m=s.jsx(Ze,{children:s.jsxs("section",{className:"relative mx-auto max-w-3xl px-6 pt-14 pb-0 text-center",children:[n,a,c,r,l]})}),t[9]=r,t[10]=m):m=t[10],m}const tt=[{comment:"# 1. add the gem",lines:["bundle add railwatch"]},{comment:"# 2. initializer, routes, Kamal hook, browser client, matchers",lines:["bin/rails generate railwatch:install --prompt-token --kamal-secrets"]},{comment:"# 3. check every piece is wired up",lines:["bin/rails railwatch:doctor"]},{comment:"# 4. connect your editor's assistant",lines:["bin/rails railwatch:mcp"]}];function st(){const e=N.c(4);let t,o,n;e[0]===Symbol.for("react.memo_cache_sentinel")?(t=s.jsx("p",{className:"text-primary mb-2 font-mono text-[11px] tracking-[0.2em] uppercase",children:"Install"}),o=s.jsx("h2",{className:"text-2xl font-bold tracking-tight",children:"Five-minute install"}),n=s.jsx("p",{className:"text-muted-foreground mt-2",children:"One gem, one generator, no dashboard to build. The generator finishes by running the doctor, so you see a ✓ or a ✗ per check before you deploy."}),e[0]=t,e[1]=o,e[2]=n):(t=e[0],o=e[1],n=e[2]);let a;return e[3]===Symbol.for("react.memo_cache_sentinel")?(a=s.jsxs("section",{className:"mx-auto max-w-2xl px-6 pb-16 text-center",children:[t,o,n,s.jsx(oe,{className:"mt-6 text-left",children:s.jsx(ie,{className:"space-y-1 font-mono text-sm",children:tt.map(at)})})]}),e[3]=a):a=e[3],a}function at(e,t){return s.jsxs("div",{className:t>0?"pt-3":void 0,children:[s.jsx("p",{className:"text-muted-foreground",children:e.comment}),e.lines.map(nt)]},e.comment)}function nt(e){return s.jsx("p",{className:"break-all",children:e},e)}const ce=[{type:"query",id:1,offset:2,duration:4.2,label:"SELECT users",stage:"action",sql:'SELECT "users".* FROM "users" WHERE "users"."id" = ?'},{type:"cache_event",id:2,offset:8,duration:.4,label:"read widgets/42",stage:"action",detail:{op:"read",key:"widgets/42"}},{type:"query",id:3,offset:11,duration:12.8,label:"SELECT widgets",stage:"action",sql:'SELECT "widgets".* FROM "widgets" WHERE "widgets"."account_id" = ?'},{type:"outgoing_request",id:4,offset:26,duration:40.1,label:"GET api.stripe.com",stage:"action",detail:{method:"GET",url:"https://api.stripe.com/v1/charges",status:200}},{type:"view_render",id:5,offset:68,duration:6.5,label:"widgets/index.html.erb",stage:"render"},{type:"enqueued_job",id:6,offset:70,duration:null,label:"WidgetSyncJob",stage:"render"}],rt={type:"exception",id:7,offset:66.4,duration:null,label:"NoMethodError: undefined method `total' for nil",stage:"action",source:"app/controllers/widgets_controller.rb:31"};function ot(){const e=N.c(68),t=me(),o=t==="braking"||t==="held",n=t==="held";let a;e[0]!==n?(a=n?[...ce,rt]:ce,e[0]=n,e[1]=a):a=e[1];const c=a,i=t==="held"?"new":t==="caution"||t==="clear"?"resolved":null;let d;e[2]===Symbol.for("react.memo_cache_sentinel")?(d=new Date().toISOString(),e[2]=d):d=e[2];let r;e[3]!==o?(r=s.jsxs("div",{className:"flex items-center gap-2 text-sm font-medium",children:[s.jsx(ve,{lastSeenAt:d,erroring:o}),"storefront · production"]}),e[3]=o,e[4]=r):r=e[4];const l=n?"bg-danger/15 text-danger":"bg-live/15 text-live";let m;e[5]!==l?(m=z("rounded px-1.5 py-0.5 font-semibold transition-colors duration-500",l),e[5]=l,e[6]=m):m=e[6];const f=n?"500":"200";let h;e[7]!==m||e[8]!==f?(h=s.jsxs("span",{className:"text-muted-foreground flex items-center gap-2 font-mono text-xs",children:["GET /widgets",s.jsx("span",{className:m,children:f})]}),e[7]=m,e[8]=f,e[9]=h):h=e[9];const g=i?"translate-x-0":"translate-x-[calc(100%+2px)]";let u;e[10]!==g?(u=z("bg-popover absolute right-0 flex items-center gap-2 border-l px-3 text-xs shadow-[-12px_0_16px_-8px_rgba(0,0,0,.5)] transition-transform duration-500 ease-out motion-reduce:transition-none","max-md:bottom-2.5 max-md:gap-1.5 max-md:rounded-l-md max-md:border-y max-md:px-2.5 max-md:py-1.5 max-md:text-[11px] md:inset-y-0",g),e[10]=g,e[11]=u):u=e[11];const b=i==="resolved"?"bg-live/15 text-live":"bg-danger/15 text-danger";let x;e[12]!==b?(x=z("flex size-6 shrink-0 items-center justify-center rounded-full",b),e[12]=b,e[13]=x):x=e[13];let y;e[14]!==i?(y=i==="resolved"?s.jsx(Le,{className:"size-3.5"}):s.jsx(Ne,{className:"size-3.5"}),e[14]=i,e[15]=y):y=e[15];let p;e[16]!==x||e[17]!==y?(p=s.jsx("span",{className:x,children:y}),e[16]=x,e[17]=y,e[18]=p):p=e[18];const w=i==="resolved"?"SF-142 resolved":"New issue SF-142";let j;e[19]!==w?(j=s.jsx("span",{className:"block leading-tight font-medium",children:w}),e[19]=w,e[20]=j):j=e[20];const S=i==="resolved"?"Slack #storefront-alerts · just now":"Sent to Slack #storefront-alerts";let _;e[21]!==S?(_=s.jsx("span",{className:"max-md:hidden",children:S}),e[21]=S,e[22]=_):_=e[22];let C;e[23]===Symbol.for("react.memo_cache_sentinel")?(C=s.jsx("span",{className:"md:hidden",children:"Slack #storefront-alerts"}),e[23]=C):C=e[23];let E;e[24]!==_?(E=s.jsxs("span",{className:"text-muted-foreground block leading-tight",children:[_,C]}),e[24]=_,e[25]=E):E=e[25];let $;e[26]!==j||e[27]!==E?($=s.jsxs("span",{className:"min-w-0",children:[j,E]}),e[26]=j,e[27]=E,e[28]=$):$=e[28];let A;e[29]!==p||e[30]!==$||e[31]!==u?(A=s.jsxs("div",{"aria-live":"polite",className:u,children:[p,$]}),e[29]=p,e[30]=$,e[31]=u,e[32]=A):A=e[32];let R;e[33]!==r||e[34]!==A||e[35]!==h?(R=s.jsxs(ge,{className:"relative flex-row items-center justify-between overflow-hidden border-b pb-6 max-md:flex-wrap max-md:gap-y-3",children:[r,h,A]}),e[33]=r,e[34]=A,e[35]=h,e[36]=R):R=e[36];let F;e[37]===Symbol.for("react.memo_cache_sentinel")?(F=s.jsx(J,{label:"p50 latency",value:"42ms",hint:"last 24h"}),e[37]=F):F=e[37];const V=n?"2.1%":"0.4%",X=n?"destructive":"success",Y=n?"3 of 143 requests":"last 24h";let T;e[38]!==V||e[39]!==X||e[40]!==Y?(T=s.jsx(J,{label:"error rate",value:V,tone:X,hint:Y}),e[38]=V,e[39]=X,e[40]=Y,e[41]=T):T=e[41];let H;e[42]===Symbol.for("react.memo_cache_sentinel")?(H=s.jsx(J,{label:"requests/min",value:"1.2k"}),e[42]=H):H=e[42];const Z=n?"1":"0",ee=n?"destructive":"success";let I;e[43]!==Z||e[44]!==ee?(I=s.jsx(J,{label:"open issues",value:Z,tone:ee}),e[43]=Z,e[44]=ee,e[45]=I):I=e[45];let L;e[46]!==T||e[47]!==I?(L=s.jsxs(Re,{children:[F,T,H,I]}),e[46]=T,e[47]=I,e[48]=L):L=e[48];const te=n?"border-danger/40 bg-danger/5":"bg-muted/30";let M;e[49]!==te?(M=z("flex items-center justify-between gap-3 rounded-md border px-3 py-2 text-xs transition-colors duration-500",te),e[49]=te,e[50]=M):M=e[50];let B;e[51]===Symbol.for("react.memo_cache_sentinel")?(B=s.jsxs("div",{className:"flex min-w-0 items-center gap-3",children:[s.jsx("span",{className:"shrink-0 font-mono font-semibold",children:"SF-142"}),s.jsx("span",{className:"truncate",children:"NoMethodError in WidgetsController#index"})]}),e[51]=B):B=e[51];let W;e[52]===Symbol.for("react.memo_cache_sentinel")?(W=s.jsx("span",{className:"hidden sm:inline",children:"3 events"}),e[52]=W):W=e[52];const se=n?"open":"resolved";let P;e[53]!==se?(P=s.jsxs("div",{className:"text-muted-foreground flex shrink-0 items-center gap-3 font-mono",children:[W,s.jsx(Te,{status:se})]}),e[53]=se,e[54]=P):P=e[54];let D;e[55]!==M||e[56]!==P?(D=s.jsxs("div",{className:M,children:[B,P]}),e[55]=M,e[56]=P,e[57]=D):D=e[57];let G;e[58]===Symbol.for("react.memo_cache_sentinel")?(G={action:66,render:24},e[58]=G):G=e[58];let O;e[59]!==c?(O=s.jsx(Ie,{entries:c,total:90,stages:G}),e[59]=c,e[60]=O):O=e[60];let q;e[61]!==L||e[62]!==D||e[63]!==O?(q=s.jsxs(ie,{className:"grid gap-6",children:[L,D,O]}),e[61]=L,e[62]=D,e[63]=O,e[64]=q):q=e[64];let U;return e[65]!==R||e[66]!==q?(U=s.jsx("section",{className:"relative z-20 mx-auto -mt-8 max-w-5xl px-6 pb-16 md:-mt-4",children:s.jsxs(oe,{className:"overflow-hidden",children:[R,q]})}),e[65]=R,e[66]=q,e[67]=U):U=e[67],U}const it=110;function k(e){const t=N.c(8),{step:o,className:n,children:a}=e,c=o===void 0?0:o;let i;t[0]!==n?(i=z("motion-safe:animate-in motion-safe:fade-in motion-safe:slide-in-from-bottom-2 motion-safe:fill-mode-both motion-safe:duration-700 motion-safe:ease-out",n),t[0]=n,t[1]=i):i=t[1];const d=`${c*it}ms`;let r;t[2]!==d?(r={animationDelay:d},t[2]=d,t[3]=r):r=t[3];let l;return t[4]!==a||t[5]!==i||t[6]!==r?(l=s.jsx("div",{className:i,style:r,children:a}),t[4]=a,t[5]=i,t[6]=r,t[7]=l):l=t[7],l}function St(){const e=N.c(15),{auth:t}=fe().props,o=!!t.user;let n;e[0]===Symbol.for("react.memo_cache_sentinel")?(n=s.jsx(xe,{title:"Railwatch — monitoring for Rails apps"}),e[0]=n):n=e[0];let a;e[1]!==o?(a=s.jsx(k,{step:0,children:s.jsx(_e,{signedIn:o})}),e[1]=o,e[2]=a):a=e[2];let c;e[3]!==o?(c=s.jsx(k,{step:1,children:s.jsx(et,{signedIn:o})}),e[3]=o,e[4]=c):c=e[4];let i;e[5]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsx(k,{step:2,children:s.jsx(ot,{})}),e[5]=i):i=e[5];let d;e[6]!==c?(d=s.jsxs(Ye,{children:[c,i]}),e[6]=c,e[7]=d):d=e[7];let r;e[8]===Symbol.for("react.memo_cache_sentinel")?(r=s.jsx(k,{step:3,children:s.jsx(Oe,{})}),e[8]=r):r=e[8];let l;e[9]===Symbol.for("react.memo_cache_sentinel")?(l=s.jsx(k,{step:4,children:s.jsx(Pe,{})}),e[9]=l):l=e[9];let m;e[10]===Symbol.for("react.memo_cache_sentinel")?(m=s.jsx(k,{step:4,children:s.jsx(st,{})}),e[10]=m):m=e[10];let f;e[11]===Symbol.for("react.memo_cache_sentinel")?(f=s.jsx(k,{step:5,children:s.jsx(ke,{})}),e[11]=f):f=e[11];let h;return e[12]!==a||e[13]!==d?(h=s.jsxs(s.Fragment,{children:[n,s.jsxs("div",{className:"dark bg-background text-foreground min-h-screen",children:[a,d,r,l,m,f]})]}),e[12]=a,e[13]=d,e[14]=h):h=e[14],h}export{St as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as z,u as G,j as i,t as J,e as V,$ as Q,L as U}from"./inertia-CqnzqPVD.js";import{V as X}from"./chart-panel-CONkZcn9.js";import{D as H}from"./data-table-CVKR2wkq.js";import{E as W}from"./empty-state-Bn48Gplm.js";import{F as Y}from"./filter-bar-xcbJC93z.js";import{P as Z,E as ee}from"./env-layout-CKLL8Ds7.js";import{u as te,P as ie}from"./percentile-picker-BxIVblBw.js";import{S as re}from"./sparkline-cell-CXCxXPWt.js";import{B as le}from"./badge-Dv7I-ebP.js";import{m as F,c as ne,w as ae}from"./format-B9SDkrWj.js";import{M as I}from"./app-layout-2xAKndVD.js";import"./series-chart-D6upsrSn.js";import"./chart-hover-2yZG3w2u.js";import"./chart-C4k7Ub9W.js";import"./app-wordmark-Bt6XqURo.js";import"./use-live-DWwLg1Nj.js";import"./live-dot-UdzOfzJb.js";import"./index-BDVShWMs.js";import"./index-C-EwH4lO.js";import"./segmented-C4oWE73o.js";import"./label-1nSzpSB6.js";import"./checkbox-DKbThbxr.js";function We(t){const e=z.c(51),{environment:K,window:L}=G().props,{percentile:l}=te(),n=K.application_id,a=K.id;let y;e[0]!==n||e[1]!==a?(y=r=>r.execution_id?J(n,a,r.execution_id):null,e[0]=n,e[1]=a,e[2]=y):y=e[2];const s=y;let _;e[3]===Symbol.for("react.memo_cache_sentinel")?(_=i.jsx(Z,{title:"Mail",description:"Action Mailer deliveries: recipients, delivery method, render and send time.",actions:i.jsx(ie,{})}),e[3]=_):_=e[3];let o;e[4]!==t.series?(o=i.jsx(X,{legend:"outcome",label:"Deliveries",seriesLabel:"Deliveries",data:t.series}),e[4]=t.series,e[5]=o):o=e[5];let b,g,k,v,j,M;e[6]===Symbol.for("react.memo_cache_sentinel")?(b=i.jsx(W,{icon:I,title:"No mail sent in this window",description:"ActionMailer deliveries appear here as your app sends them."}),g={key:"m",header:"Mailer",cell:ge},k={key:"trend",hideOnMobile:!0,header:"Trend",cell:be},v={key:"n",header:"Sent",align:"right",cell:_e},j={key:"f",hideOnMobile:!0,header:"Failed",align:"right",cell:ye},M={key:"avg",hideOnMobile:!0,header:"Avg",align:"right",cell:xe},e[6]=b,e[7]=g,e[8]=k,e[9]=v,e[10]=j,e[11]=M):(b=e[6],g=e[7],k=e[8],v=e[9],j=e[10],M=e[11]);let c;e[12]!==l?(c=r=>i.jsx("span",{className:"font-semibold",children:F(r[l])}),e[12]=l,e[13]=c):c=e[13];let m;e[14]!==l||e[15]!==c?(m=[g,k,v,j,M,{key:l,header:l,align:"right",cell:c}],e[14]=l,e[15]=c,e[16]=m):m=e[16];let d;e[17]!==t.mailers||e[18]!==m?(d=i.jsx(H,{rows:t.mailers,rowKey:ke,empty:b,columns:m}),e[17]=t.mailers,e[18]=m,e[19]=d):d=e[19];let w;e[20]===Symbol.for("react.memo_cache_sentinel")?(w=i.jsx("h2",{className:"text-sm font-semibold",children:"Recent"}),e[20]=w):w=e[20];let S;e[21]===Symbol.for("react.memo_cache_sentinel")?(S=[{key:"mailer",label:"Mailer"},{key:"kind",label:"Kind"}],e[21]=S):S=e[21];let u;e[22]!==n||e[23]!==a||e[24]!==L?(u=r=>V.visit(Q(n,a,{window:L,q:r||void 0}),{preserveState:!0}),e[22]=n,e[23]=a,e[24]=L,e[25]=u):u=e[25];let h;e[26]!==t.q||e[27]!==u?(h=i.jsx(Y,{value:t.q,fields:S,onChange:u,placeholder:"mailer:WidgetMailer kind:smtp"}),e[26]=t.q,e[27]=u,e[28]=h):h=e[28];let N;e[29]===Symbol.for("react.memo_cache_sentinel")?(N=i.jsx(W,{icon:I,title:"No mail sent in this window",description:"ActionMailer deliveries appear here as your app sends them."}),e[29]=N):N=e[29];let p;e[30]!==s?(p={onOpen:(r,B)=>{const R=s(r);R&&(B?.newTab?globalThis.window.open(R,"_blank"):V.visit(R))}},e[30]=s,e[31]=p):p=e[31];let P,O,E,C,q,A,D,T;e[32]===Symbol.for("react.memo_cache_sentinel")?(P={key:"when",header:"When",cell:pe},O={key:"m",header:"Mailer",cell:he},E={key:"s",header:"Subject",cell:ue},C={key:"to",hideOnMobile:!0,header:"To/CC/BCC",align:"right",cell:de},q={key:"att",hideOnMobile:!0,header:"Att.",align:"right",cell:me},A={key:"dm",hideOnMobile:!0,header:"Via",cell:ce},D={key:"st",header:"",cell:oe},T={key:"d",hideOnMobile:!0,header:"Duration",align:"right",cell:se},e[32]=P,e[33]=O,e[34]=E,e[35]=C,e[36]=q,e[37]=A,e[38]=D,e[39]=T):(P=e[32],O=e[33],E=e[34],C=e[35],q=e[36],A=e[37],D=e[38],T=e[39]);let f;e[40]!==s?(f=[P,O,E,C,q,A,D,T,{key:"in",hideOnMobile:!0,header:"In",cell:r=>{const B=s(r);return B?i.jsx(U,{className:"font-mono text-xs hover:underline",href:B,children:r.execution_preview}):null}}],e[40]=s,e[41]=f):f=e[41];let x;e[42]!==t.recent||e[43]!==p||e[44]!==f?(x=i.jsx(H,{rows:t.recent,rowKey:fe,empty:N,keyboardNav:p,columns:f}),e[42]=t.recent,e[43]=p,e[44]=f,e[45]=x):x=e[45];let $;return e[46]!==d||e[47]!==h||e[48]!==o||e[49]!==x?($=i.jsxs(ee,{title:"Mail",children:[_,o,d,w,h,x]}),e[46]=d,e[47]=h,e[48]=o,e[49]=x,e[50]=$):$=e[50],$}function se(t){return F(t.duration)}function oe(t){return t.failed?i.jsx(le,{variant:"destructive",children:"failed"}):null}function ce(t){return t.delivery_method}function me(t){return t.attachments}function de(t){return`${t.to}/${t.cc}/${t.bcc}`}function ue(t){return i.jsx("span",{className:"line-clamp-1 text-xs",children:t.subject})}function he(t){return i.jsx("span",{className:"font-mono text-xs",children:t.mailer})}function pe(t){return i.jsx("span",{className:"text-xs",children:ae(t.occurred_at)})}function fe(t){return t.id}function xe(t){return F(t.avg)}function ye(t){return t.errors}function _e(t){return ne(t.count)}function be(t){return i.jsx(re,{data:t.sparkline})}function ge(t){return i.jsx("span",{className:"font-mono text-xs",children:t.name})}function ke(t){return t.group_hash}export{We as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as ne,u as re,r as M,ar as ie,j as t,a_ as le,F as U,e as q,a$ as oe,b0 as G}from"./inertia-CqnzqPVD.js";import{I as v}from"./input-error-ByT28UdP.js";import{D as J}from"./data-table-CVKR2wkq.js";import{E as Q}from"./empty-state-Bn48Gplm.js";import{P as de,E as me}from"./env-layout-CKLL8Ds7.js";import{R as ce}from"./relative-time-DQ4kjowZ.js";import{B as N}from"./app-wordmark-Bt6XqURo.js";import{b as X,c as Y,C as Z,a as ee}from"./card-DqdEEKcJ.js";import{L as r,I as o}from"./label-1nSzpSB6.js";import{B as te}from"./live-dot-UdzOfzJb.js";import"./chart-hover-2yZG3w2u.js";import"./badge-Dv7I-ebP.js";import"./app-layout-2xAKndVD.js";import"./index-C-EwH4lO.js";import"./index-BDVShWMs.js";import"./checkbox-DKbThbxr.js";import"./use-live-DWwLg1Nj.js";import"./format-B9SDkrWj.js";import"./segmented-C4oWE73o.js";function qe(s){const e=ne.c(56),{environment:z}=re().props,[k,se]=M.useState(s.kinds[0]),[y,H]=M.useState(s.metrics[0]),[w,ae]=M.useState(s.anomaly_target_kinds[0]),[F,O]=M.useState(s.anomaly_metrics[0]),B=s.anomaly_metrics_for_kind[w]??s.anomaly_metrics,D=s.metrics_for_kind[k]??s.metrics,I=s.units[y]??"ms",W=I==="$"?"Limit (US$)":I==="%"?"Limit (%)":I===""?"Limit (count)":"Limit (ms)",a=z.application_id,n=z.id;let S;e[0]===Symbol.for("react.memo_cache_sentinel")?(S=t.jsx(de,{withWindow:!1,title:"Thresholds",description:"Performance rules. When a route, job, or query crosses one, Railwatch opens a performance issue and alerts the rules subscribed to thresholds."}),e[0]=S):S=e[0];let C;e[1]===Symbol.for("react.memo_cache_sentinel")?(C=t.jsx(X,{children:t.jsx(Y,{children:"Add a threshold"})}),e[1]=C):C=e[1];let d;e[2]!==a||e[3]!==n?(d=ie(a,n),e[2]=a,e[3]=n,e[4]=d):d=e[4];let m;e[5]!==D||e[6]!==k||e[7]!==W||e[8]!==y||e[9]!==s.jobs||e[10]!==s.kinds||e[11]!==s.llm_models||e[12]!==s.metrics||e[13]!==s.metrics_for_kind||e[14]!==s.routes?(m=i=>{const{errors:_,processing:$}=i;return t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"grid gap-1",children:[t.jsx(r,{htmlFor:"target_kind",children:"Kind"}),t.jsx("select",{id:"target_kind",name:"target_kind",value:k,onChange:l=>{se(l.target.value);const b=s.metrics_for_kind[l.target.value]??s.metrics;b.includes(y)||H(b[0])},className:"border-input h-9 rounded-md border bg-transparent px-2 text-sm",children:s.kinds.map(Ne)})]}),t.jsxs("div",{className:"grid gap-1 md:col-span-2",children:[t.jsx(r,{htmlFor:"target",children:"Target"}),t.jsx(o,{id:"target",name:"target",defaultValue:"*",list:"targets",placeholder:"* for all, or a route / job name"}),t.jsxs("datalist",{id:"targets",children:[t.jsx("option",{value:"*"}),t.jsx("option",{value:"unmatched"}),s.routes.map(ve),s.jobs.map(be),s.llm_models.map(ye)]}),t.jsx(v,{messages:_.target})]}),t.jsxs("div",{className:"grid gap-1",children:[t.jsx(r,{htmlFor:"metric",children:"Metric"}),t.jsx("select",{id:"metric",name:"metric",className:"border-input h-9 rounded-md border bg-transparent px-2 text-sm",value:y,onChange:l=>H(l.target.value),children:D.map(_e)})]}),t.jsxs("div",{className:"grid gap-1",children:[t.jsx(r,{htmlFor:"limit",children:W}),t.jsx(o,{id:"limit",name:"limit",type:"number",step:"any",defaultValue:2e3}),t.jsx(v,{messages:_.limit})]}),t.jsxs("div",{className:"grid gap-1",children:[t.jsx(r,{htmlFor:"window_minutes",children:"Window (min)"}),t.jsx(o,{id:"window_minutes",name:"window_minutes",type:"number",defaultValue:5})]}),t.jsx("div",{className:"md:col-span-6",children:t.jsx(N,{disabled:$,children:"Add threshold"})})]})},e[5]=D,e[6]=k,e[7]=W,e[8]=y,e[9]=s.jobs,e[10]=s.kinds,e[11]=s.llm_models,e[12]=s.metrics,e[13]=s.metrics_for_kind,e[14]=s.routes,e[15]=m):m=e[15];let c;e[16]!==d||e[17]!==m?(c=t.jsxs(Z,{children:[C,t.jsx(ee,{children:t.jsx(U,{method:"post",action:d,className:"grid gap-3 md:grid-cols-6",children:m})})]}),e[16]=d,e[17]=m,e[18]=c):c=e[18];let E,A;e[19]===Symbol.for("react.memo_cache_sentinel")?(E=t.jsx(Q,{icon:te,title:"No thresholds yet",description:"Start with requests * p95 2000ms to get alerted on regressions."}),A={key:"d",header:"Rule",cell:je},e[19]=E,e[20]=A):(E=e[19],A=e[20]);let h;e[21]!==a||e[22]!==n?(h=[A,{key:"x",header:"",align:"right",cell:i=>t.jsx(N,{size:"sm",variant:"ghost",onClick:()=>q.delete(oe(a,n,i.id)),children:"Remove"})}],e[21]=a,e[22]=n,e[23]=h):h=e[23];let u;e[24]!==s.thresholds||e[25]!==h?(u=t.jsx(J,{rows:s.thresholds,rowKey:fe,empty:E,columns:h}),e[24]=s.thresholds,e[25]=h,e[26]=u):u=e[26];let R;e[27]===Symbol.for("react.memo_cache_sentinel")?(R=t.jsxs("div",{children:[t.jsx("h2",{className:"text-base font-semibold",children:"Anomaly rules"}),t.jsx("p",{className:"text-muted-foreground text-sm",children:"A threshold needs a number you already know. An anomaly rule learns one: it compares the last few minutes against the same clock window on each of the previous days and opens an issue when today sits more than the given number of standard deviations above that baseline."})]}),e[27]=R):R=e[27];let T;e[28]===Symbol.for("react.memo_cache_sentinel")?(T=t.jsx(X,{children:t.jsx(Y,{children:"Add an anomaly rule"})}),e[28]=T):T=e[28];let x;e[29]!==a||e[30]!==n?(x=le(a,n),e[29]=a,e[30]=n,e[31]=x):x=e[31];let p;e[32]!==B||e[33]!==w||e[34]!==F||e[35]!==s.anomaly_metrics||e[36]!==s.anomaly_metrics_for_kind||e[37]!==s.anomaly_target_kinds?(p=i=>{const{errors:_,processing:$}=i;return t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"grid gap-1",children:[t.jsx(r,{htmlFor:"anomaly_target_kind",children:"Kind"}),t.jsx("select",{id:"anomaly_target_kind",name:"target_kind",className:"border-input h-9 rounded-md border bg-transparent px-2 text-sm",value:w,onChange:l=>{ae(l.target.value);const b=s.anomaly_metrics_for_kind[l.target.value]??s.anomaly_metrics;b.includes(F)||O(b[0])},children:s.anomaly_target_kinds.map(ge)})]}),t.jsxs("div",{className:"grid gap-1 md:col-span-2",children:[t.jsx(r,{htmlFor:"anomaly_target",children:"Target"}),t.jsx(o,{id:"anomaly_target",name:"target",defaultValue:"*",list:"targets",placeholder:"* for all, or a route / job name"}),t.jsx(v,{messages:_.target})]}),t.jsxs("div",{className:"grid gap-1",children:[t.jsx(r,{htmlFor:"anomaly_metric",children:"Metric"}),t.jsx("select",{id:"anomaly_metric",name:"metric",className:"border-input h-9 rounded-md border bg-transparent px-2 text-sm",value:F,onChange:l=>O(l.target.value),children:B.map(pe)})]}),t.jsxs("div",{className:"grid gap-1",children:[t.jsx(r,{htmlFor:"deviation",children:"Deviation (σ)"}),t.jsx(o,{id:"deviation",name:"deviation",type:"number",step:"0.5",min:"0.5",defaultValue:3}),t.jsx(v,{messages:_.deviation})]}),t.jsxs("div",{className:"grid gap-1",children:[t.jsx(r,{htmlFor:"anomaly_window_minutes",children:"Window (min)"}),t.jsx(o,{id:"anomaly_window_minutes",name:"window_minutes",type:"number",defaultValue:15})]}),t.jsxs("div",{className:"grid gap-1",children:[t.jsx(r,{htmlFor:"baseline_days",children:"Baseline (days)"}),t.jsx(o,{id:"baseline_days",name:"baseline_days",type:"number",defaultValue:7}),t.jsx(v,{messages:_.baseline_days})]}),t.jsxs("div",{className:"grid gap-1",children:[t.jsx(r,{htmlFor:"enabled",children:"Status"}),t.jsxs("select",{id:"enabled",name:"enabled",className:"border-input h-9 rounded-md border bg-transparent px-2 text-sm",children:[t.jsx("option",{value:"true",children:"enabled"}),t.jsx("option",{value:"false",children:"disabled"})]})]}),t.jsx("div",{className:"md:col-span-6",children:t.jsx(N,{disabled:$,children:"Add anomaly rule"})})]})},e[32]=B,e[33]=w,e[34]=F,e[35]=s.anomaly_metrics,e[36]=s.anomaly_metrics_for_kind,e[37]=s.anomaly_target_kinds,e[38]=p):p=e[38];let g;e[39]!==x||e[40]!==p?(g=t.jsxs(Z,{children:[T,t.jsx(ee,{children:t.jsx(U,{method:"post",action:x,className:"grid gap-3 md:grid-cols-6",children:p})})]}),e[39]=x,e[40]=p,e[41]=g):g=e[41];let L,P,K;e[42]===Symbol.for("react.memo_cache_sentinel")?(L=t.jsx(Q,{icon:te,title:"No anomaly rules yet",description:"Start with requests * p95 at 3σ over a 7-day baseline."}),P={key:"d",header:"Rule",cell:ue},K={key:"f",header:"Last fired",hideOnMobile:!0,cell:he},e[42]=L,e[43]=P,e[44]=K):(L=e[42],P=e[43],K=e[44]);let j;e[45]!==a||e[46]!==n?(j=[P,K,{key:"x",header:"",align:"right",cell:i=>t.jsxs("span",{className:"flex justify-end gap-1",children:[t.jsx(N,{size:"sm",variant:"ghost",onClick:()=>q.patch(G(a,n,i.id),{enabled:!i.enabled}),children:i.enabled?"Disable":"Enable"}),t.jsx(N,{size:"sm",variant:"ghost",className:"text-destructive",onClick:()=>q.delete(G(a,n,i.id)),children:"Remove"})]})}],e[45]=a,e[46]=n,e[47]=j):j=e[47];let f;e[48]!==s.anomaly_rules||e[49]!==j?(f=t.jsx(J,{rows:s.anomaly_rules,rowKey:xe,empty:L,columns:j}),e[48]=s.anomaly_rules,e[49]=j,e[50]=f):f=e[50];let V;return e[51]!==g||e[52]!==f||e[53]!==c||e[54]!==u?(V=t.jsxs(me,{title:"Thresholds",children:[S,c,u,R,g,f]}),e[51]=g,e[52]=f,e[53]=c,e[54]=u,e[55]=V):V=e[55],V}function he(s){return t.jsx(ce,{iso:s.last_fired_at,className:"text-muted-foreground font-mono text-xs"})}function ue(s){return t.jsxs("span",{className:"text-sm",children:[s.description,s.enabled?null:t.jsx("span",{className:"text-muted-foreground label-caps ml-2",children:"disabled"})]})}function xe(s){return s.id}function pe(s){return t.jsx("option",{value:s,children:s},s)}function ge(s){return t.jsx("option",{value:s,children:s},s)}function je(s){return t.jsx("span",{className:"text-sm",children:s.description})}function fe(s){return s.id}function _e(s){return t.jsx("option",{value:s,children:s},s)}function ye(s){return t.jsx("option",{value:s},s)}function be(s){return t.jsx("option",{value:s},s)}function ve(s){return t.jsx("option",{value:s},s)}function Ne(s){return t.jsx("option",{value:s,children:s},s)}export{qe as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as M,u as N,j as l,L as T,G as O}from"./inertia-CqnzqPVD.js";import{D as $}from"./data-table-CVKR2wkq.js";import{E as D}from"./empty-state-Bn48Gplm.js";import{P as F,E as H}from"./env-layout-CKLL8Ds7.js";import{R as I}from"./relative-time-DQ4kjowZ.js";import{S as R,a as C}from"./stat-BNEfE8X1.js";import{c as d,p as G,m as K}from"./format-B9SDkrWj.js";import{N as W}from"./app-layout-2xAKndVD.js";import"./chart-hover-2yZG3w2u.js";import"./badge-Dv7I-ebP.js";import"./app-wordmark-Bt6XqURo.js";import"./use-live-DWwLg1Nj.js";import"./live-dot-UdzOfzJb.js";import"./index-BDVShWMs.js";import"./index-C-EwH4lO.js";import"./segmented-C4oWE73o.js";import"./label-1nSzpSB6.js";import"./arrow-up-EmePsTKP.js";import"./checkbox-DKbThbxr.js";function de(i){const e=M.c(40),{environment:A,window:b}=N().props,S=A.application_id,k=A.id,t=i.summary;let h;e[0]===Symbol.for("react.memo_cache_sentinel")?(h=l.jsx(F,{title:"Profiles",description:"Sampled stack profiles, grouped by the execution they profiled."}),e[0]=h):h=e[0];let o;e[1]!==t.profiles?(o=d(t.profiles),e[1]=t.profiles,e[2]=o):o=e[2];let s;e[3]!==o?(s=l.jsx(R,{label:"Profiles",value:o}),e[3]=o,e[4]=s):s=e[4];let r;e[5]!==t.executions||e[6]!==t.profiled?(r=G(t.profiled,t.executions),e[5]=t.executions,e[6]=t.profiled,e[7]=r):r=e[7];let x;e[8]!==t.profiled?(x=d(t.profiled),e[8]=t.profiled,e[9]=x):x=e[9];let _;e[10]!==t.executions?(_=d(t.executions),e[10]=t.executions,e[11]=_):_=e[11];const w=`${x} of ${_}`;let a;e[12]!==r||e[13]!==w?(a=l.jsx(R,{label:"Executions profiled",value:r,hint:w}),e[12]=r,e[13]=w,e[14]=a):a=e[14];let n;e[15]!==t.avg_samples?(n=d(t.avg_samples),e[15]=t.avg_samples,e[16]=n):n=e[16];let m;e[17]!==n?(m=l.jsx(R,{label:"Avg samples",value:n}),e[17]=n,e[18]=m):m=e[18];let p;e[19]!==s||e[20]!==a||e[21]!==m?(p=l.jsxs(C,{children:[s,a,m]}),e[19]=s,e[20]=a,e[21]=m,e[22]=p):p=e[22];let g;e[23]===Symbol.for("react.memo_cache_sentinel")?(g=l.jsx(D,{icon:W,title:"No profiles in this window",description:"Set RAILWATCH_PROFILE_SAMPLE_RATE in the app to profile slow executions."}),e[23]=g):g=e[23];let f;e[24]!==S||e[25]!==k||e[26]!==b?(f={key:"name",header:"Execution",className:"max-w-0",cell:L=>l.jsx(T,{href:O(S,k,L.profile_id,{window:b}),className:"block truncate font-mono text-xs hover:underline",children:L.name??L.group_hash})},e[24]=S,e[25]=k,e[26]=b,e[27]=f):f=e[27];let v,y,j,E;e[28]===Symbol.for("react.memo_cache_sentinel")?(v={key:"n",header:"Profiles",align:"right",cell:J},y={key:"avg",header:"Avg duration",align:"right",cell:B},j={key:"samples",hideOnMobile:!0,header:"Max samples",align:"right",cell:z},E={key:"last",hideOnMobile:!0,header:"Last seen",align:"right",cell:q},e[28]=v,e[29]=y,e[30]=j,e[31]=E):(v=e[28],y=e[29],j=e[30],E=e[31]);let c;e[32]!==f?(c=[f,v,y,j,E],e[32]=f,e[33]=c):c=e[33];let u;e[34]!==i.profiles||e[35]!==c?(u=l.jsx($,{rows:i.profiles,rowKey:Q,empty:g,columns:c}),e[34]=i.profiles,e[35]=c,e[36]=u):u=e[36];let P;return e[37]!==p||e[38]!==u?(P=l.jsxs(H,{title:"Profiles",children:[h,p,u]}),e[37]=p,e[38]=u,e[39]=P):P=e[39],P}function q(i){return l.jsx(I,{iso:i.last_seen_at})}function z(i){return d(i.max_samples)}function B(i){return K(i.avg_duration)}function J(i){return d(i.count)}function Q(i){return i.group_hash}export{de as default};
|