@camstack/addon-post-analysis 1.2.197 → 1.2.199
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/{dist-DT2v4pR9.mjs → dist-BrszC4uJ.mjs} +600 -366
- package/dist/{dist-CnbZ-uNd.js → dist-fmXXxa9D.js} +623 -365
- package/dist/embedding-encoder/index.js +1 -1
- package/dist/embedding-encoder/index.mjs +1 -1
- package/dist/pipeline-analytics/_stub.js +1 -1
- package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-BQGYsovE.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-CTKbm1Jm.mjs} +3 -3
- package/dist/pipeline-analytics/{_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-COgVCsnc.mjs → _virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BsBwoxCb.mjs} +1 -1
- package/dist/pipeline-analytics/{hostInit-ChHoZKeK.mjs → hostInit-DXFji_c2.mjs} +3 -3
- package/dist/pipeline-analytics/index.js +174 -32
- package/dist/pipeline-analytics/index.mjs +174 -32
- package/dist/pipeline-analytics/remoteEntry.js +1 -1
- package/package.json +5 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as audioModeOf, A as NcSnoozeSchema, At as
|
|
1
|
+
import { $ as audioModeOf, $t as EventCategory, A as NcSnoozeSchema, At as vectorDimFromBase64, B as SCENE_DEFAULT_UNCOVERED_POLICY, Bt as nodePin, C as NcConditionDescriptorSchema, Ct as readTimelapseGeneratedAt, D as NcRuleTargetSchema, Dt as storageOccupancyCapability, E as NcRuleSchema, Et as sceneMonitorCapability, Ft as CamProfileSchema, G as TimelapseRulePatchSchema, Gt as discriminatedUnion, H as SceneMonitorSchema, Ht as _enum, I as RECORDING_EXPORT_MAX_READ_BYTES, It as DeviceType, J as VISIT_MERGE_GAP_MS, Jt as object, K as TimelapseRuleSchema, Kt as literal, L as RetrainStatusSchema, Lt as createEvent, M as NcSystemEventKindSchema, Mt as zoneAnalyticsCapability, N as NcTaxonomySchema, Nt as errMsg$1, O as NcScheduleSchema, Ot as subKindsOf, P as OpsLogEntrySchema, Pt as BaseAddon, Q as audioMetricsCapability, Qt as unknown, Rt as hydrateSchema, S as NC_TAXONOMY, St as readDeviceStateFrom, T as NcRulePatchSchema, U as TIMELAPSE_DENSE_FLOOR_SEC, Ut as array, V as SCENE_DIVERGED, Vt as sleep$1, W as TimelapseRuleInputSchema, Wt as boolean, X as alarmPanelCapability, Xt as record, Y as addonWidgetsSourceCapability, Yt as partialRecord, Z as assertTimelapseCadences, Zt as string, _ as MediaFileKindEnum, _t as notificationRulesCapability, a as DEFAULT_EVENT_COLOR, b as NC_DEFAULT_SNOOZE_MINUTES, bt as pipelineAnalyticsCapability, c as DETECTION_MACRO_CLASSES, ct as evictionPolicyOfLocation, d as EVENT_KIND_BY_CAP, et as buildEventKindDescriptor, f as EVENT_PAD_MS, ft as isDetectionMacroClass, g as MACRO_LABELS, gt as mayWriteToLocation, h as LabelAttributionSchema, ht as kebabToCamel, i as COCO_TO_MACRO, it as deriveRecordingMode, j as NcSnoozeSuppressedSchema, jt as videoclipsCapability, k as NcSnoozeInputSchema, kt as systemEventFilterApplies, lt as faceGalleryCapability, m as FailureCounters, mt as isSourceCap, n as BaseDevice, nt as customAction, ot as encodeVectorBase64, p as FULL_IMAGE_BBOX, pt as isScheduleActive, q as TrackSourceSchema, qt as number, r as CLUSTER_MODEL_SCOPED_STEPS, rt as defineCustomActions, st as evaluateSensorEdge, t as AUDIO_MACRO_LABELS, tt as cosineSimilarity$1, u as DeclaredDevices, ut as failureContributionCapability, v as NC_ALARM_SYSTEM_EVENT_KINDS, w as NcRuleInputSchema, wt as resolveLocationMode, xt as plateGalleryCapability, y as NC_CONDITION_CATALOG, yt as pickClusterStepModels, z as SCENE_DEFAULT_ANCHOR_THRESHOLD, zt as isDeviceScopedCap } from "../dist-BrszC4uJ.mjs";
|
|
2
2
|
import { t as __exportAll } from "../embedding-encoder/index.mjs";
|
|
3
3
|
import * as fs from "node:fs";
|
|
4
4
|
import { promises } from "node:fs";
|
|
@@ -9,6 +9,45 @@ import { execFile } from "node:child_process";
|
|
|
9
9
|
import sharp from "sharp";
|
|
10
10
|
import os from "node:os";
|
|
11
11
|
import { Buffer as Buffer$1 } from "node:buffer";
|
|
12
|
+
//#region src/pipeline-analytics/media-occupancy.ts
|
|
13
|
+
/** The bare type ref legacy NULL-stamped media rows belong to. */
|
|
14
|
+
var LEGACY_MEDIA_TYPE = "eventMedia";
|
|
15
|
+
/**
|
|
16
|
+
* Which of the requested locations the legacy `eventMedia` rows belong to, or
|
|
17
|
+
* `null` when it cannot be decided — the same rule `resolveRef` applies, and
|
|
18
|
+
* the same refusal when it is ambiguous.
|
|
19
|
+
*/
|
|
20
|
+
function legacyMediaLocationOf(locationIds) {
|
|
21
|
+
const ofType = locationIds.filter((id) => id.startsWith(`${LEGACY_MEDIA_TYPE}:`));
|
|
22
|
+
if (ofType.length === 1) return ofType[0] ?? null;
|
|
23
|
+
return ofType.find((id) => id === `eventMedia:default`) ?? null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The occupancy reports for one measurement.
|
|
27
|
+
*
|
|
28
|
+
* A location with nothing on it is OMITTED, not reported as zero: only the
|
|
29
|
+
* orchestrator knows whether nobody reported for a location or every reporter
|
|
30
|
+
* holds nothing there, and it is the one that must be able to tell them apart.
|
|
31
|
+
*/
|
|
32
|
+
function mediaOccupancyReports(footprint, locationIds, measuredAtMs) {
|
|
33
|
+
const bytesByLocation = new Map(footprint.byLocation);
|
|
34
|
+
const legacyTarget = footprint.legacyNullBytes > 0 ? legacyMediaLocationOf(locationIds) : null;
|
|
35
|
+
if (legacyTarget !== null) bytesByLocation.set(legacyTarget, (bytesByLocation.get(legacyTarget) ?? 0) + footprint.legacyNullBytes);
|
|
36
|
+
const reports = [];
|
|
37
|
+
for (const [locationId, ownedBytes] of bytesByLocation) {
|
|
38
|
+
if (ownedBytes <= 0) continue;
|
|
39
|
+
reports.push({
|
|
40
|
+
locationId,
|
|
41
|
+
ownedBytes,
|
|
42
|
+
measuredAtMs
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
reports,
|
|
47
|
+
unattributedBytes: legacyTarget === null ? footprint.legacyNullBytes : 0
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//#endregion
|
|
12
51
|
//#region src/notification-center/action-token.ts
|
|
13
52
|
/**
|
|
14
53
|
* The authority behind a notification button.
|
|
@@ -12768,6 +12807,23 @@ function recordToRow$2(subject, data) {
|
|
|
12768
12807
|
};
|
|
12769
12808
|
}
|
|
12770
12809
|
//#endregion
|
|
12810
|
+
//#region src/notification-center/no-match-report-key.ts
|
|
12811
|
+
/**
|
|
12812
|
+
* Stand-in for "this subject named no class". A distinct token rather than an
|
|
12813
|
+
* empty string so a class-less subject occupies its own bucket instead of
|
|
12814
|
+
* sharing one with every other class-less kind by accident.
|
|
12815
|
+
*/
|
|
12816
|
+
var NO_CLASSES = "∅";
|
|
12817
|
+
/**
|
|
12818
|
+
* The bucket key. Stable across calls, insensitive to class ORDER, DUPLICATES
|
|
12819
|
+
* and CASE — a detector that re-orders its class list, repeats one, or changes
|
|
12820
|
+
* its capitalisation must not fork the bucket and double the log volume.
|
|
12821
|
+
*/
|
|
12822
|
+
function noMatchReportKey(subject) {
|
|
12823
|
+
const classes = [...new Set(subject.classNames.map((c) => c.toLowerCase()))].sort();
|
|
12824
|
+
return `${subject.deviceId}|${subject.kind}|${classes.length > 0 ? classes.join(",") : NO_CLASSES}`;
|
|
12825
|
+
}
|
|
12826
|
+
//#endregion
|
|
12771
12827
|
//#region src/notification-center/occupancy-watcher.ts
|
|
12772
12828
|
/** Sentinel key segments for the "no zone" (whole-frame) and "no class" scopes. */
|
|
12773
12829
|
var FRAME_SCOPE = "@frame";
|
|
@@ -21884,10 +21940,15 @@ var NotificationCenter = class NotificationCenter {
|
|
|
21884
21940
|
* which leaves those notifications text-only rather than broken.
|
|
21885
21941
|
*/
|
|
21886
21942
|
stills;
|
|
21887
|
-
/**
|
|
21943
|
+
/**
|
|
21944
|
+
* Rate limit for the "matched NO rule" report — see `reportNoMatch`. Keyed by
|
|
21945
|
+
* {@link noMatchReportKey} (device + subject kind + class set), NOT by device:
|
|
21946
|
+
* a person's verdict must never consume the window a cat's verdict needed on
|
|
21947
|
+
* the same camera ([D390]).
|
|
21948
|
+
*/
|
|
21888
21949
|
lastNoMatchReportAt = /* @__PURE__ */ new Map();
|
|
21889
21950
|
noMatchSuppressed = /* @__PURE__ */ new Map();
|
|
21890
|
-
/** Same rate-limit pair for the per-camera mute drop — see `reportMutedDrop`. */
|
|
21951
|
+
/** Same rate-limit pair, same key, for the per-camera mute drop — see `reportMutedDrop`. */
|
|
21891
21952
|
lastMutedReportAt = /* @__PURE__ */ new Map();
|
|
21892
21953
|
mutedSuppressed = /* @__PURE__ */ new Map();
|
|
21893
21954
|
/**
|
|
@@ -24658,14 +24719,19 @@ var NotificationCenter = class NotificationCenter {
|
|
|
24658
24719
|
* is identical: "why did this camera not notify me?".
|
|
24659
24720
|
*/
|
|
24660
24721
|
reportMutedDrop(subject, kind, now) {
|
|
24661
|
-
const
|
|
24662
|
-
|
|
24722
|
+
const bucket = noMatchReportKey({
|
|
24723
|
+
deviceId: subject.deviceId,
|
|
24724
|
+
kind,
|
|
24725
|
+
classNames: subject.classNames
|
|
24726
|
+
});
|
|
24727
|
+
const last = this.lastMutedReportAt.get(bucket) ?? 0;
|
|
24728
|
+
const suppressed = this.mutedSuppressed.get(bucket) ?? 0;
|
|
24663
24729
|
if (now - last < NO_MATCH_REPORT_INTERVAL_MS) {
|
|
24664
|
-
this.mutedSuppressed.set(
|
|
24730
|
+
this.mutedSuppressed.set(bucket, suppressed + 1);
|
|
24665
24731
|
return;
|
|
24666
24732
|
}
|
|
24667
|
-
this.lastMutedReportAt.set(
|
|
24668
|
-
this.mutedSuppressed.set(
|
|
24733
|
+
this.lastMutedReportAt.set(bucket, now);
|
|
24734
|
+
this.mutedSuppressed.set(bucket, 0);
|
|
24669
24735
|
this.logger.info("notifications muted for this camera — event dropped before rule evaluation", {
|
|
24670
24736
|
tags: { deviceId: subject.deviceId },
|
|
24671
24737
|
meta: {
|
|
@@ -24677,16 +24743,23 @@ var NotificationCenter = class NotificationCenter {
|
|
|
24677
24743
|
}
|
|
24678
24744
|
});
|
|
24679
24745
|
}
|
|
24680
|
-
/** See the call site. Bounded to one line per
|
|
24746
|
+
/** See the call site. Bounded to one line per {@link noMatchReportKey} bucket
|
|
24747
|
+
* per window — device, subject kind and class set, so one subject's verdict
|
|
24748
|
+
* cannot stand in for another's on the same camera ([D390]). */
|
|
24681
24749
|
reportNoMatch(subject, kind, rejections, now) {
|
|
24682
|
-
const
|
|
24683
|
-
|
|
24750
|
+
const bucket = noMatchReportKey({
|
|
24751
|
+
deviceId: subject.deviceId,
|
|
24752
|
+
kind,
|
|
24753
|
+
classNames: subject.classNames
|
|
24754
|
+
});
|
|
24755
|
+
const last = this.lastNoMatchReportAt.get(bucket) ?? 0;
|
|
24756
|
+
const suppressed = this.noMatchSuppressed.get(bucket) ?? 0;
|
|
24684
24757
|
if (now - last < NO_MATCH_REPORT_INTERVAL_MS) {
|
|
24685
|
-
this.noMatchSuppressed.set(
|
|
24758
|
+
this.noMatchSuppressed.set(bucket, suppressed + 1);
|
|
24686
24759
|
return;
|
|
24687
24760
|
}
|
|
24688
|
-
this.lastNoMatchReportAt.set(
|
|
24689
|
-
this.noMatchSuppressed.set(
|
|
24761
|
+
this.lastNoMatchReportAt.set(bucket, now);
|
|
24762
|
+
this.noMatchSuppressed.set(bucket, 0);
|
|
24690
24763
|
this.logger.info("event matched NO rule", {
|
|
24691
24764
|
tags: { deviceId: subject.deviceId },
|
|
24692
24765
|
meta: {
|
|
@@ -28857,6 +28930,50 @@ var MediaStore = class {
|
|
|
28857
28930
|
return out;
|
|
28858
28931
|
}
|
|
28859
28932
|
/**
|
|
28933
|
+
* Bytes this store holds on each of the named storage locations (D388).
|
|
28934
|
+
*
|
|
28935
|
+
* One indexed aggregate per location (`idx_media_location`), plus one for the
|
|
28936
|
+
* legacy NULL-stamped rows — `locationId IS NULL` means "wherever the bare
|
|
28937
|
+
* `eventMedia` type ref resolves", and the CALLER attributes those, because
|
|
28938
|
+
* resolving a bare type ref is the orchestrator's rule and not this store's.
|
|
28939
|
+
*
|
|
28940
|
+
* A location this store holds nothing on is OMITTED, never reported as zero:
|
|
28941
|
+
* the difference between "we hold nothing here" and "nobody asked" is the
|
|
28942
|
+
* whole point of the occupancy contract, and only the caller can tell which
|
|
28943
|
+
* it is. A read that fails THROWS rather than degrading to zeros — the same
|
|
28944
|
+
* rule `footprintByDevice` follows, for the same reason.
|
|
28945
|
+
*/
|
|
28946
|
+
async footprintByLocation(locationIds) {
|
|
28947
|
+
const byLocation = /* @__PURE__ */ new Map();
|
|
28948
|
+
for (const locationId of locationIds) {
|
|
28949
|
+
const agg = await this.store.aggregate.query({
|
|
28950
|
+
collection: MEDIA_COLLECTION,
|
|
28951
|
+
fields: [{
|
|
28952
|
+
as: "bytes",
|
|
28953
|
+
field: "sizeBytes",
|
|
28954
|
+
op: "sum"
|
|
28955
|
+
}],
|
|
28956
|
+
filter: { where: { locationId } }
|
|
28957
|
+
});
|
|
28958
|
+
const bytes = agg.values["bytes"] ?? 0;
|
|
28959
|
+
if (agg.count === 0 || bytes <= 0) continue;
|
|
28960
|
+
byLocation.set(locationId, bytes);
|
|
28961
|
+
}
|
|
28962
|
+
const legacy = await this.store.aggregate.query({
|
|
28963
|
+
collection: MEDIA_COLLECTION,
|
|
28964
|
+
fields: [{
|
|
28965
|
+
as: "bytes",
|
|
28966
|
+
field: "sizeBytes",
|
|
28967
|
+
op: "sum"
|
|
28968
|
+
}],
|
|
28969
|
+
filter: { where: { locationId: null } }
|
|
28970
|
+
});
|
|
28971
|
+
return {
|
|
28972
|
+
byLocation,
|
|
28973
|
+
legacyNullBytes: legacy.count === 0 ? 0 : legacy.values["bytes"] ?? 0
|
|
28974
|
+
};
|
|
28975
|
+
}
|
|
28976
|
+
/**
|
|
28860
28977
|
* The media footprint broken down by KIND — fleet-wide, or for one camera.
|
|
28861
28978
|
*
|
|
28862
28979
|
* `footprintByDevice` answers "how much is where"; this answers "how much is
|
|
@@ -42066,21 +42183,16 @@ async function wipeClassSubtrees(input) {
|
|
|
42066
42183
|
}
|
|
42067
42184
|
//#endregion
|
|
42068
42185
|
//#region src/pipeline-analytics/retention/location-discard-policy.ts
|
|
42069
|
-
/**
|
|
42070
|
-
* Server-side eligibility for discarding a frozen location's leftover
|
|
42071
|
-
* class subtree. Same rules as the admin-ui card: frozen, known class,
|
|
42072
|
-
* writable sibling of the same type. The last writable of a type is
|
|
42073
|
-
* refused here even if the UI is bypassed.
|
|
42074
|
-
*/
|
|
42075
42186
|
var DISCARD_SUBTREES = {
|
|
42076
42187
|
eventMedia: ["events"],
|
|
42077
42188
|
recordingsLow: ["low"],
|
|
42078
42189
|
recordings: ["high", "mid"]
|
|
42079
42190
|
};
|
|
42191
|
+
/** Frozen = the system will not remove this footage on its own: eviction
|
|
42192
|
+
* policy `never` (D385), i.e. `readonly` or `disabled`. A `drain` location is
|
|
42193
|
+
* NOT frozen — the ratchet is already removing it. */
|
|
42080
42194
|
function locationIsFrozen(location) {
|
|
42081
|
-
|
|
42082
|
-
const readOnly = location.config["readOnly"] === true;
|
|
42083
|
-
return !enabled || readOnly;
|
|
42195
|
+
return evictionPolicyOfLocation(location) === "never";
|
|
42084
42196
|
}
|
|
42085
42197
|
function discardEligible(location, siblings) {
|
|
42086
42198
|
if (!(location.type in DISCARD_SUBTREES)) return false;
|
|
@@ -42088,9 +42200,7 @@ function discardEligible(location, siblings) {
|
|
|
42088
42200
|
return siblings.some((s) => {
|
|
42089
42201
|
if (s.id === location.id) return false;
|
|
42090
42202
|
if (s.type !== location.type) return false;
|
|
42091
|
-
|
|
42092
|
-
const readOnly = s.config["readOnly"] === true;
|
|
42093
|
-
return enabled && !readOnly;
|
|
42203
|
+
return mayWriteToLocation(s);
|
|
42094
42204
|
});
|
|
42095
42205
|
}
|
|
42096
42206
|
function assertDiscardAllowed(location, all, localNodeId) {
|
|
@@ -50719,7 +50829,10 @@ var MediaCaptureLogAggregator = class {
|
|
|
50719
50829
|
* a restart that switches disk splits nothing that reads wrong.
|
|
50720
50830
|
*/
|
|
50721
50831
|
function pickWritableMediaLocation(locations, stickyId) {
|
|
50722
|
-
const writable = locations.filter((l) =>
|
|
50832
|
+
const writable = locations.filter((l) => mayWriteToLocation({
|
|
50833
|
+
mode: l.mode,
|
|
50834
|
+
config: {}
|
|
50835
|
+
}));
|
|
50723
50836
|
if (writable.length === 0) return null;
|
|
50724
50837
|
const keep = stickyId === void 0 ? void 0 : writable.find((l) => l.id === stickyId);
|
|
50725
50838
|
if (keep) return keep.id;
|
|
@@ -68729,9 +68842,9 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends BaseAddon {
|
|
|
68729
68842
|
}
|
|
68730
68843
|
/**
|
|
68731
68844
|
* Resolves which `eventMedia` location a NEW footage-class blob should be
|
|
68732
|
-
* written to (`MediaStoreDeps.resolveEventMediaLocation`). Reflects
|
|
68733
|
-
* `
|
|
68734
|
-
*
|
|
68845
|
+
* written to (`MediaStoreDeps.resolveEventMediaLocation`). Reflects the
|
|
68846
|
+
* location's `mode` (D385) — a location the operator has taken out of the
|
|
68847
|
+
* write set never receives new blobs (the relocate mover, exposed as
|
|
68735
68848
|
* `relocateMedia`, empties what is already on it in the background).
|
|
68736
68849
|
*
|
|
68737
68850
|
* Cached after the first successful resolution — this is a per-blob write
|
|
@@ -68746,6 +68859,32 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends BaseAddon {
|
|
|
68746
68859
|
* a test harness that never wires `api.storage`) must not turn every media
|
|
68747
68860
|
* write into a hard failure the way "no writable location" does.
|
|
68748
68861
|
*/
|
|
68862
|
+
/**
|
|
68863
|
+
* The `storage-occupancy` answer for event media (D388) — bytes HELD on each
|
|
68864
|
+
* named location, not bytes retention would be willing to remove.
|
|
68865
|
+
*
|
|
68866
|
+
* Answered from ONE indexed aggregate per location. A store that is not up
|
|
68867
|
+
* yet reports NOTHING, which reads as unknown; it never reports zeros, which
|
|
68868
|
+
* would claim the disks are empty. Legacy NULL-stamped rows are attributed by
|
|
68869
|
+
* `mediaOccupancyReports`, and bytes it cannot place are LOGGED rather than
|
|
68870
|
+
* spread over the candidates — a number no disk agrees with is worse than an
|
|
68871
|
+
* absent one.
|
|
68872
|
+
*/
|
|
68873
|
+
async mediaOccupancy(locationIds) {
|
|
68874
|
+
const store = this.mediaStore;
|
|
68875
|
+
if (!store) return [];
|
|
68876
|
+
const { reports, unattributedBytes } = mediaOccupancyReports(await store.footprintByLocation(locationIds), locationIds, Date.now());
|
|
68877
|
+
if (unattributedBytes > 0 && !this.mediaOccupancyUnattributedLogged) {
|
|
68878
|
+
this.mediaOccupancyUnattributedLogged = true;
|
|
68879
|
+
this.ctx.logger.warn("pipeline-analytics: event-media bytes could not be attributed to a location — the legacy `eventMedia` type ref resolves to no single location, so they are reported NOWHERE rather than onto a disk that does not hold them", { meta: {
|
|
68880
|
+
unattributedBytes,
|
|
68881
|
+
locationIds: [...locationIds]
|
|
68882
|
+
} });
|
|
68883
|
+
}
|
|
68884
|
+
return reports;
|
|
68885
|
+
}
|
|
68886
|
+
/** One line per process: this repeats on every occupancy refresh otherwise. */
|
|
68887
|
+
mediaOccupancyUnattributedLogged = false;
|
|
68749
68888
|
async resolveEventMediaWriteLocation(api, logger, deviceId) {
|
|
68750
68889
|
const cached = this.eventMediaWriteLocationCache;
|
|
68751
68890
|
if (cached !== null) return cached;
|
|
@@ -68759,8 +68898,7 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends BaseAddon {
|
|
|
68759
68898
|
}
|
|
68760
68899
|
const picked = pickWritableMediaLocation(locations.map((l) => ({
|
|
68761
68900
|
id: l.id,
|
|
68762
|
-
|
|
68763
|
-
enabled: l.enabled !== false,
|
|
68901
|
+
mode: resolveLocationMode(l),
|
|
68764
68902
|
headroomBytes: l.capacity?.availableBytes ?? 0
|
|
68765
68903
|
})), this.lastEventMediaWritePick ?? void 0);
|
|
68766
68904
|
if (picked === null) {
|
|
@@ -70717,6 +70855,10 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends BaseAddon {
|
|
|
70717
70855
|
capability: notificationRulesCapability,
|
|
70718
70856
|
provider: this.notificationCenter.buildProvider()
|
|
70719
70857
|
}] : [],
|
|
70858
|
+
{
|
|
70859
|
+
capability: storageOccupancyCapability,
|
|
70860
|
+
provider: { getOccupancy: async (input) => this.mediaOccupancy(input.locationIds) }
|
|
70861
|
+
},
|
|
70720
70862
|
{
|
|
70721
70863
|
capability: zoneAnalyticsCapability,
|
|
70722
70864
|
provider: providers.zoneAnalytics
|
|
@@ -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-CTKbm1Jm.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.199",
|
|
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",
|
|
@@ -101,6 +101,10 @@
|
|
|
101
101
|
},
|
|
102
102
|
{
|
|
103
103
|
"name": "failure-contribution"
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"name": "storage-occupancy",
|
|
107
|
+
"optional": true
|
|
104
108
|
}
|
|
105
109
|
],
|
|
106
110
|
"storageLocations": [
|