@camstack/addon-pipeline 1.2.305 → 1.2.306

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 (33) hide show
  1. package/dist/audio-analyzer/index.js +2 -2
  2. package/dist/audio-analyzer/index.mjs +2 -2
  3. package/dist/{default-detection-model-BsXfdMCG.js → default-detection-model-CeYzI_ws.js} +1 -1
  4. package/dist/{default-detection-model-BduwEjht.mjs → default-detection-model-CmdkU7Ik.mjs} +1 -1
  5. package/dist/detection-pipeline/index.js +4 -4
  6. package/dist/detection-pipeline/index.mjs +4 -4
  7. package/dist/{dist-BdYgTuWJ.mjs → dist-B0mdAGsn.mjs} +181 -160
  8. package/dist/{dist-D4lbkRUh.js → dist-C2GsZSso.js} +181 -160
  9. package/dist/motion-wasm/index.js +1 -1
  10. package/dist/motion-wasm/index.mjs +1 -1
  11. package/dist/{node-DTG5A-3e.mjs → node-C4FxPOmq.mjs} +1 -1
  12. package/dist/{node-BMmRQfH_.js → node-DA9sHeo7.js} +1 -1
  13. package/dist/pipeline-runner/index.js +7 -6
  14. package/dist/pipeline-runner/index.mjs +7 -6
  15. package/dist/{process-memory-DJrgIn1c.js → process-memory-CT7jffcr.js} +1 -1
  16. package/dist/{process-memory-RnWS9Et5.mjs → process-memory-DtcP6dwa.mjs} +1 -1
  17. package/dist/recorder/index.js +2 -4
  18. package/dist/recorder/index.mjs +2 -4
  19. package/dist/{segment-demux-js-BI9zEgk6.js → segment-demux-js-C6Z9t7EK.js} +1 -1
  20. package/dist/{segment-demux-js-CsJMEslt.mjs → segment-demux-js-CDDu7U5-.mjs} +1 -1
  21. package/dist/stream-broker/_stub.js +2 -2
  22. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-Vcuvgik_.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BRWrphBU.mjs} +2 -2
  23. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DKNdMa3E.mjs +26 -0
  24. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CdKbuxqG.mjs +26 -0
  25. package/dist/stream-broker/demux-worker-child.js +1 -1
  26. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  27. package/dist/stream-broker/{hostInit-C3s1ZFbg.mjs → hostInit-CdU3jJMF.mjs} +2 -2
  28. package/dist/stream-broker/index.js +3 -3
  29. package/dist/stream-broker/index.mjs +3 -3
  30. package/dist/stream-broker/remoteEntry.js +1 -1
  31. package/package.json +1 -1
  32. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-X_j7TiDp.mjs +0 -26
  33. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CR9IIPsz.mjs +0 -26
