@camstack/types 1.2.70 → 1.2.71

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/dist/addon.js CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_event_category = require("./event-category-DxZbWydC.js");
3
- const require_sleep = require("./sleep-YuacOD41.js");
2
+ const require_event_category = require("./event-category-D3gG7oil.js");
3
+ const require_sleep = require("./sleep-DbVrpKVz.js");
4
4
  const require_err_msg = require("./err-msg-COpsHMw2.js");
5
5
  //#region src/generated/collection-array-methods.ts
6
6
  /**
package/dist/addon.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { t as EventCategory } from "./event-category-Cv9dO26A.mjs";
2
- import { C as DeviceType, F as nodePin, H as scopeKey, I as readNodePin, R as ReadinessRegistry, _t as normalizeAddonInitResult, a as asJsonObject, bt as emitReadiness, d as DEVICE_SCOPED_CAPS, f as isDeviceScopedCap, gt as BaseAddon, ht as DisposerChain, k as expandCapMethods, mt as DATAPLANE_SECRET_HEADER, p as createDeviceProxy, s as asString, t as sleep, u as parseJsonUnknown, v as deviceOpsCapability, w as adminUiCapability, y as viewerUiCapability, z as ReadinessTimeoutError } from "./sleep-CwERnGrD.mjs";
1
+ import { t as EventCategory } from "./event-category-Bxo5yJjt.mjs";
2
+ import { C as DeviceType, F as nodePin, H as scopeKey, I as readNodePin, R as ReadinessRegistry, _t as normalizeAddonInitResult, a as asJsonObject, bt as emitReadiness, d as DEVICE_SCOPED_CAPS, f as isDeviceScopedCap, gt as BaseAddon, ht as DisposerChain, k as expandCapMethods, mt as DATAPLANE_SECRET_HEADER, p as createDeviceProxy, s as asString, t as sleep, u as parseJsonUnknown, v as deviceOpsCapability, w as adminUiCapability, y as viewerUiCapability, z as ReadinessTimeoutError } from "./sleep-CTgUmjYq.mjs";
3
3
  import { t as errMsg } from "./err-msg-IQTHeDzc.mjs";
4
4
  //#region src/generated/collection-array-methods.ts
5
5
  /**
@@ -74,6 +74,8 @@ export declare const NcSystemEventKindSchema: z.ZodEnum<{
74
74
  "stream-offline": "stream-offline";
75
75
  "node-online": "node-online";
76
76
  "node-offline": "node-offline";
77
+ "node-inference-unavailable": "node-inference-unavailable";
78
+ "detection-blind": "detection-blind";
77
79
  "addon-update-available": "addon-update-available";
78
80
  "server-update-available": "server-update-available";
79
81
  "alarm-triggered": "alarm-triggered";
@@ -121,6 +123,8 @@ export declare const NcSystemEventConditionSchema: z.ZodObject<{
121
123
  "stream-offline": "stream-offline";
122
124
  "node-online": "node-online";
123
125
  "node-offline": "node-offline";
126
+ "node-inference-unavailable": "node-inference-unavailable";
127
+ "detection-blind": "detection-blind";
124
128
  "addon-update-available": "addon-update-available";
125
129
  "server-update-available": "server-update-available";
126
130
  "alarm-triggered": "alarm-triggered";
@@ -520,6 +524,8 @@ export declare const NcConditionsSchema: z.ZodObject<{
520
524
  "stream-offline": "stream-offline";
521
525
  "node-online": "node-online";
522
526
  "node-offline": "node-offline";
527
+ "node-inference-unavailable": "node-inference-unavailable";
528
+ "detection-blind": "detection-blind";
523
529
  "addon-update-available": "addon-update-available";
524
530
  "server-update-available": "server-update-available";
525
531
  "alarm-triggered": "alarm-triggered";
@@ -787,6 +793,8 @@ export declare const NcRuleInputSchema: z.ZodObject<{
787
793
  "stream-offline": "stream-offline";
788
794
  "node-online": "node-online";
789
795
  "node-offline": "node-offline";
796
+ "node-inference-unavailable": "node-inference-unavailable";
797
+ "detection-blind": "detection-blind";
790
798
  "addon-update-available": "addon-update-available";
791
799
  "server-update-available": "server-update-available";
792
800
  "alarm-triggered": "alarm-triggered";
@@ -952,6 +960,7 @@ export declare const NcRuleInputSchema: z.ZodObject<{
952
960
  maxImagePx: z.ZodDefault<z.ZodNumber>;
953
961
  }, z.core.$strip>>;
954
962
  waitForEnhancement: z.ZodOptional<z.ZodBoolean>;
963
+ groupIdleSec: z.ZodOptional<z.ZodNumber>;
955
964
  }, z.core.$strip>;
956
965
  export type NcRuleInput = z.infer<typeof NcRuleInputSchema>;
957
966
  /**
@@ -1058,6 +1067,7 @@ export declare const NcRulePatchSchema: z.ZodObject<{
1058
1067
  maxImagePx: z.ZodDefault<z.ZodNumber>;
1059
1068
  }, z.core.$strip>>>;
1060
1069
  waitForEnhancement: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
1070
+ groupIdleSec: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
1061
1071
  disabledTargetIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
1062
1072
  enabled: z.ZodOptional<z.ZodBoolean>;
1063
1073
  conditions: z.ZodOptional<z.ZodObject<{
@@ -1116,6 +1126,8 @@ export declare const NcRulePatchSchema: z.ZodObject<{
1116
1126
  "stream-offline": "stream-offline";
1117
1127
  "node-online": "node-online";
1118
1128
  "node-offline": "node-offline";
1129
+ "node-inference-unavailable": "node-inference-unavailable";
1130
+ "detection-blind": "detection-blind";
1119
1131
  "addon-update-available": "addon-update-available";
1120
1132
  "server-update-available": "server-update-available";
1121
1133
  "alarm-triggered": "alarm-triggered";
@@ -1264,6 +1276,8 @@ export declare const NcRuleSchema: z.ZodObject<{
1264
1276
  "stream-offline": "stream-offline";
1265
1277
  "node-online": "node-online";
1266
1278
  "node-offline": "node-offline";
1279
+ "node-inference-unavailable": "node-inference-unavailable";
1280
+ "detection-blind": "detection-blind";
1267
1281
  "addon-update-available": "addon-update-available";
1268
1282
  "server-update-available": "server-update-available";
1269
1283
  "alarm-triggered": "alarm-triggered";
@@ -1429,6 +1443,7 @@ export declare const NcRuleSchema: z.ZodObject<{
1429
1443
  maxImagePx: z.ZodDefault<z.ZodNumber>;
1430
1444
  }, z.core.$strip>>;
1431
1445
  waitForEnhancement: z.ZodOptional<z.ZodBoolean>;
1446
+ groupIdleSec: z.ZodOptional<z.ZodNumber>;
1432
1447
  id: z.ZodString;
1433
1448
  createdBy: z.ZodString;
1434
1449
  createdAt: z.ZodNumber;
@@ -1561,6 +1576,8 @@ export declare const NcHistorySubjectSchema: z.ZodObject<{
1561
1576
  "stream-offline": "stream-offline";
1562
1577
  "node-online": "node-online";
1563
1578
  "node-offline": "node-offline";
1579
+ "node-inference-unavailable": "node-inference-unavailable";
1580
+ "detection-blind": "detection-blind";
1564
1581
  "addon-update-available": "addon-update-available";
1565
1582
  "server-update-available": "server-update-available";
1566
1583
  "alarm-triggered": "alarm-triggered";
@@ -1638,6 +1655,8 @@ export declare const NcHistoryEntrySchema: z.ZodObject<{
1638
1655
  "stream-offline": "stream-offline";
1639
1656
  "node-online": "node-online";
1640
1657
  "node-offline": "node-offline";
1658
+ "node-inference-unavailable": "node-inference-unavailable";
1659
+ "detection-blind": "detection-blind";
1641
1660
  "addon-update-available": "addon-update-available";
1642
1661
  "server-update-available": "server-update-available";
1643
1662
  "alarm-triggered": "alarm-triggered";
@@ -1922,6 +1941,8 @@ export declare const notificationRulesCapability: {
1922
1941
  "stream-offline": "stream-offline";
1923
1942
  "node-online": "node-online";
1924
1943
  "node-offline": "node-offline";
1944
+ "node-inference-unavailable": "node-inference-unavailable";
1945
+ "detection-blind": "detection-blind";
1925
1946
  "addon-update-available": "addon-update-available";
1926
1947
  "server-update-available": "server-update-available";
1927
1948
  "alarm-triggered": "alarm-triggered";
@@ -2087,6 +2108,7 @@ export declare const notificationRulesCapability: {
2087
2108
  maxImagePx: z.ZodDefault<z.ZodNumber>;
2088
2109
  }, z.core.$strip>>;
2089
2110
  waitForEnhancement: z.ZodOptional<z.ZodBoolean>;
2111
+ groupIdleSec: z.ZodOptional<z.ZodNumber>;
2090
2112
  id: z.ZodString;
2091
2113
  createdBy: z.ZodString;
2092
2114
  createdAt: z.ZodNumber;
@@ -2163,6 +2185,8 @@ export declare const notificationRulesCapability: {
2163
2185
  "stream-offline": "stream-offline";
2164
2186
  "node-online": "node-online";
2165
2187
  "node-offline": "node-offline";
2188
+ "node-inference-unavailable": "node-inference-unavailable";
2189
+ "detection-blind": "detection-blind";
2166
2190
  "addon-update-available": "addon-update-available";
2167
2191
  "server-update-available": "server-update-available";
2168
2192
  "alarm-triggered": "alarm-triggered";
@@ -2328,6 +2352,7 @@ export declare const notificationRulesCapability: {
2328
2352
  maxImagePx: z.ZodDefault<z.ZodNumber>;
2329
2353
  }, z.core.$strip>>;
2330
2354
  waitForEnhancement: z.ZodOptional<z.ZodBoolean>;
2355
+ groupIdleSec: z.ZodOptional<z.ZodNumber>;
2331
2356
  id: z.ZodString;
2332
2357
  createdBy: z.ZodString;
2333
2358
  createdAt: z.ZodNumber;
@@ -2402,6 +2427,8 @@ export declare const notificationRulesCapability: {
2402
2427
  "stream-offline": "stream-offline";
2403
2428
  "node-online": "node-online";
2404
2429
  "node-offline": "node-offline";
2430
+ "node-inference-unavailable": "node-inference-unavailable";
2431
+ "detection-blind": "detection-blind";
2405
2432
  "addon-update-available": "addon-update-available";
2406
2433
  "server-update-available": "server-update-available";
2407
2434
  "alarm-triggered": "alarm-triggered";
@@ -2567,6 +2594,7 @@ export declare const notificationRulesCapability: {
2567
2594
  maxImagePx: z.ZodDefault<z.ZodNumber>;
2568
2595
  }, z.core.$strip>>;
2569
2596
  waitForEnhancement: z.ZodOptional<z.ZodBoolean>;
2597
+ groupIdleSec: z.ZodOptional<z.ZodNumber>;
2570
2598
  }, z.core.$strip>;
2571
2599
  }, z.core.$strip>, z.ZodObject<{
2572
2600
  rule: z.ZodObject<{
@@ -2635,6 +2663,8 @@ export declare const notificationRulesCapability: {
2635
2663
  "stream-offline": "stream-offline";
2636
2664
  "node-online": "node-online";
2637
2665
  "node-offline": "node-offline";
2666
+ "node-inference-unavailable": "node-inference-unavailable";
2667
+ "detection-blind": "detection-blind";
2638
2668
  "addon-update-available": "addon-update-available";
2639
2669
  "server-update-available": "server-update-available";
2640
2670
  "alarm-triggered": "alarm-triggered";
@@ -2800,6 +2830,7 @@ export declare const notificationRulesCapability: {
2800
2830
  maxImagePx: z.ZodDefault<z.ZodNumber>;
2801
2831
  }, z.core.$strip>>;
2802
2832
  waitForEnhancement: z.ZodOptional<z.ZodBoolean>;
2833
+ groupIdleSec: z.ZodOptional<z.ZodNumber>;
2803
2834
  id: z.ZodString;
2804
2835
  createdBy: z.ZodString;
2805
2836
  createdAt: z.ZodNumber;
@@ -2906,6 +2937,7 @@ export declare const notificationRulesCapability: {
2906
2937
  maxImagePx: z.ZodDefault<z.ZodNumber>;
2907
2938
  }, z.core.$strip>>>;
2908
2939
  waitForEnhancement: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
2940
+ groupIdleSec: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
2909
2941
  disabledTargetIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
2910
2942
  enabled: z.ZodOptional<z.ZodBoolean>;
2911
2943
  conditions: z.ZodOptional<z.ZodObject<{
@@ -2964,6 +2996,8 @@ export declare const notificationRulesCapability: {
2964
2996
  "stream-offline": "stream-offline";
2965
2997
  "node-online": "node-online";
2966
2998
  "node-offline": "node-offline";
2999
+ "node-inference-unavailable": "node-inference-unavailable";
3000
+ "detection-blind": "detection-blind";
2967
3001
  "addon-update-available": "addon-update-available";
2968
3002
  "server-update-available": "server-update-available";
2969
3003
  "alarm-triggered": "alarm-triggered";
@@ -3111,6 +3145,8 @@ export declare const notificationRulesCapability: {
3111
3145
  "stream-offline": "stream-offline";
3112
3146
  "node-online": "node-online";
3113
3147
  "node-offline": "node-offline";
3148
+ "node-inference-unavailable": "node-inference-unavailable";
3149
+ "detection-blind": "detection-blind";
3114
3150
  "addon-update-available": "addon-update-available";
3115
3151
  "server-update-available": "server-update-available";
3116
3152
  "alarm-triggered": "alarm-triggered";
@@ -3276,6 +3312,7 @@ export declare const notificationRulesCapability: {
3276
3312
  maxImagePx: z.ZodDefault<z.ZodNumber>;
3277
3313
  }, z.core.$strip>>;
3278
3314
  waitForEnhancement: z.ZodOptional<z.ZodBoolean>;
3315
+ groupIdleSec: z.ZodOptional<z.ZodNumber>;
3279
3316
  id: z.ZodString;
3280
3317
  createdBy: z.ZodString;
3281
3318
  createdAt: z.ZodNumber;
@@ -3398,6 +3435,8 @@ export declare const notificationRulesCapability: {
3398
3435
  "stream-offline": "stream-offline";
3399
3436
  "node-online": "node-online";
3400
3437
  "node-offline": "node-offline";
3438
+ "node-inference-unavailable": "node-inference-unavailable";
3439
+ "detection-blind": "detection-blind";
3401
3440
  "addon-update-available": "addon-update-available";
3402
3441
  "server-update-available": "server-update-available";
3403
3442
  "alarm-triggered": "alarm-triggered";
@@ -3563,6 +3602,7 @@ export declare const notificationRulesCapability: {
3563
3602
  maxImagePx: z.ZodDefault<z.ZodNumber>;
3564
3603
  }, z.core.$strip>>;
3565
3604
  waitForEnhancement: z.ZodOptional<z.ZodBoolean>;
3605
+ groupIdleSec: z.ZodOptional<z.ZodNumber>;
3566
3606
  }, z.core.$strip>;
3567
3607
  lookbackMinutes: z.ZodDefault<z.ZodNumber>;
3568
3608
  }, z.core.$strip>, z.ZodObject<{
@@ -3740,6 +3780,8 @@ export declare const notificationRulesCapability: {
3740
3780
  "stream-offline": "stream-offline";
3741
3781
  "node-online": "node-online";
3742
3782
  "node-offline": "node-offline";
3783
+ "node-inference-unavailable": "node-inference-unavailable";
3784
+ "detection-blind": "detection-blind";
3743
3785
  "addon-update-available": "addon-update-available";
3744
3786
  "server-update-available": "server-update-available";
3745
3787
  "alarm-triggered": "alarm-triggered";
@@ -144,6 +144,8 @@ export declare const OsdSlotBindingSchema: z.ZodObject<{
144
144
  "stream-offline": "stream-offline";
145
145
  "node-online": "node-online";
146
146
  "node-offline": "node-offline";
147
+ "node-inference-unavailable": "node-inference-unavailable";
148
+ "detection-blind": "detection-blind";
147
149
  "addon-update-available": "addon-update-available";
148
150
  "server-update-available": "server-update-available";
149
151
  "alarm-triggered": "alarm-triggered";
@@ -292,6 +294,8 @@ export declare const OsdSlotViewSchema: z.ZodObject<{
292
294
  "stream-offline": "stream-offline";
293
295
  "node-online": "node-online";
294
296
  "node-offline": "node-offline";
297
+ "node-inference-unavailable": "node-inference-unavailable";
298
+ "detection-blind": "detection-blind";
295
299
  "addon-update-available": "addon-update-available";
296
300
  "server-update-available": "server-update-available";
297
301
  "alarm-triggered": "alarm-triggered";
@@ -512,6 +516,8 @@ export declare const osdManagerCapability: {
512
516
  "stream-offline": "stream-offline";
513
517
  "node-online": "node-online";
514
518
  "node-offline": "node-offline";
519
+ "node-inference-unavailable": "node-inference-unavailable";
520
+ "detection-blind": "detection-blind";
515
521
  "addon-update-available": "addon-update-available";
516
522
  "server-update-available": "server-update-available";
517
523
  "alarm-triggered": "alarm-triggered";
@@ -748,6 +754,8 @@ export declare const osdManagerCapability: {
748
754
  "stream-offline": "stream-offline";
749
755
  "node-online": "node-online";
750
756
  "node-offline": "node-offline";
757
+ "node-inference-unavailable": "node-inference-unavailable";
758
+ "detection-blind": "detection-blind";
751
759
  "addon-update-available": "addon-update-available";
752
760
  "server-update-available": "server-update-available";
753
761
  "alarm-triggered": "alarm-triggered";
@@ -895,6 +903,8 @@ export declare const osdManagerCapability: {
895
903
  "stream-offline": "stream-offline";
896
904
  "node-online": "node-online";
897
905
  "node-offline": "node-offline";
906
+ "node-inference-unavailable": "node-inference-unavailable";
907
+ "detection-blind": "detection-blind";
898
908
  "addon-update-available": "addon-update-available";
899
909
  "server-update-available": "server-update-available";
900
910
  "alarm-triggered": "alarm-triggered";
@@ -1074,6 +1084,8 @@ export declare const osdManagerCapability: {
1074
1084
  "stream-offline": "stream-offline";
1075
1085
  "node-online": "node-online";
1076
1086
  "node-offline": "node-offline";
1087
+ "node-inference-unavailable": "node-inference-unavailable";
1088
+ "detection-blind": "detection-blind";
1077
1089
  "addon-update-available": "addon-update-available";
1078
1090
  "server-update-available": "server-update-available";
1079
1091
  "alarm-triggered": "alarm-triggered";
@@ -202,7 +202,7 @@ export type TrackEnvelope = z.infer<typeof TrackEnvelopeSchema>;
202
202
  * `snapshots[]` references — megabytes across a page of tracks. `slim`
203
203
  * keeps every scalar the list surfaces actually render (ids, class(es),
204
204
  * label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
205
- * zonesVisited, bestEventId, envelope, hasFace) and returns `positions` /
205
+ * zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
206
206
  * `snapshots` as EMPTY arrays — detail views re-fetch the full row via
207
207
  * `getTrack`. Mirrors the event-store `projection` convention
208
208
  * (`getObjectEvents` et al.).
@@ -432,6 +432,7 @@ declare const TrackSchema: z.ZodObject<{
432
432
  maxY: z.ZodNumber;
433
433
  }, z.core.$strip>>;
434
434
  hasFace: z.ZodOptional<z.ZodBoolean>;
435
+ hasRider: z.ZodOptional<z.ZodBoolean>;
435
436
  label: z.ZodOptional<z.ZodString>;
436
437
  labelScore: z.ZodOptional<z.ZodNumber>;
437
438
  labelMeta: z.ZodOptional<z.ZodObject<{
@@ -1081,6 +1082,7 @@ declare const RecentTracksPageSchema: z.ZodObject<{
1081
1082
  maxY: z.ZodNumber;
1082
1083
  }, z.core.$strip>>;
1083
1084
  hasFace: z.ZodOptional<z.ZodBoolean>;
1085
+ hasRider: z.ZodOptional<z.ZodBoolean>;
1084
1086
  label: z.ZodOptional<z.ZodString>;
1085
1087
  labelScore: z.ZodOptional<z.ZodNumber>;
1086
1088
  labelMeta: z.ZodOptional<z.ZodObject<{
@@ -1332,6 +1334,7 @@ export declare const pipelineAnalyticsCapability: {
1332
1334
  maxY: z.ZodNumber;
1333
1335
  }, z.core.$strip>>;
1334
1336
  hasFace: z.ZodOptional<z.ZodBoolean>;
1337
+ hasRider: z.ZodOptional<z.ZodBoolean>;
1335
1338
  label: z.ZodOptional<z.ZodString>;
1336
1339
  labelScore: z.ZodOptional<z.ZodNumber>;
1337
1340
  labelMeta: z.ZodOptional<z.ZodObject<{
@@ -1426,6 +1429,7 @@ export declare const pipelineAnalyticsCapability: {
1426
1429
  maxY: z.ZodNumber;
1427
1430
  }, z.core.$strip>>;
1428
1431
  hasFace: z.ZodOptional<z.ZodBoolean>;
1432
+ hasRider: z.ZodOptional<z.ZodBoolean>;
1429
1433
  label: z.ZodOptional<z.ZodString>;
1430
1434
  labelScore: z.ZodOptional<z.ZodNumber>;
1431
1435
  labelMeta: z.ZodOptional<z.ZodObject<{
@@ -1542,6 +1546,7 @@ export declare const pipelineAnalyticsCapability: {
1542
1546
  maxY: z.ZodNumber;
1543
1547
  }, z.core.$strip>>;
1544
1548
  hasFace: z.ZodOptional<z.ZodBoolean>;
1549
+ hasRider: z.ZodOptional<z.ZodBoolean>;
1545
1550
  label: z.ZodOptional<z.ZodString>;
1546
1551
  labelScore: z.ZodOptional<z.ZodNumber>;
1547
1552
  labelMeta: z.ZodOptional<z.ZodObject<{
@@ -1654,6 +1659,7 @@ export declare const pipelineAnalyticsCapability: {
1654
1659
  maxY: z.ZodNumber;
1655
1660
  }, z.core.$strip>>;
1656
1661
  hasFace: z.ZodOptional<z.ZodBoolean>;
1662
+ hasRider: z.ZodOptional<z.ZodBoolean>;
1657
1663
  label: z.ZodOptional<z.ZodString>;
1658
1664
  labelScore: z.ZodOptional<z.ZodNumber>;
1659
1665
  labelMeta: z.ZodOptional<z.ZodObject<{
@@ -203,6 +203,33 @@ export declare enum EventCategory {
203
203
  */
