@mxtommy/kip 4.8.0 → 4.8.1

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 (107) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +19 -17
  3. package/package.json +24 -21
  4. package/plugin/history-series.service.js +3 -0
  5. package/plugin/index.js +1 -1
  6. package/plugin/sqlite-history-storage.service.js +4 -2
  7. package/plugin/src/history-series.service.js +634 -0
  8. package/plugin/src/index.js +1322 -0
  9. package/plugin/src/kip-series-contract.js +31 -0
  10. package/plugin/src/openApi.json +855 -0
  11. package/plugin/src/sqlite-history-storage.service.js +1122 -0
  12. package/public/3rdpartylicenses.txt +569 -727
  13. package/public/assets/help-docs/chartplotter.md +1 -1
  14. package/public/assets/help-docs/history-api.md +69 -71
  15. package/public/assets/help-docs/menu.json +25 -7
  16. package/public/assets/help-docs/time-series.md +81 -0
  17. package/public/assets/help-docs/welcome.md +1 -1
  18. package/public/chunk-00hwknVI.js +1 -0
  19. package/public/chunk-5U8d2Ygo.js +14 -0
  20. package/public/chunk-AANk-NXH.js +1015 -0
  21. package/public/chunk-B6bEhzNR.js +1 -0
  22. package/public/chunk-B82ADJSs.js +1 -0
  23. package/public/chunk-BJz7Ij9E.js +1 -0
  24. package/public/chunk-BKj60jdq.js +1 -0
  25. package/public/chunk-BOAD0N2a.js +2 -0
  26. package/public/chunk-BQr-tSkv.js +1 -0
  27. package/public/chunk-BX6skw5k.js +1 -0
  28. package/public/chunk-BdokyhBM.js +1 -0
  29. package/public/chunk-Blokg6Ds.js +1 -0
  30. package/public/chunk-BoNDCNGE.js +1 -0
  31. package/public/chunk-Bp0MQwPM.js +1 -0
  32. package/public/chunk-BwOIef42.js +1 -0
  33. package/public/chunk-By8ZVvDx.js +2 -0
  34. package/public/chunk-C2VQxCXa.js +1 -0
  35. package/public/chunk-C6UXF7BI.js +1 -0
  36. package/public/chunk-CA6RRaxd.js +1 -0
  37. package/public/chunk-CIlfzV9R.js +1 -0
  38. package/public/chunk-CL2xiH57.js +1 -0
  39. package/public/chunk-CNMFlw_H.js +1 -0
  40. package/public/chunk-CNNTuNlM.js +1 -0
  41. package/public/chunk-CQNVyz8q.js +1 -0
  42. package/public/chunk-CXvG8mMq.js +1 -0
  43. package/public/chunk-CaD3zVfK.js +1 -0
  44. package/public/chunk-CkXTl3su.js +1 -0
  45. package/public/chunk-CpMCBDvH.js +1 -0
  46. package/public/chunk-CpuB_ZZz.js +2 -0
  47. package/public/chunk-CrBxxZCe.js +1 -0
  48. package/public/chunk-CwSa_BNV.js +1 -0
  49. package/public/chunk-D4xZ2tGB.js +39 -0
  50. package/public/chunk-DDqeRiB0.js +1 -0
  51. package/public/chunk-DE4ylhpq.js +1 -0
  52. package/public/chunk-DNS-qsFC.js +1 -0
  53. package/public/chunk-DQnoPLyC.js +1 -0
  54. package/public/chunk-DWLISAZi.js +1 -0
  55. package/public/chunk-DXkKj21H.js +1 -0
  56. package/public/chunk-DchvLV_Y.js +1 -0
  57. package/public/chunk-DjZgzSiH.js +1 -0
  58. package/public/chunk-DumLX5k_.js +1 -0
  59. package/public/chunk-Dxlia2NE.js +1 -0
  60. package/public/chunk-DzTTqoF_.js +1 -0
  61. package/public/chunk-H9_eqTYx.js +1 -0
  62. package/public/chunk-Ii9n-oiL.js +1 -0
  63. package/public/chunk-JbEkcxJm.js +2 -0
  64. package/public/chunk-MjWuPUhu.js +1 -0
  65. package/public/chunk-PheXEqie.js +1 -0
  66. package/public/chunk-TakPRI3t.js +2 -0
  67. package/public/chunk-VgxMqRPk.js +3 -0
  68. package/public/chunk-dgaOX1wC.js +382 -0
  69. package/public/chunk-hd2_AKwt.js +1 -0
  70. package/public/chunk-nu4vZg-z.js +1 -0
  71. package/public/chunk-sNakMDHi.js +1 -0
  72. package/public/chunk-tAiV3ARh.js +1 -0
  73. package/public/chunk-y1imvaA-.js +1 -0
  74. package/public/index.html +4 -4
  75. package/public/main-BAV5VDOD.js +7109 -0
  76. package/public/polyfills-5MJXXCNC.js +1 -0
  77. package/public/styles-JZSMCSRO.css +1 -0
  78. package/public/assets/help-docs/widget-historical-series.md +0 -110
  79. package/public/chunk-2TP7C66X.js +0 -5
  80. package/public/chunk-3SJSLBCV.js +0 -6
  81. package/public/chunk-5SMHTIVS.js +0 -50
  82. package/public/chunk-6ISGIPNP.js +0 -1
  83. package/public/chunk-6ZR3M3IQ.js +0 -3
  84. package/public/chunk-ACY7HYMZ.js +0 -4
  85. package/public/chunk-C23GLDFH.js +0 -62
  86. package/public/chunk-CB4E7PPA.js +0 -4
  87. package/public/chunk-DNM5XUIF.js +0 -1
  88. package/public/chunk-GSM7FZE2.js +0 -2
  89. package/public/chunk-HF7V6XFA.js +0 -2
  90. package/public/chunk-HUCDJ6CS.js +0 -10
  91. package/public/chunk-ILQQCGMJ.js +0 -5
  92. package/public/chunk-IXUKD73N.js +0 -5
  93. package/public/chunk-JMZYPL54.js +0 -2
  94. package/public/chunk-KG4C6HZC.js +0 -1
  95. package/public/chunk-LEY6MANN.js +0 -16
  96. package/public/chunk-NS2OV2OW.js +0 -9
  97. package/public/chunk-O5BTKN5D.js +0 -1
  98. package/public/chunk-Q32FSCUX.js +0 -1
  99. package/public/chunk-SHJMXSDM.js +0 -1
  100. package/public/chunk-T4VTC6GW.js +0 -1
  101. package/public/chunk-VFJD3XKT.js +0 -1
  102. package/public/chunk-VFZSH4TC.js +0 -1
  103. package/public/chunk-W6MCE3GH.js +0 -6
  104. package/public/main-UBENKC2D.js +0 -1
  105. package/public/polyfills-BWA36QKG.js +0 -1
  106. package/public/scripts-M6PHZBML.js +0 -14
  107. package/public/styles-DYEO23GZ.css +0 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ # v4.9.0
