@camstack/types 1.2.259 → 1.2.261

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 (73) hide show
  1. package/dist/addon/base-addon.d.ts +9 -1
  2. package/dist/addon.js +15 -7
  3. package/dist/addon.mjs +15 -7
  4. package/dist/capabilities/camera-streams.cap.d.ts +5 -5
  5. package/dist/capabilities/capability-definition.d.ts +9 -0
  6. package/dist/capabilities/custom-model-registry.cap.d.ts +18 -12
  7. package/dist/capabilities/decoder.cap.d.ts +12 -12
  8. package/dist/capabilities/device-extension.cap.d.ts +370 -0
  9. package/dist/capabilities/device-manager.cap.d.ts +45 -5
  10. package/dist/capabilities/doorbell.cap.d.ts +41 -0
  11. package/dist/capabilities/embedding-encoder.cap.d.ts +175 -0
  12. package/dist/capabilities/index.d.ts +17 -14
  13. package/dist/capabilities/llm-runtime.cap.d.ts +4 -4
  14. package/dist/capabilities/llm-shared.d.ts +6 -6
  15. package/dist/capabilities/llm.cap.d.ts +6 -6
  16. package/dist/capabilities/load-contribution.cap.d.ts +2 -2
  17. package/dist/capabilities/model-convert.cap.d.ts +9 -6
  18. package/dist/capabilities/model-distributor.cap.d.ts +18 -12
  19. package/dist/capabilities/motion-detection.cap.d.ts +4 -4
  20. package/dist/capabilities/notification-rules.cap.d.ts +603 -31
  21. package/dist/capabilities/osd-manager.cap.d.ts +7 -7
  22. package/dist/capabilities/pipeline-analytics.cap.d.ts +130 -129
  23. package/dist/capabilities/pipeline-executor.cap.d.ts +78 -120
  24. package/dist/capabilities/pipeline-orchestrator.cap.d.ts +78 -65
  25. package/dist/capabilities/pipeline-runner.cap.d.ts +30 -6
  26. package/dist/capabilities/platform-probe.cap.d.ts +4 -13
  27. package/dist/capabilities/recording-export.cap.d.ts +7 -7
  28. package/dist/capabilities/schemas/detection-shared.d.ts +4 -4
  29. package/dist/capabilities/schemas/streaming-shared.d.ts +8 -8
  30. package/dist/capabilities/stream-broker.cap.d.ts +9 -9
  31. package/dist/capabilities/system.cap.d.ts +2 -2
  32. package/dist/capabilities/vacuum-control.cap.d.ts +13 -13
  33. package/dist/capabilities/vector-store.cap.d.ts +14 -0
  34. package/dist/capabilities/videoclips.cap.d.ts +5 -5
  35. package/dist/capabilities/webrtc-session.cap.d.ts +2 -2
  36. package/dist/device-extension/index.d.ts +3 -0
  37. package/dist/device-extension/slot-descriptor.d.ts +62 -0
  38. package/dist/device-extension/slot-provider.d.ts +68 -0
  39. package/dist/generated/addon-api.d.ts +59 -9
  40. package/dist/generated/cap-input-defaults.d.ts +1 -1
  41. package/dist/generated/capability-router-map.d.ts +5 -2
  42. package/dist/generated/collection-array-methods.d.ts +1 -1
  43. package/dist/generated/device-proxy.d.ts +7 -7
  44. package/dist/generated/device-scoped-caps.d.ts +1 -1
  45. package/dist/generated/extension-slots.d.ts +39 -0
  46. package/dist/generated/method-access-map.d.ts +1 -1
  47. package/dist/generated/method-device-selectors.d.ts +1 -1
  48. package/dist/generated/system-proxy.d.ts +4 -2
  49. package/dist/index.d.ts +8 -3
  50. package/dist/index.js +3125 -1792
  51. package/dist/index.mjs +3049 -1788
  52. package/dist/interfaces/addon.d.ts +41 -0
  53. package/dist/interfaces/event-bus.d.ts +11 -1
  54. package/dist/interfaces/pipeline-executor-capability.d.ts +15 -6
  55. package/dist/interfaces/platform.d.ts +2 -2
  56. package/dist/interfaces/stream-broker.d.ts +2 -2
  57. package/dist/node.d.ts +1 -0
  58. package/dist/node.js +73 -7
  59. package/dist/node.mjs +73 -8
  60. package/dist/notification/system-event-summary.d.ts +83 -0
  61. package/dist/notification/template-vars.d.ts +15 -0
  62. package/dist/pipeline/cluster-model-scope.d.ts +59 -3
  63. package/dist/{sleep-DU7mu4wb.mjs → sleep-BXv0ZcRa.mjs} +49 -33
  64. package/dist/{sleep-DtomDrRW.js → sleep-QxyLiUId.js} +54 -32
  65. package/dist/storage/atomic-write.d.ts +25 -0
  66. package/dist/types/clip-model.d.ts +64 -0
  67. package/dist/types/detection.d.ts +9 -0
  68. package/dist/types/models.d.ts +18 -19
  69. package/dist/types/pipeline-step.d.ts +9 -1
  70. package/dist/types/pipeline.d.ts +2 -1
  71. package/dist/utils/background-run-registry.d.ts +69 -0
  72. package/dist/utils/runtime-mapping.d.ts +9 -54
  73. package/package.json +1 -1
