@camstack/types 1.2.41 → 1.2.42

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 (34) hide show
  1. package/dist/addon.js +1 -1
  2. package/dist/addon.mjs +1 -1
  3. package/dist/canonical-hash-7nfBbEqR.mjs +35 -0
  4. package/dist/canonical-hash-BcZHRHIx.js +40 -0
  5. package/dist/capabilities/index.d.ts +2 -2
  6. package/dist/capabilities/notification-rules.cap.d.ts +41 -0
  7. package/dist/capabilities/pipeline-analytics.cap.d.ts +92 -4
  8. package/dist/capabilities/pipeline-orchestrator.cap.d.ts +123 -0
  9. package/dist/capabilities/pipeline-runner.cap.d.ts +119 -1
  10. package/dist/capabilities/platform-probe.cap.d.ts +3 -3
  11. package/dist/capabilities/recording.cap.d.ts +3 -0
  12. package/dist/capabilities/stream-broker.cap.d.ts +300 -0
  13. package/dist/encode-profile.d.ts +2 -0
  14. package/dist/ffmpeg/encode-defaults.d.ts +89 -0
  15. package/dist/ffmpeg/hwaccel.d.ts +98 -0
  16. package/dist/ffmpeg/invocation.d.ts +250 -0
  17. package/dist/ffmpeg/process.d.ts +135 -0
  18. package/dist/ffmpeg/sharing-key.d.ts +39 -0
  19. package/dist/generated/addon-api.d.ts +60 -4
  20. package/dist/generated/device-proxy.d.ts +1 -1
  21. package/dist/generated/method-access-map.d.ts +1 -1
  22. package/dist/generated/system-proxy.d.ts +2 -2
  23. package/dist/index.d.ts +5 -0
  24. package/dist/index.js +1354 -20
  25. package/dist/index.mjs +1316 -21
  26. package/dist/interfaces/camera-switches.d.ts +217 -0
  27. package/dist/interfaces/ops-log.d.ts +4 -0
  28. package/dist/interfaces/pipeline-runner-capability.d.ts +9 -1
  29. package/dist/node.d.ts +2 -0
  30. package/dist/node.js +270 -36
  31. package/dist/node.mjs +269 -36
  32. package/dist/{sleep-CXimb854.mjs → sleep-BmNKsY7v.mjs} +5 -0
  33. package/dist/{sleep-DTce7-ch.js → sleep-Cvi1JxZp.js} +5 -0
  34. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_event_category = require("./event-category-BE4PDZ_3.js");
