@camstack/types 1.2.242 → 1.2.244
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/addon.js +1 -1
- package/dist/addon.mjs +1 -1
- package/dist/capabilities/device-admin-link-url.d.ts +87 -0
- package/dist/capabilities/device-admin-link.cap.d.ts +118 -0
- package/dist/capabilities/index.d.ts +9 -3
- package/dist/capabilities/pipeline-orchestrator.cap.d.ts +6 -2
- package/dist/capabilities/recording-onboard-rules.d.ts +135 -0
- package/dist/capabilities/recording-onboard.cap.d.ts +705 -0
- package/dist/capabilities/videoclips.cap.d.ts +125 -0
- package/dist/device/display-icon-vocabulary.d.ts +106 -0
- package/dist/generated/addon-api.d.ts +51 -0
- package/dist/generated/cap-status-types.d.ts +3 -1
- package/dist/generated/capability-router-map.d.ts +8 -2
- package/dist/generated/device-local-state.d.ts +3 -0
- package/dist/generated/device-proxy.d.ts +5 -0
- package/dist/generated/device-scoped-caps.d.ts +1 -1
- package/dist/generated/method-access-map.d.ts +1 -1
- package/dist/generated/method-device-selectors.d.ts +1 -1
- package/dist/generated/runtime-state-durability.d.ts +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2553 -6
- package/dist/index.mjs +2510 -7
- package/dist/interfaces/camera-switches.d.ts +25 -7
- package/dist/{sleep-vrBqRLsb.js → sleep-Da9UCU5_.js} +12 -2
- package/dist/{sleep-CUmLTud7.mjs → sleep-i3eUVc-d.mjs} +12 -2
- package/package.json +1 -1
|
@@ -95,6 +95,15 @@ export declare const CLIP_STILL_REASON_HEADER = "x-camstack-reason";
|
|
|
95
95
|
export declare const CLIP_STILL_REASON_CODE_HEADER = "x-camstack-reason-code";
|
|
96
96
|
/** One {@link ClipStillDispositionSchema} token, alone. */
|
|
97
97
|
export declare const CLIP_STILL_DISPOSITION_HEADER = "x-camstack-disposition";
|
|
98
|
+
/**
|
|
99
|
+
* The clip STREAM route's own statement of what it is (D597): the value is
|
|
100
|
+
* `forward-only`. A producer writes it on the 200; a consumer that dials a
|
|
101
|
+
* URL and does not read it back refuses to play, because a progressive file
|
|
102
|
+
* through a forward-only feeder looks like it worked until the first seek.
|
|
103
|
+
* Named here because BOTH the provider and the broker spell it, and two
|
|
104
|
+
* copies of a header name is how one of them stops being checked.
|
|
105
|
+
*/
|
|
106
|
+
export declare const CLIP_STREAM_TRANSPORT_HEADER = "x-camstack-clip-transport";
|
|
98
107
|
export declare const ClipSchema: z.ZodObject<{
|
|
99
108
|
id: z.ZodString;
|
|
100
109
|
source: z.ZodString;
|
|
@@ -239,6 +248,71 @@ export declare const ClipBytesSchema: z.ZodObject<{
|
|
|
239
248
|
durationMs: z.ZodOptional<z.ZodNumber>;
|
|
240
249
|
}, z.core.$strip>;
|
|
241
250
|
export type ClipBytes = z.infer<typeof ClipBytesSchema>;
|
|
251
|
+
/**
|
|
252
|
+
* Where a clip's STREAM can be dialled (D597) — the answer to
|
|
253
|
+
* {@link videoclipsCapability.methods.dialClipStream}.
|
|
254
|
+
*
|
|
255
|
+
* `url` is plain `http://` on the provider's own token-gated listener, one
|
|
256
|
+
* shot, short-lived. It is NOT the hub-proxied `/addon/<id>/clip-stream/…`
|
|
257
|
+
* path: that plane takes only a user credential, which an addon does not
|
|
258
|
+
* hold, and the framework offers no addon→addon byte transport — the one
|
|
259
|
+
* precedent is the broker's own restream URLs (`getStreamWithCodec`), which
|
|
260
|
+
* a consumer dials directly, and this is that precedent one addon over.
|
|
261
|
+
*/
|
|
262
|
+
/**
|
|
263
|
+
* The audio a clip stream can be asked for, and the audio it carries.
|
|
264
|
+
*
|
|
265
|
+
* The camera stores AAC and no WebRTC session speaks it, so a stream that
|
|
266
|
+
* carries sound carries it TRANSCODED, muxed as a second track beside the
|
|
267
|
+
* video by the one ffmpeg the provider already runs (D600). `opus` is
|
|
268
|
+
* 48 kHz mono, `pcmu` is 8 kHz µ-law — the two codecs a broker session
|
|
269
|
+
* negotiates — and `none` is a stream asked for, or served, without sound.
|
|
270
|
+
*/
|
|
271
|
+
export declare const ClipStreamAudioSchema: z.ZodEnum<{
|
|
272
|
+
pcmu: "pcmu";
|
|
273
|
+
none: "none";
|
|
274
|
+
opus: "opus";
|
|
275
|
+
}>;
|
|
276
|
+
export type ClipStreamAudio = z.infer<typeof ClipStreamAudioSchema>;
|
|
277
|
+
/**
|
|
278
|
+
* Why a stream that was ASKED for sound is not carrying it (D600).
|
|
279
|
+
*
|
|
280
|
+
* Only ever set beside `servedAudio: 'none'` after a non-`none` ask. Absent
|
|
281
|
+
* means the ask was honoured, or there was no ask.
|
|
282
|
+
*
|
|
283
|
+
* - `not-requested` — the caller asked for `none`.
|
|
284
|
+
* - `unsupported-ask` — the provider cannot produce that codec.
|
|
285
|
+
*
|
|
286
|
+
* Whether the RECORDING has sound at all is not knowable here: the camera
|
|
287
|
+
* declares no audio track before its first frame arrives. That answer is in
|
|
288
|
+
* the stream itself — an fMP4 with no audio track — and the broker reads it
|
|
289
|
+
* there. A dial that says `opus` promises the codec, never the content.
|
|
290
|
+
*/
|
|
291
|
+
export declare const ClipStreamAudioReasonSchema: z.ZodEnum<{
|
|
292
|
+
"not-requested": "not-requested";
|
|
293
|
+
"unsupported-ask": "unsupported-ask";
|
|
294
|
+
}>;
|
|
295
|
+
export type ClipStreamAudioReason = z.infer<typeof ClipStreamAudioReasonSchema>;
|
|
296
|
+
export declare const ClipStreamDialSchema: z.ZodObject<{
|
|
297
|
+
url: z.ZodString;
|
|
298
|
+
expiresAtMs: z.ZodNumber;
|
|
299
|
+
transport: z.ZodLiteral<"forward-only">;
|
|
300
|
+
served: z.ZodEnum<{
|
|
301
|
+
high: "high";
|
|
302
|
+
mid: "mid";
|
|
303
|
+
low: "low";
|
|
304
|
+
}>;
|
|
305
|
+
servedAudio: z.ZodEnum<{
|
|
306
|
+
pcmu: "pcmu";
|
|
307
|
+
none: "none";
|
|
308
|
+
opus: "opus";
|
|
309
|
+
}>;
|
|
310
|
+
audioReason: z.ZodOptional<z.ZodEnum<{
|
|
311
|
+
"not-requested": "not-requested";
|
|
312
|
+
"unsupported-ask": "unsupported-ask";
|
|
313
|
+
}>>;
|
|
314
|
+
}, z.core.$strip>;
|
|
315
|
+
export type ClipStreamDial = z.infer<typeof ClipStreamDialSchema>;
|
|
242
316
|
export declare const ClipSourceAvailabilitySchema: z.ZodObject<{
|
|
243
317
|
state: z.ZodEnum<{
|
|
244
318
|
ok: "ok";
|
|
@@ -489,6 +563,57 @@ export declare const videoclipsCapability: {
|
|
|
489
563
|
}, z.core.$strip>, "query"> & {
|
|
490
564
|
readonly providerOptional: true;
|
|
491
565
|
};
|
|
566
|
+
/**
|
|
567
|
+
* Where this clip's STREAM can be dialled (D597) — the forward-only
|
|
568
|
+
* fMP4 the provider writes from the first muxed byte, for the broker to
|
|
569
|
+
* play through the same WebRTC session as recorded footage, with the
|
|
570
|
+
* first frame at the first fragment instead of after the last byte.
|
|
571
|
+
*
|
|
572
|
+
* Nothing is fetched here: the answer is a one-shot URL on the
|
|
573
|
+
* provider's own listener, and the camera is touched when it is dialled.
|
|
574
|
+
* The gates the file path runs (`readClipBytes`) run on the dial too —
|
|
575
|
+
* the id, the row, a clip still being written — and refuse in the same
|
|
576
|
+
* vocabulary, THROWN with `clipExportFailure(<token>, <prose>)`. Every
|
|
577
|
+
* profile is served (D599) and the answer states which twin it carries;
|
|
578
|
+
* `high` is not refused. Optional on the provider for the same reason
|
|
579
|
+
* `readClipBytes` is: a source with no camera socket behind it (the
|
|
580
|
+
* recorder's analytics window, a HomeKit tee) has no stream.
|
|
581
|
+
*/
|
|
582
|
+
readonly dialClipStream: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
|
|
583
|
+
deviceId: z.ZodNumber;
|
|
584
|
+
clipId: z.ZodString;
|
|
585
|
+
provider: z.ZodString;
|
|
586
|
+
profile: z.ZodOptional<z.ZodEnum<{
|
|
587
|
+
high: "high";
|
|
588
|
+
mid: "mid";
|
|
589
|
+
low: "low";
|
|
590
|
+
}>>;
|
|
591
|
+
audio: z.ZodOptional<z.ZodEnum<{
|
|
592
|
+
pcmu: "pcmu";
|
|
593
|
+
none: "none";
|
|
594
|
+
opus: "opus";
|
|
595
|
+
}>>;
|
|
596
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
597
|
+
url: z.ZodString;
|
|
598
|
+
expiresAtMs: z.ZodNumber;
|
|
599
|
+
transport: z.ZodLiteral<"forward-only">;
|
|
600
|
+
served: z.ZodEnum<{
|
|
601
|
+
high: "high";
|
|
602
|
+
mid: "mid";
|
|
603
|
+
low: "low";
|
|
604
|
+
}>;
|
|
605
|
+
servedAudio: z.ZodEnum<{
|
|
606
|
+
pcmu: "pcmu";
|
|
607
|
+
none: "none";
|
|
608
|
+
opus: "opus";
|
|
609
|
+
}>;
|
|
610
|
+
audioReason: z.ZodOptional<z.ZodEnum<{
|
|
611
|
+
"not-requested": "not-requested";
|
|
612
|
+
"unsupported-ask": "unsupported-ask";
|
|
613
|
+
}>>;
|
|
614
|
+
}, z.core.$strip>, "query"> & {
|
|
615
|
+
readonly providerOptional: true;
|
|
616
|
+
};
|
|
492
617
|
};
|
|
493
618
|
};
|
|
494
619
|
export type IVideoclipsProvider = InferProvider<typeof videoclipsCapability>;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* display-icon-vocabulary — the icon KEYS both UIs share, and the search that
|
|
3
|
+
* finds one.
|
|
4
|
+
*
|
|
5
|
+
* The reason this is here and not in a UI package is the one
|
|
6
|
+
* `location-icon.ts` already states for the location vocabulary: two surfaces
|
|
7
|
+
* draw these icons and they do NOT share an icon module. The admin UI imports
|
|
8
|
+
* `lucide-react`; the viewer imports a hand-maintained per-icon allowlist
|
|
9
|
+
* (`src/lib/icons.ts`, re-exporting `lucide-react-native/icons/*` because the
|
|
10
|
+
* barrel is 47 % of that app's modules). Anything shared between them must
|
|
11
|
+
* therefore be STRINGS, and this module contains no React, no lucide, and no
|
|
12
|
+
* glyph.
|
|
13
|
+
*
|
|
14
|
+
* So the layering is:
|
|
15
|
+
*
|
|
16
|
+
* | layer | lives in | holds |
|
|
17
|
+
* | --- | --- | --- |
|
|
18
|
+
* | vocabulary + search | here | keys, groups, synonyms, scoring |
|
|
19
|
+
* | glyph table (web) | `ui-library`'s `DISPLAY_ICON_REGISTRY` | key → lucide-react |
|
|
20
|
+
* | glyph table (phone) | viewer's accessory icon map | key → lucide-react-native |
|
|
21
|
+
*
|
|
22
|
+
* Each glyph table must cover exactly these keys, and a test on each side
|
|
23
|
+
* pins that. A key offered on one surface and missing on the other falls
|
|
24
|
+
* through to the next precedence level there, which the operator reads as "my
|
|
25
|
+
* change did nothing" — the failure this vocabulary exists to make impossible.
|
|
26
|
+
*
|
|
27
|
+
* {@link LOCATION_ICON_IDS} is a SUBSET of these keys, pinned by a test. Two
|
|
28
|
+
* icon vocabularies on the same two surfaces with different members is the
|
|
29
|
+
* same bug wearing a different name — `briefcase` and `route` are here only
|
|
30
|
+
* because locations already draw them.
|
|
31
|
+
*
|
|
32
|
+
* ## Synonyms, and why they are bilingual
|
|
33
|
+
*
|
|
34
|
+
* The keys are English lucide ids and always will be: they name the DRAWING,
|
|
35
|
+
* mechanically checkable against a package, not the room. But the operator
|
|
36
|
+
* searching this list types Italian — "tapparella", not "blinds". A picker
|
|
37
|
+
* whose search only matches the key would make three quarters of the
|
|
38
|
+
* vocabulary unreachable to them.
|
|
39
|
+
*
|
|
40
|
+
* So every entry carries the words it answers to, in both languages. They are
|
|
41
|
+
* deliberately not translations of a label: they are the words somebody would
|
|
42
|
+
* actually type looking for that picture, including the wrong-but-obvious
|
|
43
|
+
* ones (`blinds` answers to `persiana` and `serranda` too).
|
|
44
|
+
*/
|
|
45
|
+
/** What an operator is naming when they pick from this group. */
|
|
46
|
+
export type DisplayIconGroup = 'device' | 'lighting' | 'sensing' | 'place' | 'life';
|
|
47
|
+
/** The order the groups are offered in, and the only members there are. */
|
|
48
|
+
export declare const DISPLAY_ICON_GROUPS: readonly DisplayIconGroup[];
|
|
49
|
+
/** One icon in the shared vocabulary. */
|
|
50
|
+
export interface DisplayIconEntry {
|
|
51
|
+
/** The kebab-case lucide id. This is the value that is PERSISTED. */
|
|
52
|
+
readonly key: string;
|
|
53
|
+
readonly group: DisplayIconGroup;
|
|
54
|
+
/**
|
|
55
|
+
* Words this icon answers to in search, English and Italian. Never
|
|
56
|
+
* rendered — a caller that wants a label supplies its own translation.
|
|
57
|
+
*/
|
|
58
|
+
readonly synonyms: readonly string[];
|
|
59
|
+
/**
|
|
60
|
+
* The key this one is a deprecated spelling OF, drawing the same picture.
|
|
61
|
+
*
|
|
62
|
+
* An alias must keep RESOLVING — rows have it persisted — but it must not
|
|
63
|
+
* be OFFERED: a second, identical tile lets an operator newly choose the
|
|
64
|
+
* spelling we are trying to retire, and gives them no way to tell the two
|
|
65
|
+
* apart. So `searchDisplayIcons` skips aliases and `displayIconEntry` does
|
|
66
|
+
* not.
|
|
67
|
+
*/
|
|
68
|
+
readonly aliasOf?: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The vocabulary, in the order a picker offers it.
|
|
72
|
+
*
|
|
73
|
+
* Adding a key here is not enough to make it pickable: both glyph tables must
|
|
74
|
+
* gain it too, and their tests fail until they do. That is the intended
|
|
75
|
+
* friction — it is the only thing that keeps the two surfaces honest.
|
|
76
|
+
*/
|
|
77
|
+
export declare const DISPLAY_ICON_VOCABULARY: readonly DisplayIconEntry[];
|
|
78
|
+
/** Every key, in vocabulary order — aliases included, because they resolve. */
|
|
79
|
+
export declare const DISPLAY_ICON_KEYS: readonly string[];
|
|
80
|
+
/** The keys a picker OFFERS: everything that is not a deprecated spelling. */
|
|
81
|
+
export declare const DISPLAY_ICON_OFFERED_KEYS: readonly string[];
|
|
82
|
+
/** Is this a key of the shared vocabulary? */
|
|
83
|
+
export declare function isDisplayIconKey(value: unknown): boolean;
|
|
84
|
+
/** The entry for a key, or `undefined` — never a guessed one. */
|
|
85
|
+
export declare function displayIconEntry(key: string): DisplayIconEntry | undefined;
|
|
86
|
+
/** The entries of one group, in vocabulary order. */
|
|
87
|
+
export declare function displayIconsInGroup(group: DisplayIconGroup): readonly DisplayIconEntry[];
|
|
88
|
+
/** One search result: the entry, and how strongly it matched. */
|
|
89
|
+
export interface DisplayIconHit {
|
|
90
|
+
readonly entry: DisplayIconEntry;
|
|
91
|
+
readonly score: number;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Rank the vocabulary against a free-text query.
|
|
95
|
+
*
|
|
96
|
+
* An empty query returns the WHOLE vocabulary in its declared order, because
|
|
97
|
+
* a picker's resting state is the full list, not an empty one.
|
|
98
|
+
*
|
|
99
|
+
* `extraWords` lets a caller add the words IT can translate — a localised
|
|
100
|
+
* device-role label, say — without this module knowing what a locale is.
|
|
101
|
+
* They score exactly like a synonym.
|
|
102
|
+
*
|
|
103
|
+
* Ties keep vocabulary order: a search that reshuffles equally-good results
|
|
104
|
+
* between two keystrokes makes the list unusable.
|
|
105
|
+
*/
|
|
106
|
+
export declare function searchDisplayIcons(query: string, extraWords?: ReadonlyMap<string, readonly string[]>): readonly DisplayIconHit[];
|
|
@@ -36,6 +36,7 @@ import type { customModelRegistryCapability } from '../capabilities/custom-model
|
|
|
36
36
|
import type { dataStoreProviderCapability } from '../capabilities/data-store-provider.cap.js';
|
|
37
37
|
import type { dayNightCapability } from '../capabilities/day-night.cap.js';
|
|
38
38
|
import type { decoderCapability } from '../capabilities/decoder.cap.js';
|
|
39
|
+
import type { deviceAdminLinkCapability } from '../capabilities/device-admin-link.cap.js';
|
|
39
40
|
import type { deviceAdoptionCapability } from '../capabilities/device-adoption.cap.js';
|
|
40
41
|
import type { deviceDiscoveryCapability } from '../capabilities/device-discovery.cap.js';
|
|
41
42
|
import type { deviceExportCapability } from '../capabilities/device-export.cap.js';
|
|
@@ -94,6 +95,7 @@ import type { ptzAutotrackCapability } from '../capabilities/ptz-autotrack.cap.j
|
|
|
94
95
|
import type { ptzCapability } from '../capabilities/ptz.cap.js';
|
|
95
96
|
import type { rebootCapability } from '../capabilities/reboot.cap.js';
|
|
96
97
|
import type { recordingExportCapability } from '../capabilities/recording-export.cap.js';
|
|
98
|
+
import type { recordingOnboardCapability } from '../capabilities/recording-onboard.cap.js';
|
|
97
99
|
import type { recordingSignalCapability } from '../capabilities/recording-signal.cap.js';
|
|
98
100
|
import type { recordingCapability } from '../capabilities/recording.cap.js';
|
|
99
101
|
import type { sceneMonitorCapability } from '../capabilities/scene-monitor.cap.js';
|
|
@@ -1917,6 +1919,20 @@ export type AppRouter = TrpcCoreRouter<{
|
|
|
1917
1919
|
meta: object;
|
|
1918
1920
|
}>;
|
|
1919
1921
|
}>>;
|
|
1922
|
+
deviceAdminLink: TRPCBuiltRouter<{
|
|
1923
|
+
ctx: TrpcContext;
|
|
1924
|
+
meta: object;
|
|
1925
|
+
errorShape: AugmentedErrorShape;
|
|
1926
|
+
transformer: true;
|
|
1927
|
+
}, TRPCDecorateCreateRouterOptions<{
|
|
1928
|
+
getAdminLink: TRPCQueryProcedure<{
|
|
1929
|
+
input: {
|
|
1930
|
+
[x: string]: unknown;
|
|
1931
|
+
} & z.input<typeof deviceAdminLinkCapability.methods.getAdminLink.input>;
|
|
1932
|
+
output: z.infer<typeof deviceAdminLinkCapability.methods.getAdminLink.output>;
|
|
1933
|
+
meta: object;
|
|
1934
|
+
}>;
|
|
1935
|
+
}>>;
|
|
1920
1936
|
deviceAdoption: TRPCBuiltRouter<{
|
|
1921
1937
|
ctx: TrpcContext;
|
|
1922
1938
|
meta: object;
|
|
@@ -7137,6 +7153,34 @@ export type AppRouter = TrpcCoreRouter<{
|
|
|
7137
7153
|
meta: object;
|
|
7138
7154
|
}>;
|
|
7139
7155
|
}>>;
|
|
7156
|
+
recordingOnboard: TRPCBuiltRouter<{
|
|
7157
|
+
ctx: TrpcContext;
|
|
7158
|
+
meta: object;
|
|
7159
|
+
errorShape: AugmentedErrorShape;
|
|
7160
|
+
transformer: true;
|
|
7161
|
+
}, TRPCDecorateCreateRouterOptions<{
|
|
7162
|
+
getStatus: TRPCQueryProcedure<{
|
|
7163
|
+
input: {
|
|
7164
|
+
[x: string]: unknown;
|
|
7165
|
+
} & z.input<typeof DEVICE_STATUS_METHOD.getStatus.input>;
|
|
7166
|
+
output: z.infer<typeof DEVICE_STATUS_METHOD.getStatus.output>;
|
|
7167
|
+
meta: object;
|
|
7168
|
+
}>;
|
|
7169
|
+
getOptions: TRPCQueryProcedure<{
|
|
7170
|
+
input: {
|
|
7171
|
+
[x: string]: unknown;
|
|
7172
|
+
} & z.input<typeof recordingOnboardCapability.methods.getOptions.input>;
|
|
7173
|
+
output: z.infer<typeof recordingOnboardCapability.methods.getOptions.output>;
|
|
7174
|
+
meta: object;
|
|
7175
|
+
}>;
|
|
7176
|
+
setSettings: TRPCMutationProcedure<{
|
|
7177
|
+
input: {
|
|
7178
|
+
[x: string]: unknown;
|
|
7179
|
+
} & z.input<typeof recordingOnboardCapability.methods.setSettings.input>;
|
|
7180
|
+
output: z.infer<typeof recordingOnboardCapability.methods.setSettings.output>;
|
|
7181
|
+
meta: object;
|
|
7182
|
+
}>;
|
|
7183
|
+
}>>;
|
|
7140
7184
|
recordingSignal: TRPCBuiltRouter<{
|
|
7141
7185
|
ctx: TrpcContext;
|
|
7142
7186
|
meta: object;
|
|
@@ -9087,6 +9131,13 @@ export type AppRouter = TrpcCoreRouter<{
|
|
|
9087
9131
|
output: z.infer<typeof videoclipsCapability.methods.readClipBytes.output>;
|
|
9088
9132
|
meta: object;
|
|
9089
9133
|
}>;
|
|
9134
|
+
dialClipStream: TRPCQueryProcedure<{
|
|
9135
|
+
input: {
|
|
9136
|
+
[x: string]: unknown;
|
|
9137
|
+
} & z.input<typeof videoclipsCapability.methods.dialClipStream.input>;
|
|
9138
|
+
output: z.infer<typeof videoclipsCapability.methods.dialClipStream.output>;
|
|
9139
|
+
meta: object;
|
|
9140
|
+
}>;
|
|
9090
9141
|
}>>;
|
|
9091
9142
|
viewerUi: TRPCBuiltRouter<{
|
|
9092
9143
|
ctx: TrpcContext;
|
|
@@ -55,6 +55,7 @@ import type { PrivacyMaskStatusSchema } from '../capabilities/privacy-mask.cap.j
|
|
|
55
55
|
import type { PtzStatusSchema } from '../capabilities/ptz.cap.js';
|
|
56
56
|
import type { PtzAutotrackStatusSchema } from '../capabilities/ptz-autotrack.cap.js';
|
|
57
57
|
import type { RecordingStatusSchema } from '../capabilities/recording.cap.js';
|
|
58
|
+
import type { RecordingOnboardStatusSchema } from '../capabilities/recording-onboard.cap.js';
|
|
58
59
|
import type { RecordingSignalStatusSchema } from '../capabilities/recording-signal.cap.js';
|
|
59
60
|
import type { SceneMonitorStatusSchema } from '../capabilities/scene-monitor.cap.js';
|
|
60
61
|
import type { ScriptRunnerStatusSchema } from '../capabilities/script-runner.cap.js';
|
|
@@ -132,6 +133,7 @@ export type CapStatusTypeMap = {
|
|
|
132
133
|
readonly 'ptz': z.infer<typeof PtzStatusSchema>;
|
|
133
134
|
readonly 'ptz-autotrack': z.infer<typeof PtzAutotrackStatusSchema>;
|
|
134
135
|
readonly 'recording': z.infer<typeof RecordingStatusSchema>;
|
|
136
|
+
readonly 'recording-onboard': z.infer<typeof RecordingOnboardStatusSchema>;
|
|
135
137
|
readonly 'recording-signal': z.infer<typeof RecordingSignalStatusSchema>;
|
|
136
138
|
readonly 'scene-monitor': z.infer<typeof SceneMonitorStatusSchema>;
|
|
137
139
|
readonly 'script-runner': z.infer<typeof ScriptRunnerStatusSchema>;
|
|
@@ -155,4 +157,4 @@ export type CapNameWithStatus = keyof CapStatusTypeMap;
|
|
|
155
157
|
* aggregator to enumerate caps whose `status` should be polled +
|
|
156
158
|
* streamed via `subscribeDeviceStatusAggregate`.
|
|
157
159
|
*/
|
|
158
|
-
export declare const CAP_NAMES_WITH_STATUS: readonly ["accessories", "air-quality-sensor", "alarm-panel", "ambient-light-sensor", "automation-control", "battery", "binary", "brightness", "broker", "camera-credentials", "carbon-monoxide", "climate-control", "color", "connectivity", "consumables", "contact", "control", "cover", "day-night", "device-adoption", "device-discovery", "device-export", "device-status", "doorbell", "enum-sensor", "event-emitter", "fan-control", "feature-probe", "flood", "gas", "humidifier", "humidity-sensor", "image", "image-settings", "intercom", "lawn-mower-control", "lock-control", "media-player", "motion", "motion-trigger", "motion-zones", "mqtt-broker", "native-object-detection", "navigation", "network-link", "notifier", "numeric-sensor", "osd", "pet-feeder", "power-meter", "presence", "pressure-sensor", "privacy-mask", "ptz", "ptz-autotrack", "recording", "recording-signal", "scene-monitor", "script-runner", "smoke", "snapshot", "stream-params", "switch", "tamper", "temperature-sensor", "update", "vacuum-control", "valve", "vibration", "water-heater", "weather"];
|
|
160
|
+
export declare const CAP_NAMES_WITH_STATUS: readonly ["accessories", "air-quality-sensor", "alarm-panel", "ambient-light-sensor", "automation-control", "battery", "binary", "brightness", "broker", "camera-credentials", "carbon-monoxide", "climate-control", "color", "connectivity", "consumables", "contact", "control", "cover", "day-night", "device-adoption", "device-discovery", "device-export", "device-status", "doorbell", "enum-sensor", "event-emitter", "fan-control", "feature-probe", "flood", "gas", "humidifier", "humidity-sensor", "image", "image-settings", "intercom", "lawn-mower-control", "lock-control", "media-player", "motion", "motion-trigger", "motion-zones", "mqtt-broker", "native-object-detection", "navigation", "network-link", "notifier", "numeric-sensor", "osd", "pet-feeder", "power-meter", "presence", "pressure-sensor", "privacy-mask", "ptz", "ptz-autotrack", "recording", "recording-onboard", "recording-signal", "scene-monitor", "script-runner", "smoke", "snapshot", "stream-params", "switch", "tamper", "temperature-sensor", "update", "vacuum-control", "valve", "vibration", "water-heater", "weather"];
|
|
@@ -42,6 +42,7 @@ export { dataStoreProviderCapability } from '../capabilities/data-store-provider
|
|
|
42
42
|
export { dayNightCapability } from '../capabilities/day-night.cap.js';
|
|
43
43
|
export { decoderCapability } from '../capabilities/decoder.cap.js';
|
|
44
44
|
export { detectionPipelineCapability } from '../capabilities/detection-pipeline.cap.js';
|
|
45
|
+
export { deviceAdminLinkCapability } from '../capabilities/device-admin-link.cap.js';
|
|
45
46
|
export { deviceAdoptionCapability } from '../capabilities/device-adoption.cap.js';
|
|
46
47
|
export { deviceDiscoveryCapability } from '../capabilities/device-discovery.cap.js';
|
|
47
48
|
export { deviceExportCapability } from '../capabilities/device-export.cap.js';
|
|
@@ -116,6 +117,7 @@ export { ptzAutotrackCapability } from '../capabilities/ptz-autotrack.cap.js';
|
|
|
116
117
|
export { rebootCapability } from '../capabilities/reboot.cap.js';
|
|
117
118
|
export { recordingCapability } from '../capabilities/recording.cap.js';
|
|
118
119
|
export { recordingExportCapability } from '../capabilities/recording-export.cap.js';
|
|
120
|
+
export { recordingOnboardCapability } from '../capabilities/recording-onboard.cap.js';
|
|
119
121
|
export { recordingSignalCapability } from '../capabilities/recording-signal.cap.js';
|
|
120
122
|
export { sceneMonitorCapability } from '../capabilities/scene-monitor.cap.js';
|
|
121
123
|
export { scriptRunnerCapability } from '../capabilities/script-runner.cap.js';
|
|
@@ -201,6 +203,7 @@ export declare const CAPABILITY_NAMES: {
|
|
|
201
203
|
readonly dayNight: "day-night";
|
|
202
204
|
readonly decoder: "decoder";
|
|
203
205
|
readonly detectionPipeline: "detection-pipeline";
|
|
206
|
+
readonly deviceAdminLink: "device-admin-link";
|
|
204
207
|
readonly deviceAdoption: "device-adoption";
|
|
205
208
|
readonly deviceDiscovery: "device-discovery";
|
|
206
209
|
readonly deviceExport: "device-export";
|
|
@@ -275,6 +278,7 @@ export declare const CAPABILITY_NAMES: {
|
|
|
275
278
|
readonly reboot: "reboot";
|
|
276
279
|
readonly recording: "recording";
|
|
277
280
|
readonly recordingExport: "recording-export";
|
|
281
|
+
readonly recordingOnboard: "recording-onboard";
|
|
278
282
|
readonly recordingSignal: "recording-signal";
|
|
279
283
|
readonly sceneMonitor: "scene-monitor";
|
|
280
284
|
readonly scriptRunner: "script-runner";
|
|
@@ -373,6 +377,7 @@ export interface CapabilityRouterMap<TRouter = unknown> {
|
|
|
373
377
|
readonly dayNight: TRouter;
|
|
374
378
|
readonly decoder: TRouter;
|
|
375
379
|
readonly detectionPipeline: TRouter;
|
|
380
|
+
readonly deviceAdminLink: TRouter;
|
|
376
381
|
readonly deviceAdoption: TRouter;
|
|
377
382
|
readonly deviceDiscovery: TRouter;
|
|
378
383
|
readonly deviceExport: TRouter;
|
|
@@ -447,6 +452,7 @@ export interface CapabilityRouterMap<TRouter = unknown> {
|
|
|
447
452
|
readonly reboot: TRouter;
|
|
448
453
|
readonly recording: TRouter;
|
|
449
454
|
readonly recordingExport: TRouter;
|
|
455
|
+
readonly recordingOnboard: TRouter;
|
|
450
456
|
readonly recordingSignal: TRouter;
|
|
451
457
|
readonly sceneMonitor: TRouter;
|
|
452
458
|
readonly scriptRunner: TRouter;
|
|
@@ -488,8 +494,8 @@ export interface CapabilityRouterMap<TRouter = unknown> {
|
|
|
488
494
|
readonly zoneRules: TRouter;
|
|
489
495
|
readonly zones: TRouter;
|
|
490
496
|
}
|
|
491
|
-
/** Capability names whose mode is `singleton` (
|
|
492
|
-
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-adoption", "device-discovery", "device-manager", "device-ops", "device-state", "device-status", "doorbell", "enum-sensor", "event-emitter", "events", "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", "recording-export", "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"];
|
|
497
|
+
/** Capability names whose mode is `singleton` (131 caps). */
|
|
498
|
+
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", "events", "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", "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"];
|
|
493
499
|
/** Union of singleton capability names (literal string union). */
|
|
494
500
|
export type SingletonCapabilityName = typeof SINGLETON_CAPABILITY_NAMES[number];
|
|
495
501
|
/** Capability names whose mode is `collection` (29 caps). */
|
|
@@ -48,6 +48,7 @@ import { presenceCapability } from '../capabilities/presence.cap.js';
|
|
|
48
48
|
import { pressureSensorCapability } from '../capabilities/pressure-sensor.cap.js';
|
|
49
49
|
import { privacyMaskCapability } from '../capabilities/privacy-mask.cap.js';
|
|
50
50
|
import { ptzAutotrackCapability } from '../capabilities/ptz-autotrack.cap.js';
|
|
51
|
+
import { recordingOnboardCapability } from '../capabilities/recording-onboard.cap.js';
|
|
51
52
|
import { recordingSignalCapability } from '../capabilities/recording-signal.cap.js';
|
|
52
53
|
import { sceneMonitorCapability } from '../capabilities/scene-monitor.cap.js';
|
|
53
54
|
import { scriptRunnerCapability } from '../capabilities/script-runner.cap.js';
|
|
@@ -128,6 +129,7 @@ export interface DeviceLocalState {
|
|
|
128
129
|
pressureSensor: InferRuntimeState<typeof pressureSensorCapability>;
|
|
129
130
|
privacyMask: InferRuntimeState<typeof privacyMaskCapability>;
|
|
130
131
|
ptzAutotrack: InferRuntimeState<typeof ptzAutotrackCapability>;
|
|
132
|
+
recordingOnboard: InferRuntimeState<typeof recordingOnboardCapability>;
|
|
131
133
|
recordingSignal: InferRuntimeState<typeof recordingSignalCapability>;
|
|
132
134
|
sceneMonitor: InferRuntimeState<typeof sceneMonitorCapability>;
|
|
133
135
|
scriptRunner: InferRuntimeState<typeof scriptRunnerCapability>;
|
|
@@ -218,6 +220,7 @@ export interface CapNameToRuntimeStateMap {
|
|
|
218
220
|
'pressure-sensor': InferRuntimeState<typeof pressureSensorCapability>;
|
|
219
221
|
'privacy-mask': InferRuntimeState<typeof privacyMaskCapability>;
|
|
220
222
|
'ptz-autotrack': InferRuntimeState<typeof ptzAutotrackCapability>;
|
|
223
|
+
'recording-onboard': InferRuntimeState<typeof recordingOnboardCapability>;
|
|
221
224
|
'recording-signal': InferRuntimeState<typeof recordingSignalCapability>;
|
|
222
225
|
'scene-monitor': InferRuntimeState<typeof sceneMonitorCapability>;
|
|
223
226
|
'script-runner': InferRuntimeState<typeof scriptRunnerCapability>;
|
|
@@ -26,6 +26,7 @@ import type { controlCapability } from '../capabilities/control.cap.js';
|
|
|
26
26
|
import type { coverCapability } from '../capabilities/cover.cap.js';
|
|
27
27
|
import type { dayNightCapability } from '../capabilities/day-night.cap.js';
|
|
28
28
|
import type { detectionPipelineCapability } from '../capabilities/detection-pipeline.cap.js';
|
|
29
|
+
import type { deviceAdminLinkCapability } from '../capabilities/device-admin-link.cap.js';
|
|
29
30
|
import type { deviceDiscoveryCapability } from '../capabilities/device-discovery.cap.js';
|
|
30
31
|
import type { deviceOpsCapability } from '../capabilities/device-ops.cap.js';
|
|
31
32
|
import type { deviceStatusCapability } from '../capabilities/device-status.cap.js';
|
|
@@ -65,6 +66,7 @@ import type { privacyMaskCapability } from '../capabilities/privacy-mask.cap.js'
|
|
|
65
66
|
import type { ptzCapability } from '../capabilities/ptz.cap.js';
|
|
66
67
|
import type { ptzAutotrackCapability } from '../capabilities/ptz-autotrack.cap.js';
|
|
67
68
|
import type { rebootCapability } from '../capabilities/reboot.cap.js';
|
|
69
|
+
import type { recordingOnboardCapability } from '../capabilities/recording-onboard.cap.js';
|
|
68
70
|
import type { recordingSignalCapability } from '../capabilities/recording-signal.cap.js';
|
|
69
71
|
import type { sceneMonitorCapability } from '../capabilities/scene-monitor.cap.js';
|
|
70
72
|
import type { scriptRunnerCapability } from '../capabilities/script-runner.cap.js';
|
|
@@ -160,6 +162,7 @@ export interface DeviceProxyState {
|
|
|
160
162
|
readonly pressureSensor: SliceHandle<InferRuntimeState<typeof pressureSensorCapability>>;
|
|
161
163
|
readonly privacyMask: SliceHandle<InferRuntimeState<typeof privacyMaskCapability>>;
|
|
162
164
|
readonly ptzAutotrack: SliceHandle<InferRuntimeState<typeof ptzAutotrackCapability>>;
|
|
165
|
+
readonly recordingOnboard: SliceHandle<InferRuntimeState<typeof recordingOnboardCapability>>;
|
|
163
166
|
readonly recordingSignal: SliceHandle<InferRuntimeState<typeof recordingSignalCapability>>;
|
|
164
167
|
readonly sceneMonitor: SliceHandle<InferRuntimeState<typeof sceneMonitorCapability>>;
|
|
165
168
|
readonly scriptRunner: SliceHandle<InferRuntimeState<typeof scriptRunnerCapability>>;
|
|
@@ -222,6 +225,7 @@ export interface DeviceProxy {
|
|
|
222
225
|
readonly cover?: InferDeviceProxyCap<typeof coverCapability>;
|
|
223
226
|
readonly dayNight?: InferDeviceProxyCap<typeof dayNightCapability>;
|
|
224
227
|
readonly detectionPipeline?: InferDeviceProxyCap<typeof detectionPipelineCapability>;
|
|
228
|
+
readonly deviceAdminLink?: InferDeviceProxyCap<typeof deviceAdminLinkCapability>;
|
|
225
229
|
readonly deviceDiscovery?: InferDeviceProxyCap<typeof deviceDiscoveryCapability>;
|
|
226
230
|
readonly deviceOps?: InferDeviceProxyCap<typeof deviceOpsCapability>;
|
|
227
231
|
readonly deviceStatus?: InferDeviceProxyCap<typeof deviceStatusCapability>;
|
|
@@ -261,6 +265,7 @@ export interface DeviceProxy {
|
|
|
261
265
|
readonly ptz?: InferDeviceProxyCap<typeof ptzCapability>;
|
|
262
266
|
readonly ptzAutotrack?: InferDeviceProxyCap<typeof ptzAutotrackCapability>;
|
|
263
267
|
readonly reboot?: InferDeviceProxyCap<typeof rebootCapability>;
|
|
268
|
+
readonly recordingOnboard?: InferDeviceProxyCap<typeof recordingOnboardCapability>;
|
|
264
269
|
readonly recordingSignal?: InferDeviceProxyCap<typeof recordingSignalCapability>;
|
|
265
270
|
readonly sceneMonitor?: InferDeviceProxyCap<typeof sceneMonitorCapability>;
|
|
266
271
|
readonly scriptRunner?: InferDeviceProxyCap<typeof scriptRunnerCapability>;
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* can answer "may a rule actuate this?" without importing the schema barrel
|
|
6
6
|
* (~144MB RSS per runner, D28).
|
|
7
7
|
*
|
|
8
|
-
* Coverage:
|
|
8
|
+
* Coverage: 87 device-scoped capabilities.
|
|
9
9
|
*/
|
|
10
10
|
export declare const DEVICE_SCOPED_CAPS: ReadonlySet<string>;
|
|
11
11
|
/**
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* scope+access check inside `protectedProcedure` (see
|
|
7
7
|
* `server/backend/src/api/trpc/trpc.middleware.ts`).
|
|
8
8
|
*
|
|
9
|
-
* Coverage:
|
|
9
|
+
* Coverage: 1169 method paths across 160 capabilities.
|
|
10
10
|
*/
|
|
11
11
|
import type { CapabilityMethodAccess } from '../capabilities/capability-definition.js';
|
|
12
12
|
export interface MethodAccessRecord {
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* system-scope cap that takes a deviceId was previously never device-filtered
|
|
7
7
|
* — see the generator header).
|
|
8
8
|
*
|
|
9
|
-
* Coverage:
|
|
9
|
+
* Coverage: 395 methods carry a device reference, of which
|
|
10
10
|
* 141 are on SYSTEM-scope caps.
|
|
11
11
|
*
|
|
12
12
|
* Top-level fields, number arrays, and one-level arrays of objects carrying
|
|
@@ -11,7 +11,7 @@ export interface RuntimeStatePolicy {
|
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
13
|
* Per-cap runtime-state policy, projected from every `*.cap.ts` that declares
|
|
14
|
-
* `runtimeState`.
|
|
14
|
+
* `runtimeState`. 69 caps: 36 `restored`, 33 `session`.
|
|
15
15
|
*
|
|
16
16
|
* A cap absent from this map has no runtime-state slice at all. A cap PRESENT
|
|
17
17
|
* with `durability: 'session'` has one and has decided not to keep it.
|
package/dist/index.d.ts
CHANGED
|
@@ -176,6 +176,8 @@ export { ChargingStatus, DeviceFeature, DeviceRole, DeviceType } from './device/
|
|
|
176
176
|
export type { IBatteryOperated, IDoorbellButton, INativeSnapshot, IPanTiltZoom, IRebootable, ITwoWayAudio, } from './device/features.js';
|
|
177
177
|
export type { LocationDescriptionAssignment, LocationIconAssignment, LocationIconId, } from './device/location-icon.js';
|
|
178
178
|
export { LOCATION_ICON_FALLBACK, LOCATION_ICON_IDS, LOCATION_DESCRIPTION_MAX, LocationDescriptionAssignmentSchema, LocationIconAssignmentSchema, LocationIconIdSchema, locationIconKey, resolveLocationIcon, } from './device/location-icon.js';
|
|
179
|
+
export type { DisplayIconEntry, DisplayIconGroup, DisplayIconHit, } from './device/display-icon-vocabulary.js';
|
|
180
|
+
export { DISPLAY_ICON_GROUPS, DISPLAY_ICON_KEYS, DISPLAY_ICON_OFFERED_KEYS, DISPLAY_ICON_VOCABULARY, displayIconEntry, displayIconsInGroup, isDisplayIconKey, searchDisplayIcons, } from './device/display-icon-vocabulary.js';
|
|
179
181
|
export { getByPath, setByPath } from './device/path-util.js';
|
|
180
182
|
export type { ReachabilityPollHandle, ReachabilityPollLogger, ReachabilityPollOptions, } from './device/reachability-poll.js';
|
|
181
183
|
export { REACHABILITY_FAILURES_TO_OFFLINE, REACHABILITY_POLL_INTERVAL_MS, REACHABILITY_PROBE_TIMEOUT_MS, startReachabilityPoll, } from './device/reachability-poll.js';
|