@camstack/addon-post-analysis 1.2.336 → 1.2.338
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-D7e1kEqc.mjs → clip-model-registry-BLUVLdlY.mjs} +492 -195
- package/dist/{clip-model-registry-BxUHFGUg.js → clip-model-registry-BcSLJ8aL.js} +502 -193
- package/dist/embedding-encoder/index.js +2 -2
- package/dist/embedding-encoder/index.mjs +2 -2
- package/dist/pipeline-analytics/_stub.js +2 -2
- package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-y9isEkU9.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-DDfv_NZB.mjs} +2 -2
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D3jDbheU.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-BRmdbHeK.mjs +26 -0
- package/dist/pipeline-analytics/{hostInit-DH7hZ_gJ.mjs → hostInit-BTA95n_5.mjs} +2 -2
- package/dist/pipeline-analytics/index.js +149 -62
- package/dist/pipeline-analytics/index.mjs +149 -62
- package/dist/pipeline-analytics/remoteEntry.js +1 -1
- package/package.json +2 -2
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BZ-aada5.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-DxUsRAkr.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-BcSLJ8aL.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");
|
|
@@ -4657,8 +4657,8 @@ function verifyArtifactSignature(input) {
|
|
|
4657
4657
|
//#region src/notification-center/artifact-plane.ts
|
|
4658
4658
|
/**
|
|
4659
4659
|
* The hub's default HTTPS API port — the same constant `derive-hub-url.ts`
|
|
4660
|
-
* documents. Only
|
|
4661
|
-
*
|
|
4660
|
+
* documents. Only a legacy hint for the LAN candidates: `local-network`
|
|
4661
|
+
* builds them with the port the hub really listens on.
|
|
4662
4662
|
*/
|
|
4663
4663
|
var HUB_API_PORT = 4443;
|
|
4664
4664
|
/**
|
|
@@ -4667,12 +4667,11 @@ var HUB_API_PORT = 4443;
|
|
|
4667
4667
|
* zero to outrank it.
|
|
4668
4668
|
*/
|
|
4669
4669
|
var PRIORITY_MARKED = -400;
|
|
4670
|
-
var PRIORITY_CONFIGURED = -300;
|
|
4671
4670
|
var PRIORITY_CONNECTED = -200;
|
|
4672
4671
|
var PRIORITY_EXTERNAL_LIST = -100;
|
|
4673
4672
|
/**
|
|
4674
|
-
* Build the ranked candidate list, in the operator's own order:
|
|
4675
|
-
*
|
|
4673
|
+
* Build the ranked candidate list, in the operator's own order: the address
|
|
4674
|
+
* marked on the Network page, then the connected external ingress (tunnels),
|
|
4676
4675
|
* then the LAN addresses. Every source is best-effort — one that throws
|
|
4677
4676
|
* contributes nothing rather than costing the whole list.
|
|
4678
4677
|
*/
|
|
@@ -4684,12 +4683,6 @@ async function collectArtifactEndpoints(sources) {
|
|
|
4684
4683
|
kind: "public",
|
|
4685
4684
|
priority: PRIORITY_MARKED
|
|
4686
4685
|
});
|
|
4687
|
-
const configured = sources.configuredPublicUrl;
|
|
4688
|
-
if (configured !== void 0 && configured !== "" && !/127\.0\.0\.1|localhost/.test(configured)) out.push({
|
|
4689
|
-
baseUrl: configured,
|
|
4690
|
-
kind: "public",
|
|
4691
|
-
priority: PRIORITY_CONFIGURED
|
|
4692
|
-
});
|
|
4693
4686
|
try {
|
|
4694
4687
|
const connected = await sources.getConnected();
|
|
4695
4688
|
if (connected !== null && connected.protocol === "https") out.push({
|
|
@@ -45360,10 +45353,10 @@ var MediaStore = class MediaStore {
|
|
|
45360
45353
|
ownerKind: params.ownerKind,
|
|
45361
45354
|
ownerId: params.ownerId,
|
|
45362
45355
|
kind: params.kind,
|
|
45363
|
-
hint: "pipeline-analytics:media must be rebuilt with an INTEGER PRIMARY KEY
|
|
45356
|
+
hint: "pipeline-analytics:media must be rebuilt with an INTEGER PRIMARY KEY"
|
|
45364
45357
|
}
|
|
45365
45358
|
});
|
|
45366
|
-
throw new Error(`MediaStore.put: "${MEDIA_COLLECTION}" returned a TEXT id (${id}) — the table has not been rebuilt with an INTEGER PRIMARY KEY
|
|
45359
|
+
throw new Error(`MediaStore.put: "${MEDIA_COLLECTION}" returned a TEXT id (${id}) — the table has not been rebuilt with an INTEGER PRIMARY KEY`);
|
|
45367
45360
|
}
|
|
45368
45361
|
this.pressure.noteSuccess();
|
|
45369
45362
|
return id;
|
|
@@ -48815,7 +48808,7 @@ function planTrackMediaNames(media) {
|
|
|
48815
48808
|
}
|
|
48816
48809
|
return out;
|
|
48817
48810
|
}
|
|
48818
|
-
var DEBUG_RETENTION_NOTE = "A `debug` mark does not pin retention
|
|
48811
|
+
var DEBUG_RETENTION_NOTE = "A `debug` mark does not pin retention. A track with no media here may have been evicted rather than never captured.";
|
|
48819
48812
|
/** The archive filename, stamped so two downloads never collide in ~/Downloads. */
|
|
48820
48813
|
function debugArchiveFilename(nowMs) {
|
|
48821
48814
|
return `camstack-debug-${new Date(nowMs).toISOString().replace(/[:.]/g, "-")}.zip`.replace(/[\r\n"]/g, "");
|
|
@@ -53428,7 +53421,7 @@ var FaceAlignmentJobs = class {
|
|
|
53428
53421
|
const stores = this.deps.stores();
|
|
53429
53422
|
if (stores === null) throw new Error("embedding.reenrolPhotos: the gallery stores are not ready");
|
|
53430
53423
|
if (this.photoPassRunning) throw new Error("embedding.reenrolPhotos: a photo re-enrol pass is already running");
|
|
53431
|
-
if (this.resetRunning) throw new Error("embedding.reenrolPhotos: a face gallery reset is running
|
|
53424
|
+
if (this.resetRunning) throw new Error("embedding.reenrolPhotos: a face gallery reset is running");
|
|
53432
53425
|
if (this.deps.isReembedRunning()) throw new Error("embedding.reenrolPhotos: a face re-embed pass is running — the photo pass waits for it");
|
|
53433
53426
|
this.photoPassRunning = true;
|
|
53434
53427
|
try {
|
|
@@ -53484,7 +53477,7 @@ var FaceAlignmentJobs = class {
|
|
|
53484
53477
|
const stores = this.deps.stores();
|
|
53485
53478
|
if (stores === null) throw new Error("embedding.backfillPhotoSources: the gallery stores are not ready");
|
|
53486
53479
|
if (this.photoPassRunning) throw new Error("embedding.backfillPhotoSources: a photo re-enrol pass is running");
|
|
53487
|
-
if (this.resetRunning) throw new Error("embedding.backfillPhotoSources: a face gallery reset is running
|
|
53480
|
+
if (this.resetRunning) throw new Error("embedding.backfillPhotoSources: a face gallery reset is running");
|
|
53488
53481
|
this.backfillRunning = true;
|
|
53489
53482
|
try {
|
|
53490
53483
|
return await this.runBackfill(stores, input);
|
|
@@ -61005,15 +60998,6 @@ function isIdleTrackerStats(stats) {
|
|
|
61005
60998
|
}
|
|
61006
60999
|
/** Shared empty — a fold is rare and every other frame would allocate. */
|
|
61007
61000
|
var EMPTY_RIDER_FOLDS = [];
|
|
61008
|
-
/** The steps a detection's linked labels stand in for (D715), or `undefined` for none. */
|
|
61009
|
-
function linkedStepsOf(labels) {
|
|
61010
|
-
if (labels === void 0) return void 0;
|
|
61011
|
-
const steps = labels.flatMap((l) => {
|
|
61012
|
-
const step = require_clip_model_registry.linkedStepOf(l.stepId);
|
|
61013
|
-
return step === void 0 ? [] : [step];
|
|
61014
|
-
});
|
|
61015
|
-
return steps.length > 0 ? steps : void 0;
|
|
61016
|
-
}
|
|
61017
61001
|
/** The tape observation of a dropped frame: no gate verdict, nothing bound. */
|
|
61018
61002
|
var DROPPED_FRAME_OBSERVATION = {
|
|
61019
61003
|
gate: {
|
|
@@ -61564,6 +61548,7 @@ var FrameProcessor = class {
|
|
|
61564
61548
|
const nativeRecoveryByBbox = /* @__PURE__ */ new Map();
|
|
61565
61549
|
const birthEvidenceByBbox = /* @__PURE__ */ new Map();
|
|
61566
61550
|
const faceBearingBoxes = /* @__PURE__ */ new Set();
|
|
61551
|
+
const rootChildBoxesByBbox = /* @__PURE__ */ new Map();
|
|
61567
61552
|
const flatDetections = frame.detections.filter((d) => d.kind === "first-level").map((det) => {
|
|
61568
61553
|
const bbox = {
|
|
61569
61554
|
x: det.bbox.x,
|
|
@@ -61644,6 +61629,23 @@ var FrameProcessor = class {
|
|
|
61644
61629
|
}
|
|
61645
61630
|
});
|
|
61646
61631
|
}
|
|
61632
|
+
for (const det of frame.detections) {
|
|
61633
|
+
if (det.kind !== "detail" || det.rootSupplied === void 0 || !det.parentId) continue;
|
|
61634
|
+
const parentBbox = firstLevelBboxById.get(det.parentId);
|
|
61635
|
+
if (parentBbox === void 0) continue;
|
|
61636
|
+
const boxes = rootChildBoxesByBbox.get(parentBbox) ?? [];
|
|
61637
|
+
rootChildBoxesByBbox.set(parentBbox, [...boxes, {
|
|
61638
|
+
stepId: det.rootSupplied.stepId,
|
|
61639
|
+
modelId: det.rootSupplied.modelId,
|
|
61640
|
+
score: det.score,
|
|
61641
|
+
bbox: {
|
|
61642
|
+
x: det.bbox.x,
|
|
61643
|
+
y: det.bbox.y,
|
|
61644
|
+
w: det.bbox.width,
|
|
61645
|
+
h: det.bbox.height
|
|
61646
|
+
}
|
|
61647
|
+
}]);
|
|
61648
|
+
}
|
|
61647
61649
|
const { passed, excluded } = this.zoneEngine.filterDetections(flatDetections, this.zones, this.detectionRules, frameWidth, frameHeight, (fd) => fd.detection.class);
|
|
61648
61650
|
this.reportZoneFiltered(excluded);
|
|
61649
61651
|
let filteredDetections = passed.map((fd) => fd.detection);
|
|
@@ -61690,6 +61692,8 @@ var FrameProcessor = class {
|
|
|
61690
61692
|
if (mask !== void 0) maskByBbox.set(to, mask);
|
|
61691
61693
|
const plate = plateByBbox.get(from);
|
|
61692
61694
|
if (plate !== void 0) plateByBbox.set(to, plate);
|
|
61695
|
+
const rootChildren = rootChildBoxesByBbox.get(from);
|
|
61696
|
+
if (rootChildren !== void 0) rootChildBoxesByBbox.set(to, rootChildren);
|
|
61693
61697
|
const faceBbox = faceBboxByBbox.get(from);
|
|
61694
61698
|
if (faceBbox !== void 0) faceBboxByBbox.set(to, faceBbox);
|
|
61695
61699
|
const faceSize = nativeFaceSizeByBbox.get(from);
|
|
@@ -61921,7 +61925,7 @@ var FrameProcessor = class {
|
|
|
61921
61925
|
const sourceDetectionId = sourceIdByBbox.get(td.bbox);
|
|
61922
61926
|
const nativeRecovery = td.matchedThisFrame !== false ? nativeRecoveryByBbox.get(td.bbox) : void 0;
|
|
61923
61927
|
const birthEvidence = td.matchedThisFrame !== false ? birthEvidenceByBbox.get(td.bbox) : void 0;
|
|
61924
|
-
const
|
|
61928
|
+
const rootChildBoxes = td.matchedThisFrame !== false ? rootChildBoxesByBbox.get(td.bbox) : void 0;
|
|
61925
61929
|
return {
|
|
61926
61930
|
trackId: td.trackId,
|
|
61927
61931
|
...sourceDetectionId !== void 0 ? { sourceDetectionId } : {},
|
|
@@ -61948,7 +61952,7 @@ var FrameProcessor = class {
|
|
|
61948
61952
|
} : {},
|
|
61949
61953
|
...nativeRecovery !== void 0 ? { nativeRecovery } : {},
|
|
61950
61954
|
...birthEvidence !== void 0 ? { birthEvidence } : {},
|
|
61951
|
-
...
|
|
61955
|
+
...rootChildBoxes !== void 0 ? { rootChildBoxes } : {}
|
|
61952
61956
|
};
|
|
61953
61957
|
});
|
|
61954
61958
|
this.lastLabelWriteRefusals = refusals;
|
|
@@ -78277,14 +78281,20 @@ var DetailScheduler = class {
|
|
|
78277
78281
|
if (this.underMaxPerTrack(state)) state.retryPending = true;
|
|
78278
78282
|
}
|
|
78279
78283
|
/**
|
|
78280
|
-
* The root model the announce says
|
|
78281
|
-
* Read from the announce the track was scheduled with.
|
|
78284
|
+
* The root model the announce says SUPPLIES this (track, step), and how
|
|
78285
|
+
* (D730). Read from the announce the track was scheduled with. An announce
|
|
78286
|
+
* from a runner that predates `filledAs` named only label supplies.
|
|
78282
78287
|
*/
|
|
78283
|
-
|
|
78284
|
-
|
|
78288
|
+
rootSupply(trackId, stepId) {
|
|
78289
|
+
const announce = this.tracks.get(trackId)?.get(stepId)?.announce;
|
|
78290
|
+
if (announce?.filledBy === void 0) return void 0;
|
|
78291
|
+
return {
|
|
78292
|
+
modelId: announce.filledBy,
|
|
78293
|
+
kind: announce.filledAs ?? "label"
|
|
78294
|
+
};
|
|
78285
78295
|
}
|
|
78286
78296
|
/**
|
|
78287
|
-
* The
|
|
78297
|
+
* The root model already produced this step's effect for the track (D730):
|
|
78288
78298
|
* the step is settled for the track's life — no retry, improve or periodic
|
|
78289
78299
|
* re-fire. Same terminal state as a confident result.
|
|
78290
78300
|
*/
|
|
@@ -78346,6 +78356,35 @@ function composeDetailSteps(req, hasTrackLabel) {
|
|
|
78346
78356
|
if (req.stepId === "plate-detection") return ["plate-detection", "plate-ocr"];
|
|
78347
78357
|
return [req.stepId];
|
|
78348
78358
|
}
|
|
78359
|
+
/** The children a root-supplied crop step still feeds (`rootSupplyServes`). */
|
|
78360
|
+
function servedChildren(stepId) {
|
|
78361
|
+
if (!require_clip_model_registry.isRootSuppliableStepId(stepId)) return [];
|
|
78362
|
+
if (stepId !== "plate-detection" && stepId !== "face-detection") return [];
|
|
78363
|
+
return require_clip_model_registry.rootSupplyServes(stepId);
|
|
78364
|
+
}
|
|
78365
|
+
/**
|
|
78366
|
+
* Carry the root's frame-space boxes into a parcel's pixel space, by the same
|
|
78367
|
+
* mapping that took the subject's box there (`parked.bbox` is `frame.bbox`
|
|
78368
|
+
* rescaled). Pure.
|
|
78369
|
+
*/
|
|
78370
|
+
function suppliedInParcel(supplied, frameBox, parcelBox) {
|
|
78371
|
+
const sx = frameBox.w > 0 ? parcelBox.w / frameBox.w : 1;
|
|
78372
|
+
const sy = frameBox.h > 0 ? parcelBox.h / frameBox.h : 1;
|
|
78373
|
+
const [first, ...rest] = supplied.boxes.map((b) => ({
|
|
78374
|
+
score: b.score,
|
|
78375
|
+
bbox: {
|
|
78376
|
+
x: parcelBox.x + (b.bbox.x - frameBox.x) * sx,
|
|
78377
|
+
y: parcelBox.y + (b.bbox.y - frameBox.y) * sy,
|
|
78378
|
+
w: b.bbox.w * sx,
|
|
78379
|
+
h: b.bbox.h * sy
|
|
78380
|
+
}
|
|
78381
|
+
}));
|
|
78382
|
+
if (first === void 0) return supplied;
|
|
78383
|
+
return {
|
|
78384
|
+
...supplied,
|
|
78385
|
+
boxes: [first, ...rest]
|
|
78386
|
+
};
|
|
78387
|
+
}
|
|
78349
78388
|
/**
|
|
78350
78389
|
* Does `steps` name a nested-enrichment chain (root detector + a child that
|
|
78351
78390
|
* produces a `label`/`embedding`), i.e. more than the bare root step? Used to
|
|
@@ -78430,6 +78469,7 @@ var TrackDetailDispatcher = class {
|
|
|
78430
78469
|
dev.scheduler.onTrackEnded(trackId);
|
|
78431
78470
|
dev.tracks.delete(trackId);
|
|
78432
78471
|
dev.parcelEnriched.delete(trackId);
|
|
78472
|
+
for (const key of dev.rootBoxMissLogged) if (key.startsWith(`${trackId}:`)) dev.rootBoxMissLogged.delete(key);
|
|
78433
78473
|
dev.candidateBest.delete(trackId);
|
|
78434
78474
|
if (dev.tracks.size === 0) this.clearTimer(dev);
|
|
78435
78475
|
}
|
|
@@ -78461,7 +78501,8 @@ var TrackDetailDispatcher = class {
|
|
|
78461
78501
|
inFlight: 0,
|
|
78462
78502
|
timer: null,
|
|
78463
78503
|
lastFailWarnAt: 0,
|
|
78464
|
-
lastEnrichWarnAt: 0
|
|
78504
|
+
lastEnrichWarnAt: 0,
|
|
78505
|
+
rootBoxMissLogged: /* @__PURE__ */ new Set()
|
|
78465
78506
|
};
|
|
78466
78507
|
this.devices.set(deviceId, dev);
|
|
78467
78508
|
}
|
|
@@ -78526,30 +78567,56 @@ var TrackDetailDispatcher = class {
|
|
|
78526
78567
|
this.pump(deviceId, dev);
|
|
78527
78568
|
}
|
|
78528
78569
|
/**
|
|
78529
|
-
*
|
|
78530
|
-
*
|
|
78531
|
-
* the
|
|
78532
|
-
* settled for the track, which is what makes the line below fire once per
|
|
78533
|
-
* (track, step)
|
|
78534
|
-
*
|
|
78535
|
-
* before.
|
|
78570
|
+
* D730: the root model supplies this step (the announce's `filledBy`), so it
|
|
78571
|
+
* is never inferred as-is. A LABEL supply — or a crop supply none of whose
|
|
78572
|
+
* children the root's box can feed — has nothing left to dispatch: the step
|
|
78573
|
+
* is settled for the track, which is what makes the line below fire once per
|
|
78574
|
+
* (track, step). A crop supply WITH served children (a plate → its reader, a
|
|
78575
|
+
* face → refinement + embedder) is dispatched, with the root's box.
|
|
78536
78576
|
*/
|
|
78537
78577
|
skipFilled(deviceId, dev, req) {
|
|
78538
|
-
const
|
|
78539
|
-
if (
|
|
78540
|
-
if (
|
|
78578
|
+
const supply = dev.scheduler.rootSupply(req.trackId, req.stepId);
|
|
78579
|
+
if (supply === void 0) return false;
|
|
78580
|
+
if (supply.kind === "crop" && servedChildren(req.stepId).length > 0) return false;
|
|
78541
78581
|
dev.scheduler.markFilled(req.trackId, req.stepId);
|
|
78542
|
-
this.deps.logger.info("detail step
|
|
78582
|
+
this.deps.logger.info("detail step not dispatched — the root model supplies it", {
|
|
78543
78583
|
tags: { deviceId },
|
|
78544
78584
|
meta: {
|
|
78545
78585
|
trackId: req.trackId,
|
|
78546
78586
|
stepId: req.stepId,
|
|
78547
|
-
filledBy,
|
|
78587
|
+
filledBy: supply.modelId,
|
|
78588
|
+
kind: supply.kind,
|
|
78548
78589
|
reason: req.reason
|
|
78549
78590
|
}
|
|
78550
78591
|
});
|
|
78551
78592
|
return true;
|
|
78552
78593
|
}
|
|
78594
|
+
/**
|
|
78595
|
+
* The root-supplied form of a crop request (D730): the step plus the
|
|
78596
|
+
* children its root box serves, and that box. `'no-box'` when the root drew
|
|
78597
|
+
* none inside this subject on its freshest frame — the same outcome as the
|
|
78598
|
+
* step's own model finding nothing, so the scheduler retries per cadence.
|
|
78599
|
+
* `undefined` for every request the root does not supply.
|
|
78600
|
+
*/
|
|
78601
|
+
rootSuppliedDispatch(dev, req, frame) {
|
|
78602
|
+
const supply = dev.scheduler.rootSupply(req.trackId, req.stepId);
|
|
78603
|
+
if (supply?.kind !== "crop") return void 0;
|
|
78604
|
+
const served = servedChildren(req.stepId);
|
|
78605
|
+
const composed = composeDetailSteps(req, (id) => this.deps.hasTrackLabel?.(id) ?? false);
|
|
78606
|
+
const [first, ...rest] = (frame.rootChildBoxes ?? []).filter((b) => b.stepId === req.stepId).map((b) => ({
|
|
78607
|
+
bbox: { ...b.bbox },
|
|
78608
|
+
score: b.score
|
|
78609
|
+
}));
|
|
78610
|
+
if (first === void 0) return "no-box";
|
|
78611
|
+
return {
|
|
78612
|
+
steps: [req.stepId, ...composed.filter((s) => served.includes(s))],
|
|
78613
|
+
supplied: {
|
|
78614
|
+
stepId: req.stepId,
|
|
78615
|
+
modelId: supply.modelId,
|
|
78616
|
+
boxes: [first, ...rest]
|
|
78617
|
+
}
|
|
78618
|
+
};
|
|
78619
|
+
}
|
|
78553
78620
|
pump(deviceId, dev) {
|
|
78554
78621
|
while (dev.inFlight < this.maxInFlight && dev.queue.length > 0) {
|
|
78555
78622
|
const req = dev.queue.shift();
|
|
@@ -78564,7 +78631,24 @@ var TrackDetailDispatcher = class {
|
|
|
78564
78631
|
}
|
|
78565
78632
|
}
|
|
78566
78633
|
async dispatch(deviceId, dev, req, frame) {
|
|
78567
|
-
const
|
|
78634
|
+
const rootSupplied = this.rootSuppliedDispatch(dev, req, frame);
|
|
78635
|
+
if (rootSupplied === "no-box") {
|
|
78636
|
+
const key = `${req.trackId}:${req.stepId}`;
|
|
78637
|
+
if (!dev.rootBoxMissLogged.has(key)) {
|
|
78638
|
+
dev.rootBoxMissLogged.add(key);
|
|
78639
|
+
this.deps.logger.info("detail step waits — the root model drew no box in this subject yet", {
|
|
78640
|
+
tags: { deviceId },
|
|
78641
|
+
meta: {
|
|
78642
|
+
trackId: req.trackId,
|
|
78643
|
+
stepId: req.stepId,
|
|
78644
|
+
reason: req.reason
|
|
78645
|
+
}
|
|
78646
|
+
});
|
|
78647
|
+
}
|
|
78648
|
+
dev.scheduler.onResult(req.trackId, req.stepId, null, Date.now());
|
|
78649
|
+
return;
|
|
78650
|
+
}
|
|
78651
|
+
const details = await this.runOnce(deviceId, dev, req, frame, rootSupplied);
|
|
78568
78652
|
if (details === null) {
|
|
78569
78653
|
dev.scheduler.onFrameMiss(req.trackId, req.stepId, Date.now());
|
|
78570
78654
|
return;
|
|
@@ -78619,19 +78703,21 @@ var TrackDetailDispatcher = class {
|
|
|
78619
78703
|
* the same missing lease). Walking them anyway is what burned two extra
|
|
78620
78704
|
* cross-node RPCs per refusal, ~600–900 times an hour fleet-wide.
|
|
78621
78705
|
*/
|
|
78622
|
-
async runOnce(deviceId, dev, req, frame) {
|
|
78706
|
+
async runOnce(deviceId, dev, req, frame, rootSupplied) {
|
|
78623
78707
|
const parent = {
|
|
78624
78708
|
bbox: { ...frame.bbox },
|
|
78625
78709
|
className: frame.className
|
|
78626
78710
|
};
|
|
78627
|
-
const steps = composeDetailSteps(req, (trackId) => this.deps.hasTrackLabel?.(trackId) ?? false);
|
|
78711
|
+
const steps = rootSupplied ? [...rootSupplied.steps] : composeDetailSteps(req, (trackId) => this.deps.hasTrackLabel?.(trackId) ?? false);
|
|
78712
|
+
const supplied = rootSupplied ? { supplied: rootSupplied.supplied } : {};
|
|
78628
78713
|
let handleRefused = false;
|
|
78629
78714
|
if (frame.frameHandle !== void 0) try {
|
|
78630
78715
|
const primary = await this.deps.runDetailSubtree({
|
|
78631
78716
|
deviceId,
|
|
78632
78717
|
frameHandle: frame.frameHandle,
|
|
78633
78718
|
parent,
|
|
78634
|
-
steps
|
|
78719
|
+
steps,
|
|
78720
|
+
...supplied
|
|
78635
78721
|
}, frame.nodeId);
|
|
78636
78722
|
if (primary !== null) return primary.details;
|
|
78637
78723
|
} catch (err) {
|
|
@@ -78669,7 +78755,8 @@ var TrackDetailDispatcher = class {
|
|
|
78669
78755
|
bbox: { ...parked.bbox },
|
|
78670
78756
|
className: frame.className
|
|
78671
78757
|
},
|
|
78672
|
-
steps
|
|
78758
|
+
steps,
|
|
78759
|
+
...rootSupplied ? { supplied: suppliedInParcel(rootSupplied.supplied, frame.bbox, parked.bbox) } : {}
|
|
78673
78760
|
}, parked.nodeId);
|
|
78674
78761
|
if (derived !== null) {
|
|
78675
78762
|
const perStep = dev.parcelEnriched.get(req.trackId) ?? /* @__PURE__ */ new Map();
|
|
@@ -78699,7 +78786,8 @@ var TrackDetailDispatcher = class {
|
|
|
78699
78786
|
deviceId,
|
|
78700
78787
|
cropJpeg,
|
|
78701
78788
|
parent,
|
|
78702
|
-
steps
|
|
78789
|
+
steps,
|
|
78790
|
+
...supplied
|
|
78703
78791
|
}, frame.nodeId);
|
|
78704
78792
|
if (retry !== null) return retry.details;
|
|
78705
78793
|
}
|
|
@@ -102226,7 +102314,7 @@ function buildDetectionSettingsSections() {
|
|
|
102226
102314
|
{
|
|
102227
102315
|
id: "tracking",
|
|
102228
102316
|
title: "Tracking",
|
|
102229
|
-
description: "Per-device tracker tuning
|
|
102317
|
+
description: "Per-device tracker tuning: association, coasting, spawn floors, sub-floor continuation and detector-dropout handling. Use the deviceId-tagged logs (track started/lost/ended, frame processed) to measure the effect.",
|
|
102230
102318
|
columns: 2,
|
|
102231
102319
|
fields: [
|
|
102232
102320
|
{
|
|
@@ -102408,7 +102496,7 @@ function buildDetectionSettingsSections() {
|
|
|
102408
102496
|
type: "number",
|
|
102409
102497
|
key: "byteTrackLowIouThreshold",
|
|
102410
102498
|
label: "Sub-floor recovery IoU",
|
|
102411
|
-
description: "The IoU a sub-floor box needs with a moving tracklet’s prediction to re-attach it
|
|
102499
|
+
description: "The IoU a sub-floor box needs with a moving tracklet’s prediction to re-attach it. Which boxes count as sub-floor is decided by the \"keep tracks through low-confidence frames\" option below.",
|
|
102412
102500
|
min: 0,
|
|
102413
102501
|
max: 1,
|
|
102414
102502
|
step: .05,
|
|
@@ -106620,7 +106708,6 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends require_clip_m
|
|
|
106620
106708
|
async ncEndpoints() {
|
|
106621
106709
|
return collectArtifactEndpoints({
|
|
106622
106710
|
markedBaseUrl: await this.markedNotificationEndpoint(),
|
|
106623
|
-
configuredPublicUrl: process.env["CAMSTACK_HUB_PUBLIC_URL"],
|
|
106624
106711
|
getConnected: async () => {
|
|
106625
106712
|
const status = await this.ctx.api.networkAccess.getStatus.query();
|
|
106626
106713
|
this.ctx.logger.debug("artifact base-url: connected ingress", { meta: {
|
|
@@ -106640,7 +106727,7 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends require_clip_m
|
|
|
106640
106727
|
}));
|
|
106641
106728
|
},
|
|
106642
106729
|
listLan: async (port) => {
|
|
106643
|
-
return (await this.ctx.api.localNetwork.getConnectionEndpoints.query({ port })).endpoints.flatMap((e) => e.kind === "app-link" ? [] : [{
|
|
106730
|
+
return (await this.ctx.api.localNetwork.getConnectionEndpoints.query({ port })).endpoints.flatMap((e) => e.kind === "app-link" || e.kind === "custom" ? [] : [{
|
|
106644
106731
|
baseUrl: e.baseUrl,
|
|
106645
106732
|
kind: e.kind,
|
|
106646
106733
|
priority: e.priority
|
|
@@ -110287,7 +110374,7 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends require_clip_m
|
|
|
110287
110374
|
this.ctx.logger.error("artifacts storage location is NOT available — enrolling a face, a plate or a scene reference will FAIL until it is", { meta: {
|
|
110288
110375
|
location: ARTIFACTS_MEDIA_LOCATION,
|
|
110289
110376
|
error: require_clip_model_registry.errMsg(err),
|
|
110290
|
-
hint: "the declaration is seeded when a storage-provider registers; restart this node so the manifest is re-read, or create an artifacts location. Refusing the write is deliberate — the
|
|
110377
|
+
hint: "the declaration is seeded when a storage-provider registers; restart this node so the manifest is re-read, or create an artifacts location. Refusing the write is deliberate — the gallery is never written to the footage volume, and the addon data dir carries no media."
|
|
110291
110378
|
} });
|
|
110292
110379
|
return;
|
|
110293
110380
|
}
|
|
@@ -111698,7 +111785,7 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends require_clip_m
|
|
|
111698
111785
|
frameHandle,
|
|
111699
111786
|
nodeId: frameHandle.nodeId
|
|
111700
111787
|
} : {},
|
|
111701
|
-
...t.
|
|
111788
|
+
...t.rootChildBoxes !== void 0 ? { rootChildBoxes: t.rootChildBoxes } : {}
|
|
111702
111789
|
};
|
|
111703
111790
|
if (prevIds.has(t.trackId)) dispatcher.onFrame(deviceId, t.trackId, steps, detailFrame, result.timestamp);
|
|
111704
111791
|
else dispatcher.onTrackStarted(deviceId, t.trackId, t.className, steps, detailFrame, result.timestamp);
|
|
@@ -116569,8 +116656,8 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends require_clip_m
|
|
|
116569
116656
|
const mediaStore = this.mediaStore;
|
|
116570
116657
|
if (!mediaStore) throw new Error("embedding.reembedFaces: the media store is not ready");
|
|
116571
116658
|
if (this.faceReembedRunning) throw new Error("embedding.reembedFaces: a face re-embed pass is already running");
|
|
116572
|
-
if (this.faceAlignmentJobs?.isPhotoPassRunning === true) throw new Error("embedding.reembedFaces: a photo re-enrol pass is running
|
|
116573
|
-
if (this.faceAlignmentJobs?.isResetRunning === true) throw new Error("embedding.reembedFaces: a face gallery reset is running
|
|
116659
|
+
if (this.faceAlignmentJobs?.isPhotoPassRunning === true) throw new Error("embedding.reembedFaces: a photo re-enrol pass is running");
|
|
116660
|
+
if (this.faceAlignmentJobs?.isResetRunning === true) throw new Error("embedding.reembedFaces: a face gallery reset is running");
|
|
116574
116661
|
this.faceReembedRunning = true;
|
|
116575
116662
|
try {
|
|
116576
116663
|
let targetModelId = confirmedTargetModelId;
|
|
@@ -116640,8 +116727,8 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends require_clip_m
|
|
|
116640
116727
|
const mediaStore = this.mediaStore;
|
|
116641
116728
|
if (!mediaStore) throw new Error("faceGallery.reembedSamples: the media store is not ready");
|
|
116642
116729
|
if (this.faceReembedRunning) throw new Error("faceGallery.reembedSamples: a face re-embed pass is already running");
|
|
116643
|
-
if (this.faceAlignmentJobs?.isPhotoPassRunning === true) throw new Error("faceGallery.reembedSamples: a photo re-enrol pass is running
|
|
116644
|
-
if (this.faceAlignmentJobs?.isResetRunning === true) throw new Error("faceGallery.reembedSamples: a face gallery reset is running
|
|
116730
|
+
if (this.faceAlignmentJobs?.isPhotoPassRunning === true) throw new Error("faceGallery.reembedSamples: a photo re-enrol pass is running");
|
|
116731
|
+
if (this.faceAlignmentJobs?.isResetRunning === true) throw new Error("faceGallery.reembedSamples: a face gallery reset is running");
|
|
116645
116732
|
this.faceReembedRunning = true;
|
|
116646
116733
|
try {
|
|
116647
116734
|
const embedder = new FaceReembedEmbedder({
|