@@ -490,8 +490,8 @@ declare const LoggingSettingsPatchSchema: z.ZodObject<{
490
490
  declare const ReportedLoadContributionSchema: z.ZodObject<{
491
491
  role: z.ZodEnum<{
492
492
  recording: "recording";
493
- streaming: "streaming";
494
493
  detection: "detection";
494
+ streaming: "streaming";
495
495
  decode: "decode";
496
496
  transcode: "transcode";
497
497
  }>;
@@ -811,8 +811,8 @@ export declare const systemCapability: {
811
811
  readonly getLoadContributions: import("./capability-definition.js").CapabilityMethodSchema<z.ZodVoid, z.ZodReadonly<z.ZodArray<z.ZodObject<{
812
812
  role: z.ZodEnum<{
813
813
  recording: "recording";
814
- streaming: "streaming";
815
814
  detection: "detection";
815
+ streaming: "streaming";
816
816
  decode: "decode";
817
817
  transcode: "transcode";
818
818
  }>;
@@ -46,9 +46,9 @@ export type VacuumState = z.infer<typeof VacuumStateSchema>;
46
46
  export declare const TankStatusSchema: z.ZodObject<{
47
47
  level: z.ZodNullable<z.ZodNumber>;
48
48
  status: z.ZodNullable<z.ZodEnum<{
49
+ full: "full";
49
50
  low: "low";
50
51
  ok: "ok";
51
- full: "full";
52
52
  }>>;
53
53
  }, z.core.$strip>;
54
54
  export type TankStatus = z.infer<typeof TankStatusSchema>;
@@ -68,33 +68,33 @@ export declare const VacuumControlStatusSchema: z.ZodObject<{
68
68
  cleanWater: z.ZodNullable<z.ZodObject<{
69
69
  level: z.ZodNullable<z.ZodNumber>;
70
70
  status: z.ZodNullable<z.ZodEnum<{
71
+ full: "full";
71
72
  low: "low";
72
73
  ok: "ok";
73
- full: "full";
74
74
  }>>;
75
75
  }, z.core.$strip>>;
76
76
  dirtyWater: z.ZodNullable<z.ZodObject<{
77
77
  level: z.ZodNullable<z.ZodNumber>;
78
78
  status: z.ZodNullable<z.ZodEnum<{
79
+ full: "full";
79
80
  low: "low";
80
81
  ok: "ok";
81
- full: "full";
82
82
  }>>;
83
83
  }, z.core.$strip>>;
84
84
  detergent: z.ZodNullable<z.ZodObject<{
85
85
  level: z.ZodNullable<z.ZodNumber>;
86
86
  status: z.ZodNullable<z.ZodEnum<{
87
+ full: "full";
87
88
  low: "low";
88
89
  ok: "ok";
89
- full: "full";
90
90
  }>>;
91
91
  }, z.core.$strip>>;
92
92
  dustBin: z.ZodNullable<z.ZodObject<{
93
93
  level: z.ZodNullable<z.ZodNumber>;
94
94
  status: z.ZodNullable<z.ZodEnum<{
95
+ full: "full";
95
96
  low: "low";
96
97
  ok: "ok";
97
- full: "full";
98
98
  }>>;
99
99
  }, z.core.$strip>>;
100
100
  progressPercent: z.ZodNullable<z.ZodNumber>;
@@ -147,33 +147,33 @@ export declare const vacuumControlCapability: {
147
147
  cleanWater: z.ZodNullable<z.ZodObject<{
148
148
  level: z.ZodNullable<z.ZodNumber>;
149
149
  status: z.ZodNullable<z.ZodEnum<{
150
+ full: "full";
150
151
  low: "low";
151
152
  ok: "ok";
152
- full: "full";
153
153
  }>>;
154
154
  }, z.core.$strip>>;
155
155
  dirtyWater: z.ZodNullable<z.ZodObject<{
156
156
  level: z.ZodNullable<z.ZodNumber>;
157
157
  status: z.ZodNullable<z.ZodEnum<{
158
+ full: "full";
158
159
  low: "low";
159
160
  ok: "ok";
160
- full: "full";
161
161
  }>>;
162
162
  }, z.core.$strip>>;
163
163
  detergent: z.ZodNullable<z.ZodObject<{
164
164
  level: z.ZodNullable<z.ZodNumber>;
165
165
  status: z.ZodNullable<z.ZodEnum<{
166
+ full: "full";
166
167
  low: "low";
167
168
  ok: "ok";
168
- full: "full";
169
169
  }>>;
170
170
  }, z.core.$strip>>;
171
171
  dustBin: z.ZodNullable<z.ZodObject<{
172
172
  level: z.ZodNullable<z.ZodNumber>;
173
173
  status: z.ZodNullable<z.ZodEnum<{
174
+ full: "full";
174
175
  low: "low";
175
176
  ok: "ok";
176
- full: "full";
177
177
  }>>;
178
178
  }, z.core.$strip>>;
179
179
  progressPercent: z.ZodNullable<z.ZodNumber>;
@@ -203,33 +203,33 @@ export declare const vacuumControlCapability: {
203
203
  cleanWater: z.ZodNullable<z.ZodObject<{
204
204
  level: z.ZodNullable<z.ZodNumber>;
205
205
  status: z.ZodNullable<z.ZodEnum<{
206
+ full: "full";
206
207
  low: "low";
207
208
  ok: "ok";
208
- full: "full";
209
209
  }>>;
210
210
  }, z.core.$strip>>;
211
211
  dirtyWater: z.ZodNullable<z.ZodObject<{
212
212
  level: z.ZodNullable<z.ZodNumber>;
213
213
  status: z.ZodNullable<z.ZodEnum<{
214
+ full: "full";
214
215
  low: "low";
215
216
  ok: "ok";
216
- full: "full";
217
217
  }>>;
218
218
  }, z.core.$strip>>;
219
219
  detergent: z.ZodNullable<z.ZodObject<{
220
220
  level: z.ZodNullable<z.ZodNumber>;
221
221
  status: z.ZodNullable<z.ZodEnum<{
222
+ full: "full";
222
223
  low: "low";
223
224
  ok: "ok";
224
- full: "full";
225
225
  }>>;
226
226
  }, z.core.$strip>>;
227
227
  dustBin: z.ZodNullable<z.ZodObject<{
228
228
  level: z.ZodNullable<z.ZodNumber>;
229
229
  status: z.ZodNullable<z.ZodEnum<{
230
+ full: "full";
230
231
  low: "low";
231
232
  ok: "ok";
232
- full: "full";
233
233
  }>>;
234
234
  }, z.core.$strip>>;
235
235
  progressPercent: z.ZodNullable<z.ZodNumber>;
@@ -232,6 +232,20 @@ export declare const VectorScanResultSchema: z.ZodObject<{
232
232
  }, z.core.$strip>>;
233
233
  nextCursor: z.ZodNullable<z.ZodNumber>;
234
234
  }, z.core.$strip>;
235
+ /**
236
+ * The ONE error code for "this index exists at another dimension; refusing to
237
+ * redeclare it" (D649). It rides in the MESSAGE — an Error's own properties do
238
+ * not survive the UDS/tRPC hop, its message does — and both sides go through
239
+ * the helpers below, never a copied phrase: a consumer that must tell "this
240
+ * index can never hold my vectors" from "the provider is unreachable" (a
241
+ * delete counts the first as nothing-to-delete and the second as still
242
+ * present) otherwise breaks silently the day the wording changes.
243
+ */
244
+ export declare const VECTOR_INDEX_DIM_CONFLICT = "vector-index-dim-conflict";
245
+ /** The provider's refusal, carrying {@link VECTOR_INDEX_DIM_CONFLICT}. */
246
+ export declare function vectorIndexDimConflictError(index: string, declaredDim: number, requestedDim: number): Error;
247
+ /** True when `err` (possibly re-wrapped by a transport) is that refusal. */
248
+ export declare function isVectorIndexDimConflict(err: unknown): boolean;
235
249
  export declare const VectorStatsInputSchema: z.ZodObject<{
236
250
  index: z.ZodString;
237
251
  }, z.core.$strip>;
@@ -61,6 +61,7 @@ export declare const MAX_CLIP_LABELS = 3;
61
61
  * rendered as `Refused: <prose>`.
62
62
  */
63
63
  export declare const ClipStillRefusalCodeSchema: z.ZodEnum<{
64
+ "unknown-device": "unknown-device";
64
65
  sleeping: "sleeping";
65
66
  unsupported: "unsupported";
66
67
  "camera-refused": "camera-refused";
@@ -69,7 +70,6 @@ export declare const ClipStillRefusalCodeSchema: z.ZodEnum<{
69
70
  "camera-backoff": "camera-backoff";
70
71
  "decode-failed": "decode-failed";
71
72
  "no-catalog-row": "no-catalog-row";
72
- "unknown-device": "unknown-device";
73
73
  "uid-missing": "uid-missing";
74
74
  }>;
75
75
  export type ClipStillRefusalCode = z.infer<typeof ClipStillRefusalCodeSchema>;
@@ -348,8 +348,8 @@ export type ClipBytesOffer = z.infer<typeof ClipBytesOfferSchema>;
348
348
  * negotiates — and `none` is a stream asked for, or served, without sound.
349
349
  */
350
350
  export declare const ClipStreamAudioSchema: z.ZodEnum<{
351
- pcmu: "pcmu";
352
351
  none: "none";
352
+ pcmu: "pcmu";
353
353
  opus: "opus";
354
354
  }>;
355
355
  export type ClipStreamAudio = z.infer<typeof ClipStreamAudioSchema>;
@@ -382,8 +382,8 @@ export declare const ClipStreamDialSchema: z.ZodObject<{
382
382
  low: "low";
383
383
  }>;
384
384
  servedAudio: z.ZodEnum<{
385
- pcmu: "pcmu";
386
385
  none: "none";
386
+ pcmu: "pcmu";
387
387
  opus: "opus";
388
388
  }>;
389
389
  audioReason: z.ZodOptional<z.ZodEnum<{
@@ -857,8 +857,8 @@ export declare const videoclipsCapability: {
857
857
  low: "low";
858
858
  }>>;
859
859
  audio: z.ZodOptional<z.ZodEnum<{
860
- pcmu: "pcmu";
861
860
  none: "none";
861
+ pcmu: "pcmu";
862
862
  opus: "opus";
863
863
  }>>;
864
864
  }, z.core.$strip>, z.ZodObject<{
@@ -871,8 +871,8 @@ export declare const videoclipsCapability: {
871
871
  low: "low";
872
872
  }>;
873
873
  servedAudio: z.ZodEnum<{
874
- pcmu: "pcmu";
875
874
  none: "none";
875
+ pcmu: "pcmu";
876
876
  opus: "opus";
877
877
  }>;
878
878
  audioReason: z.ZodOptional<z.ZodEnum<{
@@ -181,8 +181,8 @@ export declare const WebrtcSessionDebugSchema: z.ZodObject<{
181
181
  camStreamId: z.ZodNullable<z.ZodString>;
182
182
  sourceKind: z.ZodEnum<{
183
183
  unknown: "unknown";
184
- derived: "derived";
185
184
  native: "native";
185
+ derived: "derived";
186
186
  }>;
187
187
  adaptive: z.ZodBoolean;
188
188
  servedTier: z.ZodNullable<z.ZodEnum<{
@@ -586,8 +586,8 @@ export declare const webrtcSessionCapability: {
586
586
  camStreamId: z.ZodNullable<z.ZodString>;
587
587
  sourceKind: z.ZodEnum<{
588
588
  unknown: "unknown";
589
- derived: "derived";
590
589
  native: "native";
590
+ derived: "derived";
591
591
  }>;
592
592
  adaptive: z.ZodBoolean;
593
593
  servedTier: z.ZodNullable<z.ZodEnum<{
@@ -0,0 +1,3 @@
1
+ export type { ExtensionSlotCardinality, ExtensionSlotDescriptor, ExtensionSlotShape, } from './slot-descriptor.js';
2
+ export { createDeviceExtensionProvider, defineExtensionSlotProvider, extensionSlotRef, type DeviceExtensionProviderOptions, type ExtensionSlotImpl, type ExtensionSlotListing, type ExtensionSlotProvider, type ExtensionSlotValueOf, } from './slot-provider.js';
3
+ export { EXTENSION_HOST_DEVICE_TYPES, EXTENSION_SLOT_IDS, EXTENSION_SLOTS, ExtensionSlotIdSchema, ExtensionSlotValueSchema, type ExtensionSlotEntry, type ExtensionSlotId, type ExtensionSlotValue, } from '../generated/extension-slots.js';
@@ -0,0 +1,62 @@
1
+ /**
2
+ * An EXTENSION SLOT — one way a device can be extended by OTHER devices,
3
+ * declared by the capability that already owns the function (D648).
4
+ *
5
+ * A slot is metadata, and behavioural metadata lives in the owning `*.cap.ts`
6
+ * (D4): `device-manager.cap.ts` declares `linked-devices`, `doorbell.cap.ts`
7
+ * declares `doorbell-source`. `npm run codegen` folds every declaration into
8
+ * `generated/extension-slots.ts` (the id enum, the table and the discriminated
9
+ * union of slot values), and `device-extension` is the device-scoped
10
+ * collection contract that lists and writes them. The contract persists
11
+ * NOTHING: each slot is served by the addon that owns its store (D62).
12
+ *
13
+ * Two shapes:
14
+ *
15
+ * - `association` — the host LISTS other devices (a camera's linked devices,
16
+ * its doorbell trigger sources). Removing every source is "off"; there is
17
+ * no separate switch.
18
+ * - `graft` — the host GAINS a whole capability (`projects`), registered
19
+ * natively by the host's own provider from sources it owns. Declared here
20
+ * so the contract has room for it; the first graft (HA consumables) is
21
+ * slice 2, and a graft carries its own `enabled` switch.
22
+ */
23
+ import type { z } from 'zod';
24
+ import type { DeviceType } from '../device/device-type.js';
25
+ /** How a slot extends its host. See the module docblock. */
26
+ export type ExtensionSlotShape = 'association' | 'graft';
27
+ /** How many sources a slot takes. */
28
+ export type ExtensionSlotCardinality = 'one' | 'many';
29
+ /**
30
+ * One slot, as declared in its owning `*.cap.ts`.
31
+ *
32
+ * `value` is the slot's EDITABLE value — what `setSlot` takes and `listSlots`
33
+ * returns. It must be a Zod OBJECT that does not itself carry a `slot` key:
34
+ * codegen extends it with `slot: z.literal(<id>)` to build the discriminated
35
+ * union, and it must be a NAMED EXPORT of the declaring cap file (codegen
36
+ * imports it by name so the generated module never imports the caps barrel).
37
+ */
38
+ export interface ExtensionSlotDescriptor<TValue extends z.ZodObject = z.ZodObject> {
39
+ /** Kebab id, unique across every cap. Becomes a member of `ExtensionSlotId`. */
40
+ readonly id: string;
41
+ /** Operator-facing name of the slot ("Linked devices"). */
42
+ readonly label: string;
43
+ /** One sentence saying what a source of this slot DOES to the host. */
44
+ readonly description: string;
45
+ readonly shape: ExtensionSlotShape;
46
+ /**
47
+ * Host device types the slot is offered on. Absent = the declaring cap's
48
+ * `deviceTypes`; a slot on a cap that declares none (a `system` cap such as
49
+ * `device-manager`) MUST state it (guarded).
50
+ */
51
+ readonly hostDeviceTypes?: readonly DeviceType[];
52
+ /**
53
+ * Source filter for the picker, tested against a candidate's capabilities
54
+ * (D12: its bindings, never the global cap list). `'any'` = no cap filter.
55
+ */
56
+ readonly sourceCaps: readonly string[] | 'any';
57
+ readonly cardinality: ExtensionSlotCardinality;
58
+ /** graft only — MUST equal the declaring cap's `name` (guarded). */
59
+ readonly projects?: string;
60
+ /** The slot's editable value. See the interface docblock. */
61
+ readonly value: TValue;
62
+ }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * The owner's side of `device-extension` (D648): `defineExtensionSlotProvider`
3
+ * binds ONE slot id to the functions that read and write the owner's existing
4
+ * store, and `createDeviceExtensionProvider` turns an owner's slots into the
5
+ * cap provider it registers.
6
+ *
7
+ * The id is typed on the GENERATED `ExtensionSlotId`, so a typo does not
8
+ * compile, and the literal `defineExtensionSlotProvider('<id>'` is what
9
+ * `scripts/check-extension-slots.ts` counts to prove every declared slot has
10
+ * exactly one owner.
11
+ *
12
+ * Nothing here persists. An owner's `set` goes through the same function its
13
+ * pre-existing surface uses; this module only routes, checks the host type and
14
+ * logs the write.
15
+ */
16
+ import type { IScopedLogger } from '../interfaces/logging.js';
17
+ import { type ExtensionCandidate, type ExtensionSetResult, type ExtensionSlotActivation, type ExtensionSlotSource, type IDeviceExtensionProvider } from '../capabilities/device-extension.cap.js';
18
+ import { type ExtensionSlotId, type ExtensionSlotValue } from '../generated/extension-slots.js';
19
+ /** The value shape of ONE slot, picked out of the generated union. */
20
+ export type ExtensionSlotValueOf<Id extends ExtensionSlotId> = Extract<ExtensionSlotValue, {
21
+ readonly slot: Id;
22
+ }>;
23
+ /** What an owner reads for one host: everything of the row but the routing. */
24
+ export interface ExtensionSlotListing<Id extends ExtensionSlotId> {
25
+ /** The store written (D62), `<addon>:<key>`. */
26
+ readonly authority: string;
27
+ /** graft: its switch; association: null. */
28
+ readonly enabled: boolean | null;
29
+ readonly activation: ExtensionSlotActivation | null;
30
+ readonly value: ExtensionSlotValueOf<Id>;
31
+ readonly sources: readonly ExtensionSlotSource[];
32
+ }
33
+ /** The three functions an owner implements for one slot. */
34
+ export interface ExtensionSlotImpl<Id extends ExtensionSlotId> {
35
+ /** The slot as the owner's store holds it, or null when this host is not the owner's. */
36
+ list(deviceId: number): Promise<ExtensionSlotListing<Id> | null>;
37
+ /** Write through the owner's EXISTING path. Refuse by name before persisting. */
38
+ set(deviceId: number, value: ExtensionSlotValueOf<Id>): Promise<ExtensionSetResult>;
39
+ /** Devices the editor may offer, suggestions pre-marked and never saved. */
40
+ candidates(deviceId: number): Promise<readonly ExtensionCandidate[]>;
41
+ }
42
+ /** A slot bound to its owner, with the id erased so owners can hold a list. */
43
+ export interface ExtensionSlotProvider {
44
+ readonly slot: ExtensionSlotId;
45
+ list(deviceId: number): Promise<ExtensionSlotListing<ExtensionSlotId> | null>;
46
+ set(deviceId: number, value: ExtensionSlotValue): Promise<ExtensionSetResult>;
47
+ candidates(deviceId: number): Promise<readonly ExtensionCandidate[]>;
48
+ }
49
+ /** Bind slot `slot` to its owner's functions. See the module docblock. */
50
+ export declare function defineExtensionSlotProvider<Id extends ExtensionSlotId>(slot: Id, impl: ExtensionSlotImpl<Id>): ExtensionSlotProvider;
51
+ /** `<source>:<slotId>`. */
52
+ export declare function extensionSlotRef(source: string, slot: ExtensionSlotId): string;
53
+ export interface DeviceExtensionProviderOptions {
54
+ /** The routing prefix of every `slotRef` this owner serves. */
55
+ readonly source: string;
56
+ readonly label: string;
57
+ readonly slots: readonly ExtensionSlotProvider[];
58
+ /**
59
+ * The host's device type, answered LOCALLY by the owner (R6: a provider
60
+ * answers `[]` for a host it does not serve without a fleet round trip), or
61
+ * null when the owner does not know the device. A THROW is not "unknown":
62
+ * it propagates, and the dispatcher turns it into an `unreachable` row.
63
+ */
64
+ readonly hostTypeOf: (deviceId: number) => Promise<string | null>;
65
+ readonly logger: IScopedLogger;
66
+ }
67
+ /** Build the `device-extension` provider one owner registers. */
68
+ export declare function createDeviceExtensionProvider(options: DeviceExtensionProviderOptions): IDeviceExtensionProvider;
@@ -40,6 +40,7 @@ import type { deviceAdminLinkCapability } from '../capabilities/device-admin-lin
40
40
  import type { deviceAdoptionCapability } from '../capabilities/device-adoption.cap.js';
41
41
  import type { deviceDiscoveryCapability } from '../capabilities/device-discovery.cap.js';
42
42
  import type { deviceExportCapability } from '../capabilities/device-export.cap.js';
43
+ import type { deviceExtensionCapability } from '../capabilities/device-extension.cap.js';
43
44
  import type { deviceManagerCapability } from '../capabilities/device-manager.cap.js';
44
45
  import type { deviceOpsCapability } from '../capabilities/device-ops.cap.js';
45
46
  import type { deviceProviderCapability } from '../capabilities/device-provider.cap.js';
@@ -2104,6 +2105,41 @@ export type AppRouter = TrpcCoreRouter<{
2104
2105
  meta: object;
2105
2106
  }>;
2106
2107
  }>>;
2108
+ deviceExtension: TRPCBuiltRouter<{
2109
+ ctx: TrpcContext;
2110
+ meta: object;
2111
+ errorShape: AugmentedErrorShape;
2112
+ transformer: true;
2113
+ }, TRPCDecorateCreateRouterOptions<{
2114
+ listSources: TRPCQueryProcedure<{
2115
+ input: {
2116
+ [x: string]: unknown;
2117
+ } & z.input<typeof deviceExtensionCapability.methods.listSources.input>;
2118
+ output: z.infer<typeof deviceExtensionCapability.methods.listSources.output>;
2119
+ meta: object;
2120
+ }>;
2121
+ listSlots: TRPCQueryProcedure<{
2122
+ input: {
2123
+ [x: string]: unknown;
2124
+ } & z.input<typeof deviceExtensionCapability.methods.listSlots.input>;
2125
+ output: z.infer<typeof deviceExtensionCapability.methods.listSlots.output>;
2126
+ meta: object;
2127
+ }>;
2128
+ listCandidates: TRPCQueryProcedure<{
2129
+ input: {
2130
+ [x: string]: unknown;
2131
+ } & z.input<typeof deviceExtensionCapability.methods.listCandidates.input>;
2132
+ output: z.infer<typeof deviceExtensionCapability.methods.listCandidates.output>;
2133
+ meta: object;
2134
+ }>;
2135
+ setSlot: TRPCMutationProcedure<{
2136
+ input: {
2137
+ [x: string]: unknown;
2138
+ } & z.input<typeof deviceExtensionCapability.methods.setSlot.input>;
2139
+ output: z.infer<typeof deviceExtensionCapability.methods.setSlot.output>;
2140
+ meta: object;
2141
+ }>;
2142
+ }>>;
2107
2143
  deviceManager: TRPCBuiltRouter<{
2108
2144
  ctx: TrpcContext;
2109
2145
  meta: object;
@@ -3032,6 +3068,13 @@ export type AppRouter = TrpcCoreRouter<{
3032
3068
  output: z.infer<typeof embeddingEncoderCapability.methods.getInfo.output>;
3033
3069
  meta: object;
3034
3070
  }>;
3071
+ resetFailedModels: TRPCMutationProcedure<{
3072
+ input: {
3073
+ [x: string]: unknown;
3074
+ } & z.input<typeof embeddingEncoderCapability.methods.resetFailedModels.input>;
3075
+ output: z.infer<typeof embeddingEncoderCapability.methods.resetFailedModels.output>;
3076
+ meta: object;
3077
+ }>;
3035
3078
  }>>;
3036
3079
  enumSensor: TRPCBuiltRouter<{
3037
3080
  ctx: TrpcContext;
@@ -4903,6 +4946,13 @@ export type AppRouter = TrpcCoreRouter<{
4903
4946
  output: z.infer<typeof notificationRulesCapability.methods.testRule.output>;
4904
4947
  meta: object;
4905
4948
  }>;
4949
+ previewStateSummary: TRPCMutationProcedure<{
4950
+ input: {
4951
+ [x: string]: unknown;
4952
+ } & z.input<typeof notificationRulesCapability.methods.previewStateSummary.input>;
4953
+ output: z.infer<typeof notificationRulesCapability.methods.previewStateSummary.output>;
4954
+ meta: object;
4955
+ }>;
4906
4956
  getConditionCatalog: TRPCQueryProcedure<{
4907
4957
  input: {
4908
4958
  [x: string]: unknown;
@@ -5604,13 +5654,6 @@ export type AppRouter = TrpcCoreRouter<{
5604
5654
  output: z.infer<typeof pipelineAnalyticsCapability.methods.proposeRetrainAnnotations.output>;
5605
5655
  meta: object;
5606
5656
  }>;
5607
- runReplayFrameProcessor: TRPCMutationProcedure<{
5608
- input: {
5609
- [x: string]: unknown;
5610
- } & z.input<typeof pipelineAnalyticsCapability.methods.runReplayFrameProcessor.input>;
5611
- output: z.infer<typeof pipelineAnalyticsCapability.methods.runReplayFrameProcessor.output>;
5612
- meta: object;
5613
- }>;
5614
5657
  listRetrainAnnotations: TRPCQueryProcedure<{
5615
5658
  input: {
5616
5659
  [x: string]: unknown;
@@ -5907,8 +5950,8 @@ export type AppRouter = TrpcCoreRouter<{
5907
5950
  }>;
5908
5951
  getEffectiveTuning: TRPCQueryProcedure<{
5909
5952
  input: {
5910
- nodeId?: string | undefined;
5911
- } | undefined;
5953
+ [x: string]: unknown;
5954
+ } & z.input<typeof pipelineExecutorCapability.methods.getEffectiveTuning.input>;
5912
5955
  output: z.infer<typeof pipelineExecutorCapability.methods.getEffectiveTuning.output>;
5913
5956
  meta: object;
5914
5957
  }>;
@@ -6080,6 +6123,13 @@ export type AppRouter = TrpcCoreRouter<{
6080
6123
  output: z.infer<typeof pipelineOrchestratorCapability.methods.getAgentLoad.output>;
6081
6124
  meta: object;
6082
6125
  }>;
6126
+ getClusterModelChoice: TRPCQueryProcedure<{
6127
+ input: {
6128
+ [x: string]: unknown;
6129
+ } & z.input<typeof pipelineOrchestratorCapability.methods.getClusterModelChoice.input>;
6130
+ output: z.infer<typeof pipelineOrchestratorCapability.methods.getClusterModelChoice.output>;
6131
+ meta: object;
6132
+ }>;
6083
6133
  getGlobalMetrics: TRPCQueryProcedure<{
6084
6134
  input: {
6085
6135
  nodeId?: string | undefined;
@@ -11,7 +11,7 @@
11
11
  * Plain data, zero Zod: a forked runner must not import the schema barrel
12
12
  * (~144MB RSS per runner — D28).
13
13
  *
14
- * Coverage: 24 caps, 58 methods with defaults.
14
+ * Coverage: 24 caps, 59 methods with defaults.
15
15
  */
16
16
  export declare const CAP_INPUT_DEFAULTS: Readonly<Record<string, Readonly<Record<string, Readonly<Record<string, unknown>>>>>>;
17
17
  /**
@@ -46,6 +46,7 @@ export { deviceAdminLinkCapability } from '../capabilities/device-admin-link.cap
46
46
  export { deviceAdoptionCapability } from '../capabilities/device-adoption.cap.js';
47
47
  export { deviceDiscoveryCapability } from '../capabilities/device-discovery.cap.js';
48
48
  export { deviceExportCapability } from '../capabilities/device-export.cap.js';
49
+ export { deviceExtensionCapability } from '../capabilities/device-extension.cap.js';
49
50
  export { deviceManagerCapability } from '../capabilities/device-manager.cap.js';
50
51
  export { deviceOpsCapability } from '../capabilities/device-ops.cap.js';
51
52
  export { deviceProviderCapability } from '../capabilities/device-provider.cap.js';
@@ -207,6 +208,7 @@ export declare const CAPABILITY_NAMES: {
207
208
  readonly deviceAdoption: "device-adoption";
208
209
  readonly deviceDiscovery: "device-discovery";
209
210
  readonly deviceExport: "device-export";
211
+ readonly deviceExtension: "device-extension";
210
212
  readonly deviceManager: "device-manager";
211
213
  readonly deviceOps: "device-ops";
212
214
  readonly deviceProvider: "device-provider";
@@ -381,6 +383,7 @@ export interface CapabilityRouterMap<TRouter = unknown> {
381
383
  readonly deviceAdoption: TRouter;
382
384
  readonly deviceDiscovery: TRouter;
383
385
  readonly deviceExport: TRouter;
386
+ readonly deviceExtension: TRouter;
384
387
  readonly deviceManager: TRouter;
385
388
  readonly deviceOps: TRouter;
386
389
  readonly deviceProvider: TRouter;
@@ -498,8 +501,8 @@ export interface CapabilityRouterMap<TRouter = unknown> {
498
501
  export declare const SINGLETON_CAPABILITY_NAMES: readonly ["accessories", "addon-pages", "addon-settings", "addon-widgets", "addons", "admin-ui", "air-quality-sensor", "alarm-panel", "alerts", "ambient-light-sensor", "audio-analysis", "audio-analyzer", "audio-codec", "audio-metrics", "automation-control", "backup", "battery", "binary", "brightness", "button", "camera-credentials", "camera-grid-layout", "camera-pipeline-config", "camera-streams", "carbon-monoxide", "climate-control", "color", "connectivity", "consumables", "contact", "control", "core-blocks", "cover", "day-night", "decoder", "detection-pipeline", "device-admin-link", "device-adoption", "device-discovery", "device-manager", "device-ops", "device-state", "device-status", "doorbell", "enum-sensor", "event-emitter", "face-gallery", "fan-control", "feature-probe", "filesystem-browse", "flood", "gas", "humidifier", "humidity-sensor", "image", "image-settings", "integrations", "intercom", "lawn-mower-control", "llm-runtime", "local-network", "lock-control", "media-player", "metrics-provider", "model-convert", "model-distributor", "motion", "motion-detection", "motion-trigger", "motion-zones", "native-object-detection", "navigation", "network-link", "network-quality", "nodes", "notification-rules", "notifier", "numeric-sensor", "osd", "osd-manager", "pet-feeder", "pipeline-analytics", "pipeline-executor", "pipeline-orchestrator", "pipeline-runner", "plate-gallery", "platform-probe", "power-meter", "presence", "pressure-sensor", "privacy-mask", "ptz", "ptz-autotrack", "reboot", "recording-archive", "recording-export", "recording-onboard", "recording-signal", "scene-monitor", "script-runner", "server-management", "settings-store", "smoke", "snapshot", "sso-bridge", "storage", "storage-migration", "stream-broker", "stream-catalog", "stream-params", "stream-signals", "switch", "system", "tamper", "temperature-sensor", "terminal-session", "toast", "update", "user-management", "vacuum-control", "valve", "vector-store", "vibration", "viewer-ui", "water-heater", "weather", "webrtc-session", "zone-analytics", "zone-rules", "zones"];
499
502
  /** Union of singleton capability names (literal string union). */
500
503
  export type SingletonCapabilityName = typeof SINGLETON_CAPABILITY_NAMES[number];
501
- /** Capability names whose mode is `collection` (30 caps). */
502
- export declare const COLLECTION_CAPABILITY_NAMES: readonly ["addon-pages-source", "addon-routes", "addon-widgets-source", "auth-provider", "broker", "connection-test", "custom-model-registry", "data-store-provider", "device-export", "device-provider", "embedding-encoder", "failure-contribution", "llm", "load-contribution", "log-channels", "log-destination", "login-method", "mesh-network", "mqtt-broker", "network-access", "notification-output", "oauth-integration", "recording", "smtp-provider", "storage-evictable", "storage-occupancy", "storage-provider", "turn-provider", "user-passkeys", "videoclips"];
504
+ /** Capability names whose mode is `collection` (31 caps). */
505
+ export declare const COLLECTION_CAPABILITY_NAMES: readonly ["addon-pages-source", "addon-routes", "addon-widgets-source", "auth-provider", "broker", "connection-test", "custom-model-registry", "data-store-provider", "device-export", "device-extension", "device-provider", "embedding-encoder", "failure-contribution", "llm", "load-contribution", "log-channels", "log-destination", "login-method", "mesh-network", "mqtt-broker", "network-access", "notification-output", "oauth-integration", "recording", "smtp-provider", "storage-evictable", "storage-occupancy", "storage-provider", "turn-provider", "user-passkeys", "videoclips"];
503
506
  /** Union of collection capability names (literal string union). */
504
507
  export type CollectionCapabilityName = typeof COLLECTION_CAPABILITY_NAMES[number];
505
508
  /** Capability mode lookup at runtime — mirrors the `.cap.ts` definitions. */
@@ -8,7 +8,7 @@
8
8
  * barrel (`ALL_CAPABILITY_DEFINITIONS`), which would cost ~144MB RSS per
9
9
  * forked runner. See docs/decisions/adr-0028.md.
10
10
  *
11
- * Coverage: 23 collection caps, 37 array methods.
11
+ * Coverage: 24 collection caps, 39 array methods.
12
12
  */
13
13
  export declare const COLLECTION_ARRAY_METHODS: Readonly<Record<string, readonly string[]>>;
14
14
  /**
@@ -15,6 +15,7 @@ import type { brightnessCapability } from '../capabilities/brightness.cap.js';
15
15
  import type { buttonCapability } from '../capabilities/button.cap.js';
16
16
  import type { cameraCredentialsCapability } from '../capabilities/camera-credentials.cap.js';
17
17
  import type { cameraGridLayoutCapability } from '../capabilities/camera-grid-layout.cap.js';
18
+ import type { cameraPipelineConfigCapability } from '../capabilities/camera-pipeline-config.cap.js';
18
19
  import type { cameraStreamsCapability } from '../capabilities/camera-streams.cap.js';
19
20
  import type { carbonMonoxideCapability } from '../capabilities/carbon-monoxide.cap.js';
20
21
  import type { climateControlCapability } from '../capabilities/climate-control.cap.js';
@@ -28,6 +29,7 @@ import type { dayNightCapability } from '../capabilities/day-night.cap.js';
28
29
  import type { detectionPipelineCapability } from '../capabilities/detection-pipeline.cap.js';
29
30
  import type { deviceAdminLinkCapability } from '../capabilities/device-admin-link.cap.js';
30
31
  import type { deviceDiscoveryCapability } from '../capabilities/device-discovery.cap.js';
32
+ import type { deviceExtensionCapability } from '../capabilities/device-extension.cap.js';
31
33
  import type { deviceOpsCapability } from '../capabilities/device-ops.cap.js';
32
34
  import type { deviceStatusCapability } from '../capabilities/device-status.cap.js';
33
35
  import type { doorbellCapability } from '../capabilities/doorbell.cap.js';
@@ -52,7 +54,6 @@ import type { motionZonesCapability } from '../capabilities/motion-zones.cap.js'
52
54
  import type { nativeObjectDetectionCapability } from '../capabilities/native-object-detection.cap.js';
53
55
  import type { navigationCapability } from '../capabilities/navigation.cap.js';
54
56
  import type { networkLinkCapability } from '../capabilities/network-link.cap.js';
55
- import type { notificationRulesCapability } from '../capabilities/notification-rules.cap.js';
56
57
  import type { notifierCapability } from '../capabilities/notifier.cap.js';
57
58
  import type { numericSensorCapability } from '../capabilities/numeric-sensor.cap.js';
58
59
  import type { osdCapability } from '../capabilities/osd.cap.js';
@@ -91,14 +92,13 @@ import type { zoneRulesCapability } from '../capabilities/zone-rules.cap.js';
91
92
  import type { zonesCapability } from '../capabilities/zones.cap.js';
92
93
  import type { addonSettingsCapability } from '../capabilities/addon-settings.cap.js';
93
94
  import type { audioAnalyzerCapability } from '../capabilities/audio-analyzer.cap.js';
94
- import type { cameraPipelineConfigCapability } from '../capabilities/camera-pipeline-config.cap.js';
95
95
  import type { deviceAdoptionCapability } from '../capabilities/device-adoption.cap.js';
96
96
  import type { deviceExportCapability } from '../capabilities/device-export.cap.js';
97
97
  import type { deviceManagerCapability } from '../capabilities/device-manager.cap.js';
98
- import type { deviceProviderCapability } from '../capabilities/device-provider.cap.js';
99
98
  import type { deviceStateCapability } from '../capabilities/device-state.cap.js';
100
99
  import type { faceGalleryCapability } from '../capabilities/face-gallery.cap.js';
101
100
  import type { networkQualityCapability } from '../capabilities/network-quality.cap.js';
101
+ import type { notificationRulesCapability } from '../capabilities/notification-rules.cap.js';
102
102
  import type { osdManagerCapability } from '../capabilities/osd-manager.cap.js';
103
103
  import type { pipelineExecutorCapability } from '../capabilities/pipeline-executor.cap.js';
104
104
  import type { pipelineOrchestratorCapability } from '../capabilities/pipeline-orchestrator.cap.js';
@@ -214,6 +214,7 @@ export interface DeviceProxy {
214
214
  readonly button?: InferDeviceProxyCap<typeof buttonCapability>;
215
215
  readonly cameraCredentials?: InferDeviceProxyCap<typeof cameraCredentialsCapability>;
216
216
  readonly cameraGridLayout?: InferDeviceProxyCap<typeof cameraGridLayoutCapability>;
217
+ readonly cameraPipelineConfig?: InferDeviceProxyCap<typeof cameraPipelineConfigCapability>;
217
218
  readonly cameraStreams?: InferDeviceProxyCap<typeof cameraStreamsCapability>;
218
219
  readonly carbonMonoxide?: InferDeviceProxyCap<typeof carbonMonoxideCapability>;
219
220
  readonly climateControl?: InferDeviceProxyCap<typeof climateControlCapability>;
@@ -227,6 +228,7 @@ export interface DeviceProxy {
227
228
  readonly detectionPipeline?: InferDeviceProxyCap<typeof detectionPipelineCapability>;
228
229
  readonly deviceAdminLink?: InferDeviceProxyCap<typeof deviceAdminLinkCapability>;
229
230
  readonly deviceDiscovery?: InferDeviceProxyCap<typeof deviceDiscoveryCapability>;
231
+ readonly deviceExtension?: InferDeviceProxyCap<typeof deviceExtensionCapability>;
230
232
  readonly deviceOps?: InferDeviceProxyCap<typeof deviceOpsCapability>;
231
233
  readonly deviceStatus?: InferDeviceProxyCap<typeof deviceStatusCapability>;
232
234
  readonly doorbell?: InferDeviceProxyCap<typeof doorbellCapability>;
@@ -251,7 +253,6 @@ export interface DeviceProxy {
251
253
  readonly nativeObjectDetection?: InferDeviceProxyCap<typeof nativeObjectDetectionCapability>;
252
254
  readonly navigation?: InferDeviceProxyCap<typeof navigationCapability>;
253
255
  readonly networkLink?: InferDeviceProxyCap<typeof networkLinkCapability>;
254
- readonly notificationRules?: InferDeviceProxyCap<typeof notificationRulesCapability>;
255
256
  readonly notifier?: InferDeviceProxyCap<typeof notifierCapability>;
256
257
  readonly numericSensor?: InferDeviceProxyCap<typeof numericSensorCapability>;
257
258
  readonly osd?: InferDeviceProxyCap<typeof osdCapability>;
@@ -290,17 +291,16 @@ export interface DeviceProxy {
290
291
  readonly zones?: InferDeviceProxyCap<typeof zonesCapability>;
291
292
  readonly addonSettings: Pick<InferDeviceProxyCap<typeof addonSettingsCapability>, 'getDeviceSettings' | 'updateDeviceSettings'>;
292
293
  readonly audioAnalyzer: Pick<InferDeviceProxyCap<typeof audioAnalyzerCapability>, 'detachDevice'>;
293
- readonly cameraPipelineConfig: Pick<InferDeviceProxyCap<typeof cameraPipelineConfigCapability>, 'getDeviceSettingsContribution' | 'getDeviceLiveContribution' | 'applyDeviceSettingsPatch'>;
294
294
  readonly deviceAdoption: Pick<InferDeviceProxyCap<typeof deviceAdoptionCapability>, 'getStatus'>;
295
295
  readonly deviceExport: Pick<InferDeviceProxyCap<typeof deviceExportCapability>, 'getDeviceSettingsContribution' | 'getDeviceLiveContribution' | 'applyDeviceSettingsPatch'>;
296
296
  readonly deviceManager: Pick<InferDeviceProxyCap<typeof deviceManagerCapability>, 'loadConfig' | 'loadRuntimeState' | 'loadMeta' | 'setName' | 'setLocation' | 'setType' | 'setIntegrationId' | 'setLinkDeviceId' | 'setPrimaryChildEntityId' | 'setChildLayout' | 'setDisplay' | 'getWireableFields' | 'setRole' | 'applyInitialMeta' | 'setMetadata' | 'setDisabled' | 'getDevice' | 'getLinkedDevices' | 'getStreamSources' | 'getConfigSchema' | 'getSettingsSchema' | 'updateConfig' | 'enable' | 'disable' | 'remove' | 'getStreamProfileMap' | 'setStreamProfileMap' | 'probeStreams' | 'getBindings' | 'setWrapperActive' | 'getDeviceSettingsAggregate' | 'getDeviceLiveInfoAggregate' | 'getDeviceAggregate' | 'runDeviceAction' | 'updateDeviceField' | 'updateDeviceFieldsBatch' | 'testField' | 'getDeviceStatusAggregate' | 'getDeviceSettingsContribution' | 'getDeviceLiveContribution' | 'applyDeviceSettingsPatch'>;
297
- readonly deviceProvider: Pick<InferDeviceProxyCap<typeof deviceProviderCapability>, 'reloadDevice'>;
298
297
  readonly deviceState: Pick<InferDeviceProxyCap<typeof deviceStateCapability>, 'getSnapshot' | 'getCapSlice' | 'setCapSlice'>;
299
298
  readonly faceGallery: Pick<InferDeviceProxyCap<typeof faceGalleryCapability>, 'listRecentFaces' | 'getFaceByTrack'>;
300
299
  readonly networkQuality: Pick<InferDeviceProxyCap<typeof networkQualityCapability>, 'getDeviceStats' | 'reportClientStats'>;
300
+ readonly notificationRules: Pick<InferDeviceProxyCap<typeof notificationRulesCapability>, 'setDeviceMuted'>;
301
301
  readonly osdManager: Pick<InferDeviceProxyCap<typeof osdManagerCapability>, 'getDeviceOsd' | 'getSourceCatalog' | 'setSlotBinding' | 'clearSlotBinding' | 'previewSlot' | 'renderDevice'>;
302
302
  readonly pipelineExecutor: Pick<InferDeviceProxyCap<typeof pipelineExecutorCapability>, 'runPipeline' | 'runPipelineBatch'>;
303
- readonly pipelineOrchestrator: Pick<InferDeviceProxyCap<typeof pipelineOrchestratorCapability>, 'assignPipeline' | 'unassignPipeline' | 'setPipelineDevicePin' | 'getPipelineDevicePin' | 'getPipelineAssignment' | 'getCameraMetrics' | 'assignAudio' | 'unassignAudio' | 'getAudioAssignment' | 'getAudioAssignments' | 'getCameraSettings' | 'setCameraStepToggle' | 'getCameraStepOverrides' | 'setCameraStepOverride' | 'setCameraPipelineForAgent' | 'resolvePipeline' | 'getCameraSwitches' | 'setCameraSwitch' | 'getCameraStatus' | 'getDeviceSettingsContribution' | 'getDeviceLiveContribution' | 'applyDeviceSettingsPatch'>;
303
+ readonly pipelineOrchestrator: Pick<InferDeviceProxyCap<typeof pipelineOrchestratorCapability>, 'assignPipeline' | 'unassignPipeline' | 'setPipelineDevicePin' | 'getPipelineDevicePin' | 'getPipelineAssignment' | 'getCameraMetrics' | 'assignAudio' | 'unassignAudio' | 'getAudioAssignment' | 'getCameraSettings' | 'setCameraStepToggle' | 'getCameraStepOverrides' | 'setCameraStepOverride' | 'setCameraPipelineForAgent' | 'resolvePipeline' | 'getCameraSwitches' | 'setCameraSwitch' | 'getCameraStatus' | 'getDeviceSettingsContribution' | 'getDeviceLiveContribution' | 'applyDeviceSettingsPatch'>;
304
304
  readonly pipelineRunner: Pick<InferDeviceProxyCap<typeof pipelineRunnerCapability>, 'detachCamera' | 'getCameraMetrics' | 'requestOccupancyBurst' | 'runDetailSubtree' | 'parkTrackFrame' | 'getParkedTrackFrame' | 'releaseParkedTrackFrames'>;
305
305
  readonly plateGallery: Pick<InferDeviceProxyCap<typeof plateGalleryCapability>, 'listPlates' | 'getPlateByTrack'>;
306
306
  readonly recordingArchive: Pick<InferDeviceProxyCap<typeof recordingArchiveCapability>, 'getDeviceConfig' | 'locateSegment' | 'readSegmentBytes' | 'readGopBytes' | 'readWindowBytes' | 'setDeviceConfig' | 'rescanStorage' | 'pruneFootage' | 'deleteFootprint' | 'renderGif' | 'renderClip' | 'getStatus' | 'getDeviceSettingsContribution' | 'getDeviceLiveContribution' | 'applyDeviceSettingsPatch'>;