3
- const require_sleep = require("./sleep-DTce7-ch.js");
3
+ const require_sleep = require("./sleep-Cvi1JxZp.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
1
  import { t as EventCategory } from "./event-category-41fKf-q9.mjs";
2
- import { B as scopeKey, C as DeviceType, F as readNodePin, I as ReadinessRegistry, L as ReadinessTimeoutError, O as expandCapMethods, P as nodePin, a as asJsonObject, d as DEVICE_SCOPED_CAPS, f as isDeviceScopedCap, ft as DATAPLANE_SECRET_HEADER, ht as normalizeAddonInitResult, mt as BaseAddon, p as createDeviceProxy, pt as DisposerChain, s as asString, t as sleep, u as parseJsonUnknown, v as deviceOpsCapability, vt as emitReadiness, w as adminUiCapability, y as viewerUiCapability } from "./sleep-CXimb854.mjs";
2
+ import { B as scopeKey, C as DeviceType, F as readNodePin, I as ReadinessRegistry, L as ReadinessTimeoutError, O as expandCapMethods, P as nodePin, a as asJsonObject, d as DEVICE_SCOPED_CAPS, f as isDeviceScopedCap, ft as DATAPLANE_SECRET_HEADER, ht as normalizeAddonInitResult, mt as BaseAddon, p as createDeviceProxy, pt as DisposerChain, s as asString, t as sleep, u as parseJsonUnknown, v as deviceOpsCapability, vt as emitReadiness, w as adminUiCapability, y as viewerUiCapability } from "./sleep-BmNKsY7v.mjs";
3
3
  import { t as errMsg } from "./err-msg-IQTHeDzc.mjs";
4
4
  //#region src/generated/collection-array-methods.ts
5
5
  /**
@@ -0,0 +1,35 @@
1
+ import { createHash } from "node:crypto";
2
+ //#region src/utils/canonical-hash.ts
3
+ /**
4
+ * Deterministic SHA-256 hash of an arbitrary serialisable value. The
5
+ * canonical form sorts object keys alphabetically at every depth so two
6
+ * structurally-equal inputs with different key insertion orders produce
7
+ * the same hash. Returns a 64-char lowercase hex digest.
8
+ *
9
+ * Used by export adapters (Alexa, HAP) to short-circuit re-discovery /
10
+ * accessory-rebuild work when the upstream shape is byte-identical to
11
+ * the last applied state — preventing user-visible "re-discovery"
12
+ * notifications on every addon-runner respawn. Each respawn re-fires
13
+ * `DeviceBindingsChanged` for every cap registration, which without
14
+ * this guard would propagate redundant pushes.
15
+ *
16
+ * Note: this is a SYMPTOMATIC fix layered on top of the binding-change
17
+ * subscription. The proper fix is a single "device ready" lifecycle
18
+ * barrier so exports react only when the full cap set has landed —
19
+ * tracked separately for post-HA-integration work.
20
+ */
21
+ function canonicalHash(value) {
22
+ const canonical = JSON.stringify(value, replaceWithSortedKeys);
23
+ return createHash("sha256").update(canonical ?? "").digest("hex");
24
+ }
25
+ function replaceWithSortedKeys(_key, value) {
26
+ if (value && typeof value === "object" && !Array.isArray(value)) {
27
+ const obj = value;
28
+ const out = {};
29
+ for (const k of Object.keys(obj).toSorted()) out[k] = obj[k];
30
+ return out;
31
+ }
32
+ return value;
33
+ }
34
+ //#endregion
35
+ export { canonicalHash as t };
@@ -0,0 +1,40 @@
1
+ let node_crypto = require("node:crypto");
2
+ //#region src/utils/canonical-hash.ts
3
+ /**
4
+ * Deterministic SHA-256 hash of an arbitrary serialisable value. The
5
+ * canonical form sorts object keys alphabetically at every depth so two
6
+ * structurally-equal inputs with different key insertion orders produce
7
+ * the same hash. Returns a 64-char lowercase hex digest.
8
+ *
9
+ * Used by export adapters (Alexa, HAP) to short-circuit re-discovery /
10
+ * accessory-rebuild work when the upstream shape is byte-identical to
11
+ * the last applied state — preventing user-visible "re-discovery"
12
+ * notifications on every addon-runner respawn. Each respawn re-fires
13
+ * `DeviceBindingsChanged` for every cap registration, which without
14
+ * this guard would propagate redundant pushes.
15
+ *
16
+ * Note: this is a SYMPTOMATIC fix layered on top of the binding-change
17
+ * subscription. The proper fix is a single "device ready" lifecycle
18
+ * barrier so exports react only when the full cap set has landed —
19
+ * tracked separately for post-HA-integration work.
20
+ */
21
+ function canonicalHash(value) {
22
+ const canonical = JSON.stringify(value, replaceWithSortedKeys);
23
+ return (0, node_crypto.createHash)("sha256").update(canonical ?? "").digest("hex");
24
+ }
25
+ function replaceWithSortedKeys(_key, value) {
26
+ if (value && typeof value === "object" && !Array.isArray(value)) {
27
+ const obj = value;
28
+ const out = {};
29
+ for (const k of Object.keys(obj).toSorted()) out[k] = obj[k];
30
+ return out;
31
+ }
32
+ return value;
33
+ }
34
+ //#endregion
35
+ Object.defineProperty(exports, "canonicalHash", {
36
+ enumerable: true,
37
+ get: function() {
38
+ return canonicalHash;
39
+ }
40
+ });
@@ -76,12 +76,12 @@ export { NetworkAccessStatusSchema, NetworkEndpointSchema, networkAccessCapabili
76
76
  export { type Attachment, type AttachmentMediaType, AttachmentMediaTypeSchema, AttachmentSchema, type DiscoveredTarget, DiscoveredTargetSchema, type INotificationOutputProvider, type NotificationAction, type NotificationActionIcon, NotificationActionIconSchema, NotificationActionSchema, type NotificationFormat, NotificationFormatSchema, NotificationSchema, notificationOutputCapability, type RenderedAs, RenderedAsSchema, type SendResult, SendResultSchema, type Target, type TargetKind, type TargetKindCaps, TargetKindCapsSchema, type TargetKindLevel, TargetKindLevelSchema, TargetKindSchema, TargetSchema, type TestResult, TestResultSchema, } from './notification-output.cap.js';
77
77
  export { type INotificationRulesProvider, NC_CONDITION_CATALOG, NC_HISTORY_LIMIT_DEFAULT, NC_HISTORY_LIMIT_MAX, NC_MAX_PER_TRACK_IMMEDIATE, NC_SNOOZE_MAX_MINUTES, type NcAlarmConfig, NcAlarmConfigSchema, type NcAlarmModeCoverage, NcAlarmModeCoverageSchema, type NcAlarmSettings, type NcAlarmSettingsPatch, NcAlarmSettingsPatchSchema, NcAlarmSettingsSchema, type NcConditionDescriptor, NcConditionDescriptorSchema, type NcConditions, NcConditionsSchema, type NcCrossing, NcCrossingSchema, type NcDelivery, NcDeliverySchema, type NcDeviceStateCondition, NcDeviceStateConditionSchema, type NcHistoryEntry, NcHistoryEntrySchema, type NcHistoryFilter, NcHistoryFilterSchema, type NcHistoryRecordKind, NcHistoryRecordKindSchema, type NcHistoryStatus, NcHistoryStatusSchema, type NcHistorySubject, NcHistorySubjectSchema, type NcMediaFrame, NcMediaFrameSchema, type NcMediaPolicy, NcMediaPolicySchema, type NcOccupancyCondition, NcOccupancyConditionSchema, type NcPlateMatcher, NcPlateMatcherSchema, type NcRule, type NcRuleAction, NcRuleActionSchema, type NcRuleActionSequence, NcRuleActionSequenceSchema, type NcRuleActions, NcRuleActionsSchema, type NcRuleInput, NcRuleInputSchema, type NcRuleNotificationButton, NcRuleNotificationButtonSchema, type NcRulePatch, NcRulePatchSchema, NcRuleSchema, type NcRuleTarget, NcRuleTargetSchema, type NcSchedule, NcScheduleSchema, type NcScheduleWindow, NcScheduleWindowSchema, type NcSnooze, type NcSnoozeInput, NcSnoozeInputSchema, NcSnoozeSchema, type NcSnoozeScope, NcSnoozeScopeSchema, type NcSnoozeSuppressed, NcSnoozeSuppressedSchema, type NcTestResult, NcTestResultSchema, type NcThrottle, type NcThrottleGranularity, NcThrottleGranularitySchema, NcThrottleSchema, type NcZoneCondition, NcZoneConditionSchema, notificationRulesCapability, } from './notification-rules.cap.js';
78
78
  export { type IOauthIntegrationProvider, type OauthIntegrationDescriptor, OauthIntegrationDescriptorSchema, oauthIntegrationCapability, } from './oauth-integration.cap.js';
79
- export { type AudioEvent, AudioEventSchema, type DetectionSource, DetectionSourceSchema, type EventKind, type EventKindCategory, EventKindCategorySchema, type EventKindDescriptor, EventKindDescriptorSchema, type EventKindIcon, EventKindIconSchema, EventKindSchema, type EventKindsForDevice, EventKindsForDeviceSchema, type EventPruneCounts, type EventStoreDeviceFootprint, type EventStoreFootprint, type IPipelineAnalyticsProvider, type KeyEvent, KeyEventSchema, type MediaFile, type MediaFileInfo, MediaFileInfoSchema, type MediaFileKind, MediaFileSchema, type MotionEvent, MotionEventSchema, type ObjectEvent, ObjectEventSchema, pipelineAnalyticsCapability, type RecentTracksPage, RecentTracksPageSchema, type RecentTracksQuery, RecentTracksQueryInput, type ScoredObjectEvent, ScoredObjectEventSchema, type SensorEvent, SensorEventSchema, type Track, type TrackCascadeCounts, TrackCascadeCountsSchema, type TrackEnvelope, TrackEnvelopeSchema, TrackedDetectionSchema, type TrackProjection, TrackProjectionSchema, TrackSchema, type TrackState, TrackStateSchema, type TrackZoneFilter, TrackZoneFilterSchema, type ZoneCrossing, type ZoneCrossingDirection, ZoneCrossingDirectionSchema, ZoneCrossingSchema, } from './pipeline-analytics.cap.js';
79
+ export { type AudioEvent, AudioEventSchema, type DetectionSource, DetectionSourceSchema, type EventKind, type EventKindCategory, EventKindCategorySchema, type EventKindDescriptor, EventKindDescriptorSchema, type EventKindIcon, EventKindIconSchema, EventKindSchema, type EventKindsForDevice, EventKindsForDeviceSchema, type EventPruneCounts, type EventStoreDeviceFootprint, type EventStoreFootprint, type IPipelineAnalyticsProvider, type KeyEvent, KeyEventSchema, type MediaFile, type MediaFileInfo, MediaFileInfoSchema, type MediaFileKind, MediaFileSchema, type MotionEvent, MotionEventSchema, type ObjectEvent, ObjectEventSchema, pipelineAnalyticsCapability, type RecentTracksPage, RecentTracksPageSchema, type RecentTracksQuery, RecentTracksQueryInput, type ScoredObjectEvent, ScoredObjectEventSchema, type SensorEvent, SensorEventSchema, type Track, type TrackCascadeCounts, TrackCascadeCountsSchema, type TrackEnvelope, TrackEnvelopeSchema, TrackedDetectionSchema, type TrackFlags, type TrackFlagsPatch, TrackFlagsPatchSchema, TrackFlagsSchema, type TrackProjection, TrackProjectionSchema, TrackSchema, type TrackSource, TrackSourceSchema, type TrackState, TrackStateSchema, type TrackZoneFilter, TrackZoneFilterSchema, type ZoneCrossing, type ZoneCrossingDirection, ZoneCrossingDirectionSchema, ZoneCrossingSchema, } from './pipeline-analytics.cap.js';
80
80
  export type { NativeCropRef, PipelineStepInputOutput, PipelineValidationIssue, PipelineValidationResult, } from './pipeline-executor.cap.js';
81
81
  export { ModelSubstitutionSchema, NativeCropRefSchema, PipelineDefaultStepSchema, PipelineEngineChoiceSchema, PipelineRunResultBridge, PipelineStepInputSchema, PipelineValidationIssueSchema, PipelineValidationResultSchema, pipelineExecutorCapability, } from './pipeline-executor.cap.js';
82
82
  export type { CameraAssignmentStatus, CameraAudioStatus, CameraBrokerProfile, CameraBrokerStatus, CameraDecoderShm, CameraDecoderStatus, CameraDetectionPhase, CameraDetectionProvisioning, CameraDetectionProvisioningState, CameraDetectionStatus, CameraMotionStatus, CameraRecordingMode, CameraRecordingStatus, CameraSourceStatus, CameraSourceStream, CameraStatus, IngestOwner, NodeInferenceDevice, NodeInferenceDevices, } from './pipeline-orchestrator.cap.js';
83
83
  export { AgentLoadSummarySchema, CameraAssignmentStatusSchema, CameraAudioStatusSchema, CameraBrokerProfileSchema, CameraBrokerStatusSchema, CameraDecoderShmSchema, CameraDecoderStatusSchema, CameraDetectionPhaseSchema, CameraDetectionProvisioningSchema, CameraDetectionProvisioningStateSchema, CameraDetectionStatusSchema, CameraMotionStatusSchema, CameraRecordingModeSchema, CameraRecordingStatusSchema, CameraSourceStatusSchema, CameraSourceStreamSchema, CameraStatusSchema, CapabilityBindingsSchema, GlobalMetricsSchema, IngestOwnerSchema, PipelineAssignmentSchema, pipelineOrchestratorCapability, } from './pipeline-orchestrator.cap.js';
84
- export type { DetailParent, DetailResult, MotionSource, MotionSources, ReportMotionInput, RunDetailSubtreeInput, RunDetailSubtreeResult, RunnerFrameSource, RunnerInferenceDevice, } from './pipeline-runner.cap.js';
84
+ export type { DetailParent, DetailResult, MotionSource, MotionSources, ReportMotionInput, RunDetailSubtreeInput, RunDetailSubtreeResult, RunnerFrameSource, RunnerInferenceDevice, RunStatelessStepInput, RunStatelessStepResult, StatelessStepRefusal, } from './pipeline-runner.cap.js';
85
85
  export { MotionSourceEnum, MotionSourcesSchema, NativeCropBboxSchema, NativeCropResultSchema, pipelineRunnerCapability, ReportMotionInputSchema, RunnerCameraConfigSchema, RunnerCameraDeviceUIFields, RunnerFrameSourceSchema, RunnerInferenceDeviceSchema, RunnerLocalLoadSchema, RunnerLocalMetricsSchema, } from './pipeline-runner.cap.js';
86
86
  export { AudioChunkInputSchema, AudioClassificationLabelSchema, AudioLevelSchema, BoundingBoxSchema, FrameInputSchema, SpatialDetectionSchema, } from './schemas/detection-shared.js';
87
87
  export { CameraMetricsSchema, CameraMetricsWithDeviceIdSchema, OrchestratorMetricsSchema, } from './schemas/orchestrator-metrics.js';
@@ -334,6 +334,7 @@ export declare const NcConditionsSchema: z.ZodObject<{
334
334
  minDwellSeconds: z.ZodOptional<z.ZodNumber>;
335
335
  source: z.ZodOptional<z.ZodEnum<{
336
336
  sensor: "sensor";
337
+ audio: "audio";
337
338
  any: "any";
338
339
  pipeline: "pipeline";
339
340
  onboard: "onboard";
@@ -500,6 +501,7 @@ export declare const NcRuleInputSchema: z.ZodObject<{
500
501
  minDwellSeconds: z.ZodOptional<z.ZodNumber>;
501
502
  source: z.ZodOptional<z.ZodEnum<{
502
503
  sensor: "sensor";
504
+ audio: "audio";
503
505
  any: "any";
504
506
  pipeline: "pipeline";
505
507
  onboard: "onboard";
@@ -679,6 +681,7 @@ export declare const NcRulePatchSchema: z.ZodObject<{
679
681
  minDwellSeconds: z.ZodOptional<z.ZodNumber>;
680
682
  source: z.ZodOptional<z.ZodEnum<{
681
683
  sensor: "sensor";
684
+ audio: "audio";
682
685
  any: "any";
683
686
  pipeline: "pipeline";
684
687
  onboard: "onboard";
@@ -851,6 +854,7 @@ export declare const NcRuleSchema: z.ZodObject<{
851
854
  minDwellSeconds: z.ZodOptional<z.ZodNumber>;
852
855
  source: z.ZodOptional<z.ZodEnum<{
853
856
  sensor: "sensor";
857
+ audio: "audio";
854
858
  any: "any";
855
859
  pipeline: "pipeline";
856
860
  onboard: "onboard";
@@ -1343,6 +1347,7 @@ export declare const notificationRulesCapability: {
1343
1347
  minDwellSeconds: z.ZodOptional<z.ZodNumber>;
1344
1348
  source: z.ZodOptional<z.ZodEnum<{
1345
1349
  sensor: "sensor";
1350
+ audio: "audio";
1346
1351
  any: "any";
1347
1352
  pipeline: "pipeline";
1348
1353
  onboard: "onboard";
@@ -1521,6 +1526,7 @@ export declare const notificationRulesCapability: {
1521
1526
  minDwellSeconds: z.ZodOptional<z.ZodNumber>;
1522
1527
  source: z.ZodOptional<z.ZodEnum<{
1523
1528
  sensor: "sensor";
1529
+ audio: "audio";
1524
1530
  any: "any";
1525
1531
  pipeline: "pipeline";
1526
1532
  onboard: "onboard";
@@ -1697,6 +1703,7 @@ export declare const notificationRulesCapability: {
1697
1703
  minDwellSeconds: z.ZodOptional<z.ZodNumber>;
1698
1704
  source: z.ZodOptional<z.ZodEnum<{
1699
1705
  sensor: "sensor";
1706
+ audio: "audio";
1700
1707
  any: "any";
1701
1708
  pipeline: "pipeline";
1702
1709
  onboard: "onboard";
@@ -1867,6 +1874,7 @@ export declare const notificationRulesCapability: {
1867
1874
  minDwellSeconds: z.ZodOptional<z.ZodNumber>;
1868
1875
  source: z.ZodOptional<z.ZodEnum<{
1869
1876
  sensor: "sensor";
1877
+ audio: "audio";
1870
1878
  any: "any";
1871
1879
  pipeline: "pipeline";
1872
1880
  onboard: "onboard";
@@ -2046,6 +2054,7 @@ export declare const notificationRulesCapability: {
2046
2054
  minDwellSeconds: z.ZodOptional<z.ZodNumber>;
2047
2055
  source: z.ZodOptional<z.ZodEnum<{
2048
2056
  sensor: "sensor";
2057
+ audio: "audio";
2049
2058
  any: "any";
2050
2059
  pipeline: "pipeline";
2051
2060
  onboard: "onboard";
@@ -2217,6 +2226,7 @@ export declare const notificationRulesCapability: {
2217
2226
  minDwellSeconds: z.ZodOptional<z.ZodNumber>;
2218
2227
  source: z.ZodOptional<z.ZodEnum<{
2219
2228
  sensor: "sensor";
2229
+ audio: "audio";
2220
2230
  any: "any";
2221
2231
  pipeline: "pipeline";
2222
2232
  onboard: "onboard";
@@ -2363,6 +2373,36 @@ export declare const notificationRulesCapability: {
2363
2373
  }, z.core.$strip>, z.ZodObject<{
2364
2374
  success: z.ZodLiteral<true>;
2365
2375
  }, z.core.$strip>, "mutation">;
2376
+ /**
2377
+ * PERMANENT per-camera mute — the notifications half of the per-camera
2378
+ * function switch group ([D61](../../../../docs/decisions/adr-0067.md)).
2379
+ *
2380
+ * Deliberately NOT a snooze. A snooze is bounded at
2381
+ * {@link NC_SNOOZE_MAX_MINUTES} on purpose — "a snooze that could not
2382
+ * expire would be an outage the operator asked for once and forgot" — and
2383
+ * widening it to express "this camera never notifies" would destroy that
2384
+ * property for every snooze. A mute is the other thing: an explicit,
2385
+ * indefinite, admin-only decision, visible in the switch group next to the
2386
+ * other four, and reported on `CameraStatus.switchedOff` so a silent
2387
+ * camera never reads as a working one.
2388
+ *
2389
+ * Returned as ONE list rather than a per-camera query: the group's reader
2390
+ * needs every camera's state, and a per-camera fan-out over the viewer's
2391
+ * single WebSocket is N frames serialised on one socket.
2392
+ */
2393
+ readonly listDeviceMutes: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
2394
+ mutedDeviceIds: z.ZodReadonly<z.ZodArray<z.ZodNumber>>;
2395
+ }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
2396
+ /**
2397
+ * Mute or unmute one camera. Idempotent; an unmute of a camera that was
2398
+ * never muted succeeds.
2399
+ */
2400
+ readonly setDeviceMuted: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
2401
+ deviceId: z.ZodNumber;
2402
+ muted: z.ZodBoolean;
2403
+ }, z.core.$strip>, z.ZodObject<{
2404
+ success: z.ZodLiteral<true>;
2405
+ }, z.core.$strip>, "mutation">;
2366
2406
  /**
2367
2407
  * Dry-run a rule against recently persisted records (object events for
2368
2408
  * `immediate`, closed tracks for `track-end`). Mutation kind only to
@@ -2411,6 +2451,7 @@ export declare const notificationRulesCapability: {
2411
2451
  minDwellSeconds: z.ZodOptional<z.ZodNumber>;
2412
2452
  source: z.ZodOptional<z.ZodEnum<{
2413
2453
  sensor: "sensor";
2454
+ audio: "audio";
2414
2455
  any: "any";
2415
2456
  pipeline: "pipeline";
2416
2457
  onboard: "onboard";
@@ -229,17 +229,48 @@ declare const TrackAudioLabelSchema: z.ZodObject<{
229
229
  export type TrackAudioLabel = z.infer<typeof TrackAudioLabelSchema>;
230
230
  /**
231
231
  * How a track was produced. `pipeline` (default / absent) = the spatial
232
- * detection+tracking pipeline. `sensor` = a SYNTHETIC track projected from a
233
- * linked sensor/control state change (no positions; carries a snapshot). The
234
- * spatial subsystems (tracker association, occupancy count, re-id/embedding,
235
- * resurrection) MUST skip `sensor` tracks they have no bbox trajectory.
232
+ * detection+tracking pipeline. Every OTHER value is a SYNTHETIC projection
233
+ * no positions, a single snapshot, and no bbox trajectory at all:
234
+ *
235
+ * - `sensor` — a linked sensor/control device state change.
236
+ * - `audio` — an audio event on the camera itself that was anomalous for
237
+ * THAT camera, loud, and heard while nothing visual was happening (D62).
238
+ *
239
+ * The spatial subsystems (tracker association, occupancy count, re-id /
240
+ * embedding, resurrection) MUST skip every synthetic source. Test for that
241
+ * with `isSpatialTrack`, which allow-lists `pipeline` — a `!== 'sensor'`
242
+ * check silently readmits every source added after it was written.
236
243
  */
237
244
  export declare const TrackSourceSchema: z.ZodEnum<{
238
245
  sensor: "sensor";
246
+ audio: "audio";
239
247
  pipeline: "pipeline";
240
248
  }>;
241
249
  export type TrackSource = z.infer<typeof TrackSourceSchema>;
250
+ /**
251
+ * The write half: a PARTIAL patch. An omitted key is left untouched, so setting
252
+ * one flag can never clear the other — the toggles are independent and are
253
+ * driven from three surfaces that do not know about each other.
254
+ */
255
+ export declare const TrackFlagsPatchSchema: z.ZodObject<{
256
+ markForTrain: z.ZodOptional<z.ZodBoolean>;
257
+ debug: z.ZodOptional<z.ZodBoolean>;
258
+ }, z.core.$strip>;
259
+ export type TrackFlagsPatch = z.infer<typeof TrackFlagsPatchSchema>;
260
+ /**
261
+ * The resolved flag state after a write. Both fields are REQUIRED here (absent
262
+ * collapses to `false`) so a caller can drive a toggle's checked state off the
263
+ * mutation result without a re-fetch.
264
+ */
265
+ export declare const TrackFlagsSchema: z.ZodObject<{
266
+ trackId: z.ZodString;
267
+ markForTrain: z.ZodBoolean;
268
+ debug: z.ZodBoolean;
269
+ }, z.core.$strip>;
270
+ export type TrackFlags = z.infer<typeof TrackFlagsSchema>;
242
271
  declare const TrackSchema: z.ZodObject<{
272
+ markForTrain: z.ZodOptional<z.ZodBoolean>;
273
+ debug: z.ZodOptional<z.ZodBoolean>;
243
274
  trackId: z.ZodString;
244
275
  deviceId: z.ZodNumber;
245
276
  className: z.ZodString;
@@ -247,6 +278,7 @@ declare const TrackSchema: z.ZodObject<{
247
278
  producingDeviceName: z.ZodOptional<z.ZodString>;
248
279
  source: z.ZodOptional<z.ZodEnum<{
249
280
  sensor: "sensor";
281
+ audio: "audio";
250
282
  pipeline: "pipeline";
251
283
  }>>;
252
284
  firstSeen: z.ZodNumber;
@@ -518,6 +550,8 @@ declare const RecentTracksQueryInput: z.ZodObject<{
518
550
  export type RecentTracksQuery = z.infer<typeof RecentTracksQueryInput>;
519
551
  declare const RecentTracksPageSchema: z.ZodObject<{
520
552
  tracks: z.ZodReadonly<z.ZodArray<z.ZodObject<{
553
+ markForTrain: z.ZodOptional<z.ZodBoolean>;
554
+ debug: z.ZodOptional<z.ZodBoolean>;
521
555
  trackId: z.ZodString;
522
556
  deviceId: z.ZodNumber;
523
557
  className: z.ZodString;
@@ -525,6 +559,7 @@ declare const RecentTracksPageSchema: z.ZodObject<{
525
559
  producingDeviceName: z.ZodOptional<z.ZodString>;
526
560
  source: z.ZodOptional<z.ZodEnum<{
527
561
  sensor: "sensor";
562
+ audio: "audio";
528
563
  pipeline: "pipeline";
529
564
  }>>;
530
565
  firstSeen: z.ZodNumber;
@@ -587,6 +622,8 @@ declare const RecentTracksPageSchema: z.ZodObject<{
587
622
  }, z.core.$strip>;
588
623
  export type RecentTracksPage = z.infer<typeof RecentTracksPageSchema>;
589
624
  declare const KeyEventSchema: z.ZodObject<{
625
+ markForTrain: z.ZodOptional<z.ZodBoolean>;
626
+ debug: z.ZodOptional<z.ZodBoolean>;
590
627
  id: z.ZodString;
591
628
  trackId: z.ZodString;
592
629
  timestamp: z.ZodNumber;
@@ -707,6 +744,8 @@ export declare const pipelineAnalyticsCapability: {
707
744
  readonly getActiveTracks: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
708
745
  deviceId: z.ZodNumber;
709
746
  }, z.core.$strip>, z.ZodReadonly<z.ZodArray<z.ZodObject<{
747
+ markForTrain: z.ZodOptional<z.ZodBoolean>;
748
+ debug: z.ZodOptional<z.ZodBoolean>;
710
749
  trackId: z.ZodString;
711
750
  deviceId: z.ZodNumber;
712
751
  className: z.ZodString;
@@ -714,6 +753,7 @@ export declare const pipelineAnalyticsCapability: {
714
753
  producingDeviceName: z.ZodOptional<z.ZodString>;
715
754
  source: z.ZodOptional<z.ZodEnum<{
716
755
  sensor: "sensor";
756
+ audio: "audio";
717
757
  pipeline: "pipeline";
718
758
  }>>;
719
759
  firstSeen: z.ZodNumber;
@@ -776,6 +816,8 @@ export declare const pipelineAnalyticsCapability: {
776
816
  deviceId: z.ZodNumber;
777
817
  trackId: z.ZodString;
778
818
  }, z.core.$strip>, z.ZodNullable<z.ZodObject<{
819
+ markForTrain: z.ZodOptional<z.ZodBoolean>;
820
+ debug: z.ZodOptional<z.ZodBoolean>;
779
821
  trackId: z.ZodString;
780
822
  deviceId: z.ZodNumber;
781
823
  className: z.ZodString;
@@ -783,6 +825,7 @@ export declare const pipelineAnalyticsCapability: {
783
825
  producingDeviceName: z.ZodOptional<z.ZodString>;
784
826
  source: z.ZodOptional<z.ZodEnum<{
785
827
  sensor: "sensor";
828
+ audio: "audio";
786
829
  pipeline: "pipeline";
787
830
  }>>;
788
831
  firstSeen: z.ZodNumber;
@@ -867,6 +910,8 @@ export declare const pipelineAnalyticsCapability: {
867
910
  slim: "slim";
868
911
  }>>;
869
912
  }, z.core.$strip>, z.ZodReadonly<z.ZodArray<z.ZodObject<{
913
+ markForTrain: z.ZodOptional<z.ZodBoolean>;
914
+ debug: z.ZodOptional<z.ZodBoolean>;
870
915
  trackId: z.ZodString;
871
916
  deviceId: z.ZodNumber;
872
917
  className: z.ZodString;
@@ -874,6 +919,7 @@ export declare const pipelineAnalyticsCapability: {
874
919
  producingDeviceName: z.ZodOptional<z.ZodString>;
875
920
  source: z.ZodOptional<z.ZodEnum<{
876
921
  sensor: "sensor";
922
+ audio: "audio";
877
923
  pipeline: "pipeline";
878
924
  }>>;
879
925
  firstSeen: z.ZodNumber;
@@ -954,6 +1000,8 @@ export declare const pipelineAnalyticsCapability: {
954
1000
  }>>;
955
1001
  }, z.core.$strip>, z.ZodObject<{
956
1002
  tracks: z.ZodReadonly<z.ZodArray<z.ZodObject<{
1003
+ markForTrain: z.ZodOptional<z.ZodBoolean>;
1004
+ debug: z.ZodOptional<z.ZodBoolean>;
957
1005
  trackId: z.ZodString;
958
1006
  deviceId: z.ZodNumber;
959
1007
  className: z.ZodString;
@@ -961,6 +1009,7 @@ export declare const pipelineAnalyticsCapability: {
961
1009
  producingDeviceName: z.ZodOptional<z.ZodString>;
962
1010
  source: z.ZodOptional<z.ZodEnum<{
963
1011
  sensor: "sensor";
1012
+ audio: "audio";
964
1013
  pipeline: "pipeline";
965
1014
  }>>;
966
1015
  firstSeen: z.ZodNumber;
@@ -1274,6 +1323,8 @@ export declare const pipelineAnalyticsCapability: {
1274
1323
  minImportance: z.ZodOptional<z.ZodNumber>;
1275
1324
  classFilter: z.ZodOptional<z.ZodString>;
1276
1325
  }, z.core.$strip>, z.ZodReadonly<z.ZodArray<z.ZodObject<{
1326
+ markForTrain: z.ZodOptional<z.ZodBoolean>;
1327
+ debug: z.ZodOptional<z.ZodBoolean>;
1277
1328
  id: z.ZodString;
1278
1329
  trackId: z.ZodString;
1279
1330
  timestamp: z.ZodNumber;
@@ -1370,6 +1421,37 @@ export declare const pipelineAnalyticsCapability: {
1370
1421
  deleted: z.ZodNumber;
1371
1422
  failed: z.ZodReadonly<z.ZodArray<z.ZodString>>;
1372
1423
  }, z.core.$strip>, "mutation">;
1424
+ /**
1425
+ * Set the per-track operator flags (`markForTrain`, `debug`) on ONE track.
1426
+ * The patch is PARTIAL — an omitted key is left untouched — because the
1427
+ * three surfaces that write it (admin Events grid, viewer track detail,
1428
+ * viewer cluster detail) each own one toggle and must not clobber the other.
1429
+ *
1430
+ * Writes the track ROW: `markForTrain`/`debug` are per-TRACK state, so they
1431
+ * live where `label` and `importance` live, not in any per-device settings
1432
+ * store. Updates the in-RAM active track too, so a flag set on a live track
1433
+ * survives its expiry-time persist.
1434
+ *
1435
+ * `auth: 'protected'` (the default), NOT `admin`: the viewer is an
1436
+ * authenticated non-admin surface and two of the three call sites are
1437
+ * there. Revisit if a flag ever gains an effect that costs storage —
1438
+ * `deleteTracks` next door is admin for exactly that reason.
1439
+ *
1440
+ * Returns the RESOLVED state of both flags (absent → `false`) so a caller
1441
+ * can drive its toggle without a re-fetch. Rejects an unknown track.
1442
+ */
1443
+ readonly setTrackFlags: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
1444
+ deviceId: z.ZodNumber;
1445
+ trackId: z.ZodString;
1446
+ flags: z.ZodObject<{
1447
+ markForTrain: z.ZodOptional<z.ZodBoolean>;
1448
+ debug: z.ZodOptional<z.ZodBoolean>;
1449
+ }, z.core.$strip>;
1450
+ }, z.core.$strip>, z.ZodObject<{
1451
+ trackId: z.ZodString;
1452
+ markForTrain: z.ZodBoolean;
1453
+ debug: z.ZodBoolean;
1454
+ }, z.core.$strip>, "mutation">;
1373
1455
  /**
1374
1456
  * Durable event-store footprint for the management UI: event rows
1375
1457
  * (motion + object + audio) counted per camera + total, plus the
@@ -1398,6 +1480,7 @@ export declare const pipelineAnalyticsCapability: {
1398
1480
  operator: "operator";
1399
1481
  retention: "retention";
1400
1482
  quota: "quota";
1483
+ maintenance: "maintenance";
1401
1484
  }>>;
1402
1485
  }, z.core.$strip>, z.ZodObject<{
1403
1486
  motion: z.ZodNumber;
@@ -1471,12 +1554,14 @@ export declare const pipelineAnalyticsCapability: {
1471
1554
  rescan: "rescan";
1472
1555
  "retention-run": "retention-run";
1473
1556
  relocate: "relocate";
1557
+ "orphan-audit": "orphan-audit";
1474
1558
  }>;
1475
1559
  reason: z.ZodEnum<{
1476
1560
  manual: "manual";
1477
1561
  operator: "operator";
1478
1562
  retention: "retention";
1479
1563
  quota: "quota";
1564
+ maintenance: "maintenance";
1480
1565
  }>;
1481
1566
  deviceId: z.ZodNullable<z.ZodNumber>;
1482
1567
  nodeId: z.ZodString;
@@ -1665,6 +1750,8 @@ export declare const pipelineAnalyticsCapability: {
1665
1750
  since: z.ZodOptional<z.ZodNumber>;
1666
1751
  until: z.ZodOptional<z.ZodNumber>;
1667
1752
  maxTracks: z.ZodOptional<z.ZodNumber>;
1753
+ executeOnNodeId: z.ZodOptional<z.ZodString>;
1754
+ pacingMs: z.ZodOptional<z.ZodNumber>;
1668
1755
  }, z.core.$strip>, z.ZodObject<{
1669
1756
  started: z.ZodBoolean;
1670
1757
  alreadyRunning: z.ZodBoolean;
@@ -1676,6 +1763,7 @@ export declare const pipelineAnalyticsCapability: {
1676
1763
  missingKeyFrame: z.ZodNumber;
1677
1764
  missingBbox: z.ZodNumber;
1678
1765
  notRunnable: z.ZodNumber;
1766
+ noCapableNode: z.ZodNumber;
1679
1767
  failed: z.ZodNumber;
1680
1768
  complete: z.ZodNullable<z.ZodBoolean>;
1681
1769
  startedAtMs: z.ZodNullable<z.ZodNumber>;
@@ -441,6 +441,13 @@ declare const CameraStatusSchema: z.ZodObject<{
441
441
  active: z.ZodBoolean;
442
442
  storageBytes: z.ZodNumber;
443
443
  }, z.core.$strip>>;
444
+ switchedOff: z.ZodReadonly<z.ZodArray<z.ZodEnum<{
445
+ "audio-analysis": "audio-analysis";
446
+ recording: "recording";
447
+ "stream-broker": "stream-broker";
448
+ notifications: "notifications";
449
+ "object-detection": "object-detection";
450
+ }>>>;
444
451
  fetchedAt: z.ZodNumber;
445
452
  }, z.core.$strip>;
446
453
  declare const NodeInferenceDeviceSchema: z.ZodObject<{
@@ -1062,6 +1069,108 @@ export declare const pipelineOrchestratorCapability: {
1062
1069
  settings: z.ZodOptional<z.ZodReadonly<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
1063
1070
  }, z.core.$strip>>>;
1064
1071
  }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
1072
+ /**
1073
+ * The whole per-camera function switch group, DERIVED — never a stored
1074
+ * list ([D61](../../../../docs/decisions/adr-0067.md)).
1075
+ *
1076
+ * The group adds no state. Each switch is a view onto the authority that
1077
+ * already owned it (`deviceManager.setDisabled`,
1078
+ * `deviceManager.setWrapperActive`, `RecordingConfig.enabled`,
1079
+ * `notificationRules.setDeviceMuted`), and `switch.authority` says which.
1080
+ * Availability comes from `deviceManager.listBindableCapsForDeviceType`,
1081
+ * so a deployment with no audio analyzer renders no audio switch.
1082
+ *
1083
+ * `auth: 'view'` deliberately — a NON-admin must be able to see that a
1084
+ * camera is quiet because somebody switched it off. Only the mutation is
1085
+ * admin-gated.
1086
+ */
1087
+ readonly getCameraSwitches: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
1088
+ deviceId: z.ZodNumber;
1089
+ }, z.core.$strip>, z.ZodObject<{
1090
+ deviceId: z.ZodNumber;
1091
+ switches: z.ZodReadonly<z.ZodArray<z.ZodObject<{
1092
+ id: z.ZodEnum<{
1093
+ "audio-analysis": "audio-analysis";
1094
+ recording: "recording";
1095
+ "stream-broker": "stream-broker";
1096
+ notifications: "notifications";
1097
+ "object-detection": "object-detection";
1098
+ }>;
1099
+ label: z.ZodString;
1100
+ costWhenOff: z.ZodString;
1101
+ available: z.ZodBoolean;
1102
+ unavailableReason: z.ZodOptional<z.ZodEnum<{
1103
+ "no-provider": "no-provider";
1104
+ "source-unreachable": "source-unreachable";
1105
+ }>>;
1106
+ enabled: z.ZodBoolean;
1107
+ authority: z.ZodDiscriminatedUnion<[z.ZodObject<{
1108
+ kind: z.ZodLiteral<"device-disabled">;
1109
+ }, z.core.$strip>, z.ZodObject<{
1110
+ kind: z.ZodLiteral<"wrapper-binding">;
1111
+ capName: z.ZodString;
1112
+ }, z.core.$strip>, z.ZodObject<{
1113
+ kind: z.ZodLiteral<"recording-config">;
1114
+ }, z.core.$strip>, z.ZodObject<{
1115
+ kind: z.ZodLiteral<"notification-mute">;
1116
+ }, z.core.$strip>], "kind">;
1117
+ }, z.core.$strip>>>;
1118
+ fetchedAt: z.ZodNumber;
1119
+ }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
1120
+ /**
1121
+ * Flip ONE switch, routed to its existing authority.
1122
+ *
1123
+ * Never writes a parallel map: `recording` patches `RecordingConfig.enabled`
1124
+ * and leaves `bands` byte-identical (clearing bands to express "off"
1125
+ * destroys the operator's authored schedule and turning the camera back on
1126
+ * would silently record nothing), and the two pipeline switches write the
1127
+ * SAME wrapper binding the legacy `pipelineEnabled` / `audioEnabled`
1128
+ * booleans were migrated onto.
1129
+ *
1130
+ * Rejects a switch this camera does not offer rather than persisting a
1131
+ * write nothing reads.
1132
+ */
1133
+ readonly setCameraSwitch: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
1134
+ deviceId: z.ZodNumber;
1135
+ switchId: z.ZodEnum<{
1136
+ "audio-analysis": "audio-analysis";
1137
+ recording: "recording";
1138
+ "stream-broker": "stream-broker";
1139
+ notifications: "notifications";
1140
+ "object-detection": "object-detection";
1141
+ }>;
1142
+ enabled: z.ZodBoolean;
1143
+ }, z.core.$strip>, z.ZodObject<{
1144
+ deviceId: z.ZodNumber;
1145
+ switches: z.ZodReadonly<z.ZodArray<z.ZodObject<{
1146
+ id: z.ZodEnum<{
1147
+ "audio-analysis": "audio-analysis";
1148
+ recording: "recording";
1149
+ "stream-broker": "stream-broker";
1150
+ notifications: "notifications";
1151
+ "object-detection": "object-detection";
1152
+ }>;
1153
+ label: z.ZodString;
1154
+ costWhenOff: z.ZodString;
1155
+ available: z.ZodBoolean;
1156
+ unavailableReason: z.ZodOptional<z.ZodEnum<{
1157
+ "no-provider": "no-provider";
1158
+ "source-unreachable": "source-unreachable";
1159
+ }>>;
1160
+ enabled: z.ZodBoolean;
1161
+ authority: z.ZodDiscriminatedUnion<[z.ZodObject<{
1162
+ kind: z.ZodLiteral<"device-disabled">;
1163
+ }, z.core.$strip>, z.ZodObject<{
1164
+ kind: z.ZodLiteral<"wrapper-binding">;
1165
+ capName: z.ZodString;
1166
+ }, z.core.$strip>, z.ZodObject<{
1167
+ kind: z.ZodLiteral<"recording-config">;
1168
+ }, z.core.$strip>, z.ZodObject<{
1169
+ kind: z.ZodLiteral<"notification-mute">;
1170
+ }, z.core.$strip>], "kind">;
1171
+ }, z.core.$strip>>>;
1172
+ fetchedAt: z.ZodNumber;
1173
+ }, z.core.$strip>, "mutation">;
1065
1174
  /**
1066
1175
  * Server-composed aggregated status for a single camera.
1067
1176
  *
@@ -1171,6 +1280,13 @@ export declare const pipelineOrchestratorCapability: {
1171
1280
  active: z.ZodBoolean;
1172
1281
  storageBytes: z.ZodNumber;
1173
1282
  }, z.core.$strip>>;
1283
+ switchedOff: z.ZodReadonly<z.ZodArray<z.ZodEnum<{
1284
+ "audio-analysis": "audio-analysis";
1285
+ recording: "recording";
1286
+ "stream-broker": "stream-broker";
1287
+ notifications: "notifications";
1288
+ "object-detection": "object-detection";
1289
+ }>>>;
1174
1290
  fetchedAt: z.ZodNumber;
1175
1291
  }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
1176
1292
  /**
@@ -1281,6 +1397,13 @@ export declare const pipelineOrchestratorCapability: {
1281
1397
  active: z.ZodBoolean;
1282
1398
  storageBytes: z.ZodNumber;
1283
1399
  }, z.core.$strip>>;
1400
+ switchedOff: z.ZodReadonly<z.ZodArray<z.ZodEnum<{
1401
+ "audio-analysis": "audio-analysis";
1402
+ recording: "recording";
1403
+ "stream-broker": "stream-broker";
1404
+ notifications: "notifications";
1405
+ "object-detection": "object-detection";
1406
+ }>>>;
1284
1407
  fetchedAt: z.ZodNumber;
1285
1408
  }, z.core.$strip>>>, import("./capability-definition.js").CapabilityMethodKind>;
1286
1409
  /** List every template the operator has saved. */