@trillboards/edge-sdk 0.2.140 → 0.2.151

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.
Files changed (188) hide show
  1. package/README.md +2 -2
  2. package/deploy/detector/pyproject.toml +20 -2
  3. package/deploy/detector/tests/test_execution.py +149 -0
  4. package/deploy/detector/tests/test_model_identity.py +80 -0
  5. package/deploy/detector/tests/test_registry.py +18 -0
  6. package/deploy/detector/tests/test_server.py +3 -1
  7. package/deploy/detector/tests/test_version_stamp.py +4 -1
  8. package/deploy/detector/trillboards_detector/_version.py +2 -2
  9. package/deploy/detector/trillboards_detector/cli.py +3 -0
  10. package/deploy/detector/trillboards_detector/detections.py +7 -0
  11. package/deploy/detector/trillboards_detector/errors.py +4 -0
  12. package/deploy/detector/trillboards_detector/execution.py +110 -0
  13. package/deploy/detector/trillboards_detector/loader.py +6 -3
  14. package/deploy/detector/trillboards_detector/registry.py +27 -5
  15. package/deploy/detector/trillboards_detector/server.py +29 -2
  16. package/deploy/detector/trillboards_detector/session.py +15 -3
  17. package/deploy/litertlm/test_trillboards_litertlm_shim.py +81 -0
  18. package/deploy/litertlm/test_verify_model_proof.py +30 -0
  19. package/deploy/litertlm/trillboards_litertlm_shim.py +150 -1
  20. package/deploy/litertlm/verify_model_proof.py +30 -0
  21. package/deploy/macos/build-macos-pkg.sh +10 -10
  22. package/deploy/macos/scripts/setup-detector.sh +2 -2
  23. package/deploy/macos/scripts/setup-litertlm.sh +66 -30
  24. package/deploy/macos/test-setup-litertlm-reinstall.sh +57 -4
  25. package/deploy/systemd/setup-detector.sh +2 -2
  26. package/deploy/systemd/setup-litertlm.sh +51 -27
  27. package/deploy/windows/build-windows.ps1 +10 -6
  28. package/deploy/windows/bundle-windows-installer.ps1 +3 -3
  29. package/deploy/windows/e2e/test-local-sense.ps1 +6 -5
  30. package/deploy/windows/install-update.ps1 +59 -14
  31. package/deploy/windows/set-executable-icon.ps1 +24 -5
  32. package/deploy/windows/setup-detector.ps1 +142 -4
  33. package/deploy/windows/setup-litertlm.ps1 +53 -10
  34. package/dist/AudienceAnalyzeClient.d.ts +10 -0
  35. package/dist/AudienceAnalyzeClient.d.ts.map +1 -1
  36. package/dist/AudienceAnalyzeClient.js +5 -4
  37. package/dist/AudienceAnalyzeClient.js.map +1 -1
  38. package/dist/CloudSensingManager.d.ts +38 -1
  39. package/dist/CloudSensingManager.d.ts.map +1 -1
  40. package/dist/CloudSensingManager.js +403 -25
  41. package/dist/CloudSensingManager.js.map +1 -1
  42. package/dist/DetectorFieldProducer.d.ts +5 -1
  43. package/dist/DetectorFieldProducer.d.ts.map +1 -1
  44. package/dist/DetectorFieldProducer.js +8 -1
  45. package/dist/DetectorFieldProducer.js.map +1 -1
  46. package/dist/DurableVlmCandidateSpool.d.ts +83 -2
  47. package/dist/DurableVlmCandidateSpool.d.ts.map +1 -1
  48. package/dist/DurableVlmCandidateSpool.js +596 -30
  49. package/dist/DurableVlmCandidateSpool.js.map +1 -1
  50. package/dist/EdgeAgent.js +1 -1
  51. package/dist/FrameGroupingShadow.d.ts +51 -0
  52. package/dist/FrameGroupingShadow.d.ts.map +1 -0
  53. package/dist/FrameGroupingShadow.js +158 -0
  54. package/dist/FrameGroupingShadow.js.map +1 -0
  55. package/dist/ImageClassifierFieldProducer.d.ts +36 -0
  56. package/dist/ImageClassifierFieldProducer.d.ts.map +1 -0
  57. package/dist/ImageClassifierFieldProducer.js +150 -0
  58. package/dist/ImageClassifierFieldProducer.js.map +1 -0
  59. package/dist/LiteRtVlmProvider.d.ts +5 -0
  60. package/dist/LiteRtVlmProvider.d.ts.map +1 -1
  61. package/dist/LiteRtVlmProvider.js +72 -7
  62. package/dist/LiteRtVlmProvider.js.map +1 -1
  63. package/dist/LocalDetectorClient.d.ts +6 -0
  64. package/dist/LocalDetectorClient.d.ts.map +1 -1
  65. package/dist/LocalDetectorClient.js +8 -0
  66. package/dist/LocalDetectorClient.js.map +1 -1
  67. package/dist/OrderedFrameReview.d.ts +57 -0
  68. package/dist/OrderedFrameReview.d.ts.map +1 -0
  69. package/dist/OrderedFrameReview.js +121 -0
  70. package/dist/OrderedFrameReview.js.map +1 -0
  71. package/dist/OrderedReviewClient.d.ts +38 -0
  72. package/dist/OrderedReviewClient.d.ts.map +1 -0
  73. package/dist/OrderedReviewClient.js +121 -0
  74. package/dist/OrderedReviewClient.js.map +1 -0
  75. package/dist/OrderedSequenceStore.d.ts +69 -0
  76. package/dist/OrderedSequenceStore.d.ts.map +1 -0
  77. package/dist/OrderedSequenceStore.js +257 -0
  78. package/dist/OrderedSequenceStore.js.map +1 -0
  79. package/dist/ProfileReviewWork.d.ts +68 -0
  80. package/dist/ProfileReviewWork.d.ts.map +1 -0
  81. package/dist/ProfileReviewWork.js +150 -0
  82. package/dist/ProfileReviewWork.js.map +1 -0
  83. package/dist/RetainedFieldContract.d.ts +21 -0
  84. package/dist/RetainedFieldContract.d.ts.map +1 -0
  85. package/dist/RetainedFieldContract.js +92 -0
  86. package/dist/RetainedFieldContract.js.map +1 -0
  87. package/dist/ReviewModelUse.d.ts +7 -0
  88. package/dist/ReviewModelUse.d.ts.map +1 -0
  89. package/dist/ReviewModelUse.js +30 -0
  90. package/dist/ReviewModelUse.js.map +1 -0
  91. package/dist/ReviewPriority.d.ts +12 -0
  92. package/dist/ReviewPriority.d.ts.map +1 -0
  93. package/dist/ReviewPriority.js +45 -0
  94. package/dist/ReviewPriority.js.map +1 -0
  95. package/dist/RuntimeModelSelection.d.ts +10 -0
  96. package/dist/RuntimeModelSelection.d.ts.map +1 -0
  97. package/dist/RuntimeModelSelection.js +58 -0
  98. package/dist/RuntimeModelSelection.js.map +1 -0
  99. package/dist/SceneChangeDetector.d.ts +1 -1
  100. package/dist/SceneChangeDetector.d.ts.map +1 -1
  101. package/dist/SceneChangeDetector.js +18 -6
  102. package/dist/SceneChangeDetector.js.map +1 -1
  103. package/dist/ScopedVlmReview.d.ts +76 -0
  104. package/dist/ScopedVlmReview.d.ts.map +1 -0
  105. package/dist/ScopedVlmReview.js +267 -0
  106. package/dist/ScopedVlmReview.js.map +1 -0
  107. package/dist/SensingProfileClient.d.ts +50 -0
  108. package/dist/SensingProfileClient.d.ts.map +1 -1
  109. package/dist/SensingProfileClient.js +58 -2
  110. package/dist/SensingProfileClient.js.map +1 -1
  111. package/dist/TemporalReviewClient.d.ts +43 -0
  112. package/dist/TemporalReviewClient.d.ts.map +1 -0
  113. package/dist/TemporalReviewClient.js +117 -0
  114. package/dist/TemporalReviewClient.js.map +1 -0
  115. package/dist/TemporalReviewJournal.d.ts +91 -0
  116. package/dist/TemporalReviewJournal.d.ts.map +1 -0
  117. package/dist/TemporalReviewJournal.js +337 -0
  118. package/dist/TemporalReviewJournal.js.map +1 -0
  119. package/dist/UrgentReviewTriage.d.ts +35 -0
  120. package/dist/UrgentReviewTriage.d.ts.map +1 -0
  121. package/dist/UrgentReviewTriage.js +52 -0
  122. package/dist/UrgentReviewTriage.js.map +1 -0
  123. package/dist/VideoSegmentUploader.d.ts +293 -0
  124. package/dist/VideoSegmentUploader.d.ts.map +1 -0
  125. package/dist/VideoSegmentUploader.js +1002 -0
  126. package/dist/VideoSegmentUploader.js.map +1 -0
  127. package/dist/VlmCandidateBuffer.d.ts +19 -0
  128. package/dist/VlmCandidateBuffer.d.ts.map +1 -1
  129. package/dist/VlmCandidateBuffer.js.map +1 -1
  130. package/dist/autoSense.d.ts +2 -2
  131. package/dist/autoSense.d.ts.map +1 -1
  132. package/dist/autoSense.js +16 -11
  133. package/dist/autoSense.js.map +1 -1
  134. package/dist/cli.js +1 -1
  135. package/dist/cli.js.map +1 -1
  136. package/dist/config.d.ts +2 -0
  137. package/dist/config.d.ts.map +1 -1
  138. package/dist/config.js.map +1 -1
  139. package/dist/continuousReview.d.ts +71 -0
  140. package/dist/continuousReview.d.ts.map +1 -0
  141. package/dist/continuousReview.js +53 -0
  142. package/dist/continuousReview.js.map +1 -0
  143. package/dist/detectorCountReview.d.ts +9 -0
  144. package/dist/detectorCountReview.d.ts.map +1 -0
  145. package/dist/detectorCountReview.js +79 -0
  146. package/dist/detectorCountReview.js.map +1 -0
  147. package/dist/diagnose.d.ts +1 -1
  148. package/dist/diagnose.js +1 -1
  149. package/dist/installerOnboardingMode.d.ts.map +1 -1
  150. package/dist/installerOnboardingMode.js +5 -3
  151. package/dist/installerOnboardingMode.js.map +1 -1
  152. package/dist/localInferenceSchema.d.ts +8 -0
  153. package/dist/localInferenceSchema.d.ts.map +1 -1
  154. package/dist/localInferenceSchema.js +3 -3
  155. package/dist/localInferenceSchema.js.map +1 -1
  156. package/dist/localSenseE2eHarness.d.ts +12 -0
  157. package/dist/localSenseE2eHarness.d.ts.map +1 -1
  158. package/dist/localSenseE2eHarness.js +77 -4
  159. package/dist/localSenseE2eHarness.js.map +1 -1
  160. package/dist/localSensing.d.ts +91 -18
  161. package/dist/localSensing.d.ts.map +1 -1
  162. package/dist/localSensing.js +678 -153
  163. package/dist/localSensing.js.map +1 -1
  164. package/dist/mixedScopedCounts.d.ts +17 -0
  165. package/dist/mixedScopedCounts.d.ts.map +1 -0
  166. package/dist/mixedScopedCounts.js +90 -0
  167. package/dist/mixedScopedCounts.js.map +1 -0
  168. package/dist/sensingCatchRate.d.ts +9 -5
  169. package/dist/sensingCatchRate.d.ts.map +1 -1
  170. package/dist/sensingCatchRate.js +10 -6
  171. package/dist/sensingCatchRate.js.map +1 -1
  172. package/dist/sensingRunMode.d.ts +5 -0
  173. package/dist/sensingRunMode.d.ts.map +1 -1
  174. package/dist/sensingRunMode.js +56 -0
  175. package/dist/sensingRunMode.js.map +1 -1
  176. package/package.json +7 -4
  177. package/retained/ArchiveLifecycle.cjs +79 -0
  178. package/retained/ModelStageScheduler.cjs +66 -0
  179. package/retained/ProfileAuthorityClient.cjs +88 -0
  180. package/retained/RetainedCaptureClient.cjs +164 -0
  181. package/retained/WaitRecheckCaptureClient.cjs +109 -0
  182. package/retained/__tests__/archive-lifecycle.test.cjs +117 -0
  183. package/retained/__tests__/runtime.test.cjs +384 -0
  184. package/retained/alert-rule-policy.cjs +37 -0
  185. package/retained/manager.cjs +133 -0
  186. package/retained/pilot-profile-client.cjs +82 -0
  187. package/retained/temporal-grouping.cjs +78 -0
  188. package/retained/website-api-capability.cjs +122 -0