204
204
  PipelineCameraAssigned = "pipeline.camera-assigned",
205
205
  PipelineCameraUnassigned = "pipeline.camera-unassigned",
206
+ /**
207
+ * A node the orchestrator would otherwise place cameras on has NO usable
208
+ * inference device: the operator enabled one or more accelerators there and
209
+ * the live probe reports every one of them unavailable. Emitted once per
210
+ * TRANSITION into that state (never per dispatch), and the node is dropped
211
+ * from the placement candidate set for as long as it holds.
212
+ *
213
+ * This exists because the state was previously invisible: little-unraid
214
+ * absorbed 283k inference errors in a day while still being handed cameras,
215
+ * and nothing in the system said so.
216
+ *
217
+ * A node with no accelerators configured at all is NOT this — its devices
218
+ * are `disabled`, not `unavailable`, and the runner's default CPU pool
219
+ * serves it exactly as before.
220
+ */
221
+ PipelineNodeInferenceUnavailable = "pipeline.node-inference-unavailable",
222
+ /**
223
+ * A camera has an OPEN detection session and has produced no detection at
224
+ * all for longer than the blind threshold — the camera is being decoded and
225
+ * inferred and is returning nothing. Emitted once per transition into blind,
226
+ * per camera.
227
+ *
228
+ * The failure it reports: a 1h43 detection blackout on the entrance camera
229
+ * that nobody noticed, because "a camera that detects nothing" and "a quiet
230
+ * camera" produce byte-identical silence.
231
+ */
232
+ PipelineDetectionBlind = "pipeline.detection-blind",
206
233
  /**
207
234
  * Per-camera pipeline config was mutated by the orchestrator
208
235
  * (3-level settings change via `setAgentAddonDefaults` /
package/dist/enums.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_event_category = require("./event-category-DxZbWydC.js");
2
+ const require_event_category = require("./event-category-D3gG7oil.js");
3
3
  //#region src/enums/event-source-type.ts
4
4
  var EventSourceType = /* @__PURE__ */ function(EventSourceType) {
5
5
  EventSourceType["Addon"] = "addon";
package/dist/enums.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { t as EventCategory } from "./event-category-Cv9dO26A.mjs";
1
+ import { t as EventCategory } from "./event-category-Bxo5yJjt.mjs";
2
2
  //#region src/enums/event-source-type.ts
3
3
  var EventSourceType = /* @__PURE__ */ function(EventSourceType) {
4
4
  EventSourceType["Addon"] = "addon";
@@ -205,6 +205,33 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
205
205
  EventCategory["PipelineCameraAssigned"] = "pipeline.camera-assigned";
206
206
  EventCategory["PipelineCameraUnassigned"] = "pipeline.camera-unassigned";
207
207
  /**
208
+ * A node the orchestrator would otherwise place cameras on has NO usable
209
+ * inference device: the operator enabled one or more accelerators there and
210
+ * the live probe reports every one of them unavailable. Emitted once per
211
+ * TRANSITION into that state (never per dispatch), and the node is dropped
212
+ * from the placement candidate set for as long as it holds.
213
+ *
214
+ * This exists because the state was previously invisible: little-unraid
215
+ * absorbed 283k inference errors in a day while still being handed cameras,
216
+ * and nothing in the system said so.
217
+ *
218
+ * A node with no accelerators configured at all is NOT this — its devices
219
+ * are `disabled`, not `unavailable`, and the runner's default CPU pool
220
+ * serves it exactly as before.
221
+ */
222
+ EventCategory["PipelineNodeInferenceUnavailable"] = "pipeline.node-inference-unavailable";
223
+ /**
224
+ * A camera has an OPEN detection session and has produced no detection at
225
+ * all for longer than the blind threshold — the camera is being decoded and
226
+ * inferred and is returning nothing. Emitted once per transition into blind,
227
+ * per camera.
228
+ *
229
+ * The failure it reports: a 1h43 detection blackout on the entrance camera
230
+ * that nobody noticed, because "a camera that detects nothing" and "a quiet
231
+ * camera" produce byte-identical silence.
232
+ */
233
+ EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
234
+ /**
208
235
  * Per-camera pipeline config was mutated by the orchestrator
209
236
  * (3-level settings change via `setAgentAddonDefaults` /
210
237
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -205,6 +205,33 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
205
205
  EventCategory["PipelineCameraAssigned"] = "pipeline.camera-assigned";
206
206
  EventCategory["PipelineCameraUnassigned"] = "pipeline.camera-unassigned";
207
207
  /**
208
+ * A node the orchestrator would otherwise place cameras on has NO usable
209
+ * inference device: the operator enabled one or more accelerators there and
210
+ * the live probe reports every one of them unavailable. Emitted once per
211
+ * TRANSITION into that state (never per dispatch), and the node is dropped
212
+ * from the placement candidate set for as long as it holds.
213
+ *
214
+ * This exists because the state was previously invisible: little-unraid
215
+ * absorbed 283k inference errors in a day while still being handed cameras,
216
+ * and nothing in the system said so.
217
+ *
218
+ * A node with no accelerators configured at all is NOT this — its devices
219
+ * are `disabled`, not `unavailable`, and the runner's default CPU pool
220
+ * serves it exactly as before.
221
+ */
222
+ EventCategory["PipelineNodeInferenceUnavailable"] = "pipeline.node-inference-unavailable";
223
+ /**
224
+ * A camera has an OPEN detection session and has produced no detection at
225
+ * all for longer than the blind threshold — the camera is being decoded and
226
+ * inferred and is returning nothing. Emitted once per transition into blind,
227
+ * per camera.
228
+ *
229
+ * The failure it reports: a 1h43 detection blackout on the entrance camera
230
+ * that nobody noticed, because "a camera that detects nothing" and "a quiet
231
+ * camera" produce byte-identical silence.
232
+ */
233
+ EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
234
+ /**
208
235
  * Per-camera pipeline config was mutated by the orchestrator
209
236
  * (3-level settings change via `setAgentAddonDefaults` /
210
237
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_event_category = require("./event-category-DxZbWydC.js");
3
- const require_sleep = require("./sleep-YuacOD41.js");
2
+ const require_event_category = require("./event-category-D3gG7oil.js");
3
+ const require_sleep = require("./sleep-DbVrpKVz.js");
4
4
  const require_canonical_hash = require("./canonical-hash-DNV8S5ET.js");
5
5
  const require_enums = require("./enums.js");
6
6
  const require_err_msg = require("./err-msg-COpsHMw2.js");
@@ -11958,6 +11958,8 @@ var NcSystemEventKindSchema = zod.z.enum([
11958
11958
  "stream-offline",
11959
11959
  "node-online",
11960
11960
  "node-offline",
11961
+ "node-inference-unavailable",
11962
+ "detection-blind",
11961
11963
  "addon-update-available",
11962
11964
  "server-update-available",
11963
11965
  "alarm-triggered",
@@ -12802,7 +12804,50 @@ var NcRuleInputSchema = zod.z.object({
12802
12804
  * tests every zone the track visited and a `crossing` condition can no longer
12803
12805
  * be satisfied, because a closed track carries no crossing.
12804
12806
  */
12805
- waitForEnhancement: zod.z.boolean().optional()
12807
+ waitForEnhancement: zod.z.boolean().optional(),
12808
+ /**
12809
+ * GROUP a burst of subjects into ONE notification that grows.
12810
+ *
12811
+ * Seconds of quiet after the last matching subject before the burst is
12812
+ * considered over. While it is open, the first subject enqueues immediately —
12813
+ * **exactly as today, with no added latency** — and every real growth (a new
12814
+ * subject, or a name confirmed on one already in it) REPLACES that
12815
+ * notification with an updated one naming everybody. The push carries the
12816
+ * group's own coalescing tag, so the phone replaces rather than stacks.
12817
+ *
12818
+ * `0` / absent = off, and off is today's behaviour byte for byte.
12819
+ *
12820
+ * ### Why an idle cutoff and not a window
12821
+ *
12822
+ * The measured seven-person arrival on device 590 spans 110 s with every
12823
+ * internal gap under 30 s. A 12 s fixed window cuts it into three groups; an
12824
+ * idle cutoff holds it as one and ends it when the arrival actually ends.
12825
+ * 30 is Frigate's shipped value for the same decision.
12826
+ *
12827
+ * ### What it replaces
12828
+ *
12829
+ * The blind cooldown, which collapses a burst by DISCARDING it. Measured on
12830
+ * device 615 / *Persona su Uscio* over six days: 116 qualifying tracks → 74
12831
+ * notifications, **44 (37.9%) suppressed outright**, 23 of them overlapping a
12832
+ * track that did fire and 7 carrying a confirmed identity nobody heard about.
12833
+ * A group collapses the same volume by MERGING, so the cooldown becomes a
12834
+ * budget over GROUPS — which is what it always meant — and a growth is never
12835
+ * throttled by the window its own first member spent.
12836
+ *
12837
+ * ### Interaction with {@link waitForEnhancement}
12838
+ *
12839
+ * They compose, and the order matters. `waitForEnhancement` defers the rule to
12840
+ * TRACK CLOSE, so with both set the group is opened by the first member to
12841
+ * CLOSE — already carrying its name — and grows as later members close. That
12842
+ * is later, and complete. With grouping alone the group opens on the first
12843
+ * object event and picks up names as they are confirmed, through the growth
12844
+ * path. Neither combination fires twice for one subject.
12845
+ *
12846
+ * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
12847
+ * on the addon cap path, so absent must keep meaning what it meant before this
12848
+ * field existed.
12849
+ */
12850
+ groupIdleSec: zod.z.number().int().min(0).max(600).optional()
12806
12851
  });
