@camstack/types 1.2.403 → 1.2.404

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 (33) hide show
  1. package/dist/addon.js +2 -2
  2. package/dist/addon.mjs +2 -2
  3. package/dist/capabilities/index.d.ts +2 -2
  4. package/dist/capabilities/pipeline-analytics.cap.d.ts +3 -0
  5. package/dist/capabilities/pipeline-executor.cap.d.ts +0 -64
  6. package/dist/capabilities/pipeline-orchestrator.cap.d.ts +32 -124
  7. package/dist/capabilities/training.cap.d.ts +91 -71
  8. package/dist/client.js +2 -8
  9. package/dist/client.mjs +2 -8
  10. package/dist/enums/event-category.d.ts +2 -3
  11. package/dist/enums.js +1 -1
  12. package/dist/enums.mjs +1 -1
  13. package/dist/{event-category-7AwNbPjm.js → event-category-CXrwjC3e.js} +2 -3
  14. package/dist/{event-category-BfJwUd2S.mjs → event-category-fDPduoeC.mjs} +2 -3
  15. package/dist/generated/addon-api.d.ts +14 -56
  16. package/dist/generated/device-proxy.d.ts +1 -1
  17. package/dist/generated/method-access-map.d.ts +1 -1
  18. package/dist/generated/method-device-selectors.d.ts +2 -2
  19. package/dist/generated/system-proxy.d.ts +3 -3
  20. package/dist/index.d.ts +2 -1
  21. package/dist/index.js +135 -276
  22. package/dist/index.mjs +131 -275
  23. package/dist/interfaces/birth-decision-ledger.d.ts +3 -0
  24. package/dist/interfaces/pipeline-executor-capability.d.ts +2 -8
  25. package/dist/pipeline/auto-tune/plan-schemas.d.ts +8 -80
  26. package/dist/pipeline/step-settings-layers.d.ts +7 -8
  27. package/dist/{sleep-Ch67uumJ.js → sleep-BKS4OPMo.js} +1 -4
  28. package/dist/{sleep-6AqUnQIT.mjs → sleep-CHIEEJkY.mjs} +1 -4
  29. package/dist/types/agent-pipeline-settings.d.ts +37 -70
  30. package/dist/types/camera-pipeline.d.ts +2 -2
  31. package/dist/types/detection.d.ts +15 -5
  32. package/dist/types/pipeline-step.d.ts +0 -16
  33. package/package.json +1 -1
