@camstack/types 1.2.59 → 1.2.61

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.
@@ -180,7 +180,7 @@ export { type IPtzProvider, PtzMoveCommandSchema, type PtzOptions, PtzOptionsSch
180
180
  export { type IPtzAutotrackProvider, type PtzAutotrackRuntimeState, PtzAutotrackRuntimeStateSchema, type PtzAutotrackSettings, PtzAutotrackSettingsSchema, type PtzAutotrackStatus, PtzAutotrackStatusSchema, type PtzAutotrackTargetOption, PtzAutotrackTargetOptionSchema, ptzAutotrackCapability, } from './ptz-autotrack.cap.js';
181
181
  export { type IRebootProvider, rebootCapability } from './reboot.cap.js';
182
182
  export { type IRecordingProvider, type LocateSegmentResult, LocateSegmentResultSchema, type ReadGopBytesResult, ReadGopBytesResultSchema, type ReadSegmentBytesResult, ReadSegmentBytesResultSchema, type RecordingAvailability, RecordingAvailabilitySchema, type RecordingDays, RecordingDaysSchema, type RecordingDeviceUsage, RecordingDeviceUsageSchema, type RecordingLocationUsage, RecordingLocationUsageSchema, type RecordingManifest, RecordingManifestSchema, RecordingRangeSchema, type RecordingStatus, RecordingStatusSchema, type RecordingStorageUsage, RecordingStorageUsageSchema, recordingCapability, } from './recording.cap.js';
183
- export { type ExportDownload, ExportDownloadSchema, type ExportOptions, ExportOptionsSchema, type ExportRecord, ExportRecordSchema, ExportSpeedSchema, type ExportState, ExportStateSchema, ExportTimelapseSchema, type IRecordingExportProvider, recordingExportCapability, } from './recording-export.cap.js';
183
+ export { EXPORT_DENSE_MAX_RANGES, RECORDING_EXPORT_MAX_READ_BYTES, type ExportBytes, ExportBytesSchema, type ExportDense, type ExportDenseRange, ExportDenseRangeSchema, ExportDenseSchema, type ExportDownload, ExportDownloadSchema, type ExportOptions, ExportOptionsSchema, type ExportRecord, ExportRecordSchema, ExportSpeedSchema, type ExportState, ExportStateSchema, ExportTimelapseSchema, type IRecordingExportProvider, recordingExportCapability, } from './recording-export.cap.js';
184
184
  export { type ISceneMonitorProvider, type SceneCheck, SceneCheckSchema, type SceneCondition, SceneConditionSchema, type SceneMonitor, SceneMonitorSchema, type SceneMonitorState, SceneMonitorStateSchema, type SceneMonitorStatus, SceneMonitorStatusSchema, type SceneReference, SceneReferenceSchema, sceneMonitorCapability, } from './scene-monitor.cap.js';
185
185
  export { type ZoneRule, type ZoneRuleMode, ZoneRuleModeEnum, ZoneRuleSchema, type ZoneRules, ZoneRulesArraySchema, } from './schemas/zone-rule.js';
186
186
  export { type IScriptRunnerProvider, type ScriptRunnerStatus, ScriptRunnerStatusSchema, scriptRunnerCapability, } from './script-runner.cap.js';
@@ -1146,6 +1146,10 @@ export declare const pipelineOrchestratorCapability: {
1146
1146
  }, z.core.$strip>>>;
1147
1147
  }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
1148
1148
  /**
1149
+ * @deprecated The aggregate switch group is being withdrawn
1150
+ * ([D113](../../../../docs/decisions/adr-0113.md)). Build nothing new on
1151
+ * this pair; read the authority directly.
1152
+ *
1149
1153
  * The whole per-camera function switch group, DERIVED — never a stored
1150
1154
  * list ([D61](../../../../docs/decisions/adr-0067.md)).
1151
1155
  *
@@ -1159,6 +1163,16 @@ export declare const pipelineOrchestratorCapability: {
1159
1163
  * `auth: 'view'` deliberately — a NON-admin must be able to see that a
1160
1164
  * camera is quiet because somebody switched it off. Only the mutation is
1161
1165
  * admin-gated.
1166
+ *
1167
+ * **Removal plan.** It stays and it KEEPS WORKING while shipped viewers
1168
+ * (v1.0.305) and the admin UI still call it — removing it now is a broken
1169
+ * app on a device nobody can redeploy from here. It is served by a thin
1170
+ * shim over the same authorities (`camera-switch-service.ts`), so the
1171
+ * behaviour of the pair is the behaviour of the authorities by
1172
+ * construction. It is deleted once every surface reaches its own
1173
+ * component's options and the last caller is gone. Nothing on this server
1174
+ * reads it: `CameraStatus.switchedOff` is composed from the authorities
1175
+ * directly via `composeSwitchedOff`.
1162
1176
  */