12807
12852
  /**
12808
12853
  * Partial patch for `updateRule` — any subset of the input fields, plus the
@@ -12989,6 +13034,14 @@ var NC_CONDITION_CATALOG = [
12989
13034
  value: "node-offline",
12990
13035
  label: "Node offline"
12991
13036
  },
13037
+ {
13038
+ value: "node-inference-unavailable",
13039
+ label: "Node has no usable inference device"
13040
+ },
13041
+ {
13042
+ value: "detection-blind",
13043
+ label: "Camera detecting nothing"
13044
+ },
12992
13045
  {
12993
13046
  value: "addon-update-available",
12994
13047
  label: "Addon update available"
@@ -14250,7 +14303,7 @@ var TrackEnvelopeSchema = zod.z.object({
14250
14303
  * `snapshots[]` references — megabytes across a page of tracks. `slim`
14251
14304
  * keeps every scalar the list surfaces actually render (ids, class(es),
14252
14305
  * label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
14253
- * zonesVisited, bestEventId, envelope, hasFace) and returns `positions` /
14306
+ * zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
14254
14307
  * `snapshots` as EMPTY arrays — detail views re-fetch the full row via
14255
14308
  * `getTrack`. Mirrors the event-store `projection` convention
14256
14309
  * (`getObjectEvents` et al.).
@@ -14553,6 +14606,28 @@ var TrackSchema = zod.z.object({
14553
14606
  * `=== true` and render nothing otherwise, never infer "no face".
14554
14607
  */