2
+ ## New Contributors
3
+ * Special thanks to @dillan for their first of many contributions.
4
+ * Special thanks to @macjl for their first of many contributions.
5
+ ## Improvements
6
+ * Enhanced switch panel control states and sizing for clearer status visibility and easier interaction.
7
+ * Simplified and clarified Time-Series documentation for faster onboarding and fewer setup mistakes.
8
+ * Made the V2 autopilot mode menu provider-agnostic for broader compatibility.
9
+ * Hid the Action Sidebar Fullscreen button when hosted in AppDock for a cleaner, context-aware UI and to prevent browsers from being stuck in fullscreen. Fixes #1062.
10
+ * Multiple performance improvements increasing responsiveness and providing a smoother experience on low powered devices.
11
+ * Reduced startup bundle size to deliver faster app startup.
12
+ ## Fixes
13
+ * Restored TTL reset to "--" after data timeouts to keep stale-state feedback accurate. Fixes #1069.
14
+ * Corrected layering so the autopilot SVG menu now appears above widget overlays. Fixes #1071.
15
+ * Fixed the autopilot static standby button label for clearer control feedback. Fixes #1072.
16
+ * Corrected the autopilot key map. Fixes #1073.
17
+ * Fixed Help image 404 errors when KIP is served under a base href. Fixes #1056.
18
+ * Resolved a test suite issue. Fixes #1074.
19
+ * Fixed remote storage request handling. Fixes #1075.
20
+ * Corrected Windsteer simple mode's True Wind Angle offset and simplified the interface to better match familiar, classic wind gauge features. Fixes #1066, #1063.
21
+ * Added circular directional angle support in the Data Charts widget using the Advancedwind wind shift path. Fixes #1070.
1
22
  # v4.8.0
