nuxt-observe 0.0.2

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 (435) hide show
  1. package/README.md +92 -0
  2. package/dist/module.d.mts +7 -0
  3. package/dist/module.json +9 -0
  4. package/dist/module.mjs +393 -0
  5. package/dist/runtime/app/assets/css/main.css +1 -0
  6. package/dist/runtime/app/components/ObserveActivityFeed.d.vue.ts +13 -0
  7. package/dist/runtime/app/components/ObserveActivityFeed.vue +77 -0
  8. package/dist/runtime/app/components/ObserveActivityFeed.vue.d.ts +13 -0
  9. package/dist/runtime/app/components/ObserveActivityTable.d.vue.ts +30 -0
  10. package/dist/runtime/app/components/ObserveActivityTable.vue +187 -0
  11. package/dist/runtime/app/components/ObserveActivityTable.vue.d.ts +30 -0
  12. package/dist/runtime/app/components/ObserveCan.d.vue.ts +27 -0
  13. package/dist/runtime/app/components/ObserveCan.vue +16 -0
  14. package/dist/runtime/app/components/ObserveCan.vue.d.ts +27 -0
  15. package/dist/runtime/app/components/ObserveErrorsTable.d.vue.ts +19 -0
  16. package/dist/runtime/app/components/ObserveErrorsTable.vue +105 -0
  17. package/dist/runtime/app/components/ObserveErrorsTable.vue.d.ts +19 -0
  18. package/dist/runtime/app/components/ObserveHealthHero.d.vue.ts +16 -0
  19. package/dist/runtime/app/components/ObserveHealthHero.vue +114 -0
  20. package/dist/runtime/app/components/ObserveHealthHero.vue.d.ts +16 -0
  21. package/dist/runtime/app/components/ObserveJourneySearch.d.vue.ts +13 -0
  22. package/dist/runtime/app/components/ObserveJourneySearch.vue +55 -0
  23. package/dist/runtime/app/components/ObserveJourneySearch.vue.d.ts +13 -0
  24. package/dist/runtime/app/components/ObserveJourneyTimeline.d.vue.ts +14 -0
  25. package/dist/runtime/app/components/ObserveJourneyTimeline.vue +119 -0
  26. package/dist/runtime/app/components/ObserveJourneyTimeline.vue.d.ts +14 -0
  27. package/dist/runtime/app/components/ObserveLogDetail.d.vue.ts +12 -0
  28. package/dist/runtime/app/components/ObserveLogDetail.vue +187 -0
  29. package/dist/runtime/app/components/ObserveLogDetail.vue.d.ts +12 -0
  30. package/dist/runtime/app/components/ObserveLogLevelBadge.d.vue.ts +10 -0
  31. package/dist/runtime/app/components/ObserveLogLevelBadge.vue +29 -0
  32. package/dist/runtime/app/components/ObserveLogLevelBadge.vue.d.ts +10 -0
  33. package/dist/runtime/app/components/ObserveLogsFilterBar.d.vue.ts +20 -0
  34. package/dist/runtime/app/components/ObserveLogsFilterBar.vue +134 -0
  35. package/dist/runtime/app/components/ObserveLogsFilterBar.vue.d.ts +20 -0
  36. package/dist/runtime/app/components/ObserveLogsTable.d.vue.ts +20 -0
  37. package/dist/runtime/app/components/ObserveLogsTable.vue +92 -0
  38. package/dist/runtime/app/components/ObserveLogsTable.vue.d.ts +20 -0
  39. package/dist/runtime/app/components/ObservePeriodSelector.d.vue.ts +3 -0
  40. package/dist/runtime/app/components/ObservePeriodSelector.vue +22 -0
  41. package/dist/runtime/app/components/ObservePeriodSelector.vue.d.ts +3 -0
  42. package/dist/runtime/app/components/ObserveRegressionAlert.d.vue.ts +12 -0
  43. package/dist/runtime/app/components/ObserveRegressionAlert.vue +27 -0
  44. package/dist/runtime/app/components/ObserveRegressionAlert.vue.d.ts +12 -0
  45. package/dist/runtime/app/components/ObserveServiceSwitcher.d.vue.ts +3 -0
  46. package/dist/runtime/app/components/ObserveServiceSwitcher.vue +49 -0
  47. package/dist/runtime/app/components/ObserveServiceSwitcher.vue.d.ts +3 -0
  48. package/dist/runtime/app/components/ObserveServicesTable.d.vue.ts +15 -0
  49. package/dist/runtime/app/components/ObserveServicesTable.vue +109 -0
  50. package/dist/runtime/app/components/ObserveServicesTable.vue.d.ts +15 -0
  51. package/dist/runtime/app/components/ObserveStatCard.d.vue.ts +14 -0
  52. package/dist/runtime/app/components/ObserveStatCard.vue +34 -0
  53. package/dist/runtime/app/components/ObserveStatCard.vue.d.ts +14 -0
  54. package/dist/runtime/app/components/charts/ObserveErrorRateChart.client.d.vue.ts +15 -0
  55. package/dist/runtime/app/components/charts/ObserveErrorRateChart.client.vue +170 -0
  56. package/dist/runtime/app/components/charts/ObserveErrorRateChart.client.vue.d.ts +15 -0
  57. package/dist/runtime/app/components/charts/ObserveServiceBreakdownChart.client.d.vue.ts +17 -0
  58. package/dist/runtime/app/components/charts/ObserveServiceBreakdownChart.client.vue +208 -0
  59. package/dist/runtime/app/components/charts/ObserveServiceBreakdownChart.client.vue.d.ts +17 -0
  60. package/dist/runtime/app/components/charts/ObserveVersionAdoptionChart.client.d.vue.ts +14 -0
  61. package/dist/runtime/app/components/charts/ObserveVersionAdoptionChart.client.vue +208 -0
  62. package/dist/runtime/app/components/charts/ObserveVersionAdoptionChart.client.vue.d.ts +14 -0
  63. package/dist/runtime/app/components/charts/ObserveVersionCompareChart.client.d.vue.ts +14 -0
  64. package/dist/runtime/app/components/charts/ObserveVersionCompareChart.client.vue +190 -0
  65. package/dist/runtime/app/components/charts/ObserveVersionCompareChart.client.vue.d.ts +14 -0
  66. package/dist/runtime/app/components/charts/ObserveVolumeChart.client.d.vue.ts +16 -0
  67. package/dist/runtime/app/components/charts/ObserveVolumeChart.client.vue +199 -0
  68. package/dist/runtime/app/components/charts/ObserveVolumeChart.client.vue.d.ts +16 -0
  69. package/dist/runtime/app/components/charts/chart-core.d.ts +64 -0
  70. package/dist/runtime/app/components/charts/chart-core.js +136 -0
  71. package/dist/runtime/app/components/settings/ObserveApiKeyPanel.d.vue.ts +8 -0
  72. package/dist/runtime/app/components/settings/ObserveApiKeyPanel.vue +145 -0
  73. package/dist/runtime/app/components/settings/ObserveApiKeyPanel.vue.d.ts +8 -0
  74. package/dist/runtime/app/components/settings/ObserveApiKeyRevealModal.d.vue.ts +19 -0
  75. package/dist/runtime/app/components/settings/ObserveApiKeyRevealModal.vue +106 -0
  76. package/dist/runtime/app/components/settings/ObserveApiKeyRevealModal.vue.d.ts +19 -0
  77. package/dist/runtime/app/components/settings/ObserveAssignmentEditor.d.vue.ts +12 -0
  78. package/dist/runtime/app/components/settings/ObserveAssignmentEditor.vue +67 -0
  79. package/dist/runtime/app/components/settings/ObserveAssignmentEditor.vue.d.ts +12 -0
  80. package/dist/runtime/app/components/settings/ObserveGroupFormModal.d.vue.ts +18 -0
  81. package/dist/runtime/app/components/settings/ObserveGroupFormModal.vue +60 -0
  82. package/dist/runtime/app/components/settings/ObserveGroupFormModal.vue.d.ts +18 -0
  83. package/dist/runtime/app/components/settings/ObserveGroupMembershipEditor.d.vue.ts +20 -0
  84. package/dist/runtime/app/components/settings/ObserveGroupMembershipEditor.vue +21 -0
  85. package/dist/runtime/app/components/settings/ObserveGroupMembershipEditor.vue.d.ts +20 -0
  86. package/dist/runtime/app/components/settings/ObserveOriginAllowlistEditor.d.vue.ts +15 -0
  87. package/dist/runtime/app/components/settings/ObserveOriginAllowlistEditor.vue +63 -0
  88. package/dist/runtime/app/components/settings/ObserveOriginAllowlistEditor.vue.d.ts +15 -0
  89. package/dist/runtime/app/components/settings/ObserveServiceEditForm.d.vue.ts +38 -0
  90. package/dist/runtime/app/components/settings/ObserveServiceEditForm.vue +216 -0
  91. package/dist/runtime/app/components/settings/ObserveServiceEditForm.vue.d.ts +38 -0
  92. package/dist/runtime/app/components/settings/ObserveServiceFormModal.d.vue.ts +37 -0
  93. package/dist/runtime/app/components/settings/ObserveServiceFormModal.vue +192 -0
  94. package/dist/runtime/app/components/settings/ObserveServiceFormModal.vue.d.ts +37 -0
  95. package/dist/runtime/app/components/settings/ObserveServiceTypeBadge.d.vue.ts +11 -0
  96. package/dist/runtime/app/components/settings/ObserveServiceTypeBadge.vue +18 -0
  97. package/dist/runtime/app/components/settings/ObserveServiceTypeBadge.vue.d.ts +11 -0
  98. package/dist/runtime/app/components/settings/ObserveSettingsServicesTable.d.vue.ts +19 -0
  99. package/dist/runtime/app/components/settings/ObserveSettingsServicesTable.vue +132 -0
  100. package/dist/runtime/app/components/settings/ObserveSettingsServicesTable.vue.d.ts +19 -0
  101. package/dist/runtime/app/components/settings/ObserveUserFormModal.d.vue.ts +27 -0
  102. package/dist/runtime/app/components/settings/ObserveUserFormModal.vue +108 -0
  103. package/dist/runtime/app/components/settings/ObserveUserFormModal.vue.d.ts +27 -0
  104. package/dist/runtime/app/components/settings/ObserveVersionTrackingField.d.vue.ts +17 -0
  105. package/dist/runtime/app/components/settings/ObserveVersionTrackingField.vue +20 -0
  106. package/dist/runtime/app/components/settings/ObserveVersionTrackingField.vue.d.ts +17 -0
  107. package/dist/runtime/app/composables/useObserveAbility.d.ts +15 -0
  108. package/dist/runtime/app/composables/useObserveAbility.js +20 -0
  109. package/dist/runtime/app/composables/useObserveActivity.d.ts +22 -0
  110. package/dist/runtime/app/composables/useObserveActivity.js +44 -0
  111. package/dist/runtime/app/composables/useObserveApiKeys.d.ts +15 -0
  112. package/dist/runtime/app/composables/useObserveApiKeys.js +19 -0
  113. package/dist/runtime/app/composables/useObserveAssignments.d.ts +19 -0
  114. package/dist/runtime/app/composables/useObserveAssignments.js +16 -0
  115. package/dist/runtime/app/composables/useObserveErrors.d.ts +33 -0
  116. package/dist/runtime/app/composables/useObserveErrors.js +85 -0
  117. package/dist/runtime/app/composables/useObserveGroups.d.ts +27 -0
  118. package/dist/runtime/app/composables/useObserveGroups.js +33 -0
  119. package/dist/runtime/app/composables/useObserveJourney.d.ts +19 -0
  120. package/dist/runtime/app/composables/useObserveJourney.js +19 -0
  121. package/dist/runtime/app/composables/useObserveLogFacets.d.ts +11 -0
  122. package/dist/runtime/app/composables/useObserveLogFacets.js +21 -0
  123. package/dist/runtime/app/composables/useObserveLogs.d.ts +28 -0
  124. package/dist/runtime/app/composables/useObserveLogs.js +100 -0
  125. package/dist/runtime/app/composables/useObserveMigrations.d.ts +17 -0
  126. package/dist/runtime/app/composables/useObserveMigrations.js +49 -0
  127. package/dist/runtime/app/composables/useObserveOverview.d.ts +14 -0
  128. package/dist/runtime/app/composables/useObserveOverview.js +23 -0
  129. package/dist/runtime/app/composables/useObservePeriod.d.ts +11 -0
  130. package/dist/runtime/app/composables/useObservePeriod.js +18 -0
  131. package/dist/runtime/app/composables/useObserveRollout.d.ts +20 -0
  132. package/dist/runtime/app/composables/useObserveRollout.js +55 -0
  133. package/dist/runtime/app/composables/useObserveScope.d.ts +13 -0
  134. package/dist/runtime/app/composables/useObserveScope.js +17 -0
  135. package/dist/runtime/app/composables/useObserveServices.d.ts +26 -0
  136. package/dist/runtime/app/composables/useObserveServices.js +33 -0
  137. package/dist/runtime/app/composables/useObserveStats.d.ts +14 -0
  138. package/dist/runtime/app/composables/useObserveStats.js +23 -0
  139. package/dist/runtime/app/composables/useObserveUsers.d.ts +29 -0
  140. package/dist/runtime/app/composables/useObserveUsers.js +33 -0
  141. package/dist/runtime/app/layouts/observe.d.vue.ts +13 -0
  142. package/dist/runtime/app/layouts/observe.vue +138 -0
  143. package/dist/runtime/app/layouts/observe.vue.d.ts +13 -0
  144. package/dist/runtime/app/middleware/observe-auth.global.d.ts +9 -0
  145. package/dist/runtime/app/middleware/observe-auth.global.js +8 -0
  146. package/dist/runtime/app/pages/activity.d.vue.ts +3 -0
  147. package/dist/runtime/app/pages/activity.vue +54 -0
  148. package/dist/runtime/app/pages/activity.vue.d.ts +3 -0
  149. package/dist/runtime/app/pages/error-detail.d.vue.ts +3 -0
  150. package/dist/runtime/app/pages/error-detail.vue +190 -0
  151. package/dist/runtime/app/pages/error-detail.vue.d.ts +3 -0
  152. package/dist/runtime/app/pages/errors.d.vue.ts +3 -0
  153. package/dist/runtime/app/pages/errors.vue +47 -0
  154. package/dist/runtime/app/pages/errors.vue.d.ts +3 -0
  155. package/dist/runtime/app/pages/journey.d.vue.ts +3 -0
  156. package/dist/runtime/app/pages/journey.vue +96 -0
  157. package/dist/runtime/app/pages/journey.vue.d.ts +3 -0
  158. package/dist/runtime/app/pages/log-detail.d.vue.ts +3 -0
  159. package/dist/runtime/app/pages/log-detail.vue +35 -0
  160. package/dist/runtime/app/pages/log-detail.vue.d.ts +3 -0
  161. package/dist/runtime/app/pages/login.d.vue.ts +3 -0
  162. package/dist/runtime/app/pages/login.vue +69 -0
  163. package/dist/runtime/app/pages/login.vue.d.ts +3 -0
  164. package/dist/runtime/app/pages/logs.d.vue.ts +3 -0
  165. package/dist/runtime/app/pages/logs.vue +36 -0
  166. package/dist/runtime/app/pages/logs.vue.d.ts +3 -0
  167. package/dist/runtime/app/pages/metrics.d.vue.ts +3 -0
  168. package/dist/runtime/app/pages/metrics.vue +68 -0
  169. package/dist/runtime/app/pages/metrics.vue.d.ts +3 -0
  170. package/dist/runtime/app/pages/overview.d.vue.ts +3 -0
  171. package/dist/runtime/app/pages/overview.vue +65 -0
  172. package/dist/runtime/app/pages/overview.vue.d.ts +3 -0
  173. package/dist/runtime/app/pages/rollout.d.vue.ts +3 -0
  174. package/dist/runtime/app/pages/rollout.vue +188 -0
  175. package/dist/runtime/app/pages/rollout.vue.d.ts +3 -0
  176. package/dist/runtime/app/pages/settings/group-detail.d.vue.ts +3 -0
  177. package/dist/runtime/app/pages/settings/group-detail.vue +149 -0
  178. package/dist/runtime/app/pages/settings/group-detail.vue.d.ts +3 -0
  179. package/dist/runtime/app/pages/settings/groups.d.vue.ts +3 -0
  180. package/dist/runtime/app/pages/settings/groups.vue +107 -0
  181. package/dist/runtime/app/pages/settings/groups.vue.d.ts +3 -0
  182. package/dist/runtime/app/pages/settings/index.d.vue.ts +3 -0
  183. package/dist/runtime/app/pages/settings/index.vue +47 -0
  184. package/dist/runtime/app/pages/settings/index.vue.d.ts +3 -0
  185. package/dist/runtime/app/pages/settings/migrations.d.vue.ts +3 -0
  186. package/dist/runtime/app/pages/settings/migrations.vue +275 -0
  187. package/dist/runtime/app/pages/settings/migrations.vue.d.ts +3 -0
  188. package/dist/runtime/app/pages/settings/service-detail.d.vue.ts +3 -0
  189. package/dist/runtime/app/pages/settings/service-detail.vue +133 -0
  190. package/dist/runtime/app/pages/settings/service-detail.vue.d.ts +3 -0
  191. package/dist/runtime/app/pages/settings/services.d.vue.ts +3 -0
  192. package/dist/runtime/app/pages/settings/services.vue +66 -0
  193. package/dist/runtime/app/pages/settings/services.vue.d.ts +3 -0
  194. package/dist/runtime/app/pages/settings/users/[id].d.vue.ts +3 -0
  195. package/dist/runtime/app/pages/settings/users/[id].vue +243 -0
  196. package/dist/runtime/app/pages/settings/users/[id].vue.d.ts +3 -0
  197. package/dist/runtime/app/pages/settings/users/index.d.vue.ts +3 -0
  198. package/dist/runtime/app/pages/settings/users/index.vue +129 -0
  199. package/dist/runtime/app/pages/settings/users/index.vue.d.ts +3 -0
  200. package/dist/runtime/options.d.ts +1 -0
  201. package/dist/runtime/options.js +1 -0
  202. package/dist/runtime/server/api/observe/activity.get.d.ts +3 -0
  203. package/dist/runtime/server/api/observe/activity.get.js +30 -0
  204. package/dist/runtime/server/api/observe/auth/login.post.d.ts +4 -0
  205. package/dist/runtime/server/api/observe/auth/login.post.js +13 -0
  206. package/dist/runtime/server/api/observe/auth/logout.post.d.ts +4 -0
  207. package/dist/runtime/server/api/observe/auth/logout.post.js +6 -0
  208. package/dist/runtime/server/api/observe/auth/me.get.d.ts +2 -0
  209. package/dist/runtime/server/api/observe/auth/me.get.js +3 -0
  210. package/dist/runtime/server/api/observe/errors/[fingerprint].get.d.ts +3 -0
  211. package/dist/runtime/server/api/observe/errors/[fingerprint].get.js +56 -0
  212. package/dist/runtime/server/api/observe/errors/index.get.d.ts +3 -0
  213. package/dist/runtime/server/api/observe/errors/index.get.js +41 -0
  214. package/dist/runtime/server/api/observe/facets.get.d.ts +8 -0
  215. package/dist/runtime/server/api/observe/facets.get.js +12 -0
  216. package/dist/runtime/server/api/observe/groups/[id]/assignments.put.d.ts +3 -0
  217. package/dist/runtime/server/api/observe/groups/[id]/assignments.put.js +12 -0
  218. package/dist/runtime/server/api/observe/groups/[id]/services.put.d.ts +5 -0
  219. package/dist/runtime/server/api/observe/groups/[id]/services.put.js +13 -0
  220. package/dist/runtime/server/api/observe/groups/[id].delete.d.ts +5 -0
  221. package/dist/runtime/server/api/observe/groups/[id].delete.js +11 -0
  222. package/dist/runtime/server/api/observe/groups/[id].get.d.ts +6 -0
  223. package/dist/runtime/server/api/observe/groups/[id].get.js +14 -0
  224. package/dist/runtime/server/api/observe/groups/[id].patch.d.ts +3 -0
  225. package/dist/runtime/server/api/observe/groups/[id].patch.js +12 -0
  226. package/dist/runtime/server/api/observe/groups/index.get.d.ts +3 -0
  227. package/dist/runtime/server/api/observe/groups/index.get.js +7 -0
  228. package/dist/runtime/server/api/observe/groups/index.post.d.ts +3 -0
  229. package/dist/runtime/server/api/observe/groups/index.post.js +11 -0
  230. package/dist/runtime/server/api/observe/health.get.d.ts +6 -0
  231. package/dist/runtime/server/api/observe/health.get.js +10 -0
  232. package/dist/runtime/server/api/observe/ingest/frogger.d.ts +5 -0
  233. package/dist/runtime/server/api/observe/ingest/frogger.js +42 -0
  234. package/dist/runtime/server/api/observe/ingest.d.ts +5 -0
  235. package/dist/runtime/server/api/observe/ingest.js +38 -0
  236. package/dist/runtime/server/api/observe/journey.get.d.ts +9 -0
  237. package/dist/runtime/server/api/observe/journey.get.js +31 -0
  238. package/dist/runtime/server/api/observe/logs/[id].get.d.ts +3 -0
  239. package/dist/runtime/server/api/observe/logs/[id].get.js +19 -0
  240. package/dist/runtime/server/api/observe/logs.get.d.ts +3 -0
  241. package/dist/runtime/server/api/observe/logs.get.js +54 -0
  242. package/dist/runtime/server/api/observe/migrations/index.get.d.ts +9 -0
  243. package/dist/runtime/server/api/observe/migrations/index.get.js +14 -0
  244. package/dist/runtime/server/api/observe/migrations/run.post.d.ts +13 -0
  245. package/dist/runtime/server/api/observe/migrations/run.post.js +35 -0
  246. package/dist/runtime/server/api/observe/overview.get.d.ts +3 -0
  247. package/dist/runtime/server/api/observe/overview.get.js +19 -0
  248. package/dist/runtime/server/api/observe/rollout/compare.get.d.ts +3 -0
  249. package/dist/runtime/server/api/observe/rollout/compare.get.js +24 -0
  250. package/dist/runtime/server/api/observe/rollout/regressions.get.d.ts +3 -0
  251. package/dist/runtime/server/api/observe/rollout/regressions.get.js +31 -0
  252. package/dist/runtime/server/api/observe/rollout/versions.get.d.ts +3 -0
  253. package/dist/runtime/server/api/observe/rollout/versions.get.js +20 -0
  254. package/dist/runtime/server/api/observe/services/[id]/assignments.put.d.ts +7 -0
  255. package/dist/runtime/server/api/observe/services/[id]/assignments.put.js +12 -0
  256. package/dist/runtime/server/api/observe/services/[id]/keys/[keyId]/rotate.post.d.ts +4 -0
  257. package/dist/runtime/server/api/observe/services/[id]/keys/[keyId]/rotate.post.js +14 -0
  258. package/dist/runtime/server/api/observe/services/[id]/keys/[keyId].delete.d.ts +4 -0
  259. package/dist/runtime/server/api/observe/services/[id]/keys/[keyId].delete.js +14 -0
  260. package/dist/runtime/server/api/observe/services/[id]/keys/index.get.d.ts +3 -0
  261. package/dist/runtime/server/api/observe/services/[id]/keys/index.get.js +10 -0
  262. package/dist/runtime/server/api/observe/services/[id]/keys/index.post.d.ts +3 -0
  263. package/dist/runtime/server/api/observe/services/[id]/keys/index.post.js +11 -0
  264. package/dist/runtime/server/api/observe/services/[id]/restore.post.d.ts +4 -0
  265. package/dist/runtime/server/api/observe/services/[id]/restore.post.js +11 -0
  266. package/dist/runtime/server/api/observe/services/[id].delete.d.ts +11 -0
  267. package/dist/runtime/server/api/observe/services/[id].delete.js +11 -0
  268. package/dist/runtime/server/api/observe/services/[id].get.d.ts +3 -0
  269. package/dist/runtime/server/api/observe/services/[id].get.js +12 -0
  270. package/dist/runtime/server/api/observe/services/[id].patch.d.ts +3 -0
  271. package/dist/runtime/server/api/observe/services/[id].patch.js +13 -0
  272. package/dist/runtime/server/api/observe/services/index.get.d.ts +3 -0
  273. package/dist/runtime/server/api/observe/services/index.get.js +7 -0
  274. package/dist/runtime/server/api/observe/services/index.post.d.ts +3 -0
  275. package/dist/runtime/server/api/observe/services/index.post.js +16 -0
  276. package/dist/runtime/server/api/observe/stats.get.d.ts +3 -0
  277. package/dist/runtime/server/api/observe/stats.get.js +28 -0
  278. package/dist/runtime/server/api/observe/users/[id]/assignments.put.d.ts +3 -0
  279. package/dist/runtime/server/api/observe/users/[id]/assignments.put.js +14 -0
  280. package/dist/runtime/server/api/observe/users/[id].delete.d.ts +4 -0
  281. package/dist/runtime/server/api/observe/users/[id].delete.js +15 -0
  282. package/dist/runtime/server/api/observe/users/[id].get.d.ts +3 -0
  283. package/dist/runtime/server/api/observe/users/[id].get.js +11 -0
  284. package/dist/runtime/server/api/observe/users/[id].patch.d.ts +3 -0
  285. package/dist/runtime/server/api/observe/users/[id].patch.js +25 -0
  286. package/dist/runtime/server/api/observe/users/index.get.d.ts +8 -0
  287. package/dist/runtime/server/api/observe/users/index.get.js +7 -0
  288. package/dist/runtime/server/api/observe/users/index.post.d.ts +3 -0
  289. package/dist/runtime/server/api/observe/users/index.post.js +29 -0
  290. package/dist/runtime/server/auth/authorization.d.ts +7 -0
  291. package/dist/runtime/server/auth/authorization.js +5 -0
  292. package/dist/runtime/server/auth/provider.d.ts +17 -0
  293. package/dist/runtime/server/auth/provider.js +44 -0
  294. package/dist/runtime/server/auth/providers/config-provider.d.ts +18 -0
  295. package/dist/runtime/server/auth/providers/config-provider.js +54 -0
  296. package/dist/runtime/server/auth/providers/db-provider.d.ts +16 -0
  297. package/dist/runtime/server/auth/providers/db-provider.js +42 -0
  298. package/dist/runtime/server/auth/providers/jwt-provider.d.ts +24 -0
  299. package/dist/runtime/server/auth/providers/jwt-provider.js +72 -0
  300. package/dist/runtime/server/migrations/0001-services-kind.d.ts +8 -0
  301. package/dist/runtime/server/migrations/0001-services-kind.js +14 -0
  302. package/dist/runtime/server/migrations/0002-services-type.d.ts +7 -0
  303. package/dist/runtime/server/migrations/0002-services-type.js +14 -0
  304. package/dist/runtime/server/migrations/0003-services-deleted-at.d.ts +6 -0
  305. package/dist/runtime/server/migrations/0003-services-deleted-at.js +14 -0
  306. package/dist/runtime/server/migrations/0004-logs-error-fingerprint.d.ts +11 -0
  307. package/dist/runtime/server/migrations/0004-logs-error-fingerprint.js +15 -0
  308. package/dist/runtime/server/migrations/0005-users-columns.d.ts +9 -0
  309. package/dist/runtime/server/migrations/0005-users-columns.js +25 -0
  310. package/dist/runtime/server/migrations/index.d.ts +13 -0
  311. package/dist/runtime/server/migrations/index.js +13 -0
  312. package/dist/runtime/server/migrations/types.d.ts +15 -0
  313. package/dist/runtime/server/migrations/types.js +0 -0
  314. package/dist/runtime/server/plugins/observe-migrate.server.d.ts +2 -0
  315. package/dist/runtime/server/plugins/observe-migrate.server.js +18 -0
  316. package/dist/runtime/server/tasks/backfill-fingerprints.d.ts +11 -0
  317. package/dist/runtime/server/tasks/backfill-fingerprints.js +41 -0
  318. package/dist/runtime/server/tasks/purge.d.ts +5 -0
  319. package/dist/runtime/server/tasks/purge.js +12 -0
  320. package/dist/runtime/server/tsconfig.json +3 -0
  321. package/dist/runtime/server/utils/activity-query.d.ts +28 -0
  322. package/dist/runtime/server/utils/activity-query.js +70 -0
  323. package/dist/runtime/server/utils/api-keys.d.ts +48 -0
  324. package/dist/runtime/server/utils/api-keys.js +67 -0
  325. package/dist/runtime/server/utils/authz.d.ts +50 -0
  326. package/dist/runtime/server/utils/authz.js +60 -0
  327. package/dist/runtime/server/utils/db/users.d.ts +91 -0
  328. package/dist/runtime/server/utils/db/users.js +128 -0
  329. package/dist/runtime/server/utils/db.d.ts +10 -0
  330. package/dist/runtime/server/utils/db.js +5 -0
  331. package/dist/runtime/server/utils/frogger-adapter.d.ts +40 -0
  332. package/dist/runtime/server/utils/frogger-adapter.js +97 -0
  333. package/dist/runtime/server/utils/groups.d.ts +35 -0
  334. package/dist/runtime/server/utils/groups.js +59 -0
  335. package/dist/runtime/server/utils/ingest-cors.d.ts +23 -0
  336. package/dist/runtime/server/utils/ingest-cors.js +27 -0
  337. package/dist/runtime/server/utils/journey.d.ts +20 -0
  338. package/dist/runtime/server/utils/journey.js +44 -0
  339. package/dist/runtime/server/utils/logs.d.ts +50 -0
  340. package/dist/runtime/server/utils/logs.js +154 -0
  341. package/dist/runtime/server/utils/loop-guard.d.ts +11 -0
  342. package/dist/runtime/server/utils/loop-guard.js +11 -0
  343. package/dist/runtime/server/utils/migrate.d.ts +21 -0
  344. package/dist/runtime/server/utils/migrate.js +144 -0
  345. package/dist/runtime/server/utils/migration-runner.d.ts +42 -0
  346. package/dist/runtime/server/utils/migration-runner.js +129 -0
  347. package/dist/runtime/server/utils/observe-errors.d.ts +58 -0
  348. package/dist/runtime/server/utils/observe-errors.js +206 -0
  349. package/dist/runtime/server/utils/overview.d.ts +20 -0
  350. package/dist/runtime/server/utils/overview.js +119 -0
  351. package/dist/runtime/server/utils/provisioning.d.ts +62 -0
  352. package/dist/runtime/server/utils/provisioning.js +299 -0
  353. package/dist/runtime/server/utils/rate-limit.d.ts +11 -0
  354. package/dist/runtime/server/utils/rate-limit.js +22 -0
  355. package/dist/runtime/server/utils/require-observe-session.d.ts +15 -0
  356. package/dist/runtime/server/utils/require-observe-session.js +25 -0
  357. package/dist/runtime/server/utils/rollout.d.ts +19 -0
  358. package/dist/runtime/server/utils/rollout.js +56 -0
  359. package/dist/runtime/server/utils/scope.d.ts +14 -0
  360. package/dist/runtime/server/utils/scope.js +28 -0
  361. package/dist/runtime/server/utils/seed.d.ts +18 -0
  362. package/dist/runtime/server/utils/seed.js +70 -0
  363. package/dist/runtime/server/utils/services.d.ts +91 -0
  364. package/dist/runtime/server/utils/services.js +142 -0
  365. package/dist/runtime/server/utils/stats-query.d.ts +40 -0
  366. package/dist/runtime/server/utils/stats-query.js +104 -0
  367. package/dist/runtime/shared/auth/roles.d.ts +34 -0
  368. package/dist/runtime/shared/auth/roles.js +6 -0
  369. package/dist/runtime/shared/auth/schema.d.ts +85 -0
  370. package/dist/runtime/shared/auth/schema.js +41 -0
  371. package/dist/runtime/shared/auth/types.d.ts +68 -0
  372. package/dist/runtime/shared/auth/types.js +0 -0
  373. package/dist/runtime/shared/rbac/capabilities.d.ts +46 -0
  374. package/dist/runtime/shared/rbac/capabilities.js +48 -0
  375. package/dist/runtime/shared/schema/activity.d.ts +77 -0
  376. package/dist/runtime/shared/schema/activity.js +22 -0
  377. package/dist/runtime/shared/schema/adapters/frogger.d.ts +52 -0
  378. package/dist/runtime/shared/schema/adapters/frogger.js +17 -0
  379. package/dist/runtime/shared/schema/batch.d.ts +33 -0
  380. package/dist/runtime/shared/schema/batch.js +9 -0
  381. package/dist/runtime/shared/schema/error-fingerprint.d.ts +53 -0
  382. package/dist/runtime/shared/schema/error-fingerprint.js +47 -0
  383. package/dist/runtime/shared/schema/errors-query.d.ts +136 -0
  384. package/dist/runtime/shared/schema/errors-query.js +47 -0
  385. package/dist/runtime/shared/schema/event.d.ts +48 -0
  386. package/dist/runtime/shared/schema/event.js +41 -0
  387. package/dist/runtime/shared/schema/frogger-map.d.ts +62 -0
  388. package/dist/runtime/shared/schema/frogger-map.js +30 -0
  389. package/dist/runtime/shared/schema/index.d.ts +17 -0
  390. package/dist/runtime/shared/schema/index.js +17 -0
  391. package/dist/runtime/shared/schema/journey.d.ts +99 -0
  392. package/dist/runtime/shared/schema/journey.js +96 -0
  393. package/dist/runtime/shared/schema/levels.d.ts +37 -0
  394. package/dist/runtime/shared/schema/levels.js +72 -0
  395. package/dist/runtime/shared/schema/log-row.d.ts +31 -0
  396. package/dist/runtime/shared/schema/log-row.js +0 -0
  397. package/dist/runtime/shared/schema/logs-query.d.ts +91 -0
  398. package/dist/runtime/shared/schema/logs-query.js +72 -0
  399. package/dist/runtime/shared/schema/migrations.d.ts +34 -0
  400. package/dist/runtime/shared/schema/migrations.js +0 -0
  401. package/dist/runtime/shared/schema/overview.d.ts +78 -0
  402. package/dist/runtime/shared/schema/overview.js +9 -0
  403. package/dist/runtime/shared/schema/provisioning.d.ts +230 -0
  404. package/dist/runtime/shared/schema/provisioning.js +52 -0
  405. package/dist/runtime/shared/schema/registry.d.ts +115 -0
  406. package/dist/runtime/shared/schema/registry.js +27 -0
  407. package/dist/runtime/shared/schema/rollout.d.ts +103 -0
  408. package/dist/runtime/shared/schema/rollout.js +66 -0
  409. package/dist/runtime/shared/schema/stats.d.ts +64 -0
  410. package/dist/runtime/shared/schema/stats.js +15 -0
  411. package/dist/runtime/shared/schema/tiers.d.ts +5 -0
  412. package/dist/runtime/shared/schema/tiers.js +9 -0
  413. package/dist/runtime/shared/types/module-options.d.ts +119 -0
  414. package/dist/runtime/shared/types/module-options.js +13 -0
  415. package/dist/runtime/shared/types/storage.d.ts +31 -0
  416. package/dist/runtime/shared/types/storage.js +0 -0
  417. package/dist/runtime/shared/utils/format-relative.d.ts +7 -0
  418. package/dist/runtime/shared/utils/format-relative.js +11 -0
  419. package/dist/runtime/shared/utils/frogger-snippet.d.ts +19 -0
  420. package/dist/runtime/shared/utils/frogger-snippet.js +33 -0
  421. package/dist/runtime/shared/utils/observe-config.d.ts +9 -0
  422. package/dist/runtime/shared/utils/observe-config.js +17 -0
  423. package/dist/runtime/shared/utils/period.d.ts +13 -0
  424. package/dist/runtime/shared/utils/period.js +15 -0
  425. package/dist/runtime/shared/utils/slug.d.ts +1 -0
  426. package/dist/runtime/shared/utils/slug.js +5 -0
  427. package/dist/runtime/shared/utils/uuid.d.ts +187 -0
  428. package/dist/runtime/shared/utils/uuid.js +345 -0
  429. package/dist/runtime/types/nuxt-auth-utils-imports.d.ts +25 -0
  430. package/dist/runtime/types/observe-app-imports.d.ts +20 -0
  431. package/dist/runtime/types/session.d.ts +17 -0
  432. package/dist/schema.d.mts +1318 -0
  433. package/dist/schema.mjs +629 -0
  434. package/dist/types.d.mts +3 -0
  435. package/package.json +93 -0