14555
14608
  hasFace: zod.z.boolean().optional(),
14609
+ /**
14610
+ * This subject CONTAINS a folded rider — a person the rider-pairing step
14611
+ * ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
14612
+ * so the passage is tracked once and as a VEHICLE.
14613
+ *
14614
+ * It exists because the fold's record was dishonest. D34 and the code both
14615
+ * said "the person is not lost — it is reported so both entities stay on the
14616
+ * record"; in fact the pair went into a per-processor RAM field behind an
14617
+ * accessor nobody called, and every durable surface said `vehicle`, full
14618
+ * stop. This is the composition note that makes the row true.
14619
+ *
14620
+ * A COMPOSITION, never a class and never a label. "This vehicle contains a
14621
+ * person" is not an answer to "what is this" — both label tiers would refuse
14622
+ * a macro token anyway (D89), and correctly. Nothing here changes what the
14623
+ * subject IS: a cyclist stays one vehicle track, occupancy still counts one,
14624
+ * and a `person` rule still does not fire for someone cycling past.
14625
+ *
14626
+ * **Absent ≠ false**, exactly like {@link hasFace}: every row written before
14627
+ * the column, and every hub that predates the field, omits it. Test
14628
+ * `=== true` and render nothing otherwise — never infer "no rider".
14629
+ */
14630
+ hasRider: zod.z.boolean().optional(),
14556
14631
  ...TrackFlagFields,