2
23
  ## New Features
3
24
  * Solar Charger Widget: Get instant clarity on your solar system with a compact, purpose-built Solar Charger Widget. Track individual panels or full arrays in real time, including State of Charge, remaining capacity, remaining time, voltage, current, power flow, and temperature. Device discovery is automatic, and Zones support keeps warnings and alarms state highly visible.
@@ -5,6 +26,7 @@
5
26
  ## Improvements
6
27
  * Battery Monitor Widget visual cleanup for better readability and tighter consistency with the electrical widget family.
7
28
  * Framework upgrades and core refactoring to improve long-term maintainability and runtime performance.
29
+ * New Display Testing option allowing widgets with invalid paths to be saved.
8
30
  ## Fixes
9
31
  * Improved Battery Monitor text contrast when color state is Alert (yellow), making critical values easier to read. Fixes #1027
10
32
  * Restored Countdown Timer visibility in Add Widgets.
package/README.md CHANGED
@@ -18,7 +18,7 @@ KIP is designed for sailors and boaters who want:
18
18
 
19
19
  With KIP, you get the **familiar feel of professional Multi-Function Displays** combined with the flexibility of Signal K. It’s simple, reliable, and highly usable — the ultimate ready-to-go, modern, touch-first, Multi-Function Display for [Signal K](https://signalk.org) vessels.
20
20
 
21
- ![KIP](./images/KIPDemo.png)
21
+ ![KIP](https://github.com/mxtommy/Kip/blob/master/images/KIPDemo.png)
22
22
 
23
23
  ## Table of Content
24
24
  - [Installations Showcase](#installations-showcase)
@@ -35,7 +35,7 @@ With KIP, you get the **familiar feel of professional Multi-Function Displays**
35
35
  - [Connect, Share, and Support](#connect-share-and-support) & [Features, Ideas, Bugs](#features-ideas-bugs)
36
36
 
37
37
  ## Installations Showcase
38
- ![Form factor support](./images/exterior_user_installs.png)
38
+ ![Form factor support](https://github.com/mxtommy/Kip/blob/master/images/exterior_user_installs.png)
39
39
  In addition to the obvious navstation, wall mounted instrument panel and autopilot remote control usecases using PCs, tablets and phones, users have taken KIP into the elements using Raspberry Pi, Pi Zero, rugged tablets and all kinds of low cost AliExpress screens and industry leading, high quality, sunlight readable marine touch screens. KIP's native remote control feature opens up all kinds of possibilities.
40
40
 
41
41
  ## Read the Help Introduction How-To
@@ -50,7 +50,7 @@ The goal is to replicate and enhance the functionality of modern marine instrume
50
50
  - **Cross-Device Compatibility**: Guarantee a consistent and responsive experience across phones, tablets, computers, and other devices.
51
51
  - **Modern Browser Support**: Include support for the latest versions of Chromium and other modern web browsers to ensure optimal performance and compatibility.
52
52
 
53
- ![Form factor support](./images/formfactor.png)
53
+ ![Form factor support](https://github.com/mxtommy/Kip/blob/master/images/formfactor.png)
54
54
 
55
55
  ## User Experience
56
56
 
@@ -67,10 +67,10 @@ The goal is to replicate and enhance the functionality of modern marine instrume
67
67
  - Easily switch between multiple user and device configurations profiles for different roles, formfactors or use cases.
68
68
 
69
69
  Sidenav for quick access to all important features.
70
- ![Sidenav Dashboard Access](./images/ActionSidenav.png)
70
+ ![Sidenav Dashboard Access](https://github.com/mxtommy/Kip/blob/master/images/ActionSidenav.png)
71
71
 
72
72
  Chartplotter Mode with dashboards
73
- ![Chartplotter Mode](./images/ChartplotterMode.png)
73
+ ![Chartplotter Mode](https://github.com/mxtommy/Kip/blob/master/images/ChartplotterMode.png)
74
74
 
75
75
  ## Dashboards and Configuration
76
76
 
@@ -80,19 +80,19 @@ Meant to build purposeful dashboards with however many widgets you want, whereve
80
80
  Add, resize, and position the widgets of your choosing. Need more? Add as many additional dashboards as you wish to keep your display purposeful. Simply swipe up and down to quickly cycle through dashboards or effortlessly jump between dashboards with a single tap in the action sidenav, always knowing exactly where you are thanks to clear highlighting of your current dashboard.
81
81
 
82
82
  Widget lists are sorted by category.
83
- ![Layouts Configuration Image](./images/KipWidgetConfig-layout-1024.png)
83
+ ![Layouts Configuration Image](https://github.com/mxtommy/Kip/blob/master/images/KipWidgetConfig-layout-1024.png)
84
84
 
85
85
  Intuitive widget configuration.
86
- ![Gauges Configuration Image](./images/KipConfig-display-1024x488.png)
86
+ ![Gauges Configuration Image](https://github.com/mxtommy/Kip/blob/master/images/KipConfig-display-1024x488.png)
87
87
 
88
88
  See what Signal K has to offer that you can leverage with widgets. Select it and tweak the display options to suit your purpose.
89
- ![Paths Configuration Image](./images/KipWidgetConfig-paths-1024x488.png)
89
+ ![Paths Configuration Image](https://github.com/mxtommy/Kip/blob/master/images/KipWidgetConfig-paths-1024x488.png)
90
90
 
91
91
  Many units are supported. Choose your preferred app defaults, then tweak them widget-by-widget as necessary. KIP will automatically convert the units for you.
92
- ![Units Configuration Image](./images/KipConfig-Units-1024.png)
92
+ ![Units Configuration Image](https://github.com/mxtommy/Kip/blob/master/images/KipConfig-Units-1024.png)
93
93
 
94
94
  Organize your dashboards and access tools.
95
- ![Options and Dashboards](./images/Options.png)
95
+ ![Options and Dashboards](https://github.com/mxtommy/Kip/blob/master/images/Options.png)
96
96
 
97
97
  ## Widget Library
98
98
  All KIP widgets are visual presentation controls that are very versatile, with multiple advanced configuration options available to suit your needs:
@@ -122,16 +122,16 @@ Get the latest version of KIP to see what's new!
122
122
 
123
123
  ### Widget Samples
124
124
  Gauges sample
125
- ![Sample Gauges Image](./images/KipGaugeSample1-1024x545.png)
125
+ ![Sample Gauges Image](https://github.com/mxtommy/Kip/blob/master/images/KipGaugeSample1-1024x545.png)
126
126
 
127
127
  Various other types of widgets
128
- ![Electrical Concept Image](./images/KipGaugeSample2-1024x488.png)
128
+ ![Electrical Concept Image](https://github.com/mxtommy/Kip/blob/master/images/KipGaugeSample2-1024x488.png)
129
129
 
130
130
  Freeboard-SK Chartplotter integration with Autopilot widget
131
- ![Freeboard-SK Image](./images/KipFreeboard-SK-1024.png)
131
+ ![Freeboard-SK Image](https://github.com/mxtommy/Kip/blob/master/images/KipFreeboard-SK-1024.png)
132
132
 
133
133
  Grafana integration with other widgets
134
- ![Embedded Webpage Concept Image](./images/KipGaugeSample3-1024x508.png)
134
+ ![Embedded Webpage Concept Image](https://github.com/mxtommy/Kip/blob/master/images/KipGaugeSample3-1024x508.png)
135
135
 
136
136
  ## Historical Data
137
137
  Experience effortless insight into your vessel’s past with KIP’s Widget Historical Charts—automatically track, store, and visualize key data, unlocking instant access charts showing up to the last full day of performance. Whether you’re sailing or docked, simply two-finger tap or right-click widgets to reveal a seamless history dialog—no setup, no clutter, just the trends you need. When combining data visualisation using Data Driven widgets, live-to-history transitions, KIP puts your boat’s story at your fingertips—so you can make smarter decisions, spot patterns, and sail with confidence.
@@ -139,9 +139,9 @@ Experience effortless insight into your vessel’s past with KIP’s Widget Hist
139
139
  ## Night Modes
140
140
  Keep your night vision with automatic or manual day and night switching to a color preserving dim mode or an all Red theme. The images below look very dark, but at night... they are perfect!
141
141
 
142
- ![Night mode - All Red](./images/KipNightMode-1024.png)
142
+ ![Night mode - All Red](https://github.com/mxtommy/Kip/blob/master/images/KipNightMode-1024.png)
143
143
 
144
- ![Night mode - Brightness](./images/KipBrightness-1024.png)
144
+ ![Night mode - Brightness](https://github.com/mxtommy/Kip/blob/master/images/KipBrightness-1024.png)
145
145
 
146
146
  ## Chartplotter Mode
147
147
  Keep a live Freeboard‑SK chart visible while switching dashboards for an MFD‑style workflow. The chart persists (no reload or flicker), you can choose its side, collapse it per‑dashboard for full data pages, and drag resize the split. Layout auto‑stacks in portrait / narrow screens. See the dedicated Chartplotter Mode help page for setup, performance tips, and troubleshooting.
@@ -181,7 +181,9 @@ Stay informed with notifications about the state of the data you are interested
181
181
  For example, Signal K will notify KIP when a water depth or temperature sensor reaches certain levels. In addition to KIP's centralized notification menu, individual widgets offer tailored visual representations appropriate to their design objectives, providing an optimal user experience.
182
182
 
183
183
  # How To Contribute
184
- KIP is under the MIT license and is built with Node and Angular using various open-source assets. All free!
184
+ KIP is under the MIT license and is built with Node and Angular using various open-source assets. All free! The project want's to insure your time is well invested by favouring discussion before submitting bug fixes and new features.
185
+
186
+ Please ensure you submit an issue (bug/feature) before submitting a pull request.
185
187
 
186
188
  ## Project Scope
187
189
  What KIP IS about:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mxtommy/kip",
3
- "version": "4.8.0",
3
+ "version": "4.8.1",
4
4
  "description": "An advanced and versatile marine instrumentation package to display Signal K data.",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -65,48 +65,51 @@
65
65
  },
66
66
  "schematics": "tools/schematics/collection.json",
67
67
  "devDependencies": {
68
- "@angular-devkit/build-angular": "^21.2.3",
69
68
  "@angular-devkit/schematics-cli": "^20.1.6",
70
- "@angular/animations": "21.2.5",
71
- "@angular/build": "^21.2.3",
72
- "@angular/cdk": "21.2.3",
73
- "@angular/cli": "^21.2.3",
74
- "@angular/common": "21.2.5",
75
- "@angular/compiler": "21.2.5",
76
- "@angular/compiler-cli": "21.2.5",
77
- "@angular/core": "21.2.5",
78
- "@angular/forms": "21.2.5",
79
- "@angular/language-service": "21.2.5",
80
- "@angular/material": "21.2.3",
81
- "@angular/platform-browser": "21.2.5",
82
- "@angular/platform-browser-dynamic": "21.2.5",
83
- "@angular/router": "21.2.5",
69
+ "@angular/animations": "22.0.5",
70
+ "@angular/build": "^22.0.5",
71
+ "@angular/cdk": "22.0.3",
72
+ "@angular/cli": "^22.0.5",
73
+ "@angular/common": "22.0.5",
74
+ "@angular/compiler": "22.0.5",
75
+ "@angular/compiler-cli": "22.0.5",
76
+ "@angular/core": "22.0.5",
77
+ "@angular/forms": "22.0.5",
78
+ "@angular/language-service": "22.0.5",
79
+ "@angular/material": "22.0.3",
80
+ "@angular/platform-browser": "22.0.5",
81
+ "@angular/platform-browser-dynamic": "22.0.5",
82
+ "@angular/router": "22.0.5",
84
83
  "@aziham/chartjs-plugin-streaming": "^3.5.1",
85
84
  "@godind/ng-canvas-gauges": "^6.2.1",
86
85
  "@types/canvas-gauges": "^2.1.8",
87
86
  "@types/d3": "^7.4.3",
87
+ "@types/d3-selection": "^3.0.11",
88
+ "@types/d3-shape": "^3.1.8",
89
+ "@types/express": "^5.0.6",
88
90
  "@types/js-quantities": "^1.6.6",
89
91
  "@types/lodash-es": "^4.17.9",
90
92
  "@types/node": "^24.1.0",
91
93
  "@vitest/coverage-v8": "^4.1.0",
92
94
  "@zakj/no-sleep": "^0.13.5",
93
- "angular-eslint": "21.3.1",
95
+ "angular-eslint": "^22.0.0",
94
96
  "chart.js": "^4.5.1",
95
97
  "chartjs-adapter-date-fns": "^3.0.0",
96
98
  "chartjs-plugin-annotation": "^3.0.1",
97
99
  "clipboard": "^2.0.11",
98
- "codelyzer": "^6.0.0",
99
100
  "compare-versions": "^6.1.1",
100
101
  "core-js": "^3.13.1",
101
102
  "d3": "^7.9.0",
103
+ "d3-selection": "^3.0.0",
104
+ "d3-shape": "^3.2.0",
102
105
  "date-fns": "^2.30.0",
103
106
  "eslint": "^9.29.0",
104
107
  "gridstack": "^12.3.3",
105
108
  "js-quantities": "^1.8.0",
106
109
  "jsdom": "^26.1.0",
107
110
  "lodash-es": "^4.17.23",
108
- "ng-packagr": "^21.0.1",
109
- "ngx-markdown": "^21.0.1",
111
+ "ng-packagr": "^22.0.1",
112
+ "ngx-markdown": "^22.0.0",
110
113
  "prismjs": "^1.30.0",
111
114
  "pwa-asset-generator": "^8.1.1",
112
115
  "rxjs": "^7.8.2",
@@ -116,7 +119,7 @@
116
119
  "steelseries": "^2.0.9",
117
120
  "ts-node": "^10.9.2",
118
121
  "tslib": "^2.6.2",
119
- "typescript": "^5.9.3",
122
+ "typescript": "^6.0.3",
120
123
  "vitest": "^4.1.0"
121
124
  },
122
125
  "dependencies": {
@@ -499,6 +499,9 @@ class HistorySeriesService {
499
499
  reconcileTs: input.reconcileTs
500
500
  };
501
501
  if (expansionMode) {
502
+ if (!normalizedTemplateSelector) {
503
+ throw new Error(`Template series mode \"${expansionMode}\" must resolve a non-null ownerWidgetSelector`);
504
+ }
502
505
  const templateSeries = {
503
506
  ...normalizedBase,
504
507
  ownerWidgetSelector: normalizedTemplateSelector,
package/plugin/index.js CHANGED
@@ -65,7 +65,7 @@ const start = (server) => {
65
65
  const CONFIG_SCHEMA = {
66
66
  type: 'object',
67
67
  title: 'Remote Control and Data Series',
68
- description: 'NOTE: All plugin settings are also managed from within KIP\'s Display Options panel. Changes made here will be overridden when KIP applies settings from the Display Options.',
68
+ description: 'NOTE: All plugin settings are also managed from within KIP\'s Display Options panel. Changes made here will be overridden when KIP applies settings from the Display Options. See the KIP Time-Series help documentation for details.',
69
69
  properties: {
70
70
  nodeSqliteAvailable: {
71
71
  type: 'boolean',
@@ -709,7 +709,8 @@ class SqliteHistoryStorageService {
709
709
  });
710
710
  }
711
711
  catch (err) {
712
- this.logger.error(`[SERIES STORAGE] Prune failed: ${err?.message ?? err}`);
712
+ const message = err instanceof Error ? err.message : String(err);
713
+ this.logger.error(`[SERIES STORAGE] Prune failed: ${message}`);
713
714
  }
714
715
  }, SqliteHistoryStorageService.FOUR_HOURS_INTERVAL);
715
716
  this.pruneJob.unref?.();
@@ -739,7 +740,8 @@ class SqliteHistoryStorageService {
739
740
  });
740
741
  }
741
742
  catch (err) {
742
- this.logger.error(`[SERIES STORAGE] Stale series cleanup failed: ${err?.message ?? err}`);
743
+ const message = err instanceof Error ? err.message : String(err);
744
+ this.logger.error(`[SERIES STORAGE] Stale series cleanup failed: ${message}`);
743
745
  }
744
746
  }, SqliteHistoryStorageService.EIGHT_HOURS_INTERVAL);
745
747
  this.staleSeriesCleanupJob.unref?.();