@camstack/addon-pipeline 1.2.615 → 1.2.616

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 (38) hide show
  1. package/THIRD_PARTY_MODELS.md +2 -2
  2. package/dist/audio-analyzer/index.js +3 -3
  3. package/dist/audio-analyzer/index.mjs +3 -3
  4. package/dist/{custom-model-catalog-DFuM_m3D.js → custom-model-catalog-D0EZW4Xb.js} +3 -3
  5. package/dist/{custom-model-catalog-BmJXsT0k.mjs → custom-model-catalog-D3NopOC9.mjs} +3 -3
  6. package/dist/detection-pipeline/index.js +114 -6
  7. package/dist/detection-pipeline/index.mjs +114 -6
  8. package/dist/{dist-CfOv146z.mjs → dist-BWPVIuD_.mjs} +114 -61
  9. package/dist/{dist-B_1t8oSg.js → dist-D2aJhYm7.js} +114 -61
  10. package/dist/{model-catalogs-Dr-_ANpG.js → model-catalogs-BDJEmiKm.js} +14 -4
  11. package/dist/{model-catalogs-Dnj7Cr3q.mjs → model-catalogs-CYoIeMo4.mjs} +14 -4
  12. package/dist/motion-wasm/index.js +1 -1
  13. package/dist/motion-wasm/index.mjs +1 -1
  14. package/dist/{node-D82_5p1M.js → node-BKs5_GlD.js} +1 -1
  15. package/dist/{node-tn9-iwDj.mjs → node-D48F38hW.mjs} +1 -1
  16. package/dist/pipeline-runner/index.js +3 -3
  17. package/dist/pipeline-runner/index.mjs +3 -3
  18. package/dist/{process-memory-CD5f3ehN.mjs → process-memory-58pkBnTk.mjs} +1 -1
  19. package/dist/{process-memory-BlkUi_7x.js → process-memory-BY-1p6rF.js} +1 -1
  20. package/dist/recorder/index.js +80 -5
  21. package/dist/recorder/index.mjs +80 -5
  22. package/dist/{segment-demux-js-uWcwFqRL.js → segment-demux-js-DbM8w1dc.js} +1 -1
  23. package/dist/{segment-demux-js-Cx61fdp7.mjs → segment-demux-js-VeHvPIJe.mjs} +1 -1
  24. package/dist/stream-broker/_stub.js +2 -2
  25. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-dldjR7yB.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-B6vm1OlX.mjs} +3 -3
  26. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-qcb2Czgh.mjs +26 -0
  27. package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BvJiBUdN.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-TnEvW5tZ.mjs} +1 -1
  28. package/dist/stream-broker/demux-worker-child.js +1 -1
  29. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  30. package/dist/stream-broker/{hostInit-Bo0bh2FZ.mjs → hostInit-BnK9Yje5.mjs} +3 -3
  31. package/dist/stream-broker/index.js +38 -5
  32. package/dist/stream-broker/index.mjs +38 -5
  33. package/dist/stream-broker/remoteEntry.js +1 -1
  34. package/package.json +1 -1
  35. package/python/inference_pool.py +33 -0
  36. package/python/openvino_compile_probe.py +245 -0
  37. package/python/test_openvino_compile_probe.py +298 -0
  38. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D4kDfIKO.mjs +0 -26
@@ -1,5 +1,5 @@
1
1
  let node_crypto = require("node:crypto");
2
- //#region ../types/dist/event-category-7pZEBmVg.mjs
2
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -316,6 +316,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
316
316
  */
317
317
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
318
318
  /**
319
+ * A camera's motion source has fired constantly with no subject for an hour
320
+ * (motion duty or session count over the bar, zero detections) — it is not
321
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
322
+ * {@link PipelineMotionCalm}.
323
+ */
324
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
325
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
326
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
327
+ /**
319
328
  * Per-camera pipeline config was mutated by the orchestrator
320
329
  * (3-level settings change via `setAgentAddonDefaults` /
321
330
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -5555,7 +5564,7 @@ var ZodIssueCode = {
5555
5564
  var ZodFirstPartyTypeKind;
5556
5565
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5557
5566
  //#endregion
5558
- //#region ../types/dist/sleep-CueztlR1.mjs
5567
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5559
5568
  /**
5560
5569
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5561
5570
  * window to float samples (D455).
@@ -8195,7 +8204,7 @@ var EntryDescriptorSchema = object({
8195
8204
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
8196
8205
  fields: record(string(), unknown())
8197
8206
  }).strict();
8198
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
8207
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
8199
8208
  var RecordKindDeclarationSchema = object({
8200
8209
  database: _enum(RECORD_DATABASES).default("settings"),
8201
8210
  class: _enum(RECORD_CLASSES),
@@ -8214,14 +8223,6 @@ var RecordKindDeclarationSchema = object({
8214
8223
  secretPaths: array(string().min(1)).default([]),
8215
8224
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8216
8225
  secretArrayKeys: record(string(), string()).default({}),
8217
- /**
8218
- * RETIRED (D900): the legacy table a kind adopted from during the records
8219
- * migration. Nothing declares it any more and nothing reads it; the schema
8220
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8221
- * (an orphaned kind is never redeclared) and an addon built before the
8222
- * removal still sends it. Never set it.
8223
- */
8224
- adoptsFrom: string().min(1).optional(),
8225
8226
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8226
8227
  transactFamily: string().min(1).optional(),