@@ -121,6 +121,9 @@ export declare const BirthDecisionRecordSchema: z.ZodObject<{
121
121
  decidedByBirthEvidence: z.ZodBoolean;
122
122
  bestScore: z.ZodNullable<z.ZodNumber>;
123
123
  appliedMinConfidence: z.ZodNullable<z.ZodNumber>;
124
+ detectorModelId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
125
+ detectorDeviceKey: z.ZodDefault<z.ZodNullable<z.ZodString>>;
126
+ detectorNodeId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
124
127
  firstSeen: z.ZodNullable<z.ZodNumber>;
125
128
  motionOnsetAt: z.ZodNullable<z.ZodNumber>;
126
129
  birthLatencyMs: z.ZodNullable<z.ZodNumber>;
@@ -1,6 +1,6 @@
1
- import type { PipelineEngineChoice, PipelineConfig } from '../types/pipeline.js';
1
+ import type { PipelineEngineChoice } from '../types/pipeline.js';
2
2
  import type { PipelineExecutionPlane } from '../types/pipeline-step.js';
3
- import type { PipelineSchema, PipelineDefaultStep } from '../types/pipeline-schema.js';
3
+ import type { PipelineSchema } from '../types/pipeline-schema.js';
4
4
  import type { ModelFormat } from '../types/models.js';
5
5
  import type { FrameInput } from '../types/io.js';
6
6
  import type { FrameRef } from '../types/frame-view.js';
@@ -112,12 +112,6 @@ export interface IPipelineExecutorProvider {
112
112
  getSchema(engine?: PipelineEngineChoice): Promise<PipelineSchema>;
113
113
  /** Get all available engines probed on this agent */
114
114
  getAvailableEngines(): Promise<PipelineEngineChoice[]>;
115
- /** Build default step tree for an engine */
116
- getDefaultSteps(engine: PipelineEngineChoice): Promise<PipelineDefaultStep[]>;
117
- /** Compute this node's hardware-aware default step tree (null when the catalog yields no steps). */
118
- getGlobalSteps(): Promise<PipelineDefaultStep[] | null>;
119
- /** Get the runner-ready pipeline config */
120
- getGlobalPipelineConfig(): Promise<PipelineConfig | null>;
121
115
  /**
122
116
  * Gate B (pre-init config-correctness gate). PURE COMPUTE against this
123
117
  * node's `currentEngine.format` — resolves `steps` the same way the
@@ -381,33 +381,15 @@ export declare const NodeDeviceChangeSchema: z.ZodObject<{
381
381
  keys: z.ZodReadonly<z.ZodArray<z.ZodString>>;
382
382
  }, z.core.$strip>>>;
383
383
  }, z.core.$strip>;
384
- export declare const CameraOverrideClearSchema: z.ZodObject<{
385
- deviceId: z.ZodNumber;
386
- source: z.ZodEnum<{
387
- "step-override": "step-override";
388
- wholesale: "wholesale";
389
- }>;
390
- nodeId: z.ZodString;
391
- deviceKey: z.ZodNullable<z.ZodString>;
392
- stepId: z.ZodString;
393
- modelIdBefore: z.ZodNullable<z.ZodString>;
394
- keys: z.ZodReadonly<z.ZodArray<z.ZodString>>;
395
- }, z.core.$strip>;
396
- export declare const DetectorStoreClearSchema: z.ZodObject<{
397
- deviceId: z.ZodNumber;
398
- keys: z.ZodReadonly<z.ZodArray<z.ZodString>>;
399
- }, z.core.$strip>;
384
+ /**
385
+ * Every model and model-bound threshold lives on the accelerator that runs it
386
+ * (D927), so the plan writes node / device entries only — there is no camera
387
+ * layer for it to clear.
388
+ */
400
389
  export declare const AutoTuneWarningSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
401
- kind: z.ZodLiteral<"detector-store-cluster-wide">;
402
- skippedNodes: z.ZodReadonly<z.ZodArray<z.ZodString>>;
403
- }, z.core.$strip>, z.ZodObject<{
404
- kind: z.ZodLiteral<"detector-store-unreadable">;
405
- error: z.ZodString;
406
- }, z.core.$strip>, z.ZodObject<{
407
390
  kind: z.ZodLiteral<"custom-pin-kept">;
408
391
  nodeId: z.ZodString;
409
- deviceKey: z.ZodNullable<z.ZodString>;
410
- deviceId: z.ZodNullable<z.ZodNumber>;
392
+ deviceKey: z.ZodString;
411
393
  modelId: z.ZodString;
412
394
  }, z.core.$strip>, z.ZodObject<{
413
395
  kind: z.ZodLiteral<"custom-registry-unreadable">;
@@ -596,33 +578,10 @@ export declare const AutoTunePlanSchema: z.ZodObject<{
596
578
  keys: z.ZodReadonly<z.ZodArray<z.ZodString>>;
597
579
  }, z.core.$strip>>>;
598
580
  }, z.core.$strip>>>;
599
- cameraClears: z.ZodReadonly<z.ZodArray<z.ZodObject<{
600
- deviceId: z.ZodNumber;
601
- source: z.ZodEnum<{
602
- "step-override": "step-override";
603
- wholesale: "wholesale";
604
- }>;
605
- nodeId: z.ZodString;
606
- deviceKey: z.ZodNullable<z.ZodString>;
607
- stepId: z.ZodString;
608
- modelIdBefore: z.ZodNullable<z.ZodString>;
609
- keys: z.ZodReadonly<z.ZodArray<z.ZodString>>;
610
- }, z.core.$strip>>>;
611
- detectorStoreClears: z.ZodReadonly<z.ZodArray<z.ZodObject<{
612
- deviceId: z.ZodNumber;
613
- keys: z.ZodReadonly<z.ZodArray<z.ZodString>>;
614
- }, z.core.$strip>>>;
615
581
  warnings: z.ZodReadonly<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
616
- kind: z.ZodLiteral<"detector-store-cluster-wide">;
617
- skippedNodes: z.ZodReadonly<z.ZodArray<z.ZodString>>;
618
- }, z.core.$strip>, z.ZodObject<{
619
- kind: z.ZodLiteral<"detector-store-unreadable">;
620
- error: z.ZodString;
621
- }, z.core.$strip>, z.ZodObject<{
622
582
  kind: z.ZodLiteral<"custom-pin-kept">;
623
583
  nodeId: z.ZodString;
624
- deviceKey: z.ZodNullable<z.ZodString>;
625
- deviceId: z.ZodNullable<z.ZodNumber>;
584
+ deviceKey: z.ZodString;
626
585
  modelId: z.ZodString;
627
586
  }, z.core.$strip>, z.ZodObject<{
628
587
  kind: z.ZodLiteral<"custom-registry-unreadable">;
@@ -636,8 +595,6 @@ export declare const AutoTuneApplyInputSchema: z.ZodObject<{
636
595
  }, z.core.$strip>;
637
596
  export declare const AutoTunePhaseResultSchema: z.ZodObject<{
638
597
  phase: z.ZodEnum<{
639
- "camera-overrides": "camera-overrides";
640
- "detector-thresholds": "detector-thresholds";
641
598
  download: "download";
642
599
  "node-models": "node-models";
643
600
  redispatch: "redispatch";
@@ -650,8 +607,6 @@ export declare const AutoTuneApplyResultSchema: z.ZodDiscriminatedUnion<[z.ZodOb
650
607
  planHash: z.ZodString;
651
608
  phases: z.ZodReadonly<z.ZodArray<z.ZodObject<{
652
609
  phase: z.ZodEnum<{
653
- "camera-overrides": "camera-overrides";
654
- "detector-thresholds": "detector-thresholds";
655
610
  download: "download";
656
611
  "node-models": "node-models";
657
612
  redispatch: "redispatch";
@@ -663,8 +618,6 @@ export declare const AutoTuneApplyResultSchema: z.ZodDiscriminatedUnion<[z.ZodOb
663
618
  kind: z.ZodLiteral<"aborted">;
664
619
  phases: z.ZodReadonly<z.ZodArray<z.ZodObject<{
665
620
  phase: z.ZodEnum<{
666
- "camera-overrides": "camera-overrides";
667
- "detector-thresholds": "detector-thresholds";
668
621
  download: "download";
669
622
  "node-models": "node-models";
670
623
  redispatch: "redispatch";
@@ -853,33 +806,10 @@ export declare const AutoTuneApplyResultSchema: z.ZodDiscriminatedUnion<[z.ZodOb
853
806
  keys: z.ZodReadonly<z.ZodArray<z.ZodString>>;
854
807
  }, z.core.$strip>>>;
855
808
  }, z.core.$strip>>>;
856
- cameraClears: z.ZodReadonly<z.ZodArray<z.ZodObject<{
857
- deviceId: z.ZodNumber;
858
- source: z.ZodEnum<{
859
- "step-override": "step-override";
860
- wholesale: "wholesale";
861
- }>;
862
- nodeId: z.ZodString;
863
- deviceKey: z.ZodNullable<z.ZodString>;
864
- stepId: z.ZodString;
865
- modelIdBefore: z.ZodNullable<z.ZodString>;
866
- keys: z.ZodReadonly<z.ZodArray<z.ZodString>>;
867
- }, z.core.$strip>>>;
868
- detectorStoreClears: z.ZodReadonly<z.ZodArray<z.ZodObject<{
869
- deviceId: z.ZodNumber;
870
- keys: z.ZodReadonly<z.ZodArray<z.ZodString>>;
871
- }, z.core.$strip>>>;
872
809
  warnings: z.ZodReadonly<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
873
- kind: z.ZodLiteral<"detector-store-cluster-wide">;
874
- skippedNodes: z.ZodReadonly<z.ZodArray<z.ZodString>>;
875
- }, z.core.$strip>, z.ZodObject<{
876
- kind: z.ZodLiteral<"detector-store-unreadable">;
877
- error: z.ZodString;
878
- }, z.core.$strip>, z.ZodObject<{
879
810
  kind: z.ZodLiteral<"custom-pin-kept">;
880
811
  nodeId: z.ZodString;
881
- deviceKey: z.ZodNullable<z.ZodString>;
882
- deviceId: z.ZodNullable<z.ZodNumber>;
812
+ deviceKey: z.ZodString;
883
813
  modelId: z.ZodString;
884
814
  }, z.core.$strip>, z.ZodObject<{
885
815
  kind: z.ZodLiteral<"custom-registry-unreadable">;
@@ -898,8 +828,6 @@ export type AutoTuneApplyInput = z.infer<typeof AutoTuneApplyInputSchema>;
898
828
  export type AutoTuneApplyResult = z.infer<typeof AutoTuneApplyResultSchema>;
899
829
  export type AutoTunePhaseResult = z.infer<typeof AutoTunePhaseResultSchema>;
900
830
  export type AutoTuneWarning = z.infer<typeof AutoTuneWarningSchema>;
901
- export type DetectorStoreClear = z.infer<typeof DetectorStoreClearSchema>;
902
- export type AutoTuneCameraOverrideClear = z.infer<typeof CameraOverrideClearSchema>;
903
831
  export type AutoTuneNodeDeviceChange = z.infer<typeof NodeDeviceChangeSchema>;
904
832
  export type HardwareClassId = z.infer<typeof HardwareClassIdSchema>;
905
833
  export type AcceleratorKind = z.infer<typeof AcceleratorKindSchema>;
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * The layers of a detection step's settings, and the field-level edits on them
3
- * (D754).
3
+ * (D754, D927).
4
4
  *
5
- * A step's settings reach a session through up to three stored layers, merged
6
- * key by key — a key in a higher layer wins:
5
+ * A step's settings reach a session through two stored layers, merged key by
6
+ * key — a key in the higher layer wins:
7
7
  *
8
- * node the node's folded base (`inferenceDevices[node][*].steps`)
9
- * camera `cameraSettings[cam].stepSettings[step]` — every accelerator
10
- * accelerator `cameraSettings[cam].stepOverridesByDevice[node][key][step].settings`
8
+ * node the node's base for the accelerator that runs the step
9
+ * camera `cameraSettings[cam].stepSettings[step]` — camera-semantic
10
+ * keys only, on every accelerator (never a model-bound field)
11
11
  *
12
12
  * Below them sits the default: the running model's (D738) or the field's own.
13
13
  *
@@ -27,12 +27,11 @@
27
27
  export type StepSettingsBag = Readonly<Record<string, unknown>>;
28
28
  /** The stored layers, from the top. `undefined` = the layer stores nothing for this step. */
29
29
  export interface StepSettingsLayers {
30
- readonly accelerator?: StepSettingsBag;
31
30
  readonly camera?: StepSettingsBag;
32
31
  readonly node?: StepSettingsBag;
33
32
  }
34
33
  /** Which stored layer supplies a field, or `default` when none does. */
35
- export type StepSettingSource = 'accelerator' | 'camera' | 'node' | 'default';
34
+ export type StepSettingSource = 'camera' | 'node' | 'default';
36
35
  /**
37
36
  * The keys one field occupies in a bag: its own, plus its binding key when it
38
37
  * binds to a model. `boundKeys` = `collectModelBoundKeys(schema)`.
@@ -1,4 +1,4 @@
1
- const require_event_category = require("./event-category-7AwNbPjm.js");
1
+ const require_event_category = require("./event-category-CXrwjC3e.js");
2
2
  let zod = require("zod");
3
3
  //#region src/audio/audio-chunk-format.ts
4
4
  /**
@@ -7540,10 +7540,7 @@ function createDeviceProxy(api, binding, opts) {
7540
7540
  setCameraStepToggle: (input) => dispatchSystem("pipelineOrchestrator", "setCameraStepToggle", "mutation", input),
7541
7541
  getCameraDetectionSource: (input) => dispatchSystem("pipelineOrchestrator", "getCameraDetectionSource", "query", input),
7542
7542
  setCameraDetectionSource: (input) => dispatchSystem("pipelineOrchestrator", "setCameraDetectionSource", "mutation", input),
7543
- getCameraStepOverrides: (input) => dispatchSystem("pipelineOrchestrator", "getCameraStepOverrides", "query", input),
7544
- setCameraStepOverride: (input) => dispatchSystem("pipelineOrchestrator", "setCameraStepOverride", "mutation", input),
7545
7543
  setCameraStepSettings: (input) => dispatchSystem("pipelineOrchestrator", "setCameraStepSettings", "mutation", input),
7546
- setCameraPipelineForAgent: (input) => dispatchSystem("pipelineOrchestrator", "setCameraPipelineForAgent", "mutation", input),
7547
7544
  resolvePipeline: (input) => dispatchSystem("pipelineOrchestrator", "resolvePipeline", "query", input),
7548
7545
  getCameraSwitches: (input) => dispatchSystem("pipelineOrchestrator", "getCameraSwitches", "query", input),
7549
7546
  setCameraSwitch: (input) => dispatchSystem("pipelineOrchestrator", "setCameraSwitch", "mutation", input),
@@ -1,4 +1,4 @@
1
- import { t as EventCategory } from "./event-category-BfJwUd2S.mjs";
1
+ import { t as EventCategory } from "./event-category-fDPduoeC.mjs";
2
2
  import { z } from "zod";
3
3
  //#region src/audio/audio-chunk-format.ts
4
4
  /**
@@ -7540,10 +7540,7 @@ function createDeviceProxy(api, binding, opts) {
7540
7540
  setCameraStepToggle: (input) => dispatchSystem("pipelineOrchestrator", "setCameraStepToggle", "mutation", input),
7541
7541
  getCameraDetectionSource: (input) => dispatchSystem("pipelineOrchestrator", "getCameraDetectionSource", "query", input),
7542
7542
  setCameraDetectionSource: (input) => dispatchSystem("pipelineOrchestrator", "setCameraDetectionSource", "mutation", input),
7543
- getCameraStepOverrides: (input) => dispatchSystem("pipelineOrchestrator", "getCameraStepOverrides", "query", input),
7544
- setCameraStepOverride: (input) => dispatchSystem("pipelineOrchestrator", "setCameraStepOverride", "mutation", input),
7545
7543
  setCameraStepSettings: (input) => dispatchSystem("pipelineOrchestrator", "setCameraStepSettings", "mutation", input),
7546
- setCameraPipelineForAgent: (input) => dispatchSystem("pipelineOrchestrator", "setCameraPipelineForAgent", "mutation", input),
7547
7544
  resolvePipeline: (input) => dispatchSystem("pipelineOrchestrator", "resolvePipeline", "query", input),
7548
7545
  getCameraSwitches: (input) => dispatchSystem("pipelineOrchestrator", "getCameraSwitches", "query", input),
7549
7546
  setCameraSwitch: (input) => dispatchSystem("pipelineOrchestrator", "setCameraSwitch", "mutation", input),
@@ -9,39 +9,21 @@
9
9
  * 2. Camera opts in or out of specific addonIds via a boolean overlay
10
10
  * (`stepToggles`). Absent = inherit agent. Present = force.
11
11
  *
12
- * 3. Escape hatch: camera can pin a full pipeline wholesale for a
13
- * specific agent via `pipelineByAgent[agentNodeId]`. When set, it
14
- * bypasses addonDefaults + stepToggles entirely.
12
+ * 3. A model is chosen by the accelerator that runs it (D927): a camera
13
+ * turns steps on or off and may carry camera-semantic step settings,
14
+ * never a model, a model-bound threshold or a tree of its own.
15
15
  *
16
16
  * The resolver walks this chain and emits the existing
17
17
  * `CameraPipelineConfig` shape that the runner consumes — no changes
18
18
  * required downstream of the orchestrator.
19
19
  */
20
- import type { CameraPipelineConfig } from './camera-pipeline.js';
21
20
  import type { NodeColorId } from '../node-color.js';
22
- /**
23
- * LEGACY per-addon configuration (the removed per-node model layer,
24
- * `agent.addonDefaults[addonId]`). Retained ONLY for the one-shot boot
25
- * migration that strips `addonDefaults`, and for UI/library code pending
26
- * the per-(node,device) rework. New code carries model/settings per
27
- * `(node,device)` via {@link DeviceStepConfig}.
28
- *
29
- * modelId present ONLY when the operator explicitly chose a model;
30
- * absent = use this node's format default (resolved on-the-fly by the
31
- * provider).
32
- */
33
- export interface AgentAddonConfig {
34
- readonly enabled: boolean;
35
- readonly modelId?: string;
36
- readonly settings: Readonly<Record<string, unknown>>;
37
- }
38
21
  /**
39
22
  * Per-(node,device) BASE provisioning for one step: the model + intrinsic
40
23
  * settings the executing node applies for EVERY camera landing on that
41
24
  * accelerator. Both fields optional — absent = the executor resolves its own
42
- * format default at runtime. This is the same shape carried by the
43
- * per-camera-device OVERRIDE ({@link CameraStepOverridePatch}); the dispatch
44
- * provisioning stage merges override on top of base (`override ?? base`).
25
+ * format default at runtime. The ONE authority over which model a step runs
26
+ * on an accelerator (D927) — no camera layer overrides it.
45
27
  */
46
28
  export interface DeviceStepConfig {
47
29
  readonly modelId?: string;
@@ -55,17 +37,6 @@ export interface DeviceStepConfig {
55
37
  */
56
38
  readonly jumpDeviceKey?: string;
57
39
  }
58
- /**
59
- * Per-(camera,node,device,step) override patch over the per-(node,device)
60
- * base ({@link DeviceStepConfig}). Both fields optional — unset means
61
- * "inherit from the device base". Enablement is NOT carried here: which
62
- * steps run is the per-camera `stepToggles` authority. When `settings` is
63
- * present it merges over the base `settings` (override keys win).
64
- */
65
- export interface CameraStepOverridePatch {
66
- readonly modelId?: string;
67
- readonly settings?: Readonly<Record<string, unknown>>;
68
- }
69
40
  /**
70
41
  * Per-agent pipeline settings. Phase 2f: engine + hwaccel + audio
71
42
  * ownership moved to per-addon global settings (detection-pipeline,
@@ -128,6 +99,15 @@ export interface AgentPipelineSettings {
128
99
  * `assignNodeColorId(nodeId)` when missing.
129
100
  */
130
101
  readonly color?: NodeColorId;
102
+ /**
103
+ * NODE-wide step settings (D927): `[stepId] → { fieldKey → value }`, the
104
+ * content that holds on every accelerator of this node (an allow-list of
105
+ * species, an IoU). Never a model or a model-bound threshold — those belong
106
+ * to the accelerator (`inferenceDevices[key].steps[step]`). Merged under
107
+ * the device's own settings at dispatch; a sibling device entry is never
108
+ * read.
109
+ */
110
+ readonly stepSettings?: Readonly<Record<string, Readonly<Record<string, unknown>>>>;
131
111
  /**
132
112
  * Multi-device inference opt-in (Phase 4 multi-device). Maps a device key
133
113
  * (`openvino:npu`, `openvino:gpu`, `edgetpu:usb`, `edgetpu:usb:1`, `cpu`, …
@@ -142,8 +122,8 @@ export interface AgentPipelineSettings {
142
122
  *
143
123
  * `steps` (per-(node,device) BASE provisioning) — an optional
144
124
  * `stepId → {modelId?, settings?}` map: the default model + intrinsic
145
- * settings for EVERY camera landing on that accelerator, overridable
146
- * per-camera via `cameraSettings.stepOverridesByDevice`. A stepId ABSENT ⇒
125
+ * settings for EVERY camera landing on that accelerator (no camera layer
126
+ * overrides the model, D927). A stepId ABSENT ⇒
147
127
  * that step uses the device format default. A pinned modelId MUST have a
148
128
  * build for the device's FORMAT, else the executor's `resolveInputSteps`
149
129
  * substitutes it back to the format default (the UI only offers
@@ -166,40 +146,27 @@ export interface AgentPipelineSettings {
166
146
  export interface CameraPipelineSettings {
167
147
  readonly stepToggles?: Readonly<Record<string, boolean>>;
168
148
  /**
169
- * Camera-wide step SETTINGS (D754): `[addonId] → { fieldKey → value }`, the
170
- * fields this camera overrides on EVERY accelerator it is balanced onto. A
171
- * sparse, field-level bag — a key present here is an override, an absent key
172
- * inherits the node. Merge order at dispatch, per key:
173
- * node (folded base) ⊕ this ⊕ `stepOverridesByDevice[node][deviceKey]`.
174
- * A model-bound field (D738) is always written with its binding key.
175
- * Settings only: a model is a per-accelerator question (formats differ), so
176
- * it stays in `stepOverridesByDevice`.
149
+ * Camera-wide step SETTINGS (D754, narrowed by D927): `[addonId] → { fieldKey
150
+ * → value }`, the CAMERA-SEMANTIC fields this camera overrides on every
151
+ * accelerator it is balanced onto (an allow-list of classes, a zone-driven
152
+ * option). A sparse, field-level bag — a key present here is an override, an
153
+ * absent key inherits the node. Merge order at dispatch, per key:
154
+ * node ⊕ this. Never a model and never a model-bound threshold
155
+ * ({@link isModelScopedStepSettingKey}): those belong to the accelerator that
156
+ * runs the model — the writer refuses them and dispatch ignores a stored one.
177
157
  */
178
158
  readonly stepSettings?: Readonly<Record<string, Readonly<Record<string, unknown>>>>;
179
- /**
180
- * Per-(camera,node,device) model/settings override. Addressed by
181
- * `[agentNodeId][deviceKey][addonId]` because the camera is balanced onto
182
- * one `(node,deviceKey)` per session and a node's accelerators share no
183
- * format. Overrides the per-(node,device) base
184
- * (`inferenceDevices[node][deviceKey].steps`) for one camera on one
185
- * accelerator; the wholesale `pipelineByAgent[agent]` escape hatch, when
186
- * present, still bypasses this. Enablement is orthogonal (`stepToggles`).
187
- */
188
- readonly stepOverridesByDevice?: Readonly<Record<string, Readonly<Record<string, Readonly<Record<string, CameraStepOverridePatch>>>>>>;
189
- /**
190
- * Per-agent wholesale pipeline override. Engine is NOT stored here —
191
- * the override runs under the engine selected on that agent via the
192
- * detection-pipeline addon's global settings. Operator picks steps
193
- * + audio model/enabled only. This keeps the override portable
194
- * across agent-moves and prevents a camera from being pinned to an
195
- * engine the agent doesn't host. `modelId` absent = data-only model
196
- * selection — the executing node resolves its own format default.
197
- */
198
- readonly pipelineByAgent?: Readonly<Record<string, {
199
- readonly steps: CameraPipelineConfig['steps'];
200
- readonly audio: {
201
- readonly modelId?: string;
202
- readonly enabled: boolean;
203
- } | null;
204
- }>>;
205
159
  }
160
+ /**
161
+ * Is `key` a step setting that only the accelerator running the model may
162
+ * carry (D927)? A model id, a model binding (`<key>ModelId`, D738) or a
163
+ * confidence floor (`minConfidence*` — every `bindsToModel` field). A camera
164
+ * layer never stores one: the floor of one model is wrong on the next, and a
165
+ * camera does not know which accelerator — or which model — it lands on.
166
+ * (Per-camera thresholds are a possible future extension, see D927.)
167
+ */
168
+ export declare function isModelScopedStepSettingKey(key: string): boolean;
169
+ /** The keys of `bag` a camera layer may not carry ({@link isModelScopedStepSettingKey}), sorted. */
170
+ export declare function modelScopedStepSettingKeys(bag: Readonly<Record<string, unknown>>): string[];
171
+ /** `bag` without its model-scoped keys — what a camera layer contributes at dispatch. Fresh object. */
172
+ export declare function cameraScopedStepSettings(bag: Readonly<Record<string, unknown>>): Record<string, unknown>;
@@ -37,8 +37,8 @@ export interface CameraPipelineConfig {
37
37
  /**
38
38
  * Present ONLY when the operator explicitly chose an audio model;
39
39
  * absent = use this node's format default (resolved on-the-fly by
40
- * the provider). Mirrors `AgentAddonConfig.modelId` (Task 4/5 of the
41
- * engine-node-local refactor — model selection is data only).
40
+ * the provider). Model selection is data only (the engine-node-local
41
+ * refactor).
42
42
  */
43
43
  readonly modelId?: string;
44
44
  readonly enabled: boolean;
@@ -545,13 +545,23 @@ export interface FrameResult {
545
545
  * track keeps it so a later replay can name the original model (D646).
546
546
  */
547
547
  readonly rootModelId?: string;
548
+ /**
549
+ * The step (addon id) of the root {@link rootModelId} names — the detector
550
+ * whose boxes this frame's tracks are born from. Stamped beside it, same
551
+ * absence rule. With {@link rootModelId} and {@link rootDeviceKey} it is the
552
+ * session's detector, which the birth confirmation gate re-judges a birth
553
+ * with (D925).
554
+ */
555
+ readonly rootStepId?: string;
548
556
  /**
549
557
  * The inference DEVICE the root ran on (`openvino:npu`, `edgetpu:pci`,
550
- * `onnx:webgpu` …) — the pool the dispatch actually used, stamped beside
551
- * {@link rootModelId}. A session can hop node or device between on-motion
552
- * sessions (D916), so a stored track keeps the device of the frame that
553
- * opened it and of the sighting that closed it. Absent on a frame no
554
- * pipeline root produced, and from a runner older than the field.
558
+ * `onnx:webgpu` …) — the pool the dispatch actually used, after re-election
559
+ * and the capability fallback, stamped beside {@link rootModelId}. A session
560
+ * can hop node or device between on-motion sessions (D916), so a stored
561
+ * track keeps the device of the frame that opened it and of the sighting
562
+ * that closed it (D924); the confirmation gate re-judges a birth on this
563
+ * pool (D925). Absent on a frame no pipeline root produced, and from a
564
+ * runner older than the field.
555
565
  */
556
566
  readonly rootDeviceKey?: string;
557
567
  /**
@@ -111,22 +111,6 @@ export interface StepDefinition {
111
111
  * rather than out).
112
112
  */
113
113
  readonly enabledByDefault?: boolean;
114
- /**
115
- * Opt-in: when `true`, this step is BACK-FILLED into a camera's stored
116
- * wholesale pipeline override (`cameraSettings.pipelineByAgent`) at resolve
117
- * time if it is absent from that snapshot — see
118
- * `mergeEnabledByDefaultSteps`. Set this ONLY on a genuinely-NEW default
119
- * step that shipped AFTER existing snapshots were captured and must reach
120
- * them (e.g. `clip-embedding` for object semantic search).
121
- *
122
- * It exists because absence-from-a-snapshot is ambiguous: it can mean
123
- * "predates this step" OR "operator deliberately pruned it". A broad
124
- * "back-fill every default" would resurrect deliberate removals of
125
- * long-existing steps (face-detection, etc.). This flag makes back-fill
126
- * strictly opt-in so only a new step re-enters existing overrides; absent
127
- * (the default) preserves operator intent verbatim. Absent = `false`.
128
- */
129
- readonly backfillIntoExistingOverrides?: boolean;
130
114
  /** Default confidence threshold */
131
115
  readonly defaultConfidence: number;
132
116
  /** Runtime label lookup (e.g., class name arrays for softmax, charset for CTC) */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/types",
3
- "version": "1.2.403",
3
+ "version": "1.2.404",
4
4
  "description": "Shared types, interfaces, and model catalogs for the CamStack detection ecosystem",
5
5
  "keywords": [
6
6
  "camstack",