@@ -5370,7 +5370,7 @@ var ZodIssueCode = {
5370
5370
  var ZodFirstPartyTypeKind;
5371
5371
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5372
5372
  //#endregion
5373
- //#region ../types/dist/sleep-E6eD4yQS.mjs
5373
+ //#region ../types/dist/sleep-C-v96WpE.mjs
5374
5374
  /**
5375
5375
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5376
5376
  * window to float samples (D455).
@@ -7684,7 +7684,7 @@ function errMsg(err) {
7684
7684
  return String(err);
7685
7685
  }
7686
7686
  //#endregion
7687
- //#region ../types/dist/composition-D5BQywfe.mjs
7687
+ //#region ../types/dist/composition-BK-GTFYb.mjs
7688
7688
  var AUDIO_ENCODER_BY_CODEC = {
7689
7689
  opus: "libopus",
7690
7690
  aac: "aac",
@@ -9324,7 +9324,6 @@ var CompositionSchema = object({
9324
9324
  });
9325
9325
  new Set([
9326
9326
  "track",
9327
- "summary",
9328
9327
  "face",
9329
9328
  "identity",
9330
9329
  "plate",
@@ -17066,6 +17065,34 @@ var DeviceBindingsForDeviceSchema = object({
17066
17065
  nativeAddonId: string()
17067
17066
  }))
17068
17067
  });
17068
+ /**
17069
+ * The STORED wrapper activation for one `(device, capability)` pair — the row
17070
+ * `setWrapperActive` writes, read back three-way (D675):
17071
+ *
17072
+ * - `value` — the store answered and holds an activation: the bound wrapper's
17073
+ * addon id, or `null`, the operator's explicit "off" marker (D62);
17074
+ * - `missing` — the store answered, its activation map exists, and it holds
17075
+ * nothing for this pair: the operator never activated or deactivated a
17076
+ * wrapper here;
17077
+ * - `failed` — the store could not be read, holds no activation map at all
17078
+ * (an empty or unready snapshot, D44), or holds something that is not an
17079
+ * activation. It carries NO information: a consumer must never read it as
17080
+ * `missing` (D315, D393).
17081
+ *
17082
+ * This is the persisted INPUT, not the derived `getBindings` view — no registry
17083
+ * resolution, no `defaultActive` auto-binding, no cluster native-cap folding.
17084
+ */
17085
+ var WrapperActivationReadSchema = discriminatedUnion("kind", [
17086
+ object({
17087
+ kind: literal("value"),
17088
+ wrapperAddonId: string().nullable()
17089
+ }),
17090
+ object({ kind: literal("missing") }),
17091
+ object({
17092
+ kind: literal("failed"),
17093
+ error: string()
17094
+ })
17095
+ ]);
17069
17096
  var SavedDeviceRowSchema = object({
17070
17097
  /** Numeric id reserved at allocateDeviceId time. */
17071
17098
  id: number(),
@@ -17416,7 +17443,10 @@ method(object({
17416
17443
  }), _void(), {
17417
17444
  kind: "mutation",
17418
17445
  auth: "admin"
17419
- }), method(object({ capName: string() }), array(string())), method(object({ deviceType: string() }), array(object({
17446
+ }), method(object({
17447
+ deviceId: number(),
17448
+ capName: string().min(1)
17449
+ }), WrapperActivationReadSchema), method(object({ capName: string() }), array(string())), method(object({ deviceType: string() }), array(object({
17420
17450
  capName: string(),
17421
17451
  wrappers: array(string())
17422
17452
  }))), method(object({ deviceId: number() }), SettingsSchemaWithValuesSchema.nullable()), method(object({ deviceId: number() }), SettingsSchemaWithValuesSchema.nullable()), method(object({ deviceId: number() }), object({
@@ -22924,6 +22954,102 @@ var OauthIntegrationDescriptorSchema = object({
22924
22954
  });
22925
22955
  method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
22926
22956
  /**
22957
+ * What started a camera's onboard motion (D672). `camera` is the camera's own
22958
+ * firmware; `sensor` is a device the operator ATTACHED to it. Absent on the
22959
+ * wire means the camera: only the camera-sensors bridge ever says `sensor`.
22960
+ */
22961
+ var MotionTriggeredBySchema = discriminatedUnion("kind", [object({ kind: literal("camera") }), object({
22962
+ kind: literal("sensor"),
22963
+ deviceId: number().int().positive()
22964
+ })]);
22965
+ Object.freeze({ kind: "camera" });
22966
+ var CameraSensorRefSchema = object({
22967
+ addonId: string().min(1),
22968
+ stableId: string().min(1)
22969
+ });
22970
+ function cameraSensorRefKey(ref) {
22971
+ return `${ref.addonId}/${ref.stableId}`;
22972
+ }
22973
+ /** CS-1 accepts exactly one mode; CS-2 (D673) widens it to confirm / replace. */
22974
+ var CameraSensorsModeSchema = _enum(["in-addition"]);
22975
+ object({
22976
+ mode: CameraSensorsModeSchema,
22977
+ sensors: array(CameraSensorRefSchema).min(1).max(8)
22978
+ }).superRefine((value, ctx) => {
22979
+ const seen = /* @__PURE__ */ new Set();
22980
+ value.sensors.forEach((ref, index) => {
22981
+ const key = cameraSensorRefKey(ref);
22982
+ if (seen.has(key)) ctx.addIssue({
22983
+ code: "custom",
22984
+ path: ["sensors", index],
22985
+ message: `duplicate camera sensor ${key}`
22986
+ });
22987
+ seen.add(key);
22988
+ });
22989
+ });
22990
+ var RefFields = {
22991
+ addonId: string(),
22992
+ stableId: string()
22993
+ };
22994
+ var CameraSensorAttachmentSchema = discriminatedUnion("state", [
22995
+ object({
22996
+ ...RefFields,
22997
+ state: literal("ready"),
22998
+ deviceId: number(),
22999
+ name: string(),
23000
+ caps: array(string()).readonly()
23001
+ }),
23002
+ object({
23003
+ ...RefFields,
23004
+ state: literal("offline"),
23005
+ deviceId: number(),
23006
+ name: string(),
23007
+ reason: _enum(["offline", "disabled"])
23008
+ }),
23009
+ object({
23010
+ ...RefFields,
23011
+ state: literal("missing"),
23012
+ reason: string()
23013
+ }),
23014
+ object({
23015
+ ...RefFields,
23016
+ state: literal("unsupported"),
23017
+ deviceId: number(),
23018
+ name: string(),
23019
+ reason: string()
23020
+ }),
23021
+ object({
23022
+ ...RefFields,
23023
+ state: literal("unreadable"),
23024
+ reason: string()
23025
+ })
23026
+ ]);
23027
+ /**
23028
+ * Why a configured camera forwards NOTHING from its sensors, however ready they
23029
+ * are (D672): it does not list `onboard` in `motionSources` (attaching a sensor
23030
+ * does not add it), or it has no active detection config at all (the bridge
23031
+ * reads the active config). Absent = forwarded, or an older node that does not
23032
+ * say.
23033
+ */
23034
+ var CameraSensorsNotForwardedSchema = _enum(["onboard-not-listed", "no-active-detection"]);
23035
+ var CameraSensorsStatusSchema = discriminatedUnion("state", [
23036
+ object({ state: literal("not-configured") }),
23037
+ object({
23038
+ state: literal("unreadable"),
23039
+ reason: string()
23040
+ }),
23041
+ object({
23042
+ state: literal("configured"),
23043
+ mode: CameraSensorsModeSchema,
23044
+ sensors: array(CameraSensorAttachmentSchema).readonly(),
23045
+ notForwarded: CameraSensorsNotForwardedSchema.optional()
23046
+ })
23047
+ ]);
23048
+ Object.freeze({
23049
+ state: "unreadable",
23050
+ reason: "camera sensor mappings not loaded"
23051
+ });
23052
+ /**
22927
23053
  * A model choice has a SCOPE, and a scope change has a workflow.
22928
23054
  *
22929
23055
  * ## The two scopes
@@ -23719,6 +23845,12 @@ var MotionEventSchema = object({
23719
23845
  /** Populated by B5 (recording playback URL for this event). */
23720
23846
  mediaUrl: string().optional(),
23721
23847
  /**
23848
+ * The FIRST trigger of an `onboard` episode, written once at open (D672).
23849
+ * Absent = not recorded (a row written before D672, or an analyzer /
23850
+ * device-activity episode) — never read as "the camera" (D393).
23851
+ */
23852
+ triggeredBy: MotionTriggeredBySchema.optional(),
23853
+ /**
23722
23854
  * One row per motion EPISODE, not one per push (D475). `null` while the
23723
23855
  * episode is still open — a further rising edge extends it in place rather
23724
23856
  * than inserting a new row. Set once, at close, to `lastOnAt - startedAt`
@@ -24212,131 +24344,6 @@ var RecentTracksQueryInput = object({
24212
24344
  /** See {@link ExcludeSourcesDoc}. */
24213
24345
  excludeSources: array(TrackSourceSchema).optional()
24214
24346
  });
24215
- /**
24216
- * A Summary (D359): the per-camera session envelope that references tracks.
24217
- * `groupShotMediaId` is the media ROW id of its group shot (`ownerKind:
24218
- * 'summary'`, served by the event-media plane at `/m/<id>`), null until the
24219
- * first frame with a member visible has been materialised (D482 — it was the
24220
- * row's composite key, which embedded the owner and could name another table's
24221
- * row once event ids became per-table rowids).
24222
- */
24223
- var SummarySchema = object({
24224
- id: string(),
24225
- deviceId: number(),
24226
- openedAt: number(),
24227
- lastActiveAt: number(),
24228
- sealedAt: number().nullable(),
24229
- memberCount: number().int().nonnegative(),
24230
- groupShotMediaId: number().int().nullable()
24231
- });
24232
- var SummariesQueryInput = object({
24233
- deviceIds: array(number()).min(1),
24234
- since: number().optional(),
24235
- until: number().optional(),
24236
- limit: number().int().min(1).max(200).default(50),
24237
- /** The same member-wise filter {@link listRecentSummaries} takes — one
24238
- * meaning of "dog" on every summary surface. */
24239
- classes: array(string().min(1).max(60)).max(40).optional()
24240
- });
24241
- var SummaryDetailSchema = object({
24242
- summary: SummarySchema,
24243
- /** Members in absorption order, oldest join first. */
24244
- members: array(object({
24245
- trackId: string(),
24246
- /**
24247
- * The track's class at the time it JOINED, or `null` when it was unresolved
24248
- * and the track no longer exists to fill it.
24249
- *
24250
- * The join, not the latest opinion: class voting can re-decide a track's
24251
- * class afterwards, and a group's composition is the history of who came
24252
- * together. A consumer counts these to badge a thumbnail — "two people and a
24253
- * dog" — rather than being handed a second, denormalised tally that would
24254
- * drift from the members it claims to describe.
24255
- */
24256
- className: string().nullable(),
24257
- /** `primary` is the one member that carries the group's identity. */
24258
- role: _enum([
24259
- "primary",
24260
- "sibling",
24261
- "child"
24262
- ]).nullable(),
24263
- joinedAt: number(),
24264
- /** Tier 1 — the sub-class (`dog`, `van`), resolved from the member's track
24265
- * at read time. Absent when nothing resolved, never an empty string. */
24266
- label: string().optional(),
24267
- /** Tier 2 — the instance: a person's name, a plate. Absent when the pipeline
24268
- * recognised nobody, and absent for a member whose track has been pruned —
24269
- * a thumbnail that names the wrong person is worse than one naming nobody. */
24270
- subLabel: string().optional()
24271
- })).readonly()
24272
- });
24273
- /**
24274
- * What a LIST of groups carries: the envelope plus what it is MADE OF.
24275
- *
24276
- * Coarse on purpose — the operator's rule is "only the rough data on the list,
24277
- * we extend when we notice we need more". Enough to draw the card ("two people
24278
- * and a dog") and no more. The MEMBERS, their names and the per-member links
24279
- * are on {@link getSummary}: shipping every member of every group so a client
24280
- * can count them turns a page of two hundred groups into a thousand records to
24281
- * draw two hundred badges.
24282
- */
24283
- var SummaryListItemSchema = object({
24284
- summary: SummarySchema,
24285
- /** Class counts, most numerous first; `className: null` is a member whose
24286
- * class never resolved, counted so the counts add up to `memberCount`. */
24287
- classes: array(object({
24288
- className: string().nullable(),
24289
- count: number().int().positive()
24290
- })).readonly()
24291
- });
24292
- var SummariesPageSchema = object({ summaries: array(SummaryListItemSchema).readonly() });
24293
- /**
24294
- * The paged feed, deliberately the SAME shape as {@link RecentTracksQueryInput}.
24295
- *
24296
- * The reel on the cameras page and the Events gallery both ride a cursor, so a
24297
- * summaries feed that could only answer "the last N for these cameras"
24298
- * (`listSummaries`) would make groups available in the timeline and nowhere
24299
- * else. Two feeds with different ordering contracts would be two ideas of what
24300
- * "newest" means, on one screen.
24301
- */
24302
- var RecentSummariesQueryInput = object({
24303
- /** Devices to merge. An empty array yields an empty page. */
24304
- deviceIds: array(number()),
24305
- /** Window lower bound on `lastActiveAt` (inclusive). */
24306
- since: number().optional(),
24307
- /** Window upper bound on `lastActiveAt` (inclusive). */
24308
- until: number().optional(),
24309
- limit: number().int().min(1).max(500).default(100),
24310
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
24311
- cursor: string().optional(),
24312
- /**
24313
- * Restrict to these classes — THE SAME FIELD `listRecentTracks` takes, and
24314
- * deliberately the same name: the events filter tree emits one list of ticked
24315
- * taxonomy nodes, and a summaries feed that called it something else would
24316
- * make the operator's one filter component produce two shapes.
24317
- *
24318
- * A question about the MEMBERS: a group matches when ANY of them does. "Show
24319
- * me the arrivals with a dog" has to return the group of four people who had
24320
- * one with them; a filter on the group's own fields could only ever answer
24321
- * about its primary.
24322
- *
24323
- * Matched against all THREE tiers of a member — the class (`animal`), the
24324
- * sub-class (`dog`) and the instance (a name, a plate) — because which tier a
24325
- * ticked node lives on is the taxonomy's business, not the caller's. `dog` is
24326
- * an event kind in the tree and a tier-1 label on an `animal` track; a filter
24327
- * that read only the class would answer "animal" and never "dog".
24328
- *
24329
- * ABSENT or EMPTY means no filter — absent is not a selection of none.
24330
- */
24331
- classes: array(string().min(1).max(60)).max(40).optional()
24332
- });
24333
- var RecentSummariesPageSchema = object({
24334
- /** Ordered by (`lastActiveAt` DESC, id DESC). Same light item as
24335
- * {@link listSummaries} — one list shape, so a card renders the same
24336
- * whichever feed drew it. */
24337
- summaries: array(SummaryListItemSchema).readonly(),
24338
- nextCursor: string().nullable()
24339
- });
24340
24347
  var RecentTracksPageSchema = object({
24341
24348
  /** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
24342
24349
  tracks: array(TrackSchema).readonly(),
@@ -24848,7 +24855,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
24848
24855
  classes: array(string()).optional(),
24849
24856
  /** See {@link ExcludeSourcesDoc}. */
24850
24857
  excludeSources: array(TrackSourceSchema).optional()
24851
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(SummariesQueryInput, SummariesPageSchema), method(RecentSummariesQueryInput, RecentSummariesPageSchema), method(object({ id: string() }), SummaryDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
24858
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
24852
24859
  kind: "mutation",
24853
24860
  auth: "admin"
24854
24861
  }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({ deviceId: number() }), array(EventKindDescriptorSchema).readonly()), method(object({ deviceIds: array(number()).min(1).max(200) }), array(EventKindsForDeviceSchema).readonly()), method(object({
@@ -26224,6 +26231,23 @@ var MotionSourceEnum = _enum([
26224
26231
  */
26225
26232
  var MotionSourcesSchema = array(MotionSourceEnum);
26226
26233
  /**
26234
+ * The operator-facing name of each MOTION source (D672: `onboard` = the
26235
+ * camera's sensors — its own motion plus any sensor attached to it). The wire
26236
+ * value stays `onboard`; only the label changed. `detectionSources: 'onboard'`
26237
+ * ("Camera onboard AI") and the notification source filter keep their labels.
26238
+ */
26239
+ var MOTION_SOURCE_LABELS = {
26240
+ analyzer: "Frame-diff Analyzer (motion addon)",
26241
+ onboard: "Camera sensors",
26242
+ "device-activity": "Device activity (the device says it is working)"
26243
+ };
26244
+ /** The order the motion-source picker offers them in (not the enum's order). */
26245
+ var MOTION_SOURCE_PICKER_ORDER = [
26246
+ "analyzer",
26247
+ "onboard",
26248
+ "device-activity"
26249
+ ];
26250
+ /**
26227
26251
  * Which root detector a camera runs — EXACTLY ONE.
26228
26252
  *
26229
26253
  * Deliberately the SAME vocabulary post-analysis already tags every detection
@@ -26570,7 +26594,14 @@ var RunnerCameraConfigSchema = object({
26570
26594
  */
26571
26595
  inferenceDevices: array(RunnerInferenceDeviceSchema).readonly().optional()
26572
26596
  });
26573
- motionFpsField.min, motionFpsField.max, motionFpsField.step, motionFpsField.default, detectionFpsField.min, detectionFpsField.max, detectionFpsField.step, detectionFpsField.default, motionCooldownMsField.min, motionCooldownMsField.max, motionCooldownMsField.step, motionCooldownMsField.default, maxSessionHoldMsField.min, maxSessionHoldMsField.max, maxSessionHoldMsField.step, maxSessionHoldMsField.default, audioMotionWindowMsField.min, audioMotionWindowMsField.max, audioMotionWindowMsField.step, audioMotionWindowMsField.default, preRollInferenceFramesField.min, preRollInferenceFramesField.max, preRollInferenceFramesField.step, preRollInferenceFramesField.default, occupancyRecheckSecField.min, occupancyRecheckSecField.max, occupancyRecheckSecField.step, occupancyRecheckSecField.default, occupancyRecheckFramesField.min, occupancyRecheckFramesField.max, occupancyRecheckFramesField.step, occupancyRecheckFramesField.default;
26597
+ MOTION_SOURCE_PICKER_ORDER.map((value) => value === "onboard" ? {
26598
+ value,
26599
+ label: MOTION_SOURCE_LABELS[value],
26600
+ description: "The camera's own motion, plus any sensor attached to it"
26601
+ } : {
26602
+ value,
26603
+ label: MOTION_SOURCE_LABELS[value]
26604
+ }), motionFpsField.min, motionFpsField.max, motionFpsField.step, motionFpsField.default, detectionFpsField.min, detectionFpsField.max, detectionFpsField.step, detectionFpsField.default, motionCooldownMsField.min, motionCooldownMsField.max, motionCooldownMsField.step, motionCooldownMsField.default, maxSessionHoldMsField.min, maxSessionHoldMsField.max, maxSessionHoldMsField.step, maxSessionHoldMsField.default, audioMotionWindowMsField.min, audioMotionWindowMsField.max, audioMotionWindowMsField.step, audioMotionWindowMsField.default, preRollInferenceFramesField.min, preRollInferenceFramesField.max, preRollInferenceFramesField.step, preRollInferenceFramesField.default, occupancyRecheckSecField.min, occupancyRecheckSecField.max, occupancyRecheckSecField.step, occupancyRecheckSecField.default, occupancyRecheckFramesField.min, occupancyRecheckFramesField.max, occupancyRecheckFramesField.step, occupancyRecheckFramesField.default;
26574
26605
  /**
26575
26606
  * Runtime load summary returned by `getLocalLoad`. Used by the orchestrator's
26576
26607
  * load-balancing levels (L2 capacity-based, L3 hardware-aware) to decide
@@ -27336,6 +27367,11 @@ var CameraStatusSchema = object({
27336
27367
  */
27337
27368
  switchedOff: array(CameraSwitchIdSchema).readonly(),
27338
27369
  /**
27370
+ * The camera's attached sensors (D672). Optional only for a status composed
27371
+ * by an orchestrator older than D672; this orchestrator always sets it.
27372
+ */
27373
+ cameraSensors: CameraSensorsStatusSchema.optional(),
27374
+ /**
27339
27375
  * Stages of the bounded fan-out that were CUT SHORT — a timeout or a
27340
27376
  * rejection — and whose block is therefore `null` because we could not
27341
27377
  * READ it, not because there is nothing there.
@@ -33907,7 +33943,9 @@ object({
33907
33943
  detected: boolean(),
33908
33944
  timestamp: number(),
33909
33945
  source: MotionSourceEnum,
33910
- regions: array(MotionRegionSchema).readonly().optional()
33946
+ regions: array(MotionRegionSchema).readonly().optional(),
33947
+ /** Who started it (D672). Absent = the camera itself. Only `onboard` carries `sensor`. */
33948
+ triggeredBy: MotionTriggeredBySchema.optional()
33911
33949
  });
33912
33950
  DeviceType.Camera, DeviceType.Sensor, method(object({ deviceId: number() }), boolean());
33913
33951
  object({
@@ -42673,6 +42711,12 @@ Object.freeze({
42673
42711
  addonId: null,
42674
42712
  access: "view"
42675
42713
  },
42714
+ "deviceManager.getWrapperActivation": {
42715
+ capName: "device-manager",
42716
+ capScope: "system",
42717
+ addonId: null,
42718
+ access: "view"
42719
+ },
42676
42720
  "deviceManager.listAll": {
42677
42721
  capName: "device-manager",
42678
42722
  capScope: "system",
@@ -44947,12 +44991,6 @@ Object.freeze({
44947
44991
  addonId: null,
44948
44992
  access: "view"
44949
44993
  },
44950
- "pipelineAnalytics.getSummary": {
44951
- capName: "pipeline-analytics",
44952
- capScope: "device",
44953
- addonId: null,
44954
- access: "view"
44955
- },
44956
44994
  "pipelineAnalytics.getTrack": {
44957
44995
  capName: "pipeline-analytics",
44958
44996
  capScope: "device",
@@ -45013,12 +45051,6 @@ Object.freeze({
45013
45051
  addonId: null,
45014
45052
  access: "view"
45015
45053
  },
45016
- "pipelineAnalytics.listRecentSummaries": {
45017
- capName: "pipeline-analytics",
45018
- capScope: "device",
45019
- addonId: null,
45020
- access: "view"
45021
- },
45022
45054
  "pipelineAnalytics.listRecentTracks": {
45023
45055
  capName: "pipeline-analytics",
45024
45056
  capScope: "device",
@@ -45049,12 +45081,6 @@ Object.freeze({
45049
45081
  addonId: null,
45050
45082
  access: "view"
45051
45083
  },
45052
- "pipelineAnalytics.listSummaries": {
45053
- capName: "pipeline-analytics",
45054
- capScope: "device",
45055
- addonId: null,
45056
- access: "view"
45057
- },
45058
45084
  "pipelineAnalytics.listTrackMedia": {
45059
45085
  capName: "pipeline-analytics",
45060
45086
  capScope: "device",
@@ -48482,6 +48508,11 @@ Object.freeze({
48482
48508
  form: "single",
48483
48509
  optional: false
48484
48510
  }],
48511
+ "deviceManager.getWrapperActivation": [{
48512
+ name: "deviceId",
48513
+ form: "single",
48514
+ optional: false
48515
+ }],
48485
48516
  "deviceManager.listAll": [{
48486
48517
  name: "deviceIds",
48487
48518
  form: "array",
@@ -49219,11 +49250,6 @@ Object.freeze({
49219
49250
  form: "single",
49220
49251
  optional: true
49221
49252
  }],
49222
- "pipelineAnalytics.listRecentSummaries": [{
49223
- name: "deviceIds",
49224
- form: "array",
49225
- optional: false
49226
- }],
49227
49253
  "pipelineAnalytics.listRecentTracks": [{
49228
49254
  name: "deviceIds",
49229
49255
  form: "array",
@@ -49234,11 +49260,6 @@ Object.freeze({
49234
49260
  form: "array",
49235
49261
  optional: true
49236
49262
  }],
49237
- "pipelineAnalytics.listSummaries": [{
49238
- name: "deviceIds",
49239
- form: "array",
49240
- optional: false
49241
- }],
49242
49263
  "pipelineAnalytics.listTrackMedia": [{
49243
49264
  name: "deviceId",
49244
49265
  form: "single",
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-D4lbkRUh.js");
5
+ const require_dist = require("../dist-C2GsZSso.js");
6
6
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
7
7
  let node_fs = require("node:fs");
8
8
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { _n as hydrateSchema, ln as BaseAddon, on as DeviceType, st as evaluateZoneRules, wt as motionDetectionCapability } from "../dist-BdYgTuWJ.mjs";
1
+ import { _n as hydrateSchema, ln as BaseAddon, on as DeviceType, st as evaluateZoneRules, wt as motionDetectionCapability } from "../dist-B0mdAGsn.mjs";
2
2
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { join } from "node:path";
@@ -1,4 +1,4 @@
1
- import { en as Fmp4BoxSplitter, in as isSoftwareDecode, sn as errMsg, tn as buildFfmpegArgs } from "./dist-BdYgTuWJ.mjs";
1
+ import { en as Fmp4BoxSplitter, in as isSoftwareDecode, sn as errMsg, tn as buildFfmpegArgs } from "./dist-B0mdAGsn.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { realpathSync } from "node:fs";
4
4
  import path from "node:path";
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-D4lbkRUh.js");
2
+ const require_dist = require("./dist-C2GsZSso.js");
3
3
  let node_crypto = require("node:crypto");
4
4
  let node_fs = require("node:fs");
5
5
  node_fs = require_chunk.__toESM(node_fs, 1);
@@ -3,9 +3,9 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-D4lbkRUh.js");
7
- const require_node = require("../node-BMmRQfH_.js");
8
- const require_default_detection_model = require("../default-detection-model-BsXfdMCG.js");
6
+ const require_dist = require("../dist-C2GsZSso.js");
7
+ const require_node = require("../node-DA9sHeo7.js");
8
+ const require_default_detection_model = require("../default-detection-model-CeYzI_ws.js");
9
9
  const require_worker_protocol = require("../worker-protocol-C-G8qmye.js");
10
10
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
11
11
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
@@ -893,9 +893,10 @@ async function withRetainedReader(store, handle, read) {
893
893
  *
894
894
  * The real defect is caller-side and is not fixed here: a ~1 Hz
895
895
  * `TrackDetailDispatcher` re-asks a frozen handle for the life of a coasted
896
- * track, and `persistKeyFrames` / `offerGroupShot` are the only capture sites
897
- * that omit `staleAfterMs`. ADR-0419 named both as open; until they are fixed
898
- * a tighter bound cannot be told apart from a broken one.
896
+ * track. ADR-0419 also named the by-handle key-frame and group-shot captures
897
+ * as omitting `staleAfterMs`; both are gone (the key frame reads a parked
898
+ * parcel since D422, the group shot is deleted by D680). Until the dispatcher
899
+ * is fixed a tighter bound cannot be told apart from a broken one.
899
900
  */
900
901
  var NATIVE_CROP_LEASE_MAX_AGE_MS = 3e4;
901
902
  function classifyNativeCropLeaseAge(ageMs, maxAgeMs = NATIVE_CROP_LEASE_MAX_AGE_MS) {
@@ -1,6 +1,6 @@
1
- import { An as lazy, C as FailureCounters, D as NativeLeaseAdmissionSchema, Dn as array, E as MOTION_CLOSE_AFTER_MS, En as _enum, In as string, Mn as number, Nn as object, O as NativeLeaseSettingsSchema, On as boolean, Ot as pickDetailCropConvention, Rn as EventCategory, _ as DEFAULT_NATIVE_LEASE_SETTINGS, dt as failureContributionCapability, gt as loadContributionCapability, h as DEFAULT_DETAIL_CROP_CONVENTION, hn as defineCustomActions, i as BackgroundRunRegistry, jn as literal, jt as pipelineRunnerCapability, kt as pickNativeLeaseOverride, ln as BaseAddon, mn as customAction, pn as createEvent, sn as errMsg, tt as deriveDetailCropRect, xn as nodePin } from "../dist-BdYgTuWJ.mjs";
2
- import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-DTG5A-3e.mjs";
3
- import { c as macroGateVerdict, d as resolveFrameViewGeometry, g as getStepDefinition, l as rootObjectGate, o as placeDetailStep, r as CustomModelCatalog, s as stepsForElectedPool, u as localFrameRegistry, v as RETIRED_MODEL_IDS } from "../default-detection-model-BduwEjht.mjs";
1
+ import { An as lazy, C as FailureCounters, D as NativeLeaseAdmissionSchema, Dn as array, E as MOTION_CLOSE_AFTER_MS, En as _enum, In as string, Mn as number, Nn as object, O as NativeLeaseSettingsSchema, On as boolean, Ot as pickDetailCropConvention, Rn as EventCategory, _ as DEFAULT_NATIVE_LEASE_SETTINGS, dt as failureContributionCapability, gt as loadContributionCapability, h as DEFAULT_DETAIL_CROP_CONVENTION, hn as defineCustomActions, i as BackgroundRunRegistry, jn as literal, jt as pipelineRunnerCapability, kt as pickNativeLeaseOverride, ln as BaseAddon, mn as customAction, pn as createEvent, sn as errMsg, tt as deriveDetailCropRect, xn as nodePin } from "../dist-B0mdAGsn.mjs";
2
+ import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-C4FxPOmq.mjs";
3
+ import { c as macroGateVerdict, d as resolveFrameViewGeometry, g as getStepDefinition, l as rootObjectGate, o as placeDetailStep, r as CustomModelCatalog, s as stepsForElectedPool, u as localFrameRegistry, v as RETIRED_MODEL_IDS } from "../default-detection-model-CmdkU7Ik.mjs";
4
4
  import { t as isWorkerReply } from "../worker-protocol-D_NzPcnh.mjs";
5
5
  import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
6
6
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
@@ -886,9 +886,10 @@ async function withRetainedReader(store, handle, read) {
886
886
  *
887
887
  * The real defect is caller-side and is not fixed here: a ~1 Hz
888
888
  * `TrackDetailDispatcher` re-asks a frozen handle for the life of a coasted
889
- * track, and `persistKeyFrames` / `offerGroupShot` are the only capture sites
890
- * that omit `staleAfterMs`. ADR-0419 named both as open; until they are fixed
891
- * a tighter bound cannot be told apart from a broken one.
889
+ * track. ADR-0419 also named the by-handle key-frame and group-shot captures
890
+ * as omitting `staleAfterMs`; both are gone (the key frame reads a parked
891
+ * parcel since D422, the group shot is deleted by D680). Until the dispatcher
892
+ * is fixed a tighter bound cannot be told apart from a broken one.
892
893
  */
893
894
  var NATIVE_CROP_LEASE_MAX_AGE_MS = 3e4;
894
895
  function classifyNativeCropLeaseAge(ageMs, maxAgeMs = NATIVE_CROP_LEASE_MAX_AGE_MS) {
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-D4lbkRUh.js");
2
+ const require_dist = require("./dist-C2GsZSso.js");
3
3
  let node_fs = require("node:fs");
4
4
  node_fs = require_chunk.__toESM(node_fs);
5
5
  let node_child_process = require("node:child_process");
@@ -1,4 +1,4 @@
1
- import { Et as parseProcStatus } from "./dist-BdYgTuWJ.mjs";
1
+ import { Et as parseProcStatus } from "./dist-B0mdAGsn.mjs";
2
2
  import * as fs from "node:fs";
3
3
  import { execFile } from "node:child_process";
4
4
  //#region src/shared/node-topology-platform.ts
@@ -3,8 +3,8 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-D4lbkRUh.js");
7
- const require_node = require("../node-BMmRQfH_.js");
6
+ const require_dist = require("../dist-C2GsZSso.js");
7
+ const require_node = require("../node-DA9sHeo7.js");
8
8
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
9
9
  const require_restream_intent = require("../restream-intent-7uDNqMKs.js");
10
10
  const require_retire_root_keys = require("../retire-root-keys-Csb8z2f3.js");
@@ -6026,9 +6026,7 @@ Object.freeze({
6026
6026
  "getMotionEvents": { "limit": 1e3 },
6027
6027
  "getObjectEvents": { "limit": 1e3 },
6028
6028
  "getSensorEvents": { "limit": 1e3 },
6029
- "listRecentSummaries": { "limit": 100 },
6030
6029
  "listRecentTracks": { "limit": 200 },
6031
- "listSummaries": { "limit": 50 },
6032
6030
  "reclaimDebugMedia": { "mode": "report" },
6033
6031
  "searchObjectEvents": { "limit": 50 }
6034
6032
  },
@@ -1,5 +1,5 @@
1
- import { B as VISIT_MERGE_GAP_MS, Bt as resolveLocationMode, Ct as modeMayWrite, Dn as array, En as _enum, F as RECORDING_SOURCE_CAMSTACK_ADDON, Fn as record, Ft as recordingExportCapability, Gt as storageEvictableCapability, Ht as resolveRecordingProfiles, I as RecordingConfigSchema, In as string, It as recordingSignalCapability, J as clipExportFailure, Jt as stripRetiredBandPreBufferSec, K as batteryCapability, Kt as storageOccupancyCapability, L as RecordingSignalStatusSchema, Mn as number, N as RECORDING_EXPORT_MAX_READ_BYTES, Nn as object, Nt as recordingArchiveCapability, On as boolean, P as RECORDING_SOURCE_CAMSTACK, Pn as preprocess, Pt as recordingCapability, Rn as EventCategory, Rt as resolveCreateExportSubject, S as ExportRecordSchema, St as migrateLegacyDeviceSignalConfig, Tn as sleep$1, Xt as videoclipsCapability, Y as clipExportFailureOf, _n as hydrateSchema, a as BatteryStatusSchema, an as DeviceFeature, b as EVENT_PAD_MS, bt as mayReadLocation, ct as evictionPolicyForMode, et as deriveBatteryPresence, ft as gbToBytes, g as DEFAULT_EVENTS_BAND_BUFFER_SEC, gt as loadContributionCapability, hn as defineCustomActions, ht as isFirstLevelMacroClass, k as OpsLogEntrySchema, ln as BaseAddon, lt as evictionPolicyOfLocation, mn as customAction, nn as evaluateSensorEdge, nt as deriveRecordingMode, o as CLIP_BROKER_PACED_RATES, on as DeviceType, sn as errMsg$1, ut as exportSubjectOf, wn as selectAssignedProfileSlots, xn as nodePin, xt as mayWriteToLocation, y as EVENT_OWNER_TYPES, z as VIDEOCLIPS_MAX_OFFER_BYTES } from "../dist-BdYgTuWJ.mjs";
2
- import { a as physicalRootOf, i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-DTG5A-3e.mjs";
1
+ import { B as VISIT_MERGE_GAP_MS, Bt as resolveLocationMode, Ct as modeMayWrite, Dn as array, En as _enum, F as RECORDING_SOURCE_CAMSTACK_ADDON, Fn as record, Ft as recordingExportCapability, Gt as storageEvictableCapability, Ht as resolveRecordingProfiles, I as RecordingConfigSchema, In as string, It as recordingSignalCapability, J as clipExportFailure, Jt as stripRetiredBandPreBufferSec, K as batteryCapability, Kt as storageOccupancyCapability, L as RecordingSignalStatusSchema, Mn as number, N as RECORDING_EXPORT_MAX_READ_BYTES, Nn as object, Nt as recordingArchiveCapability, On as boolean, P as RECORDING_SOURCE_CAMSTACK, Pn as preprocess, Pt as recordingCapability, Rn as EventCategory, Rt as resolveCreateExportSubject, S as ExportRecordSchema, St as migrateLegacyDeviceSignalConfig, Tn as sleep$1, Xt as videoclipsCapability, Y as clipExportFailureOf, _n as hydrateSchema, a as BatteryStatusSchema, an as DeviceFeature, b as EVENT_PAD_MS, bt as mayReadLocation, ct as evictionPolicyForMode, et as deriveBatteryPresence, ft as gbToBytes, g as DEFAULT_EVENTS_BAND_BUFFER_SEC, gt as loadContributionCapability, hn as defineCustomActions, ht as isFirstLevelMacroClass, k as OpsLogEntrySchema, ln as BaseAddon, lt as evictionPolicyOfLocation, mn as customAction, nn as evaluateSensorEdge, nt as deriveRecordingMode, o as CLIP_BROKER_PACED_RATES, on as DeviceType, sn as errMsg$1, ut as exportSubjectOf, wn as selectAssignedProfileSlots, xn as nodePin, xt as mayWriteToLocation, y as EVENT_OWNER_TYPES, z as VIDEOCLIPS_MAX_OFFER_BYTES } from "../dist-B0mdAGsn.mjs";
2
+ import { a as physicalRootOf, i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-C4FxPOmq.mjs";
3
3
  import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
4
4
  import { d as PREBUFFER_MAX_MS, l as withRecordingIntent, r as RECORDING_PRE_ROLL_REQUEST_MS } from "../restream-intent-DyGmLAU9.mjs";
5
5
  import { n as RowMapStore, t as retireRootKeys } from "../retire-root-keys-DZvlso2l.mjs";
@@ -6018,9 +6018,7 @@ Object.freeze({
6018
6018
  "getMotionEvents": { "limit": 1e3 },
6019
6019
  "getObjectEvents": { "limit": 1e3 },
6020
6020
  "getSensorEvents": { "limit": 1e3 },
6021
- "listRecentSummaries": { "limit": 100 },
6022
6021
  "listRecentTracks": { "limit": 200 },
6023
- "listSummaries": { "limit": 50 },
6024
6022
  "reclaimDebugMedia": { "mode": "report" },
6025
6023
  "searchObjectEvents": { "limit": 50 }
6026
6024
  },
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-D4lbkRUh.js");
2
+ const require_dist = require("./dist-C2GsZSso.js");
3
3
  let node_child_process = require("node:child_process");
4
4
  //#region src/stream-broker/recorded/avcc-annexb.ts
5
5
  /**
@@ -1,5 +1,5 @@
1
1
  import { r as __toESM, t as __commonJSMin } from "./chunk-DnnnRqeS.mjs";
2
- import { sn as errMsg } from "./dist-BdYgTuWJ.mjs";
2
+ import { sn as errMsg } from "./dist-B0mdAGsn.mjs";
3
3
  import { spawn } from "node:child_process";
4
4
  //#region src/stream-broker/recorded/avcc-annexb.ts
5
5
  /**
@@ -1,7 +1,7 @@
1
- import { a as e, c as t, d as n, f as r, i, l as a, n as o, o as s, p as c, r as l, s as u, t as d, u as f } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CR9IIPsz.mjs";
1
+ import { a as e, c as t, d as n, f as r, i, l as a, n as o, o as s, p as c, r as l, s as u, t as d, u as f } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CdKbuxqG.mjs";
2
2
  import { a as p, i as m, n as h, o as g, r as _, t as v } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare__react__loadShare__.js-C9j-2lBe.mjs";
3
3
  import { n as y, r as b, t as x } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-XO0-Pyu6.mjs";
4
- import { t as S } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-X_j7TiDp.mjs";
4
+ import { t as S } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DKNdMa3E.mjs";
5
5
  import { n as C, t as w } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-BO7TIbJV.mjs";
6
6
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
7
7
  var T = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), E = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), D = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), O = (e) => {