@camstack/types 1.2.386 → 1.2.388

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/addon.js +26 -16
  2. package/dist/addon.mjs +26 -16
  3. package/dist/auth/credential-scope.d.ts +37 -5
  4. package/dist/auth/principal-scope.d.ts +1 -1
  5. package/dist/capabilities/alarm-panel.cap.d.ts +10 -2
  6. package/dist/capabilities/capability-definition.d.ts +21 -3
  7. package/dist/capabilities/connectivity.cap.d.ts +10 -2
  8. package/dist/capabilities/device-history.cap.d.ts +195 -3
  9. package/dist/capabilities/dishwasher.cap.d.ts +17 -0
  10. package/dist/capabilities/enum-sensor.cap.d.ts +12 -2
  11. package/dist/capabilities/index.d.ts +6 -5
  12. package/dist/capabilities/llm.cap.d.ts +252 -309
  13. package/dist/capabilities/lock-control.cap.d.ts +9 -2
  14. package/dist/capabilities/log-destination.cap.d.ts +148 -19
  15. package/dist/capabilities/media-player.cap.d.ts +15 -2
  16. package/dist/capabilities/notification-rules.cap.d.ts +213 -13
  17. package/dist/capabilities/stream-params.cap.d.ts +24 -2
  18. package/dist/capabilities/user-management.cap.d.ts +4 -409
  19. package/dist/client.js +76 -11
  20. package/dist/client.mjs +76 -11
  21. package/dist/device/base-device.d.ts +34 -1
  22. package/dist/device/index.d.ts +2 -2
  23. package/dist/generated/addon-api.d.ts +548 -187
  24. package/dist/generated/cap-input-defaults.d.ts +1 -1
  25. package/dist/generated/collection-array-methods.d.ts +2 -2
  26. package/dist/generated/history-catalog.d.ts +1 -1
  27. package/dist/generated/method-access-map.d.ts +1 -1
  28. package/dist/generated/method-device-selectors.d.ts +2 -2
  29. package/dist/generated/system-proxy.d.ts +2 -2
  30. package/dist/index.d.ts +5 -3
  31. package/dist/index.js +861 -164
  32. package/dist/index.mjs +815 -162
  33. package/dist/interfaces/addon-data-plane.d.ts +4 -4
  34. package/dist/interfaces/addon-peer-bytes.d.ts +1 -1
  35. package/dist/interfaces/logging.d.ts +16 -1
  36. package/dist/notification/media-image.d.ts +67 -0
  37. package/dist/schemas/auth-records.d.ts +1 -1
  38. package/dist/schemas/user-preferences.d.ts +103 -0
  39. package/dist/{sleep-BxjU_fJM.mjs → sleep-BSuCCFjf.mjs} +34 -5
  40. package/dist/{sleep-BE7_6UnC.js → sleep-DKtoyk6X.js} +34 -5
  41. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_sleep = require("./sleep-BE7_6UnC.js");
2
+ const require_sleep = require("./sleep-DKtoyk6X.js");
3
3
  const require_event_category = require("./event-category-eSqkye-K.js");
4
4
  const require_composition = require("./composition-eoYYVfOp.js");
5
5
  const require_node_color = require("./node-color.js");
