@mxtommy/kip 4.4.0 → 4.5.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.
- package/.github/copilot-instructions.md +21 -5
- package/.github/instructions/best-practices.instructions.md +4 -0
- package/.github/instructions/project.instructions.md +47 -10
- package/CHANGELOG.md +13 -0
- package/README.md +11 -7
- package/package.json +8 -5
- package/plugin/duckdb-parquet-storage.service.js +1206 -0
- package/plugin/history-series.service.js +439 -0
- package/plugin/index.js +796 -81
- package/plugin/openApi.json +258 -20
- package/plugin/plugin-auth.service.js +75 -0
- package/plugin-config-data/kip/historicalData/kip-history.duckdb +0 -0
- package/plugin-config-data/kip/historicalData/parquet/chart-1/1772344583976-1772344583976.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-1/1771408800000-1771408890000.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-1/1771412400000-1771412490000.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-1/1771419600000-1771419650000.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-1/1772344584154-1772344584154.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-1/1772344584191-1772344584191.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-1/1772344584268-1772344584268.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-2/1771502400000-1771502400000.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-3/1771408800000-1771408890000.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-3/1771412400000-1771412490000.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-3/1771419600000-1771419650000.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-3/1772344584268-1772344584268.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-4/1771408800000-1771408890000.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-4/1771412400000-1771412490000.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-4/1771419600000-1771419650000.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-5/1771412400000-1771412490000.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-5/1771419600000-1771419650000.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-6/1771419600000-1771419650000.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-prefixed-1/1771408800000-1771408890000.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-prefixed-1/1771412400000-1771412490000.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-prefixed-1/1771419600000-1771419650000.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-prefixed-1/1772344584191-1772344584191.parquet +0 -0
- package/plugin-config-data/kip/historicalData/parquet/live-prefixed-1/1772344584268-1772344584268.parquet +0 -0
- package/public/assets/help-docs/chartplotter.md +5 -18
- package/public/assets/help-docs/community.md +0 -3
- package/public/assets/help-docs/configuration.md +1 -1
- package/public/assets/help-docs/contact-us.md +0 -4
- package/public/assets/help-docs/dashboards.md +20 -18
- package/public/assets/help-docs/datainspector.md +7 -5
- package/public/assets/help-docs/history-api.md +116 -0
- package/public/assets/help-docs/menu.json +18 -6
- package/public/assets/help-docs/nodered-control-flows.md +125 -0
- package/public/assets/help-docs/putcontrols.md +101 -60
- package/public/assets/help-docs/welcome.md +6 -7
- package/public/assets/help-docs/widget-historical-series.md +66 -0
- package/public/assets/help-docs/zones.md +5 -10
- package/public/chunk-2ICAVOT2.js +10 -0
- package/public/chunk-6XFWUUDD.js +3 -0
- package/public/chunk-A6DQJFP4.js +16 -0
- package/public/chunk-B75MT7ND.js +1 -0
- package/public/{chunk-HJQQWPGC.js → chunk-CEB42O2C.js} +1 -1
- package/public/chunk-CHGXAEKT.js +2 -0
- package/public/chunk-D7VDX7ZF.js +5 -0
- package/public/chunk-DD4F6F4S.js +9 -0
- package/public/{chunk-KIR67PZ2.js → chunk-DEGYRCMI.js} +1 -1
- package/public/{chunk-UVAQADRE.js → chunk-DEM56G4S.js} +1 -1
- package/public/chunk-DYTBBUMI.js +4 -0
- package/public/{chunk-PGELIHBX.js → chunk-EDNYYQIZ.js} +2 -2
- package/public/chunk-FNF7M3AE.js +1 -0
- package/public/chunk-IHURI4IH.js +5 -0
- package/public/chunk-J3LDKVIS.js +50 -0
- package/public/{chunk-PSF2OKKT.js → chunk-JB4YVVNW.js} +1 -1
- package/public/chunk-KPHICV76.js +5 -0
- package/public/chunk-KZ5DUKAX.js +1 -0
- package/public/{chunk-BNIQFWQ6.js → chunk-LQDSU4WS.js} +3 -3
- package/public/{chunk-PDYVZHOK.js → chunk-MGPPVLZ7.js} +1 -1
- package/public/{chunk-TKC7ROZ7.js → chunk-R7RQHWKJ.js} +1 -1
- package/public/chunk-S72JTJPN.js +6 -0
- package/public/chunk-UYIJND2R.js +1 -0
- package/public/chunk-YCEXTKGG.js +1 -0
- package/public/chunk-YKJKIWXO.js +6 -0
- package/public/index.html +1 -1
- package/public/main-EG2WF4EO.js +1 -0
- package/tools/schematics/create-host2-widget/files/readme/README.md.template +1 -1
- package/public/assets/help-docs/datasets.md +0 -95
- package/public/chunk-2KMYPGX4.js +0 -2
- package/public/chunk-2MWBAYPJ.js +0 -8
- package/public/chunk-3BGR52TW.js +0 -53
- package/public/chunk-4IHRH3BQ.js +0 -9
- package/public/chunk-557F3J5T.js +0 -1
- package/public/chunk-5DLSQ773.js +0 -4
- package/public/chunk-7HLFWAA7.js +0 -1
- package/public/chunk-IWK4FHBL.js +0 -5
- package/public/chunk-J4IGUIZA.js +0 -6
- package/public/chunk-JP7ZAJ6C.js +0 -3
- package/public/chunk-KKJXPB75.js +0 -8
- package/public/chunk-MMIOUKLI.js +0 -1
- package/public/chunk-PESXPDBT.js +0 -2
- package/public/chunk-PKATAZA2.js +0 -1
- package/public/chunk-TGGJAGV7.js +0 -15
- package/public/chunk-VH4ZIU4T.js +0 -4
- package/public/chunk-XEJJOWK6.js +0 -2
- package/public/main-I7M3MAJT.js +0 -1
- package/rm-npmjs-beta.sh +0 -50
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# KIP – Copilot Instructions (for AI coding agents)
|
|
2
2
|
|
|
3
|
-
Use this quick-start map to be productive in this repo. Prefer these concrete patterns over generic Angular tips. For depth, see COPILOT.md (root) and
|
|
3
|
+
Use this quick-start map to be productive in this repo. Prefer these concrete patterns over generic Angular tips. For depth, see `COPILOT.md` (root entrypoint), this file, and `.github/instructions/angular.instructions.md`.
|
|
4
4
|
|
|
5
5
|
## Big picture
|
|
6
6
|
- Angular v20+ PWA served under base path /@mxtommy/kip/ (angular.json baseHref, package.json scripts).
|
|
@@ -8,6 +8,18 @@ Use this quick-start map to be productive in this repo. Prefer these concrete pa
|
|
|
8
8
|
- UI: Dashboard(s) with draggable/resizable widgets (gridstack). Themes: light/dark/night via SCSS roles + CSS variables.
|
|
9
9
|
- Storage: Config lives in Signal K when logged in, else local (StorageService). App init via APP_INITIALIZER (AppNetworkInitService).
|
|
10
10
|
|
|
11
|
+
## Final architecture (2026 Q1)
|
|
12
|
+
- Historical-series orchestration path: `DashboardService` → `DashboardHistorySeriesSyncService` → `KipSeriesApiClientService` → plugin `/plugins/kip/series/reconcile`.
|
|
13
|
+
- Dataset write ownership is centralized in `WidgetDatasetOrchestratorService`; avoid direct dataset create/edit/remove calls from widget/dashboard flows.
|
|
14
|
+
- Shared history mapping path: `HistoryToChartMapperService` performs history-values → chart datapoint adaptation; `DatasetStreamService` delegates to it.
|
|
15
|
+
- Widget delete cleanup uses owner UUID matching (`ownerUuid` and `ownerUuid-*`) through lifecycle service, replacing selector-specific cleanup.
|
|
16
|
+
|
|
17
|
+
### Migration guardrails
|
|
18
|
+
1. For chart/trend widgets, use lifecycle sync helpers (`syncDataChartDataset`, `syncNumericMiniChartDataset`, `syncWindTrendsDatasets`).
|
|
19
|
+
2. Keep widget UUIDs stable and unique; ownership drives both dataset cleanup and history-series reconciliation.
|
|
20
|
+
3. Route history response mapping changes through `HistoryToChartMapperService` only.
|
|
21
|
+
4. Do not reintroduce legacy selector-branch dataset cleanup in dashboard/widget code.
|
|
22
|
+
|
|
11
23
|
## Daily workflows
|
|
12
24
|
- Dev: npm run dev, then open http://localhost:4200/@mxtommy/kip/ (needs a running Signal K server).
|
|
13
25
|
- Build KIP app: npm run build:dev | npm run build:prod (outputs KIP to public/ and respects baseHref).
|
|
@@ -121,8 +133,9 @@ Template:
|
|
|
121
133
|
- SCSS: use variables from src/themes/_m3*.scss; avoid hardcoded hex.
|
|
122
134
|
|
|
123
135
|
## Datasets & charts
|
|
124
|
-
- Historical/trend data:
|
|
125
|
-
- Example: src/app/widgets/widget-windtrends-chart uses Chart.js + date-fns and
|
|
136
|
+
- Historical/trend data: DatasetStreamService (src/app/core/services/dataset-stream.service.ts). Create/update/remove in widget lifecycle.
|
|
137
|
+
- Example: src/app/widgets/widget-windtrends-chart uses Chart.js + date-fns and DatasetStreamService for batch-then-live streams.
|
|
138
|
+
- Preferred write path: `WidgetDatasetOrchestratorService` (centralized dataset orchestration for Data Chart / Numeric minichart / Windtrends and owner-based cleanup).
|
|
126
139
|
|
|
127
140
|
## Signal K PUT/requests
|
|
128
141
|
- Read via DataService; write via SignalKRequestsService. UI filters PUT-enabled paths (see src/assets/help-docs/putcontrols.md).
|
|
@@ -132,6 +145,7 @@ Template:
|
|
|
132
145
|
- CommonJS deps are explicitly allowed (js-quantities). Avoid introducing new CJS without adding to allowedCommonJsDependencies.
|
|
133
146
|
- Use standalone components, signals, @if/@for; follow .github/instructions/angular.instructions.md for style.
|
|
134
147
|
- Widget config UIs live under src/app/widget-config; path controls use custom validators (no Validators.required). Respect isPathConfigurable and pathRequired.
|
|
148
|
+
- Documentation standard: Every public property and public method in TypeScript code MUST include full JSDoc with: purpose, parameters, return value, and at least one usage example. Apply this by default for all generated/edited code unless a file explicitly cannot use comments.
|
|
135
149
|
|
|
136
150
|
## Widgets: do this, not that (Host2)
|
|
137
151
|
- Do: Provide a complete `DEFAULT_CONFIG` with all paths & options. Don’t: Scatter defaults across lifecycle hooks.
|
|
@@ -142,16 +156,18 @@ Template:
|
|
|
142
156
|
- Do: Use widget-embedded or inline directives for composites. Don’t: Reintroduce legacy host wrappers.
|
|
143
157
|
|
|
144
158
|
## Key files/dirs
|
|
145
|
-
- Core services: `src/app/core/services/` (DataService, SignalKConnectionService, SignalKDeltaService, AppNetworkInitService, UnitsService,
|
|
159
|
+
- Core services: `src/app/core/services/` (DataService, SignalKConnectionService, SignalKDeltaService, AppNetworkInitService, UnitsService, DatasetStreamService, NotificationsService)
|
|
160
|
+
- Plugin config foundation: `src/app/core/services/signalk-plugin-config.service.ts` (plugin-only detection, dependency validation, schema normalization metadata, and config persistence via `/plugins` endpoints)
|
|
146
161
|
- Directives: `src/app/core/directives/` (widget-runtime, widget-streams, widget-metadata)
|
|
147
162
|
- Widgets: `src/app/widgets/` (e.g., widget-numeric, widget-gauge-ng-*, widget-data-chart, widget-windtrends-chart, widget-autopilot)
|
|
148
163
|
- Embedded host: `src/app/core/components/widget-embedded/`
|
|
149
164
|
- Config UI: `src/app/widget-config/`
|
|
165
|
+
- Plugin management (server plugins) is handled separately through `PluginConfigClientService` and `/plugins` REST endpoints. Keep install/uninstall out of scope unless explicitly added.
|
|
150
166
|
- Build: `angular.json`, `package.json` scripts
|
|
151
167
|
|
|
152
168
|
## Debugging
|
|
153
169
|
- Use Data Inspector (src/app/core/components/data-inspector) to verify live paths/metadata.
|
|
154
|
-
- Dev with source maps: npm run dev. Watch console from DataService/
|
|
170
|
+
- Dev with source maps: npm run dev. Watch console from DataService/DatasetStreamService for timeouts/lifecycle logs.
|
|
155
171
|
- Embeds (widget-iframe): prefer same-origin or relative URLs to avoid CORS and input-injection limits (see embedwidget.md).
|
|
156
172
|
|
|
157
173
|
## SVG Animation Helpers (rAF)
|
|
@@ -53,3 +53,7 @@ You are an expert in TypeScript, Angular, and scalable web application developme
|
|
|
53
53
|
- Design services around a single responsibility
|
|
54
54
|
- Use the `providedIn: 'root'` option for singleton services
|
|
55
55
|
- Use the `inject()` function instead of constructor injection
|
|
56
|
+
|
|
57
|
+
## Documentation
|
|
58
|
+
|
|
59
|
+
- Every public TypeScript property and public method MUST include full JSDoc with: purpose, parameters, return value, and at least one usage example.
|
|
@@ -22,6 +22,18 @@ KIP Instrument MFD is an advanced and versatile marine instrumentation package d
|
|
|
22
22
|
- The main configuration form logic is in `src/app/widget-config/modal-widget-config/`. For unique widget config needs, you may add a new config component (e.g., `modal-widget-<name>-config`).
|
|
23
23
|
- Widget logic/UI and widget configuration are separate concepts that work together.
|
|
24
24
|
|
|
25
|
+
### Finalized architecture (2026 Q1)
|
|
26
|
+
- **History series reconciliation pipeline:** Dashboard widget topology is normalized by `DashboardHistorySeriesSyncService` and reconciled through `KipSeriesApiClientService` into plugin-backed series definitions.
|
|
27
|
+
- **Dataset lifecycle centralization:** `WidgetDatasetOrchestratorService` is the write-owner for widget datasets (create/edit/remove and owner-based cleanup).
|
|
28
|
+
- **Shared history adaptation:** `HistoryToChartMapperService` centralizes History API values-to-chart datapoint mapping, including average aliases and circular-angle summary stats.
|
|
29
|
+
- **Delete-path cleanup simplification:** Dashboard delete flow now performs owner UUID dataset cleanup via lifecycle service instead of selector-specific branches.
|
|
30
|
+
|
|
31
|
+
### Architecture guardrails for contributors
|
|
32
|
+
- Replace direct widget/dashboard `DatasetStreamService` write calls with `WidgetDatasetOrchestratorService` sync/remove helpers.
|
|
33
|
+
- Preserve stable widget UUID ownership contracts; these IDs are used for dataset and series reconciliation behavior.
|
|
34
|
+
- Keep history response transformation logic in `HistoryToChartMapperService` to avoid divergence across chart consumers.
|
|
35
|
+
- Avoid reintroducing legacy widget-selector cleanup branches.
|
|
36
|
+
|
|
25
37
|
---
|
|
26
38
|
|
|
27
39
|
## 4. Conventions & Patterns
|
|
@@ -53,6 +65,7 @@ KIP Instrument MFD is an advanced and versatile marine instrumentation package d
|
|
|
53
65
|
## 6. Documentation & Comments
|
|
54
66
|
- **Document all custom validators and business rules.**
|
|
55
67
|
- **Update this file and the README with any major changes or new patterns.**
|
|
68
|
+
- **JSDoc requirement:** Every public TypeScript property and public method must include full JSDoc containing: purpose, parameters, return value, and at least one usage example.
|
|
56
69
|
|
|
57
70
|
---
|
|
58
71
|
|
|
@@ -101,7 +114,7 @@ All major services in `src/app/core/services/` are summarized below for Copilot
|
|
|
101
114
|
- Key methods: Event emitters, hotkey handlers.
|
|
102
115
|
- Dependencies: Angular core, browser APIs.
|
|
103
116
|
|
|
104
|
-
- **
|
|
117
|
+
- **SettingsService (`settings.service.ts`)**
|
|
105
118
|
- Purpose: Manages persistent app settings, user preferences, and configuration storage.
|
|
106
119
|
- Key methods: `getSetting()`, `setSetting()`, config file management.
|
|
107
120
|
- Dependencies: StorageService.
|
|
@@ -113,12 +126,12 @@ All major services in `src/app/core/services/` are summarized below for Copilot
|
|
|
113
126
|
|
|
114
127
|
- **NotificationsService (`notifications.service.ts`)**
|
|
115
128
|
- Key methods: Notification state management, audio/visual alerts, muting.
|
|
116
|
-
- Dependencies:
|
|
129
|
+
- Dependencies: SettingsService, DataService, SignalkRequestsService.
|
|
117
130
|
|
|
118
131
|
- **ToastService (`toast.service.ts`)**
|
|
119
132
|
- Purpose: In-app snackbars using Angular Material.
|
|
120
133
|
- Key methods: `show(message, duration = 1500, silent = true, action = 'Dismiss', severity = 'message')`.
|
|
121
|
-
- Dependencies: MatSnackBar,
|
|
134
|
+
- Dependencies: MatSnackBar, SettingsService.
|
|
122
135
|
- Usage: Use for short, user-visible feedback (login errors, PUT failures, success confirmations). Sound is suppressed when `silent=true` or user sound settings disable audio.
|
|
123
136
|
|
|
124
137
|
- **CanvasService (`canvas.service.ts`)**
|
|
@@ -131,16 +144,40 @@ All major services in `src/app/core/services/` are summarized below for Copilot
|
|
|
131
144
|
- Key methods: Layout management, widget arrangement, dashboard state.
|
|
132
145
|
- Dependencies: StorageService, WidgetService.
|
|
133
146
|
|
|
134
|
-
- **
|
|
147
|
+
- **DatasetStreamService (`dataset-stream.service.ts`)**
|
|
135
148
|
- Purpose: Manages data sets, including loading, saving, and updating widget data sources.
|
|
136
149
|
- Key methods: Data set CRUD, data source updates.
|
|
137
150
|
- Dependencies: DataService, StorageService.
|
|
138
151
|
|
|
139
|
-
- **
|
|
140
|
-
- Purpose:
|
|
141
|
-
- Key methods:
|
|
142
|
-
- Dependencies:
|
|
143
|
-
- Usage:
|
|
152
|
+
- **WidgetDatasetOrchestratorService (`widget-dataset-orchestrator.service.ts`)**
|
|
153
|
+
- Purpose: Centralized dataset orchestration for widget lifecycle operations.
|
|
154
|
+
- Key methods: `syncDataChartDataset()`, `syncNumericMiniChartDataset()`, `syncWindTrendsDatasets()`, `removeOwnedDatasets()`.
|
|
155
|
+
- Dependencies: DatasetStreamService.
|
|
156
|
+
- Usage: Preferred write path for widget/dash dataset lifecycle actions.
|
|
157
|
+
|
|
158
|
+
- **HistoryToChartMapperService (`history-to-chart-mapper.service.ts`)**
|
|
159
|
+
- Purpose: Shared adapter for converting History API value responses into chart datapoints.
|
|
160
|
+
- Key methods: `mapValuesToChartDatapoints()`.
|
|
161
|
+
- Dependencies: None (core mapping service).
|
|
162
|
+
- Usage: Keeps chart history behavior consistent across all consumers.
|
|
163
|
+
|
|
164
|
+
- **DashboardHistorySeriesSyncService (`dashboard-history-series-sync.service.ts`)**
|
|
165
|
+
- Purpose: Derives desired historical-series definitions from current dashboard/widget state and reconciles with plugin backend.
|
|
166
|
+
- Key methods: Internal extraction + debounced reconcile scheduling.
|
|
167
|
+
- Dependencies: DashboardService, KipSeriesApiClientService, SignalKConnectionService.
|
|
168
|
+
- Usage: Single orchestration path for add/edit/delete/copy/paste/duplicate widget series convergence.
|
|
169
|
+
|
|
170
|
+
- **KipSeriesApiClientService (`kip-series-api-client.service.ts`)**
|
|
171
|
+
- Purpose: Frontend bridge to KIP plugin series reconcile endpoint.
|
|
172
|
+
- Key methods: `reconcileSeries()`.
|
|
173
|
+
- Dependencies: HttpClient, SignalKConnectionService.
|
|
174
|
+
- Usage: Posts full desired series definitions to plugin for canonical reconciliation.
|
|
175
|
+
|
|
176
|
+
- **PluginConfigClientService (`plugin-config-client.service.ts`)**
|
|
177
|
+
- Purpose: Plugin configuration foundation service for dependency checks and plugin state/config persistence via Signal K `/plugins` endpoints.
|
|
178
|
+
- Key methods: `listPlugins()`, `getPlugin()`, `getPluginConfig()`, `savePluginConfig()`, `setPluginEnabled()`, `validateDependency()`, `normalizePluginSchema()`.
|
|
179
|
+
- Dependencies: HttpClient, SignalKConnectionService.
|
|
180
|
+
- Usage: Source of truth for plugin detection and config save flows; no plugin install/uninstall support.
|
|
144
181
|
|
|
145
182
|
- **SignalKRequestsService (`signalk-requests.service.ts`)**
|
|
146
183
|
- Purpose: Handles requests to the Signal K server, such as PUT/POST operations and custom actions.
|
|
@@ -155,7 +192,7 @@ All major services in `src/app/core/services/` are summarized below for Copilot
|
|
|
155
192
|
- **UnitsService (`units.service.ts`)**
|
|
156
193
|
- Purpose: Handles unit conversion and formatting for all displayed data.
|
|
157
194
|
- Key methods: `convert()`, `format()`, unit preference management.
|
|
158
|
-
- Dependencies:
|
|
195
|
+
- Dependencies: SettingsService.
|
|
159
196
|
|
|
160
197
|
- **WidgetService (`widget.service.ts`)**
|
|
161
198
|
- Purpose: Manages widget registration, configuration, and lifecycle.
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
# v4.5.0
|
|
2
|
+
## New Features
|
|
3
|
+
* Effortlessly review your vessel’s history with the new Widget Historical Charts—automatically track, store, and visualize key data. Instantly access up to the last full day of performance: just two-finger tap or right-click any widget to open a seamless history dialog—no setup, no clutter, just the trends you need. (Requires Signal K v2.22.1)
|
|
4
|
+
* Dashboards now start with fully populated Data Charts, powered by KIP’s managed Time-Series History-API provider or other compatible history providers. (Requires Signal K v2.22.1)
|
|
5
|
+
* Added internet availability detection for remote queries.
|
|
6
|
+
## Improvements
|
|
7
|
+
* Added "Days" as a selectable time scale in the Data Chart widget.
|
|
8
|
+
* Improved integration by validating server plugin presence, plugin state, and configuration.
|
|
9
|
+
* Added a Node-RED introduction guide to the Help section.
|
|
10
|
+
## Fixes
|
|
11
|
+
* Improved KIP plugin OpenAPI compatibility.
|
|
12
|
+
* Resolved slow Data Inspector performance caused by high resource usage in deep loop logic.
|
|
13
|
+
* Remote Control feature should not require Admin permission. Fixes #940
|
|
1
14
|
# v4.4.0
|
|
2
15
|
## New Features
|
|
3
16
|
* New AIS Radar widget: Turn AIS traffic into an instant tactical view with live targets, dynamic range rings, fast zoom controls, and smart filters—so you can spot nearby vessels quicker and make confident navigation decisions at a glance.
|
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ With KIP, you get the **familiar feel of professional Multi-Function Displays**
|
|
|
24
24
|
- [Installations Showcase](#installations-showcase)
|
|
25
25
|
- [Design Goal](#design-goal)
|
|
26
26
|
- [User Experience](#user-experience)
|
|
27
|
-
- [Dashboards and Configuration](#dashboards-and-configuration)
|
|
27
|
+
- [Dashboards and Configuration](#dashboards-and-configuration), [Widget Library](#widget-library) & [Historical Data](#historycal-data)
|
|
28
28
|
- [Night Modes](#night-modes)
|
|
29
29
|
- [Chartplotter Mode](#chartplotter-mode)
|
|
30
30
|
- [Remote Control](#remote-control-other-kip-displays)
|
|
@@ -54,12 +54,12 @@ The goal is to replicate and enhance the functionality of modern marine instrume
|
|
|
54
54
|
|
|
55
55
|
## User Experience
|
|
56
56
|
|
|
57
|
-
###
|
|
57
|
+
### Interactions
|
|
58
58
|
- Swipe up and down to navigate through your dashboards effortlessly.
|
|
59
59
|
- Swipe left and right to access notifications and other system features quickly.
|
|
60
60
|
- Use keyboard shortcuts for essential features, ensuring fast and efficient navigation across devices types.
|
|
61
61
|
|
|
62
|
-
###
|
|
62
|
+
### Customize
|
|
63
63
|
- Effortlessly create and customize dashboards using an intuitive grid layout system.
|
|
64
64
|
- Add, resize, and align widgets to design tailored displays for your specific needs.
|
|
65
65
|
- Duplicate widgets or entire dashboards, including their configurations, with a single click.
|
|
@@ -137,6 +137,9 @@ Freeboard-SK Chartplotter integration with Autopilot widget
|
|
|
137
137
|
Grafana integration with other widgets
|
|
138
138
|

|
|
139
139
|
|
|
140
|
+
## Historical Data
|
|
141
|
+
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 tap or right-click widgets to reveal a seamless history dialog—no setup, no clutter, just the trends you need. With full support for 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.
|
|
142
|
+
|
|
140
143
|
## Night Modes
|
|
141
144
|
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!
|
|
142
145
|
|
|
@@ -258,16 +261,17 @@ Once done with your work, from your fork's working branch, make a GitHub pull re
|
|
|
258
261
|
|
|
259
262
|
For comprehensive development guidance, please refer to these instruction files:
|
|
260
263
|
|
|
261
|
-
###
|
|
264
|
+
### Primary Instructions
|
|
262
265
|
- **[COPILOT.md](./COPILOT.md)**: Complete KIP project guidelines including architecture, services, widget development patterns, theming, and Signal K integration.
|
|
263
|
-
- **[Angular Instructions](./.github/instructions/angular.instructions.md)**: Modern Angular
|
|
266
|
+
- **[Angular Instructions](./.github/instructions/angular.instructions.md)**: Modern Angular v21+ coding standards, component patterns, and framework best practices.
|
|
267
|
+
- **[Copilot Agent Instructions](./.github/copilot-instructions.md)**: Architecture details and coding-agent guardrails for this repository.
|
|
264
268
|
|
|
265
|
-
###
|
|
269
|
+
### Development Workflow
|
|
266
270
|
1. **Start Here**: Read `COPILOT.md` for KIP-specific architecture and patterns.
|
|
267
271
|
2. **Angular Standards**: Follow `.github/instructions/angular.instructions.md` for modern Angular development.
|
|
268
272
|
3. **Setup & Build**: Use this README for project setup and build commands.
|
|
269
273
|
|
|
270
|
-
###
|
|
274
|
+
### Key Priorities
|
|
271
275
|
- **Widget Development**: Use the Host2 widget pattern (signals + directives) and scaffold new widgets with the `create-host2-widget` schematic (see `COPILOT.md`).
|
|
272
276
|
- **Angular Patterns**: Use signals, standalone components, and modern control flow.
|
|
273
277
|
- **Theming**: Follow KIP's theme system for consistent UI.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mxtommy/kip",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.5.0",
|
|
4
4
|
"description": "An advanced and versatile marine instrumentation package to display Signal K data.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
"signalk-webapp",
|
|
27
27
|
"signalk-category-instruments",
|
|
28
28
|
"signalk-category-notifications",
|
|
29
|
+
"signalk-category-ais",
|
|
29
30
|
"signalk-node-server-plugin",
|
|
30
31
|
"signal k",
|
|
31
32
|
"signalk",
|
|
@@ -42,6 +43,7 @@
|
|
|
42
43
|
"signalk-plugin-enabled-by-default": true,
|
|
43
44
|
"scripts": {
|
|
44
45
|
"test": "CI=1 ng test --watch=false",
|
|
46
|
+
"test:plugin": "npm run build:plugin && node --test --test-concurrency=1 kip-plugin/tests/index.test.cjs",
|
|
45
47
|
"test:interactive": "ng test",
|
|
46
48
|
"test:headless": "CI=1 ng test --browsers=ChromeHeadless --watch=false",
|
|
47
49
|
"lint": "ng lint",
|
|
@@ -62,12 +64,12 @@
|
|
|
62
64
|
"@angular/compiler-cli": "21.1.4",
|
|
63
65
|
"@angular/language-service": "21.1.4",
|
|
64
66
|
"@types/canvas-gauges": "^2.1.8",
|
|
67
|
+
"@types/d3": "^7.4.3",
|
|
65
68
|
"@types/jasmine": "~3.6.0",
|
|
66
69
|
"@types/jasminewd2": "^2.0.9",
|
|
67
70
|
"@types/js-quantities": "^1.6.6",
|
|
68
71
|
"@types/lodash-es": "^4.17.9",
|
|
69
72
|
"@types/node": "^24.1.0",
|
|
70
|
-
"@types/d3": "^7.4.3",
|
|
71
73
|
"angular-eslint": "21.2.0",
|
|
72
74
|
"codelyzer": "^6.0.0",
|
|
73
75
|
"eslint": "^9.29.0",
|
|
@@ -100,6 +102,7 @@
|
|
|
100
102
|
"@angular/router": "21.1.4",
|
|
101
103
|
"@aziham/chartjs-plugin-streaming": "^3.5.1",
|
|
102
104
|
"@godind/ng-canvas-gauges": "^6.2.1",
|
|
105
|
+
"@signalk/server-api": "^2.22.0",
|
|
103
106
|
"@zakj/no-sleep": "^0.13.5",
|
|
104
107
|
"chart.js": "^4.5.1",
|
|
105
108
|
"chartjs-adapter-date-fns": "^3.0.0",
|
|
@@ -109,6 +112,7 @@
|
|
|
109
112
|
"core-js": "^3.13.1",
|
|
110
113
|
"d3": "^7.9.0",
|
|
111
114
|
"date-fns": "^2.30.0",
|
|
115
|
+
"duckdb": "^1.4.4",
|
|
112
116
|
"gridstack": "^12.3.3",
|
|
113
117
|
"js-quantities": "^1.8.0",
|
|
114
118
|
"lodash-es": "^4.17.23",
|
|
@@ -116,10 +120,9 @@
|
|
|
116
120
|
"prismjs": "^1.30.0",
|
|
117
121
|
"rxjs": "^7.8.2",
|
|
118
122
|
"screenfull": "^6.0.2",
|
|
123
|
+
"sk-ais-status-plugin": "^1.0.0",
|
|
119
124
|
"steelseries": "^2.0.9",
|
|
120
125
|
"tslib": "^2.6.2",
|
|
121
|
-
"zone.js": "^0.15.1"
|
|
122
|
-
"@signalk/server-api": "^2.7.2",
|
|
123
|
-
"sk-ais-status-plugin": "^1.0.0"
|
|
126
|
+
"zone.js": "^0.15.1"
|
|
124
127
|
}
|
|
125
128
|
}
|