@camstack/types 1.2.112 → 1.2.113

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.
@@ -0,0 +1,130 @@
1
+ /**
2
+ * LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
3
+ * valutatore puro del suo FRONTE.
4
+ *
5
+ * Viveva dentro il builtin virtual-doorbell
6
+ * (`@camstack/system` — `builtins/doorbell/trigger-engine.ts`) e i suoi
7
+ * predicati erano privati al modulo. Il recorder ne ha bisogno per il trigger
8
+ * `RecordingTriggers.sensorDeviceIds`: copiarla avrebbe creato la SECONDA
9
+ * tabella, che diverge alla prima cap aggiunta e il cui sintomo — "il sensore
10
+ * fa suonare il campanello ma non registra" — è esattamente D62. Quindi si
11
+ * SPOSTA qui e il doorbell la ri-esporta.
12
+ *
13
+ * ⚠ NON è `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), e le
14
+ * due non vanno unificate: quella risponde a "qual è la PAROLA di stato per una
15
+ * regola" (e include `presence`, `cover`, `alarm-panel`), questa a "qual è il
16
+ * booleano il cui FRONTE conta". Vocabolari deliberatamente diversi.
17
+ */
18
+ /**
19
+ * Known binary / switch source caps → the boolean slice field whose
20
+ * false→true rise counts as ACTIVE. Every entry is "fire on active".
21
+ * Sensors whose "active" reading is not a plain boolean (presence's string
22
+ * state, connectivity's connected flag) are deliberately excluded — a
23
+ * reconnect is not a doorbell press, and it is not a recording either.
24
+ */
25
+ export declare const SOURCE_CAP_ACTIVE_FIELD: Readonly<Record<string, string>>;
26
+ /**
27
+ * The same caps → the slice field carrying the ms-epoch timestamp of the
28
+ * last transition. Every source cap MUST appear here (guarded by a spec):
29
+ * without a transition timestamp the evaluator cannot tell a genuine rise
30
+ * from a boot-time hydration when the FIRST slice it ever sees is already
31
+ * active, and errs towards silence — swallowing the rise.
32
+ *
33
+ * These timestamps are UPSTREAM ones, not ingest ones: the Home Assistant
34
+ * provider derives them from `state.last_changed`, so they survive our own
35
+ * restarts and correctly read as "hours ago" for a state that has been
36
+ * active for hours. `motion` names its rise timestamp `lastDetectedAt`.
37
+ */
38
+ export declare const SOURCE_CAP_CHANGED_AT_FIELD: Readonly<Record<string, string>>;
39
+ /** Cap names whose presence in a device's bindings qualify it as a source. */
40
+ export declare const SOURCE_CAPS: readonly string[];
41
+ /**
42
+ * Device `type` values (from `DeviceType`) that can host a binary/switch
43
+ * source cap. Used by the camera's `device-multiselect` picker as the
44
+ * CLIENT-SIDE filter, alongside `SOURCE_CAPS`.
45
+ *
46
+ * Why types and not caps alone: the shared picker filters
47
+ * `deviceManager.listAll` rows client-side, and those rows carry only the
48
+ * device's advertised `features` — NOT its registered cap list. On the live
49
+ * cluster binary sensors and switches advertise EMPTY features (features
50
+ * mirror only a handful of caps like `motion-trigger`), so a caps-only
51
+ * filter matched against `features` would list nothing (the very bug this
52
+ * replaced, which relied on the now-empty `getAllBindings`). Matching by
53
+ * `type` is the reliable client-side signal; the union with `SOURCE_CAPS`
54
+ * still captures any device that DOES advertise a source-cap feature.
55
+ * `sensor` covers contact/motion/flood/gas/smoke/CO/vibration/tamper,
56
+ * `switch` covers switches, `control` covers generic binary actuators.
57
+ */
58
+ export declare const SOURCE_DEVICE_TYPES: readonly string[];
59
+ /** True when a cap is a recognised binary/switch source. */
60
+ export declare function isSourceCap(capName: string): boolean;
61
+ /** Extract the "active" boolean a source cap's slice carries, or null when
62
+ * the cap is unknown or the field is missing / non-boolean. */
63
+ export declare function sliceActiveValue(capName: string, slice: Readonly<Record<string, unknown>>): boolean | null;
64
+ /** Ms-epoch transition timestamp a source cap's slice carries, or null when
65
+ * it is absent, non-numeric or the zero "never observed" sentinel. */
66
+ export declare function sliceChangedAt(capName: string, slice: Readonly<Record<string, unknown>>): number | null;
67
+ /**
68
+ * Perché una slice non ha portato un fronte alto. Stesso vocabolario che il
69
+ * virtual-doorbell riporta dal 2026-08-05: UN enum, così "perché non è scattato
70
+ * niente" ha una risposta sola, chiunque lo chieda.
71
+ */
72
+ export type SensorEdgeIgnoreReason =
73
+ /** Not a recognised binary/switch source cap. */
74
+ 'unknown-cap'
75
+ /** Recognised cap, but its active field is missing or not a boolean. */
76
+ | 'non-boolean-value'
77
+ /** First sighting, INACTIVE — nothing can have been lost. */
78
+ | 'baseline-seeded-inactive'
79
+ /** First sighting, ALREADY ACTIVE, and we could not prove it is a fresh
80
+ * transition. A genuine rise MAY have been swallowed here. */
81
+ | 'baseline-seeded-stale-active'
82
+ /** Re-emission carrying the same binary value. */
83
+ | 'no-change'
84
+ /** The falling edge — switch-off / contact-close never fires. */
85
+ | 'falling-edge';
86
+ export interface SensorEdgeInput {
87
+ readonly capName: string;
88
+ readonly slice: Readonly<Record<string, unknown>>;
89
+ /** Ultimo booleano osservato per questa `(device, cap)`; `undefined` = mai vista. */
90
+ readonly prior: boolean | undefined;
91
+ /** Quando l'OSSERVATORE ha iniziato a guardare — il pavimento per una prima
92
+ * osservazione già attiva. Ogni osservatore ha il suo. */
93
+ readonly startedAtMs: number;
94
+ readonly nowMs: number;
95
+ readonly firstSightingFreshnessMs: number;
96
+ }
97
+ /**
98
+ * `value` è restituito su ogni cammino in cui la slice PORTAVA un booleano,
99
+ * anche quando non c'è fronte: il chiamante aggiorna la sua memoria con quello
100
+ * e non rilegge la slice. Su `unknown-cap` / `non-boolean-value` è `null` e la
101
+ * memoria non va toccata.
102
+ */
103
+ export type SensorEdgeVerdict = {
104
+ readonly edge: 'rising';
105
+ readonly value: true;
106
+ } | {
107
+ readonly edge: 'none';
108
+ readonly value: boolean | null;
109
+ readonly reason: SensorEdgeIgnoreReason;
110
+ };
111
+ /**
112
+ * How recent a source's own transition timestamp must be for a FIRST
113
+ * sighting that is already active to count as a genuine rise rather than a
114
+ * hydration of long-standing state.
115
+ */
116
+ export declare const DEFAULT_FIRST_SIGHTING_FRESHNESS_MS = 30000;
117
+ /**
118
+ * IL fronte. Puro: nessun orologio proprio, nessuna memoria — il chiamante
119
+ * porta `prior`, `nowMs` e il proprio `startedAtMs`.
120
+ *
121
+ * Il caso della PRIMA slice già attiva è trattato esplicitamente e vale come
122
+ * fronte solo se il timestamp UPSTREAM della transizione è posteriore a
123
+ * `startedAtMs` **e** entro `firstSightingFreshnessMs`. Entrambe le metà
124
+ * servono: la sola freschezza scatterebbe su un'idratazione al boot di uno
125
+ * stato flippato pochi secondi prima del riavvio, e il solo "dopo che abbiamo
126
+ * iniziato" scatterebbe, su un processo di lunga vita, per una sorgente
127
+ * adottata oggi il cui stato è cambiato ieri. Il caso ambiguo ERRA VERSO IL
128
+ * SILENZIO e lo dichiara (`baseline-seeded-stale-active`).
129
+ */
130
+ export declare function evaluateSensorEdge(input: SensorEdgeInput): SensorEdgeVerdict;
@@ -7684,6 +7684,27 @@ export type AppRouter = TrpcCoreRouter<{
7684
7684
  output: z.infer<typeof systemCapability.methods.detectSiteLocation.output>;
7685
7685
  meta: object;
7686
7686
  }>;