@@ -6616,7 +6616,7 @@ function classifyBearerPrincipal(payload) {
6616
6616
  * would lock every non-admin viewer out of recorder playback, snapshot media
6617
6617
  * and the stream-broker embed, which is a worse outcome than the hole.
6618
6618
  * - **integration** — must hold `addon:<addonId>` at the verb's access. This is
6619
- * the same rule the `cst_` scoped-token branch has always applied; the JWT
6619
+ * the same rule the scoped-token branch has always applied; the JWT
6620
6620
  * branch simply never applied it, and closing that divergence IS the fix.
6621
6621
  * `isAdmin` is ignored: an integration token is minted `isAdmin: false` and a
6622
6622
  * token claiming otherwise must not talk its way past the grant.
@@ -6660,7 +6660,7 @@ function principalMayReachAddon(input) {
6660
6660
  * `super_admin` — collapsed onto the single boolean because every
6661
6661
  * non-admin caller is governed by the same scope-check rules; the
6662
6662
  * distinction was only ever used to route role-specific procedures
6663
- * which we no longer have. CLI / webhook integrations are `cst_*` tokens
6663
+ * which we no longer have. CLI / webhook integrations are tokens (`auth.mintToken`)
6664
6664
  * with `isAdmin: false` + an explicit scope list.
6665
6665
  */
6666
6666
  /** Per-method access flavour. Materialised on every cap method via codegen. */
@@ -6839,13 +6839,13 @@ var ScopedTokenSchema = zod.z.object({
6839
6839
  /**
6840
6840
  * The ONE permission vocabulary every credential is reduced to (D892).
6841
6841
  *
6842
- * A credential — a login session, an account-link token, a legacy `csa_` /
6843
- * `cst_` / `csv_` token, or the unified token `auth.mintToken` issues — is
6842
+ * A credential — a login session, an account-link token, or a token
6843
+ * `auth.mintToken` issues (there is no other format, D895) — is
6844
6844
  * verified into a principal whose permissions are a `CredentialScope[]`, and
6845
6845
  * nothing else. What KIND of credential it was never decides what it may do:
6846
6846
  *
6847
- * - `'*'` — everything (the admin bypass). Held by an admin's session, a
6848
- * legacy admin token, and a unified token minted with it.
6847
+ * - `'*'` — everything (the admin bypass). Held by an admin's session and
6848
+ * a token minted with it.
6849
6849
  * - a {@link TokenScope} — the v3 capability grants (`category`,
6850
6850
  * `capability`, `addon`, `device`) the tRPC matcher has always applied.
6851
6851
  * - `share-view` — one fail-closed embed perimeter (`grid-view` /
@@ -6854,7 +6854,12 @@ var ScopedTokenSchema = zod.z.object({
6854
6854
  * - `addon-routes` — may reach any addon's own `authenticated` HTTP routes
6855
6855
  * and data planes (never an `admin` one). A person's session has always
6856
6856
  * had this; an integration token never had it and must hold
6857
- * `addon:<id>` instead.
6857
+ * `addon:<id>` instead. Only an admin may mint it into a token.
6858
+ * - `preferences-self` — may read and write the SUBJECT's own account
6859
+ * preferences (D894), never another user's. Every person's session holds
6860
+ * it; a unified token holds it only when minted with it. `'*'` does NOT
6861
+ * imply it: the hub's own mesh principal holds `'*'` and is nobody's
6862
+ * account.
6858
6863
  *
6859
6864
  * Pure: no I/O. It lives in `@camstack/types` so the hub, the kernel and any
6860
6865
  * addon read the same vocabulary.
@@ -6878,10 +6883,14 @@ var AddonRoutesScopeSchema = zod.z.object({
6878
6883
  type: zod.z.literal("addon-routes"),
6879
6884
  access: zod.z.array(MethodAccessSchema).min(1)
6880
6885
  });
6886
+ var PreferencesSelfScopeSchema = zod.z.object({ type: zod.z.literal("preferences-self") });
6887
+ /** The grant every person's session carries for its own account preferences. */
6888
+ var PREFERENCES_SELF_SCOPE = { type: "preferences-self" };
6881
6889
  var CredentialScopeSchema = zod.z.union([
6882
6890
  zod.z.literal("*"),
6883
6891
  ShareViewScopeSchema,
6884
6892
  AddonRoutesScopeSchema,
6893
+ PreferencesSelfScopeSchema,
6885
6894
  TokenScopeSchema
6886
6895
  ]);
6887
6896
  /** Every access flavour — what a person's session holds on addon routes. */
@@ -6891,7 +6900,7 @@ var ALL_METHOD_ACCESS = [
6891
6900
  "delete"
6892
6901
  ];
6893
6902
  function isTokenScope(scope) {
6894
- return scope !== "*" && scope.type !== "share-view" && scope.type !== "addon-routes";
6903
+ return scope !== "*" && scope.type !== "share-view" && scope.type !== "addon-routes" && scope.type !== "preferences-self";
6895
6904
  }
6896
6905
  /** True iff the scope set holds `'*'`. */
6897
6906
  function scopesGrantAdmin(scopes) {
@@ -6915,6 +6924,15 @@ function scopesAllowAddonRoutes(scopes, access) {
6915
6924
  return scopes.some((s) => s !== "*" && s.type === "addon-routes" && s.access.includes(access));
6916
6925
  }
6917
6926
  /**
6927
+ * True iff the set may touch its subject's own account preferences: it holds
6928
+ * `preferences-self` and no share-view grant restricts it. `'*'` alone is not
6929
+ * enough (see the vocabulary above).
6930
+ */
6931
+ function scopesAllowOwnPreferences(scopes) {
6932
+ if (shareViewGrantOf(scopes) !== null) return false;
6933
+ return scopes.some((s) => s !== "*" && s.type === "preferences-self");
6934
+ }
6935
+ /**
6918
6936
  * Parse a scope array from an untrusted source (a JWT claim, a stored row).
6919
6937
  * Any element that does not parse makes the WHOLE set unusable — `null` — so
6920
6938
  * a corrupt grant can never degrade into a partial one.
@@ -6931,6 +6949,22 @@ function parseCredentialScopes(raw) {
6931
6949
  */
6932
6950
  var CREDENTIAL_TOKEN_KIND = "credential";
6933
6951
  /**
6952
+ * The `aud` claim every minted token is signed with (D895). The hub's raw JWT
6953
+ * verify (`AuthManager.verifyToken`, used by every surface that wants a LOGIN
6954
+ * session — the OAuth consent page, the session cookie, health, backups)
6955
+ * refuses a token carrying it, so a minted token — a share link above all —
6956
+ * can never be replayed as a person's session. Only the credential verifier's
6957
+ * own door (`verifyCredentialToken`) accepts it.
6958
+ */
6959
+ var CREDENTIAL_TOKEN_AUDIENCE = "camstack:credential";
6960
+ /** Does a verified JWT payload belong to the minted-token family? */
6961
+ function isCredentialTokenPayload(payload) {
6962
+ if (payload === null || typeof payload !== "object") return false;
6963
+ const kind = Reflect.get(payload, "kind");
6964
+ const aud = Reflect.get(payload, "aud");
6965
+ return kind === "credential" || aud === "camstack:credential" || Array.isArray(aud) && aud.includes("camstack:credential");
6966
+ }
6967
+ /**
6934
6968
  * The claims of a unified token (`auth.mintToken`). It carries no `exp`: its
6935
6969
  * row (looked up by `jti` on every verify, for revocation) holds the ONE
6936
6970
  * expiry, so a share link can be extended and a JWT clock can never disagree
@@ -6943,6 +6977,80 @@ var CredentialTokenClaimsSchema = zod.z.object({
6943
6977
  scopes: zod.z.array(CredentialScopeSchema).min(1)
6944
6978
  });
6945
6979
  //#endregion
6980
+ //#region src/schemas/user-preferences.ts
6981
+ /**
6982
+ * Per-user ACCOUNT preferences (D894): the hub-side half of the viewer's two
6983
+ * settings levels.
6984
+ *
6985
+ * - DEVICE settings never leave the phone.
6986
+ * - ACCOUNT settings live here: one row per `(user, namespace)`, private to
6987
+ * that user, synced across every device signed in as them, last write wins
6988
+ * unless the writer sends the revision it based its edit on.
6989
+ *
6990
+ * A setting lives in exactly ONE level; there are no overrides. The caller
6991
+ * never names a user: the hub stamps the principal's own id, admin included.
6992
+ *
6993
+ * The contract the client codes against is the `preferences.*` tRPC router
6994
+ * (`server/backend/src/api/core/preferences.router.ts`).
6995
+ */
6996
+ /** `viewer.app`, `viewer.cameras`, `viewer.grids` … — lowercase, dot/dash separated. */
6997
+ var PREFERENCES_NAMESPACE_PATTERN = /^[a-z][a-z0-9.-]{0,63}$/;
6998
+ /** One row's value, measured as UTF-8 JSON. */
6999
+ var PREFERENCES_MAX_VALUE_BYTES = 256 * 1024;
7000
+ /** Namespaces one user may hold. */
7001
+ var PREFERENCES_MAX_NAMESPACES = 32;
7002
+ /** The opaque client id a writer stamps (`updatedByDevice`). */
7003
+ var PREFERENCES_MAX_DEVICE_ID_LENGTH = 64;
7004
+ var PreferenceNamespaceSchema = zod.z.string().regex(PREFERENCES_NAMESPACE_PATTERN);
7005
+ /** A namespace's value: a JSON object, opaque to the hub. */
7006
+ var PreferenceValueSchema = zod.z.record(zod.z.string(), zod.z.unknown());
7007
+ var PreferenceDeviceIdSchema = zod.z.string().min(1).max(64);
7008
+ /** A stored row, as the owner reads it. */
7009
+ var PreferenceRowSchema = zod.z.object({
7010
+ namespace: PreferenceNamespaceSchema,
7011
+ value: PreferenceValueSchema,
7012
+ /** Starts at 1, +1 on every write of this namespace. A delete ends the row and its count. */
7013
+ revision: zod.z.number().int().positive(),
7014
+ updatedAt: zod.z.number().int(),
7015
+ /** The client id the last writer sent; `null` when it sent none. */
7016
+ updatedByDevice: PreferenceDeviceIdSchema.nullable()
7017
+ });
7018
+ var PreferencesGetInputSchema = zod.z.object({
7019
+ /** Absent: every namespace the caller holds. */
7020
+ namespaces: zod.z.array(PreferenceNamespaceSchema).max(32).optional() });
7021
+ var PreferencesGetOutputSchema = zod.z.object({ rows: zod.z.array(PreferenceRowSchema) });
7022
+ var PreferencesPutInputSchema = zod.z.object({
7023
+ namespace: PreferenceNamespaceSchema,
7024
+ value: PreferenceValueSchema,
7025
+ /**
7026
+ * The revision the edit was based on. Absent: last write wins. `0`: the
7027
+ * namespace must not exist yet. Any other value that is not the current
7028
+ * revision answers `conflict` and writes nothing.
7029
+ */
7030
+ baseRevision: zod.z.number().int().nonnegative().optional(),
7031
+ deviceId: PreferenceDeviceIdSchema.optional()
7032
+ });
7033
+ var PreferencesPutOutputSchema = zod.z.discriminatedUnion("status", [zod.z.object({
7034
+ status: zod.z.literal("saved"),
7035
+ row: PreferenceRowSchema
7036
+ }), zod.z.object({
7037
+ status: zod.z.literal("conflict"),
7038
+ current: PreferenceRowSchema.nullable()
7039
+ })]);
7040
+ var PreferencesDeleteInputSchema = zod.z.object({ namespace: PreferenceNamespaceSchema });
7041
+ var PreferencesDeleteOutputSchema = zod.z.object({
7042
+ /** `false` when the namespace did not exist. */
7043
+ deleted: zod.z.boolean() });
7044
+ var PreferencesChangedSinceInputSchema = zod.z.object({
7045
+ /** The revision the client holds per namespace; a namespace it does not list is new to it. */
7046
+ revisionByNamespace: zod.z.record(PreferenceNamespaceSchema, zod.z.number().int().nonnegative()).refine((map) => Object.keys(map).length <= 32, { message: `at most 32 namespaces` }) });
7047
+ var PreferencesChangedSinceOutputSchema = zod.z.object({
7048
+ /** Every row whose revision differs from the client's, and every row it did not list. */
7049
+ rows: zod.z.array(PreferenceRowSchema),
7050
+ /** Namespaces the client listed that no longer exist. */
7051
+ deleted: zod.z.array(PreferenceNamespaceSchema)
7052
+ });
7053
+ //#endregion
6946
7054
  //#region src/auth/app-callback.ts
6947
7055
  /**
6948
7056
  * The viewer app's custom-scheme callback — the ONE list of URLs a hub flow
@@ -14926,11 +15034,30 @@ var DeviceHistorySubjectSchema = zod.z.discriminatedUnion("kind", [zod.z.object(
14926
15034
  kind: zod.z.literal("node"),
14927
15035
  nodeId: zod.z.string().min(1)
14928
15036
  })]);
15037
+ /**
15038
+ * `enum` stores a STATE as the ordinal of its value in the series' value list
15039
+ * (`DeviceHistorySeriesInfo.values`, append-only, so an ordinal never changes
15040
+ * meaning); a rollup keeps the time spent in each state (`states`).
15041
+ */
14929
15042
  var DeviceHistoryKindSchema = zod.z.enum([
15043
+ "gauge",
15044
+ "counter",
15045
+ "boolean",
15046
+ "enum"
15047
+ ]);
15048
+ /** What a PRODUCER may declare. `enum` is cap-only: its value list is the cap field's. */
15049
+ var DeviceHistoryProducerKindSchema = zod.z.enum([
14930
15050
  "gauge",
14931
15051
  "counter",
14932
15052
  "boolean"
14933
15053
  ]);
15054
+ /**
15055
+ * A key computed at READ time from stored series of the same device, never
15056
+ * stored itself. Energy (kWh per bucket) comes from the power meter's
15057
+ * `kwhTotal` counter when the device has one, else from integrating its
15058
+ * `watts` gauge over time.
15059
+ */
15060
+ var DEVICE_HISTORY_ENERGY_KEY = "derived:energy.kwh";
14934
15061
  var DeviceHistoryResolutionSchema = zod.z.enum([
14935
15062
  "raw",
14936
15063
  "5m",
@@ -14963,7 +15090,13 @@ var SeriesInfoSchema = zod.z.object({
14963
15090
  /** `null` is unknown (a `unitFrom` series whose device does not state a unit right now), never a guess. */
14964
15091
  unit: zod.z.string().nullable(),
14965
15092
  displayName: zod.z.string(),
14966
- source: zod.z.enum(["cap", "addon"]),
15093
+ source: zod.z.enum([
15094
+ "cap",
15095
+ "addon",
15096
+ "derived"
15097
+ ]),
15098
+ /** `enum`: the value of each ordinal (index = ordinal); `null` for every other kind. */
15099
+ values: zod.z.array(zod.z.string()).readonly().nullable(),
14967
15100
  firstTs: zod.z.number(),
14968
15101
  lastTs: zod.z.number()
14969
15102
  });
@@ -14977,17 +15110,31 @@ var QueryPointSchema = zod.z.object({
14977
15110
  twMean: zod.z.number().nullable(),
14978
15111
  min: zod.z.number(),
14979
15112
  max: zod.z.number(),
14980
- /** `null` is unknown, never zero (D393). */
14981
- last: zod.z.number().nullable()
15113
+ /** `null` is unknown, never zero (D393). For an `enum` series: the ordinal of {@link state}. */
15114
+ last: zod.z.number().nullable(),
15115
+ /**
15116
+ * The increase over the point: a `counter`'s growth since the previous point
15117
+ * or bucket (a drop is a reset, counted from zero), and for
15118
+ * {@link DEVICE_HISTORY_ENERGY_KEY} the kWh used in the bucket. `null` for
15119
+ * every other kind, and when it cannot be known.
15120
+ */
15121
+ delta: zod.z.number().nullable(),
15122
+ /** `enum`: the state in force at the end of the point (the name of `last`); `null` otherwise. */
15123
+ state: zod.z.string().nullable(),
15124
+ /** `enum` rollup: milliseconds spent in each state inside the bucket; `null` for raw points and other kinds. */
15125
+ states: zod.z.record(zod.z.string(), zod.z.number()).nullable()
14982
15126
  });
14983
15127
  var QuerySeriesSchema = zod.z.object({
14984
15128
  scope: zod.z.string(),
14985
15129
  /** The last point STRICTLY BEFORE `from` in the chosen tier, so a step chart can start at the held value. */
14986
15130
  before: zod.z.object({
14987
15131
  t: zod.z.number(),
14988
- value: zod.z.number().nullable()
15132
+ value: zod.z.number().nullable(),
15133
+ state: zod.z.string().nullable()
14989
15134
  }).nullable(),
14990
- points: zod.z.array(QueryPointSchema).readonly()
15135
+ points: zod.z.array(QueryPointSchema).readonly(),
15136
+ /** A derived key: the stored key its points were computed from; `null` for a stored series. */
15137
+ derivedFrom: zod.z.string().nullable()
14991
15138
  });
14992
15139
  /** The window part of a query, shared by the device and node forms. */
14993
15140
  var QueryWindowShape = {
@@ -15003,6 +15150,25 @@ var QueryResultSchema = zod.z.object({
15003
15150
  series: zod.z.array(QuerySeriesSchema).readonly(),
15004
15151
  truncated: zod.z.boolean()
15005
15152
  });
15153
+ /** Items one `queryMany` may carry: a dashboard's worth, not a scan. */
15154
+ var DEVICE_HISTORY_QUERY_MANY_MAX_ITEMS = 24;
15155
+ /** One read of a batch: a device's key or a node's key (exactly one subject). */
15156
+ var QueryManyItemSchema = zod.z.union([zod.z.object({
15157
+ deviceId: zod.z.number().int(),
15158
+ key: zod.z.string(),
15159
+ scope: zod.z.string().optional()
15160
+ }), zod.z.object({
15161
+ forNodeId: zod.z.string().min(1),
15162
+ key: zod.z.string(),
15163
+ scope: zod.z.string().optional()
15164
+ })]);
15165
+ var QueryManyEntrySchema = zod.z.discriminatedUnion("ok", [zod.z.object({
15166
+ ok: zod.z.literal(true),
15167
+ result: QueryResultSchema
15168
+ }), zod.z.object({
15169
+ ok: zod.z.literal(false),
15170
+ error: zod.z.string()
15171
+ })]);
15006
15172
  var TierStatusSchema = zod.z.object({
15007
15173
  tier: DeviceHistoryResolutionSchema,
15008
15174
  /** `null` until the first background count answered. */
@@ -15071,26 +15237,45 @@ var deviceHistoryCapability = {
15071
15237
  * `listNodeSeries` / `queryNode`.
15072
15238
  */
15073
15239
  listSeries: require_sleep.method(zod.z.object({ deviceId: zod.z.number().int() }), zod.z.array(SeriesInfoSchema).readonly()),
15074
- listNodeSeries: require_sleep.method(zod.z.object({ nodeId: zod.z.string().min(1) }), zod.z.array(SeriesInfoSchema).readonly(), { auth: "admin" }),
15240
+ /**
15241
+ * A NODE's series. The subject is `forNodeId`, never `nodeId`: a top-level
15242
+ * `nodeId` is the cap ROUTING key, and `nodeId: 'little-unraid'` sent the
15243
+ * read to that agent, which hosts no device-history.
15244
+ */
15245
+ listNodeSeries: require_sleep.method(zod.z.object({ forNodeId: zod.z.string().min(1) }), zod.z.array(SeriesInfoSchema).readonly(), { auth: "admin" }),
15075
15246
  /**
15076
15247
  * One series (or every scope of it) at one resolution. `auto` picks the
15077
15248
  * finest tier whose retention covers `from` and whose point count fits
15078
15249
  * `maxPoints`; when even the coarsest tier does not fit, the newest
15079
- * `maxPoints` points are returned and `truncated` is true.
15250
+ * `maxPoints` points are returned and `truncated` is true. A series fed by
15251
+ * closed buckets has no raw rows, so `auto` never answers it from raw; nor
15252
+ * {@link DEVICE_HISTORY_ENERGY_KEY}, which is computed from rollups.
15080
15253
  */
15081
15254
  query: require_sleep.method(zod.z.object({
15082
15255
  deviceId: zod.z.number().int(),
15083
15256
  ...QueryWindowShape
15084
15257
  }), QueryResultSchema),
15085
15258
  queryNode: require_sleep.method(zod.z.object({
15086
- nodeId: zod.z.string().min(1),
15259
+ forNodeId: zod.z.string().min(1),
15087
15260
  ...QueryWindowShape
15088
15261
  }), QueryResultSchema, { auth: "admin" }),
15262
+ /**
15263
+ * Several reads over ONE window, answered in order (one entry per item).
15264
+ * Admin-only: its subjects are nested in `items`, where the device scope
15265
+ * gate cannot see them — a principal limited to one device uses `query`.
15266
+ */
15267
+ queryMany: require_sleep.method(zod.z.object({
15268
+ items: zod.z.array(QueryManyItemSchema).min(1).max(24),
15269
+ from: QueryWindowShape.from,
15270
+ to: QueryWindowShape.to,
15271
+ resolution: QueryWindowShape.resolution,
15272
+ maxPoints: QueryWindowShape.maxPoints
15273
+ }), zod.z.object({ results: zod.z.array(QueryManyEntrySchema).readonly() }), { auth: "admin" }),
15089
15274
  /** Producer: declare (idempotent) a series key this addon owns: `addon:<callerAddonId>/<name>`. */
15090
15275
  declareSeries: require_sleep.method(zod.z.object({
15091
15276
  name: zod.z.string().regex(/^[a-z0-9-]+$/),
15092
15277
  subjectKind: zod.z.enum(["device", "node"]),
15093
- kind: DeviceHistoryKindSchema,
15278
+ kind: DeviceHistoryProducerKindSchema,
15094
15279
  unit: zod.z.string().optional(),
15095
15280
  displayName: zod.z.string().min(1),
15096
15281
  ingest: zod.z.enum(["points", "buckets"])
@@ -40118,30 +40303,50 @@ var llmRuntimeCapability = {
40118
40303
  * (hub-placed); the cap stays open for future providers.
40119
40304
  *
40120
40305
  * Profiles are ROWS (data), not addons: one row = one usable model endpoint.
40121
- * `apiKey` is a password field — providers REDACT it on read and merge on
40122
- * write; a stored key NEVER round-trips to a client.
40123
- */
40124
- var LlmProfileKindSchema = zod.z.enum([
40125
- "openai-compatible",
40126
- "openai",
40127
- "anthropic",
40128
- "google",
40129
- "managed-local",
40130
- "apple-foundation"
40131
- ]);
40306
+ * A row is common fields plus `providerConfig`, which the provider owning the
40307
+ * row's kind declares (`connectionSchema`) and validates. The kind is an open
40308
+ * id declared by that provider (D893). A `password` field of the provider's
40309
+ * schema is a secret — providers REDACT it on read and merge on write; a
40310
+ * stored key NEVER round-trips to a client.
40311
+ */
40312
+ /**
40313
+ * A profile kind is an OPEN id, declared by the provider that serves it
40314
+ * (`listProfileKinds`). The cap names no kind: a new provider ships a new kind
40315
+ * without a framework change. Lower-case, digits and dashes, so it stays safe
40316
+ * as a URL segment, a record field and a CSS hook.
40317
+ */
40318
+ var LLM_PROFILE_KIND_PATTERN = /^[a-z0-9][a-z0-9-]{0,63}$/;
40319
+ var LlmProfileKindSchema = zod.z.string().regex(LLM_PROFILE_KIND_PATTERN, "a kind id is lower-case letters, digits and dashes");
40320
+ /** What a model (or, by default, every model of a kind) can do. */
40321
+ var LlmModelFeaturesSchema = zod.z.object({
40322
+ vision: zod.z.boolean(),
40323
+ tools: zod.z.boolean(),
40324
+ streaming: zod.z.boolean()
40325
+ });
40326
+ /** One model a provider offers. `features` overrides the kind's defaults, per field. */
40327
+ var LlmModelInfoSchema = zod.z.object({
40328
+ id: zod.z.string(),
40329
+ label: zod.z.string().optional(),
40330
+ contextLength: zod.z.number().int().positive().optional(),
40331
+ features: LlmModelFeaturesSchema.partial().optional()
40332
+ });
40333
+ /**
40334
+ * The provider-specific part of a profile, validated by the provider that owns
40335
+ * the kind (`upsertProfile` refuses what it does not accept). A field its
40336
+ * `connectionSchema` declares `type: 'password'` is a secret: it is held in the
40337
+ * keychain, never in the row, and reads back as the redaction marker.
40338
+ */
40339
+ var LlmProviderConfigSchema = zod.z.record(zod.z.string(), zod.z.unknown());
40132
40340
  var LlmProfileSchema = zod.z.object({
40133
40341
  id: zod.z.string(),
40134
40342
  name: zod.z.string(),
40343
+ /** The provider-declared kind (`LlmProfileKindDescriptor.kind`). */
40135
40344
  kind: LlmProfileKindSchema,
40136
40345
  /** Stamped by the provider — keeps the fanned catalog routable. */
40137
40346
  addonId: zod.z.string(),
40138
40347
  enabled: zod.z.boolean(),
40139
40348
  /** Vendor model id, or the managed runtime's loaded model. */
40140
40349
  model: zod.z.string(),
40141
- /** Required for openai-compatible; override for cloud kinds. */
40142
- baseUrl: zod.z.string().optional(),
40143
- /** ConfigUISchema type:'password' — never round-trips (spec §5). */
40144
- apiKey: zod.z.string().optional(),
40145
40350
  /** Vision on/off. A vision call against a `false` profile is REFUSED, never
40146
40351
  * degraded to text — that shipped once and produced a confident answer to a
40147
40352
  * question about a picture nobody sent. */
@@ -40149,15 +40354,11 @@ var LlmProfileSchema = zod.z.object({
40149
40354
  temperature: zod.z.number().min(0).max(2).optional(),
40150
40355
  /** Nucleus sampling. Every wire we speak has it. */
40151
40356
  topP: zod.z.number().min(0).max(1).optional(),
40152
- /** Top-k sampling. Carried only by the wires that have it — NEITHER OpenAI
40153
- * wire does, and the client drops it there (measured: the request body gets
40154
- * `top_p` and no `top_k`). The profile editor hides the field wherever it
40155
- * would change nothing; `KINDS_WITH_TOP_K` is the single owner of that list. */
40357
+ /** Top-k sampling. Carried only by the wires that have it — a kind offers the
40358
+ * field in its editor only when its descriptor lists it in `profileFields`. */
40156
40359
  topK: zod.z.number().int().positive().optional(),
40157
40360
  maxTokens: zod.z.number().int().positive().optional(),
40158
- /** Prompt context window. Advisory for cloud kinds (they enforce their own);
40159
- * for `managed-local` it is the llama.cpp `--ctx-size` the runtime starts
40160
- * the model with, so it is the one field that changes a PROCESS. */
40361
+ /** Prompt context window. Advisory for cloud kinds (they enforce their own). */
40161
40362
  contextLength: zod.z.number().int().positive().optional(),
40162
40363
  /** Default system prompt. A caller's `system` REPLACES it (never appends —
40163
40364
  * two system prompts fighting is worse than either alone). */
@@ -40183,16 +40384,37 @@ var LlmProfileSchema = zod.z.object({
40183
40384
  * library; the REGISTRY of callable tools is ours and is empty in v1, so a
40184
40385
  * `true` here buys the wiring, not behaviour, until tools are registered. */
40185
40386
  toolsEnabled: zod.z.boolean().default(false),
40186
- extraHeaders: zod.z.record(zod.z.string(), zod.z.string()).optional(),
40187
- /** kind === 'managed-local' only (spec §4). */
40188
- runtime: ManagedRuntimeConfigSchema.optional(),
40189
- /**
40190
- * kind === 'apple-foundation' only: WHERE it runs — the only thing there is
40191
- * to configure (no key, no URL, no download; `model` is `apple-system`).
40192
- * `supportsVision` on such a row is stamped by the provider from the node's
40193
- * reported `imageInput`, never taken from the operator (D62).
40194
- */
40195
- appleFoundation: zod.z.object({ nodeId: zod.z.string() }).optional()
40387
+ /** Everything the kind's provider owns (endpoint, key, node, runtime…). */
40388
+ providerConfig: LlmProviderConfigSchema.default({})
40389
+ });
40390
+ /**
40391
+ * The common profile fields a kind's editor offers. The editor owns how each
40392
+ * one is drawn; the provider says which of them mean something on its wire.
40393
+ */
40394
+ var LlmProfileFieldSchema = zod.z.enum([
40395
+ "temperature",
40396
+ "topP",
40397
+ "topK",
40398
+ "maxTokens",
40399
+ "contextLength",
40400
+ "systemPrompt",
40401
+ "timeoutMs",
40402
+ "connectTimeoutMs",
40403
+ "firstTokenTimeoutMs",
40404
+ "idleTimeoutMs",
40405
+ "retry",
40406
+ "toolsEnabled"
40407
+ ]);
40408
+ /**
40409
+ * A provider-drawn part of the editor, by a generic widget id the admin UI
40410
+ * registers (`ai/apple-node`). `placement: 'model'` replaces the generic model
40411
+ * picker: that widget owns the model choice.
40412
+ */
40413
+ var LlmProviderWidgetSchema = zod.z.object({
40414
+ id: zod.z.string(),
40415
+ placement: zod.z.enum(["connection", "model"]),
40416
+ /** `providerConfig` keys this widget must fill before the profile can be saved. */
40417
+ requires: zod.z.array(zod.z.string()).optional()
40196
40418
  });
40197
40419
  /** ConfigUISchema tree passed through untyped on the wire (the
40198
40420
  * notification-output `ConfigSchemaPassthrough` precedent at
@@ -40201,11 +40423,56 @@ var ConfigSchemaPassthrough$3 = zod.z.unknown();
40201
40423
  var LlmProfileKindDescriptorSchema = zod.z.object({
40202
40424
  kind: LlmProfileKindSchema,
40203
40425
  label: zod.z.string(),
40426
+ /** A generic icon name (`cloud`, `plug`, `cpu`) — never a glyph or a logo. */
40204
40427
  icon: zod.z.string(),
40205
40428
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
40206
40429
  addonId: zod.z.string(),
40207
- configSchema: ConfigSchemaPassthrough$3
40430
+ /** The provider's own fields (`providerConfig`); `password` fields are keychain-held. */
40431
+ connectionSchema: ConfigSchemaPassthrough$3,
40432
+ /** Provider fields that belong under "Advanced" (extra headers, runtime tuning). */
40433
+ advancedSchema: ConfigSchemaPassthrough$3.optional(),
40434
+ /** The kind's defaults; a model from `listModels` may override any of them. */
40435
+ features: LlmModelFeaturesSchema,
40436
+ /** `false` = the provider stamps `supportsVision` itself (from what a node reports). */
40437
+ visionEditable: zod.z.boolean(),
40438
+ /** Where the model list comes from: `listModels`, `staticModels`, or nowhere. */
40439
+ modelCatalog: zod.z.enum([
40440
+ "fetch",
40441
+ "static",
40442
+ "none"
40443
+ ]),
40444
+ staticModels: zod.z.array(LlmModelInfoSchema).optional(),
40445
+ /** The common fields that mean something on this kind's wire. */
40446
+ profileFields: zod.z.array(LlmProfileFieldSchema),
40447
+ providerWidgets: zod.z.array(LlmProviderWidgetSchema).optional()
40208
40448
  });
40449
+ /**
40450
+ * `listModels` input. `connection` is an UNSAVED draft of `providerConfig`
40451
+ * (the editor's form); with `profileId` too, a secret the draft leaves
40452
+ * untouched (absent or the redaction marker) is resolved server-side from the
40453
+ * stored profile — the browser never receives it.
40454
+ */
40455
+ var LlmListModelsInputSchema = zod.z.object({
40456
+ addonId: zod.z.string(),
40457
+ kind: LlmProfileKindSchema,
40458
+ profileId: zod.z.string().optional(),
40459
+ connection: LlmProviderConfigSchema.optional()
40460
+ });
40461
+ var LlmListModelsErrorCodeSchema = zod.z.enum([
40462
+ "auth",
40463
+ "network",
40464
+ "unsupported",
40465
+ "invalid"
40466
+ ]);
40467
+ /** A RESULT, never a throw: "wrong key" is an answer the editor renders inline. */
40468
+ var LlmListModelsResultSchema = zod.z.discriminatedUnion("ok", [zod.z.object({
40469
+ ok: zod.z.literal(true),
40470
+ models: zod.z.array(LlmModelInfoSchema)
40471
+ }), zod.z.object({
40472
+ ok: zod.z.literal(false),
40473
+ code: LlmListModelsErrorCodeSchema,
40474
+ message: zod.z.string()
40475
+ })]);
40209
40476
  var LlmDefaultSelectorSchema = zod.z.union([zod.z.object({ consumer: zod.z.string() }), zod.z.object({ purpose: zod.z.enum(["text", "vision"]) })]);
40210
40477
  var LlmDefaultSchema = zod.z.object({
40211
40478
  selector: LlmDefaultSelectorSchema,
@@ -40336,8 +40603,17 @@ var llmCapability = {
40336
40603
  auth: "admin",
40337
40604
  timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
40338
40605
  }),
40339
- /** Live vendor enumeration (GET /models etc.). */
40340
- listModels: require_sleep.method(ProfileRefInputSchema, zod.z.array(zod.z.string())),
40606
+ /**
40607
+ * The models a kind offers, for a SAVED profile or an unsaved draft
40608
+ * (`connection`). A mutation, not a query: a draft may carry a key, and a
40609
+ * query's input travels in the URL. Admin: it dials whatever endpoint the
40610
+ * draft names and may resolve a stored key to do it. The answer never
40611
+ * carries a secret — failures are a typed result, never a throw.
40612
+ */
40613
+ listModels: require_sleep.method(LlmListModelsInputSchema, LlmListModelsResultSchema, {
40614
+ kind: "mutation",
40615
+ auth: "admin"
40616
+ }),
40341
40617
  getDefaults: require_sleep.method(zod.z.object({}), zod.z.array(LlmDefaultSchema)),
40342
40618
  setDefault: require_sleep.method(zod.z.object({
40343
40619
  selector: LlmDefaultSelectorSchema,
@@ -40651,6 +40927,103 @@ var LogEntrySchema = zod.z.object({
40651
40927
  meta: zod.z.record(zod.z.string(), zod.z.unknown()).optional(),
40652
40928
  tags: zod.z.record(zod.z.string(), zod.z.string()).optional()
40653
40929
  });
40930
+ /**
40931
+ * A history READ against one destination (D898).
40932
+ *
40933
+ * Every filter is applied by the PROVIDER, before the limit — a filter the
40934
+ * browser applied after the limit is what made a rare device's lines
40935
+ * unreachable behind a busy one's. `before` / `after` are cursors the provider
40936
+ * minted (opaque to everyone else): a file position for the rotated files, a
40937
+ * nanosecond timestamp for Loki.
40938
+ *
40939
+ * A read is BOUNDED by `budgetMs`: a filter that matches nothing on a 30-day
40940
+ * store answers `done: false` with the cursor it reached and the bytes it
40941
+ * scanned, and the caller decides whether to go on. That is what makes a long
40942
+ * scan show progress and stop when asked — `cancelRead` ends the slice in
40943
+ * flight, and not asking for the next slice ends the scan.
40944
+ */
40945
+ var LogReadQuerySchema = zod.z.object({
40946
+ /** Correlates `cancelRead`. Caller-chosen, unique per in-flight read. */
40947
+ requestId: zod.z.string().min(1).max(64).optional(),
40948
+ /** The device the line is about (`tags.deviceId`, numeric). */
40949
+ deviceId: zod.z.number().int().optional(),
40950
+ /**
40951
+ * The emitting addon — bare manifest id; `@<version>` / `::<sub>` suffixes
40952
+ * match. Not `addonId`: a cap router reads that name as "which provider".
40953
+ */
40954
+ fromAddonId: zod.z.string().min(1).max(200).optional(),
40955
+ /**
40956
+ * The emitting node: matches the agent that emitted the line, the node
40957
+ * itself, or a worker under it (`<agent>/<runner>`) — the `agentId`
40958
+ * semantics of `matchesLogTags`. Not `nodeId`: a cap router reads that
40959
+ * name as "which node's provider".
40960
+ */
40961
+ fromNodeId: zod.z.string().min(1).max(200).optional(),
40962
+ /** Any other tag, exact match (AND). */
40963
+ tags: zod.z.record(zod.z.string(), zod.z.union([zod.z.string(), zod.z.number()])).optional(),
40964
+ /** Severity FLOOR: this level and above. */
40965
+ level: LogLevelSchema.optional(),
40966
+ /** Case-insensitive substring over message, scope, tag values and meta values. */
40967
+ text: zod.z.string().min(1).max(200).optional(),
40968
+ /** Epoch ms, inclusive. */
40969
+ since: zod.z.number().optional(),
40970
+ /** Epoch ms, inclusive. */
40971
+ until: zod.z.number().optional(),
40972
+ /** Older than this cursor (exclusive). Absent with `after` absent ⇒ from the newest. */
40973
+ before: zod.z.string().min(1).max(1024).optional(),
40974
+ /** Newer than this cursor (exclusive). */
40975
+ after: zod.z.string().min(1).max(1024).optional(),
40976
+ limit: zod.z.number().int().min(1).max(1e3).optional(),
40977
+ /** Wall-clock bound of this slice. The provider caps it. */
40978
+ budgetMs: zod.z.number().int().min(50).max(1e4).optional()
40979
+ });
40980
+ var LogReadEntrySchema = zod.z.object({
40981
+ /** `<bootId>.<seq>` minted by the emitting LogManager — the dedupe key. */
40982
+ id: zod.z.string().optional(),
40983
+ /** Epoch ms. */
40984
+ timestamp: zod.z.number(),
40985
+ level: LogLevelSchema,
40986
+ scope: zod.z.string().optional(),
40987
+ message: zod.z.string(),
40988
+ tags: zod.z.record(zod.z.string(), zod.z.union([zod.z.string(), zod.z.number()])).optional(),
40989
+ meta: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
40990
+ });
40991
+ var LogReadResultSchema = zod.z.object({
40992
+ /** Newest first. */
40993
+ entries: zod.z.array(LogReadEntrySchema),
40994
+ /** Pass as `before` for the next older page; null when nothing older exists. */
40995
+ nextBefore: zod.z.string().nullable(),
40996
+ /** Pass as `after` to read what arrived since; null when unknown. */
40997
+ nextAfter: zod.z.string().nullable(),
40998
+ /** Bytes this slice read (files) or received (remote). Progress, not a promise. */
40999
+ scannedBytes: zod.z.number().int().nonnegative(),
41000
+ /**
41001
+ * True when the scan in this direction reached the end of the store.
41002
+ * False with fewer than `limit` entries means the budget ran out first —
41003
+ * call again with `nextBefore` to go on.
41004
+ */
41005
+ done: zod.z.boolean(),
41006
+ /** True when `cancelRead` ended this slice early. */
41007
+ cancelled: zod.z.boolean().optional()
41008
+ });
41009
+ var LogReadCapabilitiesSchema = zod.z.object({
41010
+ /** False ⇒ this destination only ships lines (console, forwarder, an unconfigured Loki). */
41011
+ readable: zod.z.boolean(),
41012
+ /** Why not, when `readable` is false — rendered next to the source. */
41013
+ reason: zod.z.string().nullable(),
41014
+ /** Filters the provider applies itself. A false one is applied by nobody. */
41015
+ filters: zod.z.object({
41016
+ deviceId: zod.z.boolean(),
41017
+ addonId: zod.z.boolean(),
41018
+ nodeId: zod.z.boolean(),
41019
+ tags: zod.z.boolean(),
41020
+ level: zod.z.boolean(),
41021
+ text: zod.z.boolean(),
41022
+ timeRange: zod.z.boolean()
41023
+ }),
41024
+ /** How far back the store reaches, when the provider knows (days). */
41025
+ retentionDays: zod.z.number().nullable()
41026
+ });
40654
41027
  var logDestinationCapability = {
40655
41028
  name: "log-destination",
40656
41029
  scope: "system",
@@ -40658,14 +41031,13 @@ var logDestinationCapability = {
40658
41031
  internal: true,
40659
41032
  methods: {
40660
41033
  write: require_sleep.method(LogEntrySchema, zod.z.void(), { kind: "mutation" }),
40661
- query: require_sleep.method(zod.z.object({
40662
- scope: zod.z.array(zod.z.string()).optional(),
40663
- level: LogLevelSchema.optional(),
40664
- since: zod.z.date().optional(),
40665
- until: zod.z.date().optional(),
40666
- limit: zod.z.number().optional(),
40667
- tags: zod.z.record(zod.z.string(), zod.z.string()).optional()
40668
- }), zod.z.array(LogEntrySchema).readonly())
41034
+ /** Absent ⇒ the destination cannot read back (same as `readable: false`). */
41035
+ describeRead: require_sleep.optionalMethod(zod.z.void(), LogReadCapabilitiesSchema, { auth: "admin" }),
41036
+ read: require_sleep.optionalMethod(LogReadQuerySchema, LogReadResultSchema, { auth: "admin" }),
41037
+ cancelRead: require_sleep.optionalMethod(zod.z.object({ requestId: zod.z.string().min(1).max(64) }), zod.z.object({ cancelled: zod.z.boolean() }), {
41038
+ kind: "mutation",
41039
+ auth: "admin"
41040
+ })
40669
41041
  },
40670
41042
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
40671
41043
  mount: { kind: "skip" }
@@ -42990,9 +43362,11 @@ var alarmPanelCapability = {
42990
43362
  */
42991
43363
  durability: "restored",
42992
43364
  /**
42993
- * History (D850): none — enum state; arm/disarm history belongs in the events ledger.
43365
+ * History (D850): the panel's lifecycle state as an `enum` series —
43366
+ * change-only, no floor, so an `arming -> pending -> triggered` sequence of a
43367
+ * few seconds keeps every step. Who armed it stays in the events ledger.
42994
43368
  */
42995
- history: "none",
43369
+ history: { fields: { state: { kind: "enum" } } },
42996
43370
  /** Clock fields: written, but excluded from the compare that decides
42997
43371
  * whether persisting is worth a SQLite commit. */
42998
43372
  volatileStateFields: ["lastChangedAt"]
@@ -43985,6 +44359,33 @@ var NcRuleTargetSchema = zod.z.object({
43985
44359
  params: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
43986
44360
  });
43987
44361
  /**
44362
+ * WHAT THE NOTIFICATION'S PICTURE IS (D897) — the ONE media choice of a rule.
44363
+ *
44364
+ * Every mode starts from the same CLEAN source frame of the trigger moment
44365
+ * (keyFrame → sceneFrame → lastSceneFrame, narrowed to the trigger instant and
44366
+ * to the zone that fired the rule) and renders it once at send time:
44367
+ * - `scene-boxes` — the whole scene, the subject outlined thick in the accent
44368
+ * colour and every OTHER track visible at that instant outlined thin, each
44369
+ * labelled with class and confidence ("dog 87%").
44370
+ * - `crop` — the subject cut out of that frame around its box at that instant.
44371
+ * - `clean` — the whole scene with nothing drawn on it.
44372
+ * - `none` — no picture.
44373
+ *
44374
+ * A mode that cannot be honoured (no box at that instant, a photograph with no
44375
+ * tracked subject) ships `clean` and names the reason in the log, per camera.
44376
+ * It replaces the `attach` × `frame` × `zoneCrop` triple, which let one rule
44377
+ * ship a crop on one event and a boxed scene on the next depending on which
44378
+ * stored kind had landed.
44379
+ */
44380
+ var NcMediaImageSchema = zod.z.enum([
44381
+ "scene-boxes",
44382
+ "crop",
44383
+ "clean",
44384
+ "none"
44385
+ ]);
44386
+ /**
44387
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
44388
+ *
43988
44389
  * Media attachment policy (P1 still-image subset).
43989
44390
  * - `best` — the best AVAILABLE subject image at dispatch time (D-3).
43990
44391
  * - `best-matching` — the media that explains WHY the rule fired: a rule
@@ -43998,6 +44399,8 @@ var NcRuleTargetSchema = zod.z.object({
43998
44399
  * - `none` — no attachment.
43999
44400
  */
44000
44401
  /**
44402
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
44403
+ *
44001
44404
  * WHAT THE PICTURE SHOWS — chosen explicitly, because the implicit ladders
44002
44405
  * conflate it with the selection strategy and betray the request: asking for
44003
44406
  * the clean scene frame on an object-event owner used to start at
@@ -44044,16 +44447,29 @@ var NcLinkedCameraModeSchema = zod.z.enum(["mosaic", "each"]);
44044
44447
  var NC_CLIP_PRE_ROLL_DEFAULT_SEC = 4;
44045
44448
  var NC_CLIP_POST_ROLL_DEFAULT_SEC = 6;
44046
44449
  var NcMediaPolicySchema = zod.z.object({
44450
+ /**
44451
+ * The picture — see {@link NcMediaImageSchema}. Absent on a rule nobody has
44452
+ * saved since D897: `normalizeNcMediaPolicy` derives it from the legacy
44453
+ * triple below, at load and at every write, and the store keeps only this.
44454
+ */
44455
+ image: NcMediaImageSchema.optional(),
44456
+ /**
44457
+ * Draw the zone that FIRED the rule on the picture (`scene-boxes` / `clean`;
44458
+ * a `crop` never shows it). Valid only on a rule whose trigger is a zone —
44459
+ * `conditions.zones` or an occupancy zone — and refused on save otherwise.
44460
+ * Replaces `zoneCrop`.
44461
+ */
44462
+ showTriggerZone: zod.z.boolean().optional(),
44463
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
44047
44464
  attach: zod.z.enum([
44048
44465
  "best",
44049
44466
  "best-matching",
44050
44467
  "keyFrame",
44051
44468
  "none"
44052
- ]).default("best"),
44053
- /** What the still shows. Absent = `cropped` (the historical `best` shape). */
44469
+ ]).optional(),
44470
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
44054
44471
  frame: NcMediaFrameSchema.optional(),
44055
- /** Crop the attached still to the rule's condition-zone bbox (padded) —
44056
- * "show me the ZONE", not the whole scene or the subject crop. */
44472
+ /** @deprecated D897 — folded into `image: 'clean'` + `showTriggerZone` on save. */
44057
44473
  zoneCrop: zod.z.boolean().optional(),
44058
44474
  /**
44059
44475
  * Also attach a short GIF cut from the stream broker's clip ring around the
@@ -44239,7 +44655,9 @@ var NcRuleInputSchema = zod.z.object({
44239
44655
  * targets.
44240
44656
  */
44241
44657
  targetUsers: zod.z.array(zod.z.string()).optional(),
44242
- media: NcMediaPolicySchema.default({ attach: "best" }),
44658
+ /** Absent = the kind's default picture (`resolveNcMediaImage`): the subject crop for a
44659
+ * detection, the clean scene for a sensor or a sound. Set explicitly on save (D897). */
44660
+ media: NcMediaPolicySchema.default({}),
44243
44661
  throttle: NcThrottleSchema.default({
44244
44662
  cooldownSec: 60,
44245
44663
  scope: "rule-device"
@@ -45811,13 +46229,37 @@ var NcAlarmModeOpeningsSchema = zod.z.object({
45811
46229
  /** Covered devices whose state could not be read (D49): neither open nor closed. */
45812
46230
  unknown: zod.z.array(zod.z.number().int())
45813
46231
  });
46232
+ /**
46233
+ * One alarm INPUT — a (rule, device) pair — the operator bypassed until the
46234
+ * next disarm ("Bypass this input until disarm" on a trigger notification, or
46235
+ * `nc.bypassAlarmInput`). Reported so an armed alarm with a silenced input
46236
+ * never looks fully armed (D62: off must never look like broken).
46237
+ */
46238
+ var NcAlarmInputBypassViewSchema = zod.z.object({
46239
+ ruleId: zod.z.string(),
46240
+ /** The rule's current name (its frozen name when the rule is gone). */
46241
+ ruleName: zod.z.string(),
46242
+ /** The input: the sensor of the match, else its camera. */
46243
+ deviceId: zod.z.number().int(),
46244
+ /** The input's current name. */
46245
+ name: zod.z.string(),
46246
+ /** When it was bypassed (ms epoch). */
46247
+ since: zod.z.number(),
46248
+ /** Triggers from this input dropped since. */
46249
+ dropped: zod.z.number().int().min(0)
46250
+ });
45814
46251
  var NcAlarmLiveSchema = zod.z.object({
45815
46252
  state: AlarmStateSchema,
45816
46253
  /** The mode being armed into (exit delay) or held; null when disarmed. */
45817
46254
  targetMode: AlarmArmModeSchema.nullable(),
45818
46255
  availableModes: zod.z.array(AlarmArmModeSchema),
45819
46256
  openings: zod.z.array(NcAlarmModeOpeningsSchema),
45820
- exclusions: zod.z.array(NcAlarmExclusionViewSchema)
46257
+ exclusions: zod.z.array(NcAlarmExclusionViewSchema),
46258
+ /**
46259
+ * Inputs bypassed for the rest of this arm session; cleared on disarm.
46260
+ * Defaulted so an older hub answer still parses (as "none known").
46261
+ */
46262
+ bypassedInputs: zod.z.array(NcAlarmInputBypassViewSchema).default([])
45821
46263
  });
45822
46264
  var NcAlarmConfigSchema = zod.z.object({
45823
46265
  /**
@@ -60786,9 +61228,11 @@ var connectivityCapability = {
60786
61228
  */
60787
61229
  durability: "restored",
60788
61230
  /**
60789
- * History (D850): none — duplicates device-status.online (one authority for availability).
61231
+ * History (D850): `connected` as a boolean series — change-only, no floor. It
61232
+ * is the upstream entity's own link (a HA connectivity sensor), not the
61233
+ * device's reachability, which stays `device-status.online`.
60790
61234
  */
60791
- history: "none",
61235
+ history: { fields: { connected: { kind: "boolean" } } },
60792
61236
  /** Clock fields: written, but excluded from the compare that decides
60793
61237
  * whether persisting is worth a SQLite commit. */
60794
61238
  volatileStateFields: ["lastChangedAt"]
@@ -61672,11 +62116,22 @@ var dishwasherCapability = {
61672
62116
  },
61673
62117
  runtimeState: DishwasherStatusSchema,
61674
62118
  durability: "session",
61675
- history: { fields: { progressPercent: {
61676
- kind: "gauge",
61677
- unit: "%",
61678
- deadband: 2
61679
- } } }
62119
+ history: { fields: {
62120
+ progressPercent: {
62121
+ kind: "gauge",
62122
+ unit: "%",
62123
+ deadband: 2
62124
+ },
62125
+ state: { kind: "enum" },
62126
+ operationState: { kind: "enum" },
62127
+ remainingSeconds: {
62128
+ kind: "gauge",
62129
+ unit: "s",
62130
+ minIntervalMs: 6e4
62131
+ },
62132
+ doorOpen: { kind: "boolean" },
62133
+ powerOn: { kind: "boolean" }
62134
+ } }
61680
62135
  };
61681
62136
  //#endregion
61682
62137
  //#region src/capabilities/doorbell.cap.ts
@@ -61797,9 +62252,15 @@ var enumSensorCapability = {
61797
62252
  */
61798
62253
  durability: "restored",
61799
62254
  /**
61800
- * History (D850): none — text/enum state has no history (non-goal).
62255
+ * History (D850): the value as an `enum` series (an appliance's program or
62256
+ * operation state, an HVAC action). The option set is per device, so the
62257
+ * value list is LEARNED as values are first seen (bounded). A sensor with a
62258
+ * `format` carries a timestamp, not a state, and is not recorded.
61801
62259
  */
61802
- history: "none",
62260
+ history: { fields: { value: {
62261
+ kind: "enum",
62262
+ skipWhenSet: "format"
62263
+ } } },
61803
62264
  /** Clock fields: written, but excluded from the compare that decides
61804
62265
  * whether persisting is worth a SQLite commit. */
61805
62266
  volatileStateFields: ["lastFetchedAt"]
@@ -64053,9 +64514,10 @@ var lockControlCapability = {
64053
64514
  */
64054
64515
  durability: "restored",
64055
64516
  /**
64056
- * History (D850): none — enum state; lock events belong in the events ledger.
64517
+ * History (D850): the lock's state as an `enum` series — change-only, no
64518
+ * floor: a jam or an unlock lasting seconds is the edge an operator looks for.
64057
64519
  */
64058
- history: "none",
64520
+ history: { fields: { state: { kind: "enum" } } },
64059
64521
  /** Clock fields: written, but excluded from the compare that decides
64060
64522
  * whether persisting is worth a SQLite commit. */
64061
64523
  volatileStateFields: ["lastChangedAt"]
@@ -64231,9 +64693,18 @@ var mediaPlayerCapability = {
64231
64693
  */
64232
64694
  durability: "session",
64233
64695
  /**
64234
- * History (D850): none — `positionMs` moves continuously while playing; volume is transient.
64696
+ * History (D850): volume (a level an operator or an automation sets; the
64697
+ * default 10 s floor folds a slider drag into its end value) and mute.
64698
+ * `positionMs` is not recorded: it moves continuously while playing.
64235
64699
  */
64236
- history: "none"
64700
+ history: { fields: {
64701
+ volumeLevel: {
64702
+ kind: "gauge",
64703
+ unit: "%",
64704
+ deadband: 1
64705
+ },
64706
+ isMuted: { kind: "boolean" }
64707
+ } }
64237
64708
  };
64238
64709
  //#endregion
64239
64710
  //#region src/capabilities/mesh-network.cap.ts
@@ -71185,9 +71656,29 @@ var streamParamsCapability = {
71185
71656
  */
71186
71657
  durability: "restored",
71187
71658
  /**
71188
- * History (D850): none — encoder configuration.
71659
+ * History (D850): the configured bitrate and frame rate of the main and sub
71660
+ * profiles. Configuration, so change-only on the default floor: a point is an
71661
+ * operator's (or a tuner's) edit, which is exactly what a chart of a stream's
71662
+ * quality over time must show.
71189
71663
  */
71190
- history: "none",
71664
+ history: { fields: {
71665
+ "main.bitrate": {
71666
+ kind: "gauge",
71667
+ unit: "kbps"
71668
+ },
71669
+ "main.framerate": {
71670
+ kind: "gauge",
71671
+ unit: "fps"
71672
+ },
71673
+ "sub.bitrate": {
71674
+ kind: "gauge",
71675
+ unit: "kbps"
71676
+ },
71677
+ "sub.framerate": {
71678
+ kind: "gauge",
71679
+ unit: "fps"
71680
+ }
71681
+ } },
71191
71682
  /** Clock fields: written, but excluded from the compare that decides
71192
71683
  * whether persisting is worth a SQLite commit. */
71193
71684
  volatileStateFields: ["lastFetchedAt"]
@@ -72461,26 +72952,6 @@ var ApiKeySummarySchema = zod.z.object({
72461
72952
  createdAt: zod.z.number(),
72462
72953
  lastUsedAt: zod.z.number().optional()
72463
72954
  });
72464
- var ScopedTokenSummarySchema = zod.z.object({
72465
- id: zod.z.string(),
72466
- userId: zod.z.string(),
72467
- name: zod.z.string(),
72468
- tokenPrefix: zod.z.string(),
72469
- scopes: zod.z.array(TokenScopeSchema),
72470
- expiresAt: zod.z.number().nullish(),
72471
- lastUsedAt: zod.z.number().nullish(),
72472
- createdAt: zod.z.number()
72473
- });
72474
- var CreateScopedTokenInputSchema = zod.z.object({
72475
- userId: zod.z.string(),
72476
- name: zod.z.string(),
72477
- scopes: zod.z.array(TokenScopeSchema),
72478
- expiresAt: zod.z.number().optional()
72479
- });
72480
- var CreateScopedTokenResultSchema = zod.z.object({
72481
- token: zod.z.string(),
72482
- record: ScopedTokenSummarySchema
72483
- });
72484
72955
  var OauthSessionSummarySchema = zod.z.object({
72485
72956
  id: zod.z.string(),
72486
72957
  userId: zod.z.string(),
@@ -72502,11 +72973,11 @@ var TotpStatusSchema = zod.z.object({
72502
72973
  confirmedAt: zod.z.number().nullable()
72503
72974
  });
72504
72975
  /**
72505
- * user-management — singleton capability for user accounts, API keys,
72506
- * and scoped tokens.
72976
+ * user-management — singleton capability for user accounts and the
72977
+ * legacy API-key rows.
72507
72978
  *
72508
72979
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
72509
- * — the subset check on `setUserScopes` / `createScopedToken` is moot
72980
+ * — the subset check on `setUserScopes` is moot
72510
72981
  * because non-admins never reach these. If/when we open non-admin
72511
72982
  * delegation, structural caller-scope subset check goes inside the
72512
72983
  * provider.
@@ -72577,18 +73048,6 @@ var userManagementCapability = {
72577
73048
  auth: "admin",
72578
73049
  access: "delete"
72579
73050
  }),
72580
- createScopedToken: require_sleep.method(CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, {
72581
- kind: "mutation",
72582
- auth: "admin",
72583
- access: "create"
72584
- }),
72585
- revokeScopedToken: require_sleep.method(zod.z.object({ id: zod.z.string() }), zod.z.object({ success: zod.z.literal(true) }), {
72586
- kind: "mutation",
72587
- auth: "admin",
72588
- access: "delete"
72589
- }),
72590
- validateScopedToken: require_sleep.method(zod.z.object({ token: zod.z.string() }), ScopedTokenSummarySchema.nullable(), { access: "view" }),
72591
- listScopedTokens: require_sleep.method(zod.z.object({ userId: zod.z.string() }), zod.z.array(ScopedTokenSummarySchema), { auth: "admin" }),
72592
73051
  setupTotp: require_sleep.method(zod.z.object({ userId: zod.z.string() }), TotpSetupResultSchema, {
72593
73052
  kind: "mutation",
72594
73053
  auth: "admin",
@@ -76160,6 +76619,15 @@ var BaseDevice = class {
76160
76619
  * Drivers can use the `getProbeFlags()` helper to read the flag bag
76161
76620
  * with a typed cast.
76162
76621
  *
76622
+ * Answer what you KNOW. A plain array is read as the complete list only
76623
+ * while this device is `online` and probed; return
76624
+ * `accessoryChildrenUnknown(reason)` whenever you cannot know the list right
76625
+ * now (no credentials, parent not connected, a failed or partial read) —
76626
+ * the kernel then deletes nothing. Return `accessoryChildrenComplete(list)`
76627
+ * to say "connected, and this is the complete list" explicitly. A shrink is
76628
+ * deleted only after a second agreeing complete read on a later probe (D49;
76629
+ * `packages/system/src/kernel/moleculer/accessory-prune-gate.ts`).
76630
+ *
76163
76631
  * Default: no children.
76164
76632
  */
76165
76633
  getAccessoryChildren() {
@@ -76183,6 +76651,22 @@ var BaseDevice = class {
76183
76651
  return (this.runtimeState.getCapState("feature-probe")?.lastProbedAt ?? 0) > 0;
76184
76652
  }
76185
76653
  };
76654
+ function accessoryChildrenUnknown(reason, known) {
76655
+ return known === void 0 ? {
76656
+ kind: "unknown",
76657
+ reason
76658
+ } : {
76659
+ kind: "unknown",
76660
+ reason,
76661
+ known
76662
+ };
76663
+ }
76664
+ function accessoryChildrenComplete(children) {
76665
+ return {
76666
+ kind: "complete",
76667
+ children
76668
+ };
76669
+ }
76186
76670
  //#endregion
76187
76671
  //#region src/device/device-restore-retry.ts
76188
76672
  /**
@@ -80812,7 +81296,7 @@ var METHOD_ACCESS_MAP = Object.freeze({
80812
81296
  capName: "llm",
80813
81297
  capScope: "system",
80814
81298
  addonId: null,
80815
- access: "view"
81299
+ access: "create"
80816
81300
  },
80817
81301
  "llm.listNodeModels": {
80818
81302
  capName: "llm",
@@ -81114,7 +81598,19 @@ var METHOD_ACCESS_MAP = Object.freeze({
81114
81598
  addonId: null,
81115
81599
  access: "view"
81116
81600
  },
81117
- "logDestination.query": {
81601
+ "logDestination.cancelRead": {
81602
+ capName: "log-destination",
81603
+ capScope: "system",
81604
+ addonId: null,
81605
+ access: "create"
81606
+ },
81607
+ "logDestination.describeRead": {
81608
+ capName: "log-destination",
81609
+ capScope: "system",
81610
+ addonId: null,
81611
+ access: "view"
81612
+ },
81613
+ "logDestination.read": {
81118
81614
  capName: "log-destination",
81119
81615
  capScope: "system",
81120
81616
  addonId: null,
@@ -85476,12 +85972,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
85476
85972
  addonId: null,
85477
85973
  access: "create"
85478
85974
  },
85479
- "userManagement.createScopedToken": {
85480
- capName: "user-management",
85481
- capScope: "system",
85482
- addonId: null,
85483
- access: "create"
85484
- },
85485
85975
  "userManagement.createUser": {
85486
85976
  capName: "user-management",
85487
85977
  capScope: "system",
@@ -85530,12 +86020,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
85530
86020
  addonId: null,
85531
86021
  access: "view"
85532
86022
  },
85533
- "userManagement.listScopedTokens": {
85534
- capName: "user-management",
85535
- capScope: "system",
85536
- addonId: null,
85537
- access: "view"
85538
- },
85539
86023
  "userManagement.listUsers": {
85540
86024
  capName: "user-management",
85541
86025
  capScope: "system",
@@ -85590,12 +86074,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
85590
86074
  addonId: null,
85591
86075
  access: "delete"
85592
86076
  },
85593
- "userManagement.revokeScopedToken": {
85594
- capName: "user-management",
85595
- capScope: "system",
85596
- addonId: null,
85597
- access: "delete"
85598
- },
85599
86077
  "userManagement.setupTotp": {
85600
86078
  capName: "user-management",
85601
86079
  capScope: "system",
@@ -85626,12 +86104,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
85626
86104
  addonId: null,
85627
86105
  access: "view"
85628
86106
  },
85629
- "userManagement.validateScopedToken": {
85630
- capName: "user-management",
85631
- capScope: "system",
85632
- addonId: null,
85633
- access: "view"
85634
- },
85635
86107
  "userManagement.verifyTotp": {
85636
86108
  capName: "user-management",
85637
86109
  capScope: "system",
@@ -90557,6 +91029,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
90557
91029
  form: "single",
90558
91030
  optional: false
90559
91031
  }],
91032
+ "logDestination.read": [{
91033
+ name: "deviceId",
91034
+ form: "single",
91035
+ optional: true
91036
+ }],
90560
91037
  "mediaPlayer.getStatus": [{
90561
91038
  name: "deviceId",
90562
91039
  form: "single",
@@ -92324,6 +92801,7 @@ var SYSTEM_SCOPE_DEVICE_METHODS = [
92324
92801
  "faceGallery.getFaceByTrack",
92325
92802
  "faceGallery.listRecentFaces",
92326
92803
  "keychain.deleteDeviceScope",
92804
+ "logDestination.read",
92327
92805
  "networkQuality.getDeviceStats",
92328
92806
  "networkQuality.reportClientStats",
92329
92807
  "notificationRules.getAlarmSensors",
@@ -92919,7 +93397,7 @@ var BucketAccumulator = class {
92919
93397
  //#region src/generated/history-catalog.ts
92920
93398
  /**
92921
93399
  * Cap history catalog, projected from every `*.cap.ts` `history` block.
92922
- * 34 caps with series (62 series), 37 caps answered `'none'`.
93400
+ * 40 caps with series (77 series), 31 caps answered `'none'`.
92923
93401
  * Field keys are `runtimeState` paths (`a.b` into fixed objects only).
92924
93402
  */
92925
93403
  var HISTORY_CATALOG = {
@@ -92950,6 +93428,21 @@ var HISTORY_CATALOG = {
92950
93428
  deadband: 1
92951
93429
  }
92952
93430
  },
93431
+ "alarm-panel": { "state": {
93432
+ kind: "enum",
93433
+ values: [
93434
+ "disarmed",
93435
+ "armed_home",
93436
+ "armed_away",
93437
+ "armed_night",
93438
+ "armed_vacation",
93439
+ "armed_custom_bypass",
93440
+ "arming",
93441
+ "disarming",
93442
+ "pending",
93443
+ "triggered"
93444
+ ]
93445
+ } },
92953
93446
  "ambient-light-sensor": { "lux": {
92954
93447
  kind: "gauge",
92955
93448
  unit: "lx",
@@ -92994,6 +93487,7 @@ var HISTORY_CATALOG = {
92994
93487
  minIntervalMs: 0
92995
93488
  }
92996
93489
  },
93490
+ "connectivity": { "connected": { kind: "boolean" } },
92997
93491
  "contact": { "entryOpen": { kind: "boolean" } },
92998
93492
  "cover": { "position": {
92999
93493
  kind: "gauge",
@@ -93001,10 +93495,48 @@ var HISTORY_CATALOG = {
93001
93495
  minIntervalMs: 0
93002
93496
  } },
93003
93497
  "device-status": { "online": { kind: "boolean" } },
93004
- "dishwasher": { "progressPercent": {
93005
- kind: "gauge",
93006
- unit: "%",
93007
- deadband: 2
93498
+ "dishwasher": {
93499
+ "progressPercent": {
93500
+ kind: "gauge",
93501
+ unit: "%",
93502
+ deadband: 2
93503
+ },
93504
+ "state": {
93505
+ kind: "enum",
93506
+ values: [
93507
+ "idle",
93508
+ "running",
93509
+ "paused",
93510
+ "finished",
93511
+ "error",
93512
+ "unavailable"
93513
+ ]
93514
+ },
93515
+ "operationState": {
93516
+ kind: "enum",
93517
+ values: [
93518
+ "Inactive",
93519
+ "Ready",
93520
+ "DelayedStart",
93521
+ "Run",
93522
+ "Pause",
93523
+ "ActionRequired",
93524
+ "Finished",
93525
+ "Error",
93526
+ "Aborting"
93527
+ ]
93528
+ },
93529
+ "remainingSeconds": {
93530
+ kind: "gauge",
93531
+ unit: "s",
93532
+ minIntervalMs: 6e4
93533
+ },
93534
+ "doorOpen": { kind: "boolean" },
93535
+ "powerOn": { kind: "boolean" }
93536
+ },
93537
+ "enum-sensor": { "value": {
93538
+ kind: "enum",
93539
+ skipWhenSet: "format"
93008
93540
  } },
93009
93541
  "fan-control": {
93010
93542
  "percentage": {
@@ -93039,6 +93571,24 @@ var HISTORY_CATALOG = {
93039
93571
  unit: "%",
93040
93572
  deadband: 2
93041
93573
  } },
93574
+ "lock-control": { "state": {
93575
+ kind: "enum",
93576
+ values: [
93577
+ "locked",
93578
+ "unlocked",
93579
+ "locking",
93580
+ "unlocking",
93581
+ "jammed"
93582
+ ]
93583
+ } },
93584
+ "media-player": {
93585
+ "volumeLevel": {
93586
+ kind: "gauge",
93587
+ unit: "%",
93588
+ deadband: 1
93589
+ },
93590
+ "isMuted": { kind: "boolean" }
93591
+ },
93042
93592
  "motion": { "detected": {
93043
93593
  kind: "boolean",
93044
93594
  excludeDeviceTypes: [require_err_msg.DeviceType.Camera]
@@ -93125,6 +93675,24 @@ var HISTORY_CATALOG = {
93125
93675
  deadband: .1
93126
93676
  } },
93127
93677
  "smoke": { "detected": { kind: "boolean" } },
93678
+ "stream-params": {
93679
+ "main.bitrate": {
93680
+ kind: "gauge",
93681
+ unit: "kbps"
93682
+ },
93683
+ "main.framerate": {
93684
+ kind: "gauge",
93685
+ unit: "fps"
93686
+ },
93687
+ "sub.bitrate": {
93688
+ kind: "gauge",
93689
+ unit: "kbps"
93690
+ },
93691
+ "sub.framerate": {
93692
+ kind: "gauge",
93693
+ unit: "fps"
93694
+ }
93695
+ },
93128
93696
  "switch": { "on": { kind: "boolean" } },
93129
93697
  "tamper": { "tampered": { kind: "boolean" } },
93130
93698
  "temperature-sensor": { "celsius": {
@@ -93202,25 +93770,20 @@ var HISTORY_CATALOG = {
93202
93770
  };
93203
93771
  /** Caps that declared `history: 'none'`, sorted. */
93204
93772
  var HISTORY_NONE_CAPS = [
93205
- "alarm-panel",
93206
93773
  "audio-metrics",
93207
93774
  "automation-control",
93208
93775
  "camera-streams",
93209
93776
  "color",
93210
- "connectivity",
93211
93777
  "consumables",
93212
93778
  "control",
93213
93779
  "day-night",
93214
93780
  "device-discovery",
93215
93781
  "doorbell",
93216
- "enum-sensor",
93217
93782
  "event-emitter",
93218
93783
  "feature-probe",
93219
93784
  "image",
93220
93785
  "image-settings",
93221
93786
  "intercom",
93222
- "lock-control",
93223
- "media-player",
93224
93787
  "motion-trigger",
93225
93788
  "motion-zones",
93226
93789
  "native-object-detection",
@@ -93233,7 +93796,6 @@ var HISTORY_NONE_CAPS = [
93233
93796
  "scene-monitor",
93234
93797
  "script-runner",
93235
93798
  "stream-catalog",
93236
- "stream-params",
93237
93799
  "stream-signals",
93238
93800
  "update",
93239
93801
  "zone-analytics",
@@ -93506,6 +94068,7 @@ function createSystemProxy(api) {
93506
94068
  deviceHistory: {
93507
94069
  listNodeSeries: (input) => dispatch("deviceHistory", "listNodeSeries", "query", input),
93508
94070
  queryNode: (input) => dispatch("deviceHistory", "queryNode", "query", input),
94071
+ queryMany: (input) => dispatch("deviceHistory", "queryMany", "query", input),
93509
94072
  declareSeries: (input) => dispatch("deviceHistory", "declareSeries", "mutation", input),
93510
94073
  record: (input) => dispatch("deviceHistory", "record", "mutation", input),
93511
94074
  recordBuckets: (input) => dispatch("deviceHistory", "recordBuckets", "mutation", input),
@@ -93639,7 +94202,7 @@ function createSystemProxy(api) {
93639
94202
  migrateRawSecrets: (input) => dispatch("llm", "migrateRawSecrets", "mutation", input),
93640
94203
  deleteProfile: (input) => dispatch("llm", "deleteProfile", "mutation", input),
93641
94204
  testProfile: (input) => dispatch("llm", "testProfile", "mutation", input),
93642
- listModels: (input) => dispatch("llm", "listModels", "query", input),
94205
+ listModels: (input) => dispatch("llm", "listModels", "mutation", input),
93643
94206
  getDefaults: (input) => dispatch("llm", "getDefaults", "query", input),
93644
94207
  setDefault: (input) => dispatch("llm", "setDefault", "mutation", input),
93645
94208
  getUsage: (input) => dispatch("llm", "getUsage", "query", input),
@@ -94083,10 +94646,6 @@ function createSystemProxy(api) {
94083
94646
  validateCredentials: (input) => dispatch("userManagement", "validateCredentials", "mutation", input),
94084
94647
  listApiKeys: (input) => dispatch("userManagement", "listApiKeys", "query", input),
94085
94648
  revokeApiKey: (input) => dispatch("userManagement", "revokeApiKey", "mutation", input),
94086
- createScopedToken: (input) => dispatch("userManagement", "createScopedToken", "mutation", input),
94087
- revokeScopedToken: (input) => dispatch("userManagement", "revokeScopedToken", "mutation", input),
94088
- validateScopedToken: (input) => dispatch("userManagement", "validateScopedToken", "query", input),
94089
- listScopedTokens: (input) => dispatch("userManagement", "listScopedTokens", "query", input),
94090
94649
  setupTotp: (input) => dispatch("userManagement", "setupTotp", "mutation", input),
94091
94650
  confirmTotp: (input) => dispatch("userManagement", "confirmTotp", "mutation", input),
94092
94651
  disableTotp: (input) => dispatch("userManagement", "disableTotp", "mutation", input),
@@ -95783,6 +96342,100 @@ function ruleEditorSectionsForKind(kind) {
95783
96342
  return sections;
95784
96343
  }
95785
96344
  //#endregion
96345
+ //#region src/notification/media-image.ts
96346
+ /** Every mode, in the order an editor offers them. */
96347
+ var NC_MEDIA_IMAGE_MODES = [
96348
+ "scene-boxes",
96349
+ "crop",
96350
+ "clean",
96351
+ "none"
96352
+ ];
96353
+ /**
96354
+ * The modes a rule of this kind can honour. A kind that carries no media gets
96355
+ * none (its row ships text, or — an alarm — its SOURCE rule's picture); a kind
96356
+ * whose subject has no region of the frame (a sound) is never offered `crop`.
96357
+ */
96358
+ function imageModesForKind(kind) {
96359
+ const spec = ruleKindSpec(kind);
96360
+ if (!spec.carriesMedia) return [];
96361
+ return spec.carriesSubjectCrop ? NC_MEDIA_IMAGE_MODES : NC_MEDIA_IMAGE_MODES.filter((mode) => mode !== "crop");
96362
+ }
96363
+ /**
96364
+ * The zone ids that FIRE a rule: its `zones` condition, or an occupancy rule's
96365
+ * own scoped zone. Empty when the trigger is not a zone — and then
96366
+ * `showTriggerZone` has nothing to draw and is refused on save.
96367
+ */
96368
+ function ruleTriggerZoneIds(conditions) {
96369
+ if (conditions.zones !== void 0) return conditions.zones.ids;
96370
+ const zoneId = conditions.occupancy?.zoneId;
96371
+ return zoneId !== void 0 ? [zoneId] : [];
96372
+ }
96373
+ /**
96374
+ * What the legacy triple MEANT, as a mode. `zoneCrop` forced the clean
96375
+ * keyFrame ladder and dropped `frame`, so it is `clean` whatever else was set;
96376
+ * `frame` decided over `attach` when present; `keyFrame` was the clean scene;
96377
+ * every other still (`best`, `best-matching`, the default) was the subject.
96378
+ */
96379
+ function legacyImageMode(media) {
96380
+ if (media.attach === "none") return "none";
96381
+ if (media.zoneCrop === true) return "clean";
96382
+ if (media.frame === "full") return "clean";
96383
+ if (media.frame === "boxed") return "scene-boxes";
96384
+ if (media.frame === "cropped") return "crop";
96385
+ if (media.attach === "keyFrame") return "clean";
96386
+ return "crop";
96387
+ }
96388
+ /** A mode the kind cannot honour, mapped to the nearest one it can. */
96389
+ function clampToKind(mode, kind) {
96390
+ const offered = imageModesForKind(kind);
96391
+ if (offered.length === 0 || offered.includes(mode)) return mode;
96392
+ return mode === "crop" ? "clean" : mode;
96393
+ }
96394
+ /**
96395
+ * The mode a rule's picture is rendered in. `image` when stored; else what the
96396
+ * legacy triple meant — and, for a SENSOR rule written before D897, `clean`
96397
+ * whatever it stored (even `attach: 'none'`), because its stored triple was
96398
+ * ignored and one plain snapshot always shipped (operator ruling, 2026-10-01):
96399
+ * the migration keeps what the rule actually DID. Clamped to what the kind can
96400
+ * honour.
96401
+ */
96402
+ function resolveNcMediaImage(media, kind) {
96403
+ if (media.image !== void 0) return clampToKind(media.image, kind);
96404
+ if (kind === "sensor") return "clean";
96405
+ return clampToKind(legacyImageMode(media), kind);
96406
+ }
96407
+ /**
96408
+ * The stored shape of a media policy: `image` set, the legacy triple gone.
96409
+ * `showTriggerZone` survives only where it can be drawn — a zone trigger and a
96410
+ * mode other than `crop`/`none`; a legacy `zoneCrop` on a zone rule becomes it.
96411
+ * Every other field (gif, clip, rolls, speed, profile, linked cameras) is
96412
+ * carried through untouched. Pure; never throws.
96413
+ */
96414
+ function normalizeNcMediaPolicy(media, rule) {
96415
+ const image = resolveNcMediaImage(media, ruleKindOf(rule));
96416
+ const { attach: _attach, frame: _frame, zoneCrop, showTriggerZone, image: _image, ...rest } = media;
96417
+ const drawable = (showTriggerZone === true || media.image === void 0 && zoneCrop === true) && image !== "crop" && image !== "none" && ruleTriggerZoneIds(rule.conditions).length > 0;
96418
+ return {
96419
+ ...rest,
96420
+ image,
96421
+ ...drawable ? { showTriggerZone: true } : {}
96422
+ };
96423
+ }
96424
+ /**
96425
+ * Why a media policy cannot be SAVED on this rule, or null. Server-side and
96426
+ * editor alike: `showTriggerZone` on a rule whose trigger is not a zone, and a
96427
+ * mode the rule's kind cannot honour.
96428
+ */
96429
+ function ncMediaPolicyError(media, rule) {
96430
+ const kind = ruleKindOf(rule);
96431
+ if (media.image !== void 0) {
96432
+ const offered = imageModesForKind(kind);
96433
+ if (offered.length > 0 && !offered.includes(media.image)) return `media.image '${media.image}' is not available for a ${kind} rule (offered: ${offered.join(", ")})`;
96434
+ }
96435
+ if (media.showTriggerZone === true && ruleTriggerZoneIds(rule.conditions).length === 0) return "media.showTriggerZone needs a rule triggered by a zone (a zones condition or an occupancy zone)";
96436
+ return null;
96437
+ }
96438
+ //#endregion
95786
96439
  //#region src/notification/schedule.ts
95787
96440
  var WEEKDAY_TO_DAY = {
95788
96441
  Sun: 0,
@@ -103201,6 +103854,7 @@ exports.CONNECTION_TEST_TIMEOUT_MS = CONNECTION_TEST_TIMEOUT_MS;
103201
103854
  exports.CONTAINER_CHILD_PRIORITY = CONTAINER_CHILD_PRIORITY;
103202
103855
  exports.CORE_BLOCKS_ADDON_ID = CORE_BLOCKS_ADDON_ID;
103203
103856
  exports.CORE_BLOCK_ADDON_PREFIX = CORE_BLOCK_ADDON_PREFIX;
103857
+ exports.CREDENTIAL_TOKEN_AUDIENCE = CREDENTIAL_TOKEN_AUDIENCE;
103204
103858
  exports.CREDENTIAL_TOKEN_KIND = CREDENTIAL_TOKEN_KIND;
103205
103859
  exports.CROP_SUPPLY_SOURCES = CROP_SUPPLY_SOURCES;
103206
103860
  exports.CROP_SUPPLY_STEP_IDS = CROP_SUPPLY_STEP_IDS;
@@ -103379,8 +104033,6 @@ exports.CoreBlockStatusSchema = CoreBlockStatusSchema;
103379
104033
  exports.CoverStateSchema = CoverStateSchema;
103380
104034
  exports.CoverStatusSchema = CoverStatusSchema;
103381
104035
  exports.CreateIntegrationInputSchema = CreateIntegrationInputSchema;
103382
- exports.CreateScopedTokenInputSchema = CreateScopedTokenInputSchema;
103383
- exports.CreateScopedTokenResultSchema = CreateScopedTokenResultSchema;
103384
104036
  exports.CreateUserInputSchema = CreateUserInputSchema;
103385
104037
  exports.CredentialScopeSchema = CredentialScopeSchema;
103386
104038
  exports.CredentialTokenClaimsSchema = CredentialTokenClaimsSchema;
@@ -103441,6 +104093,8 @@ exports.DEVICE_CHILDREN_BATCH_MAX = require_sleep.DEVICE_CHILDREN_BATCH_MAX;
103441
104093
  exports.DEVICE_DEFINITIVE_REFUSALS_BEFORE_DELETE = DEVICE_DEFINITIVE_REFUSALS_BEFORE_DELETE;
103442
104094
  exports.DEVICE_DO_ACTIONS = DEVICE_DO_ACTIONS;
103443
104095
  exports.DEVICE_ENROLLMENT_TTL_MS = DEVICE_ENROLLMENT_TTL_MS;
104096
+ exports.DEVICE_HISTORY_ENERGY_KEY = DEVICE_HISTORY_ENERGY_KEY;
104097
+ exports.DEVICE_HISTORY_QUERY_MANY_MAX_ITEMS = DEVICE_HISTORY_QUERY_MANY_MAX_ITEMS;
103444
104098
  exports.DEVICE_NONCE_TTL_MS = DEVICE_NONCE_TTL_MS;
103445
104099
  exports.DEVICE_PROFILES = DEVICE_PROFILES;
103446
104100
  exports.DEVICE_RAMP = DEVICE_RAMP;
@@ -103499,6 +104153,7 @@ exports.DeviceExportStatusSchema = DeviceExportStatusSchema;
103499
104153
  exports.DeviceExportUnexposeInputSchema = UnexposeInputSchema;
103500
104154
  exports.DeviceFeature = require_err_msg.DeviceFeature;
103501
104155
  exports.DeviceHistoryKindSchema = DeviceHistoryKindSchema;
104156
+ exports.DeviceHistoryProducerKindSchema = DeviceHistoryProducerKindSchema;
103502
104157
  exports.DeviceHistoryRefusalReasonSchema = DeviceHistoryRefusalReasonSchema;
103503
104158
  exports.DeviceHistoryResolutionSchema = DeviceHistoryResolutionSchema;
103504
104159
  exports.DeviceHistoryStatusSchema = DeviceHistoryStatusSchema;
@@ -103763,6 +104418,7 @@ exports.LABEL_SUPPLY_VOCABULARIES = LABEL_SUPPLY_VOCABULARIES;
103763
104418
  exports.LEGACY_READ_ONLY_CONFIG_KEY = LEGACY_READ_ONLY_CONFIG_KEY;
103764
104419
  exports.LINKED_DEVICES_SLOT = LINKED_DEVICES_SLOT;
103765
104420
  exports.LINKED_LABEL_STEP_PREFIX = LINKED_LABEL_STEP_PREFIX;
104421
+ exports.LLM_PROFILE_KIND_PATTERN = LLM_PROFILE_KIND_PATTERN;
103766
104422
  exports.LOAD_CONTRIBUTION_ATTRIBUTIONS = LOAD_CONTRIBUTION_ATTRIBUTIONS;
103767
104423
  exports.LOAD_CONTRIBUTION_ROLES = LOAD_CONTRIBUTION_ROLES;
103768
104424
  exports.LOCATION_DESCRIPTION_MAX = LOCATION_DESCRIPTION_MAX;
@@ -103799,10 +104455,18 @@ exports.LlmGenerateErrSchema = LlmGenerateErrSchema;
103799
104455
  exports.LlmGenerateOkSchema = LlmGenerateOkSchema;
103800
104456
  exports.LlmGenerateResultSchema = LlmGenerateResultSchema;
103801
104457
  exports.LlmImageSchema = LlmImageSchema;
104458
+ exports.LlmListModelsErrorCodeSchema = LlmListModelsErrorCodeSchema;
104459
+ exports.LlmListModelsInputSchema = LlmListModelsInputSchema;
104460
+ exports.LlmListModelsResultSchema = LlmListModelsResultSchema;
104461
+ exports.LlmModelFeaturesSchema = LlmModelFeaturesSchema;
104462
+ exports.LlmModelInfoSchema = LlmModelInfoSchema;
103802
104463
  exports.LlmNodeModelSchema = LlmNodeModelSchema;
104464
+ exports.LlmProfileFieldSchema = LlmProfileFieldSchema;
103803
104465
  exports.LlmProfileKindDescriptorSchema = LlmProfileKindDescriptorSchema;
103804
104466
  exports.LlmProfileKindSchema = LlmProfileKindSchema;
103805
104467
  exports.LlmProfileSchema = LlmProfileSchema;
104468
+ exports.LlmProviderConfigSchema = LlmProviderConfigSchema;
104469
+ exports.LlmProviderWidgetSchema = LlmProviderWidgetSchema;
103806
104470
  exports.LlmRefusalSourceSchema = LlmRefusalSourceSchema;
103807
104471
  exports.LlmRetryPolicySchema = LlmRetryPolicySchema;
103808
104472
  exports.LlmRuntimeAppleCompleteInputSchema = LlmRuntimeAppleCompleteInputSchema;
@@ -103832,6 +104496,10 @@ exports.LogChannelWindowSchema = LogChannelWindowSchema;
103832
104496
  exports.LogChannelWindowStateSchema = LogChannelWindowStateSchema;
103833
104497
  exports.LogEntrySchema = LogEntrySchema;
103834
104498
  exports.LogLevelSchema = LogLevelSchema;
104499
+ exports.LogReadCapabilitiesSchema = LogReadCapabilitiesSchema;
104500
+ exports.LogReadEntrySchema = LogReadEntrySchema;
104501
+ exports.LogReadQuerySchema = LogReadQuerySchema;
104502
+ exports.LogReadResultSchema = LogReadResultSchema;
103835
104503
  exports.LogStreamEntrySchema = LogStreamEntrySchema;
103836
104504
  exports.LoggingEffectiveSchema = LoggingEffectiveSchema;
103837
104505
  exports.LoggingExplicitSchema = LoggingExplicitSchema;
@@ -104013,6 +104681,7 @@ exports.NC_GROUPING_MIN_SEC = NC_GROUPING_MIN_SEC;
104013
104681
  exports.NC_HISTORY_LIMIT_DEFAULT = NC_HISTORY_LIMIT_DEFAULT;
104014
104682
  exports.NC_HISTORY_LIMIT_MAX = NC_HISTORY_LIMIT_MAX;
104015
104683
  exports.NC_MAX_PER_TRACK_IMMEDIATE = NC_MAX_PER_TRACK_IMMEDIATE;
104684
+ exports.NC_MEDIA_IMAGE_MODES = NC_MEDIA_IMAGE_MODES;
104016
104685
  exports.NC_OCCUPANCY_DEFAULTS = NC_OCCUPANCY_DEFAULTS;
104017
104686
  exports.NC_RULE_CLEARABLE_KEYS = NC_RULE_CLEARABLE_KEYS;
104018
104687
  exports.NC_RULE_EDITOR_SECTION_ORDER = NC_RULE_EDITOR_SECTION_ORDER;
@@ -104111,6 +104780,7 @@ exports.NcHookBindingsSchema = NcHookBindingsSchema;
104111
104780
  exports.NcLegacyRuleActionSequenceSchema = NcLegacyRuleActionSequenceSchema;
104112
104781
  exports.NcLinkedCameraModeSchema = NcLinkedCameraModeSchema;
104113
104782
  exports.NcMediaFrameSchema = NcMediaFrameSchema;
104783
+ exports.NcMediaImageSchema = NcMediaImageSchema;
104114
104784
  exports.NcMediaPolicySchema = NcMediaPolicySchema;
104115
104785
  exports.NcOccupancyConditionSchema = NcOccupancyConditionSchema;
104116
104786
  exports.NcPlateMatcherSchema = NcPlateMatcherSchema;
@@ -104261,6 +104931,11 @@ exports.PIPELINE_ANALYTICS_CAP_NAME = PIPELINE_ANALYTICS_CAP_NAME;
104261
104931
  exports.PIPELINE_FLOW_CAPABILITY_NAMES = PIPELINE_FLOW_CAPABILITY_NAMES;
104262
104932
  exports.PIPELINE_OWNER_CAPABILITY_NAMES = PIPELINE_OWNER_CAPABILITY_NAMES;
104263
104933
  exports.PIPELINE_RAMP = PIPELINE_RAMP;
104934
+ exports.PREFERENCES_MAX_DEVICE_ID_LENGTH = PREFERENCES_MAX_DEVICE_ID_LENGTH;
104935
+ exports.PREFERENCES_MAX_NAMESPACES = PREFERENCES_MAX_NAMESPACES;
104936
+ exports.PREFERENCES_MAX_VALUE_BYTES = PREFERENCES_MAX_VALUE_BYTES;
104937
+ exports.PREFERENCES_NAMESPACE_PATTERN = PREFERENCES_NAMESPACE_PATTERN;
104938
+ exports.PREFERENCES_SELF_SCOPE = PREFERENCES_SELF_SCOPE;
104264
104939
  exports.PRIVACY_MASK_CAP_NAME = PRIVACY_MASK_CAP_NAME;
104265
104940
  exports.PROVIDER_KIND_CAP_NAMES = PROVIDER_KIND_CAP_NAMES;
104266
104941
  exports.PROVIDER_PIN_FIELD = require_sleep.PROVIDER_PIN_FIELD;
@@ -104300,6 +104975,19 @@ exports.PlaintextSecretError = require_sleep.PlaintextSecretError;
104300
104975
  exports.PolygonPointSchema = PolygonPointSchema;
104301
104976
  exports.PoolMemoryWatchdog = PoolMemoryWatchdog;
104302
104977
  exports.PowerMeterStatusSchema = PowerMeterStatusSchema;
104978
+ exports.PreferenceDeviceIdSchema = PreferenceDeviceIdSchema;
104979
+ exports.PreferenceNamespaceSchema = PreferenceNamespaceSchema;
104980
+ exports.PreferenceRowSchema = PreferenceRowSchema;
104981
+ exports.PreferenceValueSchema = PreferenceValueSchema;
104982
+ exports.PreferencesChangedSinceInputSchema = PreferencesChangedSinceInputSchema;
104983
+ exports.PreferencesChangedSinceOutputSchema = PreferencesChangedSinceOutputSchema;
104984
+ exports.PreferencesDeleteInputSchema = PreferencesDeleteInputSchema;
104985
+ exports.PreferencesDeleteOutputSchema = PreferencesDeleteOutputSchema;
104986
+ exports.PreferencesGetInputSchema = PreferencesGetInputSchema;
104987
+ exports.PreferencesGetOutputSchema = PreferencesGetOutputSchema;
104988
+ exports.PreferencesPutInputSchema = PreferencesPutInputSchema;
104989
+ exports.PreferencesPutOutputSchema = PreferencesPutOutputSchema;
104990
+ exports.PreferencesSelfScopeSchema = PreferencesSelfScopeSchema;
104303
104991
  exports.PresenceStatusSchema = PresenceStatusSchema;
104304
104992
  exports.PressureSensorStatusSchema = PressureSensorStatusSchema;
104305
104993
  exports.PrivacyMaskOptionsSchema = PrivacyMaskOptionsSchema;
@@ -104582,7 +105270,6 @@ exports.SceneUnavailableSchema = SceneUnavailableSchema;
104582
105270
  exports.SceneUncoveredPolicySchema = SceneUncoveredPolicySchema;
104583
105271
  exports.SceneVerdictSchema = SceneVerdictSchema;
104584
105272
  exports.ScopedTokenSchema = ScopedTokenSchema;
104585
- exports.ScopedTokenSummarySchema = ScopedTokenSummarySchema;
104586
105273
  exports.ScoredObjectEventSchema = ScoredObjectEventSchema;
104587
105274
  exports.ScriptRunnerStatusSchema = ScriptRunnerStatusSchema;
104588
105275
  exports.SearchResultSchema = SearchResultSchema;
@@ -104868,6 +105555,8 @@ exports.ZoneScopeBreakdownSchema = ZoneScopeBreakdownSchema;
104868
105555
  exports.__resetLogChannelRegistryForTests = __resetLogChannelRegistryForTests;
104869
105556
  exports.acceleratorKindOf = acceleratorKindOf;
104870
105557
  exports.accessoriesCapability = accessoriesCapability;
105558
+ exports.accessoryChildrenComplete = accessoryChildrenComplete;
105559
+ exports.accessoryChildrenUnknown = accessoryChildrenUnknown;
104871
105560
  exports.accessoryStableId = accessoryStableId;
104872
105561
  exports.actionsForBoundCaps = actionsForBoundCaps;
104873
105562
  exports.actionsForDevice = actionsForDevice;
@@ -105238,6 +105927,7 @@ exports.iconCategoryLabel = iconCategoryLabel;
105238
105927
  exports.iconEntry = iconEntry;
105239
105928
  exports.iconsInCategory = iconsInCategory;
105240
105929
  exports.imageCapability = imageCapability;
105930
+ exports.imageModesForKind = imageModesForKind;
105241
105931
  exports.imageSettingsCapability = imageSettingsCapability;
105242
105932
  exports.inferExpressionKinds = inferExpressionKinds;
105243
105933
  exports.inferModelProvider = inferModelProvider;
@@ -105265,6 +105955,7 @@ exports.isBaseConditionKey = isBaseConditionKey;
105265
105955
  exports.isBatteryPresenceFault = isBatteryPresenceFault;
105266
105956
  exports.isClusterScopedStep = isClusterScopedStep;
105267
105957
  exports.isCollectionArrayMethod = isCollectionArrayMethod;
105958
+ exports.isCredentialTokenPayload = isCredentialTokenPayload;
105268
105959
  exports.isDefaultAlarmProfileId = isDefaultAlarmProfileId;
105269
105960
  exports.isDefaultAppConnectionEndpoint = isDefaultAppConnectionEndpoint;
105270
105961
  exports.isDefinitiveDeviceRefusal = isDefinitiveDeviceRefusal;
@@ -105329,6 +106020,7 @@ exports.knownSecretCount = require_sleep.knownSecretCount;
105329
106020
  exports.knownValues = knownValues;
105330
106021
  exports.lawnMowerControlCapability = lawnMowerControlCapability;
105331
106022
  exports.legacyAutoLinkIds = legacyAutoLinkIds;
106023
+ exports.legacyImageMode = legacyImageMode;
105332
106024
  exports.legacyModeOf = legacyModeOf;
105333
106025
  exports.lifecycleJobSchema = lifecycleJobSchema;
105334
106026
  exports.lifecycleJobScopeSchema = lifecycleJobScopeSchema;
@@ -105391,6 +106083,7 @@ exports.mqttBrokerCapability = mqttBrokerCapability;
105391
106083
  exports.nativeObjectDetectionCapability = nativeObjectDetectionCapability;
105392
106084
  exports.navigationCapability = navigationCapability;
105393
106085
  exports.ncAlarmSystemDefaultSettings = ncAlarmSystemDefaultSettings;
106086
+ exports.ncMediaPolicyError = ncMediaPolicyError;
105394
106087
  exports.networkAccessCapability = networkAccessCapability;
105395
106088
  exports.networkLinkCapability = networkLinkCapability;
105396
106089
  exports.networkQualityCapability = networkQualityCapability;
@@ -105402,6 +106095,7 @@ exports.nodesCapability = nodesCapability;
105402
106095
  exports.normalizeAddonInitResult = require_sleep.normalizeAddonInitResult;
105403
106096
  exports.normalizeAudioLabel = normalizeAudioLabel;
105404
106097
  exports.normalizeCoreBlockWrite = normalizeCoreBlockWrite;
106098
+ exports.normalizeNcMediaPolicy = normalizeNcMediaPolicy;
105405
106099
  exports.normalizeNodeId = require_sleep.normalizeNodeId;
105406
106100
  exports.normalizeOrigin = normalizeOrigin;
105407
106101
  exports.normalizeSecretOwner = require_sleep.normalizeSecretOwner;
@@ -105559,6 +106253,7 @@ exports.resolveModeDelays = resolveModeDelays;
105559
106253
  exports.resolveModeNotifyPolicy = resolveModeNotifyPolicy;
105560
106254
  exports.resolveModelBoundSetting = resolveModelBoundSetting;
105561
106255
  exports.resolveMutate = resolveMutate;
106256
+ exports.resolveNcMediaImage = resolveNcMediaImage;
105562
106257
  exports.resolveNotificationTapAddress = resolveNotificationTapAddress;
105563
106258
  exports.resolvePoolMemoryPolicy = resolvePoolMemoryPolicy;
105564
106259
  exports.resolvePublicEndpoint = resolvePublicEndpoint;
@@ -105592,6 +106287,7 @@ exports.ruleMatchesSection = ruleMatchesSection;
105592
106287
  exports.ruleSection = ruleSection;
105593
106288
  exports.ruleSectionOf = ruleSectionOf;
105594
106289
  exports.ruleSeedForSection = ruleSeedForSection;
106290
+ exports.ruleTriggerZoneIds = ruleTriggerZoneIds;
105595
106291
  exports.runInferenceStep = runInferenceStep;
105596
106292
  exports.runtimeDevices = runtimeDevices;
105597
106293
  exports.runtimeStatePolicyFor = runtimeStatePolicyFor;
@@ -105604,6 +106300,7 @@ exports.scopeKey = require_sleep.scopeKey;
105604
106300
  exports.scopesAllowAddon = scopesAllowAddon;
105605
106301
  exports.scopesAllowAddonRoutes = scopesAllowAddonRoutes;
105606
106302
  exports.scopesAllowDeviceCap = scopesAllowDeviceCap;
106303
+ exports.scopesAllowOwnPreferences = scopesAllowOwnPreferences;
105607
106304
  exports.scopesGrantAdmin = scopesGrantAdmin;
105608
106305
  exports.scoreRuntimes = scoreRuntimes;
105609
106306
  exports.scriptRunnerCapability = scriptRunnerCapability;