@calebcall/camera-ui-notify 0.6.0 → 0.6.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.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,43 @@ All notable changes to **Notify** are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.6.1] - 2026-08-02
9
+
10
+ ### Fixed
11
+
12
+ - **Grafana IRM mode now renders correctly on a `grafana_alerting` integration** ([#31](https://github.com/calebcall/camera-ui-notify/issues/31)).
13
+ 0.6.0 sent only Grafana OnCall's formatted-webhook field set. IRM renders each alert group
14
+ through Jinja2 templates chosen by the integration's *type*, and a `grafana_alerting`
15
+ integration's templates read `payload.status` and `payload.alerts[]` — neither of which we sent.
16
+ The result was an alert group that arrived intact but displayed as
17
+ `Status: Unknown ⚠️ (Template Warning: 'dict object' has no attribute 'alerts')`, with
18
+ `numFiring`/`numResolved` showing IRM's zero defaults for the absent `alerts` array.
19
+
20
+ The payload is now a union of both shapes: Grafana Alerting's documented webhook envelope
21
+ (`receiver`, `status`, `alerts[]` carrying labels, annotations, `startsAt`/`endsAt`,
22
+ `generatorURL`, `fingerprint` and `imageURL`, plus `groupLabels`, `commonLabels`,
23
+ `commonAnnotations`, `externalURL`, `version`, `groupKey`, `truncatedAlerts`) alongside the
24
+ formatted-webhook fields 0.6.0 already sent. `title`, `message` and `state` are read by both and
25
+ are unchanged, so a **Webhook**-type integration configured against 0.6.0 keeps working exactly
26
+ as before — this is additive, not a replacement.
27
+
28
+ This was a design-time error rather than an implementation one: the spec specified the wrong
29
+ payload shape, and the unit tests could not catch it because they assert our body against a test
30
+ server that accepts anything. The envelope now follows the schema Grafana documents for its
31
+ webhook contact point.
32
+
33
+ ### Added
34
+
35
+ - **Per-camera grouping for IRM alert groups.** `groupKey` is `camera.ui:<cameraId>`, falling back
36
+ to `camera.ui` when a notification names no camera, so a busy camera cannot bury a quiet one.
37
+ Each event keeps a distinct `fingerprint` within its group. IRM groups still do not auto-resolve
38
+ — that remains deliberate, since a follow-up `state: "ok"` would need a background timer.
39
+ - **The snapshot now reaches IRM through the documented `imageURL` alert field** as well as
40
+ `image_url`, so it renders under either integration type. Still only when the publisher supplied
41
+ a hosted `ImageURL`.
42
+ - **`externalURL`** is derived from the absolute deep link's scheme and host, so it needs no new
43
+ configuration; it is omitted when `base_url` is unset and the deep link is therefore relative.
44
+
8
45
  ## [0.6.0] - 2026-08-01
9
46
 
10
47
  ### Added
package/README.md CHANGED
@@ -132,9 +132,19 @@ Alertmanager deduplicates on the label set and without it two detections on one
132
132
  TTL window would collapse into a single alert. The absolute deep link becomes `generatorURL`,
133
133
  which Grafana shows as **Source**.
134
134
 
135
- **IRM** — `POST {integration URL}` using Grafana IRM / OnCall's formatted-webhook fields
136
- (`alert_uid`, `title`, `message`, `image_url`, `link_to_upstream_details`, `state=alerting`), one
137
- alert group per event.
135
+ **IRM** — `POST {integration URL}`. IRM renders each alert group through templates chosen by the
136
+ integration's *type*, and the two types people actually create read different bodies, so the
137
+ payload carries both: Grafana Alerting's webhook envelope (`status`, `alerts[]` with
138
+ labels/annotations/`generatorURL`/`imageURL`, `groupKey`, `commonLabels`, `externalURL`) for a
139
+ **Grafana Alerting** integration, and OnCall's formatted-webhook fields (`alert_uid`, `image_url`,
140
+ `link_to_upstream_details`) for a **Webhook** integration. `title`, `message`, and
141
+ `state=alerting` are read by both. One body, correct under either type, nothing to configure.
142
+
143
+ Alert groups are keyed **per camera** — `camera.ui:<cameraId>`, falling back to `camera.ui` for a
144
+ notification that names no camera — so one busy camera can't bury a quiet one. Within a group each
145
+ event keeps its own `fingerprint`, so detections stay individually visible. Unlike Alerts mode,
146
+ IRM groups do **not** auto-resolve: there is no TTL and no follow-up `state: "ok"` request, so they
147
+ stay open until you resolve them.
138
148
 
139
149
  > **Images:** ntfy, Pushover, Telegram, and Discord all render the detection snapshot. Gotify is
140
150
  > text + link only (it needs a hosted image URL, which this fully-local plugin doesn't provide).
package/bundle.zip CHANGED
Binary file
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "displayName": "Notify",
3
3
  "name": "@calebcall/camera-ui-notify",
4
- "version": "0.6.0",
4
+ "version": "0.6.1",
5
5
  "description": "A fully-local, multi-backend camera.ui notifier plugin: delivers notifications to ntfy, Gotify, or a generic webhook, entirely on your own hardware with no cloud dependency.",
6
6
  "author": "calebcall (https://github.com/calebcall/camera-ui-notify)",
7
7
  "main": "./main.go",
@@ -48,14 +48,14 @@
48
48
  "protocolLevel": 1
49
49
  },
50
50
  "optionalDependencies": {
51
- "@calebcall/camera-ui-notify-darwin-arm64": "0.6.0",
52
- "@calebcall/camera-ui-notify-darwin-amd64": "0.6.0",
53
- "@calebcall/camera-ui-notify-linux-amd64": "0.6.0",
54
- "@calebcall/camera-ui-notify-linux-arm64": "0.6.0",
55
- "@calebcall/camera-ui-notify-windows-amd64": "0.6.0",
56
- "@calebcall/camera-ui-notify-windows-arm64": "0.6.0",
57
- "@calebcall/camera-ui-notify-linux-amd64-musl": "0.6.0",
58
- "@calebcall/camera-ui-notify-linux-arm64-musl": "0.6.0"
51
+ "@calebcall/camera-ui-notify-darwin-arm64": "0.6.1",
52
+ "@calebcall/camera-ui-notify-darwin-amd64": "0.6.1",
53
+ "@calebcall/camera-ui-notify-linux-amd64": "0.6.1",
54
+ "@calebcall/camera-ui-notify-linux-arm64": "0.6.1",
55
+ "@calebcall/camera-ui-notify-windows-amd64": "0.6.1",
56
+ "@calebcall/camera-ui-notify-windows-arm64": "0.6.1",
57
+ "@calebcall/camera-ui-notify-linux-amd64-musl": "0.6.1",
58
+ "@calebcall/camera-ui-notify-linux-arm64-musl": "0.6.1"
59
59
  },
60
60
  "files": [
61
61
  "bundle.zip",