14557
14632
  ...TrackRetrainFields
14558
14633
  });
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { t as EventCategory } from "./event-category-Cv9dO26A.mjs";
2
- import { $ as FrameHandleFormatSchema, A as isDeviceConfigCap, B as emitDownForOwnedCaps, C as DeviceType, Ct as WELL_KNOWN_TAB_MAP, D as DEVICE_STATUS_METHOD, Dt as resolveHydratedFieldValue, E as DEVICE_SETTINGS_CONTRIBUTION_METHODS, Et as hydrateSchema, F as nodePin, G as CAM_PROFILE_ORDER, H as scopeKey, I as readNodePin, J as CamStreamResolutionSchema, K as CamProfileSchema, L as toNodeId, M as resolveCapMount, N as systemMethod, O as event, P as CAP_NODE_PIN_CONTEXT_KEY, Q as EncodedPacketSchema, R as ReadinessRegistry, S as DeviceRole, St as WELL_KNOWN_TABS, T as DEFAULT_RUNTIME_STATE_DURABILITY, Tt as collectHydratedFieldValues, U as BrokerStatsSchema, V as readinessKey, W as BrokerStatusSchema, X as DecodedAudioChunkSchema, Y as CameraStreamSchema, Z as DecodedFrameSchema, _ as RawStateResultSchema, _t as normalizeAddonInitResult, a as asJsonObject, at as StreamSourceSchema, b as ChargingStatus, bt as emitReadiness, c as parseJsonArray, ct as SubscribeFramesInputSchema, d as DEVICE_SCOPED_CAPS, dt as makeSourceBrokerId, et as FrameHandleSchema, f as isDeviceScopedCap, ft as parseProfileBrokerId, g as createSliceHandle, gt as BaseAddon, h as createMirrorSource, ht as DisposerChain, i as asJsonArray, it as StreamSourceEntrySchema, j as method, k as expandCapMethods, l as parseJsonObject, lt as SubscribeFramesResultSchema, m as createLazyTrpcSource, mt as DATAPLANE_SECRET_HEADER, n as sleepCancellable, nt as ProfileSlotSchema, o as asNumber, ot as SubscribeAudioChunksInputSchema, p as createDeviceProxy, pt as selectAssignedProfileSlots, q as CamStreamKindSchema, r as asBoolean, rt as ProfileSlotStatusSchema, s as asString, st as SubscribeAudioChunksResultSchema, t as sleep, tt as ProfileRtspEntrySchema, u as parseJsonUnknown, ut as makeProfileBrokerId, v as deviceOpsCapability, vt as createDurableState, w as adminUiCapability, wt as collectHydratedFieldEntries, x as DeviceFeature, xt as isEvent, y as viewerUiCapability, yt as createEvent, z as ReadinessTimeoutError } from "./sleep-CwERnGrD.mjs";
1
+ import { t as EventCategory } from "./event-category-Bxo5yJjt.mjs";
2
+ import { $ as FrameHandleFormatSchema, A as isDeviceConfigCap, B as emitDownForOwnedCaps, C as DeviceType, Ct as WELL_KNOWN_TAB_MAP, D as DEVICE_STATUS_METHOD, Dt as resolveHydratedFieldValue, E as DEVICE_SETTINGS_CONTRIBUTION_METHODS, Et as hydrateSchema, F as nodePin, G as CAM_PROFILE_ORDER, H as scopeKey, I as readNodePin, J as CamStreamResolutionSchema, K as CamProfileSchema, L as toNodeId, M as resolveCapMount, N as systemMethod, O as event, P as CAP_NODE_PIN_CONTEXT_KEY, Q as EncodedPacketSchema, R as ReadinessRegistry, S as DeviceRole, St as WELL_KNOWN_TABS, T as DEFAULT_RUNTIME_STATE_DURABILITY, Tt as collectHydratedFieldValues, U as BrokerStatsSchema, V as readinessKey, W as BrokerStatusSchema, X as DecodedAudioChunkSchema, Y as CameraStreamSchema, Z as DecodedFrameSchema, _ as RawStateResultSchema, _t as normalizeAddonInitResult, a as asJsonObject, at as StreamSourceSchema, b as ChargingStatus, bt as emitReadiness, c as parseJsonArray, ct as SubscribeFramesInputSchema, d as DEVICE_SCOPED_CAPS, dt as makeSourceBrokerId, et as FrameHandleSchema, f as isDeviceScopedCap, ft as parseProfileBrokerId, g as createSliceHandle, gt as BaseAddon, h as createMirrorSource, ht as DisposerChain, i as asJsonArray, it as StreamSourceEntrySchema, j as method, k as expandCapMethods, l as parseJsonObject, lt as SubscribeFramesResultSchema, m as createLazyTrpcSource, mt as DATAPLANE_SECRET_HEADER, n as sleepCancellable, nt as ProfileSlotSchema, o as asNumber, ot as SubscribeAudioChunksInputSchema, p as createDeviceProxy, pt as selectAssignedProfileSlots, q as CamStreamKindSchema, r as asBoolean, rt as ProfileSlotStatusSchema, s as asString, st as SubscribeAudioChunksResultSchema, t as sleep, tt as ProfileRtspEntrySchema, u as parseJsonUnknown, ut as makeProfileBrokerId, v as deviceOpsCapability, vt as createDurableState, w as adminUiCapability, wt as collectHydratedFieldEntries, x as DeviceFeature, xt as isEvent, y as viewerUiCapability, yt as createEvent, z as ReadinessTimeoutError } from "./sleep-CTgUmjYq.mjs";
3
3
  import { a as buildAudioArgs, c as buildVideoArgs, d as logBannerArgs, f as pickVideoEncoder, i as audioPlanFromEncodeProfile, l as invocationFromEncodeProfile, n as Fmp4BoxSplitter, o as buildFfmpegArgs, r as AUDIO_PRESETS, s as buildInputArgs, t as canonicalHash, u as isSoftwareDecode } from "./canonical-hash-rO1sRmEK.mjs";