8227
8228
  entry: EntryDescriptorSchema.optional()
@@ -15471,17 +15472,6 @@ object({
15471
15472
  createdAt: number(),
15472
15473
  updatedAt: number()
15473
15474
  });
15474
- object({
15475
- id: string(),
15476
- label: string(),
15477
- isAdmin: boolean().default(false),
15478
- allowedProviders: AllowedProviderSchema,
15479
- allowedDevices: AllowedDevicesSchema,
15480
- tokenHash: string(),
15481
- tokenPrefix: string(),
15482
- createdAt: number(),
15483
- lastUsedAt: number().optional()
15484
- });
15485
15475
  object({
15486
15476
  id: string(),
15487
15477
  userId: string(),
@@ -19829,16 +19819,36 @@ var RecordKindStateSchema = _enum([
19829
19819
  var DeclareKindResultSchema = object({
19830
19820
  kindId: number().int(),
19831
19821
  state: RecordKindStateSchema,
19832
- createdIndexes: array(string()),
19833
- /**
19834
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
19835
- * it stays on the wire, null, because an addon built before the removal reads
19836
- * an ABSENT field as "adoption pending" and refuses to start.
19837
- */
19838
- adoptionPending: _null()
19822
+ createdIndexes: array(string())
19839
19823
  });
19840
19824
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
19841
19825
  var SecretRefsList = array(string());
19826
+ /**
19827
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
19828
+ * All ops of one call share ONE database file and ONE `transactFamily`.
19829
+ */
19830
+ var RecordTransactOpSchema = discriminatedUnion("op", [
19831
+ object({
19832
+ op: literal("put"),
19833
+ kind: RecordKindNameSchema,
19834
+ record: RecordInputSchema,
19835
+ ifRev: number().int().min(0).optional()
19836
+ }),
19837
+ object({
19838
+ op: literal("patch"),
19839
+ kind: RecordKindNameSchema,
19840
+ id: RecordIdSchema,
19841
+ data: RecordBodySchema,
19842
+ at: number().int().nullable().optional(),
19843
+ expiresAt: number().int().nullable().optional(),
19844
+ ifRev: number().int().min(1).optional()
19845
+ }),
19846
+ object({
19847
+ op: literal("delete"),
19848
+ kind: RecordKindNameSchema,
19849
+ id: RecordIdSchema
19850
+ })
19851
+ ]);
19842
19852
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
19843
19853
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
19844
19854
  kind: "mutation",
@@ -19945,6 +19955,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
19945
19955
  }), {
19946
19956
  kind: "mutation",
19947
19957
  auth: "admin"
19958
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
19959
+ results: array(object({
19960
+ rev: number().int().nullable(),
19961
+ deleted: boolean()
19962
+ })),
19963
+ releasedRefs: SecretRefsList,
19964
+ secretRefs: SecretRefsList
19965
+ }), {
19966
+ kind: "mutation",
19967
+ auth: "admin"
19948
19968
  }), method(object({
19949
19969
  deviceId: number().int(),
19950
19970
  kinds: array(RecordKindNameSchema).optional()
@@ -45748,9 +45768,13 @@ var NcSystemEventKindSchema = _enum([
45748
45768
  "node-updating",
45749
45769
  "node-inference-unavailable",
45750
45770
  "detection-blind",
45771
+ "motion-noisy",
45772
+ "motion-calm",
45751
45773
  "recording-stalled",
45752
45774
  "recording-healthy",
45753
45775
  "recording-degraded",
45776
+ "device-attention-required",
45777
+ "device-attention-resolved",
45754
45778
  "storage-location-low",
45755
45779
  "storage-location-critical",
45756
45780
  "storage-location-ok",
@@ -59166,6 +59190,16 @@ object({
59166
59190
  powerState: string().nullable(),
59167
59191
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
59168
59192
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
59193
+ /**
59194
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
59195
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
59196
+ * when none is reported. A cleared reminder is not an unknown one.
59197
+ */
59198
+ filterCleaningDue: boolean().nullable(),
59199
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
59200
+ machineCareDue: boolean().nullable(),
59201
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
59202
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
59169
59203
  /** Option states: null when the appliance does not expose the option or has not said. */
59170
59204
  halfLoad: boolean().nullable(),
59171
59205
  hygienePlus: boolean().nullable(),
@@ -66307,16 +66341,6 @@ var UpdateUserInputSchema = object({
66307
66341
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
66308
66342
  scopes: array(TokenScopeSchema).optional()
66309
66343
  });
66310
- var ApiKeySummarySchema = object({
66311
- id: string(),
66312
- label: string(),
66313
- isAdmin: boolean().default(false),
66314
- allowedProviders: union([array(string()), literal("*")]).optional(),
66315
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
66316
- tokenPrefix: string(),
66317
- createdAt: number(),
66318
- lastUsedAt: number().optional()
66319
- });
66320
66344
  var OauthSessionSummarySchema = object({
66321
66345
  id: string(),
66322
66346
  userId: string(),
@@ -66338,8 +66362,7 @@ var TotpStatusSchema = object({
66338
66362
  confirmedAt: number().nullable()
66339
66363
  });
66340
66364
  /**
66341
- * user-management — singleton capability for user accounts and the
66342
- * legacy API-key rows.
66365
+ * user-management — singleton capability for user accounts.
66343
66366
  *
66344
66367
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
66345
66368
  * — the subset check on `setUserScopes` is moot
@@ -66395,10 +66418,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
66395
66418
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
66396
66419
  kind: "mutation",
66397
66420
  access: "view"
66398
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
66399
- kind: "mutation",
66400
- auth: "admin",
66401
- access: "delete"
66402
66421
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
66403
66422
  kind: "mutation",
66404
66423
  auth: "admin",
@@ -73929,6 +73948,12 @@ Object.freeze({
73929
73948
  addonId: null,
73930
73949
  access: "view"
73931
73950
  },
73951
+ "records.transact": {
73952
+ capName: "records",
73953
+ capScope: "system",
73954
+ addonId: null,
73955
+ access: "create"
73956
+ },
73932
73957
  "sceneMonitor.captureReference": {
73933
73958
  capName: "scene-monitor",
73934
73959
  capScope: "device",
@@ -75261,12 +75286,6 @@ Object.freeze({
75261
75286
  addonId: null,
75262
75287
  access: "view"
75263
75288
  },
75264
- "userManagement.listApiKeys": {
75265
- capName: "user-management",
75266
- capScope: "system",
75267
- addonId: null,
75268
- access: "view"
75269
- },
75270
75289
  "userManagement.listExternalIdentities": {
75271
75290
  capName: "user-management",
75272
75291
  capScope: "system",
@@ -75321,12 +75340,6 @@ Object.freeze({
75321
75340
  addonId: null,
75322
75341
  access: "create"
75323
75342
  },
75324
- "userManagement.revokeApiKey": {
75325
- capName: "user-management",
75326
- capScope: "system",
75327
- addonId: null,
75328
- access: "delete"
75329
- },
75330
75343
  "userManagement.revokeOauthSession": {
75331
75344
  capName: "user-management",
75332
75345
  capScope: "system",
@@ -78741,9 +78754,13 @@ new Map(Object.entries({
78741
78754
  "stream-online": "device-events",
78742
78755
  "stream-offline": "device-events",
78743
78756
  "detection-blind": "device-events",
78757
+ "motion-noisy": "device-events",
78758
+ "motion-calm": "device-events",
78744
78759
  "recording-stalled": "device-events",
78745
78760
  "recording-healthy": "device-events",
78746
78761
  "recording-degraded": "device-events",
78762
+ "device-attention-required": "device-events",
78763
+ "device-attention-resolved": "device-events",
78747
78764
  "node-online": "system",
78748
78765
  "node-offline": "system",
78749
78766
  "node-restarting": "system",
@@ -78826,6 +78843,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78826
78843
  label: "Detecting nothing",
78827
78844
  kinds: ["detection-blind"]
78828
78845
  },
78846
+ {
78847
+ id: "motion-noise",
78848
+ family: "device-events",
78849
+ label: "Motion without a subject",
78850
+ kinds: ["motion-noisy", "motion-calm"]
78851
+ },
78829
78852
  {
78830
78853
  id: "recording",
78831
78854
  family: "device-events",
@@ -78836,6 +78859,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78836
78859
  "recording-degraded"
78837
78860
  ]
78838
78861
  },
78862
+ {
78863
+ id: "device-attention",
78864
+ family: "device-events",
78865
+ label: "Needs attention",
78866
+ kinds: ["device-attention-required", "device-attention-resolved"]
78867
+ },
78839
78868
  {
78840
78869
  id: "nodes",
78841
78870
  family: "system",
@@ -78975,6 +79004,7 @@ var ALERT_EPISODE = [
78975
79004
  "alert-error",
78976
79005
  "alert-critical-resolved"
78977
79006
  ];
79007
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
78978
79008
  var UPDATES = [
78979
79009
  "addon-update-available",
78980
79010
  "server-update-available",
@@ -79004,9 +79034,12 @@ var DEVICE_EVENTS = [
79004
79034
  "stream-online",
79005
79035
  "stream-offline",
79006
79036
  "detection-blind",
79037
+ "motion-noisy",
79038
+ "motion-calm",
79007
79039
  "recording-stalled",
79008
79040
  "recording-healthy",
79009
79041
  "recording-degraded",
79042
+ ...DEVICE_ATTENTION,
79010
79043
  ...ALARM
79011
79044
  ];
79012
79045
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -79174,7 +79207,9 @@ var STATE_SUMMARY_VARS = [
79174
79207
  [...RULE_TEXT],
79175
79208
  [...RULE_TEXT],
79176
79209
  [...RULE_TEXT],
79177
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79210
+ [...RULE_TEXT],
79211
+ [...RULE_TEXT],
79212
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79178
79213
  [...RULE_TEXT],
79179
79214
  [...RULE_TEXT],
79180
79215
  [...RULE_TEXT],
@@ -79196,11 +79231,11 @@ var STATE_SUMMARY_VARS = [
79196
79231
  [...RULE_TEXT],
79197
79232
  [...RULE_TEXT],
79198
79233
  [...RULE_TEXT],
79234
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79199
79235
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79236
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79200
79237
  ([...RULE_TEXT], [...ALERT_EPISODE]),
79201
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79202
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79203
- ([...RULE_TEXT], [...ALERT_EPISODE]),
79238
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
79204
79239
  [...RULE_TEXT],
79205
79240
  [...RULE_TEXT],
79206
79241
  [...RULE_TEXT],
@@ -79276,6 +79311,15 @@ new Map([
79276
79311
  snapshotLabel: "Tanks low or full now",
79277
79312
  snapshotSection: "tanks"
79278
79313
  },
79314
+ {
79315
+ id: "motion-noise",
79316
+ family: "device-events",
79317
+ label: "Motion without a subject (constant / calm again)",
79318
+ bad: ["motion-noisy"],
79319
+ recovery: ["motion-calm"],
79320
+ snapshotLabel: "Cameras with constant motion now",
79321
+ snapshotSection: null
79322
+ },
79279
79323
  {
79280
79324
  id: "recording-health",
79281
79325
  family: "device-events",
@@ -79285,6 +79329,15 @@ new Map([
79285
79329
  snapshotLabel: "Recordings stalled now",
79286
79330
  snapshotSection: null
79287
79331
  },
79332
+ {
79333
+ id: "device-attention",
79334
+ family: "device-events",
79335
+ label: "Device needs attention (raised / resolved)",
79336
+ bad: ["device-attention-required"],
79337
+ recovery: ["device-attention-resolved"],
79338
+ snapshotLabel: "Devices needing attention now",
79339
+ snapshotSection: null
79340
+ },
79288
79341
  {
79289
79342
  id: "node-connectivity",
79290
79343
  family: "system",
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-B_1t8oSg.js");
1
+ const require_dist = require("./dist-D2aJhYm7.js");
2
2
  //#region src/detection-pipeline/registry/model-licenses.ts
3
3
  var COCO_DATA = {
4
4
  name: "COCO 2017",
@@ -425,9 +425,9 @@ var COCO17_LABELS = [
425
425
  * Mirrored unchanged on our Hugging Face repo from the publisher's release
426
426
  * (`release`); the revision comes from the mirror's table (D744), and the
427
427
  * corresponding source sits in
428
- * `source/yolov9-edgetpu-dbro/`. Selectable only: the tflite default stays the Coral SSD, and
429
- * no hardware rule names these (D39). Floors are the stock defaults until
430
- * measured.
428
+ * `source/yolov9-edgetpu-dbro/`. The 320 build is the tflite default (D908); the
429
+ * 512 build is selectable. Floors: their own rows in
430
+ * `OBJECT_DETECTION_CLASS_FLOORS`.
431
431
  */
432
432
  var yolov9EdgeTpuEntry = (res, release, file, sizeMB, note) => ({
433
433
  id: `yolov9s-${res}-edgetpu`,
@@ -1071,6 +1071,16 @@ var OBJECT_DETECTION_CLASS_FLOORS = {
1071
1071
  person: .6,
1072
1072
  vehicle: .55,
1073
1073
  animal: .55
1074
+ },
1075
+ "yolov9s-320-edgetpu": {
1076
+ person: .4,
1077
+ vehicle: .4,
1078
+ animal: .3
1079
+ },
1080
+ "yolov9s-512-edgetpu": {
1081
+ person: .4,
1082
+ vehicle: .4,
1083
+ animal: .3
1074
1084
  }
1075
1085
  };
1076
1086
  /**
@@ -1,4 +1,4 @@
1
- import { Gn as hfModelUrl, f as COCO_80_LABELS } from "./dist-CfOv146z.mjs";
1
+ import { Gn as hfModelUrl, f as COCO_80_LABELS } from "./dist-BWPVIuD_.mjs";
2
2
  //#region src/detection-pipeline/registry/model-licenses.ts
3
3
  var COCO_DATA = {
4
4
  name: "COCO 2017",
@@ -425,9 +425,9 @@ var COCO17_LABELS = [
425
425
  * Mirrored unchanged on our Hugging Face repo from the publisher's release
426
426
  * (`release`); the revision comes from the mirror's table (D744), and the
427
427
  * corresponding source sits in
428
- * `source/yolov9-edgetpu-dbro/`. Selectable only: the tflite default stays the Coral SSD, and
429
- * no hardware rule names these (D39). Floors are the stock defaults until
430
- * measured.
428
+ * `source/yolov9-edgetpu-dbro/`. The 320 build is the tflite default (D908); the
429
+ * 512 build is selectable. Floors: their own rows in
430
+ * `OBJECT_DETECTION_CLASS_FLOORS`.
431
431
  */
432
432
  var yolov9EdgeTpuEntry = (res, release, file, sizeMB, note) => ({
433
433
  id: `yolov9s-${res}-edgetpu`,
@@ -1071,6 +1071,16 @@ var OBJECT_DETECTION_CLASS_FLOORS = {
1071
1071
  person: .6,
1072
1072
  vehicle: .55,
1073
1073
  animal: .55
1074
+ },
1075
+ "yolov9s-320-edgetpu": {
1076
+ person: .4,
1077
+ vehicle: .4,
1078
+ animal: .3
1079
+ },
1080
+ "yolov9s-512-edgetpu": {
1081
+ person: .4,
1082
+ vehicle: .4,
1083
+ animal: .3
1074
1084
  }
1075
1085
  };
1076
1086
  /**
@@ -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-B_1t8oSg.js");
5
+ const require_dist = require("../dist-D2aJhYm7.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 { Ct as evaluateZoneRules, Gt as motionDetectionCapability, Kn as hydrateSchema, Pn as BaseAddon, jn as DeviceType } from "../dist-CfOv146z.mjs";
1
+ import { Ct as evaluateZoneRules, Gt as motionDetectionCapability, Kn as hydrateSchema, Pn as BaseAddon, jn as DeviceType } from "../dist-BWPVIuD_.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,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-B_1t8oSg.js");
2
+ const require_dist = require("./dist-D2aJhYm7.js");
3
3
  require("node:os");
4
4
  let node_crypto = require("node:crypto");
5
5
  let node_fs = require("node:fs");
@@ -1,4 +1,4 @@
1
- import { En as buildFfmpegArgs, Mn as errMsg, Tn as Fmp4BoxSplitter, kn as isSoftwareDecode } from "./dist-CfOv146z.mjs";
1
+ import { En as buildFfmpegArgs, Mn as errMsg, Tn as Fmp4BoxSplitter, kn as isSoftwareDecode } from "./dist-BWPVIuD_.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { realpathSync } from "node:fs";
4
4
  import path from "node:path";
@@ -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-B_1t8oSg.js");
7
- const require_node = require("../node-D82_5p1M.js");
8
- const require_custom_model_catalog = require("../custom-model-catalog-DFuM_m3D.js");
6
+ const require_dist = require("../dist-D2aJhYm7.js");
7
+ const require_node = require("../node-BKs5_GlD.js");
8
+ const require_custom_model_catalog = require("../custom-model-catalog-D0EZW4Xb.js");
9
9
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
10
10
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
11
11
  const require_restream_intent = require("../restream-intent-7uDNqMKs.js");
@@ -1,6 +1,6 @@
1
- import { A as NativeLeaseAdmissionSchema, Bn as createEvent, Dt as failureContributionCapability, E as FailureCounters, Ft as linkedStepOf, Hn as defineCustomActions, It as loadContributionCapability, M as NodeBenchRunnerInputSchema, Mn as errMsg, P as PIPELINE_RAMP, Pn as BaseAddon, Qn as nodePin, Qt as pipelineRunnerCapability, Rn as MODEL_FORMATS, V as ROOT_SUPPLIABLE_STEP_IDS, Vn as customAction, Xt as pickNativeLeaseOverride, Y as allowedSuppliedEffect, Yt as pickDetailCropConvention, _ as DEFAULT_DETAIL_CROP_CONVENTION, a as BackgroundRunRegistry, ar as boolean, cn as resolveModelBoundSetting, cr as literal, dn as resolveRootSupply, fn as rootSuppliesOf, gt as deriveRootFaceRefineRect, hr as EventCategory, ir as array, j as NativeLeaseSettingsSchema, lr as number, m as CROP_SUPPLY_SOURCES, mt as deriveDetailCropRect, nt as buildBenchStepTree, pr as string, rr as _enum, rt as cameraOwnsMotionViaSensor, sr as lazy, ur as object, x as DEVICE_RAMP, y as DEFAULT_NATIVE_LEASE_SETTINGS } from "../dist-CfOv146z.mjs";
2
- import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-tn9-iwDj.mjs";
3
- import { a as stepsForElectedPool, b as getStepDefinition, d as rootObjectGate, f as localFrameRegistry, h as resolveFrameViewGeometry, i as placeDetailStep, l as resolveDefaultDetectionModel, m as createSessionDecodeCoordinator, p as isSessionDecodeReadGone, s as resolveDeviceEngine, t as CustomModelCatalog, u as macroGateVerdict, y as getStep } from "../custom-model-catalog-BmJXsT0k.mjs";
1
+ import { A as NativeLeaseAdmissionSchema, Bn as createEvent, Dt as failureContributionCapability, E as FailureCounters, Ft as linkedStepOf, Hn as defineCustomActions, It as loadContributionCapability, M as NodeBenchRunnerInputSchema, Mn as errMsg, P as PIPELINE_RAMP, Pn as BaseAddon, Qn as nodePin, Qt as pipelineRunnerCapability, Rn as MODEL_FORMATS, V as ROOT_SUPPLIABLE_STEP_IDS, Vn as customAction, Xt as pickNativeLeaseOverride, Y as allowedSuppliedEffect, Yt as pickDetailCropConvention, _ as DEFAULT_DETAIL_CROP_CONVENTION, a as BackgroundRunRegistry, ar as boolean, cn as resolveModelBoundSetting, cr as literal, dn as resolveRootSupply, fn as rootSuppliesOf, gt as deriveRootFaceRefineRect, hr as EventCategory, ir as array, j as NativeLeaseSettingsSchema, lr as number, m as CROP_SUPPLY_SOURCES, mt as deriveDetailCropRect, nt as buildBenchStepTree, pr as string, rr as _enum, rt as cameraOwnsMotionViaSensor, sr as lazy, ur as object, x as DEVICE_RAMP, y as DEFAULT_NATIVE_LEASE_SETTINGS } from "../dist-BWPVIuD_.mjs";
2
+ import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-D48F38hW.mjs";
3
+ import { a as stepsForElectedPool, b as getStepDefinition, d as rootObjectGate, f as localFrameRegistry, h as resolveFrameViewGeometry, i as placeDetailStep, l as resolveDefaultDetectionModel, m as createSessionDecodeCoordinator, p as isSessionDecodeReadGone, s as resolveDeviceEngine, t as CustomModelCatalog, u as macroGateVerdict, y as getStep } from "../custom-model-catalog-D3NopOC9.mjs";
4
4
  import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
5
5
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
6
6
  import { c as withDetectionIntent, o as preRollRequestOf, t as DETECTION_PRE_ROLL_REQUEST_MS } from "../restream-intent-DyGmLAU9.mjs";
@@ -1,4 +1,4 @@
1
- import { qt as parseProcStatus } from "./dist-CfOv146z.mjs";
1
+ import { qt as parseProcStatus } from "./dist-BWPVIuD_.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
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-B_1t8oSg.js");
2
+ const require_dist = require("./dist-D2aJhYm7.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");
@@ -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-B_1t8oSg.js");
7
- const require_node = require("../node-D82_5p1M.js");
6
+ const require_dist = require("../dist-D2aJhYm7.js");
7
+ const require_node = require("../node-BKs5_GlD.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
  let node_crypto = require("node:crypto");
@@ -2991,9 +2991,25 @@ function encodeDirectory(payload) {
2991
2991
  var MIN_INDEXABLE_SEGMENT_BYTES = 64;
2992
2992
  var SegmentStore = class SegmentStore {
2993
2993
  deps;
2994
+ stubCount = 0;
2995
+ stubBytes = 0;
2994
2996
  constructor(deps) {
2995
2997
  this.deps = deps;
2996
2998
  }
2999
+ /**
3000
+ * The stubs cleared since the last call, then reset. A recovery pass calls it
3001
+ * once and logs ONE line: ~530 stubs used to re-log at every boot because
3002
+ * each was warned about and left in staging forever.
3003
+ */
3004
+ takeStubReport() {
3005
+ const report = {
3006
+ count: this.stubCount,
3007
+ bytes: this.stubBytes
3008
+ };
3009
+ this.stubCount = 0;
3010
+ this.stubBytes = 0;
3011
+ return report;
3012
+ }
2997
3013
  async hydrate(deviceId, location) {
2998
3014
  const paths = await this.deps.list({
2999
3015
  location,
@@ -3013,13 +3029,30 @@ var SegmentStore = class SegmentStore {
3013
3029
  return null;
3014
3030
  }
3015
3031
  if (bytes < MIN_INDEXABLE_SEGMENT_BYTES) {
3016
- this.deps.logger.warn("segment too small to index — left in staging", {
3032
+ this.deps.logger.debug?.("segment too small to index — clearing stub from staging", {
3017
3033
  tags: { deviceId: input.deviceId },
3018
3034
  meta: {
3019
3035
  bytes,
3020
3036
  path: input.flatAbsPath
3021
3037
  }
3022
3038
  });
3039
+ if (this.deps.removeStaged !== void 0) {
3040
+ try {
3041
+ await this.deps.removeStaged(input.flatAbsPath);
3042
+ } catch (err) {
3043
+ this.deps.logger.warn("segment stub could not be cleared from staging", {
3044
+ tags: { deviceId: input.deviceId },
3045
+ error: err,
3046
+ meta: {
3047
+ bytes,
3048
+ path: input.flatAbsPath
3049
+ }
3050
+ });
3051
+ return null;
3052
+ }
3053
+ this.stubCount++;
3054
+ this.stubBytes += bytes;
3055
+ }
3023
3056
  return null;
3024
3057
  }
3025
3058
  const relPath = segmentRelPath(input.deviceId, input.profile, input.startMs, input.durMs, bytes);
@@ -6849,6 +6882,18 @@ Object.freeze({
6849
6882
  "empty"
6850
6883
  ]
6851
6884
  },
6885
+ {
6886
+ "path": "filterCleaningDue",
6887
+ "valueType": "boolean"
6888
+ },
6889
+ {
6890
+ "path": "machineCareDue",
6891
+ "valueType": "boolean"
6892
+ },
6893
+ {
6894
+ "path": "machineCareRemainingRuns",
6895
+ "valueType": "number"
6896
+ },
6852
6897
  {
6853
6898
  "path": "halfLoad",
6854
6899
  "valueType": "boolean"
@@ -11780,6 +11825,9 @@ var DurableLegacyKindHandle = class {
11780
11825
  aggregate = () => notImpl("aggregate");
11781
11826
  deleteWhere = () => notImpl("deleteWhere");
11782
11827
  allocateId = () => notImpl("allocateId");
11828
+ txPut = () => notImpl("txPut");
11829
+ txPatch = () => notImpl("txPatch");
11830
+ txDelete = () => notImpl("txDelete");
11783
11831
  pkColumn() {
11784
11832
  return this.spec.columns.find((c) => c.primaryKey === true)?.name ?? "id";
11785
11833
  }
@@ -18052,6 +18100,15 @@ var METHOD_FAILED = /\bmethod ([A-Z_]+) failed: (\d{3})\b/;
18052
18100
  function isHandshakeMethod(method) {
18053
18101
  return method === "OPTIONS" || method === "DESCRIBE" || method === "SETUP" || method === "PLAY";
18054
18102
  }
18103
+ /**
18104
+ * ffmpeg's account of a restream that answered DESCRIBE `200` with no SDP at
18105
+ * all (a hub that predates the 503 refusal): it opens the url and finds nothing
18106
+ * to parse — `Error opening input file rtsp://… ` + `Invalid data found when
18107
+ * processing input`, exit 183 (AVERROR_INVALIDDATA & 0xff). Same fact as a
18108
+ * refused DESCRIBE: the source is not serving right now, nothing ran.
18109
+ */
18110
+ var OPEN_FAILED = /Error opening input file rtsp:\/\//;
18111
+ var INVALID_DATA = /Invalid data found when processing input/;
18055
18112
  /** The refusal named in this generation's stderr tail, or `null` when there is none. */
18056
18113
  function readDialRefusal(stderrTail) {
18057
18114
  for (let i = stderrTail.length - 1; i >= 0; i--) {
@@ -18064,6 +18121,11 @@ function readDialRefusal(stderrTail) {
18064
18121
  status: Number(match[2])
18065
18122
  };
18066
18123
  }
18124
+ const text = stderrTail.join("\n");
18125
+ if (OPEN_FAILED.test(text) && INVALID_DATA.test(text)) return {
18126
+ method: "DESCRIBE",
18127
+ status: 503
18128
+ };
18067
18129
  return null;
18068
18130
  }
18069
18131
  //#endregion
@@ -18465,10 +18527,11 @@ var RecordingStallMonitor = class {
18465
18527
  });
18466
18528
  return;
18467
18529
  }
18530
+ const edge = prev?.expected !== true;
18468
18531
  this.state.set(deviceId, {
18469
18532
  expected: true,
18470
- lastSegmentAt: prev?.lastSegmentAt ?? now,
18471
- stalledReported: prev?.stalledReported ?? false,
18533
+ lastSegmentAt: edge ? now : prev?.lastSegmentAt ?? now,
18534
+ stalledReported: edge ? false : prev?.stalledReported ?? false,
18472
18535
  lastDegradedAt: prev?.lastDegradedAt ?? null
18473
18536
  });
18474
18537
  }
@@ -23835,6 +23898,7 @@ var RecorderV2Addon = class extends require_dist.BaseAddon {
23835
23898
  list: (input) => this.ctx.api.storage.list.query(input),
23836
23899
  deletePath: (input) => this.ctx.api.storage.delete.mutate(input),
23837
23900
  statBytes: async (absPath) => (await node_fs.promises.stat(absPath)).size,
23901
+ removeStaged: (absPath) => node_fs.promises.rm(absPath, { force: true }),
23838
23902
  moveFile: async (fromAbs, toAbs) => {
23839
23903
  await node_fs.promises.mkdir(node_path.default.dirname(toAbs), { recursive: true });
23840
23904
  try {
@@ -23901,6 +23965,12 @@ var RecorderV2Addon = class extends require_dist.BaseAddon {
23901
23965
  },
23902
23966
  info: (message, extras) => {
23903
23967
  this.ctx.logger.info(message, { meta: extras.meta });
23968
+ },
23969
+ debug: (message, extras) => {
23970
+ this.ctx.logger.debug(message, {
23971
+ tags: extras.tags,
23972
+ meta: extras.meta
23973
+ });
23904
23974
  }
23905
23975
  }
23906
23976
  };
@@ -25461,6 +25531,11 @@ var RecorderV2Addon = class extends require_dist.BaseAddon {
25461
25531
  defaultSegmentSeconds: this.config.segmentSeconds,
25462
25532
  shouldStop: () => this.segmentStore === null
25463
25533
  });
25534
+ const stubs = this.segmentStore?.takeStubReport();
25535
+ if (stubs !== void 0 && stubs.count > 0) this.ctx.logger.info("recorder: staging recovery cleared stub segments", { meta: {
25536
+ count: stubs.count,
25537
+ bytes: stubs.bytes
25538
+ } });
25464
25539
  } catch (err) {
25465
25540
  this.ctx.logger.warn("recorder: staging boot reconcile failed", { meta: { error: require_dist.errMsg(err) } });
25466
25541
  }