7687
+ getRequestCensus: TRPCQueryProcedure<{
7688
+ input: {
7689
+ nodeId?: string | undefined;
7690
+ } | undefined;
7691
+ output: z.infer<typeof systemCapability.methods.getRequestCensus.output>;
7692
+ meta: object;
7693
+ }>;
7694
+ getLoggingSettings: TRPCQueryProcedure<{
7695
+ input: {
7696
+ [x: string]: unknown;
7697
+ } & z.input<typeof systemCapability.methods.getLoggingSettings.input>;
7698
+ output: z.infer<typeof systemCapability.methods.getLoggingSettings.output>;
7699
+ meta: object;
7700
+ }>;
7701
+ setLoggingSettings: TRPCMutationProcedure<{
7702
+ input: {
7703
+ [x: string]: unknown;
7704
+ } & z.input<typeof systemCapability.methods.setLoggingSettings.input>;
7705
+ output: z.infer<typeof systemCapability.methods.setLoggingSettings.output>;
7706
+ meta: object;
7707
+ }>;
7687
7708
  }>>;
7688
7709
  tamper: TRPCBuiltRouter<{
7689
7710
  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: 963 method paths across 123 capabilities.
9
+ * Coverage: 966 method paths across 123 capabilities.
10
10
  */
11
11
  import type { CapabilityMethodAccess } from '../capabilities/capability-definition.js';
12
12
  export interface MethodAccessRecord {
@@ -94,7 +94,7 @@ export interface SystemProxy {
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'>;
95
95
  readonly storageMigration: Pick<InferProvider<typeof storageMigrationCapability>, 'plan' | 'start' | 'status' | 'cancel'>;
96
96
  readonly streamBroker: Pick<InferProvider<typeof streamBrokerCapability>, 'fetchEventMedia' | 'listAllCameraStreams' | 'listAllProfileSlots' | 'getBrokerStats' | 'probeStream' | 'listClients' | 'killClient' | 'getStreamUrl' | 'getStreamWithCodec' | 'releaseStreamWithCodec' | 'acquireEgressTranscode' | 'releaseEgressTranscode' | 'subscribeAudioChunks' | 'pullAudioChunks' | 'unsubscribeAudioChunks' | 'subscribeFrames' | 'pullFrameHandles' | 'unsubscribeFrames' | 'setPreBufferDuration' | 'getPreBufferInfo' | 'getRtspPort' | 'getAllRtspEntries' | 'getRtspEntry' | 'regenerateRtspToken' | 'setRtspEnabled' | 'isRtspEnabled'>;
97
- readonly system: Pick<InferProvider<typeof systemCapability>, 'info' | 'health' | 'featureFlags' | 'networkAddresses' | 'getRetentionConfig' | 'setRetentionConfig' | 'forceRetentionCleanup' | 'getSiteLocation' | 'setSiteLocation' | 'detectSiteLocation'>;
97
+ readonly system: Pick<InferProvider<typeof systemCapability>, 'info' | 'health' | 'featureFlags' | 'networkAddresses' | 'getRetentionConfig' | 'setRetentionConfig' | 'forceRetentionCleanup' | 'getSiteLocation' | 'setSiteLocation' | 'detectSiteLocation' | 'getRequestCensus' | 'getLoggingSettings' | 'setLoggingSettings'>;
98
98
  readonly terminalSession: Pick<InferProvider<typeof terminalSessionCapability>, 'listProfiles' | 'listInstances' | 'createInstance' | 'updateInstance' | 'deleteInstance' | 'setInstanceEnabled' | 'listLegacyCameras' | 'adoptLegacyMonitor' | 'listSessions' | 'openSession' | 'resize' | 'pullOutput' | 'writeInput' | 'close'>;
99
99
  readonly toast: Pick<InferProvider<typeof toastCapability>, 'onToast'>;
100
100
  readonly turnProvider: Pick<InferProvider<typeof turnProviderCapability>, 'getTurnServers'>;
package/dist/index.d.ts CHANGED
@@ -122,6 +122,7 @@ export * from './capabilities/index.js';
122
122
  export { APPLE_SA_TO_MACRO, AUDIO_MACRO_LABELS, getAudioMacroClassIds, mapAudioLabelToMacro, YAMNET_TO_MACRO, } from './catalogs/audio-classmap.js';
123
123
  export { COCO_80_LABELS, COCO_TO_MACRO, DETECTION_MACRO_CLASSES, isDetectionMacroClass, MACRO_LABELS, } from './catalogs/coco-classmap.js';
124
124
  export { DEVICE_STATE_READERS, readDeviceStateFrom, stateVocabularyFor, } from './catalogs/device-state-vocabulary.js';
125
+ export { DEFAULT_FIRST_SIGHTING_FRESHNESS_MS, evaluateSensorEdge, isSourceCap, type SensorEdgeIgnoreReason, type SensorEdgeInput, type SensorEdgeVerdict, SOURCE_CAP_ACTIVE_FIELD, SOURCE_CAP_CHANGED_AT_FIELD, SOURCE_CAPS, SOURCE_DEVICE_TYPES, sliceActiveValue, sliceChangedAt, } from './catalogs/sensor-active-state.js';
125
126
  export { colorForKind, DEFAULT_EVENT_COLOR, EVENT_TAXONOMY, type EventTaxonomyCategory, type EventTaxonomyEntry, type EventTaxonomyLevel, getTaxonomyEntry, subKindsOf, TAXONOMY_COLORS, } from './catalogs/event-taxonomy.js';
126
127
  export { buildNcTaxonomy, NC_TAXONOMY, type NcTaxonomy, type NcTaxonomyEntry, NcTaxonomyEntrySchema, NcTaxonomySchema, } from './catalogs/nc-taxonomy.js';
127
128
  export * from './constants.js';
@@ -131,6 +132,8 @@ export type { AccessoryChildSpec } from './device/base-device.js';
131
132
  export { BaseDevice } from './device/base-device.js';
132
133
  export type { DeviceSummary, DiscoveryCandidate, FieldProbeResult, } from './device/base-device-provider.js';
133
134
  export { BaseDeviceProvider, toDeviceSummary } from './device/base-device-provider.js';
135
+ export type { BatteryPresence, BatteryPresenceInput } from './device/battery-presence.js';
136
+ export { BATTERY_UNREACHABLE_AFTER_MS, deriveBatteryPresence, isBatteryPresenceFault, } from './device/battery-presence.js';
134
137
  export type { ICameraDevice, StreamSourceEntry } from './device/camera-device.js';
135
138
  export type { DeclarationPlacement, DeclaredDeviceOutcome, DeclaredDevicePorts, DeclaredDeviceRow, DeclaredDevicesResult, DeclaredDevicesSpec, DeclaredIntegrationRow, DeviceDeclaration, } from './device/declared-device.js';
136
139
  export { DECLARED_DEVICE_SWEEP_LIMIT, DECLARED_INTEGRATION_FIXED_KEY, DeclaredDevices, declarationOwnerNodeId, } from './device/declared-device.js';
@@ -148,8 +151,6 @@ export { DeviceRuntimeState } from './device/device-runtime-state.js';
148
151
  export type { SliceEventBus, SliceHandle, SliceHandleApi, SliceHandleSource, } from './device/device-state-handle.js';
149
152
  export { createEventBusSliceSource, createLazyTrpcSource, createMirrorSource, createSliceHandle, } from './device/device-state-handle.js';
150
153
  export { ChargingStatus, DeviceFeature, DeviceRole, DeviceType } from './device/device-type.js';
151
- export type { BatteryPresence, BatteryPresenceInput } from './device/battery-presence.js';
152
- export { BATTERY_UNREACHABLE_AFTER_MS, deriveBatteryPresence, isBatteryPresenceFault, } from './device/battery-presence.js';
153
154
  export type { IBatteryOperated, IDoorbellButton, INativeSnapshot, IPanTiltZoom, IRebootable, ITwoWayAudio, } from './device/features.js';
154
155
  export { getByPath, setByPath } from './device/path-util.js';
155
156
  export type { ReachabilityPollHandle, ReachabilityPollLogger, ReachabilityPollOptions, } from './device/reachability-poll.js';
@@ -191,7 +192,7 @@ export type { AudioCodecInfo, AudioDecodeSessionConfig, AudioEncodedChunk, Audio
191
192
  export type { StreamQuality } from './interfaces/device-capabilities/camera.js';
192
193
  export { STREAM_QUALITY_LABELS, streamQualityLabel, } from './interfaces/device-capabilities/camera.js';
193
194
  export * from './lifecycle/index.js';
194
- export { audioIsFailClosed, audioKindId, audioLabelChoices, audioModeOf, audioOrDefaults, isAudioLabelSelected, NC_AUDIO_DB_MAX, NC_AUDIO_DB_MIN, NC_AUDIO_DB_OFFERED, NC_AUDIO_DB_STEP, NC_AUDIO_CONFIRM_HITS_DEFAULT, NC_AUDIO_CONFIRM_HITS_MAX, NC_AUDIO_CONFIRM_HITS_MIN, NC_AUDIO_CONFIRM_WINDOW_MAX_SEC, NC_AUDIO_CONFIRM_WINDOW_MIN_SEC, NC_AUDIO_CONFIRM_WINDOW_SEC_DEFAULT, NC_AUDIO_DEFAULTS, NC_AUDIO_HIT_PERCENT_MAX, NC_AUDIO_HIT_PERCENT_MIN, NC_AUDIO_SAMPLING_MAX_SEC, NC_AUDIO_SAMPLING_MIN_SEC, type NcAudioLabelChoice, type NcAudioMode, type NcAudioPatch, normalizeAudioLabel, patchAudio, toggleAudioLabel, } from './notification/audio-condition.js';
195
+ export { audioIsFailClosed, audioKindId, audioLabelChoices, audioModeOf, audioOrDefaults, isAudioLabelSelected, NC_AUDIO_CONFIRM_HITS_DEFAULT, NC_AUDIO_CONFIRM_HITS_MAX, NC_AUDIO_CONFIRM_HITS_MIN, NC_AUDIO_CONFIRM_WINDOW_MAX_SEC, NC_AUDIO_CONFIRM_WINDOW_MIN_SEC, NC_AUDIO_CONFIRM_WINDOW_SEC_DEFAULT, NC_AUDIO_DB_MAX, NC_AUDIO_DB_MIN, NC_AUDIO_DB_OFFERED, NC_AUDIO_DB_STEP, NC_AUDIO_DEFAULTS, NC_AUDIO_HIT_PERCENT_MAX, NC_AUDIO_HIT_PERCENT_MIN, NC_AUDIO_SAMPLING_MAX_SEC, NC_AUDIO_SAMPLING_MIN_SEC, type NcAudioLabelChoice, type NcAudioMode, type NcAudioPatch, normalizeAudioLabel, patchAudio, toggleAudioLabel, } from './notification/audio-condition.js';
195
196
  export { isBaseConditionKey, knownValues, NC_BASE_CONDITION_KEYS, type NcBaseConditionKey, pickerForCondition, type TaxonomyGroup, type TaxonomyOption, type TaxonomyPicker, } from './notification/condition-taxonomy.js';
196
197
  export { type PreparedAction, type PreparedAttachment, type PreparedNotification, prepareNotification, type ResolvedLevel, } from './notification/degrade-engine.js';
197
198
  export { htmlToText, markdownToHtmlLite, markdownToText, type NotificationFormat as NotificationBodyFormat, resolveFormat, textToHtml, transcodeBody, } from './notification/format-transcode.js';
@@ -201,8 +202,8 @@ export { NC_SYSTEM_EVENT_FILTER_KEYS, type NcSystemEventFilterKey, systemEventFi
201
202
  export type { TimelapseCadencePair, TimelapsePreviewMode, TimelapseRule, TimelapseRuleInput, TimelapseRulePatch, TimelapseTemplate, } from './notification/timelapse-rule.js';
202
203
  export { assertTimelapseCadences, DEFAULT_TIMELAPSE_PREVIEW_TEXT, readTimelapseGeneratedAt, TIMELAPSE_DENSE_FLOOR_SEC, TimelapseRuleInputSchema, TimelapseRulePatchSchema, TimelapseRuleSchema, TimelapseTemplateSchema, } from './notification/timelapse-rule.js';
203
204
  export { CLUSTER_MODEL_SCOPED_STEPS, CLUSTER_MODEL_SECTION_ID, CLUSTER_STEP_SETTING_FIELDS, type ClusterModelScopedStep, type ClusterStepModels, type ClusterStepSettingField, type ClusterStepSettings, clusterModelSettingKey, clusterStepSettingFieldsFor, clusterStepSettingKey, DEFAULT_CLUSTER_STEP_MODELS, DEFAULT_CLUSTER_STEP_SETTINGS, DEFAULT_MIN_LANDMARK_FACE_SIZE_PX, type HydratedClusterSection, type HydratedClusterView, isClusterScopedStep, overlayClusterStepSettings, pickClusterStepModels, pickClusterStepSettings, readClusterStepModels, readClusterStepSettings, resolveClusterStepModelId, type StepModelScope, } from './pipeline/cluster-model-scope.js';
204
- export { DEFAULT_DETAIL_CROP_CONVENTION, DETAIL_CROP_PADDING_FIELD, DETAIL_CROP_PADDING_KEY, DETAIL_CROP_SECTION_ID, DETAIL_CROP_SQUARE_KEY, FULL_IMAGE_BBOX, type DetailCropConvention, DetailCropConventionSchema, type DetailCropRect, deriveDetailCropRect, type HydratedSettingsSection, type HydratedSettingsView, pickDetailCropConvention, readDetailCropConvention, } from './pipeline/detail-crop.js';
205
- 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_HOLD_FIELD, NATIVE_LEASE_HOLD_KEY, NATIVE_LEASE_SECTION_ID, NATIVE_LEASE_TILE_BUDGET_FIELD, NATIVE_LEASE_TILE_BUDGET_KEY, type NativeLeaseAdmission, NativeLeaseAdmissionSchema, type NativeLeaseKnob, type NativeLeaseNumberKnob, type NativeLeaseSettings, type NativeLeaseSettingsOverride, NativeLeaseSettingsSchema, pickNativeLeaseOverride, readNativeLeaseOverride, } from './pipeline/native-lease.js';
205
+ 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, FULL_IMAGE_BBOX, type HydratedSettingsSection, type HydratedSettingsView, pickDetailCropConvention, readDetailCropConvention, } from './pipeline/detail-crop.js';
206
+ 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_HOLD_FIELD, NATIVE_LEASE_HOLD_KEY, NATIVE_LEASE_SCENE_BUDGET_FIELD, NATIVE_LEASE_SCENE_BUDGET_KEY, NATIVE_LEASE_SECTION_ID, NATIVE_LEASE_TILE_BUDGET_FIELD, NATIVE_LEASE_TILE_BUDGET_KEY, type NativeLeaseAdmission, NativeLeaseAdmissionSchema, type NativeLeaseKnob, type NativeLeaseNumberKnob, type NativeLeaseSettings, type NativeLeaseSettingsOverride, NativeLeaseSettingsSchema, pickNativeLeaseOverride, readNativeLeaseOverride, } from './pipeline/native-lease.js';
206
207
  export { ACCESS_ROLES, type AccessRoleAssignment, type AccessRoleId, type AccessRoleSpec, buildRoleScopes, detectAccessRole, roleSpec, } from './schemas/access-roles.js';
207
208
  export { type ApiKeyRecord, ApiKeyRecordSchema, type CapScope, CapScopeSchema, type DeviceSelector, DeviceSelectorSchema, type DeviceTokenScope, type MethodAccess, MethodAccessSchema, type ScopedToken, ScopedTokenSchema, type TokenScope, TokenScopeSchema, type UserRecord, UserRecordSchema, } from './schemas/auth-records.js';
208
209
  export { type DeviceMetaLike, type DeviceReachSummary, deviceSelectorMatches, type EffectiveScope, normalizeTokenScopes, resolveViewableDeviceIds, type ScopeGrantSummary, scopeInherits, summarizeEffectiveScope, } from './schemas/device-selector.js';
@@ -218,7 +219,7 @@ export { errMsg } from './utils/err-msg.js';
218
219
  export { hfModelUrl } from './utils/hf-url.js';
219
220
  export { asBoolean, asJsonArray, asJsonObject, asNumber, asString, parseJsonArray, parseJsonObject, parseJsonUnknown, } from './utils/json-safe.js';
220
221
  export { maskUrlCredentials } from './utils/mask-url.js';
221
- export { DEFAULT_POOL_MEMORY_POLICY, PoolMemoryWatchdog, commitWatchdogRestart, evaluatePoolMemory, initialPoolMemoryState, parseProcStatus, pickRestartCandidate, poolMemoryThreshold, resetPoolBaseline, resolvePoolMemoryPolicy, type PoolMemoryAction, type PoolMemoryPolicy, type PoolMemoryState, type PoolMemoryTelemetry, type PoolMemoryVerdict, type PoolMemoryWatchdogOptions, type ProcMemory, type RestartCandidate, } from './utils/pool-memory-watchdog.js';
222
+ export { commitWatchdogRestart, DEFAULT_POOL_MEMORY_POLICY, evaluatePoolMemory, initialPoolMemoryState, type PoolMemoryAction, type PoolMemoryPolicy, type PoolMemoryState, type PoolMemoryTelemetry, type PoolMemoryVerdict, PoolMemoryWatchdog, type PoolMemoryWatchdogOptions, type ProcMemory, parseProcStatus, pickRestartCandidate, poolMemoryThreshold, type RestartCandidate, resetPoolBaseline, resolvePoolMemoryPolicy, } from './utils/pool-memory-watchdog.js';
222
223
  export { cellsToRects, type NormRect, rectsToCells } from './utils/privacy-grid-raster.js';
223
224
  export { RingBuffer } from './utils/ring-buffer.js';
224
225
  export type { InferenceStepResult } from './utils/run-inference-step.js';