@camstack/types 1.2.379 → 1.2.381

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 (45) hide show
  1. package/dist/addon.d.ts +3 -0
  2. package/dist/addon.js +67 -2
  3. package/dist/addon.mjs +5 -3
  4. package/dist/capabilities/caller-stamp.d.ts +12 -0
  5. package/dist/capabilities/index.d.ts +7 -2
  6. package/dist/capabilities/record-entries.cap.d.ts +84 -0
  7. package/dist/capabilities/records.cap.d.ts +399 -0
  8. package/dist/capabilities/storage-admin.cap.d.ts +268 -0
  9. package/dist/client.js +57 -32
  10. package/dist/client.mjs +57 -32
  11. package/dist/device/device-context.d.ts +2 -0
  12. package/dist/ffmpeg/fmp4-fragment-child.d.ts +2 -2
  13. package/dist/ffmpeg/process.d.ts +21 -0
  14. package/dist/generated/addon-api.d.ts +191 -0
  15. package/dist/generated/cap-input-defaults.d.ts +1 -1
  16. package/dist/generated/capability-router-map.d.ts +8 -2
  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 +2 -0
  20. package/dist/helpers/addon-slice-handle.d.ts +4 -0
  21. package/dist/helpers/trpc-leaf.d.ts +17 -0
  22. package/dist/index.d.ts +3 -1
  23. package/dist/index.js +724 -32
  24. package/dist/index.mjs +646 -33
  25. package/dist/interfaces/addon-peer-bytes.d.ts +19 -2
  26. package/dist/interfaces/addon.d.ts +13 -0
  27. package/dist/interfaces/config-ui.d.ts +4 -0
  28. package/dist/interfaces/event-bus.d.ts +32 -3
  29. package/dist/interfaces/storage.d.ts +1 -1
  30. package/dist/node.d.ts +2 -2
  31. package/dist/node.js +4 -0
  32. package/dist/node.mjs +4 -1
  33. package/dist/records/constants.d.ts +23 -0
  34. package/dist/records/entry-kind.d.ts +31 -0
  35. package/dist/records/errors.d.ts +81 -0
  36. package/dist/records/in-memory-records.d.ts +21 -0
  37. package/dist/records/index.d.ts +9 -0
  38. package/dist/records/record-kind.d.ts +144 -0
  39. package/dist/records/records-access.d.ts +153 -0
  40. package/dist/records/secret-paths.d.ts +52 -0
  41. package/dist/records/settings-array-adopts-from.d.ts +12 -0
  42. package/dist/records/settings-brokers-adopts-from.d.ts +10 -0
  43. package/dist/{sleep-DQYi915G.js → sleep-D8yJVc4r.js} +1971 -290
  44. package/dist/{sleep-D-Q2_Mcd.mjs → sleep-bZIhUvjd.mjs} +1413 -128
  45. package/package.json +1 -1
package/dist/client.js CHANGED
@@ -25895,6 +25895,50 @@ function isSource(x) {
25895
25895
  return typeof x.read === "function" && typeof x.watch === "function";
25896
25896
  }
25897
25897
  //#endregion
25898
+ //#region src/helpers/addon-slice-handle.ts
25899
+ /** Structural bridge: every `AddonApi` client carries `deviceState` (+ optional `live`). */
25900
+ function addonSliceHandleApi(api) {
25901
+ return api;
25902
+ }
25903
+ //#endregion
25904
+ //#region src/helpers/trpc-leaf.ts
25905
+ function isTrpcProcedureLeaf(value) {
25906
+ if (typeof value !== "object" || value === null) return false;
25907
+ const record = value;
25908
+ return (typeof record.query === "function" || typeof record.mutate === "function" || typeof record.subscribe === "function") && !Array.isArray(value);
25909
+ }
25910
+ function readCapRecord(api, capProp) {
25911
+ const cap = Reflect.get(api, capProp);
25912
+ if (typeof cap !== "object" || cap === null || Array.isArray(cap)) return void 0;
25913
+ return cap;
25914
+ }
25915
+ function readTrpcLeaf(api, capProp, method) {
25916
+ const capRecord = readCapRecord(api, capProp);
25917
+ if (!capRecord) throw new Error(`tRPC client has no router '${capProp}'`);
25918
+ const leaf = capRecord[method];
25919
+ if (!isTrpcProcedureLeaf(leaf)) throw new Error(`tRPC client has no '${capProp}.${method}'`);
25920
+ return leaf;
25921
+ }
25922
+ /**
25923
+ * Invoke `api.<capProp>.<method>.{query|mutate|subscribe}(input)`.
25924
+ * `Result` is the generated proxy method's return. The leaf itself is only
25925
+ * `unknown` (the client is a structural bag), so the assertion is the one
25926
+ * boundary between that bag and the typed proxy.
25927
+ */
25928
+ function invokeTrpcLeaf(api, capProp, method, kind, input, push) {
25929
+ const fn = readTrpcLeaf(api, capProp, method);
25930
+ if (kind === "mutation") {
25931
+ if (typeof fn.mutate !== "function") throw new Error(`tRPC '${capProp}.${method}' has no mutate()`);
25932
+ return fn.mutate(input);
25933
+ }
25934
+ if (kind === "subscription") {
25935
+ if (typeof fn.subscribe !== "function") throw new Error(`tRPC '${capProp}.${method}' has no subscribe()`);
25936
+ return fn.subscribe(input, push);
25937
+ }
25938
+ if (typeof fn.query !== "function") throw new Error(`tRPC '${capProp}.${method}' has no query()`);
25939
+ return fn.query(input);
25940
+ }
25941
+ //#endregion
25898
25942
  //#region src/generated/device-proxy.ts
