@camstack/addon-post-analysis 1.2.639 → 1.2.641
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{clip-model-registry-B-Dv5y3Z.mjs → clip-model-registry-Cw7Iy7Qi.mjs} +315 -28
- package/dist/{clip-model-registry-DEcrrqRz.js → clip-model-registry-Qr0XipkX.js} +315 -28
- package/dist/embedding-encoder/index.js +1 -1
- package/dist/embedding-encoder/index.mjs +1 -1
- package/dist/pipeline-analytics/_stub.js +2 -2
- package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-DRZLmZDb.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-Cct0TMzC.mjs} +2 -2
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-_TUthUZh.mjs +26 -0
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CuNXxDlT.mjs +26 -0
- package/dist/pipeline-analytics/{hostInit-B07ueo2X.mjs → hostInit-B9c2FowI.mjs} +2 -2
- package/dist/pipeline-analytics/index.js +118 -23
- package/dist/pipeline-analytics/index.mjs +118 -23
- package/dist/pipeline-analytics/remoteEntry.js +1 -1
- package/package.json +1 -1
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D4TYbuPV.mjs +0 -26
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-Cc4lAtK3.mjs +0 -26
|
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
|
|
|
2
2
|
__esModule: { value: true },
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
|
-
const require_clip_model_registry = require("../clip-model-registry-
|
|
5
|
+
const require_clip_model_registry = require("../clip-model-registry-Qr0XipkX.js");
|
|
6
6
|
let node_fs = require("node:fs");
|
|
7
7
|
node_fs = require_clip_model_registry.__toESM(node_fs, 1);
|
|
8
8
|
let node_path = require("node:path");
|
|
@@ -9387,7 +9387,7 @@ var it_default = {
|
|
|
9387
9387
|
"occupancy.op.free": "libera",
|
|
9388
9388
|
"system.device-online.title": "Di nuovo online — {{deviceName}}",
|
|
9389
9389
|
"system.device-online.body": "Il dispositivo {{deviceName}} è di nuovo online",
|
|
9390
|
-
"system.device-offline.title": "
|
|
9390
|
+
"system.device-offline.title": "Non raggiungibile — {{deviceName}}",
|
|
9391
9391
|
"system.device-offline.body": "Il dispositivo {{deviceName}} è offline",
|
|
9392
9392
|
"system.device-disabled.title": "Spento — {{deviceName}}",
|
|
9393
9393
|
"system.device-disabled.body": "Il dispositivo {{deviceName}} è stato spento",
|
|
@@ -9403,7 +9403,7 @@ var it_default = {
|
|
|
9403
9403
|
"system.stream-online.title": "Stream di nuovo online — {{deviceName}}",
|
|
9404
9404
|
"system.stream-online.body": "Lo stream della camera {{deviceName}} è di nuovo online",
|
|
9405
9405
|
"system.stream-online.body.profiled": "Lo stream {{profile}} della camera {{deviceName}} è di nuovo online",
|
|
9406
|
-
"system.stream-offline.title": "
|
|
9406
|
+
"system.stream-offline.title": "Flusso interrotto — {{deviceName}}",
|
|
9407
9407
|
"system.stream-offline.body": "Lo stream della camera {{deviceName}} è offline",
|
|
9408
9408
|
"system.stream-offline.body.profiled": "Lo stream {{profile}} della camera {{deviceName}} è offline",
|
|
9409
9409
|
"system.node-online.title": "Nodo di nuovo online — {{nodeName}}",
|
|
@@ -9434,7 +9434,7 @@ var it_default = {
|
|
|
9434
9434
|
"system.storage-location-low.body": "La location {{locationName}} è al {{freePercent}}% libero ({{reason}})",
|
|
9435
9435
|
"system.storage-location-critical.title": "Storage critico — {{locationName}}",
|
|
9436
9436
|
"system.storage-location-critical.body": "La location {{locationName}} è critica: {{reason}}",
|
|
9437
|
-
"system.storage-location-ok.title": "
|
|
9437
|
+
"system.storage-location-ok.title": "Archivio a posto — {{locationName}}",
|
|
9438
9438
|
"system.storage-location-ok.body": "La location {{locationName}} ha recuperato spazio libero",
|
|
9439
9439
|
"system.detection-blind.title": "Senza detection — {{deviceName}}",
|
|
9440
9440
|
"system.detection-blind.body": {
|
|
@@ -9515,8 +9515,8 @@ var it_default = {
|
|
|
9515
9515
|
"system.camera-disabled.body": "Il dispositivo {{deviceName}} è stato spento",
|
|
9516
9516
|
"system.camera-enabled.title": "Dispositivo riacceso",
|
|
9517
9517
|
"system.camera-enabled.body": "Il dispositivo {{deviceName}} è stato riacceso",
|
|
9518
|
-
"test.prefix": "[
|
|
9519
|
-
"timelapse.title": "
|
|
9518
|
+
"test.prefix": "[PROVA] {{body}}",
|
|
9519
|
+
"timelapse.title": "Sequenza — {{camera}}",
|
|
9520
9520
|
"timelapse.body.window": "{{rule}} — {{from}}→{{to}}",
|
|
9521
9521
|
"timelapse.body.tooManyEvents": "troppi eventi per il campionamento denso: video a cadenza uniforme",
|
|
9522
9522
|
"timelapse.body.denseRanges": {
|
|
@@ -9678,7 +9678,7 @@ var it_default = {
|
|
|
9678
9678
|
"summary.line.node-inference-unavailable": "{{nodeId}} — non può eseguire l'inferenza (da {{since}})",
|
|
9679
9679
|
"summary.line.addon-crash-loop": "{{nodeId}} — {{addons}} fermati dopo crash ripetuti (da {{since}})",
|
|
9680
9680
|
"summary.line.update": "{{packageName}} {{currentVersion}} → {{latestVersion}}",
|
|
9681
|
-
"summary.line.wrapper-update": "
|
|
9681
|
+
"summary.line.wrapper-update": "Contenitore {{currentVersion}} → {{latestVersion}}",
|
|
9682
9682
|
"summary.line.consumable.part": "{{item}} {{percentage}}%",
|
|
9683
9683
|
"summary.line.consumable.part.unmeasured": "{{item}} da sostituire",
|
|
9684
9684
|
"summary.line.consumable.tank": "{{item}} quasi vuota",
|
|
@@ -84032,6 +84032,53 @@ function withTimeout$3(promise, ms) {
|
|
|
84032
84032
|
}
|
|
84033
84033
|
//#endregion
|
|
84034
84034
|
//#region src/notification-center/summary/mosaic-renderer.ts
|
|
84035
|
+
/**
|
|
84036
|
+
* The mosaic: N stored best-shots laid out as one image.
|
|
84037
|
+
*
|
|
84038
|
+
* ## The mosaic is ALWAYS CLEAN
|
|
84039
|
+
*
|
|
84040
|
+
* No detection boxes. Not "boxes off by default" — the media ladder in
|
|
84041
|
+
* `summary-selection.ts` refuses `fullFrameBoxed` outright and nothing here
|
|
84042
|
+
* draws a rectangle. The operator asked for it in those words, and there are
|
|
84043
|
+
* two further reasons worth writing down so nobody adds them back as a
|
|
84044
|
+
* convenience:
|
|
84045
|
+
*
|
|
84046
|
+
* - a burnt-in box is permanent. A tile is a durable artefact and a mosaic is
|
|
84047
|
+
* a thing an operator re-reads days later; a box drawn from a detection that
|
|
84048
|
+
* was wrong cannot be un-drawn;
|
|
84049
|
+
* - for P2 it is an attack surface. Anything rendered INTO the pixels is text
|
|
84050
|
+
* the model reads as scene content, and D121 is this repo's record of a
|
|
84051
|
+
* model treating in-frame text as instruction. Boxes stay DATA — the
|
|
84052
|
+
* artefact can carry them, the picture never does.
|
|
84053
|
+
*
|
|
84054
|
+
* ## …and by default it carries NO TEXT EITHER
|
|
84055
|
+
*
|
|
84056
|
+
* {@link mosaicTextPlan} is the ONE place that decides whether a word is drawn,
|
|
84057
|
+
* and with no `captions` on the rule the answer is "none": tile labels off,
|
|
84058
|
+
* title band off. Same argument as the boxes, one step further — the operator
|
|
84059
|
+
* asked for a wall of pictures, a burnt-in caption cannot be un-drawn, and the
|
|
84060
|
+
* label strip covers 14% of every tile with the part of the frame nearest the
|
|
84061
|
+
* ground, which is where feet, wheels and parcels are.
|
|
84062
|
+
*
|
|
84063
|
+
* Nothing is lost by it. The AI pass never sees this image:
|
|
84064
|
+
* `summary-producer.ts#analyse` hands the model the RAW per-track JPEGs and
|
|
84065
|
+
* `summary-ai.ts#buildSummaryAiPrompt` supplies camera name, class and time as
|
|
84066
|
+
* PROMPT TEXT. The tile rectangles stay exported (see {@link mosaicLayout}) so
|
|
84067
|
+
* a viewer can still say what a tile is without a word being burnt into it.
|
|
84068
|
+
*
|
|
84069
|
+
* ## sharp, and never ffmpeg `drawtext`
|
|
84070
|
+
*
|
|
84071
|
+
* Labels, WHEN ASKED FOR, are composited as SVG through sharp. D118 forbids `drawtext` because
|
|
84072
|
+
* the hub carries two ffmpeg builds that disagree about libfreetype, so a
|
|
84073
|
+
* caption would appear or vanish depending on which node rendered it. sharp is
|
|
84074
|
+
* a direct dependency of this addon and its text path is librsvg, which is the
|
|
84075
|
+
* same one the timelapse preview already uses.
|
|
84076
|
+
*
|
|
84077
|
+
* The geometry helpers are pure and exported: {@link mosaicGrid} and
|
|
84078
|
+
* {@link mosaicLayout} answer the tile rectangles WITHOUT touching a pixel,
|
|
84079
|
+
* which is what lets the layout be tested and what a future clickable-tile
|
|
84080
|
+
* viewer will read.
|
|
84081
|
+
*/
|
|
84035
84082
|
/** Widest mosaic produced. 1920 keeps a 3×3 grid at 640 px a tile — readable
|
|
84036
84083
|
* on a phone, and a ~200 KB JPEG that every notifier accepts. */
|
|
84037
84084
|
var MOSAIC_MAX_WIDTH = 1920;
|
|
@@ -84225,6 +84272,13 @@ function fitLine(text, usablePx, basePx, minPx) {
|
|
|
84225
84272
|
fontPx
|
|
84226
84273
|
};
|
|
84227
84274
|
}
|
|
84275
|
+
/**
|
|
84276
|
+
* The words drawn on a summary tile: camera, clock, and the class vocabulary
|
|
84277
|
+
* in the hub language. A class the vocabulary does not know stays the wire id.
|
|
84278
|
+
*/
|
|
84279
|
+
function summaryTileCaption(camera, clock, className, locale) {
|
|
84280
|
+
return `${camera} · ${clock} · ${require_clip_model_registry.eventKindLabel(className, locale)}`;
|
|
84281
|
+
}
|
|
84228
84282
|
/** The label strip drawn across the bottom of one tile. */
|
|
84229
84283
|
function tileLabelSvg(width, height, label) {
|
|
84230
84284
|
const bandHeight = Math.max(18, Math.round(height * LABEL_BAND_FRACTION));
|
|
@@ -85299,8 +85353,9 @@ function selectTriggerZoneCandidates(input) {
|
|
|
85299
85353
|
*
|
|
85300
85354
|
* - `scene-boxes` — the whole scene; the subject outlined THICK in the accent
|
|
85301
85355
|
* colour, every OTHER track visible at that instant outlined THIN, each
|
|
85302
|
-
* captioned with class
|
|
85303
|
-
* reads on any background. Boxes are the tracks'
|
|
85356
|
+
* captioned with the class vocabulary in the hub language ("Cane 87%") on a
|
|
85357
|
+
* dark plate that reads on any background. Boxes are the tracks' trail
|
|
85358
|
+
* boxes AT
|
|
85304
85359
|
* the source frame's timestamp — never the track envelope — scaled to the
|
|
85305
85360
|
* JPEG.
|
|
85306
85361
|
* - `crop` — the subject cut out of the clean frame around its box at that
|
|
@@ -85321,10 +85376,11 @@ function selectTriggerZoneCandidates(input) {
|
|
|
85321
85376
|
* ## Once per record
|
|
85322
85377
|
*
|
|
85323
85378
|
* N targets and every outbox retry resolve the same row; the render is
|
|
85324
|
-
* memoised per record + subject + mode + zone flag + camera
|
|
85325
|
-
* {@link NC_IMAGE_MEMO_TTL_MS}, so a 4K decode happens once, not once per
|
|
85326
|
-
* phone.
|
|
85327
|
-
*
|
|
85379
|
+
* memoised per record + subject + mode + zone flag + camera + hub language
|
|
85380
|
+
* for {@link NC_IMAGE_MEMO_TTL_MS}, so a 4K decode happens once, not once per
|
|
85381
|
+
* phone. The hub has one notification language, so every recipient of a row
|
|
85382
|
+
* shares that picture. It runs in the process that hosts the Notification
|
|
85383
|
+
* Center (the pipeline-analytics runner), which already carries `sharp`.
|
|
85328
85384
|
*/
|
|
85329
85385
|
/** How long a rendered picture is reused for the same record (N targets, retries). */
|
|
85330
85386
|
var NC_IMAGE_MEMO_TTL_MS = 15 * 6e4;
|
|
@@ -85356,12 +85412,37 @@ var SAME_SUBJECT_IOU = .8;
|
|
|
85356
85412
|
*/
|
|
85357
85413
|
var NC_IMAGE_SAME_CLASS_SUBJECT_IOU = .5;
|
|
85358
85414
|
var JPEG_QUALITY = 85;
|
|
85359
|
-
/** The caption of a box:
|
|
85415
|
+
/** The caption of a box: a name and confidence — "Cane 87%". The name is already chosen. */
|
|
85360
85416
|
function imageLabelText(name, confidence) {
|
|
85361
85417
|
if (confidence === void 0 || !Number.isFinite(confidence)) return name;
|
|
85362
85418
|
const pct = Math.round(Math.min(1, Math.max(0, confidence)) * 100);
|
|
85363
85419
|
return `${name} ${String(pct)}%`;
|
|
85364
85420
|
}
|
|
85421
|
+
/**
|
|
85422
|
+
* The name drawn on a box, in the hub language.
|
|
85423
|
+
*
|
|
85424
|
+
* A class id — the coarse class, or a finer one riding `label` — is
|
|
85425
|
+
* {@link eventKindLabel}. An identity or a plate stays the word the
|
|
85426
|
+
* recogniser produced. A class the vocabulary does not know stays the wire
|
|
85427
|
+
* id, which is what `eventKindLabel` already returns.
|
|
85428
|
+
*/
|
|
85429
|
+
function imageBoxName(input, locale) {
|
|
85430
|
+
if (input.labelKind === "identity" || input.labelKind === "plate") {
|
|
85431
|
+
const written = input.label?.trim();
|
|
85432
|
+
if (written !== void 0 && written.length > 0) return written;
|
|
85433
|
+
}
|
|
85434
|
+
const label = input.label?.trim();
|
|
85435
|
+
if (label !== void 0 && label.length > 0) {
|
|
85436
|
+
const key = label.toLowerCase();
|
|
85437
|
+
if (require_clip_model_registry.isEventKindLabelKey(key)) return require_clip_model_registry.eventKindLabel(key, locale);
|
|
85438
|
+
if (key !== input.className.trim().toLowerCase()) return label;
|
|
85439
|
+
}
|
|
85440
|
+
return require_clip_model_registry.eventKindLabel(input.className, locale);
|
|
85441
|
+
}
|
|
85442
|
+
/** Class vocabulary in `locale`, plus confidence — the string the overlay draws. */
|
|
85443
|
+
function imageBoxCaption(input, locale) {
|
|
85444
|
+
return imageLabelText(imageBoxName(input, locale), input.confidence);
|
|
85445
|
+
}
|
|
85365
85446
|
/** Stroke widths for an output of this size: the subject's is the thick one. */
|
|
85366
85447
|
function overlayStrokes(width, height) {
|
|
85367
85448
|
const subject = Math.max(4, Math.round(Math.min(width, height) / 110));
|
|
@@ -85660,8 +85741,8 @@ var NcNotificationImageStage = class {
|
|
|
85660
85741
|
}
|
|
85661
85742
|
/**
|
|
85662
85743
|
* The picture for this row from this source, rendered once per record +
|
|
85663
|
-
* subject + mode + zone flag + camera and reused for every
|
|
85664
|
-
* Null when the row ships no still.
|
|
85744
|
+
* subject + mode + zone flag + camera + language and reused for every
|
|
85745
|
+
* target and retry. Null when the row ships no still.
|
|
85665
85746
|
*/
|
|
85666
85747
|
async notificationImage(input) {
|
|
85667
85748
|
const payload = input.entry.payload;
|
|
@@ -85669,13 +85750,15 @@ var NcNotificationImageStage = class {
|
|
|
85669
85750
|
if (mode === "none") return null;
|
|
85670
85751
|
const zoneIds = input.withSubject ? payloadZoneOverlayIds(payload) : [];
|
|
85671
85752
|
const withPath = input.withSubject && payloadShowsSubjectPath(payload);
|
|
85753
|
+
const locale = input.locale ?? "en";
|
|
85672
85754
|
const key = [
|
|
85673
85755
|
input.entry.recordId,
|
|
85674
85756
|
payload.subject.trackId ?? "",
|
|
85675
85757
|
mode,
|
|
85676
85758
|
zoneIds.length > 0 ? "z" : "-",
|
|
85677
85759
|
withPath ? "p" : "-",
|
|
85678
|
-
String(input.camera)
|
|
85760
|
+
String(input.camera),
|
|
85761
|
+
locale
|
|
85679
85762
|
].join("|");
|
|
85680
85763
|
const now = this.deps.now();
|
|
85681
85764
|
const hit = this.memo.get(key);
|
|
@@ -85713,9 +85796,15 @@ var NcNotificationImageStage = class {
|
|
|
85713
85796
|
const trail = hasTrackedSubject(subjectTrackId) ? await this.subjectTrail(camera, subjectTrackId) : [];
|
|
85714
85797
|
const subjectBox = trailAt(trail, source.timestamp, NC_IMAGE_BOX_MATCH_MAX_MS)?.bbox ?? null;
|
|
85715
85798
|
const path = withPath ? this.subjectPath(input, trail) : [];
|
|
85799
|
+
const locale = input.locale ?? "en";
|
|
85716
85800
|
const subject = subjectBox !== null ? {
|
|
85717
85801
|
...subjectBox,
|
|
85718
|
-
label:
|
|
85802
|
+
label: imageBoxCaption({
|
|
85803
|
+
className: payload.subject.className,
|
|
85804
|
+
...payload.subject.label !== void 0 ? { label: payload.subject.label } : {},
|
|
85805
|
+
...payload.subject.labelKind !== void 0 ? { labelKind: payload.subject.labelKind } : {},
|
|
85806
|
+
...payload.subject.confidence !== void 0 ? { confidence: payload.subject.confidence } : {}
|
|
85807
|
+
}, locale),
|
|
85719
85808
|
className: payload.subject.className
|
|
85720
85809
|
} : null;
|
|
85721
85810
|
const othersDrawn = mode === "scene-boxes" ? otherTracks(await this.tracksAt(camera, source.timestamp), subjectTrackId, subjectBox, payload.subject.className) : [];
|
|
@@ -85730,7 +85819,11 @@ var NcNotificationImageStage = class {
|
|
|
85730
85819
|
});
|
|
85731
85820
|
const others = mode === "scene-boxes" ? othersDrawn.map((t) => ({
|
|
85732
85821
|
...t.bbox,
|
|
85733
|
-
label:
|
|
85822
|
+
label: imageBoxCaption({
|
|
85823
|
+
className: t.className,
|
|
85824
|
+
...t.label !== void 0 ? { label: t.label } : {},
|
|
85825
|
+
...t.confidence !== void 0 ? { confidence: t.confidence } : {}
|
|
85826
|
+
}, locale),
|
|
85734
85827
|
className: t.className,
|
|
85735
85828
|
...t.confidence !== void 0 ? { confidence: t.confidence } : {}
|
|
85736
85829
|
})) : [];
|
|
@@ -87240,7 +87333,8 @@ var NcDispatcher = class {
|
|
|
87240
87333
|
annotated: isAnnotatedSceneKind(file.kind)
|
|
87241
87334
|
},
|
|
87242
87335
|
camera: cameraId,
|
|
87243
|
-
withSubject: false
|
|
87336
|
+
withSubject: false,
|
|
87337
|
+
locale: this.texts.language
|
|
87244
87338
|
});
|
|
87245
87339
|
if (image === null) continue;
|
|
87246
87340
|
out.push({
|
|
@@ -88029,7 +88123,8 @@ var NcDispatcher = class {
|
|
|
88029
88123
|
annotated: isAnnotatedSceneKind(file.kind)
|
|
88030
88124
|
},
|
|
88031
88125
|
camera: primaryImageCamera(entry.payload),
|
|
88032
|
-
withSubject: true
|
|
88126
|
+
withSubject: true,
|
|
88127
|
+
locale: this.texts.language
|
|
88033
88128
|
});
|
|
88034
88129
|
if (image === null) return null;
|
|
88035
88130
|
return {
|
|
@@ -94749,7 +94844,7 @@ var NcSummaryProducer = class {
|
|
|
94749
94844
|
purpose: "summary",
|
|
94750
94845
|
tiles: tiles.map(({ candidate, jpeg }) => ({
|
|
94751
94846
|
jpeg,
|
|
94752
|
-
...plan.tileLabels ? { label:
|
|
94847
|
+
...plan.tileLabels ? { label: summaryTileCaption(names.get(candidate.deviceId) ?? String(candidate.deviceId), clockOf$2(candidate.firstSeen), candidate.className, this.texts.language) } : {},
|
|
94753
94848
|
deviceId: candidate.deviceId,
|
|
94754
94849
|
sourceId: candidate.trackId
|
|
94755
94850
|
})),
|
|
@@ -112338,7 +112433,7 @@ var MotionEpisodeTracker = class {
|
|
|
112338
112433
|
*
|
|
112339
112434
|
* A single timeout is the call's bound doing its job. Three uncertain confirms
|
|
112340
112435
|
* in a row, with no yes and no no between them, is the provider not answering
|
|
112341
|
-
* — the shape camera
|
|
112436
|
+
* — the shape camera 102 showed on 2026-10-26 (nine timeouts, zero answers).
|
|
112342
112437
|
* A time window would also count a timeout that a later answer already closed.
|
|
112343
112438
|
* The streak resets on any answer. A further uncertain while the edge is
|
|
112344
112439
|
* open does not raise again.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as MediaFileKindEnum, $i as CAP_ADVANCE_FIELDS, $n as cloneAlarmSettings, $r as paintHex, $t as OpsLogEntrySchema, A as DeclaredDevices, Aa as EventCategory, Ai as subKindsOf, An as TrackSideSchema, Ar as isAudioClassName, At as NcAlarmSensorsInputSchema, B as FULL_IMAGE_BBOX, Bi as templateCarriesSummary, Bn as applyModeDelaysEdits, Br as isRootSuppliableStepId, Bt as NcRuleUpdateInputSchema, C as ClearTrackRelationResultSchema, Ca as record, Ci as ruleKindOf, Cn as TimelapseRuleInputSchema, Cr as failureContributionCapability, Ct as NC_SNOOZE_MAX_MINUTES, D as DEFAULT_TIMELAPSE_PREVIEW_TEXT, Da as tuple, Di as servedTemplateVars, Dn as TrackPuritySchema, Dr as isAlertEpisodeOpen, Dt as NC_TEMPLATE_VARS, E as DEFAULT_EVENT_COLOR, Ea as templateLiteral, Ei as sensorRaisedOf, En as TrackPlacementSchema, Er as isAlarmControllableCap, Et as NC_TAXONOMY, F as EVENT_DENSITY_BATCH_MAX, Fi as systemEventDeliveryProblems, Fn as alarmPanelCapability, Fr as isEventOwnerType, Ft as NcRuleActionSchema, G as ListTrackRelationsResultSchema, Gi as zoneAnalyticsCapability, Gn as audioMetricsCapability, Gr as kebabToCamel, Gt as NcSnoozeSuppressedSchema, H as LABEL_SUPPLY_MACRO, Hi as vectorDimFromBase64, Hn as applySecureOnArmEdit, Hr as isSystemDelivery, Ht as NcSharedSequenceSchema, I as EVENT_KIND_BY_CAP, Ii as systemEventFamilyProblems, In as alertEpisodeId, Ir as isKnownTemplateVar, It as NcRuleInputSchema, J as MAX_BIRTH_DECISION_RECORDS, Ji as evaluateSensorEdge, Jn as buildSubjectPath, Jr as memoizePinnedFfmpeg, Jt as NcTaxonomySchema, K as LockStateSchema, Ki as DEFAULT_FIRST_SIGHTING_FRESHNESS_MS, Kn as audioModeOf, Kr as linkedStepOf, Kt as NcStateSummarySectionIdSchema, L as EVENT_OWNER_TYPES, Li as systemEventFilterApplies, Ln as alertEpisodeKind, Lr as isLabelSupplyStepId, Lt as NcRulePatchSchema, M as EMBEDDING_MODEL_FAILED, Mi as subjectPathSvgPoints, Mn as activateAlarmProfile, Mr as isDetectionMacroClass, Mt as NcAlarmSettingsPatchSchema, N as EMBEDDING_REQUIREMENTS_FAILED, Ni as summarizeReview, Nn as addonWidgetsSourceCapability, Nr as isDrawableSubjectPath, Nt as NcConditionDescriptorSchema, O as DETECTION_MACRO_CLASSES, Oa as union, Oi as startMoverUnderClearance, On as TrackRelationKindSchema, Or as isAlertEpisodeSeverity, Ot as NcAlarmConfigSchema, P as EMBEDDING_REQUIREMENTS_UNAVAILABLE, Pi as syncActiveAlarmProfileSettings, Pn as alarmDeviceSecureOnArm, Pr as isEventKindLabelKey, Pt as NcConditionsSchema, Q as MOTION_CLOSE_AFTER_MS, Qi as BaseAddon, Qn as classifyRetrainReview, Qr as occupancyScope, Qt as OPS_LOG_DEFAULT_LIMIT, R as EXPORT_DENSE_MAX_RANGES, Ri as systemEventSummaryScheduleOf, Rn as alertEpisodePayload, Rr as isMediaOwnerType, Rt as NcRuleSchema, S as ClearTrackRelationInputSchema, Sa as partialRecord, Si as ruleGroupingApplies, Sn as TRACK_RELATIONS_DEFAULT_LIMIT, Sr as faceGalleryCapability, St as NC_SENSOR_TRANSITION_KINDS, T as DEFAULT_DETAIL_CROP_CONVENTION, Ta as string, Ti as secureActuationFor, Tn as TimelapseRuleSchema, Tr as gifFromMp4Args, Tt as NC_SYSTEM_EVENT_KIND_GROUP_SPECS, U as LabelAttributionSchema, Ui as viewerLinkBaseOf, Un as armRemovalReconcile, Ur as isSystemEventSummaryRule, Ut as NcSnoozeInputSchema, V as FailureCounters, Vi as templateVarsFor, Vn as applyNonBlockingEdit, Vr as isScheduleActive, Vt as NcScheduleSchema, W as ListTrackRelationsInputSchema, Wi as withSystemEventClasses, Wn as assertTimelapseCadences, Wr as isVectorIndexDimConflict, Wt as NcSnoozeSchema, X as MAX_TRACK_PURITIES, Xi as DeviceType, Xn as bundledCamstack, Xr as normalizeNcMediaPolicy, Xt as NcTemplatePreviewSchema, Y as MAX_BIRTH_LATENCY_PROXY_MS, Yi as isSourceCap, Yn as buildViewerLink, Yr as ncMediaPolicyError, Yt as NcTemplatePreviewInputSchema, Z as MAX_TRACK_RELATIONS, Zi as errMsg, Zn as calendarEventLocalSpan, Zr as notificationRulesCapability, Zt as NcTemplateVarDescriptorSchema, _ as BIRTH_DECISION_DEFAULT_LIMIT, _a as discriminatedUnion, _i as retrainRevisionConflictMessage, _n as SceneMonitorSchema, _t as NC_CONSUMABLE_SYSTEM_EVENT_KINDS, a as CLIP_EMBEDDING_STEP_ID, aa as customAction, ai as plateGalleryCapability, an as RetrainDismissedSchema, ar as deleteAlarmProfile, at as NC_ALARM_NOTIFY_FIELDS, b as BucketAccumulator, ba as number, bi as ruleBelongsToAlarm$1, bn as SetTrackRelationInputSchema, br as eventKindLabel, bt as NC_GROUPING_MAX_SEC, c as readClusterModelPinStrict, ca as hydrateSchema, ci as readMotionTriggeredBy, cn as SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX, cr as deriveRecordingMode, ct as NC_AUDIO_CONFIRM_HITS_DEFAULT, d as APPEARANCE_BLOCKS, di as resolveClipSearchMinScore, dn as SCENE_DEFAULT_CHECK_INTERVAL_SEC, dr as deviceAttentionKind, dt as NC_CLIP_PRE_ROLL_DEFAULT_SEC, ea as CamProfileSchema, ei as paletteResultSchema, en as PackageLlmVerdictSchema, er as consumableFormOf, et as MotionTriggeredBySchema, f as APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT, fa as sleep$1, fi as resolveLocationMode, fn as SCENE_DEFAULT_OBSERVATION_SPACING_SEC, fr as deviceRemovalHookCapability, ft as NC_CLIP_RETENTION_MAX_SEC, g as ArchivedDebugNoteSchema, ga as boolean, gn as SCENE_RESET_RECAPTURES, gt as NC_CONSUMABLE_LOW_PERCENT_DEFAULT, h as AlarmArmModeSchema, ha as array, hi as resolveNcMediaImage, hn as SCENE_DIVERGED, hr as embeddingRefusalOf, ht as NC_CONFIRM_DEFAULT_TIMEOUT_MS, ia as createEvent, ii as pipelineAnalyticsCapability, in as RebuildObjectEmbeddingsRefusalSchema, ir as createAlarmProfile, it as NC_ALARM_DELAY_MAX_SEC, j as DetectionSourceSchema, ji as subjectPathSampleFromBox, jn as TrackSourceSchema, jr as isDefaultAlarmProfileId, jt as NcAlarmSensorsSchema, k as DETECTION_PIPELINE_CAP_NAME, ka as unknown, ki as storageOccupancyCapability, kn as TrackRelationSchema, kr as isAppLinkBase, kt as NcAlarmPostTriggeredActionSchema, l as resolveClusterModelPin, la as isDeviceScopedCap, li as readTimelapseGeneratedAt, ln as SCENE_CONFIRM_DEFAULT_TIMEOUT_MS, lr as describeSystemEventDeliveryProblem, lt as NC_AUDIO_CONFIRM_WINDOW_SEC_DEFAULT, m as AUDIO_MACRO_LABELS, ma as _enum, mi as resolveModeNotifyPolicy, mn as SCENE_DEFAULT_UNCOVERED_POLICY, mt as NC_CONFIRM_DEFAULT_MAX_IMAGE_PX, na as RECORD_MAX_DATA_BYTES, nn as RECORDING_EXPORT_MAX_READ_BYTES, nr as coreBlockIdFromAddonId, nt as NC_ALARM_DEFAULT_TRIGGERED_DURATION_SEC, o as CLUSTER_MODEL_OWNER_ADDON_ID, oa as defineCustomActions, oi as projectSubjectPath, on as RetrainOriginSchema, or as deriveDetailCropRect, ot as NC_ALARM_SYSTEM_EVENT_KINDS, p as ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT, pa as ZodObject, pi as resolveModeDelays, pn as SCENE_DEFAULT_QUIET_SECONDS, pt as NC_CONDITION_CATALOG, q as MAX_ARCHIVED_DEBUG_NOTES, qi as canonicalHash, qn as buildEventKindDescriptor, qr as mayWriteToLocation, qt as NcSystemEventKindSchema, ra as RECORD_QUERY_MAX, ri as pickFaceRescoreIntervalMinutes, rn as RECORDING_SOURCE_CAMSTACK_ADDON, rr as cosineSimilarity$1, rt as NC_ALARM_DELAY_FIELDS, s as FACE_EMBEDDING_STEP_ID, sa as defineRecordKinds, si as readDeviceStateFrom, sn as RetrainStatusSchema, sr as derivePostTriggeredAction, st as NC_ALARM_TRIGGERED_MAX_SEC, t as BUILTIN_CLIP_MODELS, ta as InvalidRecordError, ti as parseAlertEpisodePayload, tr as consumableLowPercentOf, tt as NC_ALARM_DEFAULT_PROFILE_ID, u as APPEARANCE_BIN_COUNT, ua as nodePin, ui as renameAlarmProfile, un as SCENE_DEFAULT_ANCHOR_THRESHOLD, ur as describeSystemEventFamilyProblem, ut as NC_CLIP_POST_ROLL_DEFAULT_SEC, v as BaseDevice, va as literal, vi as rootSupplyServes, vn as SetTrackPurityInputSchema, vr as encodeVectorBase64, vt as NC_DEFAULT_SNOOZE_MINUTES, w as CoverStateSchema, wa as strictObject, wi as sceneMonitorCapability, wn as TimelapseRulePatchSchema, wr as gifDeriveSpeed, wt as NC_STATE_SUMMARY_SECTION_IDS, x as COCO_TO_MACRO, xa as object, xi as ruleDeviceCompatCapQueries, xn as TIMELAPSE_DENSE_FLOOR_SEC, xr as evictionPolicyOfLocation, xt as NC_GROUPING_MIN_SEC, y as BirthDecisionRecordSchema, ya as looseObject, yi as ruleAutoTriggersAlarm, yn as SetTrackPurityResultSchema, yr as ensureAlarmProfiles, yt as NC_GROUPING_DEFAULT_SEC, z as FIRST_LEVEL_MACRO_CLASSES, zi as systemEventSummarySplitOf, zn as applyBlockingEdit, zr as isRetiredClearKey, zt as NcRuleTargetSchema } from "../clip-model-registry-
|
|
1
|
+
import { $ as MediaFileKindEnum, $i as CAP_ADVANCE_FIELDS, $n as cloneAlarmSettings, $r as paintHex, $t as OpsLogEntrySchema, A as DeclaredDevices, Aa as EventCategory, Ai as subKindsOf, An as TrackSideSchema, Ar as isAudioClassName, At as NcAlarmSensorsInputSchema, B as FULL_IMAGE_BBOX, Bi as templateCarriesSummary, Bn as applyModeDelaysEdits, Br as isRootSuppliableStepId, Bt as NcRuleUpdateInputSchema, C as ClearTrackRelationResultSchema, Ca as record, Ci as ruleKindOf, Cn as TimelapseRuleInputSchema, Cr as failureContributionCapability, Ct as NC_SNOOZE_MAX_MINUTES, D as DEFAULT_TIMELAPSE_PREVIEW_TEXT, Da as tuple, Di as servedTemplateVars, Dn as TrackPuritySchema, Dr as isAlertEpisodeOpen, Dt as NC_TEMPLATE_VARS, E as DEFAULT_EVENT_COLOR, Ea as templateLiteral, Ei as sensorRaisedOf, En as TrackPlacementSchema, Er as isAlarmControllableCap, Et as NC_TAXONOMY, F as EVENT_DENSITY_BATCH_MAX, Fi as systemEventDeliveryProblems, Fn as alarmPanelCapability, Fr as isEventOwnerType, Ft as NcRuleActionSchema, G as ListTrackRelationsResultSchema, Gi as zoneAnalyticsCapability, Gn as audioMetricsCapability, Gr as kebabToCamel, Gt as NcSnoozeSuppressedSchema, H as LABEL_SUPPLY_MACRO, Hi as vectorDimFromBase64, Hn as applySecureOnArmEdit, Hr as isSystemDelivery, Ht as NcSharedSequenceSchema, I as EVENT_KIND_BY_CAP, Ii as systemEventFamilyProblems, In as alertEpisodeId, Ir as isKnownTemplateVar, It as NcRuleInputSchema, J as MAX_BIRTH_DECISION_RECORDS, Ji as evaluateSensorEdge, Jn as buildSubjectPath, Jr as memoizePinnedFfmpeg, Jt as NcTaxonomySchema, K as LockStateSchema, Ki as DEFAULT_FIRST_SIGHTING_FRESHNESS_MS, Kn as audioModeOf, Kr as linkedStepOf, Kt as NcStateSummarySectionIdSchema, L as EVENT_OWNER_TYPES, Li as systemEventFilterApplies, Ln as alertEpisodeKind, Lr as isLabelSupplyStepId, Lt as NcRulePatchSchema, M as EMBEDDING_MODEL_FAILED, Mi as subjectPathSvgPoints, Mn as activateAlarmProfile, Mr as isDetectionMacroClass, Mt as NcAlarmSettingsPatchSchema, N as EMBEDDING_REQUIREMENTS_FAILED, Ni as summarizeReview, Nn as addonWidgetsSourceCapability, Nr as isDrawableSubjectPath, Nt as NcConditionDescriptorSchema, O as DETECTION_MACRO_CLASSES, Oa as union, Oi as startMoverUnderClearance, On as TrackRelationKindSchema, Or as isAlertEpisodeSeverity, Ot as NcAlarmConfigSchema, P as EMBEDDING_REQUIREMENTS_UNAVAILABLE, Pi as syncActiveAlarmProfileSettings, Pn as alarmDeviceSecureOnArm, Pr as isEventKindLabelKey, Pt as NcConditionsSchema, Q as MOTION_CLOSE_AFTER_MS, Qi as BaseAddon, Qn as classifyRetrainReview, Qr as occupancyScope, Qt as OPS_LOG_DEFAULT_LIMIT, R as EXPORT_DENSE_MAX_RANGES, Ri as systemEventSummaryScheduleOf, Rn as alertEpisodePayload, Rr as isMediaOwnerType, Rt as NcRuleSchema, S as ClearTrackRelationInputSchema, Sa as partialRecord, Si as ruleGroupingApplies, Sn as TRACK_RELATIONS_DEFAULT_LIMIT, Sr as faceGalleryCapability, St as NC_SENSOR_TRANSITION_KINDS, T as DEFAULT_DETAIL_CROP_CONVENTION, Ta as string, Ti as secureActuationFor, Tn as TimelapseRuleSchema, Tr as gifFromMp4Args, Tt as NC_SYSTEM_EVENT_KIND_GROUP_SPECS, U as LabelAttributionSchema, Ui as viewerLinkBaseOf, Un as armRemovalReconcile, Ur as isSystemEventSummaryRule, Ut as NcSnoozeInputSchema, V as FailureCounters, Vi as templateVarsFor, Vn as applyNonBlockingEdit, Vr as isScheduleActive, Vt as NcScheduleSchema, W as ListTrackRelationsInputSchema, Wi as withSystemEventClasses, Wn as assertTimelapseCadences, Wr as isVectorIndexDimConflict, Wt as NcSnoozeSchema, X as MAX_TRACK_PURITIES, Xi as DeviceType, Xn as bundledCamstack, Xr as normalizeNcMediaPolicy, Xt as NcTemplatePreviewSchema, Y as MAX_BIRTH_LATENCY_PROXY_MS, Yi as isSourceCap, Yn as buildViewerLink, Yr as ncMediaPolicyError, Yt as NcTemplatePreviewInputSchema, Z as MAX_TRACK_RELATIONS, Zi as errMsg, Zn as calendarEventLocalSpan, Zr as notificationRulesCapability, Zt as NcTemplateVarDescriptorSchema, _ as BIRTH_DECISION_DEFAULT_LIMIT, _a as discriminatedUnion, _i as retrainRevisionConflictMessage, _n as SceneMonitorSchema, _t as NC_CONSUMABLE_SYSTEM_EVENT_KINDS, a as CLIP_EMBEDDING_STEP_ID, aa as customAction, ai as plateGalleryCapability, an as RetrainDismissedSchema, ar as deleteAlarmProfile, at as NC_ALARM_NOTIFY_FIELDS, b as BucketAccumulator, ba as number, bi as ruleBelongsToAlarm$1, bn as SetTrackRelationInputSchema, br as eventKindLabel, bt as NC_GROUPING_MAX_SEC, c as readClusterModelPinStrict, ca as hydrateSchema, ci as readMotionTriggeredBy, cn as SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX, cr as deriveRecordingMode, ct as NC_AUDIO_CONFIRM_HITS_DEFAULT, d as APPEARANCE_BLOCKS, di as resolveClipSearchMinScore, dn as SCENE_DEFAULT_CHECK_INTERVAL_SEC, dr as deviceAttentionKind, dt as NC_CLIP_PRE_ROLL_DEFAULT_SEC, ea as CamProfileSchema, ei as paletteResultSchema, en as PackageLlmVerdictSchema, er as consumableFormOf, et as MotionTriggeredBySchema, f as APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT, fa as sleep$1, fi as resolveLocationMode, fn as SCENE_DEFAULT_OBSERVATION_SPACING_SEC, fr as deviceRemovalHookCapability, ft as NC_CLIP_RETENTION_MAX_SEC, g as ArchivedDebugNoteSchema, ga as boolean, gn as SCENE_RESET_RECAPTURES, gt as NC_CONSUMABLE_LOW_PERCENT_DEFAULT, h as AlarmArmModeSchema, ha as array, hi as resolveNcMediaImage, hn as SCENE_DIVERGED, hr as embeddingRefusalOf, ht as NC_CONFIRM_DEFAULT_TIMEOUT_MS, ia as createEvent, ii as pipelineAnalyticsCapability, in as RebuildObjectEmbeddingsRefusalSchema, ir as createAlarmProfile, it as NC_ALARM_DELAY_MAX_SEC, j as DetectionSourceSchema, ji as subjectPathSampleFromBox, jn as TrackSourceSchema, jr as isDefaultAlarmProfileId, jt as NcAlarmSensorsSchema, k as DETECTION_PIPELINE_CAP_NAME, ka as unknown, ki as storageOccupancyCapability, kn as TrackRelationSchema, kr as isAppLinkBase, kt as NcAlarmPostTriggeredActionSchema, l as resolveClusterModelPin, la as isDeviceScopedCap, li as readTimelapseGeneratedAt, ln as SCENE_CONFIRM_DEFAULT_TIMEOUT_MS, lr as describeSystemEventDeliveryProblem, lt as NC_AUDIO_CONFIRM_WINDOW_SEC_DEFAULT, m as AUDIO_MACRO_LABELS, ma as _enum, mi as resolveModeNotifyPolicy, mn as SCENE_DEFAULT_UNCOVERED_POLICY, mt as NC_CONFIRM_DEFAULT_MAX_IMAGE_PX, na as RECORD_MAX_DATA_BYTES, nn as RECORDING_EXPORT_MAX_READ_BYTES, nr as coreBlockIdFromAddonId, nt as NC_ALARM_DEFAULT_TRIGGERED_DURATION_SEC, o as CLUSTER_MODEL_OWNER_ADDON_ID, oa as defineCustomActions, oi as projectSubjectPath, on as RetrainOriginSchema, or as deriveDetailCropRect, ot as NC_ALARM_SYSTEM_EVENT_KINDS, p as ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT, pa as ZodObject, pi as resolveModeDelays, pn as SCENE_DEFAULT_QUIET_SECONDS, pt as NC_CONDITION_CATALOG, q as MAX_ARCHIVED_DEBUG_NOTES, qi as canonicalHash, qn as buildEventKindDescriptor, qr as mayWriteToLocation, qt as NcSystemEventKindSchema, ra as RECORD_QUERY_MAX, ri as pickFaceRescoreIntervalMinutes, rn as RECORDING_SOURCE_CAMSTACK_ADDON, rr as cosineSimilarity$1, rt as NC_ALARM_DELAY_FIELDS, s as FACE_EMBEDDING_STEP_ID, sa as defineRecordKinds, si as readDeviceStateFrom, sn as RetrainStatusSchema, sr as derivePostTriggeredAction, st as NC_ALARM_TRIGGERED_MAX_SEC, t as BUILTIN_CLIP_MODELS, ta as InvalidRecordError, ti as parseAlertEpisodePayload, tr as consumableLowPercentOf, tt as NC_ALARM_DEFAULT_PROFILE_ID, u as APPEARANCE_BIN_COUNT, ua as nodePin, ui as renameAlarmProfile, un as SCENE_DEFAULT_ANCHOR_THRESHOLD, ur as describeSystemEventFamilyProblem, ut as NC_CLIP_POST_ROLL_DEFAULT_SEC, v as BaseDevice, va as literal, vi as rootSupplyServes, vn as SetTrackPurityInputSchema, vr as encodeVectorBase64, vt as NC_DEFAULT_SNOOZE_MINUTES, w as CoverStateSchema, wa as strictObject, wi as sceneMonitorCapability, wn as TimelapseRulePatchSchema, wr as gifDeriveSpeed, wt as NC_STATE_SUMMARY_SECTION_IDS, x as COCO_TO_MACRO, xa as object, xi as ruleDeviceCompatCapQueries, xn as TIMELAPSE_DENSE_FLOOR_SEC, xr as evictionPolicyOfLocation, xt as NC_GROUPING_MIN_SEC, y as BirthDecisionRecordSchema, ya as looseObject, yi as ruleAutoTriggersAlarm, yn as SetTrackPurityResultSchema, yr as ensureAlarmProfiles, yt as NC_GROUPING_DEFAULT_SEC, z as FIRST_LEVEL_MACRO_CLASSES, zi as systemEventSummarySplitOf, zn as applyBlockingEdit, zr as isRetiredClearKey, zt as NcRuleTargetSchema } from "../clip-model-registry-Cw7Iy7Qi.mjs";
|
|
2
2
|
import { t as __exportAll } from "../embedding-encoder/index.mjs";
|
|
3
3
|
import * as fs$1 from "node:fs";
|
|
4
4
|
import { createWriteStream, promises } from "node:fs";
|
|
@@ -9379,7 +9379,7 @@ var it_default = {
|
|
|
9379
9379
|
"occupancy.op.free": "libera",
|
|
9380
9380
|
"system.device-online.title": "Di nuovo online — {{deviceName}}",
|
|
9381
9381
|
"system.device-online.body": "Il dispositivo {{deviceName}} è di nuovo online",
|
|
9382
|
-
"system.device-offline.title": "
|
|
9382
|
+
"system.device-offline.title": "Non raggiungibile — {{deviceName}}",
|
|
9383
9383
|
"system.device-offline.body": "Il dispositivo {{deviceName}} è offline",
|
|
9384
9384
|
"system.device-disabled.title": "Spento — {{deviceName}}",
|
|
9385
9385
|
"system.device-disabled.body": "Il dispositivo {{deviceName}} è stato spento",
|
|
@@ -9395,7 +9395,7 @@ var it_default = {
|
|
|
9395
9395
|
"system.stream-online.title": "Stream di nuovo online — {{deviceName}}",
|
|
9396
9396
|
"system.stream-online.body": "Lo stream della camera {{deviceName}} è di nuovo online",
|
|
9397
9397
|
"system.stream-online.body.profiled": "Lo stream {{profile}} della camera {{deviceName}} è di nuovo online",
|
|
9398
|
-
"system.stream-offline.title": "
|
|
9398
|
+
"system.stream-offline.title": "Flusso interrotto — {{deviceName}}",
|
|
9399
9399
|
"system.stream-offline.body": "Lo stream della camera {{deviceName}} è offline",
|
|
9400
9400
|
"system.stream-offline.body.profiled": "Lo stream {{profile}} della camera {{deviceName}} è offline",
|
|
9401
9401
|
"system.node-online.title": "Nodo di nuovo online — {{nodeName}}",
|
|
@@ -9426,7 +9426,7 @@ var it_default = {
|
|
|
9426
9426
|
"system.storage-location-low.body": "La location {{locationName}} è al {{freePercent}}% libero ({{reason}})",
|
|
9427
9427
|
"system.storage-location-critical.title": "Storage critico — {{locationName}}",
|
|
9428
9428
|
"system.storage-location-critical.body": "La location {{locationName}} è critica: {{reason}}",
|
|
9429
|
-
"system.storage-location-ok.title": "
|
|
9429
|
+
"system.storage-location-ok.title": "Archivio a posto — {{locationName}}",
|
|
9430
9430
|
"system.storage-location-ok.body": "La location {{locationName}} ha recuperato spazio libero",
|
|
9431
9431
|
"system.detection-blind.title": "Senza detection — {{deviceName}}",
|
|
9432
9432
|
"system.detection-blind.body": {
|
|
@@ -9507,8 +9507,8 @@ var it_default = {
|
|
|
9507
9507
|
"system.camera-disabled.body": "Il dispositivo {{deviceName}} è stato spento",
|
|
9508
9508
|
"system.camera-enabled.title": "Dispositivo riacceso",
|
|
9509
9509
|
"system.camera-enabled.body": "Il dispositivo {{deviceName}} è stato riacceso",
|
|
9510
|
-
"test.prefix": "[
|
|
9511
|
-
"timelapse.title": "
|
|
9510
|
+
"test.prefix": "[PROVA] {{body}}",
|
|
9511
|
+
"timelapse.title": "Sequenza — {{camera}}",
|
|
9512
9512
|
"timelapse.body.window": "{{rule}} — {{from}}→{{to}}",
|
|
9513
9513
|
"timelapse.body.tooManyEvents": "troppi eventi per il campionamento denso: video a cadenza uniforme",
|
|
9514
9514
|
"timelapse.body.denseRanges": {
|
|
@@ -9670,7 +9670,7 @@ var it_default = {
|
|
|
9670
9670
|
"summary.line.node-inference-unavailable": "{{nodeId}} — non può eseguire l'inferenza (da {{since}})",
|
|
9671
9671
|
"summary.line.addon-crash-loop": "{{nodeId}} — {{addons}} fermati dopo crash ripetuti (da {{since}})",
|
|
9672
9672
|
"summary.line.update": "{{packageName}} {{currentVersion}} → {{latestVersion}}",
|
|
9673
|
-
"summary.line.wrapper-update": "
|
|
9673
|
+
"summary.line.wrapper-update": "Contenitore {{currentVersion}} → {{latestVersion}}",
|
|
9674
9674
|
"summary.line.consumable.part": "{{item}} {{percentage}}%",
|
|
9675
9675
|
"summary.line.consumable.part.unmeasured": "{{item}} da sostituire",
|
|
9676
9676
|
"summary.line.consumable.tank": "{{item}} quasi vuota",
|
|
@@ -83937,6 +83937,53 @@ function withTimeout$3(promise, ms) {
|
|
|
83937
83937
|
}
|
|
83938
83938
|
//#endregion
|
|
83939
83939
|
//#region src/notification-center/summary/mosaic-renderer.ts
|
|
83940
|
+
/**
|
|
83941
|
+
* The mosaic: N stored best-shots laid out as one image.
|
|
83942
|
+
*
|
|
83943
|
+
* ## The mosaic is ALWAYS CLEAN
|
|
83944
|
+
*
|
|
83945
|
+
* No detection boxes. Not "boxes off by default" — the media ladder in
|
|
83946
|
+
* `summary-selection.ts` refuses `fullFrameBoxed` outright and nothing here
|
|
83947
|
+
* draws a rectangle. The operator asked for it in those words, and there are
|
|
83948
|
+
* two further reasons worth writing down so nobody adds them back as a
|
|
83949
|
+
* convenience:
|
|
83950
|
+
*
|
|
83951
|
+
* - a burnt-in box is permanent. A tile is a durable artefact and a mosaic is
|
|
83952
|
+
* a thing an operator re-reads days later; a box drawn from a detection that
|
|
83953
|
+
* was wrong cannot be un-drawn;
|
|
83954
|
+
* - for P2 it is an attack surface. Anything rendered INTO the pixels is text
|
|
83955
|
+
* the model reads as scene content, and D121 is this repo's record of a
|
|
83956
|
+
* model treating in-frame text as instruction. Boxes stay DATA — the
|
|
83957
|
+
* artefact can carry them, the picture never does.
|
|
83958
|
+
*
|
|
83959
|
+
* ## …and by default it carries NO TEXT EITHER
|
|
83960
|
+
*
|
|
83961
|
+
* {@link mosaicTextPlan} is the ONE place that decides whether a word is drawn,
|
|
83962
|
+
* and with no `captions` on the rule the answer is "none": tile labels off,
|
|
83963
|
+
* title band off. Same argument as the boxes, one step further — the operator
|
|
83964
|
+
* asked for a wall of pictures, a burnt-in caption cannot be un-drawn, and the
|
|
83965
|
+
* label strip covers 14% of every tile with the part of the frame nearest the
|
|
83966
|
+
* ground, which is where feet, wheels and parcels are.
|
|
83967
|
+
*
|
|
83968
|
+
* Nothing is lost by it. The AI pass never sees this image:
|
|
83969
|
+
* `summary-producer.ts#analyse` hands the model the RAW per-track JPEGs and
|
|
83970
|
+
* `summary-ai.ts#buildSummaryAiPrompt` supplies camera name, class and time as
|
|
83971
|
+
* PROMPT TEXT. The tile rectangles stay exported (see {@link mosaicLayout}) so
|
|
83972
|
+
* a viewer can still say what a tile is without a word being burnt into it.
|
|
83973
|
+
*
|
|
83974
|
+
* ## sharp, and never ffmpeg `drawtext`
|
|
83975
|
+
*
|
|
83976
|
+
* Labels, WHEN ASKED FOR, are composited as SVG through sharp. D118 forbids `drawtext` because
|
|
83977
|
+
* the hub carries two ffmpeg builds that disagree about libfreetype, so a
|
|
83978
|
+
* caption would appear or vanish depending on which node rendered it. sharp is
|
|
83979
|
+
* a direct dependency of this addon and its text path is librsvg, which is the
|
|
83980
|
+
* same one the timelapse preview already uses.
|
|
83981
|
+
*
|
|
83982
|
+
* The geometry helpers are pure and exported: {@link mosaicGrid} and
|
|
83983
|
+
* {@link mosaicLayout} answer the tile rectangles WITHOUT touching a pixel,
|
|
83984
|
+
* which is what lets the layout be tested and what a future clickable-tile
|
|
83985
|
+
* viewer will read.
|
|
83986
|
+
*/
|
|
83940
83987
|
/** Widest mosaic produced. 1920 keeps a 3×3 grid at 640 px a tile — readable
|
|
83941
83988
|
* on a phone, and a ~200 KB JPEG that every notifier accepts. */
|
|
83942
83989
|
var MOSAIC_MAX_WIDTH = 1920;
|
|
@@ -84130,6 +84177,13 @@ function fitLine(text, usablePx, basePx, minPx) {
|
|
|
84130
84177
|
fontPx
|
|
84131
84178
|
};
|
|
84132
84179
|
}
|
|
84180
|
+
/**
|
|
84181
|
+
* The words drawn on a summary tile: camera, clock, and the class vocabulary
|
|
84182
|
+
* in the hub language. A class the vocabulary does not know stays the wire id.
|
|
84183
|
+
*/
|
|
84184
|
+
function summaryTileCaption(camera, clock, className, locale) {
|
|
84185
|
+
return `${camera} · ${clock} · ${eventKindLabel(className, locale)}`;
|
|
84186
|
+
}
|
|
84133
84187
|
/** The label strip drawn across the bottom of one tile. */
|
|
84134
84188
|
function tileLabelSvg(width, height, label) {
|
|
84135
84189
|
const bandHeight = Math.max(18, Math.round(height * LABEL_BAND_FRACTION));
|
|
@@ -85204,8 +85258,9 @@ function selectTriggerZoneCandidates(input) {
|
|
|
85204
85258
|
*
|
|
85205
85259
|
* - `scene-boxes` — the whole scene; the subject outlined THICK in the accent
|
|
85206
85260
|
* colour, every OTHER track visible at that instant outlined THIN, each
|
|
85207
|
-
* captioned with class
|
|
85208
|
-
* reads on any background. Boxes are the tracks'
|
|
85261
|
+
* captioned with the class vocabulary in the hub language ("Cane 87%") on a
|
|
85262
|
+
* dark plate that reads on any background. Boxes are the tracks' trail
|
|
85263
|
+
* boxes AT
|
|
85209
85264
|
* the source frame's timestamp — never the track envelope — scaled to the
|
|
85210
85265
|
* JPEG.
|
|
85211
85266
|
* - `crop` — the subject cut out of the clean frame around its box at that
|
|
@@ -85226,10 +85281,11 @@ function selectTriggerZoneCandidates(input) {
|
|
|
85226
85281
|
* ## Once per record
|
|
85227
85282
|
*
|
|
85228
85283
|
* N targets and every outbox retry resolve the same row; the render is
|
|
85229
|
-
* memoised per record + subject + mode + zone flag + camera
|
|
85230
|
-
* {@link NC_IMAGE_MEMO_TTL_MS}, so a 4K decode happens once, not once per
|
|
85231
|
-
* phone.
|
|
85232
|
-
*
|
|
85284
|
+
* memoised per record + subject + mode + zone flag + camera + hub language
|
|
85285
|
+
* for {@link NC_IMAGE_MEMO_TTL_MS}, so a 4K decode happens once, not once per
|
|
85286
|
+
* phone. The hub has one notification language, so every recipient of a row
|
|
85287
|
+
* shares that picture. It runs in the process that hosts the Notification
|
|
85288
|
+
* Center (the pipeline-analytics runner), which already carries `sharp`.
|
|
85233
85289
|
*/
|
|
85234
85290
|
/** How long a rendered picture is reused for the same record (N targets, retries). */
|
|
85235
85291
|
var NC_IMAGE_MEMO_TTL_MS = 15 * 6e4;
|
|
@@ -85261,12 +85317,37 @@ var SAME_SUBJECT_IOU = .8;
|
|
|
85261
85317
|
*/
|
|
85262
85318
|
var NC_IMAGE_SAME_CLASS_SUBJECT_IOU = .5;
|
|
85263
85319
|
var JPEG_QUALITY = 85;
|
|
85264
|
-
/** The caption of a box:
|
|
85320
|
+
/** The caption of a box: a name and confidence — "Cane 87%". The name is already chosen. */
|
|
85265
85321
|
function imageLabelText(name, confidence) {
|
|
85266
85322
|
if (confidence === void 0 || !Number.isFinite(confidence)) return name;
|
|
85267
85323
|
const pct = Math.round(Math.min(1, Math.max(0, confidence)) * 100);
|
|
85268
85324
|
return `${name} ${String(pct)}%`;
|
|
85269
85325
|
}
|
|
85326
|
+
/**
|
|
85327
|
+
* The name drawn on a box, in the hub language.
|
|
85328
|
+
*
|
|
85329
|
+
* A class id — the coarse class, or a finer one riding `label` — is
|
|
85330
|
+
* {@link eventKindLabel}. An identity or a plate stays the word the
|
|
85331
|
+
* recogniser produced. A class the vocabulary does not know stays the wire
|
|
85332
|
+
* id, which is what `eventKindLabel` already returns.
|
|
85333
|
+
*/
|
|
85334
|
+
function imageBoxName(input, locale) {
|
|
85335
|
+
if (input.labelKind === "identity" || input.labelKind === "plate") {
|
|
85336
|
+
const written = input.label?.trim();
|
|
85337
|
+
if (written !== void 0 && written.length > 0) return written;
|
|
85338
|
+
}
|
|
85339
|
+
const label = input.label?.trim();
|
|
85340
|
+
if (label !== void 0 && label.length > 0) {
|
|
85341
|
+
const key = label.toLowerCase();
|
|
85342
|
+
if (isEventKindLabelKey(key)) return eventKindLabel(key, locale);
|
|
85343
|
+
if (key !== input.className.trim().toLowerCase()) return label;
|
|
85344
|
+
}
|
|
85345
|
+
return eventKindLabel(input.className, locale);
|
|
85346
|
+
}
|
|
85347
|
+
/** Class vocabulary in `locale`, plus confidence — the string the overlay draws. */
|
|
85348
|
+
function imageBoxCaption(input, locale) {
|
|
85349
|
+
return imageLabelText(imageBoxName(input, locale), input.confidence);
|
|
85350
|
+
}
|
|
85270
85351
|
/** Stroke widths for an output of this size: the subject's is the thick one. */
|
|
85271
85352
|
function overlayStrokes(width, height) {
|
|
85272
85353
|
const subject = Math.max(4, Math.round(Math.min(width, height) / 110));
|
|
@@ -85565,8 +85646,8 @@ var NcNotificationImageStage = class {
|
|
|
85565
85646
|
}
|
|
85566
85647
|
/**
|
|
85567
85648
|
* The picture for this row from this source, rendered once per record +
|
|
85568
|
-
* subject + mode + zone flag + camera and reused for every
|
|
85569
|
-
* Null when the row ships no still.
|
|
85649
|
+
* subject + mode + zone flag + camera + language and reused for every
|
|
85650
|
+
* target and retry. Null when the row ships no still.
|
|
85570
85651
|
*/
|
|
85571
85652
|
async notificationImage(input) {
|
|
85572
85653
|
const payload = input.entry.payload;
|
|
@@ -85574,13 +85655,15 @@ var NcNotificationImageStage = class {
|
|
|
85574
85655
|
if (mode === "none") return null;
|
|
85575
85656
|
const zoneIds = input.withSubject ? payloadZoneOverlayIds(payload) : [];
|
|
85576
85657
|
const withPath = input.withSubject && payloadShowsSubjectPath(payload);
|
|
85658
|
+
const locale = input.locale ?? "en";
|
|
85577
85659
|
const key = [
|
|
85578
85660
|
input.entry.recordId,
|
|
85579
85661
|
payload.subject.trackId ?? "",
|
|
85580
85662
|
mode,
|
|
85581
85663
|
zoneIds.length > 0 ? "z" : "-",
|
|
85582
85664
|
withPath ? "p" : "-",
|
|
85583
|
-
String(input.camera)
|
|
85665
|
+
String(input.camera),
|
|
85666
|
+
locale
|
|
85584
85667
|
].join("|");
|
|
85585
85668
|
const now = this.deps.now();
|
|
85586
85669
|
const hit = this.memo.get(key);
|
|
@@ -85618,9 +85701,15 @@ var NcNotificationImageStage = class {
|
|
|
85618
85701
|
const trail = hasTrackedSubject(subjectTrackId) ? await this.subjectTrail(camera, subjectTrackId) : [];
|
|
85619
85702
|
const subjectBox = trailAt(trail, source.timestamp, NC_IMAGE_BOX_MATCH_MAX_MS)?.bbox ?? null;
|
|
85620
85703
|
const path = withPath ? this.subjectPath(input, trail) : [];
|
|
85704
|
+
const locale = input.locale ?? "en";
|
|
85621
85705
|
const subject = subjectBox !== null ? {
|
|
85622
85706
|
...subjectBox,
|
|
85623
|
-
label:
|
|
85707
|
+
label: imageBoxCaption({
|
|
85708
|
+
className: payload.subject.className,
|
|
85709
|
+
...payload.subject.label !== void 0 ? { label: payload.subject.label } : {},
|
|
85710
|
+
...payload.subject.labelKind !== void 0 ? { labelKind: payload.subject.labelKind } : {},
|
|
85711
|
+
...payload.subject.confidence !== void 0 ? { confidence: payload.subject.confidence } : {}
|
|
85712
|
+
}, locale),
|
|
85624
85713
|
className: payload.subject.className
|
|
85625
85714
|
} : null;
|
|
85626
85715
|
const othersDrawn = mode === "scene-boxes" ? otherTracks(await this.tracksAt(camera, source.timestamp), subjectTrackId, subjectBox, payload.subject.className) : [];
|
|
@@ -85635,7 +85724,11 @@ var NcNotificationImageStage = class {
|
|
|
85635
85724
|
});
|
|
85636
85725
|
const others = mode === "scene-boxes" ? othersDrawn.map((t) => ({
|
|
85637
85726
|
...t.bbox,
|
|
85638
|
-
label:
|
|
85727
|
+
label: imageBoxCaption({
|
|
85728
|
+
className: t.className,
|
|
85729
|
+
...t.label !== void 0 ? { label: t.label } : {},
|
|
85730
|
+
...t.confidence !== void 0 ? { confidence: t.confidence } : {}
|
|
85731
|
+
}, locale),
|
|
85639
85732
|
className: t.className,
|
|
85640
85733
|
...t.confidence !== void 0 ? { confidence: t.confidence } : {}
|
|
85641
85734
|
})) : [];
|
|
@@ -87145,7 +87238,8 @@ var NcDispatcher = class {
|
|
|
87145
87238
|
annotated: isAnnotatedSceneKind(file.kind)
|
|
87146
87239
|
},
|
|
87147
87240
|
camera: cameraId,
|
|
87148
|
-
withSubject: false
|
|
87241
|
+
withSubject: false,
|
|
87242
|
+
locale: this.texts.language
|
|
87149
87243
|
});
|
|
87150
87244
|
if (image === null) continue;
|
|
87151
87245
|
out.push({
|
|
@@ -87934,7 +88028,8 @@ var NcDispatcher = class {
|
|
|
87934
88028
|
annotated: isAnnotatedSceneKind(file.kind)
|
|
87935
88029
|
},
|
|
87936
88030
|
camera: primaryImageCamera(entry.payload),
|
|
87937
|
-
withSubject: true
|
|
88031
|
+
withSubject: true,
|
|
88032
|
+
locale: this.texts.language
|
|
87938
88033
|
});
|
|
87939
88034
|
if (image === null) return null;
|
|
87940
88035
|
return {
|
|
@@ -94654,7 +94749,7 @@ var NcSummaryProducer = class {
|
|
|
94654
94749
|
purpose: "summary",
|
|
94655
94750
|
tiles: tiles.map(({ candidate, jpeg }) => ({
|
|
94656
94751
|
jpeg,
|
|
94657
|
-
...plan.tileLabels ? { label:
|
|
94752
|
+
...plan.tileLabels ? { label: summaryTileCaption(names.get(candidate.deviceId) ?? String(candidate.deviceId), clockOf$2(candidate.firstSeen), candidate.className, this.texts.language) } : {},
|
|
94658
94753
|
deviceId: candidate.deviceId,
|
|
94659
94754
|
sourceId: candidate.trackId
|
|
94660
94755
|
})),
|
|
@@ -112243,7 +112338,7 @@ var MotionEpisodeTracker = class {
|
|
|
112243
112338
|
*
|
|
112244
112339
|
* A single timeout is the call's bound doing its job. Three uncertain confirms
|
|
112245
112340
|
* in a row, with no yes and no no between them, is the provider not answering
|
|
112246
|
-
* — the shape camera
|
|
112341
|
+
* — the shape camera 102 showed on 2026-10-26 (nine timeouts, zero answers).
|
|
112247
112342
|
* A time window would also count a timeout that a later answer already closed.
|
|
112248
112343
|
* The streak resets on any answer. A further uncertain while the edge is
|
|
112249
112344
|
* open does not raise again.
|
|
@@ -30,7 +30,7 @@ async function d(e) {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
async function f() {
|
|
33
|
-
return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-
|
|
33
|
+
return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-Cct0TMzC.mjs")).catch((e) => {
|
|
34
34
|
throw l = void 0, e;
|
|
35
35
|
}), l;
|
|
36
36
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-post-analysis",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.641",
|
|
4
4
|
"description": "Post-Analysis bundle — enrichment, embedding-encoder, pipeline-analytics. Multi-entry npm package shipping addons that consume pipeline output.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|