1163
1177
  readonly getCameraSwitches: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
1164
1178
  deviceId: z.ZodNumber;
@@ -1206,6 +1220,10 @@ export declare const pipelineOrchestratorCapability: {
1206
1220
  fetchedAt: z.ZodNumber;
1207
1221
  }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
1208
1222
  /**
1223
+ * @deprecated See {@link getCameraSwitches}. Write the authority — the
1224
+ * wrapper binding, `RecordingConfig.enabled`, the notification mute — not
1225
+ * this ([D113](../../../../docs/decisions/adr-0113.md)).
1226
+ *
1209
1227
  * Flip ONE switch, routed to its existing authority.
1210
1228
  *
1211
1229
  * Never writes a parallel map: `recording` patches `RecordingConfig.enabled`
@@ -16,10 +16,56 @@ import { z } from 'zod';
16
16
  import { type InferProvider } from './capability-definition.js';
17
17
  /** Playback-speed multiplier for the render (1 = realtime). */
18
18
  export declare const ExportSpeedSchema: z.ZodNumber;
19
+ /**
20
+ * One dense interval, in SECONDS FROM THE EXPORT'S OWN `fromMs`.
21
+ *
22
+ * Relative and not absolute epoch on purpose: the renderer's frame-select
23
+ * expression sees ffmpeg's `t`, which starts at 0 for the export's source
24
+ * playlist. Handing it absolute epochs would make every call site responsible
25
+ * for the same subtraction, and the one that forgot would emit a filter that
26
+ * selects nothing — silently, as a uniform timelapse.
27
+ */
28
+ export declare const ExportDenseRangeSchema: z.ZodObject<{
29
+ fromSec: z.ZodNumber;
30
+ toSec: z.ZodNumber;
31
+ }, z.core.$strip>;
32
+ export type ExportDenseRange = z.infer<typeof ExportDenseRangeSchema>;
33
+ /**
34
+ * Hard ceiling on dense ranges in ONE render.
35
+ *
36
+ * The ranges become terms of a single ffmpeg `select` expression, so the count
37
+ * is the length of a command-line argument. The producer (the timelapse
38
+ * scheduler) coalesces and then falls back to the base cadence alone rather
39
+ * than trimming — a truncated range list is a video that quietly omits the
40
+ * evening.
41
+ */
42
+ export declare const EXPORT_DENSE_MAX_RANGES = 200;
43
+ /**
44
+ * Dense-interval overlay for a timelapse: sample at `dense.everyMs` INSIDE the
45
+ * listed ranges and at the base `everyMs` everywhere else.
46
+ *
47
+ * `everyMs` must be strictly smaller than the base cadence — a dense rate that
48
+ * is not denser renders a uniform timelapse the operator believes is two-rate.
49
+ */
50
+ export declare const ExportDenseSchema: z.ZodObject<{
51
+ everyMs: z.ZodNumber;
52
+ ranges: z.ZodArray<z.ZodObject<{
53
+ fromSec: z.ZodNumber;
54
+ toSec: z.ZodNumber;
55
+ }, z.core.$strip>>;
56
+ }, z.core.$strip>;
57
+ export type ExportDense = z.infer<typeof ExportDenseSchema>;
19
58
  /** Timelapse cadence — sample one source frame per `everyMs`, output at `outputFps`. */
