@camstack/addon-pipeline 1.2.276 → 1.2.282
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/audio-analyzer/index.js +2 -2
- package/dist/audio-analyzer/index.mjs +2 -2
- package/dist/{default-detection-model-6lCvep7n.js → default-detection-model-CKdfniKn.js} +1 -1
- package/dist/{default-detection-model-dQSwHHfx.mjs → default-detection-model-i-0An9uD.mjs} +1 -1
- package/dist/detection-pipeline/index.js +4 -4
- package/dist/detection-pipeline/index.mjs +4 -4
- package/dist/{dist-C1pCVJk7.mjs → dist-BVWT6DUX.mjs} +660 -1
- package/dist/{dist-NYjn7hkE.js → dist-CB1sRktk.js} +660 -1
- package/dist/motion-wasm/index.js +1 -1
- package/dist/motion-wasm/index.mjs +1 -1
- package/dist/{node-CVYY8a4y.js → node-DZw6MNVd.js} +1 -1
- package/dist/{node--UY0iepi.mjs → node-Dj1cgkd_.mjs} +1 -1
- package/dist/pipeline-runner/index.js +3 -3
- package/dist/pipeline-runner/index.mjs +3 -3
- package/dist/{process-memory-BQOfL3Ig.mjs → process-memory-C0OIYwit.mjs} +1 -1
- package/dist/{process-memory-DDvuSEMJ.js → process-memory-Cgxk_eAO.js} +1 -1
- package/dist/recorder/index.js +55 -10
- package/dist/recorder/index.mjs +55 -10
- package/dist/{segment-demux-js-B0_aAzN0.mjs → segment-demux-js-B6OsKCIg.mjs} +1 -1
- package/dist/{segment-demux-js-DVupBBc4.js → segment-demux-js-DNN3T56h.js} +1 -1
- package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-D0A4Ra4h.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-C1dCLSas.mjs} +1 -1
- package/dist/stream-broker/demux-worker-child.js +1 -1
- package/dist/stream-broker/demux-worker-child.mjs +1 -1
- package/dist/stream-broker/{hostInit-C8TnCvWj.mjs → hostInit-BNFyaEr_.mjs} +1 -1
- package/dist/stream-broker/index.js +26 -6
- package/dist/stream-broker/index.mjs +26 -6
- package/dist/stream-broker/remoteEntry.js +1 -1
- package/package.json +1 -1
|
@@ -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-
|
|
5
|
+
const require_dist = require("../dist-CB1sRktk.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 { Qt as BaseAddon, cn as hydrateSchema, nn as DeviceType, tt as evaluateZoneRules, vt as motionDetectionCapability } from "../dist-
|
|
1
|
+
import { Qt as BaseAddon, cn as hydrateSchema, nn as DeviceType, tt as evaluateZoneRules, vt as motionDetectionCapability } from "../dist-BVWT6DUX.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-
|
|
2
|
+
const require_dist = require("./dist-CB1sRktk.js");
|
|
3
3
|
let node_crypto = require("node:crypto");
|
|
4
4
|
let node_fs = require("node:fs");
|
|
5
5
|
node_fs = require_chunk.__toESM(node_fs, 1);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Gt as errMsg, Jt as buildFfmpegArgs, Xt as isSoftwareDecode, qt as Fmp4BoxSplitter } from "./dist-
|
|
1
|
+
import { Gt as errMsg, Jt as buildFfmpegArgs, Xt as isSoftwareDecode, qt as Fmp4BoxSplitter } from "./dist-BVWT6DUX.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-
|
|
7
|
-
const require_node = require("../node-
|
|
8
|
-
const require_default_detection_model = require("../default-detection-model-
|
|
6
|
+
const require_dist = require("../dist-CB1sRktk.js");
|
|
7
|
+
const require_node = require("../node-DZw6MNVd.js");
|
|
8
|
+
const require_default_detection_model = require("../default-detection-model-CKdfniKn.js");
|
|
9
9
|
const require_worker_protocol = require("../worker-protocol-B2MfQLlu.js");
|
|
10
10
|
const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
|
|
11
11
|
const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { C as NativeLeaseAdmissionSchema, Cn as number, Ct as pickDetailCropConvention, Dn as string, Et as pipelineRunnerCapability, Gt as errMsg, J as deriveDetailCropRect, Qt as BaseAddon, S as MOTION_CLOSE_AFTER_MS, Sn as literal, _n as _enum, an as customAction, at as failureContributionCapability, fn as nodePin, in as createEvent, kn as EventCategory, m as DEVICE_BACKEND_TO_FORMAT, on as defineCustomActions, p as DEFAULT_NATIVE_LEASE_SETTINGS, u as DEFAULT_DETAIL_CROP_CONVENTION, ut as loadContributionCapability, vn as array, w as NativeLeaseSettingsSchema, wn as object, wt as pickNativeLeaseOverride, xn as lazy, y as FailureCounters, yn as boolean } from "../dist-
|
|
2
|
-
import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node
|
|
3
|
-
import { a as localFrameRegistry, d as getStepDefinition, i as rootObjectGate, o as resolveFrameViewGeometry, r as macroGateVerdict } from "../default-detection-model-
|
|
1
|
+
import { C as NativeLeaseAdmissionSchema, Cn as number, Ct as pickDetailCropConvention, Dn as string, Et as pipelineRunnerCapability, Gt as errMsg, J as deriveDetailCropRect, Qt as BaseAddon, S as MOTION_CLOSE_AFTER_MS, Sn as literal, _n as _enum, an as customAction, at as failureContributionCapability, fn as nodePin, in as createEvent, kn as EventCategory, m as DEVICE_BACKEND_TO_FORMAT, on as defineCustomActions, p as DEFAULT_NATIVE_LEASE_SETTINGS, u as DEFAULT_DETAIL_CROP_CONVENTION, ut as loadContributionCapability, vn as array, w as NativeLeaseSettingsSchema, wn as object, wt as pickNativeLeaseOverride, xn as lazy, y as FailureCounters, yn as boolean } from "../dist-BVWT6DUX.mjs";
|
|
2
|
+
import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-Dj1cgkd_.mjs";
|
|
3
|
+
import { a as localFrameRegistry, d as getStepDefinition, i as rootObjectGate, o as resolveFrameViewGeometry, r as macroGateVerdict } from "../default-detection-model-i-0An9uD.mjs";
|
|
4
4
|
import { t as isWorkerReply } from "../worker-protocol-C_W-P_g-.mjs";
|
|
5
5
|
import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
|
|
6
6
|
import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const require_chunk = require("./chunk-emK7D4bc.js");
|
|
2
|
-
const require_dist = require("./dist-
|
|
2
|
+
const require_dist = require("./dist-CB1sRktk.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");
|
package/dist/recorder/index.js
CHANGED
|
@@ -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-
|
|
7
|
-
const require_node = require("../node-
|
|
6
|
+
const require_dist = require("../dist-CB1sRktk.js");
|
|
7
|
+
const require_node = require("../node-DZw6MNVd.js");
|
|
8
8
|
const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
|
|
9
9
|
const require_restream_intent = require("../restream-intent-7uDNqMKs.js");
|
|
10
10
|
const require_retire_root_keys = require("../retire-root-keys-Csb8z2f3.js");
|
|
@@ -6371,6 +6371,7 @@ var ExportEngine = class {
|
|
|
6371
6371
|
answer = await fetchClipBytes({
|
|
6372
6372
|
deviceId: subject.deviceId,
|
|
6373
6373
|
clipId: subject.clipId,
|
|
6374
|
+
provider: subject.provider,
|
|
6374
6375
|
profile: subject.profile,
|
|
6375
6376
|
maxBytes: require_dist.RECORDING_EXPORT_MAX_READ_BYTES,
|
|
6376
6377
|
...subject.wake !== void 0 ? { wake: subject.wake } : {}
|
|
@@ -13763,6 +13764,35 @@ var PlacementService = class {
|
|
|
13763
13764
|
});
|
|
13764
13765
|
}
|
|
13765
13766
|
};
|
|
13767
|
+
/** How long each kind stays quiet after it has been listed. Absent = no bound. */
|
|
13768
|
+
var QUIET_BY_KIND = {
|
|
13769
|
+
audio: 5 * 6e4,
|
|
13770
|
+
motion: 2 * 6e4
|
|
13771
|
+
};
|
|
13772
|
+
/**
|
|
13773
|
+
* Thin a run of same-kind rows to one per cooldown.
|
|
13774
|
+
*
|
|
13775
|
+
* The DECISION is made oldest-first, because a cooldown read off an unsorted
|
|
13776
|
+
* list keeps an arbitrary subset. The ANSWER keeps the caller's own order:
|
|
13777
|
+
* this provider lists newest-first, and quietly reversing it here would have
|
|
13778
|
+
* turned a density filter into a reordering — caught by the spec that pins
|
|
13779
|
+
* `clips[0].kind`, which is the only reason it is not shipping.
|
|
13780
|
+
*/
|
|
13781
|
+
function applyQuietKinds(clips) {
|
|
13782
|
+
const lastEmitted = /* @__PURE__ */ new Map();
|
|
13783
|
+
const dropped = /* @__PURE__ */ new Set();
|
|
13784
|
+
for (const clip of [...clips].toSorted((a, b) => a.timeRange.startMs - b.timeRange.startMs)) {
|
|
13785
|
+
const quietMs = QUIET_BY_KIND[clip.kind];
|
|
13786
|
+
if (quietMs === void 0) continue;
|
|
13787
|
+
const previous = lastEmitted.get(clip.kind);
|
|
13788
|
+
if (previous !== void 0 && clip.timeRange.startMs - previous < quietMs) {
|
|
13789
|
+
dropped.add(clip.id);
|
|
13790
|
+
continue;
|
|
13791
|
+
}
|
|
13792
|
+
lastEmitted.set(clip.kind, clip.timeRange.startMs);
|
|
13793
|
+
}
|
|
13794
|
+
return clips.filter((clip) => !dropped.has(clip.id));
|
|
13795
|
+
}
|
|
13766
13796
|
//#endregion
|
|
13767
13797
|
//#region src/recorder/addon/videoclip-visits.ts
|
|
13768
13798
|
/**
|
|
@@ -13811,10 +13841,22 @@ function clusterFootageVisits(ranges, gapMs = require_dist.VISIT_MERGE_GAP_MS) {
|
|
|
13811
13841
|
* so the visit became the recording session.
|
|
13812
13842
|
*
|
|
13813
13843
|
* Measured on 592, 2026-09-21, 24 h: seven rows covering the whole day, one of
|
|
13814
|
-
* them 7 h 58 m.
|
|
13815
|
-
*
|
|
13816
|
-
*
|
|
13817
|
-
*
|
|
13844
|
+
* them 7 h 58 m.
|
|
13845
|
+
*
|
|
13846
|
+
* ## And the grain is the PADDING, not a constant
|
|
13847
|
+
*
|
|
13848
|
+
* `VISIT_MERGE_GAP_MS` (30 s) was arbitrary here and sat on a cliff. 592's
|
|
13849
|
+
* worst hour holds 492 events — 150 object, 98 motion, **244 audio** — whose
|
|
13850
|
+
* LARGEST gap is 25 s, so nothing ever reached 30 and the hour was one row.
|
|
13851
|
+
* Measured on that hour:
|
|
13852
|
+
*
|
|
13853
|
+
* | rule | clips | longest |
|
|
13854
|
+
* | --- | --- | --- |
|
|
13855
|
+
* | 30 s | 1 | 66 min |
|
|
13856
|
+
* | `preMs + postMs` (15 s) | 105 | 3.5 min |
|
|
13857
|
+
*
|
|
13858
|
+
* So two clips merge exactly when they would otherwise OVERLAP. Nothing to
|
|
13859
|
+
* tune, nothing to disagree with the pad.
|
|
13818
13860
|
*
|
|
13819
13861
|
* ## What the footage is still for
|
|
13820
13862
|
*
|
|
@@ -13825,7 +13867,8 @@ function clusterFootageVisits(ranges, gapMs = require_dist.VISIT_MERGE_GAP_MS) {
|
|
|
13825
13867
|
* recorder never kept is not a clip, and listing it is a row that opens onto
|
|
13826
13868
|
* nothing.
|
|
13827
13869
|
*/
|
|
13828
|
-
function clusterEventVisits(events, ranges,
|
|
13870
|
+
function clusterEventVisits(events, ranges, pad) {
|
|
13871
|
+
const gapMs = pad.preMs + pad.postMs;
|
|
13829
13872
|
if (events.length === 0 || ranges.length === 0) return [];
|
|
13830
13873
|
const times = [...events].map((e) => e.timestamp).toSorted((a, b) => a - b);
|
|
13831
13874
|
const sortedRanges = [...ranges].toSorted((a, b) => a.startMs - b.startMs);
|
|
@@ -14111,7 +14154,7 @@ function intersectsWindow(clip, since, until) {
|
|
|
14111
14154
|
* scan on an indexed column buys a list that stops changing under the cursor.
|
|
14112
14155
|
*/
|
|
14113
14156
|
function leftOverhangMs(pad) {
|
|
14114
|
-
return
|
|
14157
|
+
return pad.preMs + pad.postMs + pad.preMs;
|
|
14115
14158
|
}
|
|
14116
14159
|
/** No events at all — what the degraded branch annotates its visits with. */
|
|
14117
14160
|
var NO_EVENTS = {
|
|
@@ -14171,14 +14214,14 @@ function createVideoclipsProvider(deps) {
|
|
|
14171
14214
|
since: readSince,
|
|
14172
14215
|
until
|
|
14173
14216
|
});
|
|
14174
|
-
clips = visitsToClips(clusterEventVisits(allEvents(events), ranges,
|
|
14217
|
+
clips = visitsToClips(clusterEventVisits(allEvents(events), ranges, deps.defaultPad), events, deps.defaultPad, vouched);
|
|
14175
14218
|
} catch (err) {
|
|
14176
14219
|
deps.logWarn?.("videoclips: availability read failed — listing unfiltered", {
|
|
14177
14220
|
deviceId,
|
|
14178
14221
|
error: err instanceof Error ? err.message : String(err)
|
|
14179
14222
|
});
|
|
14180
14223
|
}
|
|
14181
|
-
const inWindow = clips.filter((c) => intersectsWindow(c, since, until));
|
|
14224
|
+
const inWindow = applyQuietKinds(clips).filter((c) => intersectsWindow(c, since, until));
|
|
14182
14225
|
const answer = limit != null ? inWindow.slice(0, limit) : inWindow;
|
|
14183
14226
|
reportUnvouchedClips(deps, deviceId, answer);
|
|
14184
14227
|
return answer;
|
|
@@ -19652,6 +19695,8 @@ var RecorderV2Addon = class extends require_dist.BaseAddon {
|
|
|
19652
19695
|
fetchClipBytes: async (req) => await this.ctx.api.videoclips.readClipBytes.query({
|
|
19653
19696
|
deviceId: req.deviceId,
|
|
19654
19697
|
clipId: req.clipId,
|
|
19698
|
+
provider: req.provider,
|
|
19699
|
+
addonId: req.provider,
|
|
19655
19700
|
profile: req.profile,
|
|
19656
19701
|
maxBytes: req.maxBytes,
|
|
19657
19702
|
...req.wake !== void 0 ? { wake: req.wake } : {}
|
package/dist/recorder/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { A as RecordingConfigSchema, At as recordingSignalCapability, Cn as number, Dn as string, En as record, Gt as errMsg, H as clipExportFailureOf, It as resolveRecordingProfiles, Mt as resolveCreateExportSubject, N as VISIT_MERGE_GAP_MS, Ot as recordingCapability, Pt as resolveLocationMode, Qt as BaseAddon, Rt as storageEvictableCapability, T as OpsLogEntrySchema, Tn as preprocess, Ut as videoclipsCapability, V as clipExportFailure, Vt as stripRetiredBandPreBufferSec, Y as deriveRecordingMode, _n as _enum, _t as modeMayWrite, an as customAction, cn as hydrateSchema, d as DEFAULT_EVENTS_BAND_BUFFER_SEC, et as evaluateSensorEdge, fn as nodePin, g as EVENT_PAD_MS, gn as sleep$1, gt as migrateLegacyDeviceSignalConfig, h as EVENT_OWNER_TYPES, hn as selectAssignedProfileSlots, ht as mayWriteToLocation, i as BatteryStatusSchema, it as exportSubjectOf, j as RecordingSignalStatusSchema, k as RECORDING_EXPORT_MAX_READ_BYTES, kn as EventCategory, kt as recordingExportCapability, lt as isFirstLevelMacroClass, mt as mayReadLocation, nn as DeviceType, nt as evictionPolicyForMode, on as defineCustomActions, ot as gbToBytes, q as deriveBatteryPresence, rt as evictionPolicyOfLocation, tn as DeviceFeature, ut as loadContributionCapability, v as ExportRecordSchema, vn as array, wn as object, yn as boolean, z as batteryCapability, zt as storageOccupancyCapability } from "../dist-
|
|
2
|
-
import { a as physicalRootOf, i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node
|
|
1
|
+
import { A as RecordingConfigSchema, At as recordingSignalCapability, Cn as number, Dn as string, En as record, Gt as errMsg, H as clipExportFailureOf, It as resolveRecordingProfiles, Mt as resolveCreateExportSubject, N as VISIT_MERGE_GAP_MS, Ot as recordingCapability, Pt as resolveLocationMode, Qt as BaseAddon, Rt as storageEvictableCapability, T as OpsLogEntrySchema, Tn as preprocess, Ut as videoclipsCapability, V as clipExportFailure, Vt as stripRetiredBandPreBufferSec, Y as deriveRecordingMode, _n as _enum, _t as modeMayWrite, an as customAction, cn as hydrateSchema, d as DEFAULT_EVENTS_BAND_BUFFER_SEC, et as evaluateSensorEdge, fn as nodePin, g as EVENT_PAD_MS, gn as sleep$1, gt as migrateLegacyDeviceSignalConfig, h as EVENT_OWNER_TYPES, hn as selectAssignedProfileSlots, ht as mayWriteToLocation, i as BatteryStatusSchema, it as exportSubjectOf, j as RecordingSignalStatusSchema, k as RECORDING_EXPORT_MAX_READ_BYTES, kn as EventCategory, kt as recordingExportCapability, lt as isFirstLevelMacroClass, mt as mayReadLocation, nn as DeviceType, nt as evictionPolicyForMode, on as defineCustomActions, ot as gbToBytes, q as deriveBatteryPresence, rt as evictionPolicyOfLocation, tn as DeviceFeature, ut as loadContributionCapability, v as ExportRecordSchema, vn as array, wn as object, yn as boolean, z as batteryCapability, zt as storageOccupancyCapability } from "../dist-BVWT6DUX.mjs";
|
|
2
|
+
import { a as physicalRootOf, i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-Dj1cgkd_.mjs";
|
|
3
3
|
import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
|
|
4
4
|
import { d as PREBUFFER_MAX_MS, l as withRecordingIntent, r as RECORDING_PRE_ROLL_REQUEST_MS } from "../restream-intent-DyGmLAU9.mjs";
|
|
5
5
|
import { n as RowMapStore, t as retireRootKeys } from "../retire-root-keys-DZvlso2l.mjs";
|
|
@@ -6364,6 +6364,7 @@ var ExportEngine = class {
|
|
|
6364
6364
|
answer = await fetchClipBytes({
|
|
6365
6365
|
deviceId: subject.deviceId,
|
|
6366
6366
|
clipId: subject.clipId,
|
|
6367
|
+
provider: subject.provider,
|
|
6367
6368
|
profile: subject.profile,
|
|
6368
6369
|
maxBytes: RECORDING_EXPORT_MAX_READ_BYTES,
|
|
6369
6370
|
...subject.wake !== void 0 ? { wake: subject.wake } : {}
|
|
@@ -13756,6 +13757,35 @@ var PlacementService = class {
|
|
|
13756
13757
|
});
|
|
13757
13758
|
}
|
|
13758
13759
|
};
|
|
13760
|
+
/** How long each kind stays quiet after it has been listed. Absent = no bound. */
|
|
13761
|
+
var QUIET_BY_KIND = {
|
|
13762
|
+
audio: 5 * 6e4,
|
|
13763
|
+
motion: 2 * 6e4
|
|
13764
|
+
};
|
|
13765
|
+
/**
|
|
13766
|
+
* Thin a run of same-kind rows to one per cooldown.
|
|
13767
|
+
*
|
|
13768
|
+
* The DECISION is made oldest-first, because a cooldown read off an unsorted
|
|
13769
|
+
* list keeps an arbitrary subset. The ANSWER keeps the caller's own order:
|
|
13770
|
+
* this provider lists newest-first, and quietly reversing it here would have
|
|
13771
|
+
* turned a density filter into a reordering — caught by the spec that pins
|
|
13772
|
+
* `clips[0].kind`, which is the only reason it is not shipping.
|
|
13773
|
+
*/
|
|
13774
|
+
function applyQuietKinds(clips) {
|
|
13775
|
+
const lastEmitted = /* @__PURE__ */ new Map();
|
|
13776
|
+
const dropped = /* @__PURE__ */ new Set();
|
|
13777
|
+
for (const clip of [...clips].toSorted((a, b) => a.timeRange.startMs - b.timeRange.startMs)) {
|
|
13778
|
+
const quietMs = QUIET_BY_KIND[clip.kind];
|
|
13779
|
+
if (quietMs === void 0) continue;
|
|
13780
|
+
const previous = lastEmitted.get(clip.kind);
|
|
13781
|
+
if (previous !== void 0 && clip.timeRange.startMs - previous < quietMs) {
|
|
13782
|
+
dropped.add(clip.id);
|
|
13783
|
+
continue;
|
|
13784
|
+
}
|
|
13785
|
+
lastEmitted.set(clip.kind, clip.timeRange.startMs);
|
|
13786
|
+
}
|
|
13787
|
+
return clips.filter((clip) => !dropped.has(clip.id));
|
|
13788
|
+
}
|
|
13759
13789
|
//#endregion
|
|
13760
13790
|
//#region src/recorder/addon/videoclip-visits.ts
|
|
13761
13791
|
/**
|
|
@@ -13804,10 +13834,22 @@ function clusterFootageVisits(ranges, gapMs = VISIT_MERGE_GAP_MS) {
|
|
|
13804
13834
|
* so the visit became the recording session.
|
|
13805
13835
|
*
|
|
13806
13836
|
* Measured on 592, 2026-09-21, 24 h: seven rows covering the whole day, one of
|
|
13807
|
-
* them 7 h 58 m.
|
|
13808
|
-
*
|
|
13809
|
-
*
|
|
13810
|
-
*
|
|
13837
|
+
* them 7 h 58 m.
|
|
13838
|
+
*
|
|
13839
|
+
* ## And the grain is the PADDING, not a constant
|
|
13840
|
+
*
|
|
13841
|
+
* `VISIT_MERGE_GAP_MS` (30 s) was arbitrary here and sat on a cliff. 592's
|
|
13842
|
+
* worst hour holds 492 events — 150 object, 98 motion, **244 audio** — whose
|
|
13843
|
+
* LARGEST gap is 25 s, so nothing ever reached 30 and the hour was one row.
|
|
13844
|
+
* Measured on that hour:
|
|
13845
|
+
*
|
|
13846
|
+
* | rule | clips | longest |
|
|
13847
|
+
* | --- | --- | --- |
|
|
13848
|
+
* | 30 s | 1 | 66 min |
|
|
13849
|
+
* | `preMs + postMs` (15 s) | 105 | 3.5 min |
|
|
13850
|
+
*
|
|
13851
|
+
* So two clips merge exactly when they would otherwise OVERLAP. Nothing to
|
|
13852
|
+
* tune, nothing to disagree with the pad.
|
|
13811
13853
|
*
|
|
13812
13854
|
* ## What the footage is still for
|
|
13813
13855
|
*
|
|
@@ -13818,7 +13860,8 @@ function clusterFootageVisits(ranges, gapMs = VISIT_MERGE_GAP_MS) {
|
|
|
13818
13860
|
* recorder never kept is not a clip, and listing it is a row that opens onto
|
|
13819
13861
|
* nothing.
|
|
13820
13862
|
*/
|
|
13821
|
-
function clusterEventVisits(events, ranges,
|
|
13863
|
+
function clusterEventVisits(events, ranges, pad) {
|
|
13864
|
+
const gapMs = pad.preMs + pad.postMs;
|
|
13822
13865
|
if (events.length === 0 || ranges.length === 0) return [];
|
|
13823
13866
|
const times = [...events].map((e) => e.timestamp).toSorted((a, b) => a - b);
|
|
13824
13867
|
const sortedRanges = [...ranges].toSorted((a, b) => a.startMs - b.startMs);
|
|
@@ -14104,7 +14147,7 @@ function intersectsWindow(clip, since, until) {
|
|
|
14104
14147
|
* scan on an indexed column buys a list that stops changing under the cursor.
|
|
14105
14148
|
*/
|
|
14106
14149
|
function leftOverhangMs(pad) {
|
|
14107
|
-
return
|
|
14150
|
+
return pad.preMs + pad.postMs + pad.preMs;
|
|
14108
14151
|
}
|
|
14109
14152
|
/** No events at all — what the degraded branch annotates its visits with. */
|
|
14110
14153
|
var NO_EVENTS = {
|
|
@@ -14164,14 +14207,14 @@ function createVideoclipsProvider(deps) {
|
|
|
14164
14207
|
since: readSince,
|
|
14165
14208
|
until
|
|
14166
14209
|
});
|
|
14167
|
-
clips = visitsToClips(clusterEventVisits(allEvents(events), ranges,
|
|
14210
|
+
clips = visitsToClips(clusterEventVisits(allEvents(events), ranges, deps.defaultPad), events, deps.defaultPad, vouched);
|
|
14168
14211
|
} catch (err) {
|
|
14169
14212
|
deps.logWarn?.("videoclips: availability read failed — listing unfiltered", {
|
|
14170
14213
|
deviceId,
|
|
14171
14214
|
error: err instanceof Error ? err.message : String(err)
|
|
14172
14215
|
});
|
|
14173
14216
|
}
|
|
14174
|
-
const inWindow = clips.filter((c) => intersectsWindow(c, since, until));
|
|
14217
|
+
const inWindow = applyQuietKinds(clips).filter((c) => intersectsWindow(c, since, until));
|
|
14175
14218
|
const answer = limit != null ? inWindow.slice(0, limit) : inWindow;
|
|
14176
14219
|
reportUnvouchedClips(deps, deviceId, answer);
|
|
14177
14220
|
return answer;
|
|
@@ -19645,6 +19688,8 @@ var RecorderV2Addon = class extends BaseAddon {
|
|
|
19645
19688
|
fetchClipBytes: async (req) => await this.ctx.api.videoclips.readClipBytes.query({
|
|
19646
19689
|
deviceId: req.deviceId,
|
|
19647
19690
|
clipId: req.clipId,
|
|
19691
|
+
provider: req.provider,
|
|
19692
|
+
addonId: req.provider,
|
|
19648
19693
|
profile: req.profile,
|
|
19649
19694
|
maxBytes: req.maxBytes,
|
|
19650
19695
|
...req.wake !== void 0 ? { wake: req.wake } : {}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as __toESM, t as __commonJSMin } from "./chunk-DnnnRqeS.mjs";
|
|
2
|
-
import { Gt as errMsg } from "./dist-
|
|
2
|
+
import { Gt as errMsg } from "./dist-BVWT6DUX.mjs";
|
|
3
3
|
import { spawn } from "node:child_process";
|
|
4
4
|
//#region ../../node_modules/mp4box/dist/mp4box.all.js
|
|
5
5
|
var require_mp4box_all = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const require_chunk = require("./chunk-emK7D4bc.js");
|
|
2
|
-
const require_dist = require("./dist-
|
|
2
|
+
const require_dist = require("./dist-CB1sRktk.js");
|
|
3
3
|
let node_child_process = require("node:child_process");
|
|
4
4
|
//#region ../../node_modules/mp4box/dist/mp4box.all.js
|
|
5
5
|
var require_mp4box_all = /* @__PURE__ */ require_chunk.__commonJSMin(((exports) => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_segment_demux_js = require("../segment-demux-js-
|
|
1
|
+
const require_segment_demux_js = require("../segment-demux-js-DNN3T56h.js");
|
|
2
2
|
let node_worker_threads = require("node:worker_threads");
|
|
3
3
|
//#region src/stream-broker/recorded/demux-worker-child.ts
|
|
4
4
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as demuxSegmentFullJs } from "../segment-demux-js-
|
|
1
|
+
import { t as demuxSegmentFullJs } from "../segment-demux-js-B6OsKCIg.mjs";
|
|
2
2
|
import { parentPort } from "node:worker_threads";
|
|
3
3
|
//#region src/stream-broker/recorded/demux-worker-child.ts
|
|
4
4
|
/**
|
|
@@ -3,12 +3,12 @@ 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-
|
|
7
|
-
const require_node = require("../node-
|
|
6
|
+
const require_dist = require("../dist-CB1sRktk.js");
|
|
7
|
+
const require_node = require("../node-DZw6MNVd.js");
|
|
8
8
|
const require_restream_intent = require("../restream-intent-7uDNqMKs.js");
|
|
9
9
|
const require_remote_restream = require("../remote-restream-CO36Sr30.js");
|
|
10
10
|
const require_retire_root_keys = require("../retire-root-keys-Csb8z2f3.js");
|
|
11
|
-
const require_segment_demux_js = require("../segment-demux-js-
|
|
11
|
+
const require_segment_demux_js = require("../segment-demux-js-DNN3T56h.js");
|
|
12
12
|
let node_os = require("node:os");
|
|
13
13
|
node_os = require_chunk.__toESM(node_os);
|
|
14
14
|
let node_crypto = require("node:crypto");
|
|
@@ -26574,6 +26574,20 @@ var ControlMessageSchema = require_dist.discriminatedUnion("t", [
|
|
|
26574
26574
|
t: require_dist.literal("playClip"),
|
|
26575
26575
|
deviceId: require_dist.number(),
|
|
26576
26576
|
clipId: require_dist.string().min(1),
|
|
26577
|
+
/**
|
|
26578
|
+
* WHICH provider holds the file — the `addonId` of the source row the clip
|
|
26579
|
+
* was listed from.
|
|
26580
|
+
*
|
|
26581
|
+
* It travels because nobody downstream can work it out. The broker lives
|
|
26582
|
+
* in `addon-pipeline`, the same addon that registers the RECORDER's
|
|
26583
|
+
* videoclips provider, so a `readClipBytes` with no provider named
|
|
26584
|
+
* resolved in-process to that sibling — which implements the method solely
|
|
26585
|
+
* to explain that an analytics visit has no file behind it. Every onboard
|
|
26586
|
+
* clip answered with that sentence: a flash, and nothing more (3628,
|
|
26587
|
+
* 2026-09-21). Deriving it from the clip id's shape was the other option
|
|
26588
|
+
* and is exactly what D482 forbids.
|
|
26589
|
+
*/
|
|
26590
|
+
provider: require_dist.string().min(1),
|
|
26577
26591
|
offsetMs: require_dist.number().min(0),
|
|
26578
26592
|
/**
|
|
26579
26593
|
* Which TWIN of the clip — the vendor's own quality pair, on the one
|
|
@@ -29939,7 +29953,7 @@ var TimelineSession = class {
|
|
|
29939
29953
|
await this.playAt(msg.epoch, msg.profile, { travelFromMs: this.lastPositionMs });
|
|
29940
29954
|
break;
|
|
29941
29955
|
case "playClip":
|
|
29942
|
-
await this.playClip(msg.deviceId, msg.clipId, msg.profile ?? null, msg.offsetMs);
|
|
29956
|
+
await this.playClip(msg.deviceId, msg.clipId, msg.provider, msg.profile ?? null, msg.offsetMs);
|
|
29943
29957
|
break;
|
|
29944
29958
|
case "seek":
|
|
29945
29959
|
if (this.clip) {
|
|
@@ -30021,11 +30035,12 @@ var TimelineSession = class {
|
|
|
30021
30035
|
* frame with no explanation (D391: the branch that accepts work and produces
|
|
30022
30036
|
* nothing is the same branch as the one that drops it).
|
|
30023
30037
|
*/
|
|
30024
|
-
async playClip(deviceId, clipId, profile, offsetMs) {
|
|
30038
|
+
async playClip(deviceId, clipId, provider, profile, offsetMs) {
|
|
30025
30039
|
if (!this.deps.makeClipFeeder) {
|
|
30026
30040
|
this.deps.onLog?.("clip playback: refused — no clip byte source wired on this session (videoclips.readClipBytes absent)", {
|
|
30027
30041
|
deviceId,
|
|
30028
30042
|
clipId,
|
|
30043
|
+
provider,
|
|
30029
30044
|
profile,
|
|
30030
30045
|
offsetMs
|
|
30031
30046
|
});
|
|
@@ -30035,6 +30050,7 @@ var TimelineSession = class {
|
|
|
30035
30050
|
this.clip = {
|
|
30036
30051
|
deviceId,
|
|
30037
30052
|
clipId,
|
|
30053
|
+
provider,
|
|
30038
30054
|
profile
|
|
30039
30055
|
};
|
|
30040
30056
|
this.lastPositionMs = null;
|
|
@@ -30421,7 +30437,7 @@ var ClipSourceError = class extends Error {
|
|
|
30421
30437
|
};
|
|
30422
30438
|
function createClipFileSource(deps) {
|
|
30423
30439
|
const maxBytes = deps.maxBytes ?? 67108864;
|
|
30424
|
-
const { deviceId, clipId, profile } = deps.handle;
|
|
30440
|
+
const { deviceId, clipId, provider, profile } = deps.handle;
|
|
30425
30441
|
let resolved = null;
|
|
30426
30442
|
let inFlight = null;
|
|
30427
30443
|
/**
|
|
@@ -30436,6 +30452,7 @@ function createClipFileSource(deps) {
|
|
|
30436
30452
|
deps.onLog?.(message, {
|
|
30437
30453
|
deviceId,
|
|
30438
30454
|
clipId,
|
|
30455
|
+
provider,
|
|
30439
30456
|
profile,
|
|
30440
30457
|
reason,
|
|
30441
30458
|
...data
|
|
@@ -30448,6 +30465,7 @@ function createClipFileSource(deps) {
|
|
|
30448
30465
|
bytes = await deps.read({
|
|
30449
30466
|
deviceId,
|
|
30450
30467
|
clipId,
|
|
30468
|
+
provider,
|
|
30451
30469
|
profile
|
|
30452
30470
|
});
|
|
30453
30471
|
} catch (err) {
|
|
@@ -33703,6 +33721,8 @@ var StreamBrokerAddon = class extends require_dist.BaseAddon {
|
|
|
33703
33721
|
const res = await this.ctx.api.videoclips.readClipBytes.query({
|
|
33704
33722
|
deviceId: args.deviceId,
|
|
33705
33723
|
clipId: args.clipId,
|
|
33724
|
+
provider: args.provider,
|
|
33725
|
+
addonId: args.provider,
|
|
33706
33726
|
...args.profile !== null ? { profile: args.profile } : {}
|
|
33707
33727
|
});
|
|
33708
33728
|
return new Uint8Array(Buffer.from(res.base64, "base64"));
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { r as __toESM } from "../chunk-DnnnRqeS.mjs";
|
|
2
|
-
import { $t as CAM_PROFILE_ORDER, B as cameraStreamsCapability, Bt as streamBrokerCapability, Cn as number, D as RATE_CONTROL_RELAXED, Dn as string, Dt as rankStreams, En as record, F as addonWidgetsSourceCapability, G as declareLogChannel, Gt as errMsg, Jt as buildFfmpegArgs$1, Kt as AUDIO_PRESETS, M as RingBuffer, Nt as resolveEgressDecodeHwAccel, O as RATE_CONTROL_TIGHT, On as union, Q as egressTransportFromRequest, Qt as BaseAddon, Sn as literal, U as createHwAccelCache, W as createLogChannelsProvider, Wt as webrtcSessionCapability, Xt as isSoftwareDecode, Yt as invocationFromEncodeProfile, Z as egressTranscodeSharingKey, Zt as BOOT_RECOVERY_BACKOFF_MS, _ as EncodeProfileSchema, _n as _enum, b as G711_SCALE_CORRECTION_DB, bn as discriminatedUnion, dn as makeSourceBrokerId, dt as logChannelsCapability, en as CamProfileSchema, fn as nodePin, i as BatteryStatusSchema, in as createEvent, kn as EventCategory, ln as isEvent, mn as parseProfileBrokerId, nn as DeviceType, pt as maskUrlCredentials, q as deriveBatteryPresence, sn as expandAudioChunkToF32le, tn as DeviceFeature, un as makeProfileBrokerId, ut as loadContributionCapability, vn as array, wn as object, yn as boolean, z as batteryCapability } from "../dist-
|
|
3
|
-
import { i as NO_COST_CLAIM, n as Fmp4FragmentChild, o as probeFfmpegBinary, r as Fmp4FragmentPlane, t as ChildCostRegistry } from "../node
|
|
2
|
+
import { $t as CAM_PROFILE_ORDER, B as cameraStreamsCapability, Bt as streamBrokerCapability, Cn as number, D as RATE_CONTROL_RELAXED, Dn as string, Dt as rankStreams, En as record, F as addonWidgetsSourceCapability, G as declareLogChannel, Gt as errMsg, Jt as buildFfmpegArgs$1, Kt as AUDIO_PRESETS, M as RingBuffer, Nt as resolveEgressDecodeHwAccel, O as RATE_CONTROL_TIGHT, On as union, Q as egressTransportFromRequest, Qt as BaseAddon, Sn as literal, U as createHwAccelCache, W as createLogChannelsProvider, Wt as webrtcSessionCapability, Xt as isSoftwareDecode, Yt as invocationFromEncodeProfile, Z as egressTranscodeSharingKey, Zt as BOOT_RECOVERY_BACKOFF_MS, _ as EncodeProfileSchema, _n as _enum, b as G711_SCALE_CORRECTION_DB, bn as discriminatedUnion, dn as makeSourceBrokerId, dt as logChannelsCapability, en as CamProfileSchema, fn as nodePin, i as BatteryStatusSchema, in as createEvent, kn as EventCategory, ln as isEvent, mn as parseProfileBrokerId, nn as DeviceType, pt as maskUrlCredentials, q as deriveBatteryPresence, sn as expandAudioChunkToF32le, tn as DeviceFeature, un as makeProfileBrokerId, ut as loadContributionCapability, vn as array, wn as object, yn as boolean, z as batteryCapability } from "../dist-BVWT6DUX.mjs";
|
|
3
|
+
import { i as NO_COST_CLAIM, n as Fmp4FragmentChild, o as probeFfmpegBinary, r as Fmp4FragmentPlane, t as ChildCostRegistry } from "../node-Dj1cgkd_.mjs";
|
|
4
4
|
import { a as parseRestreamPath, d as PREBUFFER_MAX_MS, f as capPreRollRequestMs, i as isLiveEdgeOnlyDial, m as resolvePrebuffer, n as NO_DECLARATION, p as prebufferRetentionMs, s as sdpVariantFor, u as withSentryIntent } from "../restream-intent-DyGmLAU9.mjs";
|
|
5
5
|
import { n as profileForStreamId } from "../remote-restream-BeHi78PZ.mjs";
|
|
6
6
|
import { n as RowMapStore, t as retireRootKeys } from "../retire-root-keys-DZvlso2l.mjs";
|
|
7
|
-
import { i as require_mp4box_all, n as demuxSegmentPreferJs, r as runFfmpegOnce, t as demuxSegmentFullJs } from "../segment-demux-js-
|
|
7
|
+
import { i as require_mp4box_all, n as demuxSegmentPreferJs, r as runFfmpegOnce, t as demuxSegmentFullJs } from "../segment-demux-js-B6OsKCIg.mjs";
|
|
8
8
|
import { createRequire } from "node:module";
|
|
9
9
|
import * as os from "node:os";
|
|
10
10
|
import { networkInterfaces, tmpdir } from "node:os";
|
|
@@ -26570,6 +26570,20 @@ var ControlMessageSchema = discriminatedUnion("t", [
|
|
|
26570
26570
|
t: literal("playClip"),
|
|
26571
26571
|
deviceId: number(),
|
|
26572
26572
|
clipId: string().min(1),
|
|
26573
|
+
/**
|
|
26574
|
+
* WHICH provider holds the file — the `addonId` of the source row the clip
|
|
26575
|
+
* was listed from.
|
|
26576
|
+
*
|
|
26577
|
+
* It travels because nobody downstream can work it out. The broker lives
|
|
26578
|
+
* in `addon-pipeline`, the same addon that registers the RECORDER's
|
|
26579
|
+
* videoclips provider, so a `readClipBytes` with no provider named
|
|
26580
|
+
* resolved in-process to that sibling — which implements the method solely
|
|
26581
|
+
* to explain that an analytics visit has no file behind it. Every onboard
|
|
26582
|
+
* clip answered with that sentence: a flash, and nothing more (3628,
|
|
26583
|
+
* 2026-09-21). Deriving it from the clip id's shape was the other option
|
|
26584
|
+
* and is exactly what D482 forbids.
|
|
26585
|
+
*/
|
|
26586
|
+
provider: string().min(1),
|
|
26573
26587
|
offsetMs: number().min(0),
|
|
26574
26588
|
/**
|
|
26575
26589
|
* Which TWIN of the clip — the vendor's own quality pair, on the one
|
|
@@ -29935,7 +29949,7 @@ var TimelineSession = class {
|
|
|
29935
29949
|
await this.playAt(msg.epoch, msg.profile, { travelFromMs: this.lastPositionMs });
|
|
29936
29950
|
break;
|
|
29937
29951
|
case "playClip":
|
|
29938
|
-
await this.playClip(msg.deviceId, msg.clipId, msg.profile ?? null, msg.offsetMs);
|
|
29952
|
+
await this.playClip(msg.deviceId, msg.clipId, msg.provider, msg.profile ?? null, msg.offsetMs);
|
|
29939
29953
|
break;
|
|
29940
29954
|
case "seek":
|
|
29941
29955
|
if (this.clip) {
|
|
@@ -30017,11 +30031,12 @@ var TimelineSession = class {
|
|
|
30017
30031
|
* frame with no explanation (D391: the branch that accepts work and produces
|
|
30018
30032
|
* nothing is the same branch as the one that drops it).
|
|
30019
30033
|
*/
|
|
30020
|
-
async playClip(deviceId, clipId, profile, offsetMs) {
|
|
30034
|
+
async playClip(deviceId, clipId, provider, profile, offsetMs) {
|
|
30021
30035
|
if (!this.deps.makeClipFeeder) {
|
|
30022
30036
|
this.deps.onLog?.("clip playback: refused — no clip byte source wired on this session (videoclips.readClipBytes absent)", {
|
|
30023
30037
|
deviceId,
|
|
30024
30038
|
clipId,
|
|
30039
|
+
provider,
|
|
30025
30040
|
profile,
|
|
30026
30041
|
offsetMs
|
|
30027
30042
|
});
|
|
@@ -30031,6 +30046,7 @@ var TimelineSession = class {
|
|
|
30031
30046
|
this.clip = {
|
|
30032
30047
|
deviceId,
|
|
30033
30048
|
clipId,
|
|
30049
|
+
provider,
|
|
30034
30050
|
profile
|
|
30035
30051
|
};
|
|
30036
30052
|
this.lastPositionMs = null;
|
|
@@ -30417,7 +30433,7 @@ var ClipSourceError = class extends Error {
|
|
|
30417
30433
|
};
|
|
30418
30434
|
function createClipFileSource(deps) {
|
|
30419
30435
|
const maxBytes = deps.maxBytes ?? 67108864;
|
|
30420
|
-
const { deviceId, clipId, profile } = deps.handle;
|
|
30436
|
+
const { deviceId, clipId, provider, profile } = deps.handle;
|
|
30421
30437
|
let resolved = null;
|
|
30422
30438
|
let inFlight = null;
|
|
30423
30439
|
/**
|
|
@@ -30432,6 +30448,7 @@ function createClipFileSource(deps) {
|
|
|
30432
30448
|
deps.onLog?.(message, {
|
|
30433
30449
|
deviceId,
|
|
30434
30450
|
clipId,
|
|
30451
|
+
provider,
|
|
30435
30452
|
profile,
|
|
30436
30453
|
reason,
|
|
30437
30454
|
...data
|
|
@@ -30444,6 +30461,7 @@ function createClipFileSource(deps) {
|
|
|
30444
30461
|
bytes = await deps.read({
|
|
30445
30462
|
deviceId,
|
|
30446
30463
|
clipId,
|
|
30464
|
+
provider,
|
|
30447
30465
|
profile
|
|
30448
30466
|
});
|
|
30449
30467
|
} catch (err) {
|
|
@@ -33699,6 +33717,8 @@ var StreamBrokerAddon = class extends BaseAddon {
|
|
|
33699
33717
|
const res = await this.ctx.api.videoclips.readClipBytes.query({
|
|
33700
33718
|
deviceId: args.deviceId,
|
|
33701
33719
|
clipId: args.clipId,
|
|
33720
|
+
provider: args.provider,
|
|
33721
|
+
addonId: args.provider,
|
|
33702
33722
|
...args.profile !== null ? { profile: args.profile } : {}
|
|
33703
33723
|
});
|
|
33704
33724
|
return new Uint8Array(Buffer.from(res.base64, "base64"));
|
|
@@ -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_stream_broker_widgets-
|
|
33
|
+
return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-C1dCLSas.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-pipeline",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.282",
|
|
4
4
|
"description": "Pipeline bundle — runner, detection, motion, audio + stream broker. Multi-entry npm package shipping pipeline addons under a single bundle.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|