@trillboards/edge-sdk 0.2.140 → 0.2.150
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/README.md +2 -2
- package/deploy/detector/pyproject.toml +20 -2
- package/deploy/detector/tests/test_execution.py +124 -0
- package/deploy/detector/tests/test_model_identity.py +80 -0
- package/deploy/detector/tests/test_registry.py +18 -0
- package/deploy/detector/tests/test_server.py +3 -1
- package/deploy/detector/tests/test_version_stamp.py +4 -1
- package/deploy/detector/trillboards_detector/_version.py +2 -2
- package/deploy/detector/trillboards_detector/cli.py +3 -0
- package/deploy/detector/trillboards_detector/detections.py +7 -0
- package/deploy/detector/trillboards_detector/errors.py +4 -0
- package/deploy/detector/trillboards_detector/execution.py +109 -0
- package/deploy/detector/trillboards_detector/loader.py +6 -3
- package/deploy/detector/trillboards_detector/registry.py +27 -5
- package/deploy/detector/trillboards_detector/server.py +29 -2
- package/deploy/detector/trillboards_detector/session.py +15 -3
- package/deploy/litertlm/test_trillboards_litertlm_shim.py +81 -0
- package/deploy/litertlm/test_verify_model_proof.py +30 -0
- package/deploy/litertlm/trillboards_litertlm_shim.py +150 -1
- package/deploy/litertlm/verify_model_proof.py +30 -0
- package/deploy/macos/build-macos-pkg.sh +10 -10
- package/deploy/macos/scripts/setup-detector.sh +2 -2
- package/deploy/macos/scripts/setup-litertlm.sh +66 -30
- package/deploy/macos/test-setup-litertlm-reinstall.sh +57 -4
- package/deploy/systemd/setup-detector.sh +2 -2
- package/deploy/systemd/setup-litertlm.sh +51 -27
- package/deploy/windows/build-windows.ps1 +10 -6
- package/deploy/windows/bundle-windows-installer.ps1 +3 -3
- package/deploy/windows/e2e/test-local-sense.ps1 +6 -5
- package/deploy/windows/install-update.ps1 +52 -9
- package/deploy/windows/set-executable-icon.ps1 +24 -5
- package/deploy/windows/setup-detector.ps1 +142 -4
- package/deploy/windows/setup-litertlm.ps1 +53 -10
- package/dist/AudienceAnalyzeClient.d.ts +10 -0
- package/dist/AudienceAnalyzeClient.d.ts.map +1 -1
- package/dist/AudienceAnalyzeClient.js +5 -4
- package/dist/AudienceAnalyzeClient.js.map +1 -1
- package/dist/CloudSensingManager.d.ts +38 -1
- package/dist/CloudSensingManager.d.ts.map +1 -1
- package/dist/CloudSensingManager.js +403 -25
- package/dist/CloudSensingManager.js.map +1 -1
- package/dist/DetectorFieldProducer.d.ts +5 -1
- package/dist/DetectorFieldProducer.d.ts.map +1 -1
- package/dist/DetectorFieldProducer.js +8 -1
- package/dist/DetectorFieldProducer.js.map +1 -1
- package/dist/DurableVlmCandidateSpool.d.ts +83 -2
- package/dist/DurableVlmCandidateSpool.d.ts.map +1 -1
- package/dist/DurableVlmCandidateSpool.js +596 -30
- package/dist/DurableVlmCandidateSpool.js.map +1 -1
- package/dist/EdgeAgent.js +1 -1
- package/dist/FrameGroupingShadow.d.ts +51 -0
- package/dist/FrameGroupingShadow.d.ts.map +1 -0
- package/dist/FrameGroupingShadow.js +158 -0
- package/dist/FrameGroupingShadow.js.map +1 -0
- package/dist/ImageClassifierFieldProducer.d.ts +36 -0
- package/dist/ImageClassifierFieldProducer.d.ts.map +1 -0
- package/dist/ImageClassifierFieldProducer.js +150 -0
- package/dist/ImageClassifierFieldProducer.js.map +1 -0
- package/dist/LiteRtVlmProvider.d.ts +5 -0
- package/dist/LiteRtVlmProvider.d.ts.map +1 -1
- package/dist/LiteRtVlmProvider.js +72 -7
- package/dist/LiteRtVlmProvider.js.map +1 -1
- package/dist/LocalDetectorClient.d.ts +6 -0
- package/dist/LocalDetectorClient.d.ts.map +1 -1
- package/dist/LocalDetectorClient.js +8 -0
- package/dist/LocalDetectorClient.js.map +1 -1
- package/dist/OrderedFrameReview.d.ts +57 -0
- package/dist/OrderedFrameReview.d.ts.map +1 -0
- package/dist/OrderedFrameReview.js +121 -0
- package/dist/OrderedFrameReview.js.map +1 -0
- package/dist/OrderedReviewClient.d.ts +38 -0
- package/dist/OrderedReviewClient.d.ts.map +1 -0
- package/dist/OrderedReviewClient.js +121 -0
- package/dist/OrderedReviewClient.js.map +1 -0
- package/dist/OrderedSequenceStore.d.ts +69 -0
- package/dist/OrderedSequenceStore.d.ts.map +1 -0
- package/dist/OrderedSequenceStore.js +257 -0
- package/dist/OrderedSequenceStore.js.map +1 -0
- package/dist/ProfileReviewWork.d.ts +68 -0
- package/dist/ProfileReviewWork.d.ts.map +1 -0
- package/dist/ProfileReviewWork.js +150 -0
- package/dist/ProfileReviewWork.js.map +1 -0
- package/dist/RetainedFieldContract.d.ts +21 -0
- package/dist/RetainedFieldContract.d.ts.map +1 -0
- package/dist/RetainedFieldContract.js +92 -0
- package/dist/RetainedFieldContract.js.map +1 -0
- package/dist/ReviewModelUse.d.ts +7 -0
- package/dist/ReviewModelUse.d.ts.map +1 -0
- package/dist/ReviewModelUse.js +30 -0
- package/dist/ReviewModelUse.js.map +1 -0
- package/dist/ReviewPriority.d.ts +12 -0
- package/dist/ReviewPriority.d.ts.map +1 -0
- package/dist/ReviewPriority.js +45 -0
- package/dist/ReviewPriority.js.map +1 -0
- package/dist/RuntimeModelSelection.d.ts +10 -0
- package/dist/RuntimeModelSelection.d.ts.map +1 -0
- package/dist/RuntimeModelSelection.js +58 -0
- package/dist/RuntimeModelSelection.js.map +1 -0
- package/dist/SceneChangeDetector.d.ts +1 -1
- package/dist/SceneChangeDetector.d.ts.map +1 -1
- package/dist/SceneChangeDetector.js +18 -6
- package/dist/SceneChangeDetector.js.map +1 -1
- package/dist/ScopedVlmReview.d.ts +76 -0
- package/dist/ScopedVlmReview.d.ts.map +1 -0
- package/dist/ScopedVlmReview.js +267 -0
- package/dist/ScopedVlmReview.js.map +1 -0
- package/dist/SensingProfileClient.d.ts +50 -0
- package/dist/SensingProfileClient.d.ts.map +1 -1
- package/dist/SensingProfileClient.js +58 -2
- package/dist/SensingProfileClient.js.map +1 -1
- package/dist/TemporalReviewClient.d.ts +43 -0
- package/dist/TemporalReviewClient.d.ts.map +1 -0
- package/dist/TemporalReviewClient.js +117 -0
- package/dist/TemporalReviewClient.js.map +1 -0
- package/dist/TemporalReviewJournal.d.ts +91 -0
- package/dist/TemporalReviewJournal.d.ts.map +1 -0
- package/dist/TemporalReviewJournal.js +337 -0
- package/dist/TemporalReviewJournal.js.map +1 -0
- package/dist/UrgentReviewTriage.d.ts +35 -0
- package/dist/UrgentReviewTriage.d.ts.map +1 -0
- package/dist/UrgentReviewTriage.js +52 -0
- package/dist/UrgentReviewTriage.js.map +1 -0
- package/dist/VideoSegmentUploader.d.ts +293 -0
- package/dist/VideoSegmentUploader.d.ts.map +1 -0
- package/dist/VideoSegmentUploader.js +1002 -0
- package/dist/VideoSegmentUploader.js.map +1 -0
- package/dist/VlmCandidateBuffer.d.ts +19 -0
- package/dist/VlmCandidateBuffer.d.ts.map +1 -1
- package/dist/VlmCandidateBuffer.js.map +1 -1
- package/dist/autoSense.d.ts +2 -2
- package/dist/autoSense.d.ts.map +1 -1
- package/dist/autoSense.js +16 -11
- package/dist/autoSense.js.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/continuousReview.d.ts +71 -0
- package/dist/continuousReview.d.ts.map +1 -0
- package/dist/continuousReview.js +53 -0
- package/dist/continuousReview.js.map +1 -0
- package/dist/detectorCountReview.d.ts +9 -0
- package/dist/detectorCountReview.d.ts.map +1 -0
- package/dist/detectorCountReview.js +79 -0
- package/dist/detectorCountReview.js.map +1 -0
- package/dist/diagnose.d.ts +1 -1
- package/dist/diagnose.js +1 -1
- package/dist/installerOnboardingMode.d.ts.map +1 -1
- package/dist/installerOnboardingMode.js +5 -3
- package/dist/installerOnboardingMode.js.map +1 -1
- package/dist/localInferenceSchema.d.ts +8 -0
- package/dist/localInferenceSchema.d.ts.map +1 -1
- package/dist/localInferenceSchema.js +3 -3
- package/dist/localInferenceSchema.js.map +1 -1
- package/dist/localSenseE2eHarness.d.ts +12 -0
- package/dist/localSenseE2eHarness.d.ts.map +1 -1
- package/dist/localSenseE2eHarness.js +77 -4
- package/dist/localSenseE2eHarness.js.map +1 -1
- package/dist/localSensing.d.ts +91 -18
- package/dist/localSensing.d.ts.map +1 -1
- package/dist/localSensing.js +678 -153
- package/dist/localSensing.js.map +1 -1
- package/dist/mixedScopedCounts.d.ts +17 -0
- package/dist/mixedScopedCounts.d.ts.map +1 -0
- package/dist/mixedScopedCounts.js +90 -0
- package/dist/mixedScopedCounts.js.map +1 -0
- package/dist/sensingCatchRate.d.ts +9 -5
- package/dist/sensingCatchRate.d.ts.map +1 -1
- package/dist/sensingCatchRate.js +10 -6
- package/dist/sensingCatchRate.js.map +1 -1
- package/dist/sensingRunMode.d.ts +5 -0
- package/dist/sensingRunMode.d.ts.map +1 -1
- package/dist/sensingRunMode.js +56 -0
- package/dist/sensingRunMode.js.map +1 -1
- package/package.json +7 -4
- package/retained/ArchiveLifecycle.cjs +79 -0
- package/retained/ModelStageScheduler.cjs +66 -0
- package/retained/ProfileAuthorityClient.cjs +88 -0
- package/retained/RetainedCaptureClient.cjs +164 -0
- package/retained/WaitRecheckCaptureClient.cjs +109 -0
- package/retained/__tests__/archive-lifecycle.test.cjs +117 -0
- package/retained/__tests__/runtime.test.cjs +384 -0
- package/retained/alert-rule-policy.cjs +37 -0
- package/retained/manager.cjs +133 -0
- package/retained/pilot-profile-client.cjs +82 -0
- package/retained/temporal-grouping.cjs +78 -0
- package/retained/website-api-capability.cjs +122 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.reviewContextHash = void 0;
|
|
4
|
+
exports.promoteProfileDependencies = promoteProfileDependencies;
|
|
5
|
+
exports.planProfileReview = planProfileReview;
|
|
6
|
+
exports.validateProfileWork = validateProfileWork;
|
|
7
|
+
exports.reviewProfileBatch = reviewProfileBatch;
|
|
8
|
+
const crypto_1 = require("crypto");
|
|
9
|
+
const reviewContextHash = (context) => (0, crypto_1.createHash)('sha256').update(JSON.stringify(context ?? null)).digest('hex');
|
|
10
|
+
exports.reviewContextHash = reviewContextHash;
|
|
11
|
+
const hasOwn = (value, field) => Object.prototype.hasOwnProperty.call(value, field);
|
|
12
|
+
// These values participate in localSensing's existing presence-contradiction
|
|
13
|
+
// repair. Preserve that cross-field check even if one has a separate region.
|
|
14
|
+
const PRESENCE_DEPENDENCIES = new Set(['people_present', 'confidence', 'person_count', 'face_count', 'people_count', 'human_count']);
|
|
15
|
+
function promoteProfileDependencies(work) {
|
|
16
|
+
if (work.items.some(i => PRESENCE_DEPENDENCIES.has(i.field) && i.selected)) {
|
|
17
|
+
for (const item of work.items)
|
|
18
|
+
if (PRESENCE_DEPENDENCIES.has(item.field) && !item.selected) {
|
|
19
|
+
item.selected = true;
|
|
20
|
+
item.reason = 'presence_dependency';
|
|
21
|
+
delete item.referenceSha256;
|
|
22
|
+
delete item.referenceCapturedAtMs;
|
|
23
|
+
delete item.referenceEvidenceId;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function declarations(context) {
|
|
28
|
+
const schema = context.schema;
|
|
29
|
+
const properties = schema?.properties;
|
|
30
|
+
if (!properties || typeof properties !== 'object' || Array.isArray(properties))
|
|
31
|
+
throw Error('No profile schema');
|
|
32
|
+
if (Object.values(properties).some(p => !p || typeof p !== 'object' || Array.isArray(p)))
|
|
33
|
+
throw Error('Invalid field schema');
|
|
34
|
+
const producers = Array.isArray(context.producerFields) ? context.producerFields : [];
|
|
35
|
+
const owners = new Map();
|
|
36
|
+
for (const p of producers) {
|
|
37
|
+
if (!p || typeof p.field !== 'string' || typeof p.modelId !== 'string' || !p.modelId || owners.has(p.field)) {
|
|
38
|
+
throw Error('Ambiguous profile producer');
|
|
39
|
+
}
|
|
40
|
+
owners.set(p.field, p.modelId);
|
|
41
|
+
}
|
|
42
|
+
const fields = [...new Set([...Object.keys(properties), ...owners.keys(),
|
|
43
|
+
...(Array.isArray(context.absenceWatchedFields) ? context.absenceWatchedFields : [])])].sort();
|
|
44
|
+
if (!fields.length || fields.length > 64 || fields.some(f => typeof f !== 'string' || !/^[a-zA-Z_][a-zA-Z0-9_]{0,127}$/.test(f) ||
|
|
45
|
+
['__proto__', 'prototype', 'constructor'].includes(f)))
|
|
46
|
+
throw Error('Unsupported profile fields');
|
|
47
|
+
// Cross-field schema rules cannot be split into independent questions.
|
|
48
|
+
const simple = Object.keys(schema).every(k => ['type', 'properties', 'required', 'additionalProperties', 'title', 'description', '$schema'].includes(k)) &&
|
|
49
|
+
(schema.required === undefined || Array.isArray(schema.required) && schema.required.every((f) => fields.includes(f)));
|
|
50
|
+
return { schema, properties, producers, owners, fields, simple };
|
|
51
|
+
}
|
|
52
|
+
/** Each lasso affects its own field. A full-frame question does not select the other fields. */
|
|
53
|
+
function planProfileReview(context, grouping) {
|
|
54
|
+
try {
|
|
55
|
+
if (!context)
|
|
56
|
+
return undefined;
|
|
57
|
+
const d = declarations(context), regions = new Set();
|
|
58
|
+
for (const r of Array.isArray(context.regions) ? context.regions : [])
|
|
59
|
+
if (Array.isArray(r) && typeof r[0] === 'string')
|
|
60
|
+
regions.add(r[0]);
|
|
61
|
+
const contextSha256 = (0, exports.reviewContextHash)(context);
|
|
62
|
+
const binding = grouping.version === 1 && grouping.mode === 'shadow' && grouping.contextSha256 === contextSha256;
|
|
63
|
+
const items = d.fields.map(field => {
|
|
64
|
+
const matches = grouping.scopes.filter(s => s.field === (regions.has(field) ? field : '*'));
|
|
65
|
+
const scope = matches.length === 1 ? matches[0] : undefined;
|
|
66
|
+
const selected = !binding || !d.simple || !scope || scope.select !== false;
|
|
67
|
+
const producer = d.owners.has(field) ? 'detector' : hasOwn(d.properties, field) ? 'vlm' : 'unresolved';
|
|
68
|
+
return { field, producer, selected: producer === 'unresolved' || selected,
|
|
69
|
+
reason: !binding ? 'context_mismatch' : !d.simple ? 'dependent_schema' : !scope ? 'missing_scope' : scope.reason,
|
|
70
|
+
...(!selected && scope ? { referenceSha256: scope.referenceSha256, referenceCapturedAtMs: scope.referenceCapturedAtMs } : {}) };
|
|
71
|
+
});
|
|
72
|
+
const work = { version: 1, mode: 'shadow', contextSha256, imageSha256: grouping.imageSha256, capturedAtMs: grouping.capturedAtMs, items };
|
|
73
|
+
promoteProfileDependencies(work);
|
|
74
|
+
return work;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return undefined;
|
|
78
|
+
} // The full existing review remains available.
|
|
79
|
+
}
|
|
80
|
+
function validateProfileWork(work, context, sha256, capturedAtMs) {
|
|
81
|
+
const d = declarations(context);
|
|
82
|
+
if (!work || work.version !== 1 || work.mode !== 'shadow' || work.contextSha256 !== (0, exports.reviewContextHash)(context) ||
|
|
83
|
+
work.imageSha256 !== sha256 || work.capturedAtMs !== capturedAtMs || !Array.isArray(work.items) ||
|
|
84
|
+
work.items.length !== d.fields.length || new Set(work.items.map(i => i.field)).size !== d.fields.length)
|
|
85
|
+
throw Error('Invalid profile work identity');
|
|
86
|
+
for (const item of work.items) {
|
|
87
|
+
const owner = d.owners.has(item.field) ? 'detector' : hasOwn(d.properties, item.field) ? 'vlm' : 'unresolved';
|
|
88
|
+
if (!d.fields.includes(item.field) || item.producer !== owner || typeof item.selected !== 'boolean' ||
|
|
89
|
+
typeof item.reason !== 'string' || (!d.simple && !item.selected))
|
|
90
|
+
throw Error('Invalid profile work partition');
|
|
91
|
+
}
|
|
92
|
+
const presence = work.items.filter(i => PRESENCE_DEPENDENCIES.has(i.field));
|
|
93
|
+
if (presence.some(i => i.selected) && presence.some(i => !i.selected))
|
|
94
|
+
throw Error('Incomplete presence dependency');
|
|
95
|
+
}
|
|
96
|
+
/** Runs due questions together using existing model adapters; it has no upload capability. */
|
|
97
|
+
async function reviewProfileBatch(input) {
|
|
98
|
+
const { context, work } = input, d = declarations(context);
|
|
99
|
+
if (!d.simple && Object.keys(d.properties).some(f => d.owners.has(f)))
|
|
100
|
+
throw Error('Dependent producer schema cannot be projected');
|
|
101
|
+
const sha256 = (0, crypto_1.createHash)('sha256').update(input.jpeg).digest('hex');
|
|
102
|
+
validateProfileWork(work, context, sha256, input.capturedAtMs);
|
|
103
|
+
if (!input.evidenceId || context.version !== 1 || typeof context.prompt !== 'string' ||
|
|
104
|
+
!Array.isArray(context.regions) || !Array.isArray(context.operatingPoints) || !Array.isArray(context.producerFields) ||
|
|
105
|
+
!Array.isArray(context.absenceWatchedFields))
|
|
106
|
+
throw Error('Incomplete retained profile');
|
|
107
|
+
const selected = work.items.filter(i => i.selected), vlm = selected.filter(i => i.producer === 'vlm').map(i => i.field);
|
|
108
|
+
const detector = selected.filter(i => i.producer === 'detector').map(i => i.field);
|
|
109
|
+
const structured = Object.create(null), resolved = new Set();
|
|
110
|
+
const modelCalls = { vlm: 0, producerBatches: 0 };
|
|
111
|
+
if (detector.length) {
|
|
112
|
+
modelCalls.producerBatches++;
|
|
113
|
+
const produced = await input.produce(d.producers.filter(p => detector.includes(p.field)));
|
|
114
|
+
for (const p of produced.produced) {
|
|
115
|
+
if (!detector.includes(p.field) || d.owners.get(p.field) !== p.modelId || resolved.has(p.field) ||
|
|
116
|
+
typeof p.value !== 'boolean' && !(typeof p.value === 'number' && Number.isFinite(p.value)))
|
|
117
|
+
throw Error('Invalid specialist result');
|
|
118
|
+
structured[p.field] = p.value;
|
|
119
|
+
resolved.add(p.field);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (vlm.length) {
|
|
123
|
+
modelCalls.vlm++;
|
|
124
|
+
const schema = d.simple ? { ...d.schema, properties: Object.fromEntries(vlm.map(f => [f, d.properties[f]])),
|
|
125
|
+
required: (d.schema.required ?? []).filter((f) => vlm.includes(f)) } : d.schema;
|
|
126
|
+
const prompt = context.prompt + '\nThis review batch asks only for these JSON fields: ' + vlm.join(', ') +
|
|
127
|
+
'. Other configured questions are unreviewed in this batch; do not answer or infer their state. Keep the original region and field definitions.';
|
|
128
|
+
const result = await input.analyze({ jpeg: input.jpeg, schema, prompt });
|
|
129
|
+
if (!result || typeof result !== 'object' || Array.isArray(result))
|
|
130
|
+
throw Error('Invalid model response');
|
|
131
|
+
for (const f of vlm) {
|
|
132
|
+
// The existing model provider validates its schema. Do not manufacture missing answers.
|
|
133
|
+
const value = result[f], spec = d.properties[f];
|
|
134
|
+
const typeOk = spec.type === undefined || spec.type === 'integer' && Number.isInteger(value) ||
|
|
135
|
+
spec.type === 'number' && typeof value === 'number' && Number.isFinite(value) ||
|
|
136
|
+
spec.type === 'array' && Array.isArray(value) || spec.type === 'object' && typeof value === 'object' && !Array.isArray(value) ||
|
|
137
|
+
['boolean', 'string'].includes(spec.type) && typeof value === spec.type;
|
|
138
|
+
if (hasOwn(result, f) && value !== undefined && value !== null && typeOk &&
|
|
139
|
+
(!Array.isArray(spec.enum) || spec.enum.includes(value))) {
|
|
140
|
+
structured[f] = value;
|
|
141
|
+
resolved.add(f);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return { version: 1, kind: 'profile_work_rehearsal', evidenceId: input.evidenceId, imageSha256: sha256,
|
|
146
|
+
contextSha256: work.contextSha256, capturedAtMs: input.capturedAtMs, reviewedAtMs: Date.now(),
|
|
147
|
+
selectedFields: selected.map(i => i.field), unreviewedFields: work.items.filter(i => !i.selected).map(i => i.field),
|
|
148
|
+
structured, unresolvedFields: selected.filter(i => !resolved.has(i.field)).map(i => i.field), modelCalls };
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=ProfileReviewWork.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProfileReviewWork.js","sourceRoot":"","sources":["../src/ProfileReviewWork.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Names/types/owners only: the complete profile never becomes a second VLM prompt. */
|
|
2
|
+
export type RetainedFieldContract = {
|
|
3
|
+
version: 1;
|
|
4
|
+
required: RequiredField[];
|
|
5
|
+
} | {
|
|
6
|
+
version: 1;
|
|
7
|
+
unavailable: string;
|
|
8
|
+
};
|
|
9
|
+
type RequiredField = {
|
|
10
|
+
field: string;
|
|
11
|
+
type: string;
|
|
12
|
+
modelId?: string;
|
|
13
|
+
};
|
|
14
|
+
/** Inspect the raw partition before sanitization can discard a requested check. */
|
|
15
|
+
export declare function captureFieldContract(raw: Record<string, any>): RetainedFieldContract | null;
|
|
16
|
+
/** Absent on old evidence; present malformed metadata must never become silence. */
|
|
17
|
+
export declare function readFieldContract(value: unknown): RequiredField[] | null;
|
|
18
|
+
/** Apply to fresh AND cached answers before any complete checkpoint or upload. */
|
|
19
|
+
export declare function assertCompleteFields(required: RequiredField[] | null, structured: Record<string, unknown>, producedBy: Record<string, string> | null): void;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=RetainedFieldContract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RetainedFieldContract.d.ts","sourceRoot":"","sources":["../src/RetainedFieldContract.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,MAAM,MAAM,qBAAqB,GAAG;IAAE,OAAO,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,aAAa,EAAE,CAAA;CAAE,GACzE;IAAE,OAAO,EAAE,CAAC,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AACxC,KAAK,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAOvE,mFAAmF;AACnF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,qBAAqB,GAAG,IAAI,CAoC3F;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,EAAE,GAAG,IAAI,CAiBxE;AAaD,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxG,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,IAAI,CAQjD"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.captureFieldContract = captureFieldContract;
|
|
4
|
+
exports.readFieldContract = readFieldContract;
|
|
5
|
+
exports.assertCompleteFields = assertCompleteFields;
|
|
6
|
+
const types = new Set(['hidden', 'counter', 'gauge', 'boolean', 'enum', 'category', 'list', 'distribution', 'string']);
|
|
7
|
+
const object = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
|
|
8
|
+
const name = (value) => typeof value === 'string' && !!value.trim() && value === value.trim();
|
|
9
|
+
const unavailable = (reason) => ({ version: 1, unavailable: reason });
|
|
10
|
+
/** Inspect the raw partition before sanitization can discard a requested check. */
|
|
11
|
+
function captureFieldContract(raw) {
|
|
12
|
+
// Older APIs have no ownership partition. Preserve their existing behavior.
|
|
13
|
+
if (raw.fieldRouting === undefined)
|
|
14
|
+
return null;
|
|
15
|
+
const routing = raw.fieldRouting;
|
|
16
|
+
if (!Array.isArray(raw.fields) || !object(routing)
|
|
17
|
+
|| !Array.isArray(routing.vlm) || !Array.isArray(routing.producer) || !Array.isArray(routing.withheld)) {
|
|
18
|
+
return unavailable('malformed field partition');
|
|
19
|
+
}
|
|
20
|
+
const requested = new Map();
|
|
21
|
+
for (const field of raw.fields) {
|
|
22
|
+
if (!object(field) || !name(field.field) || !types.has(field.type) || requested.has(field.field)) {
|
|
23
|
+
return unavailable('malformed or duplicate requested field');
|
|
24
|
+
}
|
|
25
|
+
requested.set(field.field, field.type);
|
|
26
|
+
}
|
|
27
|
+
if (routing.withheld.length) {
|
|
28
|
+
const fields = routing.withheld.map((entry) => object(entry) && name(entry.field) ? entry.field : '<malformed>');
|
|
29
|
+
return unavailable('withheld fields: ' + fields.join(', '));
|
|
30
|
+
}
|
|
31
|
+
const seen = new Set();
|
|
32
|
+
const required = [];
|
|
33
|
+
for (const [owner, entries] of [['vlm', routing.vlm], ['producer', routing.producer]]) {
|
|
34
|
+
for (const field of entries) {
|
|
35
|
+
if (!object(field) || !name(field.field) || !types.has(field.type)
|
|
36
|
+
|| requested.get(field.field) !== field.type || seen.has(field.field)
|
|
37
|
+
|| owner === 'producer' && !name(field.modelId)) {
|
|
38
|
+
return unavailable('malformed or ambiguous field ownership');
|
|
39
|
+
}
|
|
40
|
+
seen.add(field.field);
|
|
41
|
+
// Hidden fields are internal and intentionally have no model answer.
|
|
42
|
+
if (field.type !== 'hidden')
|
|
43
|
+
required.push({ field: field.field, type: field.type,
|
|
44
|
+
...(owner === 'producer' ? { modelId: field.modelId } : {}) });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const missing = [...requested.keys()].filter(field => !seen.has(field));
|
|
48
|
+
return missing.length ? unavailable('unrouted fields: ' + missing.join(', ')) : { version: 1, required };
|
|
49
|
+
}
|
|
50
|
+
/** Absent on old evidence; present malformed metadata must never become silence. */
|
|
51
|
+
function readFieldContract(value) {
|
|
52
|
+
if (value === undefined)
|
|
53
|
+
return null;
|
|
54
|
+
if (!object(value) || value.version !== 1 || Object.keys(value).length !== 2
|
|
55
|
+
|| !Array.isArray(value.required)) {
|
|
56
|
+
const reason = object(value) && typeof value.unavailable === 'string' ? value.unavailable : 'malformed saved field contract';
|
|
57
|
+
throw Error('Retained profile unavailable; evidence retained: ' + reason);
|
|
58
|
+
}
|
|
59
|
+
const seen = new Set();
|
|
60
|
+
for (const field of value.required) {
|
|
61
|
+
if (!object(field) || !name(field.field) || !types.has(field.type) || field.type === 'hidden'
|
|
62
|
+
|| seen.has(field.field) || Object.keys(field).some(key => !['field', 'type', 'modelId'].includes(key))
|
|
63
|
+
|| field.modelId !== undefined && !name(field.modelId)) {
|
|
64
|
+
throw Error('Retained profile unavailable; malformed saved field contract');
|
|
65
|
+
}
|
|
66
|
+
seen.add(field.field);
|
|
67
|
+
}
|
|
68
|
+
return value.required;
|
|
69
|
+
}
|
|
70
|
+
function hasType(value, type) {
|
|
71
|
+
switch (type) {
|
|
72
|
+
case 'boolean': return typeof value === 'boolean';
|
|
73
|
+
case 'counter': return Number.isSafeInteger(value);
|
|
74
|
+
case 'gauge': return typeof value === 'number' && Number.isFinite(value);
|
|
75
|
+
case 'list': return Array.isArray(value) && value.every(item => typeof item === 'string');
|
|
76
|
+
case 'distribution': return object(value) && Object.values(value).every(item => typeof item === 'number' && Number.isFinite(item));
|
|
77
|
+
default: return typeof value === 'string';
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/** Apply to fresh AND cached answers before any complete checkpoint or upload. */
|
|
81
|
+
function assertCompleteFields(required, structured, producedBy) {
|
|
82
|
+
if (!required)
|
|
83
|
+
return;
|
|
84
|
+
const missing = required.filter(field => !Object.prototype.hasOwnProperty.call(structured, field.field)
|
|
85
|
+
|| !hasType(structured[field.field], field.type)
|
|
86
|
+
|| field.modelId !== undefined && (!producedBy || !Object.prototype.hasOwnProperty.call(producedBy, field.field)
|
|
87
|
+
|| producedBy[field.field] !== field.modelId));
|
|
88
|
+
if (missing.length)
|
|
89
|
+
throw Error('Incomplete retained review; evidence retained for missing or invalid fields: '
|
|
90
|
+
+ missing.map(field => field.field).join(', '));
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=RetainedFieldContract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RetainedFieldContract.js","sourceRoot":"","sources":["../src/RetainedFieldContract.ts"],"names":[],"mappings":";;AAWA,oDAoCC;AAGD,8CAiBC;AAcD,oDASC;AAtFD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;AACvH,MAAM,MAAM,GAAG,CAAC,KAAc,EAAgC,EAAE,CAC9D,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAChE,MAAM,IAAI,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;AACxH,MAAM,WAAW,GAAG,CAAC,MAAc,EAAyB,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;AAErG,mFAAmF;AACnF,SAAgB,oBAAoB,CAAC,GAAwB;IAC3D,4EAA4E;IAC5E,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAChD,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC;IACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;WAC7C,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzG,OAAO,WAAW,CAAC,2BAA2B,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACjG,OAAO,WAAW,CAAC,wCAAwC,CAAC,CAAC;QAC/D,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QAC1H,OAAO,WAAW,CAAC,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAU,EAAE,CAAC;QAC/F,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;mBAC7D,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;mBAClE,KAAK,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClD,OAAO,WAAW,CAAC,wCAAwC,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACtB,qEAAqE;YACrE,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI;oBAC/E,GAAG,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;AAC3G,CAAC;AAED,oFAAoF;AACpF,SAAgB,iBAAiB,CAAC,KAAc;IAC9C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;WACvE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,gCAAgC,CAAC;QAC7H,MAAM,KAAK,CAAC,mDAAmD,GAAG,MAAM,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;eACxF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;eACpG,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACzD,MAAM,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,KAAK,CAAC,QAAQ,CAAC;AACxB,CAAC;AAED,SAAS,OAAO,CAAC,KAAc,EAAE,IAAY;IAC3C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS,CAAC,CAAC,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC;QAClD,KAAK,SAAS,CAAC,CAAC,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACnD,KAAK,OAAO,CAAC,CAAC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzE,KAAK,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;QAC1F,KAAK,cAAc,CAAC,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACnI,OAAO,CAAC,CAAC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,SAAgB,oBAAoB,CAAC,QAAgC,EAAE,UAAmC,EACxG,UAAyC;IACzC,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC;WAClG,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC;WAC7C,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC;eAC3G,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACnD,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,KAAK,CAAC,+EAA+E;cAC3G,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type ReviewModelUse = 'detector' | 'vlm' | 'both';
|
|
2
|
+
/** Conservative admission for LocalSensingClient's captured execution branches.
|
|
3
|
+
* Missing/invalid/legacy or mixed contracts reserve both models. Execution still
|
|
4
|
+
* validates the complete contract; admission must never supply a fallback answer.
|
|
5
|
+
*/
|
|
6
|
+
export declare function retainedReviewModelUse(context: Record<string, any> | undefined): ReviewModelUse;
|
|
7
|
+
//# sourceMappingURL=ReviewModelUse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReviewModelUse.d.ts","sourceRoot":"","sources":["../src/ReviewModelUse.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,KAAK,GAAG,MAAM,CAAC;AAEzD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,GAAG,cAAc,CAc/F"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.retainedReviewModelUse = retainedReviewModelUse;
|
|
4
|
+
const RuntimeModelSelection_1 = require("./RuntimeModelSelection");
|
|
5
|
+
const detectorCountReview_1 = require("./detectorCountReview");
|
|
6
|
+
/** Conservative admission for LocalSensingClient's captured execution branches.
|
|
7
|
+
* Missing/invalid/legacy or mixed contracts reserve both models. Execution still
|
|
8
|
+
* validates the complete contract; admission must never supply a fallback answer.
|
|
9
|
+
*/
|
|
10
|
+
function retainedReviewModelUse(context) {
|
|
11
|
+
try {
|
|
12
|
+
if (!context || context.version !== 1 || !Array.isArray(context.producerFields)
|
|
13
|
+
|| !Array.isArray(context.regions))
|
|
14
|
+
return 'both';
|
|
15
|
+
const selection = (0, RuntimeModelSelection_1.retainedModelSelection)(context);
|
|
16
|
+
if (!selection || selection.models.length !== 1)
|
|
17
|
+
return 'both';
|
|
18
|
+
const model = selection.models[0];
|
|
19
|
+
if (context.detectorCounts === true && context.scopedVlmReview === undefined
|
|
20
|
+
&& model.format === 'onnx' && model.modelId === 'rfdetr_medium'
|
|
21
|
+
&& (0, detectorCountReview_1.isPersonCountContract)(context.producerFields, new Map(context.regions)))
|
|
22
|
+
return 'detector';
|
|
23
|
+
if (context.detectorCounts === undefined && !context.producerFields.length
|
|
24
|
+
&& !context.scopedVlmReview?.personCounts && model.format === 'litert-lm')
|
|
25
|
+
return 'vlm';
|
|
26
|
+
}
|
|
27
|
+
catch { /* The normal review path reports invalid evidence; reserve both. */ }
|
|
28
|
+
return 'both';
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=ReviewModelUse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReviewModelUse.js","sourceRoot":"","sources":["../src/ReviewModelUse.ts"],"names":[],"mappings":";;AASA,wDAcC;AAvBD,mEAAiE;AACjE,+DAA8D;AAI9D;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,OAAwC;IAC7E,IAAI,CAAC;QACH,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC;eAC1E,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,OAAO,MAAM,CAAC;QACpD,MAAM,SAAS,GAAG,IAAA,8CAAsB,EAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QAC/D,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,OAAO,CAAC,cAAc,KAAK,IAAI,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS;eACvE,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,eAAe;eAC5D,IAAA,2CAAqB,EAAC,OAAO,CAAC,cAAc,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAAE,OAAO,UAAU,CAAC;QAChG,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM;eACrE,CAAC,OAAO,CAAC,eAAe,EAAE,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;IAC5F,CAAC;IAAC,MAAM,CAAC,CAAC,oEAAoE,CAAC,CAAC;IAChF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Explicit local test policy. Names and model answers never imply urgency. */
|
|
2
|
+
export type ReviewPriority = 'urgent' | 'high' | 'normal';
|
|
3
|
+
export type ReviewPolicy = import('@trillboards/edge-core').WireConnectorReviewPolicy;
|
|
4
|
+
/** Missing is legacy/unconfigured. Present malformed metadata stays a named failure. */
|
|
5
|
+
export declare function parseReviewPolicy(value: unknown): ReviewPolicy | null;
|
|
6
|
+
export declare function isReviewPriority(value: unknown): value is ReviewPriority;
|
|
7
|
+
export declare function reviewPriorityRank(value: unknown): number;
|
|
8
|
+
/** Snapshot configuration so caller mutations cannot reprioritize saved work. */
|
|
9
|
+
export declare function freezeReviewPriorities(input: Readonly<Record<string, ReviewPriority>> | undefined, feeds: readonly string[], enabled: boolean): ReadonlyMap<string, ReviewPriority> | null;
|
|
10
|
+
/** Four preference turns, then one ordinary fair-camera turn. No timer hold. */
|
|
11
|
+
export declare const PRIORITY_BURST = 4;
|
|
12
|
+
//# sourceMappingURL=ReviewPriority.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReviewPriority.d.ts","sourceRoot":"","sources":["../src/ReviewPriority.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,OAAO,wBAAwB,EAAE,yBAAyB,CAAC;AAEtF,wFAAwF;AACxF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAQrE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAExE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGzD;AAED,iFAAiF;AACjF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,GAAG,SAAS,EAChG,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,IAAI,CAaxF;AAED,gFAAgF;AAChF,eAAO,MAAM,cAAc,IAAI,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PRIORITY_BURST = void 0;
|
|
4
|
+
exports.parseReviewPolicy = parseReviewPolicy;
|
|
5
|
+
exports.isReviewPriority = isReviewPriority;
|
|
6
|
+
exports.reviewPriorityRank = reviewPriorityRank;
|
|
7
|
+
exports.freezeReviewPriorities = freezeReviewPriorities;
|
|
8
|
+
/** Missing is legacy/unconfigured. Present malformed metadata stays a named failure. */
|
|
9
|
+
function parseReviewPolicy(value) {
|
|
10
|
+
if (value === undefined || value === null)
|
|
11
|
+
return null;
|
|
12
|
+
if (typeof value === 'object' && !Array.isArray(value)) {
|
|
13
|
+
const policy = value;
|
|
14
|
+
if (policy.version === 1 && isReviewPriority(policy.priority)
|
|
15
|
+
&& Object.keys(policy).length === 2)
|
|
16
|
+
return { version: 1, priority: policy.priority };
|
|
17
|
+
}
|
|
18
|
+
return { version: 1, invalid: true };
|
|
19
|
+
}
|
|
20
|
+
function isReviewPriority(value) {
|
|
21
|
+
return value === 'urgent' || value === 'high' || value === 'normal';
|
|
22
|
+
}
|
|
23
|
+
function reviewPriorityRank(value) {
|
|
24
|
+
// Old or damaged optional scheduling metadata must not delete evidence.
|
|
25
|
+
return value === 'urgent' ? 2 : value === 'high' ? 1 : 0;
|
|
26
|
+
}
|
|
27
|
+
/** Snapshot configuration so caller mutations cannot reprioritize saved work. */
|
|
28
|
+
function freezeReviewPriorities(input, feeds, enabled) {
|
|
29
|
+
if (input === undefined)
|
|
30
|
+
return null;
|
|
31
|
+
if (!enabled || !input || typeof input !== 'object' || Array.isArray(input)) {
|
|
32
|
+
throw Error('Review priority requires an explicit continuous-review feed policy');
|
|
33
|
+
}
|
|
34
|
+
const result = new Map();
|
|
35
|
+
for (const [name, priority] of Object.entries(input)) {
|
|
36
|
+
if (!feeds.includes(name) || !isReviewPriority(priority)) {
|
|
37
|
+
throw Error('Review priority contains an unknown feed or invalid priority');
|
|
38
|
+
}
|
|
39
|
+
result.set(name, priority);
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
/** Four preference turns, then one ordinary fair-camera turn. No timer hold. */
|
|
44
|
+
exports.PRIORITY_BURST = 4;
|
|
45
|
+
//# sourceMappingURL=ReviewPriority.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReviewPriority.js","sourceRoot":"","sources":["../src/ReviewPriority.ts"],"names":[],"mappings":";;;AAKA,8CAQC;AAED,4CAEC;AAED,gDAGC;AAGD,wDAcC;AAnCD,wFAAwF;AACxF,SAAgB,iBAAiB,CAAC,KAAc;IAC9C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC;eACxD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC1F,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,SAAgB,gBAAgB,CAAC,KAAc;IAC7C,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ,CAAC;AACtE,CAAC;AAED,SAAgB,kBAAkB,CAAC,KAAc;IAC/C,wEAAwE;IACxE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,iFAAiF;AACjF,SAAgB,sBAAsB,CAAC,KAA2D,EAChG,KAAwB,EAAE,OAAgB;IAC1C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5E,MAAM,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzD,MAAM,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gFAAgF;AACnE,QAAA,cAAc,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { WireConnectorModelSelection } from '@trillboards/edge-core';
|
|
2
|
+
export type ModelSelection = Exclude<WireConnectorModelSelection, {
|
|
3
|
+
invalid: true;
|
|
4
|
+
}>;
|
|
5
|
+
export type ModelPin = ModelSelection['models'][number];
|
|
6
|
+
export declare function parseModelSelection(value: unknown, allowImageClassifier?: boolean, allowRfDetrSource?: boolean): WireConnectorModelSelection | null;
|
|
7
|
+
export declare function retainedModelSelection(context: Record<string, any> | undefined, allowImageClassifier?: boolean, allowRfDetrSource?: boolean): ModelSelection | null;
|
|
8
|
+
/** Runtime-generated metadata, outside model text. Missing proof is never success. */
|
|
9
|
+
export declare function assertVlmRuntimeProof(value: any, pin: ModelPin, requestedModel: string): void;
|
|
10
|
+
//# sourceMappingURL=RuntimeModelSelection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimeModelSelection.d.ts","sourceRoot":"","sources":["../src/RuntimeModelSelection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAC1E,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,2BAA2B,EAAE;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,CAAC,CAAC;AACrF,MAAM,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAMxD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,oBAAoB,UAAQ,EAAE,iBAAiB,UAAQ,GAAG,2BAA2B,GAAG,IAAI,CAiB/I;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EAAE,oBAAoB,UAAQ,EAAE,iBAAiB,UAAQ,GAAG,cAAc,GAAG,IAAI,CAY/J;AAED,sFAAsF;AACtF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAU7F"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseModelSelection = parseModelSelection;
|
|
4
|
+
exports.retainedModelSelection = retainedModelSelection;
|
|
5
|
+
exports.assertVlmRuntimeProof = assertVlmRuntimeProof;
|
|
6
|
+
const record = (v) => v && typeof v === 'object' && !Array.isArray(v);
|
|
7
|
+
const key = (v) => typeof v === 'string' && /^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,127}$/.test(v);
|
|
8
|
+
const keys = (v, expected) => record(v) && Object.keys(v).length === expected.length
|
|
9
|
+
&& expected.every(k => Object.prototype.hasOwnProperty.call(v, k));
|
|
10
|
+
function parseModelSelection(value, allowImageClassifier = false, allowRfDetrSource = false) {
|
|
11
|
+
if (value === undefined || value === null)
|
|
12
|
+
return null;
|
|
13
|
+
const v = value;
|
|
14
|
+
if (keys(v, ['version', 'selectionId', 'models', 'fieldOwners']) && v.version === 1 && key(v.selectionId)
|
|
15
|
+
&& Array.isArray(v.models) && v.models.length >= 1 && v.models.length <= 16
|
|
16
|
+
&& Array.isArray(v.fieldOwners) && v.fieldOwners.length >= 1 && v.fieldOwners.length <= 128
|
|
17
|
+
&& v.models.every((m) => keys(m, ['modelId', 'format', 'sha256']) && key(m.modelId)
|
|
18
|
+
&& (['onnx', 'litert-lm'].includes(m.format) || allowImageClassifier && m.format === 'tflite-image-classifier'
|
|
19
|
+
|| allowRfDetrSource && m.format === 'safetensors-rfdetr')
|
|
20
|
+
&& typeof m.sha256 === 'string' && /^[a-f0-9]{64}$/.test(m.sha256))
|
|
21
|
+
&& v.fieldOwners.every((f) => keys(f, ['field', 'modelId']) && key(f.field) && key(f.modelId))
|
|
22
|
+
&& new Set(v.models.map((m) => m.modelId)).size === v.models.length
|
|
23
|
+
&& new Set(v.fieldOwners.map((f) => f.field)).size === v.fieldOwners.length
|
|
24
|
+
&& v.fieldOwners.every((f) => v.models.some((m) => m.modelId === f.modelId))
|
|
25
|
+
&& v.models.every((m) => v.fieldOwners.some((f) => f.modelId === m.modelId))
|
|
26
|
+
&& v.models.filter((m) => m.format === 'litert-lm').length <= 1)
|
|
27
|
+
return JSON.parse(JSON.stringify(v));
|
|
28
|
+
return { version: 1, invalid: true };
|
|
29
|
+
}
|
|
30
|
+
function retainedModelSelection(context, allowImageClassifier = false, allowRfDetrSource = false) {
|
|
31
|
+
if (!context || context.modelSelection === undefined)
|
|
32
|
+
return null;
|
|
33
|
+
const selection = parseModelSelection(context.modelSelection, allowImageClassifier, allowRfDetrSource);
|
|
34
|
+
if (!selection || 'invalid' in selection)
|
|
35
|
+
throw Error('Invalid retained model selection; evidence retained');
|
|
36
|
+
const required = context.retainedFieldContract?.required;
|
|
37
|
+
if (!Array.isArray(required) || required.length !== selection.fieldOwners.length
|
|
38
|
+
|| selection.fieldOwners.some(owner => {
|
|
39
|
+
const field = required.find((f) => f.field === owner.field);
|
|
40
|
+
const model = selection.models.find(m => m.modelId === owner.modelId);
|
|
41
|
+
return !field || (model.format !== 'litert-lm' ? field.modelId !== owner.modelId : field.modelId !== undefined);
|
|
42
|
+
}))
|
|
43
|
+
throw Error('Retained model selection does not match captured field ownership');
|
|
44
|
+
return selection;
|
|
45
|
+
}
|
|
46
|
+
/** Runtime-generated metadata, outside model text. Missing proof is never success. */
|
|
47
|
+
function assertVlmRuntimeProof(value, pin, requestedModel) {
|
|
48
|
+
// The stock CLI spells a default CPU engine explicitly in its load proof,
|
|
49
|
+
// even though the request uses the bare model alias. This is the same CPU
|
|
50
|
+
// request, not permission to demote a selected GPU request or change weights.
|
|
51
|
+
const matchingRuntime = value?.runtimeModelId === requestedModel
|
|
52
|
+
|| !requestedModel.includes(',') && value?.runtimeModelId === `${requestedModel},cpu`;
|
|
53
|
+
if (!keys(value, ['version', 'sha256', 'format', 'runtimeModelId']) || value.version !== 1
|
|
54
|
+
|| value.sha256 !== pin.sha256 || value.format !== 'litert-lm' || !matchingRuntime) {
|
|
55
|
+
throw Error('Model verification failed: LiteRT-LM did not execute the selected artifact');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=RuntimeModelSelection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimeModelSelection.js","sourceRoot":"","sources":["../src/RuntimeModelSelection.ts"],"names":[],"mappings":"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"}
|
|
@@ -334,7 +334,7 @@ export declare class MotionGate {
|
|
|
334
334
|
* heartbeat first (proof-of-life outranks everything), then the motion
|
|
335
335
|
* verdict, then the suppressions that make a busy-but-boring scene cheap.
|
|
336
336
|
*/
|
|
337
|
-
evaluate(jpeg: Buffer, nowMs?: number): Promise<MotionGateResult>;
|
|
337
|
+
evaluate(jpeg: Buffer, nowMs?: number, forEvidence?: boolean, observeDecoded?: (frame: GreyFrame, result: MotionDetectResult) => void): Promise<MotionGateResult>;
|
|
338
338
|
/**
|
|
339
339
|
* Confirm the frame really reached the model. Called by the manager only
|
|
340
340
|
* after `analyze()` resolves, so a frame the admission gate, the candidate
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneChangeDetector.d.ts","sourceRoot":"","sources":["../src/SceneChangeDetector.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"SceneChangeDetector.d.ts","sourceRoot":"","sources":["../src/SceneChangeDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -390,7 +390,7 @@ class MotionGate {
|
|
|
390
390
|
* heartbeat first (proof-of-life outranks everything), then the motion
|
|
391
391
|
* verdict, then the suppressions that make a busy-but-boring scene cheap.
|
|
392
392
|
*/
|
|
393
|
-
async evaluate(jpeg, nowMs) {
|
|
393
|
+
async evaluate(jpeg, nowMs, forEvidence = false, observeDecoded) {
|
|
394
394
|
const now = nowMs ?? this.now();
|
|
395
395
|
this.evaluated++;
|
|
396
396
|
const heartbeatDue = this.lastAnalyzedAtMs === null || now - this.lastAnalyzedAtMs >= this.heartbeatIntervalMs;
|
|
@@ -407,7 +407,17 @@ class MotionGate {
|
|
|
407
407
|
return this.decide(true, 'undecodable', false, 0, [], null);
|
|
408
408
|
}
|
|
409
409
|
const result = this.detector.detect(grey);
|
|
410
|
+
// Reuse the raw decoded image for local selection experiments. The caller
|
|
411
|
+
// must not mutate it; no second JPEG decode is needed.
|
|
412
|
+
observeDecoded?.(grey, result);
|
|
410
413
|
const live = result.motion && !result.calibrating;
|
|
414
|
+
// Preserve an audio event even while a heartbeat sample awaits the model.
|
|
415
|
+
if (forEvidence && this.pendingAudioOnsetAtMs !== null) {
|
|
416
|
+
const valid = now - this.pendingAudioOnsetAtMs <= this.audioOnsetTtlMs;
|
|
417
|
+
this.pendingAudioOnsetAtMs = null;
|
|
418
|
+
if (valid)
|
|
419
|
+
return this.decide(true, 'audio_onset', live, result.pctMotion, result.boxes, result.signature);
|
|
420
|
+
}
|
|
411
421
|
if (heartbeatDue) {
|
|
412
422
|
return this.decide(true, 'heartbeat', live, result.pctMotion, result.boxes, result.signature);
|
|
413
423
|
}
|
|
@@ -416,7 +426,7 @@ class MotionGate {
|
|
|
416
426
|
// camera has nothing to show for. It does NOT outrank the rate limit: the
|
|
417
427
|
// inference budget is still the budget, and an un-consumed onset simply
|
|
418
428
|
// stays pending and carries the NEXT look instead of being spent here.
|
|
419
|
-
const rateLimited = this.isRateLimited(now);
|
|
429
|
+
const rateLimited = !forEvidence && this.isRateLimited(now);
|
|
420
430
|
if (this.pendingAudioOnsetAtMs !== null) {
|
|
421
431
|
if (now - this.pendingAudioOnsetAtMs > this.audioOnsetTtlMs) {
|
|
422
432
|
// Stale: drop it rather than let it fire against a scene it never saw.
|
|
@@ -431,10 +441,12 @@ class MotionGate {
|
|
|
431
441
|
return this.decide(false, 'no_motion', false, result.pctMotion, result.boxes, result.signature);
|
|
432
442
|
}
|
|
433
443
|
if (result.calibrating) {
|
|
434
|
-
//
|
|
435
|
-
|
|
444
|
+
// Calibration can hide a real brief action as well as a lighting change.
|
|
445
|
+
// Continuous LOOK retains the evidence; the shared pump still limits AI.
|
|
446
|
+
// Legacy direct inference keeps its existing calibration suppression.
|
|
447
|
+
return this.decide(forEvidence, 'calibrating', false, result.pctMotion, result.boxes, result.signature);
|
|
436
448
|
}
|
|
437
|
-
if (this.stationaryReanalyzeAfterMs > 0 &&
|
|
449
|
+
if (!forEvidence && this.stationaryReanalyzeAfterMs > 0 &&
|
|
438
450
|
this.lastAnalyzedSignature !== null &&
|
|
439
451
|
result.signature === this.lastAnalyzedSignature) {
|
|
440
452
|
// Measured from the LAST LANDED ANALYSIS, which is exactly what the frame
|
|
@@ -450,7 +462,7 @@ class MotionGate {
|
|
|
450
462
|
return this.decide(false, 'stationary', live, result.pctMotion, result.boxes, result.signature);
|
|
451
463
|
}
|
|
452
464
|
}
|
|
453
|
-
if (this.isRateLimited(now)) {
|
|
465
|
+
if (!forEvidence && this.isRateLimited(now)) {
|
|
454
466
|
return this.decide(false, 'rate_limited', live, result.pctMotion, result.boxes, result.signature);
|
|
455
467
|
}
|
|
456
468
|
return this.decide(true, 'motion', live, result.pctMotion, result.boxes, result.signature);
|