25899
25943
  /**
25900
25944
  * Build a DeviceProxy that pre-binds deviceId + nodeId on every method call
@@ -25912,8 +25956,7 @@ function isSource(x) {
25912
25956
  * field on the returned object.
25913
25957
  */
25914
25958
  function createDeviceProxy(api, binding, opts) {
25915
- const typedApi = api;
25916
- const stateSource = opts?.stateSource ?? createLazyTrpcSource(api);
25959
+ const stateSource = opts?.stateSource ?? createLazyTrpcSource(addonSliceHandleApi(api));
25917
25960
  /** Merge `{deviceId, nodeId?}` into the caller-supplied input. */
25918
25961
  function mergeInput(input, nodeId) {
25919
25962
  const base = typeof input === "object" && input !== null ? input : {};
@@ -25926,20 +25969,8 @@ function createDeviceProxy(api, binding, opts) {
25926
25969
  deviceId: binding.deviceId
25927
25970
  };
25928
25971
  }
25929
- /**
25930
- * Invoke `api.<capProp>.<method>.{query|mutate|subscribe}(merged)`.
25931
- * Returns `any` so the caller-side per-method declaration assigns
25932
- * cleanly into the strongly-typed `InferDeviceProxyCap<...>` shape on
25933
- * the `DeviceProxy` interface — the proxy's contract is enforced by
25934
- * the interface, not the dispatch helper.
25935
- */
25936
25972
  function callLeaf(capProp, method, kind, merged, push) {
25937
- const leaf = typedApi[capProp]?.[method];
25938
- if (!leaf) throw new Error(`DeviceProxy: api has no '${capProp}.${method}'`);
25939
- const fn = leaf;
25940
- if (kind === "mutation") return fn.mutate(merged);
25941
- if (kind === "subscription") return fn.subscribe(merged, push);
25942
- return fn.query(merged);
25973
+ return invokeTrpcLeaf(api, capProp, method, kind, merged, push);
25943
25974
  }
25944
25975
  /**
25945
25976
  * Device-scoped cap dispatch. Looks up the binding entry for `capName`
@@ -27252,9 +27283,10 @@ var SystemMirror = class {
27252
27283
  for (let i = 0; i < targets.length; i += parallelism) {
27253
27284
  const chunk = targets.slice(i, i + parallelism);
27254
27285
  const settled = await Promise.allSettled(chunk.map(async (proxy) => {
27255
- const cap = proxy[capName];
27256
- if (!cap || typeof cap[methodName] !== "function") throw new Error(`device '${proxy.deviceId}' does not expose '${capName}.${methodName}'`);
27257
- return await cap[methodName](args);
27286
+ const cap = Reflect.get(proxy, capName);
27287
+ const method = typeof cap === "object" && cap !== null ? Reflect.get(cap, methodName) : void 0;
27288
+ if (typeof method !== "function") throw new Error(`device '${proxy.deviceId}' does not expose '${capName}.${methodName}'`);
27289
+ return await Reflect.apply(method, cap, [args]);
27258
27290
  }));
27259
27291
  for (let j = 0; j < settled.length; j++) {
27260
27292
  const proxy = chunk[j];
@@ -27489,21 +27521,8 @@ function matchesString(haystack, match) {
27489
27521
  * dropping the reference.
27490
27522
  */
27491
27523
  function createSystemProxy(api) {
27492
- const typedApi = api;
27493
- /**
27494
- * Invoke `api.<capProp>.<method>.{query|mutate|subscribe}(input)`.
27495
- * Returns `any` so the caller-side per-method declaration assigns
27496
- * cleanly into the strongly-typed `Pick<InferProvider<...>, ...>`
27497
- * shape on the `SystemProxy` interface — the proxy's contract is
27498
- * enforced by the interface, not the dispatch helper.
27499
- */
27500
27524
  function dispatch(capProp, method, kind, input, push) {
27501
- const leaf = typedApi[capProp]?.[method];
27502
- if (!leaf) throw new Error(`SystemProxy: api has no '${capProp}.${method}'`);
27503
- const fn = leaf;
27504
- if (kind === "mutation") return fn.mutate(input);
27505
- if (kind === "subscription") return fn.subscribe(input, push);
27506
- return fn.query(input);
27525
+ return invokeTrpcLeaf(api, capProp, method, kind, input, push);
27507
27526
  }
27508
27527
  return {
27509
27528
  addonPages: { listPages: (input) => dispatch("addonPages", "listPages", "query", input) },
@@ -28076,6 +28095,12 @@ function createSystemProxy(api) {
28076
28095
  assignPlates: (input) => dispatch("plateGallery", "assignPlates", "mutation", input),
28077
28096
  unassignPlates: (input) => dispatch("plateGallery", "unassignPlates", "mutation", input)
28078
28097
  },
28098
+ recordEntries: {
28099
+ listEntryKinds: (input) => dispatch("recordEntries", "listEntryKinds", "query", input),
28100
+ listEntries: (input) => dispatch("recordEntries", "listEntries", "query", input),
28101
+ putEntry: (input) => dispatch("recordEntries", "putEntry", "mutation", input),
28102
+ deleteEntry: (input) => dispatch("recordEntries", "deleteEntry", "mutation", input)
28103
+ },
28079
28104
  recordingArchive: {
28080
28105
  getAvailabilityBatch: (input) => dispatch("recordingArchive", "getAvailabilityBatch", "query", input),
28081
28106
  getDaysWithRecordingsBatch: (input) => dispatch("recordingArchive", "getDaysWithRecordingsBatch", "query", input),
package/dist/client.mjs CHANGED
@@ -25894,6 +25894,50 @@ function isSource(x) {
25894
25894
  return typeof x.read === "function" && typeof x.watch === "function";
25895
25895
  }
25896
25896
  //#endregion
25897
+ //#region src/helpers/addon-slice-handle.ts
25898
+ /** Structural bridge: every `AddonApi` client carries `deviceState` (+ optional `live`). */
25899
+ function addonSliceHandleApi(api) {
25900
+ return api;
25901
+ }
25902
+ //#endregion
25903
+ //#region src/helpers/trpc-leaf.ts
25904
+ function isTrpcProcedureLeaf(value) {
25905
+ if (typeof value !== "object" || value === null) return false;
25906
+ const record = value;
25907
+ return (typeof record.query === "function" || typeof record.mutate === "function" || typeof record.subscribe === "function") && !Array.isArray(value);
25908
+ }
25909
+ function readCapRecord(api, capProp) {
25910
+ const cap = Reflect.get(api, capProp);
25911
+ if (typeof cap !== "object" || cap === null || Array.isArray(cap)) return void 0;
25912
+ return cap;
25913
+ }
25914
+ function readTrpcLeaf(api, capProp, method) {
25915
+ const capRecord = readCapRecord(api, capProp);
25916
+ if (!capRecord) throw new Error(`tRPC client has no router '${capProp}'`);
25917
+ const leaf = capRecord[method];
25918
+ if (!isTrpcProcedureLeaf(leaf)) throw new Error(`tRPC client has no '${capProp}.${method}'`);
25919
+ return leaf;
25920
+ }
25921
+ /**
25922
+ * Invoke `api.<capProp>.<method>.{query|mutate|subscribe}(input)`.
25923
+ * `Result` is the generated proxy method's return. The leaf itself is only
25924
+ * `unknown` (the client is a structural bag), so the assertion is the one
25925
+ * boundary between that bag and the typed proxy.
25926
+ */
25927
+ function invokeTrpcLeaf(api, capProp, method, kind, input, push) {
25928
+ const fn = readTrpcLeaf(api, capProp, method);
25929
+ if (kind === "mutation") {
25930
+ if (typeof fn.mutate !== "function") throw new Error(`tRPC '${capProp}.${method}' has no mutate()`);
25931
+ return fn.mutate(input);
25932
+ }
25933
+ if (kind === "subscription") {
25934
+ if (typeof fn.subscribe !== "function") throw new Error(`tRPC '${capProp}.${method}' has no subscribe()`);
25935
+ return fn.subscribe(input, push);
25936
+ }
25937
+ if (typeof fn.query !== "function") throw new Error(`tRPC '${capProp}.${method}' has no query()`);
25938
+ return fn.query(input);
25939
+ }
25940
+ //#endregion
25897
25941
  //#region src/generated/device-proxy.ts
25898
25942
  /**
25899
25943
  * Build a DeviceProxy that pre-binds deviceId + nodeId on every method call
@@ -25911,8 +25955,7 @@ function isSource(x) {
25911
25955
  * field on the returned object.
25912
25956
  */
25913
25957
  function createDeviceProxy(api, binding, opts) {
25914
- const typedApi = api;
25915
- const stateSource = opts?.stateSource ?? createLazyTrpcSource(api);
25958
+ const stateSource = opts?.stateSource ?? createLazyTrpcSource(addonSliceHandleApi(api));
25916
25959
  /** Merge `{deviceId, nodeId?}` into the caller-supplied input. */
25917
25960
  function mergeInput(input, nodeId) {
25918
25961
  const base = typeof input === "object" && input !== null ? input : {};
@@ -25925,20 +25968,8 @@ function createDeviceProxy(api, binding, opts) {
25925
25968
  deviceId: binding.deviceId
25926
25969
  };
25927
25970
  }
25928
- /**
25929
- * Invoke `api.<capProp>.<method>.{query|mutate|subscribe}(merged)`.
25930
- * Returns `any` so the caller-side per-method declaration assigns
25931
- * cleanly into the strongly-typed `InferDeviceProxyCap<...>` shape on
25932
- * the `DeviceProxy` interface — the proxy's contract is enforced by
25933
- * the interface, not the dispatch helper.
25934
- */
25935
25971
  function callLeaf(capProp, method, kind, merged, push) {
25936
- const leaf = typedApi[capProp]?.[method];
25937
- if (!leaf) throw new Error(`DeviceProxy: api has no '${capProp}.${method}'`);
25938
- const fn = leaf;
25939
- if (kind === "mutation") return fn.mutate(merged);
25940
- if (kind === "subscription") return fn.subscribe(merged, push);
25941
- return fn.query(merged);
25972
+ return invokeTrpcLeaf(api, capProp, method, kind, merged, push);
25942
25973
  }
25943
25974
  /**
25944
25975
  * Device-scoped cap dispatch. Looks up the binding entry for `capName`
@@ -27251,9 +27282,10 @@ var SystemMirror = class {
27251
27282
  for (let i = 0; i < targets.length; i += parallelism) {
27252
27283
  const chunk = targets.slice(i, i + parallelism);
27253
27284
  const settled = await Promise.allSettled(chunk.map(async (proxy) => {
27254
- const cap = proxy[capName];
27255
- if (!cap || typeof cap[methodName] !== "function") throw new Error(`device '${proxy.deviceId}' does not expose '${capName}.${methodName}'`);
27256
- return await cap[methodName](args);
27285
+ const cap = Reflect.get(proxy, capName);
27286
+ const method = typeof cap === "object" && cap !== null ? Reflect.get(cap, methodName) : void 0;
27287
+ if (typeof method !== "function") throw new Error(`device '${proxy.deviceId}' does not expose '${capName}.${methodName}'`);
27288
+ return await Reflect.apply(method, cap, [args]);
27257
27289
  }));
27258
27290
  for (let j = 0; j < settled.length; j++) {
27259
27291
  const proxy = chunk[j];
@@ -27488,21 +27520,8 @@ function matchesString(haystack, match) {
27488
27520
  * dropping the reference.
27489
27521
  */
27490
27522
  function createSystemProxy(api) {
27491
- const typedApi = api;
27492
- /**
27493
- * Invoke `api.<capProp>.<method>.{query|mutate|subscribe}(input)`.
27494
- * Returns `any` so the caller-side per-method declaration assigns
27495
- * cleanly into the strongly-typed `Pick<InferProvider<...>, ...>`
27496
- * shape on the `SystemProxy` interface — the proxy's contract is
27497
- * enforced by the interface, not the dispatch helper.
27498
- */
27499
27523
  function dispatch(capProp, method, kind, input, push) {
27500
- const leaf = typedApi[capProp]?.[method];
27501
- if (!leaf) throw new Error(`SystemProxy: api has no '${capProp}.${method}'`);
27502
- const fn = leaf;
27503
- if (kind === "mutation") return fn.mutate(input);
27504
- if (kind === "subscription") return fn.subscribe(input, push);
27505
- return fn.query(input);
27524
+ return invokeTrpcLeaf(api, capProp, method, kind, input, push);
27506
27525
  }
27507
27526
  return {
27508
27527
  addonPages: { listPages: (input) => dispatch("addonPages", "listPages", "query", input) },
@@ -28075,6 +28094,12 @@ function createSystemProxy(api) {
28075
28094
  assignPlates: (input) => dispatch("plateGallery", "assignPlates", "mutation", input),
28076
28095
  unassignPlates: (input) => dispatch("plateGallery", "unassignPlates", "mutation", input)
28077
28096
  },
28097
+ recordEntries: {
28098
+ listEntryKinds: (input) => dispatch("recordEntries", "listEntryKinds", "query", input),
28099
+ listEntries: (input) => dispatch("recordEntries", "listEntries", "query", input),
28100
+ putEntry: (input) => dispatch("recordEntries", "putEntry", "mutation", input),
28101
+ deleteEntry: (input) => dispatch("recordEntries", "deleteEntry", "mutation", input)
28102
+ },
28078
28103
  recordingArchive: {
28079
28104
  getAvailabilityBatch: (input) => dispatch("recordingArchive", "getAvailabilityBatch", "query", input),
28080
28105
  getDaysWithRecordingsBatch: (input) => dispatch("recordingArchive", "getDaysWithRecordingsBatch", "query", input),
@@ -137,6 +137,8 @@ export interface DeviceContext {
137
137
  * + persistInitialConfig + createContext + register` flow.
138
138
  */
139
139
  export type DeviceConstructor<T extends IDevice = IDevice> = new (ctx: DeviceContext) => T;
140
+ /** Map entry helper — concrete camera/hub classes widen to `DeviceConstructor<IDevice>`. */
141
+ export declare function widenDeviceConstructor<T extends IDevice>(ctor: DeviceConstructor<T>): DeviceConstructor<IDevice>;
140
142
  export interface DeviceManagerApi {
141
143
  /**
142
144
  * Create, register, and persist a device in one call.
@@ -35,14 +35,14 @@
35
35
  * request schema on purpose (see `egressTransportFromRequest`): a plane is a
36
36
  * live object, so an off-node caller could not use one anyway.
37
37
  */
38
- import type { spawn as nodeSpawn } from 'node:child_process';
39
38
  import type { IScopedLogger } from '../interfaces/logging.js';
40
39
  import type { FfmpegInvocation } from './invocation.js';
40
+ import type { FfmpegSpawnFn } from './process.js';
41
41
  import type { Fmp4FragmentPlane } from './fmp4-fragment-plane.js';
42
42
  export interface Fmp4FragmentChildDeps {
43
43
  readonly logger: IScopedLogger;
44
44
  readonly ffmpegBinaryPath: string;
45
- readonly spawnFn: typeof nodeSpawn;
45
+ readonly spawnFn: FfmpegSpawnFn;
46
46
  /** How long the child may produce no UNIT before it is declared dead. */
47
47
  readonly firstUnitTimeoutMs?: number;
48
48
  /** The child exited, or its output stopped parsing, AFTER it went live. */
@@ -32,6 +32,27 @@
32
32
  */
33
33
  import { spawn, type ChildProcess, type SpawnOptions } from 'node:child_process';
34
34
  import type { IScopedLogger } from '../interfaces/logging.js';
35
+ /** Subset of {@link ChildProcess} every live-media ffmpeg site reads. */
36
+ export interface SpawnedFfmpegProcess {
37
+ readonly pid?: number;
38
+ readonly killed?: boolean;
39
+ readonly exitCode?: number | null;
40
+ readonly signalCode?: NodeJS.Signals | null;
41
+ readonly stdin?: {
42
+ on(event: string, listener: () => void): void;
43
+ end(): void;
44
+ } | null;
45
+ readonly stdout: NodeJS.ReadableStream | null;
46
+ readonly stderr: NodeJS.ReadableStream | null;
47
+ on(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
48
+ on(event: 'error', listener: (err: Error) => void): this;
49
+ once(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
50
+ once(event: 'error', listener: (err: Error) => void): this;
51
+ kill(signal?: NodeJS.Signals): boolean;
52
+ }
53
+ /** Injectable ffmpeg spawn — the three-arg shape live-media sites use. */
54
+ export type FfmpegSpawnFn = (command: string, args: readonly string[], options?: SpawnOptions) => SpawnedFfmpegProcess;
55
+ export declare function defaultFfmpegSpawn(command: string, args: readonly string[], options?: SpawnOptions): SpawnedFfmpegProcess;
35
56
  /** How a child ended. */
36
57
  export type FfmpegExitClass =
37
58
  /** Exited 0. */
@@ -105,11 +105,13 @@ import type { privacyMaskCapability } from '../capabilities/privacy-mask.cap.js'
105
105
  import type { ptzAutotrackCapability } from '../capabilities/ptz-autotrack.cap.js';
106
106
  import type { ptzCapability } from '../capabilities/ptz.cap.js';
107
107
  import type { rebootCapability } from '../capabilities/reboot.cap.js';
108
+ import type { recordEntriesCapability } from '../capabilities/record-entries.cap.js';
108
109
  import type { recordingArchiveCapability } from '../capabilities/recording-archive.cap.js';
109
110
  import type { recordingExportCapability } from '../capabilities/recording-export.cap.js';
110
111
  import type { recordingOnboardCapability } from '../capabilities/recording-onboard.cap.js';
111
112
  import type { recordingSignalCapability } from '../capabilities/recording-signal.cap.js';
112
113
  import type { recordingCapability } from '../capabilities/recording.cap.js';
114
+ import type { recordsCapability } from '../capabilities/records.cap.js';
113
115
  import type { sceneMonitorCapability } from '../capabilities/scene-monitor.cap.js';
114
116
  import type { scriptRunnerCapability } from '../capabilities/script-runner.cap.js';
115
117
  import type { serverManagementCapability } from '../capabilities/server-management.cap.js';
@@ -7880,6 +7882,41 @@ export type AppRouter = TrpcCoreRouter<{
7880
7882
  meta: object;
7881
7883
  }>;
7882
7884
  }>>;
7885
+ recordEntries: TRPCBuiltRouter<{
7886
+ ctx: TrpcContext;
7887
+ meta: object;
7888
+ errorShape: AugmentedErrorShape;
7889
+ transformer: true;
7890
+ }, TRPCDecorateCreateRouterOptions<{
7891
+ listEntryKinds: TRPCQueryProcedure<{
7892
+ input: {
7893
+ [x: string]: unknown;
7894
+ } & z.input<typeof recordEntriesCapability.methods.listEntryKinds.input>;
7895
+ output: z.infer<typeof recordEntriesCapability.methods.listEntryKinds.output>;
7896
+ meta: object;
7897
+ }>;
7898
+ listEntries: TRPCQueryProcedure<{
7899
+ input: {
7900
+ [x: string]: unknown;
7901
+ } & z.input<typeof recordEntriesCapability.methods.listEntries.input>;
7902
+ output: z.infer<typeof recordEntriesCapability.methods.listEntries.output>;
7903
+ meta: object;
7904
+ }>;
7905
+ putEntry: TRPCMutationProcedure<{
7906
+ input: {
7907
+ [x: string]: unknown;
7908
+ } & z.input<typeof recordEntriesCapability.methods.putEntry.input>;
7909
+ output: z.infer<typeof recordEntriesCapability.methods.putEntry.output>;
7910
+ meta: object;
7911
+ }>;
7912
+ deleteEntry: TRPCMutationProcedure<{
7913
+ input: {
7914
+ [x: string]: unknown;
7915
+ } & z.input<typeof recordEntriesCapability.methods.deleteEntry.input>;
7916
+ output: z.infer<typeof recordEntriesCapability.methods.deleteEntry.output>;
7917
+ meta: object;
7918
+ }>;
7919
+ }>>;
7883
7920
  recording: TRPCBuiltRouter<{
7884
7921
  ctx: TrpcContext;
7885
7922
  meta: object;
@@ -8265,6 +8302,125 @@ export type AppRouter = TrpcCoreRouter<{
8265
8302
  meta: object;
8266
8303
  }>;
8267
8304
  }>>;
8305
+ records: TRPCBuiltRouter<{
8306
+ ctx: TrpcContext;
8307
+ meta: object;
8308
+ errorShape: AugmentedErrorShape;
8309
+ transformer: true;
8310
+ }, TRPCDecorateCreateRouterOptions<{
8311
+ declareKinds: TRPCMutationProcedure<{
8312
+ input: {
8313
+ [x: string]: unknown;
8314
+ } & z.input<typeof recordsCapability.methods.declareKinds.input>;
8315
+ output: z.infer<typeof recordsCapability.methods.declareKinds.output>;
8316
+ meta: object;
8317
+ }>;
8318
+ get: TRPCQueryProcedure<{
8319
+ input: {
8320
+ [x: string]: unknown;
8321
+ } & z.input<typeof recordsCapability.methods.get.input>;
8322
+ output: z.infer<typeof recordsCapability.methods.get.output>;
8323
+ meta: object;
8324
+ }>;
8325
+ getMany: TRPCQueryProcedure<{
8326
+ input: {
8327
+ [x: string]: unknown;
8328
+ } & z.input<typeof recordsCapability.methods.getMany.input>;
8329
+ output: z.infer<typeof recordsCapability.methods.getMany.output>;
8330
+ meta: object;
8331
+ }>;
8332
+ secretRefs: TRPCQueryProcedure<{
8333
+ input: {
8334
+ [x: string]: unknown;
8335
+ } & z.input<typeof recordsCapability.methods.secretRefs.input>;
8336
+ output: z.infer<typeof recordsCapability.methods.secretRefs.output>;
8337
+ meta: object;
8338
+ }>;
8339
+ put: TRPCMutationProcedure<{
8340
+ input: {
8341
+ [x: string]: unknown;
8342
+ } & z.input<typeof recordsCapability.methods.put.input>;
8343
+ output: z.infer<typeof recordsCapability.methods.put.output>;
8344
+ meta: object;
8345
+ }>;
8346
+ putMany: TRPCMutationProcedure<{
8347
+ input: {
8348
+ [x: string]: unknown;
8349
+ } & z.input<typeof recordsCapability.methods.putMany.input>;
8350
+ output: z.infer<typeof recordsCapability.methods.putMany.output>;
8351
+ meta: object;
8352
+ }>;
8353
+ patch: TRPCMutationProcedure<{
8354
+ input: {
8355
+ [x: string]: unknown;
8356
+ } & z.input<typeof recordsCapability.methods.patch.input>;
8357
+ output: z.infer<typeof recordsCapability.methods.patch.output>;
8358
+ meta: object;
8359
+ }>;
8360
+ delete: TRPCMutationProcedure<{
8361
+ input: {
8362
+ [x: string]: unknown;
8363
+ } & z.input<typeof recordsCapability.methods.delete.input>;
8364
+ output: z.infer<typeof recordsCapability.methods.delete.output>;
8365
+ meta: object;
8366
+ }>;
8367
+ deleteMany: TRPCMutationProcedure<{
8368
+ input: {
8369
+ [x: string]: unknown;
8370
+ } & z.input<typeof recordsCapability.methods.deleteMany.input>;
8371
+ output: z.infer<typeof recordsCapability.methods.deleteMany.output>;
8372
+ meta: object;
8373
+ }>;
8374
+ query: TRPCQueryProcedure<{
8375
+ input: {
8376
+ [x: string]: unknown;
8377
+ } & z.input<typeof recordsCapability.methods.query.input>;
8378
+ output: z.infer<typeof recordsCapability.methods.query.output>;
8379
+ meta: object;
8380
+ }>;
8381
+ count: TRPCQueryProcedure<{
8382
+ input: {
8383
+ [x: string]: unknown;
8384
+ } & z.input<typeof recordsCapability.methods.count.input>;
8385
+ output: z.infer<typeof recordsCapability.methods.count.output>;
8386
+ meta: object;
8387
+ }>;
8388
+ histogram: TRPCQueryProcedure<{
8389
+ input: {
8390
+ [x: string]: unknown;
8391
+ } & z.input<typeof recordsCapability.methods.histogram.input>;
8392
+ output: z.infer<typeof recordsCapability.methods.histogram.output>;
8393
+ meta: object;
8394
+ }>;
8395
+ aggregate: TRPCQueryProcedure<{
8396
+ input: {
8397
+ [x: string]: unknown;
8398
+ } & z.input<typeof recordsCapability.methods.aggregate.input>;
8399
+ output: z.infer<typeof recordsCapability.methods.aggregate.output>;
8400
+ meta: object;
8401
+ }>;
8402
+ deleteWhere: TRPCMutationProcedure<{
8403
+ input: {
8404
+ [x: string]: unknown;
8405
+ } & z.input<typeof recordsCapability.methods.deleteWhere.input>;
8406
+ output: z.infer<typeof recordsCapability.methods.deleteWhere.output>;
8407
+ meta: object;
8408
+ }>;
8409
+ deleteDevice: TRPCMutationProcedure<{
8410
+ input: {
8411
+ [x: string]: unknown;
8412
+ } & z.input<typeof recordsCapability.methods.deleteDevice.input>;
8413
+ output: z.infer<typeof recordsCapability.methods.deleteDevice.output>;
8414
+ meta: object;
8415
+ }>;
8416
+ allocateId: TRPCMutationProcedure<{
8417
+ input: {
8418
+ [x: string]: unknown;
8419
+ } & z.input<typeof recordsCapability.methods.allocateId.input>;
8420
+ output: z.infer<typeof recordsCapability.methods.allocateId.output>;
8421
+ meta: object;
8422
+ }>;
8423
+ }>>;
8268
8424
  sceneMonitor: TRPCBuiltRouter<{
8269
8425
  ctx: TrpcContext;
8270
8426
  meta: object;
@@ -8854,6 +9010,41 @@ export type AppRouter = TrpcCoreRouter<{
8854
9010
  output: z.infer<typeof storageAdminCapability.methods.dropCollection.output>;
8855
9011
  meta: object;
8856
9012
  }>;
9013
+ listKinds: TRPCQueryProcedure<{
9014
+ input: {
9015
+ [x: string]: unknown;
9016
+ } & z.input<typeof storageAdminCapability.methods.listKinds.input>;
9017
+ output: z.infer<typeof storageAdminCapability.methods.listKinds.output>;
9018
+ meta: object;
9019
+ }>;
9020
+ readRecords: TRPCQueryProcedure<{
9021
+ input: {
9022
+ [x: string]: unknown;
9023
+ } & z.input<typeof storageAdminCapability.methods.readRecords.input>;
9024
+ output: z.infer<typeof storageAdminCapability.methods.readRecords.output>;
9025
+ meta: object;
9026
+ }>;
9027
+ adoptRecords: TRPCMutationProcedure<{
9028
+ input: {
9029
+ [x: string]: unknown;
9030
+ } & z.input<typeof storageAdminCapability.methods.adoptRecords.input>;
9031
+ output: z.infer<typeof storageAdminCapability.methods.adoptRecords.output>;
9032
+ meta: object;
9033
+ }>;
9034
+ readLegacyCollection: TRPCQueryProcedure<{
9035
+ input: {
9036
+ [x: string]: unknown;
9037
+ } & z.input<typeof storageAdminCapability.methods.readLegacyCollection.input>;
9038
+ output: z.infer<typeof storageAdminCapability.methods.readLegacyCollection.output>;
9039
+ meta: object;
9040
+ }>;
9041
+ isAdoptedLegacyTable: TRPCQueryProcedure<{
9042
+ input: {
9043
+ [x: string]: unknown;
9044
+ } & z.input<typeof storageAdminCapability.methods.isAdoptedLegacyTable.input>;
9045
+ output: z.infer<typeof storageAdminCapability.methods.isAdoptedLegacyTable.output>;
9046
+ meta: object;
9047
+ }>;
8857
9048
  }>>;
8858
9049
  storageEvictable: TRPCBuiltRouter<{
8859
9050
  ctx: TrpcContext;
@@ -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: 27 caps, 69 methods with defaults.
14
+ * Coverage: 29 caps, 71 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
  /**
@@ -126,11 +126,13 @@ export { privacyMaskCapability } from '../capabilities/privacy-mask.cap.js';
126
126
  export { ptzCapability } from '../capabilities/ptz.cap.js';
127
127
  export { ptzAutotrackCapability } from '../capabilities/ptz-autotrack.cap.js';
128
128
  export { rebootCapability } from '../capabilities/reboot.cap.js';
129
+ export { recordEntriesCapability } from '../capabilities/record-entries.cap.js';
129
130
  export { recordingCapability } from '../capabilities/recording.cap.js';
130
131
  export { recordingArchiveCapability } from '../capabilities/recording-archive.cap.js';
131
132
  export { recordingExportCapability } from '../capabilities/recording-export.cap.js';
132
133
  export { recordingOnboardCapability } from '../capabilities/recording-onboard.cap.js';
133
134
  export { recordingSignalCapability } from '../capabilities/recording-signal.cap.js';
135
+ export { recordsCapability } from '../capabilities/records.cap.js';
134
136
  export { sceneMonitorCapability } from '../capabilities/scene-monitor.cap.js';
135
137
  export { scriptRunnerCapability } from '../capabilities/script-runner.cap.js';
136
138
  export { serverManagementCapability } from '../capabilities/server-management.cap.js';
@@ -302,11 +304,13 @@ export declare const CAPABILITY_NAMES: {
302
304
  readonly ptz: 'ptz';
303
305
  readonly ptzAutotrack: 'ptz-autotrack';
304
306
  readonly reboot: 'reboot';
307
+ readonly recordEntries: 'record-entries';
305
308
  readonly recording: 'recording';
306
309
  readonly recordingArchive: 'recording-archive';
307
310
  readonly recordingExport: 'recording-export';
308
311
  readonly recordingOnboard: 'recording-onboard';
309
312
  readonly recordingSignal: 'recording-signal';
313
+ readonly records: 'records';
310
314
  readonly sceneMonitor: 'scene-monitor';
311
315
  readonly scriptRunner: 'script-runner';
312
316
  readonly serverManagement: 'server-management';
@@ -491,11 +495,13 @@ export interface CapabilityRouterMap<TRouter = unknown> {
491
495
  readonly ptz: TRouter;
492
496
  readonly ptzAutotrack: TRouter;
493
497
  readonly reboot: TRouter;
498
+ readonly recordEntries: TRouter;
494
499
  readonly recording: TRouter;
495
500
  readonly recordingArchive: TRouter;
496
501
  readonly recordingExport: TRouter;
497
502
  readonly recordingOnboard: TRouter;
498
503
  readonly recordingSignal: TRouter;
504
+ readonly records: TRouter;
499
505
  readonly sceneMonitor: TRouter;
500
506
  readonly scriptRunner: TRouter;
501
507
  readonly serverManagement: TRouter;
@@ -539,8 +545,8 @@ export interface CapabilityRouterMap<TRouter = unknown> {
539
545
  readonly zoneRules: TRouter;
540
546
  readonly zones: TRouter;
541
547
  }
542
- /** Capability names whose mode is `singleton` (141 caps). */
543
- 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', 'calendars', 'camera-credentials', 'camera-grid-layout', 'camera-pipeline-config', 'camera-streams', 'carbon-monoxide', 'climate-control', 'color', 'composer', 'connectivity', 'consumables', 'contact', 'control', 'core-blocks', 'cover', 'database-snapshot', 'day-night', 'decoder', 'detection-pipeline', 'device-admin-link', 'device-adoption', 'device-credentials', 'device-discovery', 'device-history', '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', 'keychain', 'keychain-admin', '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', 'node-certificates', 'nodes', 'notification-rules', 'notifier', 'numeric-sensor', 'oidc-connections', '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-admin', 'storage-migration', 'stream-broker', 'stream-catalog', 'stream-params', 'stream-signals', 'switch', 'system', 'tamper', 'temperature-sensor', 'terminal-session', 'toast', 'training', 'update', 'user-management', 'vacuum-control', 'valve', 'vector-store', 'vibration', 'viewer-ui', 'water-heater', 'weather', 'webrtc-session', 'zone-analytics', 'zone-rules', 'zones'];
548
+ /** Capability names whose mode is `singleton` (143 caps). */
549
+ 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', 'calendars', 'camera-credentials', 'camera-grid-layout', 'camera-pipeline-config', 'camera-streams', 'carbon-monoxide', 'climate-control', 'color', 'composer', 'connectivity', 'consumables', 'contact', 'control', 'core-blocks', 'cover', 'database-snapshot', 'day-night', 'decoder', 'detection-pipeline', 'device-admin-link', 'device-adoption', 'device-credentials', 'device-discovery', 'device-history', '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', 'keychain', 'keychain-admin', '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', 'node-certificates', 'nodes', 'notification-rules', 'notifier', 'numeric-sensor', 'oidc-connections', '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', 'record-entries', 'recording-archive', 'recording-export', 'recording-onboard', 'recording-signal', 'records', 'scene-monitor', 'script-runner', 'server-management', 'settings-store', 'smoke', 'snapshot', 'sso-bridge', 'storage', 'storage-admin', 'storage-migration', 'stream-broker', 'stream-catalog', 'stream-params', 'stream-signals', 'switch', 'system', 'tamper', 'temperature-sensor', 'terminal-session', 'toast', 'training', 'update', 'user-management', 'vacuum-control', 'valve', 'vector-store', 'vibration', 'viewer-ui', 'water-heater', 'weather', 'webrtc-session', 'zone-analytics', 'zone-rules', 'zones'];
544
550
  /** Union of singleton capability names (literal string union). */
545
551
  export type SingletonCapabilityName = typeof SINGLETON_CAPABILITY_NAMES[number];
546
552
  /** Capability names whose mode is `collection` (34 caps). */
@@ -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: 1344 method paths across 175 capabilities.
9
+ * Coverage: 1369 method paths across 177 capabilities.
10
10
  */
11
11
  import type { CapabilityMethodAccess } from '../capabilities/capability-definition.js';
12
12
  export interface MethodAccessRecord {
@@ -6,8 +6,8 @@
6
6
  * system-scope cap that takes a deviceId was previously never device-filtered
7
7
  * — see the generator header).
8
8
  *
9
- * Coverage: 526 methods carry a device reference, of which
10
- * 171 are on SYSTEM-scope caps.
9
+ * Coverage: 534 methods carry a device reference, of which
10
+ * 179 are on SYSTEM-scope caps.
11
11
  *
12
12
  * Top-level fields, number arrays, and one-level arrays of objects carrying
13
13
  * a numeric device field (targets[].deviceId) are all mapped; the matcher