20
59
  export declare const ExportTimelapseSchema: z.ZodObject<{
21
60
  everyMs: z.ZodNumber;
22
61
  outputFps: z.ZodOptional<z.ZodNumber>;
62
+ dense: z.ZodOptional<z.ZodObject<{
63
+ everyMs: z.ZodNumber;
64
+ ranges: z.ZodArray<z.ZodObject<{
65
+ fromSec: z.ZodNumber;
66
+ toSec: z.ZodNumber;
67
+ }, z.core.$strip>>;
68
+ }, z.core.$strip>>;
23
69
  }, z.core.$strip>;
24
70
  /**
25
71
  * Render options. `speed` and `timelapse` are mutually exclusive. `includeAudio`
@@ -32,6 +78,13 @@ export declare const ExportOptionsSchema: z.ZodObject<{
32
78
  timelapse: z.ZodOptional<z.ZodObject<{
33
79
  everyMs: z.ZodNumber;
34
80
  outputFps: z.ZodOptional<z.ZodNumber>;
81
+ dense: z.ZodOptional<z.ZodObject<{
82
+ everyMs: z.ZodNumber;
83
+ ranges: z.ZodArray<z.ZodObject<{
84
+ fromSec: z.ZodNumber;
85
+ toSec: z.ZodNumber;
86
+ }, z.core.$strip>>;
87
+ }, z.core.$strip>>;
35
88
  }, z.core.$strip>>;
36
89
  includeAudio: z.ZodBoolean;
37
90
  maxLifeMs: z.ZodNumber;
@@ -60,6 +113,13 @@ export declare const ExportRecordSchema: z.ZodObject<{
60
113
  timelapse: z.ZodOptional<z.ZodObject<{
61
114
  everyMs: z.ZodNumber;
62
115
  outputFps: z.ZodOptional<z.ZodNumber>;
116
+ dense: z.ZodOptional<z.ZodObject<{
117
+ everyMs: z.ZodNumber;
118
+ ranges: z.ZodArray<z.ZodObject<{
119
+ fromSec: z.ZodNumber;
120
+ toSec: z.ZodNumber;
121
+ }, z.core.$strip>>;
122
+ }, z.core.$strip>>;
63
123
  }, z.core.$strip>>;
64
124
  includeAudio: z.ZodBoolean;
65
125
  maxLifeMs: z.ZodNumber;
@@ -90,6 +150,38 @@ export declare const ExportDownloadSchema: z.ZodObject<{
90
150
  endpoints: z.ZodArray<z.ZodString>;
91
151
  }, z.core.$strip>;
92
152
  export type ExportDownload = z.infer<typeof ExportDownloadSchema>;
153
+ /**
154
+ * Hard ceiling on ONE {@link recordingExportCapability} byte read — 50 MiB.
155
+ *
156
+ * Two independent reasons land on the same number, which is why it is this one
157
+ * and not a rounder guess:
158
+ *
159
+ * - **Nobody would accept more.** The roomiest byte cap any notifier backend
160
+ * declares is telegram's 50 MiB, and the degrade engine DROPS an over-cap
161
+ * attachment outright rather than degrading it to a link. Bytes above this
162
+ * are read, encoded and moved to be thrown away at the last step.
163
+ * - **The envelope is unary.** A base64 payload is held whole, ~1.33× its
164
+ * size, in the provider AND in the caller — on a hub this repo has already
165
+ * OOM'd once (D9/D18). A bounded on-demand read at human speed is the shape
166
+ * those records permit; an unbounded one is the shape they forbid.
167
+ *
168
+ * Above it the provider REFUSES with a log line rather than truncating: half a
169
+ * video is worse than a notification that says there is no attachment.
170
+ */
171
+ export declare const RECORDING_EXPORT_MAX_READ_BYTES: number;
172
+ /**
173
+ * A finished export's bytes, inline.
174
+ *
175
+ * `bytes` is the DECODED length — the number the caller bounds and logs
176
+ * against, so nobody has to infer it from the base64 length.
177
+ */
178
+ export declare const ExportBytesSchema: z.ZodObject<{
179
+ base64: z.ZodString;
180
+ contentType: z.ZodString;
181
+ name: z.ZodString;
182
+ bytes: z.ZodNumber;
183
+ }, z.core.$strip>;
184
+ export type ExportBytes = z.infer<typeof ExportBytesSchema>;
93
185
  export declare const recordingExportCapability: {
94
186
  readonly name: "recordingExport";
95
187
  readonly scope: "system";
@@ -107,6 +199,13 @@ export declare const recordingExportCapability: {
107
199
  timelapse: z.ZodOptional<z.ZodObject<{
108
200
  everyMs: z.ZodNumber;
109
201
  outputFps: z.ZodOptional<z.ZodNumber>;
202
+ dense: z.ZodOptional<z.ZodObject<{
203
+ everyMs: z.ZodNumber;
204
+ ranges: z.ZodArray<z.ZodObject<{
205
+ fromSec: z.ZodNumber;
206
+ toSec: z.ZodNumber;
207
+ }, z.core.$strip>>;
208
+ }, z.core.$strip>>;
110
209
  }, z.core.$strip>>;
111
210
  includeAudio: z.ZodBoolean;
112
211
  maxLifeMs: z.ZodNumber;
@@ -124,6 +223,13 @@ export declare const recordingExportCapability: {
124
223
  timelapse: z.ZodOptional<z.ZodObject<{
125
224
  everyMs: z.ZodNumber;
126
225
  outputFps: z.ZodOptional<z.ZodNumber>;
226
+ dense: z.ZodOptional<z.ZodObject<{
227
+ everyMs: z.ZodNumber;
228
+ ranges: z.ZodArray<z.ZodObject<{
229
+ fromSec: z.ZodNumber;
230
+ toSec: z.ZodNumber;
231
+ }, z.core.$strip>>;
232
+ }, z.core.$strip>>;
127
233
  }, z.core.$strip>>;
128
234
  includeAudio: z.ZodBoolean;
129
235
  maxLifeMs: z.ZodNumber;
@@ -161,6 +267,13 @@ export declare const recordingExportCapability: {
161
267
  timelapse: z.ZodOptional<z.ZodObject<{
162
268
  everyMs: z.ZodNumber;
163
269
  outputFps: z.ZodOptional<z.ZodNumber>;
270
+ dense: z.ZodOptional<z.ZodObject<{
271
+ everyMs: z.ZodNumber;
272
+ ranges: z.ZodArray<z.ZodObject<{
273
+ fromSec: z.ZodNumber;
274
+ toSec: z.ZodNumber;
275
+ }, z.core.$strip>>;
276
+ }, z.core.$strip>>;
164
277
  }, z.core.$strip>>;
165
278
  includeAudio: z.ZodBoolean;
166
279
  maxLifeMs: z.ZodNumber;
@@ -197,6 +310,13 @@ export declare const recordingExportCapability: {
197
310
  timelapse: z.ZodOptional<z.ZodObject<{
198
311
  everyMs: z.ZodNumber;
199
312
  outputFps: z.ZodOptional<z.ZodNumber>;
313
+ dense: z.ZodOptional<z.ZodObject<{
314
+ everyMs: z.ZodNumber;
315
+ ranges: z.ZodArray<z.ZodObject<{
316
+ fromSec: z.ZodNumber;
317
+ toSec: z.ZodNumber;
318
+ }, z.core.$strip>>;
319
+ }, z.core.$strip>>;
200
320
  }, z.core.$strip>>;
201
321
  includeAudio: z.ZodBoolean;
202
322
  maxLifeMs: z.ZodNumber;
@@ -234,6 +354,13 @@ export declare const recordingExportCapability: {
234
354
  timelapse: z.ZodOptional<z.ZodObject<{
235
355
  everyMs: z.ZodNumber;
236
356
  outputFps: z.ZodOptional<z.ZodNumber>;
357
+ dense: z.ZodOptional<z.ZodObject<{
358
+ everyMs: z.ZodNumber;
359
+ ranges: z.ZodArray<z.ZodObject<{
360
+ fromSec: z.ZodNumber;
361
+ toSec: z.ZodNumber;
362
+ }, z.core.$strip>>;
363
+ }, z.core.$strip>>;
237
364
  }, z.core.$strip>>;
238
365
  includeAudio: z.ZodBoolean;
239
366
  maxLifeMs: z.ZodNumber;
@@ -271,6 +398,13 @@ export declare const recordingExportCapability: {
271
398
  timelapse: z.ZodOptional<z.ZodObject<{
272
399
  everyMs: z.ZodNumber;
273
400
  outputFps: z.ZodOptional<z.ZodNumber>;
401
+ dense: z.ZodOptional<z.ZodObject<{
402
+ everyMs: z.ZodNumber;
403
+ ranges: z.ZodArray<z.ZodObject<{
404
+ fromSec: z.ZodNumber;
405
+ toSec: z.ZodNumber;
406
+ }, z.core.$strip>>;
407
+ }, z.core.$strip>>;
274
408
  }, z.core.$strip>>;
275
409
  includeAudio: z.ZodBoolean;
276
410
  maxLifeMs: z.ZodNumber;
@@ -300,6 +434,31 @@ export declare const recordingExportCapability: {
300
434
  url: z.ZodString;
301
435
  endpoints: z.ZodArray<z.ZodString>;
302
436
  }, z.core.$strip>, "query">;
437
+ /**
438
+ * The finished file's BYTES, base64, for a caller that must republish them
439
+ * somewhere a session-less fetcher can reach.
440
+ *
441
+ * `getDownloadUrl` is the right answer for a human: the download route is
442
+ * served `access: 'authenticated'`, which a browser satisfies and a
443
+ * notifier BACKEND does not. It answers a RELATIVE path, so it is not even
444
+ * a URL an outside fetcher could try. This method exists for the one case
445
+ * that needs the other thing — a scheduled timelapse whose video has to
446
+ * become a public attachment on the notification artifact plane.
447
+ *
448
+ * Deliberately narrow: `ready` only (a queued, rendering, failed, expired
449
+ * or deleted export has no file, and answering "0 bytes" for one is how a
450
+ * caller ships an empty attachment), still inside its lifetime, and under
451
+ * {@link RECORDING_EXPORT_MAX_READ_BYTES}. Every refusal throws with the
452
+ * reason — none of them is silent.
453
+ */
454
+ readonly readExportBytes: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
455
+ exportId: z.ZodString;
456
+ }, z.core.$strip>, z.ZodObject<{
457
+ base64: z.ZodString;
458
+ contentType: z.ZodString;
459
+ name: z.ZodString;
460
+ bytes: z.ZodNumber;
461
+ }, z.core.$strip>, "query">;
303
462
  };
304
463
  };
305
464
  export type IRecordingExportProvider = InferProvider<typeof recordingExportCapability>;
@@ -90,24 +90,28 @@ export declare const snapshotCapability: {
90
90
  *
91
91
  * `getSnapshotOverview` is cache-only by contract: it answers from whatever
92
92
  * the wrapper happens to hold and never captures. Under D93 the client
93
- * versions its image URL on that answer, and an image REQUEST is what enrols
94
- * a camera in the keep-warm loop. Both of those are satisfiable by the
95
- * client's own image cache — `expo-image` is URL-keyed and never revalidates
96
- * — so a URL painted in a previous session comes off disk with no network,
97
- * no enrolment, and nothing warming. Measured on the live hub: reopening
98
- * after two minutes idle painted 15 of 16 tiles at **168 s old** with zero
99
- * HTTP requests, and the fleet only recovered because a later poll happened
100
- * to observe a different identity.
93
+ * versions its image URL on that answer, and an image REQUEST was the only
94
+ * demand signal. Both of those are satisfiable by the client's own image
95
+ * cache — `expo-image` is URL-keyed and never revalidates — so a URL painted
96
+ * in a previous session comes off disk with no network, no demand, and no
97
+ * capture. Measured on the live hub: reopening after two minutes idle
98
+ * painted 15 of 16 tiles at **168 s old** with zero HTTP requests, and the
99
+ * fleet only recovered because a later poll happened to observe a different
100
+ * identity.
101
101
  *
102
102
  * ## The two properties that fix it
103
103
  *
104
104
  * **It is an RPC, so no client cache can answer it.** The demand signal
105
- * always reaches the wrapper. This method therefore MAY create keep-warm
106
- * subscriptions, where `getSnapshotOverview` must never (D93) — the
107
- * distinction is not "one is newer" but that the overview poll is app-wide
108
- * (a creating overview would warm every camera on the install) while this is
109
- * called by a rendered surface naming the tiles it is actually painting, at
110
- * the width it is painting them.
105
+ * always reaches the wrapper. This method therefore CAPTURES, where
106
+ * `getSnapshotOverview` must never (D93) — the distinction is not "one is
107
+ * newer" but that the overview poll is app-wide (a capturing overview would
108
+ * dial every camera on the install) while this is called by a rendered
109
+ * surface naming the tiles it is actually painting, at the width it is
110
+ * painting them.
111
+ *
112
+ * Since 2026-08-11 this is the ONLY thing that refreshes a snapshot: the
113
+ * server-side keep-warm loop was removed (operator directive — on-demand,
114
+ * always), so a camera nobody is looking at costs nothing at all.
111
115
  *
112
116
  * **It waits, briefly and boundedly, for the capture it triggered.** The
113
117
  * returned `capturedAt` is the frame the link will serve, not the frame the
@@ -193,6 +193,18 @@ export declare class DeclaredDevices {
193
193
  */
194
194
  private ensureIntegration;
195
195
  private readIndex;
196
+ /**
197
+ * Devices this kernel already has CONSTRUCTED, by stableId.
198
+ *
199
+ * Distinct from {@link readIndex}, and the distinction is the bug: the index
200
+ * is persisted rows, this is live objects. A row without an object must be
201
+ * adopted; an object must be left exactly as it is.
202
+ *
203
+ * Failure is non-fatal and deliberately so — an empty map degrades to the
204
+ * previous behaviour (attempt the adopt) rather than skipping a device that
205
+ * genuinely needs bringing up.
206
+ */
207
+ private readLiveByStableId;
196
208
  /**
197
209
  * One declaration: adopt what exists, create what does not.
198
210
  *
@@ -6359,6 +6359,13 @@ export type AppRouter = TrpcCoreRouter<{
6359
6359
  output: z.infer<typeof recordingExportCapability.methods.getDownloadUrl.output>;
6360
6360
  meta: object;
6361
6361
  }>;
6362
+ readExportBytes: TRPCQueryProcedure<{
6363
+ input: {
6364
+ [x: string]: unknown;
6365
+ } & z.input<typeof recordingExportCapability.methods.readExportBytes.input>;
6366
+ output: z.infer<typeof recordingExportCapability.methods.readExportBytes.output>;
6367
+ meta: object;
6368
+ }>;
6362
6369
  }>>;
6363
6370
  sceneMonitor: TRPCBuiltRouter<{
6364
6371
  ctx: TrpcContext;
@@ -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: 927 method paths across 123 capabilities.
9
+ * Coverage: 928 method paths across 123 capabilities.
10
10
  */
11
11
  import type { CapabilityMethodAccess } from '../capabilities/capability-definition.js';
12
12
  export interface MethodAccessRecord {
@@ -88,7 +88,7 @@ export interface SystemProxy {
88
88
  readonly pipelineRunner: Pick<InferProvider<typeof pipelineRunnerCapability>, 'attachCamera' | 'reportMotion' | 'getLocalLoad' | 'getLocalMetrics' | 'getAllCameraMetrics' | 'getLocalCameras' | 'getNativeCrop' | 'runStatelessStep'>;
89
89
  readonly plateGallery: Pick<InferProvider<typeof plateGalleryCapability>, 'getPlateMedia' | 'searchPlates' | 'suggestPlateClusters' | 'correctPlateText' | 'deletePlate' | 'listVehicles' | 'createVehicle' | 'renameVehicle' | 'deleteVehicle' | 'listVehicleSamples' | 'removeVehicleSample' | 'assignPlate' | 'unassignPlate' | 'assignPlates' | 'unassignPlates'>;
90
90
  readonly recording: Pick<InferProvider<typeof recordingCapability>, 'getStorageUsage' | 'listOpsLog' | 'pauseForStorageMigration' | 'resumeForStorageMigration' | 'refreshStorageLocationsForMigration' | 'startStorageMigrationMove' | 'getStorageMigrationMoveStatus' | 'cancelStorageMigrationMove'>;
91
- readonly recordingExport: Pick<InferProvider<typeof recordingExportCapability>, 'getExport' | 'cancelExport' | 'deleteExport' | 'getDownloadUrl'>;
91
+ readonly recordingExport: Pick<InferProvider<typeof recordingExportCapability>, 'getExport' | 'cancelExport' | 'deleteExport' | 'getDownloadUrl' | 'readExportBytes'>;
92
92
  readonly serverManagement: Pick<InferProvider<typeof serverManagementCapability>, 'getServerPackageStatus' | 'checkServerUpdate' | 'applyServerUpdate' | 'rollbackServerUpdate' | 'restartServer'>;
93
93
  readonly settingsStore: Pick<InferProvider<typeof settingsStoreCapability>, 'get' | 'set' | 'query' | 'insert' | 'update' | 'delete' | 'deleteWhere' | 'updateWhere' | 'count' | 'histogram' | 'isEmpty' | 'declareCollection'>;
94
94
  readonly storage: Pick<InferProvider<typeof storageCapability>, 'resolve' | 'write' | 'read' | 'exists' | 'list' | 'delete' | 'getAvailableSpace' | 'beginUpload' | 'writeChunk' | 'finalizeUpload' | 'abortUpload' | 'beginDownload' | 'readChunk' | 'endDownload' | 'listLocations' | 'getDefaultLocation' | 'listLocationDeclarations' | 'upsertLocation' | 'deleteLocation' | 'testLocation' | 'listProviders' | 'testConfig'>;
package/dist/index.d.ts CHANGED
@@ -189,7 +189,7 @@ export { type PreparedAction, type PreparedAttachment, type PreparedNotification
189
189
  export { htmlToText, markdownToHtmlLite, markdownToText, type NotificationFormat as NotificationBodyFormat, resolveFormat, textToHtml, transcodeBody, } from './notification/format-transcode.js';
190
190
  export { isScheduleActive } from './notification/schedule.js';
191
191
  export type { TimelapseRule, TimelapseRuleInput, TimelapseRulePatch, TimelapseTemplate, } from './notification/timelapse-rule.js';
192
- export { TimelapseRuleInputSchema, TimelapseRulePatchSchema, TimelapseRuleSchema, TimelapseTemplateSchema, } from './notification/timelapse-rule.js';
192
+ export { readTimelapseGeneratedAt, TimelapseRuleInputSchema, TimelapseRulePatchSchema, TimelapseRuleSchema, TimelapseTemplateSchema, } from './notification/timelapse-rule.js';
193
193
  export { DEFAULT_DETAIL_CROP_CONVENTION, DETAIL_CROP_PADDING_FIELD, DETAIL_CROP_PADDING_KEY, DETAIL_CROP_SECTION_ID, DETAIL_CROP_SQUARE_KEY, type DetailCropConvention, DetailCropConventionSchema, type DetailCropRect, deriveDetailCropRect, type HydratedSettingsSection, type HydratedSettingsView, pickDetailCropConvention, readDetailCropConvention, } from './pipeline/detail-crop.js';
194
194
  export { DEFAULT_NATIVE_LEASE_SETTINGS, NATIVE_LEASE_ACTIVITY_FIELD, NATIVE_LEASE_ACTIVITY_KEY, NATIVE_LEASE_ADMISSION_FIELD, NATIVE_LEASE_ADMISSION_KEY, NATIVE_LEASE_BUDGET_FIELD, NATIVE_LEASE_BUDGET_KEY, NATIVE_LEASE_SECTION_ID, NATIVE_LEASE_TTL_FIELD, NATIVE_LEASE_TTL_KEY, type NativeLeaseAdmission, NativeLeaseAdmissionSchema, type NativeLeaseKnob, type NativeLeaseNumberKnob, type NativeLeaseSettings, type NativeLeaseSettingsOverride, NativeLeaseSettingsSchema, pickNativeLeaseOverride, readNativeLeaseOverride, } from './pipeline/native-lease.js';
195
195
  export { type ApiKeyRecord, ApiKeyRecordSchema, type CapScope, CapScopeSchema, type MethodAccess, MethodAccessSchema, type ScopedToken, ScopedTokenSchema, type TokenScope, TokenScopeSchema, type UserRecord, UserRecordSchema, } from './schemas/auth-records.js';