4
4
  import { EventSourceType } from "./enums.mjs";
5
5
  import { t as errMsg } from "./err-msg-IQTHeDzc.mjs";
@@ -11957,6 +11957,8 @@ var NcSystemEventKindSchema = z.enum([
11957
11957
  "stream-offline",
11958
11958
  "node-online",
11959
11959
  "node-offline",
11960
+ "node-inference-unavailable",
11961
+ "detection-blind",
11960
11962
  "addon-update-available",
11961
11963
  "server-update-available",
11962
11964
  "alarm-triggered",
@@ -12801,7 +12803,50 @@ var NcRuleInputSchema = z.object({
12801
12803
  * tests every zone the track visited and a `crossing` condition can no longer
12802
12804
  * be satisfied, because a closed track carries no crossing.
12803
12805
  */
12804
- waitForEnhancement: z.boolean().optional()
12806
+ waitForEnhancement: z.boolean().optional(),
12807
+ /**
12808
+ * GROUP a burst of subjects into ONE notification that grows.
12809
+ *
12810
+ * Seconds of quiet after the last matching subject before the burst is
12811
+ * considered over. While it is open, the first subject enqueues immediately —
12812
+ * **exactly as today, with no added latency** — and every real growth (a new
12813
+ * subject, or a name confirmed on one already in it) REPLACES that
12814
+ * notification with an updated one naming everybody. The push carries the
12815
+ * group's own coalescing tag, so the phone replaces rather than stacks.
12816
+ *
12817
+ * `0` / absent = off, and off is today's behaviour byte for byte.
12818
+ *
12819
+ * ### Why an idle cutoff and not a window
12820
+ *
12821
+ * The measured seven-person arrival on device 590 spans 110 s with every
12822
+ * internal gap under 30 s. A 12 s fixed window cuts it into three groups; an
12823
+ * idle cutoff holds it as one and ends it when the arrival actually ends.
12824
+ * 30 is Frigate's shipped value for the same decision.
12825
+ *
12826
+ * ### What it replaces
12827
+ *
12828
+ * The blind cooldown, which collapses a burst by DISCARDING it. Measured on
12829
+ * device 615 / *Persona su Uscio* over six days: 116 qualifying tracks → 74
12830
+ * notifications, **44 (37.9%) suppressed outright**, 23 of them overlapping a
12831
+ * track that did fire and 7 carrying a confirmed identity nobody heard about.
12832
+ * A group collapses the same volume by MERGING, so the cooldown becomes a
12833
+ * budget over GROUPS — which is what it always meant — and a growth is never
12834
+ * throttled by the window its own first member spent.
12835
+ *
12836
+ * ### Interaction with {@link waitForEnhancement}
12837
+ *
12838
+ * They compose, and the order matters. `waitForEnhancement` defers the rule to
12839
+ * TRACK CLOSE, so with both set the group is opened by the first member to
12840
+ * CLOSE — already carrying its name — and grows as later members close. That
12841
+ * is later, and complete. With grouping alone the group opens on the first
12842
+ * object event and picks up names as they are confirmed, through the growth
12843
+ * path. Neither combination fires twice for one subject.
12844
+ *
12845
+ * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
12846
+ * on the addon cap path, so absent must keep meaning what it meant before this
12847
+ * field existed.
12848
+ */
12849
+ groupIdleSec: z.number().int().min(0).max(600).optional()
12805
12850
  });
12806
12851
  /**
12807
12852
  * Partial patch for `updateRule` — any subset of the input fields, plus the
@@ -12988,6 +13033,14 @@ var NC_CONDITION_CATALOG = [
12988
13033
  value: "node-offline",
12989
13034
  label: "Node offline"
12990
13035
  },
13036
+ {
13037
+ value: "node-inference-unavailable",
13038
+ label: "Node has no usable inference device"
13039
+ },
13040
+ {
13041
+ value: "detection-blind",
13042
+ label: "Camera detecting nothing"
13043
+ },
12991
13044
  {
12992
13045
  value: "addon-update-available",
12993
13046
  label: "Addon update available"
@@ -14249,7 +14302,7 @@ var TrackEnvelopeSchema = z.object({
14249
14302
  * `snapshots[]` references — megabytes across a page of tracks. `slim`
14250
14303
  * keeps every scalar the list surfaces actually render (ids, class(es),
14251
14304
  * label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
14252
- * zonesVisited, bestEventId, envelope, hasFace) and returns `positions` /
14305
+ * zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
14253
14306
  * `snapshots` as EMPTY arrays — detail views re-fetch the full row via
14254
14307
  * `getTrack`. Mirrors the event-store `projection` convention
14255
14308
  * (`getObjectEvents` et al.).
@@ -14552,6 +14605,28 @@ var TrackSchema = z.object({
14552
14605
  * `=== true` and render nothing otherwise, never infer "no face".
14553
14606
  */
14554
14607
  hasFace: z.boolean().optional(),
14608
+ /**
14609
+ * This subject CONTAINS a folded rider — a person the rider-pairing step
14610
+ * ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
14611
+ * so the passage is tracked once and as a VEHICLE.
14612
+ *
14613
+ * It exists because the fold's record was dishonest. D34 and the code both
14614
+ * said "the person is not lost — it is reported so both entities stay on the
14615
+ * record"; in fact the pair went into a per-processor RAM field behind an
14616
+ * accessor nobody called, and every durable surface said `vehicle`, full
14617
+ * stop. This is the composition note that makes the row true.
14618
+ *
14619
+ * A COMPOSITION, never a class and never a label. "This vehicle contains a
14620
+ * person" is not an answer to "what is this" — both label tiers would refuse
14621
+ * a macro token anyway (D89), and correctly. Nothing here changes what the
14622
+ * subject IS: a cyclist stays one vehicle track, occupancy still counts one,
14623
+ * and a `person` rule still does not fire for someone cycling past.
14624
+ *
14625
+ * **Absent ≠ false**, exactly like {@link hasFace}: every row written before
14626
+ * the column, and every hub that predates the field, omits it. Test
14627
+ * `=== true` and render nothing otherwise — never infer "no rider".
14628
+ */
14629
+ hasRider: z.boolean().optional(),
14555
14630
  ...TrackFlagFields,
14556
14631
  ...TrackRetrainFields
14557
14632
  });