@@ -0,0 +1,38 @@
1
+ import type { LocalSensingClient } from './localSensing';
2
+ import type { AudienceAnalyzeRequest } from './AudienceAnalyzeClient';
3
+ import type { LiteRtVlmProvider, HttpJsonPoster } from './LiteRtVlmProvider';
4
+ import type { VlmCandidate } from './VlmCandidateBuffer';
5
+ import { OrderedSequenceStore, type OrderedCaptureContract } from './OrderedSequenceStore';
6
+ /** Explicit Path 3 adapter. Existing capture -> durable spool -> LocalSensingClient
7
+ * -> pinned Gemma provider -> local receiver; no production selection is changed.
8
+ * A factory supplies the SAME client options for the per-sequence provider.
9
+ */
10
+ export declare class OrderedReviewClient {
11
+ private readonly client;
12
+ private readonly store;
13
+ private readonly factory;
14
+ private readonly runtime;
15
+ private readonly transport?;
16
+ private readonly contract;
17
+ private completed;
18
+ private health;
19
+ constructor(client: LocalSensingClient, store: OrderedSequenceStore, contract: OrderedCaptureContract, factory: (provider: LiteRtVlmProvider) => LocalSensingClient, runtime: {
20
+ baseUrl: string;
21
+ model: string;
22
+ }, transport?: HttpJsonPoster | undefined);
23
+ prepareReview(): Promise<void>;
24
+ captureReviewContext(): Record<string, unknown>;
25
+ retainOrderedCapture(candidate: VlmCandidate): void;
26
+ pendingOrderedCandidates(): VlmCandidate[];
27
+ flushOrderedCapture(): void;
28
+ getEndpoint(): string;
29
+ getReviewModelUse(context: Record<string, unknown> | undefined): import("./ReviewModelUse").ReviewModelUse;
30
+ getAcceleratorHealth(): import("./LiteRtVlmProvider").LiteRtAcceleratorHealth;
31
+ getLocalInferenceStats(): {
32
+ completed: number;
33
+ };
34
+ private prepare;
35
+ reviewCandidate(request: AudienceAnalyzeRequest): Promise<void>;
36
+ analyze(request: AudienceAnalyzeRequest): Promise<import("./AudienceAnalyzeClient").AudienceAnalyzeResponse>;
37
+ }
38
+ //# sourceMappingURL=OrderedReviewClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderedReviewClient.d.ts","sourceRoot":"","sources":["../src/OrderedReviewClient.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAuB,MAAM,qBAAqB,CAAC;AAClG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIzD,OAAO,EAAE,oBAAoB,EAA2B,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEpH;;;GAGG;AACH,qBAAa,mBAAmB;IAIlB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAqB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAA+B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IALpF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,SAAS,CAAG;IACpB,OAAO,CAAC,MAAM,CAAkE;gBACnD,MAAM,EAAC,kBAAkB,EAAmB,KAAK,EAAC,oBAAoB,EACjG,QAAQ,EAAC,sBAAsB,EAAmB,OAAO,EAAC,CAAC,QAAQ,EAAC,iBAAiB,KAAG,kBAAkB,EACzF,OAAO,EAAC;QAAC,OAAO,EAAC,MAAM,CAAC;QAAA,KAAK,EAAC,MAAM,CAAA;KAAC,EAAkB,SAAS,CAAC,EAAC,cAAc,YAAA;IAKnG,aAAa;IACb,oBAAoB,IAAG,MAAM,CAAC,MAAM,EAAC,OAAO,CAAC;IAG7C,oBAAoB,CAAC,SAAS,EAAC,YAAY,GAAE,IAAI;IACjD,wBAAwB,IAAG,YAAY,EAAE;IACzC,mBAAmB,IAAG,IAAI;IAC1B,WAAW;IACX,iBAAiB,CAAC,OAAO,EAAC,MAAM,CAAC,MAAM,EAAC,OAAO,CAAC,GAAC,SAAS;IAC1D,oBAAoB;IACpB,sBAAsB;;;YACR,OAAO;IA2Df,eAAe,CAAC,OAAO,EAAC,sBAAsB,GAAE,OAAO,CAAC,IAAI,CAAC;IAC7D,OAAO,CAAC,OAAO,EAAC,sBAAsB;CAQ7C"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OrderedReviewClient = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const ScopedVlmReview_1 = require("./ScopedVlmReview");
6
+ const ProfileReviewWork_1 = require("./ProfileReviewWork");
7
+ const OrderedFrameReview_1 = require("./OrderedFrameReview");
8
+ const OrderedSequenceStore_1 = require("./OrderedSequenceStore");
9
+ /** Explicit Path 3 adapter. Existing capture -> durable spool -> LocalSensingClient
10
+ * -> pinned Gemma provider -> local receiver; no production selection is changed.
11
+ * A factory supplies the SAME client options for the per-sequence provider.
12
+ */
13
+ class OrderedReviewClient {
14
+ constructor(client, store, contract, factory, runtime, transport) {
15
+ this.client = client;
16
+ this.store = store;
17
+ this.factory = factory;
18
+ this.runtime = runtime;
19
+ this.transport = transport;
20
+ this.completed = 0;
21
+ (0, OrderedSequenceStore_1.validateOrderedContract)(contract);
22
+ this.contract = JSON.parse(JSON.stringify(contract));
23
+ const url = new URL(client.getEndpoint());
24
+ if (url.protocol !== 'http:' || !['127.0.0.1', 'localhost', '[::1]'].includes(url.hostname))
25
+ throw Error('Ordered rehearsal requires a loopback receiver');
26
+ }
27
+ prepareReview() { return this.client.prepareReview(); }
28
+ captureReviewContext() {
29
+ return { ...this.client.captureReviewContext(), orderedCaptureContract: JSON.parse(JSON.stringify(this.contract)) };
30
+ }
31
+ retainOrderedCapture(candidate) { this.store.append(candidate); }
32
+ pendingOrderedCandidates() { return this.store.candidates(); }
33
+ flushOrderedCapture() { this.store.flush(); }
34
+ getEndpoint() { return this.client.getEndpoint(); }
35
+ getReviewModelUse(context) { return this.client.getReviewModelUse(context); }
36
+ getAcceleratorHealth() { return this.health ?? this.client.getAcceleratorHealth(); }
37
+ getLocalInferenceStats() { return { completed: this.completed }; }
38
+ async prepare(request) {
39
+ const ref = request.reviewContext?.orderedSequence;
40
+ if (!ref || ref.version !== 1 || ref.id !== request.evidenceId || !request.checkpointAnalysis || !request.reviewWindowMs)
41
+ throw Error('Ordered review requires retained sequence identity and checkpoints');
42
+ const { job, frames, anchor } = this.store.read(ref.id);
43
+ if (job.cameraId !== this.contract.cameraId || job.capturedAtMs !== request.capturedAt
44
+ || (0, ProfileReviewWork_1.reviewContextHash)(anchor.reviewContext) !== (0, ProfileReviewWork_1.reviewContextHash)(request.reviewContext)
45
+ || !request.jpeg.equals(anchor.jpeg))
46
+ throw Error('Ordered queue anchor changed');
47
+ const context = request.reviewContext;
48
+ if (context.temporalReviewContract || context.producerFields?.length || context.scopedVlmReview?.declaredFieldsOnly !== true)
49
+ throw Error('Ordered comparison requires declared Gemma questions and no duration/detector aggregation');
50
+ const scopes = (0, ScopedVlmReview_1.planScopedVlmReview)(context.schema, context.scopedVlmReview, context.regions, context.producerFields);
51
+ if (scopes.length !== 1)
52
+ throw Error('Ordered comparison requires one shared region or whole frame');
53
+ const scope = scopes[0];
54
+ let saved = request.cachedAnalysis ?? this.store.saved(ref.id);
55
+ const cached = saved?.orderedReview;
56
+ if (saved && (cached?.sequenceId !== job.id || cached?.contextSha256 !== job.contextSha256
57
+ || cached?.anchorSha256 !== frames.at(-1).imageSha256 || cached?.capturedAtMs !== job.capturedAtMs))
58
+ throw Error('Saved ordered result identity mismatch');
59
+ if (!saved) {
60
+ const attempt = (0, crypto_1.randomUUID)().replace(/-/g, '');
61
+ const priorScope = this.store.savedScope(job.id);
62
+ let identity = priorScope?.identity;
63
+ const provider = {
64
+ analyze: async (input) => {
65
+ if (!input.expectedModel)
66
+ throw Error('Ordered review requires the selected model pin');
67
+ const reviewer = await (0, OrderedFrameReview_1.createOrderedFrameReviewer)({ sequenceId: job.id, cameraId: job.cameraId,
68
+ contextSha256: job.contextSha256, frames, region: scope.region, prompt: scope.prompt, schema: scope.schema,
69
+ expectedModel: input.expectedModel, runtimeModel: this.runtime.model, baseUrl: this.runtime.baseUrl,
70
+ record: receipt => this.store.receipt(job.id, attempt, String(receipt.phase), receipt) }, this.transport);
71
+ identity = reviewer.identity;
72
+ const result = await reviewer.analyze(input);
73
+ this.health = reviewer.getAcceleratorHealth();
74
+ this.completed++;
75
+ return result;
76
+ },
77
+ };
78
+ const inner = this.factory(provider);
79
+ if (inner.getEndpoint() !== this.client.getEndpoint())
80
+ throw Error('Ordered client factory changed the receiver');
81
+ await inner.reviewCandidate({ ...request, cachedAnalysis: undefined, scopedVlmProgress: priorScope?.progress,
82
+ checkpointScopedReview: progress => {
83
+ if (!identity)
84
+ throw Error('Missing ordered scope identity');
85
+ this.store.checkpointScope(job.id, progress, identity);
86
+ }, checkpointAnalysis: result => {
87
+ if (!identity)
88
+ throw Error('Missing ordered model receipt');
89
+ saved = { ...result, orderedReview: { version: 1, kind: 'ordered_frame_rehearsal', sequenceId: job.id,
90
+ contextSha256: job.contextSha256, anchorSha256: frames.at(-1).imageSha256,
91
+ startedAtMs: job.startedAtMs, capturedAtMs: job.capturedAtMs, frames: identity.frames,
92
+ expectedModel: identity.expectedModel, semantics: 'visible_occurrence_in_any_frame',
93
+ identitySha256: (0, crypto_1.createHash)('sha256').update(JSON.stringify(identity)).digest('hex') } };
94
+ // An archive commit precedes the spool checkpoint. Recovery can reuse it
95
+ // if the process exits between those two writes.
96
+ this.store.checkpoint(job.id, saved);
97
+ request.checkpointAnalysis(saved);
98
+ } });
99
+ }
100
+ else {
101
+ // Validate the native LocalSensingClient cached-analysis contract too.
102
+ await this.client.reviewCandidate({ ...request, cachedAnalysis: saved });
103
+ request.checkpointAnalysis(saved);
104
+ }
105
+ if (!saved)
106
+ throw Error('Missing ordered analysis');
107
+ return saved;
108
+ }
109
+ async reviewCandidate(request) { await this.prepare(request); }
110
+ async analyze(request) {
111
+ const saved = await this.prepare(request);
112
+ const result = await this.client.analyze({ ...request, cachedAnalysis: saved, extra: { ...request.extra, orderedReview: saved.orderedReview } });
113
+ const body = result.body;
114
+ if (result.ok && body?.accepted === true && body.evidenceId === request.evidenceId
115
+ && body.evidenceReview?.capturedAtMs === request.capturedAt)
116
+ this.store.acknowledge(request.evidenceId);
117
+ return result;
118
+ }
119
+ }
120
+ exports.OrderedReviewClient = OrderedReviewClient;
121
+ //# sourceMappingURL=OrderedReviewClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderedReviewClient.js","sourceRoot":"","sources":["../src/OrderedReviewClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { VlmCandidate } from './VlmCandidateBuffer';
2
+ import type { OrderedEvidenceFrame } from './OrderedFrameReview';
3
+ export interface OrderedCaptureContract {
4
+ version: 1;
5
+ cameraId: string;
6
+ frameCount: number;
7
+ maxGapMs: number;
8
+ semantics: 'visible_occurrence_in_any_frame';
9
+ }
10
+ export interface OrderedSequence {
11
+ version: 1;
12
+ id: string;
13
+ cameraId: string;
14
+ contextSha256: string;
15
+ frameIds: string[];
16
+ capturedAtMs: number;
17
+ startedAtMs: number;
18
+ }
19
+ export declare function validateOrderedContract(c: OrderedCaptureContract): void;
20
+ /** Single-owner local archive. Originals commit BEFORE queue admission. A queue
21
+ * refusal is retried from this archive; acknowledgement is the only terminal state.
22
+ * All disk use is bounded. No automatic deletion of unsent or incomplete evidence.
23
+ * The experiment launcher must hold its existing exclusive host lock.
24
+ */
25
+ export declare class OrderedSequenceStore {
26
+ private readonly directory;
27
+ private readonly maxCaptures;
28
+ private readonly maxBytes;
29
+ private tail;
30
+ private pending;
31
+ private captureCount;
32
+ private diskBytes;
33
+ private lastCapture;
34
+ private incomplete;
35
+ private captureFault;
36
+ constructor(directory: string, maxCaptures?: number, maxBytes?: number);
37
+ private file;
38
+ private load;
39
+ private write;
40
+ private captureName;
41
+ private validateCapture;
42
+ append(candidate: VlmCandidate): void;
43
+ private group;
44
+ /** Flush an end-of-clip window of 2+; a singleton stays visibly incomplete. */
45
+ flush(): void;
46
+ private closeTail;
47
+ read(id: string): {
48
+ job: OrderedSequence;
49
+ frames: OrderedEvidenceFrame[];
50
+ anchor: VlmCandidate;
51
+ };
52
+ candidates(): VlmCandidate[];
53
+ receipt(id: string, attempt: string, phase: string, value: unknown): void;
54
+ saved(id: string): Record<string, unknown> | undefined;
55
+ savedScope(id: string): {
56
+ progress: any;
57
+ identity: any;
58
+ } | undefined;
59
+ checkpointScope(id: string, progress: unknown, identity: unknown): void;
60
+ checkpoint(id: string, result: Record<string, unknown>): void;
61
+ acknowledge(id: string): void;
62
+ stats(): {
63
+ captures: number;
64
+ pendingSequences: number;
65
+ incompleteFrames: number;
66
+ bytes: number;
67
+ };
68
+ }
69
+ //# sourceMappingURL=OrderedSequenceStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderedSequenceStore.d.ts","sourceRoot":"","sources":["../src/OrderedSequenceStore.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IACnE,SAAS,EAAE,iCAAiC,CAAC;CAC9C;AAKD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAC,CAAC,CAAC;IAAC,EAAE,EAAC,MAAM,CAAC;IAAC,QAAQ,EAAC,MAAM,CAAC;IAAC,aAAa,EAAC,MAAM,CAAC;IAAC,QAAQ,EAAC,MAAM,EAAE,CAAC;IAC/E,YAAY,EAAC,MAAM,CAAC;IAAC,WAAW,EAAC,MAAM,CAAC;CACzC;AAKD,wBAAgB,uBAAuB,CAAC,CAAC,EAAC,sBAAsB,GAAE,IAAI,CAKrE;AAED;;;;GAIG;AACH,qBAAa,oBAAoB;IAQnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAAS,OAAO,CAAC,QAAQ,CAAC,WAAW;IACzE,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAR3B,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,YAAY,CAAG;IACvB,OAAO,CAAC,SAAS,CAAG;IACpB,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,YAAY,CAAO;gBACE,SAAS,EAAC,MAAM,EAAmB,WAAW,SAAQ,EAChE,QAAQ,SAAU;IAuBrC,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,IAAI;IAKZ,OAAO,CAAC,KAAK;IAYb,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,eAAe;IAWvB,MAAM,CAAC,SAAS,EAAC,YAAY,GAAE,IAAI;IAmBnC,OAAO,CAAC,KAAK;IASb,+EAA+E;IAC/E,KAAK,IAAG,IAAI;IACZ,OAAO,CAAC,SAAS;IAWjB,IAAI,CAAC,EAAE,EAAC,MAAM,GAAE;QAAC,GAAG,EAAC,eAAe,CAAC;QAAC,MAAM,EAAC,oBAAoB,EAAE,CAAC;QAAC,MAAM,EAAC,YAAY,CAAA;KAAC;IAgBzF,UAAU,IAAG,YAAY,EAAE;IAG3B,OAAO,CAAC,EAAE,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,OAAO,GAAE,IAAI;IAIjE,KAAK,CAAC,EAAE,EAAC,MAAM,GAAE,MAAM,CAAC,MAAM,EAAC,OAAO,CAAC,GAAC,SAAS;IAIjD,UAAU,CAAC,EAAE,EAAC,MAAM,GAAE;QAAC,QAAQ,EAAC,GAAG,CAAC;QAAA,QAAQ,EAAC,GAAG,CAAA;KAAC,GAAC,SAAS;IAI3D,eAAe,CAAC,EAAE,EAAC,MAAM,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ,EAAC,OAAO,GAAE,IAAI;IAIjE,UAAU,CAAC,EAAE,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,CAAC,MAAM,EAAC,OAAO,CAAC,GAAE,IAAI;IACxD,WAAW,CAAC,EAAE,EAAC,MAAM,GAAE,IAAI;IAC3B,KAAK;;;;;;CACN"}
@@ -0,0 +1,257 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.OrderedSequenceStore = void 0;
37
+ exports.validateOrderedContract = validateOrderedContract;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const crypto_1 = require("crypto");
41
+ const ProfileReviewWork_1 = require("./ProfileReviewWork");
42
+ const jpegFrameSize_1 = require("./jpegFrameSize");
43
+ const sha = (x) => (0, crypto_1.createHash)('sha256').update(JSON.stringify(x)).digest('hex');
44
+ const bytesHash = (b) => (0, crypto_1.createHash)('sha256').update(b).digest('hex');
45
+ const clone = (x) => JSON.parse(JSON.stringify(x));
46
+ const idPattern = /^[a-f0-9]{32}$/;
47
+ function validateOrderedContract(c) {
48
+ if (!c || c.version !== 1 || !/^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,127}$/.test(c.cameraId)
49
+ || !Number.isSafeInteger(c.frameCount) || c.frameCount < 2 || c.frameCount > 5
50
+ || !Number.isSafeInteger(c.maxGapMs) || c.maxGapMs < 1 || c.maxGapMs > 5000
51
+ || c.semantics !== 'visible_occurrence_in_any_frame')
52
+ throw Error('Invalid ordered capture contract');
53
+ }
54
+ /** Single-owner local archive. Originals commit BEFORE queue admission. A queue
55
+ * refusal is retried from this archive; acknowledgement is the only terminal state.
56
+ * All disk use is bounded. No automatic deletion of unsent or incomplete evidence.
57
+ * The experiment launcher must hold its existing exclusive host lock.
58
+ */
59
+ class OrderedSequenceStore {
60
+ constructor(directory, maxCaptures = 100000, maxBytes = 8 * 1024 ** 3) {
61
+ this.directory = directory;
62
+ this.maxCaptures = maxCaptures;
63
+ this.maxBytes = maxBytes;
64
+ this.tail = [];
65
+ this.pending = new Map();
66
+ this.captureCount = 0;
67
+ this.diskBytes = 0;
68
+ this.incomplete = new Set();
69
+ this.captureFault = false;
70
+ if (!Number.isSafeInteger(maxCaptures) || maxCaptures < 1 || maxCaptures > 100000
71
+ || !Number.isSafeInteger(maxBytes) || maxBytes < 1)
72
+ throw Error('Invalid ordered archive capacity');
73
+ fs.mkdirSync(directory, { recursive: true });
74
+ const names = fs.readdirSync(directory);
75
+ this.diskBytes = names.reduce((n, f) => n + fs.statSync(path.join(directory, f)).size, 0);
76
+ const assigned = new Set();
77
+ for (const name of names.filter(n => /^job-[a-f0-9]{32}\.json$/.test(n))) {
78
+ const job = this.load(name);
79
+ if (!idPattern.test(job.id) || job.version !== 1 || job.frameIds.length < 2 || job.frameIds.length > 5)
80
+ throw Error('Corrupt sequence manifest');
81
+ for (const id of job.frameIds) {
82
+ if (assigned.has(id))
83
+ throw Error('Frame assigned to multiple sequences');
84
+ assigned.add(id);
85
+ }
86
+ if (!fs.existsSync(this.file('ack-' + job.id + '.json')))
87
+ this.pending.set(job.id, job);
88
+ else {
89
+ const ack = this.load('ack-' + job.id + '.json');
90
+ if (ack.id !== job.id)
91
+ throw Error('Corrupt sequence acknowledgement');
92
+ }
93
+ }
94
+ // Only metadata/tail is kept in memory; image payloads stay on disk.
95
+ for (const name of names.filter(n => /^capture-\d{16}-[a-f0-9]{32}\.json$/.test(n)).sort()) {
96
+ const capture = this.load(name);
97
+ this.captureCount++;
98
+ this.validateCapture(capture);
99
+ this.lastCapture = capture;
100
+ this.write('index-' + capture.id + '.json', { name });
101
+ if (assigned.has(capture.id)) {
102
+ this.closeTail();
103
+ continue;
104
+ }
105
+ this.group(capture);
106
+ }
107
+ }
108
+ file(name) { if (!/^[a-zA-Z0-9_.-]+$/.test(name))
109
+ throw Error('Invalid archive key'); return path.join(this.directory, name); }
110
+ load(name) {
111
+ const envelope = JSON.parse(fs.readFileSync(this.file(name), 'utf8'));
112
+ if (!envelope.value || envelope.sha256 !== sha(envelope.value))
113
+ throw Error('Corrupt ordered archive');
114
+ return envelope.value;
115
+ }
116
+ write(name, value) {
117
+ const target = this.file(name), text = JSON.stringify({ value, sha256: sha(value) }) + '\n';
118
+ if (fs.existsSync(target)) {
119
+ if (sha(this.load(name)) !== sha(value))
120
+ throw Error('Ordered archive identity changed');
121
+ return;
122
+ }
123
+ const size = Buffer.byteLength(text);
124
+ if (this.diskBytes + size > this.maxBytes)
125
+ throw Error('Ordered archive full; existing evidence retained');
126
+ const temp = this.file('.pending-' + (0, crypto_1.randomUUID)()), fd = fs.openSync(temp, 'wx');
127
+ try {
128
+ fs.writeFileSync(fd, text);
129
+ fs.fsyncSync(fd);
130
+ }
131
+ finally {
132
+ fs.closeSync(fd);
133
+ }
134
+ fs.renameSync(temp, target);
135
+ this.diskBytes += size;
136
+ }
137
+ captureName(c) { return 'capture-' + String(c.capturedAtMs).padStart(16, '0') + '-' + c.id + '.json'; }
138
+ validateCapture(c) {
139
+ const contract = c.candidate.reviewContext?.orderedCaptureContract;
140
+ validateOrderedContract(contract);
141
+ const jpeg = Buffer.from(c.imageBase64, 'base64'), size = (0, jpegFrameSize_1.readJpegFrameSize)(jpeg);
142
+ if (c.candidate.name !== contract.cameraId || (0, ProfileReviewWork_1.reviewContextHash)(c.candidate.reviewContext) !== c.contextSha256
143
+ || bytesHash(jpeg) !== c.imageSha256 || !size || size.width * size.height > 16777216
144
+ || c.shape !== size.width + 'x' + size.height || jpeg.length < 4 || jpeg.readUInt16BE(jpeg.length - 2) !== 0xffd9
145
+ || !Number.isSafeInteger(c.capturedAtMs) || c.capturedAtMs < 0 || c.candidate.enqueuedAtMs !== c.capturedAtMs
146
+ || c.id !== sha({ camera: c.candidate.name, context: c.contextSha256, time: c.capturedAtMs }).slice(0, 32))
147
+ throw Error('Invalid retained ordered frame');
148
+ }
149
+ append(candidate) {
150
+ if (this.captureFault)
151
+ throw Error('Ordered capture storage failed; restart recovery required');
152
+ const { jpeg, ...meta } = candidate, contextSha256 = (0, ProfileReviewWork_1.reviewContextHash)(candidate.reviewContext);
153
+ const size = (0, jpegFrameSize_1.readJpegFrameSize)(jpeg);
154
+ const capture = { id: sha({ camera: candidate.name, context: contextSha256, time: candidate.enqueuedAtMs }).slice(0, 32),
155
+ contextSha256, imageSha256: bytesHash(jpeg), capturedAtMs: candidate.enqueuedAtMs, shape: size ? size.width + 'x' + size.height : '',
156
+ candidate: clone(meta), imageBase64: jpeg.toString('base64') };
157
+ this.validateCapture(capture);
158
+ if (this.lastCapture && capture.capturedAtMs <= this.lastCapture.capturedAtMs) {
159
+ if (capture.id === this.lastCapture.id && sha(capture) === sha(this.lastCapture))
160
+ return;
161
+ throw Error('Ordered capture requires increasing timestamps');
162
+ }
163
+ if (this.captureCount >= this.maxCaptures)
164
+ throw Error('Ordered capture limit reached; existing evidence retained');
165
+ try {
166
+ this.write(this.captureName(capture), capture);
167
+ this.write('index-' + capture.id + '.json', { name: this.captureName(capture) });
168
+ this.captureCount++;
169
+ this.lastCapture = capture;
170
+ this.group(capture);
171
+ }
172
+ catch (error) {
173
+ this.captureFault = true;
174
+ throw error;
175
+ }
176
+ }
177
+ group(c) {
178
+ const contract = c.candidate.reviewContext.orderedCaptureContract, last = this.tail.at(-1), first = this.tail[0];
179
+ if (last && (last.candidate.name !== c.candidate.name || last.contextSha256 !== c.contextSha256 || last.shape !== c.shape
180
+ || c.capturedAtMs - last.capturedAtMs > contract.maxGapMs || c.capturedAtMs - first.capturedAtMs > 5000
181
+ || this.tail.reduce((n, f) => n + Buffer.byteLength(f.imageBase64, 'base64'), 0) + Buffer.byteLength(c.imageBase64, 'base64') > 16 * 1024 ** 2))
182
+ this.closeTail();
183
+ this.tail.push(c);
184
+ if (this.tail.length >= contract.frameCount)
185
+ this.closeTail();
186
+ }
187
+ /** Flush an end-of-clip window of 2+; a singleton stays visibly incomplete. */
188
+ flush() { if (this.tail.length >= 2)
189
+ this.closeTail(); }
190
+ closeTail() {
191
+ if (!this.tail.length)
192
+ return;
193
+ if (this.tail.length === 1) {
194
+ this.incomplete.add(this.tail[0].id);
195
+ this.tail = [];
196
+ return;
197
+ }
198
+ const frames = this.tail, first = frames[0], last = frames.at(-1);
199
+ const frameIds = frames.map(f => f.id), id = sha({ context: first.contextSha256, frameIds }).slice(0, 32);
200
+ const job = { version: 1, id, cameraId: first.candidate.name, contextSha256: first.contextSha256, frameIds,
201
+ startedAtMs: first.capturedAtMs, capturedAtMs: last.capturedAtMs };
202
+ this.write('job-' + id + '.json', job);
203
+ if (!fs.existsSync(this.file('ack-' + id + '.json')))
204
+ this.pending.set(id, job);
205
+ this.tail = [];
206
+ }
207
+ read(id) {
208
+ if (!idPattern.test(id))
209
+ throw Error('Invalid sequence ID');
210
+ const job = this.load('job-' + id + '.json');
211
+ const frames = job.frameIds.map(frameId => {
212
+ // Manifests include frame IDs, with the small timestamp index persisted separately below.
213
+ const index = this.load('index-' + frameId + '.json');
214
+ const c = this.load(index.name);
215
+ this.validateCapture(c);
216
+ return c;
217
+ });
218
+ if (frames.some(f => f.contextSha256 !== job.contextSha256 || f.candidate.name !== job.cameraId)
219
+ || frames[0].capturedAtMs !== job.startedAtMs || frames.at(-1).capturedAtMs !== job.capturedAtMs)
220
+ throw Error('Sequence context mismatch');
221
+ const last = frames.at(-1);
222
+ return { job, frames: frames.map(f => ({ evidenceId: f.id, cameraId: job.cameraId, contextSha256: job.contextSha256,
223
+ capturedAtMs: f.capturedAtMs, imageSha256: f.imageSha256, jpeg: Buffer.from(f.imageBase64, 'base64') })),
224
+ anchor: { ...clone(last.candidate), jpeg: Buffer.from(last.imageBase64, 'base64'),
225
+ retainedId: id, reviewContext: { ...clone(last.candidate.reviewContext), orderedSequence: { version: 1, id, contextSha256: job.contextSha256 } } } };
226
+ }
227
+ candidates() {
228
+ return [...this.pending.values()].sort((a, b) => a.capturedAtMs - b.capturedAtMs).slice(0, 16).map(j => this.read(j.id).anchor);
229
+ }
230
+ receipt(id, attempt, phase, value) {
231
+ if (!idPattern.test(id) || !idPattern.test(attempt) || !['prepared', 'request', 'response', 'complete', 'failed'].includes(phase))
232
+ throw Error('Invalid sequence receipt');
233
+ this.write('receipt-' + id + '-' + attempt + '-' + phase + '.json', value);
234
+ }
235
+ saved(id) {
236
+ if (!idPattern.test(id))
237
+ throw Error('Invalid sequence ID');
238
+ return fs.existsSync(this.file('result-' + id + '.json')) ? this.load('result-' + id + '.json') : undefined;
239
+ }
240
+ savedScope(id) {
241
+ if (!idPattern.test(id))
242
+ throw Error('Invalid sequence ID');
243
+ return fs.existsSync(this.file('scope-' + id + '.json')) ? this.load('scope-' + id + '.json') : undefined;
244
+ }
245
+ checkpointScope(id, progress, identity) {
246
+ if (!idPattern.test(id))
247
+ throw Error('Invalid sequence ID');
248
+ this.write('scope-' + id + '.json', { progress, identity });
249
+ }
250
+ checkpoint(id, result) { if (!idPattern.test(id))
251
+ throw Error('Invalid sequence ID'); this.write('result-' + id + '.json', result); }
252
+ acknowledge(id) { if (!idPattern.test(id))
253
+ throw Error('Invalid sequence ID'); this.write('ack-' + id + '.json', { id }); this.pending.delete(id); }
254
+ stats() { return { captures: this.captureCount, pendingSequences: this.pending.size, incompleteFrames: this.incomplete.size + this.tail.length, bytes: this.diskBytes }; }
255
+ }
256
+ exports.OrderedSequenceStore = OrderedSequenceStore;
257
+ //# sourceMappingURL=OrderedSequenceStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderedSequenceStore.js","sourceRoot":"","sources":["../src/OrderedSequenceStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import type { FrameGroupingDecision } from './FrameGroupingShadow';
2
+ import type { ProducedFieldSet } from './DetectorFieldProducer';
3
+ /** Shared field answers; a whole-image classifier need not fabricate detection classes or boxes. */
4
+ export interface ProfileFieldSet {
5
+ produced: Array<Pick<ProducedFieldSet['produced'][number], 'field' | 'modelId' | 'value'>>;
6
+ withheld: Array<{
7
+ field: string;
8
+ modelId: string;
9
+ reason: string;
10
+ detail?: string;
11
+ }>;
12
+ }
13
+ /** Local experiment. A question's selection is not an answer to that question. */
14
+ export interface ProfileReviewWork {
15
+ version: 1;
16
+ mode: 'shadow';
17
+ contextSha256: string;
18
+ imageSha256: string;
19
+ capturedAtMs: number;
20
+ items: Array<{
21
+ field: string;
22
+ producer: 'vlm' | 'detector' | 'unresolved';
23
+ selected: boolean;
24
+ reason: string;
25
+ referenceSha256?: string;
26
+ referenceCapturedAtMs?: number;
27
+ /** Only set by the spool after the referenced original is committed. */
28
+ referenceEvidenceId?: string;
29
+ }>;
30
+ }
31
+ export declare const reviewContextHash: (context: Record<string, unknown> | undefined) => string;
32
+ export declare function promoteProfileDependencies(work: ProfileReviewWork): void;
33
+ /** Each lasso affects its own field. A full-frame question does not select the other fields. */
34
+ export declare function planProfileReview(context: Record<string, unknown> | undefined, grouping: FrameGroupingDecision): ProfileReviewWork | undefined;
35
+ export declare function validateProfileWork(work: ProfileReviewWork, context: Record<string, unknown>, sha256: string, capturedAtMs: number): void;
36
+ export interface ProfileWorkResult {
37
+ version: 1;
38
+ /** Deliberately incompatible with SavedLocalAnalysis: never upload as a complete observation. */
39
+ kind: 'profile_work_rehearsal';
40
+ evidenceId: string;
41
+ imageSha256: string;
42
+ contextSha256: string;
43
+ capturedAtMs: number;
44
+ reviewedAtMs: number;
45
+ selectedFields: string[];
46
+ unreviewedFields: string[];
47
+ structured: Record<string, unknown>;
48
+ unresolvedFields: string[];
49
+ modelCalls: {
50
+ vlm: number;
51
+ producerBatches: number;
52
+ };
53
+ }
54
+ /** Runs due questions together using existing model adapters; it has no upload capability. */
55
+ export declare function reviewProfileBatch(input: {
56
+ jpeg: Buffer;
57
+ evidenceId: string;
58
+ capturedAtMs: number;
59
+ context: Record<string, unknown>;
60
+ work: ProfileReviewWork;
61
+ analyze: (request: {
62
+ jpeg: Buffer;
63
+ schema: Record<string, unknown>;
64
+ prompt: string;
65
+ }) => Promise<Record<string, unknown>>;
66
+ produce: (fields: any[]) => Promise<ProfileFieldSet>;
67
+ }): Promise<ProfileWorkResult>;
68
+ //# sourceMappingURL=ProfileReviewWork.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProfileReviewWork.d.ts","sourceRoot":"","sources":["../src/ProfileReviewWork.ts"],"names":[],"mappings":"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"}