@@ -0,0 +1,92 @@
1
+ <script setup>
2
+ import { computed } from "vue";
3
+ import { useRuntimeConfig, navigateTo } from "#imports";
4
+ import { formatRelative } from "../../shared/utils/format-relative";
5
+ const props = defineProps({
6
+ rows: { type: Array, required: true },
7
+ total: { type: Number, required: true },
8
+ page: { type: Number, required: true },
9
+ limit: { type: Number, required: true },
10
+ pending: { type: Boolean, required: false }
11
+ });
12
+ const emit = defineEmits(["update:page"]);
13
+ const { prefix } = useRuntimeConfig().public.observe;
14
+ const columns = [
15
+ { id: "time", accessorKey: "time", header: "Time", meta: { class: { td: "tabular-nums whitespace-nowrap text-muted" } } },
16
+ { id: "level", accessorKey: "level", header: "Level" },
17
+ { id: "service", accessorKey: "app", header: "Service" },
18
+ { id: "version", accessorKey: "version", header: "Version", meta: { class: { th: "hidden sm:table-cell", td: "hidden sm:table-cell text-muted" } } },
19
+ { id: "message", accessorKey: "message", header: "Message", meta: { class: { td: "max-w-md" } } },
20
+ { id: "where", header: "Where", meta: { class: { th: "hidden md:table-cell", td: "hidden md:table-cell text-muted" } } }
21
+ ];
22
+ function absTime(ms) {
23
+ return new Date(ms).toLocaleString();
24
+ }
25
+ function onSelect(_e, row) {
26
+ return navigateTo(`${prefix}/logs/${row.original.id}`);
27
+ }
28
+ const pageModel = computed({
29
+ get: () => props.page,
30
+ set: (p) => emit("update:page", p)
31
+ });
32
+ </script>
33
+
34
+ <template>
35
+ <UCard :ui="{ body: 'p-0 sm:p-0' }">
36
+ <UTable
37
+ :data="rows"
38
+ :columns="columns"
39
+ :loading="pending"
40
+ empty="No logs match these filters."
41
+ :meta="{ class: { tr: () => 'cursor-pointer' } }"
42
+ :on-select="onSelect"
43
+ >
44
+ <template #time-cell="{ row }">
45
+ <span :title="absTime(row.original.time)">{{ formatRelative(row.original.time) }}</span>
46
+ </template>
47
+
48
+ <template #level-cell="{ row }">
49
+ <ObserveLogLevelBadge :level="row.original.level" />
50
+ </template>
51
+
52
+ <template #service-cell="{ row }">
53
+ <span class="flex items-center gap-2 min-w-0">
54
+ <span class="font-medium truncate">{{ row.original.app || "\u2014" }}</span>
55
+ <span
56
+ v-if="row.original.env"
57
+ class="text-xs text-muted shrink-0"
58
+ >{{ row.original.env }}</span>
59
+ </span>
60
+ </template>
61
+
62
+ <template #version-cell="{ row }">
63
+ {{ row.original.version ?? "\u2014" }}
64
+ </template>
65
+
66
+ <template #message-cell="{ row }">
67
+ <span
68
+ class="block truncate"
69
+ :title="row.original.message"
70
+ >
71
+ <span
72
+ v-if="row.original.error_name"
73
+ class="font-medium"
74
+ >{{ row.original.error_name }}: </span>{{ row.original.message }}
75
+ </span>
76
+ </template>
77
+
78
+ <template #where-cell="{ row }">
79
+ <span class="block truncate">{{ row.original.route ?? row.original.feature ?? "\u2014" }}</span>
80
+ </template>
81
+ </UTable>
82
+
83
+ <div class="flex items-center justify-between border-t border-default px-4 py-3">
84
+ <span class="text-xs text-muted tabular-nums">{{ total }} events</span>
85
+ <UPagination
86
+ v-model:page="pageModel"
87
+ :total="total"
88
+ :items-per-page="limit"
89
+ />
90
+ </div>
91
+ </UCard>
92
+ </template>
@@ -0,0 +1,20 @@
1
+ import type { LogListItem } from '../../shared/schema/logs-query.js';
2
+ /**
3
+ * The logs list, styled to sit alongside ObserveServicesTable. Rows click through to
4
+ * the detail page; pagination is bound to the server `total`. Heavy columns are already
5
+ * dropped server-side (LogListItem), so the wire stays lean.
6
+ */
7
+ type __VLS_Props = {
8
+ rows: LogListItem[];
9
+ total: number;
10
+ page: number;
11
+ limit: number;
12
+ pending?: boolean;
13
+ };
14
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
15
+ "update:page": (args_0: number) => any;
16
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
17
+ "onUpdate:page"?: ((args_0: number) => any) | undefined;
18
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
19
+ declare const _default: typeof __VLS_export;
20
+ export default _default;
@@ -0,0 +1,3 @@
1
+ declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
2
+ declare const _default: typeof __VLS_export;
3
+ export default _default;
@@ -0,0 +1,22 @@
1
+ <script setup>
2
+ import { computed } from "vue";
3
+ import { PERIODS, periodToRange } from "../../shared/utils/period";
4
+ import { useObservePeriod } from "../composables/useObservePeriod";
5
+ const { period, setPeriod } = useObservePeriod();
6
+ const items = PERIODS.map((p) => ({ label: periodToRange(p).label, value: p }));
7
+ const selected = computed({
8
+ get: () => period.value,
9
+ set: (value) => setPeriod(value)
10
+ });
11
+ </script>
12
+
13
+ <template>
14
+ <USelectMenu
15
+ v-model="selected"
16
+ :items="items"
17
+ value-key="value"
18
+ :search-input="false"
19
+ icon="i-lucide-clock"
20
+ class="w-44"
21
+ />
22
+ </template>
@@ -0,0 +1,3 @@
1
+ declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
2
+ declare const _default: typeof __VLS_export;
3
+ export default _default;
@@ -0,0 +1,12 @@
1
+ import type { RegressionFinding } from '../../shared/schema/rollout.js';
2
+ /**
3
+ * One severity-coloured alert per detected regression (CP13): names the candidate
4
+ * version, its error rate, the baseline it regressed against, and the delta. Pure
5
+ * @nuxt/ui, no d3, so it renders under SSR (unlike the .client charts).
6
+ */
7
+ type __VLS_Props = {
8
+ finding: RegressionFinding;
9
+ };
10
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
11
+ declare const _default: typeof __VLS_export;
12
+ export default _default;
@@ -0,0 +1,27 @@
1
+ <script setup>
2
+ import { computed } from "vue";
3
+ const props = defineProps({
4
+ finding: { type: Object, required: true }
5
+ });
6
+ const pct = (n) => `${(n * 100).toFixed(1)}%`;
7
+ const color = computed(() => props.finding.severity === "critical" ? "error" : "warning");
8
+ const title = computed(
9
+ () => `${props.finding.version} error rate ${pct(props.finding.errorRate)} (+${pct(props.finding.delta)})`
10
+ );
11
+ const description = computed(() => {
12
+ const f = props.finding;
13
+ const base = f.baselineVersion ? `Baseline ${f.baselineVersion} at ${pct(f.baselineErrorRate)}` : "No prior baseline";
14
+ const ratio = Number.isFinite(f.ratio) ? `, ${f.ratio.toFixed(1)}x` : "";
15
+ return `${base}${ratio}. ${f.sampleSize.toLocaleString()} events sampled.`;
16
+ });
17
+ </script>
18
+
19
+ <template>
20
+ <UAlert
21
+ :color="color"
22
+ variant="subtle"
23
+ icon="i-lucide-trending-up"
24
+ :title="title"
25
+ :description="description"
26
+ />
27
+ </template>
@@ -0,0 +1,12 @@
1
+ import type { RegressionFinding } from '../../shared/schema/rollout.js';
2
+ /**
3
+ * One severity-coloured alert per detected regression (CP13): names the candidate
4
+ * version, its error rate, the baseline it regressed against, and the delta. Pure
5
+ * @nuxt/ui, no d3, so it renders under SSR (unlike the .client charts).
6
+ */
7
+ type __VLS_Props = {
8
+ finding: RegressionFinding;
9
+ };
10
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
11
+ declare const _default: typeof __VLS_export;
12
+ export default _default;
@@ -0,0 +1,3 @@
1
+ declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
2
+ declare const _default: typeof __VLS_export;
3
+ export default _default;
@@ -0,0 +1,49 @@
1
+ <script setup>
2
+ import { computed, watch } from "vue";
3
+ import { useUserSession, useState } from "#imports";
4
+ import { useObserveOverview } from "../composables/useObserveOverview";
5
+ import { useObserveScope } from "../composables/useObserveScope";
6
+ const { user } = useUserSession();
7
+ const { data } = useObserveOverview();
8
+ const { scope, setScope } = useObserveScope();
9
+ const seenServices = useState("observe:switcher-services", () => ({}));
10
+ watch(data, (value) => {
11
+ if (!value) return;
12
+ for (const s of value.services) {
13
+ seenServices.value[s.slug] = s.name;
14
+ }
15
+ }, { immediate: true });
16
+ const ALL = "__all__";
17
+ const items = computed(() => {
18
+ const assignment = user.value?.assignment;
19
+ const serviceSlugs = new Set(Object.keys(seenServices.value));
20
+ for (const slug of assignment?.services ?? []) {
21
+ if (slug !== "*") serviceSlugs.add(slug);
22
+ }
23
+ const groupSlugs = (assignment?.groups ?? []).filter((g) => g !== "*");
24
+ return [
25
+ { label: "All services", value: ALL, icon: "i-lucide-layers" },
26
+ ...groupSlugs.map((g) => ({ label: g, value: `group:${g}`, icon: "i-lucide-folder" })),
27
+ ...[...serviceSlugs].sort().map((slug) => ({
28
+ label: seenServices.value[slug] ?? slug,
29
+ value: slug,
30
+ icon: "i-lucide-server"
31
+ }))
32
+ ];
33
+ });
34
+ const selected = computed({
35
+ get: () => scope.value ?? ALL,
36
+ set: (value) => setScope(value === ALL ? null : value)
37
+ });
38
+ </script>
39
+
40
+ <template>
41
+ <USelectMenu
42
+ v-model="selected"
43
+ :items="items"
44
+ value-key="value"
45
+ :search-input="false"
46
+ icon="i-lucide-telescope"
47
+ class="w-48"
48
+ />
49
+ </template>
@@ -0,0 +1,3 @@
1
+ declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
2
+ declare const _default: typeof __VLS_export;
3
+ export default _default;
@@ -0,0 +1,15 @@
1
+ import type { OverviewServiceRollup } from '../../shared/schema/overview.js';
2
+ /**
3
+ * Per-service rollup for the overview's wide column. Rows lead with a health dot
4
+ * (errors > warnings > clear), sort worst-first, and click-toggle the page's service
5
+ * scope, so the table doubles as a filter. Aggregate counts live in the section
6
+ * header here, not in stat cards.
7
+ */
8
+ type __VLS_Props = {
9
+ services: OverviewServiceRollup[];
10
+ activeServices?: number;
11
+ activeVersions?: number;
12
+ };
13
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
14
+ declare const _default: typeof __VLS_export;
15
+ export default _default;
@@ -0,0 +1,109 @@
1
+ <script setup>
2
+ import { computed } from "vue";
3
+ import { formatRelative } from "../../shared/utils/format-relative";
4
+ import { useObserveScope } from "../composables/useObserveScope";
5
+ const props = defineProps({
6
+ services: { type: Array, required: true },
7
+ activeServices: { type: Number, required: false },
8
+ activeVersions: { type: Number, required: false }
9
+ });
10
+ const { serviceSlug, setScope } = useObserveScope();
11
+ const sorted = computed(
12
+ () => [...props.services].sort(
13
+ (a, b) => b.errorCount - a.errorCount || b.warnCount - a.warnCount || b.lastSeen - a.lastSeen
14
+ )
15
+ );
16
+ const headerCounts = computed(() => {
17
+ const parts = [];
18
+ if (props.activeServices) parts.push(`${props.activeServices} active`);
19
+ if (props.activeVersions) parts.push(`${props.activeVersions} ${props.activeVersions === 1 ? "version" : "versions"}`);
20
+ return parts.join(" \xB7 ");
21
+ });
22
+ const numericHead = "text-right";
23
+ const numericCell = "text-right tabular-nums";
24
+ const columns = [
25
+ { id: "service", accessorKey: "name", header: "Service" },
26
+ { id: "events", accessorKey: "totalEvents", header: "Events", meta: { class: { th: numericHead, td: numericCell } } },
27
+ { id: "errors", accessorKey: "errorCount", header: "Errors", meta: { class: { th: numericHead, td: numericCell } } },
28
+ { id: "errorRate", accessorKey: "errorRate", header: "Error rate", meta: { class: { th: numericHead, td: `${numericCell} text-muted` } } },
29
+ {
30
+ id: "versions",
31
+ header: "Versions",
32
+ meta: { class: { th: `${numericHead} hidden sm:table-cell`, td: "text-right text-muted hidden sm:table-cell" } }
33
+ },
34
+ { id: "lastSeen", accessorKey: "lastSeen", header: "Last seen", meta: { class: { th: numericHead, td: `${numericCell} text-muted whitespace-nowrap` } } }
35
+ ];
36
+ function healthClass(svc) {
37
+ if (svc.errorCount > 0) return "bg-error";
38
+ if (svc.warnCount > 0) return "bg-warning";
39
+ return "bg-success";
40
+ }
41
+ function rowClass(row) {
42
+ return serviceSlug.value === row.original.slug ? "bg-elevated/60" : "";
43
+ }
44
+ function onSelect(_e, row) {
45
+ const slug = row.original.slug;
46
+ setScope(serviceSlug.value === slug ? null : slug);
47
+ }
48
+ </script>
49
+
50
+ <template>
51
+ <section>
52
+ <div class="flex items-baseline justify-between mb-2">
53
+ <h2 class="text-xs font-semibold uppercase tracking-wider text-muted">
54
+ Services
55
+ </h2>
56
+ <span
57
+ v-if="headerCounts"
58
+ class="text-xs text-muted"
59
+ >{{ headerCounts }}</span>
60
+ </div>
61
+
62
+ <UCard :ui="{ body: 'p-0 sm:p-0' }">
63
+ <UTable
64
+ :data="sorted"
65
+ :columns="columns"
66
+ empty="No services with events in this window."
67
+ :meta="{ class: { tr: rowClass } }"
68
+ :on-select="onSelect"
69
+ >
70
+ <template #service-cell="{ row }">
71
+ <span
72
+ class="flex items-center gap-2 min-w-0"
73
+ :title="serviceSlug === row.original.slug ? 'Click to clear the filter' : `Filter the page to ${row.original.name}`"
74
+ >
75
+ <span
76
+ class="size-2 rounded-full shrink-0"
77
+ :class="healthClass(row.original)"
78
+ />
79
+ <span class="font-medium truncate">{{ row.original.name }}</span>
80
+ <span
81
+ v-if="row.original.env"
82
+ class="text-xs text-muted shrink-0"
83
+ >{{ row.original.env }}</span>
84
+ </span>
85
+ </template>
86
+
87
+ <template #errors-cell="{ row }">
88
+ <span :class="row.original.errorCount > 0 ? 'text-error font-medium' : 'text-muted'">
89
+ {{ row.original.errorCount }}
90
+ </span>
91
+ </template>
92
+
93
+ <template #errorRate-cell="{ row }">
94
+ {{ (row.original.errorRate * 100).toFixed(1) }}%
95
+ </template>
96
+
97
+ <template #versions-cell="{ row }">
98
+ <span :title="row.original.versions.join(', ')">
99
+ {{ row.original.versions.length || "n/a" }}
100
+ </span>
101
+ </template>
102
+
103
+ <template #lastSeen-cell="{ row }">
104
+ {{ formatRelative(row.original.lastSeen) }}
105
+ </template>
106
+ </UTable>
107
+ </UCard>
108
+ </section>
109
+ </template>
@@ -0,0 +1,15 @@
1
+ import type { OverviewServiceRollup } from '../../shared/schema/overview.js';
2
+ /**
3
+ * Per-service rollup for the overview's wide column. Rows lead with a health dot
4
+ * (errors > warnings > clear), sort worst-first, and click-toggle the page's service
5
+ * scope, so the table doubles as a filter. Aggregate counts live in the section
6
+ * header here, not in stat cards.
7
+ */
8
+ type __VLS_Props = {
9
+ services: OverviewServiceRollup[];
10
+ activeServices?: number;
11
+ activeVersions?: number;
12
+ };
13
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
14
+ declare const _default: typeof __VLS_export;
15
+ export default _default;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * A single stat tile (CP8): label + big value + optional icon/hint. The value keeps
3
+ * the font's proportional figures - tabular-nums is reserved for columns that must
4
+ * align vertically, and makes large standalone numbers look loose.
5
+ */
6
+ type __VLS_Props = {
7
+ label: string;
8
+ value: string | number;
9
+ icon?: string;
10
+ hint?: string;
11
+ };
12
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
13
+ declare const _default: typeof __VLS_export;
14
+ export default _default;
@@ -0,0 +1,34 @@
1
+ <script setup>
2
+ defineProps({
3
+ label: { type: String, required: true },
4
+ value: { type: [String, Number], required: true },
5
+ icon: { type: String, required: false },
6
+ hint: { type: String, required: false }
7
+ });
8
+ </script>
9
+
10
+ <template>
11
+ <UCard :ui="{ body: 'p-4 sm:p-4' }">
12
+ <div class="flex items-start justify-between gap-2">
13
+ <div class="min-w-0">
14
+ <p class="text-xs text-muted truncate">
15
+ {{ label }}
16
+ </p>
17
+ <p class="mt-1 text-2xl font-semibold text-highlighted truncate">
18
+ {{ value }}
19
+ </p>
20
+ <p
21
+ v-if="hint"
22
+ class="mt-1 text-xs text-muted truncate"
23
+ >
24
+ {{ hint }}
25
+ </p>
26
+ </div>
27
+ <UIcon
28
+ v-if="icon"
29
+ :name="icon"
30
+ class="size-5 text-dimmed shrink-0"
31
+ />
32
+ </div>
33
+ </UCard>
34
+ </template>
@@ -0,0 +1,14 @@
1
+ /**
2
+ * A single stat tile (CP8): label + big value + optional icon/hint. The value keeps
3
+ * the font's proportional figures - tabular-nums is reserved for columns that must
4
+ * align vertically, and makes large standalone numbers look loose.
5
+ */
6
+ type __VLS_Props = {
7
+ label: string;
8
+ value: string | number;
9
+ icon?: string;
10
+ hint?: string;
11
+ };
12
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
13
+ declare const _default: typeof __VLS_export;
14
+ export default _default;
@@ -0,0 +1,15 @@
1
+ import type { StatsBucket } from '../../../shared/schema/stats.js';
2
+ /**
3
+ * Per-bucket error rate as a single 2px line (errorCount / count * 100, 0 for empty
4
+ * buckets) with a 10% area wash and an end dot carrying the latest value as the one
5
+ * direct label. Single series, so no legend box - the title names it. Wears the
6
+ * error status token: this series MEANS bad, so it never takes a categorical slot.
7
+ */
8
+ type __VLS_Props = {
9
+ buckets: StatsBucket[];
10
+ bucketMs: number;
11
+ pending?: boolean;
12
+ };
13
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
14
+ declare const _default: typeof __VLS_export;
15
+ export default _default;
@@ -0,0 +1,170 @@
1
+ <script setup>
2
+ import { ref, computed, watch, nextTick, onMounted, onBeforeUnmount } from "vue";
3
+ import { select, scaleTime, scaleLinear, axisBottom, axisLeft, line, area, max } from "d3";
4
+ import {
5
+ CHART_MARGIN,
6
+ CHART_HEIGHT,
7
+ formatCount,
8
+ formatPct,
9
+ bucketTimeFormatter,
10
+ createTooltip,
11
+ attachBucketInteraction
12
+ } from "./chart-core";
13
+ const props = defineProps({
14
+ buckets: { type: Array, required: true },
15
+ bucketMs: { type: Number, required: true },
16
+ pending: { type: Boolean, required: false }
17
+ });
18
+ const host = ref(null);
19
+ const svgRef = ref(null);
20
+ const hasData = computed(() => props.buckets.some((b) => b.count > 0));
21
+ const windowMs = computed(() => props.buckets.length * props.bucketMs);
22
+ const timeLabel = computed(() => bucketTimeFormatter(props.bucketMs, windowMs.value));
23
+ const tableRows = computed(() => props.buckets.filter((b) => b.count > 0));
24
+ const rateOf = (b) => b.count ? b.errorCount / b.count * 100 : 0;
25
+ let tooltip;
26
+ let interaction;
27
+ let resizeObserver;
28
+ let crosshairEl = null;
29
+ const hitState = { buckets: [], bucketMs: 1, xFor: () => 0, plotWidth: 1 };
30
+ function draw() {
31
+ const svgEl = svgRef.value;
32
+ const hostEl = host.value;
33
+ if (!svgEl || !hostEl) return;
34
+ const width = hostEl.clientWidth;
35
+ if (width <= 0) return;
36
+ const plotW = Math.max(1, width - CHART_MARGIN.left - CHART_MARGIN.right);
37
+ const plotH = CHART_HEIGHT - CHART_MARGIN.top - CHART_MARGIN.bottom;
38
+ const svg = select(svgEl).attr("width", width).attr("height", CHART_HEIGHT);
39
+ svg.selectAll("*").remove();
40
+ crosshairEl = null;
41
+ const buckets = props.buckets;
42
+ hitState.buckets = hasData.value ? buckets : [];
43
+ hitState.bucketMs = props.bucketMs;
44
+ hitState.plotWidth = plotW;
45
+ if (!buckets.length || !hasData.value) return;
46
+ const t0 = buckets[0].t;
47
+ const t1 = buckets[buckets.length - 1].t + props.bucketMs;
48
+ const x = scaleTime().domain([new Date(t0), new Date(t1)]).range([0, plotW]);
49
+ const maxRate = max(buckets, rateOf) ?? 0;
50
+ const y = scaleLinear().domain([0, Math.min(100, Math.max(5, maxRate * 1.2))]).nice(4).range([plotH, 0]);
51
+ hitState.xFor = (t) => x(new Date(t));
52
+ const g = svg.append("g").attr("transform", `translate(${CHART_MARGIN.left},${CHART_MARGIN.top})`);
53
+ g.append("g").attr("class", "observe-grid").selectAll("line").data(y.ticks(4).filter((t) => t > 0)).join("line").attr("x1", 0).attr("x2", plotW).attr("y1", (d) => y(d)).attr("y2", (d) => y(d));
54
+ g.append("g").attr("transform", `translate(0,${plotH})`).call(axisBottom(x).ticks(Math.max(3, Math.min(8, Math.floor(plotW / 90)))).tickSizeOuter(0));
55
+ g.append("g").call(axisLeft(y).ticks(4).tickSize(0).tickPadding(8).tickFormat((d) => formatPct(+d))).call((sel) => sel.select(".domain").remove());
56
+ const cxOf = (b) => x(new Date(b.t + props.bucketMs / 2));
57
+ const rateArea = area().x(cxOf).y0(plotH).y1((b) => y(rateOf(b)));
58
+ g.append("path").datum(buckets).attr("d", rateArea).style("fill", "var(--ui-error)").style("opacity", 0.1);
59
+ const rateLine = line().x(cxOf).y((b) => y(rateOf(b)));
60
+ g.append("path").datum(buckets).attr("d", rateLine).style("fill", "none").style("stroke", "var(--ui-error)").style("stroke-width", 2).attr("stroke-linejoin", "round").attr("stroke-linecap", "round");
61
+ const last = buckets[buckets.length - 1];
62
+ const endX = cxOf(last);
63
+ const endY = y(rateOf(last));
64
+ g.append("circle").attr("cx", endX).attr("cy", endY).attr("r", 4).style("fill", "var(--ui-error)").style("stroke", "var(--ui-bg)").style("stroke-width", 2);
65
+ if (rateOf(last) > 0) {
66
+ g.append("text").attr("x", Math.min(endX - 8, plotW - 4)).attr("y", Math.max(endY - 8, 10)).attr("text-anchor", "end").text(formatPct(rateOf(last)));
67
+ }
68
+ crosshairEl = g.append("line").attr("class", "observe-crosshair").attr("y1", 0).attr("y2", plotH).style("display", "none").node();
69
+ }
70
+ function handleHit(bucket, _index, cx) {
71
+ if (crosshairEl) {
72
+ crosshairEl.style.display = "";
73
+ crosshairEl.setAttribute("x1", String(cx));
74
+ crosshairEl.setAttribute("x2", String(cx));
75
+ }
76
+ tooltip?.show(cx, timeLabel.value(bucket.t), [
77
+ { color: "var(--ui-error)", label: "error rate", value: formatPct(rateOf(bucket)) },
78
+ { label: "errors", value: formatCount(bucket.errorCount) },
79
+ { label: "events", value: formatCount(bucket.count) }
80
+ ]);
81
+ }
82
+ function handleClear() {
83
+ if (crosshairEl) crosshairEl.style.display = "none";
84
+ tooltip?.hide();
85
+ }
86
+ onMounted(async () => {
87
+ await nextTick();
88
+ if (host.value) {
89
+ tooltip = createTooltip(host.value);
90
+ resizeObserver = new ResizeObserver(() => draw());
91
+ resizeObserver.observe(host.value);
92
+ }
93
+ if (svgRef.value) {
94
+ interaction = attachBucketInteraction(svgRef.value, hitState, handleHit, handleClear);
95
+ }
96
+ draw();
97
+ });
98
+ watch(() => [props.buckets, props.bucketMs], () => {
99
+ interaction?.clear();
100
+ draw();
101
+ });
102
+ onBeforeUnmount(() => {
103
+ interaction?.destroy();
104
+ tooltip?.destroy();
105
+ resizeObserver?.disconnect();
106
+ if (svgRef.value) select(svgRef.value).selectAll("*").remove();
107
+ });
108
+ </script>
109
+
110
+ <template>
111
+ <section>
112
+ <div class="flex items-baseline justify-between gap-4 mb-2">
113
+ <h2 class="text-xs font-semibold uppercase tracking-wider text-muted">
114
+ Error rate
115
+ </h2>
116
+ </div>
117
+
118
+ <UCard :ui="{ body: 'p-2 sm:p-3' }">
119
+ <div
120
+ ref="host"
121
+ class="relative"
122
+ >
123
+ <svg
124
+ v-show="hasData"
125
+ ref="svgRef"
126
+ class="observe-chart block w-full transition-opacity"
127
+ :class="{ 'opacity-60': pending }"
128
+ tabindex="0"
129
+ role="img"
130
+ aria-label="Error rate percentage over time. Use arrow keys to read values per time bucket."
131
+ />
132
+ <USkeleton
133
+ v-if="pending && !hasData"
134
+ class="h-60 w-full"
135
+ />
136
+ <p
137
+ v-else-if="!hasData"
138
+ class="h-60 flex items-center justify-center text-sm text-muted"
139
+ >
140
+ No events in this window.
141
+ </p>
142
+
143
+ <!-- sr-only on a wrapper div, never on the table: a <caption> belongs to the
144
+ table wrapper box and escapes the table's own overflow clip in Firefox. -->
145
+ <div
146
+ v-if="hasData"
147
+ class="sr-only"
148
+ >
149
+ <table>
150
+ <caption>Error rate per time bucket</caption>
151
+ <thead>
152
+ <tr><th>Time</th><th>Error rate</th><th>Errors</th><th>Events</th></tr>
153
+ </thead>
154
+ <tbody>
155
+ <tr
156
+ v-for="b in tableRows"
157
+ :key="b.t"
158
+ >
159
+ <td>{{ timeLabel(b.t) }}</td>
160
+ <td>{{ formatPct(rateOf(b)) }}</td>
161
+ <td>{{ b.errorCount }}</td>
162
+ <td>{{ b.count }}</td>
163
+ </tr>
164
+ </tbody>
165
+ </table>
166
+ </div>
167
+ </div>
168
+ </UCard>
169
+ </section>
170
+ </template>