@@ -890,6 +890,22 @@ export interface EventCatalog {
890
890
  'pipeline.camera-assigned': PipelineCameraAssignmentPayload;
891
891
  /** Camera released from an agent runner. */
892
892
  'pipeline.camera-unassigned': PipelineCameraAssignmentPayload;
893
+ /** A node whose every ENABLED inference device is unavailable — dropped from
894
+ * the placement candidate set until one comes back. */
895
+ 'pipeline.node-inference-unavailable': {
896
+ readonly nodeId: string;
897
+ /** The enabled device keys the live probe did not report. */
898
+ readonly unavailableDeviceKeys: readonly string[];
899
+ };
900
+ /** A camera with an open detection session that has detected nothing for
901
+ * longer than the blind threshold. */
902
+ 'pipeline.detection-blind': {
903
+ readonly deviceId: number;
904
+ /** How long it has been blind, in ms. */
905
+ readonly blindForMs: number;
906
+ /** The threshold that was crossed, in ms. */
907
+ readonly thresholdMs: number;
908
+ };
893
909
  /** Per-camera pipeline config changed — orchestrator hot-reloads the assigned runner. */
894
910
  'pipeline.camera-updated': {
895
911
  readonly deviceId: number;
@@ -1,4 +1,4 @@
1
- import { t as EventCategory } from "./event-category-Cv9dO26A.mjs";
1
+ import { t as EventCategory } from "./event-category-Bxo5yJjt.mjs";
2
2
  import { z } from "zod";
3
3
  //#region src/interfaces/config-ui.ts
4
4
  /** Predefined tabs with standard label, icon, and sort order.
@@ -1,4 +1,4 @@
1
- const require_event_category = require("./event-category-DxZbWydC.js");
1
+ const require_event_category = require("./event-category-D3gG7oil.js");
2
2
  let zod = require("zod");
3
3
  //#region src/interfaces/config-ui.ts
4
4
  /** Predefined tabs with standard label, icon, and sort order.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/types",
3
- "version": "1.2.70",
3
+ "version": "1.2.71",
4
4
  "description": "Shared types, interfaces, and model catalogs for the CamStack detection ecosystem",
5
5
  "keywords": [
6
6
  "camstack",