@camstack/types 0.1.26 → 0.1.28
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/capabilities/capability-definition.d.ts +19 -2
- package/dist/capabilities/capability-definition.d.ts.map +1 -1
- package/dist/capabilities/user-management.cap.d.ts +155 -26
- package/dist/capabilities/user-management.cap.d.ts.map +1 -1
- package/dist/generated/addon-api.d.ts +120 -34
- package/dist/generated/addon-api.d.ts.map +1 -1
- package/dist/generated/method-access-map.d.ts +20 -0
- package/dist/generated/method-access-map.d.ts.map +1 -0
- package/dist/generated/system-proxy.d.ts +1 -1
- package/dist/generated/system-proxy.d.ts.map +1 -1
- package/dist/{auth-records-wKlyGWdW.mjs → index-DVKPWMwv.mjs} +249 -232
- package/dist/index-DVKPWMwv.mjs.map +1 -0
- package/dist/{auth-records-U1Xok3iP.js → index-s8uJNgNs.js} +119 -102
- package/dist/index-s8uJNgNs.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1017 -442
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +707 -132
- package/dist/index.mjs.map +1 -1
- package/dist/interfaces/api-responses.d.ts +10 -0
- package/dist/interfaces/api-responses.d.ts.map +1 -1
- package/dist/interfaces/config-ui.d.ts +1 -1
- package/dist/interfaces/config-ui.d.ts.map +1 -1
- package/dist/node.js +3 -3
- package/dist/node.js.map +1 -1
- package/dist/node.mjs +1 -1
- package/dist/schemas/auth-records.d.ts +57 -13
- package/dist/schemas/auth-records.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/auth-records-U1Xok3iP.js.map +0 -1
- package/dist/auth-records-wKlyGWdW.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-DVKPWMwv.mjs","sources":["../src/types/models.ts","../src/interfaces/config-ui.ts","../src/interfaces/storage-location.ts","../src/interfaces/stream-broker.ts","../src/utils/err-msg.ts","../src/catalogs/audio-classmap.ts","../src/device/device-type.ts","../src/device/accessory.ts","../src/device/device-profile.ts","../src/capabilities/device-status.cap.ts","../src/capabilities/feature-probe.cap.ts","../src/capabilities/capability-definition.ts","../src/capabilities/audio-metrics.cap.ts","../src/capabilities/battery.cap.ts","../src/capabilities/brightness.cap.ts","../src/capabilities/schemas/streaming-shared.ts","../src/capabilities/streaming-engine.cap.ts","../src/capabilities/stream-broker.cap.ts","../src/capabilities/camera-streams.cap.ts","../src/capabilities/device-discovery.cap.ts","../src/capabilities/doorbell.cap.ts","../src/capabilities/schemas/detection-shared.ts","../src/capabilities/motion-detection.cap.ts","../src/capabilities/schemas/orchestrator-metrics.ts","../src/capabilities/pipeline-executor.cap.ts","../src/capabilities/zones.cap.ts","../src/capabilities/pipeline-runner.cap.ts","../src/capabilities/motion.cap.ts","../src/capabilities/motion-trigger.cap.ts","../src/capabilities/ptz-autotrack.cap.ts","../src/capabilities/switch.cap.ts","../src/capabilities/zone-analytics.cap.ts","../src/capabilities/schemas/zone-rule.ts","../src/capabilities/zone-rules.cap.ts","../src/capabilities/device-provider.cap.ts","../src/capabilities/addon-settings.cap.ts","../src/capabilities/alerts.cap.ts","../src/capabilities/storage.cap.ts","../src/capabilities/storage-provider.cap.ts","../src/capabilities/backup.cap.ts","../src/capabilities/settings-store.cap.ts","../src/capabilities/log-destination.cap.ts","../src/capabilities/admin-ui.cap.ts","../src/capabilities/addon-pages.cap.ts","../src/capabilities/addon-pages-source.cap.ts","../src/capabilities/addon-widgets-source.cap.ts","../src/capabilities/addon-widgets.cap.ts","../src/capabilities/addon-routes.cap.ts","../src/capabilities/decoder.cap.ts","../src/capabilities/restreamer.cap.ts","../src/capabilities/webrtc.cap.ts","../src/capabilities/webrtc-session.cap.ts","../src/capabilities/pipeline-orchestrator.cap.ts","../src/capabilities/audio-analyzer.cap.ts","../src/capabilities/audio-analysis.cap.ts","../src/capabilities/audio-codec.cap.ts","../src/capabilities/embedding-encoder.cap.ts","../src/capabilities/device-manager.cap.ts","../src/capabilities/device-state.cap.ts","../src/capabilities/auth-provider.cap.ts","../src/capabilities/authentication.cap.ts","../src/capabilities/network-access.cap.ts","../src/capabilities/remote-access.cap.ts","../src/capabilities/turn-provider.cap.ts","../src/capabilities/turn-orchestrator.cap.ts","../src/capabilities/snapshot.cap.ts","../src/capabilities/snapshot-provider.cap.ts","../src/capabilities/notification-output.cap.ts","../src/capabilities/advanced-notifier.cap.ts","../src/capabilities/recording-engine.cap.ts","../src/capabilities/detection-pipeline.cap.ts","../src/capabilities/pipeline-analytics.cap.ts","../src/capabilities/metrics-provider.cap.ts","../src/capabilities/ptz.cap.ts","../src/capabilities/events.cap.ts","../src/capabilities/recording.cap.ts","../src/capabilities/device-ops.cap.ts","../src/capabilities/camera-credentials.cap.ts","../src/capabilities/reboot.cap.ts","../src/capabilities/osd.cap.ts","../src/capabilities/accessories.cap.ts","../src/capabilities/intercom.cap.ts","../src/capabilities/native-object-detection.cap.ts","../src/capabilities/platform-probe.cap.ts","../src/capabilities/local-network.cap.ts","../src/capabilities/mesh-network.cap.ts","../src/capabilities/mesh-orchestrator.cap.ts","../src/schemas/auth-records.ts","../src/capabilities/user-management.cap.ts","../src/capabilities/system.cap.ts","../src/capabilities/network-quality.cap.ts","../src/capabilities/toast.cap.ts","../src/capabilities/nodes.cap.ts","../src/capabilities/integrations.cap.ts","../src/capabilities/addons.cap.ts","../src/capabilities/index.ts"],"sourcesContent":["import type { LabelDefinition, ClassMapDefinition } from './labels.js'\n\nexport const MODEL_FORMATS = ['onnx', 'coreml', 'openvino', 'tflite', 'pt'] as const\nexport type ModelFormat = (typeof MODEL_FORMATS)[number]\nexport type ModelOutputFormat = 'yolo' | 'ssd' | 'embedding' | 'classification' | 'ocr' | 'segmentation'\n\nexport interface ModelFormatEntry {\n readonly url: string\n readonly sizeMB: number\n /** Whether this format is a directory bundle (e.g., .mlpackage) rather than a single file */\n readonly isDirectory?: boolean\n /**\n * For directory formats: list of files relative to the directory root.\n * The downloader fetches each file from `{url}/{file}` and saves to `{modelDir}/{file}`.\n * If omitted for a directory format, the downloader probes HuggingFace API (slower).\n */\n readonly files?: readonly string[]\n /** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */\n readonly runtimes?: readonly ('node' | 'python')[]\n}\n\n/**\n * Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).\n * The downloader fetches from `url` and saves to `{modelsDir}/{filename}`.\n */\nexport interface ModelExtraFile {\n readonly url: string\n readonly filename: string\n readonly sizeMB: number\n}\n\nexport interface ModelCatalogEntry {\n readonly id: string\n readonly name: string\n readonly description: string\n readonly formats: Partial<Readonly<Record<ModelFormat, ModelFormatEntry>>>\n readonly inputSize: { readonly width: number; readonly height: number }\n readonly labels: readonly LabelDefinition[]\n readonly inputLayout?: 'nchw' | 'nhwc'\n readonly inputNormalization?: 'zero-one' | 'imagenet' | 'none'\n readonly preprocessMode?: 'letterbox' | 'resize'\n /**\n * Auxiliary files required at runtime (labels JSON, charset dict, etc.).\n * Downloaded into the same modelsDir alongside the model file.\n */\n readonly extraFiles?: readonly ModelExtraFile[]\n}\n\nexport interface DetectionModel {\n readonly id: string\n readonly name: string\n readonly labels: readonly string[]\n readonly inputSize: { readonly width: number; readonly height: number }\n}\n\nexport interface ModelDownloadOptions {\n readonly url: string\n readonly fallbackUrls?: readonly string[]\n readonly destDir: string\n readonly filename?: string\n readonly expectedSha256?: string\n readonly onProgress?: (downloaded: number, total: number) => void\n}\n\nexport interface ModelDownloadResult {\n readonly filePath: string\n readonly downloadedBytes: number\n readonly fromCache: boolean\n}\n\nexport interface CustomModelMetadata {\n readonly name: string\n readonly inputSize: { readonly width: number; readonly height: number }\n readonly labels: readonly LabelDefinition[]\n readonly classMap?: ClassMapDefinition\n readonly inputLayout?: 'nchw' | 'nhwc'\n readonly inputNormalization?: 'zero-one' | 'imagenet' | 'none'\n readonly outputFormat: ModelOutputFormat\n}\n","import type { ModelCatalogEntry, ModelFormat, ModelOutputFormat, CustomModelMetadata } from '../types/models.js'\n\n/**\n * Configuration UI Schema -- declarative form definition for any element.\n *\n * Used by addons to declare their settings UI. The admin UI collects schemas\n * from all active addons, merges tabs with the same ID, and renders responsive forms.\n *\n * Layout hierarchy: Tab → Section → Field\n * Multiple addons can contribute sections to the same tab.\n */\n\n// --- Well-Known Tabs ─────────────────────────────────────────────────\n\n/** Predefined tab identifiers that addons reference by ID. */\nexport type WellKnownTabId =\n | 'overview'\n | 'general'\n | 'image'\n | 'light'\n | 'motion'\n | 'audio'\n | 'snapshot'\n | 'osd'\n | 'alarms'\n | 'pipeline'\n | 'stream-broker'\n | 'streaming'\n | 'zones'\n | 'live-stats'\n | 'recording'\n | 'notifications'\n | 'network'\n | 'storage'\n | 'engine'\n | 'scheduler'\n | 'decoder'\n | 'advanced'\n\nexport interface WellKnownTab {\n readonly id: WellKnownTabId\n readonly label: string\n readonly icon: string\n readonly order: number\n}\n\n/** Predefined tabs with standard label, icon, and sort order.\n *\n * Pipeline (renamed Orchestrator in the UI) holds the four\n * pipeline-orchestrator sections: General, Object Detection, Audio,\n * and Cluster Assignment. Motion stays its own tab.\n * `streaming` remains for older payloads that haven't been retagged. */\nexport const WELL_KNOWN_TABS: readonly WellKnownTab[] = [\n { id: 'overview', label: 'Overview', icon: 'layout-dashboard', order: -10 },\n { id: 'general', label: 'General', icon: 'settings', order: 0 },\n { id: 'image', label: 'Image', icon: 'image', order: 5 },\n { id: 'light', label: 'Light', icon: 'lightbulb', order: 7 },\n { id: 'motion', label: 'Motion', icon: 'activity', order: 10 },\n { id: 'audio', label: 'Audio', icon: 'mic', order: 12 },\n { id: 'alarms', label: 'Alarms', icon: 'bell-ring', order: 13 },\n { id: 'snapshot', label: 'Snapshot', icon: 'camera', order: 15 },\n { id: 'osd', label: 'OSD', icon: 'type', order: 18 },\n { id: 'stream-broker', label: 'Stream Broker', icon: 'radio', order: 20 },\n { id: 'streaming', label: 'Streaming', icon: 'video', order: 35 },\n { id: 'pipeline', label: 'Detection Pipeline', icon: 'cpu', order: 39 },\n { id: 'zones', label: 'Detection', icon: 'shapes', order: 38 },\n { id: 'live-stats', label: 'Live Stats', icon: 'activity', order: 39 },\n { id: 'recording', label: 'Recording', icon: 'circle-dot', order: 40 },\n // Pipeline-page tabs — `engine` co-locates `detection-pipeline`'s\n // vision-engine section + `audio-analyzer`'s audio-engine section\n // (same modality of choice, different pipelines). `scheduler` and\n // `decoder` group the runner / decoder addon settings under their\n // own tabs so the pipeline page bar stays manageable.\n { id: 'engine', label: 'Inference Engine', icon: 'zap', order: 41 },\n { id: 'scheduler', label: 'Scheduler', icon: 'list-checks', order: 42 },\n { id: 'decoder', label: 'Decoder', icon: 'film', order: 43 },\n { id: 'notifications', label: 'Notifications', icon: 'bell', order: 50 },\n { id: 'network', label: 'Network', icon: 'globe', order: 60 },\n { id: 'storage', label: 'Storage', icon: 'hard-drive', order: 70 },\n { id: 'advanced', label: 'Advanced', icon: 'wrench', order: 100 },\n] as const\n\n/** Lookup map for well-known tabs by ID. */\nexport const WELL_KNOWN_TAB_MAP: Readonly<Record<WellKnownTabId, WellKnownTab>> =\n Object.fromEntries(WELL_KNOWN_TABS.map(t => [t.id, t])) as Record<WellKnownTabId, WellKnownTab>\n\n// --- Tab Declaration ─────────────────────────────────────────────────\n\n/**\n * Custom tab declaration by an addon.\n * Use well-known tab IDs when possible. Custom tabs are for addon-specific UI.\n */\nexport interface ConfigTabDeclaration {\n /** Unique tab identifier. Use WellKnownTabId for standard tabs. */\n readonly id: string\n /** Display label (ignored for well-known tabs — their label is used). */\n readonly label: string\n /** Icon identifier (ignored for well-known tabs — their icon is used). */\n readonly icon: string\n /** Sort order within the tab bar. Lower = left. */\n readonly order?: number\n}\n\n// --- Schema Definition ───────────────────────────────────────────────\n\nexport interface ConfigUISchema {\n /**\n * Tabs contributed by this addon.\n * Multiple addons can reference the same tab ID — the UI merges them.\n * For well-known tabs, label/icon from WELL_KNOWN_TABS takes precedence.\n * Omit to use only well-known tabs referenced by sections.\n */\n readonly tabs?: readonly ConfigTabDeclaration[]\n readonly sections: readonly ConfigSection[]\n}\n\nexport interface ConfigSection {\n readonly id: string\n readonly title: string\n readonly description?: string\n readonly style?: 'card' | 'accordion'\n readonly defaultCollapsed?: boolean\n readonly columns?: 1 | 2 | 3 | 4\n /** Which tab this section belongs to. Default: 'general'. */\n readonly tab?: string\n /**\n * Where the section is rendered in the device page. Default\n * `'settings'` keeps the section under the device Settings panel\n * (existing behavior). `'top-tab'` hoists the section into a\n * top-level device tab (sibling of Live / Streams / Recordings /\n * Settings) keyed by the section's `tab` value. Multiple addons\n * targeting the same `(tab, location: 'top-tab')` pair render\n * inside the same top tab in `order` sequence — used for the\n * Zones tab where orchestrator (geometry CRUD) + motion-wasm\n * (motion rules) + detection-pipeline (detection rules) all\n * contribute to one operator surface.\n */\n readonly location?: 'settings' | 'top-tab'\n /** Sort order within the tab. Lower = top. */\n readonly order?: number\n /**\n * When true, every field in this section saves immediately on change\n * (no Save button needed). Per-field `immediate: false` overrides this.\n */\n readonly immediate?: boolean\n readonly fields: readonly ConfigField[]\n}\n\n// --- Field Types ---\n\nexport type ConfigField =\n | ConfigTextField\n | ConfigNumberField\n | ConfigBooleanField\n | ConfigSelectField\n | ConfigMultiSelectField\n | ConfigColorField\n | ConfigPasswordField\n | ConfigTextAreaField\n | ConfigSliderField\n | ConfigTagsField\n | ConfigGroupField\n | ConfigSubTabsField\n | ConfigSeparatorField\n | ConfigInfoField\n | ConfigObjectArrayField\n | ConfigEditableArrayField\n | ConfigModelSelectorField\n | ConfigStorageLocationField\n | ConfigProbeField\n | ConfigButtonField\n | ConfigPipelineEditorField\n | ConfigNodeSelectField\n | ConfigNodeMultiSelectField\n | ConfigZoneEditorField\n | ConfigLiveStatsField\n | ConfigLiveStreamViewerField\n | ConfigPipelineStatsField\n | ConfigStreamNetworkStatsField\n | ConfigDoorbellRecentField\n | ConfigDeviceInfoField\n | ConfigWidgetField\n | ConfigAddonActionSelectField\n | ConfigAddonActionButtonField\n\nexport interface ConfigFieldBase {\n readonly key: string\n readonly label: string\n readonly description?: string\n readonly required?: boolean\n readonly disabled?: boolean\n readonly placeholder?: string\n /** Default value used when the current value is undefined */\n readonly default?: unknown\n readonly span?: 1 | 2 | 3 | 4\n readonly showWhen?: ConfigCondition\n // Settings-redesign cleanup: `scope?: 'device' | 'global'` removed.\n // In the three-level model, a field's scope is determined by WHICH\n // schema it lives in — `getAddonSettings / getGlobalSettings /\n // getDeviceSettings` — not by a field-level marker. The keys are\n // disjoint across levels by invariant, so a scope marker is\n // redundant.\n /**\n * Save behavior when value changes.\n * - true: save immediately on change (toggles, selects, checkboxes)\n * - false (default): debounce 2 seconds for text/number inputs before saving\n *\n * The UI FormBuilder reads this flag and applies debounce accordingly.\n */\n readonly immediate?: boolean\n /**\n * Declares that changes to this field can only take effect after the\n * owning addon is (re)started — the field is bound at boot time and\n * cannot be hot-reloaded from `onConfigChanged()`. Example: Python\n * inference-pool `concurrency` (pool threads are allocated at pool\n * spawn). The UI surfaces a \"Restart required\" hint, and the\n * framework auto-restarts the addon after the update lands on a flag\n * transition — see `BaseAddon.updateGlobalSettings` /\n * `updateAddonSettings`.\n */\n readonly requiresRestart?: boolean\n /**\n * Override the default placement of this field.\n * Moves it to a different tab and/or section than its parent section.\n * Useful for placing a single setting in a shared tab (e.g., 'advanced').\n */\n readonly placement?: {\n /** Target tab ID (well-known or custom). */\n readonly tab?: string\n /** Target section ID within the tab. Created if it doesn't exist. */\n readonly section?: string\n }\n /**\n * Device-aggregator metadata — only meaningful when this field is part of\n * a `ConfigUISchemaWithValues` merged by `deviceManager.getDeviceSettingsAggregate`\n * / `getDeviceLiveInfoAggregate`.\n *\n * - `readonlyField: true` — render as display-only, no mutation handler\n * - `source: 'live'` — the value comes from the fast-poll live\n * aggregator; the UI re-queries it on its own\n * cadence and swaps the value in place. Default:\n * 'settings' (slow, cached, invalidated on save)\n * - `writerCapName` — when editable, the capability whose provider\n * accepts the mutation via\n * `deviceManager.updateDeviceField`.\n * - `writerAddonId` — when editable, the addon id of the provider\n * for `writerCapName`. Ignored for\n * `readonlyField: true`.\n * - `minRole` — minimum user role required to edit this\n * field. UI uses it to disable the input and\n * show a lock icon; the server still enforces\n * cap-level auth (`admin` for the aggregator\n * writers today). Default: 'admin'.\n *\n * The aggregator tags fields with `writerCapName` + `writerAddonId` before\n * returning them — providers produce clean schemas; provenance is injected\n * based on which (cap, provider) contributed the section.\n *\n * Named `readonlyField` instead of `readonly` to avoid colliding with the\n * TS modifier already implied by the interface fields.\n */\n readonly readonlyField?: boolean\n readonly source?: 'settings' | 'live'\n readonly writerCapName?: string\n readonly writerAddonId?: string\n readonly minRole?: 'viewer' | 'admin'\n /**\n * Optional inline action icons shown on the right of the field\n * control. Each action is a compact icon button that dispatches\n * through the same `onAction(action, key)` handler the button-field\n * type uses — keeps the action pipeline single-sourced. Common use:\n * readonly URL field with a \"regenerate\" icon, probe field with a\n * \"copy\" shortcut, etc.\n */\n readonly actions?: readonly FieldInlineAction[]\n /**\n * Declare this field as a *collection* of its underlying primitive.\n * When set, the stored value is an array (`T[]`) instead of a scalar\n * (`T`), and the form renderer shows:\n * - `min` initial instances (empty slots if no value stored yet)\n * - an `+ Add` button when the current count < `max`\n * - a remove icon on each instance when the current count > `min`\n * - an item counter badge (e.g. `2/3`) next to the section header\n *\n * Applies uniformly to every scalar-valued field type (text, number,\n * boolean, select, color, probe, password, textarea, slider, tags,\n * model-selector, storage-location). Structural fields (separator,\n * info, button) and group fields ignore this flag.\n *\n * Probe fields hit `testCreationField` / settings-contribution\n * probing per-index — the handler receives the full array and an\n * `index` hint so it can resolve just that slot.\n */\n readonly multiple?: ConfigFieldMultiple\n}\n\n/**\n * Array-widget metadata for a `ConfigFieldBase`. See `multiple` on\n * `ConfigFieldBase` for the activation semantics.\n */\nexport interface ConfigFieldMultiple {\n /** Minimum item count — always rendered, no remove button when count == min. */\n readonly min: number\n /** Maximum item count — Add button hidden when count == max. */\n readonly max: number\n /** Label for the \"add\" affordance. Default: \"Add\". */\n readonly addLabel?: string\n /** Template for each item's label (${n} = 1-based index). Default: none. */\n readonly itemLabel?: string\n /**\n * Default value each newly-added instance starts with. Falls back to\n * the field-level `default`, then to the empty string for string\n * fields or `null` for everything else.\n */\n readonly itemDefault?: unknown\n}\n\n/** Inline action icon attached to any ConfigField. */\nexport interface FieldInlineAction {\n /** Action identifier forwarded to the FormBuilder `onAction` handler. */\n readonly action: string\n /** Lucide icon name (e.g. 'refresh-cw', 'copy', 'external-link'). */\n readonly icon: string\n /** Tooltip shown on hover. */\n readonly tooltip: string\n /** Visual variant — `danger` flags destructive actions in red. */\n readonly variant?: 'default' | 'danger' | 'primary'\n /** Optional confirmation prompt before dispatching. */\n readonly confirmMessage?: string\n}\n\nexport interface ConfigCondition {\n field: string\n equals?: unknown\n notEquals?: unknown\n in?: unknown[]\n notIn?: unknown[]\n /**\n * For `multiselect` / `tags` / array-valued fields: matches when the\n * referenced field's array value INCLUDES the given primitive. Example:\n * `{ field: 'motionSources', includes: 'analyzer' }` shows the\n * dependent field only when the analyzer source is selected.\n */\n includes?: unknown\n /** Inverse of `includes` — show when the field's array value does NOT\n * contain the given primitive. */\n notIncludes?: unknown\n}\n\nexport interface ConfigTextField extends ConfigFieldBase {\n type: 'text'\n maxLength?: number\n pattern?: string\n inputType?: 'text' | 'url' | 'email'\n}\n\nexport interface ConfigNumberField extends ConfigFieldBase {\n type: 'number'\n min?: number\n max?: number\n step?: number\n unit?: string\n}\n\nexport interface ConfigBooleanField extends ConfigFieldBase {\n type: 'boolean'\n style?: 'switch' | 'checkbox'\n}\n\nexport interface ConfigSelectField extends ConfigFieldBase {\n type: 'select'\n options: ConfigOption[]\n dependsOn?: Record<string, unknown>\n}\n\nexport interface ConfigMultiSelectField extends ConfigFieldBase {\n type: 'multiselect'\n options: ConfigOption[]\n maxItems?: number\n}\n\nexport interface ConfigColorField extends ConfigFieldBase {\n type: 'color'\n presets?: string[]\n}\n\n/** Select a single cluster node from the live topology. Options are\n * populated dynamically by the UI via useClusterNodes — no server-side\n * option list needed. */\nexport interface ConfigNodeSelectField extends ConfigFieldBase {\n type: 'node-select'\n /** When true, include offline nodes (greyed out). Default: false. */\n showOffline?: boolean\n}\n\n/** Select multiple cluster nodes from the live topology. */\nexport interface ConfigNodeMultiSelectField extends ConfigFieldBase {\n type: 'node-multiselect'\n showOffline?: boolean\n maxItems?: number\n}\n\nexport interface ConfigPasswordField extends ConfigFieldBase {\n type: 'password'\n showToggle?: boolean\n}\n\nexport interface ConfigTextAreaField extends ConfigFieldBase {\n type: 'textarea'\n rows?: number\n maxLength?: number\n /**\n * When true, the stored value is a JSON-serializable object/array and\n * the UI shows it as pretty-printed JSON, with parse-on-save semantics.\n * `hydrateSchema` takes care of stringifying on the way out; the\n * FormBuilder is expected to parse before emitting the patch.\n *\n * Used by `zodEntriesToConfigUI` when the Zod schema is an\n * array/object — falls back gracefully when the FormBuilder hasn't\n * implemented parse-on-save yet (the field still renders the JSON\n * string instead of `[object Object],…`).\n */\n isJson?: boolean\n}\n\nexport interface ConfigSliderField extends ConfigFieldBase {\n type: 'slider'\n min: number\n max: number\n step?: number\n showValue?: boolean\n unit?: string\n default?: number\n /** Display scale factor: displayed = stored / displayScale. E.g., displayScale=1000 shows ms as seconds. */\n displayScale?: number\n /** When true, allows a \"not set\" state where the value is null (e.g., \"Auto\" mode) */\n nullable?: boolean\n /** Label shown when the value is null (default: \"Auto\") */\n nullLabel?: string\n /**\n * When true, render +/− stepper buttons flanking the numeric input.\n * Each click increments/decrements by `step` (default 1) and clamps\n * to `[min, max]`. Pairs with `showValue` so the operator can fine-\n * tune from the keyboard / pointer without scrubbing the slider.\n */\n showStepper?: boolean\n}\n\nexport interface ConfigTagsField extends ConfigFieldBase {\n type: 'tags'\n suggestions?: string[]\n maxTags?: number\n}\n\nexport interface ConfigGroupField extends ConfigFieldBase {\n type: 'group'\n fields: readonly ConfigField[]\n style?: 'card' | 'inline' | 'accordion'\n defaultCollapsed?: boolean\n}\n\n/** Visual separator between fields */\nexport interface ConfigSeparatorField {\n type: 'separator'\n key: string\n}\n\n// --- Sub-tabs Field ---\n//\n// Renders a nested tab strip inside a section. Each sub-tab carries its\n// own list of `ConfigField`s. Values are flat across all sub-tabs (the\n// outer save controller treats them like any other field key) — the\n// sub-tabs are purely a layout primitive, not a save scope. Use when a\n// section needs to host many fields that fall into clearly separable\n// categories (e.g. one sub-tab per camera stream source).\n\n/** A single sub-tab inside a `ConfigSubTabsField`. */\nexport interface ConfigSubTabDefinition {\n readonly id: string\n readonly label: string\n readonly icon?: string\n /** Short text shown next to the label (e.g. live status / counter). */\n readonly badge?: string\n readonly fields: readonly ConfigField[]\n}\n\nexport interface ConfigSubTabsField extends ConfigFieldBase {\n type: 'sub-tabs'\n /** Tab definitions; rendered in array order. The first tab is active by default. */\n tabs: readonly ConfigSubTabDefinition[]\n}\n\n/** Read-only informational text */\nexport interface ConfigInfoField {\n type: 'info'\n key: string\n label: string\n content: string\n variant?: 'info' | 'warning' | 'success' | 'danger'\n /**\n * Rendering mode for `content`. Default `'text'` keeps the legacy\n * \"plain string with auto-newlines\" behaviour. `'html'` interprets\n * `content` as inline HTML (sanitised in the renderer to a small\n * allowlist: a, ul, ol, li, strong, em, code, br) so addons can ship\n * clickable links and bulleted steps without inventing markdown.\n *\n * HTML mode is for addon-authored copy that lives in the bundle (no\n * user-supplied input flows here), so the surface stays narrow.\n */\n format?: 'text' | 'html'\n /** Same semantics as `ConfigFieldBase.showWhen` — lets info banners\n * conditionally appear (e.g. \"Cloudflare API token instructions\"\n * only when mode === 'custom'). */\n showWhen?: ConfigCondition\n}\n\n/**\n * Read-only structured table for diagnostic data. Renders as a row-per-\n * entry list with column headers. Use when a section needs to surface\n * multiple parallel records (live sessions, socket-pool entries, recent\n * doorbell presses, …) — replaces the older \"joined-string in an info\n * field\" pattern that lost structure on long entries.\n *\n * Columns describe how to render each cell. Each entry in `value` is a\n * record keyed by the column `key`. Missing keys render as em-dash.\n *\n * NOT editable — the FormBuilder ignores the field for save patches.\n */\nexport interface ConfigObjectArrayField {\n type: 'object-array'\n key: string\n label: string\n description?: string\n /**\n * Column definitions in render order. The `kind` hint controls cell\n * formatting:\n * - `text` (default): plain string; null/undefined → em-dash\n * - `monospace`: monospace font (good for IPs, sessionIds)\n * - `status`: small colored dot + label, value should be one of\n * 'ok' | 'warn' | 'danger' | 'idle' | 'unknown'\n * - `duration`: number of ms, formatted as \"1m 23s\"\n * - `timestamp`: number (ms epoch), formatted as locale time\n */\n columns: ReadonlyArray<{\n readonly key: string\n readonly label: string\n readonly kind?: 'text' | 'monospace' | 'status' | 'duration' | 'timestamp'\n /** Optional fixed width hint (CSS values: '120px', '20%', etc). */\n readonly width?: string\n }>\n /** Rows. Empty array renders `emptyMessage`. */\n value: ReadonlyArray<Record<string, unknown>>\n /** Shown when `value` is empty. Default: \"No entries\". */\n emptyMessage?: string\n}\n\nexport interface ConfigOption {\n value: string\n label: string\n description?: string\n icon?: string\n}\n\n// --- Editable Array Field ---\n\n/**\n * Editable array of records. Each row exposes the fields declared in\n * `itemFields`; the form renderer reuses the standard scalar field\n * components (text / number / select / password / boolean) for each\n * cell. Add/Remove row buttons mutate `value` (the FormBuilder picks\n * up the new array via the standard onChange flow).\n *\n * Use for \"configure N items\" cases — e.g. a backup-sftp addon\n * exposing a list of remote destinations the operator can add or\n * remove. Don't use for fixed-cardinality data; a flat group of\n * fields reads better.\n *\n * Constraints inside `itemFields`:\n * - Only scalar field types are supported (text/number/select/\n * multiselect/password/boolean/textarea/color/tags/slider). Nested\n * groups, sub-tabs, probes, button actions, and other arrays are\n * intentionally rejected — they conflate row-state with section-\n * state and the FormBuilder's flat onChange contract can't carry\n * the nesting cleanly. Build a custom-renderer if you need that.\n * - Field `key`s are scoped to the row (no global collisions with\n * the surrounding section).\n * - `showWhen` inside a row references siblings within the same row.\n */\nexport interface ConfigEditableArrayField extends ConfigFieldBase {\n readonly type: 'editable-array'\n /** Per-row schema. Same shape as section.fields, scalar-only. */\n readonly itemFields: readonly ConfigField[]\n /** Default values used when the operator clicks \"Add\". */\n readonly defaultItem?: Record<string, unknown>\n /** Minimum number of rows allowed. Remove disabled below this count. */\n readonly minRows?: number\n /** Maximum number of rows allowed. Add disabled at this count. */\n readonly maxRows?: number\n /** Label for the \"Add\" button. Defaults to \"Add\". */\n readonly addLabel?: string\n /** Shown when the array is empty. Default: \"No entries\". */\n readonly emptyMessage?: string\n /**\n * Optional template for each row's title (e.g. \"{displayName}\" or\n * \"{host}:{port}\"). Resolved against the row's values; missing keys\n * collapse to an em-dash. Falls back to `Row N` when not provided.\n */\n readonly rowTitleTemplate?: string\n}\n\n// --- Model Selector Field ---\n\nexport interface ConfigModelSelectorField extends ConfigFieldBase {\n type: 'model-selector'\n /** Filter models by type */\n modelType?: string\n /** Allow user to enter a custom local path or URL (default: true) */\n allowCustomPath?: boolean\n /** Allow file upload via UI (default: true) */\n allowUpload?: boolean\n /** Accepted file extensions for upload (default: ['.onnx']) */\n acceptExtensions?: string[]\n /** URL to model conversion documentation/guide */\n conversionGuideUrl?: string\n /** Brief text explaining what models are compatible */\n compatibilityNote?: string\n /** Legacy: inline catalog entries */\n catalog?: readonly ModelCatalogEntry[]\n allowCustom?: boolean\n acceptFormats?: readonly ModelFormat[]\n allowConversion?: boolean\n requiredMetadata?: readonly (keyof CustomModelMetadata)[]\n outputFormatHint?: ModelOutputFormat\n}\n\n// --- Probe Field ---\n\n/** Result of probing a single field value (returned by IDeviceProvider.testField) */\nexport interface FieldProbeResult {\n status: 'ok' | 'error'\n /** Labels to display as chips (e.g. \"1920×1080\", \"H.265\", \"25fps\") */\n labels?: readonly string[]\n /** Error message when status is 'error' */\n error?: string\n /**\n * Optional values the provider suggests applying to other form fields\n * after a successful probe. The form-builder merges these into the\n * working snapshot ONLY for fields the operator hasn't filled yet,\n * never overwriting user input. Typical use: a host-probe that\n * autodetects the camera model and proposes it as the device `name`.\n */\n suggestedValues?: Readonly<Record<string, unknown>>\n}\n\n/**\n * A probeable input field. Renders as a text input with a test button.\n * The provider implements the actual probing logic via IDeviceProvider.testField.\n *\n * UX states:\n * - idle: muted icon, no labels\n * - probing: spinner icon\n * - ok: green check icon + provider-returned labels as chips\n * - error: red icon + error message\n */\nexport interface ConfigProbeField extends ConfigFieldBase {\n type: 'probe'\n /** Input type hint for the text input (default: 'url') */\n inputType?: 'url' | 'text'\n}\n\n// --- Storage Location Selector Field ---\n\nimport type { StorageLocationType } from './storage.js'\n\nexport interface ConfigStorageLocationField extends ConfigFieldBase {\n type: 'storage-location'\n /** Which location type this field selects a provider for */\n locationType: StorageLocationType\n /** Show available space indicator next to each provider option */\n showAvailableSpace?: boolean\n}\n\nexport interface ConfigButtonField extends ConfigFieldBase {\n type: 'button'\n /** Button label text */\n buttonLabel: string\n /** Visual variant */\n variant?: 'default' | 'danger' | 'primary'\n /** tRPC action identifier — the form handler calls this action when pressed */\n action: string\n /** Confirmation prompt before executing (optional) */\n confirmMessage?: string\n}\n\n/**\n * Select whose options are pulled from a customAction on an addon at\n * render time. Generalises the \"user pastes a token, server returns\n * the list of zones / buckets / dirs they can pick from\" UX pattern\n * across every addon that integrates with an external API.\n *\n * Wiring at render time (admin-ui side):\n * 1. Collect `paramsFromForm` keys from the current form values.\n * 2. Merge with `paramsStatic`.\n * 3. Call `trpc.addons.custom({addonId, action, input}).query()`.\n * 4. Map each result item via `mapOption` → `{value, label, description?}`.\n * 5. If `refreshOn` is set, re-fetch when any listed form key changes.\n *\n * Example (cloudflare-tunnel zone picker):\n * { type: 'addon-action-select',\n * key: 'zoneId', label: 'Zone',\n * addonId: 'cloudflare-tunnel',\n * action: 'listZones',\n * paramsFromForm: { token: 'apiToken' },\n * refreshOn: ['apiToken'],\n * mapOption: { value: 'id', label: 'name' } }\n */\nexport interface ConfigAddonActionSelectField extends ConfigFieldBase {\n type: 'addon-action-select'\n addonId: string\n action: string\n /** Map form-value keys → action input keys. */\n paramsFromForm?: Readonly<Record<string, string>>\n /** Static params merged into the action input. */\n paramsStatic?: Readonly<Record<string, unknown>>\n /** Form keys that trigger an options refresh when changed. */\n refreshOn?: readonly string[]\n /** Map a result row to the dropdown option shape. */\n mapOption: {\n readonly value: string\n readonly label: string\n readonly description?: string\n }\n /** Optional message shown when the form is missing required params (e.g. token). */\n emptyParamsMessage?: string\n /** Optional message shown when the action returns no results. */\n emptyResultsMessage?: string\n}\n\n/**\n * Button that invokes an addon customAction. Used for \"Verify token /\n * Test connection / Refresh credentials\" affordances inside addon\n * settings panels. The form renderer surfaces success + error inline.\n */\nexport interface ConfigAddonActionButtonField extends ConfigFieldBase {\n type: 'addon-action-button'\n addonId: string\n action: string\n /** Visible label. */\n buttonLabel: string\n /** Visual variant. */\n variant?: 'default' | 'primary' | 'danger'\n /** Map form-value keys → action input keys. */\n paramsFromForm?: Readonly<Record<string, string>>\n /** Static params merged into the action input. */\n paramsStatic?: Readonly<Record<string, unknown>>\n /** Toast/inline success message template. `{key}` placeholders are\n * resolved against the action result. */\n successMessage?: string\n /** Confirmation prompt before executing. */\n confirmMessage?: string\n}\n\n/**\n * Describes an async resolver that the form renderer should call to\n * fetch deferred-load data a field depends on (e.g. the addon catalog\n * for a pipeline-editor, a dynamic options list for a select, …).\n *\n * The renderer dispatches through `client.trpc[capName][methodName]\n * .query(input)` — the field declares WHICH cap + method + input to\n * call, and the renderer stays oblivious to the endpoint naming.\n * Results are cached client-side keyed by `(capName, methodName,\n * input)` so two fields pointing at the same resolver deduplicate\n * automatically.\n *\n * Not an endpoint to arbitrary HTTP — the tRPC proxy gates it to the\n * server's declared cap surface + each cap's auth rules, same as\n * every other `.query()` call the UI makes.\n */\nexport interface AsyncResolverRef {\n /** tRPC cap namespace (e.g. `pipelineExecutor`, `pipelineOrchestrator`). */\n readonly capName: string\n /** Method on that cap — must be a `.query()` (no mutations via resolvers). */\n readonly methodName: string\n /** Input payload passed verbatim; serialised into the React Query key. */\n readonly input?: Readonly<Record<string, unknown>>\n}\n\n/**\n * Camera pipeline editor field (stateless-pipeline Phase 6, option B).\n *\n * The FormBuilder renders this as the rich `PipelineBuilder` composite\n * (step tree + engine picker + template picker) instead of a flat\n * input. `value` is always a fully-resolved `CameraPipelineConfig` —\n * when the camera has no persisted pipeline, the contributor\n * (orchestrator) fills it with the cluster default server-side so\n * the renderer stays dumb about nullability.\n *\n * `nodeId` names the runner node whose addon catalog powers the\n * editor. It's exposed explicitly (rather than buried inside the\n * resolver) for diagnostics, UI labels, and cache keying. The\n * catalog itself isn't embedded — `catalogResolver` tells the\n * renderer how to lazy-load it via the shared resolver hook, which\n * React Query caches once per `(capName, methodName, input)`. That\n * way 50 cameras assigned to the same node don't each trigger 50\n * catalog fetches.\n *\n * Templates are NOT described by a resolver — they're a hub-wide\n * library fetched in one place by the editor directly.\n */\nexport interface ConfigPipelineEditorField extends ConfigFieldBase {\n type: 'pipeline-editor'\n /** Runner node whose catalog powers the editor. */\n readonly nodeId: string\n /** The camera this field edits — used by the renderer to fetch per-camera settings. */\n readonly deviceId: number\n /** How to fetch the addon catalog for this node. */\n readonly catalogResolver: AsyncResolverRef\n}\n\n/**\n * Polygon zone CRUD editor field. Renders a canvas with a backdrop\n * (stream snapshot or live preview) where the operator draws polygon\n * zones, plus the list of existing zones (user + onboard) with\n * editing affordances.\n *\n * Stateless from the form's point of view: bound directly to\n * `api.zones.*` mutations, NOT to the form's `value`. The renderer\n * subscribes to `dev.state.zones.onChanged` for live updates so two\n * operators editing the same camera see each other's changes\n * immediately. `value` is therefore not consumed by the renderer\n * (kept on the discriminated union only so the form layout engine\n * stays homogeneous).\n *\n * Every zone is operator-drawn and fully editable — firmware-reported\n * onboard zones are deliberately out of scope for the first iteration.\n */\nexport interface ConfigZoneEditorField extends ConfigFieldBase {\n type: 'zone-editor'\n /**\n * Optional backdrop hint. `'snapshot'` (default) fetches a still\n * via the snapshot cap; `'stream'` overlays the live WebRTC view.\n *\n * The renderer reads the `deviceId` from the device-details page\n * context — the field doesn't carry it inline so the schema stays\n * device-agnostic and addons can ship a static contribution.\n */\n readonly backdrop?: 'snapshot' | 'stream'\n}\n\n/**\n * Live statistics field — bound to the \"Live Stats\" top-tab declared\n * by the analytics addon. Renders occupancy snapshots, audio metrics\n * (current + history), and rolling-window charts. The form's `value`\n * is unused; the renderer reads `deviceId` from the device-details\n * page context and pulls live data through DeviceProxy.\n */\nexport interface ConfigLiveStatsField extends ConfigFieldBase {\n type: 'live-stats'\n}\n\n// ---------------------------------------------------------------------------\n// Overview-tab field types\n// ---------------------------------------------------------------------------\n//\n// These five field types describe the \"overview\" top-tab blocks. Each\n// addon contributes the block(s) it owns via `getDeviceSettingsContribution`\n// (`tab: 'overview', location: 'top-tab'`), and the admin-ui's\n// `CustomFieldRenderersProvider` resolves the field `type` to the\n// corresponding adapter component. Field shapes are intentionally\n// minimal — the renderer reads everything from the device-details\n// context (deviceId, name, capabilities, …) so the schema stays\n// device-agnostic and addons can ship static contributions.\n//\n// Owners (Fase B will wire these):\n// - live-stream-viewer → addon-stream-broker\n// - pipeline-stats → addon-pipeline-orchestrator\n// - stream-network-stats → addon-stream-broker (network-quality cap)\n// - doorbell-recent → addon-provider-reolink (gated on Doorbell feature)\n// - device-info → device-manager (base section, redirected to overview)\n\n/**\n * Live-stream player block — snapshot poster + play/stop + quality\n * selector + detection overlay. Contributed by `addon-stream-broker`.\n */\nexport interface ConfigLiveStreamViewerField extends ConfigFieldBase {\n type: 'live-stream-viewer'\n}\n\n/**\n * Pipeline-quick-stats block — Phase / Detection FPS / Inference time /\n * Active Tracks. Contributed by `addon-pipeline-orchestrator`. The\n * adapter pulls live values from `pipelineRunner.getCameraMetrics` +\n * `pipelineAnalytics.getActiveTracks` via the device proxy.\n */\nexport interface ConfigPipelineStatsField extends ConfigFieldBase {\n type: 'pipeline-stats'\n}\n\n/**\n * Stream network-quality block — per-stream bitrate / packet loss\n * table sourced from the network-quality cap.\n */\nexport interface ConfigStreamNetworkStatsField extends ConfigFieldBase {\n type: 'stream-network-stats'\n}\n\n/**\n * Doorbell recent-press history block. Contributed by\n * `addon-provider-reolink` only when the device advertises the\n * `DoorbellButton` feature; absent on every other camera.\n */\nexport interface ConfigDoorbellRecentField extends ConfigFieldBase {\n type: 'doorbell-recent'\n /** Max history rows to render (default: 10). */\n readonly historyLimit?: number\n}\n\n/**\n * Device-info block — id / stableId / name / type / provider / capability\n * badges. Contributed by `device-manager`'s base section, redirected to\n * the overview tab via `placement.tab = 'overview'`.\n */\nexport interface ConfigDeviceInfoField extends ConfigFieldBase {\n type: 'device-info'\n}\n\n/**\n * Generic widget field — addon-contributed widget mounted by the\n * shared `<WidgetSlot>` runtime via the `WidgetRegistry`.\n *\n * The form-builder reads `widgetId` as the public widget identifier\n * (`<addonId>/<stableId>`) and forwards `widgetConfig` as `props.config`\n * to the widget. Different from the legacy bespoke field types\n * (`'live-stats'`, `'zone-editor'`, `'pipeline-stats'`, …) which are now\n * DEPRECATED — those required per-type renderer registration in\n * admin-ui; widget fields go through the generic registry without a\n * code change in admin-ui.\n *\n * `key` is the form-field's unique identifier (kept distinct from the\n * widget identifier so the same widget can be mounted twice in the\n * same form). `widgetId` is the public id resolved against the\n * WidgetRegistry.\n *\n * Field carries no stored value — the widget owns its own state via\n * DeviceProxy / runtime-state hooks. Placed in\n * `ConfigFieldWithValue` only so the discriminated-union round-trip\n * through `hydrateSchema` stays homogeneous (`value: null`).\n */\nexport interface ConfigWidgetField extends ConfigFieldBase {\n readonly type: 'widget'\n /** `<addonId>/<stableId>` — resolved via the WidgetRegistry. */\n readonly widgetId: string\n /** Per-instance config payload forwarded to the widget as `props.config`. */\n readonly widgetConfig?: Readonly<Record<string, unknown>>\n}\n\n\n// IConfigurable is no longer a separate interface — config methods are part of ICamstackAddon.\n\n// ---------------------------------------------------------------------------\n// Schema + values fused (\"hydrated\") for the new three-level settings API\n// ---------------------------------------------------------------------------\n//\n// `ConfigUISchemaWithValues` is the shape returned by the new\n// `getAddonSettings() / getGlobalSettings() / getDeviceSettings()` family of\n// methods on `ICamstackAddon`. Each leaf field carries its *current* value\n// inline so the admin UI form builder can render in one pass without having\n// to cross-reference a separate `values` object.\n//\n// Hydration rule (applied by `hydrateSchema` below):\n// value = storedValues[key] ?? field.default ?? null\n//\n// `value` is NEVER `undefined` — consumers can rely on `in` / `??` without\n// surprises. Fields that don't carry a value (separator, info) are returned\n// unchanged.\n\n/** A `ConfigField` with its current value attached inline. */\nexport type ConfigFieldWithValue =\n | (ConfigTextField & { readonly value: unknown })\n | (ConfigNumberField & { readonly value: unknown })\n | (ConfigBooleanField & { readonly value: unknown })\n | (ConfigSelectField & { readonly value: unknown })\n | (ConfigMultiSelectField & { readonly value: unknown })\n | (ConfigColorField & { readonly value: unknown })\n | (ConfigPasswordField & { readonly value: unknown })\n | (ConfigTextAreaField & { readonly value: unknown })\n | (ConfigSliderField & { readonly value: unknown })\n | (ConfigTagsField & { readonly value: unknown })\n | (ConfigGroupFieldWithValue)\n | (ConfigSubTabsFieldWithValue)\n | ConfigSeparatorField\n | ConfigInfoField\n | ConfigObjectArrayField\n | (ConfigEditableArrayField & { readonly value: unknown })\n | (ConfigModelSelectorField & { readonly value: unknown })\n | (ConfigStorageLocationField & { readonly value: unknown })\n | (ConfigProbeField & { readonly value: unknown })\n | (ConfigButtonField) // buttons are actions, not values\n | (ConfigPipelineEditorField & { readonly value: unknown })\n | (ConfigNodeSelectField & { readonly value: unknown })\n | (ConfigNodeMultiSelectField & { readonly value: unknown })\n | (ConfigZoneEditorField & { readonly value: unknown })\n | (ConfigLiveStatsField & { readonly value: unknown })\n | (ConfigLiveStreamViewerField & { readonly value: unknown })\n | (ConfigPipelineStatsField & { readonly value: unknown })\n | (ConfigStreamNetworkStatsField & { readonly value: unknown })\n | (ConfigDoorbellRecentField & { readonly value: unknown })\n | (ConfigDeviceInfoField & { readonly value: unknown })\n | ConfigWidgetField // widgets manage their own state; no form value\n | (ConfigAddonActionSelectField & { readonly value: unknown })\n | ConfigAddonActionButtonField // buttons are actions, not values\n\n/** Recursive version of `ConfigGroupField` with hydrated child fields. */\nexport interface ConfigGroupFieldWithValue extends ConfigFieldBase {\n readonly type: 'group'\n readonly fields: readonly ConfigFieldWithValue[]\n readonly style?: 'card' | 'inline' | 'accordion'\n readonly defaultCollapsed?: boolean\n readonly value?: undefined // groups don't carry their own value\n}\n\n/** Hydrated sibling of `ConfigSubTabDefinition` — fields inside each\n * sub-tab carry their resolved values. */\nexport interface ConfigSubTabDefinitionWithValue {\n readonly id: string\n readonly label: string\n readonly icon?: string\n readonly badge?: string\n readonly fields: readonly ConfigFieldWithValue[]\n}\n\n/** Recursive version of `ConfigSubTabsField` with hydrated child fields. */\nexport interface ConfigSubTabsFieldWithValue extends ConfigFieldBase {\n readonly type: 'sub-tabs'\n readonly tabs: readonly ConfigSubTabDefinitionWithValue[]\n readonly value?: undefined // sub-tabs are layout, not a value\n}\n\nexport interface ConfigSectionWithValues extends Omit<ConfigSection, 'fields'> {\n /**\n * Array kept mutable (not `readonly`) to stay assignable to the Zod-inferred\n * wire shape produced by `DEVICE_SETTINGS_CONTRIBUTION_METHODS.getDeviceSettingsContribution.output`.\n * Consumers treat it as immutable by convention — mutation is never\n * expected and would be a bug.\n */\n fields: ConfigFieldWithValue[]\n}\n\nexport interface ConfigUISchemaWithValues {\n /** See `ConfigSectionWithValues.fields` — kept mutable for Zod wire compat. */\n tabs?: ConfigTabDeclaration[]\n sections: ConfigSectionWithValues[]\n}\n\n// ---------------------------------------------------------------------------\n// `hydrateSchema` — backend-side helper\n// ---------------------------------------------------------------------------\n\n/**\n * Field types that never carry a value (separator, info, button). Used by\n * `hydrateSchema` to skip the `value` injection for structural-only fields.\n */\nfunction isValuelessField(\n field: ConfigField,\n): field is ConfigSeparatorField | ConfigInfoField | ConfigButtonField | ConfigObjectArrayField | ConfigWidgetField | ConfigAddonActionButtonField {\n return field.type === 'separator'\n || field.type === 'info'\n || field.type === 'button'\n || field.type === 'object-array'\n || field.type === 'widget'\n || field.type === 'addon-action-button'\n}\n\n/**\n * Merge a `ConfigUISchema` with a raw `values` record into a\n * `ConfigUISchemaWithValues`. Used by every `get*Settings` backend endpoint\n * before returning to the admin UI. Groups are walked recursively.\n *\n * For each leaf field:\n * - structural fields (`separator`, `info`, `button`) pass through unchanged\n * - other fields get `value = values[key] ?? field.default ?? null`\n *\n * Unknown keys in `values` (keys not declared in the schema) are silently\n * ignored — they don't contribute to the output. Missing keys fall back to\n * the schema default or `null`. This mirrors the old backend behaviour where\n * `FormBuilder` rendered `values[key] ?? field.default`.\n */\nexport function hydrateSchema(\n schema: ConfigUISchema,\n values: Record<string, unknown>,\n): ConfigUISchemaWithValues {\n return {\n ...(schema.tabs ? { tabs: [...schema.tabs] } : {}),\n sections: schema.sections.map((section) => ({\n ...section,\n fields: section.fields.map((field) => hydrateField(field, values)),\n })),\n }\n}\n\nfunction hydrateField(\n field: ConfigField,\n values: Record<string, unknown>,\n): ConfigFieldWithValue {\n // Structural fields (separator / info / button) pass through unchanged —\n // they carry no stored value.\n if (isValuelessField(field)) {\n return field\n }\n\n // Groups are recursive — hydrate their children but don't attach a top-level value.\n if (field.type === 'group') {\n const hydratedChildren = field.fields.map((child) => hydrateField(child, values))\n const out: ConfigGroupFieldWithValue = {\n ...field,\n fields: hydratedChildren,\n }\n return out\n }\n\n // Sub-tabs are recursive too — hydrate fields inside every sub-tab but\n // skip the top-level value (sub-tabs are layout, not a value).\n if (field.type === 'sub-tabs') {\n const hydratedTabs: ConfigSubTabDefinitionWithValue[] = field.tabs.map((tab) => ({\n ...tab,\n fields: tab.fields.map((child) => hydrateField(child, values)),\n }))\n const out: ConfigSubTabsFieldWithValue = {\n ...field,\n tabs: hydratedTabs,\n }\n return out\n }\n\n // Leaf valued field. After the guards above, `field` is narrowed to every\n // variant of ConfigField that extends ConfigFieldBase (i.e. has `key` +\n // optional `default`), so we can read them directly.\n const key: string = field.key\n const storedValue = Object.prototype.hasOwnProperty.call(values, key) ? values[key] : undefined\n const defaultValue = field.default\n\n // Multiple-mode: normalise to an array of `max(min, storedLen)` items.\n // Missing slots are padded with the field's `itemDefault` → `default`\n // → type-appropriate zero value so the renderer can always assume the\n // value is an array of exactly the right length.\n if (field.multiple) {\n const stored: readonly unknown[] = Array.isArray(storedValue)\n ? storedValue\n : (storedValue !== undefined && storedValue !== null ? [storedValue] : [])\n const itemFallback = field.multiple.itemDefault !== undefined\n ? field.multiple.itemDefault\n : (defaultValue !== undefined ? defaultValue : typeOf(field) === 'string' ? '' : null)\n const minCount = Math.max(field.multiple.min, stored.length)\n const items: unknown[] = []\n for (let i = 0; i < minCount; i++) {\n items.push(i < stored.length ? stored[i] : itemFallback)\n }\n return { ...field, value: items }\n }\n\n const rawValue: unknown = storedValue !== undefined\n ? storedValue\n : (defaultValue !== undefined ? defaultValue : null)\n // Textarea with `isJson: true` serialises the stored object/array as\n // pretty JSON so the input is human-editable. The save path is\n // expected to `JSON.parse` before forwarding the patch to the writer.\n const value = (field.type === 'textarea' && field.isJson && rawValue !== null && typeof rawValue === 'object')\n ? JSON.stringify(rawValue, null, 2)\n : rawValue\n // Spread-with-added-value preserves the discriminated-union variant.\n const hydrated = { ...field, value }\n return hydrated\n}\n\n/**\n * Rough \"value family\" classifier used by `hydrateField`'s multiple\n * fallback to pick a sensible zero-value when no `itemDefault` / no\n * field `default` / no stored value is available.\n */\nfunction typeOf(field: ConfigField): 'string' | 'number' | 'boolean' | 'other' {\n switch (field.type) {\n case 'text':\n case 'textarea':\n case 'password':\n case 'color':\n case 'probe':\n return 'string'\n case 'number':\n case 'slider':\n return 'number'\n case 'boolean':\n return 'boolean'\n default:\n return 'other'\n }\n}\n","import { z } from 'zod'\n\n/**\n * `StorageLocationType` — the closed enum of *kinds* of storage a location\n * can serve. Defined here (not in `capabilities/storage.cap.ts`) so the\n * persisted record schema and the consumer-facing cap can both consume it\n * without forming a circular import. The `storage` cap re-exports it\n * verbatim for back-compat.\n *\n * This Zod schema is the **authoritative source** for `StorageLocationType`.\n * The TS alias in `./storage.ts` re-exports `z.infer<typeof\n * StorageLocationTypeSchema>` so the wire surface (cap) and the legacy\n * `IStorageProvider` interface stay in lockstep.\n */\nexport const StorageLocationTypeSchema = z.enum([\n 'data',\n 'media',\n 'recordings',\n // Recording-stream slots — addons pick high/low/clips per use case.\n // The legacy `IStorageProvider` interface enumerated these; keeping\n // them in the Zod enum means the `storage` cap can route per-slot\n // location refs (e.g. `'recordings-high:nas-01'`) without losing\n // type safety.\n 'recordings-high',\n 'recordings-low',\n 'recordings-clips',\n // Detection snapshots / thumbnails / crops.\n 'event-images',\n 'models',\n 'cache',\n 'logs',\n 'addons-data',\n // `backups` — owned by the backup-orchestrator builtin. Default\n // root: `<dataDir>/backups`. Operators can repoint via the same\n // override mechanism every other location uses (storage settings).\n 'backups',\n])\n\n/**\n * `StorageLocationType` — TS alias for the Zod enum above. Re-exported\n * by `./storage.ts` so the legacy `IStorageProvider` interface keeps the\n * same name without duplicating the literal union.\n */\nexport type StorageLocationType = z.infer<typeof StorageLocationTypeSchema>\n\n/**\n * Cardinality of a storage location type:\n *\n * - `singleton` — exactly one location instance allowed system-wide.\n * Multiple instances would split state in a way that breaks\n * consumers (e.g. two `addons-data` roots → addon's persistent\n * state lands in either or both; two `cache` roots → cache misses\n * on every read; two `data` roots → sqlite path bifurcation).\n * Operators can EDIT the singleton's config (path / providerId)\n * but never add a second instance. The seed always creates the\n * initial default.\n *\n * - `multi` — multiple instances are first-class. Operators add\n * secondary locations (e.g. NAS + local SSD for `recordings`,\n * offsite + on-disk for `backups`). One is `isDefault: true`\n * at any moment; others are addressable via fully-qualified id.\n *\n * Used by `StorageOrchestratorService.upsertLocation` to reject\n * \"Add\" attempts on singleton types, and by the admin UI to hide\n * the \"+ Add location\" button on those groups.\n */\nexport const STORAGE_LOCATION_CARDINALITY: Readonly<Record<StorageLocationType, 'singleton' | 'multi'>> = {\n // Singletons — system-internal or split-state-incoherent\n data: 'singleton',\n media: 'singleton',\n cache: 'singleton',\n logs: 'singleton',\n 'addons-data': 'singleton',\n models: 'singleton',\n 'event-images': 'singleton',\n // Multi — operator-driven storage tiering\n recordings: 'multi',\n 'recordings-high': 'multi',\n 'recordings-low': 'multi',\n 'recordings-clips': 'multi',\n backups: 'multi',\n}\n\n/**\n * Persisted record for a storage location instance. Multi-instance\n * (per `STORAGE_LOCATION_CARDINALITY[type]`) — operators can register\n * e.g. two `backups` locations (one filesystem, one SFTP) with\n * different `providerId`s, but only one `cache`/`data`/etc.\n *\n * `id` is a stable namespaced string of the form `<type>:<slug>`.\n * The default location for a type uses `id === <type>:default` by\n * convention (the bare type ref like `'backups'` resolves to it).\n *\n * `isSystem: true` marks a location as orchestrator-seeded and\n * undeletable. The bootstrap-installed defaults (one per type) carry\n * this flag; operator-added locations don't. Editing the config of\n * a system location is allowed (path migration, provider swap) but\n * deleting it is rejected at the cap level.\n */\nexport const StorageLocationSchema = z.object({\n id: z.string().regex(/^[a-z][a-z0-9-]*:[a-z0-9-]+$/),\n type: StorageLocationTypeSchema,\n displayName: z.string().min(1),\n providerId: z.string().min(1),\n config: z.record(z.string(), z.unknown()),\n isDefault: z.boolean().default(false),\n isSystem: z.boolean().default(false),\n createdAt: z.number(),\n updatedAt: z.number(),\n})\nexport type StorageLocation = z.infer<typeof StorageLocationSchema>\n\n/**\n * Reference accepted by consumer-facing `api.storage.*` calls.\n * Either:\n * - a `StorageLocationType` (e.g. `'backups'`) → orchestrator resolves to the default of that type\n * - a fully-qualified id (e.g. `'backups:nas-01'`) → addresses a specific instance\n *\n * The orchestrator's `resolveRef(ref)` handles both cases.\n */\nexport const StorageLocationRefSchema = z.union([\n StorageLocationTypeSchema,\n z.string().regex(/^[a-z][a-z0-9-]*:[a-z0-9-]+$/),\n])\nexport type StorageLocationRef = z.infer<typeof StorageLocationRefSchema>\n","\nimport { z } from 'zod'\nimport type { FrameFormat } from '../types/io.js'\n\n// ── Zod schemas for wire-serializable decoder cap methods ──────────\n\nexport const DecoderStatsSchema = z.object({\n inputFps: z.number(),\n outputFps: z.number(),\n avgDecodeTimeMs: z.number(),\n droppedFrames: z.number(),\n})\n\nexport const DecoderSessionConfigSchema = z.object({\n codec: z.string(),\n maxFps: z.number().default(0),\n outputFormat: z.enum(['jpeg', 'rgb', 'bgr', 'yuv420', 'gray']).default('jpeg'),\n scale: z.number().default(1),\n width: z.number().optional(),\n height: z.number().optional(),\n /**\n * Identifier of the camera this decoder session serves. Optional\n * because the cap is generic (any caller could request decode), but\n * stream-broker passes it so decoder logs include `deviceId` for\n * per-camera filtering when diagnosing failures (e.g. node-av\n * sendPacket errors on a single hung camera).\n */\n deviceId: z.number().int().nonnegative().optional(),\n /**\n * Free-form tag for log scoping. Stream-broker uses\n * `broker:<deviceId>/<profile>`. Decoder session logger surfaces it\n * on every line so `grep tag=broker:5/high` filters one camera\n * profile cleanly.\n */\n tag: z.string().optional(),\n})\n\nexport type Unsubscribe = () => void\n\n/**\n * Discriminator for `StreamSource.type`. Values that the broker\n * understands today:\n *\n * - `'rtsp'` — pull mode. Broker connects to a `rtsp://` URL,\n * demuxes RTP, exposes raw RTP via `onVideoRtp`.\n * - `'rtmp'` — pull mode. Broker connects to a `rtmp://` URL,\n * demuxes flv into AnnexB packets. No source RTP\n * available (RTMP carries no RTP), so the WebRTC\n * path falls back to AnnexB → writeVideoNals.\n * Reserved — implementation pending.\n * - `'push'` — push mode. Provider addon delivers AnnexB packets\n * via `pushEncodedPacket()` (Reolink Baichuan,\n * Frigate event streams, etc.).\n * - `'push-rtp'` — push mode with raw RTP packets. Provider addon\n * delivers source RTP via `pushVideoRtp()` AND\n * AnnexB-equivalents via `pushEncodedPacket()` so\n * downstream consumers (decoder, restreamer) keep\n * working. Lets the WebRTC path use the H.265\n * repacketizer for push-mode H.265 streams. Reserved\n * — implementation pending.\n * - `'placeholder'` — silent black-image placeholder reader.\n *\n * String type instead of a literal union so addons remain free to\n * add new source types — the broker's switch statement falls through\n * to \"data is pushed externally\" for unknown values.\n */\nexport type StreamSourceType = 'rtsp' | 'rtmp' | 'push' | 'push-rtp' | 'rfc4571' | 'placeholder' | (string & {})\n\nexport interface StreamSource {\n readonly type: StreamSourceType\n /** Stream URL — required for pull-based sources (rtsp, rtmp). Not used for push sources. */\n readonly url: string\n readonly videoCodec?: string\n readonly audioCodec?: string\n readonly metadata?: Readonly<Record<string, unknown>>\n /**\n * Push-source flag — when true, a stall in the input stream is\n * treated as a valid suspension (battery cameras intentionally go\n * silent between motion events) rather than an error. The broker\n * stops emitting the black-image placeholder and pauses the watchdog\n * until the next packet arrives. Default: false (legacy behaviour —\n * stall is an error).\n */\n readonly allowStall?: boolean\n}\n\nexport interface StreamSourceOption {\n readonly id: string\n readonly label: string\n readonly source: StreamSource\n readonly resolution?: { readonly width: number; readonly height: number }\n readonly primary?: boolean\n}\n\nexport interface EncodedPacket {\n readonly type: 'video' | 'audio'\n readonly data: Buffer\n readonly pts: number\n readonly dts: number\n readonly keyframe: boolean\n readonly codec: string\n /**\n * `true` when the packet was synthesized by the broker's placeholder\n * pump (state-aware \"RECONNECTING\" / \"SLEEPING\" / etc. keyframes\n * pushed at 1Hz while no real RTP is flowing). Consumers that\n * accumulate per-stream codec state (sticky SPS/PPS, decoder config)\n * MUST treat these as throwaway: the placeholder is a different\n * resolution and parameter set than the live camera, so caching its\n * SPS/PPS and prepending them to real keyframes silently corrupts\n * the decoder state and freezes the WebRTC viewer on the last\n * placeholder until the consumer is re-created. Absent on packets\n * produced from real source data.\n */\n readonly isPlaceholder?: boolean\n}\n\n/**\n * Audio metadata declared by push-source providers before they emit the\n * first audio `EncodedPacket`. Mirrors the slice of an SDP audio track\n * the broker actually consumes — `codec` is canonical lowercase\n * ('aac' | 'opus' | 'pcmu' | 'pcma' | ...).\n *\n * `extraData` carries codec-specific config bytes (e.g. AAC\n * AudioSpecificConfig) when the codec needs them at decoder-init time.\n */\nexport interface PushAudioInfo {\n readonly codec: string\n readonly sampleRate: number\n readonly channels: number\n readonly extraData?: Uint8Array\n}\n\nexport interface DecodedFrame {\n readonly data: Buffer\n readonly width: number\n readonly height: number\n readonly format: FrameFormat\n readonly timestamp: number\n}\n\nexport interface DecodedAudioChunk {\n readonly data: Buffer\n readonly sampleRate: number\n readonly channels: number\n readonly timestamp: number\n}\n\nexport interface DecodeOptions {\n readonly maxFps?: number\n readonly format?: FrameFormat\n readonly scale?: number\n /**\n * Caller identity tag (Phase 10). Surfaced by `listClients` so\n * operators can tell who's holding the broker open. Short and stable:\n * `motion`, `detection`, `snapshot`, `webrtc:<sessionId>`,\n * `benchmark`. Missing tag → recorded as `'unknown'` with a broker-\n * side warn log.\n */\n readonly tag?: string\n}\n\nexport interface AudioSubscribeOptions {\n /** Caller identity tag. See DecodeOptions.tag. */\n readonly tag?: string\n}\n\nexport type BrokerStatus = 'idle' | 'connecting' | 'streaming' | 'error' | 'stopped'\n\nexport interface BrokerStats {\n readonly status: BrokerStatus\n readonly inputFps: number\n readonly decodeFps: number\n readonly encodedSubscribers: number\n readonly decodedSubscribers: number\n readonly uptimeMs: number\n /** Measured bitrate in kbps (averaged over 2s window) */\n readonly bitrateKbps: number\n /** Time between last two keyframes in ms (IDR interval) */\n readonly idrIntervalMs: number\n /** Detected video codec (h264, h265) */\n readonly codec?: string\n /** Total bytes received since broker start */\n readonly totalBytes: number\n /** Total encoded packets received since broker start */\n readonly packetCount: number\n /** Number of connected RTSP restream clients */\n readonly rtspClients: number\n /** Number of connected TCP pipe clients */\n readonly pipeClients: number\n /** Pre-buffer configured duration in seconds */\n readonly preBufferSec: number\n /** Pre-buffer actual buffered duration in ms */\n readonly preBufferMs: number\n /** Pre-buffer packet count */\n readonly preBufferPackets: number\n /**\n * Moleculer node id of the decoder provider currently servicing this\n * stream's decoded subscribers. `null` until the deferred decoder is\n * created (no decoded clients yet, or codec not detected).\n */\n readonly decoderNodeId: string | null\n /**\n * Detected audio track parameters from the RTSP DESCRIBE / SDP. Null\n * when the stream has no audio track or the broker is still in cold\n * start. `supported` reflects whether the local native + ffmpeg-based\n * decoder pipeline can produce PCM chunks for downstream consumers\n * (audio-analyzer). When `false`, the codec is detected but skipped.\n */\n readonly audio?: {\n readonly codec: string\n readonly sampleRate: number\n readonly channels: number\n readonly supported: boolean\n } | null\n}\n\nexport interface IStreamBroker {\n readonly deviceId: string\n readonly status: BrokerStatus\n readonly suspended: boolean\n start(source: StreamSource): Promise<void>\n stop(): Promise<void>\n /**\n * Push an encoded packet into the broker from an external source.\n *\n * Used by camera provider addons that deliver media data directly\n * (e.g. Reolink Baichuan protocol, Frigate event streams) instead\n * of exposing an RTSP URL for the broker to pull from.\n *\n * The broker fans out the packet to all consumers: pre-buffer, RTSP\n * restreamer, TCP pipe, decoder sessions, and encoded subscribers.\n */\n pushEncodedPacket(packet: EncodedPacket): void\n /**\n * Push-source audio metadata. Push providers (Reolink Baichuan,\n * Frigate, etc.) call this BEFORE the first audio EncodedPacket so\n * the broker can wire the audio-codec capability — RTSP sources get\n * the same data from the SDP audio track. Repeat calls update the\n * declared codec; calling with `null` retracts (broker tears down\n * any audio decode session).\n *\n * Typical Reolink Baichuan audio: AAC-LC 16 kHz mono. Cameras that\n * push G.711 should still call this so the broker can bypass the\n * codec cap for the supported native codecs.\n */\n pushAudioInfo?(info: PushAudioInfo | null): void\n /**\n * Push a raw video RTP packet from an external source (used by\n * `'push-rtp'`-typed sources, e.g. Reolink Baichuan adapter that\n * synthesizes RTP from its packetizer-friendly access units). The\n * broker fans out to `onVideoRtp` subscribers, including the\n * WebRTC server's H.265 repacketizer path.\n *\n * Sources that don't carry per-packet RTP MAY ignore this entirely\n * and call only `pushEncodedPacket`. Implementations are free to\n * be a no-op when no RTP subscribers exist.\n */\n pushVideoRtp?(rtpData: Buffer): void\n onEncodedData(callback: (packet: EncodedPacket) => void): Unsubscribe\n /**\n * Subscribe to source video RTP packets (raw on-wire bytes, before\n * depacketization). Used by the WebRTC server's H.265 path to feed\n * a packet-level repacketizer that preserves the original RTP header\n * layout — Chrome's HEVC depacketizer is sensitive to it.\n *\n * Sources that don't have an underlying RTP wire (e.g. Frigate event\n * streams that call `pushEncodedPacket`) MAY register zero callbacks\n * and emit nothing.\n */\n onVideoRtp(callback: (rtpData: Buffer) => void): Unsubscribe\n /**\n * Codec parameter sets harvested from the camera's SDP (sprop-vps /\n * sprop-sps / sprop-pps). Cameras like Reolink high-profile streams\n * publish VPS/SPS/PPS only via SDP — Chrome's HEVC decoder needs them\n * to initialise. Returns null when the broker hasn't connected yet\n * or the camera ships param sets in-band.\n */\n getSdpParameterSets(): ReadonlyArray<Buffer> | null\n /**\n * Subscribe to SDP-derived VPS/SPS/PPS deliveries. Fires once\n * synchronously if the broker already has them (late-subscriber\n * shape), and again every time `onVideoTrack` repopulates them on a\n * reader rebuild. Used by the WebRTC server's H.265 path so a\n * session created during the wake-up window — when\n * `getSdpParameterSets()` still returns null — can seed its\n * `H265Repacketizer` once the camera's first RTP+SDP arrive.\n */\n onSdpParameterSets(callback: (ps: ReadonlyArray<Buffer>) => void): Unsubscribe\n /**\n * Source type as configured at `start()` — see `StreamSourceType`\n * for the supported values. `null` before `start()` resolves.\n */\n getSourceType(): StreamSourceType | null\n /**\n * True when the broker can emit source RTP packets via\n * `onVideoRtp` — i.e. the source is RTSP (pull) or push-rtp.\n * RTMP and bare push (AnnexB-only) sources return false.\n * Routing decisions in the WebRTC server (e.g. \"use the H.265\n * repacketizer\") should consult this rather than string-comparing\n * the source type.\n */\n isRtpSource(): boolean\n /**\n * Subscribe to decoded frames. Phase 10 added `options.tag` — a short\n * caller-identity string (`motion`, `detection`, `snapshot`,\n * `webrtc:<sessionId>`, `benchmark`) used by `listClients` so\n * operators can see who is holding the broker open. Omitted tag\n * yields a `'unknown'` entry with a warn log — not silently accepted.\n */\n onDecodedFrame(callback: (frame: DecodedFrame) => void, options?: DecodeOptions): Unsubscribe\n /** Subscribe to decoded audio chunks. `options.tag` mirrors `onDecodedFrame`. */\n onDecodedAudioChunk(callback: (chunk: DecodedAudioChunk) => void, options?: AudioSubscribeOptions): Unsubscribe\n getStats(): BrokerStats\n getLocalStreamUrl(): string\n /** Get the pre-buffer: recent encoded packets starting from last keyframe. */\n getPreBuffer(): readonly EncodedPacket[]\n /** Set the pre-buffer duration in seconds (0 to disable, max 30). */\n setPreBufferDuration(seconds: number): void\n /** Get the current pre-buffer duration in seconds. */\n getPreBufferDuration(): number\n setPreBufferEnabled(enabled: boolean): void\n}\n\n/**\n * Manager for stream brokers — the server interacts with this interface,\n * while the concrete implementation lives in the addon-stream-broker package.\n */\n/** Per-broker RTSP restream entry (absorbed from the former rtsp-restream capability). */\nexport interface RtspRestreamEntry {\n readonly brokerId: string\n readonly url: string\n readonly mutedUrl: string\n readonly enabled: boolean\n}\n\n/** Flat cap-shaped broker record returned by `listBrokers()`. */\nexport interface BrokerListEntry {\n readonly brokerId: string\n readonly status: string\n readonly inputFps: number\n readonly decodeFps: number\n readonly encodedSubscribers: number\n readonly decodedSubscribers: number\n readonly uptimeMs: number\n readonly bitrateKbps: number\n readonly idrIntervalMs: number\n readonly codec?: string\n readonly totalBytes: number\n readonly packetCount: number\n readonly rtspClients: number\n readonly pipeClients: number\n readonly preBufferSec: number\n readonly preBufferMs: number\n readonly preBufferPackets: number\n}\n\n\n/**\n * Phase the runner's per-camera state machine occupies. `'idle'` is the\n * `detectionMode === 'disabled'` resting state — runner registered the\n * camera but never subscribed to detection frames. The other 4 are the\n * historical motion-gated states; their transitions are now driven by\n * `detectionMode` ('always-on' starts in 'active', 'on-motion' starts\n * in 'watching').\n */\nexport type CameraPhase = 'idle' | 'watching' | 'active' | 'paused' | 'load-shed'\n\nexport interface CameraDetectionConfig {\n readonly enabled: boolean\n readonly pipelineEnabled: boolean\n\n /** Motion sources that activate this camera's pipeline. At least one. */\n readonly motionSources: import('./pipeline-orchestrator-capability.js').OrchestrationMotionSources\n\n readonly motionStreamId: string\n readonly detectionStreamId: string\n\n readonly motionFps: number\n readonly detectionFps: number\n readonly motionCooldownMs: number\n\n readonly audioStreamId?: string\n\n /**\n * Operator-facing scheduling modes. Forwarded to `RunnerCameraConfig`;\n * the runner uses these to gate its substream subscribers + phase\n * machine. See `PipelinePhaseMode` for the semantics.\n */\n readonly detectionMode: import('../device/device-profile.js').PipelinePhaseMode\n readonly audioMode: import('../device/device-profile.js').PipelinePhaseMode\n}\n","/**\nimport { errMsg } from '@camstack/types'\n * Extract a human-readable message from an unknown error value.\n * Replaces the ubiquitous `errMsg(err)` pattern.\n */\nexport function errMsg(err: unknown): string {\n if (err instanceof Error) return err.message\n if (typeof err === 'string') return err\n return String(err)\n}\n","/**\n * Audio classification macro classes — maps 521 YAMNet labels into ~25 actionable categories.\n * Same pattern as COCO_TO_MACRO for video detection.\n *\n * Each macro class aggregates related fine-grained labels so the user\n * sees a manageable set of event types in settings, timelines, and notifications.\n */\nimport type { LabelDefinition, ClassMapDefinition } from '../types/labels.js'\n\n// ---------------------------------------------------------------------------\n// Macro class definitions\n// ---------------------------------------------------------------------------\n\nexport const AUDIO_MACRO_LABELS: readonly LabelDefinition[] = [\n { id: 'speech', name: 'Speech', icon: '🗣️' },\n { id: 'scream', name: 'Scream / Shout', icon: '😱' },\n { id: 'crying', name: 'Crying / Baby', icon: '😢' },\n { id: 'laughter', name: 'Laughter', icon: '😂' },\n { id: 'music', name: 'Music', icon: '🎵' },\n { id: 'dog', name: 'Dog', icon: '🐕' },\n { id: 'cat', name: 'Cat', icon: '🐈' },\n { id: 'bird', name: 'Bird', icon: '🐦' },\n { id: 'animal', name: 'Animal (other)', icon: '🐾' },\n { id: 'alarm', name: 'Alarm / Siren', icon: '🚨' },\n { id: 'doorbell', name: 'Doorbell / Knock', icon: '🔔' },\n { id: 'glass_breaking', name: 'Glass Breaking', icon: '💥' },\n { id: 'gunshot', name: 'Gunshot / Explosion', icon: '💣' },\n { id: 'vehicle', name: 'Vehicle', icon: '🚗' },\n { id: 'siren', name: 'Emergency Siren', icon: '🚑' },\n { id: 'fire', name: 'Fire / Smoke', icon: '🔥' },\n { id: 'water', name: 'Water', icon: '💧' },\n { id: 'wind', name: 'Wind / Weather', icon: '🌬️' },\n { id: 'door', name: 'Door', icon: '🚪' },\n { id: 'footsteps', name: 'Footsteps', icon: '👣' },\n { id: 'crowd', name: 'Crowd / Chatter', icon: '👥' },\n { id: 'telephone', name: 'Telephone', icon: '📞' },\n { id: 'engine', name: 'Engine / Motor', icon: '⚙️' },\n { id: 'tools', name: 'Tools / Construction', icon: '🔨' },\n { id: 'silence', name: 'Silence', icon: '🤫' },\n] as const\n\n// ---------------------------------------------------------------------------\n// YAMNet label → macro class mapping (by label name, case-insensitive)\n// ---------------------------------------------------------------------------\n\nexport const YAMNET_TO_MACRO: ClassMapDefinition = {\n mapping: {\n // Speech\n 'Speech': 'speech',\n 'Child speech, kid speaking': 'speech',\n 'Conversation': 'speech',\n 'Narration, monologue': 'speech',\n 'Babbling': 'speech',\n 'Whispering': 'speech',\n 'Speech synthesizer': 'speech',\n 'Humming': 'speech',\n 'Rapping': 'speech',\n 'Singing': 'speech',\n 'Choir': 'speech',\n 'Child singing': 'speech',\n\n // Scream / Shout\n 'Shout': 'scream',\n 'Bellow': 'scream',\n 'Yell': 'scream',\n 'Screaming': 'scream',\n 'Children shouting': 'scream',\n 'Whoop': 'scream',\n\n // Crying\n 'Crying, sobbing': 'crying',\n 'Baby cry, infant cry': 'crying',\n 'Whimper': 'crying',\n 'Wail, moan': 'crying',\n 'Groan': 'crying',\n\n // Laughter\n 'Laughter': 'laughter',\n 'Baby laughter': 'laughter',\n 'Giggle': 'laughter',\n 'Snicker': 'laughter',\n 'Belly laugh': 'laughter',\n 'Chuckle, chortle': 'laughter',\n\n // Music\n 'Music': 'music',\n 'Musical instrument': 'music',\n 'Guitar': 'music',\n 'Piano': 'music',\n 'Drum': 'music',\n 'Drum kit': 'music',\n 'Violin, fiddle': 'music',\n 'Flute': 'music',\n 'Saxophone': 'music',\n 'Trumpet': 'music',\n 'Synthesizer': 'music',\n 'Pop music': 'music',\n 'Rock music': 'music',\n 'Hip hop music': 'music',\n 'Classical music': 'music',\n 'Jazz': 'music',\n 'Electronic music': 'music',\n 'Background music': 'music',\n\n // Dog\n 'Dog': 'dog',\n 'Bark': 'dog',\n 'Yip': 'dog',\n 'Howl': 'dog',\n 'Bow-wow': 'dog',\n 'Growling': 'dog',\n 'Whimper (dog)': 'dog',\n\n // Cat\n 'Cat': 'cat',\n 'Purr': 'cat',\n 'Meow': 'cat',\n 'Hiss': 'cat',\n 'Caterwaul': 'cat',\n\n // Bird\n 'Bird': 'bird',\n 'Bird vocalization, bird call, bird song': 'bird',\n 'Chirp, tweet': 'bird',\n 'Squawk': 'bird',\n 'Crow': 'bird',\n 'Owl': 'bird',\n 'Pigeon, dove': 'bird',\n\n // Animal (other)\n 'Animal': 'animal',\n 'Domestic animals, pets': 'animal',\n 'Livestock, farm animals, working animals': 'animal',\n 'Horse': 'animal',\n 'Cattle, bovinae': 'animal',\n 'Pig': 'animal',\n 'Sheep': 'animal',\n 'Goat': 'animal',\n 'Frog': 'animal',\n 'Insect': 'animal',\n 'Cricket': 'animal',\n\n // Alarm / Siren\n 'Alarm': 'alarm',\n 'Alarm clock': 'alarm',\n 'Smoke detector, smoke alarm': 'alarm',\n 'Fire alarm': 'alarm',\n 'Buzzer': 'alarm',\n 'Civil defense siren': 'alarm',\n 'Car alarm': 'alarm',\n\n // Emergency Siren\n 'Siren': 'siren',\n 'Police car (siren)': 'siren',\n 'Ambulance (siren)': 'siren',\n 'Fire engine, fire truck (siren)': 'siren',\n 'Emergency vehicle': 'siren',\n 'Foghorn': 'siren',\n\n // Doorbell / Knock\n 'Doorbell': 'doorbell',\n 'Ding-dong': 'doorbell',\n 'Knock': 'doorbell',\n 'Tap': 'doorbell',\n\n // Glass Breaking\n 'Glass': 'glass_breaking',\n 'Shatter': 'glass_breaking',\n 'Chink, clink': 'glass_breaking',\n\n // Gunshot / Explosion\n 'Gunshot, gunfire': 'gunshot',\n 'Machine gun': 'gunshot',\n 'Explosion': 'gunshot',\n 'Fireworks': 'gunshot',\n 'Firecracker': 'gunshot',\n 'Artillery fire': 'gunshot',\n 'Cap gun': 'gunshot',\n 'Boom': 'gunshot',\n\n // Vehicle\n 'Vehicle': 'vehicle',\n 'Car': 'vehicle',\n 'Truck': 'vehicle',\n 'Bus': 'vehicle',\n 'Motorcycle': 'vehicle',\n 'Car passing by': 'vehicle',\n 'Vehicle horn, car horn, honking': 'vehicle',\n 'Traffic noise, roadway noise': 'vehicle',\n 'Train': 'vehicle',\n 'Aircraft': 'vehicle',\n 'Helicopter': 'vehicle',\n 'Bicycle': 'vehicle',\n 'Skateboard': 'vehicle',\n\n // Fire / Smoke\n 'Fire': 'fire',\n 'Crackle': 'fire',\n\n // Water\n 'Water': 'water',\n 'Rain': 'water',\n 'Raindrop': 'water',\n 'Rain on surface': 'water',\n 'Stream': 'water',\n 'Waterfall': 'water',\n 'Ocean': 'water',\n 'Waves, surf': 'water',\n 'Splash, splatter': 'water',\n\n // Wind / Weather\n 'Wind': 'wind',\n 'Thunderstorm': 'wind',\n 'Thunder': 'wind',\n 'Wind noise (microphone)': 'wind',\n 'Rustling leaves': 'wind',\n\n // Door\n 'Door': 'door',\n 'Sliding door': 'door',\n 'Slam': 'door',\n 'Cupboard open or close': 'door',\n\n // Footsteps\n 'Walk, footsteps': 'footsteps',\n 'Run': 'footsteps',\n 'Shuffle': 'footsteps',\n\n // Crowd\n 'Crowd': 'crowd',\n 'Chatter': 'crowd',\n 'Cheering': 'crowd',\n 'Applause': 'crowd',\n 'Children playing': 'crowd',\n 'Hubbub, speech noise, speech babble': 'crowd',\n\n // Telephone\n 'Telephone': 'telephone',\n 'Telephone bell ringing': 'telephone',\n 'Ringtone': 'telephone',\n 'Telephone dialing, DTMF': 'telephone',\n 'Busy signal': 'telephone',\n\n // Engine / Motor\n 'Engine': 'engine',\n 'Engine starting': 'engine',\n 'Idling': 'engine',\n 'Accelerating, revving, vroom': 'engine',\n 'Light engine (high frequency)': 'engine',\n 'Medium engine (mid frequency)': 'engine',\n 'Heavy engine (low frequency)': 'engine',\n 'Lawn mower': 'engine',\n 'Chainsaw': 'engine',\n\n // Tools / Construction\n 'Hammer': 'tools',\n 'Jackhammer': 'tools',\n 'Sawing': 'tools',\n 'Power tool': 'tools',\n 'Drill': 'tools',\n 'Sanding': 'tools',\n\n // Silence\n 'Silence': 'silence',\n },\n preserveOriginal: false,\n}\n\n// ---------------------------------------------------------------------------\n// Apple SoundAnalysis identifier → macro class mapping\n// Apple uses snake_case identifiers (e.g. 'dog_bark', 'siren')\n// ---------------------------------------------------------------------------\n\nexport const APPLE_SA_TO_MACRO: ClassMapDefinition = {\n mapping: {\n 'speech': 'speech', 'child_speech': 'speech', 'conversation': 'speech',\n 'whispering': 'speech', 'singing': 'speech', 'humming': 'speech',\n 'shout': 'scream', 'yell': 'scream', 'screaming': 'scream',\n 'crying': 'crying', 'baby_crying': 'crying', 'sobbing': 'crying',\n 'laughter': 'laughter', 'baby_laughter': 'laughter', 'giggling': 'laughter',\n 'music': 'music', 'guitar': 'music', 'piano': 'music', 'drums': 'music',\n 'dog_bark': 'dog', 'dog_bow_wow': 'dog', 'dog_growling': 'dog', 'dog_howl': 'dog',\n 'cat_meow': 'cat', 'cat_purr': 'cat', 'cat_hiss': 'cat',\n 'bird': 'bird', 'bird_chirp': 'bird', 'bird_squawk': 'bird',\n 'animal': 'animal', 'horse': 'animal', 'cow_moo': 'animal', 'insect': 'animal',\n 'alarm': 'alarm', 'smoke_alarm': 'alarm', 'fire_alarm': 'alarm', 'car_alarm': 'alarm',\n 'siren': 'siren', 'police_siren': 'siren', 'ambulance_siren': 'siren',\n 'doorbell': 'doorbell', 'door_knock': 'doorbell', 'knocking': 'doorbell',\n 'glass_breaking': 'glass_breaking', 'glass_shatter': 'glass_breaking',\n 'gunshot': 'gunshot', 'explosion': 'gunshot', 'fireworks': 'gunshot',\n 'car': 'vehicle', 'truck': 'vehicle', 'motorcycle': 'vehicle',\n 'car_horn': 'vehicle', 'vehicle_horn': 'vehicle', 'traffic': 'vehicle',\n 'fire': 'fire', 'fire_crackle': 'fire',\n 'water': 'water', 'rain': 'water', 'ocean': 'water', 'splash': 'water',\n 'wind': 'wind', 'thunder': 'wind', 'thunderstorm': 'wind',\n 'door': 'door', 'door_slam': 'door', 'sliding_door': 'door',\n 'footsteps': 'footsteps', 'walking': 'footsteps', 'running': 'footsteps',\n 'crowd': 'crowd', 'chatter': 'crowd', 'cheering': 'crowd', 'applause': 'crowd',\n 'telephone_ring': 'telephone', 'ringtone': 'telephone',\n 'engine': 'engine', 'engine_starting': 'engine', 'lawn_mower': 'engine', 'chainsaw': 'engine',\n 'hammer': 'tools', 'jackhammer': 'tools', 'drill': 'tools', 'power_tool': 'tools',\n 'silence': 'silence',\n },\n preserveOriginal: false,\n}\n\n// ---------------------------------------------------------------------------\n// Unified lookup — merges YAMNet + Apple SA mappings\n// ---------------------------------------------------------------------------\n\nconst _macroLookup = new Map<string, string>()\nfor (const [k, v] of Object.entries(YAMNET_TO_MACRO.mapping)) {\n _macroLookup.set(k.toLowerCase(), v)\n}\nfor (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) {\n _macroLookup.set(k.toLowerCase(), v)\n}\n\n/** Map a raw audio label (YAMNet or Apple SoundAnalysis) to its macro class. Returns null if unmapped. */\nexport function mapAudioLabelToMacro(label: string): string | null {\n return _macroLookup.get(label.toLowerCase()) ?? null\n}\n\n/** Get all macro class IDs */\nexport function getAudioMacroClassIds(): readonly string[] {\n return AUDIO_MACRO_LABELS.map(l => l.id)\n}\n","export enum DeviceType {\n Camera = 'camera',\n Hub = 'hub',\n Light = 'light',\n Siren = 'siren',\n Switch = 'switch',\n Sensor = 'sensor',\n Thermostat = 'thermostat',\n Button = 'button',\n Generic = 'generic',\n}\n\nexport enum DeviceFeature {\n BatteryOperated = 'battery-operated',\n Rebootable = 'rebootable',\n NativeSnapshot = 'native-snapshot',\n DoorbellButton = 'doorbell-button',\n TwoWayAudio = 'two-way-audio',\n PanTiltZoom = 'pan-tilt-zoom',\n /**\n * Camera supports the on-firmware autotrack subsystem (subject-\n * following). Distinct from `PanTiltZoom` because not every PTZ\n * camera ships autotrack — the admin UI uses this flag to gate\n * the autotrack toggle / settings card without re-deriving from\n * the cap registry. Mirrors `ptz-autotrack` cap registration:\n * driver sets this feature when probe confirms the firmware\n * surface, and registers the cap in the same code path.\n */\n PtzAutotrack = 'ptz-autotrack',\n /**\n * Accessory exposes a \"trigger on motion\" toggle — the parent camera's\n * motion detection automatically activates this device. Mirrors\n * `motion-trigger` cap registration: drivers set this feature in the\n * same code path that calls `ctx.registerNativeCap(motionTriggerCapability, ...)`.\n *\n * Used by admin UI (gate the in-hero `MotionTriggerToggle` against a\n * fast scalar without binding fetch), notifier rules, and `listAll`\n * filters that want \"all devices with on-motion behaviour\".\n */\n MotionTrigger = 'motion-trigger',\n}\n\nexport enum ChargingStatus {\n ChargingDC = 'charging-dc',\n ChargingSolar = 'charging-solar',\n NotCharging = 'not-charging',\n}\n\n/**\n * Semantic role a device plays within its parent. Populated by driver\n * addons when creating accessory devices (Reolink siren/floodlight/\n * PIR/chime/autotrack/doorbell, ONVIF relay outputs, …). Used by the\n * admin UI to pick icons, labels, and widgets — a `Switch` with\n * `role: Floodlight` renders as a bulb with a brightness slider,\n * whereas a `Switch` with `role: Siren` renders as a klaxon.\n *\n * Undefined for top-level devices (cameras, NVRs, hubs). Persisted in\n * sqlite as a nullable TEXT column — old rows keep working unchanged.\n */\nexport enum DeviceRole {\n // ── Switch-type accessories ──────────────────────────────\n Siren = 'siren',\n Floodlight = 'floodlight',\n Spotlight = 'spotlight',\n PirSensor = 'pir-sensor',\n Chime = 'chime',\n Autotrack = 'autotrack',\n Nightvision = 'nightvision',\n PrivacyMask = 'privacy-mask',\n\n // ── Button-type accessories ──────────────────────────────\n Doorbell = 'doorbell',\n}\n","/**\n * Accessory device helpers — shared across drivers.\n *\n * Many vendor-specific drivers register accessory child devices on\n * top of a parent (Reolink: siren / floodlight / PIR / autotrack /\n * chime; ONVIF: relay outputs; future: Tapo Hub child devices). Each\n * driver picks the right `DeviceType` + `DeviceRole` explicitly when\n * spawning, builds a name derived from the parent, and produces a\n * stableId tied to the parent so boot-restore can reconstruct the\n * relationship.\n *\n * Centralised `(kind → DeviceType)` mapping was dropped on purpose:\n * drivers may reasonably disagree on the right type for an accessory\n * (a Reolink PIR exposes a switch on/off + sensitivity, while a hypothetical\n * read-only motion-only sensor might be `DeviceType.Sensor`). Forcing\n * one canonical mapping was over-prescriptive and added a layer of\n * indirection without saving meaningful code at call sites — the\n * driver knows its own hardware best.\n */\nimport { DeviceRole } from './device-type.js'\n\n/**\n * Subset of `DeviceRole` values that drivers register as child\n * accessories of a parent device. Sourced verbatim from `DeviceRole`\n * — `AccessoryKind` is the alias drivers use when building accessory\n * children, so the call site reads as\n * `accessoryStableId(parent, AccessoryKind.Siren)` rather than\n * `accessoryStableId(parent, DeviceRole.Siren)` (which would imply\n * any role works, including non-accessory ones like Doorbell).\n */\nexport const AccessoryKind = {\n Siren: DeviceRole.Siren,\n Floodlight: DeviceRole.Floodlight,\n Spotlight: DeviceRole.Spotlight,\n PirSensor: DeviceRole.PirSensor,\n Chime: DeviceRole.Chime,\n Autotrack: DeviceRole.Autotrack,\n Nightvision: DeviceRole.Nightvision,\n PrivacyMask: DeviceRole.PrivacyMask,\n} as const\n\nexport type AccessoryKindValue = typeof AccessoryKind[keyof typeof AccessoryKind]\n\n/**\n * Default English label for each accessory kind. Drivers append this\n * to the parent's name — e.g. `\"Living Room Siren\"` for a camera named\n * `\"Living Room\"`. Localisation lives in the UI layer; the driver only\n * has to surface a stable English name.\n */\nexport const ACCESSORY_LABEL: Record<AccessoryKindValue, string> = {\n [AccessoryKind.Siren]: 'Siren',\n [AccessoryKind.Floodlight]: 'Floodlight',\n [AccessoryKind.Spotlight]: 'Spotlight',\n [AccessoryKind.PirSensor]: 'PIR',\n [AccessoryKind.Chime]: 'Chime',\n [AccessoryKind.Autotrack]: 'Autotracking',\n [AccessoryKind.Nightvision]: 'Night Vision',\n [AccessoryKind.PrivacyMask]: 'Privacy Mask',\n}\n\n/**\n * Canonical stableId for an accessory child. Format: `${parent}:${role}`\n * for single-instance accessories; drivers that need multiple instances\n * of the same kind (e.g. wireless chimes) pass an extra `index` token\n * which the helper appends as `:${index}`.\n *\n * The stableId is the persistence key the device-manager uses to\n * resolve `(addonId, stableId) → numeric id` across reboots, so it\n * MUST be stable across runs. Using the parent's stableId + the role\n * meets this — a driver can re-create children deterministically as\n * long as the parent's stableId is also stable (which the platform\n * already guarantees).\n */\nexport function accessoryStableId(\n parentStableId: string,\n kind: AccessoryKindValue,\n index?: number,\n): string {\n const base = `${parentStableId}:${kind}`\n return typeof index === 'number' ? `${base}:${index}` : base\n}\n","/**\n * Bindings × Modes contract\n * ─────────────────────────\n *\n * Two independent layers gate every analyzer phase (detection / audio):\n *\n * 1. **Bindings** (low-level wiring, escape hatch)\n * The cap-router decides whether the addon is MOUNTED for a\n * device at all. `setWrapperActive(deviceId, capName, false)`\n * fully dismounts the cap; nothing the cap exposes (provider\n * methods, runtime-state, events) is reachable. The operator\n * rarely touches this from the UI — it's the \"uninstall this\n * addon for this device\" button. Default: every wrapper bound.\n *\n * 2. **Modes** (operator-facing scheduling)\n * The `detectionMode` / `audioMode` selectors decide WHEN the\n * mounted cap actually fires. `'disabled'` is the runtime-level\n * off switch — the cap stays mounted, schema present, RPCs\n * callable, but the runner / orchestrator skip the substream\n * subscriber. The other 2 modes (`'always-on'`, `'on-motion'`)\n * drive when the subscribe + analyze cycle runs.\n *\n * **AND-gate semantics**: a phase fires iff `(binding bound) AND\n * (mode != 'disabled')`. Either layer disables → cap inactive.\n * Neither layer overrides the other; the operator picks whichever\n * lever maps to their intent.\n *\n * - \"I never want SW detection on this camera\" → unbind via\n * bindings UI (extreme — also disables the cap surface).\n * - \"Pause detection for now, keep wired\" → set\n * `detectionMode = 'disabled'`. Settings still surface; no\n * substream demand.\n * - \"Detection only when motion fires\" → `detectionMode = 'on-motion'`,\n * binding stays bound.\n *\n * Profile defaults populate modes when the operator hasn't picked.\n * Bindings are bound by their wrappers' `defaultActive: true` flag,\n * unaffected by the profile.\n *\n * ─────────────────────────\n *\n * DeviceProfile — declarative defaults applied to devices that match a\n * feature predicate.\n *\n * Solves the \"battery cams shouldn't run continuous analyzers\" problem\n * (and adjacent policy questions like low-bandwidth fallback) by\n * centralising the operator-facing defaults in ONE place. The profile\n * does NOT touch capability bindings — those stay as the low-level\n * wiring escape hatch. Instead the profile drives the per-device\n * pipeline behaviour through three operator-visible \"mode\" knobs that\n * the runner / orchestrator interpret directly.\n *\n * - `motionSources` — already a per-device setting today; the profile\n * just supplies a sensible default (`['onboard']` when firmware\n * motion is available; `[]` otherwise so a battery cam with no PIR\n * and no firmware push gates everything off until the operator opts\n * into `'analyzer'` SW motion).\n *\n * - `audioMode` (NEW) — selects when the audio classifier runs:\n * `'disabled'`, `'always-on'`, `'on-motion'`. Replaces the implicit\n * \"audio runs when wrapper bound\" behaviour. Wrappers stay bound;\n * the addon reads this mode at runtime to decide whether to\n * subscribe to the audio decoded stream.\n *\n * - `detectionMode` (NEW) — selects when object detection runs:\n * `'disabled'`, `'always-on'`, `'on-motion'`. Mirrors `audioMode`\n * and replaces the legacy `priority: 'default'|'always-on'` toggle\n * with explicit semantics.\n *\n * ─── Sticky-by-construction ───────────────────────────────────────────\n *\n * Nothing in the runtime re-applies a profile. Operator changes always\n * win because the persistence layer captures them as concrete entries\n * (config blob value); the profile is consulted only when no entry\n * exists yet. If a setting is absent from the blob the resolver falls\n * back to the profile's default, then the schema's static default.\n */\nimport type { DeviceFeature } from './device-type.js'\nimport { DeviceFeature as Feature } from './device-type.js'\n\n/**\n * Match clause: the profile applies to a device iff its `features`\n * array contains `hasFeature`. Single-feature gate keeps matching\n * cheap; the profile-stack iterates in order and the first match wins.\n */\nexport interface DeviceProfileMatch {\n readonly hasFeature: DeviceFeature\n}\n\n/**\n * When-mode selector for analyzer phases (audio classification, object\n * detection). `'disabled'` keeps the addon idle; `'always-on'` runs\n * continuously; `'on-motion'` activates only when the motion-gate is\n * open (firmware motion event OR analyzer-derived motion).\n */\nexport type PipelinePhaseMode =\n | 'disabled'\n | 'always-on'\n | 'on-motion'\n\n/**\n * Operator-facing settings the profile populates at creation time +\n * resolver fallback time. These are NOT tightly bound to a single\n * config schema field — the resolver (in pipeline-orchestrator) reads\n * them when computing the runner config, and persists operator changes\n * back to the same keys via the existing per-device store.\n */\nexport interface DeviceProfileDefaults {\n /** Default `motionSources` array when the operator hasn't picked\n * one. Empty array means \"no motion source\" — useful for battery\n * cams without firmware motion (operator opts into `'analyzer'`\n * explicitly to enable SW motion). PIR-sourced motion currently\n * flows through `'onboard'` because Reolink's accessory PIRs feed\n * the parent camera's firmware motion event channel. */\n readonly motionSources?: readonly ('onboard' | 'analyzer')[]\n readonly audioMode?: PipelinePhaseMode\n readonly detectionMode?: PipelinePhaseMode\n}\n\nexport interface DeviceProfile {\n readonly id: string\n readonly label: string\n readonly when: DeviceProfileMatch\n /**\n * Default phase modes + motion-source pick. Resolver reads these\n * when no operator value is persisted; profile never overrides a\n * concrete operator choice.\n */\n readonly defaults: DeviceProfileDefaults\n /**\n * Generic settings overrides (snapshot interval, pre-buffer flag,\n * etc.). Same sticky semantics as defaults — applied on first read,\n * operator override wins. Keys are dot-paths interpreted by the\n * per-driver / per-addon config schema.\n */\n readonly settings: Readonly<Record<string, unknown>>\n}\n\n/**\n * Heuristic check — `device.features?.includes(profile.when.hasFeature)`.\n */\nexport function deviceMatchesProfile(\n features: readonly string[] | undefined,\n profile: DeviceProfile,\n): boolean {\n if (!features || features.length === 0) return false\n return features.includes(profile.when.hasFeature)\n}\n\n/**\n * Battery-operated cameras default policy. The substream stays dialed\n * only when there's something for the runner to actually process —\n * audio is off, detection only runs on motion.\n *\n * `motionSources` is NOT in the profile defaults: the orchestrator's\n * resolver already prefers `'onboard'` whenever the device exposes a\n * native motion cap (firmware-driven motion), independent of profile.\n * Battery cams without firmware motion fall back to `[]` (no source) —\n * the operator must opt into `'analyzer'` SW motion explicitly.\n *\n * Object detection on motion: when motion fires, the runner attaches\n * the substream + runs detection until the motion gate closes, then\n * releases. Firmware idle-disconnect fires shortly after, the camera\n * goes back to sleep.\n */\nexport const BATTERY_DEVICE_PROFILE: DeviceProfile = {\n id: 'battery',\n label: 'Battery-operated camera',\n when: { hasFeature: Feature.BatteryOperated },\n defaults: {\n audioMode: 'disabled',\n detectionMode: 'on-motion',\n },\n settings: {\n 'snapshot.minRefreshIntervalSec': 3600,\n 'streamBroker.preBufferEnabled': false,\n },\n}\n\n/**\n * Profile registry — order matters when multiple profiles match the\n * same device (first match wins). Today there's only one entry.\n */\nexport const DEVICE_PROFILES: readonly DeviceProfile[] = [\n BATTERY_DEVICE_PROFILE,\n]\n\n/**\n * Resolve the profile that matches a device's features, or `null` when\n * no profile matches. First-match-wins.\n */\nexport function resolveDeviceProfile(\n features: readonly string[] | undefined,\n): DeviceProfile | null {\n for (const profile of DEVICE_PROFILES) {\n if (deviceMatchesProfile(features, profile)) return profile\n }\n return null\n}\n","import { z } from 'zod'\nimport { type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n/**\n * Generic device-level status snapshot. Auto-registered by `BaseDevice`\n * for every device, regardless of provider — the kernel needs a uniform\n * cap-keyed slice for the basic device flags every consumer expects to\n * read across processes (the `online` flag in particular). Driver-specific\n * caps (`battery`, `doorbell`, …) carry their domain-specific state on\n * their own slices.\n *\n * Pattern is identical to `battery`: schema-bearing `runtimeState`,\n * empty `methods`, single change event. Reads land at\n * `runtimeState.getCapState('device-status')`; writes at\n * `runtimeState.setCapState('device-status', …)`. Cross-process\n * consumers reach the same data via the `device-state` cap router\n * (`getCapSlice({deviceId, capName: 'device-status'})`).\n */\nexport const DeviceStatusSchema = z.object({\n /**\n * Device-level liveness. Drivers flip via `markOnline(boolean)` on\n * `BaseDevice`. Provider semantics vary — RTSP aggregates broker\n * stream-health, Reolink reads firmware push events, ONVIF tracks\n * ping responses. This cap intentionally does NOT prescribe which\n * signal drives the flag.\n */\n online: z.boolean(),\n /** Ms epoch of the last `online` transition. Lets consumers tell\n * apart \"just came online\" from \"still online\". */\n lastChangedAt: z.number(),\n})\n\nexport type DeviceStatus = z.infer<typeof DeviceStatusSchema>\n\nexport const deviceStatusCapability = {\n name: 'device-status',\n scope: 'device',\n mode: 'singleton',\n methods: {},\n events: {\n /** Emitted when `online` transitions. Mirrors the semantics of\n * `battery.onStatusChanged`. */\n onStatusChanged: { data: z.object({\n deviceId: z.number(),\n status: DeviceStatusSchema,\n })},\n },\n status: {\n schema: DeviceStatusSchema,\n kind: 'push',\n },\n runtimeState: DeviceStatusSchema,\n} as const satisfies CapabilityDefinition\n\nexport type IDeviceStatusProvider = InferProvider<typeof deviceStatusCapability>\n","import { z } from 'zod'\nimport { type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n/**\n * Per-device feature/identity probe slice. Holds the runtime-resolved\n * truth about what a device CAN do — which the kernel uses to:\n * 1. Reconcile accessory children (hub-children spawn siren/floodlight/PIR\n * based on what the firmware actually advertises).\n * 2. Compute the public `features: DeviceFeature[]` array surfaced via\n * `device-manager.listAll`.\n * 3. Decide which optional caps (PTZ, intercom, doorbell, battery, …)\n * to register on the device's capability surface.\n *\n * Auto-registered by `BaseDevice` for every device. Drivers populate the\n * slice from `onProbe()` (kernel calls it once after register, before\n * accessory reconciliation). Consumers read via:\n * `runtimeState.getCapState<FeatureProbeStatus>('feature-probe')`\n *\n * `flags` is an open record so each driver carries its own keys without\n * a centralized schema bottleneck — Reolink writes `hasPtz/hasIntercom`,\n * Hikvision writes `hasSupplementalLight/hasAlarmIo`, etc.\n *\n * Replaces the older driver-local `deviceCache.has*` blob: the per-device\n * config is for operator-edited overrides + UI snapshots; runtime probe\n * results belong in runtime-state where the kernel handles persistence,\n * cross-process mirroring, and reactive updates.\n */\nexport const FeatureProbeStatusSchema = z.object({\n /**\n * Driver-specific flag bag. Each driver picks its own key names — the\n * cap deliberately does NOT enforce a closed enum here. Reolink keys:\n * `hasPtz`, `hasIntercom`, `hasDoorbell`, `hasFloodlight`, `hasSiren`,\n * `hasPirSensor`, `hasAutotrack`, `hasBattery`. Hikvision keys:\n * `hasSupplementalLight`, `lightHasWhiteLight`, `hasAlarmIo`, `hasPtz`.\n */\n flags: z.record(z.string(), z.unknown()),\n /**\n * Coarse driver-classification — lets cross-process consumers tell apart\n * cameras / battery-cams / NVRs without re-running the probe. `null`\n * before the first probe completes.\n */\n deviceType: z.string().nullable(),\n /** Camera/firmware model string. `null` when the firmware doesn't expose it. */\n model: z.string().nullable(),\n /** Channel count for NVR/Hub devices; `1` for standalone cameras; `null` pre-probe. */\n channelCount: z.number().nullable(),\n /**\n * Ms epoch of the last SUCCESSFUL probe. `0` before the first probe\n * completes — drivers' `getAccessoryChildren()` should treat zero as\n * \"probe not done yet, return empty\" so accessories aren't spawned\n * before the firmware is queried.\n */\n lastProbedAt: z.number(),\n /**\n * Framework convention: every runtime-state slice carries this for the\n * createRuntimeStateBridge stale-check helper. We keep it in sync with\n * `lastProbedAt` on every write.\n */\n lastFetchedAt: z.number(),\n})\n\nexport type FeatureProbeStatus = z.infer<typeof FeatureProbeStatusSchema>\n\nexport const featureProbeCapability = {\n name: 'feature-probe',\n scope: 'device',\n mode: 'singleton',\n methods: {},\n events: {\n /** Fires whenever a fresh probe completes (kernel-driven `reprobe()`\n * or driver-initiated re-detect after a state change). */\n onProbeChanged: { data: z.object({\n deviceId: z.number(),\n status: FeatureProbeStatusSchema,\n })},\n },\n status: {\n schema: FeatureProbeStatusSchema,\n kind: 'push',\n },\n runtimeState: FeatureProbeStatusSchema,\n} as const satisfies CapabilityDefinition\n\nexport type IFeatureProbeProvider = InferProvider<typeof featureProbeCapability>\n","/**\n * Generic types for capability definitions.\n *\n * A capability is defined with Zod schemas for methods, events, and settings.\n * TypeScript types are inferred via z.infer<> — zero duplication.\n *\n * Pattern:\n * 1. Define Zod schemas for data, methods, settings\n * 2. Export const capabilityDef = { ... } satisfies CapabilityDefinition\n * 3. Export type IProvider = InferProvider<typeof capabilityDef>\n * 4. Addon implements IProvider\n * 5. Registry auto-mounts tRPC router from definition.methods\n */\n\nimport { z } from 'zod'\nimport { DeviceType } from '../device/device-type.js'\nimport type { ConfigUISchemaWithValues } from '../interfaces/config-ui.js'\n\n// ── Method & Event Schemas ───────────────────────────────────────────\n\n/**\n * tRPC procedure kind.\n * - 'query': read-only, no side effects\n * - 'mutation': write operation, side effects\n * - 'subscription': push-based real-time stream via WebSocket\n */\nexport type CapabilityMethodKind = 'query' | 'mutation' | 'subscription'\n\n/**\n * Auth level required to call a capability method.\n * `superAdmin` was removed — every destructive op is gated by `admin`\n * (the unscoped role) which the middleware lets through unconditionally.\n */\nexport type CapabilityMethodAuth = 'public' | 'protected' | 'admin'\n\n/**\n * Access flavour for a capability method. Drives the scope-access check\n * in `protectedProcedure`. Default inferred at codegen time:\n * - `kind: 'query'` → `view`\n * - `kind: 'mutation'` → `create`\n * - name match `^(delete|remove|revoke|destroy|drop|purge|clear|reset|forget)` → `delete`\n * An explicit `access` on the method options overrides the heuristic.\n */\nexport type CapabilityMethodAccess = 'view' | 'create' | 'delete'\n\n/** Schema pair for a single capability method: input + output + routing metadata. */\nexport interface CapabilityMethodSchema<\n TInput extends z.ZodType = z.ZodType,\n TOutput extends z.ZodType = z.ZodType,\n TKind extends CapabilityMethodKind = CapabilityMethodKind,\n> {\n readonly input: TInput\n readonly output: TOutput\n /** tRPC procedure kind. Default: 'query'. */\n readonly kind: TKind\n /** Auth level. Default: 'protected'. */\n readonly auth: CapabilityMethodAuth\n /** Per-method access flavour. When unset, codegen derives it from `kind` + name heuristic. */\n readonly access?: CapabilityMethodAccess\n /** Moleculer action timeout override (ms). Overrides broker global requestTimeout for this action only. */\n readonly timeoutMs?: number\n}\n\n/** Schema for a capability event (emitted to EventBus) */\nexport interface CapabilityEventSchema<\n TData extends z.ZodType = z.ZodType,\n> {\n readonly data: TData\n}\n\n// ── Status (live readable machine-state per device) ─────────────────\n//\n// A cap can declare a `status` block describing the MACHINE-READABLE\n// snapshot of the device's current state for this capability (battery\n// percentage, PTZ position, intercom talking flag, …). When present,\n// the provider interface gains `getStatus({ deviceId })` auto-injected\n// via `InferProvider`. Distinct from `getDeviceSettingsContribution`\n// which is the UI-schema for human-editable settings.\n\nexport type CapabilityStatusKind = 'push' | 'poll' | 'command-driven'\n\nexport interface CapabilityStatusSchema<TStatus extends z.ZodType = z.ZodType> {\n readonly schema: TStatus\n /** Documentation hint on update cadence — used by the aggregator and UI. */\n readonly kind?: CapabilityStatusKind\n}\n\n// ── Declarative settings bindings ───────────────────────────────────\n//\n// A cap's `settings.bindings` spec lets the device-manager auto-derive\n// both `getDeviceSettingsContribution` (UI schema with live values) and\n// `applyDeviceSettingsPatch` (patch → cap method dispatch) without the\n// provider implementing a single line of FormBuilder code. The provider\n// only implements the imperative cap methods; the framework wires up\n// the admin-UI form from these bindings.\n\n/** Supported field kinds in settings bindings. Deliberately limited — mirror FormBuilder primitives. */\nexport type CapSettingsFieldKind = 'boolean' | 'text' | 'number' | 'select'\n\n/** Scalar (single value) binding — target a single scalar path inside `status`. */\nexport interface CapSettingsScalarBinding {\n readonly kind: 'scalar'\n /** Dot-path into `status` where the current value lives. */\n readonly statusPath: string\n /** Cap method invoked when the field changes. Must exist in `methods`. */\n readonly method: string\n /** Name of the method's input arg that receives the new value. */\n readonly valueArg: string\n readonly field: {\n readonly label: string\n readonly kind: CapSettingsFieldKind\n readonly options?: readonly string[]\n }\n /** Optional section override (default: capability name). */\n readonly sectionId?: string\n readonly sectionTitle?: string\n}\n\n/** Array binding — target an array path in `status`, render one row per item. */\nexport interface CapSettingsArrayBinding {\n readonly kind: 'array'\n /** Dot-path into `status` pointing at an array. */\n readonly statusPath: string\n /** Field on each array item used as stable id (e.g. 'id'). */\n readonly idField: string\n /** Cap method invoked on any per-item field change. */\n readonly method: string\n /** Method input arg that receives the item id (e.g. 'overlayId'). */\n readonly idArg: string\n /** Method input arg that receives the patch object. */\n readonly patchArg: string\n readonly sectionId: string\n readonly sectionTitle: string\n readonly itemFields: Readonly<Record<string, CapSettingsItemField>>\n}\n\nexport interface CapSettingsItemField {\n /** Static string or per-item resolver (runs server-side at contribution time). */\n readonly label: string | ((item: Record<string, unknown>) => string)\n readonly kind: CapSettingsFieldKind\n /** Select options — static array or per-item resolver. */\n readonly options?: readonly string[] | ((item: Record<string, unknown>) => readonly string[])\n /** Visibility predicate — hide the field for items returning false. */\n readonly when?: (item: Record<string, unknown>) => boolean\n}\n\nexport type CapSettingsBinding = CapSettingsScalarBinding | CapSettingsArrayBinding\n\nexport interface CapabilitySettingsSpec {\n readonly bindings: readonly CapSettingsBinding[]\n}\n\n// ── Capability Definition ────────────────────────────────────────────\n\n/**\n * Full definition of a capability — the single source of truth for the\n * functional contract (methods + events).\n *\n * Settings are NOT part of the capability definition — they belong to\n * the addon implementation. Each addon defines its own settings schema\n * via ICamstackAddon.getConfigSchema(), stored per-addon with optional\n * per-device overrides.\n */\nexport interface CapabilityDefinition<\n TName extends string = string,\n TMethods extends Record<string, CapabilityMethodSchema> = Record<string, CapabilityMethodSchema>,\n TEvents extends Record<string, CapabilityEventSchema> | undefined = Record<string, CapabilityEventSchema> | undefined,\n> {\n /** Unique capability name (kebab-case) */\n readonly name: TName\n /** system = global singleton/collection. device = per-device resolution. */\n readonly scope: 'system' | 'device'\n /**\n * Cardinality of active providers:\n * - `singleton` — exactly one active provider cluster-wide\n * (e.g. admin-ui, device-manager). User config can pick which addon\n * is active when multiple are registered.\n * - `collection` — every registered provider stays active\n * (e.g. decoder, notification-output).\n * - `per-node` — one active provider per node/agent. Every node that\n * hosts an addon for this cap runs its own independent provider;\n * consumers query `getProviderForNode(capName, nodeId)` instead of\n * `getSingleton(capName)`. Used for node-local probes\n * (platform-probe, metrics-provider, hwaccel-probe).\n */\n readonly mode: 'singleton' | 'collection' | 'per-node'\n /** Method definitions: name → { input, output } Zod schemas */\n readonly methods: TMethods\n /** Event definitions: name → { data } Zod schema (optional) */\n readonly events?: TEvents\n /**\n * Typed machine-readable status snapshot. When present, the provider\n * interface gains `getStatus({ deviceId })` auto-injected via\n * `InferProvider`. Consumers poll via this method or subscribe via\n * `device-manager.subscribeDeviceStatusAggregate`. Distinct from\n * `getDeviceSettingsContribution` — that serves the UI editable-form\n * schema; `status` is the live readable state.\n */\n readonly status?: CapabilityStatusSchema\n\n /**\n * Per-device runtime-state slice owned by THIS cap. Persisted across\n * restarts under `device.state[capName]`. Every provider that\n * implements the cap inherits the same shape — drivers don't\n * redeclare it, they just write through `this.runtimeState\n * .setCapState('<capName>', value)`. Examples:\n *\n * - `batteryCapability.runtimeState`: `{ percentage, charging,\n * sleeping, lastUpdated }`. A Reolink Argus, a Frigate sensor\n * proxy, an ONVIF battery cam — every provider stores the\n * same shape under `state.battery`.\n * - `ptzCapability.runtimeState`: `{ pan, tilt, zoom }`.\n *\n * Caps without runtime state (pure-RPC like `reboot`) leave this\n * undefined; setCapState refuses to write to those slices.\n */\n readonly runtimeState?: import('zod').ZodObject<import('zod').core.$ZodLooseShape>\n /**\n * Declarative settings spec. When present, the device-manager's\n * settings aggregator auto-derives the ConfigUISchema and routes\n * patches back to the referenced imperative methods. The provider\n * implements ONLY the imperative methods — no manual FormBuilder\n * contribution code. Colocated with the cap for single-source-of-\n * truth ergonomics.\n */\n readonly settings?: CapabilitySettingsSpec\n /** For `scope: 'device'` caps — allowed device types. Omit → applies to every type. */\n readonly deviceTypes?: readonly DeviceType[]\n /**\n * When `true`, every provider of this capability MUST implement the\n * device-settings contribution surface — three extra methods appearing\n * automatically on the provider interface via `InferProvider`:\n *\n * - `getDeviceSettingsContribution({ deviceId })` → schema + values\n * for the device-details page (cached, slow cadence). Returns null\n * when the provider has nothing to contribute for the given device.\n * - `getDeviceLiveContribution({ deviceId })` → readonly live data\n * (status, counters). Returns null when not applicable. Polled ~2-3s.\n * - `applyDeviceSettingsPatch({ deviceId, patch })` → single-entry\n * mutation for field values returned by `getDeviceSettingsContribution`.\n * The provider owns the storage.\n *\n * The naming is intentionally distinct from the three-level addon API\n * (`getGlobalSettings` / `getDeviceSettings` / `getAddonSettings`) to\n * avoid collisions when an addon implements both surfaces on the same\n * class. The words \"Contribution\" and \"Patch\" signal these are aggregator\n * hooks, not persistent settings accessors.\n *\n * The `device-manager` aggregator enumerates bindings for the target\n * device, picks providers whose cap has this flag, and concatenates\n * the per-provider contributions into the single aggregate consumed\n * by `deviceManager.getDeviceSettingsAggregate`.\n */\n readonly exposesDeviceSettings?: boolean\n\n /**\n * Server-internal cap — registered for in-process consumption only.\n * NOT exposed via the SDK `System` proxy and NOT exposed via the\n * generated React hooks. Use this for collection caps whose\n * contributions are aggregated by another singleton cap (for example\n * `addon-pages-source` walked by the `addon-pages` aggregator) or for\n * declarative slots (`addon-routes`, `admin-ui`, `log-destination`,\n * `restreamer`, `streaming-engine`, `webrtc`) consumed by hub\n * builtins/addons via `capabilities.getCollection()` /\n * `getSingleton()`.\n *\n * Behaviour:\n * - cap-router codegen still emits a `createCapRouter_<Cap>` so the\n * router stays available for opt-in mounting (e.g. test harnesses);\n * `trpc.router.ts` simply does not reference it.\n * - system-proxy codegen skips it — `system.<cap>` is not minted.\n * - system-hooks codegen skips it — no `use<Cap><Method>` exports.\n * - The cap is still consumable internally via\n * `ctx.capabilities.getCollection()` / `getSingleton()` from\n * inside an addon.\n *\n * Default: `false` (cap is publicly mounted and exposed on the SDK\n * surface).\n */\n readonly internal?: boolean\n\n /**\n * How the generated tRPC cap-router treats an input field named\n * `nodeId`:\n *\n * - `'routing'` (default): extract `nodeId` from the input and\n * route to that node via `createRemoteProxy`. Use when the cap\n * has a provider registered on every target node.\n *\n * - `'data'`: forward `nodeId` untouched to the local provider\n * as part of the method's input. Use when the cap has a\n * hub-centric provider that dispatches internally\n * (`broker.call('<addonId>.settings.<method>', ..., {nodeID})`).\n * `addon-settings` is the canonical example — one singleton on\n * the hub resolves `addonId` → worker nodeId by consulting the\n * cluster roster.\n */\n readonly nodeIdMode?: 'routing' | 'data'\n}\n\n/** Contract for the three methods added by `exposesDeviceSettings: true`. */\nexport interface DeviceSettingsContribution {\n readonly getDeviceSettingsContribution: (input: { readonly deviceId: number }) => Promise<ConfigUISchemaWithValues | null>\n readonly getDeviceLiveContribution: (input: { readonly deviceId: number }) => Promise<ConfigUISchemaWithValues | null>\n readonly applyDeviceSettingsPatch: (input: { readonly deviceId: number; readonly patch: Record<string, unknown> }) => Promise<{ readonly success: true }>\n}\n\n// ── DeviceSettingsContribution Zod schemas ──────────────────────────\n//\n// Zod-level counterparts to the TS interface above. Exposed so every\n// layer that walks a cap def's methods (Moleculer service factory,\n// tRPC cap-router codegen, remote-provider proxy builder) can treat\n// `exposesDeviceSettings: true` the same way it treats any other\n// method — just auto-spread these three into the methods map. The\n// interface stops being an implicit \"invisible surface\": every\n// provider of an `exposesDeviceSettings` cap exposes these three\n// actions as regular cap methods, reachable through Moleculer and\n// tRPC like everything else. No hidden in-process-only shortcuts.\n\n/**\n * Output schema shared by the contribution + live methods.\n *\n * Mirrors the `ConfigUISchemaWithValues` shape (sections[] + optional\n * tabs[]) without importing from `../interfaces/config-ui.js` — a\n * concrete-but-lenient Zod object keeps tRPC output inference happy\n * (using `z.unknown()` here collapses unrelated router branches to\n * `unknown` when the generator re-inlines the huge AppRouter type).\n *\n * `.passthrough()` on sections/fields accepts whatever FormBuilder\n * extensions the caller adds (showWhen, displayScale, …) without\n * rebuilding every time a new field kind is introduced.\n */\nconst ContributionSectionSchema = z.object({\n id: z.string(),\n title: z.string(),\n description: z.string().optional(),\n style: z.enum(['card', 'accordion']).optional(),\n defaultCollapsed: z.boolean().optional(),\n columns: z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4)]).optional(),\n tab: z.string().optional(),\n // Hoist the section into a top-level device tab (DeviceDetail\n // discovers these and renders one tab per unique `tab` id). Default\n // 'settings' keeps the section under the Config tab.\n location: z.enum(['settings', 'top-tab']).optional(),\n order: z.number().optional(),\n fields: z.array(z.any()),\n})\n\nconst ContributionTabSchema = z.object({\n id: z.string(),\n label: z.string(),\n icon: z.string(),\n order: z.number().optional(),\n})\n\nconst ContributionSchema = z.object({\n tabs: z.array(ContributionTabSchema).optional(),\n sections: z.array(ContributionSectionSchema),\n})\n\nconst ContributionOutputSchema = ContributionSchema.nullable()\n\nexport const DEVICE_SETTINGS_CONTRIBUTION_METHODS = {\n getDeviceSettingsContribution: {\n input: z.object({ deviceId: z.number() }),\n output: ContributionOutputSchema,\n kind: 'query',\n auth: 'protected',\n },\n getDeviceLiveContribution: {\n input: z.object({ deviceId: z.number() }),\n output: ContributionOutputSchema,\n kind: 'query',\n auth: 'protected',\n },\n applyDeviceSettingsPatch: {\n input: z.object({ deviceId: z.number(), patch: z.record(z.string(), z.unknown()) }),\n output: z.object({ success: z.literal(true) }),\n kind: 'mutation',\n auth: 'admin',\n },\n} as const satisfies Record<string, CapabilityMethodSchema>\n\n/**\n * Schema for the `getStatus` method auto-injected when a cap declares\n * `status`. The runtime shape of the output is the cap's own\n * `status.schema` — but at codegen time we need a concrete Zod to emit\n * a typed tRPC route, so we keep the output as `z.unknown().nullable()`\n * here and tighten it on the client side via the generated\n * `CapStatusTypeMap` (see `scripts/generate-cap-status-types.ts`).\n */\nexport const DEVICE_STATUS_METHOD = {\n getStatus: {\n input: z.object({ deviceId: z.number() }),\n output: z.unknown().nullable(),\n kind: 'query',\n auth: 'protected',\n },\n} as const satisfies Record<string, CapabilityMethodSchema>\n\n/**\n * Expand a cap def's methods map with every auto-injected method:\n * - `exposesDeviceSettings: true` → 3 contribution methods\n * - `status: {...}` → `getStatus`\n *\n * Callers walk `expandCapMethods(def)` instead of `def.methods` when\n * they need the effective runtime method surface (Moleculer actions,\n * proxy shape, tRPC router entries). The cap def stays the single\n * source of truth. Providers still declare their concrete `methods`\n * block; the expansion happens at every consumption point, so there's\n * no accidental divergence between the declared surface and what's\n * actually mounted.\n */\nexport function expandCapMethods(def: CapabilityDefinition): Record<string, CapabilityMethodSchema> {\n let out: Record<string, CapabilityMethodSchema> = def.methods\n if (def.exposesDeviceSettings) {\n out = { ...DEVICE_SETTINGS_CONTRIBUTION_METHODS, ...out }\n }\n if (def.status) {\n out = { ...DEVICE_STATUS_METHOD, ...out }\n }\n return out\n}\n\n// ── Type Inference Helpers ───────────────────────────────────────────\n\n/**\n * Infer the provider interface from a capability definition.\n *\n * All query/mutation methods return Promise<T> — this ensures consumers\n * can transparently call local or Moleculer-remote providers.\n * Providers may still implement methods as sync (return T); the Moleculer\n * action handler and tRPC router await the result either way.\n */\n/** Extract the status output type — or `never` when the cap has no status block. */\nexport type InferStatus<T extends CapabilityDefinition> =\n T extends { status: CapabilityStatusSchema<infer S> } ? z.infer<S> : never\n\n/** Contract for the `getStatus` method auto-injected when `status: {...}` is set. */\nexport interface DeviceStatusContribution<TStatus> {\n readonly getStatus: (input: { readonly deviceId: number }) => Promise<TStatus | null>\n}\n\nexport type InferProvider<T extends CapabilityDefinition> = {\n readonly [K in keyof T['methods']]: T['methods'][K] extends CapabilityMethodSchema<infer TIn, infer TOut>\n ? T['methods'][K]['kind'] extends 'subscription'\n ? (input: z.infer<TIn>, push: (value: z.infer<TOut>) => void) => (() => void) | void\n : (input: z.infer<TIn>) => Promise<z.infer<TOut>>\n : never\n} & (T['exposesDeviceSettings'] extends true ? DeviceSettingsContribution : Record<never, never>)\n & (T extends { status: CapabilityStatusSchema } ? DeviceStatusContribution<InferStatus<T>> : Record<never, never>)\n\n/**\n * Interface for native (per-device) providers — strips the\n * `DeviceSettingsContribution` surface that `exposesDeviceSettings: true`\n * bolts onto the system-level `InferProvider`.\n *\n * Native providers are registered via `DeviceContext.registerNativeCap`\n * and only serve the cap's device-scoped runtime methods for that single\n * device. They do NOT own per-device settings — those flow through the\n * addon's system-level provider's `applyDeviceSettingsPatch`, not\n * through the camera driver's native hook. Keeping the two surfaces\n * separate stops every device class (RtspCamera, OnvifCamera, …) from\n * having to stub out three unused methods.\n */\nexport type InferNativeProvider<T extends CapabilityDefinition> = {\n readonly [K in keyof T['methods']]: T['methods'][K] extends CapabilityMethodSchema<infer TIn, infer TOut>\n ? T['methods'][K]['kind'] extends 'subscription'\n ? (input: z.infer<TIn>, push: (value: z.infer<TOut>) => void) => (() => void) | void\n : (input: z.infer<TIn>) => Promise<z.infer<TOut>>\n : never\n} & (T extends { status: CapabilityStatusSchema }\n // Optional on native providers: not every driver can report status\n // (e.g. snapshot providers that only expose the fetch call). When\n // present the server-side aggregator uses it; when absent the cap's\n // status entry is reported as `null` in `getDeviceStatusAggregate`.\n ? Partial<DeviceStatusContribution<InferStatus<T>>>\n : Record<never, never>\n)\n\n/**\n * Infer event data types from a capability definition.\n * Returns a map of event name → data type.\n */\nexport type InferEvents<T extends CapabilityDefinition> =\n T['events'] extends Record<string, CapabilityEventSchema>\n ? { readonly [K in keyof T['events']]: T['events'][K] extends CapabilityEventSchema<infer TData> ? z.infer<TData> : never }\n : never\n\n/**\n * Infer the device-proxy facade interface for a device-scoped capability.\n *\n * Strips `deviceId` from every method's input so consumers of the client-side\n * proxy (bound to a specific device) don't have to pass it. The proxy layer\n * injects `deviceId` before forwarding to the tRPC/Moleculer action.\n *\n * Query/Mutation methods always return Promise<T>. Subscription methods keep\n * the push-based shape, without `deviceId` in the input payload.\n */\nexport type InferDeviceProxyCap<T extends CapabilityDefinition> = {\n readonly [K in keyof T['methods']]: T['methods'][K] extends CapabilityMethodSchema<infer TIn, infer TOut>\n ? T['methods'][K]['kind'] extends 'subscription'\n ? (input: Omit<z.infer<TIn>, 'deviceId'>, push: (value: z.infer<TOut>) => void) => (() => void) | void\n : (input: Omit<z.infer<TIn>, 'deviceId'>) => Promise<z.infer<TOut>>\n : never\n} & (T['status'] extends { schema: infer S }\n // Auto-injected `getStatus` mirrors the runtime emitted by the proxy\n // generator (see `scripts/generate-device-proxy.ts`). The schema is\n // tightened to the cap's status shape — `S` is the Zod schema, so\n // we resolve `z.infer<S>` here so consumers don't have to cast.\n ? { readonly getStatus: (input?: { deviceId?: number }) => Promise<S extends z.ZodType ? z.infer<S> | null : unknown> }\n : Record<never, never>)\n // When `exposesDeviceSettings: true`, mirror the three contribution\n // methods that `expandCapMethods()` injects at runtime + the cap-router\n // codegen surfaces. Without these here, the device-proxy codegen\n // (which textually parses the cap and includes those methods in its\n // `Pick<>` over `InferDeviceProxyCap`) hits a constraint mismatch.\n & (T['exposesDeviceSettings'] extends true\n ? {\n readonly getDeviceSettingsContribution: (input?: { deviceId?: number }) => Promise<unknown>\n readonly getDeviceLiveContribution: (input?: { deviceId?: number }) => Promise<unknown>\n readonly applyDeviceSettingsPatch: (input: { deviceId?: number; patch: Record<string, unknown> }) => Promise<{ readonly success: true }>\n }\n : Record<never, never>)\n\n/** Extract the capability name as a string literal type. */\nexport type InferName<T extends CapabilityDefinition> = T['name']\n\n/**\n * Infer the runtime-state slice TS shape from a cap definition.\n *\n * Lives inside the types package on purpose: `z.infer<>` is resolved\n * against THIS package's Zod version (built with Zod 4), so consumers\n * that resolve a different Zod major (e.g. core resolving Zod 3 from\n * the workspace root) still see the correct concrete shape — they\n * never need to call `z.infer` themselves.\n *\n * Falls back to `unknown` for caps without `runtimeState:` so call sites\n * can't accidentally narrow to `never` and lose property-access type\n * checking.\n */\nexport type InferRuntimeState<T extends CapabilityDefinition> =\n T extends { readonly runtimeState: infer R }\n ? R extends z.ZodType<infer Out>\n ? Out\n : R extends { readonly _output: infer Out }\n ? Out\n : unknown\n : unknown\n\n// ── Helpers ─────────────────────────────────────────────────────────\n\n/** Options for a capability method definition. */\nexport interface CapabilityMethodOptions<TKind extends CapabilityMethodKind = CapabilityMethodKind> {\n /** tRPC procedure kind. Default: 'query'. */\n readonly kind?: TKind\n /** Auth level. Default: 'protected'. */\n readonly auth?: CapabilityMethodAuth\n /** Per-method access flavour. When unset, codegen derives it from `kind` + name heuristic. */\n readonly access?: CapabilityMethodAccess\n /** Moleculer action timeout override (ms). Overrides broker global requestTimeout for this action only. */\n readonly timeoutMs?: number\n}\n\n/** Shorthand to define a method schema */\nexport function method<TIn extends z.ZodType, TOut extends z.ZodType, TKind extends CapabilityMethodKind = 'query'>(\n input: TIn,\n output: TOut,\n options?: CapabilityMethodOptions<TKind>,\n): CapabilityMethodSchema<TIn, TOut, TKind> {\n return {\n input,\n output,\n kind: (options?.kind ?? 'query') as TKind,\n auth: options?.auth ?? 'protected',\n ...(options?.access !== undefined ? { access: options.access } : {}),\n timeoutMs: options?.timeoutMs,\n }\n}\n\n/** Shorthand to define an event schema */\nexport function event<TData extends z.ZodType>(\n data: TData,\n): CapabilityEventSchema<TData> {\n return { data }\n}\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\n/**\n * Per-class audio metrics aggregated over a sliding window.\n */\nconst AudioClassSummarySchema = z.object({\n className: z.string(),\n /** Number of windows (chunks) where this class was the top hit. */\n hits: z.number().int().nonnegative(),\n /** Mean score across those hits, clamped to [0,1]. */\n avgScore: z.number().min(0).max(1),\n /** Peak score in the window. */\n peakScore: z.number().min(0).max(1),\n})\n\n/**\n * Per-camera audio metrics snapshot — emitted by the analytics frame\n * handler on every `pipeline.audio-inference-result` event and\n * mirrored into the `audio-metrics` device-state slice. Symmetric\n * with `zone-analytics` snapshots for video — every consumer\n * (admin UI panel, automations, alert rules) reads via the\n * canonical `device.state.audioMetrics.value` reactive handle.\n *\n * Aggregates are computed over a rolling `windowSec` window\n * (default 60s). Past that window, classes drop out of `byClass`\n * and the level history shifts forward.\n */\nconst AudioMetricsSnapshotSchema = z.object({\n /** Wall-clock timestamp (ms) of the most recent audio window. */\n ts: z.number().int(),\n /** Sliding-window length (seconds) used for aggregation. */\n windowSec: z.number().int().positive(),\n /** Latest level reading from the most recent window. */\n level: z.object({\n rms: z.number(),\n dbfs: z.number(),\n }),\n /** Peak dBFS observed across the rolling window. */\n peakDbfs: z.number(),\n /** Mean dBFS across the rolling window. */\n avgDbfs: z.number(),\n /** Most recent above-threshold classification, or null on silence. */\n current: z.object({\n className: z.string(),\n score: z.number().min(0).max(1),\n timestamp: z.number().int(),\n }).nullable(),\n /** Per-class summary across the rolling window — keys are\n * `macroClass` strings (e.g. `dog_bark`, `speech`, `glass_break`). */\n byClass: z.array(AudioClassSummarySchema).readonly(),\n})\nexport type AudioMetricsSnapshot = z.infer<typeof AudioMetricsSnapshotSchema>\nexport type AudioClassSummary = z.infer<typeof AudioClassSummarySchema>\n\n/**\n * One sample on the audio-metrics history time-series. Captures the\n * subset of the live snapshot useful for charting: dB level, peak/avg\n * over the rolling window, and the dominant above-threshold class\n * (when any). Per-class hit breakdown lives on the snapshot but is\n * elided from the history sample to keep the buffer compact —\n * consumers needing class drill-down should pull `getCurrentSnapshot`.\n */\nconst AudioMetricsHistoryPointSchema = z.object({\n /** Wall-clock ms when this sample was recorded. */\n ts: z.number().int(),\n /** Instantaneous dBFS level at sample time. `null` for windows where\n * the source had no level reading (rare; happens at decode startup). */\n dbfs: z.number().nullable(),\n /** Rolling-window peak dBFS at sample time. Same window the live\n * snapshot reports. */\n peakDbfs: z.number(),\n /** Rolling-window mean dBFS at sample time. */\n avgDbfs: z.number(),\n /** Dominant above-threshold class at sample time, or null on silence. */\n topClass: z.string().nullable(),\n /** Score of the dominant class (`null` whenever `topClass` is null). */\n topScore: z.number().min(0).max(1).nullable(),\n})\nexport type AudioMetricsHistoryPoint = z.infer<typeof AudioMetricsHistoryPointSchema>\n\n/**\n * Audio-metrics history payload — a series of `AudioMetricsHistoryPoint`\n * samples capped at `maxPoints` (default 1024). When the requested\n * `windowSec / sampleEveryMs` would exceed the cap, the provider\n * subsamples by bucketed averaging and reports the effective sample\n * spacing on `effectiveSampleEveryMs` so the UI can label the x-axis.\n */\nconst AudioMetricsHistorySchema = z.object({\n points: z.array(AudioMetricsHistoryPointSchema).readonly(),\n /** Actual ms between adjacent samples after any subsampling. */\n effectiveSampleEveryMs: z.number().int().positive(),\n /** Wall-clock window covered by `points` (`points[N-1].ts - points[0].ts`),\n * or `0` when there's fewer than 2 samples. */\n windowMsActual: z.number().int().nonnegative(),\n})\nexport type AudioMetricsHistory = z.infer<typeof AudioMetricsHistorySchema>\n\n/**\n * Audio Metrics capability — sliding-window aggregates over the\n * pipeline audio inference results. Hosted by `addon-pipeline-analytics`\n * (same addon that owns `zone-analytics`); the runtime-state slice\n * gives operators a live read on dB level + dominant classes without\n * a custom event subscription.\n */\nexport const audioMetricsCapability = {\n name: 'audio-metrics',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera],\n methods: {\n /** Latest snapshot for this device. Null until the analytics\n * pipeline has processed at least one audio window. */\n getCurrentSnapshot: method(\n z.object({ deviceId: z.number() }),\n AudioMetricsSnapshotSchema.nullable(),\n ),\n /**\n * Time-series view of recent audio-metrics samples. The provider\n * keeps an in-memory ring of ~1Hz samples (matching the slice-\n * write rate) capped at `MAX_HISTORY_POINTS_KEPT` (provider-side).\n * `windowSec` selects how far back to read; `sampleEveryMs`\n * downsamples by bucketed averaging when finer than the kept\n * granularity. Empty `points` array on freshly-booted providers\n * with no audio yet — same convention as `getCurrentSnapshot`.\n */\n getHistory: method(\n z.object({\n deviceId: z.number(),\n /** History window in seconds. Default 300 (5 minutes).\n * Provider clamps to its retention cap if larger. */\n windowSec: z.number().int().positive().optional(),\n /** Target sample interval in ms. Default 1000 (1 sample/second).\n * Provider clamps to natural sample rate if smaller, and\n * bucket-averages when bigger than the requested window\n * would produce more than `maxPoints` samples. */\n sampleEveryMs: z.number().int().positive().optional(),\n }),\n AudioMetricsHistorySchema,\n ),\n },\n /** Reactive runtime-state mirror — live `device.state.audioMetrics.value`. */\n runtimeState: AudioMetricsSnapshotSchema,\n} as const satisfies CapabilityDefinition\n\nexport type IAudioMetricsProvider = InferProvider<typeof audioMetricsCapability>\n\nexport {\n AudioMetricsSnapshotSchema,\n AudioClassSummarySchema,\n AudioMetricsHistoryPointSchema,\n AudioMetricsHistorySchema,\n}\n","import { z } from 'zod'\nimport { type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\n/**\n * Battery status snapshot. Emitted by providers whose device is\n * battery-operated (cameras with `DeviceFeature.BatteryOperated`,\n * future sensor/button accessories). Consumers build their own \"low\n * battery\" alerting on top — the cap deliberately does NOT enforce a\n * threshold.\n */\nexport const BatteryStatusSchema = z.object({\n /** 0..100 inclusive. Firmware-reported. */\n percentage: z.number().min(0).max(100),\n /**\n * Charging source. `'dc'` covers wall/USB adapters; `'solar'` is\n * Reolink-specific for the Solar Panel 2 accessory (will become\n * common on other battery cams). `'none'` means running on battery\n * alone.\n */\n charging: z.enum(['dc', 'solar', 'none']),\n /**\n * True when the camera firmware has gone into low-power mode. Battery\n * providers MUST avoid polling during sleep — reading the battery\n * wakes the camera up and drains charge.\n */\n sleeping: z.boolean(),\n /** Ms epoch of the last observation. Lets consumers reason about freshness. */\n lastUpdated: z.number(),\n})\n\nexport type BatteryStatus = z.infer<typeof BatteryStatusSchema>\n\nexport const batteryCapability = {\n name: 'battery',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch],\n methods: {},\n events: {\n /**\n * Emitted whenever the cached status changes (firmware push OR\n * poll observes a delta). The DeviceEventPropagator mirrors this\n * event on the parent chain — subscribing to a camera's source\n * receives battery events from child accessories automatically.\n */\n onStatusChanged: { data: z.object({\n deviceId: z.number(),\n status: BatteryStatusSchema,\n })},\n },\n status: {\n schema: BatteryStatusSchema,\n kind: 'push',\n },\n /**\n * Runtime-state slice — every provider that registers this cap\n * stores the same shape under `device.runtimeState[battery]`.\n * Cross-provider uniformity: a Reolink Argus, a Frigate sensor\n * proxy, an ONVIF battery cam all read/write the same keys.\n * Consumers (BatteryBadge, snapshot wrapper sleep gate) read once\n * via `device.runtimeState.getCapState('battery')` regardless of\n * the underlying driver.\n */\n runtimeState: BatteryStatusSchema,\n} as const satisfies CapabilityDefinition\n\nexport type IBatteryProvider = InferProvider<typeof batteryCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\n/**\n * Dimmable-light brightness control. Co-exists with `switch` on the\n * same device — the switch toggles on/off, this cap sets the level\n * applied when the light is on. Modeled after Scrypted's `Brightness`\n * interface so drivers can map their per-vendor dim controls cleanly.\n *\n * The cap is intentionally minimal: a single `setBrightness({deviceId,\n * percentage})` mutation plus the auto-injected `getStatus`. Drivers\n * that expose richer controls (color temperature, scenes, schedules)\n * should surface those via the device's `getSettingsUISchema()`\n * instead of bloating this cap.\n */\nexport const BrightnessStatusSchema = z.object({\n /** Current level as 0..100 inclusive. Firmware-reported. */\n percentage: z.number().min(0).max(100),\n /** Ms epoch of the last operator-driven change. Useful for UI freshness. */\n lastChangedAt: z.number(),\n})\n\nexport type BrightnessStatus = z.infer<typeof BrightnessStatusSchema>\n\nexport const brightnessCapability = {\n name: 'brightness',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Light],\n methods: {\n setBrightness: method(\n z.object({\n deviceId: z.number().int().nonnegative(),\n percentage: z.number().min(0).max(100),\n }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n events: {\n /**\n * Emitted whenever the brightness changes — operator action OR\n * firmware push. Subscribers (UI sliders, automation engines) react\n * without polling.\n */\n onBrightnessChanged: { data: z.object({\n deviceId: z.number(),\n percentage: z.number().min(0).max(100),\n lastChangedAt: z.number(),\n })},\n },\n status: {\n schema: BrightnessStatusSchema,\n kind: 'command-driven',\n },\n /**\n * Runtime-state slice — the last applied brightness level, mirrored\n * by the kernel. Read via `device.state.brightness.value` so UI\n * sliders surface the current level without polling the provider.\n */\n runtimeState: BrightnessStatusSchema,\n} as const satisfies CapabilityDefinition\n\nexport type IBrightnessProvider = InferProvider<typeof brightnessCapability>\n","/** Shared Zod schemas used across streaming capabilities. */\n\nimport { z } from 'zod'\n\n// ── Broker profile slots ─────────────────────────────────────────────\n//\n// Camstack supports at most 3 system-wide quality profiles per device:\n// `high`, `mid`, `low`. Valid combinations: {high,mid,low}, {high,low},\n// {mid}. Every consumer (WebRTC, recording, pipeline, detection, frame\n// transport) addresses a device's stream via `${deviceId}/${profile}`;\n// the camera's physical cam-stream ids never leak past the broker.\n\nexport const CamProfileSchema = z.enum(['high', 'mid', 'low'])\nexport type CamProfile = z.infer<typeof CamProfileSchema>\n\n/** Canonical ordering. Hard-coded; never sorted. */\nexport const CAM_PROFILE_ORDER = ['high', 'mid', 'low'] as const\n\n// ── Published cam stream (broker-owned registry) ─────────────────────\n//\n// A camera's physical stream, published to the broker via\n// `streamBroker.publishCameraStream(...)`. The provider owns the\n// lifecycle (re-publishes on boot, retracts on removal). The broker\n// owns the registry: each entry is the pool of options an operator or\n// addon can assign to a profile slot.\n//\n// Two kinds:\n// - `pull-*`: the broker dials the URL (RTSP / RTMP / HTTP).\n// - `push-annexb`: the provider emits Annex-B packets. The broker\n// signals demand via `stream-broker.onCamStreamDemand` events so\n// push-capable cams (e.g. Reolink Baichuan) only wake when a\n// profile is actively consuming them.\n\nexport const CamStreamKindSchema = z.enum([\n 'pull-rtsp',\n 'pull-rtmp',\n 'pull-http',\n 'pull-rfc4571',\n 'push-annexb',\n])\nexport type CamStreamKind = z.infer<typeof CamStreamKindSchema>\n\nexport const CamStreamResolutionSchema = z.object({\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n})\n\nexport const CameraStreamSchema = z.object({\n /** Stable, provider-assigned id unique within the (deviceId) scope. */\n camStreamId: z.string().min(1),\n deviceId: z.number().int().nonnegative(),\n kind: CamStreamKindSchema,\n /** Required for pull-* kinds. Ignored for push-annexb. */\n url: z.string().optional(),\n codec: z.string().optional(),\n resolution: CamStreamResolutionSchema.optional(),\n fps: z.number().positive().optional(),\n /** Human label surfaced in the Admin UI \"Camera Stream\" dropdown. */\n label: z.string().optional(),\n /**\n * Device-level features the publisher advertised (e.g. `battery-operated`).\n * The broker, snapshot orchestrator, and prebuffer manager all consult\n * this list to derive policy — relaxed stall watchdog for battery\n * cams, prebuffer off by default, longer snapshot rate-limit, etc.\n *\n * Single source of truth replacing per-stream flags like the\n * historical `allowStall`: if the publisher knows the camera is\n * battery-powered, every downstream service derives the right policy\n * from this list.\n */\n deviceFeatures: z.array(z.string()).optional(),\n /**\n * Whether this stream participates in the broker's automatic profile\n * assignment (`computeInitialAssignment`). Defaults to `true`. Publishers\n * use `false` when they want a stream to be SELECTABLE in the UI but not\n * picked by default — e.g. Reolink publishes its native Baichuan streams\n * as `autoEligible: true` (the recommended path) and its RTSP / RTMP\n * mirrors as `autoEligible: false` (still pickable per slot, just not\n * the auto choice). Manual `assignProfile` calls remain valid for\n * non-eligible streams.\n */\n autoEligible: z.boolean().optional(),\n /**\n * Transport-specific opaque metadata. The broker passes it through to\n * the source reader without inspecting it. Currently used by\n * `pull-rfc4571` streams to carry the upstream SDP (so the reader can\n * route RTP packets to the right depacketizer without an in-band\n * DESCRIBE phase). Other kinds typically leave it undefined.\n */\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\nexport type CameraStream = z.infer<typeof CameraStreamSchema>\n\n// ── Profile slot view ────────────────────────────────────────────────\n//\n// Returned by the broker's `listAllProfileSlots` / the device-scoped\n// `camera-streams.getBrokerStreams`. Describes one of the up-to-3\n// system profile slots for a device: which cam stream is its source,\n// runtime status, and public addressing info.\n\nexport const ProfileSlotStatusSchema = z.enum([\n 'unassigned',\n 'idle',\n 'connecting',\n 'streaming',\n 'error',\n])\nexport type ProfileSlotStatus = z.infer<typeof ProfileSlotStatusSchema>\n\nexport const ProfileSlotSchema = z.object({\n deviceId: z.number().int().nonnegative(),\n profile: CamProfileSchema,\n /** Broker id the rest of the system addresses: `${deviceId}/${profile}`. */\n brokerId: z.string(),\n /** `null` when the profile is unassigned. */\n sourceCamStreamId: z.string().nullable(),\n status: ProfileSlotStatusSchema,\n resolution: CamStreamResolutionSchema.optional(),\n codec: z.string().optional(),\n preBufferSec: z.number().nonnegative().optional(),\n errorMessage: z.string().optional(),\n})\nexport type ProfileSlot = z.infer<typeof ProfileSlotSchema>\n\n/**\n * Zod schema for StreamSourceEntry — the canonical stream descriptor\n * exposed by ICameraDevice.getStreamSources() and consumed by the broker.\n */\nexport const StreamSourceEntrySchema = z.object({\n id: z.string(),\n label: z.string(),\n protocol: z.enum(['rtsp', 'rtmp', 'annexb', 'http-mjpeg', 'webrtc', 'custom']),\n url: z.string().optional(),\n resolution: z.object({ width: z.number(), height: z.number() }).readonly().optional(),\n fps: z.number().optional(),\n bitrate: z.number().optional(),\n codec: z.string().optional(),\n profileHint: z.enum(['high', 'mid', 'low']).optional(),\n})\n\nexport const StreamSourceSchema = z.object({\n type: z.string(),\n url: z.string(),\n videoCodec: z.string().optional(),\n audioCodec: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).readonly().optional(),\n})\n\nexport const EncodedPacketSchema = z.object({\n type: z.enum(['video', 'audio']),\n data: z.instanceof(Uint8Array),\n pts: z.number(),\n dts: z.number(),\n keyframe: z.boolean(),\n codec: z.string(),\n})\n\nexport const DecodedFrameSchema = z.object({\n data: z.instanceof(Uint8Array),\n width: z.number(),\n height: z.number(),\n format: z.enum(['jpeg', 'rgb', 'bgr', 'yuv420', 'gray']),\n timestamp: z.number(),\n})\n\nexport const BrokerStatusSchema = z.enum(['idle', 'connecting', 'streaming', 'error', 'stopped'])\n\nexport const BrokerStatsSchema = z.object({\n status: BrokerStatusSchema,\n inputFps: z.number(),\n decodeFps: z.number(),\n encodedSubscribers: z.number(),\n decodedSubscribers: z.number(),\n uptimeMs: z.number(),\n bitrateKbps: z.number(),\n idrIntervalMs: z.number(),\n codec: z.string().optional(),\n totalBytes: z.number(),\n packetCount: z.number(),\n rtspClients: z.number(),\n pipeClients: z.number(),\n preBufferSec: z.number(),\n preBufferMs: z.number(),\n preBufferPackets: z.number(),\n /**\n * Moleculer node id of the decoder provider currently servicing this\n * stream's decoded subscribers. `null` until the deferred decoder is\n * created (no decoded clients yet, or codec not detected). Surfaces the\n * runtime decoder placement so the UI can show \"Decoder: <agent>\" without\n * a separate cap call per broker.\n */\n decoderNodeId: z.string().nullable(),\n /**\n * Detected audio track parameters from the RTSP DESCRIBE / SDP. `null`\n * when the stream has no audio track or the broker is in cold start.\n * `supported = false` means the codec was detected but the local\n * decoder pipeline cannot produce PCM chunks (e.g. AAC without the\n * AAC pipeline wired). Surfaced in the UI device-overview so operators\n * can pre-pick the audio-analysis model that matches the codec.\n */\n audio: z.object({\n codec: z.string(),\n sampleRate: z.number(),\n channels: z.number(),\n supported: z.boolean(),\n }).nullable().optional(),\n})\n\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\nconst StreamFormatSchema = z.enum(['webrtc', 'hls', 'mjpeg', 'rtsp'])\n\nconst StreamInfoSchema = z.object({\n streamId: z.string(),\n format: StreamFormatSchema,\n url: z.string().nullable(),\n active: z.boolean(),\n})\n\nexport const streamingEngineCapability = {\n name: 'streaming-engine',\n scope: 'system',\n mode: 'singleton',\n internal: true,\n methods: {\n registerStream: method(\n z.object({ streamId: z.string(), sourceUrl: z.string(), codec: z.string().optional() }),\n z.void(),\n { kind: 'mutation' },\n ),\n unregisterStream: method(z.object({ streamId: z.string() }), z.void(), { kind: 'mutation' }),\n getStreamUrl: method(\n z.object({ streamId: z.string(), format: StreamFormatSchema }),\n z.string().nullable(),\n ),\n listStreams: method(z.void(), z.array(StreamInfoSchema)),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IStreamingEngineProvider = InferProvider<typeof streamingEngineCapability>\n\nexport { StreamFormatSchema, StreamInfoSchema }\n","import { z } from 'zod'\nimport { method, event, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport {\n CameraStreamSchema, CamStreamKindSchema, CamStreamResolutionSchema,\n CamProfileSchema, ProfileSlotSchema, BrokerStatsSchema,\n} from './schemas/streaming-shared.js'\nimport { StreamFormatSchema } from './streaming-engine.cap.js'\nimport type { IStreamBroker } from '../interfaces/stream-broker.js'\n\n/**\n * Per-broker RTSP restream entry. The broker exposes the public RTSP\n * restream URL for every active profile slot — consumers read the URL\n * here instead of constructing it from broker internals.\n */\nconst RtspRestreamEntrySchema = z.object({\n brokerId: z.string(),\n url: z.string(),\n mutedUrl: z.string(),\n enabled: z.boolean(),\n})\n\n/**\n * Individual-client shapes for the `listClients` roster. One row per\n * consumer of the chosen broker slot (profile) — RTSP sessions,\n * decoded-frame subscribers, audio chunks.\n */\nexport const BrokerRtspClientSchema = z.object({\n sessionId: z.string(),\n remoteAddr: z.string(),\n playing: z.boolean(),\n muted: z.boolean(),\n connectedAt: z.number(),\n lastRtpAt: z.number(),\n bytesSent: z.number(),\n})\n\nexport const BrokerDecodedClientSchema = z.object({\n tag: z.string(),\n subscribedAt: z.number(),\n maxFps: z.number(),\n framesDelivered: z.number(),\n framesDropped: z.number(),\n})\n\nexport const BrokerAudioClientSchema = z.object({\n tag: z.string(),\n subscribedAt: z.number(),\n chunksDelivered: z.number(),\n})\n\nexport const BrokerClientsSchema = z.object({\n rtsp: z.array(BrokerRtspClientSchema).readonly(),\n decoded: z.array(BrokerDecodedClientSchema).readonly(),\n audio: z.array(BrokerAudioClientSchema).readonly(),\n pipeClients: z.number(),\n encodedSubscribers: z.number(),\n})\n\nexport type BrokerRtspClient = z.infer<typeof BrokerRtspClientSchema>\nexport type BrokerDecodedClient = z.infer<typeof BrokerDecodedClientSchema>\nexport type BrokerAudioClient = z.infer<typeof BrokerAudioClientSchema>\nexport type BrokerClients = z.infer<typeof BrokerClientsSchema>\n\n/**\n * Reason rendered by the broker's placeholder image while no live RTP\n * is flowing. Each value maps 1:1 to a pre-encoded H.264 keyframe in\n * `addon-stream-broker/.../placeholder-frames.ts`. Keep aligned with\n * `PlaceholderKind` over there — the union here is the public surface\n * (cap input + provider type) and is the single source of truth.\n */\nexport const PlaceholderReasonSchema = z.enum([\n 'reconnecting',\n 'sleeping',\n 'offline',\n 'disabled',\n 'waking',\n])\nexport type PlaceholderReason = z.infer<typeof PlaceholderReasonSchema>\n\n/**\n * Stream broker — system-wide singleton cap.\n *\n * Owns two registries per device:\n * - `cameraStreams`: the pool of physical streams published by device\n * providers (and potentially third-party addons, e.g. an RTMP\n * discovery addon). Ephemeral: each provider re-publishes in its\n * own `onInitialize`.\n * - `profileMap`: persistent operator-intent mapping\n * `{high?, mid?, low?} -> camStreamId`. Persisted in the broker's\n * own storage, not in `device.config`.\n *\n * Up to 3 brokers per device keyed `${deviceId}/${profile}`. Each\n * broker ingests from the URL of the cam stream currently assigned via\n * `profileMap[profile]`. Changing the assignment tears down the broker\n * and rebuilds it against the new source — stream id seen by consumers\n * never changes.\n *\n * Per-device reads (what's published, what's assigned) live on the\n * device-scoped `camera-streams` cap, surfaced via `fetchDevice()`. The\n * methods below are either mutations or system-wide dumps.\n */\nexport const streamBrokerCapability = {\n name: 'stream-broker',\n scope: 'system',\n mode: 'singleton',\n exposesDeviceSettings: true,\n methods: {\n // ── Cam stream lifecycle (publish / retract) ─────────────────────\n /**\n * Register a physical camera stream as an input option. Idempotent\n * for (deviceId, camStreamId) — re-publishing updates metadata\n * without disturbing profile assignments. The provider calls this\n * in `onInitialize` for each stream it offers. Third-party addons\n * may also publish (e.g. an RTMP discovery layer) — camstack has\n * no notion of \"owner\" beyond the (deviceId, camStreamId) key.\n */\n /* — see STREAM_BROKER_CAP_EVENTS below for cap-event category strings — */\n\n publishCameraStream: method(\n z.object({\n deviceId: z.number().int().nonnegative(),\n camStreamId: z.string().min(1),\n kind: CamStreamKindSchema,\n url: z.string().optional(),\n codec: z.string().optional(),\n resolution: CamStreamResolutionSchema.optional(),\n fps: z.number().positive().optional(),\n label: z.string().optional(),\n /**\n * Device-level features that the broker / manager / snapshot\n * orchestrator consult to derive per-stream policy (e.g.\n * `BatteryOperated` → relax stall watchdog, default pre-buffer\n * to off, raise snapshot rate-limit). Single source of truth —\n * publishers no longer set per-stream flags like `allowStall`.\n */\n deviceFeatures: z.array(z.string()).optional(),\n /**\n * Whether this stream participates in the broker's automatic\n * profile assignment. Defaults `true`. Publishers set `false` for\n * streams that should be SELECTABLE but not auto-picked — e.g.\n * Reolink publishes native Baichuan as eligible and RTSP/RTMP\n * mirrors as ineligible (still assignable manually via\n * `assignProfile`).\n */\n autoEligible: z.boolean().optional(),\n /**\n * Transport-specific opaque metadata stashed alongside the stream\n * record. `pull-rfc4571` publishers put the SDP here so the broker\n * reader can route packets without an in-band DESCRIBE phase.\n */\n metadata: z.record(z.string(), z.unknown()).optional(),\n }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n retractCameraStream: method(\n z.object({\n deviceId: z.number().int().nonnegative(),\n camStreamId: z.string().min(1),\n }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n // ── Profile assignment ───────────────────────────────────────────\n /**\n * Assign a cam stream to a profile slot. Tears down any existing\n * broker for that slot and rebuilds against the new source. Persists\n * the choice — survives reboots.\n */\n assignProfile: method(\n z.object({\n deviceId: z.number().int().nonnegative(),\n profile: CamProfileSchema,\n camStreamId: z.string().min(1),\n }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n unassignProfile: method(\n z.object({\n deviceId: z.number().int().nonnegative(),\n profile: CamProfileSchema,\n }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n // ── System-wide views ────────────────────────────────────────────\n /**\n * Full dump of every published cam stream across every device.\n * For dashboards and cross-device tooling; per-device reads go\n * through the `camera-streams` cap on the device proxy.\n */\n listAllCameraStreams: method(\n z.void(),\n z.array(CameraStreamSchema).readonly(),\n ),\n listAllProfileSlots: method(\n z.void(),\n z.array(ProfileSlotSchema).readonly(),\n ),\n\n // ── Broker runtime (stats + client inventory) ────────────────────\n getBrokerStats: method(\n z.object({ brokerId: z.string() }),\n BrokerStatsSchema,\n ),\n listClients: method(\n z.object({ brokerId: z.string() }),\n BrokerClientsSchema,\n ),\n killClient: method(\n z.object({\n brokerId: z.string(),\n channel: z.enum(['rtsp', 'decoded', 'audio']),\n handle: z.string(),\n }),\n z.object({ killed: z.boolean() }),\n { kind: 'mutation', auth: 'admin' },\n ),\n /** Rebuild the broker for a profile slot in place (re-dial source). */\n restartProfile: method(\n z.object({\n deviceId: z.number().int().nonnegative(),\n profile: CamProfileSchema,\n }),\n z.object({ success: z.boolean() }),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n // ── Stream URLs ──────────────────────────────────────────────────\n getStreamUrl: method(\n z.object({ streamId: z.string(), format: StreamFormatSchema }),\n z.object({ url: z.string() }),\n ),\n\n // ── In-process broker access ─────────────────────────────────────\n /**\n * Return the live IStreamBroker instance for a given brokerId. Same\n * LOCAL-ONLY contract as before: callers (pipeline-runner) must be\n * co-located. BrokerId is `${deviceId}/${camStreamId}` — profile\n * lookup goes through `assignments` if a caller starts from a\n * profile.\n */\n getBroker: method(\n z.object({ brokerId: z.string() }),\n z.custom<IStreamBroker | null>(),\n ),\n\n // ── Pre-buffer ───────────────────────────────────────────────────\n setPreBufferDuration: method(\n z.object({ brokerId: z.string(), seconds: z.number().min(0).max(30) }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n getPreBufferInfo: method(\n z.object({ brokerId: z.string() }),\n z.object({ configuredSec: z.number(), bufferedMs: z.number(), packetCount: z.number() }),\n ),\n\n // ── RTSP restream ────────────────────────────────────────────────\n getRtspPort: method(z.void(), z.number()),\n getAllRtspEntries: method(\n z.object({ hostname: z.string().optional() }),\n z.array(RtspRestreamEntrySchema).readonly(),\n ),\n getRtspEntry: method(\n z.object({ brokerId: z.string(), hostname: z.string().optional() }),\n RtspRestreamEntrySchema.nullable(),\n ),\n regenerateRtspToken: method(\n z.object({ brokerId: z.string() }),\n z.string().nullable(),\n { kind: 'mutation', auth: 'admin' },\n ),\n setRtspEnabled: method(\n z.object({ brokerId: z.string(), enabled: z.boolean() }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n isRtspEnabled: method(\n z.object({ brokerId: z.string() }),\n z.boolean(),\n ),\n },\n events: {\n /**\n * Emitted when a profile starts consuming a push-kind cam stream.\n * Push-kind providers (e.g. Reolink Baichuan native streams)\n * subscribe and begin emitting packets only on demand — battery\n * cams stay asleep until someone actually watches.\n */\n onCamStreamDemand: event(z.object({\n deviceId: z.number().int().nonnegative(),\n camStreamId: z.string(),\n profile: CamProfileSchema,\n })),\n /**\n * Emitted when the last profile consuming a push-kind cam stream\n * releases it. Providers tear down upstream connections on this\n * signal.\n */\n onCamStreamIdle: event(z.object({\n deviceId: z.number().int().nonnegative(),\n camStreamId: z.string(),\n })),\n /**\n * Emitted by a broker that failed to dial a managed-loopback\n * source (today: `pull-rfc4571`). The publisher's transport (e.g.\n * the Reolink lib's RFC 4571 TCP server) idle-tears-down after\n * ~15s with no clients and may rebind to a different port on\n * recreate, leaving the URL the broker has cached stale. The owning\n * camera provider re-runs its publish pipeline on receipt — that\n * call self-heals the loopback server (`ensureRfc4571Server`) and\n * `publishCameraStream` propagates the fresh URL back into the\n * broker's source resolver.\n */\n onRequestStreamSourceRefresh: event(z.object({\n deviceId: z.number().int().nonnegative(),\n camStreamId: z.string(),\n brokerId: z.string(),\n })),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IStreamBrokerProvider = InferProvider<typeof streamBrokerCapability>\n\nexport { RtspRestreamEntrySchema }\n\n/* Cap event categories live in `EventCategory` enum\n * (`StreamBrokerOnCamStreamDemand`, `StreamBrokerOnCamStreamIdle`) so\n * subscribers/emitters share typed identifiers across the cluster. */\n","import { z } from 'zod'\nimport { method, event, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\nimport { CameraStreamSchema, ProfileSlotSchema, ProfileSlotStatusSchema } from './schemas/streaming-shared.js'\nimport { RtspRestreamEntrySchema } from './stream-broker.cap.js'\n\n\n/**\n * Camera streams — device-scoped facade over the system `stream-broker`.\n *\n * Mirrors the slice of broker state relevant to a single device:\n * - `getCameraStreams()`: the pool of physical streams published for\n * this device. UI uses it to populate the \"Camera Stream\" dropdown\n * under each quality section.\n * - `getBrokerStreams()`: the (up to 3) profile slots `high/mid/low`\n * with their current assignment + runtime status. UI uses it for\n * the WebRTC quality picker, recording target selection, etc.\n *\n * Registered for every camera device that has at least one published\n * cam stream. The provider is owned by the stream-broker addon; reads\n * go against the broker's in-memory registries. Mutations (assign /\n * unassign / publish / retract) do NOT live here — they stay on the\n * system `stream-broker` cap so cross-device / addon-driven flows keep\n * a single namespace.\n */\nexport const cameraStreamsCapability = {\n name: 'camera-streams',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera],\n methods: {\n getCameraStreams: method(\n z.object({ deviceId: z.number().int().nonnegative() }),\n z.array(CameraStreamSchema).readonly(),\n ),\n getBrokerStreams: method(\n z.object({ deviceId: z.number().int().nonnegative() }),\n z.array(ProfileSlotSchema).readonly(),\n ),\n /**\n * Per-device RTSP restream entries. Returns the broker's published\n * RTSP URLs (one per `${deviceId}/${profile}`) for THIS device only,\n * including the rendered `url` field with the RTSP token applied.\n * Consumers (snapshot wrapper, recording, external probes) use this\n * to pick a stream URL without scanning the whole cluster.\n *\n * The system `stream-broker.getAllRtspEntries({hostname?})` still\n * exists for whole-cluster use cases (admin dashboard, settings\n * exports). This device-scoped accessor is the supported handle for\n * code that already has a `deviceId` in hand — keeps device-keyed\n * filtering server-side and rides the DeviceProxy auto-injection.\n */\n getRtspEntries: method(\n z.object({\n deviceId: z.number().int().nonnegative(),\n /** Override hostname embedded in returned URLs. Defaults to the broker's bound address. */\n hostname: z.string().optional(),\n }),\n z.array(RtspRestreamEntrySchema).readonly(),\n ),\n },\n events: {\n /** Fires on publishCameraStream / retractCameraStream. */\n onCamStreamsChanged: event(z.object({\n deviceId: z.number().int().nonnegative(),\n camStreams: z.array(CameraStreamSchema).readonly(),\n })),\n /** Fires on assignProfile / unassignProfile / runtime status change. */\n onProfileSlotsChanged: event(z.object({\n deviceId: z.number().int().nonnegative(),\n profileSlots: z.array(ProfileSlotSchema).readonly(),\n })),\n },\n /**\n * Per-device live stream-broker state. Persistent settings (RTSP\n * tokens, profile assignments, pre-buffer config, RTSP-enabled toggles,\n * streamingDebug) stay in the broker's addon store — they survive\n * restarts. The slice below carries ONLY what's truly runtime:\n *\n * - `online` — at least one profile slot is currently `'streaming'`.\n * Drivers without a firmware liveness signal (RTSP, ONVIF…) can\n * subscribe and mirror this into `state.deviceStatus.online`.\n * - `slotStatuses` — current `ProfileSlotStatus` per profile,\n * mirroring the runtime-mutable subset of `ProfileSlot`.\n * - `slotErrors` — last error message per profile (only set when the\n * corresponding slot is in `'error'`).\n * - `lastChangedAt` — freshness signal for consumers that want to\n * reason about how stale the slice is.\n *\n * Written by the stream-broker manager on every transition that\n * affects these aggregates. Read via `device.state.cameraStreams.<field>`\n * (BaseDevice proxy) or, cross-process, via\n * `device-state.getCapSlice({deviceId, capName: 'camera-streams'})`.\n * The cap's `onChanged` event fires automatically on each write so\n * subscribers get push semantics for free.\n */\n runtimeState: z.object({\n online: z.boolean(),\n slotStatuses: z.object({\n high: ProfileSlotStatusSchema.optional(),\n mid: ProfileSlotStatusSchema.optional(),\n low: ProfileSlotStatusSchema.optional(),\n }),\n slotErrors: z.object({\n high: z.string().optional(),\n mid: z.string().optional(),\n low: z.string().optional(),\n }),\n lastChangedAt: z.number(),\n }),\n} as const satisfies CapabilityDefinition\n\nexport type ICameraStreamsProvider = InferProvider<typeof cameraStreamsCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider, type InferNativeProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\n/**\n * device-discovery — device-scoped capability for parents that host /\n * enumerate child devices (Reolink Hub / NVR, ONVIF gateway, future\n * integrations). Mirrors Scrypted's `DeviceDiscovery` interface\n * (`scrypted-reolink-native/src/nvr.ts:42-44`): the parent advertises\n * a list of discoverable children, and the operator promotes a subset\n * to real devices via `adoptDevice`. Child lifecycle (kernel device\n * create/remove, parent reference) is owned by the framework so a\n * single shared `<DiscoveryPanel />` can drive any integration.\n *\n * Boundaries:\n * - The cap exposes ENUMERATION + ADOPT/RELEASE only. The protocol\n * used to discover children (CGI poll, mDNS, push from hub, ...)\n * is the integration's business; results land in `runtimeState`\n * so the panel can render without a fresh round-trip.\n * - `childNativeId` is integration-defined and must be stable across\n * reboots so re-discovery doesn't duplicate adopted children.\n * - `adoptDevice` returns the new `deviceId` so the UI can navigate\n * directly to the freshly-created child's settings page.\n */\n\n/**\n * Status enum for a discovered device. Mirrors the Reolink simpleEvent\n * lifecycle (`online` / `sleeping` / `offline`) — generic enough for\n * battery cams, awake cams, and unreachable cams alike.\n */\nexport const DiscoveredChildStatusSchema = z.enum(['online', 'sleeping', 'offline', 'unknown'])\nexport type DiscoveredChildStatus = z.infer<typeof DiscoveredChildStatusSchema>\n\n/**\n * Single discovered child entry. `metadata` is integration-defined\n * but intentionally typed as a closed shape with the most-common\n * camera knobs — keeps the panel renderer dumb without forcing every\n * integration to invent a custom UI.\n */\nexport const DiscoveredChildDeviceSchema = z.object({\n /** Stable, integration-defined identifier. Mirrors Scrypted's `nativeId`. */\n childNativeId: z.string(),\n /** Friendly name as reported by the source (Reolink camera name, ONVIF profile, ...). */\n name: z.string(),\n /** DeviceType the child should be created with on adopt. */\n type: z.enum(DeviceType),\n status: DiscoveredChildStatusSchema,\n /** Free-form integration-specific metadata surfaced in the panel. */\n metadata: z.object({\n model: z.string().optional(),\n serialNumber: z.string().optional(),\n uid: z.string().optional(),\n /** Reolink: 0-based channel index inside the parent NVR/Hub. */\n rtspChannel: z.number().int().nonnegative().optional(),\n isBattery: z.boolean().optional(),\n isDoorbell: z.boolean().optional(),\n isMultifocal: z.boolean().optional(),\n }).default({}),\n /**\n * `true` when the framework already created a child device for this\n * `childNativeId` under the current parent. The panel uses it to\n * gate the Add/Remove button and surface the existing `deviceId`.\n */\n alreadyAdopted: z.boolean(),\n /** When `alreadyAdopted=true`, the framework-assigned child device id. */\n adoptedDeviceId: z.number().int().nonnegative().nullable(),\n})\nexport type DiscoveredChildDevice = z.infer<typeof DiscoveredChildDeviceSchema>\n\n/**\n * Status block — populated by the integration after each\n * `refreshDiscovery` (or push-driven update). The runtime-state slice\n * is what the panel reads via the per-device proxy; `getStatus`\n * returns the same payload via the codegen'd auto-injection.\n */\nexport const DeviceDiscoveryStatusSchema = z.object({\n discovered: z.array(DiscoveredChildDeviceSchema),\n /** Wall-clock ms of the last successful enumeration. */\n lastDiscoveryAt: z.number().int().nonnegative().nullable(),\n /** Last error surfaced from the source (rendered as a banner). */\n lastError: z.string().nullable(),\n})\nexport type DeviceDiscoveryStatus = z.infer<typeof DeviceDiscoveryStatusSchema>\n\nexport const deviceDiscoveryCapability = {\n name: 'device-discovery',\n scope: 'device',\n mode: 'singleton',\n // Hub is the canonical parent. Other integrations (gateway-style)\n // can register against the cap by also targeting their root type.\n deviceTypes: [DeviceType.Hub],\n status: {\n schema: DeviceDiscoveryStatusSchema,\n kind: 'poll',\n },\n // Mirror status into the per-device runtime-state slice so the panel\n // hydrates from the kernel cache without a round-trip on every open.\n runtimeState: DeviceDiscoveryStatusSchema.extend({\n lastFetchedAt: z.number().int().nonnegative(),\n }),\n methods: {\n /**\n * Snapshot of the current `discovered` list. Returns the\n * runtime-state cache — call `refreshDiscovery` first if a\n * fresh round-trip to the source is required.\n */\n listDiscovered: method(\n z.object({ deviceId: z.number().int().nonnegative() }),\n z.array(DiscoveredChildDeviceSchema).readonly(),\n ),\n /**\n * Force the integration to re-enumerate and update the\n * runtime-state slice. Returns the freshly-enumerated list (also\n * available via `listDiscovered` post-call).\n */\n refreshDiscovery: method(\n z.object({ deviceId: z.number().int().nonnegative() }),\n z.array(DiscoveredChildDeviceSchema).readonly(),\n { kind: 'mutation', auth: 'admin' },\n ),\n /**\n * Promote a discovered entry to a real child device. The framework\n * creates the child via `kernel.devices.create()` with\n * `parentDeviceId = parent.id` and seeds the child's config from\n * `childInitialConfig` (driver-defined; usually carries channel +\n * uid + parent reference). Returns the kernel-assigned numeric id.\n */\n adoptDevice: method(\n z.object({\n deviceId: z.number().int().nonnegative(),\n childNativeId: z.string(),\n /** Optional override for the child's display name. */\n name: z.string().optional(),\n }),\n z.object({\n deviceId: z.number().int().nonnegative(),\n stableId: z.string(),\n }),\n { kind: 'mutation', auth: 'admin' },\n ),\n /**\n * Inverse of `adoptDevice`: removes the child device from the\n * kernel registry. The discovered entry remains in the\n * enumeration (status updates resume) so the operator can re-adopt\n * it later without a fresh refresh.\n */\n releaseDevice: method(\n z.object({\n deviceId: z.number().int().nonnegative(),\n childDeviceId: z.number().int().nonnegative(),\n }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IDeviceDiscoveryProvider = InferProvider<typeof deviceDiscoveryCapability>\nexport type IDeviceDiscoveryNativeProvider = InferNativeProvider<typeof deviceDiscoveryCapability>\n","import { z } from 'zod'\nimport { type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\n/**\n * Doorbell button cap. Installed on a `DeviceType.Button` accessory\n * with `role: DeviceRole.Doorbell`. Emits an `onPressed` event every\n * time the firmware pushes a ring; status tracks the last press and\n * a pressCount since start (diagnostic).\n *\n * The DeviceEventPropagator re-emits `onPressed` on the camera parent\n * — subscribers listening at the camera level receive ring events\n * with `via[]` populated. No code on the parent needed.\n */\nexport const DoorbellStatusSchema = z.object({\n /** Ms epoch of the last press. null = never observed since this provider started. */\n lastPressedAt: z.number().nullable(),\n /** Counter since provider start. Resets on reboot. Useful for metrics/debug. */\n pressCountSinceStart: z.number(),\n})\n\nexport type DoorbellStatus = z.infer<typeof DoorbellStatusSchema>\n\nexport const DoorbellPressEventSchema = z.object({\n deviceId: z.number(),\n timestamp: z.number(),\n})\n\nexport type DoorbellPressEvent = z.infer<typeof DoorbellPressEventSchema>\n\nexport const doorbellCapability = {\n name: 'doorbell',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Button],\n methods: {},\n events: {\n /**\n * Fires once per physical press. Reolink delivers via Baichuan\n * push (`ReolinkSimpleEvent.type === 'doorbell'`). There is no\n * release/duration — it's a pulse.\n */\n onPressed: { data: DoorbellPressEventSchema },\n },\n status: {\n schema: DoorbellStatusSchema,\n kind: 'push',\n },\n /**\n * Runtime-state slice — last press timestamp + lifetime press count.\n * Mirrored by the kernel and readable via\n * `device.state.doorbell.value`. UIs can show \"last ring 5m ago\"\n * without subscribing.\n */\n runtimeState: DoorbellStatusSchema,\n} as const satisfies CapabilityDefinition\n\nexport type IDoorbellProvider = InferProvider<typeof doorbellCapability>\n","/** Shared Zod schemas used across detection capabilities. */\n\nimport { z } from 'zod'\n\n/**\n * Canonical frame-format enum mirrored on `FrameFormat` in\n * `packages/types/src/types/io.ts`. Kept inline (vs imported) so the\n * Zod runtime schema and TypeScript type stay in sync at the call site\n * — adding a new format requires changing both this enum and the\n * `FrameFormat` type alias together.\n */\nexport const FrameFormatSchema = z.enum(['jpeg', 'rgb', 'bgr', 'yuv420', 'gray'])\n\nexport const FrameInputSchema = z.object({\n data: z.custom<Uint8Array>(),\n format: FrameFormatSchema,\n width: z.number(),\n height: z.number(),\n timestamp: z.number(),\n})\n\nexport const BoundingBoxSchema = z.object({\n x: z.number(),\n y: z.number(),\n w: z.number(),\n h: z.number(),\n})\n\nexport const SpatialDetectionSchema = z.object({\n class: z.string(),\n originalClass: z.string(),\n score: z.number(),\n bbox: BoundingBoxSchema,\n})\n\nexport const AudioChunkInputSchema = z.object({\n data: z.instanceof(Float32Array),\n sampleRate: z.number(),\n channels: z.number(),\n timestamp: z.number(),\n /** Originating device id — used by the classifier for per-camera concurrency tracking. */\n deviceId: z.number().optional(),\n})\n\nexport const AudioLevelSchema = z.object({\n rms: z.number(),\n dbfs: z.number(),\n})\n\nexport const AudioClassificationLabelSchema = z.object({\n /**\n * Primary display class. Depending on how the label was produced\n * this is either the macro category (e.g. `dog`) or the raw\n * backend label (e.g. `Dog bark`). Mirrors `class` on\n * `SpatialDetection`.\n */\n className: z.string(),\n /**\n * Raw backend-native label the classifier actually emitted (e.g.\n * `Dog bark` for YAMNet, `dog_bark` for Apple SoundAnalysis). For\n * macro-aggregated entries this is the top raw contributor. Mirrors\n * `originalClass` on `SpatialDetection`.\n */\n originalClass: z.string().optional(),\n score: z.number(),\n})\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { FrameInputSchema, BoundingBoxSchema } from './schemas/detection-shared.js'\n\nconst MotionRegionSchema = z.object({\n bbox: BoundingBoxSchema,\n pixelCount: z.number(),\n intensity: z.number(),\n})\n\nconst MotionAnalysisResultSchema = z.object({\n detected: z.boolean(),\n regionCount: z.number(),\n /** Regions passing minArea filter — used for pipeline triggering. */\n regions: z.array(MotionRegionSchema).readonly(),\n /** All raw regions from CCL before minArea filter — used for UI debug overlay. */\n rawRegions: z.array(MotionRegionSchema).readonly(),\n frameWidth: z.number(),\n frameHeight: z.number(),\n analysisMs: z.number(),\n})\n\nexport const motionDetectionCapability = {\n name: 'motion-detection',\n scope: 'device',\n mode: 'singleton',\n exposesDeviceSettings: true,\n methods: {\n analyze: method(\n z.object({ deviceId: z.number(), frame: FrameInputSchema }),\n MotionAnalysisResultSchema,\n { kind: 'mutation' },\n ),\n removeCamera: method(z.object({ deviceId: z.number() }), z.void(), { kind: 'mutation' }),\n reset: method(z.void(), z.void(), { kind: 'mutation' }),\n },\n events: {\n onMotion: { data: z.object({\n deviceId: z.number(),\n detected: z.boolean(),\n regionCount: z.number(),\n })},\n },\n} as const satisfies CapabilityDefinition\n\nexport type IMotionDetectionProvider = InferProvider<typeof motionDetectionCapability>\nexport type MotionRegion = z.infer<typeof MotionRegionSchema>\nexport type MotionAnalysisResult = z.infer<typeof MotionAnalysisResultSchema>\n\nexport { MotionRegionSchema, MotionAnalysisResultSchema }\n","/** Shared Zod schemas for the runtime pipeline orchestrator metrics. */\n\nimport { z } from 'zod'\n\nexport const OrchestratorMetricsSchema = z.object({\n activeCameras: z.number(),\n throttledCameras: z.number(),\n avgInferenceTimeMs: z.number(),\n queueDepth: z.number(),\n})\n\nexport const CameraMetricsSchema = z.object({\n detectionMode: z.enum(['disabled', 'always-on', 'on-motion']),\n configuredFps: z.number(),\n actualFps: z.number(),\n queueDepth: z.number(),\n avgInferenceTimeMs: z.number(),\n droppedFrames: z.number(),\n phase: z.enum(['idle', 'watching', 'active']),\n})\n\nexport const CameraMetricsWithDeviceIdSchema = CameraMetricsSchema.extend({\n deviceId: z.number(),\n})\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { FrameInputSchema, SpatialDetectionSchema } from './schemas/detection-shared.js'\nimport type { ConfigUISchema, ConfigField } from '../interfaces/config-ui.js'\nimport type { InferenceCapabilities, ModelAvailability } from '../interfaces/inference-capabilities.js'\nimport type { PipelineConfig } from '../types/pipeline.js'\nimport type { FrameResult, AudioResult } from '../types/detection.js'\n\n// ── Engine & device ──────────────────────────────────────────────\nconst ModelFormatSchema = z.enum(['onnx', 'coreml', 'openvino', 'tflite', 'pt'])\nconst PipelineSlotSchema = z.enum(['detector', 'cropper', 'classifier', 'refiner', 'audio-classifier'])\n\nconst PipelineEngineChoiceSchema = z.object({\n runtime: z.enum(['node', 'python']),\n backend: z.string(),\n format: ModelFormatSchema,\n device: z.string().optional(),\n})\n\nconst EngineDeviceInfoSchema = z.object({\n id: z.string(),\n label: z.string(),\n description: z.string().optional(),\n})\n\nconst AvailableEngineSchema = z.object({\n engine: PipelineEngineChoiceSchema,\n devices: z.array(EngineDeviceInfoSchema).readonly(),\n defaultDevice: z.string(),\n})\n\n// ── Pipeline step (recursive) ──\n// Zod v4's `ZodType` is invariant over its `Input`/`Output` generics, so the\n// canonical `z.lazy()` recursive pattern does not type-check cleanly against\n// the full `PipelineDefaultStep` TS interface. Use a zod-inferred type\n// instead — the resulting shape is structurally identical and still fully\n// typed for callers via `z.infer<typeof PipelineDefaultStepSchema>`.\n// Phase 7 (settings redesign): removed generic `confidence: number` field.\n// Each step declares its own thresholds via `configSchema` and persists\n// them inside `settings`. The runtime executor reads\n// `StepDefinition.defaultConfidence` from the step registry as the\n// hard-coded fallback threshold.\nexport type PipelineDefaultStepOutput = {\n readonly addonId: string\n readonly addonName: string\n readonly slot: 'detector' | 'cropper' | 'classifier' | 'refiner' | 'audio-classifier'\n readonly inputClasses: readonly string[]\n readonly outputClasses: readonly string[]\n readonly enabled: boolean\n readonly modelId: string\n readonly children: readonly PipelineDefaultStepOutput[]\n readonly engine?: {\n readonly runtime: 'node' | 'python'\n readonly backend: string\n readonly format: 'onnx' | 'coreml' | 'openvino' | 'tflite' | 'pt'\n readonly device?: string\n }\n readonly group?: string\n readonly settings?: Readonly<Record<string, unknown>>\n}\n\nconst PipelineDefaultStepSchema: z.ZodType<PipelineDefaultStepOutput> = z.lazy(() =>\n z.object({\n addonId: z.string(),\n addonName: z.string(),\n slot: PipelineSlotSchema,\n inputClasses: z.array(z.string()).readonly(),\n outputClasses: z.array(z.string()).readonly(),\n enabled: z.boolean(),\n modelId: z.string(),\n children: z.array(PipelineDefaultStepSchema).readonly(),\n engine: PipelineEngineChoiceSchema.optional(),\n group: z.string().optional(),\n settings: z.record(z.string(), z.unknown()).optional(),\n }),\n)\n\n// ── PipelineTemplate step (recursive) ──\n// Phase 7: same reasoning as `PipelineDefaultStepOutput` — no generic\n// `confidence` field. Templates created before Phase 7 are migrated on\n// load by `provider.ts::loadTemplates` which strips the obsolete key.\nexport type PipelineTemplateStepOutput = {\n readonly addonId: string\n readonly enabled: boolean\n readonly modelId: string\n readonly children: readonly PipelineTemplateStepOutput[]\n readonly settings?: Readonly<Record<string, unknown>>\n}\n\nconst PipelineTemplateStepSchema: z.ZodType<PipelineTemplateStepOutput> = z.lazy(() =>\n z.object({\n addonId: z.string(),\n enabled: z.boolean(),\n modelId: z.string(),\n children: z.array(PipelineTemplateStepSchema).readonly(),\n settings: z.record(z.string(), z.unknown()).optional(),\n }),\n)\n\nconst PipelineTemplateSchema = z.object({\n id: z.string(),\n name: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n engine: PipelineEngineChoiceSchema,\n steps: z.array(PipelineTemplateStepSchema).readonly(),\n})\n\n// ── PipelineSchema (returned by getSchema) ──\nconst PipelineModelOptionSchema = z.object({\n id: z.string(),\n name: z.string(),\n formats: z.record(\n z.string(),\n z.object({ downloaded: z.boolean(), sizeMB: z.number() }),\n ),\n})\n\nconst ConfigFieldBridge = z.custom<ConfigField>()\n\nconst PipelineAddonSchemaSchema = z.object({\n id: z.string(),\n name: z.string(),\n slot: PipelineSlotSchema,\n inputClasses: z.array(z.string()).readonly(),\n outputClasses: z.array(z.string()).readonly(),\n childSlots: z.array(PipelineSlotSchema).readonly(),\n models: z.array(PipelineModelOptionSchema).readonly(),\n defaultModelId: z.string(),\n // Per-format model override. Lets an addon declare \"on `coreml` prefer\n // apple-soundanalysis, on `onnx` prefer yamnet-onnx\". The orchestrator's\n // agent-seed routine uses this to pick a modelId that matches the\n // agent's active engine format.\n defaultModelIdByFormat: z.record(z.string(), z.string()).optional(),\n // Whether a freshly-seeded agent starts with this addon `enabled: true`.\n // Absent = true. Operator-controlled after first seed.\n enabledByDefault: z.boolean().optional(),\n defaultConfidence: z.number(),\n group: z.string().optional(),\n configSchema: z.array(ConfigFieldBridge).readonly().optional(),\n})\n\nconst PipelineSlotSchemaSchema = z.object({\n id: PipelineSlotSchema,\n label: z.string(),\n priority: z.number(),\n parentSlot: PipelineSlotSchema.nullable(),\n addons: z.array(PipelineAddonSchemaSchema).readonly(),\n})\n\nconst PipelineSchemaSchema = z.object({\n availableEngines: z.array(AvailableEngineSchema).readonly(),\n selectedEngine: PipelineEngineChoiceSchema,\n slots: z.array(PipelineSlotSchemaSchema).readonly(),\n})\n\n// ── Detection / inference ──\nconst DetectorOutputSchema = z.object({\n detections: z.array(SpatialDetectionSchema).readonly(),\n inferenceMs: z.number(),\n modelId: z.string(),\n})\n\n// ── Pipeline run input (UI-facing) ──\n// Phase 7: dropped generic `confidence`. Per-step thresholds live in\n// `settings` (each step declares its own field in `configSchema`); the\n// runtime executor falls back to `StepDefinition.defaultConfidence`\n// when settings don't override.\nexport type PipelineStepInputOutput = {\n readonly addonId: string\n readonly modelId: string\n readonly enabled: boolean\n readonly children?: readonly PipelineStepInputOutput[]\n readonly settings?: Readonly<Record<string, unknown>>\n}\n\nexport const PipelineStepInputSchema: z.ZodType<PipelineStepInputOutput> = z.lazy(() =>\n z.object({\n addonId: z.string(),\n modelId: z.string(),\n enabled: z.boolean().default(true),\n children: z.array(PipelineStepInputSchema).optional(),\n settings: z.record(z.string(), z.unknown()).optional(),\n }),\n)\n\n// ── Reference media ──\nconst ReferenceImageEntrySchema = z.object({\n filename: z.string(),\n stepIds: z.array(z.string()).readonly().optional(),\n})\n\nconst ReferenceImageBodySchema = z.object({\n base64: z.string(),\n filename: z.string(),\n})\n\nconst ReferenceAudioEntrySchema = z.object({\n filename: z.string(),\n sizeKb: z.number(),\n})\n\nconst ReferenceAudioBodySchema = z.object({\n base64: z.string(),\n})\n\n// Benchmark schemas (BenchmarkInputSchema, BenchmarkResultSchema,\n// BenchmarkHistoryEntrySchema, BenchmarkHistoryEntryInputSchema,\n// BenchmarkLatencyStatsSchema, PipelineRunInputSchema) moved to\n// `@camstack/addon-benchmark/src/benchmark-schemas.ts` (2026-04-14).\n// They describe a surface that belongs to the benchmark addon, not the\n// core pipeline-executor cap. `PipelineEngineChoiceSchema` below remains\n// exported because it's still referenced by other cap methods (runPipeline\n// output, getSelectedEngine).\n\nconst AudioBackendSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string(),\n available: z.boolean(),\n /**\n * Raw classifier labels this backend can emit (e.g. YAMNet's\n * 521-class set or Apple SoundAnalysis's 303-class set). Used by\n * the benchmark UI to populate the `enabledMicroClasses` filter\n * specific to the selected backend without a separate fetch.\n */\n rawLabels: z.array(z.string()).readonly().optional(),\n})\n\nconst AudioCapabilitiesSchema = z.object({\n activeBackend: z.string(),\n availableBackends: z.array(AudioBackendSchema).readonly(),\n sampleRate: z.number(),\n chunkDurationMs: z.number(),\n})\n\n// ── Download model result ────────────────────────────────────────────\nconst DownloadModelResultSchema = z.object({\n filePath: z.string(),\n sizeMB: z.number(),\n durationMs: z.number(),\n})\n\n/**\n * Wrapper carrying a single test run's result. Replaces the legacy\n * ad-hoc `{labels: [{className, originalClass, score}]}` shape with the\n * canonical `AudioResult` from the Phase 6 output rework: one\n * `AudioDetection` per class above `minScore`, top-N candidates in\n * `debug.alternateLabels['audio-classifier']`, per-source timings in\n * `debug.stepTimings`. The outer `success`/`error` fields stay so the\n * benchmark UI can still report a clean failure when the classifier\n * cap isn't available.\n */\nconst AudioTestResultSchema = z.object({\n success: z.boolean(),\n error: z.string().optional(),\n frame: z.custom<AudioResult>().optional(),\n})\n\n// ── Typed bridges to complex TS interfaces defined in `@camstack/types` ──\n// Use `z.custom<T>()` when the target interface is a deeply-nested discriminated\n// union (ConfigUISchema) or a recursive graph (PipelineConfig, PipelineRunResult,\n// InferenceCapabilities). `z.custom<T>()` provides full TS inference on the\n// client without forcing a duplicate Zod definition that would drift from the\n// canonical TS interface. Validation is structural at the tRPC transport layer\n// and the server-side provider guarantees the shape at emission time.\nconst PipelineConfigBridge = z.custom<PipelineConfig | null>()\nconst ConfigUISchemaBridge = z.custom<ConfigUISchema>()\nconst ConfigUISchemaNullableBridge = z.custom<ConfigUISchema | null>()\nconst InferenceCapabilitiesBridge = z.custom<InferenceCapabilities>()\nconst ModelAvailabilityListBridge = z.custom<readonly ModelAvailability[]>()\nexport const PipelineRunResultBridge = z.custom<FrameResult>()\n\n/**\n * Pipeline executor — detection engine + configuration + inference API.\n *\n * Merged from: pipeline-executor, pipeline-config, inference, detection-config.\n * Implemented by the detection-pipeline addon.\n *\n * Per-device surface (DeviceSettingsContribution + the \"is detection\n * enabled for this camera?\" toggle) lives on the paired\n * `detection-pipeline` cap (device-scoped, singleton, wrapper\n * defaultActive) — same split pattern used by stream-broker /\n * camera-streams and audio-analyzer / audio-analysis.\n */\nexport const pipelineExecutorCapability = {\n name: 'pipeline-executor',\n scope: 'system',\n mode: 'singleton',\n methods: {\n // ── Engine selection ─────────────────────────────────────────────\n // `setEngine` removed in Phase 6c — the stateless-pipeline model\n // picks engine per-camera, not per-node. `getSelectedEngine` is\n // kept read-only so the benchmark + models-page can still show the\n // executor's bootstrap engine; its semantics degrade to \"what the\n // executor would pick by default\" in the stateless world.\n getAvailableEngines: method(z.void(), z.array(PipelineEngineChoiceSchema)),\n getSelectedEngine: method(z.void(), PipelineEngineChoiceSchema),\n getDefaultSteps: method(PipelineEngineChoiceSchema, z.array(PipelineDefaultStepSchema)),\n /**\n * Re-run the platform probe for the inference engine and write the\n * detected runtime / backend / device back into the addon's own\n * global settings store. Returns the engine that was picked so the\n * UI can confirm without a second round-trip. Triggers the standard\n * `requiresRestart` auto-restart flow because all three fields are\n * marked restart-required. Replaces the legacy per-agent\n * `pipeline-orchestrator.reprobeAgentHwAccel` surface for the\n * engine dimension — each addon now owns its own probe.\n */\n reprobeEngine: method(z.void(), PipelineEngineChoiceSchema, { kind: 'mutation', auth: 'admin' }),\n\n // ── Video pipeline step configuration (phase 2c) ─────────────────\n // Per-addonId config the operator tunes on the Pipeline → agent\n // page. Replaces the orchestrator's per-agent\n // `setAgentAddonDefaults` mutation. No `enabled` flag — the cap\n // binding system (wrapper caps + setWrapperActive) decides whether\n // a step runs.\n getVideoPipelineSteps: method(\n z.void(),\n z.record(z.string(), z.object({\n modelId: z.string(),\n settings: z.record(z.string(), z.unknown()).readonly(),\n })),\n ),\n setVideoPipelineSteps: method(\n z.object({\n steps: z.record(z.string(), z.object({\n modelId: z.string(),\n settings: z.record(z.string(), z.unknown()).readonly(),\n })),\n }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n // ── Global pipeline configuration ────────────────────────────────\n // `setGlobalSteps` removed in Phase 6c — there is no \"global\n // pipeline\" in the stateless model (each camera carries its own\n // steps via the orchestrator's `pipelines/<deviceId>`).\n // `getGlobalSteps` is kept read-only as a benchmark fallback;\n // it returns null in fresh stateless deploys.\n getSchema: method(z.void(), PipelineSchemaSchema),\n getGlobalSteps: method(z.void(), z.array(PipelineDefaultStepSchema).readonly().nullable()),\n getGlobalPipelineConfig: method(z.void(), PipelineConfigBridge),\n getOrchestratorConfigSchema: method(z.void(), ConfigUISchemaBridge),\n\n // ── Templates ────────────────────────────────────────────────────\n listTemplates: method(z.void(), z.array(PipelineTemplateSchema).readonly()),\n saveTemplate: method(\n z.object({\n name: z.string(),\n steps: z.array(PipelineTemplateStepSchema).readonly(),\n engine: PipelineEngineChoiceSchema,\n }),\n PipelineTemplateSchema,\n { kind: 'mutation' },\n ),\n updateTemplate: method(\n z.object({\n id: z.string(),\n name: z.string().optional(),\n steps: z.array(PipelineTemplateStepSchema).readonly().optional(),\n }),\n PipelineTemplateSchema,\n { kind: 'mutation' },\n ),\n deleteTemplate: method(z.object({ id: z.string() }), z.void(), { kind: 'mutation' }),\n\n // ── Inference / detection ────────────────────────────────────────\n getCapabilities: method(z.void(), InferenceCapabilitiesBridge),\n getAddonModels: method(z.object({ addonId: z.string() }), ModelAvailabilityListBridge),\n downloadModel: method(\n z.object({ addonId: z.string(), modelId: z.string(), format: ModelFormatSchema }),\n DownloadModelResultSchema,\n { kind: 'mutation' },\n ),\n deleteModel: method(\n z.object({ addonId: z.string(), modelId: z.string(), format: ModelFormatSchema }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation' },\n ),\n // NOTE: onDownloadProgress / onPipelineProgress removed in Fase H.4.\n // Consumers subscribe via the generic `live.onEvent` core router with\n // `{category: 'model.download.progress'}` or `{category: 'pipeline.progress'}`\n // — the event bus already handles category filtering, no dedicated\n // pipeline-executor method needed.\n detect: method(\n z.object({ addonId: z.string(), frame: FrameInputSchema, config: z.record(z.string(), z.unknown()).optional() }),\n DetectorOutputSchema,\n ),\n // `runFrame` removed in Phase 4 — runtime dispatch now goes through\n // the stateless `runPipeline({engine, steps, frame, deviceId})` path.\n // The runner hydrates `steps` from the orchestrator's attach payload\n // (`pipelines[deviceId]`), so there is no longer an executor-side\n // global \"current pipeline\" for a legacy `runFrame` call to target.\n /**\n * Stateless single-frame execution. Callers (runner, benchmark) pass\n * the complete `engine` + `steps` tree; the executor holds no state\n * about cameras or saved pipelines.\n *\n * `engine` is optional during the migration window to preserve the\n * legacy call shape used by existing benchmark code; once all\n * callers pass it explicitly we make it required.\n *\n * Exactly one of `frame`, `imageBase64`, `referenceImage` must be\n * provided:\n * - `frame`: runtime dispatch path (runner → decoded broker frame).\n * Carries the raw buffer, dimensions, and format; the executor\n * uses it directly without base64 round-tripping.\n * - `imageBase64`: one-shot test path (benchmark ImageTab).\n * - `referenceImage`: named file from the reference-image store.\n */\n runPipeline: method(\n z.object({\n engine: PipelineEngineChoiceSchema.optional(),\n steps: z.array(PipelineStepInputSchema).min(1),\n frame: FrameInputSchema.optional(),\n imageBase64: z.string().optional(),\n /**\n * Binary JPEG bytes — preferred over `imageBase64` on internal\n * hops (hub → forked worker via Moleculer MsgPack) because it\n * skips the 33% base64 overhead + the per-call base64 decode on\n * the detection-pipeline worker. Callers can pass either; exactly\n * one of `frame`/`image`/`imageBase64`/`referenceImage` is required.\n */\n image: z.instanceof(Uint8Array).optional(),\n referenceImage: z.string().optional(),\n deviceId: z.number().optional(),\n sessionId: z.string().optional(),\n }),\n PipelineRunResultBridge,\n { kind: 'mutation' },\n ),\n\n /**\n * Batched run — N raw frames packed into one cap call. The provider\n * routes the batch through `SharedInferencePool.inferBatch`\n * (`MSG_INFER_BATCH = 0x03`) so the IPC framing and JSON response\n * envelope cost is amortised N:1 vs N concurrent `runPipeline`\n * calls. Single root step + uniform model assumed; trees with crop\n * children fall back to sequential execution.\n *\n * Used by `scripts/bench-scrypted-style.mts` to mirror Scrypted's\n * `detectObjects(media, {batch})` semantics for fair comparison.\n */\n runPipelineBatch: method(\n z.object({\n engine: PipelineEngineChoiceSchema.optional(),\n steps: z.array(PipelineStepInputSchema).min(1),\n frames: z.array(FrameInputSchema).min(1).max(255),\n deviceId: z.number().optional(),\n sessionId: z.string().optional(),\n }),\n z.object({\n results: z.array(PipelineRunResultBridge).readonly(),\n }),\n { kind: 'mutation' },\n ),\n\n // ── Bench frame cache (Python pool-side) ──────────────────────────\n\n /**\n * Cache a raw frame inside the Python inference pool's memory.\n * Returns a numeric `frameId` that `inferCached` references —\n * subsequent calls send only 5 bytes through the pipe instead of\n * 1.2MB raw data, eliminating the pipe transfer bottleneck.\n */\n cacheFrameInPool: method(\n z.object({\n data: z.instanceof(Uint8Array),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n format: z.enum(['rgb', 'bgr', 'gray']),\n }),\n z.object({\n frameId: z.number(),\n width: z.number(),\n height: z.number(),\n }),\n { kind: 'mutation' },\n ),\n\n /**\n * Run inference on a previously cached frame. Sends only 5 bytes\n * (model_idx + frameId) through the IPC pipe — eliminates the\n * ~35ms per-call overhead of transferring 1.2MB raw data.\n */\n inferCached: method(\n z.object({\n stepId: z.string(),\n frameId: z.number().int(),\n }),\n z.record(z.string(), z.unknown()),\n { kind: 'mutation' },\n ),\n\n /**\n * Release a cached frame from the Python pool's memory.\n */\n uncacheFrame: method(\n z.object({ frameId: z.number().int() }),\n z.void(),\n { kind: 'mutation' },\n ),\n\n /** Returns the effective pool tuning (resolved from user overrides + backend defaults). */\n getEffectiveTuning: method(\n z.void(),\n z.object({\n batchMode: z.string(),\n windowMs: z.number(),\n maxBatchSize: z.number(),\n concurrency: z.number(),\n }),\n ),\n // ── Engine registry / management (stateless-pipeline spec) ────────\n /**\n * List every EngineFactory currently loaded in this executor's RAM,\n * with the models resident and a coarse \"in use\" marker derived from\n * ongoing inference activity. Used by the Pipeline page Engines tab.\n */\n listLoadedEngines: method(\n z.void(),\n z.array(z.object({\n engineKey: z.string(),\n engine: PipelineEngineChoiceSchema,\n modelsLoaded: z.array(z.string()).readonly(),\n inUseByCameras: z.array(z.number()).readonly(),\n /**\n * Origin of this resident factory.\n * - `runtime` — main camera-serving engine (no idle TTL).\n * - `warm-override` — benchmark/test override held in the warm\n * cache; auto-disposed after the idle TTL.\n */\n kind: z.enum(['runtime', 'warm-override']),\n /** Native pid of the underlying Python pool (null when no pool). */\n poolPid: z.number().nullable(),\n /** ms since this factory was last used (null when not warm-tracked). */\n idleMs: z.number().nullable(),\n /** Idle TTL after which `warm-override` factories self-evict (null when not applicable). */\n idleTtlMs: z.number().nullable(),\n })).readonly(),\n ),\n /** Warm up an engine without running a frame. No-op if already loaded. */\n spinEngine: method(\n z.object({ engine: PipelineEngineChoiceSchema }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n /**\n * Unload an engine from RAM. `force:true` unloads even when cameras\n * are actively using it (they re-spin on next frame). Default is\n * gated — returns `{success:false, reason}` when in use.\n */\n killEngine: method(\n z.object({\n engine: PipelineEngineChoiceSchema,\n force: z.boolean().optional(),\n }),\n z.object({ success: z.boolean(), reason: z.string().optional() }),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n // ── Benchmarks & testing ─────────────────────────────────────────\n // Moved to `@camstack/addon-benchmark` as customActions (2026-04-14).\n // The addon exposes runBenchmark / runPipelineTest / listBenchmarkHistory /\n // saveBenchmarkResult / deleteBenchmarkResult / clearBenchmarkHistory via\n // `api.addons.custom.mutate({addonId: 'benchmark', action, input})` and\n // delegates the actual pipeline execution back to this cap's runPipeline.\n\n // ── Reference media ──────────────────────────────────────────────\n listReferenceImages: method(z.void(), z.array(ReferenceImageEntrySchema).readonly()),\n getReferenceImage: method(z.object({ filename: z.string() }), ReferenceImageBodySchema.nullable()),\n getReferenceAudioFiles: method(z.void(), z.array(ReferenceAudioEntrySchema).readonly()),\n getReferenceAudio: method(z.object({ filename: z.string() }), ReferenceAudioBodySchema.nullable()),\n getAudioCapabilities: method(z.void(), AudioCapabilitiesSchema),\n runAudioTest: method(\n z.object({\n addonId: z.string(),\n modelId: z.string(),\n filename: z.string().optional(),\n // Per-step settings (e.g. `enabledClasses`) sourced from the\n // audio-classifier step's `getConfigSchema()`. The provider\n // applies them to the classification result before returning.\n settings: z.record(z.string(), z.unknown()).optional(),\n }),\n AudioTestResultSchema,\n { kind: 'mutation' },\n ),\n\n // ── Detection wiring / metrics (from detection-config) ───────────\n getDetectionConfigSchema: method(z.void(), ConfigUISchemaNullableBridge),\n // NOTE: orchestratorStatus / cameraDetectionStatus removed in the\n // pipeline page redesign — UI reads runner metrics directly via\n // perNodePipeline.getLocalMetrics / getCameraMetrics, which forward\n // to the pipeline-runner cap on the target node.\n //\n // NOTE: listBrokers / brokerStatus used to live here too — removed in\n // Fase H.3. Frontends now call `streamBroker.listBrokers` directly and\n // filter by deviceId client-side (brokerId prefix match). The broker\n // collection lives in the stream-broker capability and there is no\n // reason for pipeline-executor to mirror it.\n //\n // NOTE: subscribeLive / subscribeAudioLive removed in Fase H.4.\n // Consumers use the generic `live.onEvent` / `live.onDeviceEvent`\n // with `{category: 'pipeline.progress' | 'pipeline.inference-result'\n // | 'pipeline.audio-inference-result'}`.\n\n // Per-device pipeline step CRUD (`getDevicePipelineSteps` /\n // `setDevicePipelineSteps` / `clearDevicePipelineSteps`) removed in\n // Phase 4b. The orchestrator owns per-camera pipeline content now\n // (`pipelineOrchestrator.{get,set}CameraPipeline` +\n // `pipelines/<deviceId>` in its addon store). The executor is\n // stateless w.r.t. cameras — it receives `steps` inline on every\n // `runPipeline` call.\n },\n} as const satisfies CapabilityDefinition\n\nexport type IPipelineExecutorProvider = InferProvider<typeof pipelineExecutorCapability>\n\nexport {\n PipelineEngineChoiceSchema,\n PipelineDefaultStepSchema,\n DetectorOutputSchema,\n // Schema types — consumed by pipeline-schema.ts to derive TS types\n PipelineSchemaSchema,\n PipelineAddonSchemaSchema,\n PipelineSlotSchemaSchema,\n PipelineModelOptionSchema,\n AvailableEngineSchema,\n PipelineTemplateSchema,\n PipelineTemplateStepSchema,\n EngineDeviceInfoSchema,\n}\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\n/**\n * Zone — pure geometry + identity. NO filtering behaviour.\n *\n * Zones describe **where** in the frame the operator wants to flag\n * something; consumer-owned {@link ZoneRule} arrays describe **how**\n * each pipeline stage uses them. Splitting the two means a single\n * polygon \"Driveway\" can simultaneously back a motion-exclude rule,\n * a detection-include rule on `['car']`, and an occupancy aggregate\n * — without three duplicated polygons.\n *\n * Owned by the orchestrator addon (provider) and mirrored into the\n * `zones` device-state slice on every mutation. Consumers\n * (motion-wasm, pipeline-executor, analytics, admin UI) read either\n * via `api.zones.listZones` (one-shot) or via `dev.state.zones` (live\n * mirror with `onChanged`).\n *\n * Coordinates are normalised fractions of the frame (0–1) so zones\n * survive resolution changes and stream profile switches.\n *\n * `kind` discriminates between full polygons (closed regions used\n * for intrusion / occupancy filters) and tripwires (open 2-point\n * line segments used for cross events). Onboard / firmware-reported\n * zones (Reolink, ONVIF) are out of scope for now — see the deferred\n * task list.\n */\nexport const ZoneKindEnum = z.enum(['polygon', 'tripwire'])\nexport type ZoneKind = z.infer<typeof ZoneKindEnum>\n\n/** Polygon vertex in fraction-of-frame coordinates (0–1). */\nexport const PolygonPointSchema = z.object({\n x: z.number(),\n y: z.number(),\n})\nexport type PolygonPoint = z.infer<typeof PolygonPointSchema>\n\n/** A camera detection zone — pure geometry/identity. */\nexport const ZoneSchema = z.object({\n id: z.string(),\n name: z.string(),\n kind: ZoneKindEnum.default('polygon'),\n /** Polygon vertices, fraction of frame (0–1). */\n polygon: z.array(PolygonPointSchema).readonly(),\n /** Visual color for UI rendering. */\n color: z.string().default('#3b82f6'),\n})\nexport type Zone = z.infer<typeof ZoneSchema>\n\n/**\n * Zones capability — per-camera CRUD over polygon detection zones.\n *\n * Provider lives in `addon-pipeline-orchestrator` (hub-only). Persists\n * to per-device settings and mirrors into the `zones` device-state\n * slice on every mutation, so downstream consumers can subscribe via\n * `dev.state.zones.onChanged`.\n *\n * The cap surface only handles geometry + identity; filtering\n * behaviour (per-class, include/exclude, threshold) lives in the\n * consumer addons' rule arrays — see `ZoneRuleSchema` exported from\n * `capabilities/schemas/zone-rule.js`.\n */\nexport const zonesCapability = {\n name: 'zones',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera],\n methods: {\n listZones: method(\n z.object({ deviceId: z.number() }),\n z.array(ZoneSchema).readonly(),\n ),\n addZone: method(\n z.object({ deviceId: z.number(), zone: ZoneSchema }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n removeZone: method(\n z.object({ deviceId: z.number(), zoneId: z.string() }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n updateZone: method(\n z.object({ deviceId: z.number(), zone: ZoneSchema }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n /**\n * Runtime-state slice — the live zone catalogue mirrored by the\n * orchestrator on every CRUD mutation. Consumers read via\n * `device.state.zones.value` / `.watch(...)` without round-tripping\n * the cap, and the codegen DeviceProxy auto-wires the reactive\n * handle. Slice shape is `{ zones: Zone[] }` so future extensions\n * (e.g. zone groupings) can sit alongside the polygon list.\n */\n runtimeState: z.object({\n zones: z.array(ZoneSchema).readonly(),\n }),\n} as const satisfies CapabilityDefinition\n\nexport type IZonesProvider = InferProvider<typeof zonesCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { CameraMetricsSchema, CameraMetricsWithDeviceIdSchema } from './schemas/orchestrator-metrics.js'\nimport { PipelineEngineChoiceSchema, PipelineStepInputSchema } from './pipeline-executor.cap.js'\nimport { MotionRegionSchema } from './motion-detection.cap.js'\nimport { ZoneSchema } from './zones.cap.js'\nimport type { ConfigField } from '../interfaces/config-ui.js'\n\n/**\n * Per-camera tunable ranges + defaults. Single source of truth used\n * by both the Zod data schema (validation + default fallback) and\n * the device settings UI (slider min/max/step). Touch one place and\n * both sides stay aligned.\n */\nconst motionCooldownMsField = { min: 0, max: 60_000, default: 30_000, step: 500 } as const\nconst motionFpsField = { min: 1, max: 30, default: 4, step: 1 } as const\nconst detectionFpsField = { min: 1, max: 30, default: 10, step: 1 } as const\n\n/**\n * Source enum for motion signals fed to the runner. Extensible — add\n * new variants here when new motion-trigger paths are wired in\n * (`wasm-cross-camera`, `event-bus-relay`, etc.). The runner uses\n * the variant for diagnostics + to route the cap-state event payload\n * (analyzer attaches detected `regions[]`; onboard does not — the\n * camera typically only reports a binary signal plus an optional\n * channel/AI class which lives in dedicated event channels).\n */\nexport const MotionSourceEnum = z.enum(['onboard', 'analyzer'])\nexport type MotionSource = z.infer<typeof MotionSourceEnum>\n\n/**\n * List of motion sources active on a camera. Empty array is valid:\n * \"no source\" — happens for battery cams without firmware motion when\n * the operator hasn't opted into the SW analyzer (would hold the\n * substream open continuously and defeat the sleep cycle). The runner\n * accepts the empty list as \"no motion-driven phase transitions\" and\n * relies on the operator-set `detectionMode` to drive activation\n * (`'always-on'`) — `'on-motion'` with no source effectively pins the\n * phase to `'watching'`, which is the desired battery-cam-without-\n * firmware behaviour.\n *\n * Single source of truth for the array shape — every consumer\n * (orchestrator, runner, settings UI, dispatch) imports from here.\n */\nexport const MotionSourcesSchema = z.array(MotionSourceEnum)\nexport type MotionSources = z.infer<typeof MotionSourcesSchema>\n\n/**\n * Input shape for `pipeline-runner.reportMotion` cap method. Exported\n * so cap-side consumers (the orchestrator forward, the runner addon's\n * cap implementation, tests) can reuse the type instead of redeclaring\n * the field set.\n */\nexport const ReportMotionInputSchema = z.object({\n deviceId: z.number(),\n detected: z.boolean(),\n source: MotionSourceEnum.default('analyzer'),\n regions: z.array(MotionRegionSchema).readonly().optional(),\n})\nexport type ReportMotionInput = z.infer<typeof ReportMotionInputSchema>\n\n/**\n * Camera assignment payload sent by `addon-pipeline-orchestrator` to a\n * specific runner instance via `attachCamera`. Carries everything the\n * runner needs to subscribe to the local broker and execute inference.\n *\n * Stateless-pipeline model: the full pipeline content (`engine`, `steps`,\n * optional `audio`) travels with the attach payload. The runner keeps it\n * in RAM for the lifetime of the attach — on rebalance, edit, or\n * restart the orchestrator re-sends the latest snapshot.\n *\n * `engine`/`steps`/`audio` are optional during the additive migration\n * window; once orchestrator + UI are migrated they become required.\n */\nconst RunnerCameraConfigSchema = z.object({\n deviceId: z.number(),\n /**\n * Operator-facing scheduling mode for the SW object detection\n * pipeline. Replaces the legacy 2-state `priority` toggle.\n *\n * - `'disabled'` — runner never subscribes to the substream for\n * detection; phase stays idle. Bindings stay\n * bound; this is the runtime-level off switch.\n * - `'always-on'` — phase starts in `'active'` and never falls\n * back to `'watching'`.\n * - `'on-motion'` — phase starts in `'watching'`; transitions to\n * `'active'` when a motion source fires; falls\n * back to `'watching'` after `motionCooldownMs`.\n */\n detectionMode: z.enum(['disabled', 'always-on', 'on-motion']).default('on-motion'),\n /** Audio scheduling mode — same values as `detectionMode`. The\n * audio-analyzer addon reads this to decide whether to subscribe\n * to the audio decoded stream. */\n audioMode: z.enum(['disabled', 'always-on', 'on-motion']).default('always-on'),\n motionCooldownMs: z.number().min(motionCooldownMsField.min).default(motionCooldownMsField.default),\n motionFps: z.number().min(motionFpsField.min).max(motionFpsField.max).default(motionFpsField.default),\n detectionFps: z.number().min(detectionFpsField.min).max(detectionFpsField.max).default(detectionFpsField.default),\n motionStreamId: z.string(),\n detectionStreamId: z.string(),\n /**\n * Motion sources that can activate the pipeline. At least one must\n * be present. Multiple sources OR-ed: any one firing arms the\n * cooldown timer and transitions watching → active. The same\n * `motionCooldownMs` applies to whichever source(s) fire — the\n * timer rearms on every `reportMotion(true)` and expires after the\n * window, returning the runner to `watching`.\n *\n * - `analyzer`: ML/frame-diff motion detection (motion-wasm or other\n * analyzer providers) running on decoded frames in this runner.\n * - `onboard`: camera-native motion pushes (Reolink Baichuan, ONVIF\n * analytics, Frigate motion). The provider emits ProviderMotion\n * events; the orchestrator forwards to `reportMotion`.\n */\n motionSources: MotionSourcesSchema.default(['analyzer']),\n pipelineEnabled: z.boolean().default(true),\n // ── Stateless-pipeline: content carried with the attach ───────────\n /** Engine choice for video steps (runtime+backend+format). */\n engine: PipelineEngineChoiceSchema.optional(),\n /** Ordered tree of video steps. Absent → runner skips video detection. */\n steps: z.array(PipelineStepInputSchema).readonly().optional(),\n /** Audio classification branch. `enabled:false` disables, null skips. */\n audio: z.object({\n engine: PipelineEngineChoiceSchema,\n modelId: z.string(),\n enabled: z.boolean(),\n }).nullable().optional(),\n /**\n * Per-camera detection zones (user + onboard) snapshot at dispatch\n * time. Forwarded so motion-wasm + pipeline-executor running on the\n * runner can apply include/exclude/monitor logic without an extra\n * round-trip to the hub. The orchestrator re-dispatches the camera\n * whenever its `zones` device-state slice changes, so the runner's\n * copy stays in sync. Empty array → no zone filtering.\n */\n zones: z.array(ZoneSchema).readonly().default([]),\n})\n\n/**\n * Per-device settings UI fields the runner cap owns. Co-located with\n * the Zod data schema so a single change to defaults / ranges /\n * options propagates to both the wire contract AND the rendered UI.\n *\n * Consumers spread this into their own ConfigUISchema sections\n * (e.g. orchestrator's deviceSettingsSchema) instead of redeclaring\n * the fields. The ranges are read from the `*Field` constants above\n * so values stay in sync with `RunnerCameraConfigSchema`.\n *\n * Fields NOT included here are intentional — they're either internal\n * wire (motionStreamId, detectionStreamId) or live in a different\n * config surface (priority, motionStreamProfile/detectionStreamProfile\n * — the orchestrator transforms them into stream IDs before dispatch).\n */\nexport const RunnerCameraDeviceUIFields: readonly ConfigField[] = [\n {\n key: 'motionSources',\n type: 'multiselect',\n label: 'Motion Sources',\n default: ['analyzer'],\n options: [\n { value: 'analyzer', label: 'Frame-diff Analyzer (motion addon)' },\n { value: 'onboard', label: 'Camera Onboard Sensor' },\n ],\n },\n // Analyzer-only knobs — gated on `motionSources` containing the\n // `analyzer` (frame-diff) source. When the operator picks\n // `onboard`-only (camera-native VMD), running an analyzer pipeline\n // would burn CPU for no signal, so we hide the FPS / cooldown /\n // stream-profile tuning entirely. The dependent section header in\n // the orchestrator reads \"Frame-diff Analyzer\" → these fields\n // disappear together when the source isn't selected.\n {\n key: 'motionFps',\n type: 'slider',\n label: 'Motion FPS (analyzer)',\n min: motionFpsField.min,\n max: motionFpsField.max,\n step: motionFpsField.step,\n default: motionFpsField.default,\n showValue: true,\n unit: 'fps',\n showWhen: { field: 'motionSources', includes: 'analyzer' },\n },\n {\n key: 'detectionFps',\n type: 'slider',\n label: 'Detection FPS',\n min: detectionFpsField.min,\n max: detectionFpsField.max,\n step: detectionFpsField.step,\n default: detectionFpsField.default,\n showValue: true,\n unit: 'fps',\n },\n // Motion cooldown applies to BOTH analyzer and onboard sources —\n // every reportMotion(true) re-arms the cooldown regardless of the\n // emitting source, so the operator must be able to tune it for\n // onboard-only cameras too. Without this the field silently\n // disappeared when the user picked \"Camera Onboard Sensor\" only.\n {\n key: 'motionCooldownMs',\n type: 'slider',\n label: 'Motion Cooldown',\n description: 'Time without a fresh motion event before the active phase ends. Applies to all motion sources — every motion event re-arms the timer.',\n min: motionCooldownMsField.min,\n max: motionCooldownMsField.max,\n step: motionCooldownMsField.step,\n default: motionCooldownMsField.default,\n showValue: true,\n unit: 's',\n displayScale: 1000,\n },\n] as const\n\n/**\n * Runtime load summary returned by `getLocalLoad`. Used by the orchestrator's\n * load-balancing levels (L2 capacity-based, L3 hardware-aware) to decide\n * which agent should receive a new camera assignment.\n */\nconst RunnerLocalLoadSchema = z.object({\n /** Moleculer node id of this runner instance. */\n nodeId: z.string(),\n /** Total cameras currently attached (regardless of phase). */\n attachedCameras: z.number(),\n /** Cameras currently in `active` phase (running detection inference). */\n activeCameras: z.number(),\n /** Average inference FPS across all attached cameras. */\n avgInferenceFps: z.number(),\n /** Average inference latency in ms across all attached cameras. */\n avgInferenceTimeMs: z.number(),\n /** Total queue depth across motion + detection queues. */\n queueDepthTotal: z.number(),\n /** Hardware capability flags reported by this node. */\n hardware: z.object({\n hasGpu: z.boolean(),\n inferenceBackend: z.string().optional(),\n cpuCores: z.number().optional(),\n }),\n})\n\n/**\n * Aggregate runtime metrics for the runner's whole local pool. Mirrors the\n * legacy `OrchestratorMetricsSchema` shape so existing dashboards keep\n * working unchanged when they switch to reading from the runner cap.\n */\nconst RunnerLocalMetricsSchema = z.object({\n nodeId: z.string(),\n activeCameras: z.number(),\n throttledCameras: z.number(),\n avgInferenceTimeMs: z.number(),\n queueDepth: z.number(),\n})\n\n/**\n * Pipeline Runner capability — runtime detection workhorse.\n *\n * One instance per node. Receives camera assignments from\n * `addon-pipeline-orchestrator`, subscribes to the local stream-broker for\n * decoded frames, drains motion + detection queues, calls the local\n * `motion-detection` and `pipeline-executor` capabilities, and emits typed\n * `pipeline.inference-result` and `detection.motion-analysis` events on\n * the bus.\n *\n * Distinct from `pipeline-orchestrator` (the hub-side load balancer) — the\n * runner has zero knowledge of other agents, no global state, and never\n * makes assignment decisions itself.\n */\nexport const pipelineRunnerCapability = {\n name: 'pipeline-runner',\n scope: 'system',\n mode: 'singleton',\n methods: {\n // ── Camera lifecycle (called by orchestrator) ────────────────────\n /** Attach a camera to this runner. Subscribes to local broker. */\n attachCamera: method(RunnerCameraConfigSchema, z.object({ success: z.literal(true) }), { kind: 'mutation' }),\n /** Detach a camera. Unsubscribes from local broker, clears queues. */\n detachCamera: method(z.object({ deviceId: z.number() }), z.object({ success: z.literal(true) }), { kind: 'mutation' }),\n /**\n * Report an external motion event for a camera. Drives the runner's\n * phase machine: every `detected: true` clears + rearms the\n * cooldown timer (`motionCooldownMs`); when the timer expires the\n * camera returns to `watching`. `detected: false` is a no-op —\n * onboard sources never send an explicit clear, the timer is the\n * single closure path.\n *\n * `source` discriminates which motion path triggered the event so\n * the runner can attach the right metadata to the cap-state event\n * (analyzer carries `regions[]`, onboard does not). `regions` is\n * populated only for `source: 'analyzer'` — the analyzer's\n * frame-diff result. Always-on cameras silently ignore\n * reportMotion calls.\n */\n reportMotion: method(\n ReportMotionInputSchema,\n z.object({ success: z.literal(true) }),\n { kind: 'mutation' },\n ),\n\n // ── Observability (called by orchestrator + dashboards) ──────────\n /** Return load summary used by the orchestrator's load balancer. */\n getLocalLoad: method(z.void(), RunnerLocalLoadSchema),\n /** Return aggregate runtime metrics for this runner instance. */\n getLocalMetrics: method(z.void(), RunnerLocalMetricsSchema),\n /** Per-camera metrics for cameras attached to this runner. */\n getCameraMetrics: method(z.object({ deviceId: z.number() }), CameraMetricsSchema.nullable()),\n /** All per-camera metrics in one round-trip. */\n getAllCameraMetrics: method(z.void(), z.array(CameraMetricsWithDeviceIdSchema).readonly()),\n /** List the deviceIds currently attached to this runner. */\n getLocalCameras: method(z.void(), z.array(z.number()).readonly()),\n\n // NOTE: Phase 6 (settings redesign) removed `getTuning` / `setTuning`.\n // The four tuning fields are now exposed via the addon-level settings\n // API (`pipeline-runner.getAddonSettings / updateAddonSettings`) and\n // rendered in the admin UI via `NodeAddonsSettingsPanel` instead of\n // the dedicated `NodeTuningTab` that used to call these cap methods.\n },\n} as const satisfies CapabilityDefinition\n\nexport type IPipelineRunnerProvider = InferProvider<typeof pipelineRunnerCapability>\n\nexport { RunnerCameraConfigSchema, RunnerLocalLoadSchema, RunnerLocalMetricsSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\nimport { MotionRegionSchema } from './motion-detection.cap.js'\nimport { MotionSourceEnum } from './pipeline-runner.cap.js'\n\n/**\n * Hardware / firmware motion sensor cap — binary detected state plus\n * a timestamp of the last observation. Distinct from\n * `motion-detection.cap.ts` which owns the LOCAL ML motion pipeline;\n * `motion` is the lightweight readout from on-camera motion (Reolink\n * `GetMdState`, Baichuan push `type: motion`, ONVIF analytics).\n *\n * Native-motion providers also fan out to `detection.camera-native`\n * with `source: 'onboard'` so cross-cutting system services\n * (alert-center, advanced-notifier) can subscribe once and receive\n * motion from every camera.\n */\nexport const MotionStatusSchema = z.object({\n detected: z.boolean(),\n /** Ms epoch of the last detected-true observation. Null if never detected. */\n lastDetectedAt: z.number().nullable(),\n /**\n * Ms after which `detected` auto-reverts to false if no fresh push\n * arrives. Mirrors the scrypted-reolink-native default. Null means\n * the provider leaves detected state until a native \"clear\" event.\n */\n autoClearAfterMs: z.number().nullable(),\n})\n\nexport type MotionStatus = z.infer<typeof MotionStatusSchema>\n\n/**\n * Payload of `motion.onMotionChanged` event + the corresponding bus\n * event `EventCategory.MotionOnMotionChanged`. Single source of truth\n * — both the cap event surface and the bus payload type alias to this\n * schema.\n */\nexport const MotionOnMotionChangedDataSchema = z.object({\n deviceId: z.number(),\n detected: z.boolean(),\n timestamp: z.number(),\n source: MotionSourceEnum,\n regions: z.array(MotionRegionSchema).readonly().optional(),\n})\nexport type MotionOnMotionChangedData = z.infer<typeof MotionOnMotionChangedDataSchema>\n\nexport const motionCapability = {\n name: 'motion',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera, DeviceType.Sensor],\n methods: {\n /**\n * Pull the current motion state synchronously. Convenience shortcut\n * for consumers that don't need the full status object; equivalent\n * to `getStatus()?.detected ?? false`. Will likely be folded into\n * `getStatus` once the auto-injected status surface lands in every\n * consumer.\n */\n isDetected: method(\n z.object({ deviceId: z.number() }),\n z.boolean(),\n ),\n },\n events: {\n /**\n * Fires every time the runner transitions a camera between\n * `watching` and `active` phases. `source` carries which motion\n * path drove the transition; `regions` is populated only for\n * `source: 'analyzer'` (frame-diff regions from the ML motion\n * detector) — onboard sources don't carry per-frame regions\n * here (camera-provided zones / AI metadata live in dedicated\n * channels: `detection.camera-native`, future zone capability).\n *\n * Consumers that want all motion pushes (even with `detected`\n * unchanged) should subscribe to the status subscription via\n * `device-manager.subscribeDeviceStatusAggregate` instead.\n */\n onMotionChanged: { data: MotionOnMotionChangedDataSchema },\n },\n status: {\n schema: MotionStatusSchema,\n kind: 'push',\n },\n /**\n * Runtime-state slice — the last observed motion snapshot, mirrored\n * by the kernel and readable cross-process via\n * `device.state.motion.value`. Reads never invoke the provider, so\n * UIs and other addons can poll the cached state safely.\n */\n runtimeState: MotionStatusSchema,\n} as const satisfies CapabilityDefinition\n\nexport type IMotionProvider = InferProvider<typeof motionCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\n/**\n * Motion-trigger toggle for accessory devices.\n *\n * \"Motion trigger\" means: when the parent camera detects motion, the\n * accessory activates automatically. The cap exposes a single boolean\n * — `enabled` — that drivers map to the vendor-specific firmware\n * action (Reolink: `setSirenOnMotion`, `setFloodlightOnMotion`; ONVIF\n * relay: schedule binding; …).\n *\n * The accessory still has its own `switch` cap for direct on/off; this\n * cap is independent. Toggling motion-trigger on does NOT necessarily\n * toggle the switch on — it just instructs the firmware to flip the\n * switch when motion fires.\n *\n * Driver-specific knobs (motion duration window, brightness while\n * triggered, schedule windows) live in the device's\n * `getSettingsUISchema()` instead of bloating this cap — same\n * principle as `switch` and `brightness` keeping their surface\n * minimal.\n */\nexport const MotionTriggerStatusSchema = z.object({\n enabled: z.boolean(),\n /** Ms epoch of the last operator-driven change. */\n lastChangedAt: z.number(),\n})\n\nexport type MotionTriggerStatus = z.infer<typeof MotionTriggerStatusSchema>\n\n/**\n * Persistent slice mirrored across restarts. The provider writes here\n * on every successful firmware fetch / setMotionTrigger push; the cap\n * router and admin-ui hero read straight from this snapshot via\n * `device.state.motionTrigger.value` instead of re-issuing a firmware\n * round-trip on every UI mount. `lastFetchedAt` lets the framework\n * helper (`createRuntimeStateBridge`) stale-check before deciding\n * whether to refresh from the camera.\n */\nexport const MotionTriggerRuntimeStateSchema = MotionTriggerStatusSchema.extend({\n /** Ms epoch of the last successful camera fetch (0 = never). */\n lastFetchedAt: z.number(),\n})\n\nexport type MotionTriggerRuntimeState = z.infer<typeof MotionTriggerRuntimeStateSchema>\n\nexport const motionTriggerCapability = {\n name: 'motion-trigger',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Light, DeviceType.Siren, DeviceType.Switch],\n methods: {\n setMotionTrigger: method(\n z.object({\n deviceId: z.number().int().nonnegative(),\n enabled: z.boolean(),\n }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n events: {\n onMotionTriggerChanged: { data: z.object({\n deviceId: z.number(),\n enabled: z.boolean(),\n lastChangedAt: z.number(),\n })},\n },\n status: {\n schema: MotionTriggerStatusSchema,\n kind: 'command-driven',\n },\n runtimeState: MotionTriggerRuntimeStateSchema,\n} as const satisfies CapabilityDefinition\n\nexport type IMotionTriggerProvider = InferProvider<typeof motionTriggerCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\n/**\n * `ptz-autotrack` — sibling cap of `ptz` that exposes the on-camera\n * smart-tracking subsystem (subject-following). Modeled separately\n * from `ptz` because:\n * - Not every PTZ-capable camera has autotrack (Reolink: yes;\n * Hikvision: model-dependent), so a single combined cap would\n * force every PTZ provider to surface `Unsupported` stubs on\n * half the methods.\n * - The cap's lifecycle is \"registered when probed-true\" — the\n * binding system can show / hide the UI affordance cleanly via\n * the standard `provider-registered` signal.\n * - Autotrack on/off is a device-state toggle (status), distinct\n * from PTZ's continuous control surface — a status-driven cap\n * fits the existing `setStatus` / `onStatusChanged` pattern\n * better than `ptz`'s discrete-action surface.\n *\n * Settings (cross-vendor consolidation, sourced from Reolink's\n * `setAutotrackingSettings` shape; expandable as Hikvision /\n * Dahua / others land):\n * - `targetType` — vendor target string (people /\n * vehicle / pet / `''` = camera default)\n * - `stopDelaySeconds` — how long to keep tracking a\n * stationary target before stopping\n * (0..300, default 30)\n * - `disappearDelaySeconds` — how long to wait before releasing a\n * target that has left the frame\n * (0..300, default 15)\n *\n * The driver is the source of truth for which settings keys it\n * actually honours; unsupported keys silently fall back to the\n * camera's defaults. Adding a new vendor's setting (e.g. Hikvision's\n * `trackingDuration`) extends the schema below and the\n * `setSettings` payload.\n */\n\nconst AutotrackTargetTypeSchema = z.string()\n .describe('Vendor target string (people/vehicle/pet); empty = camera default')\n\nexport const PtzAutotrackSettingsSchema = z.object({\n targetType: AutotrackTargetTypeSchema,\n stopDelaySeconds: z.number().int().min(0).max(300),\n disappearDelaySeconds: z.number().int().min(0).max(300),\n})\n\nexport type PtzAutotrackSettings = z.infer<typeof PtzAutotrackSettingsSchema>\n\n/**\n * One option the camera advertises as a valid `targetType`. Drivers\n * harvest this from their probe data; the UI renders these as the\n * `targetType` select options. Empty array = the camera doesn't\n * expose a target-type selector (auto-only).\n *\n * The `value` is the canonical wire string the cap accepts in\n * `setSettings({targetType})` — drivers use it verbatim when pushing\n * to firmware. The `label` is operator-facing English (translated\n * client-side if the UI supports i18n).\n */\nexport const PtzAutotrackTargetOptionSchema = z.object({\n value: z.string(),\n label: z.string(),\n})\n\nexport type PtzAutotrackTargetOption = z.infer<typeof PtzAutotrackTargetOptionSchema>\n\nexport const PtzAutotrackStatusSchema = z.object({\n /** True when autotrack is currently armed on the camera. */\n enabled: z.boolean(),\n /** Ms epoch of the last on/off transition (0 if never observed). */\n lastChangedAt: z.number(),\n /** Currently-applied settings the camera reports. Drivers fill\n * this from the firmware GET so the UI can echo what's *really*\n * active vs the operator-typed values in the settings form. */\n currentSettings: PtzAutotrackSettingsSchema.nullable(),\n /**\n * Target types the camera advertises. Driver-supplied — Reolink\n * exposes `people` / `vehicle` / `pet`, Hikvision exposes\n * `auto` / `human` / `vehicle` when the `<smartTrackingType>` knob\n * is supported. Empty array = vendor doesn't expose a selector\n * (treat as auto-only). The UI renders these as the `targetType`\n * field options without hardcoding a vendor-specific list.\n */\n supportedTargetTypes: z.array(PtzAutotrackTargetOptionSchema),\n})\n\nexport type PtzAutotrackStatus = z.infer<typeof PtzAutotrackStatusSchema>\n\n/**\n * Runtime-state slice owned by this cap. Persists the last-known\n * camera-derived snapshot across restarts, so cold-start callers\n * have a meaningful baseline even before the first refresh round-trip.\n *\n * Adds `lastFetchedAt` on top of the status shape so the framework\n * (or the provider) can stale-check before deciding whether to\n * round-trip the camera again.\n */\nexport const PtzAutotrackRuntimeStateSchema = PtzAutotrackStatusSchema.extend({\n /** Ms epoch of the last successful camera fetch (0 = never). */\n lastFetchedAt: z.number(),\n})\n\nexport type PtzAutotrackRuntimeState = z.infer<typeof PtzAutotrackRuntimeStateSchema>\n\nexport const ptzAutotrackCapability = {\n name: 'ptz-autotrack',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera],\n methods: {\n /**\n * Read the current on/off state + last-applied settings.\n * Drivers may serve from a cache + refresh on a schedule —\n * callers should NOT poll faster than ~5s.\n */\n getStatus: method(\n z.object({ deviceId: z.number() }),\n PtzAutotrackStatusSchema,\n ),\n /**\n * Arm or disarm autotrack. Resolves once the camera has\n * acknowledged the transition; the `onStatusChanged` event\n * fires shortly after with the live state.\n */\n setEnabled: method(\n z.object({ deviceId: z.number(), enabled: z.boolean() }),\n z.void(),\n { kind: 'mutation' },\n ),\n /**\n * Read settings (target type + delays). Mirrors the\n * `getStatus().currentSettings` payload but exposes it as a\n * standalone read for callers that want settings without the\n * status surface around them. `null` until the driver has\n * harvested the firmware state at least once.\n */\n getSettings: method(\n z.object({ deviceId: z.number() }),\n PtzAutotrackSettingsSchema.nullable(),\n ),\n /**\n * Update one or more settings. Partial — keys that aren't\n * supplied keep their last persisted value. The driver is\n * responsible for clamping vendor-specific ranges if narrower\n * than the cross-vendor max declared on the schema.\n */\n setSettings: method(\n z.object({\n deviceId: z.number(),\n settings: PtzAutotrackSettingsSchema.partial(),\n }),\n z.void(),\n { kind: 'mutation' },\n ),\n },\n events: {\n onStatusChanged: { data: z.object({\n deviceId: z.number(),\n status: PtzAutotrackStatusSchema,\n })},\n },\n status: {\n schema: PtzAutotrackStatusSchema,\n kind: 'command-driven',\n },\n /**\n * Persistent slice mirrored across restarts. The provider writes\n * here on every successful firmware fetch / settings push;\n * `getStatus` and `getSettings` then read this snapshot synchronously\n * with a stale-driven async refresh in the background. Keeps the\n * fetch / cache / fallback logic out of the four cap methods —\n * they become trampolines over `runtimeState`.\n */\n runtimeState: PtzAutotrackRuntimeStateSchema,\n} as const satisfies CapabilityDefinition\n\nexport type IPtzAutotrackProvider = InferProvider<typeof ptzAutotrackCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\n/**\n * Generic on/off switch cap for accessory children (siren, floodlight,\n * spotlight, PIR toggle, chime silencer, autotrack enable, …). The cap\n * owns ONLY the boolean state — driver-specific settings (brightness,\n * sensitivity, schedule, duration) live on the device's own\n * `getSettingsUISchema()` surface.\n */\nexport const SwitchStatusSchema = z.object({\n on: z.boolean(),\n /** Ms epoch of the last state change. Useful for UI \"X minutes ago\". */\n lastChangedAt: z.number(),\n})\n\nexport type SwitchStatus = z.infer<typeof SwitchStatusSchema>\n\nexport const switchCapability = {\n name: 'switch',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Switch, DeviceType.Siren, DeviceType.Light],\n methods: {\n setState: method(\n z.object({ deviceId: z.number(), on: z.boolean() }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n events: {\n onStateChanged: { data: z.object({\n deviceId: z.number(),\n on: z.boolean(),\n lastChangedAt: z.number(),\n })},\n },\n status: {\n schema: SwitchStatusSchema,\n kind: 'command-driven',\n },\n /**\n * Runtime-state slice — the last applied on/off state, mirrored by\n * the kernel. Read via `device.state.switch.value`; UI toggles do\n * not need to re-query the provider after a setState mutation.\n */\n runtimeState: SwitchStatusSchema,\n settings: {\n bindings: [{\n kind: 'scalar',\n statusPath: 'on',\n method: 'setState',\n valueArg: 'on',\n field: { label: 'On', kind: 'boolean' },\n }],\n },\n} as const satisfies CapabilityDefinition\n\nexport type ISwitchProvider = InferProvider<typeof switchCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\n/**\n * Per-zone occupancy aggregation produced by the analytics frame\n * processor on every inference result. Covers the full combinatorial\n * matrix the operator UI needs: total objects everywhere, total\n * objects per zone, single class everywhere, single class per zone,\n * objects outside any zone.\n *\n * Counts are derived from the analytics tracker (tracked detections\n * with stable trackIds), not raw detector hits — this filters out\n * one-off detector flickers and gives counts that match what the user\n * sees on the live overlay.\n *\n * Overlap policy: a detection that intersects two zones counts in\n * BOTH zones' `byClass` and `totalObjects` (count-in-each). The\n * `frame` aggregate de-duplicates trivially since it's frame-wide.\n * `unzoned` counts only detections that landed in zero zones.\n */\nconst PerScopeBreakdownSchema = z.object({\n /** Total tracked objects in this scope (frame / zone / unzoned). */\n totalObjects: z.number().int().nonnegative(),\n /** Per-class count. Keys are macro class names (e.g. `person`, `car`). */\n byClass: z.record(z.string(), z.number().int().nonnegative()),\n})\n\nconst ZoneScopeBreakdownSchema = PerScopeBreakdownSchema.extend({\n zoneId: z.string(),\n zoneName: z.string(),\n /** TrackIds of objects currently inside this zone — for cross-reference\n * with the per-track detail panel and live overlay. */\n trackIds: z.array(z.string()).readonly(),\n})\n\nexport const CameraOccupancySnapshotSchema = z.object({\n /** Frame timestamp of the inference result that produced this snapshot. */\n ts: z.number().int(),\n /** Frame width/height in pixels — let the UI normalize bbox coords. */\n frameWidth: z.number().int().nonnegative(),\n frameHeight: z.number().int().nonnegative(),\n /** Per-zone breakdown — one entry per defined zone (user + onboard). */\n zones: z.array(ZoneScopeBreakdownSchema).readonly(),\n /** Frame-wide aggregate (everywhere, regardless of zone membership). */\n frame: PerScopeBreakdownSchema,\n /** Detections that landed outside every zone. Empty when no zones defined. */\n unzoned: PerScopeBreakdownSchema,\n})\nexport type CameraOccupancySnapshot = z.infer<typeof CameraOccupancySnapshotSchema>\nexport type ZoneScopeBreakdown = z.infer<typeof ZoneScopeBreakdownSchema>\nexport type PerScopeBreakdown = z.infer<typeof PerScopeBreakdownSchema>\n\n/**\n * Time-series resolution. The history methods return one bucket per\n * step over the requested range. Smaller resolutions cost more\n * memory + bandwidth; bound to discrete steps so caller cannot ask\n * for arbitrary fractional buckets.\n */\nconst HistoryResolutionEnum = z.enum(['minute', '5min', 'hour'])\nexport type HistoryResolution = z.infer<typeof HistoryResolutionEnum>\n\nconst HistoryRangeSchema = z.object({\n /** Range start (epoch ms, inclusive). */\n from: z.number().int(),\n /** Range end (epoch ms, inclusive). Defaults to \"now\" at query time. */\n to: z.number().int(),\n resolution: HistoryResolutionEnum,\n})\n\nconst HistoryPointSchema = z.object({\n /** Bucket midpoint (epoch ms). */\n ts: z.number().int(),\n /** Object count averaged over the bucket (rounded to nearest integer). */\n count: z.number().int().nonnegative(),\n})\nexport type HistoryPoint = z.infer<typeof HistoryPointSchema>\n\n/**\n * Zone Analytics capability — spatial occupancy aggregations over\n * tracked detections. Hosted by `addon-pipeline-analytics`.\n *\n * Live snapshot is mirrored into the `zone-occupancy` device-state\n * slice on every frame; the cap method `getCurrentSnapshot` is a\n * direct read for callers that don't want to subscribe.\n *\n * History methods are sourced from a 60-minute rolling in-memory\n * ring of frame-level samples (sub-second resolution). Queries\n * outside the ring window return empty arrays — durable storage\n * is a follow-up (Step 4b: persisted samples → SQL store).\n *\n * Every history method takes an optional `className` filter:\n * - omitted → bucket count includes ALL classes in scope\n * - present → bucket count restricted to that class\n *\n * The `getZoneHistory` / `getCameraHistory` / `getUnzonedHistory`\n * triple covers the three spatial scopes (per-zone, frame-wide,\n * outside-any-zone). Crossing them with `className?` gives the full\n * combinatorial coverage the operator UI requested.\n */\nexport const zoneAnalyticsCapability = {\n name: 'zone-analytics',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera],\n methods: {\n /** Latest computed occupancy snapshot for this camera. Null when\n * the analytics pipeline hasn't seen a frame for this device yet\n * (no inference result emitted since boot or since binding was\n * activated). */\n getCurrentSnapshot: method(\n z.object({ deviceId: z.number() }),\n CameraOccupancySnapshotSchema.nullable(),\n ),\n /** Time-series object count inside one zone. `className` optional —\n * omit to count every class in the zone. */\n getZoneHistory: method(\n z.object({\n deviceId: z.number(),\n zoneId: z.string(),\n className: z.string().optional(),\n }).extend(HistoryRangeSchema.shape),\n z.array(HistoryPointSchema).readonly(),\n ),\n /** Time-series frame-wide object count (everywhere). */\n getCameraHistory: method(\n z.object({\n deviceId: z.number(),\n className: z.string().optional(),\n }).extend(HistoryRangeSchema.shape),\n z.array(HistoryPointSchema).readonly(),\n ),\n /** Time-series count of objects outside every zone. */\n getUnzonedHistory: method(\n z.object({\n deviceId: z.number(),\n className: z.string().optional(),\n }).extend(HistoryRangeSchema.shape),\n z.array(HistoryPointSchema).readonly(),\n ),\n },\n /**\n * Runtime-state slice — the latest occupancy snapshot mirrored by\n * the analytics frame processor on every inference result. Consumers\n * read via `device.state.zoneAnalytics.value` and stay in sync\n * automatically; the explicit `getCurrentSnapshot` cap method is\n * still useful for one-off polls without a subscription.\n */\n runtimeState: CameraOccupancySnapshotSchema,\n} as const satisfies CapabilityDefinition\n\nexport type IZoneAnalyticsProvider = InferProvider<typeof zoneAnalyticsCapability>\n\nexport {\n CameraOccupancySnapshotSchema as _CameraOccupancySnapshotSchema,\n HistoryResolutionEnum,\n HistoryPointSchema,\n HistoryRangeSchema,\n ZoneScopeBreakdownSchema,\n PerScopeBreakdownSchema,\n}\n","import { z } from 'zod'\n\n/**\n * Per-stage gating mode applied to the zones a rule references.\n *\n * - `include`: the rule contributes to a **whitelist** for its stage.\n * When at least one `include` rule fires for a stage, only entities\n * inside one of those zones pass that stage.\n * - `exclude`: the rule contributes to a **blacklist** for its stage.\n * Entities inside one of those zones are dropped at that stage.\n *\n * `monitor`-style observation (count without filtering) is not a rule\n * mode — zones without any matching rule are observed naturally by\n * `zone-analytics` (live snapshot + history), so an \"I just want to\n * count, not filter\" use case needs no rule at all.\n */\nexport const ZoneRuleModeEnum = z.enum(['include', 'exclude'])\nexport type ZoneRuleMode = z.infer<typeof ZoneRuleModeEnum>\n\n/**\n * Per-consumer rule that references existing zones (geometry) and\n * defines how a specific pipeline stage should treat them. Each\n * consumer addon owns its own `ZoneRule[]` array in its per-device\n * settings:\n *\n * - `addon-motion-wasm` → `motionZoneRules: ZoneRule[]` (motion stage)\n * - `addon-detection-pipeline` → `detectionZoneRules: ZoneRule[]` (detection stage)\n * - future: notification rules, audio gating, etc.\n *\n * One rule applies to N zones (`zoneIds[]`) so the operator can\n * express \"ignore motion in ALL of {garden, street}\" with a single\n * rule. `classFilter` narrows the rule to specific object classes —\n * \"drop person detections in the street, but keep cars\" is one\n * `exclude` rule with `classFilter: ['person']`.\n *\n * `enabled` is a soft toggle — the operator can keep the rule\n * configured but inert without deleting it.\n */\nexport const ZoneRuleSchema = z.object({\n /** Stable rule id — survives edits, used by the UI for diffing. */\n id: z.string(),\n /** Optional human-readable label rendered in the rule editor. */\n name: z.string().optional(),\n /** Zones this rule targets. The rule's `mode` applies to ALL\n * listed zones (OR-set: a detection in any one of them counts).\n * At least one zone id required — a rule with no targets is a\n * configuration mistake and the form validator rejects it. */\n zoneIds: z.array(z.string()).min(1).readonly(),\n mode: ZoneRuleModeEnum,\n /**\n * Class names this rule applies to. Empty / undefined ⇒ rule\n * applies to every class. Class strings match the `macroClass`\n * field on detections (e.g. `person`, `car`, `dog`).\n */\n classFilter: z.array(z.string()).readonly().optional(),\n /**\n * Minimum bbox/mask overlap (0–1) with any of the rule's zones\n * required to consider an entity \"in the zone\". Defaults to the\n * consumer's stage default when omitted. Kept for back-compat with\n * existing per-rule overrides; new operators pick the value via\n * `bboxInclusionPct` (operator-friendly 0–100). Whichever field is\n * set, the lower-level engine reads it as a 0–1 fraction.\n */\n overlapThreshold: z.number().min(0).max(1).optional(),\n /**\n * Operator-friendly version of `overlapThreshold` — the percentage\n * of the detection's bbox that must lie inside the zone for the\n * rule to match. Documented default is 85%; the engine substitutes\n * that when the field is omitted (kept optional so existing rules\n * stored without it stay valid).\n *\n * When BOTH `overlapThreshold` and `bboxInclusionPct` are set on a\n * rule, the engine prefers `bboxInclusionPct` because it's the\n * field exposed in the UI. Internally both feed the same gate.\n */\n bboxInclusionPct: z.number().min(0).max(100).optional(),\n /**\n * When `true` and a detection has a segmentation mask, use the\n * mask for overlap instead of the bbox. Detection-stage only;\n * motion rules ignore this field.\n */\n preferMask: z.boolean().optional(),\n /**\n * Soft-toggle: `false` disables the rule without deleting it.\n * Defaults to `true` so operators creating a rule via the UI\n * see it active immediately.\n */\n enabled: z.boolean().default(true),\n})\nexport type ZoneRule = z.infer<typeof ZoneRuleSchema>\n\n/**\n * Convenience array schema — used by addon device-settings\n * contributions and runtime payloads (e.g. `RunnerCameraConfig`).\n */\nexport const ZoneRulesArraySchema = z.array(ZoneRuleSchema).readonly()\nexport type ZoneRules = z.infer<typeof ZoneRulesArraySchema>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\nimport { ZoneRuleSchema } from './schemas/zone-rule.js'\n\n/**\n * Stages a {@link ZoneRule} can apply to. Discriminator on the rules\n * cap so a single CRUD surface backs every consumer; each stage has\n * its own dev-state mirror slice (`motion-zone-rules`,\n * `detection-zone-rules`, …) so consumer addons subscribe independently.\n *\n * Extend the enum here when a new gating consumer comes online (audio\n * gating, alert filtering, …) — no other surface needs to change.\n */\nexport const ZoneRuleStageEnum = z.enum(['motion', 'detection'])\nexport type ZoneRuleStage = z.infer<typeof ZoneRuleStageEnum>\n\n/**\n * Zone rules capability — per-camera CRUD over the {@link ZoneRule}\n * arrays that decide how each pipeline stage uses the polygon zones.\n *\n * Hosted by `addon-pipeline-orchestrator` alongside the zones provider\n * so the operator has a single hub-side source of truth for both\n * geometry and behaviour. Per-stage rules are stored under the\n * `zoneRules.<stage>` key in the orchestrator's per-device store and\n * mirrored to the device-state slice `<stage>-zone-rules` on every\n * mutation; consumer addons (analytics, motion-wasm, pipeline-executor)\n * subscribe to that slice and refresh their gating without\n * round-tripping the cap.\n *\n * Sets are bulk-replace — the operator UI sends the new rule list\n * wholesale, so reordering / batch enable-toggle / drag-drop CRUD lives\n * naturally in the rule editor without per-rule mutation chatter.\n */\nexport const zoneRulesCapability = {\n name: 'zone-rules',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera],\n methods: {\n /** Read the full rule list for a given stage (empty when no rules\n * are defined yet). */\n listRules: method(\n z.object({ deviceId: z.number(), stage: ZoneRuleStageEnum }),\n z.array(ZoneRuleSchema).readonly(),\n ),\n /** Bulk-replace the rule list for one stage. The provider validates\n * each entry against {@link ZoneRuleSchema} (zoneIds non-empty,\n * thresholds in range) and rejects the whole patch if any entry\n * is invalid — partial writes are a configuration footgun. */\n setRules: method(\n z.object({\n deviceId: z.number(),\n stage: ZoneRuleStageEnum,\n rules: z.array(ZoneRuleSchema).readonly(),\n }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n /**\n * Runtime-state slice — both stages mirrored together so consumers\n * see one reactive handle (`device.state.zoneRules.value`) instead\n * of two. Bulk-replace mutations on either stage write the full\n * `{motion, detection}` shape, so subscribers always get the\n * complete current set. Consumers that only care about one stage\n * just read the matching property.\n */\n runtimeState: z.object({\n motion: z.array(ZoneRuleSchema).readonly(),\n detection: z.array(ZoneRuleSchema).readonly(),\n }),\n} as const satisfies CapabilityDefinition\n\nexport type IZoneRulesProvider = InferProvider<typeof zoneRulesCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\nconst ProviderStatusSchema = z.object({\n connected: z.boolean(),\n deviceCount: z.number(),\n error: z.string().optional(),\n})\n\nconst DiscoveredDeviceSchema = z.object({\n externalId: z.string(),\n name: z.string(),\n type: z.string(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n\n/**\n * Candidate handed back from discovery and accepted by\n * `adoptDiscoveredDevice`. Shape mirrors the in-process\n * `DiscoveredDevice` interface used by `DeviceDiscovery`.\n */\nconst DiscoveryCandidateSchema = z.object({\n stableId: z.string(),\n type: z.enum(DeviceType),\n suggestedName: z.string(),\n prefilledConfig: z.record(z.string(), z.unknown()),\n})\n\n/**\n * Flat device summary returned by `createDevice` / `adoptDiscoveredDevice`.\n * Mirrors `toDeviceShape()` output in `device-management.router.ts` so the\n * tRPC layer can pass it through without reshaping.\n */\nconst DeviceSummarySchema = z.object({\n id: z.number(),\n stableId: z.string(),\n addonId: z.string(),\n type: z.string(),\n name: z.string(),\n parentDeviceId: z.number().nullable(),\n online: z.boolean(),\n features: z.array(z.string()),\n config: z.record(z.string(), z.unknown()),\n})\n\n/**\n * Result of a live field test (e.g. probing an RTSP URL during device\n * creation). Matches the UI-side `FieldProbeResult` in\n * `interfaces/config-ui.ts` — the admin `FormBuilder` renders the\n * returned `labels` as chips next to the input.\n */\nconst FieldProbeResultSchema = z.object({\n status: z.enum(['ok', 'error']),\n labels: z.array(z.string()).optional(),\n error: z.string().optional(),\n})\n\n/**\n * The output of `getChildCreationSchema` is a UI schema tree. We store\n * it as `unknown` at the capability layer — the router just passes it\n * through and the admin UI renders it via `FormBuilder`. The actual\n * type is `ConfigUISchema` (see `packages/types/src/interfaces/config-ui.ts`),\n * but we deliberately avoid a Zod mirror because the union is large and\n * not meant for runtime validation at this seam.\n */\nconst CreationSchemaOutputSchema = z.unknown()\n\nexport const deviceProviderCapability = {\n name: 'device-provider',\n scope: 'system',\n mode: 'collection',\n methods: {\n // ── Lifecycle + introspection ─────────────────────────────────────\n start: method(z.void(), z.void(), { kind: 'mutation' }),\n stop: method(z.void(), z.void(), { kind: 'mutation' }),\n getStatus: method(z.void(), ProviderStatusSchema),\n getDevices: method(z.void(), z.array(z.object({\n id: z.string(),\n name: z.string(),\n type: z.string(),\n }))),\n\n // ── Discovery + adoption (optional — see supportsDiscovery) ──────\n supportsDiscovery: method(z.object({}), z.boolean()),\n discoverDevices: method(\n z.object({}),\n z.array(DiscoveryCandidateSchema),\n { kind: 'mutation', auth: 'admin' },\n ),\n adoptDiscoveredDevice: method(\n z.object({ candidate: DiscoveryCandidateSchema }),\n DeviceSummarySchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n\n // ── Manual creation (optional — see supportsManualCreation) ──────\n supportsManualCreation: method(z.object({}), z.boolean()),\n /**\n * Fetch the creation form schema for a given DeviceType. Returns\n * `null` when the provider does not support manually creating\n * devices of that type. The output is a `ConfigUISchema` — the\n * router type-asserts it at the boundary.\n */\n getChildCreationSchema: method(\n z.object({ type: z.enum(DeviceType) }),\n CreationSchemaOutputSchema,\n ),\n createDevice: method(\n z.object({\n type: z.enum(DeviceType),\n config: z.record(z.string(), z.unknown()),\n }),\n DeviceSummarySchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n /**\n * Test a single field in the creation form before the device has\n * been persisted. Typical use: probing an RTSP URL entered by the\n * user. Providers that don't support field probing return\n * `{ success: true, message: 'Field test not supported' }`.\n *\n * `formValues` is the live snapshot of every field in the form at\n * the moment the user clicked Test — useful for probes that depend\n * on multiple fields together (e.g. Reolink autodetect needs host\n * + credentials + UID + transport mode in a single call). Optional\n * for backwards compatibility; providers free to ignore it.\n */\n testCreationField: method(\n z.object({\n type: z.enum(DeviceType),\n key: z.string(),\n value: z.unknown(),\n formValues: z.record(z.string(), z.unknown()).optional(),\n }),\n FieldProbeResultSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IDeviceProvider = InferProvider<typeof deviceProviderCapability>\n\nexport {\n ProviderStatusSchema,\n DiscoveredDeviceSchema,\n DiscoveryCandidateSchema,\n DeviceSummarySchema,\n FieldProbeResultSchema,\n}\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n// ── Zod schemas for ConfigUISchemaWithValues ─────────────────────────\n//\n// Same loose field typing as the addons.router.ts schemas — the\n// polymorphic discriminated-union schema would explode to ~14 variants\n// with nested group recursion. `z.any()` keeps runtime validation on\n// the outer structure while preserving assignability to the domain type.\n\nconst ConfigTabDeclarationSchema = z.object({\n id: z.string(),\n label: z.string(),\n icon: z.string(),\n order: z.number().optional(),\n})\n\nconst ConfigSectionWithValuesSchema = z.object({\n id: z.string(),\n title: z.string(),\n description: z.string().optional(),\n style: z.enum(['card', 'accordion']).optional(),\n defaultCollapsed: z.boolean().optional(),\n columns: z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4)]).optional(),\n tab: z.string().optional(),\n // Hoist the section into a top-level device tab. DeviceDetail\n // discovers these from the aggregate and renders one tab per unique\n // `tab` id; the default `'settings'` keeps the section under Config.\n location: z.enum(['settings', 'top-tab']).optional(),\n order: z.number().optional(),\n fields: z.array(z.any()),\n})\n\nconst SettingsSchemaWithValuesSchema = z.object({\n tabs: z.array(ConfigTabDeclarationSchema).optional(),\n sections: z.array(ConfigSectionWithValuesSchema),\n})\n\n/** Patch object — keys are field names, values are the new field values. */\nconst SettingsPatchSchema = z.record(z.string(), z.unknown())\n\n/** Standard success response for update operations. */\nconst SettingsUpdateResultSchema = z.object({\n success: z.literal(true),\n})\n\n/**\n * addon-settings — singleton gateway for three-level addon settings.\n *\n * Works like `device-manager`: a single hub-side provider that resolves\n * `addonId` to the target addon and delegates the call. For hub-local\n * addons the call is direct; for remote agents it proxies via the\n * per-addon Moleculer service.\n *\n * Replaces the `$addonHost` Moleculer service. Transport transparency\n * is handled by the provider implementation — callers (admin UI, other\n * addons via `ctx.api`) never know which node hosts the target addon.\n *\n * Three levels:\n * - **addon**: addon-scoped settings (installation config, API keys, …)\n * - **global**: settings applied to all devices by default\n * - **device**: per-device overrides\n *\n * Optional `nodeId` allows explicit node targeting. When absent the\n * provider resolves the addon's host node automatically.\n */\n/**\n * `addon-settings` is a **hub-centric** cap: the hub hosts the single\n * provider, and `nodeId` in the input is data for the hub provider's\n * internal dispatcher, not a routing hint for the cap-router. See\n * `CapabilityDefinition.nodeIdMode` for the contract.\n */\nexport const addonSettingsCapability = {\n name: 'addon-settings',\n scope: 'system',\n mode: 'singleton',\n nodeIdMode: 'data',\n methods: {\n // ── Global-level settings ─────────────────────────────────────────\n //\n // `overlay` — optional preview overlay. When present, the provider\n // hydrates the schema as if the overlay were merged on top of the\n // persisted store (without writing anything). Used by override-mode\n // UIs (benchmark tabs) to get cascade-aware option lists when the\n // operator tweaks an upstream field — e.g. changing engineRuntime\n // from 'python' to 'node' refetches with `overlay: {engineRuntime:\n // 'node'}` so the backend/device dropdowns re-derive.\n getGlobalSettings: method(\n z.object({\n addonId: z.string(),\n nodeId: z.string().optional(),\n overlay: z.record(z.string(), z.unknown()).optional(),\n }),\n SettingsSchemaWithValuesSchema.nullable(),\n ),\n updateGlobalSettings: method(\n z.object({ addonId: z.string(), nodeId: z.string().optional(), patch: SettingsPatchSchema }),\n SettingsUpdateResultSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n\n // ── Device-level settings ─────────────────────────────────────────\n getDeviceSettings: method(\n z.object({ addonId: z.string(), deviceId: z.number(), nodeId: z.string().optional() }),\n SettingsSchemaWithValuesSchema.nullable(),\n ),\n updateDeviceSettings: method(\n z.object({ addonId: z.string(), deviceId: z.number(), nodeId: z.string().optional(), patch: SettingsPatchSchema }),\n SettingsUpdateResultSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IAddonSettingsProvider = InferProvider<typeof addonSettingsCapability>\n\nexport {\n SettingsSchemaWithValuesSchema,\n ConfigSectionWithValuesSchema,\n ConfigTabDeclarationSchema,\n SettingsPatchSchema,\n SettingsUpdateResultSchema,\n}\n","/**\n * Alerts capability — collection-based internal alert system.\n *\n * Multiple providers can register. Each provider filters by EventBus category\n * and creates/updates alerts. The built-in Alert Center addon persists alerts\n * in the DB and serves them to the admin UI.\n */\n\nimport { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n// ── Alert schemas ───────────────────────────────────────────────────\n\nexport const AlertSeveritySchema = z.enum(['info', 'success', 'warning', 'error'])\n\nexport const AlertStatusSchema = z.enum(['active', 'in-progress', 'completed', 'failed', 'dismissed'])\n\nexport const AlertSourceSchema = z.object({\n type: z.string(),\n id: z.string(),\n})\n\nexport const AlertSchema = z.object({\n id: z.string(),\n category: z.string(),\n severity: AlertSeveritySchema,\n title: z.string(),\n message: z.string(),\n status: AlertStatusSchema,\n progress: z.number().optional(),\n read: z.boolean(),\n createdAt: z.number(),\n updatedAt: z.number(),\n source: AlertSourceSchema.optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n\n// ── Inferred types ─────────────────────────────────────────────────\n\nexport type AlertSeverity = z.infer<typeof AlertSeveritySchema>\nexport type AlertStatus = z.infer<typeof AlertStatusSchema>\nexport type Alert = z.infer<typeof AlertSchema>\n\n// ── Capability definition ──────────────────────────────────────────\n\nexport const alertsCapability = {\n name: 'alerts',\n scope: 'system',\n mode: 'singleton',\n methods: {\n emit: method(AlertSchema, z.void(), { kind: 'mutation' }),\n update: method(\n z.object({ alertId: z.string(), patch: AlertSchema.partial() }),\n z.void(),\n { kind: 'mutation' },\n ),\n list: method(\n z.object({ unreadOnly: z.boolean().optional(), limit: z.number().optional() }).optional(),\n z.array(AlertSchema).readonly(),\n ),\n getUnreadCount: method(z.void(), z.number()),\n markRead: method(z.object({ alertId: z.string() }), z.void(), { kind: 'mutation' }),\n markAllRead: method(z.void(), z.void(), { kind: 'mutation' }),\n dismiss: method(z.object({ alertId: z.string() }), z.void(), { kind: 'mutation' }),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IAlertsProvider = InferProvider<typeof alertsCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport {\n StorageLocationSchema,\n StorageLocationRefSchema,\n StorageLocationTypeSchema,\n} from '../interfaces/storage-location.js'\n\n/**\n * `storage` — singleton consumer-facing capability owned by the\n * `storage-orchestrator` builtin (Task 4 of the storage-unification\n * refactor). All file I/O across the system flows through this cap;\n * the orchestrator resolves each `location` ref to a concrete\n * `StorageLocation` record and dispatches to the matching\n * `storage-provider` registrant.\n *\n * The `location` parameter on every primitive is a `StorageLocationRef`\n * — either a bare `StorageLocationType` (e.g. `'backups'`, resolves to\n * the default of that type) or a fully-qualified id (`'backups:nas-01'`,\n * addresses a specific instance). Both forms are normalised inside the\n * orchestrator's `resolveRef(ref)` step.\n *\n * Mode: `singleton` (was `collection` pre-Task-3). The cap-router mount\n * uses `requireSingleton(reg, 'storage')` — pointing at the orchestrator\n * once it lands.\n */\nexport const storageCapability = {\n name: 'storage',\n scope: 'system',\n mode: 'singleton',\n methods: {\n // ── Small-file primitives ────────────────────────────────────────\n // `location` is a ref (type or fully-qualified id). The orchestrator\n // resolves the ref to a concrete `StorageLocation` and dispatches.\n resolve: method(\n z.object({ location: StorageLocationRefSchema, relativePath: z.string() }),\n z.string(),\n ),\n write: method(\n z.object({ location: StorageLocationRefSchema, relativePath: z.string(), data: z.instanceof(Uint8Array) }),\n z.void(),\n { kind: 'mutation' },\n ),\n read: method(\n z.object({ location: StorageLocationRefSchema, relativePath: z.string() }),\n z.instanceof(Uint8Array),\n ),\n exists: method(\n z.object({ location: StorageLocationRefSchema, relativePath: z.string() }),\n z.boolean(),\n ),\n list: method(\n z.object({ location: StorageLocationRefSchema, prefix: z.string().optional() }),\n z.array(z.string()).readonly(),\n ),\n delete: method(\n z.object({ location: StorageLocationRefSchema, relativePath: z.string() }),\n z.void(),\n { kind: 'mutation' },\n ),\n getAvailableSpace: method(\n z.object({ location: StorageLocationRefSchema }),\n z.number().nullable(),\n ),\n\n // ── Chunked I/O ──────────────────────────────────────────────────\n // Same protocol as `storage-provider` but on the consumer side.\n // Sessions are owned by the orchestrator: it forwards each chunk\n // to the provider that backs the resolved location.\n beginUpload: method(\n z.object({ location: StorageLocationRefSchema, relativePath: z.string(), sizeBytes: z.number().optional() }),\n z.object({ uploadId: z.string() }),\n { kind: 'mutation' },\n ),\n writeChunk: method(\n z.object({ uploadId: z.string(), offset: z.number(), data: z.instanceof(Uint8Array) }),\n z.void(),\n { kind: 'mutation' },\n ),\n finalizeUpload: method(z.object({ uploadId: z.string() }), z.void(), { kind: 'mutation' }),\n abortUpload: method(z.object({ uploadId: z.string() }), z.void(), { kind: 'mutation' }),\n beginDownload: method(\n z.object({ location: StorageLocationRefSchema, relativePath: z.string() }),\n z.object({ downloadId: z.string(), sizeBytes: z.number() }),\n { kind: 'mutation' },\n ),\n readChunk: method(\n z.object({ downloadId: z.string(), offset: z.number(), length: z.number() }),\n z.instanceof(Uint8Array),\n ),\n endDownload: method(z.object({ downloadId: z.string() }), z.void(), { kind: 'mutation' }),\n\n // ── Location management ─────────────────────────────────────────\n // The orchestrator's authoritative surface for the admin-UI's\n // storage-locations page. Operators add/edit/test/remove location\n // instances here; `upsertLocation` and `deleteLocation` require\n // superAdmin auth.\n listLocations: method(\n z.object({ type: StorageLocationTypeSchema.optional() }),\n z.array(StorageLocationSchema).readonly(),\n ),\n getDefaultLocation: method(\n z.object({ type: StorageLocationTypeSchema }),\n StorageLocationSchema.nullable(),\n ),\n upsertLocation: method(\n StorageLocationSchema.omit({ createdAt: true, updatedAt: true }),\n StorageLocationSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n deleteLocation: method(\n z.object({ id: z.string() }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n testLocation: method(\n z.object({ id: z.string() }),\n z.object({ ok: z.boolean(), error: z.string().optional() }),\n { auth: 'admin' },\n ),\n\n // ── Provider discovery ──────────────────────────────────────────\n // The admin-UI's \"Add location\" wizard shows one entry per\n // registered `storage-provider` collection cap. Each entry is the\n // provider's `getProviderInfo()` blob — stable, addon-driven, no\n // hard-coded list in the UI. The orchestrator gathers them by\n // walking the registry on every call (cheap; the list almost\n // never changes after boot).\n listProviders: method(\n z.void(),\n z.array(z.object({\n providerId: z.string(),\n displayName: z.string(),\n supportedLocationTypes: z.array(StorageLocationTypeSchema).readonly(),\n configSchema: z.unknown(),\n })).readonly(),\n ),\n\n // Validate a candidate config against a provider BEFORE persisting.\n // Used by the wizard so operators can preflight a connection\n // (e.g. SFTP credentials, S3 bucket access) without leaving an\n // orphan record behind on failure.\n testConfig: method(\n z.object({\n providerId: z.string(),\n config: z.record(z.string(), z.unknown()),\n }),\n z.object({ ok: z.boolean(), error: z.string().optional() }),\n { auth: 'admin' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IStorageCapProvider = InferProvider<typeof storageCapability>\n\nexport { StorageLocationTypeSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { StorageLocationSchema } from '../interfaces/storage-location.js'\nimport { StorageLocationTypeSchema } from './storage.cap.js'\n\n// ── Provider self-description ───────────────────────────────────────\n//\n// `getProviderInfo` returns a static description that the orchestrator\n// hands to the admin-UI's \"Add location\" wizard. Operators see one\n// entry per provider — its `displayName`, the `StorageLocationType`s it\n// can host, and the `configSchema` that drives the wizard form.\n//\n// `configSchema` mirrors `ConfigUISchemaWithValues` (sections[] +\n// optional tabs[]). Typed here as `z.unknown()` to avoid a hard import\n// from `interfaces/config-ui.ts` (which isn't a Zod schema). The admin\n// UI casts it back to the concrete TS interface at consumption time.\n\nconst ProviderInfoSchema = z.object({\n providerId: z.string().min(1),\n displayName: z.string().min(1),\n supportedLocationTypes: z.array(StorageLocationTypeSchema).readonly(),\n configSchema: z.unknown(),\n})\n\nconst TestLocationResultSchema = z.object({\n ok: z.boolean(),\n error: z.string().optional(),\n})\n\n// ── Chunked upload protocol ─────────────────────────────────────────\n//\n// Large archives (backup snapshots, recordings) flow through a session:\n// beginUpload(location, relativePath, sizeBytes?) → uploadId\n// writeChunk(uploadId, offset, data) × N\n// finalizeUpload(uploadId) // commit\n// abortUpload(uploadId) // discard\n//\n// Each chunk is self-describing (`offset`) so providers can dedupe or\n// resume on disconnect. Providers SHOULD enforce a max chunk size and\n// reject malformed offsets.\n\nconst BeginUploadInputSchema = z.object({\n location: StorageLocationSchema,\n relativePath: z.string(),\n sizeBytes: z.number().optional(),\n})\nconst BeginUploadResultSchema = z.object({ uploadId: z.string() })\nconst WriteChunkInputSchema = z.object({\n uploadId: z.string(),\n offset: z.number(),\n data: z.instanceof(Uint8Array),\n})\nconst FinalizeUploadInputSchema = z.object({ uploadId: z.string() })\nconst AbortUploadInputSchema = z.object({ uploadId: z.string() })\n\n// ── Chunked download protocol ───────────────────────────────────────\n// Symmetric to upload: open-by-path returns a session + total size,\n// reader pulls byte ranges, end closes the session.\n\nconst BeginDownloadInputSchema = z.object({\n location: StorageLocationSchema,\n relativePath: z.string(),\n})\nconst BeginDownloadResultSchema = z.object({\n downloadId: z.string(),\n sizeBytes: z.number(),\n})\nconst ReadChunkInputSchema = z.object({\n downloadId: z.string(),\n offset: z.number(),\n length: z.number(),\n})\nconst EndDownloadInputSchema = z.object({ downloadId: z.string() })\n\n/**\n * storage-provider — collection capability for backend-specific storage\n * drivers.\n *\n * Multiple addons register against this cap (filesystem-storage,\n * sftp-storage, s3-storage, webdav-storage, …). The orchestrator\n * (singleton `storage` cap, owned by the storage-orchestrator builtin)\n * routes each call to the right provider by looking up\n * `location.providerId` and dispatching the inline `location` arg.\n *\n * Design notes:\n * - Stateless dispatch: every primitive carries its own `location`,\n * so providers don't keep per-location state across calls.\n * - Session-scoped uploads/downloads: the `uploadId`/`downloadId`\n * handles let the provider hold open file descriptors / streams\n * between chunks while keeping the cap surface RPC-friendly.\n * - `internal: true` — this cap is consumed only by the storage\n * orchestrator. Public consumers go through the `storage`\n * singleton cap; they never see `storage-provider` directly.\n */\nexport const storageProviderCapability = {\n name: 'storage-provider',\n scope: 'system',\n mode: 'collection',\n internal: true,\n methods: {\n /** Self-description for the \"Add location\" wizard. */\n getProviderInfo: method(z.void(), ProviderInfoSchema),\n\n /** Validate config + probe connectivity. Called on add and on edit. */\n testLocation: method(\n z.object({ config: z.record(z.string(), z.unknown()) }),\n TestLocationResultSchema,\n { auth: 'admin' },\n ),\n\n // ── Small-file primitives ────────────────────────────────────────\n // The location is passed inline so the orchestrator dispatches\n // without provider-side location state.\n resolve: method(\n z.object({ location: StorageLocationSchema, relativePath: z.string() }),\n z.string(),\n ),\n write: method(\n z.object({ location: StorageLocationSchema, relativePath: z.string(), data: z.instanceof(Uint8Array) }),\n z.void(),\n { kind: 'mutation' },\n ),\n read: method(\n z.object({ location: StorageLocationSchema, relativePath: z.string() }),\n z.instanceof(Uint8Array),\n ),\n exists: method(\n z.object({ location: StorageLocationSchema, relativePath: z.string() }),\n z.boolean(),\n ),\n list: method(\n z.object({ location: StorageLocationSchema, prefix: z.string().optional() }),\n z.array(z.string()).readonly(),\n ),\n delete: method(\n z.object({ location: StorageLocationSchema, relativePath: z.string() }),\n z.void(),\n { kind: 'mutation' },\n ),\n getAvailableSpace: method(\n z.object({ location: StorageLocationSchema }),\n z.number().nullable(),\n ),\n\n // ── Chunked upload ──────────────────────────────────────────────\n beginUpload: method(BeginUploadInputSchema, BeginUploadResultSchema, { kind: 'mutation' }),\n writeChunk: method(WriteChunkInputSchema, z.void(), { kind: 'mutation' }),\n finalizeUpload: method(FinalizeUploadInputSchema, z.void(), { kind: 'mutation' }),\n abortUpload: method(AbortUploadInputSchema, z.void(), { kind: 'mutation' }),\n\n // ── Chunked download ────────────────────────────────────────────\n beginDownload: method(BeginDownloadInputSchema, BeginDownloadResultSchema, { kind: 'mutation' }),\n readChunk: method(ReadChunkInputSchema, z.instanceof(Uint8Array)),\n endDownload: method(EndDownloadInputSchema, z.void(), { kind: 'mutation' }),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IStorageProviderImpl = InferProvider<typeof storageProviderCapability>\n\nexport {\n ProviderInfoSchema,\n TestLocationResultSchema,\n BeginUploadInputSchema,\n BeginUploadResultSchema,\n WriteChunkInputSchema,\n FinalizeUploadInputSchema,\n AbortUploadInputSchema,\n BeginDownloadInputSchema,\n BeginDownloadResultSchema,\n ReadChunkInputSchema,\n EndDownloadInputSchema,\n}\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n/**\n * Per-destination metadata returned by `backup-destination.listDestinations`.\n * Defined here (not in `backup-destination.cap.ts`) because both caps need\n * it and `backup` is the foundation — the destination cap imports from us.\n */\n/**\n * Provider-side destination metadata. The addon returns a SHORT id\n * (`subId`) — orchestrator-internal-only routing prepends the addon's\n * manifest id to produce the externally-visible globally-unique id.\n *\n * Why split: the addon shouldn't have to know its own manifest id.\n * That id is owned by `package.json` and the kernel's registry; making\n * the addon repeat it leaks framework state into addon code and\n * breaks if the manifest is ever renamed.\n */\nconst BackupSubDestinationInfoSchema = z.object({\n /**\n * Sub-id within this addon. Convention `default` for single-\n * destination addons; addons that host many (S3 with N buckets)\n * pick stable per-bucket strings. The orchestrator stitches\n * `<manifestId>:<subId>` for the wire format.\n */\n subId: z.string(),\n displayName: z.string(),\n description: z.string().optional(),\n kind: z.string(),\n triggerSupported: z.boolean(),\n restoreSupported: z.boolean(),\n})\n\n/**\n * Orchestrator-side destination metadata. The orchestrator computes\n * `id = <addonId>:<subId>` from its provider lookup so consumers\n * (admin UI, restore flow) see one canonical key.\n *\n * Phase 4 (admin UI redesign) adds the per-destination policy fields\n * (`enabled`, `retentionCount`, `label`) so the destinations table can\n * render the joined view without a follow-up round-trip. The backend\n * already joins these in `listDestinations` — we now surface them on\n * the wire.\n *\n * `lastSuccessAt` / `lastSuccessSizeBytes` are computed from each\n * location's `manifests.json` (newest archive). Optional — locations\n * with no archives yet leave them undefined.\n */\nconst BackupDestinationInfoSchema = BackupSubDestinationInfoSchema.extend({\n /** `<addonId>:<subId>` — globally-unique dispatch key. */\n id: z.string(),\n /**\n * Manifest id of the owning addon. The Settings button on the\n * destination card opens that addon's `globalSettingsSchema` panel.\n */\n addonId: z.string(),\n /** Operator-toggled enable flag from the destination-policy table. */\n enabled: z.boolean(),\n /** Operator-defined retention count (archives kept per destination). */\n retentionCount: z.number(),\n /** Operator-defined display label (overrides storage location displayName). */\n label: z.string().optional(),\n /** Newest-archive timestamp from `manifests.json`, or undefined. */\n lastSuccessAt: z.number().optional(),\n /** Newest-archive size from `manifests.json`, or undefined. */\n lastSuccessSizeBytes: z.number().optional(),\n /** Per-destination cron expression. Empty = manual-only (no schedule). */\n cron: z.string().optional(),\n /** ms-epoch of next computed firing for this destination's cron, if any. */\n nextRunAt: z.number().optional(),\n /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */\n lastRunAt: z.number().optional(),\n})\n\n/**\n * Per-archive entry returned by `backup.listArchives({ destinationId })`.\n * Same shape the destination drill-in renders. Sourced from the per-\n * location `manifests.json` (no per-archive tarball read required).\n */\nconst BackupArchiveEntrySchema = z.object({\n id: z.string(),\n filename: z.string(),\n createdAt: z.number(),\n sizeBytes: z.number(),\n label: z.string().optional(),\n /** Top-level locations included in the archive (db, addons, tls, …). */\n locations: z.array(z.string()).readonly(),\n})\n\nconst BackupEntrySchema = z.object({\n id: z.string(),\n /** Addon id of the destination that owns this backup (e.g. `local-backup`, `s3-backup`). */\n destinationId: z.string().optional(),\n label: z.string().optional(),\n createdAt: z.number(),\n sizeBytes: z.number(),\n locations: z.array(z.string()).optional(),\n})\n\nconst ArchiveEntrySchema = z.object({\n path: z.string(),\n kind: z.enum(['file', 'dir', 'symlink']),\n sizeBytes: z.number(),\n mtime: z.number(),\n})\n\nconst ArchiveManifestSchema = z.object({\n archiveVersion: z.literal(1),\n createdAt: z.number(),\n dataDir: z.string(),\n locations: z.array(z.string()),\n entries: z.array(ArchiveEntrySchema),\n totalBytes: z.number(),\n totalFiles: z.number(),\n})\n\nconst LocationStatSchema = z.object({\n name: z.string(),\n sizeBytes: z.number(),\n fileCount: z.number(),\n present: z.boolean(),\n})\n\n/**\n * backup — singleton capability for backup management.\n *\n * Implemented by `local-backup` addon. Future providers (S3, rsync)\n * can replace it by registering the same capability.\n */\nexport const backupCapability = {\n name: 'backup',\n scope: 'system',\n mode: 'singleton',\n methods: {\n /**\n * Flat aggregate of every destination across every registered\n * `backup-destination` provider. This is the orchestrator-side\n * surface; it expands per-addon `listDestinations()` results into\n * one list the UI can render directly.\n */\n listDestinations: method(\n z.void(),\n z.array(BackupDestinationInfoSchema).readonly(),\n { auth: 'admin' },\n ),\n /**\n * Trigger a backup. Without `destinations` the orchestrator fans\n * out to every destination flagged as enabled in the routing\n * config; with it, only the listed addons receive the archive.\n */\n trigger: method(\n z.object({\n /** Subset of registered `backup-destination` addon ids to write to. */\n destinations: z.array(z.string()).optional(),\n locations: z.array(z.string()).optional(),\n label: z.string().optional(),\n }).optional(),\n z.array(BackupEntrySchema).readonly(),\n { kind: 'mutation', auth: 'admin' },\n ),\n /** Union of every destination's archives, each tagged with `destinationId`. */\n list: method(z.void(), z.array(BackupEntrySchema).readonly(), { auth: 'admin' }),\n /**\n * Pre-backup snapshot of the well-known locations on disk — sizes\n * + file counts. Powers the opt-in checklist that lets the\n * operator pick which subsections of state get archived.\n */\n listLocations: method(z.void(), z.array(LocationStatSchema).readonly(), { auth: 'admin' }),\n /**\n * Read the embedded `.camstack-backup-manifest.json` from a\n * previously-created archive. The manifest carries the full\n * file/dir listing with sizes + mtimes — the readdir snapshot\n * the UI shows in the \"Contents\" panel. Returns `null` when the\n * archive predates manifests (created before this feature\n * shipped).\n */\n getEntries: method(\n z.object({ destinationId: z.string(), backupId: z.string() }),\n ArchiveManifestSchema.nullable(),\n { auth: 'admin' },\n ),\n restore: method(\n z.object({\n destinationId: z.string(),\n backupId: z.string(),\n /**\n * Optional whitelist — only restore these top-level locations\n * from the archive. Default = every location the archive\n * carries (full restore). The boot-time apply hook reads\n * this list and skips entries whose path doesn't start with\n * any of them.\n */\n locations: z.array(z.string()).optional(),\n }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n delete: method(\n z.object({ destinationId: z.string(), backupId: z.string() }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n /**\n * List archives at a single destination. Reads the per-location\n * `manifests.json` and returns one entry per archive (newest\n * first). Powers the destinations-table drill-in in admin UI.\n */\n listArchives: method(\n z.object({ destinationId: z.string() }),\n z.array(BackupArchiveEntrySchema).readonly(),\n { auth: 'admin' },\n ),\n /**\n * Upsert a per-destination policy row. The `locationId` MUST be\n * the id of an existing `backups`-typed `StorageLocation`. Used\n * by the admin-UI destinations table (enable toggle + retention\n * input + optional label).\n */\n upsertDestinationPolicy: method(\n z.object({\n locationId: z.string(),\n enabled: z.boolean(),\n retentionCount: z.number().int().min(1).max(1000),\n label: z.string().optional(),\n /**\n * Per-destination cron expression. Empty string clears the\n * schedule (manual-only). Validated server-side via croner;\n * malformed expressions reject the upsert with an actionable\n * message.\n */\n cron: z.string().optional(),\n }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n /**\n * Validate a cron expression and peek the next N firing times.\n * Used by the admin-UI CronEditor to render a live \"next-run\"\n * preview as the operator edits the pattern.\n */\n previewSchedule: method(\n z.object({\n cron: z.string(),\n count: z.number().int().min(1).max(20).optional(),\n }),\n z.object({\n ok: z.boolean(),\n error: z.string().optional(),\n nextRuns: z.array(z.number()).readonly(),\n }),\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IBackupProvider = InferProvider<typeof backupCapability>\n\nexport {\n BackupEntrySchema,\n BackupSubDestinationInfoSchema,\n BackupDestinationInfoSchema,\n BackupArchiveEntrySchema,\n ArchiveEntrySchema,\n ArchiveManifestSchema,\n LocationStatSchema,\n}\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n/**\n * Query filter for settings-store collections.\n */\nconst QueryFilterSchema = z.object({\n where: z.record(z.string(), z.unknown()).optional(),\n whereIn: z.record(z.string(), z.array(z.unknown())).optional(),\n whereBetween: z.record(z.string(), z.tuple([z.unknown(), z.unknown()])).optional(),\n orderBy: z.object({\n field: z.string(),\n direction: z.enum(['asc', 'desc']),\n }).optional(),\n limit: z.number().optional(),\n offset: z.number().optional(),\n})\n\n/** A single stored record: `{ id, data }`. */\nconst SettingsRecordSchema = z.object({\n id: z.string(),\n data: z.record(z.string(), z.unknown()),\n})\n\n/**\n * Column declaration for a structured (SQL-backed) collection.\n * SQLite types: TEXT, INTEGER, REAL, JSON (JSON is a compatibility type —\n * SQLite stores it as TEXT, backend handles serialization).\n */\nconst CollectionColumnSchema = z.object({\n name: z.string(),\n type: z.enum(['TEXT', 'INTEGER', 'REAL', 'JSON']),\n primaryKey: z.boolean().optional(),\n notNull: z.boolean().optional(),\n unique: z.boolean().optional(),\n})\n\nconst CollectionIndexSchema = z.object({\n name: z.string(),\n columns: z.array(z.string()).readonly(),\n unique: z.boolean().optional(),\n})\n\n/**\n * settings-store — singleton capability for addon-scoped persistence.\n *\n * Every method operates within a `collection`. An optional `namespace`\n * field provides access to additional data spaces beyond the default\n * addon settings — useful for business data (events, tracks, faces, etc.).\n *\n * Scoping: the implementation prefixes every collection with the calling\n * addon's ID automatically. Addons never see each other's data.\n *\n * - No namespace (default): `\"addon-settings\"` → `\"<addonId>:addon-settings\"`\n * - With namespace: `{ namespace: 'events', collection: 'detections' }` →\n * `\"<addonId>:events:detections\"`\n *\n * Implemented by `@camstack/core/builtins/sqlite-settings` (SQLite WAL backend).\n * Addons access it via `ctx.api.settingsStore.*`.\n */\nexport const settingsStoreCapability = {\n name: 'settings-store',\n scope: 'system',\n mode: 'singleton',\n methods: {\n /** Get a single value by key from a collection. */\n get: method(\n z.object({ namespace: z.string().optional(), collection: z.string(), key: z.string() }),\n z.unknown(),\n ),\n\n /** Set a value by key in a collection (upsert). */\n set: method(\n z.object({ namespace: z.string().optional(), collection: z.string(), key: z.string(), value: z.unknown() }),\n z.void(),\n { kind: 'mutation' },\n ),\n\n /** Get all entries matching an optional filter. */\n query: method(\n z.object({ namespace: z.string().optional(), collection: z.string(), filter: QueryFilterSchema.optional() }),\n z.array(SettingsRecordSchema).readonly(),\n ),\n\n /** Insert a new record. */\n insert: method(\n z.object({ namespace: z.string().optional(), collection: z.string(), record: SettingsRecordSchema }),\n z.void(),\n { kind: 'mutation' },\n ),\n\n /** Update an existing record by ID. */\n update: method(\n z.object({ namespace: z.string().optional(), collection: z.string(), id: z.string(), data: z.record(z.string(), z.unknown()) }),\n z.void(),\n { kind: 'mutation' },\n ),\n\n /** Delete a record by key/ID. */\n delete: method(\n z.object({ namespace: z.string().optional(), collection: z.string(), key: z.string() }),\n z.void(),\n { kind: 'mutation' },\n ),\n\n /** Count entries in a collection, optionally filtered. */\n count: method(\n z.object({ namespace: z.string().optional(), collection: z.string(), filter: QueryFilterSchema.optional() }),\n z.number(),\n ),\n\n /** Check if a collection is empty. */\n isEmpty: method(\n z.object({ namespace: z.string().optional(), collection: z.string() }),\n z.boolean(),\n ),\n\n /**\n * Declare a typed (SQL-backed) collection with explicit columns +\n * indexes. Idempotent: re-declaring an existing collection with the\n * same shape is a no-op; shape changes (new columns, new indexes)\n * are applied additively. Subsequent `insert` / `update` / `delete`\n * / `query` calls on this collection use typed columns instead of\n * JSON-blob storage — `record.data` fields are spread across\n * columns, `query.filter.where` matches real columns (no\n * `json_extract` overhead), `orderBy` uses column indexes.\n *\n * Addons call this in `onInitialize` before their first read/write.\n * Collection names should be namespaced by addon (e.g.\n * `pipeline-analytics:object-events`) to avoid cross-addon\n * clashes — no automatic prefix is added.\n */\n declareCollection: method(\n z.object({\n namespace: z.string().optional(),\n collection: z.string(),\n columns: z.array(CollectionColumnSchema).readonly(),\n indexes: z.array(CollectionIndexSchema).readonly().optional(),\n }),\n z.void(),\n { kind: 'mutation' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type ISettingsStoreProvider = InferProvider<typeof settingsStoreCapability>\n\n/**\n * tRPC client namespace type for the settings-store capability.\n * Used as the dependency type for services that need settings persistence.\n * Methods are accessed as `client.get.query(input)`, `client.set.mutate(input)`, etc.\n */\nexport type SettingsStoreClient = import('../generated/addon-api.js').AddonApi['settingsStore']\n\nexport { QueryFilterSchema, SettingsRecordSchema, CollectionColumnSchema, CollectionIndexSchema }\n\nexport type CollectionColumn = z.infer<typeof CollectionColumnSchema>\nexport type CollectionIndex = z.infer<typeof CollectionIndexSchema>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\nconst LogLevelSchema = z.enum(['debug', 'info', 'warn', 'error'])\n\nconst LogEntrySchema = z.object({\n timestamp: z.date(),\n level: LogLevelSchema,\n scope: z.array(z.string()),\n message: z.string(),\n meta: z.record(z.string(), z.unknown()).optional(),\n tags: z.record(z.string(), z.string()).optional(),\n})\n\nexport const logDestinationCapability = {\n name: 'log-destination',\n scope: 'system',\n mode: 'collection',\n internal: true,\n methods: {\n write: method(LogEntrySchema, z.void(), { kind: 'mutation' }),\n query: method(\n z.object({\n scope: z.array(z.string()).optional(),\n level: LogLevelSchema.optional(),\n since: z.date().optional(),\n until: z.date().optional(),\n limit: z.number().optional(),\n tags: z.record(z.string(), z.string()).optional(),\n }),\n z.array(LogEntrySchema).readonly(),\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type ILogDestinationProvider = InferProvider<typeof logDestinationCapability>\n\nexport { LogEntrySchema, LogLevelSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\nexport const adminUiCapability = {\n name: 'admin-ui',\n scope: 'system',\n mode: 'singleton',\n internal: true,\n methods: {\n getStaticDir: method(z.void(), z.string()),\n getVersion: method(z.void(), z.string()),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IAdminUiProvider = InferProvider<typeof adminUiCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n/**\n * `addon-pages` — system-scoped singleton aggregator cap. Public-facing\n * surface that admin-ui consumes through `useAddonPagesListPages()`.\n *\n * The provider iterates every `addon-pages-source` (collection) provider\n * and emits `AddonPageInfo[]` enriched with versioned `bundleUrl` strings\n * pointing at `/api/addon-pages/<addonId>/<bundle>?v=<mtime>`. The\n * filesystem `mtime` cache-buster lets the browser pick up addon\n * rebuilds without manual reload.\n *\n * The hub-local builtin `addon-pages-aggregator` (see\n * `@camstack/core/builtins/addon-pages-aggregator`) registers the\n * provider. Splitting the public aggregator from the raw collection\n * keeps both ends in codegen — there's no hand-written\n * `addon-pages.router.ts` wrapper anymore.\n */\n\nconst AddonPageDeclarationSchema = z.object({\n id: z.string(),\n label: z.string(),\n icon: z.string(),\n path: z.string(),\n remoteName: z.string(),\n bundle: z.string(),\n})\n\nconst AddonPageInfoSchema = z.object({\n addonId: z.string(),\n page: AddonPageDeclarationSchema,\n bundleUrl: z.string(),\n})\n\nexport const addonPagesCapability = {\n name: 'addon-pages',\n scope: 'system',\n mode: 'singleton',\n methods: {\n listPages: method(z.void(), z.array(AddonPageInfoSchema).readonly()),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IAddonPagesAggregatorProvider = InferProvider<typeof addonPagesCapability>\n\nexport { AddonPageInfoSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n/**\n * `addon-pages-source` — collection cap exposing per-provider raw page\n * declarations. Every addon that contributes a UI page registers a\n * provider here. The hub-side singleton aggregator (`addon-pages` cap,\n * see `addon-pages.cap.ts`) walks this collection, stamps versioned\n * `bundleUrl` values, and returns the enriched `AddonPageInfo[]` list\n * that admin-ui consumes.\n *\n * The split exists because the public listing has a different output\n * shape than the per-provider raw declarations, and we want both ends\n * to flow through codegen instead of relying on a hand-written wrapper.\n */\nconst AddonPageDeclarationSchema = z.object({\n id: z.string(),\n label: z.string(),\n icon: z.string(),\n path: z.string(),\n /**\n * Module Federation remote name — must match the `name` field on the\n * page addon's `federation()` plugin config. Used by admin-ui's\n * `<AddonPageLoader>` to call `loadRemote('<remoteName>/page')`.\n * Conventionally `addon_<id>_page` (snake_case; MF names cannot\n * contain hyphens).\n */\n remoteName: z.string(),\n /**\n * Bundle filename inside the addon's `dist/` dir served at\n * `/api/addon-pages/<addonId>/<bundle>`. With Module Federation this\n * is always `'remoteEntry.js'`; the value is kept on the metadata so\n * the static-file route can compute an mtime-based cache-buster URL\n * without a separate filesystem stat.\n */\n bundle: z.string(),\n})\n\nexport const addonPagesSourceCapability = {\n name: 'addon-pages-source',\n scope: 'system',\n mode: 'collection',\n internal: true,\n methods: {\n listPages: method(z.void(), z.array(AddonPageDeclarationSchema).readonly()),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IAddonPagesSourceProvider = InferProvider<typeof addonPagesSourceCapability>\n\nexport { AddonPageDeclarationSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n/**\n * `addon-widgets-source` — collection cap exposing per-addon raw widget\n * declarations. Mirrors the addon-pages split: every addon shipping\n * widgets registers a provider on this collection cap; the hub-local\n * aggregator (`addon-widgets`, see `addon-widgets.cap.ts`) walks the\n * collection, stamps versioned `bundleUrl`s onto each declaration, and\n * exposes the public listing surface that admin-ui consumes.\n *\n * The split exists because the public listing has a different output\n * shape (flat enriched metadata with `addonId` + `bundleUrl`) than the\n * per-provider raw declarations. Both ends flow through codegen.\n */\nconst WidgetHostEnum = z.enum(['device-tab', 'dashboard', 'integration-detail'])\nconst WidgetSizeEnum = z.enum(['xs', 'sm', 'md', 'lg', 'xl'])\n\nconst WidgetMetadataSchema = z.object({\n /** Stable id within the addon — kebab-case. */\n stableId: z.string(),\n /** Operator-facing label. */\n label: z.string(),\n description: z.string().optional(),\n icon: z.string().optional(),\n /**\n * Module Federation remote name — must match the `name` field on the\n * widget addon's `federation()` plugin config. Used by the host's\n * `<WidgetRegistryProvider>` to call `loadRemote('<remoteName>/widgets')`.\n * Conventionally `addon_<addonid>_widgets` (snake_case; MF names\n * cannot contain hyphens).\n */\n remoteName: z.string(),\n /**\n * Bundle filename inside the addon's `dist/` dir served at\n * `/api/addon-widgets/<addonId>/<bundle>`. With Module Federation\n * this is always `'remoteEntry.js'` — the value is kept on the\n * metadata so the static-file route can compute an mtime-based\n * cache-buster URL without a separate filesystem stat.\n */\n bundle: z.string(),\n /** Where the widget makes sense to render. */\n hosts: z.array(WidgetHostEnum).readonly(),\n /** Required props the host must supply. Validated at <WidgetSlot> mount. */\n requires: z.object({\n deviceContext: z.boolean().default(false),\n integrationContext: z.boolean().default(false),\n }),\n /** Dashboard placement HINTS (operator can override per instance). */\n defaultSize: WidgetSizeEnum.default('md'),\n allowedSizes: z.array(WidgetSizeEnum).readonly().default(['sm', 'md', 'lg']),\n defaultColumns: z.number().int().min(1).max(12).default(6),\n defaultRows: z.number().int().min(1).max(12).default(1),\n})\n\nexport const addonWidgetsSourceCapability = {\n name: 'addon-widgets-source',\n scope: 'system',\n mode: 'collection',\n internal: true,\n methods: {\n listWidgets: method(z.void(), z.array(WidgetMetadataSchema).readonly()),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IAddonWidgetsSourceProvider = InferProvider<typeof addonWidgetsSourceCapability>\n\nexport { WidgetMetadataSchema, WidgetHostEnum, WidgetSizeEnum }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { WidgetMetadataSchema } from './addon-widgets-source.cap.js'\n\n/**\n * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing\n * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.\n *\n * The provider iterates every `addon-widgets-source` (collection)\n * provider and emits `EnrichedWidgetMetadata[]` enriched with versioned\n * `bundleUrl` strings pointing at\n * `/api/addon-widgets/<addonId>/<bundle>?v=<mtime>`. The filesystem\n * `mtime` cache-buster lets the browser pick up addon rebuilds without\n * manual reload — same scheme used by `addon-pages`.\n *\n * The hub-local builtin `addon-widgets-aggregator` (see\n * `@camstack/core/builtins/addon-widgets-aggregator`) registers the\n * provider. Splitting the public aggregator from the raw collection\n * keeps both ends in codegen — there's no hand-written wrapper.\n */\n\nconst EnrichedWidgetMetadataSchema = WidgetMetadataSchema.extend({\n addonId: z.string(),\n bundleUrl: z.string(),\n})\n\nexport const addonWidgetsCapability = {\n name: 'addon-widgets',\n scope: 'system',\n mode: 'singleton',\n methods: {\n listWidgets: method(z.void(), z.array(EnrichedWidgetMetadataSchema).readonly()),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IAddonWidgetsAggregatorProvider = InferProvider<typeof addonWidgetsCapability>\n\nexport { EnrichedWidgetMetadataSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\nconst AddonHttpRouteSchema = z.object({\n method: z.enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH']),\n path: z.string(),\n})\n\nexport const addonRoutesCapability = {\n name: 'addon-routes',\n scope: 'system',\n mode: 'collection',\n internal: true,\n methods: {\n getRoutes: method(z.void(), z.array(AddonHttpRouteSchema)),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IAddonRoutesProvider = InferProvider<typeof addonRoutesCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport type { HwAccelBackend } from '../interfaces/addon.js'\nimport {\n DecoderSessionConfigSchema,\n DecoderStatsSchema,\n} from '../interfaces/stream-broker.js'\nimport {\n EncodedPacketSchema,\n DecodedFrameSchema,\n} from './schemas/streaming-shared.js'\n\n/**\n * Operator-facing hwaccel selection — wins over `probedBestHwaccel`\n * when concrete; `'auto'` defers to the session's local resolver\n * (`ctx.kernel.hwaccel`) which probes the host. Shared across every\n * decoder addon (node-av, ffmpeg, …) so UI + settings + sessions all\n * speak the same vocabulary.\n */\nexport type HwAccelChoice = 'auto' | 'none' | HwAccelBackend\n\n/**\n * Stable UI option list for the `hwaccel` setting. Decoder addons\n * reuse this for `globalSettingsSchema()` so the dropdown is\n * identical everywhere. Order: auto → off → common backends by\n * platform affinity (macOS, NVIDIA, Intel/AMD, Windows, Linux).\n */\nexport const HWACCEL_OPTIONS: ReadonlyArray<{ value: HwAccelChoice; label: string }> = [\n { value: 'auto', label: 'Auto (defer to probed best)' },\n { value: 'none', label: 'Off (software)' },\n { value: 'videotoolbox', label: 'VideoToolbox (macOS)' },\n { value: 'cuda', label: 'CUDA (NVIDIA)' },\n { value: 'nvdec', label: 'NVDEC (NVIDIA legacy)' },\n { value: 'vaapi', label: 'VAAPI (Linux Intel/AMD)' },\n { value: 'qsv', label: 'QuickSync (Intel)' },\n { value: 'd3d11va', label: 'D3D11VA (Windows)' },\n { value: 'dxva2', label: 'DXVA2 (Windows legacy)' },\n { value: 'amf', label: 'AMF (AMD)' },\n { value: 'vdpau', label: 'VDPAU (Linux NVIDIA legacy)' },\n { value: 'drm', label: 'DRM (Linux generic)' },\n]\n\n/**\n * Shared shape of a decoder addon's global settings. Every decoder\n * owns its own instance (node-av, ffmpeg, future backends) — they\n * don't share a store, but they share this config shape.\n */\nexport interface DecoderHwAccelConfig {\n readonly hwaccel: HwAccelChoice\n readonly probedBestHwaccel: string\n}\n\nexport const DEFAULT_DECODER_HWACCEL_CONFIG: DecoderHwAccelConfig = {\n hwaccel: 'auto',\n probedBestHwaccel: '',\n}\n\nexport const decoderCapability = {\n name: 'decoder',\n scope: 'system',\n // Singleton — one decoder per node. `decoder-nodeav` is the default\n // install; operators can swap to a different provider via the\n // binding system's active-addon selection. The old collection shape\n // existed to let node-av + ffmpeg coexist and priority-sort at\n // stream-start; that fallback was dropped once node-av covered the\n // full codec matrix.\n mode: 'singleton',\n methods: {\n // ── Discovery ─────────────────────────────────────────────────\n supportsCodec: method(z.object({ codec: z.string() }), z.boolean()),\n getInfo: method(z.void(), z.object({\n id: z.string(),\n name: z.string(),\n isPullMode: z.boolean().optional(),\n priority: z.number().optional(),\n })),\n\n // ── Session lifecycle ─────────────────────────────────────────\n // `nodeId` carries the Moleculer nodeID of the decoder provider that\n // owns the session. Brokers store it so they can react to per-agent\n // events (e.g. `pipeline.agent-hwaccel-changed`) and rotate only the\n // sessions that actually live on the affected node.\n createSession: method(DecoderSessionConfigSchema, z.object({ sessionId: z.string(), nodeId: z.string() })),\n destroySession: method(z.object({ sessionId: z.string() }), z.void()),\n\n // ── Data plane ────────────────────────────────────────────────\n pushPacket: method(z.object({\n sessionId: z.string(),\n packet: EncodedPacketSchema,\n }), z.void()),\n openStream: method(z.object({\n sessionId: z.string(),\n url: z.string(),\n }), z.void()),\n\n // ── Output — polling-based frame retrieval ────────────────────\n pullFrames: method(z.object({\n sessionId: z.string(),\n maxCount: z.number().default(1),\n }), z.array(DecodedFrameSchema)),\n\n // ── Control ───────────────────────────────────────────────────\n updateConfig: method(z.object({\n sessionId: z.string(),\n config: DecoderSessionConfigSchema.partial(),\n }), z.void()),\n getStats: method(z.object({ sessionId: z.string() }), DecoderStatsSchema),\n\n // ── Inventory — session-level state ONLY ─────────────────────\n // Sessions are a decoder concept, so `listActiveSessions` lives\n // here. Process-level measurements (memory/cpu) go through the\n // generic `metrics-provider` cap — decoder stays free of\n // observability concerns that aren't specific to decoding.\n listActiveSessions: method(z.void(), z.array(z.object({\n sessionId: z.string(),\n codec: z.string(),\n outputFormat: z.string(),\n createdAtMs: z.number(),\n })).readonly()),\n\n /**\n * Re-run the host platform-probe for the decoder's hwaccel backend\n * and write the detected value into the addon's own global\n * settings (`probedBestHwaccel`). Replaces the legacy per-agent\n * `pipeline-orchestrator.reprobeAgentHwAccel` — each decoder addon\n * now owns its own probe.\n *\n * Returns the backend the probe picked (`'none'` = software-only\n * host, otherwise one of `HwAccelBackend`). The operator's\n * `hwaccel` setting (auto / none / backend) is not touched; only\n * the `probedBestHwaccel` hint.\n */\n reprobeHwaccel: method(\n z.void(),\n z.object({ backend: z.string() }),\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IDecoderCapProvider = InferProvider<typeof decoderCapability>\n\n/**\n * Pure cap-only view of the decoder provider.\n *\n * For the in-process interface with live `createSession()`, `id`, `name`,\n * `priority`, `isPullMode` fields, consumers should import\n * `IDecoderProvider` from `@camstack/types/interfaces/decoder` — that\n * remains the canonical in-process contract the broker + tests depend\n * on. The live `createSession()` + session object cannot cross process\n * boundaries and will need a session-id based cap API (Phase 4, decoder\n * forkable work) — tracked separately, not in scope for session 5\n * Sprint A.\n *\n * Prior to session 5 this alias used to extend the inferred cap type\n * with the live fields, creating a hybrid interface. No consumer ever\n * referenced `IDecoderProviderV2` — the broker, tests, and addon\n * implementations all imported `IDecoderProvider` directly. The\n * extension was therefore dead code and is removed here.\n */\n\nexport { DecoderSessionConfigSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\nconst RegisteredStreamSchema = z.object({\n streamId: z.string(),\n label: z.string().optional(),\n codec: z.string(),\n type: z.enum(['video', 'audio']),\n sourceUrl: z.string(),\n})\n\nconst ExposedResourceSchema = z.object({\n streamId: z.string(),\n format: z.string(),\n value: z.string(),\n})\n\nexport const restreamerCapability = {\n name: 'restreamer',\n scope: 'system',\n mode: 'collection',\n internal: true,\n methods: {\n registerDevice: method(\n z.object({ deviceId: z.number(), streams: z.array(RegisteredStreamSchema).readonly() }),\n z.void(),\n { kind: 'mutation' },\n ),\n unregisterDevice: method(z.object({ deviceId: z.number() }), z.void(), { kind: 'mutation' }),\n getExposedResources: method(\n z.object({ deviceId: z.number() }),\n z.array(ExposedResourceSchema).readonly(),\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IRestreamerProvider = InferProvider<typeof restreamerCapability>\n\nexport { RegisteredStreamSchema, ExposedResourceSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n/**\n * Optional client-side hints sent at session creation to help the\n * provider pick the best native source. All fields are optional —\n * a viewer that knows nothing still gets a sane default.\n */\nexport const webrtcClientHintsSchema = z.object({\n viewportWidth: z.number().int().positive().optional(),\n viewportHeight: z.number().int().positive().optional(),\n devicePixelRatio: z.number().positive().optional(),\n /** navigator.connection.downlink — Mbps the browser estimates. */\n downlinkMbps: z.number().nonnegative().optional(),\n /** Hard tier override; takes precedence over scoring when registered. */\n prefersTier: z.string().optional(),\n}).partial()\n\nexport type WebrtcClientHints = z.infer<typeof webrtcClientHintsSchema>\n\nexport const webrtcCapability = {\n name: 'webrtc',\n scope: 'system',\n mode: 'collection',\n internal: true,\n methods: {\n handleOffer: method(\n z.object({ streamId: z.string(), sdpOffer: z.string() }),\n z.string(),\n { kind: 'mutation' },\n ),\n supportsStream: method(z.object({ streamId: z.string() }), z.boolean()),\n registerStream: method(\n z.object({ streamId: z.string(), codec: z.string() }),\n z.void(),\n { kind: 'mutation' },\n ),\n unregisterStream: method(z.object({ streamId: z.string() }), z.void(), { kind: 'mutation' }),\n /**\n * Two-step server-offer signaling. `hints` is optional — providers\n * that don't care about adaptive source selection ignore it.\n */\n createSession: method(\n z.object({\n streamId: z.string(),\n hints: webrtcClientHintsSchema.optional(),\n }),\n z.object({ sessionId: z.string(), sdpOffer: z.string() }),\n { kind: 'mutation' },\n ),\n handleAnswer: method(\n z.object({ sessionId: z.string(), sdpAnswer: z.string() }),\n z.void(),\n { kind: 'mutation' },\n ),\n closeSession: method(z.object({ sessionId: z.string() }), z.void(), { kind: 'mutation' }),\n /**\n * Whether this provider supports adaptive bitrate for the given stream.\n * Currently always false — adaptive selection is one-shot at session\n * start, not in-session encoder switching. Phase 5 plans to layer\n * encoder-driven adaptation on top.\n */\n hasAdaptiveBitrate: method(\n z.object({ streamId: z.string() }),\n z.boolean(),\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IWebrtcProvider = InferProvider<typeof webrtcCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\nimport { CamProfileSchema } from './schemas/streaming-shared.js'\nimport { webrtcClientHintsSchema } from './webrtc.cap.js'\n\n/**\n * Discriminated target for a WebRTC session. The client sends this\n * structured object instead of building / parsing brokerId strings;\n * the server resolves it to a brokerId via the assignments map.\n *\n * - `adaptive`: server picks the best broker for the device based on\n * client hints (viewport, downlink).\n * - `profile`: pin the session to a profile slot (`high`/`mid`/`low`).\n * The actual source can change as the operator reassigns the slot.\n * - `cam-stream`: pin the session to a specific source by camStreamId\n * (e.g. `native:main`, `rtsp:sub`). Useful when the operator wants\n * a stable view of a specific source regardless of profile bindings,\n * or to consume a manually-activated stream that isn't profile-bound.\n */\nexport const WebrtcStreamTargetSchema = z.discriminatedUnion('kind', [\n z.object({ kind: z.literal('adaptive') }),\n z.object({ kind: z.literal('profile'), profile: CamProfileSchema }),\n z.object({ kind: z.literal('cam-stream'), camStreamId: z.string().min(1) }),\n])\nexport type WebrtcStreamTarget = z.infer<typeof WebrtcStreamTargetSchema>\n\n/** A stream choice the UI can offer for a device. */\nexport const WebrtcStreamChoiceSchema = z.object({\n /** Stable id for React keys / dropdowns (e.g. `'adaptive'`, `'profile:high'`, `'stream:native:main'`). */\n id: z.string(),\n /** Display label. */\n label: z.string(),\n /** Discriminated target — pass straight to `createSession`. */\n target: WebrtcStreamTargetSchema,\n /** Codec of the underlying broker stream (null for adaptive). */\n codec: z.string().nullable(),\n /** Resolution of the underlying stream (null for adaptive). */\n resolution: z.object({ width: z.number(), height: z.number() }).nullable(),\n /** Broker status (null for adaptive). */\n status: z.enum(['idle', 'connecting', 'streaming', 'error', 'stopped']).nullable(),\n /** Input FPS from the camera (null for adaptive). */\n inputFps: z.number().nullable(),\n /** Decoded FPS (null for adaptive). */\n decodeFps: z.number().nullable(),\n /** Bitrate in kbps (null for adaptive). */\n bitrateKbps: z.number().nullable(),\n})\nexport type WebrtcStreamChoice = z.infer<typeof WebrtcStreamChoiceSchema>\n\n/**\n * WebRTC session — device-scoped facade over the system `webrtc` cap.\n *\n * Exposes per-device signaling (`createSession`, `handleAnswer`,\n * `closeSession`) on the device proxy so UI / integrations can\n * negotiate a session by (deviceId, profile) instead of constructing\n * an opaque `${deviceId}/${profile}` streamId string. The provider is\n * registered by the stream-broker addon for every camera device with\n * at least one active profile slot; internally it resolves\n * `${deviceId}/${profile}` and forwards to the system webrtc provider.\n *\n * The system `webrtc` cap remains available for cross-device / raw\n * streamId callers (debugging, admin tools). Production UI should\n * prefer this device-scoped cap.\n */\nexport const webrtcSessionCapability = {\n name: 'webrtc-session',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera],\n methods: {\n /**\n * List available WebRTC streams for a device.\n * Returns adaptive (if any profile is assigned) + each assigned profile\n * with codec/resolution info. UI renders this directly — no hardcoded\n * profile names needed.\n */\n listStreams: method(\n z.object({ deviceId: z.number().int().nonnegative() }),\n z.array(WebrtcStreamChoiceSchema),\n ),\n /**\n * Open a WebRTC session against a specific target on the device.\n * `target.kind` discriminates between adaptive selection, a profile\n * slot, or a specific cam stream source — see `WebrtcStreamTarget`.\n * The server resolves the target to a live broker; clients never\n * build or parse brokerId strings.\n */\n createSession: method(\n z.object({\n deviceId: z.number().int().nonnegative(),\n target: WebrtcStreamTargetSchema,\n hints: webrtcClientHintsSchema.optional(),\n }),\n z.object({ sessionId: z.string(), sdpOffer: z.string() }),\n { kind: 'mutation' },\n ),\n handleAnswer: method(\n z.object({\n deviceId: z.number().int().nonnegative(),\n sessionId: z.string(),\n sdpAnswer: z.string(),\n }),\n z.void(),\n { kind: 'mutation' },\n ),\n closeSession: method(\n z.object({\n deviceId: z.number().int().nonnegative(),\n sessionId: z.string(),\n }),\n z.void(),\n { kind: 'mutation' },\n ),\n /** Whether the underlying provider supports adaptive bitrate for this profile. */\n hasAdaptiveBitrate: method(\n z.object({\n deviceId: z.number().int().nonnegative(),\n profile: CamProfileSchema,\n }),\n z.boolean(),\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IWebrtcSessionProvider = InferProvider<typeof webrtcSessionCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { RunnerLocalLoadSchema } from './pipeline-runner.cap.js'\nimport { CameraMetricsSchema } from './schemas/orchestrator-metrics.js'\nimport { PipelineEngineChoiceSchema, PipelineStepInputSchema } from './pipeline-executor.cap.js'\n\n// ── Per-camera pipeline config & templates ─────────────────────────\n//\n// Stateless-pipeline model (spec: 2026-04-18-stateless-pipeline-per-camera):\n// the orchestrator owns per-camera pipelines and the global template\n// library. Runners never persist; they receive content via attachCamera.\n\nconst CameraPipelineConfigSchema = z.object({\n engine: PipelineEngineChoiceSchema,\n steps: z.array(PipelineStepInputSchema).readonly(),\n audio: z.object({\n engine: PipelineEngineChoiceSchema,\n modelId: z.string(),\n enabled: z.boolean(),\n settings: z.record(z.string(), z.unknown()).readonly().optional(),\n }).nullable().optional(),\n})\n\nconst PipelineTemplateSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().optional(),\n config: CameraPipelineConfigSchema,\n createdAt: z.string(),\n updatedAt: z.string(),\n})\n\n// ── 3-level pipeline settings schemas ─────────────────────────────────\n// Agent-level addon config: one entry per addonId in the catalog. The\n// resolver expands this flat map into a tree at dispatch time using\n// catalog compat (inputClasses ↔ outputClasses).\nconst AgentAddonConfigSchema = z.object({\n enabled: z.boolean(),\n modelId: z.string(),\n settings: z.record(z.string(), z.unknown()).readonly(),\n})\n\n// Agent settings (phase 2f): only `addonDefaults` remain on the\n// orchestrator. `userChoice`, `hwaccel`, `audio`, and the authoritative\n// engine triple all moved to per-addon global settings\n// (detection-pipeline / decoder-nodeav / decoder-ffmpeg / audio-analyzer).\nconst AgentPipelineSettingsSchema = z.object({\n addonDefaults: z.record(z.string(), AgentAddonConfigSchema).readonly(),\n})\n\n// Per-agent wholesale pipeline override — a camera can pin a full\n// pipeline for a specific agent, bypassing addonDefaults + stepToggles.\n// The **engine** is NOT carried here: per the 3-level design, the\n// device+agent override still runs under the engine selected on that\n// agent (detection-pipeline global settings there). The operator\n// picks which steps + what audio run — not which engine — so that\n// moving a camera between agents with different engines doesn't\n// require rewriting the override. Same applies to `audio.engine` —\n// inferred from the agent, not stored per-override.\nconst CameraPipelineForAgentSchema = z.object({\n steps: z.array(PipelineStepInputSchema).readonly(),\n audio: z.object({\n modelId: z.string(),\n enabled: z.boolean(),\n }).nullable(),\n})\n\n// Per-(device, agent, addon) shallow patch over agent.addonDefaults[addonId].\n// All fields optional — unset means \"inherit from agent default\".\nconst CameraStepOverridePatchSchema = z.object({\n enabled: z.boolean().optional(),\n modelId: z.string().optional(),\n settings: z.record(z.string(), z.unknown()).readonly().optional(),\n})\n\n// Camera settings — sparse overlay on agent defaults.\nconst CameraPipelineSettingsSchema = z.object({\n pinnedAgentNodeId: z.string().optional(),\n stepToggles: z.record(z.string(), z.boolean()).optional(),\n stepOverridesByAgent: z.record(\n z.string(),\n z.record(z.string(), CameraStepOverridePatchSchema),\n ).optional(),\n pipelineByAgent: z.record(z.string(), CameraPipelineForAgentSchema).optional(),\n})\n\n/**\n * Pipeline placement record persisted by `addon-pipeline-orchestrator` via\n * the multi-level settings store. The orchestrator looks up these records\n * on every `DeviceStreamsRegistered` event to decide whether the camera\n * has a manual pipeline node pin (L1 affinity) or whether the load\n * balancer (L2 capacity / L3 hardware-aware) needs to pick one.\n *\n * Naming convention: `{Pipeline,Decoder}AssignmentSchema` — one schema per\n * placement domain managed by the orchestrator.\n */\nconst PipelineAssignmentSchema = z.object({\n deviceId: z.number(),\n /** Moleculer node id of the runner currently responsible for this camera. */\n agentNodeId: z.string(),\n /** True when the assignment was set manually, false when chosen by the balancer. */\n pinned: z.boolean(),\n /** Why this assignment was made — useful for debugging the load balancer. */\n reason: z.enum(['manual', 'capacity', 'hardware-affinity', 'failover', 'rebalance']),\n /** Unix timestamp (ms) when the assignment was last updated. */\n assignedAt: z.number(),\n})\n\n/**\n * Decoder placement record. Symmetric to `PipelineAssignmentSchema` but for\n * the decoder-node placement domain (`balanceDecoder` decision: manual pin\n * → co-located with pipeline → capacity).\n */\nconst DecoderAssignmentSchema = z.object({\n deviceId: z.number(),\n /** Moleculer node id of the decoder provider currently responsible for this camera. */\n decoderNodeId: z.string(),\n /** True when the assignment was set manually via `assignDecoder`, false when chosen by the balancer. */\n pinned: z.boolean(),\n /** Why this assignment was made — useful for debugging the decoder balancer. */\n reason: z.enum(['manual', 'co-located', 'capacity', 'hardware-affinity']),\n})\n\n/**\n * Per-agent load summary surfaced to the load balancer + dashboards.\n * Aggregated from each runner's `getLocalLoad` cap call.\n */\nconst AgentLoadSummarySchema = z.object({\n nodeId: z.string(),\n online: z.boolean(),\n load: RunnerLocalLoadSchema,\n /** Computed score used by the L2 capacity balancer (lower = less loaded). */\n score: z.number(),\n})\n\n/**\n * Aggregate metrics across the whole detection cluster. Replaces the legacy\n * `IPipelineExecutorProvider.orchestratorStatus()` cap method as the\n * canonical source of truth for global pipeline health.\n */\nconst GlobalMetricsSchema = z.object({\n totalAgents: z.number(),\n onlineAgents: z.number(),\n totalCameras: z.number(),\n attachedCameras: z.number(),\n activeCameras: z.number(),\n /** Average inference time across all agents weighted by their camera count. */\n avgInferenceTimeMs: z.number(),\n /** Total queue depth across all agents. */\n queueDepth: z.number(),\n})\n\n/**\n * Per-node capability binding map: which addon implements each well-known\n * cap on the named node. Persisted hub-side under\n * `addon:pipeline-orchestrator` settings keyed by `nodeBindings.<nodeId>`.\n *\n * The kernel of each process consults its local copy of this map (via the\n * `capability.binding-changed` event subscription) when resolving\n * capability providers.\n */\nconst CapabilityBindingsSchema = z.record(z.string(), z.string())\n\n// NOTE — Phase 6 cleanup (orchestrator settings rework):\n//\n// The `OrchestrationDeviceSettings` and `ResolvedOrchestrationSettings`\n// types used to live here, along with the cap methods\n// `getDeviceOrchestrationSettings` / `getDeviceOrchestrationOverrides`\n// / `getGlobalOrchestrationSettings`. They were a central bottleneck\n// that duplicated the standard addon settings store.\n//\n// Consumers now read per-device settings directly via the kernel\n// helper `resolveAddonSettings(schema, global, device)` from\n// `@camstack/types`, using the standard\n// `AddonRegistryService.getAddonConfigSchema` +\n// `ConfigService.getAddonConfig` / `getAddonDevice` pair. There is no\n// alias cap method on the orchestrator — the 3-level resolver is the\n// one and only read path for every addon, including this one.\n//\n// If a caller needs a typed view of the merged result, it's their\n// responsibility to narrow the returned `Record<string, unknown>`\n// locally (see `DetectionWiringService.resolveDeviceSettings` for the\n// canonical example).\n\n/**\n * Pipeline Orchestrator capability — global load balancer + camera dispatcher.\n *\n * Lives on the hub. Tracks the camera-to-agent assignment map, listens to\n * device lifecycle events, queries each runner's capacity + hardware\n * profile, and dispatches `attachCamera` / `detachCamera` cap calls to the\n * appropriate runner instances. Persists assignments via the multi-level\n * settings store so they survive hub restarts.\n *\n * Strictly the control plane: never sees a frame, never calls inference,\n * never drains queues. The runner does that work locally on each agent.\n */\nexport const pipelineOrchestratorCapability = {\n name: 'pipeline-orchestrator',\n scope: 'system',\n mode: 'singleton',\n exposesDeviceSettings: true,\n methods: {\n // ── Pipeline placement overrides ────────────────────────────────────\n /**\n * Pin a camera's pipeline to a specific agent (L1 affinity).\n * The orchestrator re-evaluates the assignment immediately.\n */\n assignPipeline: method(\n z.object({ deviceId: z.number(), agentNodeId: z.string() }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n /**\n * Clear a camera's pipeline pin and let the auto-balancer re-pick\n * the optimal agent. The orchestrator persists `preferredAgent=null`\n * (and `pipelineNodeId='auto'`), then re-runs the balancer with the\n * cached `RunnerCameraConfig` and migrates only when the chosen\n * node differs. The camera stays in `getPipelineAssignments()` —\n * just with `pinned=false`. If no runner is currently available\n * (cluster-wide), the camera is left unassigned but the cached\n * config is kept so the next dispatch event re-attaches it.\n */\n unassignPipeline: method(\n z.object({ deviceId: z.number() }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n /**\n * Trigger a full rebalance pass. Iterates over all assigned cameras,\n * recomputes the optimal agent for each one based on current load +\n * hardware affinity, and migrates cameras whose current agent is no\n * longer optimal. Pinned cameras are never migrated.\n */\n rebalance: method(z.void(), z.object({ migrated: z.number() }), { kind: 'mutation', auth: 'admin' }),\n\n // ── Observability ────────────────────────────────────────────────\n /** Get the full camera-to-agent assignment map. */\n getPipelineAssignments: method(z.void(), z.array(PipelineAssignmentSchema).readonly()),\n /** Get one camera's assignment, or null if unassigned. */\n getPipelineAssignment: method(z.object({ deviceId: z.number() }), PipelineAssignmentSchema.nullable()),\n /** Get per-agent load summaries used by the load balancer + dashboards. */\n getAgentLoad: method(z.void(), z.array(AgentLoadSummarySchema).readonly()),\n /** Aggregate global metrics across the whole detection cluster. */\n getGlobalMetrics: method(z.void(), GlobalMetricsSchema),\n /**\n * Per-camera live metrics (phase, fps, inference, queue, drops).\n * The orchestrator owns the device→agent assignment map and is the\n * canonical place to ask \"give me the metrics for this camera\". It\n * resolves the agent that holds the camera and delegates to that\n * runner's `getCameraMetrics`. Returns null if the device is not\n * assigned or the runner has no record for it (e.g. the camera was\n * just dispatched and the runner hasn't received the first frame).\n */\n getCameraMetrics: method(z.object({ deviceId: z.number() }), CameraMetricsSchema.nullable()),\n\n // ── Capability bindings (which addon implements each cap on each node) ──\n /** Read the capability binding map for one node. Empty record = no overrides (first-registered wins). */\n getCapabilityBindings: method(z.object({ nodeId: z.string() }), CapabilityBindingsSchema),\n /** Set the addon that implements `capName` on `nodeId`. Emits `capability.binding-changed`. */\n setCapabilityBinding: method(\n z.object({ nodeId: z.string(), capName: z.string(), addonId: z.string() }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n // ── Decoder scheduling ─────────────────────────────────────────────\n /** Pin a device's decoder to a specific node. */\n assignDecoder: method(\n z.object({ deviceId: z.number(), nodeId: z.string() }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n /** Clear a device's decoder pin (revert to auto). */\n unassignDecoder: method(\n z.object({ deviceId: z.number() }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n /** Get every camera's decoder placement. */\n getDecoderAssignments: method(z.void(), z.array(DecoderAssignmentSchema).readonly()),\n\n // ── Audio scheduling ───────────────────────────────────────────────\n /** Pin a device's audio analysis to a specific cluster node. */\n assignAudio: method(\n z.object({ deviceId: z.number(), nodeId: z.string() }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n /** Clear a device's audio node pin (revert to auto load-balanced). */\n unassignAudio: method(\n z.object({ deviceId: z.number() }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n /** Get the current audio assignment for one device, or null if not yet assigned. */\n getAudioAssignment: method(\n z.object({ deviceId: z.number() }),\n z.object({\n nodeId: z.string(),\n pinned: z.boolean(),\n assignedAt: z.number(),\n }).nullable(),\n ),\n /** Get per-node audio load (device counts) for all known audio-analyzer nodes. */\n getAudioNodeLoad: method(\n z.void(),\n z.array(z.object({ nodeId: z.string(), deviceCount: z.number() })),\n ),\n /** Get all current audio assignments across all devices. */\n getAudioAssignments: method(\n z.void(),\n z.array(z.object({\n deviceId: z.number(),\n nodeId: z.string(),\n pinned: z.boolean(),\n assignedAt: z.number(),\n })),\n ),\n\n /**\n * Get one camera's decoder placement (computed if not yet pinned).\n * Consumed by `stream-broker.createBroker` so decoder provider\n * selection is deterministic — fixes the 2026-04-18 race where\n * `capProviders[0]` silently picked ffmpeg-on-agent-0 for a\n * hub-assigned camera.\n *\n * `pipelineNodeId` is the node already chosen to run inference for\n * this camera. When provided, the balancer prefers co-location with\n * it; omitted → falls back to the last known assignment in the\n * `assignments` map and finally to 'hub'.\n */\n getDecoderAssignment: method(\n z.object({\n deviceId: z.number(),\n pipelineNodeId: z.string().optional(),\n }),\n DecoderAssignmentSchema,\n ),\n\n // NOTE: the `getDeviceOrchestrationSettings`,\n // `getDeviceOrchestrationOverrides` and `getGlobalOrchestrationSettings`\n // methods were removed in Phase 6. Consumers now read settings via\n // the standard 3-level resolver (`resolveAddonSettings`) over the\n // addon config store — see the top of this file for details.\n\n // ── 3-level pipeline settings (new model) ──────────────────────────\n //\n // Replaces the per-camera full-config + cluster-default model with:\n // `agent.addonDefaults` (flat per-addon config; auto-seeded from catalog),\n // `camera.stepToggles` (bool overlay; absent = inherit agent),\n // `camera.pipelineByAgent` (wholesale override escape hatch).\n //\n // The orchestrator's `resolvePipeline` collapses these into the\n // `CameraPipelineConfig` the runner consumes at dispatch.\n\n // `agentNodeId` (not `nodeId`) is intentional: the generated cap router\n // auto-routes any input field literally named `nodeId` to that node's\n // provider. `pipeline-orchestrator` is a HUB-SINGLETON cap — the\n // agent-node identifier here is DATA (\"which agent to read/write\"),\n // not routing. Using `agentNodeId` keeps the call on the hub as\n // intended.\n\n /** Read one agent's settings. Null when not yet seeded. */\n getAgentSettings: method(\n z.object({ agentNodeId: z.string() }),\n AgentPipelineSettingsSchema.nullable(),\n ),\n /** Enumerate every agent's settings (hub + remote runners). */\n listAgentSettings: method(\n z.void(),\n z.array(z.object({\n nodeId: z.string(),\n settings: AgentPipelineSettingsSchema,\n })).readonly(),\n ),\n /** Bulk-replace ALL addon configs on one agent. Used by the agent-level PipelineEditor which emits the full map per edit. Merges on top of existing entries — omitted addonIds are left alone. */\n setAgentAddonDefaults: method(\n z.object({\n agentNodeId: z.string(),\n defaults: z.record(z.string(), AgentAddonConfigSchema),\n }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n /**\n * Drop a single agent's persisted settings. Used by the cluster\n * \"Offline agents\" panel to evict stale entries left behind when an\n * agent's data dir was rebuilt (new random nodeId) or older code wrote\n * the env name as the nodeId. The orchestrator otherwise never deletes\n * agentSettings — entries accumulate until a hub reset.\n *\n * `success: false` indicates the nodeId wasn't in the store (no-op).\n * Refuses to remove `hub` (the orchestrator always co-resides with it).\n */\n removeAgentSettings: method(\n z.object({ agentNodeId: z.string() }),\n z.object({ success: z.boolean(), removed: z.boolean() }),\n { kind: 'mutation', auth: 'admin' },\n ),\n // Phase 2f: `setAgentEngineChoice`, `setAgentHwAccel`,\n // `reprobeAgentHwAccel` removed. Engine ownership moved to the\n // `detection-pipeline` addon (`engineRuntime/engineBackend/engineDevice`\n // + `pipelineExecutor.reprobeEngine`). Hwaccel ownership moved to\n // each decoder addon (`decoder-nodeav`/`decoder-ffmpeg` global\n // settings + `decoder.reprobeHwaccel`). UI + decoder sessions read\n // via `api.addonSettings.getGlobalSettings({addonId, nodeId})`.\n\n /** Read one camera's settings. Null when never touched (inherits agent defaults fully). */\n getCameraSettings: method(\n z.object({ deviceId: z.number() }),\n CameraPipelineSettingsSchema.nullable(),\n ),\n /** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */\n setCameraStepToggle: method(\n z.object({\n deviceId: z.number(),\n addonId: z.string(),\n enabled: z.boolean().nullable(),\n }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n /** Read every L2.5 override map for a device. Null when device has no overrides. */\n getCameraStepOverrides: method(\n z.object({ deviceId: z.number() }),\n z.record(\n z.string(), // agentNodeId\n z.record(z.string(), CameraStepOverridePatchSchema),\n ).nullable(),\n ),\n /**\n * Write or clear the L2.5 per-agent override for one addonId on a device.\n * `patch: null` clears the entry entirely for that (agent, addon) pair.\n */\n setCameraStepOverride: method(\n z.object({\n deviceId: z.number(),\n agentNodeId: z.string(),\n addonId: z.string(),\n patch: CameraStepOverridePatchSchema.nullable(),\n }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n /** Write or clear the wholesale per-agent pipeline override. Pass `pipeline: null` to drop the override. */\n setCameraPipelineForAgent: method(\n z.object({\n deviceId: z.number(),\n agentNodeId: z.string(),\n pipeline: CameraPipelineForAgentSchema.nullable(),\n }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n /** Resolve the effective pipeline for `(deviceId, agentNodeId?)` — walks the full precedence chain. Read-only preview used by the UI to show what will run. */\n resolvePipeline: method(\n z.object({ deviceId: z.number(), agentNodeId: z.string().optional() }),\n CameraPipelineConfigSchema,\n ),\n\n // ── Template library (hub-only, read by any device-details UI) ─────\n /** List every template the operator has saved. */\n listTemplates: method(z.void(), z.array(PipelineTemplateSchema).readonly()),\n /** Create a new named preset from a given CameraPipelineConfig. */\n saveTemplate: method(\n z.object({\n name: z.string(),\n description: z.string().optional(),\n config: CameraPipelineConfigSchema,\n }),\n PipelineTemplateSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n /** Partial update of a template. Any omitted field is preserved. */\n updateTemplate: method(\n z.object({\n id: z.string(),\n name: z.string().optional(),\n description: z.string().optional(),\n config: CameraPipelineConfigSchema.optional(),\n }),\n PipelineTemplateSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n /** Remove a template. Camera configs that were seeded from it keep a copy. */\n deleteTemplate: method(\n z.object({ id: z.string() }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IPipelineOrchestratorProvider = InferProvider<typeof pipelineOrchestratorCapability>\n\nexport {\n PipelineAssignmentSchema,\n DecoderAssignmentSchema,\n AgentLoadSummarySchema,\n GlobalMetricsSchema,\n CapabilityBindingsSchema,\n CameraPipelineConfigSchema,\n CameraStepOverridePatchSchema,\n PipelineTemplateSchema as OrchestratorPipelineTemplateSchema,\n}\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { AudioChunkInputSchema, AudioLevelSchema, AudioClassificationLabelSchema } from './schemas/detection-shared.js'\n\nconst AudioAnalysisResultSchema = z.object({\n level: AudioLevelSchema,\n classification: z.object({\n labels: z.array(AudioClassificationLabelSchema).readonly(),\n inferenceMs: z.number(),\n }).optional(),\n timestamp: z.number(),\n})\n\nconst AudioAnalysisSettingsSchema = z.object({\n minConfidence: z.number().min(0).max(1).default(0.3),\n allowedClasses: z.array(z.string()).default([]),\n})\n\n// Merged from audio-classifier.cap.ts — AudioAnalyzerAddon now owns the\n// pipeline directly (no tRPC roundtrip to a separate classifier addon).\nconst AudioClassificationResultSchema = z.object({\n // Macro-aggregated labels (25-class taxonomy from `AUDIO_MACRO_LABELS`).\n // Primary surface — used by the live audio analyzer and notifications.\n labels: z.array(AudioClassificationLabelSchema).readonly(),\n // Raw backend-native labels (e.g. YAMNet's 521 classes or Apple\n // SoundAnalysis's 303 classes), unaggregated. Optional so existing\n // consumers continue to work; populated by the analyzer provider\n // for callers that want fine-grained output — the benchmark UI uses\n // this in `micro` mode.\n rawLabels: z.array(AudioClassificationLabelSchema).readonly().optional(),\n inferenceMs: z.number(),\n})\n\n/**\n * audio-analyzer — system-scoped compute cap.\n *\n * Owns the engine lifecycle (isReady / dispose), the stateless\n * `analyseChunk` call and the `classify` method. Per-device settings,\n * device-settings contribution and the `onAudioLevel` event live on the\n * paired `audio-analysis` cap (device-scoped, singleton, wrapper\n * defaultActive) so every camera gets its own bindings row and per-device\n * toggle. Pairing mirrors `stream-broker` (system) + `camera-streams`\n * (device) + `webrtc-session` (device) — single addon registers both.\n */\n/**\n * Operator-facing audio-backend choice. 'auto' defers to the addon's\n * platform heuristic (Apple SoundAnalysis on macOS, YAMNet elsewhere).\n */\nexport const AUDIO_BACKEND_CHOICES = [\n { value: 'auto', label: 'Auto (platform default)' },\n { value: 'apple-soundanalysis', label: 'Apple SoundAnalysis (macOS 12+)' },\n { value: 'yamnet-onnx', label: 'YAMNet ONNX (cross-platform)' },\n] as const\n\nexport type AudioBackendChoice = typeof AUDIO_BACKEND_CHOICES[number]['value']\n\n/**\n * Shared shape of the audio-analyzer addon's global settings.\n * `audioBackend` = operator choice (wins); `probedBestAudioBackend`\n * = hint refreshed by `reprobeAudioEngine`. `selectedAudioModel`\n * replaces the orchestrator's legacy\n * `AgentPipelineSettings.audio.modelId`.\n *\n * NOTE — enable/disable is NOT stored here:\n * - per-device: `audio-analysis` wrapper cap + `setWrapperActive`\n * (binding system — the canonical gate).\n * - cluster-wide: `addonDefaults['audio-classifier'].enabled` on\n * the pipeline-orchestrator; drives whether the audio step\n * appears in the resolved tree at all.\n */\nexport interface AudioAnalyzerGlobalConfig {\n readonly audioBackend: AudioBackendChoice\n readonly probedBestAudioBackend: string\n readonly selectedAudioModel: string\n}\n\nexport const DEFAULT_AUDIO_ANALYZER_CONFIG: AudioAnalyzerGlobalConfig = {\n audioBackend: 'auto',\n probedBestAudioBackend: '',\n selectedAudioModel: '',\n}\n\nexport const audioAnalyzerCapability = {\n name: 'audio-analyzer',\n scope: 'system',\n mode: 'singleton',\n methods: {\n analyseChunk: method(\n z.object({ chunk: AudioChunkInputSchema, settings: AudioAnalysisSettingsSchema }),\n AudioAnalysisResultSchema.nullable(),\n { kind: 'mutation' },\n ),\n // ONNX / Apple SoundAnalysis inference can exceed the broker's default\n // 5s requestTimeout on first load or under CPU pressure. 30s covers\n // even the worst-case cold-start without hanging indefinitely.\n classify: method(AudioChunkInputSchema, AudioClassificationResultSchema, { timeoutMs: 30_000 }),\n isReady: method(z.void(), z.boolean()),\n dispose: method(z.void(), z.void(), { kind: 'mutation' }),\n\n /**\n * Re-run the host platform-probe for the audio backend and persist\n * the detected value into `probedBestAudioBackend`. Replaces the\n * orchestrator's legacy `AgentPipelineSettings.audio.engine` —\n * audio-analyzer now owns the choice. Operator `audioBackend` is\n * not touched; only the probed-best hint.\n */\n reprobeAudioEngine: method(\n z.void(),\n z.object({ backend: z.string() }),\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IAudioAnalyzerProvider = InferProvider<typeof audioAnalyzerCapability>\n\nexport { AudioAnalysisResultSchema, AudioAnalysisSettingsSchema, AudioClassificationResultSchema }\n","import { z } from 'zod'\nimport { method, event, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\nimport type { AudioAnalysisSettings } from '../types/io.js'\n\n/**\n * audio-analysis — device-scoped facade over the system `audio-analyzer`.\n *\n * Pairs with `audio-analyzer` (system, singleton) the way `camera-streams`\n * pairs with `stream-broker`: the system cap owns the compute path\n * (`processChunk`, engine lifecycle) while `audio-analysis` exposes the\n * per-device surface — settings resolution, device-settings contribution,\n * audio-level events — and is the binding row every camera sees in the\n * device-manager bindings UI.\n *\n * Registered as a wrapper with `defaultActive: true` by `addon-audio-analysis`\n * so every camera picks up audio analysis automatically; operators can\n * disable per-device via `device-manager.setWrapperActive` when they don't\n * want a given camera to be analysed (e.g. muted / motion-only cams).\n */\nexport const audioAnalysisCapability = {\n name: 'audio-analysis',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera],\n exposesDeviceSettings: true,\n methods: {\n /**\n * Resolve per-device audio analysis settings (minConfidence,\n * allowedClasses) from the addon settings store for a given camera.\n * Orchestrator callers use this before handing chunks to\n * `audio-analyzer.processChunk`.\n */\n resolveDeviceSettings: method(\n z.object({ deviceId: z.number() }),\n z.custom<AudioAnalysisSettings | null>(),\n ),\n },\n events: {\n onAudioLevel: event(z.object({\n deviceId: z.number(),\n rms: z.number(),\n dbfs: z.number(),\n })),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IAudioAnalysisProvider = InferProvider<typeof audioAnalysisCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n// ── Schema fragments ─────────────────────────────────────────────────────────\n\nconst PcmSampleFormatSchema = z.enum(['f32le', 's16le'])\n\nconst AudioCodecInfoSchema = z.object({\n codec: z.string(),\n canDecode: z.boolean(),\n canEncode: z.boolean(),\n label: z.string().optional(),\n})\n\nconst AudioDecodeSessionConfigSchema = z.object({\n codec: z.string(),\n sourceSampleRate: z.number().int().positive(),\n sourceChannels: z.number().int().positive(),\n extraData: z.instanceof(Uint8Array).optional(),\n targetSampleRate: z.number().int().positive(),\n targetChannels: z.number().int().positive(),\n targetFormat: PcmSampleFormatSchema.optional(),\n idleMs: z.number().int().positive().optional(),\n tag: z.string().optional(),\n})\n\nconst AudioEncodeSessionConfigSchema = z.object({\n codec: z.string(),\n sourceSampleRate: z.number().int().positive(),\n sourceChannels: z.number().int().positive(),\n sourceFormat: PcmSampleFormatSchema.optional(),\n targetSampleRate: z.number().int().positive(),\n targetChannels: z.number().int().positive(),\n bitrateKbps: z.number().int().positive().optional(),\n idleMs: z.number().int().positive().optional(),\n tag: z.string().optional(),\n})\n\nconst AudioPcmChunkSchema = z.object({\n data: z.instanceof(Uint8Array),\n sampleRate: z.number().int().positive(),\n channels: z.number().int().positive(),\n format: PcmSampleFormatSchema,\n pts: z.number(),\n})\n\nconst AudioEncodedChunkSchema = z.object({\n data: z.instanceof(Uint8Array),\n codec: z.string(),\n pts: z.number(),\n frameComplete: z.boolean(),\n})\n\nconst SessionInventoryEntrySchema = z.object({\n sessionId: z.string(),\n kind: z.enum(['decode', 'encode']),\n codec: z.string(),\n sourceSampleRate: z.number(),\n sourceChannels: z.number(),\n targetSampleRate: z.number(),\n targetChannels: z.number(),\n format: PcmSampleFormatSchema,\n tag: z.string().optional(),\n createdAtMs: z.number(),\n lastActivityMs: z.number(),\n framesIn: z.number(),\n framesOut: z.number(),\n})\n\n// ── Capability definition ────────────────────────────────────────────────────\n\n/**\n * audio-codec — bidirectional PCM ↔ encoded audio I/O box.\n *\n * Independent per-consumer sessions. The provider runs decode + resample\n * (or resample + encode) inside the session so a 16kHz mono ASA\n * subscriber and a 48kHz stereo WebRTC subscriber on the same source\n * stream don't share resamplers.\n *\n * Singleton on each node. Decoder and encoder live in the same provider\n * because they share the underlying libav contexts (node-av today,\n * pluggable later) — operators always install one or the other together.\n */\nexport const audioCodecCapability = {\n name: 'audio-codec',\n scope: 'system',\n mode: 'singleton',\n methods: {\n // ── Discovery ─────────────────────────────────────────────────────────\n /** Probe the local runtime and return the supported codec matrix. */\n listSupportedCodecs: method(z.void(), z.array(AudioCodecInfoSchema).readonly()),\n\n /** Cheap predicate — does the runtime support `(codec, kind)`? */\n canHandle: method(\n z.object({ codec: z.string(), kind: z.enum(['decode', 'encode']) }),\n z.boolean(),\n ),\n\n // ── Session lifecycle ─────────────────────────────────────────────────\n createDecodeSession: method(\n AudioDecodeSessionConfigSchema,\n z.object({ sessionId: z.string(), nodeId: z.string() }),\n { kind: 'mutation' },\n ),\n\n createEncodeSession: method(\n AudioEncodeSessionConfigSchema,\n z.object({ sessionId: z.string(), nodeId: z.string() }),\n { kind: 'mutation' },\n ),\n\n closeSession: method(\n z.object({ sessionId: z.string(), nodeId: z.string().optional() }),\n z.void(),\n { kind: 'mutation' },\n ),\n\n // ── Decode data plane ─────────────────────────────────────────────────\n // Session-bound methods include an optional `nodeId` field so the\n // generated cap router auto-routes calls to the same node that owns\n // the session. Audio-codec sessions are process-local — without sticky\n // routing the round-robin across nodes serves \"session not found\" on\n // every other call.\n\n /** Push one encoded audio frame into a decode session. */\n pushEncodedFrame: method(\n z.object({\n sessionId: z.string(),\n nodeId: z.string().optional(),\n data: z.instanceof(Uint8Array),\n /** Source PTS in milliseconds. Synthesised when omitted. */\n pts: z.number().optional(),\n }),\n z.void(),\n { kind: 'mutation' },\n ),\n\n /** Pull up to `maxCount` PCM chunks from a decode session. */\n pullPcm: method(\n z.object({\n sessionId: z.string(),\n nodeId: z.string().optional(),\n maxCount: z.number().int().positive().default(8),\n }),\n z.array(AudioPcmChunkSchema),\n ),\n\n // ── Encode data plane ─────────────────────────────────────────────────\n /** Push one PCM chunk into an encode session. */\n pushPcm: method(\n z.object({\n sessionId: z.string(),\n nodeId: z.string().optional(),\n data: z.instanceof(Uint8Array),\n /** Source PTS in milliseconds. */\n pts: z.number().optional(),\n }),\n z.void(),\n { kind: 'mutation' },\n ),\n\n /** Pull up to `maxCount` encoded chunks from an encode session. */\n pullEncoded: method(\n z.object({\n sessionId: z.string(),\n nodeId: z.string().optional(),\n maxCount: z.number().int().positive().default(8),\n }),\n z.array(AudioEncodedChunkSchema),\n ),\n\n /** Flush any pending encoded output (call before close on graceful tear). */\n flushEncode: method(\n z.object({ sessionId: z.string(), nodeId: z.string().optional() }),\n z.array(AudioEncodedChunkSchema),\n { kind: 'mutation' },\n ),\n\n // ── Inventory ─────────────────────────────────────────────────────────\n listActiveSessions: method(\n z.void(),\n z.array(SessionInventoryEntrySchema).readonly(),\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IAudioCodecCapProvider = InferProvider<typeof audioCodecCapability>\n\nexport {\n AudioCodecInfoSchema,\n AudioDecodeSessionConfigSchema,\n AudioEncodeSessionConfigSchema,\n AudioPcmChunkSchema,\n AudioEncodedChunkSchema,\n PcmSampleFormatSchema,\n}\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\nconst EmbeddingResultSchema = z.object({\n embedding: z.array(z.number()),\n dimensions: z.number(),\n})\n\nconst EmbeddingInfoSchema = z.object({\n modelId: z.string(),\n dimensions: z.number(),\n inputSize: z.number(),\n})\n\nexport const embeddingEncoderCapability = {\n name: 'embedding-encoder',\n scope: 'system',\n mode: 'collection',\n internal: true,\n methods: {\n encode: method(\n z.object({ crop: z.instanceof(Uint8Array), width: z.number(), height: z.number() }),\n EmbeddingResultSchema,\n ),\n encodeText: method(z.object({ text: z.string() }), EmbeddingResultSchema),\n getInfo: method(z.void(), EmbeddingInfoSchema),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IEmbeddingEncoderProvider = InferProvider<typeof embeddingEncoderCapability>\n\nexport { EmbeddingResultSchema, EmbeddingInfoSchema }\n","/**\n * Device Manager capability — hub-side singleton that unifies device persistence,\n * live registry access, and all management operations into a single tRPC surface.\n *\n * Replaces:\n * - `device-persistence` capability (persistence methods absorbed here)\n * - `device-management.router.ts` (deleted in Phase 2)\n * - `device-ops.router.ts` (compat layer — deleted; device-provider ops absorbed here)\n *\n * All device provider addons (rtsp, onvif, frigate, …) are hub-local: they may\n * fork into separate processes but never run on remote cluster agents. Therefore:\n * - No nodeId routing needed — this is a pure hub singleton.\n * - The hub's DeviceRegistry is the single source of truth for all live devices.\n * - No shadow registry or cross-node aggregation required.\n *\n * Forked workers register devices back to the hub via `ctx.devices`\n * (DeviceManagerApi → ctx.api.deviceManager.registerDevice), same as today.\n */\nimport { z } from 'zod'\nimport { method, type CapabilityDefinition } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\nimport { StreamSourceEntrySchema } from './schemas/streaming-shared.js'\nimport { SettingsSchemaWithValuesSchema } from './addon-settings.cap.js'\nimport {\n DiscoveryCandidateSchema,\n DeviceSummarySchema,\n FieldProbeResultSchema,\n} from './device-provider.cap.js'\n\n// ── Output schemas ────────────────────────────────────────────────────────────\n\n/**\n * Serializable projection of a live IDevice.\n * Returned by listAll, getDevice, getChildren.\n * Live methods (getStreamSources, getConfigSchema) are separate calls.\n */\nexport const DeviceInfoSchema = z.object({\n /** Progressive, system-wide unique number. Allocated synchronously by\n * `device-manager.allocateDeviceId` BEFORE the owning `IDevice` is\n * constructed, so every live device exposes an `id` — no transient\n * null window. Distinct from `stableId`, which is unique per\n * integration. Ids are monotonic and never reissued on removal. */\n id: z.number(),\n stableId: z.string(),\n addonId: z.string(),\n type: z.enum(DeviceType),\n name: z.string(),\n /** Operator-organisational location label. `null` when unset. */\n location: z.string().nullable(),\n /** Soft-disabled flag. */\n disabled: z.boolean(),\n parentDeviceId: z.number().nullable(),\n /** Optional semantic role — `DeviceRole` string. null for top-level devices. */\n role: z.string().nullable().optional(),\n online: z.boolean(),\n features: z.array(z.string()),\n /** true when the device has a getStreamSources() method (ICameraDevice) */\n isCamera: z.boolean(),\n /** Current config values — serializable snapshot */\n config: z.record(z.string(), z.unknown()),\n /** Hardware + identity blob (manufacturer / model / firmware / sn /\n * uid / mac / …). Populated by drivers; editable via setMetadata. */\n metadata: z.record(z.string(), z.unknown()).nullable().optional(),\n})\n\nexport const ConfigEntrySchema = z.object({\n key: z.string(),\n value: z.unknown(),\n description: z.string().optional(),\n})\n\nexport { StreamSourceEntrySchema }\n\nexport const SavedDeviceRowSchema = z.object({\n /** Numeric id reserved at allocateDeviceId time. */\n id: z.number(),\n /** External-system identifier — required for the worker's `kernel.devices.create()` call. */\n stableId: z.string(),\n type: z.string(),\n name: z.string(),\n /** Operator-organisational location label. `null` when unset. */\n location: z.string().nullable(),\n /** Soft-disabled flag. */\n disabled: z.boolean(),\n parentDeviceId: z.number().nullable(),\n /** Optional semantic role — stringified `DeviceRole` enum value. null for top-level devices. */\n role: z.string().nullable().optional(),\n})\n\n/** Operator-organisational meta surface — populated by the kernel\n * on `DeviceContext.deviceMeta` so `BaseDevice` can resolve\n * `name` / `location` / `disabled` without subclass schema duplication.\n * Mirrors `DeviceMeta` in `device-management.ts` for the cap wire shape. */\nexport const DeviceMetaSchema = z.object({\n id: z.number(),\n stableId: z.string(),\n addonId: z.string(),\n type: z.string(),\n name: z.string(),\n location: z.string().nullable(),\n disabled: z.boolean(),\n parentDeviceId: z.number().nullable(),\n metadata: z.record(z.string(), z.unknown()).nullable().optional(),\n})\n\n/** ConfigUISchema passed through as unknown — mirrors device-provider's CreationSchemaOutputSchema */\nconst ConfigUISchemaOutput = z.unknown().nullable()\n\nconst StreamProbeResultSchema = z.object({\n streamId: z.string(),\n width: z.number().optional(),\n height: z.number().optional(),\n codec: z.string().optional(),\n fps: z.number().optional(),\n bitrateKbps: z.number().optional(),\n})\n\n// ── Re-export persistence schemas (for DeviceManagerApi / DevicePersistenceAddon consumers) ──\n\nexport const DeviceRegisterPayloadSchema = z.object({\n addonId: z.string(),\n stableId: z.string(),\n /** Pre-allocated numeric id from `allocateDeviceId`. The hub persists\n * it alongside the meta record; callers never invent this value. */\n id: z.number(),\n type: z.string(),\n name: z.string(),\n /** Operator-organisational location label. Optional on register —\n * the hub seeds `null` when omitted. */\n location: z.string().nullable().optional(),\n /** Soft-disabled flag. Optional on register — the hub seeds `false`. */\n disabled: z.boolean().optional(),\n parentDeviceId: z.number().nullable(),\n /** Optional semantic role — see `DeviceRole`. Driver authors pass this\n * at register time when the device is an accessory with a known role. */\n role: z.string().nullable().optional(),\n /** Snapshot of `device.features` at registration time. Persisted in\n * `DeviceMeta` so the hub can answer `getDevice` for forked-worker\n * devices with the right `DeviceFeature[]` even when the live\n * instance lives on a remote node. Re-published on every register\n * call (workers re-register on init), so probe-driven updates\n * (e.g. PTZ flag flipping after the abilities probe) propagate. */\n features: z.array(z.string()).optional(),\n config: z.record(z.string(), z.unknown()),\n})\n\nexport const DeviceRemovePayloadSchema = z.object({\n deviceId: z.number(),\n})\n\nexport const DevicePersistConfigPayloadSchema = z.object({\n deviceId: z.number(),\n data: z.record(z.string(), z.unknown()),\n})\n\n// ── Capability definition ─────────────────────────────────────────────────────\n\nexport const deviceManagerCapability = {\n name: 'device-manager',\n scope: 'system',\n mode: 'singleton',\n methods: {\n // ── Persistence (migrated from device-persistence) ────────────────────────\n\n /** Reserve (or re-resolve) a progressive numeric id for `(addonId, stableId)`.\n * Idempotent: returns the existing id if one is already persisted for the\n * pair. Callers invoke this before `registerDevice` so the live IDevice\n * can bind `id` at construction time through `DeviceContext.id`. */\n allocateDeviceId: method(\n z.object({ addonId: z.string(), stableId: z.string() }),\n z.object({ id: z.number() }),\n { kind: 'mutation' },\n ),\n\n /** Register a device in the DB + in-memory registry. Called by DeviceManagerApi.register(). */\n registerDevice: method(DeviceRegisterPayloadSchema, z.void(), { kind: 'mutation' }),\n\n /** Remove a device from the DB + in-memory registry. Called by DeviceManagerApi.remove(). */\n removeDevice: method(DeviceRemovePayloadSchema, z.void(), { kind: 'mutation' }),\n\n /** Persist device config blob. Called by DeviceConfig.set/setAll(). */\n persistConfig: method(DevicePersistConfigPayloadSchema, z.void(), { kind: 'mutation' }),\n\n /** Load persisted config for a device. Called at restore time. */\n loadConfig: method(\n z.object({ deviceId: z.number() }),\n z.record(z.string(), z.unknown()),\n ),\n\n /** Load persisted runtime state. Called at device adopt time. */\n loadRuntimeState: method(\n z.object({ deviceId: z.number() }),\n z.record(z.string(), z.unknown()),\n ),\n\n /** Load operator-organisational meta surface for a device. Called by\n * the kernel proxy to populate `DeviceContext.deviceMeta` before\n * the device class constructor runs. Returns `null` when the id\n * doesn't resolve to a persisted row. */\n loadMeta: method(\n z.object({ deviceId: z.number() }),\n DeviceMetaSchema.nullable(),\n ),\n\n /** Update the operator-edited display name. Persists to the meta\n * row + emits `EventCategory.DeviceMetaChanged`. */\n setName: method(\n z.object({ deviceId: z.number(), name: z.string() }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n /** Update the operator-organisational location label. `null`\n * clears it. */\n setLocation: method(\n z.object({ deviceId: z.number(), location: z.string().nullable() }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n /** Patch the device's hardware-identity metadata blob. Merges\n * `patch` over the current blob (shallow). Value `null` for a\n * given key removes that key. Drivers populate factual fields\n * on first probe (model / firmware / mac / sn / uid); operators\n * can override or augment via the Device Info tab. */\n setMetadata: method(\n z.object({\n deviceId: z.number(),\n patch: z.record(z.string(), z.unknown()),\n }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n /** Operator-curated location registry. Returns the union of:\n * (1) labels persisted in the registry via `addLocation`, and\n * (2) labels currently in use on at least one device's\n * `meta.location` field.\n * Sorted case-insensitively + deduped + trimmed of empty strings.\n * Drives the autocomplete in the Device Info location editor. */\n listLocations: method(\n z.void(),\n z.array(z.string()),\n ),\n\n /** Add a label to the curated location registry. No-op when the\n * label (case-insensitive, trimmed) is already present. Empty\n * / whitespace-only inputs throw. */\n addLocation: method(\n z.object({ name: z.string() }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n /** Remove a label from the curated registry. Devices that still\n * reference this label keep their `meta.location` value — the\n * registry is purely a suggestion list. To purge from devices,\n * iterate them and call `setLocation(deviceId, null)`\n * separately (or pass `cascade: true` to do it in one shot). */\n removeLocation: method(\n z.object({ name: z.string(), cascade: z.boolean().optional() }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n /** Soft-disable / re-enable the device. Drivers consult\n * `BaseDevice.disabled` to gate lifecycle hooks. */\n setDisabled: method(\n z.object({ deviceId: z.number(), disabled: z.boolean() }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n /** List persisted devices for an addon (DB, for restore). */\n listPersistedByAddon: method(\n z.object({ addonId: z.string() }),\n z.array(SavedDeviceRowSchema),\n ),\n\n // ── Query — live registry ─────────────────────────────────────────────────\n\n /** List all devices (live registry), optionally filtered by addonId. */\n listAll: method(\n z.object({ addonId: z.string().optional() }),\n z.array(DeviceInfoSchema),\n ),\n\n /** Get a single device by numeric deviceId. */\n getDevice: method(\n z.object({ deviceId: z.number() }),\n DeviceInfoSchema.nullable(),\n ),\n\n /** List children of a parent device (by parent numeric id). */\n getChildren: method(\n z.object({ parentDeviceId: z.number() }),\n z.array(DeviceInfoSchema),\n ),\n\n // ── Runtime — live device operations ─────────────────────────────────────\n\n /** Get stream sources for a camera device. */\n getStreamSources: method(\n z.object({ deviceId: z.number() }),\n z.array(StreamSourceEntrySchema),\n ),\n\n /** Get config entries (key + value + description) for a device. */\n getConfigSchema: method(\n z.object({ deviceId: z.number() }),\n z.array(ConfigEntrySchema),\n ),\n\n /** Get the ConfigUISchema for a device's settings (for admin UI rendering). */\n getSettingsSchema: method(\n z.object({ deviceId: z.number() }),\n ConfigUISchemaOutput,\n ),\n\n // ── Mutations — config changes, enable/disable, remove ────────────────────\n\n /** Update device config values (partial merge). */\n updateConfig: method(\n z.object({\n deviceId: z.number(),\n values: z.record(z.string(), z.unknown()),\n }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n /** Enable a device (writes enabled=true to device config). */\n enable: method(\n z.object({ deviceId: z.number() }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n /** Disable a device (writes enabled=false to device config). */\n disable: method(\n z.object({ deviceId: z.number() }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n /** Remove a device and all children: calls device.removeDevice() then removes from registry + DB. */\n remove: method(\n z.object({ deviceId: z.number() }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n // ── Stream profile map ────────────────────────────────────────────────────\n\n /** Get quality→streamId mapping for a camera. Derived from profileHint if not explicitly set. */\n getStreamProfileMap: method(\n z.object({ deviceId: z.number() }),\n z.record(z.string(), z.string().nullable()),\n ),\n\n /** Persist quality→streamId mapping in device config under reserved key _profileMap. */\n setStreamProfileMap: method(\n z.object({\n deviceId: z.number(),\n profileMap: z.record(z.string(), z.string().nullable()),\n }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n /** Run ffprobe on each stream source URL and return metadata. No-op if stream probe unavailable. */\n probeStreams: method(\n z.object({ deviceId: z.number() }),\n z.array(StreamProbeResultSchema),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n // ── Bindings — per-device capability provider map ────────────────────────\n\n /**\n * Return the per-capability binding map for a device. Each entry lists the\n * currently-active provider (native or wrapper) + the underlying native\n * addon id, so consumers can decide routing without re-running discovery.\n */\n getBindings: method(\n z.object({ deviceId: z.number() }),\n z.object({\n deviceId: z.number(),\n entries: z.array(z.object({\n capName: z.string(),\n kind: z.enum(['native', 'wrapped']),\n providerAddonId: z.string(),\n providerNodeId: z.string(),\n nativeAddonId: z.string(),\n })),\n }),\n ),\n\n /**\n * Return the binding map for every device known to the hub. Used by\n * `SystemManager` warm-boot: a single round-trip resolves the\n * routing for the entire fleet so subsequent `sm.getDeviceById(id)`\n * calls are sync. Bindings change rarely (only on wrapper toggle or\n * device add/remove) — clients invalidate via the\n * `capability.binding-changed` event.\n */\n getAllBindings: method(\n z.object({}),\n z.array(z.object({\n deviceId: z.number(),\n entries: z.array(z.object({\n capName: z.string(),\n kind: z.enum(['native', 'wrapped']),\n providerAddonId: z.string(),\n providerNodeId: z.string(),\n nativeAddonId: z.string(),\n })),\n })),\n ),\n\n /**\n * Activate (or deactivate) a wrapper addon for a (device, cap) pair.\n * Persists the binding via ctx.settings. active=false clears the wrapper\n * (falls back to native if registered).\n */\n setWrapperActive: method(\n z.object({\n deviceId: z.number(),\n capName: z.string(),\n wrapperAddonId: z.string(),\n active: z.boolean(),\n }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n /**\n * Return the addon ids that declared a wrapper provider for `capName`.\n * Backs the device-bindings UI's wrapper-picker dropdown. Entries are\n * sourced from `CapabilityRegistry.wrapperProviders`, populated at\n * `ProviderRegistration.kind === 'wrapper'` time.\n */\n listWrappersForCap: method(\n z.object({ capName: z.string() }),\n z.array(z.string()),\n ),\n\n /**\n * Return every device-scoped capability name that applies to a\n * deviceType (scope:'device' + deviceTypes includes the given type),\n * paired with the wrappers that can provide it. Backs the device\n * bindings UI so it can show rows for bindable caps even when no\n * native is registered yet — the user can still activate a wrapper\n * to light the cap up (e.g. snapshot via ffmpeg fallback for a camera\n * without `snapshotUrl`).\n */\n listBindableCapsForDeviceType: method(\n z.object({ deviceType: z.string() }),\n z.array(z.object({\n capName: z.string(),\n wrappers: z.array(z.string()),\n })),\n ),\n\n // ── Device-details aggregators ───────────────────────────────────────────\n //\n // Single entry point the admin UI calls to render the device-details page.\n // The hub enumerates every provider of `device-settings-contributor` (a\n // `collection` cap) plus its own base section and returns a single\n // `ConfigUISchemaWithValues` with merged tabs/sections.\n //\n // Two endpoints, two cadences:\n // - `getDeviceSettingsAggregate` — editable fields + static readonly.\n // Cached on the UI side, invalidated on successful `updateDeviceField`.\n // - `getDeviceLiveInfoAggregate` — readonly, dynamic. UI polls at a\n // short interval (~2-3 s). Fields carry `source: 'live'` so the\n // renderer knows which query owns the value.\n //\n // Save flow goes through `updateDeviceField` — the aggregator routes the\n // write to `addon-settings.updateDeviceSettings` for the declared\n // `writerAddonId` (or to its own device config store when `writerAddonId`\n // equals the device-manager addon id).\n\n getDeviceSettingsAggregate: method(\n z.object({ deviceId: z.number() }),\n SettingsSchemaWithValuesSchema.nullable(),\n ),\n getDeviceLiveInfoAggregate: method(\n z.object({ deviceId: z.number() }),\n SettingsSchemaWithValuesSchema.nullable(),\n ),\n /**\n * Unified entry point — returns both settings + live in a single call\n * so the admin UI pulls the whole device-details panel with one round-\n * trip instead of firing two parallel queries. The `live` field is the\n * polled portion; the UI re-fetches the whole aggregate at the live\n * cadence and uses the `settings` slice verbatim until the user\n * writes through `updateDeviceFieldsBatch`.\n */\n getDeviceAggregate: method(\n z.object({ deviceId: z.number() }),\n z.object({\n settings: SettingsSchemaWithValuesSchema.nullable(),\n live: SettingsSchemaWithValuesSchema.nullable(),\n }),\n ),\n updateDeviceField: method(\n z.object({\n deviceId: z.number(),\n writerCapName: z.string(),\n writerAddonId: z.string(),\n key: z.string(),\n value: z.unknown(),\n }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n /**\n * Batched counterpart of `updateDeviceField` — the admin UI groups\n * per-provider changes so a single round-trip triggers at most one\n * `applyDeviceSettingsPatch` per `(capName, addonId)` tuple. Per-patch\n * failures are reported in `failures[]` without aborting the others;\n * consumers inspect the list and surface targeted errors.\n */\n updateDeviceFieldsBatch: method(\n z.object({\n deviceId: z.number(),\n changes: z.array(z.object({\n writerCapName: z.string(),\n writerAddonId: z.string(),\n key: z.string(),\n value: z.unknown(),\n })),\n }),\n z.object({\n success: z.literal(true),\n failures: z.array(z.object({\n writerCapName: z.string(),\n writerAddonId: z.string(),\n error: z.string(),\n })),\n }),\n { kind: 'mutation', auth: 'admin' },\n ),\n // ── Device-provider operations (routed via CapabilityRegistry) ────────────\n //\n // These methods proxy to the `device-provider` capability collection,\n // routing by addonId. Moving them here from the compat router\n // (`device-ops.router.ts`) allows addon ctx.api callers to reach them\n // through the standard Moleculer-registered cap surface.\n\n /** Trigger device discovery on a device-provider addon. */\n discoverDevices: method(\n z.object({ addonId: z.string() }),\n z.array(DiscoveryCandidateSchema),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n /** Adopt a discovered device via the device-provider capability. */\n adoptDevice: method(\n z.object({\n addonId: z.string(),\n candidate: DiscoveryCandidateSchema,\n }),\n DeviceSummarySchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n\n /**\n * Get the creation form schema (ConfigUISchema) for a device type from a provider.\n * Returns null when the provider does not support manual creation.\n */\n getCreationSchema: method(\n z.object({\n addonId: z.string(),\n type: z.enum(DeviceType),\n }),\n z.unknown().nullable(),\n ),\n\n /** Create a new device via the device-provider capability. */\n createDevice: method(\n z.object({\n addonId: z.string(),\n type: z.enum(DeviceType),\n config: z.record(z.string(), z.unknown()),\n }),\n DeviceSummarySchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n\n /**\n * Test a single form field value during device creation (no device\n * exists yet). `formValues` carries the live snapshot of every\n * field in the form so probes that depend on multiple fields (e.g.\n * Reolink autodetect needs host + credentials + UID together) can\n * run without a separate round-trip per field. Optional for\n * backwards compatibility.\n */\n testCreationField: method(\n z.object({\n addonId: z.string(),\n type: z.enum(DeviceType),\n key: z.string(),\n value: z.unknown(),\n formValues: z.record(z.string(), z.unknown()).optional(),\n }),\n FieldProbeResultSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n\n /**\n * Test a field value on an existing device (e.g. probe an RTSP URL).\n * Routes through the device-provider for the owning addon.\n */\n testField: method(\n z.object({\n deviceId: z.number(),\n key: z.string(),\n value: z.unknown(),\n }),\n FieldProbeResultSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n\n /**\n * Aggregate status snapshot across every cap registered for a\n * device. Returns a flat map `{ capName: status | null }` where\n * `status` is whatever `capDef.status.schema` validates to — or\n * `null` when no provider for that cap is registered on the\n * device, or the provider returned null, or the returned value\n * failed validation.\n *\n * `caps` is a positional tuple of cap names. The runtime only\n * returns entries for caps that are KNOWN to the system (validated\n * against `CAP_NAMES_WITH_STATUS` at call time); unknown names are\n * silently skipped. The client-side hook narrows the return type\n * using `CapStatusTypeMap` so the TS-inferred shape matches the\n * runtime shape.\n *\n * When `caps` is omitted, the server returns status for EVERY\n * registered cap on the device. Use this only for debug / overview\n * pages — it's O(N caps) per call.\n */\n getDeviceStatusAggregate: method(\n z.object({\n deviceId: z.number(),\n caps: z.array(z.string()).readonly().optional(),\n }),\n z.record(z.string(), z.unknown().nullable()),\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IDeviceManagerProvider = import('./capability-definition.js').InferProvider<typeof deviceManagerCapability>\nexport type DeviceInfo = z.infer<typeof DeviceInfoSchema>\n","import { z } from 'zod'\nimport { type CapabilityDefinition, method, event } from './capability-definition.js'\n\n/**\n * `deviceState` — generic, cap-agnostic surface for cross-process\n * access to per-device runtime state. Read pendant for every cap's\n * runtime-state slice + the canonical write entrypoint. Mirrors the\n * in-process `BaseDevice.runtimeState` API:\n *\n * - `getSnapshot({deviceId})` → full `Record<capName, slice>`.\n * - `getCapSlice({deviceId, capName})` → one slice.\n * - `setCapSlice({deviceId, capName, slice})` → unified single-slice\n * write. Hub validates (when a cap schema is registered),\n * persists to disk (debounced), updates the mirror, and emits\n * `onChanged` for that cap.\n * - `onChanged` event → fires on every slice change.\n *\n * Drivers don't implement this cap directly — the kernel auto-mounts\n * a singleton provider against `device-manager`'s in-hub mirror.\n * Every `setCapState` call on a `BaseDevice.runtimeState` ultimately\n * routes through `setCapSlice` (single cross-layer entrypoint) so\n * UIs / addons subscribe to a single event channel for every\n * cap-state change; per-cap events (`battery.onStatusChanged`, …)\n * remain available for typed consumers but no longer have to be\n * defined on every new cap with runtime state.\n */\nexport const deviceStateCapability = {\n name: 'device-state',\n scope: 'system',\n mode: 'singleton',\n methods: {\n /** Full state snapshot for one device. Empty object if no\n * cap-keyed slice has been written yet. */\n getSnapshot: method(\n z.object({ deviceId: z.number() }),\n z.record(z.string(), z.record(z.string(), z.unknown())),\n ),\n /** Single cap slice. Returns null when the slice hasn't been\n * written or the device isn't registered. */\n getCapSlice: method(\n z.object({ deviceId: z.number(), capName: z.string() }),\n z.record(z.string(), z.unknown()).nullable(),\n ),\n /**\n * Whole-system snapshot — every device's full state in one\n * payload. Used by `SystemManager` for warm-boot: a single\n * round-trip populates the client mirror so every subsequent\n * `sm.getDeviceById(id).state.<cap>.value` is sync. Empty inner\n * record for devices that haven't emitted any slice yet.\n */\n getAllSnapshots: method(\n z.object({}),\n z.record(z.string(), z.record(z.string(), z.record(z.string(), z.unknown()))),\n ),\n\n /**\n * Canonical cross-layer WRITE for one cap-keyed slice. Used by\n * everyone who needs to publish runtime state for a device:\n * device providers (via `BaseDevice.runtimeState.setCapState`\n * which delegates here), system-scope addons (e.g. the pipeline\n * runner writing the `motion` slice on phase transitions), and\n * direct cap-router callers in tests.\n *\n * Behavior on the hub:\n * 1. Resolve the device — throws if unknown.\n * 2. Diff the slice against the current mirror (no-op on\n * identical writes — saves disk and event churn).\n * 3. Update the mirror in place.\n * 4. Persist the full per-device blob to disk (debounced).\n * 5. Emit `onChanged` for this cap so subscribers (UI mirror,\n * SystemManager, per-cap typed listeners) refresh.\n *\n * Schema validation is the caller's responsibility — callers\n * going through `BaseDevice.runtimeState.setCapState` get the\n * cap's `runtimeState` schema enforced in-process before the\n * write reaches here. Direct callers should validate against\n * the cap's schema themselves.\n *\n * No `patch` variant — for shallow merges read the slice via\n * `getCapSlice` first, merge, and write. The single-writer\n * conventions on each cap make atomic-merge semantics\n * unnecessary in practice.\n */\n setCapSlice: method(\n z.object({\n deviceId: z.number(),\n capName: z.string(),\n slice: z.record(z.string(), z.unknown()),\n }),\n z.void(),\n { kind: 'mutation' },\n ),\n },\n events: {\n /**\n * Fires whenever a cap-keyed slice changes. Per-event payload\n * carries the slice that changed — subscribers can render off\n * the payload alone without re-querying. Filterable by `deviceId`\n * via the standard `EventFilter` helpers.\n */\n onChanged: event(z.object({\n deviceId: z.number(),\n capName: z.string(),\n slice: z.record(z.string(), z.unknown()),\n })),\n },\n} as const satisfies CapabilityDefinition\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\nconst AuthResultSchema = z.object({\n userId: z.string(),\n username: z.string(),\n email: z.string().optional(),\n displayName: z.string().optional(),\n roles: z.array(z.string()).optional(),\n})\n\nexport const authProviderCapability = {\n name: 'auth-provider',\n scope: 'system',\n mode: 'collection',\n internal: true,\n methods: {\n validateCredentials: method(\n z.object({ username: z.string(), password: z.string() }),\n AuthResultSchema.nullable(),\n { kind: 'mutation' },\n ),\n getLoginUrl: method(z.object({ state: z.string() }), z.string()),\n handleCallback: method(z.record(z.string(), z.string()), AuthResultSchema, { kind: 'mutation' }),\n validateToken: method(z.object({ token: z.string() }), AuthResultSchema.nullable()),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IAuthProvider = InferProvider<typeof authProviderCapability>\n\nexport { AuthResultSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n/**\n * Authentication-provider summary metadata. Drives the admin UI's\n * \"Authentication Providers\" page and the login screen's provider\n * picker (Google / Microsoft / SAML / etc. buttons next to the\n * username/password form).\n *\n * Keep the shape lean: the admin UI doesn't render runtime\n * credentials, only enough to identify the provider and its UX\n * affordances. Per-provider config still lives in the addon's own\n * settings panel.\n */\nconst AuthProviderInfoSchema = z.object({\n /** Stable id matching the addon id (used for `getLoginUrl({addonId,…})`). */\n addonId: z.string(),\n /** Display label shown on the login button + admin row. */\n displayName: z.string(),\n /** Optional iconography hint (lucide-react icon name OR emoji). */\n icon: z.string().optional(),\n /** When true, the provider exposes a redirect-based login flow\n * (`getLoginUrl` returns a URL the browser navigates to). */\n hasRedirectFlow: z.boolean(),\n /** When true, the provider exposes a credential-form login flow\n * (`validateCredentials` accepts username + password). */\n hasCredentialFlow: z.boolean(),\n /** Operator-facing status string (e.g. \"Connected to https://login.acme.com\"). */\n status: z.string().optional(),\n /** When false, the provider is registered but disabled by config; the\n * UI surfaces it as inactive without enumerating it for login. */\n enabled: z.boolean(),\n})\n\nexport type AuthProviderInfo = z.infer<typeof AuthProviderInfoSchema>\n\n/**\n * `authentication` — singleton facade over the `auth-provider`\n * collection. Consumed by:\n * - Login page (enumerate provider buttons)\n * - Admin UI Authentication page (list/configure/enable/disable)\n *\n * Mirrors the pattern of `backup` (singleton facade over the\n * `backup-destination` collection) — UI consumers don't need to know\n * about individual `auth-provider` providers; they call this and\n * receive a curated view.\n *\n * The actual login flow still goes through the `auth-provider`\n * collection (validateCredentials / getLoginUrl / handleCallback);\n * this cap only listing/orchestration.\n */\nexport const authenticationCapability = {\n name: 'authentication',\n scope: 'system',\n mode: 'singleton',\n methods: {\n /** All registered auth providers, both enabled and disabled. */\n listProviders: method(z.void(), z.array(AuthProviderInfoSchema).readonly()),\n /**\n * Toggle a provider's enabled flag. Disabled providers stay\n * registered but aren't surfaced on the login page. The orchestrator\n * persists the state in `addon-settings` so it survives restarts.\n */\n setProviderEnabled: method(\n z.object({ addonId: z.string(), enabled: z.boolean() }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IAuthenticationProvider = InferProvider<typeof authenticationCapability>\n\nexport { AuthProviderInfoSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\nconst NetworkEndpointSchema = z.object({\n url: z.string(),\n hostname: z.string(),\n port: z.number(),\n protocol: z.enum(['http', 'https']),\n})\n\nconst NetworkAccessStatusSchema = z.object({\n connected: z.boolean(),\n endpoint: NetworkEndpointSchema.nullable(),\n error: z.string().optional(),\n})\n\nexport const networkAccessCapability = {\n name: 'network-access',\n scope: 'system',\n mode: 'collection',\n internal: true,\n methods: {\n start: method(z.void(), NetworkEndpointSchema, { kind: 'mutation' }),\n stop: method(z.void(), z.void(), { kind: 'mutation' }),\n getEndpoint: method(z.void(), NetworkEndpointSchema.nullable()),\n getStatus: method(z.void(), NetworkAccessStatusSchema),\n },\n} as const satisfies CapabilityDefinition\n\nexport type INetworkAccessProvider = InferProvider<typeof networkAccessCapability>\n\nexport { NetworkEndpointSchema, NetworkAccessStatusSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\nconst RemoteAccessEndpointSchema = z.object({\n url: z.string(),\n hostname: z.string(),\n port: z.number(),\n protocol: z.enum(['http', 'https']),\n})\n\n/**\n * Remote-access provider summary, surfaced to the admin UI's\n * \"Remote Access\" page. One row per registered `network-access`\n * provider (Cloudflare Tunnel, ngrok, Tailscale, etc.).\n */\nconst RemoteAccessProviderInfoSchema = z.object({\n /** Stable id matching the addon id. */\n addonId: z.string(),\n /** Display label shown on the admin row — sourced from the addon manifest. */\n displayName: z.string(),\n /** When false, the provider is registered but disabled. */\n enabled: z.boolean(),\n /** True when the underlying tunnel/connection is up. */\n connected: z.boolean(),\n /** Public-facing endpoint, when connected. Null otherwise. */\n endpoint: RemoteAccessEndpointSchema.nullable(),\n /** Last error message (when connected=false), if available. */\n error: z.string().optional(),\n})\n\nexport type RemoteAccessProviderInfo = z.infer<typeof RemoteAccessProviderInfoSchema>\n\n/**\n * `remote-access` — singleton facade over the `network-access`\n * collection. Consumed by the admin UI's Remote Access page so an\n * operator can see at a glance which providers are configured, which\n * are connected, and which public endpoint each exposes.\n *\n * Mirrors the `authentication` / `turn-orchestrator` patterns: the\n * UI talks to the singleton, the singleton walks the collection.\n */\nexport const remoteAccessCapability = {\n name: 'remote-access',\n scope: 'system',\n mode: 'singleton',\n methods: {\n /** All registered remote-access providers + their live status. */\n listProviders: method(z.void(), z.array(RemoteAccessProviderInfoSchema).readonly()),\n /**\n * Start a specific provider's tunnel. Per-provider config still\n * lives on the addon's settings panel; this is just the on/off\n * trigger so the admin UI can manage the lifecycle from one place.\n */\n startProvider: method(\n z.object({ addonId: z.string() }),\n RemoteAccessEndpointSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n /** Stop a specific provider's tunnel (idempotent on already-stopped). */\n stopProvider: method(\n z.object({ addonId: z.string() }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IRemoteAccessOrchestrator = InferProvider<typeof remoteAccessCapability>\n\nexport { RemoteAccessEndpointSchema, RemoteAccessProviderInfoSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n/**\n * A single ICE TURN/STUN server entry, shape compatible with\n * `RTCIceServer` in the WebRTC spec.\n */\nconst TurnServerSchema = z.object({\n /** Single URL or list of URLs (e.g. \"turn:turn.example.com:3478?transport=udp\"). */\n urls: z.union([z.string(), z.array(z.string())]),\n username: z.string().optional(),\n credential: z.string().optional(),\n})\n\n/**\n * turn-provider — system collection of TURN/STUN server providers.\n *\n * Consumed by `webrtc` providers (e.g. addon-go2rtc) when building the\n * ICE server list for an offer. Multiple providers can coexist\n * (Cloudflare, self-hosted coturn, Twilio, etc.) — the webrtc layer\n * concatenates servers from all registered implementations.\n *\n * Exposed over tRPC so that out-of-process addons (forked workers or\n * remote agents) can also enumerate available TURN servers without\n * requiring in-process access to the capability registry.\n */\nexport const turnProviderCapability = {\n name: 'turn-provider',\n scope: 'system',\n mode: 'collection',\n methods: {\n /**\n * Return the current list of TURN/STUN servers with credentials.\n * Implementations may fetch fresh short-lived credentials on each call\n * (e.g. Cloudflare API) — consumers SHOULD call this per-session.\n */\n getTurnServers: method(\n z.void(),\n z.array(TurnServerSchema).readonly(),\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type ITurnProvider = InferProvider<typeof turnProviderCapability>\n\nexport { TurnServerSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { TurnServerSchema } from './turn-provider.cap.js'\n\nconst TurnProviderInfoSchema = z.object({\n /** Stable id matching the addon id. */\n addonId: z.string(),\n /** Display label shown on the admin row — sourced from the addon manifest. */\n displayName: z.string(),\n /** When false, the provider is registered but disabled. */\n enabled: z.boolean(),\n /** Number of servers this provider is currently exposing. */\n serverCount: z.number(),\n /**\n * Flat list of every TURN/STUN URL this provider currently exposes.\n * One row per URL (multi-URL ICE server entries are flattened). The\n * admin UI shows this in a compact per-provider list so operators\n * can verify what's actually being negotiated without having to dig\n * into the combined `getAllServers` output.\n */\n urls: z.array(z.string()).readonly(),\n /** Last fetch error (when serverCount=0 due to API failure), if any. */\n error: z.string().optional(),\n})\n\nexport type TurnProviderInfo = z.infer<typeof TurnProviderInfoSchema>\n\n/**\n * `turn-orchestrator` — singleton facade over the `turn-provider`\n * collection. Provides:\n * - listProviders() — admin UI inventory\n * - getAllServers() — combined list of TURN/STUN URLs across all\n * enabled providers (what the WebRTC layer actually consumes)\n *\n * Mirrors `authentication` / `remote-access` — UI consumers go\n * through the singleton, the singleton walks the collection.\n *\n * The WebRTC layer (broker / addon-go2rtc) historically called\n * `turn-provider` collection methods directly to build the ICE\n * server list per session. Going through this orchestrator instead\n * gives a single throughput point + lets the admin disable a\n * provider without uninstalling it.\n */\nexport const turnOrchestratorCapability = {\n name: 'turn-orchestrator',\n scope: 'system',\n mode: 'singleton',\n methods: {\n /** All registered TURN providers + per-provider stats. */\n listProviders: method(z.void(), z.array(TurnProviderInfoSchema).readonly()),\n /**\n * Combined list of TURN/STUN servers from all ENABLED providers.\n * Consumed by the WebRTC layer at session-creation time —\n * implementations may fetch fresh short-lived credentials each\n * call (e.g. Cloudflare API), so consumers SHOULD call per-session.\n */\n getAllServers: method(z.void(), z.array(TurnServerSchema).readonly()),\n /** Toggle a provider's enabled flag. */\n setProviderEnabled: method(\n z.object({ addonId: z.string(), enabled: z.boolean() }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type ITurnOrchestratorProvider = InferProvider<typeof turnOrchestratorCapability>\n\nexport { TurnProviderInfoSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\n/**\n * A single device snapshot returned as base64 JPEG/PNG.\n *\n * Shared with the `snapshot-provider` collection cap — the orchestrator\n * receives the same shape from each native provider and from the\n * broker-based fallback.\n */\nconst SnapshotImageSchema = z.object({\n base64: z.string(),\n contentType: z.string(),\n})\n\n/**\n * snapshot — device-scoped capability for camera image capture.\n *\n * Two kinds of providers coexist behind this cap name:\n *\n * - **Native** providers (kind:'native'): registered per-device by\n * device-driver addons (RtspCamera, OnvifCamera, …) via\n * `DeviceContext.registerNativeCap`. Each knows how to fetch a frame\n * straight from the camera (HTTP snapshot URL, ONVIF action, etc.).\n *\n * - **Wrapper** providers (kind:'wrapper'): register as a system\n * provider (SnapshotAddon in `@camstack/core/builtins/snapshot`). The\n * wrapper owns the cache and invokes the native via\n * `ctx.getNativeProvider(snapshotCapability, deviceId)` on miss.\n *\n * Device-scoped routing: callers use `ctx.fetchDevice(id).snapshot.*`;\n * the DeviceProxy auto-injects `deviceId` + `nodeId` and dispatches to\n * the provider currently active for that device (wrapper wins when\n * activated via `setWrapperActive`, otherwise the native).\n */\n/**\n * Live readable snapshot state — diagnostic info that a consumer can\n * pull to know when the last image was captured, how stale the cache\n * is, and which stream was used. Distinct from `getSnapshot` which\n * returns the JPEG itself.\n */\nconst SnapshotStatusSchema = z.object({\n /** Ms epoch of the last successful capture. Null if none yet. */\n lastCapturedAt: z.number().nullable(),\n /** Age of the cached image in ms. Null if no cache. */\n cacheAgeMs: z.number().nullable(),\n /** Size in bytes of the last captured image. Null if no capture. */\n lastBytes: z.number().nullable(),\n /** Stream id used for the last capture ('high'|'mid'|'low' or custom). Null if via HTTP endpoint. */\n lastStreamId: z.string().nullable(),\n})\n\nexport const snapshotCapability = {\n name: 'snapshot',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera],\n // Owns per-device snapshot settings (preferred stream, debug logging).\n // The three DeviceSettingsContribution methods are auto-added to the\n // provider interface via `InferProvider` — `SnapshotAddon` implements\n // them and persists per-device state through `ctx.settings.writeDeviceStore`.\n exposesDeviceSettings: true,\n methods: {\n getSnapshot: method(\n z.object({\n deviceId: z.number(),\n streamId: z.string().optional(),\n /**\n * Bypass the cache freshness check and fetch directly from the\n * native (or stream-broker fallback). Triggered by the UI's\n * \"refresh\" button so an operator can force a fresh frame\n * even when the cache is well within `snapshotMaxAgeMs`.\n * On battery cams this WILL wake the camera — accept the\n * cost only when the user explicitly asks for it.\n */\n force: z.boolean().optional(),\n }),\n SnapshotImageSchema.nullable(),\n ),\n invalidateCache: method(\n z.object({ deviceId: z.number() }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n status: {\n schema: SnapshotStatusSchema,\n kind: 'poll',\n },\n} as const satisfies CapabilityDefinition\n\nexport type ISnapshotOrchestrator = InferProvider<typeof snapshotCapability>\n\nexport { SnapshotImageSchema, SnapshotStatusSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { SnapshotImageSchema } from './snapshot.cap.js'\n\n/**\n * snapshot-provider — collection of native snapshot implementations.\n *\n * Device provider addons (ONVIF, Frigate, Scrypted, etc.) register here\n * when they can capture frames through a protocol-native path (e.g.\n * ONVIF GetSnapshotUri, Frigate /api/<cam>/latest.jpg). The `snapshot`\n * singleton orchestrator iterates over the collection, asking each\n * provider whether it supports the requested device, and calls the\n * first matching one.\n *\n * If no provider in the collection supports a device, the orchestrator\n * falls back to `stream-broker.grabFrame` (universal fallback).\n *\n * Public tRPC router (auto-mounted) so out-of-process addons, agents,\n * and advanced clients can bypass the orchestrator when needed.\n */\nexport const snapshotProviderCapability = {\n name: 'snapshot-provider',\n scope: 'system',\n mode: 'collection',\n methods: {\n supportsDevice: method(\n z.object({ deviceId: z.number() }),\n z.boolean(),\n ),\n getSnapshot: method(\n z.object({\n deviceId: z.number(),\n streamId: z.string().optional(),\n }),\n SnapshotImageSchema.nullable(),\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type ISnapshotProvider = InferProvider<typeof snapshotProviderCapability> & {\n readonly id: string\n readonly name: string\n}\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\nconst NotificationSchema = z.object({\n title: z.string(),\n body: z.string(),\n imageUrl: z.string().optional(),\n deviceId: z.number().optional(),\n eventId: z.string().optional(),\n priority: z.enum(['low', 'normal', 'high', 'critical']).default('normal'),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const notificationOutputCapability = {\n name: 'notification-output',\n scope: 'system',\n mode: 'collection',\n methods: {\n send: method(NotificationSchema, z.void(), { kind: 'mutation' }),\n sendTest: method(\n z.void(),\n z.object({ success: z.boolean(), error: z.string().optional() }),\n { kind: 'mutation' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type INotificationOutputProvider = InferProvider<typeof notificationOutputCapability>\n\nexport { NotificationSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\nconst NotificationRuleSchema = z.object({\n id: z.string(),\n name: z.string(),\n enabled: z.boolean(),\n conditions: z.record(z.string(), z.unknown()),\n actions: z.array(z.record(z.string(), z.unknown())),\n})\n\nconst NotificationHistoryEntrySchema = z.object({\n id: z.string(),\n ruleId: z.string(),\n timestamp: z.number(),\n deviceId: z.number().optional(),\n success: z.boolean(),\n error: z.string().optional(),\n})\n\nexport const advancedNotifierCapability = {\n name: 'advanced-notifier',\n scope: 'system',\n mode: 'singleton',\n internal: true,\n methods: {\n getRules: method(z.void(), z.array(NotificationRuleSchema).readonly()),\n upsertRule: method(NotificationRuleSchema, z.void(), { kind: 'mutation' }),\n deleteRule: method(z.object({ ruleId: z.string() }), z.void(), { kind: 'mutation' }),\n testRule: method(\n z.object({ ruleId: z.string(), lookbackMinutes: z.number() }),\n z.array(z.record(z.string(), z.unknown())),\n { kind: 'mutation' },\n ),\n getHistory: method(\n z.object({ ruleId: z.string().optional(), limit: z.number().optional() }),\n z.array(NotificationHistoryEntrySchema),\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IAdvancedNotifierProvider = InferProvider<typeof advancedNotifierCapability>\n\nexport { NotificationRuleSchema, NotificationHistoryEntrySchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n// ── Shared sub-schemas ─────────────────────────────────────────────\n\nconst RecordingModeSchema = z.enum(['continuous', 'motion', 'scheduled', 'composite'])\n\nconst StreamPolicySchema = z.object({\n streamId: z.string(),\n mode: z.enum(['always', 'inherit']),\n})\n\nconst ScheduleRuleSchema = z.object({\n days: z.array(z.number()).readonly(),\n startTime: z.string(),\n endTime: z.string(),\n mode: z.enum(['continuous', 'motion']),\n})\n\nconst RecordingPolicySchema = z.object({\n deviceId: z.number(),\n mode: RecordingModeSchema,\n streams: z.array(StreamPolicySchema).readonly(),\n enabled: z.boolean(),\n preBufferSec: z.number(),\n postBufferSec: z.number(),\n scheduleRules: z.array(ScheduleRuleSchema).readonly().optional(),\n})\n\nconst DataCategorySchema = z.enum([\n 'recording:main', 'recording:mid', 'recording:sub',\n 'thumbnail:scrub', 'thumbnail:event',\n])\n\nconst RecordingStorageConfigSchema = z.object({\n deviceId: z.number(),\n dataCategory: DataCategorySchema,\n storageName: z.string(),\n subDirectory: z.string(),\n retentionDays: z.number().nullable(),\n retentionGb: z.number().nullable(),\n})\n\nconst RecordingSegmentSchema = z.object({\n id: z.string(),\n deviceId: z.number(),\n streamId: z.string(),\n startTime: z.number(),\n endTime: z.number(),\n duration: z.number(),\n path: z.string(),\n storageName: z.string(),\n subDirectory: z.string(),\n sizeBytes: z.number(),\n codec: z.enum(['h264', 'h265']),\n hasAudio: z.boolean(),\n})\n\nconst RecordingThumbnailSchema = z.object({\n deviceId: z.number(),\n timestamp: z.number(),\n path: z.string(),\n storageName: z.string(),\n subDirectory: z.string(),\n sizeBytes: z.number(),\n category: z.enum(['scrub', 'event']),\n})\n\nconst AvailabilityRangeSchema = z.object({\n startTime: z.number(),\n endTime: z.number(),\n streams: z.array(z.string()).readonly(),\n})\n\nconst StorageUsageSchema = z.object({\n totalBytes: z.number(),\n segmentCount: z.number(),\n})\n\nconst StreamEstimateSchema = z.object({\n bitrateKbps: z.number(),\n retentionDays: z.number().nullable(),\n retentionGb: z.number().nullable(),\n estimatedGb: z.number(),\n estimatedDaysAtCapacity: z.number().nullable(),\n})\n\nconst StorageEstimateSchema = z.object({\n perStream: z.record(z.string(), StreamEstimateSchema),\n thumbnails: z.object({ estimatedGb: z.number() }),\n totalEstimatedGb: z.number(),\n motionEstimate: z.object({\n avgEventsPerDay: z.number(),\n avgDurationSec: z.number(),\n dutyCyclePercent: z.number(),\n }).optional(),\n})\n\nconst MotionStatsSchema = z.object({\n totalEvents: z.number(),\n avgDurationSec: z.number(),\n avgEventsPerDay: z.number(),\n dutyCyclePercent: z.number(),\n})\n\n// ── Inputs ─────────────────────────────────────────────────────────\n\nconst DeviceIdInput = z.object({ deviceId: z.number() })\n\nconst EnableInput = z.object({\n deviceId: z.number(),\n policy: RecordingPolicySchema.omit({ deviceId: true }),\n storageOverrides: z.array(RecordingStorageConfigSchema.omit({ deviceId: true })).readonly().optional(),\n ffmpegOverrides: z.record(z.string(), z.unknown()).optional(),\n})\n\nconst TimeRangeInput = z.object({\n deviceId: z.number(),\n startTime: z.number(),\n endTime: z.number(),\n})\n\nconst StreamTimeRangeInput = z.object({\n deviceId: z.number(),\n streamId: z.string(),\n startTime: z.number(),\n endTime: z.number(),\n})\n\nconst PlaylistInput = z.object({\n deviceId: z.number(),\n streamId: z.string(),\n startTime: z.number(),\n endTime: z.number(),\n live: z.boolean().optional(),\n})\n\nconst ThumbnailInput = z.object({\n deviceId: z.number(),\n timestamp: z.number(),\n category: z.string().optional(),\n})\n\nconst DeviceStreamInput = z.object({\n deviceId: z.number(),\n streamId: z.string(),\n})\n\nconst StorageEstimateInput = z.object({\n deviceId: z.number(),\n motionInput: z.object({\n avgEventsPerDay: z.number(),\n avgDurationSec: z.number(),\n }).optional(),\n})\n\nconst RetentionConfigInput = z.object({\n deviceId: z.number(),\n dataCategory: DataCategorySchema,\n})\n\nconst SetPolicyInput = z.object({\n deviceId: z.number(),\n policy: RecordingPolicySchema.omit({ deviceId: true }),\n})\n\nconst UpdateConfigInput = z.object({\n deviceId: z.number(),\n policy: RecordingPolicySchema.omit({ deviceId: true }),\n ffmpegOverrides: z.record(z.string(), z.unknown()).optional(),\n})\n\n// ── Capability definition ──────────────────────────────────────────\n\n/**\n * Recording engine — manages per-device recording lifecycle, policies,\n * playlists, segments, thumbnails, and storage estimation.\n *\n * Implemented by the `recording` sub-addon inside `addon-analytics-suite`.\n * Session 5 Sprint D expanded the cap from 1 method (`getStatus`) to the\n * full 17-method contract, replacing the broken hand-written\n * `recording.router.ts` that invoked non-existent methods on the addon.\n *\n * The provider implementation is a facade wrapping RecordingCoordinator,\n * RecordingDb, PlaylistGenerator, StorageEstimator, and RetentionManager.\n */\nexport const recordingEngineCapability = {\n name: 'recording-engine',\n scope: 'system',\n mode: 'singleton',\n methods: {\n // ── Status ────────────────────────────────────────────────────────\n getStatus: method(z.void(), z.object({\n activeRecordings: z.number(),\n totalSegments: z.number(),\n totalSizeMB: z.number(),\n })),\n\n // ── Lifecycle ─────────────────────────────────────────────────────\n enable: method(EnableInput, z.void(), { kind: 'mutation', auth: 'admin' }),\n disable: method(DeviceIdInput, z.void(), { kind: 'mutation', auth: 'admin' }),\n\n // ── Config ────────────────────────────────────────────────────────\n getConfig: method(DeviceIdInput, RecordingPolicySchema.nullable()),\n updateConfig: method(UpdateConfigInput, z.void(), { kind: 'mutation', auth: 'admin' }),\n\n // ── Playback ──────────────────────────────────────────────────────\n getPlaylist: method(PlaylistInput, z.string()),\n getThumbnail: method(ThumbnailInput, RecordingThumbnailSchema.nullable()),\n getSegments: method(StreamTimeRangeInput, z.array(RecordingSegmentSchema).readonly()),\n getAvailability: method(TimeRangeInput, z.array(AvailabilityRangeSchema).readonly()),\n\n // ── Storage ───────────────────────────────────────────────────────\n estimateStorage: method(StorageEstimateInput, StorageEstimateSchema),\n estimateGlobalStorage: method(z.void(), StorageEstimateSchema),\n getStorageUsage: method(DeviceStreamInput, StorageUsageSchema),\n\n // ── Policy ────────────────────────────────────────────────────────\n setPolicy: method(SetPolicyInput, z.void(), { kind: 'mutation', auth: 'admin' }),\n getPolicy: method(DeviceIdInput, RecordingPolicySchema.nullable()),\n getPolicyStatus: method(DeviceIdInput, z.object({\n deviceId: z.number(),\n enabled: z.boolean(),\n mode: RecordingModeSchema,\n activeStreams: z.number(),\n }).nullable()),\n\n // ── Retention ─────────────────────────────────────────────────────\n getRetentionConfig: method(RetentionConfigInput, RecordingStorageConfigSchema.nullable()),\n updateRetentionConfig: method(RecordingStorageConfigSchema, z.void(), { kind: 'mutation', auth: 'admin' }),\n\n // ── Motion ────────────────────────────────────────────────────────\n getMotionStats: method(TimeRangeInput, MotionStatsSchema),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IRecordingEngineProvider = InferProvider<typeof recordingEngineCapability>\n\nexport {\n RecordingPolicySchema,\n RecordingSegmentSchema,\n RecordingThumbnailSchema,\n RecordingStorageConfigSchema,\n AvailabilityRangeSchema,\n StorageUsageSchema,\n StorageEstimateSchema,\n MotionStatsSchema,\n RecordingModeSchema,\n DataCategorySchema,\n}\n","import { type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\n/**\n * detection-pipeline — device-scoped facade over the system\n * `pipeline-executor`.\n *\n * Pairs with `pipeline-executor` (system, singleton) the way\n * `audio-analysis` pairs with `audio-analyzer`: the system cap owns the\n * engine lifecycle (engines, templates, models, runPipeline) while\n * `detection-pipeline` is the per-camera binding row in the\n * device-manager UI.\n *\n * Registered as a wrapper with `defaultActive: true` by\n * `addon-detection-pipeline` so every camera opts into detection\n * automatically. Operators disable per-device via\n * `device-manager.setWrapperActive` — replaces the legacy\n * `pipelineEnabled` / `disableInference` flags previously stored in the\n * orchestrator's device-settings.\n *\n * `exposesDeviceSettings: true` is intentional — the three\n * DeviceSettingsContribution methods auto-added to the provider\n * interface serve the per-device detection settings panel in the admin\n * UI (model selection, class filters, confidence thresholds).\n */\nexport const detectionPipelineCapability = {\n name: 'detection-pipeline',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera],\n exposesDeviceSettings: true,\n methods: {},\n} as const satisfies CapabilityDefinition\n\nexport type IDetectionPipelineProvider = InferProvider<typeof detectionPipelineCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\nimport { BoundingBoxSchema } from './schemas/detection-shared.js'\n\n/**\n * pipeline-analytics — device-scoped wrapper cap. Refines raw\n * per-frame detections emitted by the pipeline runner into tracked\n * objects, per-kind event collections (motion / object / audio), and\n * persisted media. Owns the post-detection domain end-to-end:\n *\n * runner emits PipelineInferenceResult\n * ↓ (event bus)\n * pipeline-analytics subscriber\n * ↓ SORT tracker + zone engine + state analyzer + event emitter\n * → three DB collections (one per kind), one FS media tree, one\n * unified event emitter (FrameTracked + TrackStarted/Ended +\n * DetectionEvent on bus)\n *\n * Pure subscriber model. No `processFrame` cap method — the runner\n * already publishes the raw frame on the bus. The cap surface is\n * only QUERIES + per-device settings, bound on/off via\n * `device-manager.setWrapperActive`. `defaultActive: true` because\n * every camera with a detection pipeline wants its raw detections\n * refined; operators opt out per-device via BindingsTab when needed.\n *\n * Replaces the legacy `analysis-pipeline`, `analysis-data-persistence`\n * (per-device surface) and `track-trail` caps — see P11 cleanup.\n */\n\n// ── Shared sub-schemas ──────────────────────────────────────────────\n\nconst TrackStateSchema = z.enum(['new', 'entered', 'left', 'moving', 'idle'])\nexport type TrackState = z.infer<typeof TrackStateSchema>\n\nconst EventKindSchema = z.enum(['motion', 'object', 'audio'])\nexport type EventKind = z.infer<typeof EventKindSchema>\n\n// ── Track (unified: identity + positions + snapshots) ───────────────\n\nconst TrackPositionSchema = z.object({\n x: z.number(),\n y: z.number(),\n timestamp: z.number(),\n bbox: BoundingBoxSchema,\n})\n\nconst TrackSnapshotSchema = z.object({\n timestamp: z.number(),\n position: TrackPositionSchema,\n /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */\n mediaKey: z.string(),\n})\n\nconst TrackSchema = z.object({\n trackId: z.string(),\n deviceId: z.number(),\n className: z.string(),\n label: z.string().optional(),\n firstSeen: z.number(),\n lastSeen: z.number(),\n /** Frame-rate position history (subject to maxPositionHistory cap). */\n positions: z.array(TrackPositionSchema).readonly(),\n /** Periodic snapshots at snapshotIntervalMs cadence (subject to\n * saveThumbnails policy). */\n snapshots: z.array(TrackSnapshotSchema).readonly(),\n /** Deduplicated zones the track has entered at least once. */\n zonesVisited: z.array(z.string()).readonly(),\n /** Cumulative normalized distance travelled (0..1 units = full frame width). */\n totalDistance: z.number(),\n state: TrackStateSchema,\n active: z.boolean(),\n})\nexport type Track = z.infer<typeof TrackSchema>\n// TrackPosition / TrackSnapshot types stay internal — consumers access\n// them through `track.positions[i]` / `track.snapshots[i]`. Top-level\n// names are reserved for the legacy interfaces/analysis-persistence.ts\n// until P11 cleanup.\n\n// ── Events (per-kind, three separate backing collections) ───────────\n\nconst BaseEventFields = {\n id: z.string(),\n deviceId: z.number(),\n timestamp: z.number(),\n}\n\nconst MotionEventSchema = z.object({\n ...BaseEventFields,\n kind: z.literal('motion'),\n regionCount: z.number(),\n regions: z.array(z.object({\n bbox: BoundingBoxSchema,\n pixelCount: z.number(),\n intensity: z.number(),\n })).readonly(),\n frameWidth: z.number(),\n frameHeight: z.number(),\n})\nexport type MotionEvent = z.infer<typeof MotionEventSchema>\n\nconst ObjectEventSchema = z.object({\n ...BaseEventFields,\n kind: z.literal('object'),\n trackId: z.string(),\n className: z.string(),\n label: z.string().optional(),\n confidence: z.number(),\n bbox: BoundingBoxSchema,\n zones: z.array(z.string()).readonly(),\n state: TrackStateSchema,\n /** MediaStore key for the crop attached to this event (if any). */\n mediaKey: z.string().optional(),\n})\nexport type ObjectEvent = z.infer<typeof ObjectEventSchema>\n\nconst AudioEventSchema = z.object({\n ...BaseEventFields,\n kind: z.literal('audio'),\n rms: z.number(),\n dbfs: z.number(),\n classification: z.object({\n className: z.string(),\n originalClass: z.string().optional(),\n score: z.number(),\n }).optional(),\n})\nexport type AudioEvent = z.infer<typeof AudioEventSchema>\n\n// ── Media files (crops / thumbs / snapshots) ────────────────────────\n\nconst MediaFileSchema = z.object({\n key: z.string(),\n kind: z.enum(['crop', 'thumbnail', 'snapshot']),\n base64: z.string(),\n sizeBytes: z.number(),\n timestamp: z.number(),\n})\nexport type MediaFile = z.infer<typeof MediaFileSchema>\n\n// ── Query input schemas ─────────────────────────────────────────────\n\n// Hard cap on event-list responses. Without it, queries against the\n// 1M+ row analytics tables (audio classifier inserts ~1500 rows/min\n// per active camera) return every row + classification blob, blow\n// past the tRPC 5s default, and OOM the JSON serializer. Callers\n// needing more than MAX in one batch should paginate via since/until.\nconst DEFAULT_EVENT_QUERY_LIMIT = 1000\nconst MAX_EVENT_QUERY_LIMIT = 5000\n\nconst DeviceEventQueryInput = z.object({\n deviceId: z.number(),\n since: z.number().optional(),\n until: z.number().optional(),\n limit: z.number().int().min(1).max(MAX_EVENT_QUERY_LIMIT).default(DEFAULT_EVENT_QUERY_LIMIT),\n})\n\nconst ObjectEventQueryInput = DeviceEventQueryInput.extend({\n classFilter: z.string().optional(),\n})\n\n// ── Enriched frame emitted on bus after refinement ──────────────────\n//\n// Lightweight: carries only the tracked-detection metadata consumers\n// need to overlay track IDs / zones on a live stream. Full Track state\n// is queryable via getActiveTracks / getTrack.\n\nconst TrackedDetectionSchema = z.object({\n trackId: z.string(),\n className: z.string(),\n confidence: z.number(),\n bbox: BoundingBoxSchema,\n zones: z.array(z.string()).readonly(),\n state: TrackStateSchema,\n})\n\n// ── Capability definition ───────────────────────────────────────────\n\nexport const pipelineAnalyticsCapability = {\n name: 'pipeline-analytics',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera],\n exposesDeviceSettings: true,\n methods: {\n // ── Tracks ────────────────────────────────────────────────\n getActiveTracks: method(\n z.object({ deviceId: z.number() }),\n z.array(TrackSchema).readonly(),\n ),\n getTrack: method(\n z.object({ deviceId: z.number(), trackId: z.string() }),\n TrackSchema.nullable(),\n ),\n /** Historical completed tracks for a device. Queried from the\n * persisted `pipeline-analytics:tracks` collection; active tracks\n * still in RAM are not included. */\n listTracks: method(\n z.object({\n deviceId: z.number(),\n since: z.number().optional(),\n until: z.number().optional(),\n limit: z.number().optional(),\n }),\n z.array(TrackSchema).readonly(),\n ),\n clearTracks: method(\n z.object({ deviceId: z.number() }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n // ── Events (per-kind, parallel-queryable) ─────────────────\n getMotionEvents: method(\n DeviceEventQueryInput,\n z.array(MotionEventSchema).readonly(),\n ),\n getObjectEvents: method(\n ObjectEventQueryInput,\n z.array(ObjectEventSchema).readonly(),\n ),\n getAudioEvents: method(\n DeviceEventQueryInput,\n z.array(AudioEventSchema).readonly(),\n ),\n\n // ── Media ─────────────────────────────────────────────────\n getEventMedia: method(\n z.object({ eventId: z.string() }),\n z.array(MediaFileSchema).readonly(),\n ),\n getTrackMedia: method(\n z.object({ trackId: z.string() }),\n z.array(MediaFileSchema).readonly(),\n ),\n },\n events: {\n /**\n * Enriched frame emitted after refinement. Carries lightweight\n * tracked-detection metadata (track id, class, zones, state) so\n * downstream consumers (stream overlays, notifications) can\n * annotate without querying full Track state.\n */\n onFrameTracked: {\n data: z.object({\n deviceId: z.number(),\n timestamp: z.number(),\n frameWidth: z.number(),\n frameHeight: z.number(),\n detections: z.array(TrackedDetectionSchema).readonly(),\n }),\n },\n /** Track entered active state (first-seen). */\n onTrackStarted: {\n data: z.object({\n deviceId: z.number(),\n trackId: z.string(),\n className: z.string(),\n }),\n },\n /** Track expired (TTL reached after last detection). */\n onTrackEnded: {\n data: z.object({\n deviceId: z.number(),\n trackId: z.string(),\n className: z.string(),\n durationMs: z.number(),\n }),\n },\n /** Canonical \"something happened at device X\" event, per-kind. */\n onDetectionEvent: {\n data: z.object({\n deviceId: z.number(),\n kind: EventKindSchema,\n eventId: z.string(),\n timestamp: z.number(),\n }),\n },\n },\n} as const satisfies CapabilityDefinition\n\nexport type IPipelineAnalyticsProvider = InferProvider<typeof pipelineAnalyticsCapability>\n\nexport {\n TrackStateSchema,\n EventKindSchema,\n TrackSchema,\n MotionEventSchema,\n ObjectEventSchema,\n AudioEventSchema,\n MediaFileSchema,\n TrackedDetectionSchema,\n}\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n// ── Snapshot schemas ────────────────────────────────────────────────\n\nconst CpuBreakdownSchema = z.object({\n total: z.number(),\n user: z.number(),\n system: z.number(),\n irq: z.number(),\n nice: z.number(),\n loadAvg: z.tuple([z.number(), z.number(), z.number()]),\n cores: z.number(),\n})\n\nconst MemoryInfoSchema = z.object({\n percent: z.number(),\n totalBytes: z.number(),\n usedBytes: z.number(),\n availableBytes: z.number(),\n swapUsedBytes: z.number(),\n swapTotalBytes: z.number(),\n})\n\nconst DiskIoSnapshotSchema = z.object({\n readBytes: z.number(),\n writeBytes: z.number(),\n readOps: z.number(),\n writeOps: z.number(),\n timestampMs: z.number(),\n})\n\nconst NetworkIoSnapshotSchema = z.object({\n rxBytes: z.number(),\n txBytes: z.number(),\n rxPackets: z.number(),\n txPackets: z.number(),\n rxErrors: z.number(),\n txErrors: z.number(),\n timestampMs: z.number(),\n})\n\nconst MetricsGpuInfoSchema = z.object({\n utilization: z.number(),\n model: z.string(),\n memoryUsedBytes: z.number(),\n memoryTotalBytes: z.number(),\n temperature: z.number().nullable(),\n})\n\nconst ProcessResourceInfoSchema = z.object({\n openFds: z.number(),\n threadCount: z.number(),\n activeHandles: z.number(),\n activeRequests: z.number(),\n})\n\nconst PressureAvgsSchema = z.object({\n avg10: z.number(),\n avg60: z.number(),\n avg300: z.number(),\n})\n\nconst PressureInfoSchema = z.object({\n some: PressureAvgsSchema,\n full: PressureAvgsSchema.nullable(),\n})\n\nconst SystemResourceSnapshotSchema = z.object({\n cpu: CpuBreakdownSchema,\n memory: MemoryInfoSchema,\n gpu: MetricsGpuInfoSchema.nullable(),\n network: NetworkIoSnapshotSchema,\n disk: DiskIoSnapshotSchema,\n pressure: z.object({\n cpu: PressureInfoSchema.nullable(),\n memory: PressureInfoSchema.nullable(),\n io: PressureInfoSchema.nullable(),\n }),\n process: ProcessResourceInfoSchema,\n cpuTemperature: z.number().nullable(),\n timestampMs: z.number(),\n})\n\nconst DiskSpaceInfoSchema = z.object({\n path: z.string(),\n totalBytes: z.number(),\n usedBytes: z.number(),\n availableBytes: z.number(),\n percent: z.number(),\n})\n\nconst PidResourceStatsSchema = z.object({\n pid: z.number(),\n cpu: z.number(),\n memory: z.number(),\n})\n\nconst AddonInstanceSchema = z.object({\n addonId: z.string(),\n nodeId: z.string(),\n role: z.enum(['hub', 'worker']),\n pid: z.number(),\n state: z.enum(['starting', 'running', 'stopping', 'stopped', 'crashed']),\n uptimeSec: z.number(),\n})\n\n// ── Process tree snapshot (ghost / zombie surfacing) ────────────────\n//\n// Each entry describes one OS process on the node that looks camstack-\n// related. Classification is ancestry-driven: walk pid→ppid until we\n// hit a known supervisor boundary OR ppid=1.\n//\n// root — the current node's own pid (process.pid)\n// managed — forked addon worker registered in `$process.list`\n// system — ancestry walk crosses a known supervisor boundary\n// (tsx watch launcher, agent CLI, concurrently, vite,\n// npm wrapper). Belongs to the intentional dev tree even\n// when not in $process.list. NEVER killable.\n// ghost — ancestry reaches ppid=1 (or parent invisible in `ps`)\n// without crossing a supervisor boundary. The ONLY\n// classification eligible for kill from the UI.\nconst NodeProcessSchema = z.object({\n pid: z.number(),\n ppid: z.number(),\n pgid: z.number(),\n classification: z.enum(['root', 'managed', 'system', 'ghost']),\n /** `$process` addon binding when `managed`, else null. */\n addonId: z.string().nullable(),\n /** Kernel-reported nodeId when the process is a known agent/worker. */\n nodeId: z.string().nullable(),\n /** Truncated command line. */\n command: z.string(),\n cpuPercent: z.number(),\n memoryRssBytes: z.number(),\n /** Wall-clock uptime (seconds). Parsed from `ps etime`. */\n uptimeSec: z.number(),\n /** True when ancestor walk reaches `ppid=1` (reparented to init/launchd). */\n orphaned: z.boolean(),\n})\n\nconst KillProcessInputSchema = z.object({\n pid: z.number(),\n /** Force = SIGKILL. Default is SIGTERM. */\n force: z.boolean().optional(),\n})\n\nconst KillProcessResultSchema = z.object({\n success: z.boolean(),\n reason: z.string().optional(),\n signal: z.enum(['SIGTERM', 'SIGKILL']).optional(),\n})\n\n// Public SystemMetrics summary — light-weight cached view used by UI widgets.\nconst SystemMetricsSchema = z.object({\n cpuPercent: z.number(),\n memoryPercent: z.number(),\n memoryUsedMB: z.number(),\n memoryTotalMB: z.number(),\n diskPercent: z.number().optional(),\n temperature: z.number().optional(),\n gpuPercent: z.number().optional(),\n gpuMemoryPercent: z.number().optional(),\n})\n\n// ── Capability definition ───────────────────────────────────────────\n\nexport const metricsProviderCapability = {\n name: 'metrics-provider',\n scope: 'system',\n mode: 'singleton',\n methods: {\n /** Fresh, full system snapshot (triggers OS-level collection). */\n collectSnapshot: method(z.void(), SystemResourceSnapshotSchema),\n /** Most recent cached snapshot from the background sampler, or null pre-first-sample. */\n getCached: method(z.void(), SystemResourceSnapshotSchema.nullable()),\n /** Light-weight cached summary for heartbeats and list views. */\n getCurrent: method(z.void(), SystemMetricsSchema),\n /** Disk space for the given mount/path. */\n getDiskSpace: method(z.object({ dirPath: z.string() }), DiskSpaceInfoSchema),\n /** GPU info (null if unavailable). */\n getGpuInfo: method(z.void(), MetricsGpuInfoSchema.nullable()),\n /** CPU temperature in °C (null if unavailable). */\n getCpuTemperature: method(z.void(), z.number().nullable()),\n /** Per-PID resource stats. Missing/dead PIDs are omitted from the result. */\n getProcessStats: method(\n z.object({ pids: z.array(z.number()) }),\n z.array(PidResourceStatsSchema),\n ),\n /**\n * List addon instances known to this node — one entry per forked worker\n * plus a synthetic 'hub' entry representing the local hub process.\n * Used by benchmarks/observability to detect whether a given addon runs\n * in its own process (measurable independently) or inline with the hub.\n */\n listAddonInstances: method(z.void(), z.array(AddonInstanceSchema).readonly()),\n /**\n * Resource stats for the process hosting the given addon.\n * Returns null when the addon runs in-process on the hub (can't measure\n * independently — caller should detect via listAddonInstances). Returns\n * hub process stats for addonId '$hub'.\n */\n getAddonStats: method(z.object({ addonId: z.string() }), PidResourceStatsSchema.nullable()),\n /**\n * Snapshot of every camstack-related process on this node with a\n * ghost/managed/root classification. Powers the Cluster → Agent →\n * Processes tab: cross-references `$process.list` against a `ps` scan\n * so orphaned trees (PPID=1) or unknown children show up as `ghost`\n * and can be killed from the UI.\n */\n listNodeProcesses: method(z.void(), z.array(NodeProcessSchema).readonly()),\n /**\n * Send SIGTERM (or SIGKILL when `force`) to a pid inside this node's\n * process tree. The provider refuses pids that aren't in the live\n * `listNodeProcesses()` snapshot — callers can't use this endpoint\n * to kill arbitrary system processes.\n */\n killProcess: method(\n KillProcessInputSchema,\n KillProcessResultSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IMetricsProvider = InferProvider<typeof metricsProviderCapability>\n\nexport {\n SystemMetricsSchema,\n SystemResourceSnapshotSchema,\n DiskSpaceInfoSchema,\n MetricsGpuInfoSchema,\n PidResourceStatsSchema,\n AddonInstanceSchema,\n NodeProcessSchema,\n KillProcessInputSchema,\n KillProcessResultSchema,\n CpuBreakdownSchema,\n MemoryInfoSchema,\n DiskIoSnapshotSchema,\n NetworkIoSnapshotSchema,\n ProcessResourceInfoSchema,\n PressureInfoSchema,\n}\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\nconst PtzPresetSchema = z.object({ id: z.string(), name: z.string() })\nconst PtzPositionSchema = z.object({ pan: z.number(), tilt: z.number(), zoom: z.number() })\nconst PtzMoveCommandSchema = z.object({\n pan: z.number().optional(),\n tilt: z.number().optional(),\n zoom: z.number().optional(),\n speed: z.number().optional(),\n})\n\nexport const ptzCapability = {\n name: 'ptz',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera],\n methods: {\n move: method(\n PtzMoveCommandSchema.extend({ deviceId: z.number() }),\n z.void(),\n { kind: 'mutation' },\n ),\n continuousMove: method(\n PtzMoveCommandSchema.extend({ deviceId: z.number() }),\n z.void(),\n { kind: 'mutation' },\n ),\n stop: method(\n z.object({ deviceId: z.number() }),\n z.void(),\n { kind: 'mutation' },\n ),\n getPresets: method(\n z.object({ deviceId: z.number() }),\n z.array(PtzPresetSchema),\n ),\n goToPreset: method(\n z.object({ deviceId: z.number(), presetId: z.string() }),\n z.void(),\n { kind: 'mutation' },\n ),\n goHome: method(\n z.object({ deviceId: z.number() }),\n z.void(),\n { kind: 'mutation' },\n ),\n /**\n * Pull the current PTZ position. Redundant with the auto-injected\n * `getStatus` method (see `status` below); kept for callers that\n * haven't migrated. Will be folded into `getStatus` in a future\n * cleanup pass once all consumers use the typed status surface.\n */\n getPosition: method(\n z.object({ deviceId: z.number() }),\n PtzPositionSchema,\n ),\n },\n status: {\n schema: PtzPositionSchema,\n kind: 'command-driven',\n },\n} as const satisfies CapabilityDefinition\n\nexport type IPtzProvider = InferProvider<typeof ptzCapability>\nexport { PtzPresetSchema, PtzPositionSchema, PtzMoveCommandSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\nconst EventItemSchema = z.object({\n id: z.string(),\n type: z.string(),\n timestamp: z.number(), // unix ms\n label: z.string().optional(),\n thumbnailUrl: z.string().optional(),\n clipUrl: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const eventsCapability = {\n name: 'events',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera],\n methods: {\n getEvents: method(\n z.object({\n deviceId: z.number(),\n from: z.number().optional(),\n to: z.number().optional(),\n limit: z.number().optional(),\n }),\n z.array(EventItemSchema),\n ),\n getEventThumbnail: method(\n z.object({ deviceId: z.number(), eventId: z.string() }),\n z.object({ base64: z.string(), contentType: z.string() }).nullable(),\n ),\n getEventClipUrl: method(\n z.object({ deviceId: z.number(), eventId: z.string() }),\n z.string().nullable(),\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IEventsProvider = InferProvider<typeof eventsCapability>\nexport { EventItemSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\nconst SegmentSchema = z.object({\n id: z.string(),\n startTs: z.number(), // unix ms\n endTs: z.number(),\n durationSec: z.number(),\n sizeBytes: z.number().optional(),\n})\n\nexport const recordingCapability = {\n name: 'recording',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera],\n methods: {\n getSegments: method(\n z.object({\n deviceId: z.number(),\n from: z.number().optional(),\n to: z.number().optional(),\n }),\n z.array(SegmentSchema),\n ),\n getPlaybackUrl: method(\n z.object({ deviceId: z.number(), segmentId: z.string() }),\n z.string().nullable(),\n ),\n getThumbnailAt: method(\n z.object({ deviceId: z.number(), timestamp: z.number() }),\n z.object({ base64: z.string(), contentType: z.string() }).nullable(),\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IRecordingProvider = InferProvider<typeof recordingCapability>\nexport { SegmentSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n/**\n * device-ops — device-scoped cap that unifies the per-IDevice operations\n * previously routed through the `.device-ops` Moleculer bridge service.\n *\n * Each worker that hosts live `IDevice` instances auto-registers a native\n * provider for this cap (per device) backed by its local\n * `DeviceRegistry`. Hub-side callers reach it transparently through\n * `ctx.fetchDevice(id).deviceOps.*` — the DeviceProxy injects\n * `deviceId` + `nodeId` and dispatches through the standard cap-router,\n * so there's no parallel bridge path anymore.\n *\n * The surface is intentionally small — every method corresponds to a\n * single action on the live `IDevice` (or `ICameraDevice` for\n * `getStreamSources`). Richer orchestration (enable/disable with\n * integration plumbing, bulk updates) stays in the `device-manager` cap;\n * `device-ops` is the per-device primitive the device-manager routes to.\n */\nconst StreamSourceEntrySchema = z.object({\n id: z.string(),\n label: z.string(),\n protocol: z.enum(['rtsp', 'rtmp', 'annexb', 'http-mjpeg', 'webrtc', 'custom']),\n url: z.string().optional(),\n resolution: z.object({ width: z.number(), height: z.number() }).optional(),\n fps: z.number().optional(),\n bitrate: z.number().optional(),\n codec: z.string().optional(),\n profileHint: z.enum(['high', 'mid', 'low']).optional(),\n sdp: z.string().optional(),\n})\n\nconst ConfigEntrySchema = z.object({\n key: z.string(),\n value: z.unknown(),\n})\n\nexport const deviceOpsCapability = {\n name: 'device-ops',\n scope: 'device',\n mode: 'singleton',\n methods: {\n /**\n * Return stream sources for camera-like devices. Non-camera devices\n * return an empty array (the bridge did the same; preserved for compat).\n */\n getStreamSources: method(\n z.object({ deviceId: z.number() }),\n z.array(StreamSourceEntrySchema),\n ),\n\n /**\n * Return the device's config entries (key + current value). Used by\n * the device-manager aggregator when reading the driver's schema+values.\n */\n getConfigEntries: method(\n z.object({ deviceId: z.number() }),\n z.array(ConfigEntrySchema),\n ),\n\n /**\n * Bulk-apply a config patch via `IDevice.config.setAll`. Covers the\n * updateConfig / setStreamProfileMap / enable-as-config paths from\n * the old bridge.\n */\n setConfig: method(\n z.object({\n deviceId: z.number(),\n values: z.record(z.string(), z.unknown()),\n }),\n z.void(),\n { kind: 'mutation' },\n ),\n\n /**\n * Invoke `IDevice.removeDevice()` so the driver can release resources\n * (close sockets, stop background tasks, …). The device-manager still\n * performs its own persistence cleanup before/after this call.\n */\n removeDevice: method(\n z.object({ deviceId: z.number() }),\n z.void(),\n { kind: 'mutation' },\n ),\n\n /**\n * Build the ConfigUISchema (FormBuilder input shape) from the device's\n * Zod config schema. Runs on the worker that owns the IDevice so the\n * Zod types stay local (they're function references, not\n * serializable). Returns a fully JSON-serializable schema with\n * sections/fields the admin UI renders directly.\n *\n * Needed because the hub-side `device-manager.getSettingsSchema`\n * couldn't reach forked-worker devices — it had no registry entry\n * and no cross-process lookup, so the UI silently rendered an empty\n * settings panel for every worker-owned device.\n *\n * Returns `null` when the device isn't found on this worker.\n */\n getSettingsSchema: method(\n z.object({ deviceId: z.number() }),\n z.unknown().nullable(),\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IDeviceOpsProvider = InferProvider<typeof deviceOpsCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\n/**\n * camera-credentials — device-scoped cap exposing the camera's network\n * + auth surface in a vendor-neutral shape.\n *\n * Why it exists: cross-vendor wrappers (the planned ONVIF generic addon\n * for PTZ / intercom / events; future homekit / mqtt bridges) need the\n * camera's IP + port + creds without each wrapper re-implementing\n * vendor-specific config-blob extraction. With this cap, every camera\n * provider returns a uniform CameraCredentials and consumers stay\n * vendor-agnostic.\n *\n * Implementations:\n * - Each camera-providing addon registers this cap natively per\n * device (Reolink, Hikvision, RTSP, Frigate, ONVIF self).\n * - Returns a snapshot from the persisted device config blob — no\n * extra round-trip to the camera, no probing.\n * - The cap is admin-only (`auth: 'admin'`) — credentials must not\n * leak through user-scoped paths.\n *\n * Sensitive data handling:\n * - getCredentials returns the full snapshot to admin callers only.\n * - Wrappers are expected to use the value to construct a per-call\n * client and NOT to log / event-bus-emit the password field.\n * - The cap status payload (mirrored to runtime-state) carries\n * non-sensitive metadata only — host + ports + protocol hints. The\n * password / username live on `getCredentials` exclusively.\n *\n * See `docs/onvif-generic-addon-plan.md` for the consuming wrapper\n * design.\n */\n\nexport const CameraCredentialsSchema = z.object({\n /** Camera IP or hostname (no scheme). */\n host: z.string(),\n /** Primary protocol port (varies per vendor: Baichuan 9000, ISAPI 80/443, RTSP 554). */\n port: z.number().int().positive().optional(),\n /** ONVIF service port if known by the provider. */\n onvifPort: z.number().int().positive().optional(),\n /** RTSP service port if known. */\n rtspPort: z.number().int().positive().optional(),\n /** HTTP(S) flag for the primary protocol port. */\n https: z.boolean().optional(),\n /** Login username. */\n username: z.string().optional(),\n /** Login password. CONSUMERS MUST NOT log or event-bus this value. */\n password: z.string().optional(),\n /** ONVIF profile hint advertised by the camera (`T`, `Q`, `G`, `S`). */\n onvifProfile: z.string().optional(),\n})\n\nexport type CameraCredentials = z.infer<typeof CameraCredentialsSchema>\n\n/**\n * Non-sensitive camera-credentials status — host + ports + protocol\n * hints only. Mirrors what shows up in the bindings UI / device\n * aggregate. The full credentials (with password) are exposed only via\n * `getCredentials` to admin callers.\n */\nexport const CameraCredentialsStatusSchema = z.object({\n host: z.string(),\n port: z.number().int().positive().nullable(),\n onvifPort: z.number().int().positive().nullable(),\n rtspPort: z.number().int().positive().nullable(),\n https: z.boolean().nullable(),\n hasUsername: z.boolean(),\n hasPassword: z.boolean(),\n onvifProfile: z.string().nullable(),\n})\n\nexport type CameraCredentialsStatus = z.infer<typeof CameraCredentialsStatusSchema>\n\nexport const cameraCredentialsCapability = {\n name: 'camera-credentials',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera],\n methods: {\n /**\n * Return the camera's full credential bundle for admin consumers.\n * Each provider implementation returns a snapshot of its persisted\n * config — no I/O to the camera. Returns null when the device is\n * not owned by this addon (deviceId mismatch).\n */\n getCredentials: method(\n z.object({ deviceId: z.number() }),\n CameraCredentialsSchema.nullable(),\n { kind: 'query', auth: 'admin' },\n ),\n },\n status: {\n schema: CameraCredentialsStatusSchema,\n kind: 'command-driven',\n },\n} as const satisfies CapabilityDefinition\n\nexport type ICameraCredentialsProvider = InferProvider<typeof cameraCredentialsCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\n/**\n * reboot — device-scoped capability for \"soft\" device reboots (firmware\n * reboot via vendor protocol; cameras, NVRs, doorbells). Surfaces a\n * single mutation so the UI can offer a confirm-and-reboot button for\n * any device whose driver advertises `DeviceFeature.Rebootable`.\n *\n * Implementation contract: the driver SHOULD return only after the\n * remote acknowledges the request (camera will go offline shortly\n * after). Wrappers in the addon should NOT block on the device coming\n * back online — operators read the device-online indicator for that.\n *\n * Errors propagate verbatim: a 401 from the camera surfaces as a tRPC\n * error to the UI, which renders it next to the button.\n */\nexport const rebootCapability = {\n name: 'reboot',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera, DeviceType.Sensor, DeviceType.Switch],\n methods: {\n reboot: method(\n z.object({ deviceId: z.number().int().nonnegative() }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IRebootProvider = InferProvider<typeof rebootCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\n/**\n * Generic on-screen-display (video overlay) cap. Each camera exposes\n * a firmware-defined list of overlays (channel name, timestamp,\n * watermark, logo, …); the cap models them as a homogeneous array of\n * descriptors so the admin UI can render them with zero per-firmware\n * code.\n */\n\nexport const OsdOverlayKindEnum = z.enum(['text', 'timestamp', 'watermark'])\nexport type OsdOverlayKind = z.infer<typeof OsdOverlayKindEnum>\n\nexport const OsdPositionEnum = z.enum([\n 'top-left', 'top-center', 'top-right',\n 'bottom-left', 'bottom-center', 'bottom-right',\n 'custom',\n])\nexport type OsdPosition = z.infer<typeof OsdPositionEnum>\n\nexport const OsdOverlaySchema = z.object({\n /** Stable driver-assigned id. Reolink uses `'channel'`, `'time'`, `'watermark'`. */\n id: z.string(),\n kind: OsdOverlayKindEnum,\n enabled: z.boolean(),\n /** Active text (text/watermark). Undefined for 'timestamp' (firmware-generated). */\n text: z.string().optional(),\n position: OsdPositionEnum.optional(),\n /**\n * Positions the firmware accepts for this specific overlay. Populated\n * by the driver at register time. Empty array → positioning not\n * configurable; the UI hides the position field.\n */\n availablePositions: z.array(OsdPositionEnum).readonly(),\n /** Firmware does not allow editing the `text` field (e.g. timestamp). */\n readOnly: z.boolean().optional(),\n})\n\nexport type OsdOverlay = z.infer<typeof OsdOverlaySchema>\n\nexport const OsdStatusSchema = z.object({\n overlays: z.array(OsdOverlaySchema).readonly(),\n})\n\nexport type OsdStatus = z.infer<typeof OsdStatusSchema>\n\nconst OsdOverlayPatchSchema = z.object({\n enabled: z.boolean().optional(),\n text: z.string().optional(),\n position: OsdPositionEnum.optional(),\n}).partial()\n\nexport const osdCapability = {\n name: 'osd',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera],\n methods: {\n /**\n * Patch a single overlay by id. Provider handles read-modify-write\n * against firmware APIs that require the full object (Reolink\n * `SetOsd`). Omitted patch keys are preserved. Successful\n * completion triggers `onStatusChanged`.\n */\n setOverlay: method(\n z.object({\n deviceId: z.number(),\n overlayId: z.string(),\n patch: OsdOverlayPatchSchema,\n }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n events: {\n onStatusChanged: { data: z.object({\n deviceId: z.number(),\n status: OsdStatusSchema,\n })},\n },\n status: {\n schema: OsdStatusSchema,\n kind: 'command-driven',\n },\n settings: {\n bindings: [{\n kind: 'array',\n statusPath: 'overlays',\n idField: 'id',\n method: 'setOverlay',\n idArg: 'overlayId',\n patchArg: 'patch',\n sectionId: 'osd',\n sectionTitle: 'Video overlays',\n itemFields: {\n enabled: {\n label: (o) => `${String(o.id)} enabled`,\n kind: 'boolean',\n },\n text: {\n label: (o) => `${String(o.id)} text`,\n kind: 'text',\n when: (o) => o.kind !== 'timestamp' && !o.readOnly,\n },\n position: {\n label: (o) => `${String(o.id)} position`,\n kind: 'select',\n options: (o) => (o.availablePositions as readonly string[] | undefined) ?? [],\n when: (o) => Array.isArray(o.availablePositions) && o.availablePositions.length > 0,\n },\n },\n }],\n },\n} as const satisfies CapabilityDefinition\n\nexport type IOsdProvider = InferProvider<typeof osdCapability>\nexport { OsdOverlayPatchSchema }\n","import { z } from 'zod'\nimport { type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\n/**\n * List of accessory children linked to a parent device (camera, hub).\n * Returns only numeric device ids — the rest (role, deviceType, name,\n * caps) is derived by fetching each child via `device-manager.getDevice`.\n *\n * The single-source-of-truth for what an accessory IS remains the child\n * device itself; this cap only surfaces the grouping.\n */\nexport const AccessoriesStatusSchema = z.object({\n childDeviceIds: z.array(z.number()).readonly(),\n})\n\nexport type AccessoriesStatus = z.infer<typeof AccessoriesStatusSchema>\n\nexport const accessoriesCapability = {\n name: 'accessories',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera, DeviceType.Hub],\n methods: {},\n events: {\n /**\n * Emitted when a child device is created, removed, or its parent\n * assignment changes. Payload carries the fresh list.\n */\n onAccessoriesChanged: { data: z.object({\n deviceId: z.number(),\n childDeviceIds: z.array(z.number()).readonly(),\n })},\n },\n status: {\n schema: AccessoriesStatusSchema,\n kind: 'command-driven',\n },\n} as const satisfies CapabilityDefinition\n\nexport type IAccessoriesProvider = InferProvider<typeof accessoriesCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\n/**\n * Two-way audio / talk-back cap. Clients open a WebRTC audio-only\n * session (server-initiated offer pattern, identical to the main\n * video WebRTC flow) and the browser captures the mic; the server\n * receives Opus RTP via werift, decodes through ffmpeg, re-encodes\n * to the firmware's expected codec (Reolink: IMA ADPCM), and pipes\n * it onto the camera's dedicated talk channel.\n *\n * All audio transcoding happens server-side — clients don't need to\n * know the camera's wire format. The `ability` cached in `status`\n * exposes the firmware's codec/sampleRate only for display/debug;\n * the client never has to act on those values.\n */\nexport const IntercomAbilitySchema = z.object({\n /** Codecs accepted by firmware, in preference order. Driver-authored strings. */\n codecs: z.array(z.string()),\n /** Sample rate (Hz) the firmware expects. Reolink typical: 16000. */\n sampleRate: z.number(),\n duplex: z.enum(['half', 'full']),\n /** Max in-flight audio backlog before drop (ms). Server uses this to bound latency. */\n maxBacklogMs: z.number(),\n})\n\nexport type IntercomAbility = z.infer<typeof IntercomAbilitySchema>\n\nexport const IntercomStatusSchema = z.object({\n /** True while a talk session is open. */\n talking: z.boolean(),\n /** Ms epoch of the most recent session start. Null if never opened. */\n lastSessionAt: z.number().nullable(),\n /** Firmware ability cached at first session creation. Null until probed. */\n ability: IntercomAbilitySchema.nullable(),\n})\n\nexport type IntercomStatus = z.infer<typeof IntercomStatusSchema>\n\nexport const intercomCapability = {\n name: 'intercom',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera],\n methods: {\n /**\n * Open a server-side WebRTC audio-only session. Returns an SDP\n * offer with a single sendonly audio m-line the client answers\n * (client → server direction). The server wakes battery cams\n * transparently before opening the upstream talk channel.\n */\n startSession: method(\n z.object({ deviceId: z.number() }),\n z.object({ sessionId: z.string(), sdpOffer: z.string() }),\n { kind: 'mutation', auth: 'admin' },\n ),\n handleAnswer: method(\n z.object({\n deviceId: z.number(),\n sessionId: z.string(),\n sdpAnswer: z.string(),\n }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n /** Close explicitly. Server also auto-closes on 30s idle. */\n stopSession: method(\n z.object({ deviceId: z.number(), sessionId: z.string() }),\n z.void(),\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n events: {\n onStatusChanged: { data: z.object({\n deviceId: z.number(),\n status: IntercomStatusSchema,\n })},\n },\n status: {\n schema: IntercomStatusSchema,\n kind: 'command-driven',\n },\n} as const satisfies CapabilityDefinition\n\nexport type IIntercomProvider = InferProvider<typeof intercomCapability>\n","import { z } from 'zod'\nimport { type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { DeviceType } from '../device/device-type.js'\n\n/**\n * On-camera AI object detection cap. Surfaces per-device the classes\n * the firmware can detect and the last-seen instance of each. The\n * provider also fan-outs these to the global `detection.camera-native`\n * event bus with `source: 'onboard'` so cross-cutting system services\n * (alert-center, advanced-notifier, recording-engine) can subscribe\n * once and receive events from every camera.\n *\n * Distinct from `motion-detection` (ML pipeline) and `motion` (hardware\n * PIR or firmware motion pulse): this cap is specifically the AI\n * classifier output coming FROM the camera, not the local pipeline.\n */\nexport const NativeObjectClassEnum = z.enum([\n 'person', 'vehicle', 'animal', 'face', 'package', 'other',\n])\n\nexport type NativeObjectClass = z.infer<typeof NativeObjectClassEnum>\n\nexport const NativeDetectionSchema = z.object({\n class: NativeObjectClassEnum,\n timestamp: z.number(),\n /** Firmware-provided confidence [0..1]. Reolink pushes don't carry it → undefined. */\n confidence: z.number().min(0).max(1).optional(),\n})\n\nexport type NativeDetection = z.infer<typeof NativeDetectionSchema>\n\nexport const NativeObjectDetectionStatusSchema = z.object({\n /**\n * Last observed instance per class. Undefined entries mean the class\n * is supported but nothing has been seen since the provider started.\n */\n lastByClass: z.record(NativeObjectClassEnum, NativeDetectionSchema.nullable()),\n /** Classes the firmware is capable of detecting — enumerated at device register. */\n supportedClasses: z.array(NativeObjectClassEnum).readonly(),\n})\n\nexport type NativeObjectDetectionStatus = z.infer<typeof NativeObjectDetectionStatusSchema>\n\nexport const nativeObjectDetectionCapability = {\n name: 'native-object-detection',\n scope: 'device',\n mode: 'singleton',\n deviceTypes: [DeviceType.Camera],\n methods: {},\n events: {\n onDetected: { data: z.object({\n deviceId: z.number(),\n detection: NativeDetectionSchema,\n })},\n },\n status: {\n schema: NativeObjectDetectionStatusSchema,\n kind: 'push',\n },\n} as const satisfies CapabilityDefinition\n\nexport type INativeObjectDetectionProvider = InferProvider<typeof nativeObjectDetectionCapability>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\nimport { MODEL_FORMATS } from '../types/models.js'\n\nconst ModelFormatSchema = z.enum(MODEL_FORMATS)\n\nconst HwAccelBackendInputSchema = z.enum([\n 'videotoolbox', 'cuda', 'nvdec', 'vaapi', 'qsv',\n 'd3d11va', 'dxva2', 'amf', 'vdpau', 'drm',\n 'coreml', 'tensorrt', 'openvino', 'directml', 'webgpu',\n 'none',\n]).nullable().optional()\n\nconst HwAccelResolutionSchema = z.object({\n preferred: z.array(z.string()).readonly(),\n})\n\n/**\n * platform-probe — per-node singleton capability.\n *\n * Scope: each node (hub, agent, future workers) runs its own probe and\n * registers its own provider via this cap. Inference addons consume the\n * provider local to their node via `ctx.api.platformProbe.*`; the\n * localProviderLink routes the call to the co-located implementation.\n *\n * Implementation: `@camstack/core/dist/builtins/platform-probe/` —\n * promoted to a core builtin in Phase B of the bundles refactor.\n * Every node loads `@camstack/core` so the addon is available without a\n * separate REQUIRED_PACKAGES / AGENT_PACKAGES entry. Replaces the former\n * standalone `@camstack/addon-platform-probe-native` package.\n */\n\nconst HardwarePlatformSchema = z.enum(['darwin', 'linux', 'win32'])\nconst HardwareArchSchema = z.enum(['arm64', 'x64'])\n\nconst GpuInfoSchema = z.object({\n type: z.enum(['nvidia', 'amd', 'intel', 'apple']),\n name: z.string(),\n memoryMB: z.number().optional(),\n})\n\nconst NpuInfoSchema = z.object({\n type: z.enum(['apple-ane', 'intel-npu']),\n})\n\nconst HardwareInfoSchema = z.object({\n platform: HardwarePlatformSchema,\n arch: HardwareArchSchema,\n cpuModel: z.string(),\n cpuCores: z.number(),\n totalRAM_MB: z.number(),\n availableRAM_MB: z.number(),\n gpu: GpuInfoSchema.nullable(),\n npu: NpuInfoSchema.nullable(),\n})\n\nconst PlatformScoreSchema = z.object({\n runtime: z.enum(['node', 'python']),\n backend: z.string(),\n format: z.enum(['onnx', 'coreml', 'openvino']),\n score: z.number(),\n reason: z.string(),\n available: z.boolean(),\n})\n\nconst PlatformCapabilitiesSchema = z.object({\n hardware: HardwareInfoSchema,\n scores: z.array(PlatformScoreSchema).readonly(),\n bestScore: PlatformScoreSchema,\n pythonPath: z.string().nullable(),\n})\n\nconst ModelRequirementSchema = z.object({\n modelId: z.string(),\n name: z.string(),\n minRAM_MB: z.number(),\n accuracyScore: z.number(),\n formats: z.array(z.string()).readonly(),\n})\n\nconst ResolvedInferenceConfigSchema = z.object({\n modelId: z.string(),\n runtime: z.enum(['node', 'python']),\n backend: z.string(),\n format: ModelFormatSchema,\n reason: z.string(),\n})\n\nexport const platformProbeCapability = {\n name: 'platform-probe',\n scope: 'system',\n mode: 'singleton',\n methods: {\n /** Return cached hardware + scored backends for this node. */\n getCapabilities: method(\n z.void(),\n PlatformCapabilitiesSchema,\n ),\n /** Convenience getter — hardware only. */\n getHardware: method(\n z.void(),\n HardwareInfoSchema,\n ),\n /**\n * Resolve the best (model, runtime, backend, format) for a given list\n * of requirements, using this node's scored backends as the candidate\n * pool. Always returns a config — falls back to CPU when no preferred\n * backend matches.\n */\n resolveInferenceConfig: method(\n z.object({\n requirements: z.array(ModelRequirementSchema).readonly(),\n }),\n ResolvedInferenceConfigSchema,\n ),\n /**\n * Resolve the ordered HW acceleration backend list for this node.\n * Pass `prefer` to hint a specific backend; pass `null` or omit\n * for auto-detection. Replaces the legacy `$hwaccel.resolve`\n * Moleculer action — cap routing handles per-node dispatch via\n * `nodeId`.\n */\n resolveHwAccel: method(\n z.object({\n prefer: HwAccelBackendInputSchema,\n nodeId: z.string().optional(),\n }),\n HwAccelResolutionSchema,\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IPlatformProbeProvider = InferProvider<typeof platformProbeCapability>\n","/**\n * local-network — hub-only singleton.\n *\n * Enumerates the host's network interfaces and ranks them so that:\n *\n * • Addons that need a \"where do we listen / point a tunnel at\" answer\n * (cloudflare-tunnel, ngrok, RTSP restream, cluster join URL, TLS\n * cert SAN) consume `getPreferred()` instead of hard-coding\n * `localhost`. Critical for docker-sidecar setups where the addon\n * process needs the container's eth0 (not 127.0.0.1).\n *\n * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`\n * to receive an ordered list of candidate base URLs it should race\n * on connect — LAN IPv4 first (lowest latency when on same network),\n * then public hostname (if a tunnel is up), then IPv6. The SDK can\n * race them with short timeouts and stick with the winner for the\n * session.\n *\n * Why hub-only: agents are not directly addressable by the operator's\n * clients — they reverse-connect to the hub. Exposing their interfaces\n * via the same surface would leak internal topology with no upside.\n *\n * Implementation in `@camstack/core/builtins/local-network/`.\n */\nimport { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n/** Coarse classification derived from the interface name + IP range. */\nconst InterfaceKindEnum = z.enum([\n 'lan', // wired ethernet (en0, eth0, ...)\n 'wifi', // wireless (en1, wlan*, ...)\n 'docker', // docker0 / br-* / veth*\n 'vpn', // tun*, utun*, wg*, tap*\n 'loopback', // lo, lo0\n 'other', // anything we can't classify confidently\n])\n\nconst LocalInterfaceSchema = z.object({\n /** Interface name as reported by the OS (e.g. `en0`, `eth0`, `lo0`). */\n name: z.string(),\n family: z.enum(['IPv4', 'IPv6']),\n address: z.string(),\n /** CIDR shorthand (e.g. `192.168.1.10/24`). Empty when OS doesn't expose. */\n cidr: z.string(),\n /** OS netmask. Stable across calls so the SDK can hash on it. */\n netmask: z.string(),\n /** True for `127.0.0.1`/`::1`. Returned for completeness but never preferred. */\n internal: z.boolean(),\n /** Hardware MAC (empty for loopback / virtual interfaces). */\n mac: z.string(),\n /** Derived classification — see `InterfaceKindEnum`. */\n kind: InterfaceKindEnum,\n /**\n * `true` for the auto-selected outbound interface. Exactly zero or\n * one entry has this set per call; the SDK picks this one for the\n * first connection attempt.\n */\n preferred: z.boolean(),\n /**\n * Heuristic flag: `true` when the address looks usable for clients\n * (RFC 1918 / public IPv4, IPv6 ULA / GUA), `false` for link-local\n * / loopback / multicast / docker / vpn / unknown ranges. Same\n * heuristic that drives `autoSeedAllowlist`.\n */\n plausible: z.boolean(),\n /**\n * Human-readable rationale for non-plausible entries (e.g. \"IPv6\n * link-local — only reachable on the same link\"). Empty string for\n * plausible entries. The UI surfaces this verbatim as the tooltip\n * on the \"Unlikely usable\" badge so the backend stays the single\n * source of truth — front-end consumers don't re-derive the reason.\n */\n plausibleReason: z.string(),\n})\n\nconst ListResultSchema = z.object({\n interfaces: z.array(LocalInterfaceSchema).readonly(),\n /** Wall-clock timestamp at which the snapshot was probed. */\n probedAt: z.number(),\n})\n\nconst PreferredSchema = LocalInterfaceSchema.nullable()\n\n/**\n * Candidate base URL for the SDK to race on connect. Order matters —\n * the SDK should attempt these top-to-bottom with a short per-candidate\n * timeout (e.g. 1500ms) and cache the winner for the session.\n */\nconst ConnectionEndpointSchema = z.object({\n /** Operator-facing label (e.g. \"LAN — en0\", \"Public tunnel\"). */\n label: z.string(),\n /** Fully-formed base URL with scheme + host + port. */\n baseUrl: z.string(),\n /** Network-level hint for the SDK — picks a small icon, sorts within\n * a tier. Coarse categorisation (LAN vs public vs loopback). */\n kind: z.enum([\n 'lan-ipv4', // private RFC1918 / link-local IPv4\n 'lan-ipv6', // private IPv6\n 'public', // tunnel / external FQDN\n 'loopback', // 127.0.0.1 — last-resort fallback\n ]),\n /**\n * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/\n * `loopback`/`public`. Lets the UI render an accurate badge (e.g. a\n * VPN address gets a \"VPN\" tag instead of being lumped under\n * \"lan-ipv4\"). `'public'` for the tunnel hostname.\n */\n interfaceKind: z.enum(['lan', 'wifi', 'docker', 'vpn', 'other', 'loopback', 'public']),\n /**\n * Mirrors `LocalInterface.plausible` — false for endpoints derived\n * from non-plausible interfaces (VPN, docker, link-local, …). The\n * UI uses it to mark \"Unlikely usable\" without re-deriving from\n * the address shape.\n */\n plausible: z.boolean(),\n /** Same as `LocalInterface.plausibleReason` — empty when plausible. */\n plausibleReason: z.string(),\n /**\n * Suggested priority for racing — lower = try first. Stable across\n * calls so the client can sort even if the cap returns a new\n * ordering between polls.\n */\n priority: z.number(),\n})\n\nconst GetConnectionEndpointsResultSchema = z.object({\n endpoints: z.array(ConnectionEndpointSchema).readonly(),\n})\n\nconst AllowedAddressesSchema = z.object({\n /**\n * Allowlist of interface addresses operators have explicitly opted\n * into for the connection-endpoint race. Empty array = \"auto\" — every\n * non-loopback / non-link-local interface participates. Set by the\n * Network Addresses admin page and persisted by the addon.\n */\n addresses: z.array(z.string()).readonly(),\n})\n\nexport const localNetworkCapability = {\n name: 'local-network',\n scope: 'system',\n mode: 'singleton',\n methods: {\n /** Return the current interface snapshot. */\n list: method(z.void(), ListResultSchema),\n\n /**\n * Auto-selected outbound interface. Heuristic:\n * 1. Skip internal / link-local / 169.254.*.\n * 2. Prefer LAN/wifi (real Ethernet) over docker/vpn.\n * 3. IPv4 wins over IPv6 (compat with legacy consumers).\n * 4. Tie-break on lowest CIDR mask (most-specific subnet).\n * Returns `null` only when the host has zero non-loopback addresses.\n * Honours `getAllowedAddresses()` — if the operator pinned an\n * allowlist, only those addresses are candidates.\n */\n getPreferred: method(z.void(), PreferredSchema),\n\n /**\n * Ordered candidate base URLs the SDK should try on connect.\n * Includes LAN IPs (one per non-internal interface), the public\n * tunnel hostname (when active), and loopback as a last-resort\n * fallback. Filterable by `includeLoopback` / `ipv4Only`.\n * Honours `getAllowedAddresses()` when set — addresses outside\n * the allowlist are dropped (the public tunnel + loopback are\n * always included as escape hatches).\n */\n getConnectionEndpoints: method(\n z.object({\n /** Local hub HTTP port to use in base URLs. */\n port: z.number().int().min(1).max(65535),\n /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority\n * candidate. Default `true`. */\n includeLoopback: z.boolean().optional(),\n /** Skip IPv6 entries. Some legacy clients can't parse them.\n * Default `false`. */\n ipv4Only: z.boolean().optional(),\n /** Scheme to emit for LAN/loopback URLs. Default `'http'`.\n * Pass `'https'` when the caller is itself loaded over HTTPS\n * to avoid mixed-content blocks in the browser. The public\n * tunnel always emits `https://` regardless. */\n scheme: z.enum(['http', 'https']).optional(),\n }),\n GetConnectionEndpointsResultSchema,\n ),\n\n /**\n * Read the operator's allowlist. Empty = \"auto\" (no filter). Used\n * by the admin UI's address selector to seed its checkbox state.\n */\n getAllowedAddresses: method(z.void(), AllowedAddressesSchema),\n\n /**\n * Replace the allowlist atomically. Persisted via the addon store\n * (kernel-managed) so it survives restarts. Pass `[]` to revert to\n * auto mode.\n */\n setAllowedAddresses: method(\n AllowedAddressesSchema,\n z.object({ success: z.literal(true) }),\n { kind: 'mutation' },\n ),\n\n /**\n * Re-run the boot heuristic over the current interface snapshot\n * and atomically replace the allowlist with the result. Useful\n * after a major network change (new dock, new VPN, IP rebound)\n * when the operator wants to wipe their manual edits and start\n * over from the auto-detected best matches.\n */\n resetAllowlistToBestMatch: method(\n z.void(),\n AllowedAddressesSchema,\n { kind: 'mutation' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type ILocalNetworkProvider = InferProvider<typeof localNetworkCapability>\nexport type LocalInterface = z.infer<typeof LocalInterfaceSchema>\nexport type ConnectionEndpoint = z.infer<typeof ConnectionEndpointSchema>\n","/**\n * mesh-network — collection cap for mesh-VPN providers.\n *\n * Different shape from `network-access` (public tunnels):\n *\n * • `network-access` exposes ONE public URL the operator hands to\n * external clients. start/stop spawns a single edge process.\n *\n * • `mesh-network` joins the host into a private mesh (Tailscale,\n * Headscale, ZeroTier). The result is one or more *private*\n * endpoints (mesh IP `100.x.x.x`, MagicDNS hostname) reachable\n * only by peers on the same mesh. Optionally, providers that\n * support it (Tailscale Funnel / Serve) also expose a public\n * ingress for select ports.\n *\n * Singleton facade lives in `mesh-orchestrator.cap.ts`.\n */\nimport { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n/**\n * A reachable endpoint on the mesh. A single provider may expose\n * multiple (mesh IP + MagicDNS hostname + Funnel public URL).\n */\nconst MeshEndpointSchema = z.object({\n /** Stable identifier within the provider (e.g. `mesh-ipv4`, `magicdns`, `funnel`). */\n id: z.string(),\n /** Operator-facing label (e.g. \"Mesh IPv4\", \"MagicDNS\"). */\n label: z.string(),\n /**\n * Where the endpoint is reachable from:\n * - `mesh`: only peers on the same mesh (Tailscale tailnet, …)\n * - `public`: open internet (Funnel, public-tunnel pass-through)\n */\n scope: z.enum(['mesh', 'public']),\n /** Full base URL (e.g. `https://camstack.tail-abc.ts.net`). */\n url: z.string(),\n /** Hostname portion (for SAN cert checks + display). */\n hostname: z.string(),\n /** Port (`443` for Funnel/Serve, anything for raw mesh IP). */\n port: z.number(),\n /** Always `http` or `https`. */\n protocol: z.enum(['http', 'https']),\n})\n\nexport type MeshEndpoint = z.infer<typeof MeshEndpointSchema>\n\nconst MeshPeerSchema = z.object({\n /** Stable peer id assigned by the mesh control plane. */\n id: z.string(),\n /** Hostname / device name as shown in the mesh dashboard. */\n hostname: z.string(),\n /** Mesh IP(s). Multiple when the peer is dual-stacked. */\n addresses: z.array(z.string()).readonly(),\n /** Operating system reported by the peer (informational). */\n os: z.string().optional(),\n /** Whether this peer is currently reachable. */\n online: z.boolean(),\n /** Last-seen timestamp (epoch ms). 0 when never seen. */\n lastSeenMs: z.number(),\n /** True for the row representing the current host. */\n isSelf: z.boolean(),\n})\n\nexport type MeshPeer = z.infer<typeof MeshPeerSchema>\n\nconst MeshStatusSchema = z.object({\n /** True when the host is joined and the daemon reports healthy. */\n joined: z.boolean(),\n /** Local mesh IPv4 (e.g. `100.x.x.x` for Tailscale). Empty when not joined. */\n meshIp: z.string(),\n /** MagicDNS / mesh hostname (e.g. `camstack.tail-abc.ts.net`). Empty if not configured. */\n magicDnsHostname: z.string(),\n /** Number of peers visible to this host (excluding self). */\n peerCount: z.number(),\n /** Every endpoint this provider exposes for the current host. */\n endpoints: z.array(MeshEndpointSchema).readonly(),\n /** Last error from the daemon, when not joined. */\n error: z.string().optional(),\n})\n\nexport type MeshStatus = z.infer<typeof MeshStatusSchema>\n\nconst PublicIngressConfigSchema = z.object({\n /** Whether the provider should expose CamStack via its public\n * ingress (Tailscale Funnel, etc.). */\n enabled: z.boolean(),\n /** Local port to forward. Auto-detected from the hub HTTP port\n * when omitted. */\n port: z.number().int().min(1).max(65535).optional(),\n})\n\nconst MeshIngressConfigSchema = z.object({\n /** Whether the provider should expose CamStack inside the mesh\n * via HTTPS (Tailscale Serve, etc.) instead of just raw IP. */\n enabled: z.boolean(),\n /** Local port to forward. Auto-detected when omitted. */\n port: z.number().int().min(1).max(65535).optional(),\n})\n\n/**\n * `mesh-network` — per-provider implementation. Tailscale registers\n * one (and only one) entry. Future Headscale / ZeroTier addons would\n * register their own entries.\n */\nexport const meshNetworkCapability = {\n name: 'mesh-network',\n scope: 'system',\n mode: 'collection',\n methods: {\n /** Return the current join state + endpoints + peer count. Cheap\n * poll-target — admin UI hits this every few seconds. */\n getStatus: method(z.void(), MeshStatusSchema),\n\n /**\n * Join the host to the provider's mesh using a one-time auth key\n * (generated by the operator in the provider's admin dashboard).\n * Implementations should be idempotent — re-calling with the same\n * key while already joined is a no-op + success.\n */\n join: method(\n z.object({\n /** Provider-specific auth key. For Tailscale this is the\n * `tskey-auth-*` token from admin.tailscale.com. */\n authKey: z.string().min(8),\n /** Optional hostname override the host should advertise. */\n hostname: z.string().optional(),\n }),\n z.object({ joined: z.literal(true) }),\n { kind: 'mutation' },\n ),\n\n /** Leave the mesh. After this the meshIp/magicDnsHostname/etc.\n * vanish until the next `join`. */\n leave: method(\n z.void(),\n z.object({ left: z.literal(true) }),\n { kind: 'mutation' },\n ),\n\n /** Enumerate every peer the daemon currently knows about. */\n listPeers: method(z.void(), z.object({\n peers: z.array(MeshPeerSchema).readonly(),\n })),\n\n /**\n * Toggle the public ingress (e.g. Tailscale Funnel) that maps a\n * local port to the open internet via the provider's edge. Idempotent.\n */\n setPublicIngress: method(\n PublicIngressConfigSchema,\n z.object({ success: z.literal(true) }),\n { kind: 'mutation' },\n ),\n\n /**\n * Toggle the in-mesh HTTPS ingress (e.g. Tailscale Serve) so peers\n * inside the mesh hit a valid TLS endpoint instead of the raw IP.\n */\n setMeshIngress: method(\n MeshIngressConfigSchema,\n z.object({ success: z.literal(true) }),\n { kind: 'mutation' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IMeshNetworkProvider = InferProvider<typeof meshNetworkCapability>\n","/**\n * mesh-orchestrator — singleton facade over the `mesh-network`\n * collection. Mirrors the `remote-access` / `turn-orchestrator`\n * pattern: the admin UI talks to ONE cap, the cap walks the\n * collection and aggregates per-provider status.\n */\nimport { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\nconst MeshEndpointSchema = z.object({\n id: z.string(),\n label: z.string(),\n scope: z.enum(['mesh', 'public']),\n url: z.string(),\n hostname: z.string(),\n port: z.number(),\n protocol: z.enum(['http', 'https']),\n})\n\nconst MeshProviderInfoSchema = z.object({\n /** Stable id matching the addon id. */\n addonId: z.string(),\n /** Display label shown on the admin row — sourced from the addon manifest. */\n displayName: z.string(),\n /** True when the host is joined to this provider's mesh. */\n joined: z.boolean(),\n /** Local mesh IP (empty when not joined). */\n meshIp: z.string(),\n /** MagicDNS / mesh hostname (empty when not configured). */\n magicDnsHostname: z.string(),\n /** Peer count (excluding self). */\n peerCount: z.number(),\n /** Active endpoints (mesh IP + MagicDNS + optional public Funnel). */\n endpoints: z.array(MeshEndpointSchema).readonly(),\n /** Last error reported by the provider. */\n error: z.string().optional(),\n})\n\nexport type MeshProviderInfo = z.infer<typeof MeshProviderInfoSchema>\n\nexport const meshOrchestratorCapability = {\n name: 'mesh-orchestrator',\n scope: 'system',\n mode: 'singleton',\n methods: {\n /** All registered mesh-network providers + live status. */\n listProviders: method(z.void(), z.array(MeshProviderInfoSchema).readonly()),\n /**\n * Join the mesh of a specific provider. Per-provider config still\n * lives on its settings panel; the orchestrator forwards.\n */\n joinProvider: method(\n z.object({\n addonId: z.string(),\n authKey: z.string().min(8),\n hostname: z.string().optional(),\n }),\n z.object({ joined: z.literal(true) }),\n { kind: 'mutation' },\n ),\n leaveProvider: method(\n z.object({ addonId: z.string() }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IMeshOrchestrator = InferProvider<typeof meshOrchestratorCapability>\n","/**\n * Zod schemas for persisted record types.\n *\n * These schemas serve as the single source of truth for types that are\n * stored in the settings-store backend and retrieved via tRPC. They\n * replace the manual TypeScript interfaces with schema-derived types,\n * enabling runtime validation when reading from the backend.\n *\n * Convention: each schema is named `<Type>Schema`, the inferred TS type\n * keeps the original name for backward compatibility.\n */\nimport { z } from 'zod'\n\n// ── Auth ────────────────────────────────────────────────────────────\n\n/**\n * Roles in the caps-only auth model.\n *\n * - `admin` — unrestricted; bypasses the scope check. The only escape\n * hatch. Replaces the retired `super_admin`.\n * - `viewer` — non-admin human; MUST have scopes (empty = no access).\n * - `agent` — agent-process credential; MUST have scopes for hub calls.\n * - `scoped` — synthetic role for `cst_*` token callers; no users-table\n * row; `userId` references the human who minted the token.\n *\n * `super_admin` was removed when scope semantics collapsed into one\n * model (admin == owner of everything). The local-auth migration\n * silently rewrites `super_admin` rows to `admin` on first boot.\n */\nexport const UserRoleSchema = z.enum(['admin', 'viewer', 'agent', 'scoped'])\nexport type UserRole = z.infer<typeof UserRoleSchema>\n\nconst AllowedProviderSchema = z.union([z.literal('*'), z.array(z.string())])\nconst AllowedDevicesSchema = z.record(z.string(), z.union([z.literal('*'), z.array(z.string())]))\n\n/** Per-method access flavour. Materialised on every cap method via codegen. */\nexport const MethodAccessSchema = z.enum(['view', 'create', 'delete'])\nexport type MethodAccess = z.infer<typeof MethodAccessSchema>\n\n/**\n * A single scope grant. `type` is `addon | capability` only — the\n * legacy `route-prefix` form is gone (every endpoint lives behind a cap,\n * by codegen contract). `access` is REQUIRED with min 1 element; \"give\n * me everything\" is expressed by the `admin` role, not a wildcard scope.\n */\nexport const TokenScopeSchema = z.object({\n type: z.enum(['addon', 'capability']),\n target: z.string(),\n access: z.array(MethodAccessSchema).min(1),\n})\nexport type TokenScope = z.infer<typeof TokenScopeSchema>\n\nexport const UserRecordSchema = z.object({\n id: z.string(),\n username: z.string(),\n passwordHash: z.string(),\n role: UserRoleSchema,\n allowedProviders: AllowedProviderSchema,\n allowedDevices: AllowedDevicesSchema,\n /**\n * Scopes granted to this user. Admins bypass; their `scopes` is ignored.\n * Non-admins (`viewer`, `agent`, `scoped`) without scopes are locked out\n * of every protected call.\n */\n scopes: z.array(TokenScopeSchema).default([]),\n createdAt: z.number(),\n updatedAt: z.number(),\n})\nexport type UserRecord = z.infer<typeof UserRecordSchema>\n\nexport const ApiKeyRecordSchema = z.object({\n id: z.string(),\n label: z.string(),\n role: UserRoleSchema,\n allowedProviders: AllowedProviderSchema,\n allowedDevices: AllowedDevicesSchema,\n tokenHash: z.string(),\n tokenPrefix: z.string(),\n createdAt: z.number(),\n lastUsedAt: z.number().optional(),\n})\nexport type ApiKeyRecord = z.infer<typeof ApiKeyRecordSchema>\n\n// ── Scoped Tokens ───────────────────────────────────────────────────\n\nexport const ScopedTokenSchema = z.object({\n id: z.string(),\n userId: z.string(),\n name: z.string(),\n tokenHash: z.string(),\n tokenPrefix: z.string(),\n scopes: z.array(TokenScopeSchema),\n // SQLite/JSON storage round-trips undefined → null. Use `nullish` so the\n // schema accepts both `null` (read from disk) and `undefined` (in-memory).\n expiresAt: z.number().nullish(),\n lastUsedAt: z.number().nullish(),\n createdAt: z.number(),\n})\nexport type ScopedToken = z.infer<typeof ScopedTokenSchema>\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n// Canonical schemas — the local enum/scope duplicates that lived here got the\n// cap-router types out of sync with `auth-records` (super_admin vs admin,\n// route-prefix vs cap-only). One source of truth, imported.\nimport { UserRoleSchema, TokenScopeSchema } from '../schemas/auth-records.js'\n\nconst UserSummarySchema = z.object({\n id: z.string(),\n username: z.string(),\n role: UserRoleSchema,\n allowedProviders: z.union([z.array(z.string()), z.literal('*')]),\n allowedDevices: z.record(z.string(), z.union([z.array(z.string()), z.literal('*')])),\n scopes: z.array(TokenScopeSchema).default([]),\n createdAt: z.number(),\n updatedAt: z.number(),\n})\n\nconst CreateUserInputSchema = z.object({\n username: z.string(),\n password: z.string().min(6),\n role: UserRoleSchema,\n allowedProviders: z.union([z.array(z.string()), z.literal('*')]).optional(),\n allowedDevices: z.record(z.string(), z.union([z.array(z.string()), z.literal('*')])).optional(),\n scopes: z.array(TokenScopeSchema).optional(),\n})\n\nconst UpdateUserInputSchema = z.object({\n id: z.string(),\n role: UserRoleSchema.optional(),\n allowedProviders: z.union([z.array(z.string()), z.literal('*')]).optional(),\n allowedDevices: z.record(z.string(), z.union([z.array(z.string()), z.literal('*')])).optional(),\n scopes: z.array(TokenScopeSchema).optional(),\n})\n\nconst ApiKeySummarySchema = z.object({\n id: z.string(),\n label: z.string(),\n role: UserRoleSchema,\n allowedProviders: z.union([z.array(z.string()), z.literal('*')]).optional(),\n allowedDevices: z.record(z.string(), z.union([z.array(z.string()), z.literal('*')])).optional(),\n tokenPrefix: z.string(),\n createdAt: z.number(),\n lastUsedAt: z.number().optional(),\n})\n\nconst CreateApiKeyInputSchema = z.object({\n label: z.string(),\n role: UserRoleSchema,\n allowedProviders: z.union([z.array(z.string()), z.literal('*')]).optional(),\n allowedDevices: z.record(z.string(), z.union([z.array(z.string()), z.literal('*')])).optional(),\n})\n\nconst CreateApiKeyResultSchema = z.object({\n token: z.string(),\n record: ApiKeySummarySchema,\n})\n\nconst ScopedTokenSummarySchema = z.object({\n id: z.string(),\n userId: z.string(),\n name: z.string(),\n tokenPrefix: z.string(),\n scopes: z.array(TokenScopeSchema),\n // Mirror the storage schema: `.nullish()` accepts the SQLite-native\n // `null` for absent timestamps as well as in-memory `undefined`.\n expiresAt: z.number().nullish(),\n lastUsedAt: z.number().nullish(),\n createdAt: z.number(),\n})\n\nconst CreateScopedTokenInputSchema = z.object({\n // The owner the token is issued on behalf of. `adminProcedure` gates\n // this call so an admin can mint tokens for any user; the CLI passes\n // its own logged-in `user.id` here.\n userId: z.string(),\n name: z.string(),\n scopes: z.array(TokenScopeSchema),\n expiresAt: z.number().optional(),\n})\n\nconst CreateScopedTokenResultSchema = z.object({\n token: z.string(),\n record: ScopedTokenSummarySchema,\n})\n\n/**\n * user-management — singleton capability for user accounts, API keys,\n * and scoped tokens.\n *\n * Implemented by the `local-auth` addon. Covers all CRUD operations\n * that were previously hand-written in `users.router.ts` and\n * `scoped-tokens.router.ts`.\n *\n * Login/logout/me stay in the server's core auth router because they\n * depend on JWT signing (a server-level concern, not an addon concern).\n *\n * `superAdmin` auth modifier was retired alongside the role itself —\n * destructive ops are now gated by `auth: 'admin'` (the unscoped role),\n * which the middleware lets through unconditionally.\n */\nexport const userManagementCapability = {\n name: 'user-management',\n scope: 'system',\n mode: 'singleton',\n methods: {\n // ── Users ──────────────────────────────────────────────────────\n listUsers: method(z.void(), z.array(UserSummarySchema), { auth: 'admin' }),\n createUser: method(CreateUserInputSchema, UserSummarySchema, { kind: 'mutation', auth: 'admin' }),\n updateUser: method(UpdateUserInputSchema, z.object({ success: z.literal(true) }), { kind: 'mutation', auth: 'admin' }),\n deleteUser: method(z.object({ id: z.string() }), z.object({ success: z.literal(true) }), { kind: 'mutation', auth: 'admin' }),\n resetPassword: method(\n z.object({ id: z.string(), newPassword: z.string().min(6) }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n /**\n * Replace the scope set on a user. Subset check: the caller's scopes\n * must include every requested scope+access (admin bypasses).\n */\n setUserScopes: method(\n z.object({ userId: z.string(), scopes: z.array(TokenScopeSchema) }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n validateCredentials: method(\n z.object({ username: z.string(), password: z.string() }),\n UserSummarySchema.extend({ passwordHash: z.string() }).nullable(),\n { kind: 'mutation' },\n ),\n\n // ── API Keys ──────────────────────────────────────────────────\n listApiKeys: method(z.void(), z.array(ApiKeySummarySchema), { auth: 'admin' }),\n createApiKey: method(CreateApiKeyInputSchema, CreateApiKeyResultSchema, { kind: 'mutation', auth: 'admin' }),\n revokeApiKey: method(z.object({ id: z.string() }), z.object({ success: z.literal(true) }), { kind: 'mutation', auth: 'admin' }),\n validateApiKey: method(z.object({ token: z.string() }), ApiKeySummarySchema.nullable(), { kind: 'mutation' }),\n\n // ── Scoped Tokens ─────────────────────────────────────────────\n createScopedToken: method(CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, { kind: 'mutation', auth: 'admin' }),\n revokeScopedToken: method(z.object({ id: z.string() }), z.object({ success: z.literal(true) }), { kind: 'mutation', auth: 'admin' }),\n validateScopedToken: method(z.object({ token: z.string() }), ScopedTokenSummarySchema.nullable()),\n listScopedTokens: method(z.object({ userId: z.string() }), z.array(ScopedTokenSummarySchema), { auth: 'admin' }),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IUserManagementProvider = InferProvider<typeof userManagementCapability>\n\nexport {\n UserSummarySchema, CreateUserInputSchema, UpdateUserInputSchema,\n ApiKeySummarySchema, CreateApiKeyInputSchema, CreateApiKeyResultSchema,\n ScopedTokenSummarySchema, CreateScopedTokenInputSchema, CreateScopedTokenResultSchema,\n}\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n/**\n * system — system-scoped singleton capability exposing hub-level\n * health, feature flags, network interface enumeration, and the\n * analytics-suite retention controls.\n *\n * Implementation lives in the server's `FeatureService` plus the\n * `analysis-data-persistence` singleton (provided by\n * `addon-analytics-suite`). The provider is registered from\n * `trpc.router.ts` against the existing services — no addon owns\n * this surface end-to-end.\n *\n * Phase E of the API consolidation: previously a hand-written core\n * router. Cap conversion lets the canonical hooks\n * (`useSystemInfo`, `useSystemHealth`, `useSystemNetworkAddresses`,\n * `useSystemGetRetentionConfig`, `useSystemSetRetentionConfig`,\n * `useSystemForceRetentionCleanup`) flow through the same codegen\n * as every other cap.\n */\n\nconst FeatureManifestSchema = z.object({\n streaming: z.boolean(),\n notifications: z.boolean(),\n objectDetection: z.boolean(),\n remoteAccess: z.boolean(),\n agentCluster: z.boolean(),\n smartHome: z.boolean(),\n recordings: z.boolean(),\n backup: z.boolean(),\n repl: z.boolean(),\n})\n\nconst HealthStatusSchema = z.object({\n status: z.literal('ok'),\n uptime: z.number(),\n})\n\nconst NetworkAddressSchema = z.object({\n name: z.string(),\n address: z.string(),\n family: z.string(),\n internal: z.boolean(),\n})\n\nexport const systemCapability = {\n name: 'system',\n scope: 'system',\n mode: 'singleton',\n methods: {\n info: method(z.void(), FeatureManifestSchema),\n health: method(z.void(), HealthStatusSchema),\n featureFlags: method(z.void(), FeatureManifestSchema),\n networkAddresses: method(z.void(), z.array(NetworkAddressSchema).readonly()),\n // Retention config is opaque on the wire — the analytics-suite owns the\n // schema. `getRetentionConfig` returns null when the analytics addon\n // is not loaded; `setRetentionConfig` accepts a partial patch.\n getRetentionConfig: method(z.void(), z.unknown().nullable(), { auth: 'admin' }),\n setRetentionConfig: method(\n z.record(z.string(), z.unknown()),\n z.null(),\n { kind: 'mutation', auth: 'admin' },\n ),\n forceRetentionCleanup: method(z.void(), z.void(), { kind: 'mutation', auth: 'admin' }),\n },\n} as const satisfies CapabilityDefinition\n\nexport type ISystemProvider = InferProvider<typeof systemCapability>\n\nexport {\n FeatureManifestSchema,\n HealthStatusSchema,\n NetworkAddressSchema,\n}\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n/**\n * network-quality — system-scoped singleton capability tracking RTT,\n * jitter, and observed/peak bandwidth per device + per client.\n *\n * Implementation lives in the server's `NetworkQualityService` (thin\n * wrapper over the shared `NetworkQualityTracker` from `@camstack/core`).\n * The provider is registered from `trpc.router.ts` against the existing\n * service instance — no addon owns this state.\n *\n * Phase E of the API consolidation: previously a hand-written core\n * router. Cap conversion lets the same codegen pipeline produce both\n * the tRPC router and the canonical UI hooks\n * (`useNetworkQualityGetDeviceStats`, …).\n */\n\nconst StreamNetworkStatsSchema = z.object({\n nominalBitrateKbps: z.number(),\n observedBitrateKbps: z.number(),\n peakBitrateKbps: z.number(),\n packetLossPercent: z.number(),\n lastUpdated: z.number(),\n})\n\nconst ClientNetworkStatsSchema = z.object({\n rttMs: z.number(),\n jitterMs: z.number(),\n estimatedBandwidthKbps: z.number(),\n lastUpdated: z.number(),\n})\n\nconst DeviceNetworkStatsSchema = z.object({\n deviceId: z.number(),\n streams: z.record(z.string(), StreamNetworkStatsSchema),\n client: ClientNetworkStatsSchema.optional(),\n})\n\nexport const networkQualityCapability = {\n name: 'network-quality',\n scope: 'system',\n mode: 'singleton',\n methods: {\n getDeviceStats: method(\n z.object({ deviceId: z.number() }),\n DeviceNetworkStatsSchema.nullable(),\n ),\n getAllStats: method(\n z.void(),\n z.array(DeviceNetworkStatsSchema).readonly(),\n ),\n reportClientStats: method(\n z.object({\n deviceId: z.number(),\n rttMs: z.number().min(0).max(60000),\n jitterMs: z.number().min(0).max(10000),\n estimatedBandwidthKbps: z.number().min(0).max(1000000),\n }),\n z.void(),\n { kind: 'mutation' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type INetworkQualityProvider = InferProvider<typeof networkQualityCapability>\n\nexport {\n StreamNetworkStatsSchema,\n ClientNetworkStatsSchema,\n DeviceNetworkStatsSchema,\n}\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n/**\n * toast — system-scoped singleton capability that streams toast\n * notifications from the hub to connected admin-UI clients.\n *\n * Single push subscription (`onToast`). The provider lives in the\n * server's `ToastService` (always available after boot) and is\n * registered from `trpc.router.ts` against that service. No addon\n * owns this state — toasts are server-broadcasted side-effects of\n * other admin actions.\n *\n * Phase E of the API consolidation: previously a hand-written core\n * router (re-introduced after a brief detour as a cap years ago).\n * Cap conversion unifies the codegen pipeline so admin-ui consumers\n * pick up the standard `useToastOnToast` hook through the same\n * generator that emits every other system-cap subscription wrapper.\n */\n\nconst ToastSchema = z.object({\n title: z.string(),\n message: z.string(),\n severity: z.enum(['info', 'warning', 'critical']),\n duration: z.number().optional(),\n action: z\n .object({\n label: z.string(),\n url: z.string(),\n })\n .optional(),\n})\n\nexport const toastCapability = {\n name: 'toast',\n scope: 'system',\n mode: 'singleton',\n methods: {\n onToast: method(z.void(), ToastSchema, { kind: 'subscription' }),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IToastProvider = InferProvider<typeof toastCapability>\n\nexport { ToastSchema }\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n/**\n * nodes — system-scoped singleton capability for cluster topology\n * queries and remote addon lifecycle operations.\n *\n * Implementation lives in the server's `AgentRegistryService`,\n * `MoleculerService`, and `AddonRegistryService`. The provider is\n * registered from `trpc.router.ts` against those services — no addon\n * owns the cluster topology view.\n *\n * Phase E of the API consolidation: previously a hand-written core\n * router. Cap conversion lets `useNodesTopology`, `useNodesRestartNode`,\n * etc. flow through the same codegen pipeline as every other cap.\n */\n\n// ── Topology ─────────────────────────────────────────────────────────\n\nconst TopologyServiceSchema = z.object({\n addonId: z.string(),\n capabilities: z.array(z.string()).readonly(),\n status: z.string(),\n})\n\nconst TopologyProcessSchema = z.object({\n pid: z.number(),\n name: z.string(),\n state: z.string(),\n cpuPercent: z.number(),\n memoryRss: z.number(),\n uptimeSeconds: z.number(),\n services: z.array(TopologyServiceSchema).readonly(),\n groupId: z.string().optional(),\n})\n\nconst TopologyNodeSchema = z.object({\n id: z.string(),\n name: z.string(),\n hostname: z.string(),\n platform: z.string(),\n arch: z.string(),\n cpuModel: z.string().nullable(),\n cpuCores: z.number(),\n memoryMB: z.number(),\n engines: z.array(z.string()).readonly(),\n isHub: z.boolean(),\n isOnline: z.boolean(),\n cpuPercent: z.number(),\n memoryPercent: z.number(),\n uptime: z.number(),\n lastSeen: z.string(),\n localIps: z.array(z.string()).readonly(),\n addons: z.array(\n z.object({\n id: z.string(),\n capabilities: z.array(z.string()).readonly(),\n status: z.string(),\n }),\n ).readonly(),\n processes: z.array(TopologyProcessSchema).readonly(),\n})\n\n// ── Cluster addon-status ────────────────────────────────────────────\n\nconst ClusterAddonNodeDeploymentSchema = z.object({\n nodeId: z.string(),\n name: z.string(),\n version: z.string(),\n status: z.string(),\n synced: z.boolean(),\n})\n\nconst ClusterAddonStatusEntrySchema = z.object({\n hubVersion: z.string(),\n nodes: z.array(ClusterAddonNodeDeploymentSchema),\n})\n\n// ── Method input/output shapes ──────────────────────────────────────\n\nconst NodeAddonInputSchema = z.object({\n nodeId: z.string(),\n addonId: z.string(),\n})\n\nconst SuccessSchema = z.object({ success: z.boolean() })\n\nconst RestartProcessResultSchema = z.object({\n success: z.boolean(),\n reason: z.string().optional(),\n})\n\nconst RestartNodeResultSchema = z.object({\n restarted: z.array(z.string()).readonly(),\n failed: z.array(z.string()).readonly(),\n})\n\nconst RenameNodeResultSchema = z.object({\n nodeId: z.string(),\n name: z.string(),\n})\n\nexport const nodesCapability = {\n name: 'nodes',\n scope: 'system',\n mode: 'singleton',\n methods: {\n topology: method(\n z.void(),\n z.array(TopologyNodeSchema).readonly(),\n { auth: 'admin' },\n ),\n deployAddon: method(NodeAddonInputSchema, SuccessSchema, {\n kind: 'mutation',\n auth: 'admin',\n }),\n undeployAddon: method(NodeAddonInputSchema, SuccessSchema, {\n kind: 'mutation',\n auth: 'admin',\n }),\n restartAddon: method(NodeAddonInputSchema, SuccessSchema, {\n kind: 'mutation',\n auth: 'admin',\n }),\n restartProcess: method(\n z.object({ nodeId: z.string(), processName: z.string() }),\n RestartProcessResultSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n restartNode: method(\n z.object({ nodeId: z.string() }),\n RestartNodeResultSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n shutdownNode: method(\n z.object({ nodeId: z.string() }),\n SuccessSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n renameNode: method(\n z.object({ nodeId: z.string(), name: z.string().min(1).max(64) }),\n RenameNodeResultSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n clusterAddonStatus: method(\n z.void(),\n z.record(z.string(), ClusterAddonStatusEntrySchema),\n { auth: 'admin' },\n ),\n setProcessLogLevel: method(\n z.object({ nodeId: z.string(), level: z.string() }),\n SuccessSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n executeQuery: method(\n z.object({\n nodeId: z.string(),\n addonId: z.string(),\n queryName: z.string(),\n params: z.record(z.string(), z.unknown()).optional(),\n }),\n z.unknown(),\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type INodesProvider = InferProvider<typeof nodesCapability>\n\nexport {\n TopologyNodeSchema,\n TopologyProcessSchema,\n TopologyServiceSchema,\n ClusterAddonStatusEntrySchema,\n ClusterAddonNodeDeploymentSchema,\n}\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n/**\n * integrations — system-scoped singleton capability for integration\n * (provider-instance) lifecycle. Integrations are typically per-addon\n * data records that pin a device-provider addon to a concrete config\n * (Reolink credentials, ONVIF endpoint, etc.).\n *\n * Implementation lives in the server's `AddonRegistryService`\n * (specifically `getIntegrationRegistry()`). The provider is registered\n * from `trpc.router.ts` against that service plus the event bus and\n * logger — no addon owns this end-to-end.\n *\n * Phase E of the API consolidation: previously a hand-written core\n * router. Cap conversion lets `useIntegrationsList`,\n * `useIntegrationsCreate`, `useIntegrationsTestConnection` and\n * friends flow through the same codegen pipeline as every other cap.\n */\n\n// ── Schemas ─────────────────────────────────────────────────────────\n\nconst IntegrationWithStateSchema = z.object({\n id: z.string(),\n addonId: z.string(),\n name: z.string(),\n enabled: z.boolean(),\n info: z.record(z.string(), z.unknown()).readonly(),\n createdAt: z.number(),\n updatedAt: z.number(),\n processState: z.string(),\n})\n\nconst IntegrationLiteSchema = z.object({\n id: z.string(),\n addonId: z.string(),\n name: z.string(),\n enabled: z.boolean(),\n info: z.record(z.string(), z.unknown()).readonly(),\n createdAt: z.number(),\n updatedAt: z.number(),\n})\n\nconst AvailableIntegrationTypeSchema = z.object({\n addonId: z.string(),\n name: z.string(),\n description: z.string(),\n iconUrl: z.string().nullable(),\n color: z.string(),\n instanceMode: z.string(),\n discoveryMode: z.string(),\n existingInstances: z.array(z.object({ id: z.string(), name: z.string() })),\n canAdd: z.boolean(),\n})\n\nconst TestConnectionResultSchema = z.object({\n success: z.boolean(),\n error: z.string().optional(),\n})\n\n// ── Method I/O ──────────────────────────────────────────────────────\n\nconst CreateIntegrationInputSchema = z.object({\n addonId: z.string(),\n name: z.string(),\n enabled: z.boolean().optional(),\n info: z.record(z.string(), z.unknown()).optional(),\n settings: z.record(z.string(), z.unknown()).optional(),\n skipRestart: z.boolean().optional(),\n})\n\nconst UpdateIntegrationInputSchema = z.object({\n id: z.string(),\n name: z.string().optional(),\n enabled: z.boolean().optional(),\n info: z.record(z.string(), z.unknown()).optional(),\n})\n\nconst DeleteIntegrationResultSchema = z.object({\n success: z.boolean(),\n deletedId: z.string(),\n})\n\nexport const integrationsCapability = {\n name: 'integrations',\n scope: 'system',\n mode: 'singleton',\n methods: {\n list: method(z.void(), z.array(IntegrationWithStateSchema)),\n get: method(z.object({ id: z.string() }), IntegrationWithStateSchema),\n getByAddonId: method(\n z.object({ addonId: z.string() }),\n IntegrationLiteSchema.nullable(),\n ),\n create: method(\n CreateIntegrationInputSchema,\n IntegrationLiteSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n update: method(\n UpdateIntegrationInputSchema,\n IntegrationLiteSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n delete: method(\n z.object({ id: z.string() }),\n DeleteIntegrationResultSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n getSettings: method(\n z.object({ id: z.string() }),\n z.record(z.string(), z.unknown()),\n { auth: 'admin' },\n ),\n setSettings: method(\n z.object({\n id: z.string(),\n settings: z.record(z.string(), z.unknown()),\n }),\n z.object({ success: z.boolean() }),\n { kind: 'mutation', auth: 'admin' },\n ),\n getAvailableTypes: method(\n z.void(),\n z.array(AvailableIntegrationTypeSchema),\n { auth: 'admin' },\n ),\n testConnection: method(\n z.object({\n addonId: z.string(),\n settings: z.record(z.string(), z.unknown()),\n }),\n TestConnectionResultSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IIntegrationsProvider = InferProvider<typeof integrationsCapability>\n\nexport {\n IntegrationWithStateSchema,\n IntegrationLiteSchema,\n AvailableIntegrationTypeSchema,\n TestConnectionResultSchema,\n CreateIntegrationInputSchema,\n UpdateIntegrationInputSchema,\n DeleteIntegrationResultSchema,\n}\n","import { z } from 'zod'\nimport { method, type CapabilityDefinition, type InferProvider } from './capability-definition.js'\n\n/**\n * addons — system-scoped singleton capability for addon package\n * management (install, update, configure, restart) and per-addon log\n * streaming.\n *\n * Implementation lives in the server's `AddonRegistryService`,\n * `AddonPackageService`, and `LoggingService`. The provider is\n * registered from `trpc.router.ts` against those services — no addon\n * owns this surface end-to-end (it manages addons themselves).\n *\n * Phase E of the API consolidation: previously a hand-written core\n * router. Cap conversion lets `useAddonsList`, `useAddonsInstallPackage`,\n * `useAddonsOnAddonLogs`, etc. flow through the same codegen pipeline\n * as every other cap.\n */\n\n// ── Loose-shape Zod helpers ─────────────────────────────────────────\n//\n// The `addons` surface ships rich runtime objects (manifests, addon\n// declarations, package metadata) whose precise shapes already live in\n// `@camstack/types/interfaces`. We deliberately keep the cap schemas\n// loose — `z.record(z.string(), z.unknown())` plus a few well-known\n// fields — so admin-ui consumers can keep using the existing\n// `AddonListItem` interface via cast, and so we don't risk inflating\n// the inferred AppRouter type past the TypeScript inference budget.\n\nconst LogLevelSchema = z.enum(['debug', 'info', 'warn', 'error'])\nconst ChannelSchema = z.enum(['off', 'latest', 'beta'])\nconst ChannelWithInheritSchema = z.enum(['off', 'latest', 'beta', 'inherit'])\n\n// Mirrors `AddonListItem` from interfaces/api-responses.ts. Schema is\n// intentionally loose — `z.unknown()` slots accept any runtime shape so\n// admin-ui can keep using the `AddonListItem` interface via cast.\nconst ManifestShapeSchema = z.object({\n id: z.string(),\n name: z.string().optional(),\n version: z.string().optional(),\n description: z.string().optional(),\n icon: z.string().optional(),\n color: z.string().optional(),\n // Loose schema for `manifest.capabilities` — runtime entries are\n // either kebab-case strings (legacy form) or `CapabilityDeclaration`\n // objects. The cap output schema deliberately keeps it as\n // `readonly unknown[]` so admin-ui consumers cast to the canonical\n // `AddonListItem` (from `@camstack/types`) before reading fields.\n capabilities: z.array(z.unknown()).readonly().optional(),\n packageName: z.string(),\n packageVersion: z.string(),\n packageDisplayName: z.string().optional(),\n /**\n * Bundle metadata when the npm package ships multiple addon entries\n * (mirror of `AddonPackageManifest.bundle` in @camstack/types). When\n * present, the admin UI groups all entries with the same packageName\n * under a collapsible bundle card. Single-entry packages omit this.\n */\n bundle: z.object({\n displayName: z.string(),\n description: z.string().optional(),\n icon: z.string().optional(),\n }).optional(),\n protected: z.boolean().optional(),\n removable: z.boolean().optional(),\n})\n\nconst AddonProcessSchema = z.object({\n pid: z.number().optional(),\n mode: z.string(),\n state: z.string(),\n})\n\n/**\n * Per-addon health snapshot from the kernel's AddonHealthMonitor.\n * Surfaces the retry-loop state to the admin UI so the Addons page\n * can:\n * - Show a red badge + error stack on `phase=failed` rows\n * - Render a \"Retry now\" button (calls `addons.retryLoad`)\n * - Display a \"next retry in Ns\" countdown\n * - Suppress alarming UI during the 5-minute boot grace\n */\nconst AddonHealthSchema = z.object({\n phase: z.enum(['pending', 'healthy', 'failed']),\n retryCount: z.number(),\n firstFailureAt: z.number().nullable(),\n lastAttemptAt: z.number().nullable(),\n lastError: z\n .object({ message: z.string(), stack: z.string().optional() })\n .nullable(),\n nextRetryAt: z.number().nullable(),\n alertEmitted: z.boolean(),\n retrying: z.boolean(),\n inGracePeriod: z.boolean(),\n})\n\nconst AddonListItemSchema = z.object({\n manifest: ManifestShapeSchema,\n declaration: z.unknown().optional(),\n source: z.string(),\n installSource: z.string().optional(),\n process: AddonProcessSchema.optional(),\n /**\n * True when `applyUpdate` last ran for this package and a pre-update\n * backup is still on disk (post-update health-check hasn't cleared\n * it yet, or the user hasn't called `clearBackup`). Drives the\n * Rollback button visibility in admin-ui's AddonCard.\n */\n hasBackup: z.boolean().optional(),\n /** Kernel health snapshot — null when monitor doesn't track this package. */\n health: AddonHealthSchema.nullable().optional(),\n})\n\nconst InstalledPackageSchema = z.object({\n name: z.string(),\n version: z.string(),\n dir: z.string(),\n installSource: z.string().optional(),\n})\n\nconst PackageUpdateSchema = z.object({\n name: z.string(),\n currentVersion: z.string(),\n latestVersion: z.string(),\n category: z.enum(['addon', 'core']),\n requiresRestart: z.boolean(),\n})\n\nconst PackageVersionInfoSchema = z.object({\n version: z.string(),\n publishedAt: z.string(),\n deprecated: z.string().optional(),\n distTags: z.array(z.string()).readonly(),\n})\n\nconst SearchResultSchema = z.object({\n name: z.string(),\n version: z.string(),\n description: z.string(),\n keywords: z.array(z.string()).readonly(),\n publishedAt: z.string(),\n author: z.string(),\n installed: z.boolean(),\n installedVersion: z.string().optional(),\n})\n\nconst AutoUpdateSettingsSchema = z.object({\n channel: ChannelSchema,\n intervalSeconds: z.number(),\n})\n\nconst AddonAutoUpdateSchema = ChannelWithInheritSchema\n\nconst RestartAddonResultSchema = z.unknown()\n\nconst InstallPackageResultSchema = z.unknown()\nconst ReloadPackagesResultSchema = z.unknown()\n\n// LogStream entry — mirrors LoggingService output.\nconst LogStreamEntrySchema = z.object({\n timestamp: z.string(),\n level: z.string(),\n message: z.string(),\n scope: z.string().optional(),\n})\n\n// Generic log query result — admin-ui treats it as the same schema.\nconst LogQueryEntrySchema = z.unknown()\n\n// Custom action dispatcher — pass-through. Used by `bindAddonActions`\n// helper which downcasts to `(input: unknown) => Promise<unknown>` and\n// stamps the per-action types on its own.\nconst CustomActionInputSchema = z.object({\n addonId: z.string().min(1),\n action: z.string().min(1),\n input: z.unknown(),\n})\n\nexport const addonsCapability = {\n name: 'addons',\n scope: 'system',\n mode: 'singleton',\n methods: {\n // ── Listing ──────────────────────────────────────────────────────\n list: method(z.void(), z.array(AddonListItemSchema).readonly()),\n\n // ── Logs (query) ────────────────────────────────────────────────\n // Default auth (`protected`): authenticated users — including scoped\n // tokens with the right route-prefix scope. Reading logs isn't an\n // administrative action; install/restart/uninstall stay admin-only.\n getLogs: method(\n z.object({\n addonId: z.string(),\n limit: z.number().min(1).max(500).default(100),\n level: LogLevelSchema.optional(),\n }),\n z.array(LogQueryEntrySchema),\n ),\n\n // ── Packages ────────────────────────────────────────────────────\n listPackages: method(z.void(), z.array(InstalledPackageSchema).readonly()),\n installPackage: method(\n z.object({ packageName: z.string(), version: z.string().optional() }),\n InstallPackageResultSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n installFromWorkspace: method(\n z.object({ packageName: z.string() }),\n InstallPackageResultSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n isWorkspaceAvailable: method(z.void(), z.boolean()),\n listWorkspacePackages: method(z.void(), z.array(z.unknown()).readonly()),\n uninstallPackage: method(\n z.object({ packageName: z.string() }),\n z.unknown(),\n { kind: 'mutation', auth: 'admin' },\n ),\n reloadPackages: method(z.void(), ReloadPackagesResultSchema, {\n kind: 'mutation', auth: 'admin',\n }),\n // Note: original router declared `searchAvailable` input as optional\n // outer object. The cap codegen requires a stable input shape — we\n // make `query` optional inside a required object to preserve client\n // call shape (`{ query?: string }`).\n searchAvailable: method(\n z.object({ query: z.string().optional() }),\n z.array(SearchResultSchema),\n ),\n listUpdates: method(\n z.void(),\n z.array(PackageUpdateSchema).readonly(),\n { auth: 'admin' },\n ),\n updatePackage: method(\n z.object({ name: z.string().min(1), version: z.string().optional() }),\n z.unknown(),\n { kind: 'mutation', auth: 'admin' },\n ),\n /**\n * Roll back an addon to the version it had before the most recent\n * `updatePackage` call. The backup directory pointer is kept in the\n * central addon manifest until the post-update health-check\n * confirms the new install works (then it's cleared automatically),\n * so this only succeeds when the most recent update either failed\n * its restart or the user explicitly wants to revert.\n *\n * Returns `{ rolledBackTo: <version> }` on success, or\n * `{ rolledBackTo: null }` when there's no backup to roll back to\n * (caller can show a \"no backup available\" UI).\n */\n rollbackPackage: method(\n z.object({ name: z.string().min(1) }),\n z.object({ rolledBackTo: z.string().nullable() }),\n { kind: 'mutation', auth: 'admin' },\n ),\n forceRefresh: method(z.void(), z.unknown(), { kind: 'mutation', auth: 'admin' }),\n restartServer: method(\n z.object({ confirm: z.literal(true) }),\n z.unknown(),\n { kind: 'mutation', auth: 'admin' },\n ),\n getVersions: method(\n z.object({ name: z.string() }),\n z.array(PackageVersionInfoSchema).readonly(),\n ),\n restartAddon: method(\n z.object({ addonId: z.string() }),\n RestartAddonResultSchema,\n { kind: 'mutation', auth: 'admin' },\n ),\n\n /**\n * Force-retry a failed addon NOW. Resets the retry counter so the\n * next failure starts from the 60s interval again. Used by the\n * \"Retry now\" button in the Addons admin page row + AlertCenter\n * alert action. Idempotent on healthy addons (no-op).\n */\n retryLoad: method(\n z.object({ packageName: z.string() }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n // ── Auto-update ─────────────────────────────────────────────────\n getAutoUpdateSettings: method(\n z.void(),\n AutoUpdateSettingsSchema,\n { auth: 'admin' },\n ),\n setAutoUpdateSettings: method(\n z.object({\n channel: ChannelSchema,\n intervalSeconds: z.number().min(300).max(86400).optional(),\n }),\n z.unknown(),\n { kind: 'mutation', auth: 'admin' },\n ),\n getAddonAutoUpdate: method(\n z.object({ addonId: z.string() }),\n AddonAutoUpdateSchema,\n { auth: 'admin' },\n ),\n setAddonAutoUpdate: method(\n z.object({ addonId: z.string(), channel: ChannelWithInheritSchema }),\n z.unknown(),\n { kind: 'mutation', auth: 'admin' },\n ),\n applyAutoUpdateToAll: method(\n z.object({ channel: ChannelSchema }),\n z.object({ success: z.literal(true) }),\n { kind: 'mutation', auth: 'admin' },\n ),\n\n // ── Custom action dispatcher ────────────────────────────────────\n // Generic dispatcher used by `bindAddonActions`. Per-action auth\n // is enforced inside the provider; the outer cap auth is\n // `protected` (any authenticated user) so individual addons can\n // gate their own actions to public/protected/admin/superAdmin.\n custom: method(CustomActionInputSchema, z.unknown(), { kind: 'mutation' }),\n\n // ── Log streaming ───────────────────────────────────────────────\n onAddonLogs: method(\n z.object({\n addonId: z.string(),\n level: LogLevelSchema.optional(),\n }),\n LogStreamEntrySchema,\n { kind: 'subscription' },\n ),\n },\n} as const satisfies CapabilityDefinition\n\nexport type IAddonsProvider = InferProvider<typeof addonsCapability>\n\nexport {\n AddonListItemSchema,\n InstalledPackageSchema,\n PackageUpdateSchema,\n PackageVersionInfoSchema,\n SearchResultSchema,\n AutoUpdateSettingsSchema,\n AddonAutoUpdateSchema,\n LogStreamEntrySchema,\n CustomActionInputSchema,\n LogLevelSchema,\n ChannelSchema,\n ChannelWithInheritSchema,\n}\n","/**\n * Capability definitions — Zod-schema-first, single source of truth.\n *\n * Each capability has its own .cap.ts file. Shared schemas live in schemas/.\n * TypeScript interfaces are inferred via z.infer<> — zero duplication.\n */\n\n// ── Pipeline capability roster ──────────────────────────────────────\n//\n// Canonical names of the capabilities considered \"pipeline-owning\":\n// anything under this list is an addon whose `getConfigSchema()` is\n// rendered on the Pipeline Defaults / per-device Detection tab, and\n// whose per-device settings changes trigger an `OrchestrationSettingsUpdated`\n// event so the orchestrator can restart detection.\n//\n// Consumers (backend + admin-ui) import this list instead of hardcoding\n// addon ids. Any new addon that declares one of these caps automatically\n// participates in the pipeline surface without code changes.\n\n/** Caps that show up in the canonical flow strip (decode → motion → detect → audio → analyze → notify). */\nexport const PIPELINE_FLOW_CAPABILITY_NAMES: readonly string[] = [\n 'decoder',\n 'motion-detection',\n 'pipeline-executor',\n 'audio-analyzer',\n 'pipeline-analytics',\n 'notification-output',\n]\n\n/**\n * Superset that also includes the control-plane capabilities (orchestrator\n * + runner). Used to enumerate addons whose settings belong to the pipeline\n * page — not just flow providers.\n */\nexport const PIPELINE_OWNER_CAPABILITY_NAMES: readonly string[] = [\n ...PIPELINE_FLOW_CAPABILITY_NAMES,\n 'pipeline-orchestrator',\n 'pipeline-runner',\n]\n\n// Core types\nexport type {\n CapabilityDefinition,\n CapabilityMethodSchema,\n CapabilityMethodKind,\n CapabilityMethodAuth,\n CapabilityMethodOptions,\n CapabilityEventSchema,\n InferProvider,\n InferNativeProvider,\n InferEvents,\n InferName,\n InferDeviceProxyCap,\n InferRuntimeState,\n DeviceSettingsContribution,\n} from './capability-definition.js'\nexport { method, event, expandCapMethods, DEVICE_SETTINGS_CONTRIBUTION_METHODS, DEVICE_STATUS_METHOD } from './capability-definition.js'\n\nexport * from './custom-actions.js'\n\n// ── Shared Schemas ───────────────────────────────────────────────────\nexport {\n FrameInputSchema, BoundingBoxSchema, SpatialDetectionSchema,\n AudioChunkInputSchema, AudioLevelSchema, AudioClassificationLabelSchema,\n} from './schemas/detection-shared.js'\n\nexport {\n StreamSourceEntrySchema, StreamSourceSchema, EncodedPacketSchema, DecodedFrameSchema,\n BrokerStatusSchema, BrokerStatsSchema,\n CamProfileSchema, CAM_PROFILE_ORDER,\n CamStreamKindSchema, CamStreamResolutionSchema,\n CameraStreamSchema, ProfileSlotStatusSchema, ProfileSlotSchema,\n} from './schemas/streaming-shared.js'\nexport type {\n CamProfile, CamStreamKind, CameraStream, ProfileSlotStatus, ProfileSlot,\n} from './schemas/streaming-shared.js'\n\n// ── Addon Settings ──────────────────────────────────────────────────\nexport {\n addonSettingsCapability, type IAddonSettingsProvider,\n SettingsSchemaWithValuesSchema, ConfigSectionWithValuesSchema, ConfigTabDeclarationSchema,\n SettingsPatchSchema, SettingsUpdateResultSchema,\n} from './addon-settings.cap.js'\n\n// ── Alerts ──────────────────────────────────────────────────────────\nexport { alertsCapability, AlertSeveritySchema, AlertStatusSchema, AlertSourceSchema, AlertSchema } from './alerts.cap.js'\nexport type { AlertSeverity, AlertStatus, Alert } from './alerts.cap.js'\n\n// ── Infrastructure ───────────────────────────────────────────────────\nexport { storageCapability, StorageLocationTypeSchema, type IStorageCapProvider } from './storage.cap.js'\nexport {\n storageProviderCapability,\n type IStorageProviderImpl,\n ProviderInfoSchema as StorageProviderInfoSchema,\n TestLocationResultSchema as StorageTestLocationResultSchema,\n BeginUploadInputSchema as StorageBeginUploadInputSchema,\n BeginUploadResultSchema as StorageBeginUploadResultSchema,\n WriteChunkInputSchema as StorageWriteChunkInputSchema,\n FinalizeUploadInputSchema as StorageFinalizeUploadInputSchema,\n AbortUploadInputSchema as StorageAbortUploadInputSchema,\n BeginDownloadInputSchema as StorageBeginDownloadInputSchema,\n BeginDownloadResultSchema as StorageBeginDownloadResultSchema,\n ReadChunkInputSchema as StorageReadChunkInputSchema,\n EndDownloadInputSchema as StorageEndDownloadInputSchema,\n} from './storage-provider.cap.js'\nexport {\n backupCapability,\n type IBackupProvider,\n BackupEntrySchema,\n BackupDestinationInfoSchema,\n ArchiveEntrySchema,\n ArchiveManifestSchema,\n LocationStatSchema,\n} from './backup.cap.js'\nexport {\n settingsStoreCapability, type ISettingsStoreProvider, type SettingsStoreClient,\n QueryFilterSchema, SettingsRecordSchema,\n CollectionColumnSchema, CollectionIndexSchema,\n type CollectionColumn, type CollectionIndex,\n} from './settings-store.cap.js'\nexport { logDestinationCapability, LogEntrySchema, LogLevelSchema } from './log-destination.cap.js'\nexport { adminUiCapability } from './admin-ui.cap.js'\nexport { addonPagesCapability, AddonPageInfoSchema } from './addon-pages.cap.js'\nexport type { IAddonPagesAggregatorProvider } from './addon-pages.cap.js'\nexport { addonPagesSourceCapability, AddonPageDeclarationSchema } from './addon-pages-source.cap.js'\nexport type { IAddonPagesSourceProvider } from './addon-pages-source.cap.js'\nexport { addonWidgetsCapability, EnrichedWidgetMetadataSchema } from './addon-widgets.cap.js'\nexport type { IAddonWidgetsAggregatorProvider } from './addon-widgets.cap.js'\nexport {\n addonWidgetsSourceCapability,\n WidgetMetadataSchema,\n WidgetHostEnum,\n WidgetSizeEnum,\n} from './addon-widgets-source.cap.js'\nexport type { IAddonWidgetsSourceProvider } from './addon-widgets-source.cap.js'\nexport { addonRoutesCapability } from './addon-routes.cap.js'\n\n// ── Streaming ────────────────────────────────────────────────────────\nexport {\n streamBrokerCapability,\n RtspRestreamEntrySchema,\n BrokerRtspClientSchema,\n BrokerDecodedClientSchema,\n BrokerAudioClientSchema,\n BrokerClientsSchema,\n PlaceholderReasonSchema,\n} from './stream-broker.cap.js'\nexport type {\n BrokerRtspClient,\n BrokerDecodedClient,\n BrokerAudioClient,\n BrokerClients,\n PlaceholderReason,\n} from './stream-broker.cap.js'\nexport {\n decoderCapability,\n DecoderSessionConfigSchema,\n HWACCEL_OPTIONS,\n DEFAULT_DECODER_HWACCEL_CONFIG,\n} from './decoder.cap.js'\nexport type {\n IDecoderCapProvider,\n HwAccelChoice,\n DecoderHwAccelConfig,\n} from './decoder.cap.js'\nexport { restreamerCapability, RegisteredStreamSchema, ExposedResourceSchema } from './restreamer.cap.js'\nexport { webrtcCapability, webrtcClientHintsSchema, type IWebrtcProvider, type WebrtcClientHints } from './webrtc.cap.js'\nexport { webrtcSessionCapability, type IWebrtcSessionProvider, type WebrtcStreamChoice, WebrtcStreamChoiceSchema, type WebrtcStreamTarget, WebrtcStreamTargetSchema } from './webrtc-session.cap.js'\nexport { cameraStreamsCapability, type ICameraStreamsProvider } from './camera-streams.cap.js'\nexport { streamingEngineCapability, StreamFormatSchema, StreamInfoSchema } from './streaming-engine.cap.js'\n\n// ── Detection ────────────────────────────────────────────────────────\nexport { motionDetectionCapability, MotionRegionSchema, MotionAnalysisResultSchema } from './motion-detection.cap.js'\nexport type { MotionRegion, MotionAnalysisResult, IMotionDetectionProvider } from './motion-detection.cap.js'\nexport {\n pipelineExecutorCapability,\n PipelineEngineChoiceSchema,\n PipelineDefaultStepSchema,\n DetectorOutputSchema,\n PipelineStepInputSchema,\n PipelineRunResultBridge,\n} from './pipeline-executor.cap.js'\nexport type { PipelineStepInputOutput } from './pipeline-executor.cap.js'\nexport { pipelineRunnerCapability, RunnerCameraConfigSchema, RunnerLocalLoadSchema, RunnerLocalMetricsSchema, MotionSourceEnum, MotionSourcesSchema, ReportMotionInputSchema, RunnerCameraDeviceUIFields } from './pipeline-runner.cap.js'\nexport type { MotionSource, MotionSources, ReportMotionInput } from './pipeline-runner.cap.js'\nexport { pipelineOrchestratorCapability, PipelineAssignmentSchema, DecoderAssignmentSchema, AgentLoadSummarySchema, GlobalMetricsSchema, CapabilityBindingsSchema } from './pipeline-orchestrator.cap.js'\nexport { OrchestratorMetricsSchema, CameraMetricsSchema, CameraMetricsWithDeviceIdSchema } from './schemas/orchestrator-metrics.js'\nexport {\n audioAnalyzerCapability,\n AUDIO_BACKEND_CHOICES,\n DEFAULT_AUDIO_ANALYZER_CONFIG,\n AudioAnalysisResultSchema,\n AudioAnalysisSettingsSchema,\n AudioClassificationResultSchema,\n} from './audio-analyzer.cap.js'\nexport type {\n IAudioAnalyzerProvider,\n AudioBackendChoice,\n AudioAnalyzerGlobalConfig,\n} from './audio-analyzer.cap.js'\nexport { audioAnalysisCapability, type IAudioAnalysisProvider } from './audio-analysis.cap.js'\nexport {\n audioCodecCapability,\n AudioCodecInfoSchema,\n AudioDecodeSessionConfigSchema,\n AudioEncodeSessionConfigSchema,\n AudioPcmChunkSchema,\n AudioEncodedChunkSchema,\n PcmSampleFormatSchema,\n type IAudioCodecCapProvider,\n} from './audio-codec.cap.js'\nexport { embeddingEncoderCapability, EmbeddingResultSchema, EmbeddingInfoSchema } from './embedding-encoder.cap.js'\n\n// ── Providers & Integrations ─────────────────────────────────────────\nexport { deviceProviderCapability, ProviderStatusSchema, DiscoveredDeviceSchema } from './device-provider.cap.js'\nexport {\n deviceManagerCapability,\n type IDeviceManagerProvider,\n DeviceInfoSchema,\n ConfigEntrySchema,\n} from './device-manager.cap.js'\nexport type { DeviceInfo } from './device-manager.cap.js'\nexport { deviceStateCapability } from './device-state.cap.js'\nexport { authProviderCapability, AuthResultSchema } from './auth-provider.cap.js'\nexport { authenticationCapability, AuthProviderInfoSchema, type IAuthenticationProvider, type AuthProviderInfo } from './authentication.cap.js'\nexport { networkAccessCapability, NetworkEndpointSchema, NetworkAccessStatusSchema } from './network-access.cap.js'\nexport { remoteAccessCapability, RemoteAccessEndpointSchema, RemoteAccessProviderInfoSchema, type IRemoteAccessOrchestrator, type RemoteAccessProviderInfo } from './remote-access.cap.js'\nexport { turnProviderCapability, TurnServerSchema } from './turn-provider.cap.js'\nexport type { ITurnProvider } from './turn-provider.cap.js'\nexport { turnOrchestratorCapability, TurnProviderInfoSchema, type ITurnOrchestratorProvider, type TurnProviderInfo } from './turn-orchestrator.cap.js'\nexport { snapshotCapability, type ISnapshotOrchestrator, SnapshotImageSchema } from './snapshot.cap.js'\nexport { snapshotProviderCapability, type ISnapshotProvider } from './snapshot-provider.cap.js'\nexport { notificationOutputCapability, NotificationSchema } from './notification-output.cap.js'\nexport { advancedNotifierCapability, NotificationRuleSchema, NotificationHistoryEntrySchema } from './advanced-notifier.cap.js'\nexport { recordingEngineCapability } from './recording-engine.cap.js'\nexport { detectionPipelineCapability, type IDetectionPipelineProvider } from './detection-pipeline.cap.js'\n// analysis-pipeline + analysis-data-persistence caps removed in P12b —\n// addon-pipeline-analytics owns post-detection refinement end-to-end\n// (Track + per-kind events + media) via its own single cap. See\n// pipeline-analytics.cap.ts. track-trail cap removed in P12a — trails\n// are `track.positions[]` on the Track schema.\nexport {\n pipelineAnalyticsCapability,\n type IPipelineAnalyticsProvider,\n type Track, type TrackState,\n type MotionEvent, type ObjectEvent, type AudioEvent,\n type MediaFile, type EventKind,\n TrackSchema, TrackStateSchema,\n MotionEventSchema, ObjectEventSchema, AudioEventSchema,\n MediaFileSchema, EventKindSchema, TrackedDetectionSchema,\n} from './pipeline-analytics.cap.js'\nexport { metricsProviderCapability, SystemMetricsSchema, type IMetricsProvider } from './metrics-provider.cap.js'\n// scene-intelligence cap removed in P12a — no provider was ever registered\n// and no admin UI/addon consumer. If scene queries come back, reintroduce\n// as part of the future embedding addon.\n\n\n// ── Device-Scoped Camera Caps ───────────────────────────────────────\nexport { ptzCapability, PtzPresetSchema, PtzPositionSchema, PtzMoveCommandSchema, type IPtzProvider } from './ptz.cap.js'\nexport {\n ptzAutotrackCapability,\n PtzAutotrackSettingsSchema,\n PtzAutotrackStatusSchema,\n PtzAutotrackTargetOptionSchema,\n PtzAutotrackRuntimeStateSchema,\n type PtzAutotrackSettings,\n type PtzAutotrackStatus,\n type PtzAutotrackTargetOption,\n type PtzAutotrackRuntimeState,\n type IPtzAutotrackProvider,\n} from './ptz-autotrack.cap.js'\nexport { eventsCapability, EventItemSchema, type IEventsProvider } from './events.cap.js'\nexport {\n zonesCapability,\n ZoneSchema,\n ZoneKindEnum,\n PolygonPointSchema,\n type Zone,\n type ZoneKind,\n type PolygonPoint,\n type IZonesProvider,\n} from './zones.cap.js'\nexport {\n ZoneRuleSchema,\n ZoneRuleModeEnum,\n ZoneRulesArraySchema,\n type ZoneRule,\n type ZoneRuleMode,\n type ZoneRules,\n} from './schemas/zone-rule.js'\nexport {\n zoneRulesCapability,\n ZoneRuleStageEnum,\n type ZoneRuleStage,\n type IZoneRulesProvider,\n} from './zone-rules.cap.js'\nexport {\n zoneAnalyticsCapability,\n HistoryResolutionEnum,\n HistoryPointSchema,\n ZoneScopeBreakdownSchema,\n PerScopeBreakdownSchema,\n type CameraOccupancySnapshot,\n type ZoneScopeBreakdown,\n type PerScopeBreakdown,\n type HistoryPoint,\n type HistoryResolution,\n type IZoneAnalyticsProvider,\n} from './zone-analytics.cap.js'\nexport {\n audioMetricsCapability,\n AudioMetricsSnapshotSchema,\n AudioClassSummarySchema,\n AudioMetricsHistoryPointSchema,\n AudioMetricsHistorySchema,\n type AudioMetricsSnapshot,\n type AudioClassSummary,\n type AudioMetricsHistoryPoint,\n type AudioMetricsHistory,\n type IAudioMetricsProvider,\n} from './audio-metrics.cap.js'\nexport { motionCapability, MotionStatusSchema, MotionOnMotionChangedDataSchema, type MotionStatus, type MotionOnMotionChangedData, type IMotionProvider } from './motion.cap.js'\nexport { recordingCapability, SegmentSchema, type IRecordingProvider } from './recording.cap.js'\nexport { deviceOpsCapability, type IDeviceOpsProvider } from './device-ops.cap.js'\nexport { batteryCapability, BatteryStatusSchema, type BatteryStatus, type IBatteryProvider } from './battery.cap.js'\nexport { deviceStatusCapability, DeviceStatusSchema, type DeviceStatus, type IDeviceStatusProvider } from './device-status.cap.js'\nexport { featureProbeCapability, FeatureProbeStatusSchema, type FeatureProbeStatus, type IFeatureProbeProvider } from './feature-probe.cap.js'\nexport { cameraCredentialsCapability, CameraCredentialsSchema, CameraCredentialsStatusSchema, type CameraCredentials, type CameraCredentialsStatus, type ICameraCredentialsProvider } from './camera-credentials.cap.js'\nexport { rebootCapability, type IRebootProvider } from './reboot.cap.js'\nexport {\n deviceDiscoveryCapability,\n DeviceDiscoveryStatusSchema,\n DiscoveredChildDeviceSchema,\n DiscoveredChildStatusSchema,\n type DeviceDiscoveryStatus,\n type DiscoveredChildDevice,\n type DiscoveredChildStatus,\n type IDeviceDiscoveryProvider,\n type IDeviceDiscoveryNativeProvider,\n} from './device-discovery.cap.js'\nexport { brightnessCapability, BrightnessStatusSchema, type BrightnessStatus, type IBrightnessProvider } from './brightness.cap.js'\nexport {\n motionTriggerCapability,\n MotionTriggerStatusSchema,\n MotionTriggerRuntimeStateSchema,\n type MotionTriggerStatus,\n type MotionTriggerRuntimeState,\n type IMotionTriggerProvider,\n} from './motion-trigger.cap.js'\nexport {\n osdCapability, OsdOverlaySchema, OsdOverlayKindEnum, OsdPositionEnum, OsdStatusSchema, OsdOverlayPatchSchema,\n type OsdOverlay, type OsdOverlayKind, type OsdPosition, type OsdStatus, type IOsdProvider,\n} from './osd.cap.js'\nexport { accessoriesCapability, AccessoriesStatusSchema, type AccessoriesStatus, type IAccessoriesProvider } from './accessories.cap.js'\nexport { switchCapability, SwitchStatusSchema, type SwitchStatus, type ISwitchProvider } from './switch.cap.js'\nexport {\n intercomCapability, IntercomAbilitySchema, IntercomStatusSchema,\n type IntercomAbility, type IntercomStatus, type IIntercomProvider,\n} from './intercom.cap.js'\nexport {\n doorbellCapability, DoorbellStatusSchema, DoorbellPressEventSchema,\n type DoorbellStatus, type DoorbellPressEvent, type IDoorbellProvider,\n} from './doorbell.cap.js'\nexport {\n nativeObjectDetectionCapability, NativeObjectClassEnum, NativeDetectionSchema, NativeObjectDetectionStatusSchema,\n type NativeObjectClass, type NativeDetection, type NativeObjectDetectionStatus, type INativeObjectDetectionProvider,\n} from './native-object-detection.cap.js'\n\n\n// ── Platform probe (per-node hardware + inference backend scoring) ─\nexport { platformProbeCapability, type IPlatformProbeProvider } from './platform-probe.cap.js'\n\n// ── Local network (hub-only host interface enumeration) ────────────\nexport {\n localNetworkCapability,\n type ILocalNetworkProvider,\n type LocalInterface,\n type ConnectionEndpoint,\n} from './local-network.cap.js'\n\n// ── Mesh networks (Tailscale / Headscale / ZeroTier) ────────────────\nexport {\n meshNetworkCapability,\n type IMeshNetworkProvider,\n type MeshEndpoint,\n type MeshPeer,\n type MeshStatus,\n} from './mesh-network.cap.js'\nexport {\n meshOrchestratorCapability,\n type IMeshOrchestrator,\n type MeshProviderInfo,\n} from './mesh-orchestrator.cap.js'\n\n\n// ── User Management ─────────────────────────────────────────────────\nexport { userManagementCapability, type IUserManagementProvider } from './user-management.cap.js'\n\n// ── Core/Server Caps (Phase E — formerly hand-written core routers) ─\nexport {\n systemCapability, type ISystemProvider,\n FeatureManifestSchema, HealthStatusSchema, NetworkAddressSchema,\n} from './system.cap.js'\nexport {\n networkQualityCapability, type INetworkQualityProvider,\n StreamNetworkStatsSchema, ClientNetworkStatsSchema, DeviceNetworkStatsSchema,\n} from './network-quality.cap.js'\nexport { toastCapability, type IToastProvider, ToastSchema } from './toast.cap.js'\nexport {\n nodesCapability, type INodesProvider,\n TopologyNodeSchema, TopologyProcessSchema, TopologyServiceSchema,\n ClusterAddonStatusEntrySchema, ClusterAddonNodeDeploymentSchema,\n} from './nodes.cap.js'\nexport {\n integrationsCapability, type IIntegrationsProvider,\n IntegrationWithStateSchema, IntegrationLiteSchema,\n AvailableIntegrationTypeSchema, TestConnectionResultSchema,\n CreateIntegrationInputSchema, UpdateIntegrationInputSchema,\n DeleteIntegrationResultSchema,\n} from './integrations.cap.js'\nexport {\n addonsCapability, type IAddonsProvider,\n AddonListItemSchema, InstalledPackageSchema, PackageUpdateSchema,\n PackageVersionInfoSchema, SearchResultSchema, AutoUpdateSettingsSchema,\n AddonAutoUpdateSchema, LogStreamEntrySchema, CustomActionInputSchema,\n} from './addons.cap.js'\nexport {\n UserSummarySchema, CreateUserInputSchema, UpdateUserInputSchema,\n ApiKeySummarySchema, CreateApiKeyInputSchema, CreateApiKeyResultSchema,\n ScopedTokenSummarySchema, CreateScopedTokenInputSchema, CreateScopedTokenResultSchema,\n} from './user-management.cap.js'\n\n// ── Strongly-typed readiness registry ───────────────────────────────\n//\n// `CapabilityName` is the exhaustive union of every registered capability's\n// `.name` literal. Passing it to `IReadinessRegistry<CapabilityName>` means\n// the compiler rejects any unknown string (e.g. a stale 'detection-pipeline'\n// instead of 'pipeline-executor') at call sites.\nimport type { addonSettingsCapability } from './addon-settings.cap.js'\nimport type { alertsCapability } from './alerts.cap.js'\nimport type { storageCapability } from './storage.cap.js'\nimport type { storageProviderCapability } from './storage-provider.cap.js'\nimport type { backupCapability } from './backup.cap.js'\nimport type { settingsStoreCapability } from './settings-store.cap.js'\nimport type { logDestinationCapability } from './log-destination.cap.js'\nimport type { adminUiCapability } from './admin-ui.cap.js'\nimport type { addonPagesCapability } from './addon-pages.cap.js'\nimport type { addonPagesSourceCapability } from './addon-pages-source.cap.js'\nimport type { addonWidgetsCapability } from './addon-widgets.cap.js'\nimport type { addonWidgetsSourceCapability } from './addon-widgets-source.cap.js'\nimport type { addonRoutesCapability } from './addon-routes.cap.js'\nimport type { streamBrokerCapability } from './stream-broker.cap.js'\nimport type { decoderCapability } from './decoder.cap.js'\nimport type { restreamerCapability } from './restreamer.cap.js'\nimport type { webrtcCapability } from './webrtc.cap.js'\nimport type { webrtcSessionCapability } from './webrtc-session.cap.js'\nimport type { cameraStreamsCapability } from './camera-streams.cap.js'\nimport type { streamingEngineCapability } from './streaming-engine.cap.js'\nimport type { motionDetectionCapability } from './motion-detection.cap.js'\nimport type { pipelineExecutorCapability } from './pipeline-executor.cap.js'\nimport type { detectionPipelineCapability } from './detection-pipeline.cap.js'\nimport type { pipelineRunnerCapability } from './pipeline-runner.cap.js'\nimport type { pipelineOrchestratorCapability } from './pipeline-orchestrator.cap.js'\nimport type { audioAnalyzerCapability } from './audio-analyzer.cap.js'\nimport type { audioAnalysisCapability } from './audio-analysis.cap.js'\nimport type { audioCodecCapability } from './audio-codec.cap.js'\nimport type { embeddingEncoderCapability } from './embedding-encoder.cap.js'\nimport type { deviceProviderCapability } from './device-provider.cap.js'\nimport type { deviceManagerCapability } from './device-manager.cap.js'\nimport type { deviceStateCapability } from './device-state.cap.js'\nimport type { authProviderCapability } from './auth-provider.cap.js'\nimport type { authenticationCapability } from './authentication.cap.js'\nimport type { networkAccessCapability } from './network-access.cap.js'\nimport type { remoteAccessCapability } from './remote-access.cap.js'\nimport type { turnProviderCapability } from './turn-provider.cap.js'\nimport type { turnOrchestratorCapability } from './turn-orchestrator.cap.js'\nimport type { snapshotCapability } from './snapshot.cap.js'\nimport type { snapshotProviderCapability } from './snapshot-provider.cap.js'\nimport type { notificationOutputCapability } from './notification-output.cap.js'\nimport type { advancedNotifierCapability } from './advanced-notifier.cap.js'\nimport type { recordingEngineCapability } from './recording-engine.cap.js'\nimport type { pipelineAnalyticsCapability } from './pipeline-analytics.cap.js'\nimport type { metricsProviderCapability } from './metrics-provider.cap.js'\nimport type { ptzCapability } from './ptz.cap.js'\nimport type { ptzAutotrackCapability } from './ptz-autotrack.cap.js'\nimport type { rebootCapability } from './reboot.cap.js'\nimport type { deviceDiscoveryCapability } from './device-discovery.cap.js'\nimport type { brightnessCapability } from './brightness.cap.js'\nimport type { motionTriggerCapability } from './motion-trigger.cap.js'\nimport type { eventsCapability } from './events.cap.js'\nimport type { zonesCapability } from './zones.cap.js'\nimport type { zoneRulesCapability } from './zone-rules.cap.js'\nimport type { zoneAnalyticsCapability } from './zone-analytics.cap.js'\nimport type { audioMetricsCapability } from './audio-metrics.cap.js'\nimport type { motionCapability } from './motion.cap.js'\nimport type { recordingCapability } from './recording.cap.js'\nimport type { deviceOpsCapability } from './device-ops.cap.js'\nimport type { platformProbeCapability } from './platform-probe.cap.js'\nimport type { localNetworkCapability } from './local-network.cap.js'\nimport type { meshNetworkCapability } from './mesh-network.cap.js'\nimport type { meshOrchestratorCapability } from './mesh-orchestrator.cap.js'\nimport type { userManagementCapability } from './user-management.cap.js'\nimport type { systemCapability } from './system.cap.js'\nimport type { networkQualityCapability } from './network-quality.cap.js'\nimport type { toastCapability } from './toast.cap.js'\nimport type { nodesCapability } from './nodes.cap.js'\nimport type { integrationsCapability } from './integrations.cap.js'\nimport type { addonsCapability } from './addons.cap.js'\nimport type { IReadinessRegistry } from '../interfaces/readiness.js'\n\ntype AnyCapability =\n | typeof addonSettingsCapability\n | typeof alertsCapability\n | typeof storageCapability\n | typeof storageProviderCapability\n | typeof backupCapability\n | typeof settingsStoreCapability\n | typeof logDestinationCapability\n | typeof adminUiCapability\n | typeof addonPagesCapability\n | typeof addonPagesSourceCapability\n | typeof addonWidgetsCapability\n | typeof addonWidgetsSourceCapability\n | typeof addonRoutesCapability\n | typeof streamBrokerCapability\n | typeof decoderCapability\n | typeof restreamerCapability\n | typeof webrtcCapability\n | typeof webrtcSessionCapability\n | typeof cameraStreamsCapability\n | typeof streamingEngineCapability\n | typeof motionDetectionCapability\n | typeof pipelineExecutorCapability\n | typeof detectionPipelineCapability\n | typeof pipelineRunnerCapability\n | typeof pipelineOrchestratorCapability\n | typeof audioAnalyzerCapability\n | typeof audioAnalysisCapability\n | typeof audioCodecCapability\n | typeof embeddingEncoderCapability\n | typeof deviceProviderCapability\n | typeof deviceManagerCapability\n | typeof deviceStateCapability\n | typeof authProviderCapability\n | typeof authenticationCapability\n | typeof networkAccessCapability\n | typeof remoteAccessCapability\n | typeof turnProviderCapability\n | typeof turnOrchestratorCapability\n | typeof snapshotCapability\n | typeof snapshotProviderCapability\n | typeof notificationOutputCapability\n | typeof advancedNotifierCapability\n | typeof recordingEngineCapability\n | typeof pipelineAnalyticsCapability\n | typeof metricsProviderCapability\n | typeof ptzCapability\n | typeof ptzAutotrackCapability\n | typeof rebootCapability\n | typeof deviceDiscoveryCapability\n | typeof brightnessCapability\n | typeof motionTriggerCapability\n | typeof eventsCapability\n | typeof zonesCapability\n | typeof zoneRulesCapability\n | typeof zoneAnalyticsCapability\n | typeof audioMetricsCapability\n | typeof motionCapability\n | typeof recordingCapability\n | typeof deviceOpsCapability\n | typeof platformProbeCapability\n | typeof localNetworkCapability\n | typeof meshNetworkCapability\n | typeof meshOrchestratorCapability\n | typeof userManagementCapability\n | typeof systemCapability\n | typeof networkQualityCapability\n | typeof toastCapability\n | typeof nodesCapability\n | typeof integrationsCapability\n | typeof addonsCapability\n\nexport type CapabilityName = AnyCapability['name']\n\nexport type ITypedReadinessRegistry = IReadinessRegistry<CapabilityName>\n"],"names":["DeviceType","DeviceFeature","ChargingStatus","DeviceRole","Feature","StreamSourceEntrySchema","ModelFormatSchema","PipelineTemplateSchema","LogLevelSchema","AddonPageDeclarationSchema","ConfigEntrySchema","MeshEndpointSchema"],"mappings":"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"}
|