@camstack/addon-pipeline-orchestrator 0.1.27 → 0.2.0
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/_stub.js +982 -1057
- package/dist/_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-BujnAycE.mjs +186 -0
- package/dist/_virtual_mf___mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DTMQMZQR.mjs +26 -0
- package/dist/_virtual_mf___mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CnELcfi3.mjs +26 -0
- package/dist/_virtual_mf___mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-BiLBDmU5.mjs +26 -0
- package/dist/_virtual_mf___mfe_internal__addon_pipeline_orchestrator_widgets__loadShare__react__loadShare__.js-CBokMOYQ.mjs +26 -0
- package/dist/_virtual_mf___mfe_internal__addon_pipeline_orchestrator_widgets__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-yD-rMaFX.mjs +26 -0
- package/dist/dist-CYZr2fwk.mjs +2726 -0
- package/dist/hostInit-DQm6ksLo.mjs +147 -0
- package/dist/index.js +25596 -18552
- package/dist/index.mjs +25592 -18556
- package/dist/remoteEntry.js +134 -2973
- package/dist/remoteEntry.ssr.js +33 -0
- package/dist/virtualExposes-Bv3e5bey.mjs +27 -0
- package/dist/virtual_mf-exposes-ssr___mfe_internal__addon_pipeline_orchestrator_widgets__remoteEntry_js-DGpOm1yU.mjs +10 -0
- package/package.json +8 -9
- package/dist/@mf-types/compiled-types/widgets/PipelineQuickStats.d.ts +0 -3
- package/dist/@mf-types/compiled-types/widgets/PipelineQuickStats.d.ts.map +0 -1
- package/dist/@mf-types/compiled-types/widgets/ZoneEditor.d.ts +0 -17
- package/dist/@mf-types/compiled-types/widgets/ZoneEditor.d.ts.map +0 -1
- package/dist/@mf-types/compiled-types/widgets/ZonesTab.d.ts +0 -7
- package/dist/@mf-types/compiled-types/widgets/ZonesTab.d.ts.map +0 -1
- package/dist/@mf-types/compiled-types/widgets/index.d.ts +0 -13
- package/dist/@mf-types/compiled-types/widgets/index.d.ts.map +0 -1
- package/dist/@mf-types/compiled-types/widgets/zone-editor/ZoneForm.d.ts +0 -23
- package/dist/@mf-types/compiled-types/widgets/zone-editor/ZoneForm.d.ts.map +0 -1
- package/dist/@mf-types/compiled-types/widgets/zone-editor/ZoneList.d.ts +0 -15
- package/dist/@mf-types/compiled-types/widgets/zone-editor/ZoneList.d.ts.map +0 -1
- package/dist/@mf-types/compiled-types/widgets/zone-editor/ZoneOverlay.d.ts +0 -19
- package/dist/@mf-types/compiled-types/widgets/zone-editor/ZoneOverlay.d.ts.map +0 -1
- package/dist/@mf-types/compiled-types/widgets/zone-editor/ZoneRulesEditor.d.ts +0 -9
- package/dist/@mf-types/compiled-types/widgets/zone-editor/ZoneRulesEditor.d.ts.map +0 -1
- package/dist/@mf-types/compiled-types/widgets/zone-editor/types.d.ts +0 -33
- package/dist/@mf-types/compiled-types/widgets/zone-editor/types.d.ts.map +0 -1
- package/dist/@mf-types/widgets.d.ts +0 -2
- package/dist/@mf-types.d.ts +0 -3
- package/dist/@mf-types.zip +0 -0
- package/dist/ReactKonva-BpqYt5jc.mjs +0 -7267
- package/dist/_CoreInternals-B7PHssO3.mjs +0 -3808
- package/dist/__mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_camstack_mf_1_sdk__loadShare__.mjs-h5aXOPSA.mjs +0 -12
- package/dist/__mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.mjs-CP1zJ0aB.mjs +0 -20
- package/dist/__mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.mjs-B1VWqPID.mjs +0 -35
- package/dist/__mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.mjs-DoWbefqS.mjs +0 -104
- package/dist/__mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_trpc_mf_1_client__loadShare__.mjs-D4eEXltm.mjs +0 -85
- package/dist/__mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_trpc_mf_1_react_mf_2_query__loadShare__.mjs-CVrnrGED.mjs +0 -62
- package/dist/__mfe_internal__addon_pipeline_orchestrator_widgets__loadShare__konva__loadShare__.mjs-C4PYo-VP.mjs +0 -30
- package/dist/__mfe_internal__addon_pipeline_orchestrator_widgets__loadShare__react__loadShare__.mjs-ZXZUECVq.mjs +0 -88
- package/dist/__mfe_internal__addon_pipeline_orchestrator_widgets__loadShare__react__loadShare__.mjs_commonjs-proxy-WhBt7NtJ.mjs +0 -29
- package/dist/__mfe_internal__addon_pipeline_orchestrator_widgets__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.mjs-Cg6QsnjR.mjs +0 -36
- package/dist/__mfe_internal__addon_pipeline_orchestrator_widgets__loadShare__react_mf_2_dom__loadShare__.mjs-Dp8hqYOB.mjs +0 -45
- package/dist/__mfe_internal__addon_pipeline_orchestrator_widgets__loadShare__react_mf_2_dom__loadShare__.mjs_commonjs-proxy-DF7SvkCe.mjs +0 -6
- package/dist/__mfe_internal__addon_pipeline_orchestrator_widgets__loadShare__react_mf_2_dom_mf_1_client__loadShare__.mjs-BBmNf5hf.mjs +0 -34
- package/dist/__mfe_internal__addon_pipeline_orchestrator_widgets__loadShare__react_mf_2_konva__loadShare__.mjs-BjxkVuVo.mjs +0 -65
- package/dist/_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-zq9nTFza.mjs +0 -186
- package/dist/client-BOhSywdX.mjs +0 -9836
- package/dist/getErrorShape-BPSzUA7W-TlK8ipWe.mjs +0 -211
- package/dist/hostInit-Cn3hiNRr.mjs +0 -196
- package/dist/index-3tmcVweY.mjs +0 -435
- package/dist/index-Bx39JFVr.mjs +0 -2603
- package/dist/index-C52WDzRJ.mjs +0 -3842
- package/dist/index-CWkKuNLr.mjs +0 -232
- package/dist/index-C_khSbT0.mjs +0 -1655
- package/dist/index-D4m79gq7.mjs +0 -185
- package/dist/index-D_QOQy3W.mjs +0 -22990
- package/dist/index-Dy2V7VOm.mjs +0 -14379
- package/dist/index-kp_mtnZv.mjs +0 -725
- package/dist/index-xncRG7-x.mjs +0 -2713
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/jsx-runtime-ChcQDQxt.mjs +0 -55
- package/dist/schemas-ClCuS4qa.mjs +0 -3594
- package/dist/virtualExposes-8FzWTdq3.mjs +0 -42
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../node_modules/zod/v4/core/core.js","../../../node_modules/zod/v4/core/util.js","../../../node_modules/zod/v4/core/errors.js","../../../node_modules/zod/v4/core/parse.js","../../../node_modules/zod/v4/core/regexes.js","../../../node_modules/zod/v4/core/checks.js","../../../node_modules/zod/v4/core/doc.js","../../../node_modules/zod/v4/core/versions.js","../../../node_modules/zod/v4/core/schemas.js","../../../node_modules/zod/v4/core/registries.js","../../../node_modules/zod/v4/core/api.js","../../../node_modules/zod/v4/core/to-json-schema.js","../../../node_modules/zod/v4/core/json-schema-processors.js","../../../node_modules/zod/v4/classic/iso.js","../../../node_modules/zod/v4/classic/errors.js","../../../node_modules/zod/v4/classic/parse.js","../../../node_modules/zod/v4/classic/schemas.js","../../types/dist/index-C2zzIDdX.mjs","../../types/dist/index.mjs","../src/pipeline-resolver.ts","../src/zones-provider.ts","../src/zone-rules-provider.ts","../src/load-balancer.ts","../src/audio-load-balancer.ts","../src/audio-chunk-poller.ts","../src/dispatch-reconcile.ts","../src/index.ts"],"sourcesContent":["var _a;\n/** A special constant with type `never` */\nexport const NEVER = /*@__PURE__*/ Object.freeze({\n status: \"aborted\",\n});\nexport /*@__NO_SIDE_EFFECTS__*/ function $constructor(name, initializer, params) {\n function init(inst, def) {\n if (!inst._zod) {\n Object.defineProperty(inst, \"_zod\", {\n value: {\n def,\n constr: _,\n traits: new Set(),\n },\n enumerable: false,\n });\n }\n if (inst._zod.traits.has(name)) {\n return;\n }\n inst._zod.traits.add(name);\n initializer(inst, def);\n // support prototype modifications\n const proto = _.prototype;\n const keys = Object.keys(proto);\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i];\n if (!(k in inst)) {\n inst[k] = proto[k].bind(inst);\n }\n }\n }\n // doesn't work if Parent has a constructor with arguments\n const Parent = params?.Parent ?? Object;\n class Definition extends Parent {\n }\n Object.defineProperty(Definition, \"name\", { value: name });\n function _(def) {\n var _a;\n const inst = params?.Parent ? new Definition() : this;\n init(inst, def);\n (_a = inst._zod).deferred ?? (_a.deferred = []);\n for (const fn of inst._zod.deferred) {\n fn();\n }\n return inst;\n }\n Object.defineProperty(_, \"init\", { value: init });\n Object.defineProperty(_, Symbol.hasInstance, {\n value: (inst) => {\n if (params?.Parent && inst instanceof params.Parent)\n return true;\n return inst?._zod?.traits?.has(name);\n },\n });\n Object.defineProperty(_, \"name\", { value: name });\n return _;\n}\n////////////////////////////// UTILITIES ///////////////////////////////////////\nexport const $brand = Symbol(\"zod_brand\");\nexport class $ZodAsyncError extends Error {\n constructor() {\n super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`);\n }\n}\nexport class $ZodEncodeError extends Error {\n constructor(name) {\n super(`Encountered unidirectional transform during encode: ${name}`);\n this.name = \"ZodEncodeError\";\n }\n}\n(_a = globalThis).__zod_globalConfig ?? (_a.__zod_globalConfig = {});\nexport const globalConfig = globalThis.__zod_globalConfig;\nexport function config(newConfig) {\n if (newConfig)\n Object.assign(globalConfig, newConfig);\n return globalConfig;\n}\n","import { globalConfig } from \"./core.js\";\n// functions\nexport function assertEqual(val) {\n return val;\n}\nexport function assertNotEqual(val) {\n return val;\n}\nexport function assertIs(_arg) { }\nexport function assertNever(_x) {\n throw new Error(\"Unexpected value in exhaustive check\");\n}\nexport function assert(_) { }\nexport function getEnumValues(entries) {\n const numericValues = Object.values(entries).filter((v) => typeof v === \"number\");\n const values = Object.entries(entries)\n .filter(([k, _]) => numericValues.indexOf(+k) === -1)\n .map(([_, v]) => v);\n return values;\n}\nexport function joinValues(array, separator = \"|\") {\n return array.map((val) => stringifyPrimitive(val)).join(separator);\n}\nexport function jsonStringifyReplacer(_, value) {\n if (typeof value === \"bigint\")\n return value.toString();\n return value;\n}\nexport function cached(getter) {\n const set = false;\n return {\n get value() {\n if (!set) {\n const value = getter();\n Object.defineProperty(this, \"value\", { value });\n return value;\n }\n throw new Error(\"cached value already set\");\n },\n };\n}\nexport function nullish(input) {\n return input === null || input === undefined;\n}\nexport function cleanRegex(source) {\n const start = source.startsWith(\"^\") ? 1 : 0;\n const end = source.endsWith(\"$\") ? source.length - 1 : source.length;\n return source.slice(start, end);\n}\nexport function floatSafeRemainder(val, step) {\n const ratio = val / step;\n const roundedRatio = Math.round(ratio);\n // Use a relative epsilon scaled to the magnitude of the result\n const tolerance = Number.EPSILON * Math.max(Math.abs(ratio), 1);\n if (Math.abs(ratio - roundedRatio) < tolerance)\n return 0;\n return ratio - roundedRatio;\n}\nconst EVALUATING = /* @__PURE__*/ Symbol(\"evaluating\");\nexport function defineLazy(object, key, getter) {\n let value = undefined;\n Object.defineProperty(object, key, {\n get() {\n if (value === EVALUATING) {\n // Circular reference detected, return undefined to break the cycle\n return undefined;\n }\n if (value === undefined) {\n value = EVALUATING;\n value = getter();\n }\n return value;\n },\n set(v) {\n Object.defineProperty(object, key, {\n value: v,\n // configurable: true,\n });\n // object[key] = v;\n },\n configurable: true,\n });\n}\nexport function objectClone(obj) {\n return Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));\n}\nexport function assignProp(target, prop, value) {\n Object.defineProperty(target, prop, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n}\nexport function mergeDefs(...defs) {\n const mergedDescriptors = {};\n for (const def of defs) {\n const descriptors = Object.getOwnPropertyDescriptors(def);\n Object.assign(mergedDescriptors, descriptors);\n }\n return Object.defineProperties({}, mergedDescriptors);\n}\nexport function cloneDef(schema) {\n return mergeDefs(schema._zod.def);\n}\nexport function getElementAtPath(obj, path) {\n if (!path)\n return obj;\n return path.reduce((acc, key) => acc?.[key], obj);\n}\nexport function promiseAllObject(promisesObj) {\n const keys = Object.keys(promisesObj);\n const promises = keys.map((key) => promisesObj[key]);\n return Promise.all(promises).then((results) => {\n const resolvedObj = {};\n for (let i = 0; i < keys.length; i++) {\n resolvedObj[keys[i]] = results[i];\n }\n return resolvedObj;\n });\n}\nexport function randomString(length = 10) {\n const chars = \"abcdefghijklmnopqrstuvwxyz\";\n let str = \"\";\n for (let i = 0; i < length; i++) {\n str += chars[Math.floor(Math.random() * chars.length)];\n }\n return str;\n}\nexport function esc(str) {\n return JSON.stringify(str);\n}\nexport function slugify(input) {\n return input\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/[\\s_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\nexport const captureStackTrace = (\"captureStackTrace\" in Error ? Error.captureStackTrace : (..._args) => { });\nexport function isObject(data) {\n return typeof data === \"object\" && data !== null && !Array.isArray(data);\n}\nexport const allowsEval = /* @__PURE__*/ cached(() => {\n // Skip the probe under `jitless`: strict CSPs report the caught `new Function`\n // as a `securitypolicyviolation` even though the throw is swallowed.\n if (globalConfig.jitless) {\n return false;\n }\n // @ts-ignore\n if (typeof navigator !== \"undefined\" && navigator?.userAgent?.includes(\"Cloudflare\")) {\n return false;\n }\n try {\n const F = Function;\n new F(\"\");\n return true;\n }\n catch (_) {\n return false;\n }\n});\nexport function isPlainObject(o) {\n if (isObject(o) === false)\n return false;\n // modified constructor\n const ctor = o.constructor;\n if (ctor === undefined)\n return true;\n if (typeof ctor !== \"function\")\n return true;\n // modified prototype\n const prot = ctor.prototype;\n if (isObject(prot) === false)\n return false;\n // ctor doesn't have static `isPrototypeOf`\n if (Object.prototype.hasOwnProperty.call(prot, \"isPrototypeOf\") === false) {\n return false;\n }\n return true;\n}\nexport function shallowClone(o) {\n if (isPlainObject(o))\n return { ...o };\n if (Array.isArray(o))\n return [...o];\n if (o instanceof Map)\n return new Map(o);\n if (o instanceof Set)\n return new Set(o);\n return o;\n}\nexport function numKeys(data) {\n let keyCount = 0;\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n keyCount++;\n }\n }\n return keyCount;\n}\nexport const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return \"undefined\";\n case \"string\":\n return \"string\";\n case \"number\":\n return Number.isNaN(data) ? \"nan\" : \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"function\":\n return \"function\";\n case \"bigint\":\n return \"bigint\";\n case \"symbol\":\n return \"symbol\";\n case \"object\":\n if (Array.isArray(data)) {\n return \"array\";\n }\n if (data === null) {\n return \"null\";\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return \"promise\";\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return \"map\";\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return \"set\";\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return \"date\";\n }\n // @ts-ignore\n if (typeof File !== \"undefined\" && data instanceof File) {\n return \"file\";\n }\n return \"object\";\n default:\n throw new Error(`Unknown data type: ${t}`);\n }\n};\nexport const propertyKeyTypes = /* @__PURE__*/ new Set([\"string\", \"number\", \"symbol\"]);\nexport const primitiveTypes = /* @__PURE__*/ new Set([\n \"string\",\n \"number\",\n \"bigint\",\n \"boolean\",\n \"symbol\",\n \"undefined\",\n]);\nexport function escapeRegex(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n// zod-specific utils\nexport function clone(inst, def, params) {\n const cl = new inst._zod.constr(def ?? inst._zod.def);\n if (!def || params?.parent)\n cl._zod.parent = inst;\n return cl;\n}\nexport function normalizeParams(_params) {\n const params = _params;\n if (!params)\n return {};\n if (typeof params === \"string\")\n return { error: () => params };\n if (params?.message !== undefined) {\n if (params?.error !== undefined)\n throw new Error(\"Cannot specify both `message` and `error` params\");\n params.error = params.message;\n }\n delete params.message;\n if (typeof params.error === \"string\")\n return { ...params, error: () => params.error };\n return params;\n}\nexport function createTransparentProxy(getter) {\n let target;\n return new Proxy({}, {\n get(_, prop, receiver) {\n target ?? (target = getter());\n return Reflect.get(target, prop, receiver);\n },\n set(_, prop, value, receiver) {\n target ?? (target = getter());\n return Reflect.set(target, prop, value, receiver);\n },\n has(_, prop) {\n target ?? (target = getter());\n return Reflect.has(target, prop);\n },\n deleteProperty(_, prop) {\n target ?? (target = getter());\n return Reflect.deleteProperty(target, prop);\n },\n ownKeys(_) {\n target ?? (target = getter());\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(_, prop) {\n target ?? (target = getter());\n return Reflect.getOwnPropertyDescriptor(target, prop);\n },\n defineProperty(_, prop, descriptor) {\n target ?? (target = getter());\n return Reflect.defineProperty(target, prop, descriptor);\n },\n });\n}\nexport function stringifyPrimitive(value) {\n if (typeof value === \"bigint\")\n return value.toString() + \"n\";\n if (typeof value === \"string\")\n return `\"${value}\"`;\n return `${value}`;\n}\nexport function optionalKeys(shape) {\n return Object.keys(shape).filter((k) => {\n return shape[k]._zod.optin === \"optional\" && shape[k]._zod.optout === \"optional\";\n });\n}\nexport const NUMBER_FORMAT_RANGES = {\n safeint: [Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER],\n int32: [-2147483648, 2147483647],\n uint32: [0, 4294967295],\n float32: [-3.4028234663852886e38, 3.4028234663852886e38],\n float64: [-Number.MAX_VALUE, Number.MAX_VALUE],\n};\nexport const BIGINT_FORMAT_RANGES = {\n int64: [/* @__PURE__*/ BigInt(\"-9223372036854775808\"), /* @__PURE__*/ BigInt(\"9223372036854775807\")],\n uint64: [/* @__PURE__*/ BigInt(0), /* @__PURE__*/ BigInt(\"18446744073709551615\")],\n};\nexport function pick(schema, mask) {\n const currDef = schema._zod.def;\n const checks = currDef.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n throw new Error(\".pick() cannot be used on object schemas containing refinements\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const newShape = {};\n for (const key in mask) {\n if (!(key in currDef.shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n newShape[key] = currDef.shape[key];\n }\n assignProp(this, \"shape\", newShape); // self-caching\n return newShape;\n },\n checks: [],\n });\n return clone(schema, def);\n}\nexport function omit(schema, mask) {\n const currDef = schema._zod.def;\n const checks = currDef.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n throw new Error(\".omit() cannot be used on object schemas containing refinements\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const newShape = { ...schema._zod.def.shape };\n for (const key in mask) {\n if (!(key in currDef.shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n delete newShape[key];\n }\n assignProp(this, \"shape\", newShape); // self-caching\n return newShape;\n },\n checks: [],\n });\n return clone(schema, def);\n}\nexport function extend(schema, shape) {\n if (!isPlainObject(shape)) {\n throw new Error(\"Invalid input to extend: expected a plain object\");\n }\n const checks = schema._zod.def.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n // Only throw if new shape overlaps with existing shape\n // Use getOwnPropertyDescriptor to check key existence without accessing values\n const existingShape = schema._zod.def.shape;\n for (const key in shape) {\n if (Object.getOwnPropertyDescriptor(existingShape, key) !== undefined) {\n throw new Error(\"Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.\");\n }\n }\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const _shape = { ...schema._zod.def.shape, ...shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n });\n return clone(schema, def);\n}\nexport function safeExtend(schema, shape) {\n if (!isPlainObject(shape)) {\n throw new Error(\"Invalid input to safeExtend: expected a plain object\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const _shape = { ...schema._zod.def.shape, ...shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n });\n return clone(schema, def);\n}\nexport function merge(a, b) {\n if (a._zod.def.checks?.length) {\n throw new Error(\".merge() cannot be used on object schemas containing refinements. Use .safeExtend() instead.\");\n }\n const def = mergeDefs(a._zod.def, {\n get shape() {\n const _shape = { ...a._zod.def.shape, ...b._zod.def.shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n get catchall() {\n return b._zod.def.catchall;\n },\n checks: b._zod.def.checks ?? [],\n });\n return clone(a, def);\n}\nexport function partial(Class, schema, mask) {\n const currDef = schema._zod.def;\n const checks = currDef.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n throw new Error(\".partial() cannot be used on object schemas containing refinements\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const oldShape = schema._zod.def.shape;\n const shape = { ...oldShape };\n if (mask) {\n for (const key in mask) {\n if (!(key in oldShape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n // if (oldShape[key]!._zod.optin === \"optional\") continue;\n shape[key] = Class\n ? new Class({\n type: \"optional\",\n innerType: oldShape[key],\n })\n : oldShape[key];\n }\n }\n else {\n for (const key in oldShape) {\n // if (oldShape[key]!._zod.optin === \"optional\") continue;\n shape[key] = Class\n ? new Class({\n type: \"optional\",\n innerType: oldShape[key],\n })\n : oldShape[key];\n }\n }\n assignProp(this, \"shape\", shape); // self-caching\n return shape;\n },\n checks: [],\n });\n return clone(schema, def);\n}\nexport function required(Class, schema, mask) {\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const oldShape = schema._zod.def.shape;\n const shape = { ...oldShape };\n if (mask) {\n for (const key in mask) {\n if (!(key in shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n // overwrite with non-optional\n shape[key] = new Class({\n type: \"nonoptional\",\n innerType: oldShape[key],\n });\n }\n }\n else {\n for (const key in oldShape) {\n // overwrite with non-optional\n shape[key] = new Class({\n type: \"nonoptional\",\n innerType: oldShape[key],\n });\n }\n }\n assignProp(this, \"shape\", shape); // self-caching\n return shape;\n },\n });\n return clone(schema, def);\n}\n// invalid_type | too_big | too_small | invalid_format | not_multiple_of | unrecognized_keys | invalid_union | invalid_key | invalid_element | invalid_value | custom\nexport function aborted(x, startIndex = 0) {\n if (x.aborted === true)\n return true;\n for (let i = startIndex; i < x.issues.length; i++) {\n if (x.issues[i]?.continue !== true) {\n return true;\n }\n }\n return false;\n}\n// Checks for explicit abort (continue === false), as opposed to implicit abort (continue === undefined).\n// Used to respect `abort: true` in .refine() even for checks that have a `when` function.\nexport function explicitlyAborted(x, startIndex = 0) {\n if (x.aborted === true)\n return true;\n for (let i = startIndex; i < x.issues.length; i++) {\n if (x.issues[i]?.continue === false) {\n return true;\n }\n }\n return false;\n}\nexport function prefixIssues(path, issues) {\n return issues.map((iss) => {\n var _a;\n (_a = iss).path ?? (_a.path = []);\n iss.path.unshift(path);\n return iss;\n });\n}\nexport function unwrapMessage(message) {\n return typeof message === \"string\" ? message : message?.message;\n}\nexport function finalizeIssue(iss, ctx, config) {\n const message = iss.message\n ? iss.message\n : (unwrapMessage(iss.inst?._zod.def?.error?.(iss)) ??\n unwrapMessage(ctx?.error?.(iss)) ??\n unwrapMessage(config.customError?.(iss)) ??\n unwrapMessage(config.localeError?.(iss)) ??\n \"Invalid input\");\n const { inst: _inst, continue: _continue, input: _input, ...rest } = iss;\n rest.path ?? (rest.path = []);\n rest.message = message;\n if (ctx?.reportInput) {\n rest.input = _input;\n }\n return rest;\n}\nexport function getSizableOrigin(input) {\n if (input instanceof Set)\n return \"set\";\n if (input instanceof Map)\n return \"map\";\n // @ts-ignore\n if (input instanceof File)\n return \"file\";\n return \"unknown\";\n}\nexport function getLengthableOrigin(input) {\n if (Array.isArray(input))\n return \"array\";\n if (typeof input === \"string\")\n return \"string\";\n return \"unknown\";\n}\nexport function parsedType(data) {\n const t = typeof data;\n switch (t) {\n case \"number\": {\n return Number.isNaN(data) ? \"nan\" : \"number\";\n }\n case \"object\": {\n if (data === null) {\n return \"null\";\n }\n if (Array.isArray(data)) {\n return \"array\";\n }\n const obj = data;\n if (obj && Object.getPrototypeOf(obj) !== Object.prototype && \"constructor\" in obj && obj.constructor) {\n return obj.constructor.name;\n }\n }\n }\n return t;\n}\nexport function issue(...args) {\n const [iss, input, inst] = args;\n if (typeof iss === \"string\") {\n return {\n message: iss,\n code: \"custom\",\n input,\n inst,\n };\n }\n return { ...iss };\n}\nexport function cleanEnum(obj) {\n return Object.entries(obj)\n .filter(([k, _]) => {\n // return true if NaN, meaning it's not a number, thus a string key\n return Number.isNaN(Number.parseInt(k, 10));\n })\n .map((el) => el[1]);\n}\n// Codec utility functions\nexport function base64ToUint8Array(base64) {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\nexport function uint8ArrayToBase64(bytes) {\n let binaryString = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binaryString += String.fromCharCode(bytes[i]);\n }\n return btoa(binaryString);\n}\nexport function base64urlToUint8Array(base64url) {\n const base64 = base64url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padding = \"=\".repeat((4 - (base64.length % 4)) % 4);\n return base64ToUint8Array(base64 + padding);\n}\nexport function uint8ArrayToBase64url(bytes) {\n return uint8ArrayToBase64(bytes).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=/g, \"\");\n}\nexport function hexToUint8Array(hex) {\n const cleanHex = hex.replace(/^0x/, \"\");\n if (cleanHex.length % 2 !== 0) {\n throw new Error(\"Invalid hex string length\");\n }\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < cleanHex.length; i += 2) {\n bytes[i / 2] = Number.parseInt(cleanHex.slice(i, i + 2), 16);\n }\n return bytes;\n}\nexport function uint8ArrayToHex(bytes) {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n// instanceof\nexport class Class {\n constructor(..._args) { }\n}\n","import { $constructor } from \"./core.js\";\nimport * as util from \"./util.js\";\nconst initializer = (inst, def) => {\n inst.name = \"$ZodError\";\n Object.defineProperty(inst, \"_zod\", {\n value: inst._zod,\n enumerable: false,\n });\n Object.defineProperty(inst, \"issues\", {\n value: def,\n enumerable: false,\n });\n inst.message = JSON.stringify(def, util.jsonStringifyReplacer, 2);\n Object.defineProperty(inst, \"toString\", {\n value: () => inst.message,\n enumerable: false,\n });\n};\nexport const $ZodError = $constructor(\"$ZodError\", initializer);\nexport const $ZodRealError = $constructor(\"$ZodError\", initializer, { Parent: Error });\nexport function flattenError(error, mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of error.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n}\nexport function formatError(error, mapper = (issue) => issue.message) {\n const fieldErrors = { _errors: [] };\n const processError = (error, path = []) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\" && issue.errors.length) {\n issue.errors.map((issues) => processError({ issues }, [...path, ...issue.path]));\n }\n else if (issue.code === \"invalid_key\") {\n processError({ issues: issue.issues }, [...path, ...issue.path]);\n }\n else if (issue.code === \"invalid_element\") {\n processError({ issues: issue.issues }, [...path, ...issue.path]);\n }\n else {\n const fullpath = [...path, ...issue.path];\n if (fullpath.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < fullpath.length) {\n const el = fullpath[i];\n const terminal = i === fullpath.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n }\n };\n processError(error);\n return fieldErrors;\n}\nexport function treeifyError(error, mapper = (issue) => issue.message) {\n const result = { errors: [] };\n const processError = (error, path = []) => {\n var _a, _b;\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\" && issue.errors.length) {\n // regular union error\n issue.errors.map((issues) => processError({ issues }, [...path, ...issue.path]));\n }\n else if (issue.code === \"invalid_key\") {\n processError({ issues: issue.issues }, [...path, ...issue.path]);\n }\n else if (issue.code === \"invalid_element\") {\n processError({ issues: issue.issues }, [...path, ...issue.path]);\n }\n else {\n const fullpath = [...path, ...issue.path];\n if (fullpath.length === 0) {\n result.errors.push(mapper(issue));\n continue;\n }\n let curr = result;\n let i = 0;\n while (i < fullpath.length) {\n const el = fullpath[i];\n const terminal = i === fullpath.length - 1;\n if (typeof el === \"string\") {\n curr.properties ?? (curr.properties = {});\n (_a = curr.properties)[el] ?? (_a[el] = { errors: [] });\n curr = curr.properties[el];\n }\n else {\n curr.items ?? (curr.items = []);\n (_b = curr.items)[el] ?? (_b[el] = { errors: [] });\n curr = curr.items[el];\n }\n if (terminal) {\n curr.errors.push(mapper(issue));\n }\n i++;\n }\n }\n }\n };\n processError(error);\n return result;\n}\n/** Format a ZodError as a human-readable string in the following form.\n *\n * From\n *\n * ```ts\n * ZodError {\n * issues: [\n * {\n * expected: 'string',\n * code: 'invalid_type',\n * path: [ 'username' ],\n * message: 'Invalid input: expected string'\n * },\n * {\n * expected: 'number',\n * code: 'invalid_type',\n * path: [ 'favoriteNumbers', 1 ],\n * message: 'Invalid input: expected number'\n * }\n * ];\n * }\n * ```\n *\n * to\n *\n * ```\n * username\n * ✖ Expected number, received string at \"username\n * favoriteNumbers[0]\n * ✖ Invalid input: expected number\n * ```\n */\nexport function toDotPath(_path) {\n const segs = [];\n const path = _path.map((seg) => (typeof seg === \"object\" ? seg.key : seg));\n for (const seg of path) {\n if (typeof seg === \"number\")\n segs.push(`[${seg}]`);\n else if (typeof seg === \"symbol\")\n segs.push(`[${JSON.stringify(String(seg))}]`);\n else if (/[^\\w$]/.test(seg))\n segs.push(`[${JSON.stringify(seg)}]`);\n else {\n if (segs.length)\n segs.push(\".\");\n segs.push(seg);\n }\n }\n return segs.join(\"\");\n}\nexport function prettifyError(error) {\n const lines = [];\n // sort by path length\n const issues = [...error.issues].sort((a, b) => (a.path ?? []).length - (b.path ?? []).length);\n // Process each issue\n for (const issue of issues) {\n lines.push(`✖ ${issue.message}`);\n if (issue.path?.length)\n lines.push(` → at ${toDotPath(issue.path)}`);\n }\n // Convert Map to formatted string\n return lines.join(\"\\n\");\n}\n","import * as core from \"./core.js\";\nimport * as errors from \"./errors.js\";\nimport * as util from \"./util.js\";\nexport const _parse = (_Err) => (schema, value, _ctx, _params) => {\n const ctx = _ctx ? { ..._ctx, async: false } : { async: false };\n const result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n if (result.issues.length) {\n const e = new (_params?.Err ?? _Err)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())));\n util.captureStackTrace(e, _params?.callee);\n throw e;\n }\n return result.value;\n};\nexport const parse = /* @__PURE__*/ _parse(errors.$ZodRealError);\nexport const _parseAsync = (_Err) => async (schema, value, _ctx, params) => {\n const ctx = _ctx ? { ..._ctx, async: true } : { async: true };\n let result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise)\n result = await result;\n if (result.issues.length) {\n const e = new (params?.Err ?? _Err)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())));\n util.captureStackTrace(e, params?.callee);\n throw e;\n }\n return result.value;\n};\nexport const parseAsync = /* @__PURE__*/ _parseAsync(errors.$ZodRealError);\nexport const _safeParse = (_Err) => (schema, value, _ctx) => {\n const ctx = _ctx ? { ..._ctx, async: false } : { async: false };\n const result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n return result.issues.length\n ? {\n success: false,\n error: new (_Err ?? errors.$ZodError)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n }\n : { success: true, data: result.value };\n};\nexport const safeParse = /* @__PURE__*/ _safeParse(errors.$ZodRealError);\nexport const _safeParseAsync = (_Err) => async (schema, value, _ctx) => {\n const ctx = _ctx ? { ..._ctx, async: true } : { async: true };\n let result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise)\n result = await result;\n return result.issues.length\n ? {\n success: false,\n error: new _Err(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n }\n : { success: true, data: result.value };\n};\nexport const safeParseAsync = /* @__PURE__*/ _safeParseAsync(errors.$ZodRealError);\nexport const _encode = (_Err) => (schema, value, _ctx) => {\n const ctx = _ctx ? { ..._ctx, direction: \"backward\" } : { direction: \"backward\" };\n return _parse(_Err)(schema, value, ctx);\n};\nexport const encode = /* @__PURE__*/ _encode(errors.$ZodRealError);\nexport const _decode = (_Err) => (schema, value, _ctx) => {\n return _parse(_Err)(schema, value, _ctx);\n};\nexport const decode = /* @__PURE__*/ _decode(errors.$ZodRealError);\nexport const _encodeAsync = (_Err) => async (schema, value, _ctx) => {\n const ctx = _ctx ? { ..._ctx, direction: \"backward\" } : { direction: \"backward\" };\n return _parseAsync(_Err)(schema, value, ctx);\n};\nexport const encodeAsync = /* @__PURE__*/ _encodeAsync(errors.$ZodRealError);\nexport const _decodeAsync = (_Err) => async (schema, value, _ctx) => {\n return _parseAsync(_Err)(schema, value, _ctx);\n};\nexport const decodeAsync = /* @__PURE__*/ _decodeAsync(errors.$ZodRealError);\nexport const _safeEncode = (_Err) => (schema, value, _ctx) => {\n const ctx = _ctx ? { ..._ctx, direction: \"backward\" } : { direction: \"backward\" };\n return _safeParse(_Err)(schema, value, ctx);\n};\nexport const safeEncode = /* @__PURE__*/ _safeEncode(errors.$ZodRealError);\nexport const _safeDecode = (_Err) => (schema, value, _ctx) => {\n return _safeParse(_Err)(schema, value, _ctx);\n};\nexport const safeDecode = /* @__PURE__*/ _safeDecode(errors.$ZodRealError);\nexport const _safeEncodeAsync = (_Err) => async (schema, value, _ctx) => {\n const ctx = _ctx ? { ..._ctx, direction: \"backward\" } : { direction: \"backward\" };\n return _safeParseAsync(_Err)(schema, value, ctx);\n};\nexport const safeEncodeAsync = /* @__PURE__*/ _safeEncodeAsync(errors.$ZodRealError);\nexport const _safeDecodeAsync = (_Err) => async (schema, value, _ctx) => {\n return _safeParseAsync(_Err)(schema, value, _ctx);\n};\nexport const safeDecodeAsync = /* @__PURE__*/ _safeDecodeAsync(errors.$ZodRealError);\n","import * as util from \"./util.js\";\n/**\n * @deprecated CUID v1 is deprecated by its authors due to information leakage\n * (timestamps embedded in the id). Use {@link cuid2} instead.\n * See https://github.com/paralleldrive/cuid.\n */\nexport const cuid = /^[cC][0-9a-z]{6,}$/;\nexport const cuid2 = /^[0-9a-z]+$/;\nexport const ulid = /^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/;\nexport const xid = /^[0-9a-vA-V]{20}$/;\nexport const ksuid = /^[A-Za-z0-9]{27}$/;\nexport const nanoid = /^[a-zA-Z0-9_-]{21}$/;\n/** ISO 8601-1 duration regex. Does not support the 8601-2 extensions like negative durations or fractional/negative components. */\nexport const duration = /^P(?:(\\d+W)|(?!.*W)(?=\\d|T\\d)(\\d+Y)?(\\d+M)?(\\d+D)?(T(?=\\d)(\\d+H)?(\\d+M)?(\\d+([.,]\\d+)?S)?)?)$/;\n/** Implements ISO 8601-2 extensions like explicit +- prefixes, mixing weeks with other units, and fractional/negative components. */\nexport const extendedDuration = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n/** A regex for any UUID-like identifier: 8-4-4-4-12 hex pattern */\nexport const guid = /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/;\n/** Returns a regex for validating an RFC 9562/4122 UUID.\n *\n * @param version Optionally specify a version 1-8. If no version is specified, all versions are supported. */\nexport const uuid = (version) => {\n if (!version)\n return /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/;\n return new RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${version}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`);\n};\nexport const uuid4 = /*@__PURE__*/ uuid(4);\nexport const uuid6 = /*@__PURE__*/ uuid(6);\nexport const uuid7 = /*@__PURE__*/ uuid(7);\n/** Practical email validation */\nexport const email = /^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$/;\n/** Equivalent to the HTML5 input[type=email] validation implemented by browsers. Source: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email */\nexport const html5Email = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n/** The classic emailregex.com regex for RFC 5322-compliant emails */\nexport const rfc5322Email = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n/** A loose regex that allows Unicode characters, enforces length limits, and that's about it. */\nexport const unicodeEmail = /^[^\\s@\"]{1,64}@[^\\s@]{1,255}$/u;\nexport const idnEmail = unicodeEmail;\nexport const browserEmail = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emoji = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nexport function emoji() {\n return new RegExp(_emoji, \"u\");\n}\nexport const ipv4 = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nexport const ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/;\nexport const mac = (delimiter) => {\n const escapedDelim = util.escapeRegex(delimiter ?? \":\");\n return new RegExp(`^(?:[0-9A-F]{2}${escapedDelim}){5}[0-9A-F]{2}$|^(?:[0-9a-f]{2}${escapedDelim}){5}[0-9a-f]{2}$`);\n};\nexport const cidrv4 = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$/;\nexport const cidrv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nexport const base64 = /^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/;\nexport const base64url = /^[A-Za-z0-9_-]*$/;\n// based on https://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address\n// export const hostname: RegExp = /^([a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+$/;\nexport const hostname = /^(?=.{1,253}\\.?$)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?)*\\.?$/;\nexport const domain = /^([a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,}$/;\nexport const httpProtocol = /^https?$/;\n// https://blog.stevenlevithan.com/archives/validate-phone-number#r4-3 (regex sans spaces)\n// E.164: leading digit must be 1-9; total digits (excluding '+') between 7-15\nexport const e164 = /^\\+[1-9]\\d{6,14}$/;\n// const dateSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateSource = `(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))`;\nexport const date = /*@__PURE__*/ new RegExp(`^${dateSource}$`);\nfunction timeSource(args) {\n const hhmm = `(?:[01]\\\\d|2[0-3]):[0-5]\\\\d`;\n const regex = typeof args.precision === \"number\"\n ? args.precision === -1\n ? `${hhmm}`\n : args.precision === 0\n ? `${hhmm}:[0-5]\\\\d`\n : `${hhmm}:[0-5]\\\\d\\\\.\\\\d{${args.precision}}`\n : `${hhmm}(?::[0-5]\\\\d(?:\\\\.\\\\d+)?)?`;\n return regex;\n}\nexport function time(args) {\n return new RegExp(`^${timeSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nexport function datetime(args) {\n const time = timeSource({ precision: args.precision });\n const opts = [\"Z\"];\n if (args.local)\n opts.push(\"\");\n // if (args.offset) opts.push(`([+-]\\\\d{2}:\\\\d{2})`);\n if (args.offset)\n opts.push(`([+-](?:[01]\\\\d|2[0-3]):[0-5]\\\\d)`);\n const timeRegex = `${time}(?:${opts.join(\"|\")})`;\n return new RegExp(`^${dateSource}T(?:${timeRegex})$`);\n}\nexport const string = (params) => {\n const regex = params ? `[\\\\s\\\\S]{${params?.minimum ?? 0},${params?.maximum ?? \"\"}}` : `[\\\\s\\\\S]*`;\n return new RegExp(`^${regex}$`);\n};\nexport const bigint = /^-?\\d+n?$/;\nexport const integer = /^-?\\d+$/;\nexport const number = /^-?\\d+(?:\\.\\d+)?$/;\nexport const boolean = /^(?:true|false)$/i;\nconst _null = /^null$/i;\nexport { _null as null };\nconst _undefined = /^undefined$/i;\nexport { _undefined as undefined };\n// regex for string with no uppercase letters\nexport const lowercase = /^[^A-Z]*$/;\n// regex for string with no lowercase letters\nexport const uppercase = /^[^a-z]*$/;\n// regex for hexadecimal strings (any length)\nexport const hex = /^[0-9a-fA-F]*$/;\n// Hash regexes for different algorithms and encodings\n// Helper function to create base64 regex with exact length and padding\nfunction fixedBase64(bodyLength, padding) {\n return new RegExp(`^[A-Za-z0-9+/]{${bodyLength}}${padding}$`);\n}\n// Helper function to create base64url regex with exact length (no padding)\nfunction fixedBase64url(length) {\n return new RegExp(`^[A-Za-z0-9_-]{${length}}$`);\n}\n// MD5 (16 bytes): base64 = 24 chars total (22 + \"==\")\nexport const md5_hex = /^[0-9a-fA-F]{32}$/;\nexport const md5_base64 = /*@__PURE__*/ fixedBase64(22, \"==\");\nexport const md5_base64url = /*@__PURE__*/ fixedBase64url(22);\n// SHA1 (20 bytes): base64 = 28 chars total (27 + \"=\")\nexport const sha1_hex = /^[0-9a-fA-F]{40}$/;\nexport const sha1_base64 = /*@__PURE__*/ fixedBase64(27, \"=\");\nexport const sha1_base64url = /*@__PURE__*/ fixedBase64url(27);\n// SHA256 (32 bytes): base64 = 44 chars total (43 + \"=\")\nexport const sha256_hex = /^[0-9a-fA-F]{64}$/;\nexport const sha256_base64 = /*@__PURE__*/ fixedBase64(43, \"=\");\nexport const sha256_base64url = /*@__PURE__*/ fixedBase64url(43);\n// SHA384 (48 bytes): base64 = 64 chars total (no padding)\nexport const sha384_hex = /^[0-9a-fA-F]{96}$/;\nexport const sha384_base64 = /*@__PURE__*/ fixedBase64(64, \"\");\nexport const sha384_base64url = /*@__PURE__*/ fixedBase64url(64);\n// SHA512 (64 bytes): base64 = 88 chars total (86 + \"==\")\nexport const sha512_hex = /^[0-9a-fA-F]{128}$/;\nexport const sha512_base64 = /*@__PURE__*/ fixedBase64(86, \"==\");\nexport const sha512_base64url = /*@__PURE__*/ fixedBase64url(86);\n","// import { $ZodType } from \"./schemas.js\";\nimport * as core from \"./core.js\";\nimport * as regexes from \"./regexes.js\";\nimport * as util from \"./util.js\";\nexport const $ZodCheck = /*@__PURE__*/ core.$constructor(\"$ZodCheck\", (inst, def) => {\n var _a;\n inst._zod ?? (inst._zod = {});\n inst._zod.def = def;\n (_a = inst._zod).onattach ?? (_a.onattach = []);\n});\nconst numericOriginMap = {\n number: \"number\",\n bigint: \"bigint\",\n object: \"date\",\n};\nexport const $ZodCheckLessThan = /*@__PURE__*/ core.$constructor(\"$ZodCheckLessThan\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const origin = numericOriginMap[typeof def.value];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n const curr = (def.inclusive ? bag.maximum : bag.exclusiveMaximum) ?? Number.POSITIVE_INFINITY;\n if (def.value < curr) {\n if (def.inclusive)\n bag.maximum = def.value;\n else\n bag.exclusiveMaximum = def.value;\n }\n });\n inst._zod.check = (payload) => {\n if (def.inclusive ? payload.value <= def.value : payload.value < def.value) {\n return;\n }\n payload.issues.push({\n origin,\n code: \"too_big\",\n maximum: typeof def.value === \"object\" ? def.value.getTime() : def.value,\n input: payload.value,\n inclusive: def.inclusive,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckGreaterThan = /*@__PURE__*/ core.$constructor(\"$ZodCheckGreaterThan\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const origin = numericOriginMap[typeof def.value];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n const curr = (def.inclusive ? bag.minimum : bag.exclusiveMinimum) ?? Number.NEGATIVE_INFINITY;\n if (def.value > curr) {\n if (def.inclusive)\n bag.minimum = def.value;\n else\n bag.exclusiveMinimum = def.value;\n }\n });\n inst._zod.check = (payload) => {\n if (def.inclusive ? payload.value >= def.value : payload.value > def.value) {\n return;\n }\n payload.issues.push({\n origin,\n code: \"too_small\",\n minimum: typeof def.value === \"object\" ? def.value.getTime() : def.value,\n input: payload.value,\n inclusive: def.inclusive,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMultipleOf = \n/*@__PURE__*/ core.$constructor(\"$ZodCheckMultipleOf\", (inst, def) => {\n $ZodCheck.init(inst, def);\n inst._zod.onattach.push((inst) => {\n var _a;\n (_a = inst._zod.bag).multipleOf ?? (_a.multipleOf = def.value);\n });\n inst._zod.check = (payload) => {\n if (typeof payload.value !== typeof def.value)\n throw new Error(\"Cannot mix number and bigint in multiple_of check.\");\n const isMultiple = typeof payload.value === \"bigint\"\n ? payload.value % def.value === BigInt(0)\n : util.floatSafeRemainder(payload.value, def.value) === 0;\n if (isMultiple)\n return;\n payload.issues.push({\n origin: typeof payload.value,\n code: \"not_multiple_of\",\n divisor: def.value,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckNumberFormat = /*@__PURE__*/ core.$constructor(\"$ZodCheckNumberFormat\", (inst, def) => {\n $ZodCheck.init(inst, def); // no format checks\n def.format = def.format || \"float64\";\n const isInt = def.format?.includes(\"int\");\n const origin = isInt ? \"int\" : \"number\";\n const [minimum, maximum] = util.NUMBER_FORMAT_RANGES[def.format];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.format = def.format;\n bag.minimum = minimum;\n bag.maximum = maximum;\n if (isInt)\n bag.pattern = regexes.integer;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n if (isInt) {\n if (!Number.isInteger(input)) {\n // invalid_format issue\n // payload.issues.push({\n // expected: def.format,\n // format: def.format,\n // code: \"invalid_format\",\n // input,\n // inst,\n // });\n // invalid_type issue\n payload.issues.push({\n expected: origin,\n format: def.format,\n code: \"invalid_type\",\n continue: false,\n input,\n inst,\n });\n return;\n // not_multiple_of issue\n // payload.issues.push({\n // code: \"not_multiple_of\",\n // origin: \"number\",\n // input,\n // inst,\n // divisor: 1,\n // });\n }\n if (!Number.isSafeInteger(input)) {\n if (input > 0) {\n // too_big\n payload.issues.push({\n input,\n code: \"too_big\",\n maximum: Number.MAX_SAFE_INTEGER,\n note: \"Integers must be within the safe integer range.\",\n inst,\n origin,\n inclusive: true,\n continue: !def.abort,\n });\n }\n else {\n // too_small\n payload.issues.push({\n input,\n code: \"too_small\",\n minimum: Number.MIN_SAFE_INTEGER,\n note: \"Integers must be within the safe integer range.\",\n inst,\n origin,\n inclusive: true,\n continue: !def.abort,\n });\n }\n return;\n }\n }\n if (input < minimum) {\n payload.issues.push({\n origin: \"number\",\n input,\n code: \"too_small\",\n minimum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n if (input > maximum) {\n payload.issues.push({\n origin: \"number\",\n input,\n code: \"too_big\",\n maximum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodCheckBigIntFormat = /*@__PURE__*/ core.$constructor(\"$ZodCheckBigIntFormat\", (inst, def) => {\n $ZodCheck.init(inst, def); // no format checks\n const [minimum, maximum] = util.BIGINT_FORMAT_RANGES[def.format];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.format = def.format;\n bag.minimum = minimum;\n bag.maximum = maximum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n if (input < minimum) {\n payload.issues.push({\n origin: \"bigint\",\n input,\n code: \"too_small\",\n minimum: minimum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n if (input > maximum) {\n payload.issues.push({\n origin: \"bigint\",\n input,\n code: \"too_big\",\n maximum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodCheckMaxSize = /*@__PURE__*/ core.$constructor(\"$ZodCheckMaxSize\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.size !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.maximum ?? Number.POSITIVE_INFINITY);\n if (def.maximum < curr)\n inst._zod.bag.maximum = def.maximum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const size = input.size;\n if (size <= def.maximum)\n return;\n payload.issues.push({\n origin: util.getSizableOrigin(input),\n code: \"too_big\",\n maximum: def.maximum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMinSize = /*@__PURE__*/ core.$constructor(\"$ZodCheckMinSize\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.size !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.minimum ?? Number.NEGATIVE_INFINITY);\n if (def.minimum > curr)\n inst._zod.bag.minimum = def.minimum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const size = input.size;\n if (size >= def.minimum)\n return;\n payload.issues.push({\n origin: util.getSizableOrigin(input),\n code: \"too_small\",\n minimum: def.minimum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckSizeEquals = /*@__PURE__*/ core.$constructor(\"$ZodCheckSizeEquals\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.size !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.minimum = def.size;\n bag.maximum = def.size;\n bag.size = def.size;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const size = input.size;\n if (size === def.size)\n return;\n const tooBig = size > def.size;\n payload.issues.push({\n origin: util.getSizableOrigin(input),\n ...(tooBig ? { code: \"too_big\", maximum: def.size } : { code: \"too_small\", minimum: def.size }),\n inclusive: true,\n exact: true,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMaxLength = /*@__PURE__*/ core.$constructor(\"$ZodCheckMaxLength\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.length !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.maximum ?? Number.POSITIVE_INFINITY);\n if (def.maximum < curr)\n inst._zod.bag.maximum = def.maximum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const length = input.length;\n if (length <= def.maximum)\n return;\n const origin = util.getLengthableOrigin(input);\n payload.issues.push({\n origin,\n code: \"too_big\",\n maximum: def.maximum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMinLength = /*@__PURE__*/ core.$constructor(\"$ZodCheckMinLength\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.length !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.minimum ?? Number.NEGATIVE_INFINITY);\n if (def.minimum > curr)\n inst._zod.bag.minimum = def.minimum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const length = input.length;\n if (length >= def.minimum)\n return;\n const origin = util.getLengthableOrigin(input);\n payload.issues.push({\n origin,\n code: \"too_small\",\n minimum: def.minimum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckLengthEquals = /*@__PURE__*/ core.$constructor(\"$ZodCheckLengthEquals\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.length !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.minimum = def.length;\n bag.maximum = def.length;\n bag.length = def.length;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const length = input.length;\n if (length === def.length)\n return;\n const origin = util.getLengthableOrigin(input);\n const tooBig = length > def.length;\n payload.issues.push({\n origin,\n ...(tooBig ? { code: \"too_big\", maximum: def.length } : { code: \"too_small\", minimum: def.length }),\n inclusive: true,\n exact: true,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckStringFormat = /*@__PURE__*/ core.$constructor(\"$ZodCheckStringFormat\", (inst, def) => {\n var _a, _b;\n $ZodCheck.init(inst, def);\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.format = def.format;\n if (def.pattern) {\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(def.pattern);\n }\n });\n if (def.pattern)\n (_a = inst._zod).check ?? (_a.check = (payload) => {\n def.pattern.lastIndex = 0;\n if (def.pattern.test(payload.value))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: def.format,\n input: payload.value,\n ...(def.pattern ? { pattern: def.pattern.toString() } : {}),\n inst,\n continue: !def.abort,\n });\n });\n else\n (_b = inst._zod).check ?? (_b.check = () => { });\n});\nexport const $ZodCheckRegex = /*@__PURE__*/ core.$constructor(\"$ZodCheckRegex\", (inst, def) => {\n $ZodCheckStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n def.pattern.lastIndex = 0;\n if (def.pattern.test(payload.value))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"regex\",\n input: payload.value,\n pattern: def.pattern.toString(),\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckLowerCase = /*@__PURE__*/ core.$constructor(\"$ZodCheckLowerCase\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.lowercase);\n $ZodCheckStringFormat.init(inst, def);\n});\nexport const $ZodCheckUpperCase = /*@__PURE__*/ core.$constructor(\"$ZodCheckUpperCase\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.uppercase);\n $ZodCheckStringFormat.init(inst, def);\n});\nexport const $ZodCheckIncludes = /*@__PURE__*/ core.$constructor(\"$ZodCheckIncludes\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const escapedRegex = util.escapeRegex(def.includes);\n const pattern = new RegExp(typeof def.position === \"number\" ? `^.{${def.position}}${escapedRegex}` : escapedRegex);\n def.pattern = pattern;\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(pattern);\n });\n inst._zod.check = (payload) => {\n if (payload.value.includes(def.includes, def.position))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"includes\",\n includes: def.includes,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckStartsWith = /*@__PURE__*/ core.$constructor(\"$ZodCheckStartsWith\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const pattern = new RegExp(`^${util.escapeRegex(def.prefix)}.*`);\n def.pattern ?? (def.pattern = pattern);\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(pattern);\n });\n inst._zod.check = (payload) => {\n if (payload.value.startsWith(def.prefix))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"starts_with\",\n prefix: def.prefix,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckEndsWith = /*@__PURE__*/ core.$constructor(\"$ZodCheckEndsWith\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const pattern = new RegExp(`.*${util.escapeRegex(def.suffix)}$`);\n def.pattern ?? (def.pattern = pattern);\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(pattern);\n });\n inst._zod.check = (payload) => {\n if (payload.value.endsWith(def.suffix))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"ends_with\",\n suffix: def.suffix,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\n///////////////////////////////////\n///// $ZodCheckProperty /////\n///////////////////////////////////\nfunction handleCheckPropertyResult(result, payload, property) {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(property, result.issues));\n }\n}\nexport const $ZodCheckProperty = /*@__PURE__*/ core.$constructor(\"$ZodCheckProperty\", (inst, def) => {\n $ZodCheck.init(inst, def);\n inst._zod.check = (payload) => {\n const result = def.schema._zod.run({\n value: payload.value[def.property],\n issues: [],\n }, {});\n if (result instanceof Promise) {\n return result.then((result) => handleCheckPropertyResult(result, payload, def.property));\n }\n handleCheckPropertyResult(result, payload, def.property);\n return;\n };\n});\nexport const $ZodCheckMimeType = /*@__PURE__*/ core.$constructor(\"$ZodCheckMimeType\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const mimeSet = new Set(def.mime);\n inst._zod.onattach.push((inst) => {\n inst._zod.bag.mime = def.mime;\n });\n inst._zod.check = (payload) => {\n if (mimeSet.has(payload.value.type))\n return;\n payload.issues.push({\n code: \"invalid_value\",\n values: def.mime,\n input: payload.value.type,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckOverwrite = /*@__PURE__*/ core.$constructor(\"$ZodCheckOverwrite\", (inst, def) => {\n $ZodCheck.init(inst, def);\n inst._zod.check = (payload) => {\n payload.value = def.tx(payload.value);\n };\n});\n","export class Doc {\n constructor(args = []) {\n this.content = [];\n this.indent = 0;\n if (this)\n this.args = args;\n }\n indented(fn) {\n this.indent += 1;\n fn(this);\n this.indent -= 1;\n }\n write(arg) {\n if (typeof arg === \"function\") {\n arg(this, { execution: \"sync\" });\n arg(this, { execution: \"async\" });\n return;\n }\n const content = arg;\n const lines = content.split(\"\\n\").filter((x) => x);\n const minIndent = Math.min(...lines.map((x) => x.length - x.trimStart().length));\n const dedented = lines.map((x) => x.slice(minIndent)).map((x) => \" \".repeat(this.indent * 2) + x);\n for (const line of dedented) {\n this.content.push(line);\n }\n }\n compile() {\n const F = Function;\n const args = this?.args;\n const content = this?.content ?? [``];\n const lines = [...content.map((x) => ` ${x}`)];\n // console.log(lines.join(\"\\n\"));\n return new F(...args, lines.join(\"\\n\"));\n }\n}\n","export const version = {\n major: 4,\n minor: 4,\n patch: 3,\n};\n","import * as checks from \"./checks.js\";\nimport * as core from \"./core.js\";\nimport { Doc } from \"./doc.js\";\nimport { parse, parseAsync, safeParse, safeParseAsync } from \"./parse.js\";\nimport * as regexes from \"./regexes.js\";\nimport * as util from \"./util.js\";\nimport { version } from \"./versions.js\";\nexport const $ZodType = /*@__PURE__*/ core.$constructor(\"$ZodType\", (inst, def) => {\n var _a;\n inst ?? (inst = {});\n inst._zod.def = def; // set _def property\n inst._zod.bag = inst._zod.bag || {}; // initialize _bag object\n inst._zod.version = version;\n const checks = [...(inst._zod.def.checks ?? [])];\n // if inst is itself a checks.$ZodCheck, run it as a check\n if (inst._zod.traits.has(\"$ZodCheck\")) {\n checks.unshift(inst);\n }\n for (const ch of checks) {\n for (const fn of ch._zod.onattach) {\n fn(inst);\n }\n }\n if (checks.length === 0) {\n // deferred initializer\n // inst._zod.parse is not yet defined\n (_a = inst._zod).deferred ?? (_a.deferred = []);\n inst._zod.deferred?.push(() => {\n inst._zod.run = inst._zod.parse;\n });\n }\n else {\n const runChecks = (payload, checks, ctx) => {\n let isAborted = util.aborted(payload);\n let asyncResult;\n for (const ch of checks) {\n if (ch._zod.def.when) {\n if (util.explicitlyAborted(payload))\n continue;\n const shouldRun = ch._zod.def.when(payload);\n if (!shouldRun)\n continue;\n }\n else if (isAborted) {\n continue;\n }\n const currLen = payload.issues.length;\n const _ = ch._zod.check(payload);\n if (_ instanceof Promise && ctx?.async === false) {\n throw new core.$ZodAsyncError();\n }\n if (asyncResult || _ instanceof Promise) {\n asyncResult = (asyncResult ?? Promise.resolve()).then(async () => {\n await _;\n const nextLen = payload.issues.length;\n if (nextLen === currLen)\n return;\n if (!isAborted)\n isAborted = util.aborted(payload, currLen);\n });\n }\n else {\n const nextLen = payload.issues.length;\n if (nextLen === currLen)\n continue;\n if (!isAborted)\n isAborted = util.aborted(payload, currLen);\n }\n }\n if (asyncResult) {\n return asyncResult.then(() => {\n return payload;\n });\n }\n return payload;\n };\n const handleCanaryResult = (canary, payload, ctx) => {\n // abort if the canary is aborted\n if (util.aborted(canary)) {\n canary.aborted = true;\n return canary;\n }\n // run checks first, then\n const checkResult = runChecks(payload, checks, ctx);\n if (checkResult instanceof Promise) {\n if (ctx.async === false)\n throw new core.$ZodAsyncError();\n return checkResult.then((checkResult) => inst._zod.parse(checkResult, ctx));\n }\n return inst._zod.parse(checkResult, ctx);\n };\n inst._zod.run = (payload, ctx) => {\n if (ctx.skipChecks) {\n return inst._zod.parse(payload, ctx);\n }\n if (ctx.direction === \"backward\") {\n // run canary\n // initial pass (no checks)\n const canary = inst._zod.parse({ value: payload.value, issues: [] }, { ...ctx, skipChecks: true });\n if (canary instanceof Promise) {\n return canary.then((canary) => {\n return handleCanaryResult(canary, payload, ctx);\n });\n }\n return handleCanaryResult(canary, payload, ctx);\n }\n // forward\n const result = inst._zod.parse(payload, ctx);\n if (result instanceof Promise) {\n if (ctx.async === false)\n throw new core.$ZodAsyncError();\n return result.then((result) => runChecks(result, checks, ctx));\n }\n return runChecks(result, checks, ctx);\n };\n }\n // Lazy initialize ~standard to avoid creating objects for every schema\n util.defineLazy(inst, \"~standard\", () => ({\n validate: (value) => {\n try {\n const r = safeParse(inst, value);\n return r.success ? { value: r.data } : { issues: r.error?.issues };\n }\n catch (_) {\n return safeParseAsync(inst, value).then((r) => (r.success ? { value: r.data } : { issues: r.error?.issues }));\n }\n },\n vendor: \"zod\",\n version: 1,\n }));\n});\nexport { clone } from \"./util.js\";\nexport const $ZodString = /*@__PURE__*/ core.$constructor(\"$ZodString\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = [...(inst?._zod.bag?.patterns ?? [])].pop() ?? regexes.string(inst._zod.bag);\n inst._zod.parse = (payload, _) => {\n if (def.coerce)\n try {\n payload.value = String(payload.value);\n }\n catch (_) { }\n if (typeof payload.value === \"string\")\n return payload;\n payload.issues.push({\n expected: \"string\",\n code: \"invalid_type\",\n input: payload.value,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodStringFormat = /*@__PURE__*/ core.$constructor(\"$ZodStringFormat\", (inst, def) => {\n // check initialization must come first\n checks.$ZodCheckStringFormat.init(inst, def);\n $ZodString.init(inst, def);\n});\nexport const $ZodGUID = /*@__PURE__*/ core.$constructor(\"$ZodGUID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.guid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodUUID = /*@__PURE__*/ core.$constructor(\"$ZodUUID\", (inst, def) => {\n if (def.version) {\n const versionMap = {\n v1: 1,\n v2: 2,\n v3: 3,\n v4: 4,\n v5: 5,\n v6: 6,\n v7: 7,\n v8: 8,\n };\n const v = versionMap[def.version];\n if (v === undefined)\n throw new Error(`Invalid UUID version: \"${def.version}\"`);\n def.pattern ?? (def.pattern = regexes.uuid(v));\n }\n else\n def.pattern ?? (def.pattern = regexes.uuid());\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodEmail = /*@__PURE__*/ core.$constructor(\"$ZodEmail\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.email);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodURL = /*@__PURE__*/ core.$constructor(\"$ZodURL\", (inst, def) => {\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n try {\n // Trim whitespace from input\n const trimmed = payload.value.trim();\n // When normalize is off, require :// for http/https URLs\n // This prevents strings like \"http:example.com\" or \"https:/path\" from being silently accepted\n if (!def.normalize && def.protocol?.source === regexes.httpProtocol.source) {\n if (!/^https?:\\/\\//i.test(trimmed)) {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"url\",\n note: \"Invalid URL format\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n return;\n }\n }\n // @ts-ignore\n const url = new URL(trimmed);\n if (def.hostname) {\n def.hostname.lastIndex = 0;\n if (!def.hostname.test(url.hostname)) {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"url\",\n note: \"Invalid hostname\",\n pattern: def.hostname.source,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n }\n if (def.protocol) {\n def.protocol.lastIndex = 0;\n if (!def.protocol.test(url.protocol.endsWith(\":\") ? url.protocol.slice(0, -1) : url.protocol)) {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"url\",\n note: \"Invalid protocol\",\n pattern: def.protocol.source,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n }\n // Set the output value based on normalize flag\n if (def.normalize) {\n // Use normalized URL\n payload.value = url.href;\n }\n else {\n // Preserve the original input (trimmed)\n payload.value = trimmed;\n }\n return;\n }\n catch (_) {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"url\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodEmoji = /*@__PURE__*/ core.$constructor(\"$ZodEmoji\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.emoji());\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodNanoID = /*@__PURE__*/ core.$constructor(\"$ZodNanoID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.nanoid);\n $ZodStringFormat.init(inst, def);\n});\n/**\n * @deprecated CUID v1 is deprecated by its authors due to information leakage\n * (timestamps embedded in the id). Use {@link $ZodCUID2} instead.\n * See https://github.com/paralleldrive/cuid.\n */\nexport const $ZodCUID = /*@__PURE__*/ core.$constructor(\"$ZodCUID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cuid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodCUID2 = /*@__PURE__*/ core.$constructor(\"$ZodCUID2\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cuid2);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodULID = /*@__PURE__*/ core.$constructor(\"$ZodULID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ulid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodXID = /*@__PURE__*/ core.$constructor(\"$ZodXID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.xid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodKSUID = /*@__PURE__*/ core.$constructor(\"$ZodKSUID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ksuid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISODateTime = /*@__PURE__*/ core.$constructor(\"$ZodISODateTime\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.datetime(def));\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISODate = /*@__PURE__*/ core.$constructor(\"$ZodISODate\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.date);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISOTime = /*@__PURE__*/ core.$constructor(\"$ZodISOTime\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.time(def));\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISODuration = /*@__PURE__*/ core.$constructor(\"$ZodISODuration\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.duration);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodIPv4 = /*@__PURE__*/ core.$constructor(\"$ZodIPv4\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ipv4);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.format = `ipv4`;\n});\nexport const $ZodIPv6 = /*@__PURE__*/ core.$constructor(\"$ZodIPv6\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ipv6);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.format = `ipv6`;\n inst._zod.check = (payload) => {\n try {\n // @ts-ignore\n new URL(`http://[${payload.value}]`);\n // return;\n }\n catch {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"ipv6\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodMAC = /*@__PURE__*/ core.$constructor(\"$ZodMAC\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.mac(def.delimiter));\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.format = `mac`;\n});\nexport const $ZodCIDRv4 = /*@__PURE__*/ core.$constructor(\"$ZodCIDRv4\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cidrv4);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodCIDRv6 = /*@__PURE__*/ core.$constructor(\"$ZodCIDRv6\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cidrv6); // not used for validation\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n const parts = payload.value.split(\"/\");\n try {\n if (parts.length !== 2)\n throw new Error();\n const [address, prefix] = parts;\n if (!prefix)\n throw new Error();\n const prefixNum = Number(prefix);\n if (`${prefixNum}` !== prefix)\n throw new Error();\n if (prefixNum < 0 || prefixNum > 128)\n throw new Error();\n // @ts-ignore\n new URL(`http://[${address}]`);\n }\n catch {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"cidrv6\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\n////////////////////////////// ZodBase64 //////////////////////////////\nexport function isValidBase64(data) {\n if (data === \"\")\n return true;\n // atob ignores whitespace, so reject it up front.\n if (/\\s/.test(data))\n return false;\n if (data.length % 4 !== 0)\n return false;\n try {\n // @ts-ignore\n atob(data);\n return true;\n }\n catch {\n return false;\n }\n}\nexport const $ZodBase64 = /*@__PURE__*/ core.$constructor(\"$ZodBase64\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.base64);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.contentEncoding = \"base64\";\n inst._zod.check = (payload) => {\n if (isValidBase64(payload.value))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: \"base64\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\n////////////////////////////// ZodBase64 //////////////////////////////\nexport function isValidBase64URL(data) {\n if (!regexes.base64url.test(data))\n return false;\n const base64 = data.replace(/[-_]/g, (c) => (c === \"-\" ? \"+\" : \"/\"));\n const padded = base64.padEnd(Math.ceil(base64.length / 4) * 4, \"=\");\n return isValidBase64(padded);\n}\nexport const $ZodBase64URL = /*@__PURE__*/ core.$constructor(\"$ZodBase64URL\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.base64url);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.contentEncoding = \"base64url\";\n inst._zod.check = (payload) => {\n if (isValidBase64URL(payload.value))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: \"base64url\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodE164 = /*@__PURE__*/ core.$constructor(\"$ZodE164\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.e164);\n $ZodStringFormat.init(inst, def);\n});\n////////////////////////////// ZodJWT //////////////////////////////\nexport function isValidJWT(token, algorithm = null) {\n try {\n const tokensParts = token.split(\".\");\n if (tokensParts.length !== 3)\n return false;\n const [header] = tokensParts;\n if (!header)\n return false;\n // @ts-ignore\n const parsedHeader = JSON.parse(atob(header));\n if (\"typ\" in parsedHeader && parsedHeader?.typ !== \"JWT\")\n return false;\n if (!parsedHeader.alg)\n return false;\n if (algorithm && (!(\"alg\" in parsedHeader) || parsedHeader.alg !== algorithm))\n return false;\n return true;\n }\n catch {\n return false;\n }\n}\nexport const $ZodJWT = /*@__PURE__*/ core.$constructor(\"$ZodJWT\", (inst, def) => {\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n if (isValidJWT(payload.value, def.alg))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: \"jwt\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCustomStringFormat = /*@__PURE__*/ core.$constructor(\"$ZodCustomStringFormat\", (inst, def) => {\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n if (def.fn(payload.value))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: def.format,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodNumber = /*@__PURE__*/ core.$constructor(\"$ZodNumber\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = inst._zod.bag.pattern ?? regexes.number;\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce)\n try {\n payload.value = Number(payload.value);\n }\n catch (_) { }\n const input = payload.value;\n if (typeof input === \"number\" && !Number.isNaN(input) && Number.isFinite(input)) {\n return payload;\n }\n const received = typeof input === \"number\"\n ? Number.isNaN(input)\n ? \"NaN\"\n : !Number.isFinite(input)\n ? \"Infinity\"\n : undefined\n : undefined;\n payload.issues.push({\n expected: \"number\",\n code: \"invalid_type\",\n input,\n inst,\n ...(received ? { received } : {}),\n });\n return payload;\n };\n});\nexport const $ZodNumberFormat = /*@__PURE__*/ core.$constructor(\"$ZodNumberFormat\", (inst, def) => {\n checks.$ZodCheckNumberFormat.init(inst, def);\n $ZodNumber.init(inst, def); // no format checks\n});\nexport const $ZodBoolean = /*@__PURE__*/ core.$constructor(\"$ZodBoolean\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.boolean;\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce)\n try {\n payload.value = Boolean(payload.value);\n }\n catch (_) { }\n const input = payload.value;\n if (typeof input === \"boolean\")\n return payload;\n payload.issues.push({\n expected: \"boolean\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodBigInt = /*@__PURE__*/ core.$constructor(\"$ZodBigInt\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.bigint;\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce)\n try {\n payload.value = BigInt(payload.value);\n }\n catch (_) { }\n if (typeof payload.value === \"bigint\")\n return payload;\n payload.issues.push({\n expected: \"bigint\",\n code: \"invalid_type\",\n input: payload.value,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodBigIntFormat = /*@__PURE__*/ core.$constructor(\"$ZodBigIntFormat\", (inst, def) => {\n checks.$ZodCheckBigIntFormat.init(inst, def);\n $ZodBigInt.init(inst, def); // no format checks\n});\nexport const $ZodSymbol = /*@__PURE__*/ core.$constructor(\"$ZodSymbol\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (typeof input === \"symbol\")\n return payload;\n payload.issues.push({\n expected: \"symbol\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodUndefined = /*@__PURE__*/ core.$constructor(\"$ZodUndefined\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.undefined;\n inst._zod.values = new Set([undefined]);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (typeof input === \"undefined\")\n return payload;\n payload.issues.push({\n expected: \"undefined\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodNull = /*@__PURE__*/ core.$constructor(\"$ZodNull\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.null;\n inst._zod.values = new Set([null]);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (input === null)\n return payload;\n payload.issues.push({\n expected: \"null\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodAny = /*@__PURE__*/ core.$constructor(\"$ZodAny\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload) => payload;\n});\nexport const $ZodUnknown = /*@__PURE__*/ core.$constructor(\"$ZodUnknown\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload) => payload;\n});\nexport const $ZodNever = /*@__PURE__*/ core.$constructor(\"$ZodNever\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n payload.issues.push({\n expected: \"never\",\n code: \"invalid_type\",\n input: payload.value,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodVoid = /*@__PURE__*/ core.$constructor(\"$ZodVoid\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (typeof input === \"undefined\")\n return payload;\n payload.issues.push({\n expected: \"void\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodDate = /*@__PURE__*/ core.$constructor(\"$ZodDate\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce) {\n try {\n payload.value = new Date(payload.value);\n }\n catch (_err) { }\n }\n const input = payload.value;\n const isDate = input instanceof Date;\n const isValidDate = isDate && !Number.isNaN(input.getTime());\n if (isValidDate)\n return payload;\n payload.issues.push({\n expected: \"date\",\n code: \"invalid_type\",\n input,\n ...(isDate ? { received: \"Invalid Date\" } : {}),\n inst,\n });\n return payload;\n };\n});\nfunction handleArrayResult(result, final, index) {\n if (result.issues.length) {\n final.issues.push(...util.prefixIssues(index, result.issues));\n }\n final.value[index] = result.value;\n}\nexport const $ZodArray = /*@__PURE__*/ core.$constructor(\"$ZodArray\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!Array.isArray(input)) {\n payload.issues.push({\n expected: \"array\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n payload.value = Array(input.length);\n const proms = [];\n for (let i = 0; i < input.length; i++) {\n const item = input[i];\n const result = def.element._zod.run({\n value: item,\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => handleArrayResult(result, payload, i)));\n }\n else {\n handleArrayResult(result, payload, i);\n }\n }\n if (proms.length) {\n return Promise.all(proms).then(() => payload);\n }\n return payload; //handleArrayResultsAsync(parseResults, final);\n };\n});\nfunction handlePropertyResult(result, final, key, input, isOptionalIn, isOptionalOut) {\n const isPresent = key in input;\n if (result.issues.length) {\n // For optional-in/out schemas, ignore errors on absent keys.\n if (isOptionalIn && isOptionalOut && !isPresent) {\n return;\n }\n final.issues.push(...util.prefixIssues(key, result.issues));\n }\n if (!isPresent && !isOptionalIn) {\n if (!result.issues.length) {\n final.issues.push({\n code: \"invalid_type\",\n expected: \"nonoptional\",\n input: undefined,\n path: [key],\n });\n }\n return;\n }\n if (result.value === undefined) {\n if (isPresent) {\n final.value[key] = undefined;\n }\n }\n else {\n final.value[key] = result.value;\n }\n}\nfunction normalizeDef(def) {\n const keys = Object.keys(def.shape);\n for (const k of keys) {\n if (!def.shape?.[k]?._zod?.traits?.has(\"$ZodType\")) {\n throw new Error(`Invalid element at key \"${k}\": expected a Zod schema`);\n }\n }\n const okeys = util.optionalKeys(def.shape);\n return {\n ...def,\n keys,\n keySet: new Set(keys),\n numKeys: keys.length,\n optionalKeys: new Set(okeys),\n };\n}\nfunction handleCatchall(proms, input, payload, ctx, def, inst) {\n const unrecognized = [];\n const keySet = def.keySet;\n const _catchall = def.catchall._zod;\n const t = _catchall.def.type;\n const isOptionalIn = _catchall.optin === \"optional\";\n const isOptionalOut = _catchall.optout === \"optional\";\n for (const key in input) {\n // skip __proto__ so it can't replace the result prototype via the\n // assignment setter on the plain {} we build into\n if (key === \"__proto__\")\n continue;\n if (keySet.has(key))\n continue;\n if (t === \"never\") {\n unrecognized.push(key);\n continue;\n }\n const r = _catchall.run({ value: input[key], issues: [] }, ctx);\n if (r instanceof Promise) {\n proms.push(r.then((r) => handlePropertyResult(r, payload, key, input, isOptionalIn, isOptionalOut)));\n }\n else {\n handlePropertyResult(r, payload, key, input, isOptionalIn, isOptionalOut);\n }\n }\n if (unrecognized.length) {\n payload.issues.push({\n code: \"unrecognized_keys\",\n keys: unrecognized,\n input,\n inst,\n });\n }\n if (!proms.length)\n return payload;\n return Promise.all(proms).then(() => {\n return payload;\n });\n}\nexport const $ZodObject = /*@__PURE__*/ core.$constructor(\"$ZodObject\", (inst, def) => {\n // requires cast because technically $ZodObject doesn't extend\n $ZodType.init(inst, def);\n // const sh = def.shape;\n const desc = Object.getOwnPropertyDescriptor(def, \"shape\");\n if (!desc?.get) {\n const sh = def.shape;\n Object.defineProperty(def, \"shape\", {\n get: () => {\n const newSh = { ...sh };\n Object.defineProperty(def, \"shape\", {\n value: newSh,\n });\n return newSh;\n },\n });\n }\n const _normalized = util.cached(() => normalizeDef(def));\n util.defineLazy(inst._zod, \"propValues\", () => {\n const shape = def.shape;\n const propValues = {};\n for (const key in shape) {\n const field = shape[key]._zod;\n if (field.values) {\n propValues[key] ?? (propValues[key] = new Set());\n for (const v of field.values)\n propValues[key].add(v);\n }\n }\n return propValues;\n });\n const isObject = util.isObject;\n const catchall = def.catchall;\n let value;\n inst._zod.parse = (payload, ctx) => {\n value ?? (value = _normalized.value);\n const input = payload.value;\n if (!isObject(input)) {\n payload.issues.push({\n expected: \"object\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n payload.value = {};\n const proms = [];\n const shape = value.shape;\n for (const key of value.keys) {\n const el = shape[key];\n const isOptionalIn = el._zod.optin === \"optional\";\n const isOptionalOut = el._zod.optout === \"optional\";\n const r = el._zod.run({ value: input[key], issues: [] }, ctx);\n if (r instanceof Promise) {\n proms.push(r.then((r) => handlePropertyResult(r, payload, key, input, isOptionalIn, isOptionalOut)));\n }\n else {\n handlePropertyResult(r, payload, key, input, isOptionalIn, isOptionalOut);\n }\n }\n if (!catchall) {\n return proms.length ? Promise.all(proms).then(() => payload) : payload;\n }\n return handleCatchall(proms, input, payload, ctx, _normalized.value, inst);\n };\n});\nexport const $ZodObjectJIT = /*@__PURE__*/ core.$constructor(\"$ZodObjectJIT\", (inst, def) => {\n // requires cast because technically $ZodObject doesn't extend\n $ZodObject.init(inst, def);\n const superParse = inst._zod.parse;\n const _normalized = util.cached(() => normalizeDef(def));\n const generateFastpass = (shape) => {\n const doc = new Doc([\"shape\", \"payload\", \"ctx\"]);\n const normalized = _normalized.value;\n const parseStr = (key) => {\n const k = util.esc(key);\n return `shape[${k}]._zod.run({ value: input[${k}], issues: [] }, ctx)`;\n };\n doc.write(`const input = payload.value;`);\n const ids = Object.create(null);\n let counter = 0;\n for (const key of normalized.keys) {\n ids[key] = `key_${counter++}`;\n }\n // A: preserve key order {\n doc.write(`const newResult = {};`);\n for (const key of normalized.keys) {\n const id = ids[key];\n const k = util.esc(key);\n const schema = shape[key];\n const isOptionalIn = schema?._zod?.optin === \"optional\";\n const isOptionalOut = schema?._zod?.optout === \"optional\";\n doc.write(`const ${id} = ${parseStr(key)};`);\n if (isOptionalIn && isOptionalOut) {\n // For optional-in/out schemas, ignore errors on absent keys\n doc.write(`\n if (${id}.issues.length) {\n if (${k} in input) {\n payload.issues = payload.issues.concat(${id}.issues.map(iss => ({\n ...iss,\n path: iss.path ? [${k}, ...iss.path] : [${k}]\n })));\n }\n }\n \n if (${id}.value === undefined) {\n if (${k} in input) {\n newResult[${k}] = undefined;\n }\n } else {\n newResult[${k}] = ${id}.value;\n }\n \n `);\n }\n else if (!isOptionalIn) {\n doc.write(`\n const ${id}_present = ${k} in input;\n if (${id}.issues.length) {\n payload.issues = payload.issues.concat(${id}.issues.map(iss => ({\n ...iss,\n path: iss.path ? [${k}, ...iss.path] : [${k}]\n })));\n }\n if (!${id}_present && !${id}.issues.length) {\n payload.issues.push({\n code: \"invalid_type\",\n expected: \"nonoptional\",\n input: undefined,\n path: [${k}]\n });\n }\n\n if (${id}_present) {\n if (${id}.value === undefined) {\n newResult[${k}] = undefined;\n } else {\n newResult[${k}] = ${id}.value;\n }\n }\n\n `);\n }\n else {\n doc.write(`\n if (${id}.issues.length) {\n payload.issues = payload.issues.concat(${id}.issues.map(iss => ({\n ...iss,\n path: iss.path ? [${k}, ...iss.path] : [${k}]\n })));\n }\n \n if (${id}.value === undefined) {\n if (${k} in input) {\n newResult[${k}] = undefined;\n }\n } else {\n newResult[${k}] = ${id}.value;\n }\n \n `);\n }\n }\n doc.write(`payload.value = newResult;`);\n doc.write(`return payload;`);\n const fn = doc.compile();\n return (payload, ctx) => fn(shape, payload, ctx);\n };\n let fastpass;\n const isObject = util.isObject;\n const jit = !core.globalConfig.jitless;\n const allowsEval = util.allowsEval;\n const fastEnabled = jit && allowsEval.value; // && !def.catchall;\n const catchall = def.catchall;\n let value;\n inst._zod.parse = (payload, ctx) => {\n value ?? (value = _normalized.value);\n const input = payload.value;\n if (!isObject(input)) {\n payload.issues.push({\n expected: \"object\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n if (jit && fastEnabled && ctx?.async === false && ctx.jitless !== true) {\n // always synchronous\n if (!fastpass)\n fastpass = generateFastpass(def.shape);\n payload = fastpass(payload, ctx);\n if (!catchall)\n return payload;\n return handleCatchall([], input, payload, ctx, value, inst);\n }\n return superParse(payload, ctx);\n };\n});\nfunction handleUnionResults(results, final, inst, ctx) {\n for (const result of results) {\n if (result.issues.length === 0) {\n final.value = result.value;\n return final;\n }\n }\n const nonaborted = results.filter((r) => !util.aborted(r));\n if (nonaborted.length === 1) {\n final.value = nonaborted[0].value;\n return nonaborted[0];\n }\n final.issues.push({\n code: \"invalid_union\",\n input: final.value,\n inst,\n errors: results.map((result) => result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n });\n return final;\n}\nexport const $ZodUnion = /*@__PURE__*/ core.$constructor(\"$ZodUnion\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"optin\", () => def.options.some((o) => o._zod.optin === \"optional\") ? \"optional\" : undefined);\n util.defineLazy(inst._zod, \"optout\", () => def.options.some((o) => o._zod.optout === \"optional\") ? \"optional\" : undefined);\n util.defineLazy(inst._zod, \"values\", () => {\n if (def.options.every((o) => o._zod.values)) {\n return new Set(def.options.flatMap((option) => Array.from(option._zod.values)));\n }\n return undefined;\n });\n util.defineLazy(inst._zod, \"pattern\", () => {\n if (def.options.every((o) => o._zod.pattern)) {\n const patterns = def.options.map((o) => o._zod.pattern);\n return new RegExp(`^(${patterns.map((p) => util.cleanRegex(p.source)).join(\"|\")})$`);\n }\n return undefined;\n });\n const first = def.options.length === 1 ? def.options[0]._zod.run : null;\n inst._zod.parse = (payload, ctx) => {\n if (first) {\n return first(payload, ctx);\n }\n let async = false;\n const results = [];\n for (const option of def.options) {\n const result = option._zod.run({\n value: payload.value,\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n results.push(result);\n async = true;\n }\n else {\n if (result.issues.length === 0)\n return result;\n results.push(result);\n }\n }\n if (!async)\n return handleUnionResults(results, payload, inst, ctx);\n return Promise.all(results).then((results) => {\n return handleUnionResults(results, payload, inst, ctx);\n });\n };\n});\nfunction handleExclusiveUnionResults(results, final, inst, ctx) {\n const successes = results.filter((r) => r.issues.length === 0);\n if (successes.length === 1) {\n final.value = successes[0].value;\n return final;\n }\n if (successes.length === 0) {\n // No matches - same as regular union\n final.issues.push({\n code: \"invalid_union\",\n input: final.value,\n inst,\n errors: results.map((result) => result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n });\n }\n else {\n // Multiple matches - exclusive union failure\n final.issues.push({\n code: \"invalid_union\",\n input: final.value,\n inst,\n errors: [],\n inclusive: false,\n });\n }\n return final;\n}\nexport const $ZodXor = /*@__PURE__*/ core.$constructor(\"$ZodXor\", (inst, def) => {\n $ZodUnion.init(inst, def);\n def.inclusive = false;\n const first = def.options.length === 1 ? def.options[0]._zod.run : null;\n inst._zod.parse = (payload, ctx) => {\n if (first) {\n return first(payload, ctx);\n }\n let async = false;\n const results = [];\n for (const option of def.options) {\n const result = option._zod.run({\n value: payload.value,\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n results.push(result);\n async = true;\n }\n else {\n results.push(result);\n }\n }\n if (!async)\n return handleExclusiveUnionResults(results, payload, inst, ctx);\n return Promise.all(results).then((results) => {\n return handleExclusiveUnionResults(results, payload, inst, ctx);\n });\n };\n});\nexport const $ZodDiscriminatedUnion = \n/*@__PURE__*/\ncore.$constructor(\"$ZodDiscriminatedUnion\", (inst, def) => {\n def.inclusive = false;\n $ZodUnion.init(inst, def);\n const _super = inst._zod.parse;\n util.defineLazy(inst._zod, \"propValues\", () => {\n const propValues = {};\n for (const option of def.options) {\n const pv = option._zod.propValues;\n if (!pv || Object.keys(pv).length === 0)\n throw new Error(`Invalid discriminated union option at index \"${def.options.indexOf(option)}\"`);\n for (const [k, v] of Object.entries(pv)) {\n if (!propValues[k])\n propValues[k] = new Set();\n for (const val of v) {\n propValues[k].add(val);\n }\n }\n }\n return propValues;\n });\n const disc = util.cached(() => {\n const opts = def.options;\n const map = new Map();\n for (const o of opts) {\n const values = o._zod.propValues?.[def.discriminator];\n if (!values || values.size === 0)\n throw new Error(`Invalid discriminated union option at index \"${def.options.indexOf(o)}\"`);\n for (const v of values) {\n if (map.has(v)) {\n throw new Error(`Duplicate discriminator value \"${String(v)}\"`);\n }\n map.set(v, o);\n }\n }\n return map;\n });\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!util.isObject(input)) {\n payload.issues.push({\n code: \"invalid_type\",\n expected: \"object\",\n input,\n inst,\n });\n return payload;\n }\n const opt = disc.value.get(input?.[def.discriminator]);\n if (opt) {\n return opt._zod.run(payload, ctx);\n }\n // Fall back to union matching when the fast discriminator path fails:\n // - explicitly enabled via unionFallback, or\n // - during backward direction (encode), since codec-based discriminators\n // have different values in forward vs backward directions\n if (def.unionFallback || ctx.direction === \"backward\") {\n return _super(payload, ctx);\n }\n // no matching discriminator\n payload.issues.push({\n code: \"invalid_union\",\n errors: [],\n note: \"No matching discriminator\",\n discriminator: def.discriminator,\n options: Array.from(disc.value.keys()),\n input,\n path: [def.discriminator],\n inst,\n });\n return payload;\n };\n});\nexport const $ZodIntersection = /*@__PURE__*/ core.$constructor(\"$ZodIntersection\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n const left = def.left._zod.run({ value: input, issues: [] }, ctx);\n const right = def.right._zod.run({ value: input, issues: [] }, ctx);\n const async = left instanceof Promise || right instanceof Promise;\n if (async) {\n return Promise.all([left, right]).then(([left, right]) => {\n return handleIntersectionResults(payload, left, right);\n });\n }\n return handleIntersectionResults(payload, left, right);\n };\n});\nfunction mergeValues(a, b) {\n // const aType = parse.t(a);\n // const bType = parse.t(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n if (a instanceof Date && b instanceof Date && +a === +b) {\n return { valid: true, data: a };\n }\n if (util.isPlainObject(a) && util.isPlainObject(b)) {\n const bKeys = Object.keys(b);\n const sharedKeys = Object.keys(a).filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return {\n valid: false,\n mergeErrorPath: [key, ...sharedValue.mergeErrorPath],\n };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return { valid: false, mergeErrorPath: [] };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return {\n valid: false,\n mergeErrorPath: [index, ...sharedValue.mergeErrorPath],\n };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n return { valid: false, mergeErrorPath: [] };\n}\nfunction handleIntersectionResults(result, left, right) {\n // Track which side(s) report each key as unrecognized\n const unrecKeys = new Map();\n let unrecIssue;\n for (const iss of left.issues) {\n if (iss.code === \"unrecognized_keys\") {\n unrecIssue ?? (unrecIssue = iss);\n for (const k of iss.keys) {\n if (!unrecKeys.has(k))\n unrecKeys.set(k, {});\n unrecKeys.get(k).l = true;\n }\n }\n else {\n result.issues.push(iss);\n }\n }\n for (const iss of right.issues) {\n if (iss.code === \"unrecognized_keys\") {\n for (const k of iss.keys) {\n if (!unrecKeys.has(k))\n unrecKeys.set(k, {});\n unrecKeys.get(k).r = true;\n }\n }\n else {\n result.issues.push(iss);\n }\n }\n // Report only keys unrecognized by BOTH sides\n const bothKeys = [...unrecKeys].filter(([, f]) => f.l && f.r).map(([k]) => k);\n if (bothKeys.length && unrecIssue) {\n result.issues.push({ ...unrecIssue, keys: bothKeys });\n }\n if (util.aborted(result))\n return result;\n const merged = mergeValues(left.value, right.value);\n if (!merged.valid) {\n throw new Error(`Unmergable intersection. Error path: ` + `${JSON.stringify(merged.mergeErrorPath)}`);\n }\n result.value = merged.data;\n return result;\n}\nexport const $ZodTuple = /*@__PURE__*/ core.$constructor(\"$ZodTuple\", (inst, def) => {\n $ZodType.init(inst, def);\n const items = def.items;\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!Array.isArray(input)) {\n payload.issues.push({\n input,\n inst,\n expected: \"tuple\",\n code: \"invalid_type\",\n });\n return payload;\n }\n payload.value = [];\n const proms = [];\n const optinStart = getTupleOptStart(items, \"optin\");\n const optoutStart = getTupleOptStart(items, \"optout\");\n if (!def.rest) {\n if (input.length < optinStart) {\n payload.issues.push({\n code: \"too_small\",\n minimum: optinStart,\n inclusive: true,\n input,\n inst,\n origin: \"array\",\n });\n return payload;\n }\n if (input.length > items.length) {\n payload.issues.push({\n code: \"too_big\",\n maximum: items.length,\n inclusive: true,\n input,\n inst,\n origin: \"array\",\n });\n }\n }\n // Run every item in parallel, collecting results into an indexed\n // array. The post-processing in `handleTupleResults` walks them in\n // order so it can decide whether an absent optional-output error can\n // truncate the tail or must be reported to preserve required output.\n const itemResults = new Array(items.length);\n for (let i = 0; i < items.length; i++) {\n const r = items[i]._zod.run({ value: input[i], issues: [] }, ctx);\n if (r instanceof Promise) {\n proms.push(r.then((rr) => {\n itemResults[i] = rr;\n }));\n }\n else {\n itemResults[i] = r;\n }\n }\n if (def.rest) {\n let i = items.length - 1;\n const rest = input.slice(items.length);\n for (const el of rest) {\n i++;\n const result = def.rest._zod.run({ value: el, issues: [] }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((r) => handleTupleResult(r, payload, i)));\n }\n else {\n handleTupleResult(result, payload, i);\n }\n }\n }\n if (proms.length) {\n return Promise.all(proms).then(() => handleTupleResults(itemResults, payload, items, input, optoutStart));\n }\n return handleTupleResults(itemResults, payload, items, input, optoutStart);\n };\n});\nfunction getTupleOptStart(items, key) {\n for (let i = items.length - 1; i >= 0; i--) {\n if (items[i]._zod[key] !== \"optional\")\n return i + 1;\n }\n return 0;\n}\nfunction handleTupleResult(result, final, index) {\n if (result.issues.length) {\n final.issues.push(...util.prefixIssues(index, result.issues));\n }\n final.value[index] = result.value;\n}\nfunction handleTupleResults(itemResults, final, items, input, optoutStart) {\n // Walk results in order. Mirror $ZodObject's swallow-on-absent-optional\n // rule, but only after `optoutStart`: the first index where the output\n // tuple tail can be absent.\n for (let i = 0; i < items.length; i++) {\n const r = itemResults[i];\n const isPresent = i < input.length;\n if (r.issues.length) {\n if (!isPresent && i >= optoutStart) {\n final.value.length = i;\n break;\n }\n final.issues.push(...util.prefixIssues(i, r.issues));\n }\n final.value[i] = r.value;\n }\n // Drop trailing slots that produced `undefined` for absent input\n // (the array analog of an absent optional key on an object). The\n // `i >= input.length` floor is critical: an explicit `undefined`\n // *inside* the input must be preserved even when the schema is\n // optional-out (e.g. `z.string().or(z.undefined())` accepting an\n // explicit undefined value).\n for (let i = final.value.length - 1; i >= input.length; i--) {\n if (items[i]._zod.optout === \"optional\" && final.value[i] === undefined) {\n final.value.length = i;\n }\n else {\n break;\n }\n }\n return final;\n}\nexport const $ZodRecord = /*@__PURE__*/ core.$constructor(\"$ZodRecord\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!util.isPlainObject(input)) {\n payload.issues.push({\n expected: \"record\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n const proms = [];\n const values = def.keyType._zod.values;\n if (values) {\n payload.value = {};\n const recordKeys = new Set();\n for (const key of values) {\n if (typeof key === \"string\" || typeof key === \"number\" || typeof key === \"symbol\") {\n recordKeys.add(typeof key === \"number\" ? key.toString() : key);\n const keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx);\n if (keyResult instanceof Promise) {\n throw new Error(\"Async schemas not supported in object keys currently\");\n }\n if (keyResult.issues.length) {\n payload.issues.push({\n code: \"invalid_key\",\n origin: \"record\",\n issues: keyResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n input: key,\n path: [key],\n inst,\n });\n continue;\n }\n const outKey = keyResult.value;\n const result = def.valueType._zod.run({ value: input[key], issues: [] }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[outKey] = result.value;\n }));\n }\n else {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[outKey] = result.value;\n }\n }\n }\n let unrecognized;\n for (const key in input) {\n if (!recordKeys.has(key)) {\n unrecognized = unrecognized ?? [];\n unrecognized.push(key);\n }\n }\n if (unrecognized && unrecognized.length > 0) {\n payload.issues.push({\n code: \"unrecognized_keys\",\n input,\n inst,\n keys: unrecognized,\n });\n }\n }\n else {\n payload.value = {};\n // Reflect.ownKeys for Symbol-key support; filter non-enumerable to match z.object()\n for (const key of Reflect.ownKeys(input)) {\n if (key === \"__proto__\")\n continue;\n if (!Object.prototype.propertyIsEnumerable.call(input, key))\n continue;\n let keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx);\n if (keyResult instanceof Promise) {\n throw new Error(\"Async schemas not supported in object keys currently\");\n }\n // Numeric string fallback: if key is a numeric string and failed, retry with Number(key)\n // This handles z.number(), z.literal([1, 2, 3]), and unions containing numeric literals\n const checkNumericKey = typeof key === \"string\" && regexes.number.test(key) && keyResult.issues.length;\n if (checkNumericKey) {\n const retryResult = def.keyType._zod.run({ value: Number(key), issues: [] }, ctx);\n if (retryResult instanceof Promise) {\n throw new Error(\"Async schemas not supported in object keys currently\");\n }\n if (retryResult.issues.length === 0) {\n keyResult = retryResult;\n }\n }\n if (keyResult.issues.length) {\n if (def.mode === \"loose\") {\n // Pass through unchanged\n payload.value[key] = input[key];\n }\n else {\n // Default \"strict\" behavior: error on invalid key\n payload.issues.push({\n code: \"invalid_key\",\n origin: \"record\",\n issues: keyResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n input: key,\n path: [key],\n inst,\n });\n }\n continue;\n }\n const result = def.valueType._zod.run({ value: input[key], issues: [] }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[keyResult.value] = result.value;\n }));\n }\n else {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[keyResult.value] = result.value;\n }\n }\n }\n if (proms.length) {\n return Promise.all(proms).then(() => payload);\n }\n return payload;\n };\n});\nexport const $ZodMap = /*@__PURE__*/ core.$constructor(\"$ZodMap\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!(input instanceof Map)) {\n payload.issues.push({\n expected: \"map\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n const proms = [];\n payload.value = new Map();\n for (const [key, value] of input) {\n const keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx);\n const valueResult = def.valueType._zod.run({ value: value, issues: [] }, ctx);\n if (keyResult instanceof Promise || valueResult instanceof Promise) {\n proms.push(Promise.all([keyResult, valueResult]).then(([keyResult, valueResult]) => {\n handleMapResult(keyResult, valueResult, payload, key, input, inst, ctx);\n }));\n }\n else {\n handleMapResult(keyResult, valueResult, payload, key, input, inst, ctx);\n }\n }\n if (proms.length)\n return Promise.all(proms).then(() => payload);\n return payload;\n };\n});\nfunction handleMapResult(keyResult, valueResult, final, key, input, inst, ctx) {\n if (keyResult.issues.length) {\n if (util.propertyKeyTypes.has(typeof key)) {\n final.issues.push(...util.prefixIssues(key, keyResult.issues));\n }\n else {\n final.issues.push({\n code: \"invalid_key\",\n origin: \"map\",\n input,\n inst,\n issues: keyResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n });\n }\n }\n if (valueResult.issues.length) {\n if (util.propertyKeyTypes.has(typeof key)) {\n final.issues.push(...util.prefixIssues(key, valueResult.issues));\n }\n else {\n final.issues.push({\n origin: \"map\",\n code: \"invalid_element\",\n input,\n inst,\n key: key,\n issues: valueResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n });\n }\n }\n final.value.set(keyResult.value, valueResult.value);\n}\nexport const $ZodSet = /*@__PURE__*/ core.$constructor(\"$ZodSet\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!(input instanceof Set)) {\n payload.issues.push({\n input,\n inst,\n expected: \"set\",\n code: \"invalid_type\",\n });\n return payload;\n }\n const proms = [];\n payload.value = new Set();\n for (const item of input) {\n const result = def.valueType._zod.run({ value: item, issues: [] }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => handleSetResult(result, payload)));\n }\n else\n handleSetResult(result, payload);\n }\n if (proms.length)\n return Promise.all(proms).then(() => payload);\n return payload;\n };\n});\nfunction handleSetResult(result, final) {\n if (result.issues.length) {\n final.issues.push(...result.issues);\n }\n final.value.add(result.value);\n}\nexport const $ZodEnum = /*@__PURE__*/ core.$constructor(\"$ZodEnum\", (inst, def) => {\n $ZodType.init(inst, def);\n const values = util.getEnumValues(def.entries);\n const valuesSet = new Set(values);\n inst._zod.values = valuesSet;\n inst._zod.pattern = new RegExp(`^(${values\n .filter((k) => util.propertyKeyTypes.has(typeof k))\n .map((o) => (typeof o === \"string\" ? util.escapeRegex(o) : o.toString()))\n .join(\"|\")})$`);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (valuesSet.has(input)) {\n return payload;\n }\n payload.issues.push({\n code: \"invalid_value\",\n values,\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodLiteral = /*@__PURE__*/ core.$constructor(\"$ZodLiteral\", (inst, def) => {\n $ZodType.init(inst, def);\n if (def.values.length === 0) {\n throw new Error(\"Cannot create literal schema with no valid values\");\n }\n const values = new Set(def.values);\n inst._zod.values = values;\n inst._zod.pattern = new RegExp(`^(${def.values\n .map((o) => (typeof o === \"string\" ? util.escapeRegex(o) : o ? util.escapeRegex(o.toString()) : String(o)))\n .join(\"|\")})$`);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (values.has(input)) {\n return payload;\n }\n payload.issues.push({\n code: \"invalid_value\",\n values: def.values,\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodFile = /*@__PURE__*/ core.$constructor(\"$ZodFile\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n // @ts-ignore\n if (input instanceof File)\n return payload;\n payload.issues.push({\n expected: \"file\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodTransform = /*@__PURE__*/ core.$constructor(\"$ZodTransform\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.optin = \"optional\";\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n throw new core.$ZodEncodeError(inst.constructor.name);\n }\n const _out = def.transform(payload.value, payload);\n if (ctx.async) {\n const output = _out instanceof Promise ? _out : Promise.resolve(_out);\n return output.then((output) => {\n payload.value = output;\n payload.fallback = true;\n return payload;\n });\n }\n if (_out instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n payload.value = _out;\n payload.fallback = true;\n return payload;\n };\n});\nfunction handleOptionalResult(result, input) {\n if (input === undefined && (result.issues.length || result.fallback)) {\n return { issues: [], value: undefined };\n }\n return result;\n}\nexport const $ZodOptional = /*@__PURE__*/ core.$constructor(\"$ZodOptional\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.optin = \"optional\";\n inst._zod.optout = \"optional\";\n util.defineLazy(inst._zod, \"values\", () => {\n return def.innerType._zod.values ? new Set([...def.innerType._zod.values, undefined]) : undefined;\n });\n util.defineLazy(inst._zod, \"pattern\", () => {\n const pattern = def.innerType._zod.pattern;\n return pattern ? new RegExp(`^(${util.cleanRegex(pattern.source)})?$`) : undefined;\n });\n inst._zod.parse = (payload, ctx) => {\n if (def.innerType._zod.optin === \"optional\") {\n const input = payload.value;\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise)\n return result.then((r) => handleOptionalResult(r, input));\n return handleOptionalResult(result, input);\n }\n if (payload.value === undefined) {\n return payload;\n }\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodExactOptional = /*@__PURE__*/ core.$constructor(\"$ZodExactOptional\", (inst, def) => {\n // Call parent init - inherits optin/optout = \"optional\"\n $ZodOptional.init(inst, def);\n // Override values/pattern to NOT add undefined\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n util.defineLazy(inst._zod, \"pattern\", () => def.innerType._zod.pattern);\n // Override parse to just delegate (no undefined handling)\n inst._zod.parse = (payload, ctx) => {\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodNullable = /*@__PURE__*/ core.$constructor(\"$ZodNullable\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"optin\", () => def.innerType._zod.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.innerType._zod.optout);\n util.defineLazy(inst._zod, \"pattern\", () => {\n const pattern = def.innerType._zod.pattern;\n return pattern ? new RegExp(`^(${util.cleanRegex(pattern.source)}|null)$`) : undefined;\n });\n util.defineLazy(inst._zod, \"values\", () => {\n return def.innerType._zod.values ? new Set([...def.innerType._zod.values, null]) : undefined;\n });\n inst._zod.parse = (payload, ctx) => {\n // Forward direction (decode): allow null to pass through\n if (payload.value === null)\n return payload;\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodDefault = /*@__PURE__*/ core.$constructor(\"$ZodDefault\", (inst, def) => {\n $ZodType.init(inst, def);\n // inst._zod.qin = \"true\";\n inst._zod.optin = \"optional\";\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n // Forward direction (decode): apply defaults for undefined input\n if (payload.value === undefined) {\n payload.value = def.defaultValue;\n /**\n * $ZodDefault returns the default value immediately in forward direction.\n * It doesn't pass the default value into the validator (\"prefault\"). There's no reason to pass the default value through validation. The validity of the default is enforced by TypeScript statically. Otherwise, it's the responsibility of the user to ensure the default is valid. In the case of pipes with divergent in/out types, you can specify the default on the `in` schema of your ZodPipe to set a \"prefault\" for the pipe. */\n return payload;\n }\n // Forward direction: continue with default handling\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => handleDefaultResult(result, def));\n }\n return handleDefaultResult(result, def);\n };\n});\nfunction handleDefaultResult(payload, def) {\n if (payload.value === undefined) {\n payload.value = def.defaultValue;\n }\n return payload;\n}\nexport const $ZodPrefault = /*@__PURE__*/ core.$constructor(\"$ZodPrefault\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.optin = \"optional\";\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n // Forward direction (decode): apply prefault for undefined input\n if (payload.value === undefined) {\n payload.value = def.defaultValue;\n }\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodNonOptional = /*@__PURE__*/ core.$constructor(\"$ZodNonOptional\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"values\", () => {\n const v = def.innerType._zod.values;\n return v ? new Set([...v].filter((x) => x !== undefined)) : undefined;\n });\n inst._zod.parse = (payload, ctx) => {\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => handleNonOptionalResult(result, inst));\n }\n return handleNonOptionalResult(result, inst);\n };\n});\nfunction handleNonOptionalResult(payload, inst) {\n if (!payload.issues.length && payload.value === undefined) {\n payload.issues.push({\n code: \"invalid_type\",\n expected: \"nonoptional\",\n input: payload.value,\n inst,\n });\n }\n return payload;\n}\nexport const $ZodSuccess = /*@__PURE__*/ core.$constructor(\"$ZodSuccess\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n throw new core.$ZodEncodeError(\"ZodSuccess\");\n }\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => {\n payload.value = result.issues.length === 0;\n return payload;\n });\n }\n payload.value = result.issues.length === 0;\n return payload;\n };\n});\nexport const $ZodCatch = /*@__PURE__*/ core.$constructor(\"$ZodCatch\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.optin = \"optional\";\n util.defineLazy(inst._zod, \"optout\", () => def.innerType._zod.optout);\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n // Forward direction (decode): apply catch logic\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => {\n payload.value = result.value;\n if (result.issues.length) {\n payload.value = def.catchValue({\n ...payload,\n error: {\n issues: result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n },\n input: payload.value,\n });\n payload.issues = [];\n payload.fallback = true;\n }\n return payload;\n });\n }\n payload.value = result.value;\n if (result.issues.length) {\n payload.value = def.catchValue({\n ...payload,\n error: {\n issues: result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n },\n input: payload.value,\n });\n payload.issues = [];\n payload.fallback = true;\n }\n return payload;\n };\n});\nexport const $ZodNaN = /*@__PURE__*/ core.$constructor(\"$ZodNaN\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n if (typeof payload.value !== \"number\" || !Number.isNaN(payload.value)) {\n payload.issues.push({\n input: payload.value,\n inst,\n expected: \"nan\",\n code: \"invalid_type\",\n });\n return payload;\n }\n return payload;\n };\n});\nexport const $ZodPipe = /*@__PURE__*/ core.$constructor(\"$ZodPipe\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"values\", () => def.in._zod.values);\n util.defineLazy(inst._zod, \"optin\", () => def.in._zod.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.out._zod.optout);\n util.defineLazy(inst._zod, \"propValues\", () => def.in._zod.propValues);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n const right = def.out._zod.run(payload, ctx);\n if (right instanceof Promise) {\n return right.then((right) => handlePipeResult(right, def.in, ctx));\n }\n return handlePipeResult(right, def.in, ctx);\n }\n const left = def.in._zod.run(payload, ctx);\n if (left instanceof Promise) {\n return left.then((left) => handlePipeResult(left, def.out, ctx));\n }\n return handlePipeResult(left, def.out, ctx);\n };\n});\nfunction handlePipeResult(left, next, ctx) {\n if (left.issues.length) {\n // prevent further checks\n left.aborted = true;\n return left;\n }\n return next._zod.run({ value: left.value, issues: left.issues, fallback: left.fallback }, ctx);\n}\nexport const $ZodCodec = /*@__PURE__*/ core.$constructor(\"$ZodCodec\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"values\", () => def.in._zod.values);\n util.defineLazy(inst._zod, \"optin\", () => def.in._zod.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.out._zod.optout);\n util.defineLazy(inst._zod, \"propValues\", () => def.in._zod.propValues);\n inst._zod.parse = (payload, ctx) => {\n const direction = ctx.direction || \"forward\";\n if (direction === \"forward\") {\n const left = def.in._zod.run(payload, ctx);\n if (left instanceof Promise) {\n return left.then((left) => handleCodecAResult(left, def, ctx));\n }\n return handleCodecAResult(left, def, ctx);\n }\n else {\n const right = def.out._zod.run(payload, ctx);\n if (right instanceof Promise) {\n return right.then((right) => handleCodecAResult(right, def, ctx));\n }\n return handleCodecAResult(right, def, ctx);\n }\n };\n});\nfunction handleCodecAResult(result, def, ctx) {\n if (result.issues.length) {\n // prevent further checks\n result.aborted = true;\n return result;\n }\n const direction = ctx.direction || \"forward\";\n if (direction === \"forward\") {\n const transformed = def.transform(result.value, result);\n if (transformed instanceof Promise) {\n return transformed.then((value) => handleCodecTxResult(result, value, def.out, ctx));\n }\n return handleCodecTxResult(result, transformed, def.out, ctx);\n }\n else {\n const transformed = def.reverseTransform(result.value, result);\n if (transformed instanceof Promise) {\n return transformed.then((value) => handleCodecTxResult(result, value, def.in, ctx));\n }\n return handleCodecTxResult(result, transformed, def.in, ctx);\n }\n}\nfunction handleCodecTxResult(left, value, nextSchema, ctx) {\n // Check if transform added any issues\n if (left.issues.length) {\n left.aborted = true;\n return left;\n }\n return nextSchema._zod.run({ value, issues: left.issues }, ctx);\n}\nexport const $ZodPreprocess = /*@__PURE__*/ core.$constructor(\"$ZodPreprocess\", (inst, def) => {\n $ZodPipe.init(inst, def);\n});\nexport const $ZodReadonly = /*@__PURE__*/ core.$constructor(\"$ZodReadonly\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"propValues\", () => def.innerType._zod.propValues);\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n util.defineLazy(inst._zod, \"optin\", () => def.innerType?._zod?.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.innerType?._zod?.optout);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then(handleReadonlyResult);\n }\n return handleReadonlyResult(result);\n };\n});\nfunction handleReadonlyResult(payload) {\n payload.value = Object.freeze(payload.value);\n return payload;\n}\nexport const $ZodTemplateLiteral = /*@__PURE__*/ core.$constructor(\"$ZodTemplateLiteral\", (inst, def) => {\n $ZodType.init(inst, def);\n const regexParts = [];\n for (const part of def.parts) {\n if (typeof part === \"object\" && part !== null) {\n // is Zod schema\n if (!part._zod.pattern) {\n // if (!source)\n throw new Error(`Invalid template literal part, no pattern found: ${[...part._zod.traits].shift()}`);\n }\n const source = part._zod.pattern instanceof RegExp ? part._zod.pattern.source : part._zod.pattern;\n if (!source)\n throw new Error(`Invalid template literal part: ${part._zod.traits}`);\n const start = source.startsWith(\"^\") ? 1 : 0;\n const end = source.endsWith(\"$\") ? source.length - 1 : source.length;\n regexParts.push(source.slice(start, end));\n }\n else if (part === null || util.primitiveTypes.has(typeof part)) {\n regexParts.push(util.escapeRegex(`${part}`));\n }\n else {\n throw new Error(`Invalid template literal part: ${part}`);\n }\n }\n inst._zod.pattern = new RegExp(`^${regexParts.join(\"\")}$`);\n inst._zod.parse = (payload, _ctx) => {\n if (typeof payload.value !== \"string\") {\n payload.issues.push({\n input: payload.value,\n inst,\n expected: \"string\",\n code: \"invalid_type\",\n });\n return payload;\n }\n inst._zod.pattern.lastIndex = 0;\n if (!inst._zod.pattern.test(payload.value)) {\n payload.issues.push({\n input: payload.value,\n inst,\n code: \"invalid_format\",\n format: def.format ?? \"template_literal\",\n pattern: inst._zod.pattern.source,\n });\n return payload;\n }\n return payload;\n };\n});\nexport const $ZodFunction = /*@__PURE__*/ core.$constructor(\"$ZodFunction\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._def = def;\n inst._zod.def = def;\n inst.implement = (func) => {\n if (typeof func !== \"function\") {\n throw new Error(\"implement() must be called with a function\");\n }\n return function (...args) {\n const parsedArgs = inst._def.input ? parse(inst._def.input, args) : args;\n const result = Reflect.apply(func, this, parsedArgs);\n if (inst._def.output) {\n return parse(inst._def.output, result);\n }\n return result;\n };\n };\n inst.implementAsync = (func) => {\n if (typeof func !== \"function\") {\n throw new Error(\"implementAsync() must be called with a function\");\n }\n return async function (...args) {\n const parsedArgs = inst._def.input ? await parseAsync(inst._def.input, args) : args;\n const result = await Reflect.apply(func, this, parsedArgs);\n if (inst._def.output) {\n return await parseAsync(inst._def.output, result);\n }\n return result;\n };\n };\n inst._zod.parse = (payload, _ctx) => {\n if (typeof payload.value !== \"function\") {\n payload.issues.push({\n code: \"invalid_type\",\n expected: \"function\",\n input: payload.value,\n inst,\n });\n return payload;\n }\n // Check if output is a promise type to determine if we should use async implementation\n const hasPromiseOutput = inst._def.output && inst._def.output._zod.def.type === \"promise\";\n if (hasPromiseOutput) {\n payload.value = inst.implementAsync(payload.value);\n }\n else {\n payload.value = inst.implement(payload.value);\n }\n return payload;\n };\n inst.input = (...args) => {\n const F = inst.constructor;\n if (Array.isArray(args[0])) {\n return new F({\n type: \"function\",\n input: new $ZodTuple({\n type: \"tuple\",\n items: args[0],\n rest: args[1],\n }),\n output: inst._def.output,\n });\n }\n return new F({\n type: \"function\",\n input: args[0],\n output: inst._def.output,\n });\n };\n inst.output = (output) => {\n const F = inst.constructor;\n return new F({\n type: \"function\",\n input: inst._def.input,\n output,\n });\n };\n return inst;\n});\nexport const $ZodPromise = /*@__PURE__*/ core.$constructor(\"$ZodPromise\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n return Promise.resolve(payload.value).then((inner) => def.innerType._zod.run({ value: inner, issues: [] }, ctx));\n };\n});\nexport const $ZodLazy = /*@__PURE__*/ core.$constructor(\"$ZodLazy\", (inst, def) => {\n $ZodType.init(inst, def);\n // Cache the resolved inner type on the shared `def` so all clones of this\n // lazy (e.g. via `.describe()`/`.meta()`) share the same inner instance,\n // preserving identity for cycle detection on recursive schemas.\n util.defineLazy(inst._zod, \"innerType\", () => {\n const d = def;\n if (!d._cachedInner)\n d._cachedInner = def.getter();\n return d._cachedInner;\n });\n util.defineLazy(inst._zod, \"pattern\", () => inst._zod.innerType?._zod?.pattern);\n util.defineLazy(inst._zod, \"propValues\", () => inst._zod.innerType?._zod?.propValues);\n util.defineLazy(inst._zod, \"optin\", () => inst._zod.innerType?._zod?.optin ?? undefined);\n util.defineLazy(inst._zod, \"optout\", () => inst._zod.innerType?._zod?.optout ?? undefined);\n inst._zod.parse = (payload, ctx) => {\n const inner = inst._zod.innerType;\n return inner._zod.run(payload, ctx);\n };\n});\nexport const $ZodCustom = /*@__PURE__*/ core.$constructor(\"$ZodCustom\", (inst, def) => {\n checks.$ZodCheck.init(inst, def);\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _) => {\n return payload;\n };\n inst._zod.check = (payload) => {\n const input = payload.value;\n const r = def.fn(input);\n if (r instanceof Promise) {\n return r.then((r) => handleRefineResult(r, payload, input, inst));\n }\n handleRefineResult(r, payload, input, inst);\n return;\n };\n});\nfunction handleRefineResult(result, payload, input, inst) {\n if (!result) {\n const _iss = {\n code: \"custom\",\n input,\n inst, // incorporates params.error into issue reporting\n path: [...(inst._zod.def.path ?? [])], // incorporates params.error into issue reporting\n continue: !inst._zod.def.abort,\n // params: inst._zod.def.params,\n };\n if (inst._zod.def.params)\n _iss.params = inst._zod.def.params;\n payload.issues.push(util.issue(_iss));\n }\n}\n","var _a;\nexport const $output = Symbol(\"ZodOutput\");\nexport const $input = Symbol(\"ZodInput\");\nexport class $ZodRegistry {\n constructor() {\n this._map = new WeakMap();\n this._idmap = new Map();\n }\n add(schema, ..._meta) {\n const meta = _meta[0];\n this._map.set(schema, meta);\n if (meta && typeof meta === \"object\" && \"id\" in meta) {\n this._idmap.set(meta.id, schema);\n }\n return this;\n }\n clear() {\n this._map = new WeakMap();\n this._idmap = new Map();\n return this;\n }\n remove(schema) {\n const meta = this._map.get(schema);\n if (meta && typeof meta === \"object\" && \"id\" in meta) {\n this._idmap.delete(meta.id);\n }\n this._map.delete(schema);\n return this;\n }\n get(schema) {\n // return this._map.get(schema) as any;\n // inherit metadata\n const p = schema._zod.parent;\n if (p) {\n const pm = { ...(this.get(p) ?? {}) };\n delete pm.id; // do not inherit id\n const f = { ...pm, ...this._map.get(schema) };\n return Object.keys(f).length ? f : undefined;\n }\n return this._map.get(schema);\n }\n has(schema) {\n return this._map.has(schema);\n }\n}\n// registries\nexport function registry() {\n return new $ZodRegistry();\n}\n(_a = globalThis).__zod_globalRegistry ?? (_a.__zod_globalRegistry = registry());\nexport const globalRegistry = globalThis.__zod_globalRegistry;\n","import * as checks from \"./checks.js\";\nimport * as registries from \"./registries.js\";\nimport * as schemas from \"./schemas.js\";\nimport * as util from \"./util.js\";\n// @__NO_SIDE_EFFECTS__\nexport function _string(Class, params) {\n return new Class({\n type: \"string\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedString(Class, params) {\n return new Class({\n type: \"string\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _email(Class, params) {\n return new Class({\n type: \"string\",\n format: \"email\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _guid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"guid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuidv4(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n version: \"v4\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuidv6(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n version: \"v6\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuidv7(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n version: \"v7\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _url(Class, params) {\n return new Class({\n type: \"string\",\n format: \"url\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _emoji(Class, params) {\n return new Class({\n type: \"string\",\n format: \"emoji\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nanoid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"nanoid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n/**\n * @deprecated CUID v1 is deprecated by its authors due to information leakage\n * (timestamps embedded in the id). Use {@link _cuid2} instead.\n * See https://github.com/paralleldrive/cuid.\n */\n// @__NO_SIDE_EFFECTS__\nexport function _cuid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cuid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cuid2(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cuid2\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ulid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ulid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _xid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"xid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ksuid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ksuid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ipv4(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ipv4\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ipv6(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ipv6\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _mac(Class, params) {\n return new Class({\n type: \"string\",\n format: \"mac\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cidrv4(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cidrv4\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cidrv6(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cidrv6\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _base64(Class, params) {\n return new Class({\n type: \"string\",\n format: \"base64\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _base64url(Class, params) {\n return new Class({\n type: \"string\",\n format: \"base64url\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _e164(Class, params) {\n return new Class({\n type: \"string\",\n format: \"e164\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _jwt(Class, params) {\n return new Class({\n type: \"string\",\n format: \"jwt\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\nexport const TimePrecision = {\n Any: null,\n Minute: -1,\n Second: 0,\n Millisecond: 3,\n Microsecond: 6,\n};\n// @__NO_SIDE_EFFECTS__\nexport function _isoDateTime(Class, params) {\n return new Class({\n type: \"string\",\n format: \"datetime\",\n check: \"string_format\",\n offset: false,\n local: false,\n precision: null,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _isoDate(Class, params) {\n return new Class({\n type: \"string\",\n format: \"date\",\n check: \"string_format\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _isoTime(Class, params) {\n return new Class({\n type: \"string\",\n format: \"time\",\n check: \"string_format\",\n precision: null,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _isoDuration(Class, params) {\n return new Class({\n type: \"string\",\n format: \"duration\",\n check: \"string_format\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _number(Class, params) {\n return new Class({\n type: \"number\",\n checks: [],\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedNumber(Class, params) {\n return new Class({\n type: \"number\",\n coerce: true,\n checks: [],\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _int(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"safeint\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _float32(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"float32\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _float64(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"float64\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _int32(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"int32\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uint32(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"uint32\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _boolean(Class, params) {\n return new Class({\n type: \"boolean\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedBoolean(Class, params) {\n return new Class({\n type: \"boolean\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _bigint(Class, params) {\n return new Class({\n type: \"bigint\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedBigint(Class, params) {\n return new Class({\n type: \"bigint\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _int64(Class, params) {\n return new Class({\n type: \"bigint\",\n check: \"bigint_format\",\n abort: false,\n format: \"int64\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uint64(Class, params) {\n return new Class({\n type: \"bigint\",\n check: \"bigint_format\",\n abort: false,\n format: \"uint64\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _symbol(Class, params) {\n return new Class({\n type: \"symbol\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _undefined(Class, params) {\n return new Class({\n type: \"undefined\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _null(Class, params) {\n return new Class({\n type: \"null\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _any(Class) {\n return new Class({\n type: \"any\",\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _unknown(Class) {\n return new Class({\n type: \"unknown\",\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _never(Class, params) {\n return new Class({\n type: \"never\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _void(Class, params) {\n return new Class({\n type: \"void\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _date(Class, params) {\n return new Class({\n type: \"date\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedDate(Class, params) {\n return new Class({\n type: \"date\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nan(Class, params) {\n return new Class({\n type: \"nan\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lt(value, params) {\n return new checks.$ZodCheckLessThan({\n check: \"less_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: false,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lte(value, params) {\n return new checks.$ZodCheckLessThan({\n check: \"less_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: true,\n });\n}\nexport { \n/** @deprecated Use `z.lte()` instead. */\n_lte as _max, };\n// @__NO_SIDE_EFFECTS__\nexport function _gt(value, params) {\n return new checks.$ZodCheckGreaterThan({\n check: \"greater_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: false,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _gte(value, params) {\n return new checks.$ZodCheckGreaterThan({\n check: \"greater_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: true,\n });\n}\nexport { \n/** @deprecated Use `z.gte()` instead. */\n_gte as _min, };\n// @__NO_SIDE_EFFECTS__\nexport function _positive(params) {\n return _gt(0, params);\n}\n// negative\n// @__NO_SIDE_EFFECTS__\nexport function _negative(params) {\n return _lt(0, params);\n}\n// nonpositive\n// @__NO_SIDE_EFFECTS__\nexport function _nonpositive(params) {\n return _lte(0, params);\n}\n// nonnegative\n// @__NO_SIDE_EFFECTS__\nexport function _nonnegative(params) {\n return _gte(0, params);\n}\n// @__NO_SIDE_EFFECTS__\nexport function _multipleOf(value, params) {\n return new checks.$ZodCheckMultipleOf({\n check: \"multiple_of\",\n ...util.normalizeParams(params),\n value,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _maxSize(maximum, params) {\n return new checks.$ZodCheckMaxSize({\n check: \"max_size\",\n ...util.normalizeParams(params),\n maximum,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _minSize(minimum, params) {\n return new checks.$ZodCheckMinSize({\n check: \"min_size\",\n ...util.normalizeParams(params),\n minimum,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _size(size, params) {\n return new checks.$ZodCheckSizeEquals({\n check: \"size_equals\",\n ...util.normalizeParams(params),\n size,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _maxLength(maximum, params) {\n const ch = new checks.$ZodCheckMaxLength({\n check: \"max_length\",\n ...util.normalizeParams(params),\n maximum,\n });\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _minLength(minimum, params) {\n return new checks.$ZodCheckMinLength({\n check: \"min_length\",\n ...util.normalizeParams(params),\n minimum,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _length(length, params) {\n return new checks.$ZodCheckLengthEquals({\n check: \"length_equals\",\n ...util.normalizeParams(params),\n length,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _regex(pattern, params) {\n return new checks.$ZodCheckRegex({\n check: \"string_format\",\n format: \"regex\",\n ...util.normalizeParams(params),\n pattern,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lowercase(params) {\n return new checks.$ZodCheckLowerCase({\n check: \"string_format\",\n format: \"lowercase\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uppercase(params) {\n return new checks.$ZodCheckUpperCase({\n check: \"string_format\",\n format: \"uppercase\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _includes(includes, params) {\n return new checks.$ZodCheckIncludes({\n check: \"string_format\",\n format: \"includes\",\n ...util.normalizeParams(params),\n includes,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _startsWith(prefix, params) {\n return new checks.$ZodCheckStartsWith({\n check: \"string_format\",\n format: \"starts_with\",\n ...util.normalizeParams(params),\n prefix,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _endsWith(suffix, params) {\n return new checks.$ZodCheckEndsWith({\n check: \"string_format\",\n format: \"ends_with\",\n ...util.normalizeParams(params),\n suffix,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _property(property, schema, params) {\n return new checks.$ZodCheckProperty({\n check: \"property\",\n property,\n schema,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _mime(types, params) {\n return new checks.$ZodCheckMimeType({\n check: \"mime_type\",\n mime: types,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _overwrite(tx) {\n return new checks.$ZodCheckOverwrite({\n check: \"overwrite\",\n tx,\n });\n}\n// normalize\n// @__NO_SIDE_EFFECTS__\nexport function _normalize(form) {\n return _overwrite((input) => input.normalize(form));\n}\n// trim\n// @__NO_SIDE_EFFECTS__\nexport function _trim() {\n return _overwrite((input) => input.trim());\n}\n// toLowerCase\n// @__NO_SIDE_EFFECTS__\nexport function _toLowerCase() {\n return _overwrite((input) => input.toLowerCase());\n}\n// toUpperCase\n// @__NO_SIDE_EFFECTS__\nexport function _toUpperCase() {\n return _overwrite((input) => input.toUpperCase());\n}\n// slugify\n// @__NO_SIDE_EFFECTS__\nexport function _slugify() {\n return _overwrite((input) => util.slugify(input));\n}\n// @__NO_SIDE_EFFECTS__\nexport function _array(Class, element, params) {\n return new Class({\n type: \"array\",\n element,\n // get element() {\n // return element;\n // },\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _union(Class, options, params) {\n return new Class({\n type: \"union\",\n options,\n ...util.normalizeParams(params),\n });\n}\nexport function _xor(Class, options, params) {\n return new Class({\n type: \"union\",\n options,\n inclusive: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _discriminatedUnion(Class, discriminator, options, params) {\n return new Class({\n type: \"union\",\n options,\n discriminator,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _intersection(Class, left, right) {\n return new Class({\n type: \"intersection\",\n left,\n right,\n });\n}\n// export function _tuple(\n// Class: util.SchemaClass<schemas.$ZodTuple>,\n// items: [],\n// params?: string | $ZodTupleParams\n// ): schemas.$ZodTuple<[], null>;\n// @__NO_SIDE_EFFECTS__\nexport function _tuple(Class, items, _paramsOrRest, _params) {\n const hasRest = _paramsOrRest instanceof schemas.$ZodType;\n const params = hasRest ? _params : _paramsOrRest;\n const rest = hasRest ? _paramsOrRest : null;\n return new Class({\n type: \"tuple\",\n items,\n rest,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _record(Class, keyType, valueType, params) {\n return new Class({\n type: \"record\",\n keyType,\n valueType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _map(Class, keyType, valueType, params) {\n return new Class({\n type: \"map\",\n keyType,\n valueType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _set(Class, valueType, params) {\n return new Class({\n type: \"set\",\n valueType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _enum(Class, values, params) {\n const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values;\n // if (Array.isArray(values)) {\n // for (const value of values) {\n // entries[value] = value;\n // }\n // } else {\n // Object.assign(entries, values);\n // }\n // const entries: util.EnumLike = {};\n // for (const val of values) {\n // entries[val] = val;\n // }\n return new Class({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\n/** @deprecated This API has been merged into `z.enum()`. Use `z.enum()` instead.\n *\n * ```ts\n * enum Colors { red, green, blue }\n * z.enum(Colors);\n * ```\n */\nexport function _nativeEnum(Class, entries, params) {\n return new Class({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _literal(Class, value, params) {\n return new Class({\n type: \"literal\",\n values: Array.isArray(value) ? value : [value],\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _file(Class, params) {\n return new Class({\n type: \"file\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _transform(Class, fn) {\n return new Class({\n type: \"transform\",\n transform: fn,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _optional(Class, innerType) {\n return new Class({\n type: \"optional\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nullable(Class, innerType) {\n return new Class({\n type: \"nullable\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _default(Class, innerType, defaultValue) {\n return new Class({\n type: \"default\",\n innerType,\n get defaultValue() {\n return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n },\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nonoptional(Class, innerType, params) {\n return new Class({\n type: \"nonoptional\",\n innerType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _success(Class, innerType) {\n return new Class({\n type: \"success\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _catch(Class, innerType, catchValue) {\n return new Class({\n type: \"catch\",\n innerType,\n catchValue: (typeof catchValue === \"function\" ? catchValue : () => catchValue),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _pipe(Class, in_, out) {\n return new Class({\n type: \"pipe\",\n in: in_,\n out,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _readonly(Class, innerType) {\n return new Class({\n type: \"readonly\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _templateLiteral(Class, parts, params) {\n return new Class({\n type: \"template_literal\",\n parts,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lazy(Class, getter) {\n return new Class({\n type: \"lazy\",\n getter,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _promise(Class, innerType) {\n return new Class({\n type: \"promise\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _custom(Class, fn, _params) {\n const norm = util.normalizeParams(_params);\n norm.abort ?? (norm.abort = true); // default to abort:false\n const schema = new Class({\n type: \"custom\",\n check: \"custom\",\n fn: fn,\n ...norm,\n });\n return schema;\n}\n// same as _custom but defaults to abort:false\n// @__NO_SIDE_EFFECTS__\nexport function _refine(Class, fn, _params) {\n const schema = new Class({\n type: \"custom\",\n check: \"custom\",\n fn: fn,\n ...util.normalizeParams(_params),\n });\n return schema;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _superRefine(fn, params) {\n const ch = _check((payload) => {\n payload.addIssue = (issue) => {\n if (typeof issue === \"string\") {\n payload.issues.push(util.issue(issue, payload.value, ch._zod.def));\n }\n else {\n // for Zod 3 backwards compatibility\n const _issue = issue;\n if (_issue.fatal)\n _issue.continue = false;\n _issue.code ?? (_issue.code = \"custom\");\n _issue.input ?? (_issue.input = payload.value);\n _issue.inst ?? (_issue.inst = ch);\n _issue.continue ?? (_issue.continue = !ch._zod.def.abort); // abort is always undefined, so this is always true...\n payload.issues.push(util.issue(_issue));\n }\n };\n return fn(payload.value, payload);\n }, params);\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _check(fn, params) {\n const ch = new checks.$ZodCheck({\n check: \"custom\",\n ...util.normalizeParams(params),\n });\n ch._zod.check = fn;\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function describe(description) {\n const ch = new checks.$ZodCheck({ check: \"describe\" });\n ch._zod.onattach = [\n (inst) => {\n const existing = registries.globalRegistry.get(inst) ?? {};\n registries.globalRegistry.add(inst, { ...existing, description });\n },\n ];\n ch._zod.check = () => { }; // no-op check\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function meta(metadata) {\n const ch = new checks.$ZodCheck({ check: \"meta\" });\n ch._zod.onattach = [\n (inst) => {\n const existing = registries.globalRegistry.get(inst) ?? {};\n registries.globalRegistry.add(inst, { ...existing, ...metadata });\n },\n ];\n ch._zod.check = () => { }; // no-op check\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _stringbool(Classes, _params) {\n const params = util.normalizeParams(_params);\n let truthyArray = params.truthy ?? [\"true\", \"1\", \"yes\", \"on\", \"y\", \"enabled\"];\n let falsyArray = params.falsy ?? [\"false\", \"0\", \"no\", \"off\", \"n\", \"disabled\"];\n if (params.case !== \"sensitive\") {\n truthyArray = truthyArray.map((v) => (typeof v === \"string\" ? v.toLowerCase() : v));\n falsyArray = falsyArray.map((v) => (typeof v === \"string\" ? v.toLowerCase() : v));\n }\n const truthySet = new Set(truthyArray);\n const falsySet = new Set(falsyArray);\n const _Codec = Classes.Codec ?? schemas.$ZodCodec;\n const _Boolean = Classes.Boolean ?? schemas.$ZodBoolean;\n const _String = Classes.String ?? schemas.$ZodString;\n const stringSchema = new _String({ type: \"string\", error: params.error });\n const booleanSchema = new _Boolean({ type: \"boolean\", error: params.error });\n const codec = new _Codec({\n type: \"pipe\",\n in: stringSchema,\n out: booleanSchema,\n transform: ((input, payload) => {\n let data = input;\n if (params.case !== \"sensitive\")\n data = data.toLowerCase();\n if (truthySet.has(data)) {\n return true;\n }\n else if (falsySet.has(data)) {\n return false;\n }\n else {\n payload.issues.push({\n code: \"invalid_value\",\n expected: \"stringbool\",\n values: [...truthySet, ...falsySet],\n input: payload.value,\n inst: codec,\n continue: false,\n });\n return {};\n }\n }),\n reverseTransform: ((input, _payload) => {\n if (input === true) {\n return truthyArray[0] || \"true\";\n }\n else {\n return falsyArray[0] || \"false\";\n }\n }),\n error: params.error,\n });\n return codec;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _stringFormat(Class, format, fnOrRegex, _params = {}) {\n const params = util.normalizeParams(_params);\n const def = {\n ...util.normalizeParams(_params),\n check: \"string_format\",\n type: \"string\",\n format,\n fn: typeof fnOrRegex === \"function\" ? fnOrRegex : (val) => fnOrRegex.test(val),\n ...params,\n };\n if (fnOrRegex instanceof RegExp) {\n def.pattern = fnOrRegex;\n }\n const inst = new Class(def);\n return inst;\n}\n","import { globalRegistry } from \"./registries.js\";\n// function initializeContext<T extends schemas.$ZodType>(inputs: JSONSchemaGeneratorParams<T>): ToJSONSchemaContext<T> {\n// return {\n// processor: inputs.processor,\n// metadataRegistry: inputs.metadata ?? globalRegistry,\n// target: inputs.target ?? \"draft-2020-12\",\n// unrepresentable: inputs.unrepresentable ?? \"throw\",\n// };\n// }\nexport function initializeContext(params) {\n // Normalize target: convert old non-hyphenated versions to hyphenated versions\n let target = params?.target ?? \"draft-2020-12\";\n if (target === \"draft-4\")\n target = \"draft-04\";\n if (target === \"draft-7\")\n target = \"draft-07\";\n return {\n processors: params.processors ?? {},\n metadataRegistry: params?.metadata ?? globalRegistry,\n target,\n unrepresentable: params?.unrepresentable ?? \"throw\",\n override: params?.override ?? (() => { }),\n io: params?.io ?? \"output\",\n counter: 0,\n seen: new Map(),\n cycles: params?.cycles ?? \"ref\",\n reused: params?.reused ?? \"inline\",\n external: params?.external ?? undefined,\n };\n}\nexport function process(schema, ctx, _params = { path: [], schemaPath: [] }) {\n var _a;\n const def = schema._zod.def;\n // check for schema in seens\n const seen = ctx.seen.get(schema);\n if (seen) {\n seen.count++;\n // check if cycle\n const isCycle = _params.schemaPath.includes(schema);\n if (isCycle) {\n seen.cycle = _params.path;\n }\n return seen.schema;\n }\n // initialize\n const result = { schema: {}, count: 1, cycle: undefined, path: _params.path };\n ctx.seen.set(schema, result);\n // custom method overrides default behavior\n const overrideSchema = schema._zod.toJSONSchema?.();\n if (overrideSchema) {\n result.schema = overrideSchema;\n }\n else {\n const params = {\n ..._params,\n schemaPath: [..._params.schemaPath, schema],\n path: _params.path,\n };\n if (schema._zod.processJSONSchema) {\n schema._zod.processJSONSchema(ctx, result.schema, params);\n }\n else {\n const _json = result.schema;\n const processor = ctx.processors[def.type];\n if (!processor) {\n throw new Error(`[toJSONSchema]: Non-representable type encountered: ${def.type}`);\n }\n processor(schema, ctx, _json, params);\n }\n const parent = schema._zod.parent;\n if (parent) {\n // Also set ref if processor didn't (for inheritance)\n if (!result.ref)\n result.ref = parent;\n process(parent, ctx, params);\n ctx.seen.get(parent).isParent = true;\n }\n }\n // metadata\n const meta = ctx.metadataRegistry.get(schema);\n if (meta)\n Object.assign(result.schema, meta);\n if (ctx.io === \"input\" && isTransforming(schema)) {\n // examples/defaults only apply to output type of pipe\n delete result.schema.examples;\n delete result.schema.default;\n }\n // set prefault as default\n if (ctx.io === \"input\" && \"_prefault\" in result.schema)\n (_a = result.schema).default ?? (_a.default = result.schema._prefault);\n delete result.schema._prefault;\n // pulling fresh from ctx.seen in case it was overwritten\n const _result = ctx.seen.get(schema);\n return _result.schema;\n}\nexport function extractDefs(ctx, schema\n// params: EmitParams\n) {\n // iterate over seen map;\n const root = ctx.seen.get(schema);\n if (!root)\n throw new Error(\"Unprocessed schema. This is a bug in Zod.\");\n // Track ids to detect duplicates across different schemas\n const idToSchema = new Map();\n for (const entry of ctx.seen.entries()) {\n const id = ctx.metadataRegistry.get(entry[0])?.id;\n if (id) {\n const existing = idToSchema.get(id);\n if (existing && existing !== entry[0]) {\n throw new Error(`Duplicate schema id \"${id}\" detected during JSON Schema conversion. Two different schemas cannot share the same id when converted together.`);\n }\n idToSchema.set(id, entry[0]);\n }\n }\n // returns a ref to the schema\n // defId will be empty if the ref points to an external schema (or #)\n const makeURI = (entry) => {\n // comparing the seen objects because sometimes\n // multiple schemas map to the same seen object.\n // e.g. lazy\n // external is configured\n const defsSegment = ctx.target === \"draft-2020-12\" ? \"$defs\" : \"definitions\";\n if (ctx.external) {\n const externalId = ctx.external.registry.get(entry[0])?.id; // ?? \"__shared\";// `__schema${ctx.counter++}`;\n // check if schema is in the external registry\n const uriGenerator = ctx.external.uri ?? ((id) => id);\n if (externalId) {\n return { ref: uriGenerator(externalId) };\n }\n // otherwise, add to __shared\n const id = entry[1].defId ?? entry[1].schema.id ?? `schema${ctx.counter++}`;\n entry[1].defId = id; // set defId so it will be reused if needed\n return { defId: id, ref: `${uriGenerator(\"__shared\")}#/${defsSegment}/${id}` };\n }\n if (entry[1] === root) {\n return { ref: \"#\" };\n }\n // self-contained schema\n const uriPrefix = `#`;\n const defUriPrefix = `${uriPrefix}/${defsSegment}/`;\n const defId = entry[1].schema.id ?? `__schema${ctx.counter++}`;\n return { defId, ref: defUriPrefix + defId };\n };\n // stored cached version in `def` property\n // remove all properties, set $ref\n const extractToDef = (entry) => {\n // if the schema is already a reference, do not extract it\n if (entry[1].schema.$ref) {\n return;\n }\n const seen = entry[1];\n const { ref, defId } = makeURI(entry);\n seen.def = { ...seen.schema };\n // defId won't be set if the schema is a reference to an external schema\n // or if the schema is the root schema\n if (defId)\n seen.defId = defId;\n // wipe away all properties except $ref\n const schema = seen.schema;\n for (const key in schema) {\n delete schema[key];\n }\n schema.$ref = ref;\n };\n // throw on cycles\n // break cycles\n if (ctx.cycles === \"throw\") {\n for (const entry of ctx.seen.entries()) {\n const seen = entry[1];\n if (seen.cycle) {\n throw new Error(\"Cycle detected: \" +\n `#/${seen.cycle?.join(\"/\")}/<root>` +\n '\\n\\nSet the `cycles` parameter to `\"ref\"` to resolve cyclical schemas with defs.');\n }\n }\n }\n // extract schemas into $defs\n for (const entry of ctx.seen.entries()) {\n const seen = entry[1];\n // convert root schema to # $ref\n if (schema === entry[0]) {\n extractToDef(entry); // this has special handling for the root schema\n continue;\n }\n // extract schemas that are in the external registry\n if (ctx.external) {\n const ext = ctx.external.registry.get(entry[0])?.id;\n if (schema !== entry[0] && ext) {\n extractToDef(entry);\n continue;\n }\n }\n // extract schemas with `id` meta\n const id = ctx.metadataRegistry.get(entry[0])?.id;\n if (id) {\n extractToDef(entry);\n continue;\n }\n // break cycles\n if (seen.cycle) {\n // any\n extractToDef(entry);\n continue;\n }\n // extract reused schemas\n if (seen.count > 1) {\n if (ctx.reused === \"ref\") {\n extractToDef(entry);\n // biome-ignore lint:\n continue;\n }\n }\n }\n}\nexport function finalize(ctx, schema) {\n const root = ctx.seen.get(schema);\n if (!root)\n throw new Error(\"Unprocessed schema. This is a bug in Zod.\");\n // flatten refs - inherit properties from parent schemas\n const flattenRef = (zodSchema) => {\n const seen = ctx.seen.get(zodSchema);\n // already processed\n if (seen.ref === null)\n return;\n const schema = seen.def ?? seen.schema;\n const _cached = { ...schema };\n const ref = seen.ref;\n seen.ref = null; // prevent infinite recursion\n if (ref) {\n flattenRef(ref);\n const refSeen = ctx.seen.get(ref);\n const refSchema = refSeen.schema;\n // merge referenced schema into current\n if (refSchema.$ref && (ctx.target === \"draft-07\" || ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\")) {\n // older drafts can't combine $ref with other properties\n schema.allOf = schema.allOf ?? [];\n schema.allOf.push(refSchema);\n }\n else {\n Object.assign(schema, refSchema);\n }\n // restore child's own properties (child wins)\n Object.assign(schema, _cached);\n const isParentRef = zodSchema._zod.parent === ref;\n // For parent chain, child is a refinement - remove parent-only properties\n if (isParentRef) {\n for (const key in schema) {\n if (key === \"$ref\" || key === \"allOf\")\n continue;\n if (!(key in _cached)) {\n delete schema[key];\n }\n }\n }\n // When ref was extracted to $defs, remove properties that match the definition\n if (refSchema.$ref && refSeen.def) {\n for (const key in schema) {\n if (key === \"$ref\" || key === \"allOf\")\n continue;\n if (key in refSeen.def && JSON.stringify(schema[key]) === JSON.stringify(refSeen.def[key])) {\n delete schema[key];\n }\n }\n }\n }\n // If parent was extracted (has $ref), propagate $ref to this schema\n // This handles cases like: readonly().meta({id}).describe()\n // where processor sets ref to innerType but parent should be referenced\n const parent = zodSchema._zod.parent;\n if (parent && parent !== ref) {\n // Ensure parent is processed first so its def has inherited properties\n flattenRef(parent);\n const parentSeen = ctx.seen.get(parent);\n if (parentSeen?.schema.$ref) {\n schema.$ref = parentSeen.schema.$ref;\n // De-duplicate with parent's definition\n if (parentSeen.def) {\n for (const key in schema) {\n if (key === \"$ref\" || key === \"allOf\")\n continue;\n if (key in parentSeen.def && JSON.stringify(schema[key]) === JSON.stringify(parentSeen.def[key])) {\n delete schema[key];\n }\n }\n }\n }\n }\n // execute overrides\n ctx.override({\n zodSchema: zodSchema,\n jsonSchema: schema,\n path: seen.path ?? [],\n });\n };\n for (const entry of [...ctx.seen.entries()].reverse()) {\n flattenRef(entry[0]);\n }\n const result = {};\n if (ctx.target === \"draft-2020-12\") {\n result.$schema = \"https://json-schema.org/draft/2020-12/schema\";\n }\n else if (ctx.target === \"draft-07\") {\n result.$schema = \"http://json-schema.org/draft-07/schema#\";\n }\n else if (ctx.target === \"draft-04\") {\n result.$schema = \"http://json-schema.org/draft-04/schema#\";\n }\n else if (ctx.target === \"openapi-3.0\") {\n // OpenAPI 3.0 schema objects should not include a $schema property\n }\n else {\n // Arbitrary string values are allowed but won't have a $schema property set\n }\n if (ctx.external?.uri) {\n const id = ctx.external.registry.get(schema)?.id;\n if (!id)\n throw new Error(\"Schema is missing an `id` property\");\n result.$id = ctx.external.uri(id);\n }\n Object.assign(result, root.def ?? root.schema);\n // The `id` in `.meta()` is a Zod-specific registration tag used to extract\n // schemas into $defs — it is not user-facing JSON Schema metadata. Strip it\n // from the output body where it would otherwise leak. The id is preserved\n // implicitly via the $defs key (and via $ref paths).\n const rootMetaId = ctx.metadataRegistry.get(schema)?.id;\n if (rootMetaId !== undefined && result.id === rootMetaId)\n delete result.id;\n // build defs object\n const defs = ctx.external?.defs ?? {};\n for (const entry of ctx.seen.entries()) {\n const seen = entry[1];\n if (seen.def && seen.defId) {\n if (seen.def.id === seen.defId)\n delete seen.def.id;\n defs[seen.defId] = seen.def;\n }\n }\n // set definitions in result\n if (ctx.external) {\n }\n else {\n if (Object.keys(defs).length > 0) {\n if (ctx.target === \"draft-2020-12\") {\n result.$defs = defs;\n }\n else {\n result.definitions = defs;\n }\n }\n }\n try {\n // this \"finalizes\" this schema and ensures all cycles are removed\n // each call to finalize() is functionally independent\n // though the seen map is shared\n const finalized = JSON.parse(JSON.stringify(result));\n Object.defineProperty(finalized, \"~standard\", {\n value: {\n ...schema[\"~standard\"],\n jsonSchema: {\n input: createStandardJSONSchemaMethod(schema, \"input\", ctx.processors),\n output: createStandardJSONSchemaMethod(schema, \"output\", ctx.processors),\n },\n },\n enumerable: false,\n writable: false,\n });\n return finalized;\n }\n catch (_err) {\n throw new Error(\"Error converting schema to JSON.\");\n }\n}\nfunction isTransforming(_schema, _ctx) {\n const ctx = _ctx ?? { seen: new Set() };\n if (ctx.seen.has(_schema))\n return false;\n ctx.seen.add(_schema);\n const def = _schema._zod.def;\n if (def.type === \"transform\")\n return true;\n if (def.type === \"array\")\n return isTransforming(def.element, ctx);\n if (def.type === \"set\")\n return isTransforming(def.valueType, ctx);\n if (def.type === \"lazy\")\n return isTransforming(def.getter(), ctx);\n if (def.type === \"promise\" ||\n def.type === \"optional\" ||\n def.type === \"nonoptional\" ||\n def.type === \"nullable\" ||\n def.type === \"readonly\" ||\n def.type === \"default\" ||\n def.type === \"prefault\") {\n return isTransforming(def.innerType, ctx);\n }\n if (def.type === \"intersection\") {\n return isTransforming(def.left, ctx) || isTransforming(def.right, ctx);\n }\n if (def.type === \"record\" || def.type === \"map\") {\n return isTransforming(def.keyType, ctx) || isTransforming(def.valueType, ctx);\n }\n if (def.type === \"pipe\") {\n if (_schema._zod.traits.has(\"$ZodCodec\"))\n return true;\n return isTransforming(def.in, ctx) || isTransforming(def.out, ctx);\n }\n if (def.type === \"object\") {\n for (const key in def.shape) {\n if (isTransforming(def.shape[key], ctx))\n return true;\n }\n return false;\n }\n if (def.type === \"union\") {\n for (const option of def.options) {\n if (isTransforming(option, ctx))\n return true;\n }\n return false;\n }\n if (def.type === \"tuple\") {\n for (const item of def.items) {\n if (isTransforming(item, ctx))\n return true;\n }\n if (def.rest && isTransforming(def.rest, ctx))\n return true;\n return false;\n }\n return false;\n}\n/**\n * Creates a toJSONSchema method for a schema instance.\n * This encapsulates the logic of initializing context, processing, extracting defs, and finalizing.\n */\nexport const createToJSONSchemaMethod = (schema, processors = {}) => (params) => {\n const ctx = initializeContext({ ...params, processors });\n process(schema, ctx);\n extractDefs(ctx, schema);\n return finalize(ctx, schema);\n};\nexport const createStandardJSONSchemaMethod = (schema, io, processors = {}) => (params) => {\n const { libraryOptions, target } = params ?? {};\n const ctx = initializeContext({ ...(libraryOptions ?? {}), target, io, processors });\n process(schema, ctx);\n extractDefs(ctx, schema);\n return finalize(ctx, schema);\n};\n","import { extractDefs, finalize, initializeContext, process, } from \"./to-json-schema.js\";\nimport { getEnumValues } from \"./util.js\";\nconst formatMap = {\n guid: \"uuid\",\n url: \"uri\",\n datetime: \"date-time\",\n json_string: \"json-string\",\n regex: \"\", // do not set\n};\n// ==================== SIMPLE TYPE PROCESSORS ====================\nexport const stringProcessor = (schema, ctx, _json, _params) => {\n const json = _json;\n json.type = \"string\";\n const { minimum, maximum, format, patterns, contentEncoding } = schema._zod\n .bag;\n if (typeof minimum === \"number\")\n json.minLength = minimum;\n if (typeof maximum === \"number\")\n json.maxLength = maximum;\n // custom pattern overrides format\n if (format) {\n json.format = formatMap[format] ?? format;\n if (json.format === \"\")\n delete json.format; // empty format is not valid\n // JSON Schema format: \"time\" requires a full time with offset or Z\n // z.iso.time() does not include timezone information, so format: \"time\" should never be used\n if (format === \"time\") {\n delete json.format;\n }\n }\n if (contentEncoding)\n json.contentEncoding = contentEncoding;\n if (patterns && patterns.size > 0) {\n const regexes = [...patterns];\n if (regexes.length === 1)\n json.pattern = regexes[0].source;\n else if (regexes.length > 1) {\n json.allOf = [\n ...regexes.map((regex) => ({\n ...(ctx.target === \"draft-07\" || ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\"\n ? { type: \"string\" }\n : {}),\n pattern: regex.source,\n })),\n ];\n }\n }\n};\nexport const numberProcessor = (schema, ctx, _json, _params) => {\n const json = _json;\n const { minimum, maximum, format, multipleOf, exclusiveMaximum, exclusiveMinimum } = schema._zod.bag;\n if (typeof format === \"string\" && format.includes(\"int\"))\n json.type = \"integer\";\n else\n json.type = \"number\";\n // when both minimum and exclusiveMinimum exist, pick the more restrictive one\n const exMin = typeof exclusiveMinimum === \"number\" && exclusiveMinimum >= (minimum ?? Number.NEGATIVE_INFINITY);\n const exMax = typeof exclusiveMaximum === \"number\" && exclusiveMaximum <= (maximum ?? Number.POSITIVE_INFINITY);\n const legacy = ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\";\n if (exMin) {\n if (legacy) {\n json.minimum = exclusiveMinimum;\n json.exclusiveMinimum = true;\n }\n else {\n json.exclusiveMinimum = exclusiveMinimum;\n }\n }\n else if (typeof minimum === \"number\") {\n json.minimum = minimum;\n }\n if (exMax) {\n if (legacy) {\n json.maximum = exclusiveMaximum;\n json.exclusiveMaximum = true;\n }\n else {\n json.exclusiveMaximum = exclusiveMaximum;\n }\n }\n else if (typeof maximum === \"number\") {\n json.maximum = maximum;\n }\n if (typeof multipleOf === \"number\")\n json.multipleOf = multipleOf;\n};\nexport const booleanProcessor = (_schema, _ctx, json, _params) => {\n json.type = \"boolean\";\n};\nexport const bigintProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"BigInt cannot be represented in JSON Schema\");\n }\n};\nexport const symbolProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Symbols cannot be represented in JSON Schema\");\n }\n};\nexport const nullProcessor = (_schema, ctx, json, _params) => {\n if (ctx.target === \"openapi-3.0\") {\n json.type = \"string\";\n json.nullable = true;\n json.enum = [null];\n }\n else {\n json.type = \"null\";\n }\n};\nexport const undefinedProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Undefined cannot be represented in JSON Schema\");\n }\n};\nexport const voidProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Void cannot be represented in JSON Schema\");\n }\n};\nexport const neverProcessor = (_schema, _ctx, json, _params) => {\n json.not = {};\n};\nexport const anyProcessor = (_schema, _ctx, _json, _params) => {\n // empty schema accepts anything\n};\nexport const unknownProcessor = (_schema, _ctx, _json, _params) => {\n // empty schema accepts anything\n};\nexport const dateProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Date cannot be represented in JSON Schema\");\n }\n};\nexport const enumProcessor = (schema, _ctx, json, _params) => {\n const def = schema._zod.def;\n const values = getEnumValues(def.entries);\n // Number enums can have both string and number values\n if (values.every((v) => typeof v === \"number\"))\n json.type = \"number\";\n if (values.every((v) => typeof v === \"string\"))\n json.type = \"string\";\n json.enum = values;\n};\nexport const literalProcessor = (schema, ctx, json, _params) => {\n const def = schema._zod.def;\n const vals = [];\n for (const val of def.values) {\n if (val === undefined) {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Literal `undefined` cannot be represented in JSON Schema\");\n }\n else {\n // do not add to vals\n }\n }\n else if (typeof val === \"bigint\") {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"BigInt literals cannot be represented in JSON Schema\");\n }\n else {\n vals.push(Number(val));\n }\n }\n else {\n vals.push(val);\n }\n }\n if (vals.length === 0) {\n // do nothing (an undefined literal was stripped)\n }\n else if (vals.length === 1) {\n const val = vals[0];\n json.type = val === null ? \"null\" : typeof val;\n if (ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\") {\n json.enum = [val];\n }\n else {\n json.const = val;\n }\n }\n else {\n if (vals.every((v) => typeof v === \"number\"))\n json.type = \"number\";\n if (vals.every((v) => typeof v === \"string\"))\n json.type = \"string\";\n if (vals.every((v) => typeof v === \"boolean\"))\n json.type = \"boolean\";\n if (vals.every((v) => v === null))\n json.type = \"null\";\n json.enum = vals;\n }\n};\nexport const nanProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"NaN cannot be represented in JSON Schema\");\n }\n};\nexport const templateLiteralProcessor = (schema, _ctx, json, _params) => {\n const _json = json;\n const pattern = schema._zod.pattern;\n if (!pattern)\n throw new Error(\"Pattern not found in template literal\");\n _json.type = \"string\";\n _json.pattern = pattern.source;\n};\nexport const fileProcessor = (schema, _ctx, json, _params) => {\n const _json = json;\n const file = {\n type: \"string\",\n format: \"binary\",\n contentEncoding: \"binary\",\n };\n const { minimum, maximum, mime } = schema._zod.bag;\n if (minimum !== undefined)\n file.minLength = minimum;\n if (maximum !== undefined)\n file.maxLength = maximum;\n if (mime) {\n if (mime.length === 1) {\n file.contentMediaType = mime[0];\n Object.assign(_json, file);\n }\n else {\n Object.assign(_json, file); // shared props at root\n _json.anyOf = mime.map((m) => ({ contentMediaType: m })); // only contentMediaType differs\n }\n }\n else {\n Object.assign(_json, file);\n }\n};\nexport const successProcessor = (_schema, _ctx, json, _params) => {\n json.type = \"boolean\";\n};\nexport const customProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Custom types cannot be represented in JSON Schema\");\n }\n};\nexport const functionProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Function types cannot be represented in JSON Schema\");\n }\n};\nexport const transformProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Transforms cannot be represented in JSON Schema\");\n }\n};\nexport const mapProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Map cannot be represented in JSON Schema\");\n }\n};\nexport const setProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Set cannot be represented in JSON Schema\");\n }\n};\n// ==================== COMPOSITE TYPE PROCESSORS ====================\nexport const arrayProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n const { minimum, maximum } = schema._zod.bag;\n if (typeof minimum === \"number\")\n json.minItems = minimum;\n if (typeof maximum === \"number\")\n json.maxItems = maximum;\n json.type = \"array\";\n json.items = process(def.element, ctx, {\n ...params,\n path: [...params.path, \"items\"],\n });\n};\nexport const objectProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n json.type = \"object\";\n json.properties = {};\n const shape = def.shape;\n for (const key in shape) {\n json.properties[key] = process(shape[key], ctx, {\n ...params,\n path: [...params.path, \"properties\", key],\n });\n }\n // required keys\n const allKeys = new Set(Object.keys(shape));\n const requiredKeys = new Set([...allKeys].filter((key) => {\n const v = def.shape[key]._zod;\n if (ctx.io === \"input\") {\n return v.optin === undefined;\n }\n else {\n return v.optout === undefined;\n }\n }));\n if (requiredKeys.size > 0) {\n json.required = Array.from(requiredKeys);\n }\n // catchall\n if (def.catchall?._zod.def.type === \"never\") {\n // strict\n json.additionalProperties = false;\n }\n else if (!def.catchall) {\n // regular\n if (ctx.io === \"output\")\n json.additionalProperties = false;\n }\n else if (def.catchall) {\n json.additionalProperties = process(def.catchall, ctx, {\n ...params,\n path: [...params.path, \"additionalProperties\"],\n });\n }\n};\nexport const unionProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n // Exclusive unions (inclusive === false) use oneOf (exactly one match) instead of anyOf (one or more matches)\n // This includes both z.xor() and discriminated unions\n const isExclusive = def.inclusive === false;\n const options = def.options.map((x, i) => process(x, ctx, {\n ...params,\n path: [...params.path, isExclusive ? \"oneOf\" : \"anyOf\", i],\n }));\n if (isExclusive) {\n json.oneOf = options;\n }\n else {\n json.anyOf = options;\n }\n};\nexport const intersectionProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n const a = process(def.left, ctx, {\n ...params,\n path: [...params.path, \"allOf\", 0],\n });\n const b = process(def.right, ctx, {\n ...params,\n path: [...params.path, \"allOf\", 1],\n });\n const isSimpleIntersection = (val) => \"allOf\" in val && Object.keys(val).length === 1;\n const allOf = [\n ...(isSimpleIntersection(a) ? a.allOf : [a]),\n ...(isSimpleIntersection(b) ? b.allOf : [b]),\n ];\n json.allOf = allOf;\n};\nexport const tupleProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n json.type = \"array\";\n const prefixPath = ctx.target === \"draft-2020-12\" ? \"prefixItems\" : \"items\";\n const restPath = ctx.target === \"draft-2020-12\" ? \"items\" : ctx.target === \"openapi-3.0\" ? \"items\" : \"additionalItems\";\n const prefixItems = def.items.map((x, i) => process(x, ctx, {\n ...params,\n path: [...params.path, prefixPath, i],\n }));\n const rest = def.rest\n ? process(def.rest, ctx, {\n ...params,\n path: [...params.path, restPath, ...(ctx.target === \"openapi-3.0\" ? [def.items.length] : [])],\n })\n : null;\n if (ctx.target === \"draft-2020-12\") {\n json.prefixItems = prefixItems;\n if (rest) {\n json.items = rest;\n }\n }\n else if (ctx.target === \"openapi-3.0\") {\n json.items = {\n anyOf: prefixItems,\n };\n if (rest) {\n json.items.anyOf.push(rest);\n }\n json.minItems = prefixItems.length;\n if (!rest) {\n json.maxItems = prefixItems.length;\n }\n }\n else {\n json.items = prefixItems;\n if (rest) {\n json.additionalItems = rest;\n }\n }\n // length\n const { minimum, maximum } = schema._zod.bag;\n if (typeof minimum === \"number\")\n json.minItems = minimum;\n if (typeof maximum === \"number\")\n json.maxItems = maximum;\n};\nexport const recordProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n json.type = \"object\";\n // For looseRecord with regex patterns, use patternProperties\n // This correctly represents \"only validate keys matching the pattern\" semantics\n // and composes well with allOf (intersections)\n const keyType = def.keyType;\n const keyBag = keyType._zod.bag;\n const patterns = keyBag?.patterns;\n if (def.mode === \"loose\" && patterns && patterns.size > 0) {\n // Use patternProperties for looseRecord with regex patterns\n const valueSchema = process(def.valueType, ctx, {\n ...params,\n path: [...params.path, \"patternProperties\", \"*\"],\n });\n json.patternProperties = {};\n for (const pattern of patterns) {\n json.patternProperties[pattern.source] = valueSchema;\n }\n }\n else {\n // Default behavior: use propertyNames + additionalProperties\n if (ctx.target === \"draft-07\" || ctx.target === \"draft-2020-12\") {\n json.propertyNames = process(def.keyType, ctx, {\n ...params,\n path: [...params.path, \"propertyNames\"],\n });\n }\n json.additionalProperties = process(def.valueType, ctx, {\n ...params,\n path: [...params.path, \"additionalProperties\"],\n });\n }\n // Add required for keys with discrete values (enum, literal, etc.)\n const keyValues = keyType._zod.values;\n if (keyValues) {\n const validKeyValues = [...keyValues].filter((v) => typeof v === \"string\" || typeof v === \"number\");\n if (validKeyValues.length > 0) {\n json.required = validKeyValues;\n }\n }\n};\nexport const nullableProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n const inner = process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n if (ctx.target === \"openapi-3.0\") {\n seen.ref = def.innerType;\n json.nullable = true;\n }\n else {\n json.anyOf = [inner, { type: \"null\" }];\n }\n};\nexport const nonoptionalProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n};\nexport const defaultProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n json.default = JSON.parse(JSON.stringify(def.defaultValue));\n};\nexport const prefaultProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n if (ctx.io === \"input\")\n json._prefault = JSON.parse(JSON.stringify(def.defaultValue));\n};\nexport const catchProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n let catchValue;\n try {\n catchValue = def.catchValue(undefined);\n }\n catch {\n throw new Error(\"Dynamic catch values are not supported in JSON Schema\");\n }\n json.default = catchValue;\n};\nexport const pipeProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n const inIsTransform = def.in._zod.traits.has(\"$ZodTransform\");\n const innerType = ctx.io === \"input\" ? (inIsTransform ? def.out : def.in) : def.out;\n process(innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = innerType;\n};\nexport const readonlyProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n json.readOnly = true;\n};\nexport const promiseProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n};\nexport const optionalProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n};\nexport const lazyProcessor = (schema, ctx, _json, params) => {\n const innerType = schema._zod.innerType;\n process(innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = innerType;\n};\n// ==================== ALL PROCESSORS ====================\nexport const allProcessors = {\n string: stringProcessor,\n number: numberProcessor,\n boolean: booleanProcessor,\n bigint: bigintProcessor,\n symbol: symbolProcessor,\n null: nullProcessor,\n undefined: undefinedProcessor,\n void: voidProcessor,\n never: neverProcessor,\n any: anyProcessor,\n unknown: unknownProcessor,\n date: dateProcessor,\n enum: enumProcessor,\n literal: literalProcessor,\n nan: nanProcessor,\n template_literal: templateLiteralProcessor,\n file: fileProcessor,\n success: successProcessor,\n custom: customProcessor,\n function: functionProcessor,\n transform: transformProcessor,\n map: mapProcessor,\n set: setProcessor,\n array: arrayProcessor,\n object: objectProcessor,\n union: unionProcessor,\n intersection: intersectionProcessor,\n tuple: tupleProcessor,\n record: recordProcessor,\n nullable: nullableProcessor,\n nonoptional: nonoptionalProcessor,\n default: defaultProcessor,\n prefault: prefaultProcessor,\n catch: catchProcessor,\n pipe: pipeProcessor,\n readonly: readonlyProcessor,\n promise: promiseProcessor,\n optional: optionalProcessor,\n lazy: lazyProcessor,\n};\nexport function toJSONSchema(input, params) {\n if (\"_idmap\" in input) {\n // Registry case\n const registry = input;\n const ctx = initializeContext({ ...params, processors: allProcessors });\n const defs = {};\n // First pass: process all schemas to build the seen map\n for (const entry of registry._idmap.entries()) {\n const [_, schema] = entry;\n process(schema, ctx);\n }\n const schemas = {};\n const external = {\n registry,\n uri: params?.uri,\n defs,\n };\n // Update the context with external configuration\n ctx.external = external;\n // Second pass: emit each schema\n for (const entry of registry._idmap.entries()) {\n const [key, schema] = entry;\n extractDefs(ctx, schema);\n schemas[key] = finalize(ctx, schema);\n }\n if (Object.keys(defs).length > 0) {\n const defsSegment = ctx.target === \"draft-2020-12\" ? \"$defs\" : \"definitions\";\n schemas.__shared = {\n [defsSegment]: defs,\n };\n }\n return { schemas };\n }\n // Single schema case\n const ctx = initializeContext({ ...params, processors: allProcessors });\n process(input, ctx);\n extractDefs(ctx, input);\n return finalize(ctx, input);\n}\n","import * as core from \"../core/index.js\";\nimport * as schemas from \"./schemas.js\";\nexport const ZodISODateTime = /*@__PURE__*/ core.$constructor(\"ZodISODateTime\", (inst, def) => {\n core.$ZodISODateTime.init(inst, def);\n schemas.ZodStringFormat.init(inst, def);\n});\nexport function datetime(params) {\n return core._isoDateTime(ZodISODateTime, params);\n}\nexport const ZodISODate = /*@__PURE__*/ core.$constructor(\"ZodISODate\", (inst, def) => {\n core.$ZodISODate.init(inst, def);\n schemas.ZodStringFormat.init(inst, def);\n});\nexport function date(params) {\n return core._isoDate(ZodISODate, params);\n}\nexport const ZodISOTime = /*@__PURE__*/ core.$constructor(\"ZodISOTime\", (inst, def) => {\n core.$ZodISOTime.init(inst, def);\n schemas.ZodStringFormat.init(inst, def);\n});\nexport function time(params) {\n return core._isoTime(ZodISOTime, params);\n}\nexport const ZodISODuration = /*@__PURE__*/ core.$constructor(\"ZodISODuration\", (inst, def) => {\n core.$ZodISODuration.init(inst, def);\n schemas.ZodStringFormat.init(inst, def);\n});\nexport function duration(params) {\n return core._isoDuration(ZodISODuration, params);\n}\n","import * as core from \"../core/index.js\";\nimport { $ZodError } from \"../core/index.js\";\nimport * as util from \"../core/util.js\";\nconst initializer = (inst, issues) => {\n $ZodError.init(inst, issues);\n inst.name = \"ZodError\";\n Object.defineProperties(inst, {\n format: {\n value: (mapper) => core.formatError(inst, mapper),\n // enumerable: false,\n },\n flatten: {\n value: (mapper) => core.flattenError(inst, mapper),\n // enumerable: false,\n },\n addIssue: {\n value: (issue) => {\n inst.issues.push(issue);\n inst.message = JSON.stringify(inst.issues, util.jsonStringifyReplacer, 2);\n },\n // enumerable: false,\n },\n addIssues: {\n value: (issues) => {\n inst.issues.push(...issues);\n inst.message = JSON.stringify(inst.issues, util.jsonStringifyReplacer, 2);\n },\n // enumerable: false,\n },\n isEmpty: {\n get() {\n return inst.issues.length === 0;\n },\n // enumerable: false,\n },\n });\n // Object.defineProperty(inst, \"isEmpty\", {\n // get() {\n // return inst.issues.length === 0;\n // },\n // });\n};\nexport const ZodError = /*@__PURE__*/ core.$constructor(\"ZodError\", initializer);\nexport const ZodRealError = /*@__PURE__*/ core.$constructor(\"ZodError\", initializer, {\n Parent: Error,\n});\n// /** @deprecated Use `z.core.$ZodErrorMapCtx` instead. */\n// export type ErrorMapCtx = core.$ZodErrorMapCtx;\n","import * as core from \"../core/index.js\";\nimport { ZodRealError } from \"./errors.js\";\nexport const parse = /* @__PURE__ */ core._parse(ZodRealError);\nexport const parseAsync = /* @__PURE__ */ core._parseAsync(ZodRealError);\nexport const safeParse = /* @__PURE__ */ core._safeParse(ZodRealError);\nexport const safeParseAsync = /* @__PURE__ */ core._safeParseAsync(ZodRealError);\n// Codec functions\nexport const encode = /* @__PURE__ */ core._encode(ZodRealError);\nexport const decode = /* @__PURE__ */ core._decode(ZodRealError);\nexport const encodeAsync = /* @__PURE__ */ core._encodeAsync(ZodRealError);\nexport const decodeAsync = /* @__PURE__ */ core._decodeAsync(ZodRealError);\nexport const safeEncode = /* @__PURE__ */ core._safeEncode(ZodRealError);\nexport const safeDecode = /* @__PURE__ */ core._safeDecode(ZodRealError);\nexport const safeEncodeAsync = /* @__PURE__ */ core._safeEncodeAsync(ZodRealError);\nexport const safeDecodeAsync = /* @__PURE__ */ core._safeDecodeAsync(ZodRealError);\n","import * as core from \"../core/index.js\";\nimport { util } from \"../core/index.js\";\nimport * as processors from \"../core/json-schema-processors.js\";\nimport { createStandardJSONSchemaMethod, createToJSONSchemaMethod } from \"../core/to-json-schema.js\";\nimport * as checks from \"./checks.js\";\nimport * as iso from \"./iso.js\";\nimport * as parse from \"./parse.js\";\n// Lazy-bind builder methods.\n//\n// Builder methods (`.optional`, `.array`, `.refine`, ...) live as\n// non-enumerable getters on each concrete schema constructor's\n// prototype. On first access from an instance the getter allocates\n// `fn.bind(this)` and caches it as an own property on that instance,\n// so detached usage (`const m = schema.optional; m()`) still works\n// and the per-instance allocation only happens for methods actually\n// touched.\n//\n// One install per (prototype, group), memoized by `_installedGroups`.\nconst _installedGroups = /* @__PURE__ */ new WeakMap();\nfunction _installLazyMethods(inst, group, methods) {\n const proto = Object.getPrototypeOf(inst);\n let installed = _installedGroups.get(proto);\n if (!installed) {\n installed = new Set();\n _installedGroups.set(proto, installed);\n }\n if (installed.has(group))\n return;\n installed.add(group);\n for (const key in methods) {\n const fn = methods[key];\n Object.defineProperty(proto, key, {\n configurable: true,\n enumerable: false,\n get() {\n const bound = fn.bind(this);\n Object.defineProperty(this, key, {\n configurable: true,\n writable: true,\n enumerable: true,\n value: bound,\n });\n return bound;\n },\n set(v) {\n Object.defineProperty(this, key, {\n configurable: true,\n writable: true,\n enumerable: true,\n value: v,\n });\n },\n });\n }\n}\nexport const ZodType = /*@__PURE__*/ core.$constructor(\"ZodType\", (inst, def) => {\n core.$ZodType.init(inst, def);\n Object.assign(inst[\"~standard\"], {\n jsonSchema: {\n input: createStandardJSONSchemaMethod(inst, \"input\"),\n output: createStandardJSONSchemaMethod(inst, \"output\"),\n },\n });\n inst.toJSONSchema = createToJSONSchemaMethod(inst, {});\n inst.def = def;\n inst.type = def.type;\n Object.defineProperty(inst, \"_def\", { value: def });\n // Parse-family is intentionally kept as per-instance closures: these are\n // the hot path AND the most-detached methods (`arr.map(schema.parse)`,\n // `const { parse } = schema`, etc.). Eager closures here mean callers pay\n // ~12 closure allocations per schema but get monomorphic call sites and\n // detached usage that \"just works\".\n inst.parse = (data, params) => parse.parse(inst, data, params, { callee: inst.parse });\n inst.safeParse = (data, params) => parse.safeParse(inst, data, params);\n inst.parseAsync = async (data, params) => parse.parseAsync(inst, data, params, { callee: inst.parseAsync });\n inst.safeParseAsync = async (data, params) => parse.safeParseAsync(inst, data, params);\n inst.spa = inst.safeParseAsync;\n inst.encode = (data, params) => parse.encode(inst, data, params);\n inst.decode = (data, params) => parse.decode(inst, data, params);\n inst.encodeAsync = async (data, params) => parse.encodeAsync(inst, data, params);\n inst.decodeAsync = async (data, params) => parse.decodeAsync(inst, data, params);\n inst.safeEncode = (data, params) => parse.safeEncode(inst, data, params);\n inst.safeDecode = (data, params) => parse.safeDecode(inst, data, params);\n inst.safeEncodeAsync = async (data, params) => parse.safeEncodeAsync(inst, data, params);\n inst.safeDecodeAsync = async (data, params) => parse.safeDecodeAsync(inst, data, params);\n // All builder methods are placed on the internal prototype as lazy-bind\n // getters. On first access per-instance, a bound thunk is allocated and\n // cached as an own property; subsequent accesses skip the getter. This\n // means: no per-instance allocation for unused methods, full\n // detachability preserved (`const m = schema.optional; m()` works), and\n // shared underlying function references across all instances.\n _installLazyMethods(inst, \"ZodType\", {\n check(...chks) {\n const def = this.def;\n return this.clone(util.mergeDefs(def, {\n checks: [\n ...(def.checks ?? []),\n ...chks.map((ch) => typeof ch === \"function\" ? { _zod: { check: ch, def: { check: \"custom\" }, onattach: [] } } : ch),\n ],\n }), { parent: true });\n },\n with(...chks) {\n return this.check(...chks);\n },\n clone(def, params) {\n return core.clone(this, def, params);\n },\n brand() {\n return this;\n },\n register(reg, meta) {\n reg.add(this, meta);\n return this;\n },\n refine(check, params) {\n return this.check(refine(check, params));\n },\n superRefine(refinement, params) {\n return this.check(superRefine(refinement, params));\n },\n overwrite(fn) {\n return this.check(checks.overwrite(fn));\n },\n optional() {\n return optional(this);\n },\n exactOptional() {\n return exactOptional(this);\n },\n nullable() {\n return nullable(this);\n },\n nullish() {\n return optional(nullable(this));\n },\n nonoptional(params) {\n return nonoptional(this, params);\n },\n array() {\n return array(this);\n },\n or(arg) {\n return union([this, arg]);\n },\n and(arg) {\n return intersection(this, arg);\n },\n transform(tx) {\n return pipe(this, transform(tx));\n },\n default(d) {\n return _default(this, d);\n },\n prefault(d) {\n return prefault(this, d);\n },\n catch(params) {\n return _catch(this, params);\n },\n pipe(target) {\n return pipe(this, target);\n },\n readonly() {\n return readonly(this);\n },\n describe(description) {\n const cl = this.clone();\n core.globalRegistry.add(cl, { description });\n return cl;\n },\n meta(...args) {\n // overloaded: meta() returns the registered metadata, meta(data)\n // returns a clone with `data` registered. The mapped type picks\n // up the second overload, so we accept variadic any-args and\n // return `any` to satisfy both at runtime.\n if (args.length === 0)\n return core.globalRegistry.get(this);\n const cl = this.clone();\n core.globalRegistry.add(cl, args[0]);\n return cl;\n },\n isOptional() {\n return this.safeParse(undefined).success;\n },\n isNullable() {\n return this.safeParse(null).success;\n },\n apply(fn) {\n return fn(this);\n },\n });\n Object.defineProperty(inst, \"description\", {\n get() {\n return core.globalRegistry.get(inst)?.description;\n },\n configurable: true,\n });\n return inst;\n});\n/** @internal */\nexport const _ZodString = /*@__PURE__*/ core.$constructor(\"_ZodString\", (inst, def) => {\n core.$ZodString.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.stringProcessor(inst, ctx, json, params);\n const bag = inst._zod.bag;\n inst.format = bag.format ?? null;\n inst.minLength = bag.minimum ?? null;\n inst.maxLength = bag.maximum ?? null;\n _installLazyMethods(inst, \"_ZodString\", {\n regex(...args) {\n return this.check(checks.regex(...args));\n },\n includes(...args) {\n return this.check(checks.includes(...args));\n },\n startsWith(...args) {\n return this.check(checks.startsWith(...args));\n },\n endsWith(...args) {\n return this.check(checks.endsWith(...args));\n },\n min(...args) {\n return this.check(checks.minLength(...args));\n },\n max(...args) {\n return this.check(checks.maxLength(...args));\n },\n length(...args) {\n return this.check(checks.length(...args));\n },\n nonempty(...args) {\n return this.check(checks.minLength(1, ...args));\n },\n lowercase(params) {\n return this.check(checks.lowercase(params));\n },\n uppercase(params) {\n return this.check(checks.uppercase(params));\n },\n trim() {\n return this.check(checks.trim());\n },\n normalize(...args) {\n return this.check(checks.normalize(...args));\n },\n toLowerCase() {\n return this.check(checks.toLowerCase());\n },\n toUpperCase() {\n return this.check(checks.toUpperCase());\n },\n slugify() {\n return this.check(checks.slugify());\n },\n });\n});\nexport const ZodString = /*@__PURE__*/ core.$constructor(\"ZodString\", (inst, def) => {\n core.$ZodString.init(inst, def);\n _ZodString.init(inst, def);\n inst.email = (params) => inst.check(core._email(ZodEmail, params));\n inst.url = (params) => inst.check(core._url(ZodURL, params));\n inst.jwt = (params) => inst.check(core._jwt(ZodJWT, params));\n inst.emoji = (params) => inst.check(core._emoji(ZodEmoji, params));\n inst.guid = (params) => inst.check(core._guid(ZodGUID, params));\n inst.uuid = (params) => inst.check(core._uuid(ZodUUID, params));\n inst.uuidv4 = (params) => inst.check(core._uuidv4(ZodUUID, params));\n inst.uuidv6 = (params) => inst.check(core._uuidv6(ZodUUID, params));\n inst.uuidv7 = (params) => inst.check(core._uuidv7(ZodUUID, params));\n inst.nanoid = (params) => inst.check(core._nanoid(ZodNanoID, params));\n inst.guid = (params) => inst.check(core._guid(ZodGUID, params));\n inst.cuid = (params) => inst.check(core._cuid(ZodCUID, params));\n inst.cuid2 = (params) => inst.check(core._cuid2(ZodCUID2, params));\n inst.ulid = (params) => inst.check(core._ulid(ZodULID, params));\n inst.base64 = (params) => inst.check(core._base64(ZodBase64, params));\n inst.base64url = (params) => inst.check(core._base64url(ZodBase64URL, params));\n inst.xid = (params) => inst.check(core._xid(ZodXID, params));\n inst.ksuid = (params) => inst.check(core._ksuid(ZodKSUID, params));\n inst.ipv4 = (params) => inst.check(core._ipv4(ZodIPv4, params));\n inst.ipv6 = (params) => inst.check(core._ipv6(ZodIPv6, params));\n inst.cidrv4 = (params) => inst.check(core._cidrv4(ZodCIDRv4, params));\n inst.cidrv6 = (params) => inst.check(core._cidrv6(ZodCIDRv6, params));\n inst.e164 = (params) => inst.check(core._e164(ZodE164, params));\n // iso\n inst.datetime = (params) => inst.check(iso.datetime(params));\n inst.date = (params) => inst.check(iso.date(params));\n inst.time = (params) => inst.check(iso.time(params));\n inst.duration = (params) => inst.check(iso.duration(params));\n});\nexport function string(params) {\n return core._string(ZodString, params);\n}\nexport const ZodStringFormat = /*@__PURE__*/ core.$constructor(\"ZodStringFormat\", (inst, def) => {\n core.$ZodStringFormat.init(inst, def);\n _ZodString.init(inst, def);\n});\nexport const ZodEmail = /*@__PURE__*/ core.$constructor(\"ZodEmail\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodEmail.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function email(params) {\n return core._email(ZodEmail, params);\n}\nexport const ZodGUID = /*@__PURE__*/ core.$constructor(\"ZodGUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodGUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function guid(params) {\n return core._guid(ZodGUID, params);\n}\nexport const ZodUUID = /*@__PURE__*/ core.$constructor(\"ZodUUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodUUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function uuid(params) {\n return core._uuid(ZodUUID, params);\n}\nexport function uuidv4(params) {\n return core._uuidv4(ZodUUID, params);\n}\n// ZodUUIDv6\nexport function uuidv6(params) {\n return core._uuidv6(ZodUUID, params);\n}\n// ZodUUIDv7\nexport function uuidv7(params) {\n return core._uuidv7(ZodUUID, params);\n}\nexport const ZodURL = /*@__PURE__*/ core.$constructor(\"ZodURL\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodURL.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function url(params) {\n return core._url(ZodURL, params);\n}\nexport function httpUrl(params) {\n return core._url(ZodURL, {\n protocol: core.regexes.httpProtocol,\n hostname: core.regexes.domain,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodEmoji = /*@__PURE__*/ core.$constructor(\"ZodEmoji\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodEmoji.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function emoji(params) {\n return core._emoji(ZodEmoji, params);\n}\nexport const ZodNanoID = /*@__PURE__*/ core.$constructor(\"ZodNanoID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodNanoID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function nanoid(params) {\n return core._nanoid(ZodNanoID, params);\n}\n/**\n * @deprecated CUID v1 is deprecated by its authors due to information leakage\n * (timestamps embedded in the id). Use {@link ZodCUID2} instead.\n * See https://github.com/paralleldrive/cuid.\n */\nexport const ZodCUID = /*@__PURE__*/ core.$constructor(\"ZodCUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodCUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\n/**\n * Validates a CUID v1 string.\n *\n * @deprecated CUID v1 is deprecated by its authors due to information leakage\n * (timestamps embedded in the id). Use {@link cuid2 | `z.cuid2()`} instead.\n * See https://github.com/paralleldrive/cuid.\n */\nexport function cuid(params) {\n return core._cuid(ZodCUID, params);\n}\nexport const ZodCUID2 = /*@__PURE__*/ core.$constructor(\"ZodCUID2\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodCUID2.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function cuid2(params) {\n return core._cuid2(ZodCUID2, params);\n}\nexport const ZodULID = /*@__PURE__*/ core.$constructor(\"ZodULID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodULID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ulid(params) {\n return core._ulid(ZodULID, params);\n}\nexport const ZodXID = /*@__PURE__*/ core.$constructor(\"ZodXID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodXID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function xid(params) {\n return core._xid(ZodXID, params);\n}\nexport const ZodKSUID = /*@__PURE__*/ core.$constructor(\"ZodKSUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodKSUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ksuid(params) {\n return core._ksuid(ZodKSUID, params);\n}\nexport const ZodIPv4 = /*@__PURE__*/ core.$constructor(\"ZodIPv4\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodIPv4.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ipv4(params) {\n return core._ipv4(ZodIPv4, params);\n}\nexport const ZodMAC = /*@__PURE__*/ core.$constructor(\"ZodMAC\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodMAC.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function mac(params) {\n return core._mac(ZodMAC, params);\n}\nexport const ZodIPv6 = /*@__PURE__*/ core.$constructor(\"ZodIPv6\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodIPv6.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ipv6(params) {\n return core._ipv6(ZodIPv6, params);\n}\nexport const ZodCIDRv4 = /*@__PURE__*/ core.$constructor(\"ZodCIDRv4\", (inst, def) => {\n core.$ZodCIDRv4.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function cidrv4(params) {\n return core._cidrv4(ZodCIDRv4, params);\n}\nexport const ZodCIDRv6 = /*@__PURE__*/ core.$constructor(\"ZodCIDRv6\", (inst, def) => {\n core.$ZodCIDRv6.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function cidrv6(params) {\n return core._cidrv6(ZodCIDRv6, params);\n}\nexport const ZodBase64 = /*@__PURE__*/ core.$constructor(\"ZodBase64\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodBase64.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function base64(params) {\n return core._base64(ZodBase64, params);\n}\nexport const ZodBase64URL = /*@__PURE__*/ core.$constructor(\"ZodBase64URL\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodBase64URL.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function base64url(params) {\n return core._base64url(ZodBase64URL, params);\n}\nexport const ZodE164 = /*@__PURE__*/ core.$constructor(\"ZodE164\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodE164.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function e164(params) {\n return core._e164(ZodE164, params);\n}\nexport const ZodJWT = /*@__PURE__*/ core.$constructor(\"ZodJWT\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodJWT.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function jwt(params) {\n return core._jwt(ZodJWT, params);\n}\nexport const ZodCustomStringFormat = /*@__PURE__*/ core.$constructor(\"ZodCustomStringFormat\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodCustomStringFormat.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function stringFormat(format, fnOrRegex, _params = {}) {\n return core._stringFormat(ZodCustomStringFormat, format, fnOrRegex, _params);\n}\nexport function hostname(_params) {\n return core._stringFormat(ZodCustomStringFormat, \"hostname\", core.regexes.hostname, _params);\n}\nexport function hex(_params) {\n return core._stringFormat(ZodCustomStringFormat, \"hex\", core.regexes.hex, _params);\n}\nexport function hash(alg, params) {\n const enc = params?.enc ?? \"hex\";\n const format = `${alg}_${enc}`;\n const regex = core.regexes[format];\n if (!regex)\n throw new Error(`Unrecognized hash format: ${format}`);\n return core._stringFormat(ZodCustomStringFormat, format, regex, params);\n}\nexport const ZodNumber = /*@__PURE__*/ core.$constructor(\"ZodNumber\", (inst, def) => {\n core.$ZodNumber.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.numberProcessor(inst, ctx, json, params);\n _installLazyMethods(inst, \"ZodNumber\", {\n gt(value, params) {\n return this.check(checks.gt(value, params));\n },\n gte(value, params) {\n return this.check(checks.gte(value, params));\n },\n min(value, params) {\n return this.check(checks.gte(value, params));\n },\n lt(value, params) {\n return this.check(checks.lt(value, params));\n },\n lte(value, params) {\n return this.check(checks.lte(value, params));\n },\n max(value, params) {\n return this.check(checks.lte(value, params));\n },\n int(params) {\n return this.check(int(params));\n },\n safe(params) {\n return this.check(int(params));\n },\n positive(params) {\n return this.check(checks.gt(0, params));\n },\n nonnegative(params) {\n return this.check(checks.gte(0, params));\n },\n negative(params) {\n return this.check(checks.lt(0, params));\n },\n nonpositive(params) {\n return this.check(checks.lte(0, params));\n },\n multipleOf(value, params) {\n return this.check(checks.multipleOf(value, params));\n },\n step(value, params) {\n return this.check(checks.multipleOf(value, params));\n },\n finite() {\n return this;\n },\n });\n const bag = inst._zod.bag;\n inst.minValue =\n Math.max(bag.minimum ?? Number.NEGATIVE_INFINITY, bag.exclusiveMinimum ?? Number.NEGATIVE_INFINITY) ?? null;\n inst.maxValue =\n Math.min(bag.maximum ?? Number.POSITIVE_INFINITY, bag.exclusiveMaximum ?? Number.POSITIVE_INFINITY) ?? null;\n inst.isInt = (bag.format ?? \"\").includes(\"int\") || Number.isSafeInteger(bag.multipleOf ?? 0.5);\n inst.isFinite = true;\n inst.format = bag.format ?? null;\n});\nexport function number(params) {\n return core._number(ZodNumber, params);\n}\nexport const ZodNumberFormat = /*@__PURE__*/ core.$constructor(\"ZodNumberFormat\", (inst, def) => {\n core.$ZodNumberFormat.init(inst, def);\n ZodNumber.init(inst, def);\n});\nexport function int(params) {\n return core._int(ZodNumberFormat, params);\n}\nexport function float32(params) {\n return core._float32(ZodNumberFormat, params);\n}\nexport function float64(params) {\n return core._float64(ZodNumberFormat, params);\n}\nexport function int32(params) {\n return core._int32(ZodNumberFormat, params);\n}\nexport function uint32(params) {\n return core._uint32(ZodNumberFormat, params);\n}\nexport const ZodBoolean = /*@__PURE__*/ core.$constructor(\"ZodBoolean\", (inst, def) => {\n core.$ZodBoolean.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.booleanProcessor(inst, ctx, json, params);\n});\nexport function boolean(params) {\n return core._boolean(ZodBoolean, params);\n}\nexport const ZodBigInt = /*@__PURE__*/ core.$constructor(\"ZodBigInt\", (inst, def) => {\n core.$ZodBigInt.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.bigintProcessor(inst, ctx, json, params);\n inst.gte = (value, params) => inst.check(checks.gte(value, params));\n inst.min = (value, params) => inst.check(checks.gte(value, params));\n inst.gt = (value, params) => inst.check(checks.gt(value, params));\n inst.gte = (value, params) => inst.check(checks.gte(value, params));\n inst.min = (value, params) => inst.check(checks.gte(value, params));\n inst.lt = (value, params) => inst.check(checks.lt(value, params));\n inst.lte = (value, params) => inst.check(checks.lte(value, params));\n inst.max = (value, params) => inst.check(checks.lte(value, params));\n inst.positive = (params) => inst.check(checks.gt(BigInt(0), params));\n inst.negative = (params) => inst.check(checks.lt(BigInt(0), params));\n inst.nonpositive = (params) => inst.check(checks.lte(BigInt(0), params));\n inst.nonnegative = (params) => inst.check(checks.gte(BigInt(0), params));\n inst.multipleOf = (value, params) => inst.check(checks.multipleOf(value, params));\n const bag = inst._zod.bag;\n inst.minValue = bag.minimum ?? null;\n inst.maxValue = bag.maximum ?? null;\n inst.format = bag.format ?? null;\n});\nexport function bigint(params) {\n return core._bigint(ZodBigInt, params);\n}\nexport const ZodBigIntFormat = /*@__PURE__*/ core.$constructor(\"ZodBigIntFormat\", (inst, def) => {\n core.$ZodBigIntFormat.init(inst, def);\n ZodBigInt.init(inst, def);\n});\n// int64\nexport function int64(params) {\n return core._int64(ZodBigIntFormat, params);\n}\n// uint64\nexport function uint64(params) {\n return core._uint64(ZodBigIntFormat, params);\n}\nexport const ZodSymbol = /*@__PURE__*/ core.$constructor(\"ZodSymbol\", (inst, def) => {\n core.$ZodSymbol.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.symbolProcessor(inst, ctx, json, params);\n});\nexport function symbol(params) {\n return core._symbol(ZodSymbol, params);\n}\nexport const ZodUndefined = /*@__PURE__*/ core.$constructor(\"ZodUndefined\", (inst, def) => {\n core.$ZodUndefined.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.undefinedProcessor(inst, ctx, json, params);\n});\nfunction _undefined(params) {\n return core._undefined(ZodUndefined, params);\n}\nexport { _undefined as undefined };\nexport const ZodNull = /*@__PURE__*/ core.$constructor(\"ZodNull\", (inst, def) => {\n core.$ZodNull.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nullProcessor(inst, ctx, json, params);\n});\nfunction _null(params) {\n return core._null(ZodNull, params);\n}\nexport { _null as null };\nexport const ZodAny = /*@__PURE__*/ core.$constructor(\"ZodAny\", (inst, def) => {\n core.$ZodAny.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.anyProcessor(inst, ctx, json, params);\n});\nexport function any() {\n return core._any(ZodAny);\n}\nexport const ZodUnknown = /*@__PURE__*/ core.$constructor(\"ZodUnknown\", (inst, def) => {\n core.$ZodUnknown.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.unknownProcessor(inst, ctx, json, params);\n});\nexport function unknown() {\n return core._unknown(ZodUnknown);\n}\nexport const ZodNever = /*@__PURE__*/ core.$constructor(\"ZodNever\", (inst, def) => {\n core.$ZodNever.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.neverProcessor(inst, ctx, json, params);\n});\nexport function never(params) {\n return core._never(ZodNever, params);\n}\nexport const ZodVoid = /*@__PURE__*/ core.$constructor(\"ZodVoid\", (inst, def) => {\n core.$ZodVoid.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.voidProcessor(inst, ctx, json, params);\n});\nfunction _void(params) {\n return core._void(ZodVoid, params);\n}\nexport { _void as void };\nexport const ZodDate = /*@__PURE__*/ core.$constructor(\"ZodDate\", (inst, def) => {\n core.$ZodDate.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.dateProcessor(inst, ctx, json, params);\n inst.min = (value, params) => inst.check(checks.gte(value, params));\n inst.max = (value, params) => inst.check(checks.lte(value, params));\n const c = inst._zod.bag;\n inst.minDate = c.minimum ? new Date(c.minimum) : null;\n inst.maxDate = c.maximum ? new Date(c.maximum) : null;\n});\nexport function date(params) {\n return core._date(ZodDate, params);\n}\nexport const ZodArray = /*@__PURE__*/ core.$constructor(\"ZodArray\", (inst, def) => {\n core.$ZodArray.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.arrayProcessor(inst, ctx, json, params);\n inst.element = def.element;\n _installLazyMethods(inst, \"ZodArray\", {\n min(n, params) {\n return this.check(checks.minLength(n, params));\n },\n nonempty(params) {\n return this.check(checks.minLength(1, params));\n },\n max(n, params) {\n return this.check(checks.maxLength(n, params));\n },\n length(n, params) {\n return this.check(checks.length(n, params));\n },\n unwrap() {\n return this.element;\n },\n });\n});\nexport function array(element, params) {\n return core._array(ZodArray, element, params);\n}\n// .keyof\nexport function keyof(schema) {\n const shape = schema._zod.def.shape;\n return _enum(Object.keys(shape));\n}\nexport const ZodObject = /*@__PURE__*/ core.$constructor(\"ZodObject\", (inst, def) => {\n core.$ZodObjectJIT.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.objectProcessor(inst, ctx, json, params);\n util.defineLazy(inst, \"shape\", () => {\n return def.shape;\n });\n _installLazyMethods(inst, \"ZodObject\", {\n keyof() {\n return _enum(Object.keys(this._zod.def.shape));\n },\n catchall(catchall) {\n return this.clone({ ...this._zod.def, catchall: catchall });\n },\n passthrough() {\n return this.clone({ ...this._zod.def, catchall: unknown() });\n },\n loose() {\n return this.clone({ ...this._zod.def, catchall: unknown() });\n },\n strict() {\n return this.clone({ ...this._zod.def, catchall: never() });\n },\n strip() {\n return this.clone({ ...this._zod.def, catchall: undefined });\n },\n extend(incoming) {\n return util.extend(this, incoming);\n },\n safeExtend(incoming) {\n return util.safeExtend(this, incoming);\n },\n merge(other) {\n return util.merge(this, other);\n },\n pick(mask) {\n return util.pick(this, mask);\n },\n omit(mask) {\n return util.omit(this, mask);\n },\n partial(...args) {\n return util.partial(ZodOptional, this, args[0]);\n },\n required(...args) {\n return util.required(ZodNonOptional, this, args[0]);\n },\n });\n});\nexport function object(shape, params) {\n const def = {\n type: \"object\",\n shape: shape ?? {},\n ...util.normalizeParams(params),\n };\n return new ZodObject(def);\n}\n// strictObject\nexport function strictObject(shape, params) {\n return new ZodObject({\n type: \"object\",\n shape,\n catchall: never(),\n ...util.normalizeParams(params),\n });\n}\n// looseObject\nexport function looseObject(shape, params) {\n return new ZodObject({\n type: \"object\",\n shape,\n catchall: unknown(),\n ...util.normalizeParams(params),\n });\n}\nexport const ZodUnion = /*@__PURE__*/ core.$constructor(\"ZodUnion\", (inst, def) => {\n core.$ZodUnion.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.unionProcessor(inst, ctx, json, params);\n inst.options = def.options;\n});\nexport function union(options, params) {\n return new ZodUnion({\n type: \"union\",\n options: options,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodXor = /*@__PURE__*/ core.$constructor(\"ZodXor\", (inst, def) => {\n ZodUnion.init(inst, def);\n core.$ZodXor.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.unionProcessor(inst, ctx, json, params);\n inst.options = def.options;\n});\n/** Creates an exclusive union (XOR) where exactly one option must match.\n * Unlike regular unions that succeed when any option matches, xor fails if\n * zero or more than one option matches the input. */\nexport function xor(options, params) {\n return new ZodXor({\n type: \"union\",\n options: options,\n inclusive: false,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodDiscriminatedUnion = /*@__PURE__*/ core.$constructor(\"ZodDiscriminatedUnion\", (inst, def) => {\n ZodUnion.init(inst, def);\n core.$ZodDiscriminatedUnion.init(inst, def);\n});\nexport function discriminatedUnion(discriminator, options, params) {\n // const [options, params] = args;\n return new ZodDiscriminatedUnion({\n type: \"union\",\n options,\n discriminator,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodIntersection = /*@__PURE__*/ core.$constructor(\"ZodIntersection\", (inst, def) => {\n core.$ZodIntersection.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.intersectionProcessor(inst, ctx, json, params);\n});\nexport function intersection(left, right) {\n return new ZodIntersection({\n type: \"intersection\",\n left: left,\n right: right,\n });\n}\nexport const ZodTuple = /*@__PURE__*/ core.$constructor(\"ZodTuple\", (inst, def) => {\n core.$ZodTuple.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.tupleProcessor(inst, ctx, json, params);\n inst.rest = (rest) => inst.clone({\n ...inst._zod.def,\n rest: rest,\n });\n});\nexport function tuple(items, _paramsOrRest, _params) {\n const hasRest = _paramsOrRest instanceof core.$ZodType;\n const params = hasRest ? _params : _paramsOrRest;\n const rest = hasRest ? _paramsOrRest : null;\n return new ZodTuple({\n type: \"tuple\",\n items: items,\n rest,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodRecord = /*@__PURE__*/ core.$constructor(\"ZodRecord\", (inst, def) => {\n core.$ZodRecord.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.recordProcessor(inst, ctx, json, params);\n inst.keyType = def.keyType;\n inst.valueType = def.valueType;\n});\nexport function record(keyType, valueType, params) {\n // v3-compat: z.record(valueType, params?) — defaults keyType to z.string()\n if (!valueType || !valueType._zod) {\n return new ZodRecord({\n type: \"record\",\n keyType: string(),\n valueType: keyType,\n ...util.normalizeParams(valueType),\n });\n }\n return new ZodRecord({\n type: \"record\",\n keyType,\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\n// type alksjf = core.output<core.$ZodRecordKey>;\nexport function partialRecord(keyType, valueType, params) {\n const k = core.clone(keyType);\n k._zod.values = undefined;\n return new ZodRecord({\n type: \"record\",\n keyType: k,\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\nexport function looseRecord(keyType, valueType, params) {\n return new ZodRecord({\n type: \"record\",\n keyType,\n valueType: valueType,\n mode: \"loose\",\n ...util.normalizeParams(params),\n });\n}\nexport const ZodMap = /*@__PURE__*/ core.$constructor(\"ZodMap\", (inst, def) => {\n core.$ZodMap.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.mapProcessor(inst, ctx, json, params);\n inst.keyType = def.keyType;\n inst.valueType = def.valueType;\n inst.min = (...args) => inst.check(core._minSize(...args));\n inst.nonempty = (params) => inst.check(core._minSize(1, params));\n inst.max = (...args) => inst.check(core._maxSize(...args));\n inst.size = (...args) => inst.check(core._size(...args));\n});\nexport function map(keyType, valueType, params) {\n return new ZodMap({\n type: \"map\",\n keyType: keyType,\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodSet = /*@__PURE__*/ core.$constructor(\"ZodSet\", (inst, def) => {\n core.$ZodSet.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.setProcessor(inst, ctx, json, params);\n inst.min = (...args) => inst.check(core._minSize(...args));\n inst.nonempty = (params) => inst.check(core._minSize(1, params));\n inst.max = (...args) => inst.check(core._maxSize(...args));\n inst.size = (...args) => inst.check(core._size(...args));\n});\nexport function set(valueType, params) {\n return new ZodSet({\n type: \"set\",\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodEnum = /*@__PURE__*/ core.$constructor(\"ZodEnum\", (inst, def) => {\n core.$ZodEnum.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.enumProcessor(inst, ctx, json, params);\n inst.enum = def.entries;\n inst.options = Object.values(def.entries);\n const keys = new Set(Object.keys(def.entries));\n inst.extract = (values, params) => {\n const newEntries = {};\n for (const value of values) {\n if (keys.has(value)) {\n newEntries[value] = def.entries[value];\n }\n else\n throw new Error(`Key ${value} not found in enum`);\n }\n return new ZodEnum({\n ...def,\n checks: [],\n ...util.normalizeParams(params),\n entries: newEntries,\n });\n };\n inst.exclude = (values, params) => {\n const newEntries = { ...def.entries };\n for (const value of values) {\n if (keys.has(value)) {\n delete newEntries[value];\n }\n else\n throw new Error(`Key ${value} not found in enum`);\n }\n return new ZodEnum({\n ...def,\n checks: [],\n ...util.normalizeParams(params),\n entries: newEntries,\n });\n };\n});\nfunction _enum(values, params) {\n const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values;\n return new ZodEnum({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\nexport { _enum as enum };\n/** @deprecated This API has been merged into `z.enum()`. Use `z.enum()` instead.\n *\n * ```ts\n * enum Colors { red, green, blue }\n * z.enum(Colors);\n * ```\n */\nexport function nativeEnum(entries, params) {\n return new ZodEnum({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodLiteral = /*@__PURE__*/ core.$constructor(\"ZodLiteral\", (inst, def) => {\n core.$ZodLiteral.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.literalProcessor(inst, ctx, json, params);\n inst.values = new Set(def.values);\n Object.defineProperty(inst, \"value\", {\n get() {\n if (def.values.length > 1) {\n throw new Error(\"This schema contains multiple valid literal values. Use `.values` instead.\");\n }\n return def.values[0];\n },\n });\n});\nexport function literal(value, params) {\n return new ZodLiteral({\n type: \"literal\",\n values: Array.isArray(value) ? value : [value],\n ...util.normalizeParams(params),\n });\n}\nexport const ZodFile = /*@__PURE__*/ core.$constructor(\"ZodFile\", (inst, def) => {\n core.$ZodFile.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.fileProcessor(inst, ctx, json, params);\n inst.min = (size, params) => inst.check(core._minSize(size, params));\n inst.max = (size, params) => inst.check(core._maxSize(size, params));\n inst.mime = (types, params) => inst.check(core._mime(Array.isArray(types) ? types : [types], params));\n});\nexport function file(params) {\n return core._file(ZodFile, params);\n}\nexport const ZodTransform = /*@__PURE__*/ core.$constructor(\"ZodTransform\", (inst, def) => {\n core.$ZodTransform.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.transformProcessor(inst, ctx, json, params);\n inst._zod.parse = (payload, _ctx) => {\n if (_ctx.direction === \"backward\") {\n throw new core.$ZodEncodeError(inst.constructor.name);\n }\n payload.addIssue = (issue) => {\n if (typeof issue === \"string\") {\n payload.issues.push(util.issue(issue, payload.value, def));\n }\n else {\n // for Zod 3 backwards compatibility\n const _issue = issue;\n if (_issue.fatal)\n _issue.continue = false;\n _issue.code ?? (_issue.code = \"custom\");\n _issue.input ?? (_issue.input = payload.value);\n _issue.inst ?? (_issue.inst = inst);\n // _issue.continue ??= true;\n payload.issues.push(util.issue(_issue));\n }\n };\n const output = def.transform(payload.value, payload);\n if (output instanceof Promise) {\n return output.then((output) => {\n payload.value = output;\n payload.fallback = true;\n return payload;\n });\n }\n payload.value = output;\n payload.fallback = true;\n return payload;\n };\n});\nexport function transform(fn) {\n return new ZodTransform({\n type: \"transform\",\n transform: fn,\n });\n}\nexport const ZodOptional = /*@__PURE__*/ core.$constructor(\"ZodOptional\", (inst, def) => {\n core.$ZodOptional.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.optionalProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function optional(innerType) {\n return new ZodOptional({\n type: \"optional\",\n innerType: innerType,\n });\n}\nexport const ZodExactOptional = /*@__PURE__*/ core.$constructor(\"ZodExactOptional\", (inst, def) => {\n core.$ZodExactOptional.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.optionalProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function exactOptional(innerType) {\n return new ZodExactOptional({\n type: \"optional\",\n innerType: innerType,\n });\n}\nexport const ZodNullable = /*@__PURE__*/ core.$constructor(\"ZodNullable\", (inst, def) => {\n core.$ZodNullable.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nullableProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function nullable(innerType) {\n return new ZodNullable({\n type: \"nullable\",\n innerType: innerType,\n });\n}\n// nullish\nexport function nullish(innerType) {\n return optional(nullable(innerType));\n}\nexport const ZodDefault = /*@__PURE__*/ core.$constructor(\"ZodDefault\", (inst, def) => {\n core.$ZodDefault.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.defaultProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n inst.removeDefault = inst.unwrap;\n});\nexport function _default(innerType, defaultValue) {\n return new ZodDefault({\n type: \"default\",\n innerType: innerType,\n get defaultValue() {\n return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n },\n });\n}\nexport const ZodPrefault = /*@__PURE__*/ core.$constructor(\"ZodPrefault\", (inst, def) => {\n core.$ZodPrefault.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.prefaultProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function prefault(innerType, defaultValue) {\n return new ZodPrefault({\n type: \"prefault\",\n innerType: innerType,\n get defaultValue() {\n return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n },\n });\n}\nexport const ZodNonOptional = /*@__PURE__*/ core.$constructor(\"ZodNonOptional\", (inst, def) => {\n core.$ZodNonOptional.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nonoptionalProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function nonoptional(innerType, params) {\n return new ZodNonOptional({\n type: \"nonoptional\",\n innerType: innerType,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodSuccess = /*@__PURE__*/ core.$constructor(\"ZodSuccess\", (inst, def) => {\n core.$ZodSuccess.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.successProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function success(innerType) {\n return new ZodSuccess({\n type: \"success\",\n innerType: innerType,\n });\n}\nexport const ZodCatch = /*@__PURE__*/ core.$constructor(\"ZodCatch\", (inst, def) => {\n core.$ZodCatch.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.catchProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n inst.removeCatch = inst.unwrap;\n});\nfunction _catch(innerType, catchValue) {\n return new ZodCatch({\n type: \"catch\",\n innerType: innerType,\n catchValue: (typeof catchValue === \"function\" ? catchValue : () => catchValue),\n });\n}\nexport { _catch as catch };\nexport const ZodNaN = /*@__PURE__*/ core.$constructor(\"ZodNaN\", (inst, def) => {\n core.$ZodNaN.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nanProcessor(inst, ctx, json, params);\n});\nexport function nan(params) {\n return core._nan(ZodNaN, params);\n}\nexport const ZodPipe = /*@__PURE__*/ core.$constructor(\"ZodPipe\", (inst, def) => {\n core.$ZodPipe.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.pipeProcessor(inst, ctx, json, params);\n inst.in = def.in;\n inst.out = def.out;\n});\nexport function pipe(in_, out) {\n return new ZodPipe({\n type: \"pipe\",\n in: in_,\n out: out,\n // ...util.normalizeParams(params),\n });\n}\nexport const ZodCodec = /*@__PURE__*/ core.$constructor(\"ZodCodec\", (inst, def) => {\n ZodPipe.init(inst, def);\n core.$ZodCodec.init(inst, def);\n});\nexport function codec(in_, out, params) {\n return new ZodCodec({\n type: \"pipe\",\n in: in_,\n out: out,\n transform: params.decode,\n reverseTransform: params.encode,\n });\n}\nexport function invertCodec(codec) {\n const def = codec._zod.def;\n return new ZodCodec({\n type: \"pipe\",\n in: def.out,\n out: def.in,\n transform: def.reverseTransform,\n reverseTransform: def.transform,\n });\n}\nexport const ZodPreprocess = /*@__PURE__*/ core.$constructor(\"ZodPreprocess\", (inst, def) => {\n ZodPipe.init(inst, def);\n core.$ZodPreprocess.init(inst, def);\n});\nexport const ZodReadonly = /*@__PURE__*/ core.$constructor(\"ZodReadonly\", (inst, def) => {\n core.$ZodReadonly.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.readonlyProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function readonly(innerType) {\n return new ZodReadonly({\n type: \"readonly\",\n innerType: innerType,\n });\n}\nexport const ZodTemplateLiteral = /*@__PURE__*/ core.$constructor(\"ZodTemplateLiteral\", (inst, def) => {\n core.$ZodTemplateLiteral.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.templateLiteralProcessor(inst, ctx, json, params);\n});\nexport function templateLiteral(parts, params) {\n return new ZodTemplateLiteral({\n type: \"template_literal\",\n parts,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodLazy = /*@__PURE__*/ core.$constructor(\"ZodLazy\", (inst, def) => {\n core.$ZodLazy.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.lazyProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.getter();\n});\nexport function lazy(getter) {\n return new ZodLazy({\n type: \"lazy\",\n getter: getter,\n });\n}\nexport const ZodPromise = /*@__PURE__*/ core.$constructor(\"ZodPromise\", (inst, def) => {\n core.$ZodPromise.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.promiseProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function promise(innerType) {\n return new ZodPromise({\n type: \"promise\",\n innerType: innerType,\n });\n}\nexport const ZodFunction = /*@__PURE__*/ core.$constructor(\"ZodFunction\", (inst, def) => {\n core.$ZodFunction.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.functionProcessor(inst, ctx, json, params);\n});\nexport function _function(params) {\n return new ZodFunction({\n type: \"function\",\n input: Array.isArray(params?.input) ? tuple(params?.input) : (params?.input ?? array(unknown())),\n output: params?.output ?? unknown(),\n });\n}\nexport { _function as function };\nexport const ZodCustom = /*@__PURE__*/ core.$constructor(\"ZodCustom\", (inst, def) => {\n core.$ZodCustom.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.customProcessor(inst, ctx, json, params);\n});\n// custom checks\nexport function check(fn) {\n const ch = new core.$ZodCheck({\n check: \"custom\",\n // ...util.normalizeParams(params),\n });\n ch._zod.check = fn;\n return ch;\n}\nexport function custom(fn, _params) {\n return core._custom(ZodCustom, fn ?? (() => true), _params);\n}\nexport function refine(fn, _params = {}) {\n return core._refine(ZodCustom, fn, _params);\n}\n// superRefine\nexport function superRefine(fn, params) {\n return core._superRefine(fn, params);\n}\n// Re-export describe and meta from core\nexport const describe = core.describe;\nexport const meta = core.meta;\nfunction _instanceof(cls, params = {}) {\n const inst = new ZodCustom({\n type: \"custom\",\n check: \"custom\",\n fn: (data) => data instanceof cls,\n abort: true,\n ...util.normalizeParams(params),\n });\n inst._zod.bag.Class = cls;\n // Override check to emit invalid_type instead of custom\n inst._zod.check = (payload) => {\n if (!(payload.value instanceof cls)) {\n payload.issues.push({\n code: \"invalid_type\",\n expected: cls.name,\n input: payload.value,\n inst,\n path: [...(inst._zod.def.path ?? [])],\n });\n }\n };\n return inst;\n}\nexport { _instanceof as instanceof };\n// stringbool\nexport const stringbool = (...args) => core._stringbool({\n Codec: ZodCodec,\n Boolean: ZodBoolean,\n String: ZodString,\n}, ...args);\nexport function json(params) {\n const jsonSchema = lazy(() => {\n return union([string(params), number(), boolean(), _null(), array(jsonSchema), record(string(), jsonSchema)]);\n });\n return jsonSchema;\n}\n// preprocess\nexport function preprocess(fn, schema) {\n return new ZodPreprocess({\n type: \"pipe\",\n in: transform(fn),\n out: schema,\n });\n}\n","import { z } from \"zod\";\nconst wiringProbeKindSchema = z.enum([\"singleton\", \"device\", \"widget\"]);\nconst wiringProbeResultSchema = z.object({\n capName: z.string(),\n kind: wiringProbeKindSchema,\n deviceId: z.number().optional(),\n reachable: z.boolean(),\n latencyMs: z.number(),\n error: z.string().optional()\n});\nconst wiringAddonHealthSchema = z.object({\n addonId: z.string(),\n caps: z.array(wiringProbeResultSchema).readonly(),\n widgets: z.array(wiringProbeResultSchema).readonly()\n});\nconst wiringNodeHealthSchema = z.object({\n nodeId: z.string(),\n addons: z.array(wiringAddonHealthSchema).readonly()\n});\nconst wiringHealthSnapshotSchema = z.object({\n /** True only when every probed target is reachable. */\n ok: z.boolean(),\n /** True when at least one target is unreachable. */\n degraded: z.boolean(),\n checkedAt: z.string(),\n nodes: z.array(wiringNodeHealthSchema).readonly(),\n summary: z.object({\n total: z.number(),\n reachable: z.number(),\n unreachable: z.number()\n })\n});\nconst MODEL_FORMATS = [\"onnx\", \"coreml\", \"openvino\", \"tflite\", \"pt\"];\nconst WELL_KNOWN_TABS = [\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: \"ptz\", label: \"PTZ\", icon: \"move\", order: 40 },\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];\nconst WELL_KNOWN_TAB_MAP = Object.fromEntries(WELL_KNOWN_TABS.map((t) => [t.id, t]));\nfunction isValuelessField(field) {\n return field.type === \"separator\" || field.type === \"info\" || field.type === \"button\" || field.type === \"object-array\" || field.type === \"widget\" || field.type === \"addon-action-button\";\n}\nfunction hydrateSchema(schema, values) {\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}\nfunction hydrateField(field, values) {\n if (isValuelessField(field)) {\n return field;\n }\n if (field.type === \"group\") {\n const hydratedChildren = field.fields.map((child) => hydrateField(child, values));\n const out = {\n ...field,\n fields: hydratedChildren\n };\n return out;\n }\n if (field.type === \"sub-tabs\") {\n const hydratedTabs = field.tabs.map((tab) => ({\n ...tab,\n fields: tab.fields.map((child) => hydrateField(child, values))\n }));\n const out = {\n ...field,\n tabs: hydratedTabs\n };\n return out;\n }\n const key = field.key;\n const storedValue = Object.prototype.hasOwnProperty.call(values, key) ? values[key] : void 0;\n const defaultValue = field.default;\n if (field.multiple) {\n const stored = Array.isArray(storedValue) ? storedValue : storedValue !== void 0 && storedValue !== null ? [storedValue] : [];\n const itemFallback = field.multiple.itemDefault !== void 0 ? field.multiple.itemDefault : defaultValue !== void 0 ? defaultValue : typeOf(field) === \"string\" ? \"\" : null;\n const minCount = Math.max(field.multiple.min, stored.length);\n const items = [];\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 const rawValue = storedValue !== void 0 ? storedValue : defaultValue !== void 0 ? defaultValue : null;\n if (field.type === \"password\") {\n return { ...field, value: \"\" };\n }\n const value = field.type === \"textarea\" && field.isJson && rawValue !== null && typeof rawValue === \"object\" ? JSON.stringify(rawValue, null, 2) : rawValue;\n const hydrated = { ...field, value };\n return hydrated;\n}\nfunction typeOf(field) {\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}\nconst 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]);\nconst STORAGE_LOCATION_CARDINALITY = {\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};\nconst 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});\nconst StorageLocationRefSchema = z.union([\n StorageLocationTypeSchema,\n z.string().regex(/^[a-z][a-z0-9-]*:[a-z0-9-]+$/)\n]);\nconst DecoderStatsSchema = z.object({\n inputFps: z.number(),\n outputFps: z.number(),\n avgDecodeTimeMs: z.number(),\n droppedFrames: z.number()\n});\nconst 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 * Where the session delivers decoded frames (Phase 5 / D9):\n *\n * - `'callback'` (default) — the legacy pixel path: decoded frames are\n * buffered as `DecodedFrame`s and drained via `pullFrames`.\n * - `'shm'` — the shared-memory frame plane: decoded frames are written\n * into an OS shared-memory ring and drained as zero-pixel\n * `FrameHandle`s via `pullHandles`. A session is one mode or the\n * other — `pullFrames` returns nothing for an `'shm'` session and\n * `pullHandles` returns nothing for a `'callback'` session.\n */\n frameSink: z.enum([\"callback\", \"shm\"]).default(\"callback\")\n});\nfunction errMsg(err) {\n if (err instanceof Error) return err.message;\n if (typeof err === \"string\") return err;\n return String(err);\n}\nconst AUDIO_MACRO_LABELS = [\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];\nconst YAMNET_TO_MACRO = {\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 // Scream / Shout\n \"Shout\": \"scream\",\n \"Bellow\": \"scream\",\n \"Yell\": \"scream\",\n \"Screaming\": \"scream\",\n \"Children shouting\": \"scream\",\n \"Whoop\": \"scream\",\n // Crying\n \"Crying, sobbing\": \"crying\",\n \"Baby cry, infant cry\": \"crying\",\n \"Whimper\": \"crying\",\n \"Wail, moan\": \"crying\",\n \"Groan\": \"crying\",\n // Laughter\n \"Laughter\": \"laughter\",\n \"Baby laughter\": \"laughter\",\n \"Giggle\": \"laughter\",\n \"Snicker\": \"laughter\",\n \"Belly laugh\": \"laughter\",\n \"Chuckle, chortle\": \"laughter\",\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 // 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 // Cat\n \"Cat\": \"cat\",\n \"Purr\": \"cat\",\n \"Meow\": \"cat\",\n \"Hiss\": \"cat\",\n \"Caterwaul\": \"cat\",\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 // 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 // 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 // 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 // Doorbell / Knock\n \"Doorbell\": \"doorbell\",\n \"Ding-dong\": \"doorbell\",\n \"Knock\": \"doorbell\",\n \"Tap\": \"doorbell\",\n // Glass Breaking\n \"Glass\": \"glass_breaking\",\n \"Shatter\": \"glass_breaking\",\n \"Chink, clink\": \"glass_breaking\",\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 // 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 // Fire / Smoke\n \"Fire\": \"fire\",\n \"Crackle\": \"fire\",\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 // Wind / Weather\n \"Wind\": \"wind\",\n \"Thunderstorm\": \"wind\",\n \"Thunder\": \"wind\",\n \"Wind noise (microphone)\": \"wind\",\n \"Rustling leaves\": \"wind\",\n // Door\n \"Door\": \"door\",\n \"Sliding door\": \"door\",\n \"Slam\": \"door\",\n \"Cupboard open or close\": \"door\",\n // Footsteps\n \"Walk, footsteps\": \"footsteps\",\n \"Run\": \"footsteps\",\n \"Shuffle\": \"footsteps\",\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 // Telephone\n \"Telephone\": \"telephone\",\n \"Telephone bell ringing\": \"telephone\",\n \"Ringtone\": \"telephone\",\n \"Telephone dialing, DTMF\": \"telephone\",\n \"Busy signal\": \"telephone\",\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 // Tools / Construction\n \"Hammer\": \"tools\",\n \"Jackhammer\": \"tools\",\n \"Sawing\": \"tools\",\n \"Power tool\": \"tools\",\n \"Drill\": \"tools\",\n \"Sanding\": \"tools\",\n // Silence\n \"Silence\": \"silence\"\n },\n preserveOriginal: false\n};\nconst APPLE_SA_TO_MACRO = {\n mapping: {\n \"speech\": \"speech\",\n \"child_speech\": \"speech\",\n \"conversation\": \"speech\",\n \"whispering\": \"speech\",\n \"singing\": \"speech\",\n \"humming\": \"speech\",\n \"shout\": \"scream\",\n \"yell\": \"scream\",\n \"screaming\": \"scream\",\n \"crying\": \"crying\",\n \"baby_crying\": \"crying\",\n \"sobbing\": \"crying\",\n \"laughter\": \"laughter\",\n \"baby_laughter\": \"laughter\",\n \"giggling\": \"laughter\",\n \"music\": \"music\",\n \"guitar\": \"music\",\n \"piano\": \"music\",\n \"drums\": \"music\",\n \"dog_bark\": \"dog\",\n \"dog_bow_wow\": \"dog\",\n \"dog_growling\": \"dog\",\n \"dog_howl\": \"dog\",\n \"cat_meow\": \"cat\",\n \"cat_purr\": \"cat\",\n \"cat_hiss\": \"cat\",\n \"bird\": \"bird\",\n \"bird_chirp\": \"bird\",\n \"bird_squawk\": \"bird\",\n \"animal\": \"animal\",\n \"horse\": \"animal\",\n \"cow_moo\": \"animal\",\n \"insect\": \"animal\",\n \"alarm\": \"alarm\",\n \"smoke_alarm\": \"alarm\",\n \"fire_alarm\": \"alarm\",\n \"car_alarm\": \"alarm\",\n \"siren\": \"siren\",\n \"police_siren\": \"siren\",\n \"ambulance_siren\": \"siren\",\n \"doorbell\": \"doorbell\",\n \"door_knock\": \"doorbell\",\n \"knocking\": \"doorbell\",\n \"glass_breaking\": \"glass_breaking\",\n \"glass_shatter\": \"glass_breaking\",\n \"gunshot\": \"gunshot\",\n \"explosion\": \"gunshot\",\n \"fireworks\": \"gunshot\",\n \"car\": \"vehicle\",\n \"truck\": \"vehicle\",\n \"motorcycle\": \"vehicle\",\n \"car_horn\": \"vehicle\",\n \"vehicle_horn\": \"vehicle\",\n \"traffic\": \"vehicle\",\n \"fire\": \"fire\",\n \"fire_crackle\": \"fire\",\n \"water\": \"water\",\n \"rain\": \"water\",\n \"ocean\": \"water\",\n \"splash\": \"water\",\n \"wind\": \"wind\",\n \"thunder\": \"wind\",\n \"thunderstorm\": \"wind\",\n \"door\": \"door\",\n \"door_slam\": \"door\",\n \"sliding_door\": \"door\",\n \"footsteps\": \"footsteps\",\n \"walking\": \"footsteps\",\n \"running\": \"footsteps\",\n \"crowd\": \"crowd\",\n \"chatter\": \"crowd\",\n \"cheering\": \"crowd\",\n \"applause\": \"crowd\",\n \"telephone_ring\": \"telephone\",\n \"ringtone\": \"telephone\",\n \"engine\": \"engine\",\n \"engine_starting\": \"engine\",\n \"lawn_mower\": \"engine\",\n \"chainsaw\": \"engine\",\n \"hammer\": \"tools\",\n \"jackhammer\": \"tools\",\n \"drill\": \"tools\",\n \"power_tool\": \"tools\",\n \"silence\": \"silence\"\n },\n preserveOriginal: false\n};\nconst _macroLookup = /* @__PURE__ */ new Map();\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}\nfunction mapAudioLabelToMacro(label) {\n return _macroLookup.get(label.toLowerCase()) ?? null;\n}\nfunction getAudioMacroClassIds() {\n return AUDIO_MACRO_LABELS.map((l) => l.id);\n}\nvar DeviceType = /* @__PURE__ */ ((DeviceType2) => {\n DeviceType2[\"Camera\"] = \"camera\";\n DeviceType2[\"Hub\"] = \"hub\";\n DeviceType2[\"Light\"] = \"light\";\n DeviceType2[\"Siren\"] = \"siren\";\n DeviceType2[\"Switch\"] = \"switch\";\n DeviceType2[\"Sensor\"] = \"sensor\";\n DeviceType2[\"Thermostat\"] = \"thermostat\";\n DeviceType2[\"Button\"] = \"button\";\n DeviceType2[\"Generic\"] = \"generic\";\n return DeviceType2;\n})(DeviceType || {});\nvar DeviceFeature = /* @__PURE__ */ ((DeviceFeature2) => {\n DeviceFeature2[\"BatteryOperated\"] = \"battery-operated\";\n DeviceFeature2[\"Rebootable\"] = \"rebootable\";\n DeviceFeature2[\"NativeSnapshot\"] = \"native-snapshot\";\n DeviceFeature2[\"DoorbellButton\"] = \"doorbell-button\";\n DeviceFeature2[\"TwoWayAudio\"] = \"two-way-audio\";\n DeviceFeature2[\"PanTiltZoom\"] = \"pan-tilt-zoom\";\n DeviceFeature2[\"PtzAutotrack\"] = \"ptz-autotrack\";\n DeviceFeature2[\"MotionTrigger\"] = \"motion-trigger\";\n return DeviceFeature2;\n})(DeviceFeature || {});\nvar ChargingStatus = /* @__PURE__ */ ((ChargingStatus2) => {\n ChargingStatus2[\"ChargingDC\"] = \"charging-dc\";\n ChargingStatus2[\"ChargingSolar\"] = \"charging-solar\";\n ChargingStatus2[\"NotCharging\"] = \"not-charging\";\n return ChargingStatus2;\n})(ChargingStatus || {});\nvar DeviceRole = /* @__PURE__ */ ((DeviceRole2) => {\n DeviceRole2[\"Siren\"] = \"siren\";\n DeviceRole2[\"Floodlight\"] = \"floodlight\";\n DeviceRole2[\"Spotlight\"] = \"spotlight\";\n DeviceRole2[\"PirSensor\"] = \"pir-sensor\";\n DeviceRole2[\"Chime\"] = \"chime\";\n DeviceRole2[\"Autotrack\"] = \"autotrack\";\n DeviceRole2[\"Nightvision\"] = \"nightvision\";\n DeviceRole2[\"PrivacyMask\"] = \"privacy-mask\";\n DeviceRole2[\"Doorbell\"] = \"doorbell\";\n return DeviceRole2;\n})(DeviceRole || {});\nconst 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};\nconst ACCESSORY_LABEL = {\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};\nfunction accessoryStableId(parentStableId, kind, index) {\n const base = `${parentStableId}:${kind}`;\n return typeof index === \"number\" ? `${base}:${index}` : base;\n}\nfunction deviceMatchesProfile(features, profile) {\n if (!features || features.length === 0) return false;\n return features.includes(profile.when.hasFeature);\n}\nconst BATTERY_DEVICE_PROFILE = {\n id: \"battery\",\n label: \"Battery-operated camera\",\n when: { hasFeature: DeviceFeature.BatteryOperated },\n defaults: {\n audioMode: \"disabled\",\n detectionMode: \"on-motion\"\n },\n settings: {\n \"snapshot.minRefreshIntervalSec\": 3600,\n \"streamBroker.preBufferEnabled\": false\n }\n};\nconst DEVICE_PROFILES = [\n BATTERY_DEVICE_PROFILE\n];\nfunction resolveDeviceProfile(features) {\n for (const profile of DEVICE_PROFILES) {\n if (deviceMatchesProfile(features, profile)) return profile;\n }\n return null;\n}\nconst 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});\nconst 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};\nconst 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});\nconst 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};\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});\nconst ContributionTabSchema = z.object({\n id: z.string(),\n label: z.string(),\n icon: z.string(),\n order: z.number().optional()\n});\nconst ContributionSchema = z.object({\n tabs: z.array(ContributionTabSchema).optional(),\n sections: z.array(ContributionSectionSchema)\n});\nconst ContributionOutputSchema = ContributionSchema.nullable();\nconst 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};\nconst 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};\nfunction expandCapMethods(def) {\n let out = 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}\nfunction method(input, output, options) {\n return {\n input,\n output,\n kind: options?.kind ?? \"query\",\n auth: options?.auth ?? \"protected\",\n ...options?.access !== void 0 ? { access: options.access } : {},\n timeoutMs: options?.timeoutMs\n };\n}\nfunction event(data) {\n return { data };\n}\nfunction isDeviceConfigCap(def) {\n return def?.deviceConfig !== void 0;\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});\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});\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});\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});\nconst 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};\nconst 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});\nconst 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};\nconst 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});\nconst 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};\nconst CamProfileSchema = z.enum([\"high\", \"mid\", \"low\"]);\nconst CAM_PROFILE_ORDER = [\"high\", \"mid\", \"low\"];\nconst CamStreamKindSchema = z.enum([\n \"pull-rtsp\",\n \"pull-rtmp\",\n \"pull-http\",\n \"pull-rfc4571\",\n \"push-annexb\"\n]);\nconst CamStreamResolutionSchema = z.object({\n width: z.number().int().positive(),\n height: z.number().int().positive()\n});\nconst 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});\nconst ProfileSlotStatusSchema = z.enum([\n \"unassigned\",\n \"idle\",\n \"connecting\",\n \"streaming\",\n \"error\"\n]);\nconst 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});\nconst StreamSourceEntrySchema$1 = 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});\nconst 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});\nconst 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});\nconst 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});\nconst FrameHandleSchema = z.object({\n shmId: z.string(),\n slot: z.number().int().nonnegative(),\n seq: z.number().int().nonnegative(),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n format: z.enum([\"jpeg\", \"rgb\", \"bgr\", \"yuv420\", \"gray\"]),\n pts: z.number(),\n byteLength: z.number().int().nonnegative(),\n nodeId: z.string(),\n slotCount: z.number().int().positive()\n});\nconst FrameHandleFormatSchema = z.enum([\"rgb\", \"bgr\", \"yuv420\", \"gray\"]);\nconst SubscribeFramesInputSchema = z.object({\n brokerId: z.string(),\n format: FrameHandleFormatSchema,\n /**\n * Optional reader-side cadence hint in frames per second. The broker does\n * NOT throttle — latest-wins ring reads drop frames implicitly for a slow\n * consumer. The value is echoed back in `SubscribeFramesResult.maxFps` so\n * the consumer can pace its own `pullFrameHandles` polling.\n */\n maxFps: z.number().positive().optional(),\n /** Short caller-identity tag (`motion`, `detection`, …) for diagnostics. */\n tag: z.string().optional()\n});\nconst SubscribeFramesResultSchema = z.object({\n /** Opaque id the consumer passes to `pullFrameHandles` / `unsubscribeFrames`. */\n subscriptionId: z.string(),\n /** Reader-side cadence hint (frames/s) — echoes `SubscribeFramesInput.maxFps`. */\n maxFps: z.number().nonnegative()\n});\nconst DecodedAudioChunkSchema = z.object({\n data: z.instanceof(Uint8Array),\n sampleRate: z.number().int().positive(),\n channels: z.number().int().positive(),\n timestamp: z.number()\n});\nconst SubscribeAudioChunksInputSchema = z.object({\n brokerId: z.string(),\n /** Short caller-identity tag (`audio-analyzer`, …) for `listClients`. */\n tag: z.string().optional()\n});\nconst SubscribeAudioChunksResultSchema = z.object({\n /** Opaque id passed to `pullAudioChunks` / `unsubscribeAudioChunks`. */\n subscriptionId: z.string()\n});\nconst BrokerStatusSchema$1 = z.enum([\"idle\", \"connecting\", \"streaming\", \"error\", \"stopped\"]);\nconst BrokerStatsSchema = z.object({\n status: BrokerStatusSchema$1,\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});\nconst StreamFormatSchema = z.enum([\"webrtc\", \"hls\", \"mjpeg\", \"rtsp\"]);\nconst StreamInfoSchema = z.object({\n streamId: z.string(),\n format: StreamFormatSchema,\n url: z.string().nullable(),\n active: z.boolean()\n});\nconst 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};\nconst RtspRestreamEntrySchema = z.object({\n brokerId: z.string(),\n url: z.string(),\n mutedUrl: z.string(),\n enabled: z.boolean()\n});\nconst 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});\nconst BrokerDecodedClientSchema = z.object({\n tag: z.string(),\n subscribedAt: z.number(),\n maxFps: z.number(),\n framesDelivered: z.number(),\n framesDropped: z.number()\n});\nconst BrokerAudioClientSchema = z.object({\n tag: z.string(),\n subscribedAt: z.number(),\n chunksDelivered: z.number()\n});\nconst 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});\nconst PlaceholderReasonSchema = z.enum([\n \"reconnecting\",\n \"sleeping\",\n \"offline\",\n \"disabled\",\n \"waking\"\n]);\nconst VideoCodecTargetSchema = z.enum([\"H264\", \"H265\", \"auto\"]);\nconst AudioCodecTargetSchema = z.enum([\"AAC\", \"Opus\", \"PCMU\", \"none\"]);\nconst MaxResolutionSchema = z.object({\n width: z.number().int().positive(),\n height: z.number().int().positive()\n});\nconst GetStreamWithCodecInputSchema = z.object({\n deviceId: z.number().int().nonnegative(),\n videoCodec: VideoCodecTargetSchema,\n audioCodec: AudioCodecTargetSchema.optional(),\n maxResolution: MaxResolutionSchema.optional(),\n tag: z.string().optional()\n});\nconst RtpSourceSchema = z.object({\n url: z.string(),\n videoCodec: z.enum([\"H264\", \"H265\"]),\n audioCodec: z.string(),\n resolution: MaxResolutionSchema,\n transcoded: z.boolean(),\n encoder: z.string(),\n pipelineKey: z.string()\n});\nconst streamBrokerCapability = {\n name: \"stream-broker\",\n scope: \"system\",\n mode: \"singleton\",\n exposesDeviceSettings: true,\n methods: {\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 deviceFeatures: z.array(z.string()).optional(),\n autoEligible: z.boolean().optional(),\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 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 listAllCameraStreams: method(\n z.void(),\n z.array(CameraStreamSchema).readonly()\n ),\n listAllProfileSlots: method(\n z.void(),\n z.array(ProfileSlotSchema).readonly()\n ),\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 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 getStreamUrl: method(\n z.object({ streamId: z.string(), format: StreamFormatSchema }),\n z.object({ url: z.string() })\n ),\n /**\n * Shared codec-targeted stream API — see Task #184.\n * Resolution order: source-select → HW transcode → libx264/libx265.\n */\n getStreamWithCodec: method(\n GetStreamWithCodecInputSchema,\n RtpSourceSchema,\n { kind: \"mutation\", auth: \"admin\" }\n ),\n releaseStreamWithCodec: method(\n z.object({ pipelineKey: z.string() }),\n z.object({ released: z.boolean(), refcount: z.number().int().nonnegative() }),\n { kind: \"mutation\", auth: \"admin\" }\n ),\n /**\n * ── Decoded audio-chunk plane (Phase 5 / D9) ──────────────────────\n *\n * The serialisable replacement for the live-object `IStreamBroker.\n * onDecodedAudioChunk` callback path. Unlike the video frame plane,\n * audio chunks are tiny (a ~500ms PCM window is a few KB) so they ship\n * their bytes INLINE over tRPC — no shared-memory ring. A consumer:\n *\n * 1. `subscribeAudioChunks({ brokerId, tag })` — the broker registers\n * a per-subscription bounded FIFO queue and returns a\n * `subscriptionId`.\n * 2. polls `pullAudioChunks({ subscriptionId, maxCount })` — drains\n * `DecodedAudioChunk[]` in arrival order (FIFO, no latest-wins\n * drop: an audio gap is audible / breaks an analysis window). The\n * queue is generously sized; it only drops its oldest chunk if a\n * truly stalled consumer lets it overflow.\n * 3. `unsubscribeAudioChunks({ subscriptionId })` on teardown.\n */\n subscribeAudioChunks: method(\n SubscribeAudioChunksInputSchema,\n SubscribeAudioChunksResultSchema,\n { kind: \"mutation\" }\n ),\n pullAudioChunks: method(\n z.object({\n subscriptionId: z.string(),\n maxCount: z.number().int().positive().default(8)\n }),\n z.array(DecodedAudioChunkSchema).readonly()\n ),\n unsubscribeAudioChunks: method(\n z.object({ subscriptionId: z.string() }),\n z.object({ released: z.boolean() }),\n { kind: \"mutation\" }\n ),\n /**\n * ── Shared-memory frame plane (Phase 5 / D9) ──────────────────────\n *\n * The handle-based replacement for the live-object `IStreamBroker.\n * onDecodedFrame` callback path. A consumer:\n *\n * 1. `subscribeFrames({ brokerId, format })` — the broker spins up\n * (or reuses) a `frameSink: 'shm'` decoder session producing that\n * `format` and returns a `subscriptionId`.\n * 2. polls `pullFrameHandles({ subscriptionId, maxCount })` — drains\n * zero-pixel `FrameHandle[]`; each handle is fed to a\n * `FrameRingReader` that opens the named shm segment and reads the\n * pixels back zero-copy.\n * 3. `unsubscribeFrames({ subscriptionId })` on teardown.\n *\n * The broker keeps one shm ring per `(brokerId, format)` actually\n * requested — no broker-side `sharp` conversion. fps throttling is\n * implicit (latest-wins ring reads drop frames for a slow consumer).\n */\n subscribeFrames: method(\n SubscribeFramesInputSchema,\n SubscribeFramesResultSchema,\n { kind: \"mutation\" }\n ),\n pullFrameHandles: method(\n z.object({\n subscriptionId: z.string(),\n maxCount: z.number().int().positive().default(4)\n }),\n z.array(FrameHandleSchema).readonly()\n ),\n unsubscribeFrames: method(\n z.object({ subscriptionId: z.string() }),\n z.object({ released: z.boolean() }),\n { kind: \"mutation\" }\n ),\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 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 onCamStreamDemand: event(z.object({\n deviceId: z.number().int().nonnegative(),\n camStreamId: z.string(),\n profile: CamProfileSchema\n })),\n onCamStreamIdle: event(z.object({\n deviceId: z.number().int().nonnegative(),\n camStreamId: z.string()\n })),\n onRequestStreamSourceRefresh: event(z.object({\n deviceId: z.number().int().nonnegative(),\n camStreamId: z.string(),\n brokerId: z.string()\n }))\n }\n};\nconst cameraStreamsCapability = {\n name: \"camera-streams\",\n scope: \"device\",\n mode: \"singleton\",\n kind: \"wrapper\",\n defaultActive: true,\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};\nconst DiscoveredChildStatusSchema = z.enum([\"online\", \"sleeping\", \"offline\", \"unknown\"]);\nconst 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});\nconst 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});\nconst 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};\nconst 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});\nconst DoorbellPressEventSchema = z.object({\n deviceId: z.number(),\n timestamp: z.number()\n});\nconst 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};\nconst FrameFormatSchema = z.enum([\"jpeg\", \"rgb\", \"bgr\", \"yuv420\", \"gray\"]);\nconst FrameInputSchema = z.object({\n data: z.custom(),\n format: FrameFormatSchema,\n width: z.number(),\n height: z.number(),\n timestamp: z.number()\n});\nconst BoundingBoxSchema = z.object({\n x: z.number(),\n y: z.number(),\n w: z.number(),\n h: z.number()\n});\nconst SpatialDetectionSchema = z.object({\n class: z.string(),\n originalClass: z.string(),\n score: z.number(),\n bbox: BoundingBoxSchema\n});\nconst AudioChunkInputSchema = z.object({\n data: z.instanceof(Uint8Array),\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});\nconst AudioLevelSchema = z.object({\n rms: z.number(),\n dbfs: z.number()\n});\nconst 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});\nconst MotionRegionSchema = z.object({\n bbox: BoundingBoxSchema,\n pixelCount: z.number(),\n intensity: z.number()\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});\nconst motionDetectionCapability = {\n name: \"motion-detection\",\n scope: \"device\",\n mode: \"singleton\",\n kind: \"wrapper\",\n defaultActive: true,\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};\nconst OrchestratorMetricsSchema = z.object({\n activeCameras: z.number(),\n throttledCameras: z.number(),\n avgInferenceTimeMs: z.number(),\n queueDepth: z.number()\n});\nconst 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});\nconst CameraMetricsWithDeviceIdSchema = CameraMetricsSchema.extend({\n deviceId: z.number()\n});\nconst ModelFormatSchema$1 = z.enum([\"onnx\", \"coreml\", \"openvino\", \"tflite\", \"pt\"]);\nconst PipelineSlotSchema = z.enum([\"detector\", \"cropper\", \"classifier\", \"refiner\", \"audio-classifier\"]);\nconst PipelineEngineChoiceSchema = z.object({\n runtime: z.enum([\"node\", \"python\"]),\n backend: z.string(),\n format: ModelFormatSchema$1,\n device: z.string().optional()\n});\nconst EngineDeviceInfoSchema = z.object({\n id: z.string(),\n label: z.string(),\n description: z.string().optional()\n});\nconst AvailableEngineSchema = z.object({\n engine: PipelineEngineChoiceSchema,\n devices: z.array(EngineDeviceInfoSchema).readonly(),\n defaultDevice: z.string()\n});\nconst PipelineDefaultStepSchema = 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);\nconst PipelineTemplateStepSchema = 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);\nconst PipelineTemplateSchema$1 = 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});\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});\nconst ConfigFieldBridge = z.custom();\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});\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});\nconst PipelineSchemaSchema = z.object({\n availableEngines: z.array(AvailableEngineSchema).readonly(),\n selectedEngine: PipelineEngineChoiceSchema,\n slots: z.array(PipelineSlotSchemaSchema).readonly()\n});\nconst DetectorOutputSchema = z.object({\n detections: z.array(SpatialDetectionSchema).readonly(),\n inferenceMs: z.number(),\n modelId: z.string()\n});\nconst PipelineStepInputSchema = 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);\nconst ReferenceImageEntrySchema = z.object({\n filename: z.string(),\n stepIds: z.array(z.string()).readonly().optional()\n});\nconst ReferenceImageBodySchema = z.object({\n base64: z.string(),\n filename: z.string()\n});\nconst ReferenceAudioEntrySchema = z.object({\n filename: z.string(),\n sizeKb: z.number()\n});\nconst ReferenceAudioBodySchema = z.object({\n base64: z.string()\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});\nconst AudioCapabilitiesSchema = z.object({\n activeBackend: z.string(),\n availableBackends: z.array(AudioBackendSchema).readonly(),\n sampleRate: z.number(),\n chunkDurationMs: z.number()\n});\nconst DownloadModelResultSchema = z.object({\n filePath: z.string(),\n sizeMB: z.number(),\n durationMs: z.number()\n});\nconst AudioTestResultSchema = z.object({\n success: z.boolean(),\n error: z.string().optional(),\n frame: z.custom().optional()\n});\nconst PipelineConfigBridge = z.custom();\nconst ConfigUISchemaBridge = z.custom();\nconst ConfigUISchemaNullableBridge = z.custom();\nconst InferenceCapabilitiesBridge = z.custom();\nconst ModelAvailabilityListBridge = z.custom();\nconst PipelineRunResultBridge = z.custom();\nconst 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 // ── 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 // ── 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 // ── Templates ────────────────────────────────────────────────────\n listTemplates: method(z.void(), z.array(PipelineTemplateSchema$1).readonly()),\n saveTemplate: method(\n z.object({\n name: z.string(),\n steps: z.array(PipelineTemplateStepSchema).readonly(),\n engine: PipelineEngineChoiceSchema\n }),\n PipelineTemplateSchema$1,\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$1,\n { kind: \"mutation\" }\n ),\n deleteTemplate: method(z.object({ id: z.string() }), z.void(), { kind: \"mutation\" }),\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$1 }),\n DownloadModelResultSchema,\n { kind: \"mutation\" }\n ),\n deleteModel: method(\n z.object({ addonId: z.string(), modelId: z.string(), format: ModelFormatSchema$1 }),\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 * 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 // ── Bench frame cache (Python pool-side) ──────────────────────────\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 * 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 * 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 /** 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 // ── 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 // ── 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 // ── 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 // 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};\nconst ZoneKindEnum = z.enum([\"polygon\", \"tripwire\"]);\nconst PolygonPointSchema = z.object({\n x: z.number(),\n y: z.number()\n});\nconst 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});\nconst 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};\nconst motionCooldownMsField = { min: 0, max: 6e4, default: 3e4, step: 500 };\nconst motionFpsField = { min: 1, max: 30, default: 4, step: 1 };\nconst detectionFpsField = { min: 1, max: 30, default: 10, step: 1 };\nconst MotionSourceEnum = z.enum([\"onboard\", \"analyzer\"]);\nconst MotionSourcesSchema = z.array(MotionSourceEnum);\nconst ReportMotionInputSchema = z.object({\n deviceId: z.number(),\n detected: z.boolean(),\n source: MotionSourceEnum.default(\"analyzer\"),\n regions: z.array(MotionRegionSchema).readonly().optional()\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 * When true (default) and the camera's `motionSources` contains only\n * `'onboard'`, the runner dynamically opens the same WASM frame-diff\n * motion-frames subscription on each `MotionOnMotionChanged\n * source:'onboard'` event and tears it down after `motionCooldownMs`.\n * This causes `runMotionAnalysis` to emit `MotionZonesRaw` /\n * `MotionAnalysis` during active-motion windows without the\n * substream being held open continuously.\n *\n * Set to `false` to disable the dynamic analyzer for this camera\n * (e.g. very low-bandwidth links where the extra substream is\n * undesirable). Has no effect when `motionSources` already includes\n * `'analyzer'` — the analyzer runs continuously in that case and\n * this gate is bypassed.\n */\n onboardMotionDrivesAnalyzer: z.boolean().default(true)\n});\nconst RunnerCameraDeviceUIFields = [\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: 1e3\n },\n // Only meaningful for onboard-only cameras — when `motionSources`\n // contains `'analyzer'` the analyzer runs continuously already.\n {\n key: \"onboardMotionDrivesAnalyzer\",\n type: \"boolean\",\n label: \"Run motion analyzer on onboard motion\",\n description: \"When onboard motion is detected, temporarily start the frame-diff analyzer to emit zone results. Stops after the motion cooldown window.\",\n default: true,\n showWhen: { field: \"motionSources\", includes: \"onboard\" }\n }\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});\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});\nconst 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 // ── 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 // 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};\nconst 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});\nconst 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});\nconst 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};\nconst MotionTriggerStatusSchema = z.object({\n enabled: z.boolean(),\n /** Ms epoch of the last operator-driven change. */\n lastChangedAt: z.number()\n});\nconst MotionTriggerRuntimeStateSchema = MotionTriggerStatusSchema.extend({\n /** Ms epoch of the last successful camera fetch (0 = never). */\n lastFetchedAt: z.number()\n});\nconst 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};\nconst MaskPointSchema = z.object({\n x: z.number(),\n y: z.number()\n});\nconst MaskRectShapeSchema = z.object({\n kind: z.literal(\"rect\"),\n x: z.number(),\n y: z.number(),\n width: z.number(),\n height: z.number()\n});\nconst MaskPolygonShapeSchema = z.object({\n kind: z.literal(\"polygon\"),\n points: z.array(MaskPointSchema)\n});\nconst MaskGridShapeSchema = z.object({\n kind: z.literal(\"grid\"),\n gridWidth: z.number(),\n gridHeight: z.number(),\n cells: z.array(z.boolean())\n});\nconst MaskLineShapeSchema = z.object({\n kind: z.literal(\"line\"),\n points: z.array(MaskPointSchema)\n});\nconst MaskShapeSchema = z.discriminatedUnion(\"kind\", [\n MaskRectShapeSchema,\n MaskPolygonShapeSchema,\n MaskGridShapeSchema,\n MaskLineShapeSchema\n]);\nconst MaskShapeKindSchema = z.enum([\"rect\", \"polygon\", \"grid\", \"line\"]);\nconst MaskPolygonVerticesSchema = z.object({\n min: z.number(),\n max: z.number()\n});\nconst MaskGridDimsSchema = z.object({\n width: z.number(),\n height: z.number()\n});\nconst MotionZoneRegionSchema = z.object({\n id: z.number(),\n enabled: z.boolean(),\n shape: MaskGridShapeSchema\n});\nconst MotionZoneStatusSchema = z.object({\n enabled: z.boolean(),\n sensitivity: z.number(),\n /** Grid region(s). Today exactly one `grid` shape. */\n regions: z.array(MotionZoneRegionSchema),\n lastFetchedAt: z.number()\n});\nconst MotionZoneOptionsSchema = z.object({\n maxRegions: z.number(),\n supportedShapes: z.array(MaskShapeKindSchema),\n grid: MaskGridDimsSchema,\n sensitivity: z.object({ min: z.number(), max: z.number(), step: z.number() })\n});\nconst MotionZonePatchSchema = z.object({\n enabled: z.boolean().optional(),\n sensitivity: z.number().optional(),\n regions: z.array(MotionZoneRegionSchema).optional()\n});\nconst motionZonesCapability = {\n name: \"motion-zones\",\n scope: \"device\",\n mode: \"singleton\",\n deviceTypes: [DeviceType.Camera],\n deviceConfig: {\n ui: { kind: \"widget\", widgetId: \"host/motion-zones-grid\", tab: \"motion\", label: \"Motion Zones\" }\n },\n methods: {\n getOptions: method(z.object({ deviceId: z.number() }), MotionZoneOptionsSchema),\n setZone: method(\n z.object({ deviceId: z.number(), patch: MotionZonePatchSchema }),\n z.void(),\n { kind: \"mutation\", auth: \"admin\" }\n )\n },\n status: { schema: MotionZoneStatusSchema, kind: \"poll\" },\n runtimeState: MotionZoneStatusSchema\n};\nconst NativeObjectClassEnum = z.enum([\n \"person\",\n \"vehicle\",\n \"animal\",\n \"face\",\n \"package\",\n \"other\"\n]);\nconst 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});\nconst NativeObjectDetectionStatusSchema = z.object({\n /**\n * Last observed instance per class. Missing entries mean the class\n * is supported but nothing has been seen since the provider started.\n *\n * MUST be a partial record: providers seed an empty `{}` on cold-start\n * and write one class at a time as detections arrive. In Zod 4\n * `z.record(enum, …)` is EXHAUSTIVE (requires every enum key), so a\n * partial write throws \"expected object, received undefined\" for every\n * unseen class. `z.partialRecord` keeps the enum-key narrowing while\n * allowing the sparse shape the providers actually write.\n */\n lastByClass: z.partialRecord(NativeObjectClassEnum, NativeDetectionSchema.nullable()),\n /** Classes the firmware is capable of detecting — enumerated at device register. */\n supportedClasses: z.array(NativeObjectClassEnum).readonly(),\n /**\n * Whether forwarding of onboard AI detections is enabled for this device.\n * Default true (on cold-start) — detections flow unconditionally before\n * the toggle is saved, so defaulting true preserves existing behaviour.\n */\n enabled: z.boolean()\n});\nconst NativeObjectDetectionRuntimeStateSchema = NativeObjectDetectionStatusSchema.extend({\n /** Required by createRuntimeStateBridge — epoch ms of last refresh. */\n lastFetchedAt: z.number()\n});\nconst nativeObjectDetectionCapability = {\n name: \"native-object-detection\",\n scope: \"device\",\n mode: \"singleton\",\n deviceTypes: [DeviceType.Camera],\n methods: {\n setEnabled: method(\n z.object({ deviceId: z.number(), enabled: z.boolean() }),\n z.void(),\n { kind: \"mutation\", auth: \"admin\" }\n )\n },\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 runtimeState: NativeObjectDetectionRuntimeStateSchema\n};\nconst PrivacyMaskShapeSchema = z.discriminatedUnion(\"kind\", [\n MaskRectShapeSchema,\n MaskPolygonShapeSchema\n]);\nconst PrivacyMaskRegionSchema = z.object({\n /** Slot id, 0-based. Stable across read/write. */\n id: z.number(),\n /** Whether this zone is active (blanked out by the camera). */\n enabled: z.boolean(),\n shape: PrivacyMaskShapeSchema\n});\nconst PrivacyMaskStatusSchema = z.object({\n enabled: z.boolean(),\n /** Active zones (normalized 0..1). Length ≤ maxRegions. */\n regions: z.array(PrivacyMaskRegionSchema),\n lastFetchedAt: z.number()\n});\nconst PrivacyMaskOptionsSchema = z.object({\n /** Maximum number of supported zones. */\n maxRegions: z.number(),\n /** Shape kinds this camera accepts — Reolink: ['rect']; Hikvision: ['rect','polygon']. */\n supportedShapes: z.array(MaskShapeKindSchema),\n /** Polygon vertex bounds when 'polygon' is supported (Hikvision: {min:4,max:4}). */\n polygonVertices: MaskPolygonVerticesSchema.optional()\n});\nconst PrivacyMaskPatchSchema = z.object({\n enabled: z.boolean().optional(),\n regions: z.array(PrivacyMaskRegionSchema).optional()\n});\nconst privacyMaskCapability = {\n name: \"privacy-mask\",\n scope: \"device\",\n mode: \"singleton\",\n deviceTypes: [DeviceType.Camera],\n deviceConfig: {\n ui: { kind: \"widget\", widgetId: \"host/privacy-mask-grid\", tab: \"image\", label: \"Privacy Mask\" }\n },\n methods: {\n getOptions: method(z.object({ deviceId: z.number() }), PrivacyMaskOptionsSchema),\n setMask: method(\n z.object({ deviceId: z.number(), patch: PrivacyMaskPatchSchema }),\n z.void(),\n { kind: \"mutation\", auth: \"admin\" }\n )\n },\n status: { schema: PrivacyMaskStatusSchema, kind: \"poll\" },\n runtimeState: PrivacyMaskStatusSchema\n};\nconst AutotrackTargetTypeSchema = z.string().describe(\"Vendor target string (people/vehicle/pet); empty = camera default\");\nconst 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});\nconst PtzAutotrackTargetOptionSchema = z.object({\n value: z.string(),\n label: z.string()\n});\nconst 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});\nconst PtzAutotrackRuntimeStateSchema = PtzAutotrackStatusSchema.extend({\n /** Ms epoch of the last successful camera fetch (0 = never). */\n lastFetchedAt: z.number()\n});\nconst ptzAutotrackCapability = {\n name: \"ptz-autotrack\",\n scope: \"device\",\n mode: \"singleton\",\n deviceTypes: [DeviceType.Camera],\n deviceConfig: {\n ui: { kind: \"widget\", widgetId: \"host/ptz-autotrack\", tab: \"ptz\", topTab: true, label: \"Auto-Tracking\", order: 5 }\n },\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};\nconst StreamProfileSchema = z.enum([\"main\", \"sub\", \"ext\"]);\nconst StreamProfileConfigSchema = z.object({\n width: z.number(),\n height: z.number(),\n codec: z.enum([\"h264\", \"h265\"]),\n framerate: z.number(),\n bitrate: z.number(),\n // kbps\n bitrateMode: z.enum([\"vbr\", \"cbr\"]).optional(),\n encoderProfile: z.enum([\"high\", \"main\", \"baseline\"]).optional(),\n gop: z.number().optional(),\n audio: z.boolean().optional()\n});\nconst StreamParamsStatusSchema = z.object({\n /** Per-profile current config. A profile absent = the camera doesn't have it. */\n main: StreamProfileConfigSchema.optional(),\n sub: StreamProfileConfigSchema.optional(),\n ext: StreamProfileConfigSchema.optional(),\n lastFetchedAt: z.number()\n});\nconst StreamProfileOptionsSchema = z.object({\n resolutions: z.array(z.object({ width: z.number(), height: z.number() })),\n codecs: z.array(z.enum([\"h264\", \"h265\"])),\n framerates: z.array(z.number()),\n /** Allowed bitrate values (kbps). Empty if the camera takes a free range. */\n bitrates: z.array(z.number()),\n /** Optional [min,max] kbps when the camera accepts a continuous range. */\n bitrateRange: z.tuple([z.number(), z.number()]).optional(),\n supportsBitrateMode: z.boolean(),\n supportsEncoderProfile: z.boolean(),\n supportsGop: z.boolean(),\n /** Allowed GOP / keyframe-interval range, in seconds — drives the\n * I-frame-interval selector. Absent when the camera advertises GOP\n * support but no concrete range (callers then fall back to a free\n * numeric input). `{ min, max, step }` per the getOptions convention. */\n gop: z.object({ min: z.number(), max: z.number(), step: z.number() }).optional()\n});\nconst StreamParamsOptionsSchema = z.object({\n main: StreamProfileOptionsSchema.optional(),\n sub: StreamProfileOptionsSchema.optional(),\n ext: StreamProfileOptionsSchema.optional()\n});\nconst StreamProfilePatchSchema = z.object({\n width: z.number().optional(),\n height: z.number().optional(),\n codec: z.enum([\"h264\", \"h265\"]).optional(),\n framerate: z.number().optional(),\n bitrate: z.number().optional(),\n bitrateMode: z.enum([\"vbr\", \"cbr\"]).optional(),\n encoderProfile: z.enum([\"high\", \"main\", \"baseline\"]).optional(),\n gop: z.number().optional(),\n audio: z.boolean().optional()\n});\nconst streamParamsCapability = {\n name: \"stream-params\",\n scope: \"device\",\n mode: \"singleton\",\n deviceTypes: [DeviceType.Camera],\n deviceConfig: {\n ui: { kind: \"derived-form\", builderId: \"stream-params\", tab: \"streaming\" }\n },\n methods: {\n getOptions: method(\n z.object({ deviceId: z.number() }),\n StreamParamsOptionsSchema\n ),\n setProfile: method(\n z.object({\n deviceId: z.number(),\n profile: StreamProfileSchema,\n patch: StreamProfilePatchSchema\n }),\n z.void(),\n { kind: \"mutation\", auth: \"admin\" }\n ),\n /**\n * Build the `ConfigUISchema` (admin-ui `ConfigFormBuilder` input\n * shape) for this camera's stream-encoder settings — one section per\n * profile (main / sub / ext) with the resolution / codec / framerate\n * / bitrate / bitrate-mode / encoder-profile / GOP controls the\n * firmware actually exposes.\n *\n * Driven by `getOptions` (camera-probed availability) + `getStatus`\n * (current per-profile config); each field's `default` is seeded\n * from the live config so the form renders the camera state in one\n * pass. Returns `null` when the camera exposes no configurable\n * stream property — the renderer then shows the unsupported message.\n *\n * Output is `z.unknown().nullable()` — the same convention every\n * other `ConfigUISchema`-returning cap method uses (`device-ops`,\n * `device-manager`); `ConfigUISchema` is a TS-only type with no\n * companion Zod schema, and a concrete object would collapse\n * unrelated AppRouter branches to `unknown` during codegen.\n */\n getConfigSchema: method(\n z.object({ deviceId: z.number() }),\n z.unknown().nullable()\n )\n },\n status: {\n schema: StreamParamsStatusSchema,\n kind: \"poll\"\n },\n runtimeState: StreamParamsStatusSchema\n};\nconst 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});\nconst 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};\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});\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});\nconst 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});\nconst HistoryResolutionEnum = z.enum([\"minute\", \"5min\", \"hour\"]);\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});\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});\nconst 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};\nconst ZoneRuleModeEnum = z.enum([\"include\", \"exclude\"]);\nconst 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});\nconst ZoneRulesArraySchema = z.array(ZoneRuleSchema).readonly();\nconst ZoneRuleStageEnum = z.enum([\"motion\", \"detection\"]);\nconst 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};\nconst ProviderStatusSchema = z.object({\n connected: z.boolean(),\n deviceCount: z.number(),\n error: z.string().optional()\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});\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});\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});\nconst FieldProbeResultSchema = z.object({\n status: z.enum([\"ok\", \"error\"]),\n labels: z.array(z.string()).optional(),\n error: z.string().optional()\n});\nconst CreationSchemaOutputSchema = z.unknown();\nconst 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 // ── 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 // ── 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};\nconst ConfigTabDeclarationSchema = z.object({\n id: z.string(),\n label: z.string(),\n icon: z.string(),\n order: z.number().optional()\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});\nconst SettingsSchemaWithValuesSchema = z.object({\n tabs: z.array(ConfigTabDeclarationSchema).optional(),\n sections: z.array(ConfigSectionWithValuesSchema)\n});\nconst SettingsPatchSchema = z.record(z.string(), z.unknown());\nconst SettingsUpdateResultSchema = z.object({\n success: z.literal(true)\n});\nconst 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 cap: z.string().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 // ── 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};\nconst AlertSeveritySchema = z.enum([\"info\", \"success\", \"warning\", \"error\"]);\nconst AlertStatusSchema = z.enum([\"active\", \"in-progress\", \"completed\", \"failed\", \"dismissed\"]);\nconst AlertSourceSchema = z.object({\n type: z.string(),\n id: z.string()\n});\nconst 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});\nconst 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};\nconst 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 // ── 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 // ── 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 // ── 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 // 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};\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});\nconst TestLocationResultSchema = z.object({\n ok: z.boolean(),\n error: z.string().optional()\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() });\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() });\nconst 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 /** 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 // ── 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 // ── 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 // ── 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};\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});\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});\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});\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});\nconst ArchiveEntrySchema = z.object({\n path: z.string(),\n kind: z.enum([\"file\", \"dir\", \"symlink\"]),\n sizeBytes: z.number(),\n mtime: z.number()\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});\nconst LocationStatSchema = z.object({\n name: z.string(),\n sizeBytes: z.number(),\n fileCount: z.number(),\n present: z.boolean()\n});\nconst 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(1e3),\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 * 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};\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});\nconst SettingsRecordSchema = z.object({\n id: z.string(),\n data: z.record(z.string(), z.unknown())\n});\nconst CollectionColumnSchema = z.object({\n name: z.string(),\n type: z.enum([\"TEXT\", \"INTEGER\", \"REAL\", \"JSON\", \"BOOLEAN\"]),\n primaryKey: z.boolean().optional(),\n notNull: z.boolean().optional(),\n unique: z.boolean().optional()\n});\nconst CollectionIndexSchema = z.object({\n name: z.string(),\n columns: z.array(z.string()).readonly(),\n unique: z.boolean().optional()\n});\nconst 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 /** 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 /** 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 /** 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 /** 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 /** 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 /** 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 /** 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 * 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};\nconst LogLevelSchema$1 = z.enum([\"debug\", \"info\", \"warn\", \"error\"]);\nconst LogEntrySchema = z.object({\n timestamp: z.date(),\n level: LogLevelSchema$1,\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});\nconst 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$1.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};\nconst StaticDirOutputSchema = z.object({ staticDir: z.string() });\nconst VersionOutputSchema = z.object({ version: z.string() });\nconst adminUiCapability = {\n name: \"admin-ui\",\n scope: \"system\",\n mode: \"singleton\",\n internal: true,\n methods: {\n getStaticDir: method(z.void(), StaticDirOutputSchema),\n getVersion: method(z.void(), VersionOutputSchema)\n }\n};\nconst MethodAccessSchema = z.enum([\"view\", \"create\", \"delete\"]);\nconst AllowedProviderSchema = z.union([z.literal(\"*\"), z.array(z.string())]);\nconst AllowedDevicesSchema = z.record(z.string(), z.union([z.literal(\"*\"), z.array(z.string())]));\nconst CapScopeSchema = z.enum([\"device\", \"system\"]);\nconst TokenScopeSchema = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"category\"),\n target: CapScopeSchema,\n access: z.array(MethodAccessSchema).min(1)\n }),\n z.object({\n type: z.literal(\"capability\"),\n target: z.string(),\n access: z.array(MethodAccessSchema).min(1)\n }),\n z.object({\n type: z.literal(\"addon\"),\n target: z.string(),\n access: z.array(MethodAccessSchema).min(1)\n }),\n z.object({\n type: z.literal(\"device\"),\n /**\n * One or more deviceIds (serialised as strings for wire-format\n * consistency with the rest of the union). Matcher accepts if\n * `input.deviceId` ∈ `targets`. Array shape avoids the row-explosion\n * of one scope-per-device when granting access to a set of cameras.\n */\n targets: z.array(z.string()).min(1),\n access: z.array(MethodAccessSchema).min(1)\n })\n]);\nconst UserRecordSchema = z.object({\n id: z.string(),\n username: z.string(),\n passwordHash: z.string(),\n /**\n * Admin bypass. When true, the middleware skips the scope-access\n * check entirely. There is no other axis of privilege; the legacy\n * role enum collapsed onto this boolean in v2.\n */\n isAdmin: z.boolean().default(false),\n allowedProviders: AllowedProviderSchema,\n allowedDevices: AllowedDevicesSchema,\n /**\n * Scopes granted to this user. Admins bypass; their `scopes` is\n * ignored. Non-admins without scopes are locked out of every\n * protected call.\n */\n scopes: z.array(TokenScopeSchema).default([]),\n createdAt: z.number(),\n updatedAt: z.number()\n});\nconst ApiKeyRecordSchema = z.object({\n id: z.string(),\n label: z.string(),\n isAdmin: z.boolean().default(false),\n allowedProviders: AllowedProviderSchema,\n allowedDevices: AllowedDevicesSchema,\n tokenHash: z.string(),\n tokenPrefix: z.string(),\n createdAt: z.number(),\n lastUsedAt: z.number().optional()\n});\nconst 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});\nconst SsoBridgeClaimsSchema = z.object({\n userId: z.string(),\n username: z.string(),\n isAdmin: z.boolean(),\n provider: z.string(),\n email: z.string().optional(),\n displayName: z.string().optional(),\n /**\n * Public HTTPS URL of the hub that issued this token. Used by\n * cloud-mode OAuth proxies (Alexa Smart Home Lambda, future Google\n * Home Lambda) to route a request back to the originating hub\n * without holding routing state of their own. The Lambda decodes the\n * JWT WITHOUT verifying the signature — the hub re-verifies on every\n * inbound call so trust still rests with the signing hub.\n */\n hubUrl: z.string().optional(),\n /** Permission scopes baked into the token. Set by the OAuth\n * account-linking grant; absent on ordinary SSO-login tokens. */\n scopes: z.array(TokenScopeSchema).optional(),\n /** OAuth authorization-code binding — set only on `oauth-code` tokens. */\n redirectUri: z.string().optional(),\n integrationId: z.string().optional(),\n /** JWT ID — unique per issued code; consumed-set enforces single-use. */\n jti: z.string().optional(),\n /** OAuth session registry id — set on `oauth-access`/`oauth-refresh`\n * tokens so the verify path can check the session is not revoked. */\n sessionId: z.string().optional()\n});\nconst ssoBridgeCapability = {\n name: \"sso-bridge\",\n scope: \"system\",\n mode: \"singleton\",\n internal: true,\n methods: {\n signBridgeToken: method(\n z.object({\n claims: SsoBridgeClaimsSchema,\n ttlSec: z.number().int().positive().optional()\n }),\n z.object({ token: z.string() })\n ),\n verifyBridgeToken: method(\n z.object({ token: z.string() }),\n SsoBridgeClaimsSchema.nullable()\n )\n }\n};\nconst OauthIntegrationDescriptorSchema = z.object({\n /** Stable id used as the `integration=` query param, e.g. 'export-alexa'. */\n integrationId: z.string(),\n /** Human label rendered on the consent page. */\n displayName: z.string(),\n /** Scopes baked into every token issued for this integration. */\n requestedScopes: z.array(TokenScopeSchema),\n /** Allowed redirect_uri prefixes. /api/oauth2/authorize rejects any\n * redirect_uri that does not start with one of these. Required —\n * an empty list means the integration can never complete linking. */\n allowedRedirectPrefixes: z.array(z.string()).min(1),\n /** Optional public origin (no trailing slash) that this integration's\n * issued codes/tokens should carry as the `hubUrl` claim — typically the\n * operator-selected external-access endpoint resolved by the addon. When\n * present, /api/oauth2/authorize bakes THIS into the code instead of the\n * hub-global `publicHubUrl()`, so a forked exporter addon (which can't set\n * the hub's env) drives the claim that its cloud Lambda routes back on. */\n hubUrl: z.string().optional()\n});\nconst oauthIntegrationCapability = {\n name: \"oauth-integration\",\n scope: \"system\",\n mode: \"collection\",\n internal: true,\n methods: {\n getDescriptor: method(z.void(), OauthIntegrationDescriptorSchema)\n }\n};\nconst PasskeySummarySchema = z.object({\n credentialId: z.string(),\n label: z.string(),\n createdAt: z.number(),\n lastUsedAt: z.number().nullable(),\n transports: z.array(z.string()).default([])\n});\nconst userPasskeysCapability = {\n name: \"user-passkeys\",\n scope: \"system\",\n mode: \"collection\",\n internal: true,\n methods: {\n beginRegistration: method(\n z.object({ userId: z.string(), username: z.string() }),\n // PublicKeyCredentialCreationOptionsJSON — opaque JSON shape from\n // @simplewebauthn. The browser passes it straight to credentials.create().\n z.object({ optionsJSON: z.record(z.string(), z.unknown()) }),\n { kind: \"mutation\", auth: \"admin\", access: \"create\" }\n ),\n finishRegistration: method(\n z.object({\n userId: z.string(),\n /** RegistrationResponseJSON from the browser. */\n response: z.record(z.string(), z.unknown()),\n /** Operator-visible label (e.g. \"MacBook Touch ID\"). */\n label: z.string()\n }),\n z.object({ success: z.literal(true), credentialId: z.string() }),\n { kind: \"mutation\", auth: \"admin\", access: \"create\" }\n ),\n beginAuthentication: method(\n // userId optional — when absent, the addon emits a \"passkey discovery\"\n // (`allowCredentials: []`) so the browser shows every available\n // credential. When present, only the user's credentials are allowed.\n z.object({ userId: z.string().optional() }),\n z.object({ optionsJSON: z.record(z.string(), z.unknown()) }),\n { kind: \"mutation\", access: \"view\" }\n ),\n finishAuthentication: method(\n z.object({\n /** Required — the user the assertion belongs to (verified). */\n userId: z.string(),\n /** AuthenticationResponseJSON from the browser. */\n response: z.record(z.string(), z.unknown())\n }),\n z.object({ verified: z.boolean() }),\n { kind: \"mutation\", access: \"view\" }\n ),\n listPasskeys: method(\n z.object({ userId: z.string() }),\n z.array(PasskeySummarySchema),\n { auth: \"admin\" }\n ),\n removePasskey: method(\n z.object({ userId: z.string(), credentialId: z.string() }),\n z.object({ success: z.literal(true) }),\n { kind: \"mutation\", auth: \"admin\", access: \"delete\" }\n )\n }\n};\nconst EmailAddressSchema = z.email();\nconst SendEmailInputSchema = z.object({\n to: z.union([EmailAddressSchema, z.array(EmailAddressSchema).min(1)]),\n cc: z.array(EmailAddressSchema).optional(),\n bcc: z.array(EmailAddressSchema).optional(),\n /** RFC 5322 `From` field. Most relays will reject if the domain\n * isn't authorised — the addon is responsible for substituting a\n * sane default when omitted. */\n from: z.string().optional(),\n /** Optional `Reply-To` override. */\n replyTo: z.string().optional(),\n subject: z.string(),\n /** Plain-text body. Required even when `html` is present (fallback\n * for clients that strip HTML — including most spam filters). */\n text: z.string(),\n /** Optional HTML body. Renders alongside `text` as multi-part. */\n html: z.string().optional()\n});\nconst SendEmailResultSchema = z.object({\n messageId: z.string(),\n accepted: z.array(EmailAddressSchema).default([]),\n rejected: z.array(EmailAddressSchema).default([])\n});\nconst SmtpStatusSchema = z.object({\n /** True iff the addon has successfully verified the relay. */\n ready: z.boolean(),\n /** Operator-visible host string (no credentials). */\n host: z.string(),\n /** Last error message reported by the relay, when not ready. */\n error: z.string().optional(),\n /** Last successful verify timestamp (unix ms). */\n lastVerifiedAt: z.number().optional()\n});\nconst smtpProviderCapability = {\n name: \"smtp-provider\",\n scope: \"system\",\n mode: \"collection\",\n internal: true,\n providerKind: \"email\",\n methods: {\n sendEmail: method(\n SendEmailInputSchema,\n SendEmailResultSchema,\n { kind: \"mutation\", auth: \"admin\", access: \"create\" }\n ),\n /** Round-trip ping against the SMTP relay (EHLO + AUTH if configured).\n * Used by the operator's \"Test connection\" button. */\n verify: method(\n z.void(),\n SmtpStatusSchema,\n { kind: \"mutation\", auth: \"admin\", access: \"view\" }\n ),\n getStatus: method(\n z.void(),\n SmtpStatusSchema,\n { auth: \"admin\" }\n )\n }\n};\nconst BrokerKindSchema = z.enum([\"external\", \"embedded\"]);\nconst BrokerStatusSchema = z.enum([\n \"connected\",\n \"disconnected\",\n \"auth-failed\",\n \"unreachable\",\n \"tls-error\"\n]);\nconst BrokerInfoSchema = z.object({\n id: z.string(),\n name: z.string(),\n url: z.string(),\n kind: BrokerKindSchema,\n status: BrokerStatusSchema,\n latencyMs: z.number().nullable(),\n error: z.string().optional(),\n /** Embedded brokers only: number of MQTT clients currently connected. */\n connectedClients: z.number().int().nonnegative().optional(),\n /** Epoch ms of the last live probe (external) or aedes snapshot (embedded). */\n lastCheckedAt: z.number().optional()\n});\nconst BrokerConnectionDetailsSchema = z.object({\n url: z.string(),\n username: z.string().optional(),\n password: z.string().optional(),\n /**\n * Suggested prefix for `clientId`. Each consumer should suffix this\n * with its own discriminator (addon id, instance id) so reconnects\n * don't kick each other off (MQTT spec: clientId must be unique per\n * broker).\n */\n clientIdPrefix: z.string().optional()\n});\nconst AddBrokerInputSchema = z.object({\n name: z.string().min(1),\n url: z.string().regex(/^(mqtt|mqtts|ws|wss):\\/\\//, \"URL must start with mqtt(s):// or ws(s)://\"),\n username: z.string().optional(),\n password: z.string().optional(),\n clientIdPrefix: z.string().optional()\n});\nconst AddBrokerResultSchema = z.object({\n id: z.string()\n});\nconst IdInputSchema = z.object({ id: z.string() });\nconst TestResultSchema = z.discriminatedUnion(\"ok\", [\n z.object({ ok: z.literal(true), latencyMs: z.number() }),\n z.object({ ok: z.literal(false), error: z.string() })\n]);\nconst StartEmbeddedInputSchema = z.object({\n port: z.number().int().min(1).max(65535).default(1883),\n /** Allow anonymous connect (no username/password). Default: false. */\n allowAnonymous: z.boolean().default(false),\n /** Optional shared username/password for clients. */\n username: z.string().optional(),\n password: z.string().optional()\n});\nconst StartEmbeddedResultSchema = z.object({\n id: z.string(),\n url: z.string()\n});\nconst StatusSchema = z.object({\n brokerCount: z.number(),\n embeddedRunning: z.boolean()\n});\nconst mqttBrokerCapability = {\n name: \"mqtt-broker\",\n scope: \"system\",\n mode: \"collection\",\n providerKind: \"broker\",\n status: { schema: StatusSchema, kind: \"poll\" },\n methods: {\n listBrokers: method(z.void(), z.array(BrokerInfoSchema)),\n getBrokerConfig: method(IdInputSchema, BrokerConnectionDetailsSchema),\n addBroker: method(AddBrokerInputSchema, AddBrokerResultSchema, { kind: \"mutation\" }),\n removeBroker: method(IdInputSchema, z.void(), { kind: \"mutation\" }),\n testConnection: method(IdInputSchema, TestResultSchema, { kind: \"mutation\" }),\n startEmbeddedBroker: method(StartEmbeddedInputSchema, StartEmbeddedResultSchema, { kind: \"mutation\" }),\n stopEmbeddedBroker: method(IdInputSchema, z.void(), { kind: \"mutation\" }),\n getStatus: method(z.void(), StatusSchema)\n }\n};\nconst LinkStateSchema = z.enum([\"unlinked\", \"linked\", \"error\"]);\nconst ExportSetupFieldSchema = z.object({\n label: z.string(),\n value: z.string(),\n /** Mask the value by default + render a reveal toggle (client id, secrets). */\n secret: z.boolean().optional()\n});\nconst ExportSetupSchema = z.object({\n /** A string to render as a scannable QR — HAP `X-HM://…` URI, a pairing URL, etc. Omitted when there's nothing to scan. */\n qr: z.string().optional(),\n /** Label/value rows shown with a copy button (HAP setup code, OAuth URLs, client id, linked-account count, …). */\n fields: z.array(ExportSetupFieldSchema).readonly().optional(),\n /** Free-form operator instructions rendered above the fields. */\n note: z.string().optional()\n});\nconst DeviceExportStatusSchema = z.object({\n linkState: LinkStateSchema,\n exposedDeviceCount: z.number(),\n error: z.string().optional(),\n /**\n * Optional pairing/account info the panel renders in a generic\n * \"Setup\" section. Addon-agnostic — the addon id identifies the\n * export target, never an `ecosystem` key here.\n */\n setup: ExportSetupSchema.optional()\n});\nconst DeviceKindSchema = z.string();\nconst ExposedDeviceSchema = z.object({\n deviceId: z.string(),\n exposedAs: z.string().optional(),\n capabilities: z.array(z.string()).optional()\n});\nconst ExposeInputSchema = z.object({\n deviceId: z.string(),\n capabilities: z.array(z.string()).optional()\n});\nconst UnexposeInputSchema = z.object({ deviceId: z.string() });\nconst deviceExportCapability = {\n name: \"device-export\",\n scope: \"system\",\n mode: \"collection\",\n providerKind: \"device-export\",\n status: { schema: DeviceExportStatusSchema, kind: \"poll\" },\n /**\n * Each export provider contributes its own per-device \"Export\" panel\n * (enabled toggle, preferred stream, addon-specific knobs like the\n * HA-MQTT discovery prefix). The three framework methods\n * `getDeviceSettingsContribution` / `getDeviceLiveContribution` /\n * `applyDeviceSettingsPatch` are auto-injected on the provider\n * interface and routed to the device-details aggregator.\n */\n exposesDeviceSettings: true,\n methods: {\n getStatus: method(z.void(), DeviceExportStatusSchema),\n listSupportedDeviceKinds: method(z.void(), z.array(DeviceKindSchema)),\n listExposedDevices: method(z.void(), z.array(ExposedDeviceSchema)),\n exposeDevice: method(ExposeInputSchema, z.void(), { kind: \"mutation\" }),\n unexposeDevice: method(UnexposeInputSchema, z.void(), { kind: \"mutation\" })\n }\n};\nconst AddonPageDeclarationSchema$1 = 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});\nconst AddonPageInfoSchema = z.object({\n addonId: z.string(),\n page: AddonPageDeclarationSchema$1,\n bundleUrl: z.string()\n});\nconst addonPagesCapability = {\n name: \"addon-pages\",\n scope: \"system\",\n mode: \"singleton\",\n methods: {\n listPages: method(z.void(), z.array(AddonPageInfoSchema).readonly())\n }\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});\nconst 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};\nconst WidgetHostEnum = z.enum([\"device-tab\", \"dashboard\", \"integration-detail\"]);\nconst WidgetSizeEnum = z.enum([\"xs\", \"sm\", \"md\", \"lg\", \"xl\"]);\nconst WidgetRemoteSchema = z.object({\n remoteName: z.string(),\n exposedModule: z.string(),\n componentKey: z.string().optional()\n});\nconst WidgetMetadataSchema = z.object({\n // ── UiContribution core (kind:'remote') ──────────────────────────\n /** Primary host tab — `'dashboard'`, `'device-tab'`, or a device-detail tab id. */\n tab: z.string(),\n /** Optional sub-tab within `tab`. */\n subTab: z.string().optional(),\n /** Operator-facing label. */\n label: z.string(),\n /** Ordering within `(tab, subTab)`, ascending. */\n order: z.number().optional(),\n /** Always `'remote'` — a widget is a Module Federation remote. */\n kind: z.literal(\"remote\"),\n /** MF remote descriptor. */\n remote: WidgetRemoteSchema,\n // ── Widget-only metadata ─────────────────────────────────────────\n /** Stable id within the addon — kebab-case. Equals `remote.componentKey`. */\n stableId: z.string(),\n description: z.string().optional(),\n icon: z.string().optional(),\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 /** Every host the widget supports. The picker filters on this set. */\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});\nconst 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};\nconst EnrichedWidgetMetadataSchema = WidgetMetadataSchema.extend({\n addonId: z.string(),\n bundleUrl: z.string()\n});\nconst addonWidgetsCapability = {\n name: \"addon-widgets\",\n scope: \"system\",\n mode: \"singleton\",\n methods: {\n listWidgets: method(z.void(), z.array(EnrichedWidgetMetadataSchema).readonly())\n }\n};\nconst AddonHttpRouteSchema = z.object({\n method: z.enum([\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"]),\n path: z.string(),\n access: z.enum([\"public\", \"authenticated\", \"admin\"]).optional(),\n description: z.string().optional()\n});\nconst InvokeRequestSchema = z.object({\n method: z.string(),\n path: z.string(),\n params: z.record(z.string(), z.string()),\n query: z.record(z.string(), z.string()),\n body: z.unknown(),\n headers: z.record(z.string(), z.string()),\n user: z.object({\n id: z.string(),\n username: z.string(),\n isAdmin: z.boolean()\n }).optional(),\n scopedToken: z.unknown().optional()\n});\nconst InvokeReplyEnvelopeSchema = z.object({\n status: z.number().int(),\n headers: z.record(z.string(), z.string()),\n /** When set, the hub MUST `reply.redirect(redirectUrl)` instead of\n * sending `body`. Status defaults to 302 when this is set unless\n * the handler called `reply.code(...)` explicitly. */\n redirectUrl: z.string().nullable(),\n /** JSON-serializable body. `undefined` is treated as \"no body\". */\n body: z.unknown().optional(),\n /** Set when the handler called `reply.type(mime)`. */\n contentType: z.string().optional()\n});\nconst 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 * Cross-process dispatch entry point. Forked addons implement this\n * (via `buildAddonRouteProvider`) so the hub's Fastify catch-all\n * can route through Moleculer when the handler lives in a worker.\n *\n * Local addons can implement it for free with the same helper;\n * the hub bypasses the wire on co-located addons.\n */\n invoke: method(InvokeRequestSchema, InvokeReplyEnvelopeSchema, { kind: \"mutation\" })\n }\n};\nconst HWACCEL_OPTIONS = [\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];\nconst DEFAULT_DECODER_HWACCEL_CONFIG = {\n hwaccel: \"auto\",\n probedBestHwaccel: \"\"\n};\nconst ShmRingStatsSchema = z.object({\n sessionId: z.string(),\n slotCount: z.number().int(),\n slotByteLength: z.number().int(),\n segmentBytes: z.number().int(),\n budgetMb: z.number().int(),\n framesWritten: z.number().int(),\n getFrameHits: z.number().int(),\n getFrameMisses: z.number().int()\n});\nconst 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 // ── 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 // ── 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 // ── Output — polling-based frame retrieval ────────────────────\n // `pullFrames` drains the pixel `DecodedFrame[]` of a `frameSink:\n // 'callback'` session. `pullHandles` (Phase 5 / D9) drains the\n // zero-pixel `FrameHandle[]` of a `frameSink: 'shm'` session — the\n // broker hands each handle to a `FrameRingReader` that opens the\n // named segment and reads the pixels back zero-copy. A session is\n // one mode or the other; the unmatched method returns an empty\n // array.\n pullFrames: method(z.object({\n sessionId: z.string(),\n maxCount: z.number().default(1)\n }), z.array(DecodedFrameSchema)),\n pullHandles: method(z.object({\n sessionId: z.string(),\n maxCount: z.number().default(1)\n }), z.array(FrameHandleSchema)),\n // ── Frame fetch (Phase 5 / D9 downstream access) ──────────────\n // Read the pixels a FrameHandle refers to from this node's shm ring.\n // Returns null when the slot was already recycled (latest-wins).\n getFrame: method(z.object({ handle: FrameHandleSchema }), DecodedFrameSchema.nullable()),\n // shm ring usage stats for a session.\n getShmStats: method(z.object({ sessionId: z.string() }), ShmRingStatsSchema.nullable()),\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 // ── 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 * 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};\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});\nconst ExposedResourceSchema = z.object({\n streamId: z.string(),\n format: z.string(),\n value: z.string()\n});\nconst 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};\nconst 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();\nconst 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};\nconst 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]);\nconst 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});\nconst webrtcSessionCapability = {\n name: \"webrtc-session\",\n scope: \"device\",\n mode: \"singleton\",\n kind: \"wrapper\",\n defaultActive: true,\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 * SERVER-INJECTED — NOT a client hint. The hub layer that holds\n * the tRPC request context (and therefore the client IP) sets\n * this to `true` when the viewer's source IP is non-LAN\n * (4G/CGNAT/internet). The broker then forces TURN-relay-only\n * ICE for the session so a CGNAT client (which can only offer a\n * relay candidate) gets a clean relay↔relay media path instead\n * of werift nominating a dead host/hairpin-srflx pair. LAN\n * clients leave this absent/false and keep the low-latency\n * direct (host/srflx) path. Clients MUST NOT send this — the\n * server overwrites it from the request context.\n */\n relayOnly: z.boolean().optional()\n }),\n z.object({ sessionId: z.string(), sdpOffer: z.string() }),\n { kind: \"mutation\" }\n ),\n /**\n * Accept a CLIENT-generated SDP offer and return the server's\n * SDP answer. Mirrors the WHEP / Alexa\n * `Alexa.RTCSessionController.InitiateSessionWithOffer` direction\n * (client offers, server answers) — the dual of `createSession`,\n * which has the server offer first.\n *\n * `target` defaults to the device's adaptive selection when\n * omitted; an optional `sessionId` lets the client provide its\n * own correlation id (Alexa supplies one in the directive\n * payload). The returned `sessionId` is whatever the server uses\n * to track the session and accepts via `closeSession`.\n */\n handleOffer: method(\n z.object({\n deviceId: z.number().int().nonnegative(),\n target: WebrtcStreamTargetSchema.optional(),\n sdpOffer: z.string(),\n sessionId: z.string().optional(),\n /**\n * Force TURN-relay-only ICE for this session. Two kinds of caller\n * set it:\n * - A cloud peer like Alexa's RTCSessionController (reachable\n * only via TURN, never our host/srflx behind NAT) passes\n * `true` from its own trusted addon context.\n * - The hub injects it for browser client-offer viewers from the\n * request's source IP (non-LAN ⇒ true), exactly as it does for\n * `createSession`.\n * A LAN/Tailscale browser doing client-offer passthrough leaves it\n * absent/false so a direct host pair carries full native quality.\n * Untrusted browser clients MUST NOT send it — the hub overwrites\n * it from the request context.\n */\n relayOnly: z.boolean().optional()\n }),\n z.object({ sessionId: z.string(), sdpAnswer: 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 /**\n * Trickle ICE — add a remote (client) ICE candidate to a live session.\n * Lets the client send its SDP offer/answer IMMEDIATELY (before ICE\n * gathering finishes) and deliver candidates as they arrive, so the\n * connection establishes in ~0s instead of waiting for full gathering.\n * The dual of `getIceCandidates`. Mirrors Scrypted's signaling.\n */\n addIceCandidate: method(\n z.object({\n deviceId: z.number().int().nonnegative(),\n sessionId: z.string(),\n candidate: z.string(),\n sdpMid: z.string().nullable().optional(),\n sdpMLineIndex: z.number().int().nullable().optional()\n }),\n z.void(),\n { kind: \"mutation\" }\n ),\n /**\n * Trickle ICE — poll the server's gathered ICE candidates for a session.\n * The server answers immediately (no gathering wait) and the client polls\n * this to receive host/srflx/relay candidates as werift gathers them,\n * adding each to its PeerConnection. Returns all candidates gathered so\n * far; the client dedupes. `done` flips true once gathering completes.\n */\n getIceCandidates: method(\n z.object({\n deviceId: z.number().int().nonnegative(),\n sessionId: z.string()\n }),\n z.object({\n candidates: z.array(z.object({\n candidate: z.string(),\n sdpMid: z.string().nullable(),\n sdpMLineIndex: z.number().int().nullable()\n })),\n done: z.boolean()\n }),\n { kind: \"query\" }\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};\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});\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});\nconst AgentAddonConfigSchema = z.object({\n enabled: z.boolean(),\n modelId: z.string(),\n settings: z.record(z.string(), z.unknown()).readonly()\n});\nconst AgentPipelineSettingsSchema = z.object({\n addonDefaults: z.record(z.string(), AgentAddonConfigSchema).readonly()\n});\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});\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});\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});\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});\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});\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});\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});\nconst CapabilityBindingsSchema = z.record(z.string(), z.string());\nconst 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 // ── 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 // ── 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 // ── 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 // ── 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 * 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 // 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 // ── 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 // `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 /** 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 /** 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(),\n // 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 // ── 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};\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});\nconst AudioAnalysisSettingsSchema = z.object({\n minConfidence: z.number().min(0).max(1).default(0.3),\n allowedClasses: z.array(z.string()).default([])\n});\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});\nconst 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];\nconst DEFAULT_AUDIO_ANALYZER_CONFIG = {\n audioBackend: \"auto\",\n probedBestAudioBackend: \"\",\n selectedAudioModel: \"\"\n};\nconst 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: 3e4 }),\n isReady: method(z.void(), z.boolean()),\n dispose: method(z.void(), z.void(), { kind: \"mutation\" }),\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};\nconst audioAnalysisCapability = {\n name: \"audio-analysis\",\n scope: \"device\",\n mode: \"singleton\",\n kind: \"wrapper\",\n defaultActive: true,\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()\n )\n },\n events: {\n onAudioLevel: event(z.object({\n deviceId: z.number(),\n rms: z.number(),\n dbfs: z.number()\n }))\n }\n};\nconst PcmSampleFormatSchema = z.enum([\"f32le\", \"s16le\"]);\nconst AudioCodecInfoSchema = z.object({\n codec: z.string(),\n canDecode: z.boolean(),\n canEncode: z.boolean(),\n label: z.string().optional()\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});\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});\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});\nconst AudioEncodedChunkSchema = z.object({\n data: z.instanceof(Uint8Array),\n codec: z.string(),\n pts: z.number(),\n frameComplete: z.boolean()\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});\nconst 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 /** 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 // ── Session lifecycle ─────────────────────────────────────────────────\n createDecodeSession: method(\n AudioDecodeSessionConfigSchema,\n z.object({ sessionId: z.string(), nodeId: z.string() }),\n { kind: \"mutation\" }\n ),\n createEncodeSession: method(\n AudioEncodeSessionConfigSchema,\n z.object({ sessionId: z.string(), nodeId: z.string() }),\n { kind: \"mutation\" }\n ),\n closeSession: method(\n z.object({ sessionId: z.string(), nodeId: z.string().optional() }),\n z.void(),\n { kind: \"mutation\" }\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 /** 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 /** 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 // ── 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 /** 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 /** 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 // ── Inventory ─────────────────────────────────────────────────────────\n listActiveSessions: method(\n z.void(),\n z.array(SessionInventoryEntrySchema).readonly()\n )\n }\n};\nconst EmbeddingResultSchema = z.object({\n embedding: z.array(z.number()),\n inferenceMs: z.number()\n});\nconst EmbeddingInfoSchema = z.object({\n modelId: z.string(),\n embeddingDim: z.number(),\n ready: z.boolean()\n});\nconst 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};\nconst 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});\nconst ConfigEntrySchema$1 = z.object({\n key: z.string(),\n value: z.unknown(),\n description: z.string().optional()\n});\nconst 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});\nconst 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});\nconst ConfigUISchemaOutput = z.unknown().nullable();\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});\nconst 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});\nconst DeviceRemovePayloadSchema = z.object({\n deviceId: z.number()\n});\nconst DevicePersistConfigPayloadSchema = z.object({\n deviceId: z.number(),\n data: z.record(z.string(), z.unknown())\n});\nconst deviceManagerCapability = {\n name: \"device-manager\",\n scope: \"system\",\n mode: \"singleton\",\n methods: {\n // ── Persistence (migrated from device-persistence) ────────────────────────\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 /** Register a device in the DB + in-memory registry. Called by DeviceManagerApi.register(). */\n registerDevice: method(DeviceRegisterPayloadSchema, z.void(), { kind: \"mutation\" }),\n /** Remove a device from the DB + in-memory registry. Called by DeviceManagerApi.remove(). */\n removeDevice: method(DeviceRemovePayloadSchema, z.void(), { kind: \"mutation\" }),\n /** Persist device config blob. Called by DeviceConfig.set/setAll(). */\n persistConfig: method(DevicePersistConfigPayloadSchema, z.void(), { kind: \"mutation\" }),\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 /** 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 /** 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 /** 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 /** 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 /** 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 /** 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 /** 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 /** 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 /** 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 /** List persisted devices for an addon (DB, for restore). */\n listPersistedByAddon: method(\n z.object({ addonId: z.string() }),\n z.array(SavedDeviceRowSchema)\n ),\n // ── Query — live registry ─────────────────────────────────────────────────\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 /** Get a single device by numeric deviceId. */\n getDevice: method(\n z.object({ deviceId: z.number() }),\n DeviceInfoSchema.nullable()\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 // ── Runtime — live device operations ─────────────────────────────────────\n /** Get stream sources for a camera device. */\n getStreamSources: method(\n z.object({ deviceId: z.number() }),\n z.array(StreamSourceEntrySchema$1)\n ),\n /** Get config entries (key + value + description) for a device. */\n getConfigSchema: method(\n z.object({ deviceId: z.number() }),\n z.array(ConfigEntrySchema$1)\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 // ── Mutations — config changes, enable/disable, remove ────────────────────\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 /** 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 /** 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 /** 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 // ── Stream profile map ────────────────────────────────────────────────────\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 /** 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 /** 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 // ── Bindings — per-device capability provider map ────────────────────────\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 * 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 * 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 * 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 when\n * the cap definition declares `kind: 'wrapper'`.\n */\n listWrappersForCap: method(\n z.object({ capName: z.string() }),\n z.array(z.string())\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 // ── 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 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 /** 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 /** 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 * 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 /** 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 * 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 * 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 * 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};\nconst 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 * 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};\nconst AuthResultSchema = z.object({\n userId: z.string(),\n username: z.string(),\n email: z.string().optional(),\n displayName: z.string().optional(),\n /**\n * Whether the authenticating user is an admin. The auth-provider\n * surface returns this so the server's login flow can mint a JWT\n * with the correct bypass flag. Non-admin users authenticated via\n * an external IdP still need their scopes assigned by an admin via\n * `setUserScopes` — the SSO flow doesn't carry permissions.\n */\n isAdmin: z.boolean().default(false)\n});\nconst 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};\nconst NetworkEndpointSchema = z.object({\n url: z.string(),\n hostname: z.string(),\n port: z.number(),\n protocol: z.enum([\"http\", \"https\"])\n});\nconst NetworkAccessStatusSchema = z.object({\n connected: z.boolean(),\n endpoint: NetworkEndpointSchema.nullable(),\n error: z.string().optional()\n});\nconst NetworkEndpointEntrySchema = NetworkEndpointSchema.extend({\n /**\n * Stable id within the provider — typically `<mode>-<sourcePort>` so\n * the orchestrator can dedupe across `listEndpoints` polls.\n */\n id: z.string(),\n /** Operator-facing label (mirrors `MeshEndpoint.label`). */\n label: z.string(),\n /** Optional provider-specific mode tag, used for icon/colour in admin UI. */\n mode: z.string().optional(),\n /** Originating local port the ingress fronts (informational). */\n sourcePort: z.number().optional()\n});\nconst networkAccessCapability = {\n name: \"network-access\",\n scope: \"system\",\n mode: \"collection\",\n providerKind: \"ingress\",\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 * Enumerate every active ingress entry. Providers that expose only a\n * single endpoint may omit this method; callers fall back to\n * `getEndpoint()` in that case.\n */\n listEndpoints: method(z.void(), z.array(NetworkEndpointEntrySchema).readonly())\n }\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});\nconst 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};\nconst SnapshotImageSchema = z.object({\n base64: z.string(),\n contentType: z.string()\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});\nconst snapshotCapability = {\n name: \"snapshot\",\n scope: \"device\",\n mode: \"singleton\",\n kind: \"wrapper\",\n defaultActive: true,\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};\nconst 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};\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});\nconst 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};\nconst NotificationRuleConditionsSchema = z.object({\n deviceIds: z.array(z.number()).readonly().optional(),\n classNames: z.array(z.string()).readonly().optional(),\n zoneIds: z.array(z.string()).readonly().optional(),\n minConfidence: z.number().optional(),\n source: z.enum([\"pipeline\", \"onboard\", \"any\"]).optional(),\n schedule: z.object({\n days: z.array(z.number()).readonly(),\n startHour: z.number(),\n endHour: z.number()\n }).optional(),\n cooldownSeconds: z.number().optional(),\n minDwellSeconds: z.number().optional()\n});\nconst NotificationRuleTemplateSchema = z.object({\n title: z.string(),\n body: z.string(),\n imageMode: z.enum([\"crop\", \"annotated\", \"full\", \"none\"])\n});\nconst NotificationRuleSchema = z.object({\n id: z.string(),\n name: z.string(),\n enabled: z.boolean(),\n eventTypes: z.array(z.string()).readonly(),\n conditions: NotificationRuleConditionsSchema,\n outputs: z.array(z.string()).readonly(),\n template: NotificationRuleTemplateSchema.optional(),\n priority: z.enum([\"low\", \"normal\", \"high\", \"critical\"])\n});\nconst NotificationTestResultSchema = z.object({\n ruleId: z.string(),\n eventId: z.string(),\n timestamp: z.number(),\n wouldFire: z.boolean(),\n reason: z.string().optional()\n});\nconst NotificationHistoryEntrySchema = z.object({\n id: z.string(),\n ruleId: z.string(),\n ruleName: z.string(),\n eventId: z.string(),\n timestamp: z.number(),\n outputs: z.array(z.string()).readonly(),\n success: z.boolean(),\n error: z.string().optional(),\n deviceId: z.number().optional()\n});\nconst NotificationHistoryFilterSchema = z.object({\n ruleId: z.string().optional(),\n deviceId: z.number().optional(),\n from: z.number().optional(),\n to: z.number().optional(),\n limit: z.number().optional()\n});\nconst advancedNotifierCapability = {\n name: \"advanced-notifier\",\n scope: \"system\",\n mode: \"singleton\",\n internal: true,\n methods: {\n getRules: method(\n z.void(),\n z.object({ rules: z.array(NotificationRuleSchema).readonly() })\n ),\n upsertRule: method(\n z.object({ rule: NotificationRuleSchema }),\n z.object({ success: z.literal(true) }),\n { kind: \"mutation\" }\n ),\n deleteRule: method(\n z.object({ ruleId: z.string() }),\n z.object({ success: z.literal(true) }),\n { kind: \"mutation\" }\n ),\n testRule: method(\n z.object({ ruleId: z.string(), lookbackMinutes: z.number() }),\n z.object({ results: z.array(NotificationTestResultSchema).readonly() }),\n { kind: \"mutation\" }\n ),\n getHistory: method(\n z.object({ filter: NotificationHistoryFilterSchema.optional() }),\n z.object({ entries: z.array(NotificationHistoryEntrySchema).readonly() })\n )\n }\n};\nconst RecordingModeSchema = z.enum([\"continuous\", \"motion\", \"scheduled\", \"composite\"]);\nconst StreamPolicySchema = z.object({\n streamId: z.string(),\n mode: z.enum([\"always\", \"inherit\"])\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});\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});\nconst DataCategorySchema = z.enum([\n \"recording:main\",\n \"recording:mid\",\n \"recording:sub\",\n \"thumbnail:scrub\",\n \"thumbnail:event\"\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});\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});\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});\nconst AvailabilityRangeSchema = z.object({\n startTime: z.number(),\n endTime: z.number(),\n streams: z.array(z.string()).readonly()\n});\nconst StorageUsageSchema = z.object({\n totalBytes: z.number(),\n segmentCount: z.number()\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});\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});\nconst MotionStatsSchema = z.object({\n totalEvents: z.number(),\n avgDurationSec: z.number(),\n avgEventsPerDay: z.number(),\n dutyCyclePercent: z.number()\n});\nconst DeviceIdInput = z.object({ deviceId: z.number() });\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});\nconst TimeRangeInput = z.object({\n deviceId: z.number(),\n startTime: z.number(),\n endTime: z.number()\n});\nconst StreamTimeRangeInput = z.object({\n deviceId: z.number(),\n streamId: z.string(),\n startTime: z.number(),\n endTime: z.number()\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});\nconst ThumbnailInput = z.object({\n deviceId: z.number(),\n timestamp: z.number(),\n category: z.string().optional()\n});\nconst DeviceStreamInput = z.object({\n deviceId: z.number(),\n streamId: z.string()\n});\nconst StorageEstimateInput = z.object({\n deviceId: z.number(),\n motionInput: z.object({\n avgEventsPerDay: z.number(),\n avgDurationSec: z.number()\n }).optional()\n});\nconst RetentionConfigInput = z.object({\n deviceId: z.number(),\n dataCategory: DataCategorySchema\n});\nconst SetPolicyInput = z.object({\n deviceId: z.number(),\n policy: RecordingPolicySchema.omit({ deviceId: true })\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});\nconst 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 // ── Lifecycle ─────────────────────────────────────────────────────\n enable: method(EnableInput, z.void(), { kind: \"mutation\", auth: \"admin\" }),\n disable: method(DeviceIdInput, z.void(), { kind: \"mutation\", auth: \"admin\" }),\n // ── Config ────────────────────────────────────────────────────────\n getConfig: method(DeviceIdInput, RecordingPolicySchema.nullable()),\n updateConfig: method(UpdateConfigInput, z.void(), { kind: \"mutation\", auth: \"admin\" }),\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 // ── Storage ───────────────────────────────────────────────────────\n estimateStorage: method(StorageEstimateInput, StorageEstimateSchema),\n estimateGlobalStorage: method(z.void(), StorageEstimateSchema),\n getStorageUsage: method(DeviceStreamInput, StorageUsageSchema),\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 // ── Retention ─────────────────────────────────────────────────────\n getRetentionConfig: method(RetentionConfigInput, RecordingStorageConfigSchema.nullable()),\n updateRetentionConfig: method(RecordingStorageConfigSchema, z.void(), { kind: \"mutation\", auth: \"admin\" }),\n // ── Motion ────────────────────────────────────────────────────────\n getMotionStats: method(TimeRangeInput, MotionStatsSchema)\n }\n};\nconst detectionPipelineCapability = {\n name: \"detection-pipeline\",\n scope: \"device\",\n mode: \"singleton\",\n kind: \"wrapper\",\n defaultActive: true,\n deviceTypes: [DeviceType.Camera],\n exposesDeviceSettings: true,\n methods: {}\n};\nconst cameraPipelineConfigCapability = {\n name: \"camera-pipeline-config\",\n scope: \"device\",\n mode: \"singleton\",\n kind: \"wrapper\",\n defaultActive: true,\n deviceTypes: [DeviceType.Camera],\n exposesDeviceSettings: true,\n methods: {}\n};\nconst TrackStateSchema = z.enum([\"new\", \"entered\", \"left\", \"moving\", \"idle\"]);\nconst EventKindSchema = z.enum([\"motion\", \"object\", \"audio\"]);\nconst TrackPositionSchema = z.object({\n x: z.number(),\n y: z.number(),\n timestamp: z.number(),\n bbox: BoundingBoxSchema\n});\nconst TrackSnapshotSchema = z.object({\n timestamp: z.number(),\n position: TrackPositionSchema,\n /** MediaStore key; resolve via `getTrackMedia({ trackId })`. */\n mediaKey: z.string()\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});\nconst BaseEventFields = {\n id: z.string(),\n deviceId: z.number(),\n timestamp: z.number()\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});\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});\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});\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});\nconst DEFAULT_EVENT_QUERY_LIMIT = 1e3;\nconst MAX_EVENT_QUERY_LIMIT = 5e3;\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});\nconst ObjectEventQueryInput = DeviceEventQueryInput.extend({\n classFilter: z.string().optional()\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});\nconst pipelineAnalyticsCapability = {\n name: \"pipeline-analytics\",\n scope: \"device\",\n mode: \"singleton\",\n kind: \"wrapper\",\n defaultActive: true,\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 // ── 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 // ── 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};\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});\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});\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});\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});\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});\nconst ProcessResourceInfoSchema = z.object({\n openFds: z.number(),\n threadCount: z.number(),\n activeHandles: z.number(),\n activeRequests: z.number()\n});\nconst PressureAvgsSchema = z.object({\n avg10: z.number(),\n avg60: z.number(),\n avg300: z.number()\n});\nconst PressureInfoSchema = z.object({\n some: PressureAvgsSchema,\n full: PressureAvgsSchema.nullable()\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});\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});\nconst PidResourceStatsSchema = z.object({\n pid: z.number(),\n cpu: z.number(),\n memory: z.number()\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});\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});\nconst KillProcessInputSchema = z.object({\n pid: z.number(),\n /** Force = SIGKILL. Default is SIGTERM. */\n force: z.boolean().optional()\n});\nconst KillProcessResultSchema = z.object({\n success: z.boolean(),\n reason: z.string().optional(),\n signal: z.enum([\"SIGTERM\", \"SIGKILL\"]).optional()\n});\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});\nconst 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};\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});\nconst PtzStatusSchema = PtzPositionSchema.extend({ autofocus: z.boolean() });\nconst PtzOptionsSchema = z.object({\n hasPan: z.boolean(),\n hasTilt: z.boolean(),\n hasZoom: z.boolean(),\n supportsPresets: z.boolean(),\n /** Max number of named presets the camera supports, when known. */\n maxPresets: z.number().optional(),\n /** Whether the camera exposes a controllable autofocus toggle\n * (boolean `hasX` per the getOptions availability convention). */\n hasAutofocus: z.boolean()\n});\nconst ptzCapability = {\n name: \"ptz\",\n scope: \"device\",\n mode: \"singleton\",\n deviceTypes: [DeviceType.Camera],\n deviceConfig: {\n ui: { kind: \"widget\", widgetId: \"host/ptz-panel\", tab: \"ptz\", topTab: true, label: \"PTZ\", order: 0 }\n },\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 savePreset: method(\n z.object({ deviceId: z.number(), presetId: z.string(), name: z.string() }),\n z.void(),\n { kind: \"mutation\", auth: \"admin\" }\n ),\n deletePreset: method(\n z.object({ deviceId: z.number(), presetId: z.string() }),\n z.void(),\n { kind: \"mutation\", auth: \"admin\" }\n ),\n getOptions: method(\n z.object({ deviceId: z.number() }),\n PtzOptionsSchema\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 /** Toggle the camera's autofocus. Only meaningful when\n * `getOptions().hasAutofocus` is true. */\n setAutofocus: method(\n z.object({ deviceId: z.number(), enabled: z.boolean() }),\n z.void(),\n { kind: \"mutation\" }\n )\n },\n status: {\n schema: PtzStatusSchema,\n kind: \"command-driven\"\n }\n};\nconst EventItemSchema = z.object({\n id: z.string(),\n type: z.string(),\n timestamp: z.number(),\n // 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});\nconst 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};\nconst SegmentSchema = z.object({\n id: z.string(),\n startTs: z.number(),\n // unix ms\n endTs: z.number(),\n durationSec: z.number(),\n sizeBytes: z.number().optional()\n});\nconst 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};\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});\nconst ConfigEntrySchema = z.object({\n key: z.string(),\n value: z.unknown()\n});\nconst 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 * 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 * 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 * 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 * 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};\nconst 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});\nconst 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});\nconst 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};\nconst 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};\nconst OsdOverlayKindEnum = z.enum([\"text\", \"timestamp\", \"watermark\"]);\nconst OsdPositionEnum = z.enum([\n \"top-left\",\n \"top-center\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-center\",\n \"bottom-right\",\n \"custom\"\n]);\nconst 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});\nconst OsdStatusSchema = z.object({\n overlays: z.array(OsdOverlaySchema).readonly()\n});\nconst OsdOverlayPatchSchema = z.object({\n enabled: z.boolean().optional(),\n text: z.string().optional(),\n position: OsdPositionEnum.optional()\n}).partial();\nconst 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 ?? [],\n when: (o) => Array.isArray(o.availablePositions) && o.availablePositions.length > 0\n }\n }\n }]\n }\n};\nconst AccessoriesStatusSchema = z.object({\n childDeviceIds: z.array(z.number()).readonly()\n});\nconst 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};\nconst 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});\nconst 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});\nconst 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 * Open a raw-PCM talk session (no WebRTC SDP plumbing). Used by\n * non-WebRTC consumers (HomeKit export, Alexa raw audio, test\n * harnesses) that already have decoded PCM frames and just need a\n * direct path onto the camera's talk channel. Mutually exclusive\n * with `startSession` (an active WebRTC session must be stopped\n * before a raw-PCM session can be opened on the same device, and\n * vice versa).\n */\n startTalkSession: method(\n z.object({ deviceId: z.number() }),\n z.object({ sessionId: z.string() }),\n { kind: \"mutation\", auth: \"admin\" }\n ),\n /**\n * Push a chunk of PCM s16le mono onto the active raw-PCM talk\n * session. Frames are encoded to the firmware's expected codec\n * (Reolink: IMA ADPCM @ camera sample rate; Hikvision: G.711 @\n * 8 kHz) inside the provider — callers must resample upstream to\n * the rate the camera negotiated (typical: 16 kHz Reolink,\n * 8 kHz Hikvision). PCM is shipped base64-encoded so the payload\n * survives JSON serialization across tRPC.\n */\n pushTalkPcm: method(\n z.object({\n deviceId: z.number(),\n /** PCM frames as little-endian s16, mono. Base64-encoded so\n * the payload survives tRPC JSON serialization. */\n pcmBase64: z.string(),\n /** Sequence number for ordering / dropping out-of-order frames. */\n sequenceNumber: z.number().int()\n }),\n z.object({ accepted: z.boolean() }),\n { kind: \"mutation\", auth: \"admin\" }\n ),\n /** Close the raw-PCM talk session. Idempotent. */\n endTalkSession: method(\n z.object({ deviceId: z.number() }),\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};\nconst CamStreamDescriptorSchema = z.object({\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 /** Device-level features (e.g. `battery-operated`) — drives broker policy. */\n deviceFeatures: z.array(z.string()).optional(),\n /** Eligible for automatic profile assignment. Absent = `true`. */\n autoEligible: z.boolean().optional(),\n /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */\n metadata: z.record(z.string(), z.unknown()).optional()\n});\nconst streamCatalogCapability = {\n name: \"stream-catalog\",\n scope: \"device\",\n mode: \"singleton\",\n deviceTypes: [DeviceType.Camera],\n methods: {\n getCatalog: method(\n z.object({ deviceId: z.number().int().nonnegative() }),\n z.array(CamStreamDescriptorSchema).readonly()\n )\n }\n};\nconst ModelFormatSchema = z.enum(MODEL_FORMATS);\nconst HwAccelBackendInputSchema = z.enum([\n \"videotoolbox\",\n \"cuda\",\n \"nvdec\",\n \"vaapi\",\n \"qsv\",\n \"d3d11va\",\n \"dxva2\",\n \"amf\",\n \"vdpau\",\n \"drm\",\n \"coreml\",\n \"tensorrt\",\n \"openvino\",\n \"directml\",\n \"webgpu\",\n \"none\"\n]).nullable().optional();\nconst HwAccelResolutionSchema = z.object({\n preferred: z.array(z.string()).readonly()\n});\nconst HardwareEncoderIdSchema = z.enum([\n \"h264_videotoolbox\",\n \"hevc_videotoolbox\",\n \"h264_vaapi\",\n \"hevc_vaapi\",\n \"h264_nvenc\",\n \"hevc_nvenc\",\n \"h264_qsv\",\n \"hevc_qsv\",\n \"h264_amf\",\n \"hevc_amf\",\n \"libx264\",\n \"libx265\"\n]);\nconst HardwareEncoderProbeSchema = z.object({\n encoder: HardwareEncoderIdSchema,\n codec: z.enum([\"H264\", \"H265\"]),\n family: z.enum([\"videotoolbox\", \"vaapi\", \"nvenc\", \"qsv\", \"amf\", \"software\"]),\n available: z.boolean(),\n reason: z.string().optional()\n});\nconst HardwareEncodersSchema = z.object({\n encoders: z.array(HardwareEncoderProbeSchema).readonly(),\n defaultH264: HardwareEncoderIdSchema,\n defaultH265: HardwareEncoderIdSchema,\n probedAt: z.number()\n});\nconst HardwarePlatformSchema = z.enum([\"darwin\", \"linux\", \"win32\"]);\nconst HardwareArchSchema = z.enum([\"arm64\", \"x64\"]);\nconst GpuInfoSchema = z.object({\n type: z.enum([\"nvidia\", \"amd\", \"intel\", \"apple\"]),\n name: z.string(),\n memoryMB: z.number().optional()\n});\nconst NpuInfoSchema = z.object({\n type: z.enum([\"apple-ane\", \"intel-npu\"])\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});\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});\nconst PlatformCapabilitiesSchema = z.object({\n hardware: HardwareInfoSchema,\n scores: z.array(PlatformScoreSchema).readonly(),\n bestScore: PlatformScoreSchema,\n pythonPath: z.string().nullable()\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});\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});\nconst platformProbeCapability = {\n name: \"platform-probe\",\n scope: \"system\",\n mode: \"singleton\",\n methods: {\n getCapabilities: method(z.void(), PlatformCapabilitiesSchema),\n getHardware: method(z.void(), HardwareInfoSchema),\n resolveInferenceConfig: method(\n z.object({ requirements: z.array(ModelRequirementSchema).readonly() }),\n ResolvedInferenceConfigSchema\n ),\n resolveHwAccel: method(\n z.object({ prefer: HwAccelBackendInputSchema, nodeId: z.string().optional() }),\n HwAccelResolutionSchema\n ),\n /**\n * Hardware-encoder probe — see Task #185. Cached after first call.\n */\n getHardwareEncoders: method(z.void(), HardwareEncodersSchema),\n refreshHardwareEncoders: method(\n z.void(),\n HardwareEncodersSchema,\n { kind: \"mutation\", auth: \"admin\" }\n )\n }\n};\nconst InterfaceKindEnum = z.enum([\n \"lan\",\n // wired ethernet (en0, eth0, ...)\n \"wifi\",\n // wireless (en1, wlan*, ...)\n \"docker\",\n // docker0 / br-* / veth*\n \"vpn\",\n // tun*, utun*, wg*, tap*\n \"loopback\",\n // lo, lo0\n \"other\"\n // anything we can't classify confidently\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});\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});\nconst PreferredSchema = LocalInterfaceSchema.nullable();\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\",\n // private RFC1918 / link-local IPv4\n \"lan-ipv6\",\n // private IPv6\n \"public\",\n // tunnel / external FQDN\n \"loopback\"\n // 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});\nconst GetConnectionEndpointsResultSchema = z.object({\n endpoints: z.array(ConnectionEndpointSchema).readonly()\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});\nconst 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 * 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 * 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 * 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 * 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 * 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};\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});\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 /** MagicDNS / mesh DNS name (e.g. `peer-foo.tail-abc.ts.net`). Empty when the provider doesn't support DNS or peer-side resolution is disabled. */\n magicDns: z.string(),\n /** Mesh IPv4 / IPv6 addresses combined. Multiple when 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 * Connection mode to this peer:\n * - `direct`: NAT-traversed P2P (UDP punched)\n * - `relay`: traffic relayed through provider edge (Tailscale DERP)\n * - `idle`: peer reachable but no recent traffic / handshake\n */\n connection: z.enum([\"direct\", \"relay\", \"idle\"]),\n /** DERP region / relay node identifier when `connection: relay`. Null otherwise. */\n relay: z.string().nullable(),\n /** Last successful handshake timestamp (epoch ms). 0 when never. */\n lastHandshakeMs: z.number(),\n /** Bytes received from this peer since the daemon started. */\n rxBytes: z.number(),\n /** Bytes transmitted to this peer since the daemon started. */\n txBytes: z.number(),\n /** ACL tags this peer carries (e.g. `[\"tag:server\"]`). Empty when human-owned. */\n tags: z.array(z.string()).readonly(),\n /** True when the peer advertises itself as an exit-node candidate. */\n exitNodeOption: z.boolean(),\n /** Subnet routes the peer advertises (e.g. `[\"192.168.1.0/24\"]`). */\n advertisedRoutes: z.array(z.string()).readonly(),\n /** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */\n userLogin: z.string().nullable(),\n /** Pre-auth key / machine-key expiry (epoch ms). Null when keys don't expire. */\n keyExpiry: z.number().nullable()\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 // ── Account / tenant identity (generic across providers) ────────\n /**\n * Tenant / tailnet / network display name (Tailscale = tailnet\n * domain, Headscale = namespace, ZeroTier = network name). Empty\n * pre-join. Per-provider semantics, common slot.\n */\n tenantName: z.string(),\n /**\n * Mesh DNS suffix when the provider exposes peer-resolvable DNS\n * (Tailscale MagicDNS, Headscale MagicDNS, …). Empty when the\n * provider doesn't ship DNS (e.g. ZeroTier).\n */\n magicDnsSuffix: z.string(),\n /**\n * Authenticated user / account login bound to this host. Null when\n * the provider authenticates with a long-lived network token rather\n * than a user account (e.g. ZeroTier API token).\n */\n userLogin: z.string().nullable(),\n /**\n * Provider control-plane URL (Tailscale SaaS `https://login.tailscale.com`,\n * self-hosted Headscale, ZeroTier Central, …). Empty when not\n * applicable (rare).\n */\n controlPlaneUrl: z.string(),\n /**\n * Machine-key / node-key expiry (epoch ms). Null when the provider\n * doesn't rotate keys for the bound host. Operator-facing surface\n * for \"your access expires on …\" banners.\n */\n keyExpiry: z.number().nullable(),\n // ── Onboard-daemon handoff (Tailscale, generic slot) ────────────\n /**\n * When the provider runs its OWN mesh daemon (e.g. the Tailscale\n * client addon in `onboard` mode spawns a private `tailscaled`),\n * this carries the local control-socket path. Companion addons that\n * must drive the SAME daemon — chiefly `tailscale-ingress` for\n * Serve/Funnel — read it to point their CLI at the right socket\n * instead of the system default. Empty when the provider uses the\n * host's system daemon (or doesn't have the concept).\n */\n daemonSocket: z.string().optional(),\n /**\n * Path to the mesh CLI binary the provider downloaded for onboard\n * mode. Companion addons reuse it so they don't need a system\n * install when the operator chose a fully self-contained mesh.\n * Empty in host mode.\n */\n daemonCliPath: z.string().optional()\n});\nconst meshNetworkCapability = {\n name: \"mesh-network\",\n scope: \"system\",\n mode: \"collection\",\n providerKind: \"mesh\",\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 * 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 * Start an interactive browser-redirect login flow.\n *\n * The provider spawns its daemon's join command without a pre-auth\n * key, captures the verification URL the daemon prints, and returns\n * it. The admin UI opens the URL in a new tab; the user completes\n * authentication in the provider's web console and the background\n * process self-terminates. The caller then polls `getStatus()` until\n * `joined: true`.\n *\n * Mirrors the `tailscale up` (no `--auth-key`) flow.\n */\n startLogin: method(\n z.object({\n /** Optional hostname override the host should advertise once joined. */\n hostname: z.string().optional()\n }),\n z.object({\n /** Authentication URL the operator should open in a browser. */\n loginUrl: z.string()\n }),\n { kind: \"mutation\" }\n ),\n /** Leave the mesh. After this the meshIp/magicDnsHostname/etc.\n * vanish until the next `join`. The bound account stays — a\n * subsequent `join` reuses it without prompting for a new login. */\n leave: method(\n z.void(),\n z.object({ left: z.literal(true) }),\n { kind: \"mutation\" }\n ),\n /**\n * Sign out of the mesh account entirely. Distinct from `leave`:\n * `leave` only takes the host off-mesh (`tailscale down`) while the\n * account binding survives, so the next `join` reconnects silently.\n * `logout` (`tailscale logout`) wipes the daemon's stored\n * credentials — the next `startLogin` MUST go through a fresh\n * browser-redirect flow to bind a new account.\n */\n logout: method(\n z.void(),\n z.object({ loggedOut: z.literal(true) }),\n { kind: \"mutation\" }\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 * Probe the mesh daemon / API for a sanity check WITHOUT joining.\n * Operator-facing \"test connection\" button: validates the auth key\n * + reaches the control plane and reports back what would happen\n * on join.\n *\n * Tailscale: dry-runs `tailscale up --auth-key=… --reset` against\n * an idempotency probe; for an already-joined node it just returns\n * the current status.\n */\n testConnection: method(\n z.object({\n /** Optional auth key — when provided, probes the key validity\n * against the provider's API. Omit when already joined to\n * just ping the daemon. */\n authKey: z.string().optional()\n }),\n z.object({\n ok: z.boolean(),\n /** Provider-side identifier resolved by the probe (tailnet\n * name for Tailscale, network id for ZeroTier, etc.). */\n tenant: z.string().optional(),\n /** Daemon binary version, when reachable. */\n daemonVersion: z.string().optional(),\n /** Human-readable error when `ok: false`. */\n error: z.string().optional()\n }),\n { kind: \"mutation\" }\n )\n // Provider-specific runtime knobs (accept-routes / advertise-routes /\n // shields-up / ssh / exit-node, …) live on the addon's own\n // `getSettingsUISchema` (form-builder), NOT here. Different mesh\n // providers (Tailscale, Headscale, ZeroTier, Nebula) have very\n // different config surfaces — picking one shape and forcing all\n // implementations to honour it would either lose options or\n // misrepresent them. The Mesh page renders the addon's settings\n // schema as a \"Settings\" tab next to the generic Status / Peers\n // tabs driven by this cap.\n }\n};\nconst UserSummarySchema = z.object({\n id: z.string(),\n username: z.string(),\n isAdmin: z.boolean().default(false),\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 /**\n * True iff this user has a CONFIRMED TOTP enrollment. Surfaced on\n * `listUsers` so the admin Users page can render the \"Remove 2FA\"\n * action conditionally without firing one `getTotpStatus` query per\n * row. Self-service enrollment lives on the user's profile page.\n */\n totpEnabled: z.boolean().default(false),\n createdAt: z.number(),\n updatedAt: z.number()\n});\nconst CreateUserInputSchema = z.object({\n username: z.string(),\n password: z.string().min(6),\n isAdmin: z.boolean().default(false),\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});\nconst UpdateUserInputSchema = z.object({\n id: z.string(),\n isAdmin: z.boolean().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});\nconst ApiKeySummarySchema = z.object({\n id: z.string(),\n label: z.string(),\n isAdmin: z.boolean().default(false),\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});\nconst CreateApiKeyInputSchema = z.object({\n label: z.string(),\n isAdmin: z.boolean().default(false),\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});\nconst CreateApiKeyResultSchema = z.object({\n token: z.string(),\n record: ApiKeySummarySchema\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 expiresAt: z.number().nullish(),\n lastUsedAt: z.number().nullish(),\n createdAt: z.number()\n});\nconst CreateScopedTokenInputSchema = z.object({\n userId: z.string(),\n name: z.string(),\n scopes: z.array(TokenScopeSchema),\n expiresAt: z.number().optional()\n});\nconst CreateScopedTokenResultSchema = z.object({\n token: z.string(),\n record: ScopedTokenSummarySchema\n});\nconst OauthSessionSummarySchema = z.object({\n id: z.string(),\n userId: z.string(),\n username: z.string(),\n integrationId: z.string(),\n scopes: z.array(TokenScopeSchema),\n createdAt: z.number(),\n lastUsedAt: z.number(),\n revokedAt: z.number().nullable()\n});\nconst TotpSetupResultSchema = z.object({\n secret: z.string(),\n otpauthUrl: z.string()\n});\nconst TotpStatusSchema = z.object({\n /** True iff `confirmedAt != null` — a pending half-enrollment is reported as `enabled: false`. */\n enabled: z.boolean(),\n /** Null when no row exists OR the row is still pending confirmation. */\n confirmedAt: z.number().nullable()\n});\nconst userManagementCapability = {\n name: \"user-management\",\n scope: \"system\",\n mode: \"singleton\",\n methods: {\n listUsers: method(z.void(), z.array(UserSummarySchema), { auth: \"admin\" }),\n createUser: method(CreateUserInputSchema, UserSummarySchema, { kind: \"mutation\", auth: \"admin\", access: \"create\" }),\n updateUser: method(UpdateUserInputSchema, z.object({ success: z.literal(true) }), { kind: \"mutation\", auth: \"admin\", access: \"create\" }),\n deleteUser: method(z.object({ id: z.string() }), z.object({ success: z.literal(true) }), { kind: \"mutation\", auth: \"admin\", access: \"delete\" }),\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\", access: \"create\" }\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\", access: \"create\" }\n ),\n validateCredentials: method(\n z.object({ username: z.string(), password: z.string() }),\n UserSummarySchema.extend({ passwordHash: z.string() }).nullable(),\n { kind: \"mutation\", access: \"view\" }\n ),\n listApiKeys: method(z.void(), z.array(ApiKeySummarySchema), { auth: \"admin\" }),\n createApiKey: method(CreateApiKeyInputSchema, CreateApiKeyResultSchema, { kind: \"mutation\", auth: \"admin\", access: \"create\" }),\n revokeApiKey: method(z.object({ id: z.string() }), z.object({ success: z.literal(true) }), { kind: \"mutation\", auth: \"admin\", access: \"delete\" }),\n validateApiKey: method(z.object({ token: z.string() }), ApiKeySummarySchema.nullable(), { kind: \"mutation\", access: \"view\" }),\n createScopedToken: method(CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, { kind: \"mutation\", auth: \"admin\", access: \"create\" }),\n revokeScopedToken: method(z.object({ id: z.string() }), z.object({ success: z.literal(true) }), { kind: \"mutation\", auth: \"admin\", access: \"delete\" }),\n validateScopedToken: method(z.object({ token: z.string() }), ScopedTokenSummarySchema.nullable(), { access: \"view\" }),\n listScopedTokens: method(z.object({ userId: z.string() }), z.array(ScopedTokenSummarySchema), { auth: \"admin\" }),\n // ── TOTP / 2FA ─────────────────────────────────────────────────\n //\n // Setup → Confirm → (Verify on login) → Disable.\n //\n // Admin-only for now: operator enrolls TOTP on a user's behalf by\n // pairing their authenticator with the returned QR. Self-service\n // enrollment is a follow-up (needs the cap framework to expose the\n // caller's identity to the provider so the provider can enforce\n // self-or-admin).\n setupTotp: method(\n z.object({ userId: z.string() }),\n TotpSetupResultSchema,\n { kind: \"mutation\", auth: \"admin\", access: \"create\" }\n ),\n confirmTotp: method(\n z.object({ userId: z.string(), code: z.string() }),\n z.object({ success: z.literal(true) }),\n { kind: \"mutation\", auth: \"admin\", access: \"create\" }\n ),\n disableTotp: method(\n z.object({ userId: z.string() }),\n z.object({ success: z.literal(true) }),\n { kind: \"mutation\", auth: \"admin\", access: \"delete\" }\n ),\n getTotpStatus: method(\n z.object({ userId: z.string() }),\n TotpStatusSchema,\n { auth: \"admin\" }\n ),\n // Public (no `auth`) — used by the login flow's second-step\n // challenge endpoint. The userId comes from the password-validation\n // step (signed bridge token), so this method is not a free oracle.\n verifyTotp: method(\n z.object({ userId: z.string(), code: z.string() }),\n z.object({ valid: z.boolean() }),\n { kind: \"mutation\", access: \"view\" }\n ),\n // ── OAuth account-linking grant ────────────────────────────────\n //\n // Core's /oauth2/* endpoints delegate here. Tokens are sso-bridge\n // JWTs (kinds oauth-code / oauth-access / oauth-refresh) and ALWAYS\n // carry isAdmin:false — the operator login proves hub control; the\n // issued token is minimal (device scope only).\n oauthIssueCode: method(\n z.object({\n integrationId: z.string(),\n userId: z.string(),\n username: z.string(),\n scopes: z.array(TokenScopeSchema),\n redirectUri: z.string(),\n hubUrl: z.string()\n }),\n z.object({ code: z.string() }),\n { kind: \"mutation\", access: \"create\" }\n ),\n oauthExchangeCode: method(\n z.object({ code: z.string(), redirectUri: z.string() }),\n z.object({\n accessToken: z.string(),\n refreshToken: z.string(),\n expiresIn: z.number()\n }).nullable(),\n { kind: \"mutation\", access: \"view\" }\n ),\n oauthRefresh: method(\n z.object({ refreshToken: z.string() }),\n z.object({\n accessToken: z.string(),\n refreshToken: z.string(),\n expiresIn: z.number()\n }).nullable(),\n { kind: \"mutation\", access: \"view\" }\n ),\n oauthVerifyAccessToken: method(\n z.object({ token: z.string() }),\n z.object({\n userId: z.string(),\n username: z.string(),\n scopes: z.array(TokenScopeSchema)\n }).nullable(),\n { access: \"view\" }\n ),\n // ── OAuth linked-session management (Phase D) ──────────────────\n //\n // The admin UI lists active account-linking sessions and revokes\n // them; revocation makes the linked integration's tokens fail\n // verification immediately.\n listOauthSessions: method(\n z.void(),\n z.array(OauthSessionSummarySchema),\n { auth: \"admin\" }\n ),\n revokeOauthSession: method(\n z.object({ id: z.string() }),\n z.object({ success: z.boolean() }),\n { kind: \"mutation\", auth: \"admin\", access: \"delete\" }\n )\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});\nconst HealthStatusSchema = z.object({\n status: z.literal(\"ok\"),\n uptime: z.number()\n});\nconst NetworkAddressSchema = z.object({\n name: z.string(),\n address: z.string(),\n family: z.string(),\n internal: z.boolean()\n});\nconst 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};\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});\nconst ClientNetworkStatsSchema = z.object({\n rttMs: z.number(),\n jitterMs: z.number(),\n estimatedBandwidthKbps: z.number(),\n lastUpdated: z.number()\n});\nconst DeviceNetworkStatsSchema = z.object({\n deviceId: z.number(),\n streams: z.record(z.string(), StreamNetworkStatsSchema),\n client: ClientNetworkStatsSchema.optional()\n});\nconst 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(6e4),\n jitterMs: z.number().min(0).max(1e4),\n estimatedBandwidthKbps: z.number().min(0).max(1e6)\n }),\n z.void(),\n { kind: \"mutation\" }\n )\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.object({\n label: z.string(),\n url: z.string()\n }).optional()\n});\nconst toastCapability = {\n name: \"toast\",\n scope: \"system\",\n mode: \"singleton\",\n methods: {\n onToast: method(z.void(), ToastSchema, { kind: \"subscription\" })\n }\n};\nconst TopologyServiceSchema = z.object({\n addonId: z.string(),\n capabilities: z.array(z.string()).readonly(),\n status: z.string()\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});\nconst TopologyCategoryAddonSchema = z.object({\n id: z.string(),\n status: z.string(),\n cpuPercent: z.number(),\n memoryRss: z.number()\n});\nconst TopologyCategorySchema = z.object({\n category: z.string(),\n total: z.number(),\n healthy: z.number(),\n addons: z.array(TopologyCategoryAddonSchema).readonly()\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 categories: z.array(TopologyCategorySchema).readonly()\n});\nconst CapUsageEdgeSchema = z.object({\n callerAddonId: z.string(),\n providerAddonId: z.string(),\n capName: z.string(),\n callsPerMin: z.number(),\n lastCallAtMs: z.number()\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});\nconst ClusterAddonStatusEntrySchema = z.object({\n hubVersion: z.string(),\n nodes: z.array(ClusterAddonNodeDeploymentSchema)\n});\nconst NodeAddonInputSchema = z.object({\n nodeId: z.string(),\n addonId: z.string()\n});\nconst NodeAddonEntrySchema = z.object({\n id: z.string(),\n status: z.string(),\n version: z.string().optional(),\n packageName: z.string().optional()\n});\nconst SuccessSchema = z.object({ success: z.boolean() });\nconst RestartProcessResultSchema = z.object({\n success: z.boolean(),\n reason: z.string().optional()\n});\nconst RestartNodeResultSchema = z.object({\n restarted: z.array(z.string()).readonly(),\n failed: z.array(z.string()).readonly()\n});\nconst RenameNodeResultSchema = z.object({\n nodeId: z.string(),\n name: z.string()\n});\nconst nodesCapability = {\n name: \"nodes\",\n scope: \"system\",\n mode: \"singleton\",\n nodeIdMode: \"data\",\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 getCapUsageGraph: method(\n z.object({\n windowSeconds: z.number().int().positive().max(300).default(60)\n }),\n z.array(CapUsageEdgeSchema).readonly(),\n { auth: \"admin\" }\n ),\n /**\n * Direct per-node addon listing — calls `$agent.status` on the target\n * node (or returns the hub registry for `nodeId === 'hub'`) and surfaces\n * the full addon roster including `version` + `packageName`. The\n * `topology` cap also includes addons but strips them down to\n * `{id, capabilities, status}` for the cluster diagram; this method\n * is the one the per-node \"Addons\" tab should call.\n */\n getNodeAddons: method(\n z.object({ nodeId: z.string() }),\n z.array(NodeAddonEntrySchema).readonly(),\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};\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});\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});\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});\nconst TestConnectionResultSchema = z.object({\n success: z.boolean(),\n error: z.string().optional()\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});\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});\nconst DeleteIntegrationResultSchema = z.object({\n success: z.boolean(),\n deletedId: z.string()\n});\nconst 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};\nconst LogLevelSchema = z.enum([\"debug\", \"info\", \"warn\", \"error\"]);\nconst ChannelSchema = z.enum([\"off\", \"latest\", \"beta\"]);\nconst ChannelWithInheritSchema = z.enum([\"off\", \"latest\", \"beta\", \"inherit\"]);\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});\nconst AddonProcessSchema = z.object({\n pid: z.number().optional(),\n mode: z.string(),\n state: z.string()\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.object({ message: z.string(), stack: z.string().optional() }).nullable(),\n nextRetryAt: z.number().nullable(),\n alertEmitted: z.boolean(),\n retrying: z.boolean(),\n inGracePeriod: z.boolean()\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});\nconst InstalledPackageSchema = z.object({\n name: z.string(),\n version: z.string(),\n dir: z.string(),\n installSource: z.string().optional()\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 isSystem: z.boolean()\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});\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});\nconst AutoUpdateSettingsSchema = z.object({\n channel: ChannelSchema,\n intervalSeconds: z.number()\n});\nconst AddonAutoUpdateSchema = ChannelWithInheritSchema;\nconst RestartAddonResultSchema = z.unknown();\nconst InstallPackageResultSchema = z.unknown();\nconst ReloadPackagesResultSchema = z.unknown();\nconst UpdateFrameworkPackageResultSchema = z.object({\n packageName: z.string(),\n fromVersion: z.string(),\n toVersion: z.string(),\n /** Ms-epoch the server scheduled its self-restart. */\n restartingAt: z.number()\n});\nconst BulkUpdateItemStatusSchema = z.enum([\n \"queued\",\n \"updating\",\n \"done\",\n \"done-pending-restart\",\n \"failed\"\n]);\nconst BulkUpdateItemSchema = z.object({\n name: z.string(),\n isSystem: z.boolean(),\n fromVersion: z.string(),\n toVersion: z.string(),\n status: BulkUpdateItemStatusSchema,\n error: z.string().optional(),\n startedAtMs: z.number().optional(),\n completedAtMs: z.number().optional()\n});\nconst BulkUpdatePhaseSchema = z.enum([\n \"regular\",\n \"system\",\n \"restarting\",\n \"finalizing\"\n]);\nconst BulkUpdateStateSchema = z.object({\n id: z.string(),\n nodeId: z.string(),\n startedAtMs: z.number(),\n completedAtMs: z.number().optional(),\n total: z.number(),\n completed: z.number(),\n failed: z.number(),\n current: z.string().nullable(),\n phase: BulkUpdatePhaseSchema,\n cancelled: z.boolean(),\n items: z.array(BulkUpdateItemSchema).readonly()\n});\nconst FrameworkPackageStatusSchema = z.object({\n packageName: z.string(),\n currentVersion: z.string(),\n latestVersion: z.string().nullable(),\n hasUpdate: z.boolean(),\n /** Optional manifest description for the row tooltip. */\n description: z.string().optional()\n});\nconst LogStreamEntrySchema = z.object({\n timestamp: z.string(),\n level: z.string(),\n message: z.string(),\n scope: z.string().optional()\n});\nconst LogQueryEntrySchema = z.unknown();\nconst CustomActionInputSchema = z.object({\n addonId: z.string().min(1),\n action: z.string().min(1),\n input: z.unknown()\n});\nconst addonsCapability = {\n name: \"addons\",\n scope: \"system\",\n mode: \"singleton\",\n nodeIdMode: \"data\",\n methods: {\n // ── Listing ──────────────────────────────────────────────────────\n list: method(z.void(), z.array(AddonListItemSchema).readonly()),\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 // ── 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\",\n 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 /**\n * Available package updates for a node. `nodeId` omitted (or\n * `'hub'`) checks the hub's own installed packages; an agent\n * `nodeId` checks that agent's installed roster against npm\n * (the hub does the npm lookups + diff — agents stay npm-free).\n */\n listUpdates: method(\n z.object({ nodeId: z.string().optional() }),\n z.array(PackageUpdateSchema).readonly(),\n { auth: \"admin\" }\n ),\n /**\n * Update one package on a node. `nodeId` omitted (or `'hub'`)\n * installs on the hub via npm; an agent `nodeId` makes the hub\n * pack the resolved version and push the tarball to that agent\n * (`$agent.deploy` + `$agent.reload`) — agents need no npm runtime.\n */\n updatePackage: method(\n z.object({\n name: z.string().min(1),\n version: z.string().optional(),\n nodeId: z.string().optional()\n }),\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 /** Re-check updates for a node, bypassing any cache. `nodeId`\n * omitted (or `'hub'`) refreshes the hub; an agent `nodeId`\n * re-checks that agent's roster. */\n forceRefresh: method(\n z.object({ nodeId: z.string().optional() }),\n z.unknown(),\n { kind: \"mutation\", auth: \"admin\" }\n ),\n restartServer: method(\n z.object({ confirm: z.literal(true) }),\n z.unknown(),\n { kind: \"mutation\", auth: \"admin\" }\n ),\n /**\n * Most-recent restart marker (kind / packageName / from→to versions\n * / requestedBy / requestedAt). Returns `null` when this process\n * didn't boot from a tracked restart, or when the\n * post-boot retention window (5 min) has elapsed.\n *\n * Drives the admin-UI reconnect overlay's success toast — the\n * `system.restart-completed` event itself is fired before the\n * client has time to re-subscribe, so the client queries this on\n * first reconnect instead.\n */\n getLastRestart: method(\n z.void(),\n z.object({\n kind: z.enum([\"framework-update\", \"manual\", \"system\", \"framework-bulk-update\"]),\n packageName: z.string().optional(),\n fromVersion: z.string().optional(),\n toVersion: z.string().optional(),\n requestedBy: z.string().optional(),\n requestedAt: z.number()\n }).nullable(),\n { auth: \"admin\" }\n ),\n /**\n * Snapshot of the framework packages installed under the hub's\n * `<appRoot>/node_modules/`. Each row carries the currently\n * installed version and (best-effort) the latest version\n * available on npm. Drives the admin-UI \"System packages\" panel.\n *\n * Spec: docs/superpowers/specs/2026-05-14-framework-live-update-design.md\n */\n listFrameworkPackages: method(\n z.void(),\n z.array(FrameworkPackageStatusSchema).readonly(),\n { auth: \"admin\" }\n ),\n /**\n * Cluster-wide capability-provider discovery. Returns the list of\n * `{ addonId, mode, isActive }` tuples for whatever addon(s)\n * currently provide the requested capability across the cluster.\n *\n * Why this lives on `addons` (and not on a `capabilities` cap of\n * its own): the hub's main-process `CapabilityRegistry` already\n * aggregates registrations from every forked group-runner and\n * remote agent via Moleculer event propagation — there's no\n * cross-process registry mirror to build, just an introspection\n * shim.\n *\n * Use this from addon code when you need to know whether another\n * addon has registered a specific cap (e.g. `tailscale-ingress`\n * checking `tailscale-client` is up before calling `tailscale\n * serve`). Don't reach for `ctx.capabilities.getCollectionEntries`\n * — that reads the LOCAL registry of the calling addon's group\n * runner and never sees providers in other processes. See\n * `CLAUDE.md` → Critical rules → ctx.api vs ctx.capabilities.\n */\n listCapabilityProviders: method(\n z.object({ capName: z.string().min(1) }),\n z.array(z.object({\n addonId: z.string(),\n mode: z.enum([\"singleton\", \"collection\"]),\n isActive: z.boolean()\n })).readonly()\n ),\n /**\n * Toggle a single collection-cap provider on/off. Generic write-side\n * counterpart of `listCapabilityProviders` — drives the per-provider\n * Enable/Disable affordance in admin pages (TURN servers, etc.)\n * without needing a bespoke orchestrator cap.\n *\n * Reaches the hub's `CapabilityRegistry` directly:\n * `enableCollectionProvider` / `disableCollectionProvider` flip the\n * registry-level `disabledProviders` set. `getCollectionEntries`\n * already filters disabled providers out, so a disabled provider\n * drops out of every collection aggregate immediately. Only valid\n * for `mode: 'collection'` caps — the registry no-ops + warns for\n * singletons.\n */\n setCapabilityProviderEnabled: method(\n z.object({\n capName: z.string().min(1),\n addonId: z.string().min(1),\n enabled: z.boolean()\n }),\n z.object({ success: z.literal(true) }),\n { kind: \"mutation\", auth: \"admin\" }\n ),\n /**\n * Live-update one of the framework packages marked\n * `camstack.system: true` (`@camstack/types|kernel|core|sdk|ui-library`).\n * Runs `npm install --prefix <appRoot> <name>@<version> --no-save`,\n * writes a `.restart-pending` marker, emits `system.restarting`\n * and schedules a graceful process exit. The supervisor (Docker /\n * Electron / systemd) brings the hub back up; on first boot after\n * the restart the marker fires `system.restart-completed`.\n *\n * `version` defaults to `'latest'`. The allow-list of valid\n * `packageName` values is enforced server-side.\n *\n * Spec: docs/superpowers/specs/2026-05-14-framework-live-update-design.md\n */\n updateFrameworkPackage: method(\n z.object({\n packageName: z.string().min(1),\n version: z.string().optional(),\n deferRestart: z.boolean().optional()\n }),\n UpdateFrameworkPackageResultSchema,\n { kind: \"mutation\", auth: \"admin\" }\n ),\n /**\n * Kicks off a server-side bulk update operation and returns the bulk\n * id immediately. The operation runs asynchronously; observe progress\n * via the `AddonsBulkUpdateProgress` event or `getBulkUpdateState`.\n * Items with `isSystem: true` use `deferRestart` — the hub restarts\n * ONCE at the end of the system phase, after all system packages are\n * installed.\n *\n * `items[].version` is REQUIRED — callers must pass the resolved\n * version from `listUpdates`. There is no `'latest'` default here\n * (unlike `updatePackage`) to guarantee deterministic bulk rolls.\n */\n startBulkUpdate: method(\n z.object({\n nodeId: z.string(),\n items: z.array(z.object({\n name: z.string(),\n version: z.string(),\n isSystem: z.boolean()\n })).readonly()\n }),\n z.object({ id: z.string() }),\n { kind: \"mutation\", auth: \"admin\" }\n ),\n /**\n * Returns the current state of a bulk update by id.\n * Returns `null` if the id is unknown or has been auto-cleaned\n * (5 minutes after `completedAt` the record is evicted from memory).\n */\n getBulkUpdateState: method(\n z.object({ id: z.string() }),\n BulkUpdateStateSchema.nullable(),\n { auth: \"admin\" }\n ),\n /**\n * Cancels an in-flight bulk update. The update loop exits after the\n * currently-processing item completes — cancellation is not\n * instantaneous. Has no effect once the `restarting` phase has been\n * entered (the hub is already shutting down at that point).\n * Returns `{ cancelled: false }` if the id is unknown, the operation\n * has already completed, or the `restarting` phase is active.\n */\n cancelBulkUpdate: method(\n z.object({ id: z.string() }),\n z.object({ cancelled: z.boolean() }),\n { kind: \"mutation\", auth: \"admin\" }\n ),\n /**\n * Lists all currently active (non-completed) bulk updates.\n * If `nodeId` is provided, filters to only bulk updates targeting\n * that node. Useful for restoring an in-progress banner on a fresh\n * page load when the UI reconnects mid-operation.\n */\n listActiveBulkUpdates: method(\n z.object({ nodeId: z.string().optional() }),\n z.array(BulkUpdateStateSchema).readonly(),\n { 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 * 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 // ── 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 // ── 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 // ── 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};\nconst PIPELINE_FLOW_CAPABILITY_NAMES = [\n \"decoder\",\n \"motion-detection\",\n \"pipeline-executor\",\n \"audio-analyzer\",\n \"pipeline-analytics\",\n \"notification-output\"\n];\nconst PIPELINE_OWNER_CAPABILITY_NAMES = [\n ...PIPELINE_FLOW_CAPABILITY_NAMES,\n \"pipeline-orchestrator\",\n \"pipeline-runner\"\n];\nexport {\n metricsProviderCapability as $,\n addonSettingsCapability as A,\n addonWidgetsCapability as B,\n addonWidgetsSourceCapability as C,\n addonsCapability as D,\n adminUiCapability as E,\n advancedNotifierCapability as F,\n alertsCapability as G,\n audioAnalysisCapability as H,\n audioAnalyzerCapability as I,\n audioCodecCapability as J,\n authProviderCapability as K,\n backupCapability as L,\n cameraCredentialsCapability as M,\n cameraPipelineConfigCapability as N,\n decoderCapability as O,\n detectionPipelineCapability as P,\n deviceExportCapability as Q,\n deviceManagerCapability as R,\n deviceOpsCapability as S,\n deviceStateCapability as T,\n embeddingEncoderCapability as U,\n eventsCapability as V,\n integrationsCapability as W,\n intercomCapability as X,\n localNetworkCapability as Y,\n logDestinationCapability as Z,\n meshNetworkCapability as _,\n zoneRulesCapability as a,\n AudioEncodeSessionConfigSchema as a$,\n motionDetectionCapability as a0,\n mqttBrokerCapability as a1,\n networkAccessCapability as a2,\n networkQualityCapability as a3,\n nodesCapability as a4,\n notificationOutputCapability as a5,\n oauthIntegrationCapability as a6,\n osdCapability as a7,\n pipelineAnalyticsCapability as a8,\n pipelineExecutorCapability as a9,\n APPLE_SA_TO_MACRO as aA,\n AUDIO_BACKEND_CHOICES as aB,\n AUDIO_MACRO_LABELS as aC,\n AccessoriesStatusSchema as aD,\n AccessoryKind as aE,\n AddBrokerInputSchema as aF,\n AddonAutoUpdateSchema as aG,\n AddonListItemSchema as aH,\n AddonPageDeclarationSchema as aI,\n AddonPageInfoSchema as aJ,\n AgentLoadSummarySchema as aK,\n AlertSchema as aL,\n AlertSeveritySchema as aM,\n AlertSourceSchema as aN,\n AlertStatusSchema as aO,\n ApiKeyRecordSchema as aP,\n ApiKeySummarySchema as aQ,\n ArchiveEntrySchema as aR,\n ArchiveManifestSchema as aS,\n AudioAnalysisResultSchema as aT,\n AudioAnalysisSettingsSchema as aU,\n AudioChunkInputSchema as aV,\n AudioClassSummarySchema as aW,\n AudioClassificationLabelSchema as aX,\n AudioClassificationResultSchema as aY,\n AudioCodecInfoSchema as aZ,\n AudioDecodeSessionConfigSchema as a_,\n pipelineOrchestratorCapability as aa,\n pipelineRunnerCapability as ab,\n platformProbeCapability as ac,\n ptzCapability as ad,\n rebootCapability as ae,\n recordingCapability as af,\n recordingEngineCapability as ag,\n restreamerCapability as ah,\n settingsStoreCapability as ai,\n smtpProviderCapability as aj,\n snapshotCapability as ak,\n snapshotProviderCapability as al,\n ssoBridgeCapability as am,\n storageCapability as an,\n storageProviderCapability as ao,\n streamBrokerCapability as ap,\n streamCatalogCapability as aq,\n streamingEngineCapability as ar,\n systemCapability as as,\n toastCapability as at,\n turnProviderCapability as au,\n userManagementCapability as av,\n userPasskeysCapability as aw,\n webrtcCapability as ax,\n webrtcSessionCapability as ay,\n ACCESSORY_LABEL as az,\n zoneAnalyticsCapability as b,\n DetectorOutputSchema as b$,\n AudioEncodedChunkSchema as b0,\n AudioEventSchema as b1,\n AudioLevelSchema as b2,\n AudioMetricsHistoryPointSchema as b3,\n AudioMetricsHistorySchema as b4,\n AudioMetricsSnapshotSchema as b5,\n AudioPcmChunkSchema as b6,\n AuthResultSchema as b7,\n AutoUpdateSettingsSchema as b8,\n AvailableIntegrationTypeSchema as b9,\n ChargingStatus as bA,\n ClientNetworkStatsSchema as bB,\n ClusterAddonNodeDeploymentSchema as bC,\n ClusterAddonStatusEntrySchema as bD,\n CollectionColumnSchema as bE,\n CollectionIndexSchema as bF,\n ConfigEntrySchema$1 as bG,\n ConfigSectionWithValuesSchema as bH,\n ConfigTabDeclarationSchema as bI,\n CreateApiKeyInputSchema as bJ,\n CreateApiKeyResultSchema as bK,\n CreateIntegrationInputSchema as bL,\n CreateScopedTokenInputSchema as bM,\n CreateScopedTokenResultSchema as bN,\n CreateUserInputSchema as bO,\n CustomActionInputSchema as bP,\n DEFAULT_AUDIO_ANALYZER_CONFIG as bQ,\n DEFAULT_DECODER_HWACCEL_CONFIG as bR,\n DEVICE_PROFILES as bS,\n DEVICE_SETTINGS_CONTRIBUTION_METHODS as bT,\n DEVICE_STATUS_METHOD as bU,\n DecodedAudioChunkSchema as bV,\n DecodedFrameSchema as bW,\n DecoderAssignmentSchema as bX,\n DecoderSessionConfigSchema as bY,\n DecoderStatsSchema as bZ,\n DeleteIntegrationResultSchema as b_,\n BATTERY_DEVICE_PROFILE as ba,\n BackupDestinationInfoSchema as bb,\n BackupEntrySchema as bc,\n BatteryStatusSchema as bd,\n BoundingBoxSchema as be,\n BrightnessStatusSchema as bf,\n BrokerAudioClientSchema as bg,\n BrokerClientsSchema as bh,\n BrokerConnectionDetailsSchema as bi,\n BrokerDecodedClientSchema as bj,\n BrokerInfoSchema as bk,\n BrokerRtspClientSchema as bl,\n BrokerStatsSchema as bm,\n BrokerStatusSchema$1 as bn,\n CAM_PROFILE_ORDER as bo,\n CamProfileSchema as bp,\n CamStreamDescriptorSchema as bq,\n CamStreamKindSchema as br,\n CamStreamResolutionSchema as bs,\n CameraCredentialsSchema as bt,\n CameraCredentialsStatusSchema as bu,\n CameraMetricsSchema as bv,\n CameraMetricsWithDeviceIdSchema as bw,\n CameraStreamSchema as bx,\n CapScopeSchema as by,\n CapabilityBindingsSchema as bz,\n streamParamsCapability as c,\n MotionSourceEnum as c$,\n DeviceDiscoveryStatusSchema as c0,\n ExposeInputSchema as c1,\n DeviceExportStatusSchema as c2,\n UnexposeInputSchema as c3,\n DeviceFeature as c4,\n DeviceInfoSchema as c5,\n DeviceNetworkStatsSchema as c6,\n DeviceRole as c7,\n DeviceStatusSchema as c8,\n DeviceType as c9,\n InstalledPackageSchema as cA,\n IntegrationLiteSchema as cB,\n IntegrationWithStateSchema as cC,\n IntercomAbilitySchema as cD,\n IntercomStatusSchema as cE,\n LocationStatSchema as cF,\n LogEntrySchema as cG,\n LogLevelSchema$1 as cH,\n LogStreamEntrySchema as cI,\n MODEL_FORMATS as cJ,\n MaskGridDimsSchema as cK,\n MaskGridShapeSchema as cL,\n MaskLineShapeSchema as cM,\n MaskPointSchema as cN,\n MaskPolygonShapeSchema as cO,\n MaskPolygonVerticesSchema as cP,\n MaskRectShapeSchema as cQ,\n MaskShapeKindSchema as cR,\n MaskShapeSchema as cS,\n MediaFileSchema as cT,\n MeshPeerSchema as cU,\n MeshStatusSchema as cV,\n MethodAccessSchema as cW,\n MotionAnalysisResultSchema as cX,\n MotionEventSchema as cY,\n MotionOnMotionChangedDataSchema as cZ,\n MotionRegionSchema as c_,\n DiscoveredChildDeviceSchema as ca,\n DiscoveredChildStatusSchema as cb,\n DiscoveredDeviceSchema as cc,\n DoorbellPressEventSchema as cd,\n DoorbellStatusSchema as ce,\n EmbeddingInfoSchema as cf,\n EmbeddingResultSchema as cg,\n EncodedPacketSchema as ch,\n EnrichedWidgetMetadataSchema as ci,\n EventItemSchema as cj,\n EventKindSchema as ck,\n ExportSetupFieldSchema as cl,\n ExportSetupSchema as cm,\n ExposedDeviceSchema as cn,\n ExposedResourceSchema as co,\n FeatureManifestSchema as cp,\n FeatureProbeStatusSchema as cq,\n FrameHandleFormatSchema as cr,\n FrameHandleSchema as cs,\n FrameInputSchema as ct,\n GetStreamWithCodecInputSchema as cu,\n GlobalMetricsSchema as cv,\n HWACCEL_OPTIONS as cw,\n HealthStatusSchema as cx,\n HistoryPointSchema as cy,\n HistoryResolutionEnum as cz,\n privacyMaskCapability as d,\n RunnerCameraConfigSchema as d$,\n MotionSourcesSchema as d0,\n MotionStatusSchema as d1,\n MotionTriggerRuntimeStateSchema as d2,\n MotionTriggerStatusSchema as d3,\n MotionZoneOptionsSchema as d4,\n MotionZonePatchSchema as d5,\n MotionZoneRegionSchema as d6,\n MotionZoneStatusSchema as d7,\n StatusSchema as d8,\n NativeDetectionSchema as d9,\n PipelineDefaultStepSchema as dA,\n PipelineEngineChoiceSchema as dB,\n PipelineRunResultBridge as dC,\n PipelineStepInputSchema as dD,\n PlaceholderReasonSchema as dE,\n PolygonPointSchema as dF,\n PrivacyMaskOptionsSchema as dG,\n PrivacyMaskPatchSchema as dH,\n PrivacyMaskRegionSchema as dI,\n PrivacyMaskShapeSchema as dJ,\n PrivacyMaskStatusSchema as dK,\n ProfileSlotSchema as dL,\n ProfileSlotStatusSchema as dM,\n ProviderStatusSchema as dN,\n PtzAutotrackRuntimeStateSchema as dO,\n PtzAutotrackSettingsSchema as dP,\n PtzAutotrackStatusSchema as dQ,\n PtzAutotrackTargetOptionSchema as dR,\n PtzMoveCommandSchema as dS,\n PtzPositionSchema as dT,\n PtzPresetSchema as dU,\n PtzStatusSchema as dV,\n QueryFilterSchema as dW,\n RegisteredStreamSchema as dX,\n ReportMotionInputSchema as dY,\n RtpSourceSchema as dZ,\n RtspRestreamEntrySchema as d_,\n NativeObjectClassEnum as da,\n NativeObjectDetectionRuntimeStateSchema as db,\n NativeObjectDetectionStatusSchema as dc,\n NetworkAccessStatusSchema as dd,\n NetworkAddressSchema as de,\n NetworkEndpointSchema as df,\n NotificationHistoryEntrySchema as dg,\n NotificationRuleSchema as dh,\n NotificationSchema as di,\n OauthIntegrationDescriptorSchema as dj,\n ObjectEventSchema as dk,\n OrchestratorMetricsSchema as dl,\n OsdOverlayKindEnum as dm,\n OsdOverlayPatchSchema as dn,\n OsdOverlaySchema as dp,\n OsdPositionEnum as dq,\n OsdStatusSchema as dr,\n PIPELINE_FLOW_CAPABILITY_NAMES as ds,\n PIPELINE_OWNER_CAPABILITY_NAMES as dt,\n PackageUpdateSchema as du,\n PackageVersionInfoSchema as dv,\n PasskeySummarySchema as dw,\n PcmSampleFormatSchema as dx,\n PerScopeBreakdownSchema as dy,\n PipelineAssignmentSchema as dz,\n errMsg as e,\n UserRecordSchema as e$,\n RunnerCameraDeviceUIFields as e0,\n RunnerLocalLoadSchema as e1,\n RunnerLocalMetricsSchema as e2,\n STORAGE_LOCATION_CARDINALITY as e3,\n ScopedTokenSchema as e4,\n ScopedTokenSummarySchema as e5,\n SearchResultSchema as e6,\n SegmentSchema as e7,\n SendEmailInputSchema as e8,\n SendEmailResultSchema as e9,\n StreamNetworkStatsSchema as eA,\n StreamParamsOptionsSchema as eB,\n StreamParamsStatusSchema as eC,\n StreamProfileConfigSchema as eD,\n StreamProfileOptionsSchema as eE,\n StreamProfilePatchSchema as eF,\n StreamProfileSchema as eG,\n StreamSourceEntrySchema$1 as eH,\n StreamSourceSchema as eI,\n SubscribeAudioChunksInputSchema as eJ,\n SubscribeAudioChunksResultSchema as eK,\n SubscribeFramesInputSchema as eL,\n SubscribeFramesResultSchema as eM,\n SwitchStatusSchema as eN,\n SystemMetricsSchema as eO,\n TestConnectionResultSchema as eP,\n ToastSchema as eQ,\n TokenScopeSchema as eR,\n TopologyNodeSchema as eS,\n TopologyProcessSchema as eT,\n TopologyServiceSchema as eU,\n TrackSchema as eV,\n TrackStateSchema as eW,\n TrackedDetectionSchema as eX,\n TurnServerSchema as eY,\n UpdateIntegrationInputSchema as eZ,\n UpdateUserInputSchema as e_,\n SettingsPatchSchema as ea,\n SettingsRecordSchema as eb,\n SettingsSchemaWithValuesSchema as ec,\n SettingsUpdateResultSchema as ed,\n ShmRingStatsSchema as ee,\n SmtpStatusSchema as ef,\n SnapshotImageSchema as eg,\n SpatialDetectionSchema as eh,\n SsoBridgeClaimsSchema as ei,\n StartEmbeddedInputSchema as ej,\n AbortUploadInputSchema as ek,\n BeginDownloadInputSchema as el,\n BeginDownloadResultSchema as em,\n BeginUploadInputSchema as en,\n BeginUploadResultSchema as eo,\n EndDownloadInputSchema as ep,\n FinalizeUploadInputSchema as eq,\n StorageLocationRefSchema as er,\n StorageLocationSchema as es,\n StorageLocationTypeSchema as et,\n ProviderInfoSchema as eu,\n ReadChunkInputSchema as ev,\n TestLocationResultSchema as ew,\n WriteChunkInputSchema as ex,\n StreamFormatSchema as ey,\n StreamInfoSchema as ez,\n motionTriggerCapability as f,\n UserSummarySchema as f0,\n WELL_KNOWN_TABS as f1,\n WELL_KNOWN_TAB_MAP as f2,\n WebrtcStreamChoiceSchema as f3,\n WebrtcStreamTargetSchema as f4,\n WidgetHostEnum as f5,\n WidgetMetadataSchema as f6,\n WidgetRemoteSchema as f7,\n WidgetSizeEnum as f8,\n YAMNET_TO_MACRO as f9,\n ZoneKindEnum as fa,\n ZoneRuleModeEnum as fb,\n ZoneRuleSchema as fc,\n ZoneRuleStageEnum as fd,\n ZoneRulesArraySchema as fe,\n ZoneSchema as ff,\n ZoneScopeBreakdownSchema as fg,\n accessoryStableId as fh,\n deviceMatchesProfile as fi,\n event as fj,\n expandCapMethods as fk,\n getAudioMacroClassIds as fl,\n isDeviceConfigCap as fm,\n mapAudioLabelToMacro as fn,\n method as fo,\n resolveDeviceProfile as fp,\n webrtcClientHintsSchema as fq,\n wiringAddonHealthSchema as fr,\n wiringHealthSnapshotSchema as fs,\n wiringNodeHealthSchema as ft,\n wiringProbeKindSchema as fu,\n wiringProbeResultSchema as fv,\n motionCapability as g,\n hydrateSchema as h,\n featureProbeCapability as i,\n doorbellCapability as j,\n deviceStatusCapability as k,\n deviceDiscoveryCapability as l,\n motionZonesCapability as m,\n nativeObjectDetectionCapability as n,\n cameraStreamsCapability as o,\n ptzAutotrackCapability as p,\n brightnessCapability as q,\n batteryCapability as r,\n switchCapability as s,\n audioMetricsCapability as t,\n deviceProviderCapability as u,\n accessoriesCapability as v,\n addonPagesCapability as w,\n addonPagesSourceCapability as x,\n addonRoutesCapability as y,\n zonesCapability as z\n};\n//# sourceMappingURL=index-C2zzIDdX.mjs.map\n","import { h as hydrateSchema, e as errMsg, z as zonesCapability, a as zoneRulesCapability, b as zoneAnalyticsCapability, s as switchCapability, c as streamParamsCapability, p as ptzAutotrackCapability, d as privacyMaskCapability, n as nativeObjectDetectionCapability, m as motionZonesCapability, f as motionTriggerCapability, g as motionCapability, i as featureProbeCapability, j as doorbellCapability, k as deviceStatusCapability, l as deviceDiscoveryCapability, o as cameraStreamsCapability, q as brightnessCapability, r as batteryCapability, t as audioMetricsCapability, u as deviceProviderCapability, v as accessoriesCapability, w as addonPagesCapability, x as addonPagesSourceCapability, y as addonRoutesCapability, A as addonSettingsCapability, B as addonWidgetsCapability, C as addonWidgetsSourceCapability, D as addonsCapability, E as adminUiCapability, F as advancedNotifierCapability, G as alertsCapability, H as audioAnalysisCapability, I as audioAnalyzerCapability, J as audioCodecCapability, K as authProviderCapability, L as backupCapability, M as cameraCredentialsCapability, N as cameraPipelineConfigCapability, O as decoderCapability, P as detectionPipelineCapability, Q as deviceExportCapability, R as deviceManagerCapability, S as deviceOpsCapability, T as deviceStateCapability, U as embeddingEncoderCapability, V as eventsCapability, W as integrationsCapability, X as intercomCapability, Y as localNetworkCapability, Z as logDestinationCapability, _ as meshNetworkCapability, $ as metricsProviderCapability, a0 as motionDetectionCapability, a1 as mqttBrokerCapability, a2 as networkAccessCapability, a3 as networkQualityCapability, a4 as nodesCapability, a5 as notificationOutputCapability, a6 as oauthIntegrationCapability, a7 as osdCapability, a8 as pipelineAnalyticsCapability, a9 as pipelineExecutorCapability, aa as pipelineOrchestratorCapability, ab as pipelineRunnerCapability, ac as platformProbeCapability, ad as ptzCapability, ae as rebootCapability, af as recordingCapability, ag as recordingEngineCapability, ah as restreamerCapability, ai as settingsStoreCapability, aj as smtpProviderCapability, ak as snapshotCapability, al as snapshotProviderCapability, am as ssoBridgeCapability, an as storageCapability, ao as storageProviderCapability, ap as streamBrokerCapability, aq as streamCatalogCapability, ar as streamingEngineCapability, as as systemCapability, at as toastCapability, au as turnProviderCapability, av as userManagementCapability, aw as userPasskeysCapability, ax as webrtcCapability, ay as webrtcSessionCapability } from \"./index-C2zzIDdX.mjs\";\nimport { az, aA, aB, aC, aD, aE, aF, aG, aH, aI, aJ, aK, aL, aM, aN, aO, aP, aQ, aR, aS, aT, aU, aV, aW, aX, aY, aZ, a_, a$, b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf, bg, bh, bi, bj, bk, bl, bm, bn, bo, bp, bq, br, bs, bt, bu, bv, bw, bx, by, bz, bA, bB, bC, bD, bE, bF, bG, bH, bI, bJ, bK, bL, bM, bN, bO, bP, bQ, bR, bS, bT, bU, bV, bW, bX, bY, bZ, b_, b$, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf, cg, ch, ci, cj, ck, cl, cm, cn, co, cp, cq, cr, cs, ct, cu, cv, cw, cx, cy, cz, cA, cB, cC, cD, cE, cF, cG, cH, cI, cJ, cK, cL, cM, cN, cO, cP, cQ, cR, cS, cT, cU, cV, cW, cX, cY, cZ, c_, c$, d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, da, db, dc, dd, de, df, dg, dh, di, dj, dk, dl, dm, dn, dp, dq, dr, ds, dt, du, dv, dw, dx, dy, dz, dA, dB, dC, dD, dE, dF, dG, dH, dI, dJ, dK, dL, dM, dN, dO, dP, dQ, dR, dS, dT, dU, dV, dW, dX, dY, dZ, d_, d$, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef, eg, eh, ei, ej, ek, el, em, en, eo, ep, eq, er, es, et, eu, ev, ew, ex, ey, ez, eA, eB, eC, eD, eE, eF, eG, eH, eI, eJ, eK, eL, eM, eN, eO, eP, eQ, eR, eS, eT, eU, eV, eW, eX, eY, eZ, e_, e$, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, fa, fb, fc, fd, fe, ff, fg, fh, fi, fj, fk, fl, fm, fn, fo, fp, fq, fr, fs, ft, fu, fv } from \"./index-C2zzIDdX.mjs\";\nimport { z } from \"zod\";\nclass DisposerChain {\n disposers = [];\n disposed = false;\n onError;\n constructor(opts = {}) {\n this.onError = opts.onError ?? ((err, index) => {\n console.error(`[DisposerChain] disposer #${index} threw`, err);\n });\n }\n /**\n * Register a teardown callback. Returns an unregister function so\n * callers can drop a single disposer without disposing the whole\n * chain.\n *\n * If the chain has already been disposed, the callback runs immediately\n * (sync) — this matches the “register-after-shutdown” edge case where\n * an addon's late initialization races with kernel restart.\n */\n add(fn2) {\n if (this.disposed) {\n try {\n const result = fn2();\n if (result && typeof result.then === \"function\") {\n ;\n result.catch((err) => this.onError(err, -1));\n }\n } catch (err) {\n this.onError(err, -1);\n }\n return () => void 0;\n }\n this.disposers.push(fn2);\n return () => {\n const idx = this.disposers.indexOf(fn2);\n if (idx >= 0) this.disposers.splice(idx, 1);\n };\n }\n /** True after `dispose()` has been called at least once. */\n get isDisposed() {\n return this.disposed;\n }\n /** Number of disposers currently registered. */\n get size() {\n return this.disposers.length;\n }\n /**\n * Run every registered disposer in LIFO order. Idempotent: subsequent\n * calls do nothing. Awaits async disposers so callers can sequence\n * shutdown → restart correctly.\n */\n async dispose() {\n if (this.disposed) return;\n this.disposed = true;\n const drain = this.disposers.slice().reverse();\n this.disposers = [];\n for (let i = 0; i < drain.length; i++) {\n const fn2 = drain[i];\n try {\n const result = fn2();\n if (result && typeof result.then === \"function\") {\n await result;\n }\n } catch (err) {\n this.onError(err, drain.length - 1 - i);\n }\n }\n }\n}\nconst DEFAULT_ADDON_PLACEMENT = \"hub-only\";\nfunction resolveAddonExecution(decl) {\n return {\n placement: decl.execution?.placement ?? DEFAULT_ADDON_PLACEMENT,\n group: decl.execution?.group\n };\n}\nfunction isDeployableToAgent(decl) {\n const placement = resolveAddonExecution(decl).placement;\n return placement === \"any-node\" || placement === \"agent-only\";\n}\nfunction isAgentOnlyPlacement(decl) {\n return resolveAddonExecution(decl).placement === \"agent-only\";\n}\nfunction resolveAddonGroup(decl) {\n return resolveAddonExecution(decl).group;\n}\nfunction resolveRunnerId(decl, addonId) {\n return decl.execution?.group ?? addonId;\n}\nfunction resolveAddonPlacement(decl) {\n return resolveAddonExecution(decl).placement;\n}\nvar EventCategory = /* @__PURE__ */ ((EventCategory2) => {\n EventCategory2[\"SystemBoot\"] = \"system.boot\";\n EventCategory2[\"SystemAddonsReady\"] = \"system.addons-ready\";\n EventCategory2[\"SystemRestarting\"] = \"system.restarting\";\n EventCategory2[\"SystemRestartCompleted\"] = \"system.restart-completed\";\n EventCategory2[\"SystemReadyState\"] = \"system.ready-state\";\n EventCategory2[\"AddonStarted\"] = \"addon.started\";\n EventCategory2[\"AddonStopped\"] = \"addon.stopped\";\n EventCategory2[\"AddonRestarted\"] = \"addon.restarted\";\n EventCategory2[\"AddonUpdated\"] = \"addon.updated\";\n EventCategory2[\"AddonInstalled\"] = \"addon.installed\";\n EventCategory2[\"AddonUninstalled\"] = \"addon.uninstalled\";\n EventCategory2[\"AddonCrashed\"] = \"addon.crashed\";\n EventCategory2[\"AddonError\"] = \"addon.error\";\n EventCategory2[\"AddonPageReady\"] = \"addon.page-ready\";\n EventCategory2[\"AddonWidgetReady\"] = \"addon.widget-ready\";\n EventCategory2[\"AddonLoadFailed\"] = \"addon.load-failed\";\n EventCategory2[\"AddonLoadRecovered\"] = \"addon.load-recovered\";\n EventCategory2[\"AddonRetryScheduled\"] = \"addon.retry-scheduled\";\n EventCategory2[\"AddonRetryAttempting\"] = \"addon.retry-attempting\";\n EventCategory2[\"DeviceRegistered\"] = \"device.registered\";\n EventCategory2[\"DeviceUnregistered\"] = \"device.unregistered\";\n EventCategory2[\"DeviceEnabled\"] = \"device.enabled\";\n EventCategory2[\"DeviceDisabled\"] = \"device.disabled\";\n EventCategory2[\"DeviceSettingsUpdated\"] = \"device.settings-updated\";\n EventCategory2[\"DeviceBindingsChanged\"] = \"device.bindings-changed\";\n EventCategory2[\"DeviceMetaChanged\"] = \"device.meta-changed\";\n EventCategory2[\"DeviceStreamsRegistered\"] = \"device.streams-registered\";\n EventCategory2[\"IntegrationEnabled\"] = \"integration.enabled\";\n EventCategory2[\"IntegrationDisabled\"] = \"integration.disabled\";\n EventCategory2[\"IntegrationDeleted\"] = \"integration.deleted\";\n EventCategory2[\"ProviderStarted\"] = \"provider.started\";\n EventCategory2[\"ProviderStopped\"] = \"provider.stopped\";\n EventCategory2[\"ProcessCrashed\"] = \"process.crashed\";\n EventCategory2[\"ProcessRestartScheduled\"] = \"process.restart_scheduled\";\n EventCategory2[\"ProcessRestarted\"] = \"process.restarted\";\n EventCategory2[\"RecordingStarted\"] = \"recording.started\";\n EventCategory2[\"RecordingStopped\"] = \"recording.stopped\";\n EventCategory2[\"RecordingError\"] = \"recording.error\";\n EventCategory2[\"RecordingHealthDegraded\"] = \"recording.health.degraded\";\n EventCategory2[\"RecordingStorageCritical\"] = \"recording.storage.critical\";\n EventCategory2[\"RecordingSegmentWritten\"] = \"recording.segment.written\";\n EventCategory2[\"RecordingPolicyFallback\"] = \"recording.policy.fallback\";\n EventCategory2[\"RecordingRetentionCompleted\"] = \"recording.retention.completed\";\n EventCategory2[\"DetectionEvent\"] = \"detection.event\";\n EventCategory2[\"SessionTrackNew\"] = \"session.track.new\";\n EventCategory2[\"SessionTrackExpired\"] = \"session.track.expired\";\n EventCategory2[\"BenchmarkProgress\"] = \"benchmark.progress\";\n EventCategory2[\"PlatformProbePhase\"] = \"platform-probe.phase\";\n EventCategory2[\"PipelineProgress\"] = \"pipeline.progress\";\n EventCategory2[\"PipelineTrace\"] = \"pipeline.trace\";\n EventCategory2[\"PipelineInferenceResult\"] = \"pipeline.inference-result\";\n EventCategory2[\"PipelineCameraAssigned\"] = \"pipeline.camera-assigned\";\n EventCategory2[\"PipelineCameraUnassigned\"] = \"pipeline.camera-unassigned\";\n EventCategory2[\"PipelineCameraUpdated\"] = \"pipeline.camera-updated\";\n EventCategory2[\"PipelineRunnerLoadSnapshot\"] = \"pipeline.runner-load-snapshot\";\n EventCategory2[\"PipelineCameraMetricsSnapshot\"] = \"pipeline.camera-metrics-snapshot\";\n EventCategory2[\"StreamBrokerMetricsSnapshot\"] = \"stream-broker.metrics-snapshot\";\n EventCategory2[\"StreamBrokerOnCamStreamDemand\"] = \"stream-broker.onCamStreamDemand\";\n EventCategory2[\"StreamBrokerOnCamStreamIdle\"] = \"stream-broker.onCamStreamIdle\";\n EventCategory2[\"StreamBrokerOnRequestStreamSourceRefresh\"] = \"stream-broker.onRequestStreamSourceRefresh\";\n EventCategory2[\"StreamParamsChanged\"] = \"stream-params.changed\";\n EventCategory2[\"DeviceStateChanged\"] = \"device.state-changed\";\n EventCategory2[\"BatteryOnStatusChanged\"] = \"battery.onStatusChanged\";\n EventCategory2[\"DoorbellOnPressed\"] = \"doorbell.onPressed\";\n EventCategory2[\"PipelineEngineMetricsSnapshot\"] = \"pipeline.engine-metrics-snapshot\";\n EventCategory2[\"ClusterTopologySnapshot\"] = \"cluster.topology-snapshot\";\n EventCategory2[\"MetricsNodeResourcesSnapshot\"] = \"metrics.node-resources-snapshot\";\n EventCategory2[\"MetricsNodeProcessesSnapshot\"] = \"metrics.node-processes-snapshot\";\n EventCategory2[\"CapabilityBindingChanged\"] = \"capability.binding-changed\";\n EventCategory2[\"ModelDownloadProgress\"] = \"model.download.progress\";\n EventCategory2[\"AgentRegistered\"] = \"agent.registered\";\n EventCategory2[\"AgentUnregistered\"] = \"agent.unregistered\";\n EventCategory2[\"AgentOnline\"] = \"agent.online\";\n EventCategory2[\"AgentOffline\"] = \"agent.offline\";\n EventCategory2[\"WorkerOnline\"] = \"worker.online\";\n EventCategory2[\"WorkerOffline\"] = \"worker.offline\";\n EventCategory2[\"AgentTaskDispatched\"] = \"agent.task.dispatched\";\n EventCategory2[\"AgentTaskAssigned\"] = \"agent.task.assigned\";\n EventCategory2[\"AgentTrpcConnected\"] = \"agent.trpc.connected\";\n EventCategory2[\"AgentWsConnected\"] = \"agent.ws.connected\";\n EventCategory2[\"AgentWsDisconnected\"] = \"agent.ws.disconnected\";\n EventCategory2[\"AgentBackupActivated\"] = \"agent.backup.activated\";\n EventCategory2[\"OrchestrationSettingsUpdated\"] = \"orchestration.settings-updated\";\n EventCategory2[\"PipelineAgentHwaccelChanged\"] = \"pipeline.agent-hwaccel-changed\";\n EventCategory2[\"MotionAnalysis\"] = \"detection.motion-analysis\";\n EventCategory2[\"MotionZonesRaw\"] = \"detection.motion-zones-raw\";\n EventCategory2[\"MotionOnMotionChanged\"] = \"motion.on-motion-changed\";\n EventCategory2[\"DetectionResult\"] = \"detection.result\";\n EventCategory2[\"DetectionRaw\"] = \"detection.raw\";\n EventCategory2[\"DetectionCameraNative\"] = \"detection.camera-native\";\n EventCategory2[\"PipelineAudioInferenceResult\"] = \"pipeline.audio-inference-result\";\n EventCategory2[\"DetectionPhaseTransition\"] = \"detection.phase-transition\";\n EventCategory2[\"ProviderMotion\"] = \"provider.motion\";\n EventCategory2[\"ProviderDetection\"] = \"provider.detection\";\n EventCategory2[\"EnrichmentEmbeddingStored\"] = \"enrichment.embedding.stored\";\n EventCategory2[\"EnrichmentSceneStateChanged\"] = \"enrichment.scene.state-changed\";\n EventCategory2[\"EnrichmentActivitySummary\"] = \"enrichment.activity.summary\";\n EventCategory2[\"PipelineAnalyticsTrackStarted\"] = \"pipeline-analytics.track-started\";\n EventCategory2[\"PipelineAnalyticsTrackEnded\"] = \"pipeline-analytics.track-ended\";\n EventCategory2[\"PipelineAnalyticsDetectionEvent\"] = \"pipeline-analytics.detection-event\";\n EventCategory2[\"PipelineAnalyticsFrameTracked\"] = \"pipeline-analytics.frame-tracked\";\n EventCategory2[\"FrigateLiveEvent\"] = \"frigate.live-event\";\n EventCategory2[\"CameraStreamsProfileSlotsChanged\"] = \"camera-streams.onProfileSlotsChanged\";\n EventCategory2[\"StreamOnline\"] = \"stream.online\";\n EventCategory2[\"StreamOffline\"] = \"stream.offline\";\n EventCategory2[\"NetworkTunnelStarted\"] = \"network.tunnel.started\";\n EventCategory2[\"NetworkTunnelStopped\"] = \"network.tunnel.stopped\";\n EventCategory2[\"LocalNetworkChanged\"] = \"network.local.changed\";\n EventCategory2[\"MeshNetworkChanged\"] = \"network.mesh.changed\";\n EventCategory2[\"BackupCompleted\"] = \"backup.completed\";\n EventCategory2[\"BackupRestored\"] = \"backup.restored\";\n EventCategory2[\"NotificationDispatched\"] = \"notification.dispatched\";\n EventCategory2[\"NotificationFailed\"] = \"notification.failed\";\n EventCategory2[\"DeviceUpdated\"] = \"device.updated\";\n EventCategory2[\"DeviceOnline\"] = \"device.online\";\n EventCategory2[\"DeviceOffline\"] = \"device.offline\";\n EventCategory2[\"DeviceAwake\"] = \"device.awake\";\n EventCategory2[\"DeviceSleeping\"] = \"device.sleeping\";\n EventCategory2[\"RetentionCleanup\"] = \"retention.cleanup\";\n EventCategory2[\"AddonsBulkUpdateProgress\"] = \"addons.bulk-update-progress\";\n return EventCategory2;\n})(EventCategory || {});\nfunction isEvent(event, category) {\n return event.category === category;\n}\nfunction createEvent(category, source, data) {\n return {\n id: typeof crypto !== \"undefined\" && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).slice(2),\n timestamp: /* @__PURE__ */ new Date(),\n source,\n category,\n data\n };\n}\nfunction emitReadiness(bus, params) {\n const ts = params.ts ?? Date.now();\n bus.emit(createEvent(\n \"system.ready-state\",\n { type: \"capability\", id: params.capName, nodeId: params.sourceNodeId },\n {\n capName: params.capName,\n scope: params.scope,\n state: params.state,\n generation: params.generation,\n sourceNodeId: params.sourceNodeId,\n ts\n }\n ));\n}\nclass BaseAddon {\n _ctx = null;\n _config;\n /**\n * Per-process random id used as the `generation` stamp on every\n * `system.ready-state` event this addon emits. Constant for the\n * lifetime of this addon instance (== one process boot); consumer-\n * side registries derive a monotonic `epoch` by watching for\n * generation transitions.\n */\n _readinessGeneration = typeof crypto !== \"undefined\" && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).slice(2, 14);\n /** Capability names this addon registered at init — used to emit matching `down` events on shutdown. */\n _registeredCapNames = [];\n /** Default config values. Provided via constructor. */\n defaults;\n constructor(defaults) {\n this.defaults = defaults;\n this._config = { ...defaults };\n }\n /**\n * Override to opt out of the automatic `system.ready-state` emission.\n * Returns `true` by default — addons that don't map cleanly to the\n * readiness protocol (e.g. pure collection providers whose readiness\n * is already reported per-device by upstream) can override to `false`\n * and emit manually.\n */\n get autoEmitReadiness() {\n return true;\n }\n // ── Public accessors ──────────────────────────────────────────────────\n /** The AddonContext, available after initialize(). */\n get ctx() {\n if (!this._ctx) throw new Error(`${this.constructor.name}: ctx accessed before initialize()`);\n return this._ctx;\n }\n /**\n * Non-throwing ctx accessor for code paths that can legitimately run\n * before `initialize()` has resolved — most commonly cap handlers the\n * hub invokes eagerly at page load (device-details aggregator pings\n * every addon's `getDeviceSettingsContribution` as soon as the page\n * mounts). Prefer `ctx` for the normal case; reach for this only in\n * capability methods that may be queried before the addon is wired up.\n */\n get ctxIfReady() {\n return this._ctx;\n }\n /** Current resolved config (defaults merged with persisted store values). */\n get config() {\n return this._config;\n }\n // ── ICamstackAddon lifecycle ──────────────────────────────────────────\n async initialize(context) {\n this._ctx = context;\n await this.resolveConfig();\n const result = await this.onInitialize();\n this.emitLifecycle(EventCategory.AddonStarted);\n const normalized = normalizeAddonInitResult(result);\n const providers = normalized && \"providers\" in normalized && normalized.providers ? normalized.providers : [];\n this._registeredCapNames = providers.map((p) => p.capability.name);\n return normalized;\n }\n /**\n * Called by the isolated-process runner AFTER `broker.start()`.\n * In-process addons never need this because the hub broker is already\n * running when `initialize()` fires. For forked children the broker\n * starts AFTER `initialize()`, so the readiness emit inside initialize()\n * fires before the broker can broadcast it. This method re-emits the\n * ready state once the transport is live.\n */\n postBrokerStart() {\n if (this.autoEmitReadiness && this._registeredCapNames.length > 0) {\n this.emitReadinessForProviders(\"ready\");\n }\n }\n /**\n * Called by the isolated-process runner / agent bootstrap once the broker\n * has started AND the hub node is connected — the moment `ctx.api.*` calls\n * to hub-provided capabilities become safe. Wrap any bootstrap work that\n * must query the hub (device restore, settings fetch, initial sync) in\n * `onHubConnected()` rather than `onInitialize()` — during `initialize()`\n * on a worker the broker is not yet connected and remote cap calls either\n * time out or throw \"Service not found\".\n *\n * Default implementation is a no-op. Override in subclasses that need it.\n * Never fires on hub-local in-process addons (the hub is its own node).\n */\n async onHubReachable() {\n }\n async shutdown() {\n this.emitLifecycle(EventCategory.AddonStopped);\n if (this.autoEmitReadiness) this.emitReadinessForProviders(\"down\");\n await this.onShutdown();\n for (const unsub of this._subscriptions) unsub();\n this._subscriptions = [];\n this._ctx = null;\n }\n /** Addon-specific cleanup. Override if needed. */\n async onShutdown() {\n }\n /**\n * Called after config is resolved during updateGlobalSettings/updateAddonSettings.\n * Override to react to config changes (e.g. restart a sampler, reconnect a service).\n * Not called during initialize() — use onInitialize() for initial setup.\n */\n async onConfigChanged() {\n }\n // ── Schema helpers (typed) ────────────────────────────────────────────\n /**\n * Create a ConfigField with `key` constrained to keys of TConfig.\n * Provides autocomplete and compile-time validation.\n */\n field(field) {\n return field;\n }\n /**\n * Create a full ConfigUISchema with typed sections.\n * Fields created via `this.field()` get key validation automatically.\n */\n schema(schema) {\n return schema;\n }\n // ── Settings schemas (override to provide UI) ─────────────────────────\n /** Override to provide global-level settings UI schema. */\n globalSettingsSchema(_cap) {\n return null;\n }\n /** Override to provide device-level settings UI schema. */\n deviceSettingsSchema() {\n return null;\n }\n // ── Two-level settings API (auto-implemented) ────────────────────────\n //\n // Note: the former three-level split (addon / global / device) collapsed\n // to two. `addon` and `global` both wrote to the same `writeAddonStore`\n // blob and every addon used exactly one of them; the distinction was\n // never semantically load-bearing. `global` won because it was the\n // widely-used one and the name reads naturally (per-node addon config).\n async getGlobalSettings(overlay, cap) {\n const schema = this.globalSettingsSchema(cap);\n if (!schema) return { sections: [] };\n const raw = await this._ctx?.settings?.readAddonStore() ?? {};\n return hydrateSchema(schema, overlay ? { ...raw, ...overlay } : raw);\n }\n async updateGlobalSettings(patch) {\n await this._ctx?.settings?.writeAddonStore(patch);\n await this.resolveConfig();\n await this.onConfigChanged();\n this.emitLifecycle(EventCategory.AddonUpdated, { level: \"global\" });\n this.maybeAutoRestart(patch, this.globalSettingsSchema());\n }\n /**\n * If any field in `patch` is marked `requiresRestart` in `schema`,\n * schedule an addon restart for the next tick. Deferred via\n * `setImmediate` so the tRPC mutation that triggered the write has\n * time to return its response before the addon is torn down and\n * re-initialised by `AddonRegistryService.restartAddon`.\n */\n maybeAutoRestart(patch, schema) {\n if (!schema) return;\n const restartKeys = /* @__PURE__ */ new Set();\n for (const section of schema.sections) {\n for (const field of section.fields) {\n if (field.type === \"separator\" || field.type === \"info\") continue;\n if (field.requiresRestart) {\n restartKeys.add(field.key);\n }\n }\n }\n if (restartKeys.size === 0) return;\n const changed = Object.keys(patch).some((k) => restartKeys.has(k));\n if (!changed) return;\n const ctx = this._ctx;\n if (!ctx) return;\n const addonId = ctx.id;\n setImmediate(() => {\n const api = ctx.api;\n api.addons?.restartAddon?.mutate({ addonId }).then(() => {\n ctx.logger.info(\"addon auto-restart triggered by restart-required setting change\", {\n meta: { changedFields: Object.keys(patch).filter((k) => restartKeys.has(k)) }\n });\n }).catch((err) => {\n ctx.logger.error(\"addon auto-restart failed\", {\n meta: { error: err instanceof Error ? err.message : String(err) }\n });\n });\n });\n }\n async getDeviceSettings(deviceId) {\n const schema = this.deviceSettingsSchema();\n if (!schema) return { sections: [] };\n const raw = await this._ctx?.settings?.readDeviceStore(deviceId) ?? {};\n return hydrateSchema(schema, raw);\n }\n async updateDeviceSettings(deviceId, patch) {\n await this._ctx?.settings?.writeDeviceStore(deviceId, patch);\n }\n // ── Event subscriptions (auto-cleanup on shutdown) ────────────────────\n _subscriptions = [];\n /**\n * Subscribe to an event bus category. The subscription is automatically\n * unsubscribed on shutdown — no manual cleanup needed.\n *\n * @example\n * ```ts\n * this.subscribe({ category: EventCategory.DeviceRegistered }, (event) => {\n * void this.handleDevice(event)\n * })\n * ```\n */\n /**\n * Subscribe to `system.ready-state` events for one or more capabilities.\n * Abstracts the boilerplate type-narrowing + nodeId extraction that every\n * resilience subscription duplicates. Cleanup is automatic (registered on\n * `_subscriptions` like a normal `subscribe` call).\n */\n watchCapability(capNames, handlers) {\n const names = Array.isArray(capNames) ? capNames : [capNames];\n const nameSet = new Set(names);\n this.subscribe(\n { category: \"system.ready-state\" },\n (event) => {\n const data = event.data;\n if (typeof data.capName !== \"string\") return;\n if (!nameSet.has(data.capName)) return;\n if (data.scope?.type !== \"node\") return;\n const nodeId = data.scope.nodeId;\n if (typeof nodeId !== \"string\" || nodeId.length === 0) return;\n const capName = data.capName;\n if (data.state === \"down\") {\n handlers.onDown?.(nodeId, capName);\n } else if (data.state === \"ready\") {\n handlers.onReady?.(nodeId, capName);\n }\n }\n );\n }\n subscribe(filter, handler) {\n const unsub = this.ctx.eventBus.subscribe(filter, handler);\n this._subscriptions.push(unsub);\n }\n // ── Lifecycle event emission ────────────────────────────────────────────\n emitLifecycle(category, data) {\n try {\n this._ctx?.eventBus.emit({\n id: `${this._ctx.id}-${Date.now()}`,\n timestamp: /* @__PURE__ */ new Date(),\n source: { type: \"addon\", id: this._ctx.id, nodeId: this._ctx.kernel.localNodeId ?? \"hub\" },\n category,\n data: data ?? {}\n });\n } catch {\n }\n }\n /**\n * Emit a `system.ready-state` event for every capability this addon\n * registered at init. Scope is `{type:'node', nodeId}` — readiness is\n * tied to the node that hosts the provider. Consumers that care about\n * per-device readiness can subscribe with `{type:'device', ...}` if\n * the provider emits at finer granularity (collection addons may\n * opt-out via `autoEmitReadiness` and emit manually).\n */\n emitReadinessForProviders(state) {\n const ctx = this._ctx;\n if (!ctx) return;\n if (this._registeredCapNames.length === 0) return;\n const rawNodeId = ctx.kernel?.localNodeId ?? \"hub\";\n const nodeId = rawNodeId.includes(\"/\") ? rawNodeId.split(\"/\")[0] : rawNodeId;\n for (const capName of this._registeredCapNames) {\n try {\n emitReadiness(ctx.eventBus, {\n capName,\n scope: { type: \"node\", nodeId },\n state,\n generation: this._readinessGeneration,\n sourceNodeId: nodeId\n });\n } catch {\n }\n }\n }\n // ── Common helpers ─────────────────────────────────────────────────────\n /**\n * Resolve the shared models directory path via the storage capability.\n * Falls back to `camstack-data/models` if storage is unavailable.\n * Used by inference addons (detection-pipeline, audio-classifier, embedding-encoder).\n */\n async resolveModelsDir() {\n return this.ctx.api.storage.resolve.query({ location: \"models\", relativePath: \"\" }).catch(() => \"camstack-data/models\");\n }\n /**\n * Access the runtime capability registry for in-process provider lookups.\n * Returns null if the registry is not available (e.g. on agents).\n * Used by addons that consume other capabilities directly (snapshot, stream-broker, enrichment).\n */\n get capabilities() {\n const capCtx = this.ctx;\n return capCtx.capabilities ?? null;\n }\n // ── Config resolution ─────────────────────────────────────────────────\n /**\n * Resolve config by merging defaults with persisted store values.\n * Called automatically during initialize() and after every updateSettings().\n *\n * The merge is shallow: each key in `defaults` is checked against the store.\n * Only keys present in defaults are read — the store can contain extra keys\n * (e.g. from older versions) without polluting the typed config.\n */\n async resolveConfig() {\n const stored = await this.readAddonStoreWithRetry();\n const resolved = { ...this.defaults };\n for (const key of Object.keys(this.defaults)) {\n const storedValue = stored[key];\n if (storedValue !== void 0 && storedValue !== null) {\n const defaultType = typeof this.defaults[key];\n if (typeof storedValue === defaultType) {\n resolved[key] = storedValue;\n }\n }\n }\n this._config = resolved;\n }\n /**\n * Wrap `ctx.settings.readAddonStore()` with a short retry budget so a\n * transient settings-store outage (mid-restart of sqlite-settings, tsx-watch\n * swap, or any race where the SqliteSettingsBackend is between shutdown and\n * re-initialize) doesn't propagate up into `initialize()` and leave the\n * addon permanently broken.\n *\n * Retry only the two known infra fingerprints. Anything else propagates so\n * real bugs surface immediately. After the budget expires we fall back to\n * `{}` (defaults) — the addon's first successful patch will rehydrate.\n */\n async readAddonStoreWithRetry() {\n const settings = this._ctx?.settings;\n if (!settings) return {};\n const delaysMs = [150, 350, 600, 900];\n let lastErr;\n for (let attempt = 0; attempt <= delaysMs.length; attempt++) {\n try {\n return await settings.readAddonStore() ?? {};\n } catch (err) {\n lastErr = err;\n const msg = err instanceof Error ? err.message : String(err);\n const transient = msg.includes(\"SqliteSettingsBackend not initialized\") || msg.includes(\"provider not available\");\n if (!transient) throw err;\n if (attempt === delaysMs.length) break;\n await new Promise((r) => setTimeout(r, delaysMs[attempt]));\n }\n }\n this._ctx?.logger?.warn?.(\"readAddonStore: settings-store unavailable after retries — using defaults\", {\n meta: { error: lastErr instanceof Error ? lastErr.message : String(lastErr) }\n });\n return {};\n }\n}\nfunction normalizeAddonInitResult(result) {\n if (result == null) return;\n if (Array.isArray(result)) return { providers: result };\n return result;\n}\nfunction buildAddonRouteProvider(id, routes) {\n return {\n id,\n getRoutes: () => routes,\n invoke: async (input) => {\n const match = matchRoute(routes, input.method, input.path);\n if (!match) {\n return {\n status: 404,\n headers: {},\n redirectUrl: null,\n body: { error: `No route matches ${input.method} ${input.path}` }\n };\n }\n const envelope = {\n status: 200,\n headers: {},\n redirectUrl: null\n };\n const reply = buildCapturingReply(envelope);\n const request = {\n params: { ...input.params, ...match.params },\n query: input.query,\n body: input.body,\n headers: input.headers,\n ...input.user ? { user: input.user } : {},\n // The scopedToken shape is intentionally `unknown` on the wire\n // (it includes nested `TokenScope` discriminated unions that\n // wouldn't gain from re-validation across the bridge).\n ...input.scopedToken !== void 0 ? { scopedToken: input.scopedToken } : {}\n };\n await match.route.handler(request, reply);\n return envelope;\n }\n };\n}\nfunction matchRoute(routes, method, path) {\n const normalizedMethod = method.toUpperCase();\n for (const route of routes) {\n if (route.method !== normalizedMethod) continue;\n const params = matchPath(route.path, path);\n if (params !== null) return { route, params };\n }\n return null;\n}\nfunction matchPath(pattern, p) {\n const patternParts = pattern.split(\"/\").filter(Boolean);\n const pathParts = p.split(\"/\").filter(Boolean);\n if (patternParts.length !== pathParts.length) return null;\n const params = {};\n for (let i = 0; i < patternParts.length; i++) {\n const a = patternParts[i];\n const b = pathParts[i];\n if (a.startsWith(\":\")) params[a.slice(1)] = b;\n else if (a !== b) return null;\n }\n return params;\n}\nfunction buildCapturingReply(envelope) {\n const wrapper = {\n status(code) {\n envelope.status = code;\n return wrapper;\n },\n code(code) {\n envelope.status = code;\n return wrapper;\n },\n send(data) {\n envelope.body = data;\n },\n redirect(url) {\n envelope.redirectUrl = url;\n if (envelope.status === 200) envelope.status = 302;\n },\n header(name, value) {\n envelope.headers[name.toLowerCase()] = value;\n return wrapper;\n },\n type(mime) {\n envelope.contentType = mime;\n return wrapper;\n }\n };\n return wrapper;\n}\nclass ReadinessTimeoutError extends Error {\n capName;\n scope;\n waitedMs;\n constructor(capName, scope, waitedMs) {\n super(`Timed out waiting for ${capName} (${scopeKey(scope)}) to become ready after ${waitedMs}ms`);\n this.name = \"ReadinessTimeoutError\";\n this.capName = capName;\n this.scope = scope;\n this.waitedMs = waitedMs;\n }\n}\nfunction readinessKey(capName, scope) {\n return `${capName}|${scopeKey(scope)}`;\n}\nfunction scopeKey(scope) {\n switch (scope.type) {\n case \"global\":\n return \"global\";\n case \"node\":\n return `node:${scope.nodeId}`;\n case \"device\":\n return `device:${scope.deviceId}`;\n }\n}\nfunction scopesEqual(a, b) {\n if (a.type !== b.type) return false;\n if (a.type === \"global\" || b.type === \"global\") return true;\n if (a.type === \"node\" && b.type === \"node\") return a.nodeId === b.nodeId;\n if (a.type === \"device\" && b.type === \"device\") return a.deviceId === b.deviceId;\n return false;\n}\nclass ReadinessRegistry {\n bus;\n sourceNodeId;\n logger;\n now;\n generation;\n snapshot = /* @__PURE__ */ new Map();\n subscriptions = /* @__PURE__ */ new Set();\n unsubscribeBus;\n unsubscribeAgentOffline;\n constructor(options) {\n this.bus = options.eventBus;\n this.sourceNodeId = options.sourceNodeId;\n this.logger = options.logger;\n this.now = options.now ?? (() => Date.now());\n this.generation = options.generation ?? randomGeneration();\n this.unsubscribeBus = this.bus.subscribe(\n { category: \"system.ready-state\" },\n (event) => this.ingest(event.data)\n );\n this.unsubscribeAgentOffline = this.bus.subscribe(\n { category: \"agent.offline\" },\n (event) => this.synthesizeDownForNode(event.data.agentId)\n );\n if (typeof this.bus.getRecent === \"function\") {\n try {\n const recent = this.bus.getRecent({ category: \"system.ready-state\" });\n for (const event of recent) {\n this.ingest(event.data);\n }\n } catch {\n }\n }\n }\n /** Release the event-bus subscription. Idempotent. */\n close() {\n this.unsubscribeBus();\n this.unsubscribeAgentOffline();\n this.subscriptions.clear();\n }\n /** Current snapshot for a `(capName, scope)` pair, or `null` if never seen. */\n get(capName, scope) {\n return this.snapshot.get(readinessKey(capName, scope)) ?? null;\n }\n /**\n * Serializable snapshot for cross-process transport. Returns an array\n * of `ReadinessRecord` plain objects — safe for MsgPack / JSON\n * transport. Used by the hub's `$readiness.getSnapshot` Moleculer\n * action; consumers hydrate their local registry from the result.\n */\n getSnapshotForTransport() {\n return Array.from(this.snapshot.values());\n }\n /**\n * Hydrate the snapshot from an authoritative source. Entries already\n * present locally are skipped — live deltas (received via the event\n * bus subscription) always take precedence over the snapshot. For\n * each newly hydrated entry, a one-shot transition is dispatched to\n * matching subscriptions so pending `awaitReady` callers unblock\n * without having to wait for a fresh event.\n *\n * Local `epoch` is reset to 1 per entry — consumer-side epoch is\n * derived from observed generation transitions, so this mirrors the\n * value that would have been assigned had the consumer observed the\n * first `ready` event directly.\n */\n hydrate(records) {\n const now = this.now();\n for (const record of records) {\n const key = readinessKey(record.capName, record.scope);\n if (this.snapshot.has(key)) continue;\n const hydrated = {\n capName: record.capName,\n scope: record.scope,\n state: record.state,\n generation: record.generation,\n epoch: 1,\n lastChange: now,\n sourceNodeId: record.sourceNodeId\n };\n this.snapshot.set(key, hydrated);\n if (this.logger) {\n this.logger.debug(\n `readiness: ${record.capName} (${scopeKey(record.scope)}) → ${record.state} (hydrated, gen=${record.generation.slice(0, 6)})`\n );\n }\n const transition = {\n capName: record.capName,\n scope: record.scope,\n state: record.state,\n epoch: 1,\n generation: record.generation,\n sourceNodeId: \"hydrated\",\n ts: now,\n durationInPrevState: 0\n };\n for (const sub of this.subscriptions) {\n if (sub.capName !== record.capName) continue;\n if (!scopesEqual(sub.scope, record.scope)) continue;\n try {\n sub.handler(transition);\n } catch (err) {\n this.logger?.warn(\n `readiness hydrate handler threw for ${record.capName}: ${err.message ?? String(err)}`\n );\n }\n }\n }\n }\n /** Shallow copy of the full snapshot — mainly for diagnostics/tests. */\n getAll() {\n return new Map(this.snapshot);\n }\n /**\n * Emit a `ready` transition for a locally-owned capability. The\n * payload carries this registry's `generation` so remote registries\n * can derive their own `epoch`.\n */\n emitReady(capName, scope) {\n this.emitTransition(capName, scope, \"ready\");\n }\n emitStarting(capName, scope) {\n this.emitTransition(capName, scope, \"starting\");\n }\n emitDown(capName, scope) {\n this.emitTransition(capName, scope, \"down\");\n }\n /**\n * One-shot: resolve once the cap is `ready`. Reads the snapshot\n * first — if already ready, resolves synchronously on the next tick.\n *\n * Default behaviour is **wait indefinitely** (timeoutMs = `Infinity`):\n * the orchestrator and other callers never want to attach a camera\n * with empty steps just because a cap took longer than 30s to come\n * up. Pass an explicit finite `timeoutMs` to bound the wait, or an\n * `AbortSignal` to cancel externally. `Infinity` is honoured natively\n * — no `setTimeout` is registered (Node's setTimeout silently clamps\n * values above ~24.8d, so we must skip the timer entirely).\n */\n awaitReady(capName, scope, opts = {}) {\n const timeoutMs = opts.timeoutMs ?? Number.POSITIVE_INFINITY;\n const start = this.now();\n const current = this.get(capName, scope);\n if (current?.state === \"ready\") {\n return Promise.resolve();\n }\n if (opts.signal?.aborted) {\n return Promise.reject(opts.signal.reason ?? new Error(\"aborted\"));\n }\n return new Promise((resolve, reject) => {\n let settled = false;\n const unsubscribe = this.onReadyState(capName, scope, (t) => {\n if (t.state !== \"ready\") return;\n if (settled) return;\n settled = true;\n cleanup();\n resolve();\n });\n const isInfinite = !Number.isFinite(timeoutMs);\n const timer = isInfinite ? null : setTimeout(() => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(new ReadinessTimeoutError(capName, scope, this.now() - start));\n }, timeoutMs);\n const PENDING_LOG_INTERVAL_MS = 3e4;\n const pendingLogTimer = setInterval(() => {\n if (settled) return;\n this.logger?.warn(\n `readiness: still awaiting ${capName} (${scopeKey(scope)}) after ${this.now() - start}ms`\n );\n }, PENDING_LOG_INTERVAL_MS);\n if (typeof pendingLogTimer.unref === \"function\") pendingLogTimer.unref();\n const onAbort = () => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(opts.signal?.reason ?? new Error(\"aborted\"));\n };\n opts.signal?.addEventListener(\"abort\", onAbort, { once: true });\n function cleanup() {\n unsubscribe();\n if (timer !== null) clearTimeout(timer);\n clearInterval(pendingLogTimer);\n opts.signal?.removeEventListener(\"abort\", onAbort);\n }\n });\n }\n /**\n * Observable: every transition (starting/ready/down) dispatches to\n * `handler`. On subscription, if the snapshot has a current state,\n * the handler fires ONCE asynchronously with that state as the\n * initial transition (duration = 0) so late subscribers can pick up\n * current state without racing the next transition.\n *\n * Returns an unsubscribe function.\n */\n onReadyState(capName, scope, handler) {\n const sub = { capName, scope, handler };\n this.subscriptions.add(sub);\n const current = this.get(capName, scope);\n if (current !== null) {\n queueMicrotask(() => {\n if (!this.subscriptions.has(sub)) return;\n handler({\n capName,\n scope,\n state: current.state,\n epoch: current.epoch,\n generation: current.generation,\n sourceNodeId: this.sourceNodeId,\n ts: current.lastChange,\n durationInPrevState: 0\n });\n });\n }\n return () => {\n this.subscriptions.delete(sub);\n };\n }\n // ── Internals ─────────────────────────────────────────────────────────\n emitTransition(capName, scope, state) {\n const ts = this.now();\n this.bus.emit(createEvent(\n \"system.ready-state\",\n { type: \"capability\", id: capName, nodeId: this.sourceNodeId },\n {\n capName,\n scope,\n state,\n generation: this.generation,\n sourceNodeId: this.sourceNodeId,\n ts\n }\n ));\n }\n /**\n * Update snapshot + dispatch to subscribers. Idempotent: same\n * `generation + state` replay is a no-op for both snapshot and\n * subscribers.\n *\n * Defensive against malformed payloads (legal reason: a mock bus's\n * `getRecent` may ignore the category filter and replay unrelated\n * events when we hydrate at construction time).\n */\n ingest(payload) {\n if (typeof payload?.capName !== \"string\") return;\n if (payload.state !== \"ready\" && payload.state !== \"starting\" && payload.state !== \"down\") return;\n if (typeof payload.generation !== \"string\") return;\n if (payload.scope?.type !== \"global\" && payload.scope?.type !== \"node\" && payload.scope?.type !== \"device\") return;\n const key = readinessKey(payload.capName, payload.scope);\n const prev = this.snapshot.get(key) ?? null;\n const now = this.now();\n let epoch;\n if (prev === null) {\n epoch = payload.state === \"ready\" ? 1 : 0;\n } else if (prev.generation !== payload.generation && payload.state === \"ready\") {\n epoch = prev.epoch + 1;\n } else {\n epoch = prev.epoch;\n }\n if (prev !== null && prev.generation === payload.generation && prev.state === payload.state) {\n return;\n }\n const durationInPrevState = prev === null ? 0 : Math.max(0, now - prev.lastChange);\n const next = {\n capName: payload.capName,\n scope: payload.scope,\n state: payload.state,\n generation: payload.generation,\n epoch,\n lastChange: now,\n sourceNodeId: payload.sourceNodeId\n };\n this.snapshot.set(key, next);\n const transition = {\n capName: payload.capName,\n scope: payload.scope,\n state: payload.state,\n epoch,\n generation: payload.generation,\n sourceNodeId: payload.sourceNodeId,\n ts: payload.ts,\n durationInPrevState\n };\n if (this.logger) {\n this.logger.debug(\n `readiness: ${payload.capName} (${scopeKey(payload.scope)}) → ${payload.state} epoch=${epoch} gen=${payload.generation.slice(0, 6)} (prev ${durationInPrevState}ms)`\n );\n }\n for (const sub of this.subscriptions) {\n if (sub.capName !== payload.capName) continue;\n if (!scopesEqual(sub.scope, payload.scope)) continue;\n try {\n sub.handler(transition);\n } catch (err) {\n this.logger?.warn(`readiness handler threw for ${payload.capName}: ${err.message ?? String(err)}`);\n }\n }\n }\n /**\n * `agent.offline` demux. When an agent disconnects ungracefully,\n * its BaseAddon's shutdown hook doesn't fire — consumers would\n * otherwise keep waiting on a stale `ready`. Walk the snapshot and\n * synthesize a `down` transition for every node-scoped record bound\n * to the disconnected `nodeId`, skipping records already `down`.\n *\n * Synthesis is LOCAL: we don't re-emit on the bus. Every registry\n * (one per process) receives the same `agent.offline` and reacts\n * independently, which means no duplicated downs and no central\n * supervisor required.\n */\n synthesizeDownForNode(offlineNodeId) {\n const now = this.now();\n for (const [key, record] of this.snapshot) {\n if (record.state === \"down\") continue;\n const matchesOfflineNode = record.scope.type === \"node\" && record.scope.nodeId === offlineNodeId || record.scope.type === \"device\" && record.sourceNodeId === offlineNodeId;\n if (!matchesOfflineNode) continue;\n const durationInPrevState = Math.max(0, now - record.lastChange);\n const next = {\n ...record,\n state: \"down\",\n lastChange: now\n };\n this.snapshot.set(key, next);\n const transition = {\n capName: record.capName,\n scope: record.scope,\n state: \"down\",\n epoch: record.epoch,\n generation: record.generation,\n sourceNodeId: this.sourceNodeId,\n ts: now,\n durationInPrevState\n };\n if (this.logger) {\n this.logger.debug(\n `readiness: ${record.capName} (${scopeKey(record.scope)}) → down (synthesized from agent.offline ${offlineNodeId})`\n );\n }\n for (const sub of this.subscriptions) {\n if (sub.capName !== record.capName) continue;\n if (!scopesEqual(sub.scope, record.scope)) continue;\n try {\n sub.handler(transition);\n } catch (err) {\n this.logger?.warn(`readiness handler threw during agent.offline demux for ${record.capName}: ${err.message ?? String(err)}`);\n }\n }\n }\n }\n}\nfunction randomGeneration() {\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return Math.random().toString(36).slice(2, 14);\n}\nfunction emitDownForOwnedCaps(registry, owned) {\n for (const { capName, scope } of owned) {\n registry.emitDown(capName, scope);\n }\n}\nconst STORAGE_LOCATION_TYPES = [\n \"data\",\n \"media\",\n \"recordings\",\n \"recordings-high\",\n \"recordings-low\",\n \"recordings-clips\",\n \"event-images\",\n \"models\",\n \"addons-data\",\n \"cache\",\n \"logs\",\n \"backups\"\n];\nconst DEFAULT_LOCATION_SUBDIRS = {\n \"data\": \"db\",\n \"media\": \"media\",\n \"recordings\": \"recordings\",\n \"recordings-high\": \"recordings-high\",\n \"recordings-low\": \"recordings-low\",\n \"recordings-clips\": \"recordings-clips\",\n \"event-images\": \"event-images\",\n \"models\": \"models\",\n \"addons-data\": \"addons-data\",\n \"cache\": \"/tmp/camstack-cache\",\n \"logs\": \"logs\",\n \"backups\": \"backups\"\n};\nconst STREAM_QUALITY_LABELS = {\n high: \"High\",\n mid: \"Mid\",\n low: \"Low\"\n};\nfunction streamQualityLabel(id) {\n return STREAM_QUALITY_LABELS[id] ?? id.charAt(0).toUpperCase() + id.slice(1);\n}\nfunction streamPixels(meta) {\n return (meta.width ?? 0) * (meta.height ?? 0);\n}\nfunction classifyStreams(streams) {\n if (streams.length === 0) return [];\n const sorted = streams.map((s, i) => ({ s, i, px: streamPixels(s.metadata ?? {}) })).sort((a, b) => b.px - a.px);\n const result = Array.from({ length: streams.length });\n for (let rank = 0; rank < sorted.length; rank++) {\n const { s, i } = sorted[rank];\n let quality;\n if (rank === 0) quality = \"high\";\n else if (rank === sorted.length - 1) quality = \"low\";\n else quality = \"mid\";\n result[i] = { ...s, quality };\n }\n return result;\n}\nfunction classifyStream(meta) {\n const h = meta.height ?? 0;\n const w = meta.width ?? 0;\n if (h >= 1080 || w >= 1920) return \"high\";\n if (h >= 480 || w >= 640) return \"mid\";\n return \"low\";\n}\nfunction toStreamSourceEntry(stream) {\n const urlProto = stream.protocols.find((p) => p.type === \"rtsp\" && p.url) ?? stream.protocols.find((p) => p.url);\n const protocolRaw = urlProto?.type;\n const protocol = protocolRaw === \"rtsp\" ? \"rtsp\" : protocolRaw === \"http\" || protocolRaw === \"flv\" ? \"http-mjpeg\" : \"custom\";\n return {\n id: stream.id,\n label: stream.label ?? stream.id,\n protocol,\n url: urlProto?.url,\n profileHint: stream.quality\n };\n}\nfunction isString(v) {\n return typeof v === \"string\";\n}\nfunction isRecord(v) {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\nfunction parseStreamEntry(v) {\n if (isString(v) && v.trim()) return { url: v };\n if (isRecord(v) && isString(v[\"url\"]) && v[\"url\"].trim()) {\n return {\n url: v[\"url\"],\n label: isString(v[\"label\"]) ? v[\"label\"] : void 0\n };\n }\n return null;\n}\nfunction parseCameraStreamConfig(raw) {\n const snapshotUrl = isString(raw[\"snapshot_url\"]) ? raw[\"snapshot_url\"] : void 0;\n if (Array.isArray(raw[\"streams\"])) {\n const streams2 = [];\n for (const item of raw[\"streams\"]) {\n const entry = parseStreamEntry(item);\n if (entry) streams2.push(entry);\n }\n return { streams: streams2, snapshot_url: snapshotUrl };\n }\n const streams = [];\n const mainUrl = isString(raw[\"main_stream_url\"]) ? raw[\"main_stream_url\"] : void 0;\n if (mainUrl) streams.push({ url: mainUrl, label: isString(raw[\"main_stream_name\"]) ? raw[\"main_stream_name\"] : void 0 });\n const subUrl = isString(raw[\"sub_stream_url\"]) ? raw[\"sub_stream_url\"] : void 0;\n if (subUrl) streams.push({ url: subUrl, label: isString(raw[\"sub_stream_name\"]) ? raw[\"sub_stream_name\"] : void 0 });\n const thirdUrl = isString(raw[\"third_stream_url\"]) ? raw[\"third_stream_url\"] : void 0;\n if (thirdUrl) streams.push({ url: thirdUrl, label: isString(raw[\"third_stream_name\"]) ? raw[\"third_stream_name\"] : void 0 });\n return {\n streams,\n snapshot_url: snapshotUrl\n };\n}\nfunction autoAssignProfiles(streams) {\n if (streams.length === 0) return {};\n const classified = classifyStreams(streams);\n const map = {};\n const high = classified.find((s) => s.quality === \"high\");\n const mid = classified.find((s) => s.quality === \"mid\");\n const low = classified.find((s) => s.quality === \"low\");\n if (high) map.high = high.id;\n if (mid) map.mid = mid.id;\n if (low) map.low = low.id;\n const fallback = high ?? mid ?? low ?? classified[0];\n if (fallback) {\n if (!map.high) map.high = fallback.id;\n if (!map.mid) map.mid = fallback.id;\n if (!map.low) map.low = fallback.id;\n }\n return map;\n}\nconst DEFAULT_FEATURES = {\n streaming: true,\n notifications: true,\n objectDetection: false,\n remoteAccess: true,\n agentCluster: false,\n smartHome: true,\n recordings: true,\n backup: true,\n repl: true\n};\nconst SUB_DETECTION_TYPES = [\"face\", \"plate\"];\nconst RECOGNITION_TYPES = [\"face\", \"plate\", \"clip\", \"custom\"];\nconst DEFAULT_RETENTION = {\n cleanupIntervalMs: 60 * 60 * 1e3,\n detectionEventsDays: 30,\n audioLevelsDays: 7,\n snapshotsDays: 14\n};\nvar EventSourceType = /* @__PURE__ */ ((EventSourceType2) => {\n EventSourceType2[\"Addon\"] = \"addon\";\n EventSourceType2[\"Core\"] = \"core\";\n EventSourceType2[\"Device\"] = \"device\";\n EventSourceType2[\"Provider\"] = \"provider\";\n EventSourceType2[\"System\"] = \"system\";\n return EventSourceType2;\n})(EventSourceType || {});\nconst HF_REPO = \"camstack/camstack-models\";\nconst HF_BASE_URL = `https://huggingface.co/${HF_REPO}/resolve/main`;\nconst RUNTIME_DEFAULTS = {\n \"features.streaming\": true,\n \"features.notifications\": true,\n \"features.objectDetection\": false,\n \"features.remoteAccess\": true,\n \"features.agentCluster\": false,\n \"features.smartHome\": true,\n \"features.recordings\": true,\n \"features.backup\": true,\n \"features.repl\": true,\n \"retention.detectionEventsDays\": 30,\n \"retention.audioLevelsDays\": 7,\n \"logging.level\": \"info\",\n \"logging.retentionDays\": 30,\n \"eventBus.ringBufferSize\": 1e4,\n \"storage.provider\": \"sqlite-storage\",\n \"storage.locations\": {\n data: \"camstack-data/data\",\n media: \"camstack-data/media\",\n recordings: \"camstack-data/recordings\",\n cache: \"/tmp/camstack-cache\",\n logs: \"camstack-data/logs\",\n models: \"camstack-data/models\"\n },\n \"providers\": [],\n // Recording\n \"recording.segmentDurationSeconds\": 4,\n \"recording.defaultRetentionDays\": 30,\n // Streaming ports are addon-specific (go2rtc owns its defaults)\n // FFmpeg\n \"ffmpeg.binaryPath\": \"ffmpeg\",\n \"ffmpeg.hwAccel\": \"auto\",\n \"ffmpeg.threadCount\": 0,\n // Detection / motion / audio settings are owned by their respective addons\n // (pipeline-orchestrator, motion-wasm, audio-analyzer/classifier, detection-pipeline\n // step schemas). No detection defaults at this level.\n // Backup retention is addon-specific (local-backup owns its default)\n // Auth (runtime)\n \"auth.tokenExpiry\": \"24h\"\n};\nfunction parseJsonUnknown(text) {\n const parsed = JSON.parse(text);\n return parsed;\n}\nfunction asJsonObject(value) {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n return { ...value };\n}\nfunction asJsonArray(value) {\n return Array.isArray(value) ? value : [];\n}\nfunction asString(value, fallback = \"\") {\n return typeof value === \"string\" ? value : fallback;\n}\nfunction asNumber(value, fallback = 0) {\n return typeof value === \"number\" ? value : fallback;\n}\nfunction asBoolean(value, fallback = false) {\n return typeof value === \"boolean\" ? value : fallback;\n}\nfunction parseJsonObject(text) {\n try {\n return asJsonObject(parseJsonUnknown(text));\n } catch {\n return null;\n }\n}\nfunction parseJsonArray(text) {\n try {\n const parsed = parseJsonUnknown(text);\n return Array.isArray(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\nfunction hfModelUrl(repo, path) {\n return `https://huggingface.co/${repo}/resolve/main/${path}`;\n}\nfunction cosineSimilarity(a, b) {\n if (a.length !== b.length) return 0;\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n const denom = Math.sqrt(normA) * Math.sqrt(normB);\n return denom === 0 ? 0 : dotProduct / denom;\n}\nclass ElementConfigStore {\n constructor(elementId, settingsBackend) {\n this.elementId = elementId;\n this.getBackend = typeof settingsBackend === \"function\" ? settingsBackend : () => settingsBackend;\n }\n cache = {};\n listeners = /* @__PURE__ */ new Set();\n loaded = false;\n getBackend;\n /** Load config from storage into cache. Called once on first access. */\n async ensureLoaded() {\n if (this.loaded) return;\n const backend = this.getBackend();\n if (!backend) {\n throw new Error(`ElementConfigStore(${this.elementId}): settings backend not available`);\n }\n const records = await backend.query({ collection: \"config\", filter: {\n where: { id: this.elementId },\n limit: 1\n } });\n if (records.length > 0) {\n this.cache = records[0].data ?? {};\n }\n this.loaded = true;\n }\n getAll() {\n return { ...this.cache };\n }\n get(key) {\n const parts = key.split(\".\");\n let current = this.cache;\n for (const part of parts) {\n if (current === null || typeof current !== \"object\" || Array.isArray(current)) return void 0;\n current = Reflect.get(current, part);\n }\n return current;\n }\n async set(key, value) {\n await this.ensureLoaded();\n setNestedValue(this.cache, key, value);\n await this.persist();\n this.notifyListeners();\n }\n async setAll(config) {\n await this.ensureLoaded();\n this.cache = { ...config };\n await this.persist();\n this.notifyListeners();\n }\n onChange(callback) {\n this.listeners.add(callback);\n return () => {\n this.listeners.delete(callback);\n };\n }\n /** Initialize from storage — called by ContextFactory after creation */\n async load() {\n await this.ensureLoaded();\n }\n /** Initialize with default values (doesn't overwrite existing) */\n async loadDefaults(defaults) {\n await this.ensureLoaded();\n if (Object.keys(this.cache).length === 0) {\n this.cache = { ...defaults };\n await this.persist();\n }\n }\n async persist() {\n const backend = this.getBackend();\n if (!backend) {\n throw new Error(`ElementConfigStore(${this.elementId}): settings backend not available — cannot persist config`);\n }\n await backend.set({ collection: \"config\", key: this.elementId, value: this.cache });\n }\n notifyListeners() {\n const snapshot = this.getAll();\n for (const listener of this.listeners) {\n try {\n listener(snapshot);\n } catch {\n }\n }\n }\n}\nfunction setNestedValue(obj, path, value) {\n const parts = path.split(\".\");\n let current = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n const existing = current[part];\n if (existing === null || typeof existing !== \"object\" || Array.isArray(existing)) {\n const fresh = {};\n current[part] = fresh;\n current = fresh;\n } else {\n current = existing;\n }\n }\n current[parts[parts.length - 1]] = value;\n}\nconst BACKEND_TO_FORMAT = {\n // Node.js backends — all ONNX (onnxruntime-node execution providers)\n cpu: \"onnx\",\n coreml: \"onnx\",\n // onnxruntime CoreML EP loads .onnx, not .mlpackage\n cuda: \"onnx\",\n tensorrt: \"onnx\",\n \"onnx-py\": \"onnx\",\n // Python native backends\n pytorch: \"pt\",\n openvino: \"openvino\"\n};\nconst RUNTIME_TO_FORMAT = {\n onnx: \"onnx\",\n coreml: \"coreml\",\n openvino: \"openvino\",\n tflite: \"tflite\",\n pytorch: \"pt\"\n};\nconst PYTHON_SCRIPT = {\n coreml: \"coreml_inference.py\",\n pytorch: \"pytorch_inference.py\",\n openvino: \"openvino_inference.py\"\n};\nfunction resolveDetectionRuntime(pipelineRuntime, backend) {\n if (pipelineRuntime === \"node\") return \"onnx\";\n const map = {\n coreml: \"coreml\",\n openvino: \"openvino\",\n pytorch: \"pytorch\",\n \"onnx-py\": \"onnx\",\n cpu: \"onnx\"\n };\n return map[backend] ?? backend;\n}\nfunction resolveModelFormat(pipelineRuntime, backend) {\n if (pipelineRuntime === \"node\") {\n return BACKEND_TO_FORMAT[backend] ?? \"onnx\";\n }\n const map = {\n coreml: \"coreml\",\n openvino: \"openvino\",\n pytorch: \"pt\",\n \"onnx-py\": \"onnx\",\n cpu: \"onnx\"\n };\n return map[backend] ?? \"onnx\";\n}\nfunction resolveAddonRuntime(pipelineRuntime, backend) {\n if (!pipelineRuntime || pipelineRuntime === \"auto\") return \"auto\";\n return resolveDetectionRuntime(pipelineRuntime, backend ?? \"cpu\");\n}\nfunction formatForBackend(backend) {\n return BACKEND_TO_FORMAT[backend] ?? \"onnx\";\n}\nfunction formatForRuntime(runtime) {\n return RUNTIME_TO_FORMAT[runtime];\n}\nfunction pythonScriptForBackend(backend) {\n return PYTHON_SCRIPT[backend];\n}\nfunction requiresPython(runtime) {\n return runtime === \"coreml\" || runtime === \"pytorch\" || runtime === \"openvino\";\n}\nasync function runInferenceStep(fn2, timeoutMs) {\n const t0 = performance.now();\n try {\n const output = timeoutMs !== void 0 ? await withTimeout(fn2(), timeoutMs) : await fn2();\n return {\n output,\n durationMs: roundMs(performance.now() - t0),\n ok: true\n };\n } catch (err) {\n return {\n output: void 0,\n durationMs: roundMs(performance.now() - t0),\n ok: false,\n error: errMsg(err)\n };\n }\n}\nfunction roundMs(ms) {\n return Math.round(ms * 100) / 100;\n}\nfunction withTimeout(promise, ms) {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(`Inference timeout after ${ms}ms`)), ms);\n promise.then((v) => {\n clearTimeout(timer);\n resolve(v);\n }).catch((e) => {\n clearTimeout(timer);\n reject(e);\n });\n });\n}\nconst COCO_80_LABELS = [\n { id: \"person\", name: \"Person\" },\n { id: \"bicycle\", name: \"Bicycle\" },\n { id: \"car\", name: \"Car\" },\n { id: \"motorcycle\", name: \"Motorcycle\" },\n { id: \"airplane\", name: \"Airplane\" },\n { id: \"bus\", name: \"Bus\" },\n { id: \"train\", name: \"Train\" },\n { id: \"truck\", name: \"Truck\" },\n { id: \"boat\", name: \"Boat\" },\n { id: \"traffic light\", name: \"Traffic Light\" },\n { id: \"fire hydrant\", name: \"Fire Hydrant\" },\n { id: \"stop sign\", name: \"Stop Sign\" },\n { id: \"parking meter\", name: \"Parking Meter\" },\n { id: \"bench\", name: \"Bench\" },\n { id: \"bird\", name: \"Bird\" },\n { id: \"cat\", name: \"Cat\" },\n { id: \"dog\", name: \"Dog\" },\n { id: \"horse\", name: \"Horse\" },\n { id: \"sheep\", name: \"Sheep\" },\n { id: \"cow\", name: \"Cow\" },\n { id: \"elephant\", name: \"Elephant\" },\n { id: \"bear\", name: \"Bear\" },\n { id: \"zebra\", name: \"Zebra\" },\n { id: \"giraffe\", name: \"Giraffe\" },\n { id: \"backpack\", name: \"Backpack\" },\n { id: \"umbrella\", name: \"Umbrella\" },\n { id: \"handbag\", name: \"Handbag\" },\n { id: \"tie\", name: \"Tie\" },\n { id: \"suitcase\", name: \"Suitcase\" },\n { id: \"frisbee\", name: \"Frisbee\" },\n { id: \"skis\", name: \"Skis\" },\n { id: \"snowboard\", name: \"Snowboard\" },\n { id: \"sports ball\", name: \"Sports Ball\" },\n { id: \"kite\", name: \"Kite\" },\n { id: \"baseball bat\", name: \"Baseball Bat\" },\n { id: \"baseball glove\", name: \"Baseball Glove\" },\n { id: \"skateboard\", name: \"Skateboard\" },\n { id: \"surfboard\", name: \"Surfboard\" },\n { id: \"tennis racket\", name: \"Tennis Racket\" },\n { id: \"bottle\", name: \"Bottle\" },\n { id: \"wine glass\", name: \"Wine Glass\" },\n { id: \"cup\", name: \"Cup\" },\n { id: \"fork\", name: \"Fork\" },\n { id: \"knife\", name: \"Knife\" },\n { id: \"spoon\", name: \"Spoon\" },\n { id: \"bowl\", name: \"Bowl\" },\n { id: \"banana\", name: \"Banana\" },\n { id: \"apple\", name: \"Apple\" },\n { id: \"sandwich\", name: \"Sandwich\" },\n { id: \"orange\", name: \"Orange\" },\n { id: \"broccoli\", name: \"Broccoli\" },\n { id: \"carrot\", name: \"Carrot\" },\n { id: \"hot dog\", name: \"Hot Dog\" },\n { id: \"pizza\", name: \"Pizza\" },\n { id: \"donut\", name: \"Donut\" },\n { id: \"cake\", name: \"Cake\" },\n { id: \"chair\", name: \"Chair\" },\n { id: \"couch\", name: \"Couch\" },\n { id: \"potted plant\", name: \"Potted Plant\" },\n { id: \"bed\", name: \"Bed\" },\n { id: \"dining table\", name: \"Dining Table\" },\n { id: \"toilet\", name: \"Toilet\" },\n { id: \"tv\", name: \"TV\" },\n { id: \"laptop\", name: \"Laptop\" },\n { id: \"mouse\", name: \"Mouse\" },\n { id: \"remote\", name: \"Remote\" },\n { id: \"keyboard\", name: \"Keyboard\" },\n { id: \"cell phone\", name: \"Cell Phone\" },\n { id: \"microwave\", name: \"Microwave\" },\n { id: \"oven\", name: \"Oven\" },\n { id: \"toaster\", name: \"Toaster\" },\n { id: \"sink\", name: \"Sink\" },\n { id: \"refrigerator\", name: \"Refrigerator\" },\n { id: \"book\", name: \"Book\" },\n { id: \"clock\", name: \"Clock\" },\n { id: \"vase\", name: \"Vase\" },\n { id: \"scissors\", name: \"Scissors\" },\n { id: \"teddy bear\", name: \"Teddy Bear\" },\n { id: \"hair drier\", name: \"Hair Drier\" },\n { id: \"toothbrush\", name: \"Toothbrush\" }\n];\nconst MACRO_LABELS = [\n { id: \"person\", name: \"Person\" },\n { id: \"vehicle\", name: \"Vehicle\" },\n { id: \"animal\", name: \"Animal\" }\n];\nconst COCO_TO_MACRO = {\n mapping: {\n person: \"person\",\n bicycle: \"vehicle\",\n car: \"vehicle\",\n motorcycle: \"vehicle\",\n airplane: \"vehicle\",\n bus: \"vehicle\",\n train: \"vehicle\",\n truck: \"vehicle\",\n boat: \"vehicle\",\n bird: \"animal\",\n cat: \"animal\",\n dog: \"animal\",\n horse: \"animal\",\n sheep: \"animal\",\n cow: \"animal\",\n elephant: \"animal\",\n bear: \"animal\",\n zebra: \"animal\",\n giraffe: \"animal\"\n },\n // Today the pipeline only supports the three macro classes. Any other\n // COCO class (carrot, umbrella, spoon, …) is dropped upstream in the\n // executor instead of leaking through as a `macroClass: \"carrot\"`\n // detection with no child routing. When support for additional COCO\n // classes lands, either add them to `mapping` (mapped to a new macro)\n // or flip this back to `true` and teach `matchesMacroFilter` to handle\n // the raw-COCO case.\n preserveOriginal: false\n};\nconst DEVICE_TYPE_INFO = {\n [\n \"camera\"\n /* Camera */\n ]: { type: \"camera\", label: \"Camera\", icon: \"camera\" }\n};\nclass DeviceConfig {\n schema;\n data;\n persistFn;\n constructor(schema, data, persist) {\n this.schema = schema;\n this.data = data;\n this.persistFn = persist;\n }\n /**\n * Build a `DeviceConfig` from a persisted blob, with automatic\n * recovery from schema-validation failures. Boot must never be\n * blocked by stale persisted values: if Zod rejects the blob,\n * we drop every offending top-level field, retry, and persist\n * the cleaned blob so the bad value is healed in the DB on next\n * write. The most common trigger is a tightened range constraint\n * (e.g. `max(100) → max(50)`) on a field that already has an\n * out-of-range value persisted from the previous schema. Without\n * this safety net, the device would fail to instantiate and end\n * up with no caps registered — exactly the failure mode that\n * stranded device 15 when `motionSensitivity: 90` no longer fit\n * the new `1..50` schema.\n *\n * Recovery rules:\n * 1. Try `safeParse(initialData)`. If it succeeds, done.\n * 2. On failure, walk `error.issues`, collect the top-level path\n * of each issue, and drop those keys from `initialData`.\n * 3. Re-run `safeParse`. If the cleaned blob now passes (Zod\n * fills the missing keys with schema defaults / undefined for\n * `.optional()`), persist it via `persist()` so the bad\n * values disappear from the DB, and return the device.\n * 4. If the cleaned blob STILL fails (very rare — would require\n * a non-recoverable required field), fall back to\n * `schema.parse({})` so the device still boots with pure\n * schema defaults. Persist nothing in that path so the next\n * successful `setAll` still writes a coherent blob.\n */\n static fromSchema(schema, persist, initialData = {}, onRecover) {\n const first = schema.safeParse(initialData);\n if (first.success) {\n return new DeviceConfig(schema, first.data, persist);\n }\n const droppedKeys = /* @__PURE__ */ new Set();\n for (const issue of first.error.issues) {\n const top = issue.path[0];\n if (typeof top === \"string\") droppedKeys.add(top);\n }\n const cleaned = { ...initialData };\n for (const k of droppedKeys) delete cleaned[k];\n const second = schema.safeParse(cleaned);\n onRecover?.({\n droppedKeys: [...droppedKeys],\n issues: first.error.issues\n });\n if (second.success) {\n void persist(second.data).catch(() => {\n });\n return new DeviceConfig(schema, second.data, persist);\n }\n const defaults = schema.parse({});\n return new DeviceConfig(schema, defaults, persist);\n }\n get values() {\n return this.data;\n }\n get(key) {\n return this.data[key];\n }\n async set(key, value) {\n const next = this.schema.parse({ ...this.data, [key]: value });\n this.data = next;\n await this.persistFn(this.data);\n }\n /**\n * Merge an untyped patch onto the current config and persist. Accepts\n * `Record<string, unknown>` because the patch typically comes from the\n * UI form layer (a `ConfigField.key → value` map) where the caller\n * doesn't hold the Zod schema's static type. Runtime validation is\n * authoritative: `this.schema.parse` rejects unknown keys or invalid\n * shapes before touching storage.\n */\n async setAll(partial) {\n const next = this.schema.parse({ ...this.data, ...partial });\n this.data = next;\n await this.persistFn(this.data);\n }\n async deleteKey(key) {\n const { [key]: _, ...rest } = this.data;\n const next = this.schema.parse(rest);\n this.data = next;\n await this.persistFn(this.data);\n }\n entries() {\n const shape = this.schema.shape;\n return Object.entries(shape).map(([key, fieldSchema]) => ({\n key,\n schema: fieldSchema,\n value: this.data[key],\n description: fieldSchema.description\n }));\n }\n}\nclass DeviceRuntimeState {\n writer;\n /** In-flight writer promises tracked so `flush()` can await them. */\n pendingWrites = /* @__PURE__ */ new Set();\n /** Per-cap committed slice — after schema validation when known. */\n slices;\n /** Per-cap registered schema (set by `installCapSchema`). */\n schemas = /* @__PURE__ */ new Map();\n listeners = /* @__PURE__ */ new Set();\n capListeners = /* @__PURE__ */ new Map();\n constructor(initial, writer) {\n this.writer = writer;\n this.slices = /* @__PURE__ */ new Map();\n for (const [k, v] of Object.entries(initial)) {\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\n this.slices.set(k, { ...v });\n }\n }\n }\n static fromInitial(initial, writer) {\n return new DeviceRuntimeState(initial, writer);\n }\n installCapSchema(capName, schema) {\n const existing = this.schemas.get(capName);\n if (existing) {\n if (existing !== schema) {\n throw new Error(\n `[DeviceRuntimeState] capability \"${capName}\" registered a different runtime-state schema; each cap must declare ONE shape across every provider`\n );\n }\n return;\n }\n this.schemas.set(capName, schema);\n const stored = this.slices.get(capName);\n if (stored) {\n const result = schema.safeParse(stored);\n if (result.success) {\n this.slices.set(capName, result.data);\n } else {\n this.slices.delete(capName);\n }\n }\n }\n getCapState(capName) {\n const slice = this.slices.get(capName);\n if (!slice) return void 0;\n return Object.freeze({ ...slice });\n }\n getCapField(capName, key) {\n return this.slices.get(capName)?.[key];\n }\n setCapState(capName, value) {\n this.applyCapWrite(\n capName,\n value,\n /* merge */\n false\n );\n }\n patchCapState(capName, partial) {\n this.applyCapWrite(\n capName,\n partial,\n /* merge */\n true\n );\n }\n /**\n * Internal worker. `merge` controls whether `value` replaces or\n * shallow-merges into the existing slice. Schema validation runs\n * on the FINAL composed object regardless.\n */\n applyCapWrite(capName, value, merge) {\n const schema = this.schemas.get(capName);\n if (!schema) {\n throw new Error(\n `[DeviceRuntimeState] no schema registered for cap \"${capName}\" — did the device register it via ctx.registerNativeCap before writing?`\n );\n }\n const current = this.slices.get(capName) ?? {};\n const next = merge ? { ...current, ...value } : { ...value };\n const parsed = schema.parse(next);\n if (shallowEqual(current, parsed)) return;\n this.slices.set(capName, parsed);\n this.fireListeners([capName]);\n const writePromise = this.writer(capName, { ...parsed }).catch(() => {\n });\n this.pendingWrites.add(writePromise);\n void writePromise.finally(() => {\n this.pendingWrites.delete(writePromise);\n });\n }\n fireListeners(changed) {\n const snap = this.snapshot();\n for (const cb2 of this.listeners) {\n try {\n cb2(changed, snap);\n } catch {\n }\n }\n for (const capName of changed) {\n const subs = this.capListeners.get(capName);\n if (!subs) continue;\n const slice = this.getCapState(capName);\n for (const cb2 of subs) {\n try {\n cb2(slice);\n } catch {\n }\n }\n }\n }\n subscribe(cb2) {\n this.listeners.add(cb2);\n return () => {\n this.listeners.delete(cb2);\n };\n }\n subscribeCap(capName, cb2) {\n let subs = this.capListeners.get(capName);\n if (!subs) {\n subs = /* @__PURE__ */ new Set();\n this.capListeners.set(capName, subs);\n }\n const adapter = (slice) => {\n cb2(slice);\n };\n subs.add(adapter);\n return () => {\n const set = this.capListeners.get(capName);\n if (!set) return;\n set.delete(adapter);\n if (set.size === 0) this.capListeners.delete(capName);\n };\n }\n snapshot() {\n const out = {};\n for (const [k, v] of this.slices) out[k] = Object.freeze({ ...v });\n return Object.freeze(out);\n }\n async flush() {\n if (this.pendingWrites.size === 0) return;\n const inflight = [...this.pendingWrites];\n await Promise.allSettled(inflight);\n }\n}\nfunction shallowEqual(a, b) {\n const ak = Object.keys(a);\n const bk2 = Object.keys(b);\n if (ak.length !== bk2.length) return false;\n for (const k of ak) {\n if (a[k] !== b[k]) return false;\n }\n return true;\n}\nconst LAST_FETCHED_FIELD = \"lastFetchedAt\";\nfunction createRuntimeStateBridge(params) {\n const { runtimeState, cap, ownDeviceId, refresh, staleMs, empty } = params;\n const ensureFresh = async () => {\n const slice = runtimeState.getCapState(cap.name);\n const fetchedAt = typeof slice?.[LAST_FETCHED_FIELD] === \"number\" ? slice[LAST_FETCHED_FIELD] : 0;\n if (!slice || Date.now() - fetchedAt > staleMs) await refresh();\n };\n const projectStatus = () => {\n const slice = runtimeState.getCapState(cap.name);\n if (!slice) return empty();\n const { [LAST_FETCHED_FIELD]: _omit, ...rest } = slice;\n return rest;\n };\n const getStatus = async ({ deviceId }) => {\n if (deviceId !== ownDeviceId) {\n throw new Error(`${cap.name}: deviceId mismatch, expected ${ownDeviceId}, got ${deviceId}`);\n }\n await ensureFresh();\n return projectStatus();\n };\n return { ensureFresh, getStatus };\n}\nconst DEVICE_LOCAL_STATE_CAPS = {\n audioMetrics: audioMetricsCapability,\n battery: batteryCapability,\n brightness: brightnessCapability,\n cameraStreams: cameraStreamsCapability,\n deviceDiscovery: deviceDiscoveryCapability,\n deviceStatus: deviceStatusCapability,\n doorbell: doorbellCapability,\n featureProbe: featureProbeCapability,\n motion: motionCapability,\n motionTrigger: motionTriggerCapability,\n motionZones: motionZonesCapability,\n nativeObjectDetection: nativeObjectDetectionCapability,\n privacyMask: privacyMaskCapability,\n ptzAutotrack: ptzAutotrackCapability,\n streamParams: streamParamsCapability,\n switch: switchCapability,\n zoneAnalytics: zoneAnalyticsCapability,\n zoneRules: zoneRulesCapability,\n zones: zonesCapability\n};\nclass BaseDevice {\n id;\n stableId;\n type;\n name;\n parentDeviceId;\n role;\n /**\n * Cap-keyed runtime-state slice is the single source of truth for\n * `online`. Both getter and setter proxy to the slice — drivers can\n * write `this.online = true` ergonomically, and the cap event fires\n * automatically through the runtime-state writer. `markOnline()` is\n * kept as the explicit method form mandated by `IDevice`.\n */\n get online() {\n const slice = this.runtimeState.getCapState(\"device-status\");\n return slice?.online ?? false;\n }\n set online(value) {\n this.markOnline(value);\n }\n /**\n * Generic per-cap runtime-state namespace. One entry per cap with\n * `runtimeState:` declared, auto-generated by codegen — see\n * `device-local-state.ts`. Drivers access via:\n *\n * `this.state.battery.sleeping = true` // patches the battery slice\n * `const pct = this.state.battery.percentage` // reads the battery slice\n * `this.state.deviceStatus.online = true` // mirrors `markOnline(true)`\n *\n * Adding a new cap with `runtimeState:` automatically extends this\n * namespace — drivers don't have to declare proxies. Reads return\n * `undefined` when the slice hasn't been seeded; writes patch via\n * `runtimeState.patchCapState` and validate against the cap's schema\n * (so partial writes need the slice to be seeded with the required\n * fields first — drivers do this on cap registration).\n *\n * For caps not exposed in `DeviceLocalState`, drivers can build their\n * own typed proxy via `this.sliceProxy(cap)`.\n */\n get state() {\n if (!this._stateProxyCache) {\n const cache = {};\n const handler = {\n get: (_target, key) => {\n const k = key;\n if (k in cache) return cache[k];\n const cap = DEVICE_LOCAL_STATE_CAPS[k];\n if (!cap) return void 0;\n const proxy = this.sliceProxy(cap);\n cache[k] = proxy;\n return proxy;\n }\n };\n this._stateProxyCache = new Proxy(cache, handler);\n }\n return this._stateProxyCache;\n }\n _stateProxyCache;\n config;\n /**\n * Per-device runtime state, cap-keyed. Always installed — slices\n * for individual caps materialise as those caps register their\n * native providers (`ctx.registerNativeCap`). The cap's own\n * `runtimeState` schema is the source of truth for the slice\n * shape; drivers don't redeclare it, they just write through.\n *\n * Read: `this.runtimeState.getCapState('battery')` →\n * `{percentage, charging, sleeping, lastUpdated}` for any\n * provider that registers `batteryCapability`.\n * Write: `this.runtimeState.setCapState('battery', { … })`.\n *\n * Cross-process consumers reach this state through the\n * `deviceState` cap router (or via cap-specific events the driver\n * emits — e.g. `battery.onStatusChanged`). The local handle is\n * accessed in-process by the driver to avoid roundtrips.\n */\n runtimeState;\n ctx;\n /**\n * Operator-organisational location label (room / area / zone).\n * Read from `ctx.deviceMeta.location`; mutated via\n * `kernel.devices.setLocation(id, value)`. Free-text — providers\n * don't interpret it; the UI groups devices by this for filters\n * like \"show me all cameras in Kitchen\". `null` when unset.\n */\n location;\n /**\n * Soft-disabled flag. When `true`, the device class is still\n * instantiated and visible in the UI (so the operator can flip\n * back on without re-adding) but lifecycle hooks (publishToBroker,\n * alarm-stream subscribe, …) MUST be gated by the driver to skip\n * work. The `BaseDevice` enforces this by exposing the flag here;\n * it does NOT mutate cap behaviour automatically — drivers consult\n * `this.disabled` at the top of their lifecycle methods. Read from\n * `ctx.deviceMeta.disabled`; mutated via\n * `kernel.devices.setDisabled(id, value)`.\n */\n disabled;\n constructor(ctx, schema, options) {\n this.ctx = ctx;\n this.id = ctx.id;\n this.stableId = ctx.stableId;\n this.type = options.type;\n if (!ctx.deviceMeta) {\n throw new Error(\n `BaseDevice constructor: ctx.deviceMeta is required (id=${ctx.id} stableId=${ctx.stableId})`\n );\n }\n this.name = ctx.deviceMeta.name;\n this.location = ctx.deviceMeta.location;\n this.disabled = ctx.deviceMeta.disabled;\n this.role = options.role;\n this.parentDeviceId = ctx.parentDeviceId;\n const seedData = ctx.persistedConfig ?? {};\n this.config = DeviceConfig.fromSchema(\n schema,\n (data) => ctx.persistConfig(data),\n seedData,\n ({ droppedKeys, issues }) => {\n ctx.logger.warn(\"Device config recovery: dropping invalid persisted fields\", {\n tags: { deviceId: ctx.id, stableId: ctx.stableId },\n meta: {\n droppedKeys: [...droppedKeys],\n firstIssue: issues[0]?.message ?? null\n }\n });\n }\n );\n let cachedProxy = null;\n const writer = async (capName, slice) => {\n if (!cachedProxy) cachedProxy = ctx.fetchDevice(ctx.id);\n const dev = await cachedProxy;\n await dev.deviceState.setCapSlice({ capName, slice });\n };\n const initial = ctx.initialRuntimeState ?? {};\n this.runtimeState = DeviceRuntimeState.fromInitial(initial, writer);\n ctx.bindRuntimeState?.(this.runtimeState);\n ctx.registerNativeCap?.(deviceStatusCapability, {});\n const seed = { online: false, lastChangedAt: Date.now() };\n this.runtimeState.setCapState(\"device-status\", seed);\n ctx.registerNativeCap?.(featureProbeCapability, {});\n const probeSeed = {\n flags: {},\n deviceType: null,\n model: null,\n channelCount: null,\n lastProbedAt: 0,\n lastFetchedAt: 0\n };\n this.runtimeState.setCapState(\"feature-probe\", probeSeed);\n }\n async removeDevice() {\n }\n /**\n * Set the device's online flag. Called by `BaseDeviceProvider` after\n * aggregating per-profile stream-broker health, or directly by drivers\n * that have provider-side liveness signals (e.g. ONVIF heartbeats,\n * Reolink Baichuan firmware push events). Mirrors the new value into\n * the `device-status` runtime-state slice so cross-process consumers\n * pick it up via the standard cap-state channel. Subclasses can\n * override to gate side effects on the transition.\n */\n markOnline(online) {\n if (this.online === online) return;\n const next = { online, lastChangedAt: Date.now() };\n this.runtimeState.setCapState(\"device-status\", next);\n }\n /**\n * Re-publish the device's current `features` array to the persisted\n * meta blob. Drivers call this after a probe finishes when the live\n * `features` getter has gained new flags (e.g. `hasIntercom` flips\n * to true → `DeviceFeature.TwoWayAudio` joins the list).\n *\n * Without this, only the construction-time snapshot is written —\n * `deviceManager.registerDevice` is invoked once per boot, so probe-\n * driven additions don't reach the persisted index until the next\n * server restart, and `getDevice` / `listAll` keep returning the\n * stale list for forked-worker devices (whose live IDevice instance\n * is invisible to the hub registry).\n *\n * Idempotent: re-calling with the same features just no-ops on the\n * persisted meta. Best-effort: lookup or write failures are logged\n * at debug and swallowed — the live `device.features` getter is\n * still authoritative within this process, so callers never block\n * device boot on a meta refresh.\n */\n async refreshFeatures() {\n const api = this.ctx.api;\n const action = api?.deviceManager?.registerDevice;\n if (!action) return;\n try {\n await action.mutate({\n addonId: this.ctx.deviceMeta.addonId,\n stableId: this.stableId,\n id: this.id,\n type: this.type,\n name: this.name,\n parentDeviceId: this.parentDeviceId,\n features: [...this.features],\n // Empty config — the kernel's registerDevice ignores the field\n // when there's no payload (the per-device store is the\n // canonical source after construction).\n config: {}\n });\n } catch (err) {\n }\n }\n /**\n * Typed read-through to a cap-keyed runtime-state slice. Drivers\n * call `this.getCapSlice(batteryCapability)` and the return type\n * is inferred from the cap's `runtimeState` Zod schema — no string\n * key, no manual generic. Returns `null` when the slice hasn't\n * been written yet (e.g. driver hasn't seeded battery yet).\n */\n getCapSlice(cap) {\n const slice = this.runtimeState.getCapState(cap.name);\n return slice ?? null;\n }\n /**\n * Typed writer to a cap-keyed runtime-state slice. Routes through\n * the runtime-state writer (validate → persist → emit cap event).\n * Equivalent to `this.runtimeState.setCapState(cap.name, value)`\n * but with the cap's `runtimeState` schema enforcing the value\n * shape at compile time. Mirrors the symmetry of\n * `getCapSlice` / `setCapSlice` for cross-cap consistency.\n */\n setCapSlice(cap, value) {\n this.runtimeState.setCapState(cap.name, value);\n }\n /**\n * Field-level read/write proxy over a cap's runtime-state slice.\n * Drivers that want ergonomic per-field access declare:\n *\n * ```ts\n * protected battery = this.sliceProxy(batteryCapability)\n * // …\n * this.battery.sleeping = true // patches the slice\n * const charging = this.battery.charging // reads the slice\n * ```\n *\n * Reads return `undefined` when the slice hasn't been seeded yet\n * (cap not registered, or seeded but the field is absent). Writes\n * route through `runtimeState.patchCapState` so the cap's `runtimeState`\n * schema validates the merged result and the cap event fires.\n *\n * Pattern is generic — same shape works for `battery`, `device-status`,\n * `motion`, `doorbell`, anything with a `runtimeState:` schema. Drivers\n * declare one proxy per cap they read/write directly.\n */\n sliceProxy(cap) {\n const target = {};\n const handler = {\n get: (_, key) => {\n const slice = this.runtimeState.getCapState(cap.name);\n return slice?.[key];\n },\n set: (_, key, value) => {\n this.runtimeState.patchCapState(cap.name, { [key]: value });\n return true;\n },\n has: (_, key) => {\n const slice = this.runtimeState.getCapState(cap.name);\n return slice ? key in slice : false;\n },\n ownKeys: () => {\n const slice = this.runtimeState.getCapState(cap.name);\n return slice ? Object.keys(slice) : [];\n },\n getOwnPropertyDescriptor: (_, key) => {\n const slice = this.runtimeState.getCapState(cap.name);\n if (!slice || !(key in slice)) return void 0;\n return { configurable: true, enumerable: true, value: slice[key] };\n }\n };\n return new Proxy(target, handler);\n }\n /**\n * Default empty settings UI. Drivers override this to expose an\n * editable form in the device-details page. Returning an empty sections\n * array signals \"nothing to contribute\" — the aggregator drops the\n * contribution entirely rather than rendering a blank panel.\n */\n getSettingsUISchema() {\n return { sections: [] };\n }\n /**\n * Default write path: forward the flat patch directly to storage.\n * Drivers that project a UI shape different from storage (e.g. `RtspCamera`\n * exposing `mainStreamUrl`/`subStreamUrl` over `streams[]`) override this\n * to reshape before `config.setAll`.\n */\n async applySettingsPatch(patch) {\n await this.config.setAll(patch);\n }\n // ── Lifecycle hooks ────────────────────────────────────────────────\n //\n // The kernel orchestrates the device lifecycle in distinct phases.\n // Drivers override only the hooks they need:\n //\n // 1. Construct — `new DeviceClass(ctx)` (sync)\n // 2. RegisterIdentity — kernel writes meta + id to device-manager\n // 3. Probe — `onProbe()` populates `feature-probe` slice\n // 4. ReconcileAccessories — kernel calls `getAccessoryChildren()`\n // (sees post-probe flags), spawns missing,\n // removes orphans, refreshes meta features\n // 5. Activate — `onActivate()` does \"device is live\" work:\n // broker publish, snapshot tabs, watchdogs\n //\n // Failures in `onProbe` / `onActivate` are logged and swallowed — the\n // device IS already registered; partial init shouldn't unwind the\n // create the caller succeeded at.\n /**\n * Phase 3 — populate device-scoped state needed by downstream phases\n * (accessory reconciliation, public `features` array, optional cap\n * registration). Called ONCE per construction, after register but\n * before `getAccessoryChildren()`.\n *\n * Drivers write the `feature-probe` runtime-state slice via\n * `this.runtimeState.setCapState('feature-probe', {...})` — flag bag\n * is open (Reolink writes `hasPtz/hasIntercom`, Hikvision writes\n * `hasSupplementalLight/hasAlarmIo`, etc).\n *\n * Default: no-op (driver had no probe to run).\n */\n async onProbe() {\n }\n /**\n * Phase 5 — fired after the device + its accessories are registered.\n * Drivers publish streams to the broker, kick off background tasks,\n * or subscribe to lib events that need a fully-registered device id.\n *\n * Default: no-op.\n *\n * RENAMED FROM `onCreated` (which still exists for back-compat in this\n * pass). The new name reflects the post-probe, post-accessory contract.\n */\n async onActivate() {\n }\n /**\n * Re-run the probe + reconcile accessories + refresh features meta.\n * Drivers call this when device-side state changes (battery cam wakes,\n * firmware update, manual operator trigger).\n *\n * The kernel injects `_kernelReprobe` on registration so this method\n * delegates to the same orchestrator that runs the boot-time phase\n * 3 + 4 sequence. Drivers should NOT override this — they override\n * `onProbe()` instead.\n */\n async reprobe() {\n if (this._kernelReprobe) await this._kernelReprobe();\n else await this.onProbe();\n }\n /**\n * Kernel-injected callback that runs the full post-probe orchestration\n * (onProbe → registerDevice meta refresh → accessory reconciliation).\n * Set by `device-cap-proxy.register()`. Drivers should not touch this\n * directly — call `reprobe()` instead.\n */\n _kernelReprobe;\n /**\n * Declare accessory child devices the kernel should auto-spawn\n * after `onProbe()` resolves. Each spec fully describes one child\n * — stableId suffix (deterministic per kind for restore-safety),\n * meta (type / name / location), config (initial blob the child\n * self-hydrates), and a factory that constructs the concrete\n * class with whatever closure-captured refs it needs (typically\n * `this` for the parent reference).\n *\n * The kernel handles the rest: allocateDeviceId, persistInitialConfig\n * (skipped on restore when the row already exists),\n * persistInitialMeta, createContext, factory invocation, register,\n * and recursive lifecycle (probe + accessories + activate).\n *\n * Implementations should derive children from\n * `this.runtimeState.getCapState('feature-probe')` (post-probe truth).\n * Drivers can use the `getProbeFlags()` helper to read the flag bag\n * with a typed cast.\n *\n * Default: no children.\n */\n getAccessoryChildren() {\n return [];\n }\n /**\n * Read the current feature-probe flag bag with a typed cast. Helper\n * for `getAccessoryChildren()` and `features` getters that derive\n * outputs from the probe results.\n */\n getProbeFlags() {\n const slice = this.runtimeState.getCapState(\"feature-probe\");\n return slice?.flags ?? {};\n }\n /**\n * Returns true once `onProbe` has completed at least once\n * (`lastProbedAt > 0`). Drivers gate `getAccessoryChildren()` on this\n * to avoid spawning stale accessories on a fresh device whose probe\n * hasn't landed yet.\n */\n hasProbed() {\n const slice = this.runtimeState.getCapState(\"feature-probe\");\n return (slice?.lastProbedAt ?? 0) > 0;\n }\n}\nfunction toDeviceSummary(device, addonId) {\n const config = {};\n for (const entry of device.config.entries()) {\n config[entry.key] = entry.value;\n }\n return {\n id: device.id,\n stableId: device.stableId,\n addonId,\n type: String(device.type),\n name: device.name,\n parentDeviceId: device.parentDeviceId,\n online: device.online,\n features: [...device.features],\n config\n };\n}\nclass BaseDeviceProvider extends BaseAddon {\n // ── Lifecycle (BaseAddon hooks) ─────────────────────────────────────\n async onInitialize() {\n this.ctx.logger.info(`${this.providerName} Provider initialized`);\n return [{ capability: deviceProviderCapability, provider: this }];\n }\n async onShutdown() {\n const devices = await this.ctx.kernel.devices?.getAll() ?? [];\n for (const device of devices) {\n try {\n await this.ctx.kernel.devices?.decommission(device.id);\n } catch (err) {\n this.ctx.logger.warn(`${this.providerName}: decommission failed`, {\n tags: { deviceId: device.id, stableId: device.stableId },\n meta: { error: err instanceof Error ? err.message : String(err) }\n });\n }\n }\n this.ctx.logger.info(`${this.providerName} Provider shut down`, {\n meta: { decommissionedCount: devices.length }\n });\n }\n // ── device-provider cap — lifecycle + introspection ─────────────────\n // Default implementations. Override in subclass if needed.\n async start() {\n }\n async stop() {\n }\n async getStatus() {\n const all = await this.ctx.kernel.devices?.getAll() ?? [];\n return { connected: true, deviceCount: all.length };\n }\n async getDevices() {\n const all = await this.ctx.kernel.devices?.getAll() ?? [];\n return all.map((d) => ({ id: d.stableId, name: d.name, type: String(d.type) }));\n }\n // ── device-provider cap — discovery ─────────────────────────────────\n // Default: no discovery. Override in providers that support it (ONVIF).\n async supportsDiscovery() {\n return false;\n }\n async discoverDevices() {\n return [];\n }\n async adoptDiscoveredDevice(_input) {\n throw new Error(`${this.providerName} provider does not support discovery-based adoption`);\n }\n // ── device-provider cap — manual creation ───────────────────────────\n // Default: supports manual creation. Subclass must implement\n // onGetCreationSchema and onCreateDevice.\n async supportsManualCreation() {\n return true;\n }\n async getChildCreationSchema(input) {\n return this.onGetCreationSchema(input.type);\n }\n /**\n * Default kernel-orchestrated `createDevice` implementation. The\n * subclass's `onCreateDevice` returns a declarative\n * `CreateDeviceSpec` (`{meta, config}`) — this method handles\n * stableId generation, class lookup, kernel.devices.create\n * dispatch, and DeviceSummary mapping. Subclasses should NOT\n * override this method; override `onCreateDevice` and\n * `deviceClasses` instead.\n */\n async createDevice(input) {\n const spec = await this.onCreateDevice(input.type, input.config);\n const Class = this.deviceClasses[spec.meta.type];\n if (!Class) {\n throw new Error(\n `${this.providerName} provider: no device class registered for type \"${spec.meta.type}\" — add it to the deviceClasses map`\n );\n }\n const stableId = this.generateStableId(spec.meta.type, spec.config);\n const device = await this.ctx.kernel.devices.create(\n stableId,\n Class,\n spec.config,\n null,\n spec.meta\n );\n if (spec.onAfterCreate) {\n try {\n await spec.onAfterCreate(device);\n } catch (err) {\n this.ctx.logger.warn(\"createDevice: onAfterCreate hook threw — device is already registered\", {\n tags: { deviceId: device.id, stableId },\n meta: { error: err instanceof Error ? err.message : String(err) }\n });\n }\n }\n return this.toSummary(device);\n }\n /**\n * Generate a stableId for a newly-created device. Default uses the\n * `${addonId}-${Date.now()}` pattern as a unique-but-opaque\n * fallback; any provider that has access to durable hardware\n * identity (UID, MAC, serial) should override and derive from it\n * so re-adding the same physical device reuses its persisted row.\n *\n * `config` is the parsed CreateDeviceSpec.config the subclass\n * returned from `onCreateDevice` — the override has access to\n * every operator-supplied + autodetect-resolved field. Optional\n * for back-compat: existing overrides that take only `type`\n * keep working unchanged.\n */\n generateStableId(_type, _config) {\n return `${this.addonId}-${Date.now()}`;\n }\n async testCreationField(_input) {\n return { status: \"ok\", labels: [\"probe not implemented\"] };\n }\n // ── Boot restore ────────────────────────────────────────────────────\n async restoreDevices(savedDevices) {\n await this.onRestoreDevices(savedDevices);\n if (savedDevices.length > 0) {\n this.ctx.logger.info(`Restored ${savedDevices.length} ${this.providerName} device(s)`);\n }\n }\n /**\n * Restore devices from persisted state. Two-pass:\n *\n * 1. **Top-level pass** — invokes `kernel.devices.create()` for every\n * `parentDeviceId === null` row using the `deviceClasses` map.\n * The kernel's register flow handles `getAccessoryChildren()` for\n * each parent (siren / floodlight / PIR / etc).\n *\n * 2. **Hub-adopted children pass** — for rows with\n * `parentDeviceId !== null` whose `type` IS in `deviceClasses`\n * (e.g. Reolink hub-adopted cameras under an NVR), spawn them\n * explicitly with the persisted `parentDeviceId`. These are\n * NOT accessory children — they're first-class adopted devices\n * that just happen to have a parent. Without this pass, every\n * server restart would lose hub-adopted cameras (their type is\n * in `deviceClasses` but parent's `getAccessoryChildren` doesn't\n * spawn them — that callback is only for purpose-built\n * accessory roles).\n *\n * Rows whose `type` is NOT in `deviceClasses` are skipped — those\n * are accessory children (siren/light/sensor) that the kernel's\n * accessory-spawn flow handles via the parent's\n * `getAccessoryChildren()`. Override only when the default doesn't\n * fit.\n */\n async onRestoreDevices(savedDevices) {\n const restored = /* @__PURE__ */ new Set();\n for (const saved of savedDevices) {\n if (saved.parentDeviceId !== null) continue;\n const Class = this.deviceClasses[saved.type];\n if (!Class) {\n this.ctx.logger.warn(\"No device class registered for restored type — skipping\", {\n tags: { stableId: saved.stableId },\n meta: { type: saved.type }\n });\n continue;\n }\n try {\n await this.ctx.kernel.devices.create(saved.stableId, Class, {});\n restored.add(saved.id);\n } catch (err) {\n this.ctx.logger.warn(\"Failed to restore device\", {\n tags: { stableId: saved.stableId },\n meta: { type: saved.type, error: err instanceof Error ? err.message : String(err) }\n });\n }\n }\n const childRows = savedDevices.filter((s) => s.parentDeviceId !== null);\n for (const saved of childRows) {\n const Class = this.deviceClasses[saved.type];\n if (!Class) continue;\n if (saved.parentDeviceId === null) continue;\n if (!restored.has(saved.parentDeviceId)) {\n continue;\n }\n try {\n await this.ctx.kernel.devices.create(\n saved.stableId,\n Class,\n {},\n saved.parentDeviceId\n );\n restored.add(saved.id);\n } catch (err) {\n this.ctx.logger.warn(\"Failed to restore hub-adopted child\", {\n tags: { stableId: saved.stableId, parentDeviceId: saved.parentDeviceId },\n meta: { type: saved.type, error: err instanceof Error ? err.message : String(err) }\n });\n }\n }\n }\n // ── Utility ─────────────────────────────────────────────────────────\n /** Convert an IDevice to the flat DeviceSummary for the cap router. */\n toSummary(device) {\n return toDeviceSummary(device, this.addonId);\n }\n}\nfunction zodDef(schema) {\n return schema.def;\n}\nfunction zodInternals(schema) {\n return schema;\n}\nfunction zodEntriesToConfigUI(entries, sectionTitle = \"Configuration\", sectionId = \"main\") {\n const fields = entries.map(\n (entry) => zodToConfigField(entry.key, entry.schema, entry.description)\n );\n return {\n sections: [\n {\n id: sectionId,\n title: sectionTitle,\n fields\n }\n ]\n };\n}\nfunction zodToConfigField(key, schema, description) {\n const inner = unwrapZod(schema);\n const defaultValue = getZodDefault(schema);\n const label = description ?? humanizeKey(key);\n const base = {\n key,\n label,\n description,\n default: defaultValue\n };\n if (inner instanceof z.ZodString) {\n return buildStringField(key, base);\n }\n if (inner instanceof z.ZodNumber) {\n return buildNumberField(inner, base);\n }\n if (inner instanceof z.ZodBoolean) {\n const field = { ...base, type: \"boolean\" };\n return field;\n }\n if (inner instanceof z.ZodEnum) {\n return buildEnumField(inner, base);\n }\n if (inner instanceof z.ZodArray || inner instanceof z.ZodObject) {\n const field = { ...base, type: \"textarea\", rows: 6, isJson: true };\n return field;\n }\n const fallback = { ...base, type: \"text\" };\n return fallback;\n}\nfunction buildStringField(key, base) {\n const lowerKey = key.toLowerCase();\n const isSecret = lowerKey.includes(\"password\") || lowerKey.includes(\"secret\") || lowerKey.includes(\"token\") || lowerKey.includes(\"apikey\") || lowerKey.includes(\"api_key\");\n if (isSecret) {\n const field2 = { ...base, type: \"password\", showToggle: true };\n return field2;\n }\n const field = { ...base, type: \"text\" };\n return field;\n}\nfunction buildNumberField(inner, base) {\n const anyInner = zodInternals(inner);\n const rawMin = anyInner.minValue;\n const rawMax = anyInner.maxValue;\n const min = rawMin != null && isFinite(rawMin) ? rawMin : void 0;\n const max = rawMax != null && isFinite(rawMax) ? rawMax : void 0;\n const step = getMultipleOfStep(inner);\n const field = {\n ...base,\n type: \"number\",\n ...min !== void 0 ? { min } : {},\n ...max !== void 0 ? { max } : {},\n ...step !== void 0 ? { step } : {}\n };\n return field;\n}\nfunction getMultipleOfStep(inner) {\n const def = zodDef(inner);\n const checks = def.checks ?? [];\n for (const check of checks) {\n if (check._zod?.def?.check === \"multiple_of\" && check._zod.def.value !== void 0) {\n return check._zod.def.value;\n }\n }\n return void 0;\n}\nfunction buildEnumField(inner, base) {\n const values = inner.options.map((v) => String(v));\n const field = {\n ...base,\n type: \"select\",\n options: values.map((v) => ({ label: humanizeKey(v), value: v }))\n };\n return field;\n}\nfunction unwrapZod(schema) {\n if (schema instanceof z.ZodDefault) return unwrapZod(zodDef(schema).innerType);\n if (schema instanceof z.ZodOptional) return unwrapZod(zodDef(schema).innerType);\n if (schema instanceof z.ZodNullable) return unwrapZod(zodDef(schema).innerType);\n return schema;\n}\nfunction getZodDefault(schema) {\n if (schema instanceof z.ZodDefault) {\n return zodDef(schema).defaultValue;\n }\n return void 0;\n}\nfunction humanizeKey(key) {\n return key.replace(/([A-Z])/g, \" $1\").replace(/[_-]/g, \" \").replace(/^\\w/, (c) => c.toUpperCase()).trim();\n}\nconst DEVICE_STATE_EVENT_CATEGORY = \"device.state-changed\";\nfunction createLazyTrpcSource(api) {\n const cache = /* @__PURE__ */ new Map();\n const listeners = /* @__PURE__ */ new Map();\n let bridge = null;\n const keyOf = (deviceId, capName) => `${deviceId}:${capName}`;\n const ensureBridge = () => {\n if (bridge) return;\n if (!api.live?.onEvent) return;\n bridge = api.live.onEvent.subscribe(\n { category: DEVICE_STATE_EVENT_CATEGORY },\n {\n onData: (evt) => {\n const data = evt.data;\n if (!data || typeof data.deviceId !== \"number\" || typeof data.capName !== \"string\") return;\n const k = keyOf(data.deviceId, data.capName);\n cache.set(k, data.slice);\n const set = listeners.get(k);\n if (!set) return;\n for (const cb2 of set) {\n try {\n cb2(data.slice);\n } catch {\n }\n }\n }\n }\n );\n };\n const closeBridgeIfIdle = () => {\n if (!bridge) return;\n if (listeners.size > 0) return;\n bridge.unsubscribe();\n bridge = null;\n };\n return {\n read(deviceId, capName) {\n return cache.get(keyOf(deviceId, capName));\n },\n async refresh(deviceId, capName) {\n const slice = await api.deviceState.getCapSlice.query({ deviceId, capName });\n const k = keyOf(deviceId, capName);\n cache.set(k, slice ?? void 0);\n const set = listeners.get(k);\n if (set) {\n for (const cb2 of set) {\n try {\n cb2(slice ?? void 0);\n } catch {\n }\n }\n }\n },\n watch(deviceId, capName, cb2) {\n const k = keyOf(deviceId, capName);\n let set = listeners.get(k);\n if (!set) {\n set = /* @__PURE__ */ new Set();\n listeners.set(k, set);\n }\n set.add(cb2);\n ensureBridge();\n return () => {\n set.delete(cb2);\n if (set.size === 0) listeners.delete(k);\n closeBridgeIfIdle();\n };\n },\n async write(deviceId, capName, slice) {\n await api.deviceState.setCapSlice.mutate({ deviceId, capName, slice });\n }\n };\n}\nfunction createMirrorSource(mirror, listeners, api) {\n const keyOf = (deviceId, capName) => `${deviceId}:${capName}`;\n return {\n read(deviceId, capName) {\n return mirror.get(deviceId)?.get(capName);\n },\n async refresh() {\n },\n watch(deviceId, capName, cb2) {\n const k = keyOf(deviceId, capName);\n let set = listeners.get(k);\n if (!set) {\n set = /* @__PURE__ */ new Set();\n listeners.set(k, set);\n }\n set.add(cb2);\n return () => {\n set.delete(cb2);\n if (set.size === 0) listeners.delete(k);\n };\n },\n async write(deviceId, capName, slice) {\n if (!api) {\n throw new Error(\"createMirrorSource: write requires an api reference — pass it as the third argument when constructing the source\");\n }\n await api.deviceState.setCapSlice.mutate({ deviceId, capName, slice });\n }\n };\n}\nfunction createSliceHandle(source, deviceId, capName) {\n const src = isSource(source) ? source : createLazyTrpcSource(source);\n return {\n get value() {\n return src.read(deviceId, capName);\n },\n refresh() {\n return src.refresh(deviceId, capName);\n },\n subscribe(cb2) {\n const unwatch = src.watch(deviceId, capName, (slice) => {\n try {\n cb2(slice);\n } catch {\n }\n });\n try {\n cb2(src.read(deviceId, capName));\n } catch {\n }\n if (src.read(deviceId, capName) === void 0) {\n void src.refresh(deviceId, capName).catch(() => void 0);\n }\n return unwatch;\n },\n async set(slice) {\n await src.write(deviceId, capName, slice);\n },\n async patch(partial) {\n const current = src.read(deviceId, capName);\n const next = { ...current ?? {}, ...partial };\n await src.write(deviceId, capName, next);\n }\n };\n}\nfunction isSource(x) {\n return typeof x.read === \"function\" && typeof x.watch === \"function\";\n}\nfunction createDeviceProxy(api, binding, opts) {\n const typedApi = api;\n const stateSource = opts?.stateSource ?? createLazyTrpcSource(api);\n function mergeInput(input, nodeId) {\n const base = typeof input === \"object\" && input !== null ? input : {};\n return nodeId !== void 0 ? { ...base, deviceId: binding.deviceId, nodeId } : { ...base, deviceId: binding.deviceId };\n }\n function callLeaf(capProp, method, kind, merged, push) {\n const leaf = typedApi[capProp]?.[method];\n if (!leaf) throw new Error(`DeviceProxy: api has no '${capProp}.${method}'`);\n const fn2 = leaf;\n if (kind === \"mutation\") return fn2.mutate(merged);\n if (kind === \"subscription\") return fn2.subscribe(merged, push);\n return fn2.query(merged);\n }\n function dispatch(capName, capProp, method, kind, input, push) {\n const entry = binding.entries.find((e) => e.capName === capName);\n return callLeaf(capProp, method, kind, mergeInput(input, entry?.providerNodeId), push);\n }\n function dispatchSystem(capProp, method, kind, input, push) {\n return callLeaf(capProp, method, kind, mergeInput(input, void 0), push);\n }\n const accessoriesInterface = {\n getStatus: (input) => dispatch(\"accessories\", \"accessories\", \"getStatus\", \"query\", input)\n };\n const audioAnalysisInterface = {\n resolveDeviceSettings: (input) => dispatch(\"audio-analysis\", \"audioAnalysis\", \"resolveDeviceSettings\", \"query\", input),\n getDeviceSettingsContribution: (input) => dispatch(\"audio-analysis\", \"audioAnalysis\", \"getDeviceSettingsContribution\", \"query\", input),\n getDeviceLiveContribution: (input) => dispatch(\"audio-analysis\", \"audioAnalysis\", \"getDeviceLiveContribution\", \"query\", input),\n applyDeviceSettingsPatch: (input) => dispatch(\"audio-analysis\", \"audioAnalysis\", \"applyDeviceSettingsPatch\", \"mutation\", input)\n };\n const audioMetricsInterface = {\n getCurrentSnapshot: (input) => dispatch(\"audio-metrics\", \"audioMetrics\", \"getCurrentSnapshot\", \"query\", input),\n getHistory: (input) => dispatch(\"audio-metrics\", \"audioMetrics\", \"getHistory\", \"query\", input)\n };\n const batteryInterface = {\n getStatus: (input) => dispatch(\"battery\", \"battery\", \"getStatus\", \"query\", input)\n };\n const brightnessInterface = {\n setBrightness: (input) => dispatch(\"brightness\", \"brightness\", \"setBrightness\", \"mutation\", input),\n getStatus: (input) => dispatch(\"brightness\", \"brightness\", \"getStatus\", \"query\", input)\n };\n const cameraCredentialsInterface = {\n getCredentials: (input) => dispatch(\"camera-credentials\", \"cameraCredentials\", \"getCredentials\", \"query\", input),\n getStatus: (input) => dispatch(\"camera-credentials\", \"cameraCredentials\", \"getStatus\", \"query\", input)\n };\n const cameraStreamsInterface = {\n getCameraStreams: (input) => dispatch(\"camera-streams\", \"cameraStreams\", \"getCameraStreams\", \"query\", input),\n getBrokerStreams: (input) => dispatch(\"camera-streams\", \"cameraStreams\", \"getBrokerStreams\", \"query\", input),\n getRtspEntries: (input) => dispatch(\"camera-streams\", \"cameraStreams\", \"getRtspEntries\", \"query\", input)\n };\n const detectionPipelineInterface = {\n getDeviceSettingsContribution: (input) => dispatch(\"detection-pipeline\", \"detectionPipeline\", \"getDeviceSettingsContribution\", \"query\", input),\n getDeviceLiveContribution: (input) => dispatch(\"detection-pipeline\", \"detectionPipeline\", \"getDeviceLiveContribution\", \"query\", input),\n applyDeviceSettingsPatch: (input) => dispatch(\"detection-pipeline\", \"detectionPipeline\", \"applyDeviceSettingsPatch\", \"mutation\", input)\n };\n const deviceDiscoveryInterface = {\n listDiscovered: (input) => dispatch(\"device-discovery\", \"deviceDiscovery\", \"listDiscovered\", \"query\", input),\n refreshDiscovery: (input) => dispatch(\"device-discovery\", \"deviceDiscovery\", \"refreshDiscovery\", \"mutation\", input),\n adoptDevice: (input) => dispatch(\"device-discovery\", \"deviceDiscovery\", \"adoptDevice\", \"mutation\", input),\n releaseDevice: (input) => dispatch(\"device-discovery\", \"deviceDiscovery\", \"releaseDevice\", \"mutation\", input),\n getStatus: (input) => dispatch(\"device-discovery\", \"deviceDiscovery\", \"getStatus\", \"query\", input)\n };\n const deviceOpsInterface = {\n getStreamSources: (input) => dispatch(\"device-ops\", \"deviceOps\", \"getStreamSources\", \"query\", input),\n getConfigEntries: (input) => dispatch(\"device-ops\", \"deviceOps\", \"getConfigEntries\", \"query\", input),\n setConfig: (input) => dispatch(\"device-ops\", \"deviceOps\", \"setConfig\", \"mutation\", input),\n removeDevice: (input) => dispatch(\"device-ops\", \"deviceOps\", \"removeDevice\", \"mutation\", input),\n getSettingsSchema: (input) => dispatch(\"device-ops\", \"deviceOps\", \"getSettingsSchema\", \"query\", input)\n };\n const deviceStatusInterface = {\n getStatus: (input) => dispatch(\"device-status\", \"deviceStatus\", \"getStatus\", \"query\", input)\n };\n const doorbellInterface = {\n getStatus: (input) => dispatch(\"doorbell\", \"doorbell\", \"getStatus\", \"query\", input)\n };\n const eventsInterface = {\n getEvents: (input) => dispatch(\"events\", \"events\", \"getEvents\", \"query\", input),\n getEventThumbnail: (input) => dispatch(\"events\", \"events\", \"getEventThumbnail\", \"query\", input),\n getEventClipUrl: (input) => dispatch(\"events\", \"events\", \"getEventClipUrl\", \"query\", input)\n };\n const featureProbeInterface = {\n getStatus: (input) => dispatch(\"feature-probe\", \"featureProbe\", \"getStatus\", \"query\", input)\n };\n const intercomInterface = {\n startSession: (input) => dispatch(\"intercom\", \"intercom\", \"startSession\", \"mutation\", input),\n handleAnswer: (input) => dispatch(\"intercom\", \"intercom\", \"handleAnswer\", \"mutation\", input),\n stopSession: (input) => dispatch(\"intercom\", \"intercom\", \"stopSession\", \"mutation\", input),\n startTalkSession: (input) => dispatch(\"intercom\", \"intercom\", \"startTalkSession\", \"mutation\", input),\n pushTalkPcm: (input) => dispatch(\"intercom\", \"intercom\", \"pushTalkPcm\", \"mutation\", input),\n endTalkSession: (input) => dispatch(\"intercom\", \"intercom\", \"endTalkSession\", \"mutation\", input),\n getStatus: (input) => dispatch(\"intercom\", \"intercom\", \"getStatus\", \"query\", input)\n };\n const motionInterface = {\n isDetected: (input) => dispatch(\"motion\", \"motion\", \"isDetected\", \"query\", input),\n getStatus: (input) => dispatch(\"motion\", \"motion\", \"getStatus\", \"query\", input)\n };\n const motionDetectionInterface = {\n analyze: (input) => dispatch(\"motion-detection\", \"motionDetection\", \"analyze\", \"mutation\", input),\n removeCamera: (input) => dispatch(\"motion-detection\", \"motionDetection\", \"removeCamera\", \"mutation\", input),\n reset: (input) => dispatch(\"motion-detection\", \"motionDetection\", \"reset\", \"mutation\", input),\n getDeviceSettingsContribution: (input) => dispatch(\"motion-detection\", \"motionDetection\", \"getDeviceSettingsContribution\", \"query\", input),\n getDeviceLiveContribution: (input) => dispatch(\"motion-detection\", \"motionDetection\", \"getDeviceLiveContribution\", \"query\", input),\n applyDeviceSettingsPatch: (input) => dispatch(\"motion-detection\", \"motionDetection\", \"applyDeviceSettingsPatch\", \"mutation\", input)\n };\n const motionTriggerInterface = {\n setMotionTrigger: (input) => dispatch(\"motion-trigger\", \"motionTrigger\", \"setMotionTrigger\", \"mutation\", input),\n getStatus: (input) => dispatch(\"motion-trigger\", \"motionTrigger\", \"getStatus\", \"query\", input)\n };\n const motionZonesInterface = {\n getOptions: (input) => dispatch(\"motion-zones\", \"motionZones\", \"getOptions\", \"query\", input),\n setZone: (input) => dispatch(\"motion-zones\", \"motionZones\", \"setZone\", \"mutation\", input),\n getStatus: (input) => dispatch(\"motion-zones\", \"motionZones\", \"getStatus\", \"query\", input)\n };\n const nativeObjectDetectionInterface = {\n setEnabled: (input) => dispatch(\"native-object-detection\", \"nativeObjectDetection\", \"setEnabled\", \"mutation\", input),\n getStatus: (input) => dispatch(\"native-object-detection\", \"nativeObjectDetection\", \"getStatus\", \"query\", input)\n };\n const osdInterface = {\n setOverlay: (input) => dispatch(\"osd\", \"osd\", \"setOverlay\", \"mutation\", input),\n getStatus: (input) => dispatch(\"osd\", \"osd\", \"getStatus\", \"query\", input)\n };\n const pipelineAnalyticsInterface = {\n getActiveTracks: (input) => dispatch(\"pipeline-analytics\", \"pipelineAnalytics\", \"getActiveTracks\", \"query\", input),\n getTrack: (input) => dispatch(\"pipeline-analytics\", \"pipelineAnalytics\", \"getTrack\", \"query\", input),\n listTracks: (input) => dispatch(\"pipeline-analytics\", \"pipelineAnalytics\", \"listTracks\", \"query\", input),\n clearTracks: (input) => dispatch(\"pipeline-analytics\", \"pipelineAnalytics\", \"clearTracks\", \"mutation\", input),\n getMotionEvents: (input) => dispatch(\"pipeline-analytics\", \"pipelineAnalytics\", \"getMotionEvents\", \"query\", input),\n getObjectEvents: (input) => dispatch(\"pipeline-analytics\", \"pipelineAnalytics\", \"getObjectEvents\", \"query\", input),\n getAudioEvents: (input) => dispatch(\"pipeline-analytics\", \"pipelineAnalytics\", \"getAudioEvents\", \"query\", input),\n getEventMedia: (input) => dispatch(\"pipeline-analytics\", \"pipelineAnalytics\", \"getEventMedia\", \"query\", input),\n getTrackMedia: (input) => dispatch(\"pipeline-analytics\", \"pipelineAnalytics\", \"getTrackMedia\", \"query\", input),\n getDeviceSettingsContribution: (input) => dispatch(\"pipeline-analytics\", \"pipelineAnalytics\", \"getDeviceSettingsContribution\", \"query\", input),\n getDeviceLiveContribution: (input) => dispatch(\"pipeline-analytics\", \"pipelineAnalytics\", \"getDeviceLiveContribution\", \"query\", input),\n applyDeviceSettingsPatch: (input) => dispatch(\"pipeline-analytics\", \"pipelineAnalytics\", \"applyDeviceSettingsPatch\", \"mutation\", input)\n };\n const privacyMaskInterface = {\n getOptions: (input) => dispatch(\"privacy-mask\", \"privacyMask\", \"getOptions\", \"query\", input),\n setMask: (input) => dispatch(\"privacy-mask\", \"privacyMask\", \"setMask\", \"mutation\", input),\n getStatus: (input) => dispatch(\"privacy-mask\", \"privacyMask\", \"getStatus\", \"query\", input)\n };\n const ptzInterface = {\n move: (input) => dispatch(\"ptz\", \"ptz\", \"move\", \"mutation\", input),\n continuousMove: (input) => dispatch(\"ptz\", \"ptz\", \"continuousMove\", \"mutation\", input),\n stop: (input) => dispatch(\"ptz\", \"ptz\", \"stop\", \"mutation\", input),\n getPresets: (input) => dispatch(\"ptz\", \"ptz\", \"getPresets\", \"query\", input),\n goToPreset: (input) => dispatch(\"ptz\", \"ptz\", \"goToPreset\", \"mutation\", input),\n savePreset: (input) => dispatch(\"ptz\", \"ptz\", \"savePreset\", \"mutation\", input),\n deletePreset: (input) => dispatch(\"ptz\", \"ptz\", \"deletePreset\", \"mutation\", input),\n getOptions: (input) => dispatch(\"ptz\", \"ptz\", \"getOptions\", \"query\", input),\n goHome: (input) => dispatch(\"ptz\", \"ptz\", \"goHome\", \"mutation\", input),\n getPosition: (input) => dispatch(\"ptz\", \"ptz\", \"getPosition\", \"query\", input),\n setAutofocus: (input) => dispatch(\"ptz\", \"ptz\", \"setAutofocus\", \"mutation\", input),\n getStatus: (input) => dispatch(\"ptz\", \"ptz\", \"getStatus\", \"query\", input)\n };\n const ptzAutotrackInterface = {\n getStatus: (input) => dispatch(\"ptz-autotrack\", \"ptzAutotrack\", \"getStatus\", \"query\", input),\n setEnabled: (input) => dispatch(\"ptz-autotrack\", \"ptzAutotrack\", \"setEnabled\", \"mutation\", input),\n getSettings: (input) => dispatch(\"ptz-autotrack\", \"ptzAutotrack\", \"getSettings\", \"query\", input),\n setSettings: (input) => dispatch(\"ptz-autotrack\", \"ptzAutotrack\", \"setSettings\", \"mutation\", input)\n };\n const rebootInterface = {\n reboot: (input) => dispatch(\"reboot\", \"reboot\", \"reboot\", \"mutation\", input)\n };\n const recordingInterface = {\n getSegments: (input) => dispatch(\"recording\", \"recording\", \"getSegments\", \"query\", input),\n getPlaybackUrl: (input) => dispatch(\"recording\", \"recording\", \"getPlaybackUrl\", \"query\", input),\n getThumbnailAt: (input) => dispatch(\"recording\", \"recording\", \"getThumbnailAt\", \"query\", input)\n };\n const snapshotInterface = {\n getSnapshot: (input) => dispatch(\"snapshot\", \"snapshot\", \"getSnapshot\", \"query\", input),\n invalidateCache: (input) => dispatch(\"snapshot\", \"snapshot\", \"invalidateCache\", \"mutation\", input),\n getStatus: (input) => dispatch(\"snapshot\", \"snapshot\", \"getStatus\", \"query\", input),\n getDeviceSettingsContribution: (input) => dispatch(\"snapshot\", \"snapshot\", \"getDeviceSettingsContribution\", \"query\", input),\n getDeviceLiveContribution: (input) => dispatch(\"snapshot\", \"snapshot\", \"getDeviceLiveContribution\", \"query\", input),\n applyDeviceSettingsPatch: (input) => dispatch(\"snapshot\", \"snapshot\", \"applyDeviceSettingsPatch\", \"mutation\", input)\n };\n const streamCatalogInterface = {\n getCatalog: (input) => dispatch(\"stream-catalog\", \"streamCatalog\", \"getCatalog\", \"query\", input)\n };\n const streamParamsInterface = {\n getOptions: (input) => dispatch(\"stream-params\", \"streamParams\", \"getOptions\", \"query\", input),\n setProfile: (input) => dispatch(\"stream-params\", \"streamParams\", \"setProfile\", \"mutation\", input),\n getConfigSchema: (input) => dispatch(\"stream-params\", \"streamParams\", \"getConfigSchema\", \"query\", input),\n getStatus: (input) => dispatch(\"stream-params\", \"streamParams\", \"getStatus\", \"query\", input)\n };\n const switchInterface = {\n setState: (input) => dispatch(\"switch\", \"switch\", \"setState\", \"mutation\", input),\n getStatus: (input) => dispatch(\"switch\", \"switch\", \"getStatus\", \"query\", input)\n };\n const webrtcSessionInterface = {\n listStreams: (input) => dispatch(\"webrtc-session\", \"webrtcSession\", \"listStreams\", \"query\", input),\n createSession: (input) => dispatch(\"webrtc-session\", \"webrtcSession\", \"createSession\", \"mutation\", input),\n handleOffer: (input) => dispatch(\"webrtc-session\", \"webrtcSession\", \"handleOffer\", \"mutation\", input),\n handleAnswer: (input) => dispatch(\"webrtc-session\", \"webrtcSession\", \"handleAnswer\", \"mutation\", input),\n addIceCandidate: (input) => dispatch(\"webrtc-session\", \"webrtcSession\", \"addIceCandidate\", \"mutation\", input),\n getIceCandidates: (input) => dispatch(\"webrtc-session\", \"webrtcSession\", \"getIceCandidates\", \"query\", input),\n closeSession: (input) => dispatch(\"webrtc-session\", \"webrtcSession\", \"closeSession\", \"mutation\", input),\n hasAdaptiveBitrate: (input) => dispatch(\"webrtc-session\", \"webrtcSession\", \"hasAdaptiveBitrate\", \"query\", input)\n };\n const zoneAnalyticsInterface = {\n getCurrentSnapshot: (input) => dispatch(\"zone-analytics\", \"zoneAnalytics\", \"getCurrentSnapshot\", \"query\", input),\n getZoneHistory: (input) => dispatch(\"zone-analytics\", \"zoneAnalytics\", \"getZoneHistory\", \"query\", input),\n getCameraHistory: (input) => dispatch(\"zone-analytics\", \"zoneAnalytics\", \"getCameraHistory\", \"query\", input),\n getUnzonedHistory: (input) => dispatch(\"zone-analytics\", \"zoneAnalytics\", \"getUnzonedHistory\", \"query\", input)\n };\n const zoneRulesInterface = {\n listRules: (input) => dispatch(\"zone-rules\", \"zoneRules\", \"listRules\", \"query\", input),\n setRules: (input) => dispatch(\"zone-rules\", \"zoneRules\", \"setRules\", \"mutation\", input)\n };\n const zonesInterface = {\n listZones: (input) => dispatch(\"zones\", \"zones\", \"listZones\", \"query\", input),\n addZone: (input) => dispatch(\"zones\", \"zones\", \"addZone\", \"mutation\", input),\n removeZone: (input) => dispatch(\"zones\", \"zones\", \"removeZone\", \"mutation\", input),\n updateZone: (input) => dispatch(\"zones\", \"zones\", \"updateZone\", \"mutation\", input)\n };\n const addonSettingsInterface = {\n getDeviceSettings: (input) => dispatchSystem(\"addonSettings\", \"getDeviceSettings\", \"query\", input),\n updateDeviceSettings: (input) => dispatchSystem(\"addonSettings\", \"updateDeviceSettings\", \"mutation\", input)\n };\n const cameraPipelineConfigInterface = {\n getDeviceSettingsContribution: (input) => dispatchSystem(\"cameraPipelineConfig\", \"getDeviceSettingsContribution\", \"query\", input),\n getDeviceLiveContribution: (input) => dispatchSystem(\"cameraPipelineConfig\", \"getDeviceLiveContribution\", \"query\", input),\n applyDeviceSettingsPatch: (input) => dispatchSystem(\"cameraPipelineConfig\", \"applyDeviceSettingsPatch\", \"mutation\", input)\n };\n const deviceExportInterface = {\n getDeviceSettingsContribution: (input) => dispatchSystem(\"deviceExport\", \"getDeviceSettingsContribution\", \"query\", input),\n getDeviceLiveContribution: (input) => dispatchSystem(\"deviceExport\", \"getDeviceLiveContribution\", \"query\", input),\n applyDeviceSettingsPatch: (input) => dispatchSystem(\"deviceExport\", \"applyDeviceSettingsPatch\", \"mutation\", input)\n };\n const deviceManagerInterface = {\n loadConfig: (input) => dispatchSystem(\"deviceManager\", \"loadConfig\", \"query\", input),\n loadRuntimeState: (input) => dispatchSystem(\"deviceManager\", \"loadRuntimeState\", \"query\", input),\n loadMeta: (input) => dispatchSystem(\"deviceManager\", \"loadMeta\", \"query\", input),\n setName: (input) => dispatchSystem(\"deviceManager\", \"setName\", \"mutation\", input),\n setLocation: (input) => dispatchSystem(\"deviceManager\", \"setLocation\", \"mutation\", input),\n setMetadata: (input) => dispatchSystem(\"deviceManager\", \"setMetadata\", \"mutation\", input),\n setDisabled: (input) => dispatchSystem(\"deviceManager\", \"setDisabled\", \"mutation\", input),\n getDevice: (input) => dispatchSystem(\"deviceManager\", \"getDevice\", \"query\", input),\n getStreamSources: (input) => dispatchSystem(\"deviceManager\", \"getStreamSources\", \"query\", input),\n getConfigSchema: (input) => dispatchSystem(\"deviceManager\", \"getConfigSchema\", \"query\", input),\n getSettingsSchema: (input) => dispatchSystem(\"deviceManager\", \"getSettingsSchema\", \"query\", input),\n updateConfig: (input) => dispatchSystem(\"deviceManager\", \"updateConfig\", \"mutation\", input),\n enable: (input) => dispatchSystem(\"deviceManager\", \"enable\", \"mutation\", input),\n disable: (input) => dispatchSystem(\"deviceManager\", \"disable\", \"mutation\", input),\n remove: (input) => dispatchSystem(\"deviceManager\", \"remove\", \"mutation\", input),\n getStreamProfileMap: (input) => dispatchSystem(\"deviceManager\", \"getStreamProfileMap\", \"query\", input),\n setStreamProfileMap: (input) => dispatchSystem(\"deviceManager\", \"setStreamProfileMap\", \"mutation\", input),\n probeStreams: (input) => dispatchSystem(\"deviceManager\", \"probeStreams\", \"mutation\", input),\n getBindings: (input) => dispatchSystem(\"deviceManager\", \"getBindings\", \"query\", input),\n getAllBindings: (input) => dispatchSystem(\"deviceManager\", \"getAllBindings\", \"query\", input),\n setWrapperActive: (input) => dispatchSystem(\"deviceManager\", \"setWrapperActive\", \"mutation\", input),\n getDeviceSettingsAggregate: (input) => dispatchSystem(\"deviceManager\", \"getDeviceSettingsAggregate\", \"query\", input),\n getDeviceLiveInfoAggregate: (input) => dispatchSystem(\"deviceManager\", \"getDeviceLiveInfoAggregate\", \"query\", input),\n getDeviceAggregate: (input) => dispatchSystem(\"deviceManager\", \"getDeviceAggregate\", \"query\", input),\n updateDeviceField: (input) => dispatchSystem(\"deviceManager\", \"updateDeviceField\", \"mutation\", input),\n updateDeviceFieldsBatch: (input) => dispatchSystem(\"deviceManager\", \"updateDeviceFieldsBatch\", \"mutation\", input),\n testField: (input) => dispatchSystem(\"deviceManager\", \"testField\", \"mutation\", input),\n getDeviceStatusAggregate: (input) => dispatchSystem(\"deviceManager\", \"getDeviceStatusAggregate\", \"query\", input)\n };\n const deviceStateInterface = {\n getSnapshot: (input) => dispatchSystem(\"deviceState\", \"getSnapshot\", \"query\", input),\n getCapSlice: (input) => dispatchSystem(\"deviceState\", \"getCapSlice\", \"query\", input),\n setCapSlice: (input) => dispatchSystem(\"deviceState\", \"setCapSlice\", \"mutation\", input)\n };\n const networkQualityInterface = {\n getDeviceStats: (input) => dispatchSystem(\"networkQuality\", \"getDeviceStats\", \"query\", input),\n reportClientStats: (input) => dispatchSystem(\"networkQuality\", \"reportClientStats\", \"mutation\", input)\n };\n const pipelineExecutorInterface = {\n runPipeline: (input) => dispatchSystem(\"pipelineExecutor\", \"runPipeline\", \"mutation\", input),\n runPipelineBatch: (input) => dispatchSystem(\"pipelineExecutor\", \"runPipelineBatch\", \"mutation\", input)\n };\n const pipelineOrchestratorInterface = {\n assignPipeline: (input) => dispatchSystem(\"pipelineOrchestrator\", \"assignPipeline\", \"mutation\", input),\n unassignPipeline: (input) => dispatchSystem(\"pipelineOrchestrator\", \"unassignPipeline\", \"mutation\", input),\n getPipelineAssignment: (input) => dispatchSystem(\"pipelineOrchestrator\", \"getPipelineAssignment\", \"query\", input),\n getCameraMetrics: (input) => dispatchSystem(\"pipelineOrchestrator\", \"getCameraMetrics\", \"query\", input),\n assignDecoder: (input) => dispatchSystem(\"pipelineOrchestrator\", \"assignDecoder\", \"mutation\", input),\n unassignDecoder: (input) => dispatchSystem(\"pipelineOrchestrator\", \"unassignDecoder\", \"mutation\", input),\n assignAudio: (input) => dispatchSystem(\"pipelineOrchestrator\", \"assignAudio\", \"mutation\", input),\n unassignAudio: (input) => dispatchSystem(\"pipelineOrchestrator\", \"unassignAudio\", \"mutation\", input),\n getAudioAssignment: (input) => dispatchSystem(\"pipelineOrchestrator\", \"getAudioAssignment\", \"query\", input),\n getAudioAssignments: (input) => dispatchSystem(\"pipelineOrchestrator\", \"getAudioAssignments\", \"query\", input),\n getDecoderAssignment: (input) => dispatchSystem(\"pipelineOrchestrator\", \"getDecoderAssignment\", \"query\", input),\n getCameraSettings: (input) => dispatchSystem(\"pipelineOrchestrator\", \"getCameraSettings\", \"query\", input),\n setCameraStepToggle: (input) => dispatchSystem(\"pipelineOrchestrator\", \"setCameraStepToggle\", \"mutation\", input),\n getCameraStepOverrides: (input) => dispatchSystem(\"pipelineOrchestrator\", \"getCameraStepOverrides\", \"query\", input),\n setCameraStepOverride: (input) => dispatchSystem(\"pipelineOrchestrator\", \"setCameraStepOverride\", \"mutation\", input),\n setCameraPipelineForAgent: (input) => dispatchSystem(\"pipelineOrchestrator\", \"setCameraPipelineForAgent\", \"mutation\", input),\n resolvePipeline: (input) => dispatchSystem(\"pipelineOrchestrator\", \"resolvePipeline\", \"query\", input),\n getDeviceSettingsContribution: (input) => dispatchSystem(\"pipelineOrchestrator\", \"getDeviceSettingsContribution\", \"query\", input),\n getDeviceLiveContribution: (input) => dispatchSystem(\"pipelineOrchestrator\", \"getDeviceLiveContribution\", \"query\", input),\n applyDeviceSettingsPatch: (input) => dispatchSystem(\"pipelineOrchestrator\", \"applyDeviceSettingsPatch\", \"mutation\", input)\n };\n const pipelineRunnerInterface = {\n detachCamera: (input) => dispatchSystem(\"pipelineRunner\", \"detachCamera\", \"mutation\", input),\n getCameraMetrics: (input) => dispatchSystem(\"pipelineRunner\", \"getCameraMetrics\", \"query\", input)\n };\n const recordingEngineInterface = {\n getPolicyStatus: (input) => dispatchSystem(\"recordingEngine\", \"getPolicyStatus\", \"query\", input)\n };\n const snapshotProviderInterface = {\n supportsDevice: (input) => dispatchSystem(\"snapshotProvider\", \"supportsDevice\", \"query\", input),\n getSnapshot: (input) => dispatchSystem(\"snapshotProvider\", \"getSnapshot\", \"query\", input)\n };\n const streamBrokerInterface = {\n publishCameraStream: (input) => dispatchSystem(\"streamBroker\", \"publishCameraStream\", \"mutation\", input),\n retractCameraStream: (input) => dispatchSystem(\"streamBroker\", \"retractCameraStream\", \"mutation\", input),\n assignProfile: (input) => dispatchSystem(\"streamBroker\", \"assignProfile\", \"mutation\", input),\n unassignProfile: (input) => dispatchSystem(\"streamBroker\", \"unassignProfile\", \"mutation\", input),\n restartProfile: (input) => dispatchSystem(\"streamBroker\", \"restartProfile\", \"mutation\", input),\n getDeviceSettingsContribution: (input) => dispatchSystem(\"streamBroker\", \"getDeviceSettingsContribution\", \"query\", input),\n getDeviceLiveContribution: (input) => dispatchSystem(\"streamBroker\", \"getDeviceLiveContribution\", \"query\", input),\n applyDeviceSettingsPatch: (input) => dispatchSystem(\"streamBroker\", \"applyDeviceSettingsPatch\", \"mutation\", input)\n };\n return {\n deviceId: binding.deviceId,\n binding,\n state: {\n audioMetrics: createSliceHandle(stateSource, binding.deviceId, \"audio-metrics\"),\n battery: createSliceHandle(stateSource, binding.deviceId, \"battery\"),\n brightness: createSliceHandle(stateSource, binding.deviceId, \"brightness\"),\n cameraStreams: createSliceHandle(stateSource, binding.deviceId, \"camera-streams\"),\n deviceDiscovery: createSliceHandle(stateSource, binding.deviceId, \"device-discovery\"),\n deviceStatus: createSliceHandle(stateSource, binding.deviceId, \"device-status\"),\n doorbell: createSliceHandle(stateSource, binding.deviceId, \"doorbell\"),\n featureProbe: createSliceHandle(stateSource, binding.deviceId, \"feature-probe\"),\n motion: createSliceHandle(stateSource, binding.deviceId, \"motion\"),\n motionTrigger: createSliceHandle(stateSource, binding.deviceId, \"motion-trigger\"),\n motionZones: createSliceHandle(stateSource, binding.deviceId, \"motion-zones\"),\n nativeObjectDetection: createSliceHandle(stateSource, binding.deviceId, \"native-object-detection\"),\n privacyMask: createSliceHandle(stateSource, binding.deviceId, \"privacy-mask\"),\n ptzAutotrack: createSliceHandle(stateSource, binding.deviceId, \"ptz-autotrack\"),\n streamParams: createSliceHandle(stateSource, binding.deviceId, \"stream-params\"),\n switch: createSliceHandle(stateSource, binding.deviceId, \"switch\"),\n zoneAnalytics: createSliceHandle(stateSource, binding.deviceId, \"zone-analytics\"),\n zoneRules: createSliceHandle(stateSource, binding.deviceId, \"zone-rules\"),\n zones: createSliceHandle(stateSource, binding.deviceId, \"zones\")\n },\n accessories: accessoriesInterface,\n audioAnalysis: audioAnalysisInterface,\n audioMetrics: audioMetricsInterface,\n battery: batteryInterface,\n brightness: brightnessInterface,\n cameraCredentials: cameraCredentialsInterface,\n cameraStreams: cameraStreamsInterface,\n detectionPipeline: detectionPipelineInterface,\n deviceDiscovery: deviceDiscoveryInterface,\n deviceOps: deviceOpsInterface,\n deviceStatus: deviceStatusInterface,\n doorbell: doorbellInterface,\n events: eventsInterface,\n featureProbe: featureProbeInterface,\n intercom: intercomInterface,\n motion: motionInterface,\n motionDetection: motionDetectionInterface,\n motionTrigger: motionTriggerInterface,\n motionZones: motionZonesInterface,\n nativeObjectDetection: nativeObjectDetectionInterface,\n osd: osdInterface,\n pipelineAnalytics: pipelineAnalyticsInterface,\n privacyMask: privacyMaskInterface,\n ptz: ptzInterface,\n ptzAutotrack: ptzAutotrackInterface,\n reboot: rebootInterface,\n recording: recordingInterface,\n snapshot: snapshotInterface,\n streamCatalog: streamCatalogInterface,\n streamParams: streamParamsInterface,\n switch: switchInterface,\n webrtcSession: webrtcSessionInterface,\n zoneAnalytics: zoneAnalyticsInterface,\n zoneRules: zoneRulesInterface,\n zones: zonesInterface,\n addonSettings: addonSettingsInterface,\n cameraPipelineConfig: cameraPipelineConfigInterface,\n deviceExport: deviceExportInterface,\n deviceManager: deviceManagerInterface,\n deviceState: deviceStateInterface,\n networkQuality: networkQualityInterface,\n pipelineExecutor: pipelineExecutorInterface,\n pipelineOrchestrator: pipelineOrchestratorInterface,\n pipelineRunner: pipelineRunnerInterface,\n recordingEngine: recordingEngineInterface,\n snapshotProvider: snapshotProviderInterface,\n streamBroker: streamBrokerInterface\n };\n}\nfunction evaluateZoneRules(items, zones, rules, getCenter, getClassName) {\n if (rules.length === 0 || zones.length === 0) {\n return { passed: items, excluded: [] };\n }\n const activeRules = rules.filter((r) => r.enabled !== false);\n const includeRules = activeRules.filter((r) => r.mode === \"include\");\n const excludeRules = activeRules.filter((r) => r.mode === \"exclude\");\n const whitelistMode = includeRules.length > 0;\n const zonesById = new Map(zones.map((z2) => [z2.id, z2]));\n const passed = [];\n const excluded = [];\n for (const item of items) {\n const center = getCenter(item);\n const className = getClassName?.(item);\n const inInclude = includeRules.some((r) => ruleApplies(r, center, className, zonesById));\n const inExclude = excludeRules.some((r) => ruleApplies(r, center, className, zonesById));\n if (whitelistMode) {\n if (inInclude && !inExclude) passed.push(item);\n else excluded.push(item);\n } else {\n if (inExclude) excluded.push(item);\n else passed.push(item);\n }\n }\n return { passed, excluded };\n}\nfunction ruleApplies(rule, center, className, zonesById) {\n if (rule.classFilter && rule.classFilter.length > 0) {\n if (className !== void 0 && !rule.classFilter.includes(className)) return false;\n }\n for (const zoneId of rule.zoneIds) {\n const zone = zonesById.get(zoneId);\n if (!zone) continue;\n if (pointInPolygon(center, zone.polygon)) return true;\n }\n return false;\n}\nfunction pointInPolygon(point, polygon) {\n if (polygon.length < 3) return false;\n let inside = false;\n const { x, y } = point;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const a = polygon[i];\n const b = polygon[j];\n const intersect = a.y > y !== b.y > y && x < (b.x - a.x) * (y - a.y) / (b.y - a.y || Number.EPSILON) + a.x;\n if (intersect) inside = !inside;\n }\n return inside;\n}\nfunction createSystemProxy(api) {\n const typedApi = api;\n function dispatch(capProp, method, kind, input, push) {\n const leaf = typedApi[capProp]?.[method];\n if (!leaf) throw new Error(`SystemProxy: api has no '${capProp}.${method}'`);\n const fn2 = leaf;\n if (kind === \"mutation\") return fn2.mutate(input);\n if (kind === \"subscription\") return fn2.subscribe(input, push);\n return fn2.query(input);\n }\n const addonPagesInterface = {\n listPages: (input) => dispatch(\"addonPages\", \"listPages\", \"query\", input)\n };\n const addonsInterface = {\n list: (input) => dispatch(\"addons\", \"list\", \"query\", input),\n getLogs: (input) => dispatch(\"addons\", \"getLogs\", \"query\", input),\n listPackages: (input) => dispatch(\"addons\", \"listPackages\", \"query\", input),\n installPackage: (input) => dispatch(\"addons\", \"installPackage\", \"mutation\", input),\n installFromWorkspace: (input) => dispatch(\"addons\", \"installFromWorkspace\", \"mutation\", input),\n isWorkspaceAvailable: (input) => dispatch(\"addons\", \"isWorkspaceAvailable\", \"query\", input),\n listWorkspacePackages: (input) => dispatch(\"addons\", \"listWorkspacePackages\", \"query\", input),\n uninstallPackage: (input) => dispatch(\"addons\", \"uninstallPackage\", \"mutation\", input),\n reloadPackages: (input) => dispatch(\"addons\", \"reloadPackages\", \"mutation\", input),\n searchAvailable: (input) => dispatch(\"addons\", \"searchAvailable\", \"query\", input),\n listUpdates: (input) => dispatch(\"addons\", \"listUpdates\", \"query\", input),\n updatePackage: (input) => dispatch(\"addons\", \"updatePackage\", \"mutation\", input),\n rollbackPackage: (input) => dispatch(\"addons\", \"rollbackPackage\", \"mutation\", input),\n forceRefresh: (input) => dispatch(\"addons\", \"forceRefresh\", \"mutation\", input),\n restartServer: (input) => dispatch(\"addons\", \"restartServer\", \"mutation\", input),\n getLastRestart: (input) => dispatch(\"addons\", \"getLastRestart\", \"query\", input),\n listFrameworkPackages: (input) => dispatch(\"addons\", \"listFrameworkPackages\", \"query\", input),\n listCapabilityProviders: (input) => dispatch(\"addons\", \"listCapabilityProviders\", \"query\", input),\n setCapabilityProviderEnabled: (input) => dispatch(\"addons\", \"setCapabilityProviderEnabled\", \"mutation\", input),\n updateFrameworkPackage: (input) => dispatch(\"addons\", \"updateFrameworkPackage\", \"mutation\", input),\n startBulkUpdate: (input) => dispatch(\"addons\", \"startBulkUpdate\", \"mutation\", input),\n getBulkUpdateState: (input) => dispatch(\"addons\", \"getBulkUpdateState\", \"query\", input),\n cancelBulkUpdate: (input) => dispatch(\"addons\", \"cancelBulkUpdate\", \"mutation\", input),\n listActiveBulkUpdates: (input) => dispatch(\"addons\", \"listActiveBulkUpdates\", \"query\", input),\n getVersions: (input) => dispatch(\"addons\", \"getVersions\", \"query\", input),\n restartAddon: (input) => dispatch(\"addons\", \"restartAddon\", \"mutation\", input),\n retryLoad: (input) => dispatch(\"addons\", \"retryLoad\", \"mutation\", input),\n getAutoUpdateSettings: (input) => dispatch(\"addons\", \"getAutoUpdateSettings\", \"query\", input),\n setAutoUpdateSettings: (input) => dispatch(\"addons\", \"setAutoUpdateSettings\", \"mutation\", input),\n getAddonAutoUpdate: (input) => dispatch(\"addons\", \"getAddonAutoUpdate\", \"query\", input),\n setAddonAutoUpdate: (input) => dispatch(\"addons\", \"setAddonAutoUpdate\", \"mutation\", input),\n applyAutoUpdateToAll: (input) => dispatch(\"addons\", \"applyAutoUpdateToAll\", \"mutation\", input),\n custom: (input) => dispatch(\"addons\", \"custom\", \"mutation\", input),\n onAddonLogs: (input, push) => dispatch(\"addons\", \"onAddonLogs\", \"subscription\", input, push)\n };\n const addonSettingsInterface = {\n getGlobalSettings: (input) => dispatch(\"addonSettings\", \"getGlobalSettings\", \"query\", input),\n updateGlobalSettings: (input) => dispatch(\"addonSettings\", \"updateGlobalSettings\", \"mutation\", input)\n };\n const addonWidgetsInterface = {\n listWidgets: (input) => dispatch(\"addonWidgets\", \"listWidgets\", \"query\", input)\n };\n const alertsInterface = {\n emit: (input) => dispatch(\"alerts\", \"emit\", \"mutation\", input),\n update: (input) => dispatch(\"alerts\", \"update\", \"mutation\", input),\n list: (input) => dispatch(\"alerts\", \"list\", \"query\", input),\n getUnreadCount: (input) => dispatch(\"alerts\", \"getUnreadCount\", \"query\", input),\n markRead: (input) => dispatch(\"alerts\", \"markRead\", \"mutation\", input),\n markAllRead: (input) => dispatch(\"alerts\", \"markAllRead\", \"mutation\", input),\n dismiss: (input) => dispatch(\"alerts\", \"dismiss\", \"mutation\", input)\n };\n const audioAnalyzerInterface = {\n analyseChunk: (input) => dispatch(\"audioAnalyzer\", \"analyseChunk\", \"mutation\", input),\n classify: (input) => dispatch(\"audioAnalyzer\", \"classify\", \"query\", input),\n isReady: (input) => dispatch(\"audioAnalyzer\", \"isReady\", \"query\", input),\n dispose: (input) => dispatch(\"audioAnalyzer\", \"dispose\", \"mutation\", input),\n reprobeAudioEngine: (input) => dispatch(\"audioAnalyzer\", \"reprobeAudioEngine\", \"mutation\", input)\n };\n const audioCodecInterface = {\n listSupportedCodecs: (input) => dispatch(\"audioCodec\", \"listSupportedCodecs\", \"query\", input),\n canHandle: (input) => dispatch(\"audioCodec\", \"canHandle\", \"query\", input),\n createDecodeSession: (input) => dispatch(\"audioCodec\", \"createDecodeSession\", \"mutation\", input),\n createEncodeSession: (input) => dispatch(\"audioCodec\", \"createEncodeSession\", \"mutation\", input),\n closeSession: (input) => dispatch(\"audioCodec\", \"closeSession\", \"mutation\", input),\n pushEncodedFrame: (input) => dispatch(\"audioCodec\", \"pushEncodedFrame\", \"mutation\", input),\n pullPcm: (input) => dispatch(\"audioCodec\", \"pullPcm\", \"query\", input),\n pushPcm: (input) => dispatch(\"audioCodec\", \"pushPcm\", \"mutation\", input),\n pullEncoded: (input) => dispatch(\"audioCodec\", \"pullEncoded\", \"query\", input),\n flushEncode: (input) => dispatch(\"audioCodec\", \"flushEncode\", \"mutation\", input),\n listActiveSessions: (input) => dispatch(\"audioCodec\", \"listActiveSessions\", \"query\", input)\n };\n const backupInterface = {\n listDestinations: (input) => dispatch(\"backup\", \"listDestinations\", \"query\", input),\n trigger: (input) => dispatch(\"backup\", \"trigger\", \"mutation\", input),\n list: (input) => dispatch(\"backup\", \"list\", \"query\", input),\n listLocations: (input) => dispatch(\"backup\", \"listLocations\", \"query\", input),\n getEntries: (input) => dispatch(\"backup\", \"getEntries\", \"query\", input),\n restore: (input) => dispatch(\"backup\", \"restore\", \"mutation\", input),\n delete: (input) => dispatch(\"backup\", \"delete\", \"mutation\", input),\n listArchives: (input) => dispatch(\"backup\", \"listArchives\", \"query\", input),\n upsertDestinationPolicy: (input) => dispatch(\"backup\", \"upsertDestinationPolicy\", \"mutation\", input),\n previewSchedule: (input) => dispatch(\"backup\", \"previewSchedule\", \"query\", input)\n };\n const decoderInterface = {\n supportsCodec: (input) => dispatch(\"decoder\", \"supportsCodec\", \"query\", input),\n getInfo: (input) => dispatch(\"decoder\", \"getInfo\", \"query\", input),\n createSession: (input) => dispatch(\"decoder\", \"createSession\", \"query\", input),\n destroySession: (input) => dispatch(\"decoder\", \"destroySession\", \"query\", input),\n pushPacket: (input) => dispatch(\"decoder\", \"pushPacket\", \"query\", input),\n openStream: (input) => dispatch(\"decoder\", \"openStream\", \"query\", input),\n pullFrames: (input) => dispatch(\"decoder\", \"pullFrames\", \"query\", input),\n pullHandles: (input) => dispatch(\"decoder\", \"pullHandles\", \"query\", input),\n getFrame: (input) => dispatch(\"decoder\", \"getFrame\", \"query\", input),\n getShmStats: (input) => dispatch(\"decoder\", \"getShmStats\", \"query\", input),\n updateConfig: (input) => dispatch(\"decoder\", \"updateConfig\", \"query\", input),\n getStats: (input) => dispatch(\"decoder\", \"getStats\", \"query\", input),\n listActiveSessions: (input) => dispatch(\"decoder\", \"listActiveSessions\", \"query\", input),\n reprobeHwaccel: (input) => dispatch(\"decoder\", \"reprobeHwaccel\", \"mutation\", input)\n };\n const deviceExportInterface = {\n getStatus: (input) => dispatch(\"deviceExport\", \"getStatus\", \"query\", input),\n listSupportedDeviceKinds: (input) => dispatch(\"deviceExport\", \"listSupportedDeviceKinds\", \"query\", input),\n listExposedDevices: (input) => dispatch(\"deviceExport\", \"listExposedDevices\", \"query\", input),\n exposeDevice: (input) => dispatch(\"deviceExport\", \"exposeDevice\", \"mutation\", input),\n unexposeDevice: (input) => dispatch(\"deviceExport\", \"unexposeDevice\", \"mutation\", input)\n };\n const deviceManagerInterface = {\n allocateDeviceId: (input) => dispatch(\"deviceManager\", \"allocateDeviceId\", \"mutation\", input),\n registerDevice: (input) => dispatch(\"deviceManager\", \"registerDevice\", \"mutation\", input),\n removeDevice: (input) => dispatch(\"deviceManager\", \"removeDevice\", \"mutation\", input),\n persistConfig: (input) => dispatch(\"deviceManager\", \"persistConfig\", \"mutation\", input),\n listLocations: (input) => dispatch(\"deviceManager\", \"listLocations\", \"query\", input),\n addLocation: (input) => dispatch(\"deviceManager\", \"addLocation\", \"mutation\", input),\n removeLocation: (input) => dispatch(\"deviceManager\", \"removeLocation\", \"mutation\", input),\n listPersistedByAddon: (input) => dispatch(\"deviceManager\", \"listPersistedByAddon\", \"query\", input),\n listAll: (input) => dispatch(\"deviceManager\", \"listAll\", \"query\", input),\n getChildren: (input) => dispatch(\"deviceManager\", \"getChildren\", \"query\", input),\n listWrappersForCap: (input) => dispatch(\"deviceManager\", \"listWrappersForCap\", \"query\", input),\n listBindableCapsForDeviceType: (input) => dispatch(\"deviceManager\", \"listBindableCapsForDeviceType\", \"query\", input),\n discoverDevices: (input) => dispatch(\"deviceManager\", \"discoverDevices\", \"mutation\", input),\n adoptDevice: (input) => dispatch(\"deviceManager\", \"adoptDevice\", \"mutation\", input),\n getCreationSchema: (input) => dispatch(\"deviceManager\", \"getCreationSchema\", \"query\", input),\n createDevice: (input) => dispatch(\"deviceManager\", \"createDevice\", \"mutation\", input),\n testCreationField: (input) => dispatch(\"deviceManager\", \"testCreationField\", \"mutation\", input)\n };\n const deviceProviderInterface = {\n start: (input) => dispatch(\"deviceProvider\", \"start\", \"mutation\", input),\n stop: (input) => dispatch(\"deviceProvider\", \"stop\", \"mutation\", input),\n getStatus: (input) => dispatch(\"deviceProvider\", \"getStatus\", \"query\", input),\n getDevices: (input) => dispatch(\"deviceProvider\", \"getDevices\", \"query\", input),\n supportsDiscovery: (input) => dispatch(\"deviceProvider\", \"supportsDiscovery\", \"query\", input),\n discoverDevices: (input) => dispatch(\"deviceProvider\", \"discoverDevices\", \"mutation\", input),\n adoptDiscoveredDevice: (input) => dispatch(\"deviceProvider\", \"adoptDiscoveredDevice\", \"mutation\", input),\n supportsManualCreation: (input) => dispatch(\"deviceProvider\", \"supportsManualCreation\", \"query\", input),\n getChildCreationSchema: (input) => dispatch(\"deviceProvider\", \"getChildCreationSchema\", \"query\", input),\n createDevice: (input) => dispatch(\"deviceProvider\", \"createDevice\", \"mutation\", input),\n testCreationField: (input) => dispatch(\"deviceProvider\", \"testCreationField\", \"mutation\", input)\n };\n const deviceStateInterface = {\n getAllSnapshots: (input) => dispatch(\"deviceState\", \"getAllSnapshots\", \"query\", input)\n };\n const integrationsInterface = {\n list: (input) => dispatch(\"integrations\", \"list\", \"query\", input),\n get: (input) => dispatch(\"integrations\", \"get\", \"query\", input),\n getByAddonId: (input) => dispatch(\"integrations\", \"getByAddonId\", \"query\", input),\n create: (input) => dispatch(\"integrations\", \"create\", \"mutation\", input),\n update: (input) => dispatch(\"integrations\", \"update\", \"mutation\", input),\n delete: (input) => dispatch(\"integrations\", \"delete\", \"mutation\", input),\n getSettings: (input) => dispatch(\"integrations\", \"getSettings\", \"query\", input),\n setSettings: (input) => dispatch(\"integrations\", \"setSettings\", \"mutation\", input),\n getAvailableTypes: (input) => dispatch(\"integrations\", \"getAvailableTypes\", \"query\", input),\n testConnection: (input) => dispatch(\"integrations\", \"testConnection\", \"mutation\", input)\n };\n const localNetworkInterface = {\n list: (input) => dispatch(\"localNetwork\", \"list\", \"query\", input),\n getPreferred: (input) => dispatch(\"localNetwork\", \"getPreferred\", \"query\", input),\n getConnectionEndpoints: (input) => dispatch(\"localNetwork\", \"getConnectionEndpoints\", \"query\", input),\n getAllowedAddresses: (input) => dispatch(\"localNetwork\", \"getAllowedAddresses\", \"query\", input),\n setAllowedAddresses: (input) => dispatch(\"localNetwork\", \"setAllowedAddresses\", \"mutation\", input),\n resetAllowlistToBestMatch: (input) => dispatch(\"localNetwork\", \"resetAllowlistToBestMatch\", \"mutation\", input)\n };\n const meshNetworkInterface = {\n getStatus: (input) => dispatch(\"meshNetwork\", \"getStatus\", \"query\", input),\n join: (input) => dispatch(\"meshNetwork\", \"join\", \"mutation\", input),\n startLogin: (input) => dispatch(\"meshNetwork\", \"startLogin\", \"mutation\", input),\n leave: (input) => dispatch(\"meshNetwork\", \"leave\", \"mutation\", input),\n logout: (input) => dispatch(\"meshNetwork\", \"logout\", \"mutation\", input),\n listPeers: (input) => dispatch(\"meshNetwork\", \"listPeers\", \"query\", input),\n testConnection: (input) => dispatch(\"meshNetwork\", \"testConnection\", \"mutation\", input)\n };\n const metricsProviderInterface = {\n collectSnapshot: (input) => dispatch(\"metricsProvider\", \"collectSnapshot\", \"query\", input),\n getCached: (input) => dispatch(\"metricsProvider\", \"getCached\", \"query\", input),\n getCurrent: (input) => dispatch(\"metricsProvider\", \"getCurrent\", \"query\", input),\n getDiskSpace: (input) => dispatch(\"metricsProvider\", \"getDiskSpace\", \"query\", input),\n getGpuInfo: (input) => dispatch(\"metricsProvider\", \"getGpuInfo\", \"query\", input),\n getCpuTemperature: (input) => dispatch(\"metricsProvider\", \"getCpuTemperature\", \"query\", input),\n getProcessStats: (input) => dispatch(\"metricsProvider\", \"getProcessStats\", \"query\", input),\n listAddonInstances: (input) => dispatch(\"metricsProvider\", \"listAddonInstances\", \"query\", input),\n getAddonStats: (input) => dispatch(\"metricsProvider\", \"getAddonStats\", \"query\", input),\n listNodeProcesses: (input) => dispatch(\"metricsProvider\", \"listNodeProcesses\", \"query\", input),\n killProcess: (input) => dispatch(\"metricsProvider\", \"killProcess\", \"mutation\", input)\n };\n const mqttBrokerInterface = {\n listBrokers: (input) => dispatch(\"mqttBroker\", \"listBrokers\", \"query\", input),\n getBrokerConfig: (input) => dispatch(\"mqttBroker\", \"getBrokerConfig\", \"query\", input),\n addBroker: (input) => dispatch(\"mqttBroker\", \"addBroker\", \"mutation\", input),\n removeBroker: (input) => dispatch(\"mqttBroker\", \"removeBroker\", \"mutation\", input),\n testConnection: (input) => dispatch(\"mqttBroker\", \"testConnection\", \"mutation\", input),\n startEmbeddedBroker: (input) => dispatch(\"mqttBroker\", \"startEmbeddedBroker\", \"mutation\", input),\n stopEmbeddedBroker: (input) => dispatch(\"mqttBroker\", \"stopEmbeddedBroker\", \"mutation\", input),\n getStatus: (input) => dispatch(\"mqttBroker\", \"getStatus\", \"query\", input)\n };\n const networkAccessInterface = {\n start: (input) => dispatch(\"networkAccess\", \"start\", \"mutation\", input),\n stop: (input) => dispatch(\"networkAccess\", \"stop\", \"mutation\", input),\n getEndpoint: (input) => dispatch(\"networkAccess\", \"getEndpoint\", \"query\", input),\n getStatus: (input) => dispatch(\"networkAccess\", \"getStatus\", \"query\", input),\n listEndpoints: (input) => dispatch(\"networkAccess\", \"listEndpoints\", \"query\", input)\n };\n const networkQualityInterface = {\n getAllStats: (input) => dispatch(\"networkQuality\", \"getAllStats\", \"query\", input)\n };\n const nodesInterface = {\n topology: (input) => dispatch(\"nodes\", \"topology\", \"query\", input),\n deployAddon: (input) => dispatch(\"nodes\", \"deployAddon\", \"mutation\", input),\n undeployAddon: (input) => dispatch(\"nodes\", \"undeployAddon\", \"mutation\", input),\n restartAddon: (input) => dispatch(\"nodes\", \"restartAddon\", \"mutation\", input),\n restartProcess: (input) => dispatch(\"nodes\", \"restartProcess\", \"mutation\", input),\n restartNode: (input) => dispatch(\"nodes\", \"restartNode\", \"mutation\", input),\n shutdownNode: (input) => dispatch(\"nodes\", \"shutdownNode\", \"mutation\", input),\n renameNode: (input) => dispatch(\"nodes\", \"renameNode\", \"mutation\", input),\n clusterAddonStatus: (input) => dispatch(\"nodes\", \"clusterAddonStatus\", \"query\", input),\n getCapUsageGraph: (input) => dispatch(\"nodes\", \"getCapUsageGraph\", \"query\", input),\n getNodeAddons: (input) => dispatch(\"nodes\", \"getNodeAddons\", \"query\", input),\n setProcessLogLevel: (input) => dispatch(\"nodes\", \"setProcessLogLevel\", \"mutation\", input),\n executeQuery: (input) => dispatch(\"nodes\", \"executeQuery\", \"mutation\", input)\n };\n const notificationOutputInterface = {\n send: (input) => dispatch(\"notificationOutput\", \"send\", \"mutation\", input),\n sendTest: (input) => dispatch(\"notificationOutput\", \"sendTest\", \"mutation\", input)\n };\n const pipelineExecutorInterface = {\n getAvailableEngines: (input) => dispatch(\"pipelineExecutor\", \"getAvailableEngines\", \"query\", input),\n getSelectedEngine: (input) => dispatch(\"pipelineExecutor\", \"getSelectedEngine\", \"query\", input),\n getDefaultSteps: (input) => dispatch(\"pipelineExecutor\", \"getDefaultSteps\", \"query\", input),\n reprobeEngine: (input) => dispatch(\"pipelineExecutor\", \"reprobeEngine\", \"mutation\", input),\n getVideoPipelineSteps: (input) => dispatch(\"pipelineExecutor\", \"getVideoPipelineSteps\", \"query\", input),\n setVideoPipelineSteps: (input) => dispatch(\"pipelineExecutor\", \"setVideoPipelineSteps\", \"mutation\", input),\n getSchema: (input) => dispatch(\"pipelineExecutor\", \"getSchema\", \"query\", input),\n getGlobalSteps: (input) => dispatch(\"pipelineExecutor\", \"getGlobalSteps\", \"query\", input),\n getGlobalPipelineConfig: (input) => dispatch(\"pipelineExecutor\", \"getGlobalPipelineConfig\", \"query\", input),\n getOrchestratorConfigSchema: (input) => dispatch(\"pipelineExecutor\", \"getOrchestratorConfigSchema\", \"query\", input),\n listTemplates: (input) => dispatch(\"pipelineExecutor\", \"listTemplates\", \"query\", input),\n saveTemplate: (input) => dispatch(\"pipelineExecutor\", \"saveTemplate\", \"mutation\", input),\n updateTemplate: (input) => dispatch(\"pipelineExecutor\", \"updateTemplate\", \"mutation\", input),\n deleteTemplate: (input) => dispatch(\"pipelineExecutor\", \"deleteTemplate\", \"mutation\", input),\n getCapabilities: (input) => dispatch(\"pipelineExecutor\", \"getCapabilities\", \"query\", input),\n getAddonModels: (input) => dispatch(\"pipelineExecutor\", \"getAddonModels\", \"query\", input),\n downloadModel: (input) => dispatch(\"pipelineExecutor\", \"downloadModel\", \"mutation\", input),\n deleteModel: (input) => dispatch(\"pipelineExecutor\", \"deleteModel\", \"mutation\", input),\n detect: (input) => dispatch(\"pipelineExecutor\", \"detect\", \"query\", input),\n cacheFrameInPool: (input) => dispatch(\"pipelineExecutor\", \"cacheFrameInPool\", \"mutation\", input),\n inferCached: (input) => dispatch(\"pipelineExecutor\", \"inferCached\", \"mutation\", input),\n uncacheFrame: (input) => dispatch(\"pipelineExecutor\", \"uncacheFrame\", \"mutation\", input),\n getEffectiveTuning: (input) => dispatch(\"pipelineExecutor\", \"getEffectiveTuning\", \"query\", input),\n listLoadedEngines: (input) => dispatch(\"pipelineExecutor\", \"listLoadedEngines\", \"query\", input),\n spinEngine: (input) => dispatch(\"pipelineExecutor\", \"spinEngine\", \"mutation\", input),\n killEngine: (input) => dispatch(\"pipelineExecutor\", \"killEngine\", \"mutation\", input),\n listReferenceImages: (input) => dispatch(\"pipelineExecutor\", \"listReferenceImages\", \"query\", input),\n getReferenceImage: (input) => dispatch(\"pipelineExecutor\", \"getReferenceImage\", \"query\", input),\n getReferenceAudioFiles: (input) => dispatch(\"pipelineExecutor\", \"getReferenceAudioFiles\", \"query\", input),\n getReferenceAudio: (input) => dispatch(\"pipelineExecutor\", \"getReferenceAudio\", \"query\", input),\n getAudioCapabilities: (input) => dispatch(\"pipelineExecutor\", \"getAudioCapabilities\", \"query\", input),\n runAudioTest: (input) => dispatch(\"pipelineExecutor\", \"runAudioTest\", \"mutation\", input),\n getDetectionConfigSchema: (input) => dispatch(\"pipelineExecutor\", \"getDetectionConfigSchema\", \"query\", input)\n };\n const pipelineOrchestratorInterface = {\n rebalance: (input) => dispatch(\"pipelineOrchestrator\", \"rebalance\", \"mutation\", input),\n getPipelineAssignments: (input) => dispatch(\"pipelineOrchestrator\", \"getPipelineAssignments\", \"query\", input),\n getAgentLoad: (input) => dispatch(\"pipelineOrchestrator\", \"getAgentLoad\", \"query\", input),\n getGlobalMetrics: (input) => dispatch(\"pipelineOrchestrator\", \"getGlobalMetrics\", \"query\", input),\n getCapabilityBindings: (input) => dispatch(\"pipelineOrchestrator\", \"getCapabilityBindings\", \"query\", input),\n setCapabilityBinding: (input) => dispatch(\"pipelineOrchestrator\", \"setCapabilityBinding\", \"mutation\", input),\n getDecoderAssignments: (input) => dispatch(\"pipelineOrchestrator\", \"getDecoderAssignments\", \"query\", input),\n getAudioNodeLoad: (input) => dispatch(\"pipelineOrchestrator\", \"getAudioNodeLoad\", \"query\", input),\n getAgentSettings: (input) => dispatch(\"pipelineOrchestrator\", \"getAgentSettings\", \"query\", input),\n listAgentSettings: (input) => dispatch(\"pipelineOrchestrator\", \"listAgentSettings\", \"query\", input),\n setAgentAddonDefaults: (input) => dispatch(\"pipelineOrchestrator\", \"setAgentAddonDefaults\", \"mutation\", input),\n removeAgentSettings: (input) => dispatch(\"pipelineOrchestrator\", \"removeAgentSettings\", \"mutation\", input),\n listTemplates: (input) => dispatch(\"pipelineOrchestrator\", \"listTemplates\", \"query\", input),\n saveTemplate: (input) => dispatch(\"pipelineOrchestrator\", \"saveTemplate\", \"mutation\", input),\n updateTemplate: (input) => dispatch(\"pipelineOrchestrator\", \"updateTemplate\", \"mutation\", input),\n deleteTemplate: (input) => dispatch(\"pipelineOrchestrator\", \"deleteTemplate\", \"mutation\", input)\n };\n const pipelineRunnerInterface = {\n attachCamera: (input) => dispatch(\"pipelineRunner\", \"attachCamera\", \"mutation\", input),\n reportMotion: (input) => dispatch(\"pipelineRunner\", \"reportMotion\", \"mutation\", input),\n getLocalLoad: (input) => dispatch(\"pipelineRunner\", \"getLocalLoad\", \"query\", input),\n getLocalMetrics: (input) => dispatch(\"pipelineRunner\", \"getLocalMetrics\", \"query\", input),\n getAllCameraMetrics: (input) => dispatch(\"pipelineRunner\", \"getAllCameraMetrics\", \"query\", input),\n getLocalCameras: (input) => dispatch(\"pipelineRunner\", \"getLocalCameras\", \"query\", input)\n };\n const platformProbeInterface = {\n getCapabilities: (input) => dispatch(\"platformProbe\", \"getCapabilities\", \"query\", input),\n getHardware: (input) => dispatch(\"platformProbe\", \"getHardware\", \"query\", input),\n resolveInferenceConfig: (input) => dispatch(\"platformProbe\", \"resolveInferenceConfig\", \"query\", input),\n resolveHwAccel: (input) => dispatch(\"platformProbe\", \"resolveHwAccel\", \"query\", input),\n getHardwareEncoders: (input) => dispatch(\"platformProbe\", \"getHardwareEncoders\", \"query\", input),\n refreshHardwareEncoders: (input) => dispatch(\"platformProbe\", \"refreshHardwareEncoders\", \"mutation\", input)\n };\n const recordingEngineInterface = {\n getStatus: (input) => dispatch(\"recordingEngine\", \"getStatus\", \"query\", input),\n enable: (input) => dispatch(\"recordingEngine\", \"enable\", \"mutation\", input),\n disable: (input) => dispatch(\"recordingEngine\", \"disable\", \"mutation\", input),\n getConfig: (input) => dispatch(\"recordingEngine\", \"getConfig\", \"query\", input),\n updateConfig: (input) => dispatch(\"recordingEngine\", \"updateConfig\", \"mutation\", input),\n getPlaylist: (input) => dispatch(\"recordingEngine\", \"getPlaylist\", \"query\", input),\n getThumbnail: (input) => dispatch(\"recordingEngine\", \"getThumbnail\", \"query\", input),\n getSegments: (input) => dispatch(\"recordingEngine\", \"getSegments\", \"query\", input),\n getAvailability: (input) => dispatch(\"recordingEngine\", \"getAvailability\", \"query\", input),\n estimateStorage: (input) => dispatch(\"recordingEngine\", \"estimateStorage\", \"query\", input),\n estimateGlobalStorage: (input) => dispatch(\"recordingEngine\", \"estimateGlobalStorage\", \"query\", input),\n getStorageUsage: (input) => dispatch(\"recordingEngine\", \"getStorageUsage\", \"query\", input),\n setPolicy: (input) => dispatch(\"recordingEngine\", \"setPolicy\", \"mutation\", input),\n getPolicy: (input) => dispatch(\"recordingEngine\", \"getPolicy\", \"query\", input),\n getRetentionConfig: (input) => dispatch(\"recordingEngine\", \"getRetentionConfig\", \"query\", input),\n updateRetentionConfig: (input) => dispatch(\"recordingEngine\", \"updateRetentionConfig\", \"mutation\", input),\n getMotionStats: (input) => dispatch(\"recordingEngine\", \"getMotionStats\", \"query\", input)\n };\n const settingsStoreInterface = {\n get: (input) => dispatch(\"settingsStore\", \"get\", \"query\", input),\n set: (input) => dispatch(\"settingsStore\", \"set\", \"mutation\", input),\n query: (input) => dispatch(\"settingsStore\", \"query\", \"query\", input),\n insert: (input) => dispatch(\"settingsStore\", \"insert\", \"mutation\", input),\n update: (input) => dispatch(\"settingsStore\", \"update\", \"mutation\", input),\n delete: (input) => dispatch(\"settingsStore\", \"delete\", \"mutation\", input),\n count: (input) => dispatch(\"settingsStore\", \"count\", \"query\", input),\n isEmpty: (input) => dispatch(\"settingsStore\", \"isEmpty\", \"query\", input),\n declareCollection: (input) => dispatch(\"settingsStore\", \"declareCollection\", \"mutation\", input)\n };\n const storageInterface = {\n resolve: (input) => dispatch(\"storage\", \"resolve\", \"query\", input),\n write: (input) => dispatch(\"storage\", \"write\", \"mutation\", input),\n read: (input) => dispatch(\"storage\", \"read\", \"query\", input),\n exists: (input) => dispatch(\"storage\", \"exists\", \"query\", input),\n list: (input) => dispatch(\"storage\", \"list\", \"query\", input),\n delete: (input) => dispatch(\"storage\", \"delete\", \"mutation\", input),\n getAvailableSpace: (input) => dispatch(\"storage\", \"getAvailableSpace\", \"query\", input),\n beginUpload: (input) => dispatch(\"storage\", \"beginUpload\", \"mutation\", input),\n writeChunk: (input) => dispatch(\"storage\", \"writeChunk\", \"mutation\", input),\n finalizeUpload: (input) => dispatch(\"storage\", \"finalizeUpload\", \"mutation\", input),\n abortUpload: (input) => dispatch(\"storage\", \"abortUpload\", \"mutation\", input),\n beginDownload: (input) => dispatch(\"storage\", \"beginDownload\", \"mutation\", input),\n readChunk: (input) => dispatch(\"storage\", \"readChunk\", \"query\", input),\n endDownload: (input) => dispatch(\"storage\", \"endDownload\", \"mutation\", input),\n listLocations: (input) => dispatch(\"storage\", \"listLocations\", \"query\", input),\n getDefaultLocation: (input) => dispatch(\"storage\", \"getDefaultLocation\", \"query\", input),\n upsertLocation: (input) => dispatch(\"storage\", \"upsertLocation\", \"mutation\", input),\n deleteLocation: (input) => dispatch(\"storage\", \"deleteLocation\", \"mutation\", input),\n testLocation: (input) => dispatch(\"storage\", \"testLocation\", \"query\", input),\n listProviders: (input) => dispatch(\"storage\", \"listProviders\", \"query\", input),\n testConfig: (input) => dispatch(\"storage\", \"testConfig\", \"query\", input)\n };\n const streamBrokerInterface = {\n listAllCameraStreams: (input) => dispatch(\"streamBroker\", \"listAllCameraStreams\", \"query\", input),\n listAllProfileSlots: (input) => dispatch(\"streamBroker\", \"listAllProfileSlots\", \"query\", input),\n getBrokerStats: (input) => dispatch(\"streamBroker\", \"getBrokerStats\", \"query\", input),\n listClients: (input) => dispatch(\"streamBroker\", \"listClients\", \"query\", input),\n killClient: (input) => dispatch(\"streamBroker\", \"killClient\", \"mutation\", input),\n getStreamUrl: (input) => dispatch(\"streamBroker\", \"getStreamUrl\", \"query\", input),\n getStreamWithCodec: (input) => dispatch(\"streamBroker\", \"getStreamWithCodec\", \"mutation\", input),\n releaseStreamWithCodec: (input) => dispatch(\"streamBroker\", \"releaseStreamWithCodec\", \"mutation\", input),\n subscribeAudioChunks: (input) => dispatch(\"streamBroker\", \"subscribeAudioChunks\", \"mutation\", input),\n pullAudioChunks: (input) => dispatch(\"streamBroker\", \"pullAudioChunks\", \"query\", input),\n unsubscribeAudioChunks: (input) => dispatch(\"streamBroker\", \"unsubscribeAudioChunks\", \"mutation\", input),\n subscribeFrames: (input) => dispatch(\"streamBroker\", \"subscribeFrames\", \"mutation\", input),\n pullFrameHandles: (input) => dispatch(\"streamBroker\", \"pullFrameHandles\", \"query\", input),\n unsubscribeFrames: (input) => dispatch(\"streamBroker\", \"unsubscribeFrames\", \"mutation\", input),\n setPreBufferDuration: (input) => dispatch(\"streamBroker\", \"setPreBufferDuration\", \"mutation\", input),\n getPreBufferInfo: (input) => dispatch(\"streamBroker\", \"getPreBufferInfo\", \"query\", input),\n getRtspPort: (input) => dispatch(\"streamBroker\", \"getRtspPort\", \"query\", input),\n getAllRtspEntries: (input) => dispatch(\"streamBroker\", \"getAllRtspEntries\", \"query\", input),\n getRtspEntry: (input) => dispatch(\"streamBroker\", \"getRtspEntry\", \"query\", input),\n regenerateRtspToken: (input) => dispatch(\"streamBroker\", \"regenerateRtspToken\", \"mutation\", input),\n setRtspEnabled: (input) => dispatch(\"streamBroker\", \"setRtspEnabled\", \"mutation\", input),\n isRtspEnabled: (input) => dispatch(\"streamBroker\", \"isRtspEnabled\", \"query\", input)\n };\n const systemInterface = {\n info: (input) => dispatch(\"system\", \"info\", \"query\", input),\n health: (input) => dispatch(\"system\", \"health\", \"query\", input),\n featureFlags: (input) => dispatch(\"system\", \"featureFlags\", \"query\", input),\n networkAddresses: (input) => dispatch(\"system\", \"networkAddresses\", \"query\", input),\n getRetentionConfig: (input) => dispatch(\"system\", \"getRetentionConfig\", \"query\", input),\n setRetentionConfig: (input) => dispatch(\"system\", \"setRetentionConfig\", \"mutation\", input),\n forceRetentionCleanup: (input) => dispatch(\"system\", \"forceRetentionCleanup\", \"mutation\", input)\n };\n const toastInterface = {\n onToast: (input, push) => dispatch(\"toast\", \"onToast\", \"subscription\", input, push)\n };\n const turnProviderInterface = {\n getTurnServers: (input) => dispatch(\"turnProvider\", \"getTurnServers\", \"query\", input)\n };\n const userManagementInterface = {\n listUsers: (input) => dispatch(\"userManagement\", \"listUsers\", \"query\", input),\n createUser: (input) => dispatch(\"userManagement\", \"createUser\", \"mutation\", input),\n updateUser: (input) => dispatch(\"userManagement\", \"updateUser\", \"mutation\", input),\n deleteUser: (input) => dispatch(\"userManagement\", \"deleteUser\", \"mutation\", input),\n resetPassword: (input) => dispatch(\"userManagement\", \"resetPassword\", \"mutation\", input),\n setUserScopes: (input) => dispatch(\"userManagement\", \"setUserScopes\", \"mutation\", input),\n validateCredentials: (input) => dispatch(\"userManagement\", \"validateCredentials\", \"mutation\", input),\n listApiKeys: (input) => dispatch(\"userManagement\", \"listApiKeys\", \"query\", input),\n createApiKey: (input) => dispatch(\"userManagement\", \"createApiKey\", \"mutation\", input),\n revokeApiKey: (input) => dispatch(\"userManagement\", \"revokeApiKey\", \"mutation\", input),\n validateApiKey: (input) => dispatch(\"userManagement\", \"validateApiKey\", \"mutation\", input),\n createScopedToken: (input) => dispatch(\"userManagement\", \"createScopedToken\", \"mutation\", input),\n revokeScopedToken: (input) => dispatch(\"userManagement\", \"revokeScopedToken\", \"mutation\", input),\n validateScopedToken: (input) => dispatch(\"userManagement\", \"validateScopedToken\", \"query\", input),\n listScopedTokens: (input) => dispatch(\"userManagement\", \"listScopedTokens\", \"query\", input),\n setupTotp: (input) => dispatch(\"userManagement\", \"setupTotp\", \"mutation\", input),\n confirmTotp: (input) => dispatch(\"userManagement\", \"confirmTotp\", \"mutation\", input),\n disableTotp: (input) => dispatch(\"userManagement\", \"disableTotp\", \"mutation\", input),\n getTotpStatus: (input) => dispatch(\"userManagement\", \"getTotpStatus\", \"query\", input),\n verifyTotp: (input) => dispatch(\"userManagement\", \"verifyTotp\", \"mutation\", input),\n oauthIssueCode: (input) => dispatch(\"userManagement\", \"oauthIssueCode\", \"mutation\", input),\n oauthExchangeCode: (input) => dispatch(\"userManagement\", \"oauthExchangeCode\", \"mutation\", input),\n oauthRefresh: (input) => dispatch(\"userManagement\", \"oauthRefresh\", \"mutation\", input),\n oauthVerifyAccessToken: (input) => dispatch(\"userManagement\", \"oauthVerifyAccessToken\", \"query\", input),\n listOauthSessions: (input) => dispatch(\"userManagement\", \"listOauthSessions\", \"query\", input),\n revokeOauthSession: (input) => dispatch(\"userManagement\", \"revokeOauthSession\", \"mutation\", input)\n };\n return {\n addonPages: addonPagesInterface,\n addons: addonsInterface,\n addonSettings: addonSettingsInterface,\n addonWidgets: addonWidgetsInterface,\n alerts: alertsInterface,\n audioAnalyzer: audioAnalyzerInterface,\n audioCodec: audioCodecInterface,\n backup: backupInterface,\n decoder: decoderInterface,\n deviceExport: deviceExportInterface,\n deviceManager: deviceManagerInterface,\n deviceProvider: deviceProviderInterface,\n deviceState: deviceStateInterface,\n integrations: integrationsInterface,\n localNetwork: localNetworkInterface,\n meshNetwork: meshNetworkInterface,\n metricsProvider: metricsProviderInterface,\n mqttBroker: mqttBrokerInterface,\n networkAccess: networkAccessInterface,\n networkQuality: networkQualityInterface,\n nodes: nodesInterface,\n notificationOutput: notificationOutputInterface,\n pipelineExecutor: pipelineExecutorInterface,\n pipelineOrchestrator: pipelineOrchestratorInterface,\n pipelineRunner: pipelineRunnerInterface,\n platformProbe: platformProbeInterface,\n recordingEngine: recordingEngineInterface,\n settingsStore: settingsStoreInterface,\n storage: storageInterface,\n streamBroker: streamBrokerInterface,\n system: systemInterface,\n toast: toastInterface,\n turnProvider: turnProviderInterface,\n userManagement: userManagementInterface\n };\n}\nconst STATE_CHANGED_CATEGORY = \"device.state-changed\";\nconst BINDING_CHANGED_CATEGORY = \"capability.binding-changed\";\nconst DEVICE_REGISTERED_CATEGORY = \"device.registered\";\nconst DEVICE_UNREGISTERED_CATEGORY = \"device.unregistered\";\nconst DEVICE_UPDATED_CATEGORY = \"device.updated\";\nclass SystemMirror {\n constructor(api) {\n this.api = api;\n this.stateSource = createMirrorSource(this.stateMirror, this.handleListeners, this.api);\n }\n /** deviceId → capName → slice (push-driven mirror). */\n stateMirror = /* @__PURE__ */ new Map();\n /** deviceId → binding (warm-boot + binding-changed events). */\n bindings = /* @__PURE__ */ new Map();\n /** deviceId → metadata (warm-boot + lifecycle events). */\n devices = /* @__PURE__ */ new Map();\n /** Listener map for individual `(deviceId, capName)` watches —\n * shared with every `MirrorSource` we hand out. */\n handleListeners = /* @__PURE__ */ new Map();\n /** Global state-change listeners registered via `listen()`. */\n globalStateListeners = /* @__PURE__ */ new Set();\n /** Per-cap state listeners registered via `listenCap(capName, …)`. */\n capListeners = /* @__PURE__ */ new Map();\n /** Per-device state listeners registered via `listenDevice(id, …)`. */\n deviceListeners = /* @__PURE__ */ new Map();\n /** Lifecycle listeners. */\n addedListeners = /* @__PURE__ */ new Set();\n removedListeners = /* @__PURE__ */ new Set();\n /** waitForState pending requests — keyed by an internal counter. */\n pendingWaits = /* @__PURE__ */ new Set();\n /** Memoised state source — every proxy shares it. */\n stateSource;\n /** Live event bridges — closed in `dispose()`. */\n bridges = [];\n initialized = false;\n initPromise = null;\n // ── Lifecycle ──────────────────────────────────────────────────────\n /**\n * Warm-boot: three round-trips (bindings + snapshots + listAll) and\n * then the live event subscriptions. Idempotent — concurrent callers\n * await the same in-flight Promise.\n *\n * Each warm-boot query is wrapped in a 15s timeout so a missing\n * endpoint or stuck broker poll surfaces as a clear error instead\n * of silently hanging the caller forever. The default is generous\n * enough for cluster-wide setups but short enough for ops to\n * notice and fix the underlying transport issue.\n */\n async init(timeoutMs = 15e3) {\n if (this.initialized) return;\n if (this.initPromise) return this.initPromise;\n this.initPromise = (async () => {\n const withTimeout2 = (p, label) => {\n if (!Number.isFinite(timeoutMs)) return p;\n return new Promise((resolve, reject) => {\n const timer = setTimeout(\n () => reject(new Error(`SystemMirror.init: '${label}' timed out after ${timeoutMs}ms`)),\n timeoutMs\n );\n p.then(\n (v) => {\n clearTimeout(timer);\n resolve(v);\n },\n (err) => {\n clearTimeout(timer);\n reject(err);\n }\n );\n });\n };\n const [allBindings, allSnapshots, allDevices] = await Promise.all([\n withTimeout2(this.api.deviceManager.getAllBindings.query({}), \"deviceManager.getAllBindings\"),\n withTimeout2(this.api.deviceState.getAllSnapshots.query({}), \"deviceState.getAllSnapshots\"),\n withTimeout2(this.api.deviceManager.listAll.query({}), \"deviceManager.listAll\")\n ]);\n for (const b of allBindings) this.bindings.set(b.deviceId, b);\n for (const [deviceIdStr, perCap] of Object.entries(allSnapshots)) {\n const deviceId = Number(deviceIdStr);\n if (!Number.isFinite(deviceId)) continue;\n const capMap = /* @__PURE__ */ new Map();\n for (const [capName, slice] of Object.entries(perCap)) capMap.set(capName, slice);\n this.stateMirror.set(deviceId, capMap);\n }\n for (const info of allDevices) this.devices.set(info.id, info);\n try {\n this.subscribeBus();\n } catch (err) {\n }\n this.initialized = true;\n })();\n try {\n await this.initPromise;\n } finally {\n this.initPromise = null;\n }\n }\n /** True after `init()` resolves. */\n isReady() {\n return this.initialized;\n }\n /** Promise that resolves once `init()` has completed. */\n async awaitReady() {\n if (this.initialized) return;\n if (this.initPromise) return this.initPromise;\n return this.init();\n }\n /**\n * Tear down the event bridges + clear listener registries. Existing\n * proxy references become inert (slice reads keep working off the\n * stale mirror, but no further updates arrive).\n */\n dispose() {\n for (const b of this.bridges) {\n try {\n b.unsubscribe();\n } catch {\n }\n }\n this.bridges = [];\n this.handleListeners.clear();\n this.globalStateListeners.clear();\n this.capListeners.clear();\n this.deviceListeners.clear();\n this.addedListeners.clear();\n this.removedListeners.clear();\n this.pendingWaits.clear();\n this.initialized = false;\n }\n // ── Lookup ─────────────────────────────────────────────────────────\n /** Sync lookup by numeric id. `null` if unknown. */\n getDeviceById(deviceId) {\n const binding = this.bindings.get(deviceId);\n if (!binding) return null;\n return createDeviceProxy(this.api, binding, { stateSource: this.stateSource });\n }\n /** Sync lookup by display name (exact match). `null` if unknown. */\n getDeviceByName(name) {\n for (const info of this.devices.values()) {\n if (info.name === name) return this.getDeviceById(info.id);\n }\n return null;\n }\n /** Sync lookup by stableId (the addon-scoped external id). */\n getDeviceByStableId(stableId) {\n for (const info of this.devices.values()) {\n if (info.stableId === stableId) return this.getDeviceById(info.id);\n }\n return null;\n }\n /** All devices owned by an addon. */\n getDevicesByAddon(addonId) {\n return this.query({ addonId });\n }\n /** All devices of a given `DeviceType`. */\n getDevicesByType(type) {\n return this.query({ type });\n }\n /**\n * Live metadata snapshot for a device. Same shape as\n * `deviceManager.getDevice(id)`; sync from the mirror.\n */\n getDeviceInfo(deviceId) {\n return this.devices.get(deviceId) ?? null;\n }\n /** Snapshot of every known device as a typed proxy. */\n getAllDevices() {\n const out = [];\n for (const id of this.bindings.keys()) {\n const proxy = this.getDeviceById(id);\n if (proxy) out.push(proxy);\n }\n return out;\n }\n /** Filter devices by cap presence — shorthand for `query({caps: capName})`. */\n filterByCap(capName) {\n return this.query({ caps: capName });\n }\n // ── Unified query ──────────────────────────────────────────────────\n /**\n * Filter the fleet against a structured filter set. All fields ANDed,\n * arrays ORed within a single field. Returns proxies — chain with\n * cap-method calls or state reads as needed.\n *\n * Examples:\n *\n * sm.query({ addonId: 'reolink', online: true })\n * sm.query({ type: DeviceType.Camera, caps: ['snapshot', 'motion'] })\n * sm.query({ id: [1, 2, 3] })\n * sm.query({ name: { contains: 'sala' } })\n * sm.query({ name: /^cam-\\d+$/ })\n * sm.query({ parentDeviceId: 8 }) // accessories of cam 8\n * sm.query({ where: (info, dev) => dev.state.battery.value?.sleeping })\n */\n query(filters = {}) {\n const out = [];\n for (const [deviceId, binding] of this.bindings) {\n const info = this.devices.get(deviceId);\n if (filters.id !== void 0 && !inSet(deviceId, filters.id)) continue;\n if (filters.stableId !== void 0) {\n if (!info) continue;\n if (!inSet(info.stableId, filters.stableId)) continue;\n }\n if (filters.addonId !== void 0) {\n if (!info) continue;\n if (!inSet(info.addonId, filters.addonId)) continue;\n }\n if (filters.type !== void 0) {\n if (!info) continue;\n if (!inSet(info.type, filters.type)) continue;\n }\n if (filters.caps !== void 0) {\n const required = toArray(filters.caps);\n const bound = new Set(binding.entries.map((e) => e.capName));\n if (!required.every((c) => bound.has(c))) continue;\n }\n if (filters.anyCap !== void 0) {\n const wanted = toArray(filters.anyCap);\n const bound = new Set(binding.entries.map((e) => e.capName));\n if (!wanted.some((c) => bound.has(c))) continue;\n }\n if (filters.name !== void 0) {\n if (!info) continue;\n if (!matchesString(info.name, filters.name)) continue;\n }\n if (filters.online !== void 0) {\n if (!info) continue;\n if (info.online !== filters.online) continue;\n }\n if (filters.parentDeviceId !== void 0) {\n if (!info) continue;\n const want = filters.parentDeviceId;\n const got = info.parentDeviceId ?? null;\n if (got !== want) continue;\n }\n if (filters.feature !== void 0) {\n if (!info) continue;\n const want = toArray(filters.feature);\n if (!want.every((f) => info.features.includes(f))) continue;\n }\n if (filters.isCamera !== void 0) {\n if (!info) continue;\n if (info.isCamera !== filters.isCamera) continue;\n }\n const proxy = this.getDeviceById(deviceId);\n if (!proxy) continue;\n if (filters.where && info) {\n if (!filters.where(info, proxy)) continue;\n } else if (filters.where && !info) {\n continue;\n }\n out.push(proxy);\n }\n return out;\n }\n // ── State-driven queries ───────────────────────────────────────────\n /**\n * Return every proxy whose runtime-state slice for `capName` matches\n * `predicate`. Devices without the cap or without a slice are\n * skipped. The predicate receives a typed slice reference — pass\n * the typed cap (e.g. `'battery'`) and TypeScript widens to\n * `Record<string, unknown>`; cast inside the predicate body if the\n * caller knows the cap shape.\n */\n whereState(capName, predicate) {\n const out = [];\n for (const [deviceId, perCap] of this.stateMirror) {\n const slice = perCap.get(capName);\n if (!slice) continue;\n if (!predicate(slice, deviceId)) continue;\n const proxy = this.getDeviceById(deviceId);\n if (proxy) out.push(proxy);\n }\n return out;\n }\n /** Map every device's slice for `capName` to a derived value. Devices\n * without the cap or without a slice are skipped. */\n mapState(capName, mapper) {\n const out = [];\n for (const [deviceId, perCap] of this.stateMirror) {\n const slice = perCap.get(capName);\n if (!slice) continue;\n out.push(mapper(slice, deviceId));\n }\n return out;\n }\n /** First device whose slice matches `predicate`, or null. */\n findState(capName, predicate) {\n for (const [deviceId, perCap] of this.stateMirror) {\n const slice = perCap.get(capName);\n if (!slice) continue;\n if (!predicate(slice, deviceId)) continue;\n return this.getDeviceById(deviceId);\n }\n return null;\n }\n /** Count devices that bind a cap. Faster than `filterByCap(...).length`. */\n countByCap(capName) {\n let n = 0;\n for (const binding of this.bindings.values()) {\n if (binding.entries.some((e) => e.capName === capName)) n++;\n }\n return n;\n }\n /** Count devices whose slice for `capName` matches `predicate`. */\n countByState(capName, predicate) {\n let n = 0;\n for (const [deviceId, perCap] of this.stateMirror) {\n const slice = perCap.get(capName);\n if (!slice) continue;\n if (predicate(slice, deviceId)) n++;\n }\n return n;\n }\n // ── Listeners ──────────────────────────────────────────────────────\n /**\n * Global listener — fires for every `device.state-changed` event the\n * mirror absorbs.\n */\n listen(cb2) {\n this.globalStateListeners.add(cb2);\n return () => {\n this.globalStateListeners.delete(cb2);\n };\n }\n /**\n * Per-cap listener — fires only for state changes on `capName`,\n * across every device. The callback receives the deviceId so the\n * caller can route.\n */\n listenCap(capName, cb2) {\n let set = this.capListeners.get(capName);\n if (!set) {\n set = /* @__PURE__ */ new Set();\n this.capListeners.set(capName, set);\n }\n set.add(cb2);\n return () => {\n set.delete(cb2);\n if (set.size === 0) this.capListeners.delete(capName);\n };\n }\n /**\n * Per-device listener — fires for every cap change on `deviceId`.\n */\n listenDevice(deviceId, cb2) {\n let set = this.deviceListeners.get(deviceId);\n if (!set) {\n set = /* @__PURE__ */ new Set();\n this.deviceListeners.set(deviceId, set);\n }\n set.add(cb2);\n return () => {\n set.delete(cb2);\n if (set.size === 0) this.deviceListeners.delete(deviceId);\n };\n }\n /** Fires when `device.registered` lands. Receives the new metadata. */\n onDeviceAdded(cb2) {\n this.addedListeners.add(cb2);\n return () => {\n this.addedListeners.delete(cb2);\n };\n }\n /** Fires when `device.unregistered` lands. `info` is the LAST-known\n * metadata (or null if the device was never seen). */\n onDeviceRemoved(cb2) {\n this.removedListeners.add(cb2);\n return () => {\n this.removedListeners.delete(cb2);\n };\n }\n // ── Wait primitives ────────────────────────────────────────────────\n /**\n * Resolve when `predicate` over the runtime-state slice for\n * `(deviceId, capName)` becomes true. Resolves immediately if the\n * current slice already matches. Rejects with `Error('timeout')`\n * after `timeoutMs` (default 30s; pass `Infinity` to wait forever).\n *\n * Returns the matching slice — caller can read it directly without\n * a second mirror lookup.\n */\n waitForState(deviceId, capName, predicate, timeoutMs = 3e4) {\n return new Promise((resolve, reject) => {\n const check = () => {\n const slice = this.stateMirror.get(deviceId)?.get(capName);\n if (slice && predicate(slice)) return slice;\n return null;\n };\n const initial = check();\n if (initial) {\n resolve(initial);\n return;\n }\n let timer = null;\n const off = this.listenDevice(deviceId, (_id, cap, slice) => {\n if (cap !== capName) return;\n if (!slice) return;\n if (predicate(slice)) {\n if (timer) clearTimeout(timer);\n off();\n resolve(slice);\n }\n });\n if (Number.isFinite(timeoutMs)) {\n timer = setTimeout(() => {\n off();\n reject(new Error(`waitForState timed out after ${timeoutMs}ms (deviceId=${deviceId}, capName=${capName})`));\n }, timeoutMs);\n }\n });\n }\n /**\n * Resolve when a device with `deviceId` becomes available (a\n * binding exists). Resolves immediately if already known. Rejects\n * with timeout.\n */\n waitForDevice(deviceId, timeoutMs = 3e4) {\n return new Promise((resolve, reject) => {\n const existing = this.getDeviceById(deviceId);\n if (existing) {\n resolve(existing);\n return;\n }\n let timer = null;\n const off = this.onDeviceAdded((id) => {\n if (id !== deviceId) return;\n const proxy = this.getDeviceById(id);\n if (!proxy) return;\n if (timer) clearTimeout(timer);\n off();\n resolve(proxy);\n });\n if (Number.isFinite(timeoutMs)) {\n timer = setTimeout(() => {\n off();\n reject(new Error(`waitForDevice timed out after ${timeoutMs}ms (deviceId=${deviceId})`));\n }, timeoutMs);\n }\n });\n }\n // ── Batch actions ──────────────────────────────────────────────────\n /**\n * Iterate every device that binds `capName`. Awaits each callback\n * sequentially — for parallel use `invokeCap` with explicit\n * parallelism.\n */\n async forEachCap(capName, cb2) {\n for (const proxy of this.filterByCap(capName)) {\n await cb2(proxy);\n }\n }\n /**\n * Invoke a cap method on every device that binds the cap. Returns\n * one result per device, success or failure isolated. Optional\n * parallelism cap — useful for \"snapshot all cameras but only 4\n * at a time so battery cams don't all wake at once\".\n *\n * Example:\n *\n * const results = await sm.invokeCap('snapshot', 'getSnapshot', {}, { parallelism: 4 })\n * const failed = results.filter(r => !r.ok)\n */\n async invokeCap(capName, methodName, args, opts = {}) {\n const targets = this.filterByCap(capName);\n const parallelism = Math.max(1, opts.parallelism ?? targets.length);\n const out = [];\n for (let i = 0; i < targets.length; i += parallelism) {\n const chunk = targets.slice(i, i + parallelism);\n const settled = await Promise.allSettled(\n chunk.map(async (proxy) => {\n const cap = proxy[capName];\n if (!cap || typeof cap[methodName] !== \"function\") {\n throw new Error(`device '${proxy.deviceId}' does not expose '${capName}.${methodName}'`);\n }\n return await cap[methodName](args);\n })\n );\n for (let j = 0; j < settled.length; j++) {\n const proxy = chunk[j];\n const r = settled[j];\n if (r.status === \"fulfilled\") {\n out.push({ deviceId: proxy.deviceId, ok: true, result: r.value });\n } else {\n out.push({ deviceId: proxy.deviceId, ok: false, error: r.reason });\n }\n }\n }\n return out;\n }\n // ── Diagnostics ────────────────────────────────────────────────────\n /**\n * One-shot summary — fleet size, breakdown by cap / addon / type.\n * Designed for REPL inspection (`sm.summary()`).\n */\n summary() {\n const byCap = {};\n const byAddon = {};\n const byType = {};\n let online = 0;\n let offline = 0;\n for (const binding of this.bindings.values()) {\n for (const entry of binding.entries) {\n byCap[entry.capName] = (byCap[entry.capName] ?? 0) + 1;\n }\n }\n for (const info of this.devices.values()) {\n byAddon[info.addonId] = (byAddon[info.addonId] ?? 0) + 1;\n byType[info.type] = (byType[info.type] ?? 0) + 1;\n if (info.online) online++;\n else offline++;\n }\n return {\n totalDevices: this.bindings.size,\n online,\n offline,\n byCap,\n byAddon,\n byType,\n statedDevices: this.stateMirror.size\n };\n }\n /**\n * Debug-friendly dump — full state + binding + metadata for one\n * device or all devices. Cheap deep clone so caller mutations don't\n * leak into the mirror.\n */\n dump(deviceId) {\n const dumpOne = (id) => {\n const info = this.devices.get(id) ?? null;\n const binding = this.bindings.get(id) ?? null;\n const state = {};\n const perCap = this.stateMirror.get(id);\n if (perCap) {\n for (const [cap, slice] of perCap) state[cap] = { ...slice };\n }\n return {\n deviceId: id,\n info,\n binding: binding ? { ...binding, entries: binding.entries.map((e) => ({ ...e })) } : null,\n state\n };\n };\n if (deviceId !== void 0) return dumpOne(deviceId);\n const out = [];\n for (const id of this.bindings.keys()) out.push(dumpOne(id));\n return out;\n }\n /**\n * Direct read-only access to the underlying state mirror. Use\n * sparingly — `getSystemState` returns a deep copy that's safer for\n * exploratory work; this avoids the clone cost when iterating\n * thousands of slices.\n */\n getRawMirror() {\n return this.stateMirror;\n }\n /**\n * Snapshot of the full state mirror — same shape as the warm-boot\n * payload. Deep-cloned; safe to mutate.\n */\n getSystemState() {\n const copy = /* @__PURE__ */ new Map();\n for (const [id, perCap] of this.stateMirror) {\n const dup = /* @__PURE__ */ new Map();\n for (const [k, v] of perCap) dup.set(k, { ...v });\n copy.set(id, dup);\n }\n return copy;\n }\n // ── Internals ──────────────────────────────────────────────────────\n subscribeBus() {\n if (!this.api.live?.onEvent) return;\n const sub = this.api.live.onEvent;\n this.bridges.push(\n sub.subscribe(\n { category: STATE_CHANGED_CATEGORY },\n {\n onData: (evt) => {\n const data = evt.data;\n if (!data || typeof data.deviceId !== \"number\" || typeof data.capName !== \"string\") return;\n this.applyStateUpdate(data.deviceId, data.capName, data.slice);\n }\n }\n )\n );\n this.bridges.push(\n sub.subscribe(\n { category: BINDING_CHANGED_CATEGORY },\n {\n onData: (evt) => {\n const data = evt.data;\n const deviceId = typeof data?.deviceId === \"number\" ? data.deviceId : data?.source?.type === \"device\" && typeof data.source.id === \"number\" ? data.source.id : null;\n if (deviceId === null) return;\n void this.refreshBinding(deviceId);\n }\n }\n )\n );\n this.bridges.push(\n sub.subscribe(\n { category: DEVICE_REGISTERED_CATEGORY },\n {\n onData: (evt) => {\n const data = evt.data;\n if (typeof data?.deviceId !== \"number\") return;\n void this.refreshDeviceMetadata(data.deviceId, \"added\");\n }\n }\n )\n );\n this.bridges.push(\n sub.subscribe(\n { category: DEVICE_UNREGISTERED_CATEGORY },\n {\n onData: (evt) => {\n const data = evt.data;\n if (typeof data?.deviceId !== \"number\") return;\n this.applyDeviceRemoval(data.deviceId);\n }\n }\n )\n );\n this.bridges.push(\n sub.subscribe(\n { category: DEVICE_UPDATED_CATEGORY },\n {\n onData: (evt) => {\n const data = evt.data;\n if (typeof data?.deviceId !== \"number\") return;\n void this.refreshDeviceMetadata(data.deviceId, \"updated\");\n }\n }\n )\n );\n }\n applyStateUpdate(deviceId, capName, slice) {\n let perCap = this.stateMirror.get(deviceId);\n if (!perCap) {\n perCap = /* @__PURE__ */ new Map();\n this.stateMirror.set(deviceId, perCap);\n }\n if (slice === void 0) {\n perCap.delete(capName);\n } else {\n perCap.set(capName, slice);\n }\n const handleKey = `${deviceId}:${capName}`;\n const handleSet = this.handleListeners.get(handleKey);\n if (handleSet) {\n for (const cb2 of handleSet) {\n try {\n cb2(slice);\n } catch {\n }\n }\n }\n for (const cb2 of this.globalStateListeners) {\n try {\n cb2(deviceId, capName, slice);\n } catch {\n }\n }\n const capSet = this.capListeners.get(capName);\n if (capSet) {\n for (const cb2 of capSet) {\n try {\n cb2(deviceId, slice);\n } catch {\n }\n }\n }\n const devSet = this.deviceListeners.get(deviceId);\n if (devSet) {\n for (const cb2 of devSet) {\n try {\n cb2(deviceId, capName, slice);\n } catch {\n }\n }\n }\n }\n applyDeviceRemoval(deviceId) {\n const lastInfo = this.devices.get(deviceId) ?? null;\n this.bindings.delete(deviceId);\n this.devices.delete(deviceId);\n this.stateMirror.delete(deviceId);\n for (const cb2 of this.removedListeners) {\n try {\n cb2(deviceId, lastInfo);\n } catch {\n }\n }\n }\n async refreshBinding(deviceId) {\n try {\n const all = await this.api.deviceManager.getAllBindings.query({});\n const fresh = all.find((b) => b.deviceId === deviceId);\n if (fresh) {\n this.bindings.set(deviceId, fresh);\n } else {\n this.applyDeviceRemoval(deviceId);\n }\n } catch {\n }\n }\n async refreshDeviceMetadata(deviceId, kind) {\n try {\n const all = await this.api.deviceManager.listAll.query({});\n const info = all.find((d) => d.id === deviceId);\n if (!info) return;\n const wasNew = !this.devices.has(deviceId);\n this.devices.set(deviceId, info);\n if (kind === \"added\" && wasNew) {\n await this.refreshBinding(deviceId);\n for (const cb2 of this.addedListeners) {\n try {\n cb2(deviceId, info);\n } catch {\n }\n }\n }\n } catch {\n }\n }\n}\nfunction inSet(value, set) {\n if (Array.isArray(set)) return set.includes(value);\n return value === set;\n}\nfunction toArray(value) {\n return Array.isArray(value) ? value : [value];\n}\nfunction matchesString(haystack, match) {\n if (typeof match === \"string\") return haystack === match;\n if (match instanceof RegExp) return match.test(haystack);\n if (\"exact\" in match) return haystack === match.exact;\n if (\"contains\" in match) return haystack.toLowerCase().includes(match.contains.toLowerCase());\n return false;\n}\nfunction defineCustomActions(spec) {\n return spec;\n}\nfunction customAction(input, output, options) {\n return {\n input,\n output,\n kind: options?.kind ?? \"query\",\n auth: options?.auth ?? \"protected\",\n scope: options?.scope ?? { kind: \"system\" }\n };\n}\nconst STREAM_PROFILE_META = [\n { profile: \"main\", prefix: \"streamMain\", label: \"Main stream\" },\n { profile: \"sub\", prefix: \"streamSub\", label: \"Sub stream\" },\n { profile: \"ext\", prefix: \"streamExt\", label: \"Third stream\" }\n];\nfunction buildProfileSection(meta, opt, cur) {\n const fields = [];\n if (opt.resolutions.length > 0) {\n const resOptions = opt.resolutions.map((r) => ({\n value: `${String(r.width)}x${String(r.height)}`,\n label: `${String(r.width)}×${String(r.height)}`\n }));\n const curResValue = cur ? `${String(cur.width)}x${String(cur.height)}` : void 0;\n if (curResValue && !resOptions.some((o) => o.value === curResValue)) {\n resOptions.unshift({ value: curResValue, label: `${curResValue.replace(\"x\", \"×\")} (current)` });\n }\n fields.push({\n type: \"select\",\n key: `${meta.prefix}_resolution`,\n label: \"Resolution\",\n options: resOptions,\n default: curResValue ?? resOptions[0]?.value ?? \"\"\n });\n }\n if (opt.codecs.length > 0) {\n fields.push({\n type: \"select\",\n key: `${meta.prefix}_codec`,\n label: \"Codec\",\n options: opt.codecs.map((c) => ({ value: c, label: c === \"h264\" ? \"H.264\" : \"H.265\" })),\n default: cur?.codec ?? opt.codecs[0]\n });\n }\n if (opt.framerates.length > 0) {\n const fpsOptions = opt.framerates.map((f) => ({ value: String(f), label: `${String(f)} fps` }));\n const curFps = cur?.framerate;\n if (curFps !== void 0 && !opt.framerates.includes(curFps)) {\n fpsOptions.unshift({ value: String(curFps), label: `${String(curFps)} fps (current)` });\n }\n fields.push({\n type: \"select\",\n key: `${meta.prefix}_framerate`,\n label: \"Frame rate\",\n options: fpsOptions,\n default: curFps !== void 0 ? String(curFps) : fpsOptions[0]?.value ?? \"\"\n });\n }\n if (opt.bitrates.length > 0) {\n const brOptions = opt.bitrates.map((b) => ({ value: String(b), label: `${String(b)} kbps` }));\n const curBr = cur?.bitrate;\n if (curBr !== void 0 && !opt.bitrates.includes(curBr)) {\n brOptions.unshift({ value: String(curBr), label: `${String(curBr)} kbps (current)` });\n }\n fields.push({\n type: \"select\",\n key: `${meta.prefix}_bitrate`,\n label: \"Bitrate\",\n options: brOptions,\n default: curBr !== void 0 ? String(curBr) : brOptions[0]?.value ?? \"\"\n });\n } else {\n const range = opt.bitrateRange;\n fields.push({\n type: \"number\",\n key: `${meta.prefix}_bitrate`,\n label: \"Bitrate\",\n unit: \"kbps\",\n ...range ? { min: range[0], max: range[1] } : {},\n default: cur?.bitrate ?? range?.[0] ?? 0\n });\n }\n if (opt.supportsBitrateMode) {\n fields.push({\n type: \"select\",\n key: `${meta.prefix}_bitrateMode`,\n label: \"Bitrate mode\",\n options: [\n { value: \"vbr\", label: \"VBR (variable)\" },\n { value: \"cbr\", label: \"CBR (constant)\" }\n ],\n default: cur?.bitrateMode ?? \"vbr\"\n });\n }\n if (opt.supportsEncoderProfile) {\n fields.push({\n type: \"select\",\n key: `${meta.prefix}_encoderProfile`,\n label: \"Encoder profile\",\n options: [\n { value: \"baseline\", label: \"Baseline\" },\n { value: \"main\", label: \"Main\" },\n { value: \"high\", label: \"High\" }\n ],\n default: cur?.encoderProfile ?? \"main\"\n });\n }\n if (opt.supportsGop) {\n const range = opt.gop;\n if (range) {\n const gopOptions = [];\n for (let v = range.min; v <= range.max; v += range.step) {\n gopOptions.push({ value: String(v), label: `${String(v)} s` });\n }\n const curGop = cur?.gop;\n if (curGop !== void 0 && !gopOptions.some((o) => o.value === String(curGop))) {\n gopOptions.unshift({ value: String(curGop), label: `${String(curGop)} s (current)` });\n }\n fields.push({\n type: \"select\",\n key: `${meta.prefix}_gop`,\n label: \"I-frame interval (GOP)\",\n options: gopOptions,\n default: curGop !== void 0 ? String(curGop) : gopOptions[0]?.value ?? \"\"\n });\n } else {\n fields.push({\n type: \"number\",\n key: `${meta.prefix}_gop`,\n label: \"I-frame interval (GOP)\",\n unit: \"s\",\n min: 1,\n default: cur?.gop ?? 1\n });\n }\n }\n if (fields.length === 0) return null;\n return {\n id: `stream-${meta.profile}`,\n tab: \"streaming\",\n title: meta.label,\n description: \"Encoder parameters pushed to the camera. Option lists are read live from the camera — fields the firmware doesn't expose are hidden.\",\n columns: 2,\n fields\n };\n}\nfunction buildStreamParamsConfigSchema(options, status) {\n const sections = [];\n for (const meta of STREAM_PROFILE_META) {\n const opt = options[meta.profile];\n if (!opt) continue;\n const section = buildProfileSection(meta, opt, status?.[meta.profile]);\n if (section) sections.push(section);\n }\n if (sections.length === 0) return null;\n return { sections };\n}\nfunction parseStreamParamsFormPatch(patch, prefix) {\n const out = {};\n let touched = false;\n const resKey = `${prefix}_resolution`;\n if (resKey in patch && typeof patch[resKey] === \"string\") {\n const [w, h] = patch[resKey].split(\"x\").map(Number);\n if (Number.isFinite(w) && Number.isFinite(h)) {\n out.width = w;\n out.height = h;\n touched = true;\n }\n }\n const codecKey = `${prefix}_codec`;\n if (codecKey in patch && (patch[codecKey] === \"h264\" || patch[codecKey] === \"h265\")) {\n out.codec = patch[codecKey];\n touched = true;\n }\n const fpsKey = `${prefix}_framerate`;\n if (fpsKey in patch) {\n const fps = Number(patch[fpsKey]);\n if (Number.isFinite(fps)) {\n out.framerate = fps;\n touched = true;\n }\n }\n const brKey = `${prefix}_bitrate`;\n if (brKey in patch) {\n const br2 = Number(patch[brKey]);\n if (Number.isFinite(br2)) {\n out.bitrate = br2;\n touched = true;\n }\n }\n const modeKey = `${prefix}_bitrateMode`;\n if (modeKey in patch && (patch[modeKey] === \"vbr\" || patch[modeKey] === \"cbr\")) {\n out.bitrateMode = patch[modeKey];\n touched = true;\n }\n const profKey = `${prefix}_encoderProfile`;\n if (profKey in patch && (patch[profKey] === \"high\" || patch[profKey] === \"main\" || patch[profKey] === \"baseline\")) {\n out.encoderProfile = patch[profKey];\n touched = true;\n }\n const gopKey = `${prefix}_gop`;\n if (gopKey in patch) {\n const gop = Number(patch[gopKey]);\n if (Number.isFinite(gop)) {\n out.gop = gop;\n touched = true;\n }\n }\n return touched ? out : null;\n}\nconst CAPABILITY_NAMES = {\n accessories: \"accessories\",\n addonPages: \"addon-pages\",\n addonPagesSource: \"addon-pages-source\",\n addonRoutes: \"addon-routes\",\n addonSettings: \"addon-settings\",\n addonWidgets: \"addon-widgets\",\n addonWidgetsSource: \"addon-widgets-source\",\n addons: \"addons\",\n adminUi: \"admin-ui\",\n advancedNotifier: \"advanced-notifier\",\n alerts: \"alerts\",\n audioAnalysis: \"audio-analysis\",\n audioAnalyzer: \"audio-analyzer\",\n audioCodec: \"audio-codec\",\n audioMetrics: \"audio-metrics\",\n authProvider: \"auth-provider\",\n backup: \"backup\",\n battery: \"battery\",\n brightness: \"brightness\",\n cameraCredentials: \"camera-credentials\",\n cameraPipelineConfig: \"camera-pipeline-config\",\n cameraStreams: \"camera-streams\",\n decoder: \"decoder\",\n detectionPipeline: \"detection-pipeline\",\n deviceDiscovery: \"device-discovery\",\n deviceExport: \"device-export\",\n deviceManager: \"device-manager\",\n deviceOps: \"device-ops\",\n deviceProvider: \"device-provider\",\n deviceState: \"device-state\",\n deviceStatus: \"device-status\",\n doorbell: \"doorbell\",\n embeddingEncoder: \"embedding-encoder\",\n events: \"events\",\n featureProbe: \"feature-probe\",\n integrations: \"integrations\",\n intercom: \"intercom\",\n localNetwork: \"local-network\",\n logDestination: \"log-destination\",\n meshNetwork: \"mesh-network\",\n metricsProvider: \"metrics-provider\",\n motion: \"motion\",\n motionDetection: \"motion-detection\",\n motionTrigger: \"motion-trigger\",\n motionZones: \"motion-zones\",\n mqttBroker: \"mqtt-broker\",\n nativeObjectDetection: \"native-object-detection\",\n networkAccess: \"network-access\",\n networkQuality: \"network-quality\",\n nodes: \"nodes\",\n notificationOutput: \"notification-output\",\n oauthIntegration: \"oauth-integration\",\n osd: \"osd\",\n pipelineAnalytics: \"pipeline-analytics\",\n pipelineExecutor: \"pipeline-executor\",\n pipelineOrchestrator: \"pipeline-orchestrator\",\n pipelineRunner: \"pipeline-runner\",\n platformProbe: \"platform-probe\",\n privacyMask: \"privacy-mask\",\n ptz: \"ptz\",\n ptzAutotrack: \"ptz-autotrack\",\n reboot: \"reboot\",\n recording: \"recording\",\n recordingEngine: \"recording-engine\",\n restreamer: \"restreamer\",\n settingsStore: \"settings-store\",\n smtpProvider: \"smtp-provider\",\n snapshot: \"snapshot\",\n snapshotProvider: \"snapshot-provider\",\n ssoBridge: \"sso-bridge\",\n storage: \"storage\",\n storageProvider: \"storage-provider\",\n streamBroker: \"stream-broker\",\n streamCatalog: \"stream-catalog\",\n streamParams: \"stream-params\",\n streamingEngine: \"streaming-engine\",\n switch: \"switch\",\n system: \"system\",\n toast: \"toast\",\n turnProvider: \"turn-provider\",\n userManagement: \"user-management\",\n userPasskeys: \"user-passkeys\",\n webrtc: \"webrtc\",\n webrtcSession: \"webrtc-session\",\n zoneAnalytics: \"zone-analytics\",\n zoneRules: \"zone-rules\",\n zones: \"zones\"\n};\nconst CAPABILITY_ROUTER_KEYS = [\n { key: \"accessories\", name: \"accessories\" },\n { key: \"addonPages\", name: \"addon-pages\" },\n { key: \"addonPagesSource\", name: \"addon-pages-source\" },\n { key: \"addonRoutes\", name: \"addon-routes\" },\n { key: \"addonSettings\", name: \"addon-settings\" },\n { key: \"addonWidgets\", name: \"addon-widgets\" },\n { key: \"addonWidgetsSource\", name: \"addon-widgets-source\" },\n { key: \"addons\", name: \"addons\" },\n { key: \"adminUi\", name: \"admin-ui\" },\n { key: \"advancedNotifier\", name: \"advanced-notifier\" },\n { key: \"alerts\", name: \"alerts\" },\n { key: \"audioAnalysis\", name: \"audio-analysis\" },\n { key: \"audioAnalyzer\", name: \"audio-analyzer\" },\n { key: \"audioCodec\", name: \"audio-codec\" },\n { key: \"audioMetrics\", name: \"audio-metrics\" },\n { key: \"authProvider\", name: \"auth-provider\" },\n { key: \"backup\", name: \"backup\" },\n { key: \"battery\", name: \"battery\" },\n { key: \"brightness\", name: \"brightness\" },\n { key: \"cameraCredentials\", name: \"camera-credentials\" },\n { key: \"cameraPipelineConfig\", name: \"camera-pipeline-config\" },\n { key: \"cameraStreams\", name: \"camera-streams\" },\n { key: \"decoder\", name: \"decoder\" },\n { key: \"detectionPipeline\", name: \"detection-pipeline\" },\n { key: \"deviceDiscovery\", name: \"device-discovery\" },\n { key: \"deviceExport\", name: \"device-export\" },\n { key: \"deviceManager\", name: \"device-manager\" },\n { key: \"deviceOps\", name: \"device-ops\" },\n { key: \"deviceProvider\", name: \"device-provider\" },\n { key: \"deviceState\", name: \"device-state\" },\n { key: \"deviceStatus\", name: \"device-status\" },\n { key: \"doorbell\", name: \"doorbell\" },\n { key: \"embeddingEncoder\", name: \"embedding-encoder\" },\n { key: \"events\", name: \"events\" },\n { key: \"featureProbe\", name: \"feature-probe\" },\n { key: \"integrations\", name: \"integrations\" },\n { key: \"intercom\", name: \"intercom\" },\n { key: \"localNetwork\", name: \"local-network\" },\n { key: \"logDestination\", name: \"log-destination\" },\n { key: \"meshNetwork\", name: \"mesh-network\" },\n { key: \"metricsProvider\", name: \"metrics-provider\" },\n { key: \"motion\", name: \"motion\" },\n { key: \"motionDetection\", name: \"motion-detection\" },\n { key: \"motionTrigger\", name: \"motion-trigger\" },\n { key: \"motionZones\", name: \"motion-zones\" },\n { key: \"mqttBroker\", name: \"mqtt-broker\" },\n { key: \"nativeObjectDetection\", name: \"native-object-detection\" },\n { key: \"networkAccess\", name: \"network-access\" },\n { key: \"networkQuality\", name: \"network-quality\" },\n { key: \"nodes\", name: \"nodes\" },\n { key: \"notificationOutput\", name: \"notification-output\" },\n { key: \"oauthIntegration\", name: \"oauth-integration\" },\n { key: \"osd\", name: \"osd\" },\n { key: \"pipelineAnalytics\", name: \"pipeline-analytics\" },\n { key: \"pipelineExecutor\", name: \"pipeline-executor\" },\n { key: \"pipelineOrchestrator\", name: \"pipeline-orchestrator\" },\n { key: \"pipelineRunner\", name: \"pipeline-runner\" },\n { key: \"platformProbe\", name: \"platform-probe\" },\n { key: \"privacyMask\", name: \"privacy-mask\" },\n { key: \"ptz\", name: \"ptz\" },\n { key: \"ptzAutotrack\", name: \"ptz-autotrack\" },\n { key: \"reboot\", name: \"reboot\" },\n { key: \"recording\", name: \"recording\" },\n { key: \"recordingEngine\", name: \"recording-engine\" },\n { key: \"restreamer\", name: \"restreamer\" },\n { key: \"settingsStore\", name: \"settings-store\" },\n { key: \"smtpProvider\", name: \"smtp-provider\" },\n { key: \"snapshot\", name: \"snapshot\" },\n { key: \"snapshotProvider\", name: \"snapshot-provider\" },\n { key: \"ssoBridge\", name: \"sso-bridge\" },\n { key: \"storage\", name: \"storage\" },\n { key: \"storageProvider\", name: \"storage-provider\" },\n { key: \"streamBroker\", name: \"stream-broker\" },\n { key: \"streamCatalog\", name: \"stream-catalog\" },\n { key: \"streamParams\", name: \"stream-params\" },\n { key: \"streamingEngine\", name: \"streaming-engine\" },\n { key: \"switch\", name: \"switch\" },\n { key: \"system\", name: \"system\" },\n { key: \"toast\", name: \"toast\" },\n { key: \"turnProvider\", name: \"turn-provider\" },\n { key: \"userManagement\", name: \"user-management\" },\n { key: \"userPasskeys\", name: \"user-passkeys\" },\n { key: \"webrtc\", name: \"webrtc\" },\n { key: \"webrtcSession\", name: \"webrtc-session\" },\n { key: \"zoneAnalytics\", name: \"zone-analytics\" },\n { key: \"zoneRules\", name: \"zone-rules\" },\n { key: \"zones\", name: \"zones\" }\n];\nconst ALL_CAPABILITY_DEFINITIONS = [\n accessoriesCapability,\n addonPagesCapability,\n addonPagesSourceCapability,\n addonRoutesCapability,\n addonSettingsCapability,\n addonWidgetsCapability,\n addonWidgetsSourceCapability,\n addonsCapability,\n adminUiCapability,\n advancedNotifierCapability,\n alertsCapability,\n audioAnalysisCapability,\n audioAnalyzerCapability,\n audioCodecCapability,\n audioMetricsCapability,\n authProviderCapability,\n backupCapability,\n batteryCapability,\n brightnessCapability,\n cameraCredentialsCapability,\n cameraPipelineConfigCapability,\n cameraStreamsCapability,\n decoderCapability,\n detectionPipelineCapability,\n deviceDiscoveryCapability,\n deviceExportCapability,\n deviceManagerCapability,\n deviceOpsCapability,\n deviceProviderCapability,\n deviceStateCapability,\n deviceStatusCapability,\n doorbellCapability,\n embeddingEncoderCapability,\n eventsCapability,\n featureProbeCapability,\n integrationsCapability,\n intercomCapability,\n localNetworkCapability,\n logDestinationCapability,\n meshNetworkCapability,\n metricsProviderCapability,\n motionCapability,\n motionDetectionCapability,\n motionTriggerCapability,\n motionZonesCapability,\n mqttBrokerCapability,\n nativeObjectDetectionCapability,\n networkAccessCapability,\n networkQualityCapability,\n nodesCapability,\n notificationOutputCapability,\n oauthIntegrationCapability,\n osdCapability,\n pipelineAnalyticsCapability,\n pipelineExecutorCapability,\n pipelineOrchestratorCapability,\n pipelineRunnerCapability,\n platformProbeCapability,\n privacyMaskCapability,\n ptzCapability,\n ptzAutotrackCapability,\n rebootCapability,\n recordingCapability,\n recordingEngineCapability,\n restreamerCapability,\n settingsStoreCapability,\n smtpProviderCapability,\n snapshotCapability,\n snapshotProviderCapability,\n ssoBridgeCapability,\n storageCapability,\n storageProviderCapability,\n streamBrokerCapability,\n streamCatalogCapability,\n streamParamsCapability,\n streamingEngineCapability,\n switchCapability,\n systemCapability,\n toastCapability,\n turnProviderCapability,\n userManagementCapability,\n userPasskeysCapability,\n webrtcCapability,\n webrtcSessionCapability,\n zoneAnalyticsCapability,\n zoneRulesCapability,\n zonesCapability\n];\nconst CAP_NAMES_WITH_STATUS = [\n \"accessories\",\n \"battery\",\n \"brightness\",\n \"camera-credentials\",\n \"device-discovery\",\n \"device-export\",\n \"device-status\",\n \"doorbell\",\n \"feature-probe\",\n \"intercom\",\n \"motion\",\n \"motion-trigger\",\n \"motion-zones\",\n \"mqtt-broker\",\n \"native-object-detection\",\n \"osd\",\n \"privacy-mask\",\n \"ptz\",\n \"ptz-autotrack\",\n \"snapshot\",\n \"stream-params\",\n \"switch\"\n];\nconst METHOD_ACCESS_MAP = Object.freeze({\n \"addonPages.listPages\": { capName: \"addon-pages\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addonPagesSource.listPages\": { capName: \"addon-pages-source\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addonRoutes.getRoutes\": { capName: \"addon-routes\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addonRoutes.invoke\": { capName: \"addon-routes\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addons.applyAutoUpdateToAll\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addons.cancelBulkUpdate\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addons.custom\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addons.forceRefresh\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addons.getAddonAutoUpdate\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addons.getAutoUpdateSettings\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addons.getBulkUpdateState\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addons.getLastRestart\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addons.getLogs\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addons.getVersions\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addons.installFromWorkspace\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addons.installPackage\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addons.isWorkspaceAvailable\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addons.list\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addons.listActiveBulkUpdates\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addons.listCapabilityProviders\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addons.listFrameworkPackages\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addons.listPackages\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addons.listUpdates\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addons.listWorkspacePackages\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addons.onAddonLogs\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addons.reloadPackages\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addons.restartAddon\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addons.restartServer\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addons.retryLoad\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addons.rollbackPackage\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addons.searchAvailable\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addons.setAddonAutoUpdate\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addons.setAutoUpdateSettings\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addons.setCapabilityProviderEnabled\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addons.startBulkUpdate\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addons.uninstallPackage\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"addons.updateFrameworkPackage\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addons.updatePackage\": { capName: \"addons\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addonSettings.getDeviceSettings\": { capName: \"addon-settings\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addonSettings.getGlobalSettings\": { capName: \"addon-settings\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addonSettings.updateDeviceSettings\": { capName: \"addon-settings\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addonSettings.updateGlobalSettings\": { capName: \"addon-settings\", capScope: \"system\", addonId: null, access: \"create\" },\n \"addonWidgets.listWidgets\": { capName: \"addon-widgets\", capScope: \"system\", addonId: null, access: \"view\" },\n \"addonWidgetsSource.listWidgets\": { capName: \"addon-widgets-source\", capScope: \"system\", addonId: null, access: \"view\" },\n \"adminUi.getStaticDir\": { capName: \"admin-ui\", capScope: \"system\", addonId: null, access: \"view\" },\n \"adminUi.getVersion\": { capName: \"admin-ui\", capScope: \"system\", addonId: null, access: \"view\" },\n \"advancedNotifier.deleteRule\": { capName: \"advanced-notifier\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"advancedNotifier.getHistory\": { capName: \"advanced-notifier\", capScope: \"system\", addonId: null, access: \"view\" },\n \"advancedNotifier.getRules\": { capName: \"advanced-notifier\", capScope: \"system\", addonId: null, access: \"view\" },\n \"advancedNotifier.testRule\": { capName: \"advanced-notifier\", capScope: \"system\", addonId: null, access: \"create\" },\n \"advancedNotifier.upsertRule\": { capName: \"advanced-notifier\", capScope: \"system\", addonId: null, access: \"create\" },\n \"alerts.dismiss\": { capName: \"alerts\", capScope: \"system\", addonId: null, access: \"create\" },\n \"alerts.emit\": { capName: \"alerts\", capScope: \"system\", addonId: null, access: \"create\" },\n \"alerts.getUnreadCount\": { capName: \"alerts\", capScope: \"system\", addonId: null, access: \"view\" },\n \"alerts.list\": { capName: \"alerts\", capScope: \"system\", addonId: null, access: \"view\" },\n \"alerts.markAllRead\": { capName: \"alerts\", capScope: \"system\", addonId: null, access: \"create\" },\n \"alerts.markRead\": { capName: \"alerts\", capScope: \"system\", addonId: null, access: \"create\" },\n \"alerts.update\": { capName: \"alerts\", capScope: \"system\", addonId: null, access: \"create\" },\n \"audioAnalysis.resolveDeviceSettings\": { capName: \"audio-analysis\", capScope: \"device\", addonId: null, access: \"view\" },\n \"audioAnalyzer.analyseChunk\": { capName: \"audio-analyzer\", capScope: \"system\", addonId: null, access: \"create\" },\n \"audioAnalyzer.classify\": { capName: \"audio-analyzer\", capScope: \"system\", addonId: null, access: \"view\" },\n \"audioAnalyzer.dispose\": { capName: \"audio-analyzer\", capScope: \"system\", addonId: null, access: \"create\" },\n \"audioAnalyzer.isReady\": { capName: \"audio-analyzer\", capScope: \"system\", addonId: null, access: \"view\" },\n \"audioAnalyzer.reprobeAudioEngine\": { capName: \"audio-analyzer\", capScope: \"system\", addonId: null, access: \"create\" },\n \"audioCodec.canHandle\": { capName: \"audio-codec\", capScope: \"system\", addonId: null, access: \"view\" },\n \"audioCodec.closeSession\": { capName: \"audio-codec\", capScope: \"system\", addonId: null, access: \"create\" },\n \"audioCodec.createDecodeSession\": { capName: \"audio-codec\", capScope: \"system\", addonId: null, access: \"create\" },\n \"audioCodec.createEncodeSession\": { capName: \"audio-codec\", capScope: \"system\", addonId: null, access: \"create\" },\n \"audioCodec.flushEncode\": { capName: \"audio-codec\", capScope: \"system\", addonId: null, access: \"create\" },\n \"audioCodec.listActiveSessions\": { capName: \"audio-codec\", capScope: \"system\", addonId: null, access: \"view\" },\n \"audioCodec.listSupportedCodecs\": { capName: \"audio-codec\", capScope: \"system\", addonId: null, access: \"view\" },\n \"audioCodec.pullEncoded\": { capName: \"audio-codec\", capScope: \"system\", addonId: null, access: \"view\" },\n \"audioCodec.pullPcm\": { capName: \"audio-codec\", capScope: \"system\", addonId: null, access: \"view\" },\n \"audioCodec.pushEncodedFrame\": { capName: \"audio-codec\", capScope: \"system\", addonId: null, access: \"create\" },\n \"audioCodec.pushPcm\": { capName: \"audio-codec\", capScope: \"system\", addonId: null, access: \"create\" },\n \"audioMetrics.getCurrentSnapshot\": { capName: \"audio-metrics\", capScope: \"device\", addonId: null, access: \"view\" },\n \"audioMetrics.getHistory\": { capName: \"audio-metrics\", capScope: \"device\", addonId: null, access: \"view\" },\n \"authProvider.getLoginUrl\": { capName: \"auth-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"authProvider.handleCallback\": { capName: \"auth-provider\", capScope: \"system\", addonId: null, access: \"create\" },\n \"authProvider.validateCredentials\": { capName: \"auth-provider\", capScope: \"system\", addonId: null, access: \"create\" },\n \"authProvider.validateToken\": { capName: \"auth-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"backup.delete\": { capName: \"backup\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"backup.getEntries\": { capName: \"backup\", capScope: \"system\", addonId: null, access: \"view\" },\n \"backup.list\": { capName: \"backup\", capScope: \"system\", addonId: null, access: \"view\" },\n \"backup.listArchives\": { capName: \"backup\", capScope: \"system\", addonId: null, access: \"view\" },\n \"backup.listDestinations\": { capName: \"backup\", capScope: \"system\", addonId: null, access: \"view\" },\n \"backup.listLocations\": { capName: \"backup\", capScope: \"system\", addonId: null, access: \"view\" },\n \"backup.previewSchedule\": { capName: \"backup\", capScope: \"system\", addonId: null, access: \"view\" },\n \"backup.restore\": { capName: \"backup\", capScope: \"system\", addonId: null, access: \"create\" },\n \"backup.trigger\": { capName: \"backup\", capScope: \"system\", addonId: null, access: \"create\" },\n \"backup.upsertDestinationPolicy\": { capName: \"backup\", capScope: \"system\", addonId: null, access: \"create\" },\n \"brightness.setBrightness\": { capName: \"brightness\", capScope: \"device\", addonId: null, access: \"create\" },\n \"cameraCredentials.getCredentials\": { capName: \"camera-credentials\", capScope: \"device\", addonId: null, access: \"view\" },\n \"cameraStreams.getBrokerStreams\": { capName: \"camera-streams\", capScope: \"device\", addonId: null, access: \"view\" },\n \"cameraStreams.getCameraStreams\": { capName: \"camera-streams\", capScope: \"device\", addonId: null, access: \"view\" },\n \"cameraStreams.getRtspEntries\": { capName: \"camera-streams\", capScope: \"device\", addonId: null, access: \"view\" },\n \"decoder.createSession\": { capName: \"decoder\", capScope: \"system\", addonId: null, access: \"view\" },\n \"decoder.destroySession\": { capName: \"decoder\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"decoder.getFrame\": { capName: \"decoder\", capScope: \"system\", addonId: null, access: \"view\" },\n \"decoder.getInfo\": { capName: \"decoder\", capScope: \"system\", addonId: null, access: \"view\" },\n \"decoder.getShmStats\": { capName: \"decoder\", capScope: \"system\", addonId: null, access: \"view\" },\n \"decoder.getStats\": { capName: \"decoder\", capScope: \"system\", addonId: null, access: \"view\" },\n \"decoder.listActiveSessions\": { capName: \"decoder\", capScope: \"system\", addonId: null, access: \"view\" },\n \"decoder.openStream\": { capName: \"decoder\", capScope: \"system\", addonId: null, access: \"view\" },\n \"decoder.pullFrames\": { capName: \"decoder\", capScope: \"system\", addonId: null, access: \"view\" },\n \"decoder.pullHandles\": { capName: \"decoder\", capScope: \"system\", addonId: null, access: \"view\" },\n \"decoder.pushPacket\": { capName: \"decoder\", capScope: \"system\", addonId: null, access: \"view\" },\n \"decoder.reprobeHwaccel\": { capName: \"decoder\", capScope: \"system\", addonId: null, access: \"create\" },\n \"decoder.supportsCodec\": { capName: \"decoder\", capScope: \"system\", addonId: null, access: \"view\" },\n \"decoder.updateConfig\": { capName: \"decoder\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceDiscovery.adoptDevice\": { capName: \"device-discovery\", capScope: \"device\", addonId: null, access: \"create\" },\n \"deviceDiscovery.listDiscovered\": { capName: \"device-discovery\", capScope: \"device\", addonId: null, access: \"view\" },\n \"deviceDiscovery.refreshDiscovery\": { capName: \"device-discovery\", capScope: \"device\", addonId: null, access: \"create\" },\n \"deviceDiscovery.releaseDevice\": { capName: \"device-discovery\", capScope: \"device\", addonId: null, access: \"create\" },\n \"deviceExport.exposeDevice\": { capName: \"device-export\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceExport.getStatus\": { capName: \"device-export\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceExport.listExposedDevices\": { capName: \"device-export\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceExport.listSupportedDeviceKinds\": { capName: \"device-export\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceExport.unexposeDevice\": { capName: \"device-export\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.addLocation\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.adoptDevice\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.allocateDeviceId\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.createDevice\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.disable\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.discoverDevices\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.enable\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.getAllBindings\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.getBindings\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.getChildren\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.getConfigSchema\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.getCreationSchema\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.getDevice\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.getDeviceAggregate\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.getDeviceLiveInfoAggregate\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.getDeviceSettingsAggregate\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.getDeviceStatusAggregate\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.getSettingsSchema\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.getStreamProfileMap\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.getStreamSources\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.listAll\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.listBindableCapsForDeviceType\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.listLocations\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.listPersistedByAddon\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.listWrappersForCap\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.loadConfig\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.loadMeta\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.loadRuntimeState\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceManager.persistConfig\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.probeStreams\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.registerDevice\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.remove\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"deviceManager.removeDevice\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"deviceManager.removeLocation\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"deviceManager.setDisabled\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.setLocation\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.setMetadata\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.setName\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.setStreamProfileMap\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.setWrapperActive\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.testCreationField\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.testField\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.updateConfig\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.updateDeviceField\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceManager.updateDeviceFieldsBatch\": { capName: \"device-manager\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceOps.getConfigEntries\": { capName: \"device-ops\", capScope: \"device\", addonId: null, access: \"view\" },\n \"deviceOps.getSettingsSchema\": { capName: \"device-ops\", capScope: \"device\", addonId: null, access: \"view\" },\n \"deviceOps.getStreamSources\": { capName: \"device-ops\", capScope: \"device\", addonId: null, access: \"view\" },\n \"deviceOps.removeDevice\": { capName: \"device-ops\", capScope: \"device\", addonId: null, access: \"delete\" },\n \"deviceOps.setConfig\": { capName: \"device-ops\", capScope: \"device\", addonId: null, access: \"create\" },\n \"deviceProvider.adoptDiscoveredDevice\": { capName: \"device-provider\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceProvider.createDevice\": { capName: \"device-provider\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceProvider.discoverDevices\": { capName: \"device-provider\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceProvider.getChildCreationSchema\": { capName: \"device-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceProvider.getDevices\": { capName: \"device-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceProvider.getStatus\": { capName: \"device-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceProvider.start\": { capName: \"device-provider\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceProvider.stop\": { capName: \"device-provider\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceProvider.supportsDiscovery\": { capName: \"device-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceProvider.supportsManualCreation\": { capName: \"device-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceProvider.testCreationField\": { capName: \"device-provider\", capScope: \"system\", addonId: null, access: \"create\" },\n \"deviceState.getAllSnapshots\": { capName: \"device-state\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceState.getCapSlice\": { capName: \"device-state\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceState.getSnapshot\": { capName: \"device-state\", capScope: \"system\", addonId: null, access: \"view\" },\n \"deviceState.setCapSlice\": { capName: \"device-state\", capScope: \"system\", addonId: null, access: \"create\" },\n \"embeddingEncoder.encode\": { capName: \"embedding-encoder\", capScope: \"system\", addonId: null, access: \"view\" },\n \"embeddingEncoder.encodeText\": { capName: \"embedding-encoder\", capScope: \"system\", addonId: null, access: \"view\" },\n \"embeddingEncoder.getInfo\": { capName: \"embedding-encoder\", capScope: \"system\", addonId: null, access: \"view\" },\n \"events.getEventClipUrl\": { capName: \"events\", capScope: \"device\", addonId: null, access: \"view\" },\n \"events.getEvents\": { capName: \"events\", capScope: \"device\", addonId: null, access: \"view\" },\n \"events.getEventThumbnail\": { capName: \"events\", capScope: \"device\", addonId: null, access: \"view\" },\n \"integrations.create\": { capName: \"integrations\", capScope: \"system\", addonId: null, access: \"create\" },\n \"integrations.delete\": { capName: \"integrations\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"integrations.get\": { capName: \"integrations\", capScope: \"system\", addonId: null, access: \"view\" },\n \"integrations.getAvailableTypes\": { capName: \"integrations\", capScope: \"system\", addonId: null, access: \"view\" },\n \"integrations.getByAddonId\": { capName: \"integrations\", capScope: \"system\", addonId: null, access: \"view\" },\n \"integrations.getSettings\": { capName: \"integrations\", capScope: \"system\", addonId: null, access: \"view\" },\n \"integrations.list\": { capName: \"integrations\", capScope: \"system\", addonId: null, access: \"view\" },\n \"integrations.setSettings\": { capName: \"integrations\", capScope: \"system\", addonId: null, access: \"create\" },\n \"integrations.testConnection\": { capName: \"integrations\", capScope: \"system\", addonId: null, access: \"create\" },\n \"integrations.update\": { capName: \"integrations\", capScope: \"system\", addonId: null, access: \"create\" },\n \"intercom.endTalkSession\": { capName: \"intercom\", capScope: \"device\", addonId: null, access: \"create\" },\n \"intercom.handleAnswer\": { capName: \"intercom\", capScope: \"device\", addonId: null, access: \"create\" },\n \"intercom.pushTalkPcm\": { capName: \"intercom\", capScope: \"device\", addonId: null, access: \"create\" },\n \"intercom.startSession\": { capName: \"intercom\", capScope: \"device\", addonId: null, access: \"create\" },\n \"intercom.startTalkSession\": { capName: \"intercom\", capScope: \"device\", addonId: null, access: \"create\" },\n \"intercom.stopSession\": { capName: \"intercom\", capScope: \"device\", addonId: null, access: \"create\" },\n \"localNetwork.getAllowedAddresses\": { capName: \"local-network\", capScope: \"system\", addonId: null, access: \"view\" },\n \"localNetwork.getConnectionEndpoints\": { capName: \"local-network\", capScope: \"system\", addonId: null, access: \"view\" },\n \"localNetwork.getPreferred\": { capName: \"local-network\", capScope: \"system\", addonId: null, access: \"view\" },\n \"localNetwork.list\": { capName: \"local-network\", capScope: \"system\", addonId: null, access: \"view\" },\n \"localNetwork.resetAllowlistToBestMatch\": { capName: \"local-network\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"localNetwork.setAllowedAddresses\": { capName: \"local-network\", capScope: \"system\", addonId: null, access: \"create\" },\n \"logDestination.query\": { capName: \"log-destination\", capScope: \"system\", addonId: null, access: \"view\" },\n \"logDestination.write\": { capName: \"log-destination\", capScope: \"system\", addonId: null, access: \"create\" },\n \"meshNetwork.getStatus\": { capName: \"mesh-network\", capScope: \"system\", addonId: null, access: \"view\" },\n \"meshNetwork.join\": { capName: \"mesh-network\", capScope: \"system\", addonId: null, access: \"create\" },\n \"meshNetwork.leave\": { capName: \"mesh-network\", capScope: \"system\", addonId: null, access: \"create\" },\n \"meshNetwork.listPeers\": { capName: \"mesh-network\", capScope: \"system\", addonId: null, access: \"view\" },\n \"meshNetwork.logout\": { capName: \"mesh-network\", capScope: \"system\", addonId: null, access: \"create\" },\n \"meshNetwork.startLogin\": { capName: \"mesh-network\", capScope: \"system\", addonId: null, access: \"create\" },\n \"meshNetwork.testConnection\": { capName: \"mesh-network\", capScope: \"system\", addonId: null, access: \"create\" },\n \"metricsProvider.collectSnapshot\": { capName: \"metrics-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"metricsProvider.getAddonStats\": { capName: \"metrics-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"metricsProvider.getCached\": { capName: \"metrics-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"metricsProvider.getCpuTemperature\": { capName: \"metrics-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"metricsProvider.getCurrent\": { capName: \"metrics-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"metricsProvider.getDiskSpace\": { capName: \"metrics-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"metricsProvider.getGpuInfo\": { capName: \"metrics-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"metricsProvider.getProcessStats\": { capName: \"metrics-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"metricsProvider.killProcess\": { capName: \"metrics-provider\", capScope: \"system\", addonId: null, access: \"create\" },\n \"metricsProvider.listAddonInstances\": { capName: \"metrics-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"metricsProvider.listNodeProcesses\": { capName: \"metrics-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"motion.isDetected\": { capName: \"motion\", capScope: \"device\", addonId: null, access: \"view\" },\n \"motionDetection.analyze\": { capName: \"motion-detection\", capScope: \"device\", addonId: null, access: \"create\" },\n \"motionDetection.removeCamera\": { capName: \"motion-detection\", capScope: \"device\", addonId: null, access: \"delete\" },\n \"motionDetection.reset\": { capName: \"motion-detection\", capScope: \"device\", addonId: null, access: \"delete\" },\n \"motionTrigger.setMotionTrigger\": { capName: \"motion-trigger\", capScope: \"device\", addonId: null, access: \"create\" },\n \"motionZones.getOptions\": { capName: \"motion-zones\", capScope: \"device\", addonId: null, access: \"view\" },\n \"motionZones.setZone\": { capName: \"motion-zones\", capScope: \"device\", addonId: null, access: \"create\" },\n \"mqttBroker.addBroker\": { capName: \"mqtt-broker\", capScope: \"system\", addonId: null, access: \"create\" },\n \"mqttBroker.getBrokerConfig\": { capName: \"mqtt-broker\", capScope: \"system\", addonId: null, access: \"view\" },\n \"mqttBroker.getStatus\": { capName: \"mqtt-broker\", capScope: \"system\", addonId: null, access: \"view\" },\n \"mqttBroker.listBrokers\": { capName: \"mqtt-broker\", capScope: \"system\", addonId: null, access: \"view\" },\n \"mqttBroker.removeBroker\": { capName: \"mqtt-broker\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"mqttBroker.startEmbeddedBroker\": { capName: \"mqtt-broker\", capScope: \"system\", addonId: null, access: \"create\" },\n \"mqttBroker.stopEmbeddedBroker\": { capName: \"mqtt-broker\", capScope: \"system\", addonId: null, access: \"create\" },\n \"mqttBroker.testConnection\": { capName: \"mqtt-broker\", capScope: \"system\", addonId: null, access: \"create\" },\n \"nativeObjectDetection.setEnabled\": { capName: \"native-object-detection\", capScope: \"device\", addonId: null, access: \"create\" },\n \"networkAccess.getEndpoint\": { capName: \"network-access\", capScope: \"system\", addonId: null, access: \"view\" },\n \"networkAccess.getStatus\": { capName: \"network-access\", capScope: \"system\", addonId: null, access: \"view\" },\n \"networkAccess.listEndpoints\": { capName: \"network-access\", capScope: \"system\", addonId: null, access: \"view\" },\n \"networkAccess.start\": { capName: \"network-access\", capScope: \"system\", addonId: null, access: \"create\" },\n \"networkAccess.stop\": { capName: \"network-access\", capScope: \"system\", addonId: null, access: \"create\" },\n \"networkQuality.getAllStats\": { capName: \"network-quality\", capScope: \"system\", addonId: null, access: \"view\" },\n \"networkQuality.getDeviceStats\": { capName: \"network-quality\", capScope: \"system\", addonId: null, access: \"view\" },\n \"networkQuality.reportClientStats\": { capName: \"network-quality\", capScope: \"system\", addonId: null, access: \"create\" },\n \"nodes.clusterAddonStatus\": { capName: \"nodes\", capScope: \"system\", addonId: null, access: \"view\" },\n \"nodes.deployAddon\": { capName: \"nodes\", capScope: \"system\", addonId: null, access: \"create\" },\n \"nodes.executeQuery\": { capName: \"nodes\", capScope: \"system\", addonId: null, access: \"create\" },\n \"nodes.getCapUsageGraph\": { capName: \"nodes\", capScope: \"system\", addonId: null, access: \"view\" },\n \"nodes.getNodeAddons\": { capName: \"nodes\", capScope: \"system\", addonId: null, access: \"view\" },\n \"nodes.renameNode\": { capName: \"nodes\", capScope: \"system\", addonId: null, access: \"create\" },\n \"nodes.restartAddon\": { capName: \"nodes\", capScope: \"system\", addonId: null, access: \"create\" },\n \"nodes.restartNode\": { capName: \"nodes\", capScope: \"system\", addonId: null, access: \"create\" },\n \"nodes.restartProcess\": { capName: \"nodes\", capScope: \"system\", addonId: null, access: \"create\" },\n \"nodes.setProcessLogLevel\": { capName: \"nodes\", capScope: \"system\", addonId: null, access: \"create\" },\n \"nodes.shutdownNode\": { capName: \"nodes\", capScope: \"system\", addonId: null, access: \"create\" },\n \"nodes.topology\": { capName: \"nodes\", capScope: \"system\", addonId: null, access: \"view\" },\n \"nodes.undeployAddon\": { capName: \"nodes\", capScope: \"system\", addonId: null, access: \"create\" },\n \"notificationOutput.send\": { capName: \"notification-output\", capScope: \"system\", addonId: null, access: \"create\" },\n \"notificationOutput.sendTest\": { capName: \"notification-output\", capScope: \"system\", addonId: null, access: \"create\" },\n \"oauthIntegration.getDescriptor\": { capName: \"oauth-integration\", capScope: \"system\", addonId: null, access: \"view\" },\n \"osd.setOverlay\": { capName: \"osd\", capScope: \"device\", addonId: null, access: \"create\" },\n \"pipelineAnalytics.clearTracks\": { capName: \"pipeline-analytics\", capScope: \"device\", addonId: null, access: \"delete\" },\n \"pipelineAnalytics.getActiveTracks\": { capName: \"pipeline-analytics\", capScope: \"device\", addonId: null, access: \"view\" },\n \"pipelineAnalytics.getAudioEvents\": { capName: \"pipeline-analytics\", capScope: \"device\", addonId: null, access: \"view\" },\n \"pipelineAnalytics.getEventMedia\": { capName: \"pipeline-analytics\", capScope: \"device\", addonId: null, access: \"view\" },\n \"pipelineAnalytics.getMotionEvents\": { capName: \"pipeline-analytics\", capScope: \"device\", addonId: null, access: \"view\" },\n \"pipelineAnalytics.getObjectEvents\": { capName: \"pipeline-analytics\", capScope: \"device\", addonId: null, access: \"view\" },\n \"pipelineAnalytics.getTrack\": { capName: \"pipeline-analytics\", capScope: \"device\", addonId: null, access: \"view\" },\n \"pipelineAnalytics.getTrackMedia\": { capName: \"pipeline-analytics\", capScope: \"device\", addonId: null, access: \"view\" },\n \"pipelineAnalytics.listTracks\": { capName: \"pipeline-analytics\", capScope: \"device\", addonId: null, access: \"view\" },\n \"pipelineExecutor.cacheFrameInPool\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineExecutor.deleteModel\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"pipelineExecutor.deleteTemplate\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"pipelineExecutor.detect\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.downloadModel\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineExecutor.getAddonModels\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.getAudioCapabilities\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.getAvailableEngines\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.getCapabilities\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.getDefaultSteps\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.getDetectionConfigSchema\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.getEffectiveTuning\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.getGlobalPipelineConfig\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.getGlobalSteps\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.getOrchestratorConfigSchema\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.getReferenceAudio\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.getReferenceAudioFiles\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.getReferenceImage\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.getSchema\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.getSelectedEngine\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.getVideoPipelineSteps\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.inferCached\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineExecutor.killEngine\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineExecutor.listLoadedEngines\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.listReferenceImages\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.listTemplates\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineExecutor.reprobeEngine\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineExecutor.runAudioTest\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineExecutor.runPipeline\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineExecutor.runPipelineBatch\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineExecutor.saveTemplate\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineExecutor.setVideoPipelineSteps\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineExecutor.spinEngine\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineExecutor.uncacheFrame\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineExecutor.updateTemplate\": { capName: \"pipeline-executor\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineOrchestrator.assignAudio\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineOrchestrator.assignDecoder\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineOrchestrator.assignPipeline\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineOrchestrator.deleteTemplate\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"pipelineOrchestrator.getAgentLoad\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineOrchestrator.getAgentSettings\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineOrchestrator.getAudioAssignment\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineOrchestrator.getAudioAssignments\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineOrchestrator.getAudioNodeLoad\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineOrchestrator.getCameraMetrics\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineOrchestrator.getCameraSettings\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineOrchestrator.getCameraStepOverrides\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineOrchestrator.getCapabilityBindings\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineOrchestrator.getDecoderAssignment\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineOrchestrator.getDecoderAssignments\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineOrchestrator.getGlobalMetrics\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineOrchestrator.getPipelineAssignment\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineOrchestrator.getPipelineAssignments\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineOrchestrator.listAgentSettings\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineOrchestrator.listTemplates\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineOrchestrator.rebalance\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineOrchestrator.removeAgentSettings\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"pipelineOrchestrator.resolvePipeline\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineOrchestrator.saveTemplate\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineOrchestrator.setAgentAddonDefaults\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineOrchestrator.setCameraPipelineForAgent\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineOrchestrator.setCameraStepOverride\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineOrchestrator.setCameraStepToggle\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineOrchestrator.setCapabilityBinding\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineOrchestrator.unassignAudio\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineOrchestrator.unassignDecoder\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineOrchestrator.unassignPipeline\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineOrchestrator.updateTemplate\": { capName: \"pipeline-orchestrator\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineRunner.attachCamera\": { capName: \"pipeline-runner\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineRunner.detachCamera\": { capName: \"pipeline-runner\", capScope: \"system\", addonId: null, access: \"create\" },\n \"pipelineRunner.getAllCameraMetrics\": { capName: \"pipeline-runner\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineRunner.getCameraMetrics\": { capName: \"pipeline-runner\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineRunner.getLocalCameras\": { capName: \"pipeline-runner\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineRunner.getLocalLoad\": { capName: \"pipeline-runner\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineRunner.getLocalMetrics\": { capName: \"pipeline-runner\", capScope: \"system\", addonId: null, access: \"view\" },\n \"pipelineRunner.reportMotion\": { capName: \"pipeline-runner\", capScope: \"system\", addonId: null, access: \"create\" },\n \"platformProbe.getCapabilities\": { capName: \"platform-probe\", capScope: \"system\", addonId: null, access: \"view\" },\n \"platformProbe.getHardware\": { capName: \"platform-probe\", capScope: \"system\", addonId: null, access: \"view\" },\n \"platformProbe.getHardwareEncoders\": { capName: \"platform-probe\", capScope: \"system\", addonId: null, access: \"view\" },\n \"platformProbe.refreshHardwareEncoders\": { capName: \"platform-probe\", capScope: \"system\", addonId: null, access: \"create\" },\n \"platformProbe.resolveHwAccel\": { capName: \"platform-probe\", capScope: \"system\", addonId: null, access: \"view\" },\n \"platformProbe.resolveInferenceConfig\": { capName: \"platform-probe\", capScope: \"system\", addonId: null, access: \"view\" },\n \"privacyMask.getOptions\": { capName: \"privacy-mask\", capScope: \"device\", addonId: null, access: \"view\" },\n \"privacyMask.setMask\": { capName: \"privacy-mask\", capScope: \"device\", addonId: null, access: \"create\" },\n \"ptz.continuousMove\": { capName: \"ptz\", capScope: \"device\", addonId: null, access: \"create\" },\n \"ptz.deletePreset\": { capName: \"ptz\", capScope: \"device\", addonId: null, access: \"delete\" },\n \"ptz.getOptions\": { capName: \"ptz\", capScope: \"device\", addonId: null, access: \"view\" },\n \"ptz.getPosition\": { capName: \"ptz\", capScope: \"device\", addonId: null, access: \"view\" },\n \"ptz.getPresets\": { capName: \"ptz\", capScope: \"device\", addonId: null, access: \"view\" },\n \"ptz.goHome\": { capName: \"ptz\", capScope: \"device\", addonId: null, access: \"create\" },\n \"ptz.goToPreset\": { capName: \"ptz\", capScope: \"device\", addonId: null, access: \"create\" },\n \"ptz.move\": { capName: \"ptz\", capScope: \"device\", addonId: null, access: \"create\" },\n \"ptz.savePreset\": { capName: \"ptz\", capScope: \"device\", addonId: null, access: \"create\" },\n \"ptz.setAutofocus\": { capName: \"ptz\", capScope: \"device\", addonId: null, access: \"create\" },\n \"ptz.stop\": { capName: \"ptz\", capScope: \"device\", addonId: null, access: \"create\" },\n \"ptzAutotrack.getSettings\": { capName: \"ptz-autotrack\", capScope: \"device\", addonId: null, access: \"view\" },\n \"ptzAutotrack.getStatus\": { capName: \"ptz-autotrack\", capScope: \"device\", addonId: null, access: \"view\" },\n \"ptzAutotrack.setEnabled\": { capName: \"ptz-autotrack\", capScope: \"device\", addonId: null, access: \"create\" },\n \"ptzAutotrack.setSettings\": { capName: \"ptz-autotrack\", capScope: \"device\", addonId: null, access: \"create\" },\n \"reboot.reboot\": { capName: \"reboot\", capScope: \"device\", addonId: null, access: \"create\" },\n \"recording.getPlaybackUrl\": { capName: \"recording\", capScope: \"device\", addonId: null, access: \"view\" },\n \"recording.getSegments\": { capName: \"recording\", capScope: \"device\", addonId: null, access: \"view\" },\n \"recording.getThumbnailAt\": { capName: \"recording\", capScope: \"device\", addonId: null, access: \"view\" },\n \"recordingEngine.disable\": { capName: \"recording-engine\", capScope: \"system\", addonId: null, access: \"create\" },\n \"recordingEngine.enable\": { capName: \"recording-engine\", capScope: \"system\", addonId: null, access: \"create\" },\n \"recordingEngine.estimateGlobalStorage\": { capName: \"recording-engine\", capScope: \"system\", addonId: null, access: \"view\" },\n \"recordingEngine.estimateStorage\": { capName: \"recording-engine\", capScope: \"system\", addonId: null, access: \"view\" },\n \"recordingEngine.getAvailability\": { capName: \"recording-engine\", capScope: \"system\", addonId: null, access: \"view\" },\n \"recordingEngine.getConfig\": { capName: \"recording-engine\", capScope: \"system\", addonId: null, access: \"view\" },\n \"recordingEngine.getMotionStats\": { capName: \"recording-engine\", capScope: \"system\", addonId: null, access: \"view\" },\n \"recordingEngine.getPlaylist\": { capName: \"recording-engine\", capScope: \"system\", addonId: null, access: \"view\" },\n \"recordingEngine.getPolicy\": { capName: \"recording-engine\", capScope: \"system\", addonId: null, access: \"view\" },\n \"recordingEngine.getPolicyStatus\": { capName: \"recording-engine\", capScope: \"system\", addonId: null, access: \"view\" },\n \"recordingEngine.getRetentionConfig\": { capName: \"recording-engine\", capScope: \"system\", addonId: null, access: \"view\" },\n \"recordingEngine.getSegments\": { capName: \"recording-engine\", capScope: \"system\", addonId: null, access: \"view\" },\n \"recordingEngine.getStatus\": { capName: \"recording-engine\", capScope: \"system\", addonId: null, access: \"view\" },\n \"recordingEngine.getStorageUsage\": { capName: \"recording-engine\", capScope: \"system\", addonId: null, access: \"view\" },\n \"recordingEngine.getThumbnail\": { capName: \"recording-engine\", capScope: \"system\", addonId: null, access: \"view\" },\n \"recordingEngine.setPolicy\": { capName: \"recording-engine\", capScope: \"system\", addonId: null, access: \"create\" },\n \"recordingEngine.updateConfig\": { capName: \"recording-engine\", capScope: \"system\", addonId: null, access: \"create\" },\n \"recordingEngine.updateRetentionConfig\": { capName: \"recording-engine\", capScope: \"system\", addonId: null, access: \"create\" },\n \"restreamer.getExposedResources\": { capName: \"restreamer\", capScope: \"system\", addonId: null, access: \"view\" },\n \"restreamer.registerDevice\": { capName: \"restreamer\", capScope: \"system\", addonId: null, access: \"create\" },\n \"restreamer.unregisterDevice\": { capName: \"restreamer\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"settingsStore.count\": { capName: \"settings-store\", capScope: \"system\", addonId: null, access: \"view\" },\n \"settingsStore.declareCollection\": { capName: \"settings-store\", capScope: \"system\", addonId: null, access: \"create\" },\n \"settingsStore.delete\": { capName: \"settings-store\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"settingsStore.get\": { capName: \"settings-store\", capScope: \"system\", addonId: null, access: \"view\" },\n \"settingsStore.insert\": { capName: \"settings-store\", capScope: \"system\", addonId: null, access: \"create\" },\n \"settingsStore.isEmpty\": { capName: \"settings-store\", capScope: \"system\", addonId: null, access: \"view\" },\n \"settingsStore.query\": { capName: \"settings-store\", capScope: \"system\", addonId: null, access: \"view\" },\n \"settingsStore.set\": { capName: \"settings-store\", capScope: \"system\", addonId: null, access: \"create\" },\n \"settingsStore.update\": { capName: \"settings-store\", capScope: \"system\", addonId: null, access: \"create\" },\n \"smtpProvider.getStatus\": { capName: \"smtp-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"smtpProvider.sendEmail\": { capName: \"smtp-provider\", capScope: \"system\", addonId: null, access: \"create\" },\n \"smtpProvider.verify\": { capName: \"smtp-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"snapshot.getSnapshot\": { capName: \"snapshot\", capScope: \"device\", addonId: null, access: \"view\" },\n \"snapshot.invalidateCache\": { capName: \"snapshot\", capScope: \"device\", addonId: null, access: \"create\" },\n \"snapshotProvider.getSnapshot\": { capName: \"snapshot-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"snapshotProvider.supportsDevice\": { capName: \"snapshot-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"ssoBridge.signBridgeToken\": { capName: \"sso-bridge\", capScope: \"system\", addonId: null, access: \"view\" },\n \"ssoBridge.verifyBridgeToken\": { capName: \"sso-bridge\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storage.abortUpload\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"create\" },\n \"storage.beginDownload\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"create\" },\n \"storage.beginUpload\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"create\" },\n \"storage.delete\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"storage.deleteLocation\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"storage.endDownload\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"create\" },\n \"storage.exists\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storage.finalizeUpload\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"create\" },\n \"storage.getAvailableSpace\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storage.getDefaultLocation\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storage.list\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storage.listLocations\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storage.listProviders\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storage.read\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storage.readChunk\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storage.resolve\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storage.testConfig\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storage.testLocation\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storage.upsertLocation\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"create\" },\n \"storage.write\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"create\" },\n \"storage.writeChunk\": { capName: \"storage\", capScope: \"system\", addonId: null, access: \"create\" },\n \"storageProvider.abortUpload\": { capName: \"storage-provider\", capScope: \"system\", addonId: null, access: \"create\" },\n \"storageProvider.beginDownload\": { capName: \"storage-provider\", capScope: \"system\", addonId: null, access: \"create\" },\n \"storageProvider.beginUpload\": { capName: \"storage-provider\", capScope: \"system\", addonId: null, access: \"create\" },\n \"storageProvider.delete\": { capName: \"storage-provider\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"storageProvider.endDownload\": { capName: \"storage-provider\", capScope: \"system\", addonId: null, access: \"create\" },\n \"storageProvider.exists\": { capName: \"storage-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storageProvider.finalizeUpload\": { capName: \"storage-provider\", capScope: \"system\", addonId: null, access: \"create\" },\n \"storageProvider.getAvailableSpace\": { capName: \"storage-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storageProvider.getProviderInfo\": { capName: \"storage-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storageProvider.list\": { capName: \"storage-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storageProvider.read\": { capName: \"storage-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storageProvider.readChunk\": { capName: \"storage-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storageProvider.resolve\": { capName: \"storage-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storageProvider.testLocation\": { capName: \"storage-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"storageProvider.write\": { capName: \"storage-provider\", capScope: \"system\", addonId: null, access: \"create\" },\n \"storageProvider.writeChunk\": { capName: \"storage-provider\", capScope: \"system\", addonId: null, access: \"create\" },\n \"streamBroker.assignProfile\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"create\" },\n \"streamBroker.getAllRtspEntries\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"view\" },\n \"streamBroker.getBrokerStats\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"view\" },\n \"streamBroker.getPreBufferInfo\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"view\" },\n \"streamBroker.getRtspEntry\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"view\" },\n \"streamBroker.getRtspPort\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"view\" },\n \"streamBroker.getStreamUrl\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"view\" },\n \"streamBroker.getStreamWithCodec\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"create\" },\n \"streamBroker.isRtspEnabled\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"view\" },\n \"streamBroker.killClient\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"create\" },\n \"streamBroker.listAllCameraStreams\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"view\" },\n \"streamBroker.listAllProfileSlots\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"view\" },\n \"streamBroker.listClients\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"view\" },\n \"streamBroker.publishCameraStream\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"create\" },\n \"streamBroker.pullAudioChunks\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"view\" },\n \"streamBroker.pullFrameHandles\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"view\" },\n \"streamBroker.regenerateRtspToken\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"create\" },\n \"streamBroker.releaseStreamWithCodec\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"create\" },\n \"streamBroker.restartProfile\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"create\" },\n \"streamBroker.retractCameraStream\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"create\" },\n \"streamBroker.setPreBufferDuration\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"create\" },\n \"streamBroker.setRtspEnabled\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"create\" },\n \"streamBroker.subscribeAudioChunks\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"create\" },\n \"streamBroker.subscribeFrames\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"create\" },\n \"streamBroker.unassignProfile\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"create\" },\n \"streamBroker.unsubscribeAudioChunks\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"create\" },\n \"streamBroker.unsubscribeFrames\": { capName: \"stream-broker\", capScope: \"system\", addonId: null, access: \"create\" },\n \"streamCatalog.getCatalog\": { capName: \"stream-catalog\", capScope: \"device\", addonId: null, access: \"view\" },\n \"streamingEngine.getStreamUrl\": { capName: \"streaming-engine\", capScope: \"system\", addonId: null, access: \"view\" },\n \"streamingEngine.listStreams\": { capName: \"streaming-engine\", capScope: \"system\", addonId: null, access: \"view\" },\n \"streamingEngine.registerStream\": { capName: \"streaming-engine\", capScope: \"system\", addonId: null, access: \"create\" },\n \"streamingEngine.unregisterStream\": { capName: \"streaming-engine\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"streamParams.getConfigSchema\": { capName: \"stream-params\", capScope: \"device\", addonId: null, access: \"view\" },\n \"streamParams.getOptions\": { capName: \"stream-params\", capScope: \"device\", addonId: null, access: \"view\" },\n \"streamParams.setProfile\": { capName: \"stream-params\", capScope: \"device\", addonId: null, access: \"create\" },\n \"switch.setState\": { capName: \"switch\", capScope: \"device\", addonId: null, access: \"create\" },\n \"system.featureFlags\": { capName: \"system\", capScope: \"system\", addonId: null, access: \"view\" },\n \"system.forceRetentionCleanup\": { capName: \"system\", capScope: \"system\", addonId: null, access: \"create\" },\n \"system.getRetentionConfig\": { capName: \"system\", capScope: \"system\", addonId: null, access: \"view\" },\n \"system.health\": { capName: \"system\", capScope: \"system\", addonId: null, access: \"view\" },\n \"system.info\": { capName: \"system\", capScope: \"system\", addonId: null, access: \"view\" },\n \"system.networkAddresses\": { capName: \"system\", capScope: \"system\", addonId: null, access: \"view\" },\n \"system.setRetentionConfig\": { capName: \"system\", capScope: \"system\", addonId: null, access: \"create\" },\n \"toast.onToast\": { capName: \"toast\", capScope: \"system\", addonId: null, access: \"view\" },\n \"turnProvider.getTurnServers\": { capName: \"turn-provider\", capScope: \"system\", addonId: null, access: \"view\" },\n \"userManagement.confirmTotp\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"create\" },\n \"userManagement.createApiKey\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"create\" },\n \"userManagement.createScopedToken\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"create\" },\n \"userManagement.createUser\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"create\" },\n \"userManagement.deleteUser\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"userManagement.disableTotp\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"userManagement.getTotpStatus\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"view\" },\n \"userManagement.listApiKeys\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"view\" },\n \"userManagement.listOauthSessions\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"view\" },\n \"userManagement.listScopedTokens\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"view\" },\n \"userManagement.listUsers\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"view\" },\n \"userManagement.oauthExchangeCode\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"view\" },\n \"userManagement.oauthIssueCode\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"create\" },\n \"userManagement.oauthRefresh\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"view\" },\n \"userManagement.oauthVerifyAccessToken\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"view\" },\n \"userManagement.resetPassword\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"create\" },\n \"userManagement.revokeApiKey\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"userManagement.revokeOauthSession\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"userManagement.revokeScopedToken\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"userManagement.setupTotp\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"create\" },\n \"userManagement.setUserScopes\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"create\" },\n \"userManagement.updateUser\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"create\" },\n \"userManagement.validateApiKey\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"view\" },\n \"userManagement.validateCredentials\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"view\" },\n \"userManagement.validateScopedToken\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"view\" },\n \"userManagement.verifyTotp\": { capName: \"user-management\", capScope: \"system\", addonId: null, access: \"view\" },\n \"userPasskeys.beginAuthentication\": { capName: \"user-passkeys\", capScope: \"system\", addonId: null, access: \"view\" },\n \"userPasskeys.beginRegistration\": { capName: \"user-passkeys\", capScope: \"system\", addonId: null, access: \"create\" },\n \"userPasskeys.finishAuthentication\": { capName: \"user-passkeys\", capScope: \"system\", addonId: null, access: \"view\" },\n \"userPasskeys.finishRegistration\": { capName: \"user-passkeys\", capScope: \"system\", addonId: null, access: \"create\" },\n \"userPasskeys.listPasskeys\": { capName: \"user-passkeys\", capScope: \"system\", addonId: null, access: \"view\" },\n \"userPasskeys.removePasskey\": { capName: \"user-passkeys\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"webrtc.closeSession\": { capName: \"webrtc\", capScope: \"system\", addonId: null, access: \"create\" },\n \"webrtc.createSession\": { capName: \"webrtc\", capScope: \"system\", addonId: null, access: \"create\" },\n \"webrtc.handleAnswer\": { capName: \"webrtc\", capScope: \"system\", addonId: null, access: \"create\" },\n \"webrtc.handleOffer\": { capName: \"webrtc\", capScope: \"system\", addonId: null, access: \"create\" },\n \"webrtc.hasAdaptiveBitrate\": { capName: \"webrtc\", capScope: \"system\", addonId: null, access: \"view\" },\n \"webrtc.registerStream\": { capName: \"webrtc\", capScope: \"system\", addonId: null, access: \"create\" },\n \"webrtc.supportsStream\": { capName: \"webrtc\", capScope: \"system\", addonId: null, access: \"view\" },\n \"webrtc.unregisterStream\": { capName: \"webrtc\", capScope: \"system\", addonId: null, access: \"delete\" },\n \"webrtcSession.addIceCandidate\": { capName: \"webrtc-session\", capScope: \"device\", addonId: null, access: \"create\" },\n \"webrtcSession.closeSession\": { capName: \"webrtc-session\", capScope: \"device\", addonId: null, access: \"create\" },\n \"webrtcSession.createSession\": { capName: \"webrtc-session\", capScope: \"device\", addonId: null, access: \"create\" },\n \"webrtcSession.getIceCandidates\": { capName: \"webrtc-session\", capScope: \"device\", addonId: null, access: \"view\" },\n \"webrtcSession.handleAnswer\": { capName: \"webrtc-session\", capScope: \"device\", addonId: null, access: \"create\" },\n \"webrtcSession.handleOffer\": { capName: \"webrtc-session\", capScope: \"device\", addonId: null, access: \"create\" },\n \"webrtcSession.hasAdaptiveBitrate\": { capName: \"webrtc-session\", capScope: \"device\", addonId: null, access: \"view\" },\n \"webrtcSession.listStreams\": { capName: \"webrtc-session\", capScope: \"device\", addonId: null, access: \"view\" },\n \"zoneAnalytics.getCameraHistory\": { capName: \"zone-analytics\", capScope: \"device\", addonId: null, access: \"view\" },\n \"zoneAnalytics.getCurrentSnapshot\": { capName: \"zone-analytics\", capScope: \"device\", addonId: null, access: \"view\" },\n \"zoneAnalytics.getUnzonedHistory\": { capName: \"zone-analytics\", capScope: \"device\", addonId: null, access: \"view\" },\n \"zoneAnalytics.getZoneHistory\": { capName: \"zone-analytics\", capScope: \"device\", addonId: null, access: \"view\" },\n \"zoneRules.listRules\": { capName: \"zone-rules\", capScope: \"device\", addonId: null, access: \"view\" },\n \"zoneRules.setRules\": { capName: \"zone-rules\", capScope: \"device\", addonId: null, access: \"create\" },\n \"zones.addZone\": { capName: \"zones\", capScope: \"device\", addonId: null, access: \"create\" },\n \"zones.listZones\": { capName: \"zones\", capScope: \"device\", addonId: null, access: \"view\" },\n \"zones.removeZone\": { capName: \"zones\", capScope: \"device\", addonId: null, access: \"delete\" },\n \"zones.updateZone\": { capName: \"zones\", capScope: \"device\", addonId: null, access: \"create\" }\n});\nconst KNOWN_CAP_NAMES = [\n \"addon-pages\",\n \"addon-pages-source\",\n \"addon-routes\",\n \"addon-settings\",\n \"addon-widgets\",\n \"addon-widgets-source\",\n \"addons\",\n \"admin-ui\",\n \"advanced-notifier\",\n \"alerts\",\n \"audio-analysis\",\n \"audio-analyzer\",\n \"audio-codec\",\n \"audio-metrics\",\n \"auth-provider\",\n \"backup\",\n \"brightness\",\n \"camera-credentials\",\n \"camera-streams\",\n \"decoder\",\n \"device-discovery\",\n \"device-export\",\n \"device-manager\",\n \"device-ops\",\n \"device-provider\",\n \"device-state\",\n \"embedding-encoder\",\n \"events\",\n \"integrations\",\n \"intercom\",\n \"local-network\",\n \"log-destination\",\n \"mesh-network\",\n \"metrics-provider\",\n \"motion\",\n \"motion-detection\",\n \"motion-trigger\",\n \"motion-zones\",\n \"mqtt-broker\",\n \"native-object-detection\",\n \"network-access\",\n \"network-quality\",\n \"nodes\",\n \"notification-output\",\n \"oauth-integration\",\n \"osd\",\n \"pipeline-analytics\",\n \"pipeline-executor\",\n \"pipeline-orchestrator\",\n \"pipeline-runner\",\n \"platform-probe\",\n \"privacy-mask\",\n \"ptz\",\n \"ptz-autotrack\",\n \"reboot\",\n \"recording\",\n \"recording-engine\",\n \"restreamer\",\n \"settings-store\",\n \"smtp-provider\",\n \"snapshot\",\n \"snapshot-provider\",\n \"sso-bridge\",\n \"storage\",\n \"storage-provider\",\n \"stream-broker\",\n \"stream-catalog\",\n \"stream-params\",\n \"streaming-engine\",\n \"switch\",\n \"system\",\n \"toast\",\n \"turn-provider\",\n \"user-management\",\n \"user-passkeys\",\n \"webrtc\",\n \"webrtc-session\",\n \"zone-analytics\",\n \"zone-rules\",\n \"zones\"\n];\nconst DEVICE_CAP_NAMES = [\n \"audio-analysis\",\n \"audio-metrics\",\n \"brightness\",\n \"camera-credentials\",\n \"camera-streams\",\n \"device-discovery\",\n \"device-ops\",\n \"events\",\n \"intercom\",\n \"motion\",\n \"motion-detection\",\n \"motion-trigger\",\n \"motion-zones\",\n \"native-object-detection\",\n \"osd\",\n \"pipeline-analytics\",\n \"privacy-mask\",\n \"ptz\",\n \"ptz-autotrack\",\n \"reboot\",\n \"recording\",\n \"snapshot\",\n \"stream-catalog\",\n \"stream-params\",\n \"switch\",\n \"webrtc-session\",\n \"zone-analytics\",\n \"zone-rules\",\n \"zones\"\n];\nconst SYSTEM_CAP_NAMES = [\n \"addon-pages\",\n \"addon-pages-source\",\n \"addon-routes\",\n \"addon-settings\",\n \"addon-widgets\",\n \"addon-widgets-source\",\n \"addons\",\n \"admin-ui\",\n \"advanced-notifier\",\n \"alerts\",\n \"audio-analyzer\",\n \"audio-codec\",\n \"auth-provider\",\n \"backup\",\n \"decoder\",\n \"device-export\",\n \"device-manager\",\n \"device-provider\",\n \"device-state\",\n \"embedding-encoder\",\n \"integrations\",\n \"local-network\",\n \"log-destination\",\n \"mesh-network\",\n \"metrics-provider\",\n \"mqtt-broker\",\n \"network-access\",\n \"network-quality\",\n \"nodes\",\n \"notification-output\",\n \"oauth-integration\",\n \"pipeline-executor\",\n \"pipeline-orchestrator\",\n \"pipeline-runner\",\n \"platform-probe\",\n \"recording-engine\",\n \"restreamer\",\n \"settings-store\",\n \"smtp-provider\",\n \"snapshot-provider\",\n \"sso-bridge\",\n \"storage\",\n \"storage-provider\",\n \"stream-broker\",\n \"streaming-engine\",\n \"system\",\n \"toast\",\n \"turn-provider\",\n \"user-management\",\n \"user-passkeys\",\n \"webrtc\"\n];\nconst SCOPE_PRESETS = [\n {\n id: \"camera-viewer\",\n label: \"Camera viewer\",\n description: \"Read-only over every device — live streams, recordings, motion events, battery state. Combine with `allowedDevices` to restrict to specific cameras.\",\n rows: [\n { type: \"category\", target: \"device\", access: [\"view\"] }\n ]\n },\n {\n id: \"camera-operator\",\n label: \"Camera operator\",\n description: \"Everything `camera-viewer` does plus PTZ control, intercom, snapshots and recording start/stop. Cannot delete devices or recordings.\",\n rows: [\n { type: \"category\", target: \"device\", access: [\"view\", \"create\"] }\n ]\n },\n {\n id: \"cli-deployer\",\n label: \"CLI deployer\",\n description: \"Push addons to the hub and tail their logs. Used by the `camstack` CLI on dev machines. No delete access — a stolen token cannot uninstall.\",\n rows: [\n { type: \"capability\", target: \"addons\", access: [\"view\", \"create\"] }\n ]\n },\n {\n id: \"event-listener\",\n label: \"Event listener\",\n description: \"Subscribe to motion / audio events. Used by webhook bridges and Home Assistant integrations.\",\n rows: [\n { type: \"capability\", target: \"events\", access: [\"view\"] },\n { type: \"capability\", target: \"motion-detection\", access: [\"view\"] },\n { type: \"capability\", target: \"audio-analysis\", access: [\"view\"] }\n ]\n }\n];\nconst CAP_PROVIDER_KIND_MAP = Object.freeze({\n \"device-export\": \"device-export\",\n \"mesh-network\": \"mesh\",\n \"mqtt-broker\": \"broker\",\n \"network-access\": \"ingress\",\n \"smtp-provider\": \"email\"\n});\nconst PROVIDER_KIND_CAP_NAMES = [\n \"device-export\",\n \"mesh-network\",\n \"mqtt-broker\",\n \"network-access\",\n \"smtp-provider\"\n];\nfunction getCapsByProviderKind(kind) {\n const out = [];\n for (const [capName, capKind] of Object.entries(CAP_PROVIDER_KIND_MAP)) {\n if (capKind === kind) out.push(capName);\n }\n return out;\n}\nconst CREDENTIAL_PARAM_PATTERNS = [\n /^user$/i,\n /^usr$/i,\n /^username$/i,\n /^password$/i,\n /^pwd$/i,\n /^pass$/i,\n /^passwd$/i,\n /^secret$/i,\n /^token$/i,\n /^auth$/i,\n /^auth[_-]?token$/i,\n /^bearer$/i,\n /^api[_-]?key$/i,\n /^access[_-]?token$/i,\n /^refresh[_-]?token$/i\n];\nfunction isCredentialParam(name) {\n return CREDENTIAL_PARAM_PATTERNS.some((re) => re.test(name));\n}\nfunction maskUrlCredentials(rawUrl) {\n try {\n const u = new URL(rawUrl);\n let touched = false;\n if (u.username || u.password) {\n u.username = \"\";\n u.password = \"\";\n touched = true;\n }\n for (const key of [...u.searchParams.keys()]) {\n if (isCredentialParam(key)) {\n u.searchParams.set(key, \"***\");\n touched = true;\n }\n }\n return touched ? u.toString() : rawUrl;\n } catch {\n return rawUrl;\n }\n}\nclass RingBuffer {\n constructor(capacity) {\n this.capacity = capacity;\n this.items = Array.from({ length: capacity });\n }\n items;\n head = 0;\n tail = 0;\n count = 0;\n get size() {\n return this.count;\n }\n push(item) {\n this.items[this.tail] = item;\n this.tail = (this.tail + 1) % this.capacity;\n if (this.count < this.capacity) {\n this.count++;\n } else {\n this.head = (this.head + 1) % this.capacity;\n }\n }\n drain(maxCount) {\n const result = [];\n const n = Math.min(maxCount, this.count);\n for (let i = 0; i < n; i++) {\n result.push(this.items[this.head]);\n this.items[this.head] = void 0;\n this.head = (this.head + 1) % this.capacity;\n }\n this.count -= n;\n return result;\n }\n}\nfunction rectsToCells(rects, gridWidth, gridHeight) {\n const total = gridWidth * gridHeight;\n if (total <= 0 || rects.length === 0) {\n return new Array(Math.max(0, total)).fill(false);\n }\n const cells = new Array(total).fill(false);\n for (let row = 0; row < gridHeight; row++) {\n for (let col = 0; col < gridWidth; col++) {\n const cx2 = (col + 0.5) / gridWidth;\n const cy2 = (row + 0.5) / gridHeight;\n for (const rect of rects) {\n if (cx2 >= rect.x && cx2 <= rect.x + rect.w && cy2 >= rect.y && cy2 <= rect.y + rect.h) {\n cells[row * gridWidth + col] = true;\n break;\n }\n }\n }\n }\n return cells;\n}\nfunction cellsToRects(cells, gridWidth, gridHeight, maxRegions) {\n if (gridWidth <= 0 || gridHeight <= 0 || maxRegions <= 0) return [];\n const expected = gridWidth * gridHeight;\n const grid = new Array(expected).fill(false);\n const copyLen = Math.min(cells.length, expected);\n for (let i = 0; i < copyLen; i++) {\n grid[i] = cells[i] === true;\n }\n const blocks = [];\n const pending = [];\n for (let row = 0; row <= gridHeight; row++) {\n const rowRuns = [];\n if (row < gridHeight) {\n let runStart = -1;\n for (let col = 0; col <= gridWidth; col++) {\n const active = col < gridWidth && grid[row * gridWidth + col] === true;\n if (active && runStart === -1) {\n runStart = col;\n } else if (!active && runStart !== -1) {\n rowRuns.push({ colStart: runStart, colEnd: col - 1 });\n runStart = -1;\n }\n }\n }\n const matched = /* @__PURE__ */ new Set();\n const nextPending = [];\n for (const pb of pending) {\n const idx = rowRuns.findIndex(\n (r) => r.colStart === pb.colStart && r.colEnd === pb.colEnd\n );\n if (idx >= 0) {\n nextPending.push(pb);\n matched.add(idx);\n } else {\n blocks.push({ ...pb, rowEnd: row - 1 });\n }\n }\n for (let i = 0; i < rowRuns.length; i++) {\n if (!matched.has(i)) {\n const rr = rowRuns[i];\n nextPending.push({ colStart: rr.colStart, colEnd: rr.colEnd, rowStart: row });\n }\n }\n pending.length = 0;\n for (const p of nextPending) pending.push(p);\n }\n if (blocks.length === 0) return [];\n const sorted = blocks.slice().sort((a, b) => {\n const aArea = (a.colEnd - a.colStart + 1) * (a.rowEnd - a.rowStart + 1);\n const bArea = (b.colEnd - b.colStart + 1) * (b.rowEnd - b.rowStart + 1);\n return bArea - aArea;\n });\n const kept = maxRegions > 0 ? sorted.slice(0, maxRegions) : sorted;\n return kept.map((block) => ({\n x: block.colStart / gridWidth,\n y: block.rowStart / gridHeight,\n w: (block.colEnd - block.colStart + 1) / gridWidth,\n h: (block.rowEnd - block.rowStart + 1) / gridHeight\n }));\n}\nfunction bindAddonActions(api, addonId, catalog) {\n const out = {};\n for (const action of Object.keys(catalog)) {\n out[action] = (input) => {\n const dispatcher = api.addons.custom;\n return dispatcher.mutate({ addonId, action, input });\n };\n }\n return out;\n}\nexport {\n az as ACCESSORY_LABEL,\n ALL_CAPABILITY_DEFINITIONS,\n aA as APPLE_SA_TO_MACRO,\n aB as AUDIO_BACKEND_CHOICES,\n aC as AUDIO_MACRO_LABELS,\n aD as AccessoriesStatusSchema,\n aE as AccessoryKind,\n aF as AddBrokerInputSchema,\n aG as AddonAutoUpdateSchema,\n aH as AddonListItemSchema,\n aI as AddonPageDeclarationSchema,\n aJ as AddonPageInfoSchema,\n aK as AgentLoadSummarySchema,\n aL as AlertSchema,\n aM as AlertSeveritySchema,\n aN as AlertSourceSchema,\n aO as AlertStatusSchema,\n aP as ApiKeyRecordSchema,\n aQ as ApiKeySummarySchema,\n aR as ArchiveEntrySchema,\n aS as ArchiveManifestSchema,\n aT as AudioAnalysisResultSchema,\n aU as AudioAnalysisSettingsSchema,\n aV as AudioChunkInputSchema,\n aW as AudioClassSummarySchema,\n aX as AudioClassificationLabelSchema,\n aY as AudioClassificationResultSchema,\n aZ as AudioCodecInfoSchema,\n a_ as AudioDecodeSessionConfigSchema,\n a$ as AudioEncodeSessionConfigSchema,\n b0 as AudioEncodedChunkSchema,\n b1 as AudioEventSchema,\n b2 as AudioLevelSchema,\n b3 as AudioMetricsHistoryPointSchema,\n b4 as AudioMetricsHistorySchema,\n b5 as AudioMetricsSnapshotSchema,\n b6 as AudioPcmChunkSchema,\n b7 as AuthResultSchema,\n b8 as AutoUpdateSettingsSchema,\n b9 as AvailableIntegrationTypeSchema,\n BACKEND_TO_FORMAT,\n ba as BATTERY_DEVICE_PROFILE,\n bb as BackupDestinationInfoSchema,\n bc as BackupEntrySchema,\n BaseAddon,\n BaseDevice,\n BaseDeviceProvider,\n bd as BatteryStatusSchema,\n be as BoundingBoxSchema,\n bf as BrightnessStatusSchema,\n bg as BrokerAudioClientSchema,\n bh as BrokerClientsSchema,\n bi as BrokerConnectionDetailsSchema,\n bj as BrokerDecodedClientSchema,\n bk as BrokerInfoSchema,\n bl as BrokerRtspClientSchema,\n bm as BrokerStatsSchema,\n bn as BrokerStatusSchema,\n bo as CAM_PROFILE_ORDER,\n CAPABILITY_NAMES,\n CAPABILITY_ROUTER_KEYS,\n CAP_NAMES_WITH_STATUS,\n CAP_PROVIDER_KIND_MAP,\n COCO_80_LABELS,\n COCO_TO_MACRO,\n bp as CamProfileSchema,\n bq as CamStreamDescriptorSchema,\n br as CamStreamKindSchema,\n bs as CamStreamResolutionSchema,\n bt as CameraCredentialsSchema,\n bu as CameraCredentialsStatusSchema,\n bv as CameraMetricsSchema,\n bw as CameraMetricsWithDeviceIdSchema,\n bx as CameraStreamSchema,\n by as CapScopeSchema,\n bz as CapabilityBindingsSchema,\n bA as ChargingStatus,\n bB as ClientNetworkStatsSchema,\n bC as ClusterAddonNodeDeploymentSchema,\n bD as ClusterAddonStatusEntrySchema,\n bE as CollectionColumnSchema,\n bF as CollectionIndexSchema,\n bG as ConfigEntrySchema,\n bH as ConfigSectionWithValuesSchema,\n bI as ConfigTabDeclarationSchema,\n bJ as CreateApiKeyInputSchema,\n bK as CreateApiKeyResultSchema,\n bL as CreateIntegrationInputSchema,\n bM as CreateScopedTokenInputSchema,\n bN as CreateScopedTokenResultSchema,\n bO as CreateUserInputSchema,\n bP as CustomActionInputSchema,\n DEFAULT_ADDON_PLACEMENT,\n bQ as DEFAULT_AUDIO_ANALYZER_CONFIG,\n bR as DEFAULT_DECODER_HWACCEL_CONFIG,\n DEFAULT_FEATURES,\n DEFAULT_LOCATION_SUBDIRS,\n DEFAULT_RETENTION,\n DEVICE_CAP_NAMES,\n bS as DEVICE_PROFILES,\n bT as DEVICE_SETTINGS_CONTRIBUTION_METHODS,\n bU as DEVICE_STATUS_METHOD,\n DEVICE_TYPE_INFO,\n bV as DecodedAudioChunkSchema,\n bW as DecodedFrameSchema,\n bX as DecoderAssignmentSchema,\n bY as DecoderSessionConfigSchema,\n bZ as DecoderStatsSchema,\n b_ as DeleteIntegrationResultSchema,\n b$ as DetectorOutputSchema,\n DeviceConfig,\n c0 as DeviceDiscoveryStatusSchema,\n c1 as DeviceExportExposeInputSchema,\n c2 as DeviceExportStatusSchema,\n c3 as DeviceExportUnexposeInputSchema,\n c4 as DeviceFeature,\n c5 as DeviceInfoSchema,\n c6 as DeviceNetworkStatsSchema,\n c7 as DeviceRole,\n DeviceRuntimeState,\n c8 as DeviceStatusSchema,\n c9 as DeviceType,\n ca as DiscoveredChildDeviceSchema,\n cb as DiscoveredChildStatusSchema,\n cc as DiscoveredDeviceSchema,\n DisposerChain,\n cd as DoorbellPressEventSchema,\n ce as DoorbellStatusSchema,\n ElementConfigStore,\n cf as EmbeddingInfoSchema,\n cg as EmbeddingResultSchema,\n ch as EncodedPacketSchema,\n ci as EnrichedWidgetMetadataSchema,\n EventCategory,\n cj as EventItemSchema,\n ck as EventKindSchema,\n EventSourceType,\n cl as ExportSetupFieldSchema,\n cm as ExportSetupSchema,\n cn as ExposedDeviceSchema,\n co as ExposedResourceSchema,\n cp as FeatureManifestSchema,\n cq as FeatureProbeStatusSchema,\n cr as FrameHandleFormatSchema,\n cs as FrameHandleSchema,\n ct as FrameInputSchema,\n cu as GetStreamWithCodecInputSchema,\n cv as GlobalMetricsSchema,\n HF_BASE_URL,\n HF_REPO,\n cw as HWACCEL_OPTIONS,\n cx as HealthStatusSchema,\n cy as HistoryPointSchema,\n cz as HistoryResolutionEnum,\n cA as InstalledPackageSchema,\n cB as IntegrationLiteSchema,\n cC as IntegrationWithStateSchema,\n cD as IntercomAbilitySchema,\n cE as IntercomStatusSchema,\n KNOWN_CAP_NAMES,\n cF as LocationStatSchema,\n cG as LogEntrySchema,\n cH as LogLevelSchema,\n cI as LogStreamEntrySchema,\n MACRO_LABELS,\n METHOD_ACCESS_MAP,\n cJ as MODEL_FORMATS,\n cK as MaskGridDimsSchema,\n cL as MaskGridShapeSchema,\n cM as MaskLineShapeSchema,\n cN as MaskPointSchema,\n cO as MaskPolygonShapeSchema,\n cP as MaskPolygonVerticesSchema,\n cQ as MaskRectShapeSchema,\n cR as MaskShapeKindSchema,\n cS as MaskShapeSchema,\n cT as MediaFileSchema,\n cU as MeshPeerSchema,\n cV as MeshStatusSchema,\n cW as MethodAccessSchema,\n cX as MotionAnalysisResultSchema,\n cY as MotionEventSchema,\n cZ as MotionOnMotionChangedDataSchema,\n c_ as MotionRegionSchema,\n c$ as MotionSourceEnum,\n d0 as MotionSourcesSchema,\n d1 as MotionStatusSchema,\n d2 as MotionTriggerRuntimeStateSchema,\n d3 as MotionTriggerStatusSchema,\n d4 as MotionZoneOptionsSchema,\n d5 as MotionZonePatchSchema,\n d6 as MotionZoneRegionSchema,\n d7 as MotionZoneStatusSchema,\n d8 as MqttBrokerStatusSchema,\n d9 as NativeDetectionSchema,\n da as NativeObjectClassEnum,\n db as NativeObjectDetectionRuntimeStateSchema,\n dc as NativeObjectDetectionStatusSchema,\n dd as NetworkAccessStatusSchema,\n de as NetworkAddressSchema,\n df as NetworkEndpointSchema,\n dg as NotificationHistoryEntrySchema,\n dh as NotificationRuleSchema,\n di as NotificationSchema,\n dj as OauthIntegrationDescriptorSchema,\n dk as ObjectEventSchema,\n dl as OrchestratorMetricsSchema,\n dm as OsdOverlayKindEnum,\n dn as OsdOverlayPatchSchema,\n dp as OsdOverlaySchema,\n dq as OsdPositionEnum,\n dr as OsdStatusSchema,\n ds as PIPELINE_FLOW_CAPABILITY_NAMES,\n dt as PIPELINE_OWNER_CAPABILITY_NAMES,\n PROVIDER_KIND_CAP_NAMES,\n PYTHON_SCRIPT,\n du as PackageUpdateSchema,\n dv as PackageVersionInfoSchema,\n dw as PasskeySummarySchema,\n dx as PcmSampleFormatSchema,\n dy as PerScopeBreakdownSchema,\n dz as PipelineAssignmentSchema,\n dA as PipelineDefaultStepSchema,\n dB as PipelineEngineChoiceSchema,\n dC as PipelineRunResultBridge,\n dD as PipelineStepInputSchema,\n dE as PlaceholderReasonSchema,\n dF as PolygonPointSchema,\n dG as PrivacyMaskOptionsSchema,\n dH as PrivacyMaskPatchSchema,\n dI as PrivacyMaskRegionSchema,\n dJ as PrivacyMaskShapeSchema,\n dK as PrivacyMaskStatusSchema,\n dL as ProfileSlotSchema,\n dM as ProfileSlotStatusSchema,\n dN as ProviderStatusSchema,\n dO as PtzAutotrackRuntimeStateSchema,\n dP as PtzAutotrackSettingsSchema,\n dQ as PtzAutotrackStatusSchema,\n dR as PtzAutotrackTargetOptionSchema,\n dS as PtzMoveCommandSchema,\n dT as PtzPositionSchema,\n dU as PtzPresetSchema,\n dV as PtzStatusSchema,\n dW as QueryFilterSchema,\n RECOGNITION_TYPES,\n RUNTIME_DEFAULTS,\n RUNTIME_TO_FORMAT,\n ReadinessRegistry,\n ReadinessTimeoutError,\n dX as RegisteredStreamSchema,\n dY as ReportMotionInputSchema,\n RingBuffer,\n dZ as RtpSourceSchema,\n d_ as RtspRestreamEntrySchema,\n d$ as RunnerCameraConfigSchema,\n e0 as RunnerCameraDeviceUIFields,\n e1 as RunnerLocalLoadSchema,\n e2 as RunnerLocalMetricsSchema,\n SCOPE_PRESETS,\n e3 as STORAGE_LOCATION_CARDINALITY,\n STORAGE_LOCATION_TYPES,\n STREAM_PROFILE_META,\n STREAM_QUALITY_LABELS,\n SUB_DETECTION_TYPES,\n SYSTEM_CAP_NAMES,\n e4 as ScopedTokenSchema,\n e5 as ScopedTokenSummarySchema,\n e6 as SearchResultSchema,\n e7 as SegmentSchema,\n e8 as SendEmailInputSchema,\n e9 as SendEmailResultSchema,\n ea as SettingsPatchSchema,\n eb as SettingsRecordSchema,\n ec as SettingsSchemaWithValuesSchema,\n ed as SettingsUpdateResultSchema,\n ee as ShmRingStatsSchema,\n ef as SmtpStatusSchema,\n eg as SnapshotImageSchema,\n eh as SpatialDetectionSchema,\n ei as SsoBridgeClaimsSchema,\n ej as StartEmbeddedInputSchema,\n ek as StorageAbortUploadInputSchema,\n el as StorageBeginDownloadInputSchema,\n em as StorageBeginDownloadResultSchema,\n en as StorageBeginUploadInputSchema,\n eo as StorageBeginUploadResultSchema,\n ep as StorageEndDownloadInputSchema,\n eq as StorageFinalizeUploadInputSchema,\n er as StorageLocationRefSchema,\n es as StorageLocationSchema,\n et as StorageLocationTypeSchema,\n eu as StorageProviderInfoSchema,\n ev as StorageReadChunkInputSchema,\n ew as StorageTestLocationResultSchema,\n ex as StorageWriteChunkInputSchema,\n ey as StreamFormatSchema,\n ez as StreamInfoSchema,\n eA as StreamNetworkStatsSchema,\n eB as StreamParamsOptionsSchema,\n eC as StreamParamsStatusSchema,\n eD as StreamProfileConfigSchema,\n eE as StreamProfileOptionsSchema,\n eF as StreamProfilePatchSchema,\n eG as StreamProfileSchema,\n eH as StreamSourceEntrySchema,\n eI as StreamSourceSchema,\n eJ as SubscribeAudioChunksInputSchema,\n eK as SubscribeAudioChunksResultSchema,\n eL as SubscribeFramesInputSchema,\n eM as SubscribeFramesResultSchema,\n eN as SwitchStatusSchema,\n eO as SystemMetricsSchema,\n SystemMirror,\n eP as TestConnectionResultSchema,\n eQ as ToastSchema,\n eR as TokenScopeSchema,\n eS as TopologyNodeSchema,\n eT as TopologyProcessSchema,\n eU as TopologyServiceSchema,\n eV as TrackSchema,\n eW as TrackStateSchema,\n eX as TrackedDetectionSchema,\n eY as TurnServerSchema,\n eZ as UpdateIntegrationInputSchema,\n e_ as UpdateUserInputSchema,\n e$ as UserRecordSchema,\n f0 as UserSummarySchema,\n f1 as WELL_KNOWN_TABS,\n f2 as WELL_KNOWN_TAB_MAP,\n f3 as WebrtcStreamChoiceSchema,\n f4 as WebrtcStreamTargetSchema,\n f5 as WidgetHostEnum,\n f6 as WidgetMetadataSchema,\n f7 as WidgetRemoteSchema,\n f8 as WidgetSizeEnum,\n f9 as YAMNET_TO_MACRO,\n fa as ZoneKindEnum,\n fb as ZoneRuleModeEnum,\n fc as ZoneRuleSchema,\n fd as ZoneRuleStageEnum,\n fe as ZoneRulesArraySchema,\n ff as ZoneSchema,\n fg as ZoneScopeBreakdownSchema,\n accessoriesCapability,\n fh as accessoryStableId,\n addonPagesCapability,\n addonPagesSourceCapability,\n addonRoutesCapability,\n addonSettingsCapability,\n addonWidgetsCapability,\n addonWidgetsSourceCapability,\n addonsCapability,\n adminUiCapability,\n advancedNotifierCapability,\n alertsCapability,\n asBoolean,\n asJsonArray,\n asJsonObject,\n asNumber,\n asString,\n audioAnalysisCapability,\n audioAnalyzerCapability,\n audioCodecCapability,\n audioMetricsCapability,\n authProviderCapability,\n autoAssignProfiles,\n backupCapability,\n batteryCapability,\n bindAddonActions,\n brightnessCapability,\n buildAddonRouteProvider,\n buildStreamParamsConfigSchema,\n cameraCredentialsCapability,\n cameraPipelineConfigCapability,\n cameraStreamsCapability,\n cellsToRects,\n classifyStream,\n classifyStreams,\n cosineSimilarity,\n createDeviceProxy,\n createEvent,\n createLazyTrpcSource,\n createMirrorSource,\n createRuntimeStateBridge,\n createSliceHandle,\n createSystemProxy,\n customAction,\n decoderCapability,\n defineCustomActions,\n detectionPipelineCapability,\n deviceDiscoveryCapability,\n deviceExportCapability,\n deviceManagerCapability,\n fi as deviceMatchesProfile,\n deviceOpsCapability,\n deviceProviderCapability,\n deviceStateCapability,\n deviceStatusCapability,\n doorbellCapability,\n embeddingEncoderCapability,\n emitDownForOwnedCaps,\n emitReadiness,\n errMsg,\n evaluateZoneRules,\n fj as event,\n eventsCapability,\n fk as expandCapMethods,\n featureProbeCapability,\n formatForBackend,\n formatForRuntime,\n fl as getAudioMacroClassIds,\n getCapsByProviderKind,\n hfModelUrl,\n hydrateSchema,\n integrationsCapability,\n intercomCapability,\n isAgentOnlyPlacement,\n isDeployableToAgent,\n fm as isDeviceConfigCap,\n isEvent,\n localNetworkCapability,\n logDestinationCapability,\n fn as mapAudioLabelToMacro,\n maskUrlCredentials,\n meshNetworkCapability,\n fo as method,\n metricsProviderCapability,\n motionCapability,\n motionDetectionCapability,\n motionTriggerCapability,\n motionZonesCapability,\n mqttBrokerCapability,\n nativeObjectDetectionCapability,\n networkAccessCapability,\n networkQualityCapability,\n nodesCapability,\n normalizeAddonInitResult,\n notificationOutputCapability,\n oauthIntegrationCapability,\n osdCapability,\n parseCameraStreamConfig,\n parseJsonArray,\n parseJsonObject,\n parseJsonUnknown,\n parseStreamParamsFormPatch,\n pipelineAnalyticsCapability,\n pipelineExecutorCapability,\n pipelineOrchestratorCapability,\n pipelineRunnerCapability,\n platformProbeCapability,\n privacyMaskCapability,\n ptzAutotrackCapability,\n ptzCapability,\n pythonScriptForBackend,\n readinessKey,\n rebootCapability,\n recordingCapability,\n recordingEngineCapability,\n rectsToCells,\n requiresPython,\n resolveAddonExecution,\n resolveAddonGroup,\n resolveAddonPlacement,\n resolveAddonRuntime,\n resolveDetectionRuntime,\n fp as resolveDeviceProfile,\n resolveModelFormat,\n resolveRunnerId,\n restreamerCapability,\n runInferenceStep,\n scopeKey,\n settingsStoreCapability,\n smtpProviderCapability,\n snapshotCapability,\n snapshotProviderCapability,\n ssoBridgeCapability,\n storageCapability,\n storageProviderCapability,\n streamBrokerCapability,\n streamCatalogCapability,\n streamParamsCapability,\n streamPixels,\n streamQualityLabel,\n streamingEngineCapability,\n switchCapability,\n systemCapability,\n toDeviceSummary,\n toStreamSourceEntry,\n toastCapability,\n turnProviderCapability,\n userManagementCapability,\n userPasskeysCapability,\n webrtcCapability,\n fq as webrtcClientHintsSchema,\n webrtcSessionCapability,\n fr as wiringAddonHealthSchema,\n fs as wiringHealthSnapshotSchema,\n ft as wiringNodeHealthSchema,\n fu as wiringProbeKindSchema,\n fv as wiringProbeResultSchema,\n zodEntriesToConfigUI,\n zoneAnalyticsCapability,\n zoneRulesCapability,\n zonesCapability\n};\n//# sourceMappingURL=index.mjs.map\n","/**\n * Pure resolver for the 3-level pipeline settings model.\n *\n * Inputs (all optional, missing means \"use the next level\"):\n * - `agentSettings.addonDefaults` — every addonId in the catalog has an\n * entry ({enabled, modelId, settings}). Operator edits these per agent.\n * - `cameraSettings.stepToggles` — per-camera boolean overlay on the\n * enabled flag (absent = inherit agent).\n * - `cameraSettings.pipelineByAgent[agentNodeId]` — escape hatch: full\n * wholesale pipeline override for a specific agent. Bypasses agent\n * defaults + toggles.\n * - `cameraSettings.disableInference` — nukes inference entirely (only\n * motion still runs).\n *\n * Output: the canonical `CameraPipelineConfig` the runner consumes.\n *\n * Zero I/O: the caller owns persistence + catalog fetching. This module\n * is safe to unit test without any storage mock.\n */\nimport type {\n CameraPipelineConfig,\n AgentPipelineSettings,\n AgentAddonConfig,\n CameraPipelineSettings,\n CameraStepOverridePatch,\n PipelineSchema,\n PipelineAddonSchema,\n PipelineEngineChoice,\n PipelineSlotSchema,\n} from '@camstack/types'\n\n// Shallow-merge a CameraStepOverridePatch on top of an AgentAddonConfig.\n// Unset fields in the patch leave the base value intact.\nfunction applyStepPatch(\n base: AgentAddonConfig,\n patch: CameraStepOverridePatch | undefined,\n): AgentAddonConfig {\n if (!patch) return base\n return {\n enabled: patch.enabled ?? base.enabled,\n modelId: patch.modelId ?? base.modelId,\n settings: patch.settings ?? base.settings,\n }\n}\n\n// `emptyPipeline` helper was removed together with the `disableInference`\n// short-circuit — the detection-pipeline binding is now consulted by the\n// caller (resolvePipelineForDevice) which handles the empty-pipeline\n// short-circuit inline.\n\n/**\n * Seed an agent's addonDefaults map from the catalog. For each addonId\n * advertised by any slot, populate a sensible entry:\n * - `modelId` = addon's `defaultModelIdByFormat[engine.format]` if\n * present, else `defaultModelId` (from StepDefinition).\n * - `enabled` = addon's `enabledByDefault` (absent = true).\n * - `settings` = catalog's default settings (empty for now — the\n * runtime applies step-level defaults when settings[key] is absent).\n *\n * Entries already present in `current` are LEFT ALONE — operators who\n * customised a model keep their choice after catalog growth adds new\n * addons. Entries for addonIds that no longer exist in the catalog are\n * dropped (the addon was removed; its config is dead weight).\n */\nexport function seedAgentAddonDefaults(\n current: Readonly<Record<string, AgentAddonConfig>>,\n engine: PipelineEngineChoice,\n catalog: PipelineSchema,\n): Record<string, AgentAddonConfig> {\n const next: Record<string, AgentAddonConfig> = {}\n const liveAddonIds = new Set<string>()\n\n for (const slot of catalog.slots) {\n for (const addon of slot.addons) {\n liveAddonIds.add(addon.id)\n if (current[addon.id]) {\n next[addon.id] = current[addon.id]!\n continue\n }\n // Fresh entry — synthesize from catalog + StepDefinition defaults.\n next[addon.id] = {\n enabled: addon.enabledByDefault ?? true,\n modelId: pickDefaultModelId(addon, engine.format),\n settings: {},\n }\n }\n }\n\n // Preserve ONLY entries for addonIds still in the catalog. We DO NOT\n // retain orphans — they would just never fire (the resolver filters\n // them), and carrying them forever bloats the persisted store.\n for (const key of Object.keys(current)) {\n if (!liveAddonIds.has(key) && next[key]) {\n // shouldn't reach — `next[key]` would be set only if in catalog\n }\n }\n return next\n}\n\n/**\n * Pick the best model ID for `(addon, agent.format)`:\n * 1. `defaultModelIdByFormat[agent.format]` — explicit per-format choice\n * 2. `defaultModelId` from the StepDefinition — format-agnostic default\n * 3. First model in `addon.models[]` that has `formats[agent.format]` — desperate fallback\n *\n * Returns the first candidate whose model exists in the catalog entry's\n * `formats` map for the target engine format. If no candidate matches,\n * falls through to `addon.defaultModelId` (even if incompatible — let\n * the runtime error explicitly rather than silently substitute).\n */\nfunction pickDefaultModelId(addon: PipelineAddonSchema, format: string): string {\n const byFormat = addon.defaultModelIdByFormat?.[format]\n if (byFormat && addon.models.some(m => m.id === byFormat)) return byFormat\n if (addon.models.some(m => m.id === addon.defaultModelId && m.formats?.[format])) {\n return addon.defaultModelId\n }\n const compat = addon.models.find(m => m.formats?.[format])\n if (compat) return compat.id\n return addon.defaultModelId\n}\n\n/**\n * Main resolver — produces the `CameraPipelineConfig` the runner should\n * receive for `(deviceId, agent)`. Pure: zero I/O, zero side effects.\n *\n * Step chain:\n * 1. `cameraSettings.pipelineByAgent[agentNodeId]` → wholesale override\n * 2. Merge addonDefaults + stepToggles → build tree from enabled addons → extract audio\n *\n * \"Inference disabled for this camera\" is NOT handled here — the caller\n * (resolvePipelineForDevice) consults the detection-pipeline binding and\n * short-circuits to `emptyPipeline(engine)` before calling this resolver.\n */\nexport function resolvePipeline(\n agentSettings: AgentPipelineSettings | null,\n cameraSettings: CameraPipelineSettings | null,\n agentNodeId: string,\n engine: PipelineEngineChoice,\n catalog: PipelineSchema,\n): CameraPipelineConfig {\n const cam = cameraSettings ?? {}\n\n const wholesale = cam.pipelineByAgent?.[agentNodeId]\n if (wholesale) {\n // Engine always comes from the agent (per-override engine was\n // removed in phase 2f — the override is relative to the agent's\n // engine). Audio engine is always the agent engine too.\n return {\n engine,\n steps: wholesale.steps,\n audio: wholesale.audio ? { engine, modelId: wholesale.audio.modelId, enabled: wholesale.audio.enabled } : null,\n }\n }\n\n const addonDefaults = agentSettings?.addonDefaults ?? {}\n const toggles = cam.stepToggles ?? {}\n const overridesForAgent = cam.stepOverridesByAgent?.[agentNodeId] ?? {}\n\n // 1. Determine the effective enabled set (agent default XOR camera toggles XOR per-agent patch).\n const enabled: EnabledAddon[] = []\n for (const [addonId, cfg] of Object.entries(addonDefaults)) {\n const patch = overridesForAgent[addonId]\n const patched = applyStepPatch(cfg, patch)\n const toggleOverride = toggles[addonId]\n // Precedence: L2.5 patch.enabled > L2 flat toggle > L1 patched.enabled.\n // The per-agent override is more specific than the flat camera toggle.\n const isEnabled = patch?.enabled ?? toggleOverride ?? patched.enabled\n if (!isEnabled) continue\n enabled.push({ addonId, cfg: patched })\n }\n // Camera can also FORCE-enable an addon not in agent defaults (toggle=true\n // for an addon the operator hasn't configured). Synthesize a bare entry\n // from the catalog — modelId via pickDefaultModelId, settings empty.\n // L2.5 patch still applies.\n for (const [addonId, override] of Object.entries(toggles)) {\n if (override !== true) continue\n if (addonDefaults[addonId]) continue\n const catalogAddon = findInCatalog(catalog, addonId)\n if (!catalogAddon) continue\n const bare: AgentAddonConfig = {\n enabled: true,\n modelId: pickDefaultModelId(catalogAddon, engine.format),\n settings: {},\n }\n const patched = applyStepPatch(bare, overridesForAgent[addonId])\n if (!patched.enabled) continue\n enabled.push({ addonId, cfg: patched })\n }\n\n // 2. Split audio-classifier (goes into CameraPipelineConfig.audio)\n // from video addons (go into the steps tree).\n const audioAddons: EnabledAddon[] = []\n const videoAddons: EnabledAddon[] = []\n for (const entry of enabled) {\n const meta = findInCatalog(catalog, entry.addonId)\n if (!meta) continue // unknown addon, skip silently\n if (meta.slot === 'audio-classifier') audioAddons.push(entry)\n else videoAddons.push(entry)\n }\n\n // 3. Build the video tree via catalog compat (inputClasses ↔ parent outputClasses)\n const steps = buildTreeFromAddons(videoAddons, catalog)\n\n // 4. Audio — pick the first enabled audio-classifier addon (there's\n // usually at most one; if multiple, the resolver is deterministic\n // by iteration order of addonDefaults).\n // Phase 2f: agent-level audio baseline removed; the audio step is\n // driven by the catalog entry + the audio-analyzer addon's own\n // `selectedAudioModel`. Enable/disable is a binding concern, not a\n // settings one.\n const audio = audioAddons.length > 0\n ? {\n engine,\n modelId: audioAddons[0]!.cfg.modelId,\n enabled: true,\n ...(Object.keys(audioAddons[0]!.cfg.settings).length > 0\n ? { settings: audioAddons[0]!.cfg.settings }\n : {}),\n }\n : null\n\n return { engine, steps, audio }\n}\n\ninterface EnabledAddon {\n readonly addonId: string\n readonly cfg: AgentAddonConfig\n}\n\nfunction findInCatalog(catalog: PipelineSchema, addonId: string): PipelineAddonSchema | null {\n for (const slot of catalog.slots) {\n for (const addon of slot.addons) {\n if (addon.id === addonId) return addon\n }\n }\n return null\n}\n\n/**\n * Compose a step tree from a flat list of enabled video addons using\n * catalog compatibility: an addon whose `inputClasses` overlaps a\n * candidate parent's `outputClasses` attaches as the parent's child.\n * Addons with `inputClasses` null/empty become roots.\n *\n * Multiple addons in the same slot with compatible inputClasses run in\n * parallel — they attach to the same parent as siblings. Example: two\n * classifiers (bird-classifier + animal-classifier) both accept 'animal'\n * → both attach to object-detection as siblings, both receive every\n * animal crop.\n *\n * Unparented leaves (inputClasses set, but no matching parent in the\n * enabled set) are DROPPED. The runner would have nothing to feed them\n * anyway — better silent drop than dispatching a dead step.\n */\nexport function buildTreeFromAddons(\n enabled: readonly EnabledAddon[],\n catalog: PipelineSchema,\n): CameraPipelineConfig['steps'] {\n interface TreeNode {\n readonly addonId: string\n readonly modelId: string\n readonly enabled: true\n readonly children: TreeNode[]\n readonly settings?: Readonly<Record<string, unknown>>\n }\n const bySlot = new Map<string, PipelineSlotSchema>()\n for (const slot of catalog.slots) bySlot.set(slot.id, slot)\n\n const nodes = new Map<string, TreeNode>()\n const metaById = new Map<string, PipelineAddonSchema>()\n for (const { addonId, cfg } of enabled) {\n const meta = findInCatalog(catalog, addonId)\n if (!meta) continue\n metaById.set(addonId, meta)\n nodes.set(addonId, {\n addonId,\n modelId: cfg.modelId,\n enabled: true,\n children: [],\n ...(Object.keys(cfg.settings).length > 0 ? { settings: cfg.settings } : {}),\n })\n }\n\n const roots: TreeNode[] = []\n for (const [addonId, node] of nodes) {\n const meta = metaById.get(addonId)!\n const inputs = meta.inputClasses\n if (!inputs || inputs.length === 0) {\n roots.push(node)\n continue\n }\n // Find first enabled parent whose outputClasses overlap with this addon's inputs.\n let parent: TreeNode | null = null\n for (const [candidateId, candidateNode] of nodes) {\n if (candidateId === addonId) continue\n const candidateMeta = metaById.get(candidateId)!\n if (candidateMeta.outputClasses.some(c => inputs.includes(c))) {\n parent = candidateNode\n break\n }\n }\n if (parent) parent.children.push(node)\n // else: orphan — drop silently\n }\n return roots\n}\n","/**\n * `zones-provider.ts` — implements `zonesCapability` for the orchestrator.\n *\n * Per-camera CRUD over polygon detection zones. Persists to the\n * orchestrator's per-device settings store under the `zones` key and\n * mirrors every change into the device-state `zones` slice via\n * `api.deviceState.setCapSlice`. Downstream consumers (motion-wasm,\n * pipeline-executor, analytics, admin UI) read the live state with\n * the canonical `dev.state.zones.onChanged` channel.\n *\n * Onboard / firmware-reported zones are out of scope for now — every\n * zone is operator-drawn. The provider keeps the surface symmetric:\n * `addZone` rejects id collisions, `updateZone` requires an existing\n * id, `removeZone` is idempotent.\n */\n\nimport { z } from 'zod'\nimport {\n type IZonesProvider,\n type Zone,\n ZoneSchema,\n type IScopedLogger,\n type DeviceProxy,\n} from '@camstack/types'\n\n/**\n * Settings + DeviceProxy surface required by the zones provider. Narrow\n * subset of `AddonContext` so the provider is straightforward to test\n * in isolation (the spec passes a fake settings object + a thin\n * fetchDevice stub).\n */\nexport interface ZonesProviderContext {\n readonly logger: IScopedLogger\n readonly settings: {\n readDeviceStore(deviceId: number): Promise<Record<string, unknown>>\n writeDeviceStore(deviceId: number, patch: Record<string, unknown>): Promise<void>\n }\n /**\n * Per-device facade — same shape as `AddonContext.fetchDevice`. The\n * provider uses it to push the canonical `device-state.setCapSlice`\n * write through the codegen DeviceProxy (which auto-injects deviceId\n * and routes through the cap-router → bridge proxy when device-state\n * lives in another worker).\n */\n readonly fetchDevice: (deviceId: number) => Promise<DeviceProxy>\n /**\n * Optional change hook fired after every successful persist. Used by\n * the orchestrator to re-dispatch the runner camera config whenever\n * zones change so the runner-side zone filters refresh without\n * waiting for the next attach. Fired with the new zone list (already\n * persisted + slice-mirrored).\n */\n readonly onZonesChanged?: (deviceId: number, zones: readonly Zone[]) => void\n}\n\nconst ZONES_STORE_KEY = 'zones'\nconst ZONES_CAP_NAME = 'zones'\n\nconst ZonesArraySchema = z.array(ZoneSchema)\n\nexport class ZonesProvider implements IZonesProvider {\n /** Per-device cache. Hydrated lazily on first read for a device. */\n private readonly cache = new Map<number, readonly Zone[]>()\n\n constructor(private readonly ctx: ZonesProviderContext) {}\n\n // ── Cap surface ───────────────────────────────────────────────────\n\n async listZones({ deviceId }: { deviceId: number }): Promise<readonly Zone[]> {\n return this.loadZones(deviceId)\n }\n\n async addZone({ deviceId, zone }: { deviceId: number; zone: Zone }): Promise<void> {\n const existing = await this.loadZones(deviceId)\n if (existing.some(z => z.id === zone.id)) {\n throw new Error(`zones.addZone: id ${zone.id} already exists`)\n }\n await this.persist(deviceId, [...existing, zone])\n }\n\n async updateZone({ deviceId, zone }: { deviceId: number; zone: Zone }): Promise<void> {\n const existing = await this.loadZones(deviceId)\n if (!existing.some(z => z.id === zone.id)) {\n throw new Error(`zones.updateZone: id ${zone.id} not found`)\n }\n const next = existing.map(z => (z.id === zone.id ? zone : z))\n await this.persist(deviceId, next)\n }\n\n async removeZone({ deviceId, zoneId }: { deviceId: number; zoneId: string }): Promise<void> {\n const existing = await this.loadZones(deviceId)\n if (!existing.some(z => z.id === zoneId)) {\n // Idempotent — deleting a missing zone is a no-op.\n return\n }\n await this.persist(deviceId, existing.filter(z => z.id !== zoneId))\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────────\n\n /**\n * Drop a device's cache entry. Called when the device is removed so\n * the next attach starts from a fresh disk read.\n */\n forgetDevice(deviceId: number): void {\n this.cache.delete(deviceId)\n }\n\n // ── Internals ─────────────────────────────────────────────────────\n\n private async loadZones(deviceId: number): Promise<readonly Zone[]> {\n const cached = this.cache.get(deviceId)\n if (cached) return cached\n let zones: readonly Zone[] = []\n try {\n const store = await this.ctx.settings.readDeviceStore(deviceId)\n const raw = store[ZONES_STORE_KEY]\n if (raw !== undefined) {\n const parsed = ZonesArraySchema.safeParse(raw)\n if (parsed.success) {\n zones = parsed.data\n } else {\n this.ctx.logger.warn('zones store entry failed to parse — resetting', {\n tags: { deviceId },\n meta: { issues: parsed.error.issues },\n })\n }\n }\n } catch (err: unknown) {\n this.ctx.logger.warn('zones store read failed — using empty list', {\n tags: { deviceId },\n meta: { error: err instanceof Error ? err.message : String(err) },\n })\n }\n this.cache.set(deviceId, zones)\n return zones\n }\n\n private async persist(deviceId: number, zones: readonly Zone[]): Promise<void> {\n this.cache.set(deviceId, zones)\n await this.ctx.settings.writeDeviceStore(deviceId, { [ZONES_STORE_KEY]: zones })\n const dev = await this.ctx.fetchDevice(deviceId)\n await dev.deviceState.setCapSlice({\n capName: ZONES_CAP_NAME,\n slice: { zones },\n })\n this.ctx.onZonesChanged?.(deviceId, zones)\n }\n}\n","/**\n * `zone-rules-provider.ts` — implements `zoneRulesCapability` for the\n * orchestrator.\n *\n * Per-stage rule arrays (motion / detection) live next to zones in the\n * orchestrator's per-device store under `zoneRules.<stage>` keys.\n * Every mutation mirrors to a stage-specific device-state slice\n * (`motion-zone-rules`, `detection-zone-rules`) so consumer addons\n * subscribe independently and pick up the new gating without an extra\n * cap round-trip.\n *\n * The provider validates each rule against {@link ZoneRuleSchema}\n * before persisting — partial / corrupt writes are rejected outright\n * since rules drive runtime filtering and a bad payload would silently\n * widen the operator's intended scope.\n */\n\nimport { z } from 'zod'\nimport {\n type IZoneRulesProvider,\n type ZoneRule,\n type ZoneRuleStage,\n ZoneRuleSchema,\n type IScopedLogger,\n type DeviceProxy,\n} from '@camstack/types'\n\nexport interface ZoneRulesProviderContext {\n readonly logger: IScopedLogger\n readonly settings: {\n readDeviceStore(deviceId: number): Promise<Record<string, unknown>>\n writeDeviceStore(deviceId: number, patch: Record<string, unknown>): Promise<void>\n }\n /**\n * Per-device facade — same shape as `AddonContext.fetchDevice`.\n * Used to push the `device-state.setCapSlice` write through the\n * codegen DeviceProxy.\n */\n readonly fetchDevice: (deviceId: number) => Promise<DeviceProxy>\n /**\n * Optional change hook fired after every successful persist. The\n * orchestrator may want to re-attach the runner config when motion\n * rules change so motion-wasm picks up the new gating without\n * waiting for the next attach. Detection rules are consumed by\n * analytics via the dev-state mirror and don't need a re-attach.\n */\n readonly onRulesChanged?: (\n deviceId: number,\n stage: ZoneRuleStage,\n rules: readonly ZoneRule[],\n ) => void\n}\n\n/** Settings store key for stage rules. Kept under a single nested\n * object so a future stage just adds another property without\n * reshuffling the schema. */\nconst RULES_STORE_KEY = 'zoneRules'\n\n/** Cap name for the unified runtime-state slice. Matches the cap's\n * declared `name` so the codegen DeviceProxy auto-wires\n * `device.state.zoneRules`. The slice value is the full\n * `{motion, detection}` object — both stages travel together so a\n * single reactive handle covers every consumer. */\nconst ZONE_RULES_CAP_NAME = 'zone-rules'\n\nconst RulesArraySchema = z.array(ZoneRuleSchema)\n\ninterface PerStageStore {\n readonly motion?: unknown\n readonly detection?: unknown\n}\n\nexport class ZoneRulesProvider implements IZoneRulesProvider {\n /** Per-device per-stage cache. Hydrated lazily on first read. */\n private readonly cache = new Map<number, Map<ZoneRuleStage, readonly ZoneRule[]>>()\n\n constructor(private readonly ctx: ZoneRulesProviderContext) {}\n\n // ── Cap surface ───────────────────────────────────────────────────\n\n async listRules({ deviceId, stage }: { deviceId: number; stage: ZoneRuleStage }): Promise<readonly ZoneRule[]> {\n return this.loadRules(deviceId, stage)\n }\n\n async setRules({\n deviceId,\n stage,\n rules,\n }: {\n deviceId: number\n stage: ZoneRuleStage\n rules: readonly ZoneRule[]\n }): Promise<void> {\n // Validate the whole list up front — rejecting on first failure\n // keeps the persisted shape consistent.\n const parsed = RulesArraySchema.safeParse(rules)\n if (!parsed.success) {\n throw new Error(\n `zone-rules.setRules: invalid rule payload — ${parsed.error.issues.map(i => i.message).join('; ')}`,\n )\n }\n await this.persist(deviceId, stage, parsed.data)\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────────\n\n /** Drop a device's cache entries. Called when the device is removed. */\n forgetDevice(deviceId: number): void {\n this.cache.delete(deviceId)\n }\n\n // ── Internals ─────────────────────────────────────────────────────\n\n private async loadRules(deviceId: number, stage: ZoneRuleStage): Promise<readonly ZoneRule[]> {\n let perDevice = this.cache.get(deviceId)\n if (!perDevice) {\n perDevice = new Map<ZoneRuleStage, readonly ZoneRule[]>()\n this.cache.set(deviceId, perDevice)\n }\n const cached = perDevice.get(stage)\n if (cached) return cached\n let rules: readonly ZoneRule[] = []\n try {\n const store = await this.ctx.settings.readDeviceStore(deviceId)\n const block = store[RULES_STORE_KEY] as PerStageStore | undefined\n const raw = block?.[stage]\n if (raw !== undefined) {\n const parsed = RulesArraySchema.safeParse(raw)\n if (parsed.success) {\n rules = parsed.data\n } else {\n this.ctx.logger.warn('zone-rules store entry failed to parse — resetting', {\n tags: { deviceId },\n meta: { stage, issues: parsed.error.issues },\n })\n }\n }\n } catch (err: unknown) {\n this.ctx.logger.warn('zone-rules store read failed — using empty list', {\n tags: { deviceId },\n meta: { stage, error: err instanceof Error ? err.message : String(err) },\n })\n }\n perDevice.set(stage, rules)\n return rules\n }\n\n private async persist(\n deviceId: number,\n stage: ZoneRuleStage,\n rules: readonly ZoneRule[],\n ): Promise<void> {\n let perDevice = this.cache.get(deviceId)\n if (!perDevice) {\n perDevice = new Map<ZoneRuleStage, readonly ZoneRule[]>()\n this.cache.set(deviceId, perDevice)\n }\n perDevice.set(stage, rules)\n\n // Read-modify-write the per-device block so the other stage's\n // rules survive this update.\n const existing = await this.ctx.settings.readDeviceStore(deviceId)\n const prev = (existing[RULES_STORE_KEY] as PerStageStore | undefined) ?? {}\n const nextBlock: PerStageStore = { ...prev, [stage]: rules }\n await this.ctx.settings.writeDeviceStore(deviceId, { [RULES_STORE_KEY]: nextBlock })\n\n // Mirror the full `{motion, detection}` slice — consumer code\n // reads via `device.state.zoneRules.value.<stage>` and the codegen\n // DeviceProxy keeps both branches in lock-step. The other stage's\n // current value comes from the cache (or empty array if never\n // touched), so a write on motion never silently drops detection.\n const otherStage: ZoneRuleStage = stage === 'motion' ? 'detection' : 'motion'\n const otherRules = perDevice.get(otherStage) ?? await this.loadRules(deviceId, otherStage)\n const sliceValue = stage === 'motion'\n ? { motion: rules, detection: otherRules }\n : { motion: otherRules, detection: rules }\n\n try {\n const dev = await this.ctx.fetchDevice(deviceId)\n await dev.deviceState.setCapSlice({\n capName: ZONE_RULES_CAP_NAME,\n slice: sliceValue,\n })\n } catch (err: unknown) {\n this.ctx.logger.debug('zone-rules slice mirror failed', {\n tags: { deviceId },\n meta: { stage, error: err instanceof Error ? err.message : String(err) },\n })\n }\n\n this.ctx.onRulesChanged?.(deviceId, stage, rules)\n }\n}\n","import type { RunnerLocalLoad } from '@camstack/types'\n\n/**\n * Input to the load balancer: one entry per online runner node.\n */\nexport interface BalancerInput {\n /** Per-node load snapshots fetched from each runner's `getLocalLoad()` cap. */\n readonly nodes: readonly RunnerLocalLoad[]\n /** Optional L1 affinity — if set and the node is online, it wins unconditionally. */\n readonly preferredAgent?: string | null\n}\n\n/**\n * Output of the load balancer: the picked agent nodeId plus the reason the\n * balancer chose it. `null` when no online runner is available.\n */\nexport interface BalancerDecision {\n readonly agentNodeId: string\n readonly reason: 'manual' | 'capacity'\n readonly score: number\n}\n\n/**\n * Compute the L2 capacity score for a runner node. Lower is better.\n * The score is a weighted sum of the runner's active workload so the balancer\n * prefers agents that are serving fewer cameras OR draining queues quickly.\n *\n * Rationale:\n * - `attachedCameras * avgInferenceFps` approximates the total inference rate\n * the agent is currently sustaining (not just how many cameras are assigned).\n * - `queueDepthTotal` penalises agents that are falling behind the frame feed.\n */\nexport function computeCapacityScore(load: RunnerLocalLoad): number {\n const inferenceRate = load.attachedCameras * Math.max(load.avgInferenceFps, 0)\n return inferenceRate + Math.max(load.queueDepthTotal, 0)\n}\n\n/**\n * Run the two-level camera balancer.\n *\n * L1 (manual affinity): if `preferredAgent` names an online node, return it.\n * L2 (capacity): compute capacity scores and pick the lowest.\n *\n * Returns `null` when no runners are online. The orchestrator decides how to\n * react — typically by logging and deferring the assignment until a runner\n * comes online.\n */\nexport function balance(input: BalancerInput): BalancerDecision | null {\n const online = input.nodes.filter((n) => n.nodeId.length > 0)\n if (online.length === 0) return null\n\n // L1 — manual affinity wins unconditionally when the preferred node is online.\n if (input.preferredAgent) {\n const match = online.find((n) => n.nodeId === input.preferredAgent)\n if (match) {\n return {\n agentNodeId: match.nodeId,\n reason: 'manual',\n score: computeCapacityScore(match),\n }\n }\n }\n\n // L2 — pick the lowest capacity score.\n const best = online\n .map((node) => ({ node, score: computeCapacityScore(node) }))\n .sort((a, b) => a.score - b.score)[0]!\n\n return {\n agentNodeId: best.node.nodeId,\n reason: 'capacity',\n score: best.score,\n }\n}\n\n// ── Decoder balancer ──────────────────────────────────────────────────\n\nexport interface DecoderBalancerInput {\n readonly decoderNodes: readonly RunnerLocalLoad[]\n readonly pipelineNodeId: string\n readonly preferredDecoderNode?: string | null\n}\n\nexport interface DecoderBalancerDecision {\n readonly decoderNodeId: string\n readonly reason: 'manual' | 'capacity' | 'co-located'\n readonly score: number\n}\n\n/**\n * Choose decoder node. Priority: manual pin → co-located with pipeline → capacity.\n */\nexport function balanceDecoder(\n input: DecoderBalancerInput,\n): DecoderBalancerDecision | null {\n const { decoderNodes, pipelineNodeId, preferredDecoderNode } = input\n if (decoderNodes.length === 0) return null\n\n // L1 — manual pin\n if (preferredDecoderNode) {\n const match = decoderNodes.find((n) => n.nodeId === preferredDecoderNode)\n if (match) {\n return { decoderNodeId: match.nodeId, reason: 'manual', score: computeCapacityScore(match) }\n }\n }\n\n // L2 — co-located with pipeline\n const colocated = decoderNodes.find((n) => n.nodeId === pipelineNodeId)\n if (colocated) {\n return { decoderNodeId: colocated.nodeId, reason: 'co-located', score: computeCapacityScore(colocated) }\n }\n\n // L3 — capacity\n const scored = decoderNodes\n .map((node) => ({ node, score: computeCapacityScore(node) }))\n .sort((a, b) => a.score - b.score)\n\n const best = scored[0]!\n return { decoderNodeId: best.node.nodeId, reason: 'capacity', score: best.score }\n}\n","/**\n * Simple two-level audio balancer.\n * L1: manual pin (audioNodeId device setting != 'auto')\n * L2: least-loaded node by device count\n */\n\nexport interface AudioNodeLoad {\n readonly nodeId: string\n /** Number of devices currently assigned to this node. */\n readonly deviceCount: number\n}\n\nexport interface AudioBalancerInput {\n readonly nodes: readonly AudioNodeLoad[]\n /** Preferred node from device store setting. null = use balancer. */\n readonly preferredNode: string | null\n}\n\nexport type AudioBalancerReason = 'manual' | 'capacity'\n\nexport interface AudioBalancerDecision {\n readonly nodeId: string\n readonly reason: AudioBalancerReason\n}\n\nexport function balanceAudio(input: AudioBalancerInput): AudioBalancerDecision | null {\n if (input.nodes.length === 0) return null\n\n // L1: honour manual pin if that node is available\n if (input.preferredNode) {\n const pinned = input.nodes.find((n) => n.nodeId === input.preferredNode)\n if (pinned) return { nodeId: pinned.nodeId, reason: 'manual' }\n }\n\n // L2: pick the node with the fewest assigned devices\n const best = input.nodes.slice().sort((a, b) => a.deviceCount - b.deviceCount)[0]!\n return { nodeId: best.nodeId, reason: 'capacity' }\n}\n","/**\n * `AudioChunkPoller` — the consumer-side poll loop of the decoded audio-chunk\n * plane (Phase 5 / D9).\n *\n * Replaces the live-object `IStreamBroker.onDecodedAudioChunk(cb)` callback\n * path. A live callback cannot cross a process boundary; once the `pipeline`\n * group is dissolved (Task 8) the orchestrator runs in a different process\n * from the broker, so audio delivery must go over tRPC.\n *\n * The consumer:\n *\n * 1. `subscribeAudioChunks({ brokerId, tag })` over tRPC — the broker\n * registers a per-subscription bounded FIFO queue and returns a\n * `subscriptionId`;\n * 2. polls `pullAudioChunks({ subscriptionId, maxCount })` on a modest\n * interval, draining `DecodedAudioChunk`s in FIFO arrival order;\n * 3. feeds each chunk to its downstream audio logic;\n * 4. on teardown, `unsubscribeAudioChunks`.\n *\n * Audio is not latency-critical like video, and chunks arrive only ~every\n * 500ms (the broker's `AudioCodecSession` window). A modest poll period plus\n * a small per-poll burst keeps latency low without busy-spinning. The\n * broker's queue is FIFO/no-drop-sized so a poll-period of jitter never\n * loses a chunk.\n */\nimport { errMsg } from '@camstack/types'\nimport type { AddonApi, DecodedAudioChunkWire, IScopedLogger } from '@camstack/types'\n\n/** Poll period — audio chunks arrive ~every 500ms; 200ms keeps latency low. */\nconst POLL_INTERVAL_MS = 200\n\n/** How many chunks to drain per poll — a small burst absorbs jitter. */\nconst PULL_MAX_COUNT = 8\n\n/**\n * Consecutive pull failures before we attempt to re-subscribe. A single failed\n * poll is treated as a blip (re-subscribing would leak a broker-side FIFO); a\n * sustained failure means the broker child restarted and dropped our\n * subscription, so we re-establish it.\n */\nconst RESUBSCRIBE_AFTER_FAILURES = 2\n\n/** Re-subscribe at most once every N ticks while failing (~1s at 200ms). */\nconst RESUBSCRIBE_THROTTLE_TICKS = 5\n\n/** Inputs for a single audio-chunk subscription. */\nexport interface AudioChunkPollerOptions {\n /** The cross-addon API surface — audio chunks travel over `streamBroker`. */\n readonly api: AddonApi\n /** Broker id (`<deviceId>/<streamId>`) to subscribe to. */\n readonly brokerId: string\n /** Short caller-identity tag for broker-side diagnostics. */\n readonly tag: string\n /** Called for every drained chunk, in FIFO arrival order. */\n readonly onChunk: (chunk: DecodedAudioChunkWire) => void | Promise<void>\n readonly logger: IScopedLogger\n}\n\n/**\n * Subscribe to a broker's decoded audio-chunk stream and start the poll loop.\n * Resolves to a teardown closure once the subscription is established, or\n * `null` when the subscription could not be opened (e.g. no broker for\n * `brokerId`).\n *\n * The teardown closure stops the loop and releases the broker subscription.\n * The loop is single-flight: a slow `onChunk`/`pullAudioChunks` is awaited\n * before the next poll is scheduled, so it never overlaps itself.\n */\nexport async function startAudioChunkPoller(\n options: AudioChunkPollerOptions,\n): Promise<(() => void) | null> {\n const { api, brokerId, tag, onChunk, logger } = options\n\n let subscriptionId: string\n try {\n const result = await api.streamBroker.subscribeAudioChunks.mutate({\n brokerId,\n tag,\n })\n subscriptionId = result.subscriptionId\n } catch (err: unknown) {\n logger.warn('audio-chunk poller: subscribeAudioChunks failed', {\n meta: { brokerId, tag, error: errMsg(err) },\n })\n return null\n }\n\n let stopped = false\n let timer: ReturnType<typeof setTimeout> | undefined\n // Tracks a broker outage so the loop self-heals after a stream-broker child\n // restart/crash: the respawned broker has no record of our `subscriptionId`,\n // so `pullAudioChunks` fails until we re-subscribe for a fresh one.\n let consecutiveFailures = 0\n\n // Re-establish the subscription against the (possibly respawned) broker. On\n // success the loop resumes against the fresh id; the old broker-side FIFO is\n // gone with the dead process (or idle-evicted), so this doesn't leak.\n const resubscribe = async (): Promise<boolean> => {\n try {\n const result = await api.streamBroker.subscribeAudioChunks.mutate({ brokerId, tag })\n subscriptionId = result.subscriptionId\n logger.info('audio-chunk poller: re-subscribed after broker outage', {\n meta: { brokerId, tag, subscriptionId, afterFailures: consecutiveFailures },\n })\n return true\n } catch {\n return false\n }\n }\n\n const tick = async (): Promise<void> => {\n if (stopped) return\n try {\n const chunks = await api.streamBroker.pullAudioChunks.query({\n subscriptionId,\n maxCount: PULL_MAX_COUNT,\n })\n if (consecutiveFailures > 0) {\n logger.info('audio-chunk poller: stream recovered', { meta: { brokerId, subscriptionId } })\n }\n consecutiveFailures = 0\n for (const chunk of chunks) {\n if (stopped) break\n await onChunk(chunk)\n }\n } catch (err: unknown) {\n consecutiveFailures += 1\n // A respawned broker dropped our subscription — re-subscribe so audio\n // recovers without a full hub restart. Skip the first failure (a blip);\n // then attempt at `RESUBSCRIBE_AFTER_FAILURES` (~400ms) and every\n // `RESUBSCRIBE_THROTTLE_TICKS` failures after (~1s) while still down.\n if (consecutiveFailures === 1) {\n logger.warn('audio-chunk poller: pullAudioChunks failed — attempting recovery', {\n meta: { brokerId, subscriptionId, error: errMsg(err) },\n })\n }\n if (\n !stopped &&\n consecutiveFailures >= RESUBSCRIBE_AFTER_FAILURES &&\n (consecutiveFailures - RESUBSCRIBE_AFTER_FAILURES) % RESUBSCRIBE_THROTTLE_TICKS === 0\n ) {\n await resubscribe()\n }\n }\n if (!stopped) {\n timer = setTimeout(() => void tick(), POLL_INTERVAL_MS)\n }\n }\n\n // Run the first poll immediately so the consumer is not blind for a full\n // poll interval. `tick` self-schedules every later poll; its `stopped`\n // guard means a teardown firing before/just after this first tick still\n // stops the loop cleanly.\n void tick()\n\n return () => {\n if (stopped) return\n stopped = true\n if (timer) {\n clearTimeout(timer)\n timer = undefined\n }\n api.streamBroker.unsubscribeAudioChunks\n .mutate({ subscriptionId })\n .catch((err: unknown) => {\n logger.warn('audio-chunk poller: unsubscribeAudioChunks failed', {\n meta: { brokerId, subscriptionId, error: errMsg(err) },\n })\n })\n }\n}\n","import type { ProfileSlot } from '@camstack/types'\n\n/**\n * Derives the set of deviceIds that currently have at least one broker\n * profile slot that is assigned (status !== 'unassigned') AND has a\n * non-null sourceCamStreamId.\n *\n * This is the \"desired\" fleet — cameras the orchestrator should have\n * dispatched. Used by `reconcileDispatch` to compute the gap against\n * `cameraConfigs`.\n */\nexport function desiredDeviceIdsFromSlots(slots: readonly ProfileSlot[]): Set<number> {\n const result = new Set<number>()\n for (const slot of slots) {\n if (slot.status !== 'unassigned' && slot.sourceCamStreamId !== null) {\n result.add(slot.deviceId)\n }\n }\n return result\n}\n\n/**\n * Returns the deviceIds that are present in `desired` but absent from\n * `known`. These are the cameras the orchestrator has not yet dispatched\n * and needs to process via `handleDeviceRegistered`.\n *\n * Additive only — cameras present in `known` are never included, even\n * if they fall out of `desired`, to avoid fighting the live event path.\n */\nexport function computeDispatchGap(\n desired: ReadonlySet<number>,\n known: ReadonlySet<number>,\n): number[] {\n return [...desired].filter((id) => !known.has(id))\n}\n","/**\n * addon-pipeline-orchestrator — hub-side camera-to-agent load balancer.\n *\n * Owns the control plane for the distributed detection pipeline. Tracks\n * which `addon-pipeline-runner` instance is responsible for each camera,\n * queries each runner's capacity + hardware profile, and dispatches\n * `attachCamera` / `detachCamera` cap calls to the appropriate runner via\n * the Moleculer broker. Persists manual pins via the per-device settings\n * store so user overrides survive hub restarts.\n *\n * Strictly control plane — never sees a frame, never runs inference, never\n * drains queues. The runner does that work locally on each vision node.\n *\n * ## Dispatch entrypoints\n *\n * - **`dispatchCamera(runnerConfig)`** — in-process only (not in the cap\n * def). Called by `DetectionWiringService` with a freshly-built\n * `RunnerCameraConfig`. Runs the L1/L2/L3 balancer, picks an agent, then\n * issues `broker.call('pipeline-runner.pipeline-runner.attachCamera', ...)`.\n * Caches the config so future rebalance / pinning can re-dispatch without\n * the caller rebuilding it.\n *\n * - **`assignCamera({deviceId, agentNodeId})`** — cap method. Persists a\n * manual `preferredAgent` pin to per-device settings and re-dispatches\n * immediately if the camera is already attached.\n *\n * - **`unassignCamera({deviceId})`** — cap method. Clears the pin,\n * detaches the camera from its current agent.\n *\n * - **`rebalance()`** — cap method. Walks every cached camera config and\n * re-runs the balancer; migrates cameras whose current agent is no\n * longer optimal. Pinned cameras are never migrated.\n *\n * ## Runner dispatch\n *\n * All runner calls go through `this.ctx.api.pipelineRunner.*` (the generated\n * tRPC cap router). The router extracts `nodeId` from the input and\n * routes transparently to the local runner (direct in-process call) or\n * to a remote agent (via Moleculer). Node discovery is driven by\n * `EventCategory.AgentOnline/AgentOffline` events forwarded by\n * `agent-registry.service.ts`.\n */\nimport type {\n AddonInitResult,\n IPipelineOrchestratorProvider,\n PipelineAssignment,\n DecoderAssignment,\n AgentLoadSummary,\n CameraMetrics,\n PipelineOrchestratorGlobalMetrics,\n RunnerLocalLoad,\n RunnerCameraConfig,\n PipelineCameraAssignmentPayload,\n CameraDetectionConfig,\n AudioChunkInput,\n PipelineInferenceResultPayload,\n Unsubscribe,\n AudioResult,\n AudioDetection,\n ConfigUISchemaWithValues,\n ConfigSectionWithValues,\n CameraPipelineConfig,\n CameraPipelineTemplate,\n AgentAddonConfig,\n AgentPipelineSettings,\n CameraPipelineSettings,\n CameraStepOverridePatch,\n PipelineSchema,\n PipelineEngineChoice,\n CamProfile,\n ProfileSlot,\n MotionSources,\n} from \"@camstack/types\";\nimport { MotionSourcesSchema, RunnerCameraDeviceUIFields } from \"@camstack/types\";\nimport {\n seedAgentAddonDefaults,\n resolvePipeline as resolvePipelinePure,\n} from \"./pipeline-resolver.js\";\nimport {\n BaseAddon,\n DeviceType,\n DeviceFeature,\n EventCategory,\n createEvent,\n isEvent,\n hydrateSchema,\n pipelineOrchestratorCapability,\n cameraPipelineConfigCapability,\n pipelineExecutorCapability,\n zonesCapability,\n zoneRulesCapability,\n addonWidgetsSourceCapability,\n errMsg,\n ReadinessRegistry,\n resolveDeviceProfile,\n type IAddonWidgetsSourceProvider,\n} from \"@camstack/types\";\nimport type { PipelinePhaseMode } from \"@camstack/types\";\n\nconst PHASE_MODE_VALUES: ReadonlySet<string> = new Set([\n 'disabled', 'always-on', 'on-motion',\n])\nfunction isPipelinePhaseMode(v: string): v is PipelinePhaseMode {\n return PHASE_MODE_VALUES.has(v)\n}\nimport { ZonesProvider } from \"./zones-provider.js\";\nimport { ZoneRulesProvider } from \"./zone-rules-provider.js\";\nimport type { ReadinessTransition } from \"@camstack/types\";\nimport { z } from \"zod\";\nimport { customAction, defineCustomActions } from \"@camstack/types\";\nimport {\n balance,\n balanceDecoder,\n computeCapacityScore,\n type BalancerDecision,\n} from \"./load-balancer.js\";\nimport {\n balanceAudio,\n type AudioNodeLoad,\n} from \"./audio-load-balancer.js\";\nimport { startAudioChunkPoller } from \"./audio-chunk-poller.js\";\nimport {\n desiredDeviceIdsFromSlots,\n computeDispatchGap,\n} from \"./dispatch-reconcile.js\";\n\n// The orchestrator reaches the broker through the `stream-broker` capability\n// over tRPC (`this.ctx.api.streamBroker.*`). Audio analysis subscribes via the\n// serialisable `subscribeAudioChunks` / `pullAudioChunks` plane (Phase 5 / D9),\n// polled by `AudioChunkPoller` — no live broker object crosses the boundary.\n\n/** Key under which the orchestrator stores its per-device manual pin. */\nconst PREFERRED_AGENT_SETTING = \"preferredAgent\";\n\n/** Key under which the orchestrator stores the per-device audio node pin. */\nconst AUDIO_NODE_SETTING = \"audioNodeId\";\n\nconst DEFAULT_BROKER_CALL_TIMEOUT_MS = 5_000;\n/** Debounce window for `scheduleReconcile` — coalesces bursts of topology/slot-change signals. */\nconst RECONCILE_DEBOUNCE_MS = 200;\n\n// ── Pipeline settings store keys ──────────────────────────────────────\n//\n// 3-level resolution model:\n//\n// `agentSettings[nodeId]` → engine choice + addonDefaults (every\n// addonId in the catalog gets an entry)\n// + audio baseline. Auto-seeded on\n// $node.connected, editable by operator.\n//\n// `cameraSettings[deviceId]` → per-camera overlay: stepToggles\n// (addonId→bool force) and pipelineByAgent\n// (full wholesale override). The legacy\n// disableInference nuke switch is replaced\n// by the detection-pipeline binding.\n//\n// `templates` → operator-curated preset library (kept\n// unchanged from the previous shape).\nconst AGENT_SETTINGS_KEY = \"agentSettings\";\nconst CAMERA_SETTINGS_KEY = \"cameraSettings\";\nconst TEMPLATES_KEY = \"templates\";\n\n/**\n * Device-details keys routed through the orchestrator's pipeline\n * settings writer instead of the device orchestration store. The\n * `cameraPipeline` key carries the full `CameraPipelineConfig`\n * emitted by the `pipeline-editor` ConfigField (Phase 6 Option B).\n */\nconst PIPELINE_PATCH_KEYS = [\"cameraPipeline\"] as const;\n\n/** Failover policy values persisted under `addon:pipeline-orchestrator` global settings. */\ntype DisconnectPolicy = \"migrate\" | \"leave-unassigned\";\ntype PinnedDisconnectPolicy = \"leave-pinned\" | \"unpin-and-migrate\";\ntype ReconnectPolicy = \"restore\" | \"rebalance\";\n\ninterface FailoverPolicy {\n readonly onDisconnect: DisconnectPolicy;\n readonly pinnedOnDisconnect: PinnedDisconnectPolicy;\n readonly onReconnect: ReconnectPolicy;\n}\n\nconst DEFAULT_FAILOVER_POLICY: FailoverPolicy = {\n onDisconnect: \"migrate\",\n pinnedOnDisconnect: \"leave-pinned\",\n onReconnect: \"restore\",\n};\n\n/**\n * Custom-action catalog exposed through `api.addons.custom` (Task 9.1 PoC).\n *\n * The orchestrator's cap surface is the contract for all runtime traffic\n * (assignCamera / unassignCamera / rebalance / getGlobalMetrics etc). This\n * catalog is reserved for read-only diagnostics that are intentionally\n * outside the cap — they expose internal state (balancer caches, enabledNodes\n * set, active detection count) that is useful for admin tooling but does not\n * belong on the capability contract.\n */\nconst OrchestratorDiagnosticsSchema = z.object({\n localNodeId: z.string(),\n knownRunnerNodes: z.array(z.string()),\n cachedAgentLoadNodeIds: z.array(z.string()),\n enabledNodes: z.array(z.string()),\n assignedDeviceCount: z.number().int().min(0),\n cameraConfigCount: z.number().int().min(0),\n activeDetectionCount: z.number().int().min(0),\n});\n\nexport type OrchestratorDiagnostics = z.infer<\n typeof OrchestratorDiagnosticsSchema\n>;\n\nexport const pipelineOrchestratorActions = defineCustomActions({\n dumpState: customAction(z.void(), OrchestratorDiagnosticsSchema),\n});\n\nexport type PipelineOrchestratorActions = typeof pipelineOrchestratorActions;\n\n// NOTE — Phase 6 cleanup: `DEFAULT_ORCHESTRATION_SETTINGS` and\n// `ORCHESTRATION_SETTING_KEYS` lived here to back the legacy\n// `getDeviceOrchestrationSettings` / `getGlobalOrchestrationSettings`\n// cap methods. They've been removed: the addon's `getConfigSchema()`\n// now carries every field default, and consumers read settings via\n// `resolveAddonSettings(schema, global, device)` which uses those\n// defaults directly. See `DetectionWiringService.resolveDeviceSettings`\n// for the canonical consumer.\n\n/**\n * Result of a successful dispatch. Returned by `dispatchCamera` so the\n * caller (DetectionWiringService) can log / emit follow-up events with\n * the same rationale the balancer used.\n */\nexport interface DispatchResult {\n readonly success: true;\n readonly agentNodeId: string;\n readonly reason: PipelineAssignment[\"reason\"];\n}\n\n/**\n * Metadata for a per-device audio-analyzer assignment.\n * Replaces the bare `audioNodeByDevice` string value with a typed record.\n */\ninterface AudioNodeAssignment {\n readonly deviceId: number;\n readonly nodeId: string;\n readonly pinned: boolean;\n readonly assignedAt: number;\n}\n\n/**\n * Local-only provider surface resolved via the kernel capability registry.\n * Extends the cap interface with the in-process dispatch entrypoints that\n * can't cleanly round-trip through the tRPC serializer because they carry\n * a full `PipelineConfig` payload attached to the `RunnerCameraConfig`.\n */\nexport interface IPipelineOrchestratorLocalProvider extends IPipelineOrchestratorProvider {\n /**\n * In-process dispatch entrypoint. Caches the config, runs the load\n * balancer, dispatches the attach call to the chosen runner.\n */\n dispatchCamera(runnerConfig: RunnerCameraConfig): Promise<DispatchResult>;\n /** In-process release entrypoint — detach + clear cached state. */\n releaseCamera(input: { deviceId: number }): Promise<{ success: true }>;\n}\n\nexport default class PipelineOrchestratorAddon\n extends BaseAddon\n implements IPipelineOrchestratorLocalProvider\n{\n /** This node's Moleculer nodeId (from this.ctx.kernel.localNodeId). */\n private localNodeId = \"hub\";\n /** Set of nodeIds known to be running pipeline-runner; maintained via AgentOnline/AgentOffline events. */\n private readonly knownRunnerNodes = new Set<string>([\"hub\"]);\n /** EventBus unsubscribes for agent online/offline events. */\n private unsubAgentOnline: Unsubscribe | null = null;\n private unsubAgentOffline: Unsubscribe | null = null;\n /**\n * Readiness tracker — drives `detection-pipeline` seed on every\n * provider life cycle. Prefers the kernel-shared singleton via\n * `ctx.kernel.readinessRegistry`; falls back to a local instance for\n * test contexts without a kernel.\n */\n private readinessRegistry:\n | import(\"@camstack/types\").IReadinessRegistry\n | null = null;\n /** True when this addon owns the registry (local fallback) and should `close()` it on shutdown. */\n private ownsReadinessRegistry = false;\n /** Per-node readiness subscription unsubs — torn down on AgentOffline / shutdown. */\n private readonly readinessSubsByNode = new Map<string, () => void>();\n /** Per-node idempotency guard — re-seed only when the producer's epoch advances. */\n private readonly lastSeenReadinessEpochByNode = new Map<string, number>();\n\n /** Most recent RunnerCameraConfig per device — used by rebalance + re-dispatch. */\n private readonly cameraConfigs = new Map<number, RunnerCameraConfig>();\n /**\n * Per-camera zones CRUD provider. Constructed lazily in `onInitialize`\n * because it captures `this.ctx` for settings + api access; cleared\n * to null in `onShutdown` so a soft-restart is observable.\n */\n private zonesProvider: ZonesProvider | null = null;\n /**\n * Per-camera zone-rules CRUD provider — bulk-replace per stage,\n * mirrors to dev.state slices `motion-zone-rules` /\n * `detection-zone-rules` so consumer addons subscribe per stage.\n */\n private zoneRulesProvider: ZoneRulesProvider | null = null;\n /** In-memory assignment map — mirrored into events + per-device settings for the pin. */\n private readonly assignments = new Map<number, PipelineAssignment>();\n /** Per-device audio node assignment — nodeId of the audio-analyzer handling this device's chunks. */\n private readonly audioNodeByDevice = new Map<number, string>();\n /** Assignments with metadata — replaces plain audioNodeByDevice values as the source of truth. */\n private readonly audioAssignments = new Map<number, AudioNodeAssignment>();\n /** Nodes known to have a ready audio-analyzer. */\n private readonly readyAudioNodes = new Set<string>();\n /** Last seen readiness epoch per node for audio-analyzer. */\n private readonly lastSeenAudioEpochByNode = new Map<string, number>();\n /** Last observed agent-load snapshot per runner, populated during each dispatch. */\n private cachedAgentLoad = new Map<string, AgentLoadSummary>();\n\n /**\n * Cached `PipelineSchema` per engine key (`runtime/backend/format`).\n * Populated on demand by {@link getCatalogForEngine} via\n * `pipelineExecutor.getSchema({nodeId})` and invalidated on every\n * `$node.connected` / `$node.disconnected` — node changes can mean\n * model downloads arrived, addons enabled, etc. TTL is a soft\n * guard only (invalidation is the main signal).\n */\n private catalogCache = new Map<\n string,\n { schema: PipelineSchema; at: number }\n >();\n private static readonly CATALOG_CACHE_TTL_MS = 30_000;\n\n /** Runtime failover policy, driven by `getConfigSchema` fields + `onConfigChange`. */\n private failoverPolicy: FailoverPolicy = { ...DEFAULT_FAILOVER_POLICY };\n /**\n * Hub-wide allow-list of node ids eligible to run the detection\n * pipeline. Driven by the `enabledNodes` multiselect in the addon\n * schema. Hydrated from the schema default (`['hub']`) on first\n * boot; every other node must be explicitly added by the operator.\n * The list is a strict whitelist — disabled nodes stay connected\n * for other capabilities (metrics, logs, cluster-wide events) but\n * never receive camera assignments.\n */\n private enabledNodes: readonly string[] = [\"hub\"];\n /**\n * Hub-wide allow-list of node ids eligible to run decoder sessions.\n * Driven by the `enabledDecoderNodes` multiselect in the addon schema.\n * Defaults to `['hub']` — the hub always has a decoder available.\n */\n private enabledDecoderNodes: readonly string[] = [\"hub\"];\n /**\n * Hub-wide allow-list of node ids eligible to run audio-analyzer sessions.\n * Driven by the `enabledAudioNodes` multiselect in the addon schema.\n * Defaults to `['hub']`.\n */\n private enabledAudioNodes: readonly string[] = [\"hub\"];\n /**\n * Full global settings snapshot kept in memory so synchronous cap methods\n * (e.g. `getGlobalOrchestrationSettings`) can resolve without awaiting the\n * backing store. Refreshed in `initialize` and `onConfigChange`.\n */\n private globalSettings: Record<string, unknown> = {};\n\n // ── Detection wiring state (moved from kernel DetectionWiringService) ──\n //\n // The orchestrator owns the full detection lifecycle: it subscribes to the\n // stream-router device registrations, resolves per-device settings from\n // its own store, builds `CameraDetectionConfig`, dispatches the camera to\n // a runner, and subscribes to audio chunks for hub-side analysis. The\n // kernel no longer runs any of this logic — it lives here because the\n // orchestrator is a plug-and-play addon and the rules are under user\n // control via its `getConfigSchema()`.\n /** Per-device active detection config — set on startDetection, cleared on stopDetection. */\n private readonly activeDetections = new Map<number, CameraDetectionConfig>();\n /** Per-device audio broker unsubscribe callbacks. */\n private readonly audioSubscriptions = new Map<number, Unsubscribe>();\n /** Per-device pending lazy-audio teardown timer (closes audio sub\n * after motion cooldown when audioMode === 'on-motion'). */\n private readonly lazyAudioTeardownTimers = new Map<number, ReturnType<typeof setTimeout>>();\n /** Event bus subscription lifetimes. */\n private unsubDeviceRegistered: Unsubscribe | null = null;\n /** Pending CameraStreams.profileSlotsChanged debounce timers, cancelled on shutdown. */\n private profileSlotTimers: Map<number, ReturnType<typeof setTimeout>> | null = null;\n private unsubDeviceUnregistered: Unsubscribe | null = null;\n private unsubSettingsChanged: Unsubscribe | null = null;\n private unsubInferenceResult: Unsubscribe | null = null;\n private unsubProviderDetection: Unsubscribe | null = null;\n private unsubCameraUpdated: Unsubscribe | null = null;\n private unsubBindingsChanged: Unsubscribe | null = null;\n private unsubCameraMetrics: Unsubscribe | null = null;\n private unsubLazyAudioMotion: Unsubscribe | null = null;\n\n /** Per-camera last-seen actualFps for load management enforcement. */\n private readonly cameraFpsMap = new Map<number, { fps: number; nodeId: string; lastSeen: number }>();\n /**\n * Load-shed state per camera:\n * - `lowSinceTs`: timestamp of the first metrics snapshot that\n * dipped below `fpsMinThreshold`, or `null` when fps is healthy.\n * Camera pauses when `now - lowSinceTs >= fpsLowWindowMs`.\n * Resets to `null` the moment fps recovers above the threshold,\n * so transient dips (GC, model swap) don't accumulate.\n * - `pausedAt`: timestamp when camera was paused (null = not paused)\n * - `resumeAttempts`: number of auto-resume attempts (drives backoff)\n */\n private readonly loadShedState = new Map<number, {\n lowSinceTs: number | null;\n pausedAt: number | null;\n resumeAttempts: number;\n }>();\n /** Timer for the auto-resume sweep. */\n private loadShedResumeTimer: ReturnType<typeof setInterval> | null = null;\n /** Pending `scheduleReconcile` debounce timer. */\n private reconcileTimer: ReturnType<typeof setTimeout> | null = null;\n /** True while `reconcileDispatch` is awaiting the RPC round-trip. */\n private reconcileInFlight = false;\n /** Set to true when a reconcile is requested while one is already in-flight; triggers a follow-up pass. */\n private reconcileRerunRequested = false;\n private initTimestamp = 0;\n\n constructor() {\n super({});\n }\n\n protected async onInitialize(): Promise<\n AddonInitResult<PipelineOrchestratorActions>\n > {\n this.initTimestamp = Date.now();\n // Pull the persisted addon-level settings into memory (balancer config,\n // failover policy, capability bindings) before any cap method can run.\n // `applyRuntimeSettings` derives the runtime state (`balancerConfig`,\n // `failoverPolicy`, etc.) from that raw snapshot — no defaults are\n // injected here, the merge with schema defaults happens at hydration\n // time inside `getAddonSettings()`. The runtime state derivation uses\n // `?? DEFAULT_*` fallbacks for missing keys so it's safe to read raw.\n try {\n const stored = (await this.ctx.settings?.readAddonStore()) ?? {};\n this.globalSettings = { ...stored };\n this.applyRuntimeSettings(this.globalSettings);\n } catch (err: unknown) {\n const msg = errMsg(err);\n this.ctx.logger.warn(\n \"orchestrator settings load failed — using defaults\",\n { meta: { error: msg } },\n );\n }\n\n // When this addon runs inside a group-runner subprocess the broker\n // nodeID is hierarchical (`hub/pipeline`, `dev-agent-0/pipeline`).\n // The orchestrator's \"local node\" semantic is the cluster-visible\n // PARENT node, so strip the `/<group>` suffix. In legacy in-process\n // mode there's no slash and this is a no-op.\n const rawNodeId = this.ctx.kernel.localNodeId ?? \"hub\";\n this.localNodeId = rawNodeId.includes(\"/\") ? rawNodeId.split(\"/\")[0]! : rawNodeId;\n this.knownRunnerNodes.clear();\n this.knownRunnerNodes.add(this.localNodeId);\n // Seed knownRunnerNodes from the persisted enabledNodes whitelist so the\n // orchestrator can dispatch immediately on restart without waiting for\n // AgentOnline events to arrive (production: Moleculer fires $node.connected\n // for already-online nodes, but timing isn't guaranteed before subscriptions\n // are set up). Nodes that are actually offline simply fail getLocalLoad\n // and are silently skipped in collectAgentLoad.\n for (const nodeId of this.enabledNodes) {\n this.knownRunnerNodes.add(nodeId);\n }\n\n // Subscribe to agent lifecycle via the event bus (forwarded from Moleculer\n // $node.connected/$node.disconnected by agent-registry.service.ts).\n // Both AgentOnline and AgentOffline carry `data: { agentId: string }`.\n this.unsubAgentOffline = this.ctx.eventBus.subscribe(\n { category: EventCategory.AgentOffline },\n (event) => {\n const nodeId = event.data.agentId;\n if (!nodeId.includes(\"/\")) {\n this.knownRunnerNodes.delete(nodeId);\n }\n this.unsubscribeDetectionPipelineReadiness(nodeId);\n this.readyAudioNodes.delete(nodeId);\n this.handleNodeDisconnect(nodeId).catch((err: unknown) => {\n const msg = errMsg(err);\n this.ctx.logger.error(\"failover after disconnect failed\", {\n tags: { nodeId },\n meta: { error: msg },\n });\n });\n },\n ) as Unsubscribe;\n\n this.unsubAgentOnline = this.ctx.eventBus.subscribe(\n { category: EventCategory.AgentOnline },\n (event) => {\n const nodeId = event.data.agentId;\n // Only track top-level cluster agents (hub, dev-agent-0, etc.).\n // Child processes have hierarchical nodeIds with '/' (e.g.\n // hub/decoder-nodeav, dev-agent-0/motion-wasm) — these are\n // forkable services, not dispatchable pipeline nodes. They DO\n // however carry the detection-pipeline provider when they\n // represent a forked child (e.g. `hub/detection-pipeline`);\n // the readiness subscription handler below covers those via\n // its top-level nodeId scope subscription — the forked\n // child's `ready` emit is keyed on its parent nodeId.\n if (!nodeId.includes(\"/\")) {\n this.knownRunnerNodes.add(nodeId);\n this.subscribeToDetectionPipelineReadiness(nodeId);\n this.subscribeToAudioAnalyzerReadiness(nodeId);\n }\n this.handleNodeConnect(nodeId).catch((err: unknown) => {\n const msg = errMsg(err);\n this.ctx.logger.error(\"reconnect handling failed\", {\n tags: { nodeId },\n meta: { error: msg },\n });\n });\n // Agent (re)connect → reconcile in case slot-changed events were\n // dropped while this node was offline.\n this.scheduleReconcile();\n },\n ) as Unsubscribe;\n\n // Capability-level failover: a forked worker or remote agent can lose a\n // single critical cap (pipeline-executor / analysis-pipeline) while the\n // hosting node itself stays online — AgentOffline never fires in that\n // case. Subscribe to synthetic `system.ready-state` `down` events so we\n // can failover cameras off a node whose execution pipeline collapsed.\n //\n // Decoder `down` is intentionally NOT handled here — stream-broker owns\n // its own decoder rotation via the same event stream (see addon.ts).\n // Decoder `down` is intentionally NOT in this list — stream-broker\n // owns decoder rotation via the same event stream (see addon.ts).\n this.watchCapability([\"pipeline-executor\", \"analysis-pipeline\"], {\n onDown: (nodeId, capName) => {\n // Don't skip localNodeId: a forked-worker-on-hub dying emits\n // scope.nodeId='hub' and we DO want failover for that case.\n this.ctx.logger.warn(\n \"Critical pipeline cap went down — running camera failover\",\n { tags: { nodeId }, meta: { capName } },\n );\n this.handleNodeDisconnect(nodeId).catch((err: unknown) => {\n const msg = errMsg(err);\n this.ctx.logger.error(\"failover after cap-down failed\", {\n tags: { nodeId },\n meta: { capName, error: msg },\n });\n });\n },\n });\n\n // Legacy pipeline keys (`pipelines`, `pipelineDefaults`) from the\n // pre-3-level model stay in the store as a last-resort fallback for\n // `resolvePipelineForDevice`. They get overwritten by the new\n // agent/camera settings on the first operator edit. Never auto-drop:\n // the orchestrator's job is to degrade gracefully across upgrades.\n\n // Readiness-driven agent seed. The orchestrator keeps a\n // per-process `ReadinessRegistry` subscribed to\n // `system.ready-state` events; whenever the detection-pipeline\n // provider for a node transitions to `ready` (including forked\n // children like `hub/detection-pipeline`, and every reconnect),\n // we re-seed that node's `agentAddonDefaults` from its fresh\n // catalog and redispatch cameras assigned there. Fixes the\n // detection-never-starts race: the old init-time seed missed\n // providers that connected AFTER the orchestrator booted.\n // Prefer the kernel-shared registry; fall back to a local instance\n // for contexts that don't populate ctx.kernel (tests).\n const sharedRegistry = this.ctx.kernel?.readinessRegistry ?? null;\n this.readinessRegistry =\n sharedRegistry ??\n new ReadinessRegistry({\n eventBus: this.ctx.eventBus,\n sourceNodeId: this.localNodeId,\n logger: this.ctx.logger,\n });\n this.ownsReadinessRegistry = sharedRegistry === null;\n this.subscribeToDetectionPipelineReadiness(this.localNodeId);\n // Seed readyAudioNodes with localNodeId — audio-analyzer starts on hub.\n this.readyAudioNodes.add(this.localNodeId);\n this.subscribeToAudioAnalyzerReadiness(this.localNodeId);\n // Remote agents that were already online when the orchestrator\n // booted (Moleculer fires $node.connected for existing peers on\n // subscribe, but only for the lifetime after subscribe was wired):\n // seed readiness-subscriptions for the persisted whitelist too, so\n // we don't miss their initial `ready` emission.\n for (const nodeId of this.enabledNodes) {\n if (nodeId === this.localNodeId) continue;\n this.subscribeToDetectionPipelineReadiness(nodeId);\n this.subscribeToAudioAnalyzerReadiness(nodeId);\n }\n\n this.ctx.logger.info(\"Pipeline orchestrator initialized\", {\n tags: { nodeId: this.localNodeId },\n });\n\n // ── Detection wiring subscriptions ──────────────────────────────────\n //\n // These used to live in the kernel `DetectionWiringService`. Moved here\n // so the orchestrator — which already owns per-device configuration,\n // runner dispatch, and camera lifecycle — also owns the event-bus\n // glue between stream-router, runner, analysis-pipeline, audio-analyzer,\n // and notification-output. The kernel is now completely unaware of\n // detection wiring: everything runs inside this plug-and-play addon.\n\n // 1. (removed) — pipeline-runner now subscribes to\n // `MotionOnMotionChanged` directly. Sources (Reolink, motion-wasm\n // via runner's analyzer path) emit the unified event with a\n // `source` discriminator; the orchestrator no longer forwards a\n // separate `ProviderMotion` channel into the runner.\n\n // 2. Provider-detection events → re-emit as detection.camera-native\n // (camera-native events that bypass the inference pipeline entirely).\n this.unsubProviderDetection = this.ctx.eventBus.subscribe(\n { category: EventCategory.ProviderDetection },\n (event) => {\n this.ctx.eventBus.emit({\n id: `native-det-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n timestamp: new Date(),\n source: {\n type: \"device\" as const,\n id: event.source.id,\n nodeId: \"hub\",\n },\n category: EventCategory.DetectionCameraNative,\n data: {\n cameraId: Number(event.source.id),\n detections: event.data,\n source: \"camera-native\" as const,\n },\n });\n },\n ) as Unsubscribe;\n\n // 3. Pipeline inference results → run hub-side post-processing (analysis\n // pipeline → notifications → emit detection.result event).\n this.unsubInferenceResult = this.ctx.eventBus.subscribe(\n { category: EventCategory.PipelineInferenceResult },\n (event) => {\n if (!isEvent(event, EventCategory.PipelineInferenceResult)) return;\n void this.handleInferenceResult(event.data).catch((err: unknown) => {\n const msg = errMsg(err);\n this.ctx.logger.error(\n \"PipelineInferenceResult post-processing failed\",\n { meta: { error: msg } },\n );\n });\n },\n ) as Unsubscribe;\n\n // 4. Profile slot mutations (publish / assign / unassign / retract) →\n // start or restart detection for the device. The stream-broker\n // emits `camera-streams.onProfileSlotsChanged` on every mutation;\n // the orchestrator reacts by reading the current slot set via the\n // camera-streams cap and rebuilding the detection config.\n // Debounce ProfileSlotsChanged per-device. Provider-rtsp publishes\n // streams one at a time (stream-1, stream-2, stream-3) and each\n // mutation in the broker emits its own event — without coalescing,\n // `handleDeviceRegistered` runs N times per camera, each call\n // tearing down + restarting detection. The 200ms window is short\n // enough to feel instantaneous yet long enough to absorb a multi-\n // stream republish burst.\n const PROFILE_SLOTS_DEBOUNCE_MS = 200;\n const profileSlotTimers = new Map<number, ReturnType<typeof setTimeout>>();\n this.profileSlotTimers = profileSlotTimers;\n this.unsubDeviceRegistered = this.ctx.eventBus.subscribe(\n { category: EventCategory.CameraStreamsProfileSlotsChanged },\n (event) => {\n const data = event.data as { deviceId?: unknown };\n if (typeof data?.deviceId !== \"number\") return;\n const deviceId = data.deviceId;\n const existing = profileSlotTimers.get(deviceId);\n if (existing) clearTimeout(existing);\n profileSlotTimers.set(\n deviceId,\n setTimeout(() => {\n profileSlotTimers.delete(deviceId);\n // Guard against post-shutdown firing — the test harness\n // tears down the addon while debounced timers are still\n // pending, and `this.ctx` throws when accessed after\n // onShutdown nulls the internal _ctx field.\n if (this.unsubDeviceRegistered === null) return;\n this.ctx.logger.info(\"received onProfileSlotsChanged\", {\n tags: { deviceId },\n });\n void this.handleDeviceRegistered(deviceId).catch((err: unknown) => {\n if (this.unsubDeviceRegistered === null) return;\n const msg = errMsg(err);\n this.ctx.logger.error(\"handleDeviceRegistered failed\", {\n tags: { deviceId },\n meta: { error: msg },\n });\n });\n }, PROFILE_SLOTS_DEBOUNCE_MS),\n );\n // Also schedule a fleet-level reconcile so sibling cameras whose\n // slot-changed broadcast was dropped are caught by the RPC diff.\n this.scheduleReconcile();\n },\n ) as Unsubscribe;\n\n this.unsubDeviceUnregistered = this.ctx.eventBus.subscribe(\n { category: EventCategory.DeviceUnregistered },\n (event) => {\n const { deviceId } = event.data;\n void this.handleDeviceUnregistered(deviceId).catch((err: unknown) => {\n const msg = errMsg(err);\n this.ctx.logger.error(\"handleDeviceUnregistered failed\", {\n tags: { deviceId },\n meta: { error: msg },\n });\n });\n },\n ) as Unsubscribe;\n\n // 5. Per-device orchestration settings updates → restart detection.\n this.unsubSettingsChanged = this.ctx.eventBus.subscribe(\n { category: EventCategory.OrchestrationSettingsUpdated },\n (event) => {\n if (this.unsubSettingsChanged === null) return;\n const { deviceId } = event.data;\n void this.handleSettingsChanged(deviceId).catch((err: unknown) => {\n // Same post-shutdown guard as the binding-changed handler —\n // pending promise rejections after onShutdown would otherwise\n // throw on `this.ctx.logger` access.\n if (this.unsubSettingsChanged === null) return;\n const msg = errMsg(err);\n this.ctx.logger.error(\"handleSettingsChanged failed\", {\n tags: { deviceId },\n meta: { error: msg },\n });\n });\n },\n ) as Unsubscribe;\n\n // 6. Per-camera pipeline config updates → hot-reload the runner on the\n // currently-assigned node so the next frame executes against the new\n // engine/steps. When the camera has no live assignment yet (edit\n // arriving before first DeviceStreamsRegistered), the event is a\n // no-op — dispatchCamera will pick up the fresh pipelines[deviceId]\n // entry from the store when it runs.\n this.unsubCameraUpdated = this.ctx.eventBus.subscribe(\n { category: EventCategory.PipelineCameraUpdated },\n (event) => {\n if (!isEvent(event, EventCategory.PipelineCameraUpdated)) return;\n void this.handlePipelineCameraUpdated(\n event.data.deviceId,\n event.data.config,\n ).catch((err: unknown) => {\n const msg = errMsg(err);\n this.ctx.logger.error(\"handlePipelineCameraUpdated failed\", {\n tags: { deviceId: event.data.deviceId },\n meta: { error: msg },\n });\n });\n },\n ) as Unsubscribe;\n\n // 7. Per-device binding toggles for caps we runtime-gate on\n // (detection-pipeline / audio-analysis). The operator flips a\n // wrapper via device-manager.setWrapperActive; device-manager\n // emits DeviceBindingsChanged; we re-dispatch the camera so the\n // runner attach payload (steps + audio) + the audio subscription\n // reflect the new binding state immediately, instead of only\n // after the next settings-changed / restart event.\n this.unsubBindingsChanged = this.ctx.eventBus.subscribe(\n { category: EventCategory.DeviceBindingsChanged },\n (event) => {\n // Guard against in-flight events delivered after onShutdown\n // has unsubscribed + torn down ctx. The fake harness emits\n // DeviceBindingsChanged during afterEach which can race the\n // shutdown; skipping here keeps the test run silent.\n if (this.unsubBindingsChanged === null) return;\n const { deviceId, capName, reason } = event.data;\n // Only react to operator toggles of the caps we gate on.\n // Native-registered/-unregistered events fire on every device\n // provider boot and would cause spurious dispatch storms.\n const isWrapperToggle =\n reason === \"wrapper-activated\" || reason === \"wrapper-deactivated\";\n const isGateCap =\n capName === \"detection-pipeline\" ||\n capName === \"audio-analysis\" ||\n capName === \"motion-detection\";\n if (!isWrapperToggle || !isGateCap) return;\n void this.handleSettingsChanged(deviceId).catch((err: unknown) => {\n // After shutdown `this.ctx` throws — swallow so the harness\n // doesn't surface post-teardown noise as an unhandled rejection.\n if (this.unsubBindingsChanged === null) return;\n const msg = errMsg(err);\n this.ctx.logger.error(\"binding-changed re-dispatch failed\", {\n tags: { deviceId },\n meta: { capName, reason, error: msg },\n });\n });\n },\n ) as Unsubscribe;\n\n // 8. Camera metrics → load management enforcement.\n this.unsubCameraMetrics = this.ctx.eventBus.subscribe(\n { category: EventCategory.PipelineCameraMetricsSnapshot },\n (event) => {\n if (!isEvent(event, EventCategory.PipelineCameraMetricsSnapshot)) return;\n const { deviceId, nodeId, metrics } = event.data;\n if (typeof deviceId !== 'number') return;\n this.cameraFpsMap.set(deviceId, { fps: metrics.actualFps, nodeId: nodeId ?? 'hub', lastSeen: Date.now() });\n this.enforceLoadManagement(deviceId, metrics);\n },\n ) as Unsubscribe;\n\n // 9. Motion phase → lazy audio gate. When `audioMode === 'on-motion'`\n // and motion fires for a device, open the audio subscription on\n // demand. Tear it down after the motion cooldown closes.\n this.unsubLazyAudioMotion = this.ctx.eventBus.subscribe(\n { category: EventCategory.MotionOnMotionChanged },\n (event) => {\n if (!isEvent(event, EventCategory.MotionOnMotionChanged)) return;\n const { deviceId, detected } = event.data;\n if (typeof deviceId !== 'number') return;\n const config = this.activeDetections.get(deviceId);\n if (!config || config.audioMode !== 'on-motion') return;\n void this.handleLazyAudioMotion(deviceId, detected, config).catch((err) => {\n this.ctx.logger.warn('lazy audio motion handler failed', {\n tags: { deviceId },\n meta: { detected, error: errMsg(err) },\n });\n });\n },\n ) as Unsubscribe;\n\n\n this.ctx.logger.info(\n \"Pipeline orchestrator detection-wiring subscriptions installed\",\n );\n // Kick off the one-shot audioEnabled/pipelineEnabled/disableInference →\n // bindings migration in the background. Fire-and-forget so onInitialize\n // resolves immediately; the migration awaits api availability internally.\n void this.migrateLegacyFlagsToBindings().catch((err: unknown) => {\n this.ctx.logger.warn(\"bindings migration failed — will retry on next boot\", {\n meta: { error: errMsg(err) },\n });\n });\n // Per-camera zones CRUD — backed by the orchestrator's per-device\n // settings store, mirrored into `dev.state.zones` on every mutation.\n // Constructed here (after agent + readiness wiring) because it\n // captures `this.ctx` for settings access and uses a lazy api\n // accessor for the slice-mirror write — that keeps construction\n // safe even when `this.api` is still null at this point.\n this.zoneRulesProvider = new ZoneRulesProvider({\n logger: this.ctx.logger.child(\"zone-rules\"),\n settings: {\n readDeviceStore: (deviceId) =>\n this.ctx.settings!.readDeviceStore(deviceId),\n writeDeviceStore: (deviceId, patch) =>\n this.ctx.settings!.writeDeviceStore(deviceId, patch),\n },\n fetchDevice: (deviceId) => this.ctx.fetchDevice(deviceId),\n // Future hook: motion stage changes could trigger an attach\n // refresh so motion-wasm picks up the new gating without\n // waiting for the next normal re-attach. Detection rules are\n // consumed by analytics via the dev-state mirror — no re-\n // attach needed for those.\n });\n this.zonesProvider = new ZonesProvider({\n logger: this.ctx.logger.child(\"zones\"),\n settings: {\n readDeviceStore: (deviceId) =>\n this.ctx.settings!.readDeviceStore(deviceId),\n writeDeviceStore: (deviceId, patch) =>\n this.ctx.settings!.writeDeviceStore(deviceId, patch),\n },\n fetchDevice: (deviceId) => this.ctx.fetchDevice(deviceId),\n onZonesChanged: (deviceId, zones) => {\n // Re-dispatch the runner config so motion-wasm + pipeline-executor\n // pick up the new zones without waiting for the next attach. No-op\n // when the camera isn't attached yet — startDetection picks the\n // fresh list up via listZones in that case.\n const cached = this.cameraConfigs.get(deviceId);\n const assignment = this.assignments.get(deviceId);\n if (!cached || !assignment) return;\n const next: RunnerCameraConfig = { ...cached, zones };\n this.cameraConfigs.set(deviceId, next);\n this.attachOn(assignment.agentNodeId, next).catch((err: unknown) => {\n this.ctx.logger.warn(\n \"zones change re-dispatch failed\",\n {\n tags: { deviceId, nodeId: assignment.agentNodeId },\n meta: { error: errMsg(err) },\n },\n );\n });\n },\n });\n\n // Widget bundle contribution — pipeline-orchestrator owns the\n // detection-state surface, so the per-camera \"Pipeline quick stats\"\n // KPI block lives here. Admin-ui's <WidgetRegistryProvider> imports\n // /api/addon-widgets/pipeline-orchestrator/widgets.mjs?v=<mtime>;\n // <WidgetSlot widgetId=\"pipeline-orchestrator/pipeline-quick-stats\"/>\n // mounts it from form contributions or dashboard layouts.\n const widgetsProvider: IAddonWidgetsSourceProvider = {\n listWidgets: async () => [\n {\n tab: 'device-tab',\n label: 'Pipeline Quick Stats',\n kind: 'remote' as const,\n remote: {\n remoteName: 'addon_pipeline_orchestrator_widgets',\n exposedModule: './widgets',\n componentKey: 'pipeline-quick-stats',\n },\n stableId: 'pipeline-quick-stats',\n description: 'Phase / Detection FPS / Inference / Active Tracks tile row.',\n icon: 'activity',\n bundle: 'remoteEntry.js',\n hosts: ['device-tab', 'dashboard'] as const,\n requires: { deviceContext: true, integrationContext: false },\n defaultSize: 'md' as const,\n allowedSizes: ['sm', 'md', 'lg'] as const,\n defaultColumns: 6,\n defaultRows: 1,\n },\n {\n tab: 'device-tab',\n label: 'Zone Editor',\n kind: 'remote' as const,\n remote: {\n remoteName: 'addon_pipeline_orchestrator_widgets',\n exposedModule: './widgets',\n componentKey: 'zone-editor',\n },\n stableId: 'zone-editor',\n description: 'Polygon / tripwire CRUD + per-stage rule editor.',\n icon: 'shapes',\n bundle: 'remoteEntry.js',\n hosts: ['device-tab'] as const,\n requires: { deviceContext: true, integrationContext: false },\n defaultSize: 'xl' as const,\n allowedSizes: ['lg', 'xl'] as const,\n defaultColumns: 12,\n defaultRows: 4,\n },\n ],\n }\n\n // Eager reconcile: schedule one pass after all subscriptions are wired\n // so cameras whose slot-changed event fired before this addon subscribed\n // are caught immediately rather than waiting for the next live event.\n this.scheduleReconcile();\n\n return {\n providers: [\n { capability: pipelineOrchestratorCapability, provider: this },\n // D12 re-home: the per-device settings contribution (motion/pipeline\n // tabs + zones top-tab) rides this device-scoped defaultActive wrapper\n // so it auto-binds to every camera and the binding-driven aggregate\n // invokes it. `this` already implements the three contribution methods.\n { capability: cameraPipelineConfigCapability, provider: this },\n { capability: zonesCapability, provider: this.zonesProvider },\n { capability: zoneRulesCapability, provider: this.zoneRulesProvider },\n { capability: addonWidgetsSourceCapability, provider: widgetsProvider },\n ],\n customActions: pipelineOrchestratorActions,\n actionHandlers: {\n dumpState: async () => this.dumpDiagnostics(),\n },\n };\n }\n\n /**\n * One-shot migration from the legacy per-device flags\n * (`audioEnabled:false` / `pipelineEnabled:false` in the orchestrator's\n * device-store, `disableInference:true` in the cameraSettings map) to\n * the new binding system. For each match we call\n * `device-manager.setWrapperActive(false)` so the equivalent state\n * sticks after the flags are gone. Guarded by an addon-store flag so\n * it runs at most once per cluster install.\n *\n * Runs in the background after onInitialize — the `ctx.api` usually\n * lights up after a short delay once the device-manager + capability\n * registry finish wiring, so we poll briefly and give up with a warn\n * when the window closes. Failure re-arms on next boot since we only\n * persist the flag after a successful pass.\n */\n private async migrateLegacyFlagsToBindings(): Promise<void> {\n const MIGRATION_KEY = \"bindingsMigration_v1_done\";\n const store = (await this.ctx.settings?.readAddonStore()) ?? {};\n if (store[MIGRATION_KEY] === true) return;\n\n // Poll up to ~6s for ctx.api to become available; the hub's bootstrap\n // wires it after the addon init chain resolves.\n let api = this.api;\n for (let i = 0; !api && i < 30; i++) {\n await new Promise((r) => setTimeout(r, 200));\n api = this.api;\n }\n if (!api) {\n this.ctx.logger.warn(\"bindings migration skipped — ctx.api not available\");\n return;\n }\n\n const devices = await api.deviceManager.listAll.query({}).catch(() => []);\n const cameras = devices.filter((d) => d.type === \"camera\");\n\n let audioDisabled = 0;\n let detectionDisabled = 0;\n let motionDisabled = 0;\n for (const device of cameras) {\n const raw = (await this.ctx.settings?.readDeviceStore(device.id)) ?? {};\n if (raw[\"audioEnabled\"] === false) {\n await api.deviceManager.setWrapperActive.mutate({\n deviceId: device.id,\n capName: \"audio-analysis\",\n wrapperAddonId: \"audio-analyzer\",\n active: false,\n });\n audioDisabled++;\n }\n if (raw[\"pipelineEnabled\"] === false) {\n await api.deviceManager.setWrapperActive.mutate({\n deviceId: device.id,\n capName: \"detection-pipeline\",\n wrapperAddonId: \"detection-pipeline\",\n active: false,\n });\n detectionDisabled++;\n }\n // F15a: legacy `motionDetectionEnabled:false` → motion-detection\n // wrapper off. The wrapper addon id depends on which motion addon\n // was registered; `motion-wasm` is the in-tree default and matches\n // F9's manifest declaration.\n if (raw[\"motionDetectionEnabled\"] === false) {\n await api.deviceManager.setWrapperActive.mutate({\n deviceId: device.id,\n capName: \"motion-detection\",\n wrapperAddonId: \"motion-wasm\",\n active: false,\n });\n motionDisabled++;\n }\n }\n\n // disableInference lived in the cameraSettings map (separate from the\n // per-device orchestrator store). Mirror the same migration there.\n const cameraSettings = await this.readCameraSettingsMap();\n for (const [rawKey, cam] of Object.entries(cameraSettings)) {\n const camObj = cam as Record<string, unknown> | undefined;\n if (camObj?.[\"disableInference\"] === true) {\n const deviceId = Number(rawKey);\n if (!Number.isFinite(deviceId) || !Number.isInteger(deviceId)) continue;\n await api.deviceManager.setWrapperActive.mutate({\n deviceId,\n capName: \"detection-pipeline\",\n wrapperAddonId: \"detection-pipeline\",\n active: false,\n });\n detectionDisabled++;\n }\n }\n\n await this.ctx.settings?.writeAddonStore({\n ...store,\n [MIGRATION_KEY]: true,\n });\n this.ctx.logger.info(\"bindings migration complete\", {\n meta: {\n cameras: cameras.length,\n audioDisabled,\n detectionDisabled,\n motionDisabled,\n },\n });\n }\n\n /**\n * Build the diagnostic snapshot exposed via the `dumpState` custom action.\n * Pure read — never mutates state. Extracted from `handleCustomAction` so\n * tests can assert the snapshot shape directly without going through the\n * dispatcher.\n */\n private dumpDiagnostics(): OrchestratorDiagnostics {\n return {\n localNodeId: this.localNodeId,\n knownRunnerNodes: [...this.knownRunnerNodes].sort(),\n cachedAgentLoadNodeIds: [...this.cachedAgentLoad.keys()].sort(),\n enabledNodes: [...this.enabledNodes],\n assignedDeviceCount: this.assignments.size,\n cameraConfigCount: this.cameraConfigs.size,\n activeDetectionCount: this.activeDetections.size,\n };\n }\n\n protected async onShutdown(): Promise<void> {\n // Cancel any pending profile-slots debounce timers FIRST so their\n // setTimeout callbacks don't fire after `_ctx` is nulled.\n if (this.profileSlotTimers) {\n for (const t of this.profileSlotTimers.values()) clearTimeout(t);\n this.profileSlotTimers.clear();\n this.profileSlotTimers = null;\n }\n // Cancel any pending reconcile debounce timer.\n if (this.reconcileTimer !== null) {\n clearTimeout(this.reconcileTimer);\n this.reconcileTimer = null;\n }\n // Tear down detection-wiring subscriptions and active detections first\n // so no events land while the rest of the addon is being disposed.\n this.unsubDeviceRegistered?.();\n this.unsubDeviceRegistered = null;\n this.unsubDeviceUnregistered?.();\n this.unsubDeviceUnregistered = null;\n this.unsubSettingsChanged?.();\n this.unsubSettingsChanged = null;\n this.unsubInferenceResult?.();\n this.unsubInferenceResult = null;\n this.unsubProviderDetection?.();\n this.unsubProviderDetection = null;\n this.unsubCameraUpdated?.();\n this.unsubCameraUpdated = null;\n this.unsubBindingsChanged?.();\n this.unsubBindingsChanged = null;\n this.unsubCameraMetrics?.();\n this.unsubCameraMetrics = null;\n this.unsubLazyAudioMotion?.();\n this.unsubLazyAudioMotion = null;\n for (const t of this.lazyAudioTeardownTimers.values()) clearTimeout(t);\n this.lazyAudioTeardownTimers.clear();\n this.cameraFpsMap.clear();\n this.loadShedState.clear();\n if (this.loadShedResumeTimer) {\n clearInterval(this.loadShedResumeTimer);\n this.loadShedResumeTimer = null;\n }\n\n for (const unsub of this.audioSubscriptions.values()) {\n try {\n unsub();\n } catch {\n /* swallow — best-effort cleanup */\n }\n }\n this.audioSubscriptions.clear();\n this.audioNodeByDevice.clear();\n this.audioAssignments.clear();\n this.readyAudioNodes.clear();\n\n for (const deviceId of this.activeDetections.keys()) {\n try {\n await this.releaseCamera({ deviceId });\n } catch (err: unknown) {\n const msg = errMsg(err);\n this.ctx.logger.debug(\"releaseCamera failed during shutdown\", {\n tags: { deviceId },\n meta: { error: msg },\n });\n }\n }\n this.activeDetections.clear();\n\n this.unsubAgentOffline?.();\n this.unsubAgentOffline = null;\n this.unsubAgentOnline?.();\n this.unsubAgentOnline = null;\n for (const unsub of this.readinessSubsByNode.values()) unsub();\n this.readinessSubsByNode.clear();\n this.lastSeenReadinessEpochByNode.clear();\n if (\n this.ownsReadinessRegistry &&\n this.readinessRegistry &&\n \"close\" in this.readinessRegistry\n ) {\n (this.readinessRegistry as { close(): void }).close();\n }\n this.readinessRegistry = null;\n this.ownsReadinessRegistry = false;\n this.cameraConfigs.clear();\n this.assignments.clear();\n this.cachedAgentLoad.clear();\n this.zonesProvider = null;\n this.zoneRulesProvider = null;\n }\n\n // ── In-process dispatch surface (local-only, not in cap def) ──────────\n\n async dispatchCamera(\n runnerConfig: RunnerCameraConfig,\n ): Promise<DispatchResult> {\n const ctx = this.ctx;\n if (!ctx)\n throw new Error(\n \"PipelineOrchestrator: dispatchCamera called before initialize\",\n );\n\n this.cameraConfigs.set(runnerConfig.deviceId, runnerConfig);\n\n // Load management: check if any camera has been below threshold\n // long enough (more than half the configured window) or is\n // already load-shed paused, and defer the dispatch in that case\n // so we don't pile new attaches on a struggling node.\n const cfg = this.globalSettings ?? {};\n const minThreshold = typeof cfg.fpsMinThreshold === 'number' ? cfg.fpsMinThreshold : PipelineOrchestratorAddon.DEFAULT_FPS_MIN_THRESHOLD;\n const windowMs = typeof cfg.fpsLowWindowMs === 'number' && cfg.fpsLowWindowMs > 0\n ? cfg.fpsLowWindowMs\n : PipelineOrchestratorAddon.DEFAULT_FPS_LOW_WINDOW_MS;\n if (minThreshold > 0 && this.initTimestamp && Date.now() - this.initTimestamp > 30_000) {\n const now = Date.now();\n const halfWindow = windowMs / 2;\n for (const [did, state] of this.loadShedState) {\n const lowDurationMs = state.lowSinceTs !== null ? now - state.lowSinceTs : 0;\n if (state.pausedAt !== null || lowDurationMs >= halfWindow) {\n this.ctx.logger.info('dispatchCamera deferred: node under sustained load', {\n tags: { deviceId: runnerConfig.deviceId },\n meta: { blockedBy: did, lowDurationMs, paused: state.pausedAt !== null, threshold: minThreshold, windowMs },\n });\n return {\n success: true,\n agentNodeId: '',\n reason: 'capacity' as const,\n };\n }\n }\n }\n\n // Read pipeline node pin from device settings — overrides the legacy\n // `preferredAgent` when set to a concrete node id (not 'auto').\n const deviceStore =\n (await this.ctx.settings?.readDeviceStore(runnerConfig.deviceId)) ?? {};\n const pipelinePin = deviceStore[\"pipelineNodeId\"];\n const legacyPreferred = await this.readPreferredAgent(\n runnerConfig.deviceId,\n );\n const preferredAgent =\n typeof pipelinePin === \"string\" && pipelinePin !== \"auto\"\n ? pipelinePin\n : legacyPreferred;\n\n const loads = await this.collectAgentLoad({ onlyEnabled: true });\n const decision = balance({ nodes: loads, preferredAgent });\n\n const targetNodeId =\n decision?.agentNodeId ?? (await this.localRunnerNodeId());\n if (!targetNodeId) {\n throw new Error(\n `dispatchCamera: no runner available for ${runnerConfig.deviceId}`,\n );\n }\n\n await this.attachOn(targetNodeId, runnerConfig);\n\n const reason: PipelineAssignment[\"reason\"] = decision?.reason ?? \"capacity\";\n const pinned = decision?.reason === \"manual\";\n this.recordAssignment(runnerConfig.deviceId, targetNodeId, reason, pinned);\n\n // Resolve decoder node placement (logged only — passed to runner when ready)\n const decoderNodeId = await this.resolveDecoderNode(\n runnerConfig.deviceId,\n targetNodeId,\n );\n\n this.ctx.logger.info(\"dispatchCamera\", {\n tags: { deviceId: runnerConfig.deviceId, nodeId: targetNodeId },\n meta: { reason, score: decision?.score ?? \"n/a\", decoderNodeId },\n });\n\n return { success: true, agentNodeId: targetNodeId, reason };\n }\n\n async releaseCamera(input: { deviceId: number }): Promise<{ success: true }> {\n const current = this.assignments.get(input.deviceId);\n if (current) {\n await this.detachOn(current.agentNodeId, input.deviceId).catch(\n (err: unknown) => {\n const msg = errMsg(err);\n this.ctx.logger.debug(\"releaseCamera detach failed\", {\n tags: { deviceId: input.deviceId },\n meta: { error: msg },\n });\n },\n );\n this.emitUnassigned(current, \"unassigned\");\n } else {\n // Fallback: best-effort local detach for cameras we never tracked.\n const api = this.ctx.api;\n if (api) {\n await api.pipelineRunner.detachCamera.mutate({\n deviceId: input.deviceId,\n nodeId: this.localNodeId,\n }).catch(() => {\n /* swallow */\n });\n }\n }\n this.assignments.delete(input.deviceId);\n this.cameraConfigs.delete(input.deviceId);\n return { success: true };\n }\n\n // ── IPipelineOrchestratorProvider (cap surface) ──────────────────────\n\n async assignPipeline(input: {\n deviceId: number;\n agentNodeId: string;\n }): Promise<{ success: true }> {\n const ctx = this.ctx;\n if (!ctx)\n throw new Error(\n \"PipelineOrchestrator: assignPipeline called before initialize\",\n );\n\n // Persist the manual pin so it survives hub restarts + future rebalances.\n await this.ctx.settings\n ?.writeDeviceStore(input.deviceId, {\n [PREFERRED_AGENT_SETTING]: input.agentNodeId,\n })\n .catch((err: unknown) => {\n const msg = errMsg(err);\n this.ctx.logger.warn(\"assignPipeline: failed to persist pin\", {\n tags: { deviceId: input.deviceId },\n meta: { error: msg },\n });\n });\n\n const cached = this.cameraConfigs.get(input.deviceId);\n if (!cached) {\n this.ctx.logger.info(\n \"assignPipeline: pinned — will apply on next DeviceStreamsRegistered (no cached config yet)\",\n { tags: { deviceId: input.deviceId, nodeId: input.agentNodeId } },\n );\n return { success: true };\n }\n\n const current = this.assignments.get(input.deviceId);\n if (current && current.agentNodeId !== input.agentNodeId) {\n await this.detachOn(current.agentNodeId, input.deviceId).catch(\n (err: unknown) => {\n const msg = errMsg(err);\n this.ctx.logger.debug(\"assignPipeline detach-old failed\", {\n tags: { deviceId: input.deviceId },\n meta: { error: msg },\n });\n },\n );\n }\n\n await this.attachOn(input.agentNodeId, cached);\n this.recordAssignment(input.deviceId, input.agentNodeId, \"manual\", true);\n\n return { success: true };\n }\n\n async unassignPipeline(input: {\n deviceId: number;\n }): Promise<{ success: true }> {\n const ctx = this.ctx;\n if (!ctx)\n throw new Error(\n \"PipelineOrchestrator: unassignPipeline called before initialize\",\n );\n\n // Clear the pin in persisted settings — both the legacy\n // `preferredAgent` key and the newer `pipelineNodeId` overlay so\n // subsequent dispatches fall through to the auto-balancer.\n await this.ctx.settings\n ?.writeDeviceStore(input.deviceId, {\n [PREFERRED_AGENT_SETTING]: null,\n pipelineNodeId: \"auto\",\n })\n .catch((err: unknown) => {\n const msg = errMsg(err);\n this.ctx.logger.warn(\"unassignPipeline: failed to clear pin\", {\n tags: { deviceId: input.deviceId },\n meta: { error: msg },\n });\n });\n\n // If we have a cached config, re-dispatch via the auto-balancer so\n // the camera stays in the placement matrix (just unpinned). Earlier\n // semantics dropped the entry from `cameraConfigs` and `assignments`,\n // which made the row vanish from the pipeline page until the next\n // DeviceStreamsRegistered cycle — operators kept losing cameras.\n const cached = this.cameraConfigs.get(input.deviceId);\n const current = this.assignments.get(input.deviceId);\n\n if (cached) {\n const loads = await this.collectAgentLoad({ onlyEnabled: true });\n const decision: BalancerDecision | null = balance({\n nodes: loads,\n preferredAgent: null,\n });\n const targetNodeId =\n decision?.agentNodeId ?? (await this.localRunnerNodeId());\n\n if (targetNodeId) {\n if (current && current.agentNodeId !== targetNodeId) {\n await this.detachOn(current.agentNodeId, input.deviceId).catch(\n (err: unknown) => {\n const msg = errMsg(err);\n this.ctx.logger.debug(\"unassignPipeline detach-old failed\", {\n tags: { deviceId: input.deviceId },\n meta: { error: msg },\n });\n },\n );\n }\n if (!current || current.agentNodeId !== targetNodeId) {\n await this.attachOn(targetNodeId, cached);\n }\n const reason: PipelineAssignment[\"reason\"] =\n decision?.reason === \"manual\"\n ? \"capacity\"\n : (decision?.reason ?? \"capacity\");\n this.recordAssignment(input.deviceId, targetNodeId, reason, false);\n this.ctx.logger.info(\"unassignPipeline: re-dispatched via auto\", {\n tags: { deviceId: input.deviceId, nodeId: targetNodeId },\n meta: { reason },\n });\n return { success: true };\n }\n\n // No runner available — fall through to the legacy detach path so\n // we don't leave a stale assignment record pointing at the old\n // agent without dropping detection on it.\n this.ctx.logger.warn(\n \"unassignPipeline: no runner available, leaving unassigned\",\n { tags: { deviceId: input.deviceId } },\n );\n }\n\n if (current) {\n await this.detachOn(current.agentNodeId, input.deviceId).catch(\n (err: unknown) => {\n const msg = errMsg(err);\n this.ctx.logger.debug(\"unassignPipeline detach failed\", {\n tags: { deviceId: input.deviceId },\n meta: { error: msg },\n });\n },\n );\n this.emitUnassigned(current, \"unassigned\");\n }\n\n this.assignments.delete(input.deviceId);\n // Keep `cameraConfigs` so the next `dispatchCamera` / runner reconnect\n // cycle can re-attach without waiting for a fresh DeviceStreamsRegistered.\n\n return { success: true };\n }\n\n async rebalance(): Promise<{ migrated: number }> {\n const ctx = this.ctx;\n if (!ctx)\n throw new Error(\n \"PipelineOrchestrator: rebalance called before initialize\",\n );\n\n const loads = await this.collectAgentLoad({ onlyEnabled: true });\n let migrated = 0;\n\n for (const [deviceId, config] of this.cameraConfigs) {\n const current = this.assignments.get(deviceId);\n if (current?.pinned) continue; // Never migrate pinned cameras\n\n const preferredAgent = await this.readPreferredAgent(deviceId);\n const decision: BalancerDecision | null = balance({ nodes: loads, preferredAgent });\n if (!decision) continue;\n if (current && current.agentNodeId === decision.agentNodeId) continue;\n\n if (current) {\n await this.detachOn(current.agentNodeId, deviceId).catch(\n (err: unknown) => {\n const msg = errMsg(err);\n this.ctx.logger.debug(\"rebalance detach-old failed\", {\n tags: { deviceId },\n meta: { error: msg },\n });\n },\n );\n }\n await this.attachOn(decision.agentNodeId, config);\n this.recordAssignment(deviceId, decision.agentNodeId, \"rebalance\", false);\n migrated++;\n }\n\n this.ctx.logger.info(\"rebalance: migrated cameras\", { meta: { migrated } });\n return { migrated };\n }\n\n getPipelineAssignments(): readonly PipelineAssignment[] {\n return [...this.assignments.values()];\n }\n\n getPipelineAssignment(input: {\n deviceId: number;\n }): PipelineAssignment | null {\n return this.assignments.get(input.deviceId) ?? null;\n }\n\n /**\n * Per-camera live metrics. Centralised entry point for the UI: the\n * orchestrator owns the device→agent assignment map, so it knows\n * which runner holds the camera and can route the cap call to the\n * exact node. Calling `pipelineRunner.getCameraMetrics` directly\n * from the UI breaks in multi-agent setups because the hub-side cap\n * router resolves the runner singleton against the registry's first-\n * registered provider, which races between agents and may not be the\n * one the orchestrator actually dispatched the camera to.\n */\n async getCameraMetrics(input: {\n deviceId: number;\n }): Promise<CameraMetrics | null> {\n // Check if this camera is load-shed paused — return synthetic metrics\n const shedState = this.loadShedState.get(input.deviceId);\n if (shedState?.pausedAt !== null && shedState?.pausedAt !== undefined) {\n return {\n detectionMode: 'on-motion' as PipelinePhaseMode,\n configuredFps: 0,\n actualFps: 0,\n queueDepth: 0,\n avgInferenceTimeMs: 0,\n droppedFrames: 0,\n phase: 'load-shed',\n };\n }\n const assignment = this.assignments.get(input.deviceId);\n if (!assignment) return null;\n const api = this.ctx.api;\n if (!api) return null;\n const result = await api.pipelineRunner.getCameraMetrics.query({\n deviceId: input.deviceId,\n nodeId: assignment.agentNodeId,\n });\n return result ?? null;\n }\n\n /**\n * Live snapshot of every runner's load. Triggers a fresh\n * `collectAgentLoad()` on each call so the UI's \"Live load\" panel\n * always reflects reality — the in-memory cache is only populated\n * during dispatch / rebalance, so without a refresh here the panel\n * would stay empty until the next dispatch event (problematic after\n * a server restart that rehydrates assignments from disk without\n * re-dispatching).\n */\n async getAgentLoad(): Promise<readonly AgentLoadSummary[]> {\n await this.collectAgentLoad();\n return [...this.cachedAgentLoad.values()];\n }\n\n async getGlobalMetrics(): Promise<PipelineOrchestratorGlobalMetrics> {\n const summaries = await this.getAgentLoad();\n const onlineAgents = summaries.filter((s) => s.online).length;\n let totalCameras = 0;\n let attachedCameras = 0;\n let activeCameras = 0;\n let weightedInferenceMs = 0;\n let totalQueueDepth = 0;\n for (const s of summaries) {\n totalCameras += s.load.attachedCameras;\n attachedCameras += s.load.attachedCameras;\n activeCameras += s.load.activeCameras;\n weightedInferenceMs += s.load.avgInferenceTimeMs * s.load.attachedCameras;\n totalQueueDepth += s.load.queueDepthTotal;\n }\n const avgInferenceTimeMs =\n attachedCameras > 0 ? weightedInferenceMs / attachedCameras : 0;\n return {\n totalAgents: summaries.length,\n onlineAgents,\n totalCameras,\n attachedCameras,\n activeCameras,\n avgInferenceTimeMs,\n queueDepth: totalQueueDepth,\n };\n }\n\n // ── Internals ─────────────────────────────────────────────────────────\n\n /**\n * Call `attachCamera` on the target runner via this.ctx.api. The generated cap\n * router extracts `nodeId` from the input and routes to local or remote\n * runner transparently — no broker reference needed.\n */\n private async attachOn(\n nodeId: string,\n config: RunnerCameraConfig,\n ): Promise<void> {\n const api = this.ctx.api;\n if (!api)\n throw new Error(\n `attachOn(${nodeId}, ${config.deviceId}): this.ctx.api not available`,\n );\n try {\n await api.pipelineRunner.attachCamera.mutate({ ...config, nodeId });\n } catch (err: unknown) {\n // Diagnostic: a \"Maximum call stack size exceeded\" here surfaces\n // a recursion bug somewhere between the tRPC proxy and the\n // runner's attachCamera handler. Log the full stack + the\n // config shape so we can trace it from the server log instead\n // of guessing. Keeps the throw intact for the caller.\n if (\n err instanceof RangeError ||\n String(err).includes(\"Maximum call stack\")\n ) {\n const configSummary = {\n deviceId: config.deviceId,\n detectionMode: config.detectionMode,\n audioMode: config.audioMode,\n motionStreamId: config.motionStreamId,\n detectionStreamId: config.detectionStreamId,\n hasEngine: !!config.engine,\n stepsCount: config.steps?.length ?? null,\n hasAudio: config.audio?.enabled ?? null,\n };\n this.ctx.logger.error(\"attachOn: stack overflow\", {\n tags: { nodeId, deviceId: config.deviceId },\n meta: {\n configSummary,\n stack: (err as Error).stack ?? \"<no stack>\",\n },\n });\n }\n throw err;\n }\n }\n\n private async detachOn(nodeId: string, deviceId: number): Promise<void> {\n const api = this.ctx.api;\n if (!api) return;\n await api.pipelineRunner.detachCamera.mutate({ deviceId, nodeId });\n }\n\n private async localRunnerNodeId(): Promise<string | null> {\n const api = this.ctx.api;\n if (!api) return null;\n try {\n const load = await api.pipelineRunner.getLocalLoad.query({\n nodeId: this.localNodeId,\n });\n return load?.nodeId ?? this.localNodeId;\n } catch {\n return this.localNodeId;\n }\n }\n\n /**\n * Enumerate every runner-capable node currently known (populated via\n * AgentOnline/AgentOffline events). Used to populate the `enabledNodes`\n * multiselect options at schema-build time.\n *\n * Forked child nodeIds (`hub/classifier`, `agent-1/motion-wasm`) are\n * filtered out — they name isolated-process services, never dispatchable\n * pipeline runners. The on-write guards in AgentOnline + applyRuntimeSettings\n * already exclude them, but we filter here too so any legacy seed that\n * slipped in before those guards existed doesn't leak into the UI picker.\n */\n private collectRunnerNodeIds(): readonly string[] {\n return [...this.knownRunnerNodes].filter((id) => !id.includes(\"/\")).sort();\n }\n\n /**\n * Enumerate every node currently known as decoder-capable. Reuses\n * `knownRunnerNodes` since any runner node can potentially host a\n * decoder session. `hub` is always included. Forked child nodeIds are\n * filtered out for the same reason as `collectRunnerNodeIds`.\n */\n private collectDecoderNodeIds(): string[] {\n const nodeIds = new Set<string>([\"hub\"]);\n for (const nodeId of this.knownRunnerNodes) {\n if (!nodeId.includes(\"/\")) nodeIds.add(nodeId);\n }\n return [...nodeIds].sort();\n }\n\n /**\n * Enumerate every node currently known as audio-analyzer-capable.\n * Uses `knownRunnerNodes` as the universe and filters out child\n * nodeIds (containing '/') the same way the other collectors do.\n */\n private collectAudioNodeIds(): string[] {\n const nodeIds = new Set<string>([\"hub\"]);\n for (const nodeId of this.knownRunnerNodes) {\n if (!nodeId.includes(\"/\")) nodeIds.add(nodeId);\n }\n return [...nodeIds].sort();\n }\n\n /**\n * Resolve which node should run the decoder for a given device.\n * Reads the per-device `decoderNodeId` pin first (manual override),\n * then falls back to the `balanceDecoder` algorithm which prefers\n * co-location with the pipeline node, then capacity.\n */\n private async resolveDecoderNode(\n deviceId: number,\n pipelineNodeId: string,\n ): Promise<string> {\n const deviceStore =\n (await this.ctx.settings?.readDeviceStore(deviceId)) ?? {};\n const pinned = deviceStore[\"decoderNodeId\"];\n if (typeof pinned === \"string\" && pinned !== \"auto\") return pinned;\n\n // Collect decoder-capable nodes from enabled list\n const enabledDecoderNodes = this.enabledDecoderNodes;\n\n const allLoads = await this.collectAgentLoad();\n const decoderLoads = allLoads.filter((load) =>\n enabledDecoderNodes.includes(load.nodeId),\n );\n\n const decision = balanceDecoder({\n decoderNodes: decoderLoads,\n pipelineNodeId,\n });\n\n return decision?.decoderNodeId ?? pipelineNodeId;\n }\n\n /**\n * Return `true` when `nodeId` is in the `enabledNodes` whitelist.\n * A strict list — an empty whitelist means \"no node allowed\", not\n * \"all nodes allowed\". The schema default (`['hub']`) guarantees\n * fresh installs always have at least the hub enabled.\n */\n private isNodeEnabled(nodeId: string): boolean {\n return this.enabledNodes.includes(nodeId);\n }\n\n /**\n * Query every online runner in the cluster for its current load, plus the\n * local runner if co-located. Refreshes the `cachedAgentLoad` snapshot so\n * `getAgentLoad()` / `getGlobalMetrics()` can return fresh data.\n *\n * `{onlyEnabled: true}` applies the `enabledNodes` whitelist filter —\n * used when the caller is the dispatcher / balancer and must only\n * see runners eligible for new camera assignments. The default\n * (unfiltered) collects every known runner, which is what the UI\n * wants: operators need visibility into every connected node, even\n * ones currently disabled from the dispatch pool.\n */\n private async collectAgentLoad(options?: {\n readonly onlyEnabled?: boolean;\n }): Promise<readonly RunnerLocalLoad[]> {\n const ctx = this.ctx;\n const loads: RunnerLocalLoad[] = [];\n const onlyEnabled = options?.onlyEnabled ?? false;\n\n for (const nodeId of this.knownRunnerNodes) {\n if (onlyEnabled && !this.isNodeEnabled(nodeId)) {\n ctx?.logger.debug(\"runner excluded by enabledNodes whitelist\", {\n tags: { nodeId },\n });\n continue;\n }\n const api = ctx?.api;\n if (!api) continue;\n try {\n const load = await this.queryLocalLoadBounded(nodeId);\n loads.push(load);\n } catch (err: unknown) {\n const msg = errMsg(err);\n ctx?.logger.debug(\"getLocalLoad failed\", {\n tags: { nodeId },\n meta: { error: msg },\n });\n }\n }\n\n this.refreshAgentLoadCache(loads);\n return loads;\n }\n\n private refreshAgentLoadCache(loads: readonly RunnerLocalLoad[]): void {\n const next = new Map<string, AgentLoadSummary>();\n for (const load of loads) {\n next.set(load.nodeId, {\n nodeId: load.nodeId,\n online: true,\n load,\n score: computeCapacityScore(load),\n });\n }\n this.cachedAgentLoad = next;\n }\n\n /**\n * Per-node `getLocalLoad` budget (ms). A WEDGED runner — transport up\n * enough to stay in the service registry, but whose `broker.call` neither\n * resolves nor rejects (observed live as\n * \"[brokerTransportLink] still awaiting … after 18min\") — would otherwise\n * stall `collectAgentLoad`, and through it `dispatchCamera` →\n * `startDetection` for EVERY camera, indefinitely: the transport link does\n * not abort an in-flight `broker.call` (see trpc-links.ts), so neither the\n * try/catch nor an AbortSignal can unstick it. Tunable via the\n * `agentLoadTimeoutMs` global setting; the default is generous enough that\n * a healthy-but-slow node is never falsely skipped (the pinned-discovery\n * window alone is 2s).\n */\n private static readonly DEFAULT_AGENT_LOAD_TIMEOUT_MS = 4_000;\n\n private agentLoadBudgetMs(): number {\n const cfg = this.globalSettings ?? {};\n const value = cfg.agentLoadTimeoutMs;\n return typeof value === \"number\" && value > 0\n ? value\n : PipelineOrchestratorAddon.DEFAULT_AGENT_LOAD_TIMEOUT_MS;\n }\n\n /**\n * `getLocalLoad` for one runner node, bounded by `agentLoadBudgetMs`. On\n * timeout it rejects so `collectAgentLoad`'s catch treats the node exactly\n * like an offline one (logged at debug, skipped). The underlying query is\n * left to settle on its own — Moleculer rejects it when the node\n * disconnects — rather than leaking an unbounded await into the dispatch\n * path.\n */\n private async queryLocalLoadBounded(nodeId: string): Promise<RunnerLocalLoad> {\n const api = this.ctx?.api;\n if (!api) throw new Error(\"queryLocalLoadBounded: addon not initialized\");\n const budgetMs = this.agentLoadBudgetMs();\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(\n () => reject(new Error(`getLocalLoad exceeded ${budgetMs}ms budget for ${nodeId}`)),\n budgetMs,\n );\n });\n try {\n return await Promise.race([\n api.pipelineRunner.getLocalLoad.query({ nodeId }),\n timeout,\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n\n private async readPreferredAgent(deviceId: number): Promise<string | null> {\n const ctx = this.ctx;\n if (!ctx?.settings) return null;\n try {\n const settings = await this.ctx.settings!.readDeviceStore(deviceId);\n const value = settings[PREFERRED_AGENT_SETTING];\n return typeof value === \"string\" && value.length > 0 ? value : null;\n } catch {\n return null;\n }\n }\n\n private async readAudioNodePin(deviceId: number): Promise<string | null> {\n if (!this.ctx?.settings) return null;\n try {\n const store = await this.ctx.settings.readDeviceStore(deviceId);\n const v = store[AUDIO_NODE_SETTING];\n return typeof v === \"string\" && v.length > 0 && v !== \"auto\" ? v : null;\n } catch {\n return null;\n }\n }\n\n private collectAudioNodeLoad(): AudioNodeLoad[] {\n const counts = new Map<string, number>();\n for (const assignment of this.audioAssignments.values()) {\n counts.set(\n assignment.nodeId,\n (counts.get(assignment.nodeId) ?? 0) + 1,\n );\n }\n const nodes: AudioNodeLoad[] = [];\n for (const nodeId of this.readyAudioNodes) {\n if (!this.enabledAudioNodes.includes(nodeId)) continue;\n nodes.push({ nodeId, deviceCount: counts.get(nodeId) ?? 0 });\n }\n return nodes;\n }\n\n private recordAudioAssignment(\n deviceId: number,\n nodeId: string,\n pinned: boolean,\n ): void {\n const assignment: AudioNodeAssignment = {\n deviceId,\n nodeId,\n pinned,\n assignedAt: Date.now(),\n };\n this.audioAssignments.set(deviceId, assignment);\n this.audioNodeByDevice.set(deviceId, nodeId);\n }\n\n private async dispatchAudio(deviceId: number): Promise<string> {\n // Prefer existing assignment — avoids re-balancing on every re-subscription.\n const existing = this.audioAssignments.get(deviceId);\n if (existing) return existing.nodeId;\n\n const preferredNode = await this.readAudioNodePin(deviceId);\n const loads = this.collectAudioNodeLoad();\n\n // If no audio nodes are known yet, fall back to local.\n if (loads.length === 0) {\n this.recordAudioAssignment(deviceId, this.localNodeId, false);\n return this.localNodeId;\n }\n\n const decision = balanceAudio({ nodes: loads, preferredNode });\n const nodeId = decision?.nodeId ?? this.localNodeId;\n const pinned = decision?.reason === \"manual\";\n this.recordAudioAssignment(deviceId, nodeId, pinned);\n return nodeId;\n }\n\n private recordAssignment(\n deviceId: number,\n agentNodeId: string,\n reason: PipelineAssignment[\"reason\"],\n pinned: boolean,\n ): void {\n const assignment: PipelineAssignment = {\n deviceId,\n agentNodeId,\n pinned,\n reason,\n assignedAt: Date.now(),\n };\n this.assignments.set(deviceId, assignment);\n\n const ctx = this.ctx;\n if (!ctx?.eventBus) return;\n const payload: PipelineCameraAssignmentPayload = {\n deviceId,\n agentNodeId,\n pinned,\n reason,\n };\n this.ctx.eventBus.emit(\n createEvent(\n EventCategory.PipelineCameraAssigned,\n { type: \"device\", id: deviceId, nodeId: agentNodeId },\n payload,\n ),\n );\n }\n\n private emitUnassigned(\n assignment: PipelineAssignment,\n reason: PipelineCameraAssignmentPayload[\"reason\"],\n ): void {\n const ctx = this.ctx;\n if (!ctx?.eventBus) return;\n const payload: PipelineCameraAssignmentPayload = {\n deviceId: assignment.deviceId,\n agentNodeId: assignment.agentNodeId,\n pinned: assignment.pinned,\n reason,\n };\n this.ctx.eventBus.emit(\n createEvent(\n EventCategory.PipelineCameraUnassigned,\n {\n type: \"device\",\n id: assignment.deviceId,\n nodeId: assignment.agentNodeId,\n },\n payload,\n ),\n );\n }\n\n /**\n * Failover handler. When a runner node goes offline, the behaviour is\n * driven by the persisted failover policy (`failoverPolicy`):\n * - `onDisconnect: 'migrate'` → move non-pinned cameras to another runner\n * - `onDisconnect: 'leave-unassigned'` → drop all assignments for the node\n * - `pinnedOnDisconnect: 'leave-pinned'` → pinned cameras stay unassigned\n * - `pinnedOnDisconnect: 'unpin-and-migrate'` → clear the pin + migrate\n */\n private async handleNodeDisconnect(nodeId: string): Promise<void> {\n const ctx = this.ctx;\n if (!ctx) return;\n\n if (this.failoverPolicy.onDisconnect === \"leave-unassigned\") {\n let dropped = 0;\n for (const [deviceId, assignment] of this.assignments) {\n if (assignment.agentNodeId !== nodeId) continue;\n this.assignments.delete(deviceId);\n this.emitUnassigned(assignment, \"unassigned\");\n dropped++;\n }\n if (dropped > 0) {\n this.ctx.logger.warn(\n \"Runner disconnected — policy is 'leave-unassigned'\",\n { tags: { nodeId }, meta: { dropped } },\n );\n }\n this.cachedAgentLoad.delete(nodeId);\n return;\n }\n\n const affected: Array<{ deviceId: number; config: RunnerCameraConfig }> =\n [];\n for (const [deviceId, assignment] of this.assignments) {\n if (assignment.agentNodeId !== nodeId) continue;\n const config = this.cameraConfigs.get(deviceId);\n if (!config) continue;\n if (\n assignment.pinned &&\n this.failoverPolicy.pinnedOnDisconnect === \"leave-pinned\"\n ) {\n this.ctx.logger.warn(\n \"Runner disconnected — pinned camera leaving unassigned until user unpins\",\n { tags: { nodeId, deviceId } },\n );\n continue;\n }\n // `unpin-and-migrate` path: clear the pin so subsequent balancer passes\n // can treat this camera like any other non-pinned assignment.\n if (\n assignment.pinned &&\n this.failoverPolicy.pinnedOnDisconnect === \"unpin-and-migrate\"\n ) {\n await this.ctx.settings\n ?.writeDeviceStore(deviceId, { [PREFERRED_AGENT_SETTING]: null })\n .catch(() => {\n /* best effort */\n });\n }\n affected.push({ deviceId, config });\n }\n if (affected.length === 0) {\n this.cachedAgentLoad.delete(nodeId);\n return;\n }\n\n this.ctx.logger.warn(\"Runner disconnected — failing over cameras\", {\n tags: { nodeId },\n meta: { affected: affected.length },\n });\n\n // Drop the dead node from the cached load snapshot + query the rest fresh.\n this.cachedAgentLoad.delete(nodeId);\n const loads = (await this.collectAgentLoad({ onlyEnabled: true })).filter(\n (l) => l.nodeId !== nodeId,\n );\n\n for (const { deviceId, config } of affected) {\n const decision = balance({ nodes: loads, preferredAgent: null });\n if (!decision) {\n this.ctx.logger.error(\"Failover: no online runner\", {\n tags: { deviceId },\n });\n this.assignments.delete(deviceId);\n continue;\n }\n try {\n await this.attachOn(decision.agentNodeId, config);\n this.recordAssignment(\n deviceId,\n decision.agentNodeId,\n \"failover\",\n false,\n );\n this.ctx.logger.info(\"Failover\", {\n tags: { deviceId, nodeId: decision.agentNodeId },\n });\n } catch (err: unknown) {\n const msg = errMsg(err);\n this.ctx.logger.error(\"Failover: attach failed\", {\n tags: { deviceId, nodeId: decision.agentNodeId },\n meta: { error: msg },\n });\n }\n }\n }\n\n /**\n * Reconnect handler. When a runner node comes back online, the behaviour\n * is driven by the `onReconnect` policy:\n * - `restore` → re-attach cameras previously assigned to that node\n * (only the ones still known in `cameraConfigs`)\n * - `rebalance` → run a full `rebalance()` pass so non-pinned cameras\n * can migrate back onto the newly-available runner\n */\n private async handleNodeConnect(nodeId: string): Promise<void> {\n const ctx = this.ctx;\n if (!ctx) return;\n if (nodeId === this.localNodeId) return; // Our own node, no failover needed\n // Forkable addons expose themselves as child Moleculer nodes like\n // `hub/detection-pipeline`. They're not\n // runners — they don't host `pipeline-runner.attachCamera`, so\n // the 'restore' path would fail on every such connect with a\n // \"service not found\" error. Filter them out on the way in.\n if (nodeId.includes(\"/\")) return;\n\n this.ctx.logger.info(\"Runner connected — applying reconnect policy\", {\n tags: { nodeId },\n meta: { policy: this.failoverPolicy.onReconnect },\n });\n\n if (this.failoverPolicy.onReconnect === \"rebalance\") {\n await this.rebalance().catch((err: unknown) => {\n const msg = errMsg(err);\n this.ctx.logger.error(\"rebalance after reconnect failed\", {\n meta: { error: msg },\n });\n });\n return;\n }\n\n // 'restore' path — re-attach cameras whose last known assignment was\n // this node. Cameras currently attached elsewhere stay put.\n let restored = 0;\n for (const [deviceId, config] of this.cameraConfigs) {\n const current = this.assignments.get(deviceId);\n if (current && current.agentNodeId !== nodeId) continue;\n try {\n await this.attachOn(nodeId, config);\n this.recordAssignment(deviceId, nodeId, \"failover\", false);\n restored++;\n } catch (err: unknown) {\n const msg = errMsg(err);\n this.ctx.logger.error(\"restore attach failed\", {\n tags: { deviceId, nodeId },\n meta: { error: msg },\n });\n }\n }\n if (restored > 0) {\n this.ctx.logger.info(\"Runner reconnected — restored cameras\", {\n tags: { nodeId },\n meta: { restored },\n });\n }\n }\n\n // ── Readiness protocol plumbing ──────────────────────────────────────\n\n /**\n * Subscribe to `detection-pipeline` readiness transitions for `nodeId`.\n * Idempotent: re-subscribing the same node is a no-op. The handler\n * skips same-epoch replays so repeated `ready` emits don't force\n * redundant reseeds.\n */\n private subscribeToDetectionPipelineReadiness(nodeId: string): void {\n if (!this.readinessRegistry) return;\n if (this.readinessSubsByNode.has(nodeId)) return;\n const unsub = this.readinessRegistry.onReadyState(\n pipelineExecutorCapability.name,\n { type: \"node\", nodeId },\n (t) => {\n void this.handleDetectionPipelineReadiness(t);\n },\n );\n this.readinessSubsByNode.set(nodeId, unsub);\n }\n\n private unsubscribeDetectionPipelineReadiness(nodeId: string): void {\n const unsub = this.readinessSubsByNode.get(nodeId);\n if (!unsub) return;\n unsub();\n this.readinessSubsByNode.delete(nodeId);\n this.lastSeenReadinessEpochByNode.delete(nodeId);\n }\n\n /**\n * Subscribe to `audio-analyzer` readiness transitions for `nodeId`.\n * Idempotent — re-subscribing the same node is a no-op (uses its own\n * key space separate from detection readiness subscriptions).\n */\n private subscribeToAudioAnalyzerReadiness(nodeId: string): void {\n if (!this.readinessRegistry) return;\n this.readinessRegistry.onReadyState(\n \"audio-analyzer\",\n { type: \"node\", nodeId },\n (t) => {\n void this.handleAudioAnalyzerReadiness(t, nodeId);\n },\n );\n }\n\n private async handleAudioAnalyzerReadiness(\n t: ReadinessTransition,\n nodeId: string,\n ): Promise<void> {\n if (t.state !== \"ready\") {\n this.readyAudioNodes.delete(nodeId);\n return;\n }\n const lastEpoch = this.lastSeenAudioEpochByNode.get(nodeId) ?? 0;\n if (t.epoch <= lastEpoch) return;\n this.lastSeenAudioEpochByNode.set(nodeId, t.epoch);\n this.readyAudioNodes.add(nodeId);\n this.ctx.logger.info(\n \"audio-analyzer ready — node now available for audio dispatch\",\n { tags: { nodeId }, meta: { epoch: t.epoch } },\n );\n // Re-attach audio for cameras ALREADY dispatched to this node. The\n // reconcile below is additive-only (it dispatches never-seen cameras), so\n // without this an audio-analyzer restart leaves already-dispatched\n // cameras' audio subscriptions pointing at the dead analyzer — frozen\n // levels. Detection recovers via handleDetectionPipelineReadiness's full\n // redispatch; audio needs this symmetric re-attach.\n await this.reattachAudioForNode(nodeId);\n // Reconcile in case cameras were stranded while audio-analyzer was offline.\n this.scheduleReconcile();\n }\n\n /**\n * Re-establish audio subscriptions for every camera whose audio is routed\n * to `nodeId`, after that node's audio-analyzer (re)started. Mirrors the\n * audio block in `startDetection` (drop prior sub, re-subscribe, keep only\n * if detection is active). Idempotent.\n */\n private async reattachAudioForNode(nodeId: string): Promise<void> {\n for (const [deviceId, audioNode] of this.audioNodeByDevice) {\n if (audioNode !== nodeId) continue;\n const config = this.cameraConfigs.get(deviceId);\n if (!config) continue;\n const prior = this.audioSubscriptions.get(deviceId);\n if (prior) {\n try { prior(); } catch { /* swallow */ }\n this.audioSubscriptions.delete(deviceId);\n }\n try {\n const unsub = await this.subscribeAudioStream(deviceId, config);\n if (unsub) {\n if (this.activeDetections.has(deviceId)) {\n this.audioSubscriptions.set(deviceId, unsub);\n } else {\n unsub();\n }\n }\n } catch (err: unknown) {\n this.ctx.logger.error(\"audio re-attach on analyzer readiness failed\", {\n tags: { deviceId, nodeId },\n meta: { error: errMsg(err) },\n });\n }\n }\n }\n\n /**\n * Act on a `detection-pipeline` transition: on `ready` with a new\n * epoch (= producer restart or first-time ready), invalidate the\n * catalog cache, re-seed that node's `agentAddonDefaults`, and\n * redispatch every camera currently assigned to it. Everything else\n * (down, starting, same-epoch keepalive) is skipped.\n */\n private async handleDetectionPipelineReadiness(\n t: ReadinessTransition,\n ): Promise<void> {\n if (t.state !== \"ready\") return;\n if (t.scope.type !== \"node\") return;\n const nodeId = t.scope.nodeId;\n const lastEpoch = this.lastSeenReadinessEpochByNode.get(nodeId) ?? 0;\n if (t.epoch <= lastEpoch) return;\n this.lastSeenReadinessEpochByNode.set(nodeId, t.epoch);\n\n try {\n // Wipe BOTH `*::*` (key without engine) AND any per-engine cache\n // entries for this node. The previous `delete(nodeId)` only matched\n // the literal nodeId key — but `getCatalogForAgent` keys cache as\n // `${nodeId}::${engine}` or `${nodeId}::*`. With the literal-only\n // delete, stale empty-catalog cache entries from BEFORE the addon\n // was ready survived the reseed and resolvePipelineForDevice kept\n // returning empty steps even after `seedAgentSettingsFromCatalog`\n // succeeded.\n for (const key of [...this.catalogCache.keys()]) {\n if (key.startsWith(`${nodeId}::`)) this.catalogCache.delete(key);\n }\n await this.seedAgentSettingsFromCatalog(nodeId);\n // Direct re-attach for every camera assigned to this node — bypasses\n // the eventBus subscriber path so transient debouncing / dropped\n // events don't leave a camera stuck with empty steps. Cameras\n // attached BEFORE the addon was ready picked up the `node/cpu`\n // fallback engine + empty steps; this loop replaces their attach\n // payload with the newly-resolved one.\n // Build candidate set from BOTH `assignments` (typical case) and\n // `cameraConfigs` (fallback for cameras still mid-dispatch when the\n // readiness event landed). Some restart paths (profile-slot change,\n // motion stream re-pick) tear down `assignments` briefly while\n // `cameraConfigs` retains the runner config — catching both ensures\n // every hub-targeted camera gets the freshly-resolved attach.\n const candidates = new Set<number>();\n for (const [deviceId, assignment] of this.assignments) {\n if (assignment.agentNodeId === nodeId) candidates.add(deviceId);\n }\n for (const [deviceId, cfg] of this.cameraConfigs) {\n // cameraConfigs has no agent binding — assume hub-local when no\n // assignment exists. The runner attach is idempotent so a\n // stale add here is at worst a no-op.\n if (!this.assignments.has(deviceId) && nodeId === this.localNodeId) {\n candidates.add(deviceId);\n }\n void cfg;\n }\n const affected: Array<{ deviceId: number; config: RunnerCameraConfig }> = [];\n for (const deviceId of candidates) {\n const cached = this.cameraConfigs.get(deviceId);\n if (!cached) continue;\n const resolved = await this.resolvePipelineForDevice(deviceId, nodeId);\n if (resolved.steps.length === 0) continue;\n const next: RunnerCameraConfig = {\n ...cached,\n engine: resolved.engine,\n steps: resolved.steps,\n audio: resolved.audio ?? null,\n };\n this.cameraConfigs.set(deviceId, next);\n affected.push({ deviceId, config: next });\n }\n for (const { deviceId, config } of affected) {\n try {\n await this.attachOn(nodeId, config);\n this.ctx.logger.info(\"readiness: re-attached with hydrated steps\", {\n tags: { deviceId, nodeId },\n meta: { stepCount: config.steps?.length ?? 0 },\n });\n } catch (err) {\n this.ctx.logger.warn(\"readiness: re-attach failed\", {\n tags: { deviceId, nodeId },\n meta: { error: errMsg(err) },\n });\n }\n }\n this.ctx.logger.info(\n \"readiness: detection-pipeline reseeded agent defaults + redispatched cameras\",\n { tags: { nodeId }, meta: { epoch: t.epoch, reattached: affected.length } },\n );\n // Deferred sweep — a camera that arrived between the assignments\n // iteration above and the catalog cache populating gets caught\n // here. 3 seconds is enough for the detection-pipeline catalog to\n // fully publish all step definitions across forked workers.\n setTimeout(() => {\n void this.reattachStaleEmpties(nodeId).catch((err: unknown) => {\n this.ctx.logger.debug(\"readiness deferred sweep failed\", {\n tags: { nodeId },\n meta: { error: errMsg(err) },\n });\n });\n }, 3_000);\n // Reconcile in case cameras were stranded while this provider was offline.\n this.scheduleReconcile();\n } catch (err: unknown) {\n this.ctx.logger.debug(\"readiness seed+redispatch failed\", {\n tags: { nodeId },\n meta: { epoch: t.epoch, error: errMsg(err) },\n });\n }\n }\n\n /**\n * Walk every cached RunnerCameraConfig and re-attach any whose stored\n * `steps` are empty AND whose latest resolve produces a non-empty\n * pipeline. Catches the \"camera dispatched mid-readiness\" race where\n * the initial attach landed BEFORE the catalog was cached but the\n * subsequent readiness sweep already finished iterating.\n */\n private async reattachStaleEmpties(nodeId: string): Promise<void> {\n for (const [deviceId, cached] of this.cameraConfigs) {\n const stepsCount = cached.steps?.length ?? 0;\n if (stepsCount > 0) continue;\n const assignment = this.assignments.get(deviceId);\n const targetNode = assignment?.agentNodeId ?? this.localNodeId;\n if (targetNode !== nodeId) continue;\n const resolved = await this.resolvePipelineForDevice(deviceId, nodeId);\n if (resolved.steps.length === 0) continue;\n const next: RunnerCameraConfig = {\n ...cached,\n engine: resolved.engine,\n steps: resolved.steps,\n audio: resolved.audio ?? null,\n };\n this.cameraConfigs.set(deviceId, next);\n try {\n await this.attachOn(nodeId, next);\n this.ctx.logger.info(\"deferred sweep: re-attached stale empty\", {\n tags: { deviceId, nodeId },\n meta: { stepCount: next.steps?.length ?? 0 },\n });\n } catch (err) {\n this.ctx.logger.warn(\"deferred sweep: attach failed\", {\n tags: { deviceId, nodeId },\n meta: { error: errMsg(err) },\n });\n }\n }\n }\n\n // ── Dispatch reconcile ───────────────────────────────────────────────\n\n /**\n * Coalesce bursts of topology/slot-change signals into a single\n * `reconcileDispatch` pass. Mirrors `scheduleRehydrate` in\n * `packages/kernel/src/moleculer/readiness-context.ts`.\n */\n private scheduleReconcile(): void {\n if (this.reconcileTimer !== null) clearTimeout(this.reconcileTimer);\n this.reconcileTimer = setTimeout(() => {\n this.reconcileTimer = null;\n void this.reconcileDispatch();\n }, RECONCILE_DEBOUNCE_MS);\n }\n\n /**\n * RPC snapshot-reconcile: pull the current broker fleet over\n * `listAllProfileSlots`, diff against `cameraConfigs`, and dispatch\n * the gap via `handleDeviceRegistered`.\n *\n * Additive only — never retracts or re-dispatches a known device.\n * Guards against re-entrant calls: a trailing request schedules one\n * extra pass after the in-flight one completes.\n */\n private async reconcileDispatch(): Promise<void> {\n if (this.reconcileInFlight) {\n this.reconcileRerunRequested = true;\n return;\n }\n this.reconcileInFlight = true;\n try {\n const api = this.api;\n if (!api) {\n this.ctx.logger.debug(\n 'dispatch reconcile skipped — ctx.api not yet available',\n );\n return;\n }\n\n let slots: readonly ProfileSlot[];\n try {\n slots = await api.streamBroker.listAllProfileSlots.query();\n } catch (err: unknown) {\n this.ctx.logger.debug('dispatch reconcile skipped — stream-broker not ready', {\n meta: { error: errMsg(err) },\n });\n return;\n }\n\n const desired = desiredDeviceIdsFromSlots(slots);\n const known = new Set(this.cameraConfigs.keys());\n const gap = computeDispatchGap(desired, known);\n\n this.ctx.logger.info('dispatch reconcile', {\n meta: { desired: desired.size, known: known.size, gap },\n });\n\n for (const deviceId of gap) {\n try {\n await this.handleDeviceRegistered(deviceId);\n } catch (err: unknown) {\n this.ctx.logger.warn('dispatch reconcile: handleDeviceRegistered failed', {\n tags: { deviceId },\n meta: { error: errMsg(err) },\n });\n }\n }\n } finally {\n this.reconcileInFlight = false;\n if (this.reconcileRerunRequested) {\n this.reconcileRerunRequested = false;\n this.scheduleReconcile();\n }\n }\n }\n\n // ── Capability bindings (cap methods) ────────────────────────────────\n\n async getCapabilityBindings(input: {\n nodeId: string;\n }): Promise<Readonly<Record<string, string>>> {\n const ctx = this.ctx;\n if (!ctx?.settings) return {};\n const emptyRecord: Record<string, unknown> = {};\n const global = await this.ctx\n .settings!.readAddonStore()\n .catch((): Record<string, unknown> => emptyRecord);\n const bindingsRaw = global[\"nodeBindings\"];\n if (!bindingsRaw || typeof bindingsRaw !== \"object\") return {};\n const bindings: Record<string, unknown> = { ...bindingsRaw };\n const perNodeRaw = bindings[input.nodeId];\n if (!perNodeRaw || typeof perNodeRaw !== \"object\") return {};\n const perNode: Record<string, unknown> = { ...perNodeRaw };\n const out: Record<string, string> = {};\n for (const [capName, addonId] of Object.entries(perNode)) {\n if (typeof addonId === \"string\" && addonId.length > 0)\n out[capName] = addonId;\n }\n return out;\n }\n\n async setCapabilityBinding(input: {\n nodeId: string;\n capName: string;\n addonId: string;\n }): Promise<{ success: true }> {\n const ctx = this.ctx;\n if (!ctx?.settings)\n throw new Error(\n \"PipelineOrchestrator: setCapabilityBinding requires a settings backend\",\n );\n\n const emptyRecord: Record<string, unknown> = {};\n const global = await this.ctx\n .settings!.readAddonStore()\n .catch((): Record<string, unknown> => emptyRecord);\n const rawBindings = global[\"nodeBindings\"];\n const prevBindings: Record<string, Record<string, string>> = {};\n if (rawBindings && typeof rawBindings === \"object\") {\n const asRecord: Record<string, unknown> = { ...rawBindings };\n for (const [nodeKey, nodeVal] of Object.entries(asRecord)) {\n if (!nodeVal || typeof nodeVal !== \"object\") continue;\n const nodeAsRecord: Record<string, unknown> = { ...nodeVal };\n const nodeBinding: Record<string, string> = {};\n for (const [capName, addonId] of Object.entries(nodeAsRecord)) {\n if (typeof addonId === \"string\") nodeBinding[capName] = addonId;\n }\n prevBindings[nodeKey] = nodeBinding;\n }\n }\n const nodeBindings: Record<string, string> = {\n ...(prevBindings[input.nodeId] ?? {}),\n };\n nodeBindings[input.capName] = input.addonId;\n\n const nextMap: Record<string, Record<string, string>> = {\n ...prevBindings,\n [input.nodeId]: nodeBindings,\n };\n await this.ctx.settings!.writeAddonStore({ nodeBindings: nextMap });\n\n // Emit a typed event so each kernel process updates its preferred-provider\n // registry on the fly. Consumers subscribe in `addon-context-factory` and\n // `addon-registry.service`.\n this.ctx.eventBus?.emit(\n createEvent(\n EventCategory.CapabilityBindingChanged,\n { type: \"system\", id: \"pipeline-orchestrator\", nodeId: input.nodeId },\n {\n nodeId: input.nodeId,\n capName: input.capName,\n addonId: input.addonId,\n },\n ),\n );\n\n this.ctx.logger.info(\"capability binding set\", {\n tags: { nodeId: input.nodeId, addonId: input.addonId },\n meta: { capName: input.capName },\n });\n return { success: true };\n }\n\n // ── Decoder scheduling cap methods ───────────────────────────────────\n\n async assignDecoder(input: {\n readonly deviceId: number;\n readonly nodeId: string;\n }): Promise<void> {\n await this.ctx.settings!.writeDeviceStore(input.deviceId, {\n decoderNodeId: input.nodeId,\n });\n this.ctx.logger.info(\"Decoder pinned\", {\n tags: { deviceId: input.deviceId, nodeId: input.nodeId },\n });\n }\n\n async unassignDecoder(input: { readonly deviceId: number }): Promise<void> {\n await this.ctx.settings!.writeDeviceStore(input.deviceId, {\n decoderNodeId: \"auto\",\n });\n this.ctx.logger.info(\"Decoder unpinned\", {\n tags: { deviceId: input.deviceId },\n });\n }\n\n /**\n * Per-camera decoder node accessor (Phase 8). Exposes the existing\n * private `resolveDecoderNode` logic as a cap method so\n * `stream-broker.createBroker` can filter its decoder provider\n * selection deterministically. Caller hint: pass `pipelineNodeId` to\n * bias the balancer toward co-location with the runner; omitted → the\n * last-known assignment, else 'hub'.\n */\n async getDecoderAssignment(input: {\n readonly deviceId: number;\n readonly pipelineNodeId?: string;\n }): Promise<DecoderAssignment> {\n const { deviceId } = input;\n const fallbackPipelineNodeId =\n input.pipelineNodeId ??\n this.assignments.get(deviceId)?.agentNodeId ??\n this.localNodeId;\n const deviceStore =\n (await this.ctx.settings?.readDeviceStore(deviceId)) ?? {};\n const pinRaw = deviceStore[\"decoderNodeId\"];\n const pinned = typeof pinRaw === \"string\" && pinRaw !== \"auto\";\n const decoderNodeId = await this.resolveDecoderNode(\n deviceId,\n fallbackPipelineNodeId,\n );\n return {\n deviceId,\n decoderNodeId,\n pinned,\n reason: pinned ? \"manual\" : \"co-located\",\n };\n }\n\n async getDecoderAssignments(): Promise<readonly DecoderAssignment[]> {\n const results: DecoderAssignment[] = [];\n for (const [deviceId, pipelineAssignment] of this.assignments) {\n const deviceStore =\n (await this.ctx.settings?.readDeviceStore(deviceId)) ?? {};\n const pinRaw = deviceStore[\"decoderNodeId\"];\n const pinned = typeof pinRaw === \"string\" && pinRaw !== \"auto\";\n // Resolve the actual node id when not pinned — co-located with the\n // pipeline runner by default, falling back to the local node when\n // no decoder cap is registered anywhere. Earlier shape returned the\n // literal string \"auto\" which broke per-node UI filters that match\n // by exact node id.\n const decoderNodeId = await this.resolveDecoderNode(\n deviceId,\n pipelineAssignment.agentNodeId,\n );\n results.push({\n deviceId,\n decoderNodeId,\n pinned,\n reason: pinned ? \"manual\" : \"co-located\",\n });\n }\n return results;\n }\n\n // ── Audio scheduling cap methods ─────────────────────────────────────\n\n async assignAudio(input: {\n readonly deviceId: number;\n readonly nodeId: string;\n }): Promise<{ success: true }> {\n await this.ctx.settings?.writeDeviceStore(input.deviceId, {\n [AUDIO_NODE_SETTING]: input.nodeId,\n });\n // Clear cached assignment so next dispatch re-balances with the new pin.\n this.audioAssignments.delete(input.deviceId);\n this.audioNodeByDevice.delete(input.deviceId);\n this.ctx.logger.info(\"Audio node pinned\", {\n tags: { deviceId: input.deviceId, nodeId: input.nodeId },\n });\n return { success: true };\n }\n\n async unassignAudio(input: {\n readonly deviceId: number;\n }): Promise<{ success: true }> {\n await this.ctx.settings?.writeDeviceStore(input.deviceId, {\n [AUDIO_NODE_SETTING]: null,\n });\n this.audioAssignments.delete(input.deviceId);\n this.audioNodeByDevice.delete(input.deviceId);\n this.ctx.logger.info(\"Audio node unpinned\", {\n tags: { deviceId: input.deviceId },\n });\n return { success: true };\n }\n\n async getAudioAssignment(input: {\n readonly deviceId: number;\n }): Promise<{ nodeId: string; pinned: boolean; assignedAt: number } | null> {\n const a = this.audioAssignments.get(input.deviceId);\n return a ?? null;\n }\n\n async getAudioNodeLoad(): Promise<\n Array<{ nodeId: string; deviceCount: number }>\n > {\n return this.collectAudioNodeLoad();\n }\n\n async getAudioAssignments(): Promise<\n Array<{ deviceId: number; nodeId: string; pinned: boolean; assignedAt: number }>\n > {\n return [...this.audioAssignments.values()].map((a) => ({\n deviceId: a.deviceId,\n nodeId: a.nodeId,\n pinned: a.pinned,\n assignedAt: a.assignedAt,\n }));\n }\n\n // ── 3-level pipeline settings API (new model) ────────────────────────\n\n async getAgentSettings(input: {\n readonly agentNodeId: string;\n }): Promise<AgentPipelineSettings | null> {\n const all = await this.readAgentSettingsMap();\n return all[input.agentNodeId] ?? null;\n }\n\n async listAgentSettings(): Promise<\n readonly {\n readonly nodeId: string;\n readonly settings: AgentPipelineSettings;\n }[]\n > {\n const all = await this.readAgentSettingsMap();\n return (\n Object.entries(all)\n // Defensive filter: a prior bug could persist `\"\"` or `\"undefined\"`\n // as agent keys (writeAgentSettings used to accept any string).\n // Strip them here so UI consumers never see ghost entries.\n .filter(\n ([nodeId]) =>\n typeof nodeId === \"string\" &&\n nodeId.length > 0 &&\n nodeId !== \"undefined\" &&\n nodeId !== \"null\",\n )\n .map(([nodeId, settings]) => ({ nodeId, settings }))\n );\n }\n\n async setAgentAddonDefaults(input: {\n readonly agentNodeId: string;\n readonly defaults: Record<string, AgentAddonConfig>;\n }): Promise<{ success: true }> {\n const all = await this.readAgentSettingsMap();\n let existing = all[input.agentNodeId];\n if (!existing) {\n existing =\n (await this.seedAgentSettingsFromCatalog(input.agentNodeId)) ??\n undefined;\n }\n if (!existing) {\n // No catalog → persist a bare skeleton so the edit isn't lost.\n await this.writeAgentSettings(input.agentNodeId, {\n addonDefaults: { ...input.defaults },\n });\n } else {\n await this.writeAgentSettings(input.agentNodeId, {\n ...existing,\n addonDefaults: { ...existing.addonDefaults, ...input.defaults },\n });\n }\n this.ctx.logger.info(\"agentSettings.addonDefaults bulk-updated\", {\n tags: { nodeId: input.agentNodeId },\n meta: { entries: Object.keys(input.defaults).length },\n });\n this.catalogCache.clear();\n await this.redispatchCamerasOnAgent(input.agentNodeId);\n return { success: true as const };\n }\n\n async removeAgentSettings(input: {\n readonly agentNodeId: string;\n }): Promise<{ success: boolean; removed: boolean }> {\n if (input.agentNodeId === \"hub\") {\n this.ctx.logger.warn(\"removeAgentSettings: refused to evict 'hub'\", {});\n return { success: false, removed: false };\n }\n const all = await this.readAgentSettingsMap();\n if (!(input.agentNodeId in all)) {\n return { success: true, removed: false };\n }\n const { [input.agentNodeId]: _drop, ...rest } = all;\n await this.ctx.settings?.writeAddonStore({\n [AGENT_SETTINGS_KEY]: rest,\n });\n this.ctx.logger.info(\"agentSettings entry removed\", {\n tags: { nodeId: input.agentNodeId },\n });\n return { success: true, removed: true };\n }\n\n // Phase 2f: `setAgentEngineChoice` removed — engine ownership moved\n // to `detection-pipeline` addon global settings.\n\n async getCameraSettings(input: {\n readonly deviceId: number;\n }): Promise<CameraPipelineSettings | null> {\n const all = await this.readCameraSettingsMap();\n return all[String(input.deviceId)] ?? null;\n }\n\n async setCameraStepToggle(input: {\n readonly deviceId: number;\n readonly addonId: string;\n readonly enabled: boolean | null;\n }): Promise<{ success: true }> {\n const all = await this.readCameraSettingsMap();\n const key = String(input.deviceId);\n const existing = all[key] ?? {};\n const nextToggles = { ...(existing.stepToggles ?? {}) };\n if (input.enabled === null) {\n delete nextToggles[input.addonId];\n } else {\n nextToggles[input.addonId] = input.enabled;\n }\n const next: CameraPipelineSettings =\n Object.keys(nextToggles).length > 0\n ? { ...existing, stepToggles: nextToggles }\n : (() => {\n const { stepToggles: _drop, ...rest } = existing;\n return rest;\n })();\n await this.writeCameraSettings(input.deviceId, next);\n await this.emitResolvedCameraUpdated(input.deviceId);\n return { success: true as const };\n }\n\n async getCameraStepOverrides(input: {\n readonly deviceId: number;\n }): Promise<Record<string, Record<string, CameraStepOverridePatch>> | null> {\n const all = await this.readCameraSettingsMap();\n const settings = all[String(input.deviceId)];\n return settings?.stepOverridesByAgent ?? null;\n }\n\n async setCameraStepOverride(input: {\n readonly deviceId: number;\n readonly agentNodeId: string;\n readonly addonId: string;\n readonly patch: CameraStepOverridePatch | null;\n }): Promise<{ success: true }> {\n const all = await this.readCameraSettingsMap();\n const key = String(input.deviceId);\n const existing = all[key] ?? {};\n const byAgent = { ...(existing.stepOverridesByAgent ?? {}) };\n const forAgent = { ...(byAgent[input.agentNodeId] ?? {}) };\n\n if (input.patch === null) {\n delete forAgent[input.addonId];\n if (Object.keys(forAgent).length === 0) {\n delete byAgent[input.agentNodeId];\n } else {\n byAgent[input.agentNodeId] = forAgent;\n }\n } else {\n forAgent[input.addonId] = input.patch;\n byAgent[input.agentNodeId] = forAgent;\n }\n\n const hasOverrides = Object.keys(byAgent).length > 0;\n const next: CameraPipelineSettings = hasOverrides\n ? { ...existing, stepOverridesByAgent: byAgent }\n : (() => {\n const { stepOverridesByAgent: _drop, ...rest } = existing;\n return rest;\n })();\n await this.writeCameraSettings(input.deviceId, next);\n await this.emitResolvedCameraUpdated(input.deviceId);\n return { success: true as const };\n }\n\n async setCameraPipelineForAgent(input: {\n readonly deviceId: number;\n readonly agentNodeId: string;\n readonly pipeline: {\n steps: CameraPipelineConfig[\"steps\"];\n audio: { modelId: string; enabled: boolean } | null;\n } | null;\n }): Promise<{ success: true }> {\n const all = await this.readCameraSettingsMap();\n const key = String(input.deviceId);\n const existing = all[key] ?? {};\n const nextByAgent = { ...(existing.pipelineByAgent ?? {}) };\n if (input.pipeline === null) {\n delete nextByAgent[input.agentNodeId];\n } else {\n // Engine dropped — phase 2f: override runs under the agent's engine.\n nextByAgent[input.agentNodeId] = {\n steps: input.pipeline.steps,\n audio: input.pipeline.audio,\n };\n }\n const next: CameraPipelineSettings =\n Object.keys(nextByAgent).length > 0\n ? { ...existing, pipelineByAgent: nextByAgent }\n : (() => {\n const { pipelineByAgent: _drop, ...rest } = existing;\n return rest;\n })();\n await this.writeCameraSettings(input.deviceId, next);\n await this.emitResolvedCameraUpdated(input.deviceId);\n return { success: true as const };\n }\n\n async resolvePipeline(input: {\n readonly deviceId: number;\n readonly agentNodeId?: string;\n }): Promise<CameraPipelineConfig> {\n return this.resolvePipelineForDevice(input.deviceId, input.agentNodeId);\n }\n\n /** Emit `pipeline.camera-updated` carrying the freshly-resolved config. */\n private async emitResolvedCameraUpdated(deviceId: number): Promise<void> {\n const resolved = await this.resolvePipelineForDevice(deviceId);\n this.emitCameraUpdated(deviceId, resolved);\n }\n\n /** Re-dispatch every camera currently assigned to `nodeId` — used when agent defaults change. */\n private async redispatchCamerasOnAgent(nodeId: string): Promise<void> {\n const affected: number[] = [];\n for (const [deviceId, assignment] of this.assignments) {\n if (assignment.agentNodeId === nodeId) affected.push(deviceId);\n }\n if (affected.length === 0) return;\n this.ctx.logger.info(\"agentSettings change — hot-reloading cameras\", {\n tags: { nodeId },\n meta: { affected: affected.length },\n });\n for (const deviceId of affected) {\n await this.emitResolvedCameraUpdated(deviceId);\n }\n }\n\n async listTemplates(): Promise<readonly CameraPipelineTemplate[]> {\n const templates = await this.readTemplatesMap();\n return Object.values(templates)\n .slice()\n .sort((a, b) => a.name.localeCompare(b.name));\n }\n\n async saveTemplate(input: {\n readonly name: string;\n readonly description?: string;\n readonly config: CameraPipelineConfig;\n }): Promise<CameraPipelineTemplate> {\n const now = new Date().toISOString();\n const template: CameraPipelineTemplate = {\n id: this.generateTemplateId(),\n name: input.name,\n description: input.description,\n config: input.config,\n createdAt: now,\n updatedAt: now,\n };\n const templates = await this.readTemplatesMap();\n templates[template.id] = template;\n await this.ctx.settings?.writeAddonStore({ [TEMPLATES_KEY]: templates });\n this.ctx.logger.info(\"template saved\", {\n meta: { templateId: template.id, name: template.name },\n });\n return template;\n }\n\n async updateTemplate(input: {\n readonly id: string;\n readonly name?: string;\n readonly description?: string;\n readonly config?: CameraPipelineConfig;\n }): Promise<CameraPipelineTemplate> {\n const templates = await this.readTemplatesMap();\n const existing = templates[input.id];\n if (!existing)\n throw new Error(`updateTemplate: template '${input.id}' not found`);\n const next: CameraPipelineTemplate = {\n ...existing,\n ...(input.name !== undefined ? { name: input.name } : {}),\n ...(input.description !== undefined\n ? { description: input.description }\n : {}),\n ...(input.config !== undefined ? { config: input.config } : {}),\n updatedAt: new Date().toISOString(),\n };\n templates[input.id] = next;\n await this.ctx.settings?.writeAddonStore({ [TEMPLATES_KEY]: templates });\n return next;\n }\n\n async deleteTemplate(input: {\n readonly id: string;\n }): Promise<{ success: true }> {\n const templates = await this.readTemplatesMap();\n if (!templates[input.id]) {\n // Idempotent — deleting a template that doesn't exist is a no-op,\n // not an error. Caller logic (UI) can safely retry on flaky network.\n return { success: true as const };\n }\n delete templates[input.id];\n await this.ctx.settings?.writeAddonStore({ [TEMPLATES_KEY]: templates });\n this.ctx.logger.info(\"template deleted\", {\n meta: { templateId: input.id },\n });\n return { success: true as const };\n }\n\n // ── Pipeline store helpers (private) ──────────────────────────────\n\n /** Read the templates map from the addon store. */\n private async readTemplatesMap(): Promise<\n Record<string, CameraPipelineTemplate>\n > {\n const store = (await this.ctx.settings?.readAddonStore()) ?? {};\n const raw = store[TEMPLATES_KEY];\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return {};\n const out: Record<string, CameraPipelineTemplate> = {};\n for (const [key, value] of Object.entries(raw as Record<string, unknown>)) {\n if (this.isPipelineTemplate(value)) out[key] = value;\n }\n return out;\n }\n\n /** Emit the `pipeline.camera-updated` event so the internal subscriber hot-reloads the runner. */\n private emitCameraUpdated(\n deviceId: number,\n config: CameraPipelineConfig,\n ): void {\n const ctx = this.ctx;\n if (!ctx?.eventBus) return;\n this.ctx.eventBus.emit(\n createEvent(\n EventCategory.PipelineCameraUpdated,\n { type: \"device\", id: deviceId, nodeId: \"hub\" },\n { deviceId, config },\n ),\n );\n }\n\n // ── 3-level pipeline settings store (new model) ──────────────────────\n\n /** Read the `agentSettings` map (keyed on `nodeId`) from the addon store. */\n private async readAgentSettingsMap(): Promise<\n Record<string, AgentPipelineSettings>\n > {\n const store = (await this.ctx.settings?.readAddonStore()) ?? {};\n const raw = store[AGENT_SETTINGS_KEY];\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return {};\n return raw as Record<string, AgentPipelineSettings>;\n }\n\n /** Overwrite one agent's settings. Does NOT touch other agents' entries. */\n private async writeAgentSettings(\n nodeId: string,\n settings: AgentPipelineSettings,\n ): Promise<void> {\n // Reject malformed node ids so the persisted map never accumulates\n // ghost entries (root cause of the \"undefined\" ghost in the agent\n // dropdown).\n if (\n typeof nodeId !== \"string\" ||\n nodeId.length === 0 ||\n nodeId === \"undefined\" ||\n nodeId === \"null\"\n ) {\n this.ctx.logger.warn(\n \"writeAgentSettings: refusing to persist malformed nodeId\",\n { meta: { nodeId } },\n );\n return;\n }\n const all = await this.readAgentSettingsMap();\n all[nodeId] = settings;\n await this.ctx.settings?.writeAddonStore({ [AGENT_SETTINGS_KEY]: all });\n }\n\n /** Read the `cameraSettings` map (keyed on `deviceId` as string) from the addon store. */\n private async readCameraSettingsMap(): Promise<\n Record<string, CameraPipelineSettings>\n > {\n const store = (await this.ctx.settings?.readAddonStore()) ?? {};\n const raw = store[CAMERA_SETTINGS_KEY];\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return {};\n return raw as Record<string, CameraPipelineSettings>;\n }\n\n /** Overwrite one camera's settings. */\n private async writeCameraSettings(\n deviceId: number,\n settings: CameraPipelineSettings,\n ): Promise<void> {\n const all = await this.readCameraSettingsMap();\n all[String(deviceId)] = settings;\n await this.ctx.settings?.writeAddonStore({ [CAMERA_SETTINGS_KEY]: all });\n }\n\n /**\n * Fetch `pipelineExecutor.getSchema({nodeId})` through the standard cap\n * router, cached per `(nodeId, engineKey)` with a short TTL. Returns\n * `null` when the executor can't be reached (no runner yet attached)\n * — callers fall back to an empty pipeline in that case.\n */\n private async getCatalogForAgent(\n nodeId: string,\n engine?: PipelineEngineChoice,\n ): Promise<PipelineSchema | null> {\n const api = this.ctx.api;\n if (!api) return null;\n const engineKey = engine\n ? `${nodeId}::${engine.runtime}/${engine.backend}/${engine.format}`\n : `${nodeId}::*`;\n const now = Date.now();\n const hit = this.catalogCache.get(engineKey);\n if (hit && now - hit.at < PipelineOrchestratorAddon.CATALOG_CACHE_TTL_MS) {\n return hit.schema;\n }\n try {\n const schema = (await api.pipelineExecutor.getSchema.query({\n nodeId,\n })) as PipelineSchema;\n this.catalogCache.set(engineKey, { schema, at: now });\n return schema;\n } catch (err) {\n this.ctx.logger.debug(\"getCatalogForAgent failed\", {\n tags: { nodeId },\n meta: { error: errMsg(err) },\n });\n return null;\n }\n }\n\n /**\n * Ensure `agentSettings[nodeId]` exists and is up-to-date with the\n * current catalog. Triggered on orchestrator init (for the hub) and on\n * every `$node.connected` for remote runners.\n *\n * Behaviour:\n * - Fetch catalog for the node.\n * - Call `seedAgentAddonDefaults(current.addonDefaults, engine, catalog)` — preserves\n * operator customisations, adds missing addons, drops orphans.\n * - Persist if anything changed.\n *\n * Idempotent: a second call with the same catalog is a no-op.\n */\n private async seedAgentSettingsFromCatalog(\n nodeId: string,\n ): Promise<AgentPipelineSettings | null> {\n // Gate on pipeline-executor readiness — `acquireCapability` defaults\n // to Infinity timeout, so this blocks until the cap actually shows up.\n // No fallback to \"skip this node\" for cold starts: the orchestrator\n // would rather wait minutes than seed empty defaults.\n await this.ctx.acquireCapability(\"pipeline-executor\", { type: \"node\", nodeId });\n const catalog = await this.getCatalogForAgent(nodeId);\n if (!catalog) return null;\n const all = await this.readAgentSettingsMap();\n const existing = all[nodeId];\n const engine =\n (await this.readDetectionPipelineEngine(nodeId)) ??\n catalog.selectedEngine;\n const nextAddonDefaults = seedAgentAddonDefaults(\n existing?.addonDefaults ?? {},\n engine,\n catalog,\n );\n const next: AgentPipelineSettings = {\n addonDefaults: nextAddonDefaults,\n };\n const changed =\n !existing ||\n JSON.stringify(existing.addonDefaults) !==\n JSON.stringify(next.addonDefaults);\n if (changed) {\n await this.writeAgentSettings(nodeId, next);\n this.ctx.logger.info(\"agentSettings seeded/refreshed\", {\n tags: { nodeId },\n meta: {\n runtime: engine.runtime,\n backend: engine.backend,\n format: engine.format,\n addons: Object.keys(nextAddonDefaults).length,\n },\n });\n }\n return next;\n }\n\n // Phase 2f: `probeHwAccelForNode`, `setAgentHwAccel`, `reprobeAgentHwAccel`,\n // `emitAgentHwAccelChanged` removed. Hwaccel ownership moved to each\n // decoder addon — `api.decoder.reprobeHwaccel` handles re-probing and\n // the decoder addon's `globalSettings.hwaccel` carries the operator\n // choice. Decoder sessions read from their own addon settings at\n // `createSession` time, no orchestrator round-trip.\n\n /**\n * Fetch the engine triple (`runtime/backend/device`) from the\n * `detection-pipeline` addon's global settings on the target node.\n * This is the authoritative engine source since phase 2f. Returns\n * `null` when the addon hasn't responded yet or doesn't expose the\n * fields — callers fall back to `catalog.selectedEngine`.\n */\n private async readDetectionPipelineEngine(agentNodeId: string): Promise<PipelineEngineChoice | null> {\n const api = this.ctx.api as unknown as {\n addonSettings?: {\n getGlobalSettings: { query: (i: { addonId: string; nodeId?: string }) => Promise<{ sections: readonly { fields: readonly { key: string; value?: unknown }[] }[] } | null> }\n }\n } | undefined\n if (!api?.addonSettings) return null\n try {\n const schema = await api.addonSettings.getGlobalSettings.query({\n addonId: 'detection-pipeline',\n nodeId: agentNodeId,\n })\n if (!schema) return null\n const leaf = (key: string): unknown => {\n for (const s of schema.sections) for (const f of s.fields) if (f.key === key) return f.value\n return undefined\n }\n const runtime = leaf('engineRuntime')\n const backend = leaf('engineBackend')\n const device = leaf('engineDevice')\n if ((runtime !== 'python' && runtime !== 'node') || typeof backend !== 'string' || backend.length === 0) return null\n const format: PipelineEngineChoice['format'] =\n backend === 'coreml' ? 'coreml' :\n backend === 'openvino' ? 'openvino' :\n 'onnx'\n const base: PipelineEngineChoice = {\n runtime,\n backend,\n format,\n }\n if (typeof device === 'string' && device.length > 0) {\n const withDevice: PipelineEngineChoice = { ...base, device }\n return withDevice\n }\n return base\n } catch (err) {\n this.ctx.logger.debug('readDetectionPipelineEngine failed — falling back', {\n tags: { nodeId: agentNodeId },\n meta: { error: err instanceof Error ? err.message : String(err) },\n })\n return null\n }\n }\n\n /** Sleep helper used inside readiness retry loops. */\n private static sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, ms))\n\n /**\n * Resolve the pipeline for a device. NEVER returns an empty/fallback\n * config: if the catalog or agent settings aren't available yet, this\n * blocks (with backoff) until the detection-pipeline cap is registered\n * and a non-null catalog comes back. Cameras must never be dispatched\n * with `engine=node/cpu, steps=[]` because the runner then attaches\n * the camera with no steps and silently never recovers.\n *\n * Two legitimate exceptions to \"never empty\":\n * 1. The device's `detection-pipeline` binding is INACTIVE — the\n * operator explicitly turned inference off for this camera.\n * 2. `cam.pipelineByAgent[agentNodeId]` carries a saved wholesale\n * override with empty steps — also operator intent.\n *\n * Everything else (boot ordering, catalog cold-start, transient cap\n * registration delay) loops with backoff until the catalog responds.\n */\n private async resolvePipelineForDevice(\n deviceId: number,\n agentNodeIdOverride?: string,\n ): Promise<CameraPipelineConfig> {\n const agentNodeId =\n agentNodeIdOverride ??\n this.assignments.get(deviceId)?.agentNodeId ??\n this.localNodeId;\n\n // ── Operator-intent short-circuit: binding inactive ──\n if (!(await this.isDetectionPipelineActive(deviceId))) {\n // Even here we want a real engine choice — the runner's attach\n // payload still needs a runtime/backend label. Read the addon\n // engine, falling back to a wait+retry until it's available.\n const engine = await this.waitForEngine(agentNodeId);\n this.ctx.logger.info(\"resolvePipelineForDevice → empty (binding inactive)\", {\n tags: { deviceId, nodeId: agentNodeId },\n meta: { reason: \"detection-pipeline binding inactive\", engine: `${engine.runtime}/${engine.backend}` },\n });\n return { engine, steps: [], audio: null };\n }\n\n // ── Operator-intent short-circuit: saved wholesale config ──\n const cameraMap = await this.readCameraSettingsMap();\n const cam: CameraPipelineSettings | null = cameraMap[String(deviceId)] ?? null;\n const wholesale = cam?.pipelineByAgent?.[agentNodeId];\n if (wholesale) {\n const engine = await this.waitForEngine(agentNodeId);\n return {\n engine,\n steps: wholesale.steps,\n audio: wholesale.audio\n ? { engine, modelId: wholesale.audio.modelId, enabled: wholesale.audio.enabled }\n : null,\n };\n }\n\n // ── Catalog + agent path — block until both are available ──\n const { agent, catalog, engine } = await this.waitForAgentAndCatalog(agentNodeId);\n const resolved = resolvePipelinePure(agent, cam, agentNodeId, engine, catalog);\n if (resolved.steps.length === 0) {\n // Tree built from a populated agent.addonDefaults + catalog\n // returned 0 steps = operator disabled every addon. Honour intent.\n this.ctx.logger.info(\"resolvePipelineForDevice → empty (all addons disabled)\", {\n tags: { deviceId, nodeId: agentNodeId },\n meta: {\n addonDefaultsCount: Object.keys(agent.addonDefaults ?? {}).length,\n enabledInDefaults: Object.entries(agent.addonDefaults ?? {})\n .filter(([, cfg]) => cfg.enabled)\n .map(([id]) => id)\n .join(\",\"),\n catalogSlotCount: catalog.slots?.length ?? 0,\n },\n });\n }\n return resolved;\n }\n\n /**\n * Block until `pipeline-executor` is ready on `nodeId` AND\n * `getCatalogForAgent` returns a non-null catalog AND `agentSettings`\n * for that node has populated `addonDefaults`.\n *\n * `acquireCapability` defaults to infinite wait now — a single call\n * carries the readiness gate. The thin retry below only handles\n * the secondary case where the cap is \"ready\" but a derived call\n * (getSchema) still returns null due to Moleculer service-registry\n * propagation lag.\n */\n private async waitForAgentAndCatalog(\n nodeId: string,\n ): Promise<{\n agent: AgentPipelineSettings\n catalog: PipelineSchema\n engine: PipelineEngineChoice\n }> {\n await this.ctx.acquireCapability(\"pipeline-executor\", { type: \"node\", nodeId })\n while (true) {\n const catalog = await this.getCatalogForAgent(nodeId)\n if (!catalog) {\n await PipelineOrchestratorAddon.sleep(2_000)\n continue\n }\n let agent = (await this.readAgentSettingsMap())[nodeId]\n if (!agent || Object.keys(agent.addonDefaults ?? {}).length === 0) {\n const seeded = await this.seedAgentSettingsFromCatalog(nodeId)\n if (!seeded) {\n await PipelineOrchestratorAddon.sleep(2_000)\n continue\n }\n agent = seeded\n }\n const engine =\n (await this.readDetectionPipelineEngine(nodeId)) ?? catalog.selectedEngine\n return { agent, catalog, engine }\n }\n }\n\n /**\n * Block until a real engine choice is available. `acquireCapability`\n * defaults to infinite wait; the post-acquire loop only handles the\n * propagation gap where the cap is `ready` but the derived calls\n * still return null for a tick.\n */\n private async waitForEngine(nodeId: string): Promise<PipelineEngineChoice> {\n await this.ctx.acquireCapability(\"pipeline-executor\", { type: \"node\", nodeId })\n while (true) {\n const fromAddon = await this.readDetectionPipelineEngine(nodeId)\n if (fromAddon) return fromAddon\n const catalog = await this.getCatalogForAgent(nodeId)\n if (catalog?.selectedEngine) return catalog.selectedEngine\n await PipelineOrchestratorAddon.sleep(2_000)\n }\n }\n\n /**\n * Structural runtime check for `CameraPipelineConfig`. Persisted JSON\n * may be stale or partial across upgrades, so we gate reads on shape\n * rather than trusting the raw object. False = silently ignore that\n * entry and fall back to defaults — the orchestrator's job is to\n * never crash on corrupt store state.\n */\n private isCameraPipelineConfig(\n value: unknown,\n ): value is CameraPipelineConfig {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n const engine = v[\"engine\"];\n if (!engine || typeof engine !== \"object\") return false;\n const e = engine as Record<string, unknown>;\n if (typeof e[\"runtime\"] !== \"string\") return false;\n if (typeof e[\"backend\"] !== \"string\") return false;\n if (typeof e[\"format\"] !== \"string\") return false;\n if (!Array.isArray(v[\"steps\"])) return false;\n return true;\n }\n\n private isPipelineTemplate(value: unknown): value is CameraPipelineTemplate {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n return (\n typeof v[\"id\"] === \"string\" &&\n typeof v[\"name\"] === \"string\" &&\n typeof v[\"createdAt\"] === \"string\" &&\n typeof v[\"updatedAt\"] === \"string\" &&\n this.isCameraPipelineConfig(v[\"config\"])\n );\n }\n\n /**\n * Generate a short template id. Collision risk at N≤1000 templates is\n * effectively zero (12 hex chars = 48 bits of entropy). Not a UUID\n * because the persisted shape is a plain map keyed by id and shorter\n * keys keep the JSON compact.\n */\n private generateTemplateId(): string {\n const rand = Math.random().toString(36).slice(2, 8);\n const tick = Date.now().toString(36).slice(-6);\n return `tpl_${tick}${rand}`;\n }\n\n // NOTE — Phase 6 cleanup: the legacy cap methods\n // `getDeviceOrchestrationSettings`, `getDeviceOrchestrationOverrides`\n // and `getGlobalOrchestrationSettings`, along with their helpers\n // (`resolveGlobalSettings`, `projectResolvedKeys`, `projectOverrideKeys`,\n // `readDeviceOrchestrationOverrides`), have been removed. Consumers now\n // read per-device values via the standard 3-level resolver\n // `resolveAddonSettings(schema, global, device)` over the addon\n // config store — the same path every other addon uses. See\n // `DetectionWiringService.resolveDeviceSettings` for the canonical\n // consumer.\n\n // ── Standard ICamstackAddon — Phase 3 of settings redesign ───────────\n //\n // The orchestrator exposes two disjoint settings levels:\n //\n // ADDON LEVEL (getAddonSettings) — cluster-wide tunables that apply\n // to the orchestrator as a whole. Two sections: balancer + failover.\n // Edited in Pipeline → Cluster → Balancer / Failover tabs.\n //\n // DEVICE LEVEL (getDeviceSettings) — per-camera fields that drive the\n // detection wiring. Four sections: enables, source, routing, rates.\n // Edited in Camera → Device Overrides. Defaults are HARDCODED in the\n // schema — there is no cluster-wide editable default for these\n // fields. The \"no overlapping settings\" invariant of the redesign\n // means a key lives in exactly one schema; if a future need arises\n // for system-wide defaults, they would be added to the addon schema\n // under different keys (e.g. `defaultMotionFps`).\n //\n // Per-addon internal state (`nodeBindings`, `preferredAgent`) is also\n // persisted via the raw store accessors (readAddonStore /\n // writeAddonStore / readDeviceStore / writeDeviceStore) but is not part\n // of either schema — those keys are operational state, not user-facing\n // settings.\n\n /** Build the addon-level schema (cluster-wide tunables: balancer + failover). */\n protected globalSettingsSchema() {\n // Enumerate every runner-capable node currently visible to the\n // broker so the `enabledNodes` multiselect can offer a dynamic\n // option list. `hub` is always included because it is the only\n // node that is guaranteed to exist even on a single-node cluster,\n // and it is the default out-of-the-box enablement.\n return this.schema({\n sections: [\n // ── Cluster enablement ────────────────────────────────────────\n {\n id: \"cluster\",\n title: \"Cluster\",\n tab: \"pipeline\",\n description:\n \"Which cluster nodes are eligible to run the detection pipeline. Leave at least one node enabled — an empty list falls back to all online nodes so the pipeline never becomes completely unassignable.\",\n fields: [\n {\n key: \"enabledNodes\",\n type: \"node-multiselect\" as const,\n label: \"Enabled Detection Nodes\",\n description:\n \"Only the selected nodes are passed to the load balancer. Disabled nodes remain connected for other capabilities (metrics, logs, cluster-wide events) but will never receive camera assignments.\",\n default: [\"hub\"],\n showOffline: true,\n },\n {\n key: \"enabledDecoderNodes\",\n type: \"node-multiselect\" as const,\n label: \"Enabled Decoder Nodes\",\n description: \"Nodes eligible to run decoder sessions.\",\n default: [\"hub\"],\n showOffline: true,\n },\n {\n key: \"enabledAudioNodes\",\n type: \"node-multiselect\" as const,\n label: \"Enabled Audio Nodes\",\n description:\n \"Nodes eligible to run audio-analyzer sessions. Disabled nodes remain connected for other capabilities but will never receive audio assignments.\",\n default: [\"hub\"],\n showOffline: true,\n },\n ],\n },\n // ── Load Balancer ────────────────────────────────────────────\n {\n id: \"load\",\n title: \"Load Balancer\",\n tab: \"pipeline\",\n fields: [\n {\n key: \"brokerCallTimeoutMs\",\n type: \"slider\",\n label: \"Broker Call Timeout\",\n min: 1000,\n max: 60_000,\n step: 500,\n default: DEFAULT_BROKER_CALL_TIMEOUT_MS,\n showValue: true,\n unit: \"s\",\n displayScale: 1000,\n },\n {\n key: \"preferLocalProvider\",\n type: \"boolean\",\n label: \"Prefer Local Provider (zero-serialization fast path)\",\n default: true,\n },\n {\n key: \"fpsMinThreshold\",\n type: \"slider\",\n label: \"Min FPS Threshold\",\n description: \"Per-camera low-FPS load shedding. If a camera sustains FPS below this value for the duration set by 'Low FPS Window' below, it is paused (load-shed) and new dispatches are blocked. Auto-resumes with exponential backoff. 0 = disabled (default) — a single slow camera is never detached; only capacity-based placement applies.\",\n min: 0,\n max: 10,\n step: 1,\n default: PipelineOrchestratorAddon.DEFAULT_FPS_MIN_THRESHOLD,\n showValue: true,\n unit: \"fps\",\n },\n {\n key: \"fpsLowWindowMs\",\n type: \"slider\",\n label: \"Low FPS Window\",\n description: \"How long a camera must stay below the Min FPS Threshold before it is paused. Resets the moment FPS recovers above threshold. Larger values tolerate longer cold-start / GC stalls without false-killing the camera.\",\n min: 5_000,\n max: 600_000,\n step: 5_000,\n default: 60_000,\n showValue: true,\n unit: \"s\",\n displayScale: 1000,\n },\n ],\n },\n // ── Failover policy ───────────────────────────────────────────\n {\n id: \"failover\",\n title: \"Failover Policy\",\n fields: [\n {\n key: \"onDisconnect\",\n type: \"select\",\n label: \"On runner disconnect\",\n default: DEFAULT_FAILOVER_POLICY.onDisconnect,\n options: [\n { value: \"migrate\", label: \"Migrate non-pinned cameras\" },\n {\n value: \"leave-unassigned\",\n label: \"Leave all cameras unassigned\",\n },\n ],\n },\n {\n key: \"pinnedOnDisconnect\",\n type: \"select\",\n label: \"Pinned cameras on disconnect\",\n default: DEFAULT_FAILOVER_POLICY.pinnedOnDisconnect,\n options: [\n { value: \"leave-pinned\", label: \"Leave pinned, unassigned\" },\n { value: \"unpin-and-migrate\", label: \"Auto-unpin and migrate\" },\n ],\n },\n {\n key: \"onReconnect\",\n type: \"select\",\n label: \"On runner reconnect\",\n default: DEFAULT_FAILOVER_POLICY.onReconnect,\n options: [\n { value: \"restore\", label: \"Restore previous assignments\" },\n { value: \"rebalance\", label: \"Trigger full rebalance\" },\n ],\n },\n ],\n },\n ],\n });\n }\n\n /** Build the device-level schema (per-camera detection wiring). */\n protected deviceSettingsSchema() {\n // Per-concern sections tagged with well-known tab ids. The device-\n // manager aggregator groups every contributor's sections by `tab`,\n // so these fields show up on the Motion / Object Detection / Audio\n // / Pipeline tabs alongside contributions from motion-detection,\n // object-detection, audio-analyzer, etc. The orchestrator owns the\n // per-camera enable flags + stream-profile routing + dispatch\n // rates because those are orchestration-level decisions; addon-\n // specific tuning (thresholds, minArea, …) stays with each addon.\n return this.schema({\n sections: [\n // ── Motion tab ────────────────────────────────────────────────\n // Motion on/off lives in the `motion-detection` wrapper binding\n // (BindingsTab). This section only exposes the tuning knobs —\n // sources, stream profile, FPS, cooldown. See F15a.\n //\n // The cap-1:1 fields (motionSources, motionFps, detectionFps,\n // motionCooldownMs) are imported from the pipeline-runner cap\n // so a single change to defaults / ranges in the cap propagates\n // to both the wire schema AND the rendered UI. The\n // orchestrator only adds fields it owns directly:\n // - motionStreamProfile: transformed into motionStreamId\n // (string) before dispatch — not in the cap-wire schema.\n {\n id: \"motion-tuning\",\n title: \"\",\n tab: \"motion\",\n order: 0,\n fields: [\n ...RunnerCameraDeviceUIFields.filter((f) => f.key !== 'detectionFps'),\n {\n key: \"motionStreamProfile\",\n type: \"select\",\n label: \"Motion Stream (analyzer)\",\n default: \"low\",\n options: [\n { value: \"high\", label: \"High\" },\n { value: \"mid\", label: \"Medium\" },\n { value: \"low\", label: \"Low\" },\n ],\n // Analyzer-only — same gate as motionFps / motionCooldownMs.\n showWhen: { field: 'motionSources', includes: 'analyzer' },\n },\n ],\n },\n // ── Orchestrator: Object Detection ────────────────────────────\n {\n id: \"pipeline-object-detection\",\n title: \"Object Detection\",\n tab: \"pipeline\",\n order: 5,\n description:\n \"When the SW object detection pipeline (yolov9s, scrfd, …) runs for this camera. Wrappers stay bound regardless — the runner reads this mode at attach time to decide whether to pull the substream.\",\n fields: [\n {\n key: \"detectionMode\",\n type: \"select\",\n label: \"Object detection\",\n default: \"on-motion\",\n options: [\n { value: \"disabled\", label: \"Disabled\" },\n { value: \"always-on\", label: \"Always on\" },\n { value: \"on-motion\", label: \"On motion (firmware/PIR/SW)\" },\n ],\n },\n {\n key: \"detectionStreamProfile\",\n type: \"select\",\n label: \"Detection Stream\",\n default: \"low\",\n options: [\n { value: \"high\", label: \"High\" },\n { value: \"mid\", label: \"Medium\" },\n { value: \"low\", label: \"Low\" },\n ],\n showWhen: { field: 'detectionMode', notEquals: 'disabled' },\n },\n {\n key: \"detectionFps\",\n type: \"slider\",\n label: \"Detection FPS\",\n min: 0,\n max: 30,\n step: 1,\n default: 0,\n showValue: true,\n unit: \"fps\",\n description: \"0 = no throttle (decoder native rate)\",\n showWhen: { field: 'detectionMode', notEquals: 'disabled' },\n },\n ],\n },\n // ── Orchestrator: Audio classification ────────────────────────\n {\n id: \"pipeline-audio\",\n title: \"Audio classification\",\n tab: \"pipeline\",\n order: 6,\n description:\n \"When the audio classifier (apple-soundanalysis, etc.) runs for this camera. Default for battery cams: disabled (continuous audio holds the substream open).\",\n fields: [\n {\n key: \"audioMode\",\n type: \"select\",\n label: \"Audio classification\",\n default: \"always-on\",\n options: [\n { value: \"disabled\", label: \"Disabled\" },\n { value: \"always-on\", label: \"Always on\" },\n { value: \"on-motion\", label: \"On motion (firmware/PIR/SW)\" },\n ],\n },\n ],\n },\n // ── Orchestrator: Cluster Assignment ──────────────────────────\n {\n id: \"cluster-assignment\",\n title: \"Cluster Assignment\",\n tab: \"pipeline\",\n order: 10,\n fields: [\n {\n key: \"pipelineNodeId\",\n type: \"select\",\n label: \"Pipeline Node\",\n description:\n \"Which node runs the detection pipeline for this camera.\",\n options: [\n { value: \"auto\", label: \"Auto (load balanced)\" },\n ...this.collectRunnerNodeIds().map((id) => ({\n value: id,\n label: id,\n })),\n ],\n default: \"auto\",\n },\n {\n key: \"decoderNodeId\",\n type: \"select\",\n label: \"Decoder Node\",\n description:\n \"Which node decodes this camera stream. Auto prefers co-location with pipeline.\",\n options: [\n { value: \"auto\", label: \"Auto (prefer co-located)\" },\n ...this.collectDecoderNodeIds().map((id) => ({\n value: id,\n label: id,\n })),\n ],\n default: \"auto\",\n },\n {\n key: \"audioNodeId\",\n type: \"select\",\n label: \"Audio Node\",\n description:\n 'Which cluster node handles audio inference for this camera. \"Auto\" = load-balanced by the orchestrator.',\n options: [\n { value: \"auto\", label: \"Auto (load balanced)\" },\n ...this.collectAudioNodeIds().map((id) => ({\n value: id,\n label: id,\n })),\n ],\n default: \"auto\",\n },\n ],\n },\n ],\n });\n }\n\n // ── New three-level settings API (Phase 3 pilot) ─────────────────────\n\n async updateGlobalSettings(patch: Record<string, unknown>): Promise<void> {\n await this.ctx.settings!.writeAddonStore(patch);\n // Re-read full state and re-apply runtime tunables (balancer thresholds,\n // failover policy, broker timeout) so subsequent dispatches pick them up.\n const full = (await this.ctx.settings?.readAddonStore()) ?? {};\n this.globalSettings = { ...full };\n this.applyRuntimeSettings(full);\n\n // Clear load-shed state so suspended cameras get re-evaluated\n // with the new thresholds on the next dispatch cycle.\n const pausedIds = [...this.loadShedState.entries()]\n .filter(([, s]) => s.pausedAt !== null)\n .map(([id]) => id);\n if (pausedIds.length > 0) {\n this.loadShedState.clear();\n this.ctx.logger.info('Settings updated — cleared load-shed pauses, re-dispatching cameras', {\n meta: { deviceIds: pausedIds },\n });\n for (const deviceId of pausedIds) {\n void this.redispatchSingleCamera(deviceId).catch(() => { /* best-effort */ });\n }\n }\n }\n\n private async writeDeviceOrchestratorSettings(\n deviceId: number,\n patch: Record<string, unknown>,\n ): Promise<void> {\n await this.ctx.settings!.writeDeviceStore(deviceId, patch);\n this.ctx.eventBus.emit(\n createEvent(\n EventCategory.OrchestrationSettingsUpdated,\n { type: \"device\", id: deviceId, nodeId: \"hub\" },\n { deviceId },\n ),\n );\n }\n\n // ── Device-details aggregator contribution (pipeline-orchestrator cap) ──\n //\n // Contributes the pipeline routing tab (enables + source + routing +\n // rates) for every camera. Live contribution exposes the current\n // assignment (runner nodeId) and the cached metrics snapshot so the\n // device-details page can show where the camera is being processed\n // right now without an extra round-trip to pipeline-runner.\n\n async getDeviceSettingsContribution(input: {\n deviceId: number;\n }): Promise<ConfigUISchemaWithValues | null> {\n // Camera-only — pipeline routing / motion / zones are meaningless\n // on Lights / Switches / Sensors / Buttons. Source-side gate keeps\n // the policy with the addon owning the cap; the admin-ui no longer\n // needs the `device-section-policy` allow-list to drop these\n // sections after the fact.\n if (!(await this.isCameraDevice(input.deviceId))) return null\n const raw =\n (await this.ctx.settings?.readDeviceStore(input.deviceId)) ?? {};\n const schema = this.deviceSettingsSchema();\n if (!schema) return null;\n\n // ── Onboard motion default reflection ───────────────────────────\n //\n // `resolveDeviceDetectionSettings` already prefers `['onboard']` for\n // devices whose driver registered a native `motion`/`native-object-\n // detection` cap (Reolink Baichuan, Hikvision alarm-stream VMD).\n // The form, though, hydrates from device-store ∪ schema-default —\n // when the operator hasn't explicitly saved a value, the static\n // schema default `['analyzer']` wins and the form lies about which\n // source is active. Mirror the runtime resolution into `raw` so\n // both the displayed default AND the runtime call line up.\n const hasOnboardMotion = await this.deviceHasOnboardMotionCap(input.deviceId)\n const rawWithDefaults = raw[\"motionSources\"] === undefined && hasOnboardMotion\n ? { ...raw, motionSources: [\"onboard\"] }\n : raw;\n\n // L2.5 redesign: the legacy `pipeline-editor` ConfigField contribution\n // is removed — the per-camera pipeline surface now lives on the\n // top-level Device → Pipeline tab (`DeviceStepOverrideTab`, master-\n // detail with per-agent per-step overrides). Keeping both surfaces\n // duplicated the editor inside Config → Pipeline and confused\n // operators about which one was authoritative. Only the base\n // device-settings sections (classifier overrides, detection toggles,\n // …) flow through here now; pipeline tree + engine live in the\n // dedicated tab.\n const baseSections: readonly ConfigSectionWithValues[] = hydrateSchema(\n {\n ...schema,\n sections: schema.sections.map((s) => ({\n ...s,\n tab: s.tab ?? \"pipeline\",\n })),\n },\n rawWithDefaults,\n ).sections;\n // Zones tab is contributed declaratively here: a `top-tab` section\n // hoists into the device-detail tab bar, keyed by tab id `zones`\n // (well-known tab → label \"Zones\", icon \"shapes\"). The single\n // `widget` field is resolved by the shared `WidgetSlot` runtime\n // against the orchestrator-shipped `zone-editor` widget bundle —\n // orchestrator just declares intent, not the React component.\n const zonesSection: ConfigSectionWithValues = {\n id: \"zones\",\n title: \"Detection Zones\",\n tab: \"zones\",\n location: \"top-tab\",\n // Single full-width column — the zone-editor widget paints the\n // polygon canvas + side panel + rules + occupancy across the\n // entire viewport. Default 2-column grid would clip everything to\n // 50% width.\n columns: 1,\n order: 0,\n fields: [\n {\n type: \"widget\",\n key: \"zones\",\n label: \"Detection Zones\",\n widgetId: \"pipeline-orchestrator/zone-editor\",\n // Span across the (single) column so even if a layout engine\n // were to compute multiple columns, the field still pulls full\n // width.\n span: 1,\n },\n ],\n };\n // Motion-zones is no longer contributed here — the `motion-zones`\n // cap declares a `ui` block, so its config UI is surfaced\n // automatically by the cap-UI contribution mechanism (ConfigTab →\n // admin-ui UI_COMPONENTS). No per-addon widget wiring.\n\n // ── Onboard object detection toggle ─────────────────────────────\n //\n // Shown only when the camera has a native `native-object-detection`\n // binding (e.g. Reolink Baichuan cameras). The current value comes\n // from the cap's kernel-persisted runtimeState — the orchestrator\n // never holds a divergent copy. On save, `applyDeviceSettingsPatch`\n // routes this key directly to `nativeObjectDetection.setEnabled`.\n const hasNativeObjectDetection =\n await this.deviceHasNativeObjectDetectionCap(input.deviceId);\n const nativeObjectDetectionSections: ConfigSectionWithValues[] = [];\n if (hasNativeObjectDetection) {\n let nativeObjectDetectionEnabled = true; // default-on matches cold-start\n try {\n const status = await this.ctx.api?.nativeObjectDetection.getStatus.query({\n deviceId: input.deviceId,\n });\n if (status !== undefined && status !== null && \"enabled\" in status) {\n nativeObjectDetectionEnabled = Boolean(\n (status as { enabled: unknown }).enabled,\n );\n }\n } catch {\n // Best-effort — if the cap isn't registered yet (e.g. device offline),\n // default-on preserves existing forwarding behaviour.\n }\n nativeObjectDetectionSections.push({\n id: \"onboard-object-detection\",\n title: \"Onboard Object Detection\",\n tab: \"motion\",\n order: 10,\n fields: [\n {\n type: \"boolean\",\n key: \"nativeObjectDetectionEnabled\",\n label: \"Use onboard object detection\",\n description:\n \"When enabled, AI detections from the camera firmware are forwarded to the system notification and recording pipeline. Onboard motion events are never suppressed.\",\n default: true,\n immediate: true,\n value: nativeObjectDetectionEnabled,\n },\n ],\n });\n }\n\n return {\n sections: [...baseSections, zonesSection, ...nativeObjectDetectionSections],\n };\n }\n\n // `getCameraPipelineWithFallback` was a thin wrapper over\n // `resolvePipelineForDevice` — the remaining caller was inlined when\n // the device-overrides surface moved to pipelineByAgent, leaving a\n // dead private helper. Removed to keep the class trim.\n\n // `loadEditorCatalog` removed — the catalog is now lazy-loaded by\n // the renderer via `AsyncResolverRef`. The contribution only carries\n // a pointer (`catalogResolver`) + the `nodeId` that scopes it, so the\n // orchestrator no longer issues a `getSchema` query per camera view.\n\n async getDeviceLiveContribution(input: {\n deviceId: number;\n }): Promise<ConfigUISchemaWithValues | null> {\n const assignment = this.assignments.get(input.deviceId);\n if (!assignment) return null;\n return {\n sections: [\n {\n id: \"orchestrator-live\",\n title: \"Pipeline Status\",\n tab: \"pipeline\",\n order: 100,\n fields: [\n {\n type: \"text\",\n key: \"assignedRunner\",\n label: \"Assigned Runner\",\n readonlyField: true,\n value: assignment.agentNodeId,\n },\n {\n type: \"text\",\n key: \"assignmentReason\",\n label: \"Assignment Reason\",\n readonlyField: true,\n value: assignment.pinned ? \"pinned\" : assignment.reason,\n },\n ],\n },\n ],\n };\n }\n\n /**\n * Best-effort camera-type check used to gate the settings/live\n * contributions on non-camera devices (Lights, Switches, Sensors,\n * Buttons). Returns `true` on lookup failure so a transient\n * device-manager hiccup never silently hides legitimate camera\n * sections.\n */\n private async isCameraDevice(deviceId: number): Promise<boolean> {\n const api = this.ctx?.api\n if (!api) return true\n try {\n const dev = await api.deviceManager.getDevice.query({ deviceId })\n if (!dev) return true\n return (dev as { type?: string }).type === DeviceType.Camera\n } catch {\n return true\n }\n }\n\n async applyDeviceSettingsPatch(input: {\n deviceId: number;\n patch: Record<string, unknown>;\n }): Promise<{ success: true }> {\n // Split the incoming patch: pipeline-config keys land in the\n // 3-level `cameraSettings[deviceId].pipelineByAgent[agent]` store\n // (stateless pipeline model — content owned by the orchestrator),\n // everything else goes through the device store for the detection-\n // wiring fields (motion/detection toggles, stream profiles, rates,\n // camera priority, pipelineNodeId / decoderNodeId pins).\n const { pipelinePatch, rest } = this.splitPipelinePatch(input.patch);\n\n // Route `nativeObjectDetectionEnabled` directly to the cap's\n // `setEnabled` mutation. The cap runtimeState is the single source\n // of truth — never persist a divergent copy in the orchestrator store.\n const { nativeObjectDetectionEnabled, ...orchestratorRest } = rest;\n if (nativeObjectDetectionEnabled !== undefined) {\n try {\n await this.ctx.api?.nativeObjectDetection.setEnabled.mutate({\n deviceId: input.deviceId,\n enabled: Boolean(nativeObjectDetectionEnabled),\n });\n } catch (err: unknown) {\n this.ctx.logger.warn(\"Failed to route nativeObjectDetectionEnabled to cap\", {\n tags: { deviceId: input.deviceId },\n meta: { error: err instanceof Error ? err.message : String(err) },\n });\n }\n }\n\n if (Object.keys(pipelinePatch).length > 0) {\n await this.applyPipelinePatch(input.deviceId, pipelinePatch);\n }\n if (Object.keys(orchestratorRest).length > 0) {\n await this.writeDeviceOrchestratorSettings(input.deviceId, orchestratorRest);\n }\n return { success: true as const };\n }\n\n /**\n * Peel the pipeline-config keys out of an inbound patch. The remaining\n * patch is forwarded to the existing device-level store writer. JSON\n * textarea values are parsed here — `FormBuilder` serialises JSON\n * editors as strings on submit, so the cap boundary has to reverse it\n * before the content lands in the typed pipelines map.\n */\n private splitPipelinePatch(patch: Record<string, unknown>): {\n pipelinePatch: Partial<\n Record<(typeof PIPELINE_PATCH_KEYS)[number], unknown>\n >;\n rest: Record<string, unknown>;\n } {\n const pipelinePatch: Partial<\n Record<(typeof PIPELINE_PATCH_KEYS)[number], unknown>\n > = {};\n const rest: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(patch)) {\n if ((PIPELINE_PATCH_KEYS as readonly string[]).includes(key)) {\n // Reverse the textarea-isJson serialisation. Parse is tolerant\n // — a string that isn't valid JSON is passed through so the\n // validation below can reject it with context.\n pipelinePatch[key as (typeof PIPELINE_PATCH_KEYS)[number]] =\n typeof value === \"string\" ? this.tryParseJson(value) : value;\n } else {\n rest[key] = value;\n }\n }\n return { pipelinePatch, rest };\n }\n\n /**\n * Apply a `cameraPipeline` patch emitted by the `pipeline-editor`\n * ConfigField. Routes the full `CameraPipelineConfig` into the\n * 3-level `cameraSettings[deviceId].pipelineByAgent[agent]` store.\n * The target agent is the camera's current assignment (or the local\n * hub when unassigned). Emits `pipeline.camera-updated` so the\n * internal subscriber hot-reloads the runner.\n */\n private async applyPipelinePatch(\n deviceId: number,\n pipelinePatch: Partial<\n Record<(typeof PIPELINE_PATCH_KEYS)[number], unknown>\n >,\n ): Promise<void> {\n const incoming = pipelinePatch.cameraPipeline;\n if (incoming === undefined) return;\n if (!this.isCameraPipelineConfig(incoming)) {\n throw new Error(\n `applyPipelinePatch: cameraPipeline value for device ${deviceId} is not a valid CameraPipelineConfig ` +\n \"(expected { engine:{runtime,backend,format}, steps:[], audio?:null|object })\",\n );\n }\n const agentNodeId =\n this.assignments.get(deviceId)?.agentNodeId ?? this.localNodeId;\n await this.setCameraPipelineForAgent({\n deviceId,\n agentNodeId,\n pipeline: {\n steps: incoming.steps,\n audio: incoming.audio\n ? { modelId: incoming.audio.modelId, enabled: incoming.audio.enabled }\n : null,\n },\n });\n this.emitCameraUpdated(deviceId, incoming);\n }\n\n /** Tolerant JSON parser used to round-trip textarea-isJson fields. */\n private tryParseJson(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n\n /**\n * Apply the subset of global settings that affect runtime behaviour\n * (balancer thresholds, broker timeout, failover policy) into the\n * in-memory state so subsequent `balance()` / `handleNodeDisconnect`\n * calls use the new values immediately.\n */\n private applyRuntimeSettings(config: Record<string, unknown>): void {\n this.failoverPolicy = {\n onDisconnect:\n config[\"onDisconnect\"] === \"leave-unassigned\"\n ? \"leave-unassigned\"\n : \"migrate\",\n pinnedOnDisconnect:\n config[\"pinnedOnDisconnect\"] === \"unpin-and-migrate\"\n ? \"unpin-and-migrate\"\n : \"leave-pinned\",\n onReconnect:\n config[\"onReconnect\"] === \"rebalance\" ? \"rebalance\" : \"restore\",\n };\n // `enabledNodes` whitelist.\n //\n // First-boot (raw addon store with no key) → fall back to the\n // schema default `['hub']`. `applyRuntimeSettings` receives the\n // RAW store content (no schema hydration upstream), so if we\n // treated an absent key as an empty whitelist, `collectAgentLoad`\n // would skip every node — including hub — and the Live load\n // panel would permanently show 0/0 on a fresh install.\n //\n // Non-array value → empty list. Protects against corrupt persisted\n // content without silently falling back to full cluster.\n //\n // Forked child nodeIds (e.g. `hub/classifier`, `agent-1/motion-wasm`)\n // are internal isolated-process ids, never dispatchable pipeline\n // runners. Drop any `/`-bearing entry on load — protects against\n // stale persisted values from earlier versions that didn't filter\n // them at write time.\n const rawEnabled = config[\"enabledNodes\"];\n this.enabledNodes =\n rawEnabled === undefined\n ? [\"hub\"]\n : Array.isArray(rawEnabled)\n ? rawEnabled.filter(\n (v): v is string => typeof v === \"string\" && !v.includes(\"/\"),\n )\n : [];\n const rawEnabledDecoder = config[\"enabledDecoderNodes\"];\n this.enabledDecoderNodes =\n rawEnabledDecoder === undefined\n ? [\"hub\"]\n : Array.isArray(rawEnabledDecoder)\n ? rawEnabledDecoder.filter(\n (v): v is string => typeof v === \"string\" && !v.includes(\"/\"),\n )\n : [\"hub\"];\n const rawEnabledAudio = config[\"enabledAudioNodes\"];\n this.enabledAudioNodes =\n rawEnabledAudio === undefined\n ? [\"hub\"]\n : Array.isArray(rawEnabledAudio)\n ? rawEnabledAudio.filter(\n (v): v is string => typeof v === \"string\" && !v.includes(\"/\"),\n )\n : [\"hub\"];\n }\n\n // ==========================================================================\n // Detection wiring handlers (moved from kernel DetectionWiringService)\n // ==========================================================================\n\n private get api() {\n return this.ctx.api ?? null;\n }\n\n /**\n * Resolve this addon's own per-device detection settings — combines the\n * raw device store with the device schema defaults via `hydrateSchema()`,\n * then narrows to a typed DTO. Replaces the old call to\n * `this.ctx.settings!.getDevice` which used the deleted multi-level resolver\n * (the new model has no overlap between addon-level and device-level\n * keys, so there's no merge across levels — only schema defaults are\n * applied to fill in keys missing from the device store).\n */\n\n /**\n * True when `capName` is bound (`kind:'wrapped'`) for `deviceId` via\n * `device-manager.getBindings`. Single source of truth for the\n * \"binding-gated cap\" checks sprinkled around this addon (detection\n * pipeline, audio analysis, …). Failures log-and-return `true` — the\n * safe default is \"cap on\" unless the operator has explicitly toggled\n * the wrapper off via `device-manager.setWrapperActive`.\n */\n private async isCapActiveForDevice(\n deviceId: number,\n capName: string,\n ): Promise<boolean> {\n const api = this.api;\n if (!api) return true;\n try {\n const bindings = await api.deviceManager.getBindings.query({ deviceId });\n return bindings.entries.some(\n (e) => e.capName === capName && e.kind === \"wrapped\",\n );\n } catch (err: unknown) {\n this.ctx.logger.warn(\"binding lookup failed — defaulting cap:active\", {\n tags: { deviceId },\n meta: { capName, error: errMsg(err) },\n });\n return true;\n }\n }\n\n private isDetectionPipelineActive(deviceId: number): Promise<boolean> {\n return this.isCapActiveForDevice(deviceId, \"detection-pipeline\");\n }\n\n private isAudioAnalysisActive(deviceId: number): Promise<boolean> {\n return this.isCapActiveForDevice(deviceId, \"audio-analysis\");\n }\n\n private isMotionDetectionActive(deviceId: number): Promise<boolean> {\n return this.isCapActiveForDevice(deviceId, \"motion-detection\");\n }\n\n /**\n * Resolve the device's feature array. Used by the resolver to pick\n * the right `DeviceProfile` when computing per-camera scheduling\n * defaults. Reads via the `device-manager.getDevice` cap because the\n * orchestrator may run on a different node from the live IDevice;\n * the live registry isn't available cross-process.\n */\n private async lookupDeviceFeatures(deviceId: number): Promise<readonly string[]> {\n const api = this.api;\n if (!api) return [];\n try {\n const dev = await api.deviceManager.getDevice.query({ deviceId });\n return dev?.features ?? [];\n } catch {\n return [];\n }\n }\n\n /**\n * True when the device has a native `motion` or `native-object-detection`\n * cap registered by its driver — i.e. the camera does motion detection\n * itself (Reolink Baichuan onboard PIR, ONVIF event-driven, etc.).\n * Drives the dynamic `motionSources` default in\n * `resolveDeviceDetectionSettings`: when the operator hasn't pinned a\n * value, `['onboard']` is preferred over `['analyzer']` so we don't\n * burn CPU running a redundant motion pipeline.\n *\n * Detection is via `device-manager.getBindings`: any binding entry of\n * kind `'native'` whose capName is `motion` or\n * `native-object-detection` qualifies. Failures default to `false` so\n * we err toward the analyzer (never lose detection coverage when the\n * binding lookup hiccups).\n */\n private async deviceHasOnboardMotionCap(deviceId: number): Promise<boolean> {\n const api = this.api;\n if (!api) return false;\n try {\n const bindings = await api.deviceManager.getBindings.query({ deviceId });\n return bindings.entries.some(\n (e) =>\n e.kind === \"native\" &&\n (e.capName === \"motion\" || e.capName === \"native-object-detection\"),\n );\n } catch {\n return false;\n }\n }\n\n /**\n * Returns true when the camera has a native `native-object-detection`\n * binding (i.e. the driver registered the cap). Used to gate the\n * \"Use onboard object detection\" toggle in `getDeviceSettingsContribution`.\n */\n private async deviceHasNativeObjectDetectionCap(deviceId: number): Promise<boolean> {\n const api = this.api;\n if (!api) return false;\n try {\n const bindings = await api.deviceManager.getBindings.query({ deviceId });\n return bindings.entries.some(\n (e) => e.kind === \"native\" && e.capName === \"native-object-detection\",\n );\n } catch {\n return false;\n }\n }\n\n private async resolveDeviceDetectionSettings(deviceId: number): Promise<{\n readonly motionDetectionEnabled: boolean;\n readonly pipelineEnabled: boolean;\n readonly motionSources: MotionSources;\n readonly motionStreamProfile: \"high\" | \"mid\" | \"low\";\n readonly detectionStreamProfile: \"high\" | \"mid\" | \"low\";\n readonly motionFps: number;\n readonly detectionFps: number;\n readonly motionCooldownMs: number;\n readonly detectionMode: PipelinePhaseMode;\n readonly audioMode: PipelinePhaseMode;\n readonly onboardMotionDrivesAnalyzer: boolean;\n } | null> {\n // Note: `motionDetectionEnabled` is derived from the motion-detection\n // wrapper binding (F15a). Kept as a field on the resolved struct so\n // every consumer (detection config builder + dispatch path) sees a\n // single snapshot per call, matching the pipelineEnabled pattern\n // introduced in F3b.\n const ctx = this.ctx;\n if (!ctx?.settings) {\n return null;\n }\n let raw: Record<string, unknown>;\n try {\n raw = await this.ctx.settings!.readDeviceStore(deviceId);\n } catch (err: unknown) {\n const msg = errMsg(err);\n this.ctx.logger.error(\"resolveDeviceDetectionSettings failed\", {\n tags: { deviceId },\n meta: { error: msg },\n });\n return null;\n }\n\n // Hydrate the raw store with the device schema defaults so missing\n // keys (cameras with no overrides yet) come back populated. After\n // hydration, every leaf field has a `value`.\n const hydrated = hydrateSchema(this.deviceSettingsSchema()!, raw);\n const flat: Record<string, unknown> = {};\n for (const section of hydrated.sections) {\n for (const field of section.fields) {\n if (\n field.type === \"separator\" ||\n field.type === \"info\" ||\n field.type === \"button\"\n )\n continue;\n if (field.type === \"group\") continue; // device schema has no groups today\n flat[field.key] = (field as { readonly value: unknown }).value;\n }\n }\n\n const mustString = (key: string): string => {\n const v = flat[key];\n if (typeof v !== \"string\")\n throw new Error(\n `orchestrator schema missing required string '${key}' for device ${deviceId}`,\n );\n return v;\n };\n const mustNumber = (key: string): number => {\n const v = flat[key];\n if (typeof v !== \"number\")\n throw new Error(\n `orchestrator schema missing required number '${key}' for device ${deviceId}`,\n );\n return v;\n };\n try {\n // Motion sources default resolution:\n // 1. If the user explicitly set `motionSources` in the device\n // store, honour it as-is.\n // 2. Otherwise — when the device has registered a native\n // `motion` cap via its driver (Reolink Baichuan, ONVIF\n // onboard PIR, etc.) — default to ['onboard'] so the\n // pipeline uses the camera's own sensor instead of running\n // a wasm/CPU motion analyzer redundantly.\n // 3. Falls back to the schema default (['analyzer']) when\n // neither condition holds.\n // The \"user explicitly set\" check reads `raw` (the device store)\n // because `flat` is always populated by `hydrateSchema` — once\n // the schema default fires we can't tell user-choice from\n // default-fired.\n // Resolve the device profile (battery / future low-bandwidth /\n // always-on-AC) once so we can layer profile defaults under the\n // operator's persisted choices. Profile defaults fire only when\n // the operator hasn't picked a value — concrete operator entries\n // in the device store always win.\n const features = await this.lookupDeviceFeatures(deviceId);\n const profile = resolveDeviceProfile(features);\n\n // Universal motion-source default: operator-set value wins; else\n // prefer firmware/onboard motion when the device exposes the cap;\n // else fall back to the SW analyzer.\n //\n // The \"onboard preferred\" rule is cross-profile, not battery-\n // specific — non-battery cams with firmware motion (Reolink RLC-X\n // wired, ONVIF analytics, Frigate event-driven) also default to\n // `['onboard']` so we don't burn CPU running a redundant SW\n // analyzer.\n //\n // Battery cams without firmware motion get `[]` instead of\n // `['analyzer']` because running SW motion on a battery cam\n // would hold the substream open continuously and defeat the\n // sleep cycle. Operator opts into `'analyzer'` explicitly.\n const userMotionSources = raw[\"motionSources\"]\n let motionSources: MotionSources\n if (userMotionSources !== undefined) {\n motionSources = MotionSourcesSchema.parse(userMotionSources)\n } else if (await this.deviceHasOnboardMotionCap(deviceId)) {\n motionSources = [\"onboard\"]\n } else if (profile && features.includes(DeviceFeature.BatteryOperated)) {\n motionSources = []\n } else {\n motionSources = MotionSourcesSchema.parse(flat[\"motionSources\"]);\n }\n // pipelineEnabled is no longer a device-settings field — derives\n // from the detection-pipeline binding. See isCapActiveForDevice.\n const pipelineEnabled = await this.isDetectionPipelineActive(deviceId);\n // motionDetectionEnabled derives from the motion-detection wrapper\n // binding (F15a). No longer read from the device-settings schema.\n const motionDetectionEnabled = await this.isMotionDetectionActive(\n deviceId,\n );\n\n // Mode resolution: operator-set value wins; profile default\n // fires when the operator hasn't picked; static fallback when\n // neither matches.\n const userDetectionMode = raw[\"detectionMode\"]\n const detectionMode: PipelinePhaseMode = (typeof userDetectionMode === 'string' && isPipelinePhaseMode(userDetectionMode))\n ? userDetectionMode\n : (profile?.defaults.detectionMode ?? 'on-motion')\n const userAudioMode = raw[\"audioMode\"]\n const audioMode: PipelinePhaseMode = (typeof userAudioMode === 'string' && isPipelinePhaseMode(userAudioMode))\n ? userAudioMode\n : (profile?.defaults.audioMode ?? 'always-on')\n\n // Operator-set value wins; default true when unset.\n const userOnboardMotionDrivesAnalyzer = raw[\"onboardMotionDrivesAnalyzer\"]\n const onboardMotionDrivesAnalyzer: boolean =\n typeof userOnboardMotionDrivesAnalyzer === 'boolean'\n ? userOnboardMotionDrivesAnalyzer\n : true\n\n return {\n motionDetectionEnabled,\n pipelineEnabled,\n motionSources,\n motionStreamProfile: mustString(\"motionStreamProfile\") as\n | \"high\"\n | \"mid\"\n | \"low\",\n detectionStreamProfile: mustString(\"detectionStreamProfile\") as\n | \"high\"\n | \"mid\"\n | \"low\",\n motionFps: mustNumber(\"motionFps\"),\n detectionFps: mustNumber(\"detectionFps\"),\n motionCooldownMs: mustNumber(\"motionCooldownMs\"),\n detectionMode,\n audioMode,\n onboardMotionDrivesAnalyzer,\n };\n } catch (err: unknown) {\n const msg = errMsg(err);\n this.ctx.logger.error(\"resolveDeviceDetectionSettings narrowing failed\", {\n tags: { deviceId },\n meta: { error: msg },\n });\n return null;\n }\n }\n\n /**\n * True when the device has registered a native `motion` or\n * `native-object-detection` cap provider — i.e. the camera's driver\n * addon does motion detection on the device itself. Drives the\n * dynamic motionSource default in `resolveDeviceDetectionSettings`.\n * Each lookup is isolated: a throw for one cap (legitimate \"no\n * provider registered\" from the registry) must not mask the presence\n * of the other cap.\n */\n\n /**\n * Resolve the requested profile against the set of currently-assigned\n * profile slots. Returns the profile id itself if the slot is live;\n * otherwise walks the quality chain so a device missing the requested\n * profile still gets a detection subscription on the closest assigned\n * slot. Returns `null` only when nothing is assigned.\n */\n private resolveAssignedProfile(\n assigned: ReadonlyMap<CamProfile, string>,\n profile: CamProfile,\n ): CamProfile | null {\n if (assigned.has(profile)) return profile;\n if (profile === \"low\") {\n if (assigned.has(\"mid\")) return \"mid\";\n if (assigned.has(\"high\")) return \"high\";\n return null;\n }\n if (profile === \"high\") {\n if (assigned.has(\"mid\")) return \"mid\";\n if (assigned.has(\"low\")) return \"low\";\n return null;\n }\n if (assigned.has(\"high\")) return \"high\";\n if (assigned.has(\"low\")) return \"low\";\n return null;\n }\n\n /**\n * Fetch the current profile-slot map for a device from the system\n * stream-broker cap (`listAllProfileSlots`). Returns a map of\n * `CamProfile → sourceCamStreamId` so callers can both check which\n * profiles are live AND resolve a profile to the cam-stream-keyed\n * brokerId (`${deviceId}/${camStreamId}`) used by the broker.\n */\n private async fetchAssignedProfiles(\n deviceId: number,\n ): Promise<ReadonlyMap<CamProfile, string>> {\n const api = this.api;\n if (!api) return new Map();\n try {\n const slots: readonly ProfileSlot[] = await api.streamBroker.listAllProfileSlots.query();\n const out = new Map<CamProfile, string>();\n for (const slot of slots) {\n if (slot.deviceId !== deviceId) continue;\n if (slot.sourceCamStreamId === null) continue;\n out.set(slot.profile, slot.sourceCamStreamId);\n }\n return out;\n } catch {\n return new Map();\n }\n }\n\n /**\n * Build a `CameraDetectionConfig` from the resolved per-device\n * orchestrator settings + the device's currently-assigned profile\n * slots. Returns `null` when the device has no assigned slot or when\n * settings cannot be resolved.\n *\n * `motionStreamId` / `detectionStreamId` hold a `camStreamId` value\n * (e.g. `'native:main'`, `'rtsp:sub'`). The pipeline-runner\n * concatenates `${deviceId}/${motionStreamId}` to build the broker\n * id, matching the cam-stream-keyed brokers published by the\n * stream-broker. The profile chosen by `motionStreamProfile` /\n * `detectionStreamProfile` is resolved to the cam-stream backing it\n * via the slot map fetched from `listAllProfileSlots`.\n */\n async buildDetectionConfig(\n deviceId: number,\n ): Promise<CameraDetectionConfig | null> {\n const assigned = await this.fetchAssignedProfiles(deviceId);\n if (assigned.size === 0) return null;\n\n const resolved = await this.resolveDeviceDetectionSettings(deviceId);\n if (!resolved) return null;\n\n const motionProfile = this.resolveAssignedProfile(\n assigned,\n resolved.motionStreamProfile,\n );\n const detectionProfile = this.resolveAssignedProfile(\n assigned,\n resolved.detectionStreamProfile,\n );\n if (!motionProfile || !detectionProfile) return null;\n const motionCamStreamId = assigned.get(motionProfile);\n const detectionCamStreamId = assigned.get(detectionProfile);\n if (!motionCamStreamId || !detectionCamStreamId) return null;\n\n return {\n enabled: resolved.motionDetectionEnabled,\n pipelineEnabled: resolved.pipelineEnabled,\n motionSources: resolved.motionSources,\n motionStreamId: motionCamStreamId,\n detectionStreamId: detectionCamStreamId,\n motionFps: resolved.motionFps,\n detectionFps: resolved.detectionFps,\n motionCooldownMs: resolved.motionCooldownMs,\n audioStreamId: undefined,\n detectionMode: resolved.detectionMode,\n audioMode: resolved.audioMode,\n onboardMotionDrivesAnalyzer: resolved.onboardMotionDrivesAnalyzer,\n };\n }\n\n /**\n * Start detection for a camera: dispatch to runner via the orchestrator\n * local path and subscribe to the audio broker if audio is enabled.\n */\n async startDetection(\n deviceId: number,\n config: CameraDetectionConfig,\n ): Promise<void> {\n const ctx = this.ctx;\n if (!ctx)\n throw new Error(\n \"PipelineOrchestrator: startDetection called before initialize\",\n );\n const log = this.ctx.logger.withTags({ deviceId });\n\n if (this.activeDetections.has(deviceId)) {\n log.warn(\"Detection already active — stopping first\");\n await this.stopDetection(deviceId);\n }\n this.activeDetections.set(deviceId, config);\n\n // Hydrate the attach payload via the 3-level resolver. Auto-seeds\n // agent.addonDefaults on first call, applies camera stepToggles,\n // builds the tree from the catalog. Never returns null — runner\n // always gets a concrete config (empty pipeline if catalog unreachable).\n const pipelineConfig = await this.resolvePipelineForDevice(deviceId);\n\n const zones = (await this.zonesProvider?.listZones({ deviceId })) ?? [];\n const runnerConfig: RunnerCameraConfig = {\n deviceId,\n motionCooldownMs: config.motionCooldownMs,\n motionFps: config.motionFps,\n detectionFps: config.detectionFps,\n motionStreamId: config.motionStreamId,\n detectionStreamId: config.detectionStreamId,\n motionSources: config.motionSources,\n pipelineEnabled: config.pipelineEnabled,\n engine: pipelineConfig.engine,\n steps: pipelineConfig.steps,\n audio: pipelineConfig.audio ?? null,\n zones,\n detectionMode: config.detectionMode,\n audioMode: config.audioMode,\n onboardMotionDrivesAnalyzer: config.onboardMotionDrivesAnalyzer,\n };\n\n let dispatchedNodeId: string | null = null;\n try {\n const result = await this.dispatchCamera(runnerConfig);\n dispatchedNodeId = result.agentNodeId;\n } catch (err: unknown) {\n const msg = errMsg(err);\n log.error(\"dispatchCamera failed\", { meta: { error: msg } });\n }\n\n // Re-resolve the pipeline now that the assignment is recorded and we know\n // the actual agent. On first dispatch the resolver defaults to localNodeId\n // (hub) because no assignment exists yet — the balancer may have picked a\n // different node. If that caused empty steps, fix them by re-resolving with\n // the confirmed agent and re-attaching.\n if (dispatchedNodeId && (runnerConfig.steps?.length ?? 0) === 0) {\n try {\n const corrected = await this.resolvePipelineForDevice(deviceId, dispatchedNodeId);\n if (corrected.steps.length > 0) {\n const correctedConfig: RunnerCameraConfig = {\n ...runnerConfig,\n engine: corrected.engine,\n steps: corrected.steps,\n audio: corrected.audio ?? null,\n };\n await this.attachOn(dispatchedNodeId, correctedConfig);\n this.cameraConfigs.set(deviceId, correctedConfig);\n log.info(\"startDetection: pipeline re-resolved after agent assignment\", {\n tags: { nodeId: dispatchedNodeId },\n meta: { stepCount: corrected.steps.length },\n });\n }\n } catch (err: unknown) {\n log.warn(\"startDetection: post-dispatch re-resolve failed\", {\n meta: { error: errMsg(err) },\n });\n }\n }\n\n // Audio subscription. Independent of `pipelineEnabled` (the\n // detection-pipeline binding) — audio classification is a separate\n // pipeline branch and must not be dragged off when only object\n // detection is disabled. The two relevant gates are:\n // - the `audio-analysis` wrapper binding (cap mounted at all),\n // enforced inside `subscribeAudioStream` via\n // `isAudioAnalysisActive`. Operator unbinds the wrapper →\n // cap fully dismounted → audio off regardless of mode.\n // - the operator-facing `audioMode` carried on the runner\n // config, also enforced inside `subscribeAudioStream`.\n try {\n // Drop any prior audio subscription for this device before opening\n // a new one. `dispatchCamera` can fire multiple times in a camera's\n // lifecycle (agent reassignment, pipeline reconfig, audio stream\n // profile change); without this cleanup, each pass appends a new\n // `{tag: 'audio-analyzer'}` subscriber on the broker without\n // releasing the old one.\n const priorAudio = this.audioSubscriptions.get(deviceId);\n if (priorAudio) {\n try { priorAudio(); } catch { /* swallow */ }\n this.audioSubscriptions.delete(deviceId);\n }\n const unsub = await this.subscribeAudioStream(deviceId, config);\n if (unsub) {\n if (this.activeDetections.has(deviceId)) {\n this.audioSubscriptions.set(deviceId, unsub);\n } else {\n unsub();\n }\n }\n } catch (err: unknown) {\n const msg = errMsg(err);\n log.error(\"subscribeAudioStream failed\", { meta: { error: msg } });\n }\n\n log.info(\"Detection dispatched\", {\n meta: {\n motion: config.motionSources.join(\"+\"),\n pipeline: config.pipelineEnabled ? \"on\" : \"off\",\n motionFps: config.motionFps,\n detectionFps: config.detectionFps,\n },\n });\n }\n\n /** Stop detection for a camera: release via releaseCamera + audio cleanup. */\n async stopDetection(deviceId: number): Promise<void> {\n const ctx = this.ctx;\n if (!ctx) return;\n\n try {\n await this.releaseCamera({ deviceId });\n } catch (err: unknown) {\n const msg = errMsg(err);\n this.ctx.logger.error(\"releaseCamera failed\", {\n tags: { deviceId },\n meta: { error: msg },\n });\n }\n\n const unsub = this.audioSubscriptions.get(deviceId);\n if (unsub) {\n try {\n unsub();\n } catch {\n /* swallow */\n }\n this.audioSubscriptions.delete(deviceId);\n }\n const lazyTimer = this.lazyAudioTeardownTimers.get(deviceId);\n if (lazyTimer) {\n clearTimeout(lazyTimer);\n this.lazyAudioTeardownTimers.delete(deviceId);\n }\n this.audioNodeByDevice.delete(deviceId);\n this.audioAssignments.delete(deviceId);\n\n this.activeDetections.delete(deviceId);\n this.ctx.logger.info(\"Detection stopped\", { tags: { deviceId } });\n }\n\n /** Stop detection and purge all persisted config for a removed device. */\n private async handleDeviceUnregistered(deviceId: number): Promise<void> {\n await this.stopDetection(deviceId);\n this.zonesProvider?.forgetDevice(deviceId);\n this.zoneRulesProvider?.forgetDevice(deviceId);\n\n const settings = this.ctx.settings;\n if (!settings) return;\n const store = await settings.readAddonStore();\n\n const cameraSettings = store[CAMERA_SETTINGS_KEY];\n if (\n cameraSettings &&\n typeof cameraSettings === \"object\" &&\n !Array.isArray(cameraSettings)\n ) {\n const { [String(deviceId)]: _c, ...rest } = cameraSettings as Record<\n string,\n unknown\n >;\n await settings.writeAddonStore({ [CAMERA_SETTINGS_KEY]: rest });\n }\n\n this.ctx.logger.info(\"Purged pipeline config for removed device\", {\n tags: { deviceId },\n });\n }\n\n /**\n * Handle a profile-slot change: build a fresh detection config from\n * per-device settings and start detection if motion is enabled.\n * Fires on `camera-streams.onProfileSlotsChanged` — any publish,\n * retract, or assignment mutation in the stream-broker lands here.\n */\n private async handleDeviceRegistered(deviceId: number): Promise<void> {\n const ctx = this.ctx;\n if (!ctx) return;\n\n const log = this.ctx.logger.withTags({ deviceId });\n log.info(\"handleDeviceRegistered\", {\n meta: { phase: \"handleDeviceRegistered\" },\n });\n\n // Phase 2f: no per-camera pipeline seed on registration — fresh\n // cameras inherit from agent `addonDefaults` via the 3-level\n // resolver on every read. Operators can override per-camera via\n // `setCameraStepToggle` / `setCameraPipelineForAgent`.\n\n const config = await this.buildDetectionConfig(deviceId);\n log.info(\n \"[pipeline-orchestrator] buildDetectionConfig\",\n config\n ? {\n meta: {\n enabled: config.enabled,\n motionStreamId: config.motionStreamId,\n detectionStreamId: config.detectionStreamId,\n },\n }\n : { meta: { config: null } },\n );\n if (!config) {\n // No assigned slot. If detection was running, stop it.\n if (this.activeDetections.has(deviceId)) {\n log.info(\"Profile slot lost — stopping detection\");\n await this.stopDetection(deviceId);\n } else {\n log.debug(\"No assigned profile slot for detection — skipping\");\n }\n return;\n }\n if (!config.enabled) {\n if (this.activeDetections.has(deviceId)) {\n log.info(\"Motion detection disabled — stopping\");\n await this.stopDetection(deviceId);\n } else {\n log.debug(\"Motion detection disabled — not starting\");\n }\n return;\n }\n\n // Idempotence: when the new config matches the running config bit-\n // for-bit, skip the stop+start cycle. ProfileSlotsChanged fires for\n // any broker mutation (publish, retract, assign, re-publish on\n // provider reconnect); only the subset that actually changes the\n // detection inputs (stream IDs, fps, cooldown, sources) needs a\n // restart. Without this guard each spurious emit surfaces as a\n // `PipelineCameraUnassigned`+`PipelineCameraAssigned` pair in the UI.\n const current = this.activeDetections.get(deviceId);\n if (current && PipelineOrchestratorAddon.detectionConfigEquals(current, config)) {\n log.debug(\"Profile slot unchanged — detection already in sync, skipping restart\");\n return;\n }\n\n if (current) {\n log.info(\"Profile slot changed — restarting detection with fresh brokers\");\n await this.stopDetection(deviceId);\n }\n\n log.info(\"Starting detection\", {\n meta: {\n motionStreamId: config.motionStreamId,\n detectionStreamId: config.detectionStreamId,\n },\n });\n await this.startDetection(deviceId, config);\n }\n\n /**\n * Field-by-field comparison of two `CameraDetectionConfig` records.\n * `motionSources` is an unordered set; everything else is a primitive.\n */\n private static detectionConfigEquals(\n a: CameraDetectionConfig,\n b: CameraDetectionConfig,\n ): boolean {\n if (a.enabled !== b.enabled) return false;\n if (a.pipelineEnabled !== b.pipelineEnabled) return false;\n if (a.detectionMode !== b.detectionMode) return false;\n if (a.audioMode !== b.audioMode) return false;\n if (a.motionStreamId !== b.motionStreamId) return false;\n if (a.detectionStreamId !== b.detectionStreamId) return false;\n if (a.motionFps !== b.motionFps) return false;\n if (a.detectionFps !== b.detectionFps) return false;\n if (a.motionCooldownMs !== b.motionCooldownMs) return false;\n if (a.audioStreamId !== b.audioStreamId) return false;\n if (a.onboardMotionDrivesAnalyzer !== b.onboardMotionDrivesAnalyzer) return false;\n if (a.motionSources.length !== b.motionSources.length) return false;\n for (const s of a.motionSources) if (!b.motionSources.includes(s)) return false;\n return true;\n }\n\n /**\n * Handle an orchestration settings update: rebuild the config and restart\n * detection with the new values.\n */\n private async handleSettingsChanged(deviceId: number): Promise<void> {\n const ctx = this.ctx;\n if (!ctx) return;\n const log = this.ctx.logger.withTags({ deviceId });\n\n if (this.activeDetections.has(deviceId)) {\n await this.stopDetection(deviceId);\n }\n\n const config = await this.buildDetectionConfig(deviceId);\n if (!config) {\n log.info(\"Settings changed — no assigned slot, detection stopped\");\n return;\n }\n if (!config.enabled) {\n log.info(\"Settings changed — motion detection disabled\");\n return;\n }\n\n log.info(\"Settings changed — restarting detection\");\n await this.startDetection(deviceId, config);\n }\n\n /**\n * Hot-reload the runner currently hosting `deviceId` with a fresh\n * pipeline config. Called from the `PipelineCameraUpdated` subscriber —\n * any mutation to `pipelines[deviceId]` flows through this path so the\n * operator's edit reaches the next frame without a rebalance or a full\n * detection restart.\n *\n * No-ops (with a debug log) when the camera has no cached\n * RunnerCameraConfig — means the camera either isn't registered yet or\n * isn't assigned to a runner. The next DeviceStreamsRegistered cycle\n * will read the fresh config from the store and dispatch normally.\n */\n private async handlePipelineCameraUpdated(\n deviceId: number,\n config: CameraPipelineConfig,\n ): Promise<void> {\n const log = this.ctx.logger.withTags({ deviceId });\n\n const cached = this.cameraConfigs.get(deviceId);\n const assignment = this.assignments.get(deviceId);\n if (!cached || !assignment) {\n log.debug(\n \"pipeline.camera-updated: no cached RunnerCameraConfig or assignment — deferring to next DeviceStreamsRegistered\",\n );\n return;\n }\n\n // Keep the scheduling fields (motion/detection FPS, streams, priority)\n // exactly as cached — the pipeline edit only touches engine + steps +\n // audio. Store the merged config back into cameraConfigs so future\n // rebalance passes carry the updated content too.\n const nextConfig: RunnerCameraConfig = {\n ...cached,\n engine: config.engine,\n steps: config.steps,\n audio: config.audio ?? null,\n };\n this.cameraConfigs.set(deviceId, nextConfig);\n\n try {\n await this.attachOn(assignment.agentNodeId, nextConfig);\n log.info(\"pipeline.camera-updated: hot-reloaded\", {\n tags: { nodeId: assignment.agentNodeId },\n });\n } catch (err: unknown) {\n const msg = errMsg(err);\n log.error(\"pipeline.camera-updated: attachOn failed\", {\n tags: { nodeId: assignment.agentNodeId },\n meta: { error: msg },\n });\n }\n }\n\n /**\n * Re-emit `PipelineInferenceResult` as `DetectionResult` when the\n * frame carries detections. Kept deliberately thin: refinement\n * (tracking, zone/state analysis, per-kind event persistence) is now\n * owned end-to-end by `addon-pipeline-analytics`, which subscribes to\n * `PipelineInferenceResult` directly. Consumers that want\n * enriched-event-driven notifications subscribe to\n * `pipeline-analytics.detection-event` + drive `notificationOutput`\n * themselves.\n */\n\n /**\n * Load management enforcement — called on every camera metrics snapshot.\n *\n * Time-based window: a camera must stay below `fpsMinThreshold` for\n * at least `fpsLowWindowMs` (default 60s) before it is paused. The\n * window resets the moment fps recovers above threshold, so a\n * transient dip (GC, model swap, brief stall) doesn't accumulate\n * across recoveries.\n */\n private static readonly DEFAULT_FPS_LOW_WINDOW_MS = 60_000;\n\n /**\n * Default min-FPS threshold for the per-camera low-fps load shedder.\n *\n * `0` = DISABLED by default: a single slow camera (e.g. an on-motion\n * camera idling at <1 fps between motion events) must NOT be detached or\n * block new dispatches. Capacity-based assignment (`collectAgentLoad` +\n * `balance()`, the \"high-water\" placement logic) is independent of this\n * and stays active. Operators can re-enable per-camera shedding by setting\n * a positive `fpsMinThreshold` in global settings.\n */\n private static readonly DEFAULT_FPS_MIN_THRESHOLD = 0;\n\n private enforceLoadManagement(\n deviceId: number,\n metrics: import('@camstack/types').CameraMetrics,\n ): void {\n const cfg = this.globalSettings ?? {};\n const threshold = typeof cfg.fpsMinThreshold === 'number' ? cfg.fpsMinThreshold : PipelineOrchestratorAddon.DEFAULT_FPS_MIN_THRESHOLD;\n const windowMs = typeof cfg.fpsLowWindowMs === 'number' && cfg.fpsLowWindowMs > 0\n ? cfg.fpsLowWindowMs\n : PipelineOrchestratorAddon.DEFAULT_FPS_LOW_WINDOW_MS;\n\n if (threshold <= 0) return;\n if (metrics.phase !== 'active') return;\n\n // Grace period: don't enforce during the first 30s after a camera\n // starts detecting. Cold-start model loading causes very low fps\n // initially which would trigger false kill.\n const info = this.cameraFpsMap.get(deviceId);\n if (!info) return;\n const firstSeenKey = `_loadMgmt_firstSeen_${deviceId}`;\n let firstSeen = (this as unknown as Record<string, number>)[firstSeenKey];\n if (!firstSeen) {\n (this as unknown as Record<string, number>)[firstSeenKey] = Date.now();\n return;\n }\n if (Date.now() - firstSeen < 30_000) return;\n\n // Require a meaningful sample: actualFps must be > 0 (not idle)\n if (metrics.actualFps <= 0) return;\n\n let state = this.loadShedState.get(deviceId);\n if (!state) {\n state = { lowSinceTs: null, pausedAt: null, resumeAttempts: 0 };\n this.loadShedState.set(deviceId, state);\n }\n\n // Already paused — nothing to do (auto-resume timer handles recovery)\n if (state.pausedAt !== null) return;\n\n const now = Date.now();\n\n if (metrics.actualFps >= threshold) {\n // FPS healthy — reset the time window\n if (state.lowSinceTs !== null) {\n state.lowSinceTs = null;\n }\n return;\n }\n\n // FPS below threshold — start (or extend) the timer\n if (state.lowSinceTs === null) {\n state.lowSinceTs = now;\n }\n\n const lowDurationMs = now - state.lowSinceTs;\n if (lowDurationMs < windowMs) {\n this.ctx.logger.debug('Load management: low fps sample', {\n tags: { deviceId },\n meta: { actualFps: metrics.actualFps, threshold, lowDurationMs, windowMs },\n });\n return;\n }\n\n // Window elapsed — pause the camera\n this.ctx.logger.warn('Load management: pausing camera detection (sustained low fps)', {\n tags: { deviceId },\n meta: {\n actualFps: metrics.actualFps,\n threshold,\n lowDurationMs,\n windowMs,\n },\n });\n state.pausedAt = now;\n state.lowSinceTs = null;\n\n void this.ctx.api?.pipelineRunner.detachCamera.mutate({ deviceId }).catch((err: unknown) => {\n this.ctx.logger.warn('Load management: detachCamera failed', {\n tags: { deviceId },\n meta: { error: errMsg(err) },\n });\n });\n\n // Start auto-resume timer if not already running\n this.ensureLoadShedResumeTimer();\n }\n\n // ── Auto-resume sweep ─────────────────────────────────────────────\n\n /** Base cooldown before first auto-resume attempt. */\n private static readonly LOAD_SHED_BASE_COOLDOWN_MS = 30_000;\n /** Maximum backoff cap. */\n private static readonly LOAD_SHED_MAX_COOLDOWN_MS = 5 * 60_000;\n /** How often the sweep runs. */\n private static readonly LOAD_SHED_SWEEP_INTERVAL_MS = 10_000;\n\n private ensureLoadShedResumeTimer(): void {\n if (this.loadShedResumeTimer) return;\n this.loadShedResumeTimer = setInterval(() => {\n void this.loadShedResumeSweep();\n }, PipelineOrchestratorAddon.LOAD_SHED_SWEEP_INTERVAL_MS);\n }\n\n private async loadShedResumeSweep(): Promise<void> {\n const now = Date.now();\n const baseCooldown = PipelineOrchestratorAddon.LOAD_SHED_BASE_COOLDOWN_MS;\n const maxCooldown = PipelineOrchestratorAddon.LOAD_SHED_MAX_COOLDOWN_MS;\n let anyPaused = false;\n\n for (const [deviceId, state] of this.loadShedState) {\n if (state.pausedAt === null) continue;\n anyPaused = true;\n\n // Exponential backoff: 30s, 60s, 120s, ... capped at 5min\n const cooldown = Math.min(baseCooldown * Math.pow(2, state.resumeAttempts), maxCooldown);\n if (now - state.pausedAt < cooldown) continue;\n\n state.resumeAttempts++;\n state.pausedAt = null;\n state.lowSinceTs = null;\n\n this.ctx.logger.info('Load management: auto-resuming camera', {\n tags: { deviceId },\n meta: { attempt: state.resumeAttempts },\n });\n\n // Reset the grace-period first-seen so the camera gets another\n // 30s warm-up before load management can kill it again.\n const firstSeenKey = `_loadMgmt_firstSeen_${deviceId}`;\n delete (this as unknown as Record<string, unknown>)[firstSeenKey];\n\n void this.redispatchSingleCamera(deviceId).catch((err: unknown) => {\n this.ctx.logger.warn('Load management: auto-resume dispatch failed', {\n tags: { deviceId },\n meta: { error: errMsg(err) },\n });\n });\n }\n\n // Stop the timer when no cameras are paused\n if (!anyPaused && this.loadShedResumeTimer) {\n clearInterval(this.loadShedResumeTimer);\n this.loadShedResumeTimer = null;\n }\n }\n\n /**\n * Re-dispatch a single camera through the normal assignment pipeline.\n * Used by auto-resume and settings-change recovery.\n */\n private async redispatchSingleCamera(deviceId: number): Promise<void> {\n const assignment = this.assignments.get(deviceId);\n const nodeId = assignment?.agentNodeId ?? 'hub';\n const cached = this.cameraConfigs.get(deviceId);\n if (!cached) {\n this.ctx.logger.debug('redispatchSingleCamera: no cached config, skipping', {\n tags: { deviceId },\n });\n return;\n }\n await this.attachOn(nodeId, cached);\n }\n private async handleInferenceResult(\n payload: PipelineInferenceResultPayload,\n ): Promise<void> {\n const ctx = this.ctx;\n if (!ctx) return;\n const { deviceId, frame, frameHandle, capturedAt } = payload;\n if (frame.detections.length === 0) return;\n this.ctx.eventBus.emit({\n id: `detection-${deviceId}-${Date.now()}`,\n category: EventCategory.DetectionResult,\n source: { type: \"device\" as const, id: deviceId, nodeId: \"hub\", addonId: \"pipeline-orchestrator\", deviceId },\n timestamp: new Date(),\n // Forward the upstream shm-ring `frameHandle` so post-analysis\n // consumers (Task 8) can resolve the original frame zero-copy, and\n // `capturedAt` (shm-commit wall-clock) so a UI/probe consumer can\n // measure true frame-capture → delivery latency.\n data: { frame, analysisResults: [], frameHandle, ...(typeof capturedAt === \"number\" ? { capturedAt } : {}) },\n });\n }\n\n /**\n * Lazy audio gate handler. Fires on every `MotionOnMotionChanged`\n * event for a device whose `audioMode === 'on-motion'`.\n *\n * - `detected:true` → cancel any pending teardown, open audio sub\n * if not already open. Idempotent: re-fires of the same `true`\n * while subscribed are no-ops aside from cancelling the timer.\n * - `detected:false` → schedule teardown after the device's\n * motion cooldown window. Mirrors the runner's own `'on-motion'`\n * detection-mode behaviour where the camera stays in `active`\n * for the cooldown window after the last motion ping.\n *\n * Idempotency is critical because `MotionOnMotionChanged` can fire\n * frequently (every 1-2s while motion is active on Reolink); each\n * rearm just keeps the audio stream open without restarting it.\n */\n private async handleLazyAudioMotion(\n deviceId: number,\n detected: boolean,\n config: CameraDetectionConfig,\n ): Promise<void> {\n if (config.audioMode !== 'on-motion') return;\n const log = this.ctx.logger.withTags({ deviceId });\n if (detected) {\n // Cancel pending teardown so a re-fire keeps the sub open.\n const pendingTeardown = this.lazyAudioTeardownTimers.get(deviceId);\n if (pendingTeardown) {\n clearTimeout(pendingTeardown);\n this.lazyAudioTeardownTimers.delete(deviceId);\n }\n if (this.audioSubscriptions.has(deviceId)) return;\n // Audio binding may have been operator-toggled OFF since dispatch\n // — re-check inside subscribeAudioStream covers it.\n const unsub = await this.subscribeAudioStream(deviceId, {\n ...config,\n // Force the always-on path inside subscribeAudioStream by\n // overriding mode for this single call. We're already gating\n // here based on the bus event.\n audioMode: 'always-on',\n });\n if (unsub) {\n this.audioSubscriptions.set(deviceId, unsub);\n log.info('lazy audio: opened on motion');\n }\n return;\n }\n // detected === false: schedule teardown after cooldown.\n if (!this.audioSubscriptions.has(deviceId)) return;\n const existing = this.lazyAudioTeardownTimers.get(deviceId);\n if (existing) clearTimeout(existing);\n const cooldownMs = config.motionCooldownMs ?? 30_000;\n const timer = setTimeout(() => {\n this.lazyAudioTeardownTimers.delete(deviceId);\n const unsub = this.audioSubscriptions.get(deviceId);\n if (!unsub) return;\n try { unsub(); } catch { /* swallow */ }\n this.audioSubscriptions.delete(deviceId);\n log.info('lazy audio: closed after motion cooldown');\n }, cooldownMs);\n this.lazyAudioTeardownTimers.set(deviceId, timer);\n }\n\n /**\n * Subscribe to decoded audio chunks for a camera and feed them into the\n * audio-analyzer. Reads the analyzer's settings via its own\n * `resolveDeviceSettings(deviceId)` method so the orchestrator does not\n * touch the audio-analyzer schema field names directly.\n */\n private async subscribeAudioStream(\n deviceId: number,\n config: CameraDetectionConfig,\n ): Promise<Unsubscribe | null> {\n const ctx = this.ctx;\n if (!ctx) return null;\n\n const api = this.api;\n if (!api) {\n this.ctx.logger.warn(\n \"this.ctx.api not available — cannot subscribe audio\",\n { tags: { deviceId } },\n );\n return null;\n }\n\n // Per-device bindings gate the audio-analysis wrapper. Operator\n // toggle (setWrapperActive:false) short-circuits without opening\n // the stream.\n if (!(await this.isAudioAnalysisActive(deviceId))) return null;\n\n // Mode-based gate (operator-facing schedule):\n // - `'disabled'` — never subscribe, even with the wrapper bound.\n // Battery cams default here so the audio decoded stream\n // doesn't hold the substream open.\n // - `'always-on'` — subscribe immediately, run continuously.\n // Default for non-battery cams.\n // - `'on-motion'` — subscribe lazily when the runner's motion\n // gate opens, unsubscribe on close. STUB today: treats as\n // `'always-on'` with a debug log so the operator's pick is\n // persisted but the gating lands in a follow-up.\n if (config.audioMode === 'disabled') {\n this.ctx.logger.debug('audio subscribe skipped: audioMode=disabled', {\n tags: { deviceId },\n });\n return null;\n }\n if (config.audioMode === 'on-motion') {\n // Lazy path: wait for the runner's motion phase to fire. The\n // MotionOnMotionChanged event-bus subscription drives subscribe /\n // unsubscribe based on detected:true|false transitions. Skipping\n // here means the steady-state \"watching\" camera holds no audio\n // subscriber + no decoded-audio chunks, freeing the broker's\n // pre-buffer + audio-codec session. See handleLazyAudioMotion.\n this.ctx.logger.info('audio subscribe deferred: audioMode=on-motion, lazy mode active', {\n tags: { deviceId },\n });\n return null;\n }\n\n const audioStream = config.audioStreamId ?? config.motionStreamId;\n const audioBrokerId = `${deviceId}/${audioStream}`;\n\n const settings = await api.audioAnalysis.resolveDeviceSettings.query({\n deviceId,\n });\n if (!settings) {\n this.ctx.logger.warn(\n \"audio-analysis returned no settings — audio subscription skipped\",\n { tags: { deviceId } },\n );\n return null;\n }\n\n // Resolve and cache the audio-analyzer node for this device.\n const audioNodeId = await this.dispatchAudio(deviceId);\n const isRemoteAudio = audioNodeId !== this.localNodeId;\n this.ctx.logger.info(\"audio subscription: resolved audio node\", {\n tags: { deviceId },\n meta: { audioNodeId, isRemote: isRemoteAudio },\n });\n\n let loggedAnalyzerStatus = false;\n\n // Phase 5 / D9: audio chunks arrive over tRPC via the broker's\n // `subscribeAudioChunks` plane, polled by `AudioChunkPoller`. This\n // replaces the live-object `broker.onDecodedAudioChunk(cb)` callback,\n // which cannot cross the process boundary once the `pipeline` group is\n // dissolved. The per-chunk logic below is unchanged.\n const teardown = await startAudioChunkPoller({\n api,\n brokerId: audioBrokerId,\n tag: \"audio-analyzer\",\n logger: this.ctx.logger,\n onChunk: async (chunk) => {\n if (!loggedAnalyzerStatus) {\n loggedAnalyzerStatus = true;\n this.ctx.logger.info(\"audio status\", {\n tags: { deviceId },\n meta: {\n phase: \"audio-status\",\n analyzer: \"YES\",\n },\n });\n }\n\n try {\n // Copy the raw f32le bytes into a fresh Uint8Array. AudioChunkInput.data\n // is typed as Uint8Array (not Float32Array) so the MsgPack UDS transport\n // preserves the bytes exactly: @msgpack/msgpack encodes Uint8Array as a\n // binary blob (bin type) and decodes it as Uint8Array on the receiver.\n // Sending Float32Array would cause the same bin-type encoding but the\n // receiver would get Uint8Array, causing each byte (0–255) to be read as\n // a sample value instead of each 4-byte float group, producing dBFS ≈ +43.\n const byteLength = chunk.data.byteLength;\n const data = new Uint8Array(byteLength);\n data.set(\n new Uint8Array(\n chunk.data.buffer,\n chunk.data.byteOffset,\n byteLength,\n ),\n );\n const audioChunkInput: AudioChunkInput = {\n data,\n sampleRate: chunk.sampleRate,\n channels: chunk.channels,\n timestamp: chunk.timestamp,\n deviceId,\n };\n\n // Route to the audio-analyzer node resolved at subscription time.\n // For hub-local analyzers nodeId equals localNodeId and resolveProvider\n // uses the local registry directly; for remote nodes the proxy factory\n // routes via Moleculer.\n const result = await api.audioAnalyzer.analyseChunk.mutate({\n chunk: audioChunkInput,\n settings,\n ...(isRemoteAudio ? { nodeId: audioNodeId } : {}),\n });\n if (!result) return;\n\n // Build a canonical `AudioResult` and emit a single\n // `pipeline.audio-inference-result` event carrying level + detections\n // + debug on the same payload. Consumers read `frame.level` for\n // dBFS/RMS and `frame.detections` for classifier matches.\n const windowId = `${deviceId}-${result.timestamp}`;\n const audioDetections: AudioDetection[] = [];\n let idCounter = 0;\n if (\n result.classification &&\n result.classification.labels.length > 0\n ) {\n for (const label of result.classification.labels) {\n idCounter += 1;\n audioDetections.push({\n id: `a${idCounter}`,\n kind: \"audio\",\n macroClass: label.className,\n score: label.score,\n labels: [{ label: label.className, score: label.score }],\n startMs: 0,\n endMs: 0,\n });\n }\n }\n const frame: AudioResult = {\n kind: \"audio-window\",\n windowId,\n deviceId,\n timestamp: result.timestamp,\n startMs: 0,\n endMs: 0,\n level: { rms: result.level.rms, dbfs: result.level.dbfs },\n detections: audioDetections,\n debug: result.classification\n ? {\n totalInferenceMs: result.classification.inferenceMs,\n stepTimings: [\n {\n source: \"audio-analyzer\",\n ms: result.classification.inferenceMs,\n detectionCount: audioDetections.length,\n },\n ],\n }\n : undefined,\n };\n this.ctx.eventBus.emit({\n id: `audio-inference-${deviceId}-${Date.now()}`,\n timestamp: new Date(),\n source: { type: \"device\" as const, id: deviceId, nodeId: \"hub\", addonId: \"pipeline-orchestrator\", deviceId },\n category: EventCategory.PipelineAudioInferenceResult,\n data: {\n deviceId,\n frame,\n nodeId: \"hub\",\n },\n });\n } catch (err: unknown) {\n const msg = errMsg(err);\n this.ctx.logger.error(\"Audio analysis failed\", {\n tags: { deviceId },\n meta: { error: msg },\n });\n }\n },\n });\n\n if (!teardown) {\n this.ctx.logger.warn(\"audio subscription failed — no broker\", {\n tags: { deviceId },\n meta: { brokerId: audioBrokerId },\n });\n return null;\n }\n\n this.ctx.logger.info(\"Audio stream subscribed\", { tags: { deviceId } });\n return () => {\n teardown();\n };\n }\n}\n\n// Re-exports for tests / consumers that want direct access to the balancer.\nexport {\n balance,\n balanceDecoder,\n computeCapacityScore,\n} from \"./load-balancer.js\";\nexport type {\n BalancerDecision,\n BalancerInput,\n DecoderBalancerInput,\n DecoderBalancerDecision,\n} from \"./load-balancer.js\";\n"],"names":["_a","initializer","object","config","util.jsonStringifyReplacer","issue","error","core.$ZodAsyncError","util.finalizeIssue","core.config","util.captureStackTrace","errors.$ZodError","safeParse","errors.$ZodRealError","safeParseAsync","duration","version","email","_emoji","date","time","datetime","string","number","boolean","_null","core.$constructor","inst","util.floatSafeRemainder","util.NUMBER_FORMAT_RANGES","regexes.integer","util.nullish","util.getLengthableOrigin","regexes.lowercase","regexes.uppercase","util.escapeRegex","checks","util.aborted","util.explicitlyAborted","checkResult","canary","result","util.defineLazy","regexes.string","_","checks.$ZodCheckStringFormat","regexes.guid","regexes.uuid","regexes.email","regexes.httpProtocol","regexes.emoji","regexes.nanoid","regexes.cuid","regexes.cuid2","regexes.ulid","regexes.xid","regexes.ksuid","regexes.datetime","regexes.date","regexes.time","regexes.duration","regexes.ipv4","regexes.ipv6","regexes.cidrv4","regexes.cidrv6","regexes.base64","regexes.base64url","base64","regexes.e164","regexes.number","checks.$ZodCheckNumberFormat","regexes.boolean","regexes.null","util.prefixIssues","util.optionalKeys","r","util.cached","isObject","util.isObject","util.esc","core.globalConfig","allowsEval","util.allowsEval","util.cleanRegex","results","left","right","util.isPlainObject","util.getEnumValues","util.propertyKeyTypes","core.$ZodEncodeError","output","checks.$ZodCheck","util.issue","util.normalizeParams","_void","checks.$ZodCheckLessThan","checks.$ZodCheckGreaterThan","checks.$ZodCheckMultipleOf","checks.$ZodCheckMaxLength","checks.$ZodCheckMinLength","checks.$ZodCheckLengthEquals","checks.$ZodCheckRegex","checks.$ZodCheckLowerCase","checks.$ZodCheckUpperCase","checks.$ZodCheckIncludes","checks.$ZodCheckStartsWith","checks.$ZodCheckEndsWith","checks.$ZodCheckOverwrite","util.slugify","id","schema","core.$ZodISODateTime","schemas.ZodStringFormat","core._isoDateTime","core.$ZodISODate","core._isoDate","core.$ZodISOTime","core._isoTime","core.$ZodISODuration","core._isoDuration","core.formatError","core.flattenError","issues","core._parse","core._parseAsync","core._safeParse","core._safeParseAsync","core._encode","core._decode","core._encodeAsync","core._decodeAsync","core._safeEncode","core._safeDecode","core._safeEncodeAsync","core._safeDecodeAsync","core.$ZodType","parse.parse","parse.safeParse","parse.parseAsync","parse.safeParseAsync","parse.encode","parse.decode","parse.encodeAsync","parse.decodeAsync","parse.safeEncode","parse.safeDecode","parse.safeEncodeAsync","parse.safeDecodeAsync","def","util.mergeDefs","core.clone","checks.overwrite","core.globalRegistry","core.$ZodString","processors.stringProcessor","checks.regex","checks.includes","checks.startsWith","checks.endsWith","checks.minLength","checks.maxLength","checks.length","checks.lowercase","checks.uppercase","checks.trim","checks.normalize","checks.toLowerCase","checks.toUpperCase","checks.slugify","core._email","core._url","core._jwt","core._emoji","core._guid","core._uuid","core._uuidv4","core._uuidv6","core._uuidv7","core._nanoid","core._cuid","core._cuid2","core._ulid","core._base64","core._base64url","core._xid","core._ksuid","core._ipv4","core._ipv6","core._cidrv4","core._cidrv6","core._e164","iso.datetime","iso.date","iso.time","iso.duration","core._string","core.$ZodStringFormat","core.$ZodEmail","core.$ZodGUID","core.$ZodUUID","core.$ZodURL","core.$ZodEmoji","core.$ZodNanoID","core.$ZodCUID","core.$ZodCUID2","core.$ZodULID","core.$ZodXID","core.$ZodKSUID","core.$ZodIPv4","core.$ZodIPv6","core.$ZodCIDRv4","core.$ZodCIDRv6","core.$ZodBase64","core.$ZodBase64URL","core.$ZodE164","core.$ZodJWT","core.$ZodNumber","processors.numberProcessor","checks.gt","checks.gte","checks.lt","checks.lte","checks.multipleOf","core._number","core.$ZodNumberFormat","core._int","core.$ZodBoolean","processors.booleanProcessor","core._boolean","core.$ZodNull","processors.nullProcessor","core._null","core.$ZodAny","processors.anyProcessor","core._any","core.$ZodUnknown","processors.unknownProcessor","core._unknown","core.$ZodNever","processors.neverProcessor","core._never","core.$ZodVoid","processors.voidProcessor","core._void","core.$ZodDate","processors.dateProcessor","core._date","core.$ZodArray","processors.arrayProcessor","core._array","core.$ZodObjectJIT","processors.objectProcessor","util.extend","util.safeExtend","util.merge","util.pick","util.omit","util.partial","util.required","core.$ZodUnion","processors.unionProcessor","core.$ZodDiscriminatedUnion","core.$ZodIntersection","processors.intersectionProcessor","core.$ZodTuple","processors.tupleProcessor","core.$ZodRecord","processors.recordProcessor","core.$ZodEnum","processors.enumProcessor","core.$ZodLiteral","processors.literalProcessor","core.$ZodTransform","processors.transformProcessor","core.$ZodOptional","processors.optionalProcessor","core.$ZodExactOptional","core.$ZodNullable","processors.nullableProcessor","core.$ZodDefault","processors.defaultProcessor","util.shallowClone","core.$ZodPrefault","processors.prefaultProcessor","core.$ZodNonOptional","processors.nonoptionalProcessor","core.$ZodCatch","processors.catchProcessor","core.$ZodPipe","processors.pipeProcessor","core.$ZodReadonly","processors.readonlyProcessor","core.$ZodLazy","processors.lazyProcessor","core.$ZodCustom","processors.customProcessor","core._custom","core._refine","core._superRefine","z.enum","z.object","z.string","z.number","z.boolean","z.array","z.record","z.unknown","z.union","z.literal","z.any","z.void","z.instanceof","z.custom","z.lazy","z.discriminatedUnion","z.partialRecord","z.tuple","z.date","z.email","z.null","event","record","z","cached","engine","resolvePipelinePure"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]}
|