@camstack/addon-model-studio 1.1.104 → 1.1.105

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 (18) hide show
  1. package/dist/{MotionZonesSettings-Bc_YXAAi.mjs → MotionZonesSettings-XMPoIYFu.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-By6TGWR1.mjs → PrivacyMaskSettings-DgdqloNU.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-BZ9hjbBq.mjs → SceneMonitorEditor-l-b-BPaQ.mjs} +3 -3
  4. package/dist/_stub.js +10 -10
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-vNTuRhqM.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-21bgOzUI.mjs} +4 -4
  6. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-aHUvVOD2.mjs +26 -0
  7. package/dist/{hostInit-Cx0wTUuS.mjs → hostInit-BW9e3qS4.mjs} +3 -3
  8. package/dist/model-studio.addon.js +125 -127
  9. package/dist/model-studio.addon.mjs +125 -127
  10. package/dist/{player-overlays-U1-XkeE2.mjs → player-overlays-ZB_RSFsz.mjs} +1 -1
  11. package/dist/remoteEntry.js +1 -1
  12. package/dist/{responsive-BKfVQp1R.mjs → responsive-BmCAfELM.mjs} +1 -1
  13. package/dist/{square-CiaLk8Ju.mjs → square-CKjHeCzD.mjs} +1 -1
  14. package/dist/{trash-2-xsKAqBdh.mjs → trash-2-ChmGdZRL.mjs} +1 -1
  15. package/dist/{use-device-snapshot-BHoqPeg0.mjs → use-device-snapshot-j7AfuCt4.mjs} +1 -1
  16. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-CaE_D4tv.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-BwQ-YWk-.mjs} +1 -1
  17. package/package.json +1 -1
  18. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-pk3CFyYP.mjs +0 -26
@@ -8182,111 +8182,6 @@ var CameraSwitchGroupSchema = object({
8182
8182
  fetchedAt: number()
8183
8183
  });
8184
8184
  /**
8185
- * Per-component log CHANNELS — the gate a hot path consults, and the registry
8186
- * an addon declares its channels in.
8187
- *
8188
- * ## Two axes, deliberately separated
8189
- *
8190
- * - **DECLARATION** — which channels exist. Only the addon knows:
8191
- * `stream-broker` knows webrtc/ICE/RTP, `provider-reolink` knows
8192
- * baichuan/handshake. A hand-wired central list rots at the first addition,
8193
- * and rots silently. So a channel is declared where it is consulted, and the
8194
- * `log-channels` capability enumerates the declarations.
8195
- * - **VALUE** — at which level, for which scope, until when. That stays ONE
8196
- * thing: the logging settings document on the `system` cap. Two authorities
8197
- * over the values is the exact defect
8198
- * `docs/design/plans/2026-08-26-logging-per-componente.md` was written to
8199
- * remove; re-introducing it from the cure side would be grotesque.
8200
- *
8201
- * Nothing in this file reads a clock, an env var or a store. The registry is
8202
- * a MIRROR: it is moved only by {@link LogChannelRegistry.apply}, called off
8203
- * the hot path with a value somebody actually read, and by
8204
- * {@link LogChannelRegistry.tick}, called on a timer. A store read that fails
8205
- * never reaches here, so it can neither disarm an armed channel nor arm a
8206
- * disarmed one (D49).
8207
- *
8208
- * ## The canonical call shape
8209
- *
8210
- * ```ts
8211
- * if (CH_RTP.on && CH_RTP.wants(deviceId)) {
8212
- * CH_RTP.log(logger, 'rtp subscriber added', { tags: { deviceId }, meta: { ssrc } })
8213
- * }
8214
- * ```
8215
- *
8216
- * `on` is a plain boolean FIELD — never a getter — and it is the FIRST thing
8217
- * read. Disarmed, a call site costs one load and one branch, and the `extras`
8218
- * object literal is never constructed because it lives inside the branch. It
8219
- * is the same shape already proven in production at `stream-broker.ts:1650`,
8220
- * and the same discipline `LoggingGate.allowsDestination` uses for the
8221
- * destination floor (measured at 1.93 ns/call when off).
8222
- *
8223
- * ## Why a channel emits at `info`
8224
- *
8225
- * `loki-logging.addon.ts` pins the destination default at `info` and
8226
- * `loki-destination.ts` drops everything below it, so a line emitted at
8227
- * `debug` never reaches Loki and the hub's in-memory ring only holds ~35
8228
- * minutes. A diagnostic that cannot be read an hour later is worse than no
8229
- * diagnostic, because it looks done. {@link LogChannelGate.log} therefore
8230
- * emits at the channel's declared level, whose schema floor is `info`.
8231
- */
8232
- /**
8233
- * The level a channel writes at once armed.
8234
- *
8235
- * `debug` is absent ON PURPOSE and not by omission: below `info` the line does
8236
- * not leave the process for Loki, and the whole point of arming a channel is
8237
- * to read it later.
8238
- */
8239
- var LogChannelLevelSchema = _enum([
8240
- "info",
8241
- "warn",
8242
- "error"
8243
- ]);
8244
- /**
8245
- * What an addon declares about one channel. No value, no state — a
8246
- * declaration is inert.
8247
- */
8248
- var LogChannelDescriptorSchema = object({
8249
- /**
8250
- * Dotted `area.thing`, unique across the workspace. `area` is conventionally
8251
- * the addon's short name so an operator reading a channel list can tell who
8252
- * owns it without a second lookup.
8253
- */
8254
- name: string().min(3).regex(/^[a-z0-9-]+(\.[a-z0-9-]+)+$/, "a channel name is dotted lower-kebab, e.g. area.thing"),
8255
- /** One sentence: what the operator will SEE after arming it. */
8256
- description: string().min(1),
8257
- /** The level its lines are emitted at. Never below `info`. */
8258
- defaultLevel: LogChannelLevelSchema,
8259
- /**
8260
- * Whether this channel can be narrowed to a camera.
8261
- *
8262
- * `true` is a PROMISE with two halves, and both must hold: the gate is
8263
- * consulted with the numeric device id, AND every line the channel admits
8264
- * carries `tags: { deviceId }` with that same numeric id. The second half is
8265
- * what makes `| json | deviceId="617"` work in Loki — `loki-payload.ts`
8266
- * keeps `deviceId` out of the stream labels for cardinality, so the tag in
8267
- * the body is the only way to filter.
8268
- *
8269
- * A channel whose lines carry the device only in `meta` (or not at all) is
8270
- * declared `false`. Declaring it `true` anyway would be a lie the UI repeats:
8271
- * the operator narrows to one camera, sees nothing, and concludes the code
8272
- * path was never taken.
8273
- */
8274
- perDevice: boolean()
8275
- });
8276
- /**
8277
- * An armed window over one channel, as the document hands it to a mirror.
8278
- *
8279
- * A window is a DEADLINE, never a flag (ADR-0244): a channel somebody forgot
8280
- * expires by itself, which is the one failure a boolean cannot avoid.
8281
- */
8282
- var LogChannelWindowSchema = object({
8283
- channel: string().min(1),
8284
- /** Epoch ms the window closes at. */
8285
- armedUntilMs: number(),
8286
- /** `null` = every camera. A non-empty list narrows to those numeric ids. */
8287
- deviceIds: array(number().int()).readonly().nullable()
8288
- });
8289
- /**
8290
8185
  * Ops-log — the durable, append-only operations audit shared by the
8291
8186
  * recordings and events management surfaces.
8292
8187
  *
@@ -9232,8 +9127,11 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
9232
9127
  * `STORAGE_LOCATION_CARDINALITY` map has been removed.
9233
9128
  *
9234
9129
  * `id` is a stable namespaced string of the form `<type>:<slug>`.
9235
- * The default location for a type uses `id === <type>:default` by
9236
- * convention (the bare type ref like `'backups'` resolves to it).
9130
+ * The seed names its first instance `<type>:default` — a NAME, not a flag.
9131
+ * There is no default location any more (D383): `enabled` is the whole write
9132
+ * model, and a bare type ref resolves to the sole location of the type, or —
9133
+ * transitionally, only while legacy NULL-stamped rows exist — to the row whose
9134
+ * slug is `default`.
9237
9135
  *
9238
9136
  * `isSystem` is a legacy persisted flag. Seed still creates the initial
9239
9137
  * `<type>:default` locations; the flag is no longer a lock, a badge, or a
@@ -9254,21 +9152,20 @@ var StorageLocationSchema = object({
9254
9152
  * flag at upsert time, not here (the schema is provider-agnostic).
9255
9153
  */
9256
9154
  nodeId: string().optional(),
9257
- isDefault: boolean().default(false),
9258
9155
  isSystem: boolean().default(false),
9259
9156
  /**
9260
- * Operator opt-in: whether consumers that BALANCE across several locations
9261
- * of a type may write here. Recordings reads it today; event media and
9262
- * backups are the next consumers, which is why the flag lives on the
9263
- * location rather than in any one addon's store nothing has to be
9264
- * extended to add the next consumer.
9157
+ * THE write switch, and the only one (D383). `enabled: true` means every
9158
+ * consumer that chooses a write target for this type may write here, and all
9159
+ * enabled locations of a type are used TOGETHER; `false` means read-only
9160
+ * still read, still played back, still age-swept, still drained, never
9161
+ * written.
9265
9162
  *
9266
- * OPTIONAL, and ABSENT MEANS ACTIVE. Every location persisted before the
9267
- * flag existed reads back with no flag and keeps working exactly as before;
9268
- * that is the whole compat story, and it is why no migration ships with it.
9269
- * A newly CREATED sibling is stamped `false` by the orchestrator (creating a
9270
- * disk must not silently start writing to it); the default of a type is
9271
- * always stamped `true`.
9163
+ * OPTIONAL only for the wire: an upsert that omits it means "leave what is
9164
+ * stored" on an update and "born inert unless it is the first location of its
9165
+ * type" on a create. On a PERSISTED row absence is legacy and it means
9166
+ * enabled {@link isLocationEnabled} is the one place that says so, and the
9167
+ * orchestrator stamps every flagless row `true` once at hydrate so absence
9168
+ * stops existing rather than being re-derived on every read.
9272
9169
  */
9273
9170
  enabled: boolean().optional(),
9274
9171
  /** COMPUTED at read time by the orchestrator (statfs of the backing volume
@@ -9281,10 +9178,12 @@ var StorageLocationSchema = object({
9281
9178
  createdAt: number(),
9282
9179
  updatedAt: number()
9283
9180
  });
9181
+ object({ isDefault: boolean().optional() });
9284
9182
  /**
9285
9183
  * Reference accepted by consumer-facing `api.storage.*` calls.
9286
9184
  * Either:
9287
- * - a `StorageLocationType` (e.g. `'backups'`) → orchestrator resolves to the default of that type
9185
+ * - a `StorageLocationType` (e.g. `'backups'`) → the sole location of that type
9186
+ * (transitionally, the `<type>:default`-slugged row when several exist)
9288
9187
  * - a fully-qualified id (e.g. `'backups:nas-01'`) → addresses a specific instance
9289
9188
  *
9290
9189
  * The orchestrator's `resolveRef(ref)` handles both cases.
@@ -9460,6 +9359,111 @@ var DecoderSessionConfigSchema = object({
9460
9359
  */
9461
9360
  debug: boolean().optional()
9462
9361
  });
9362
+ /**
9363
+ * Per-component log CHANNELS — the gate a hot path consults, and the registry
9364
+ * an addon declares its channels in.
9365
+ *
9366
+ * ## Two axes, deliberately separated
9367
+ *
9368
+ * - **DECLARATION** — which channels exist. Only the addon knows:
9369
+ * `stream-broker` knows webrtc/ICE/RTP, `provider-reolink` knows
9370
+ * baichuan/handshake. A hand-wired central list rots at the first addition,
9371
+ * and rots silently. So a channel is declared where it is consulted, and the
9372
+ * `log-channels` capability enumerates the declarations.
9373
+ * - **VALUE** — at which level, for which scope, until when. That stays ONE
9374
+ * thing: the logging settings document on the `system` cap. Two authorities
9375
+ * over the values is the exact defect
9376
+ * `docs/design/plans/2026-08-26-logging-per-componente.md` was written to
9377
+ * remove; re-introducing it from the cure side would be grotesque.
9378
+ *
9379
+ * Nothing in this file reads a clock, an env var or a store. The registry is
9380
+ * a MIRROR: it is moved only by {@link LogChannelRegistry.apply}, called off
9381
+ * the hot path with a value somebody actually read, and by
9382
+ * {@link LogChannelRegistry.tick}, called on a timer. A store read that fails
9383
+ * never reaches here, so it can neither disarm an armed channel nor arm a
9384
+ * disarmed one (D49).
9385
+ *
9386
+ * ## The canonical call shape
9387
+ *
9388
+ * ```ts
9389
+ * if (CH_RTP.on && CH_RTP.wants(deviceId)) {
9390
+ * CH_RTP.log(logger, 'rtp subscriber added', { tags: { deviceId }, meta: { ssrc } })
9391
+ * }
9392
+ * ```
9393
+ *
9394
+ * `on` is a plain boolean FIELD — never a getter — and it is the FIRST thing
9395
+ * read. Disarmed, a call site costs one load and one branch, and the `extras`
9396
+ * object literal is never constructed because it lives inside the branch. It
9397
+ * is the same shape already proven in production at `stream-broker.ts:1650`,
9398
+ * and the same discipline `LoggingGate.allowsDestination` uses for the
9399
+ * destination floor (measured at 1.93 ns/call when off).
9400
+ *
9401
+ * ## Why a channel emits at `info`
9402
+ *
9403
+ * `loki-logging.addon.ts` pins the destination default at `info` and
9404
+ * `loki-destination.ts` drops everything below it, so a line emitted at
9405
+ * `debug` never reaches Loki and the hub's in-memory ring only holds ~35
9406
+ * minutes. A diagnostic that cannot be read an hour later is worse than no
9407
+ * diagnostic, because it looks done. {@link LogChannelGate.log} therefore
9408
+ * emits at the channel's declared level, whose schema floor is `info`.
9409
+ */
9410
+ /**
9411
+ * The level a channel writes at once armed.
9412
+ *
9413
+ * `debug` is absent ON PURPOSE and not by omission: below `info` the line does
9414
+ * not leave the process for Loki, and the whole point of arming a channel is
9415
+ * to read it later.
9416
+ */
9417
+ var LogChannelLevelSchema = _enum([
9418
+ "info",
9419
+ "warn",
9420
+ "error"
9421
+ ]);
9422
+ /**
9423
+ * What an addon declares about one channel. No value, no state — a
9424
+ * declaration is inert.
9425
+ */
9426
+ var LogChannelDescriptorSchema = object({
9427
+ /**
9428
+ * Dotted `area.thing`, unique across the workspace. `area` is conventionally
9429
+ * the addon's short name so an operator reading a channel list can tell who
9430
+ * owns it without a second lookup.
9431
+ */
9432
+ name: string().min(3).regex(/^[a-z0-9-]+(\.[a-z0-9-]+)+$/, "a channel name is dotted lower-kebab, e.g. area.thing"),
9433
+ /** One sentence: what the operator will SEE after arming it. */
9434
+ description: string().min(1),
9435
+ /** The level its lines are emitted at. Never below `info`. */
9436
+ defaultLevel: LogChannelLevelSchema,
9437
+ /**
9438
+ * Whether this channel can be narrowed to a camera.
9439
+ *
9440
+ * `true` is a PROMISE with two halves, and both must hold: the gate is
9441
+ * consulted with the numeric device id, AND every line the channel admits
9442
+ * carries `tags: { deviceId }` with that same numeric id. The second half is
9443
+ * what makes `| json | deviceId="617"` work in Loki — `loki-payload.ts`
9444
+ * keeps `deviceId` out of the stream labels for cardinality, so the tag in
9445
+ * the body is the only way to filter.
9446
+ *
9447
+ * A channel whose lines carry the device only in `meta` (or not at all) is
9448
+ * declared `false`. Declaring it `true` anyway would be a lie the UI repeats:
9449
+ * the operator narrows to one camera, sees nothing, and concludes the code
9450
+ * path was never taken.
9451
+ */
9452
+ perDevice: boolean()
9453
+ });
9454
+ /**
9455
+ * An armed window over one channel, as the document hands it to a mirror.
9456
+ *
9457
+ * A window is a DEADLINE, never a flag (ADR-0244): a channel somebody forgot
9458
+ * expires by itself, which is the one failure a boolean cannot avoid.
9459
+ */
9460
+ var LogChannelWindowSchema = object({
9461
+ channel: string().min(1),
9462
+ /** Epoch ms the window closes at. */
9463
+ armedUntilMs: number(),
9464
+ /** `null` = every camera. A non-empty list narrows to those numeric ids. */
9465
+ deviceIds: array(number().int()).readonly().nullable()
9466
+ });
9463
9467
  var MODEL_FORMATS = [
9464
9468
  "onnx",
9465
9469
  "coreml",
@@ -22186,7 +22190,7 @@ method(object({
22186
22190
  downloadId: string(),
22187
22191
  offset: number(),
22188
22192
  length: number()
22189
- }), _instanceof(Uint8Array)), method(object({ downloadId: string() }), _void(), { kind: "mutation" }), method(object({ type: StorageLocationTypeSchema.optional() }), array(StorageLocationSchema).readonly()), method(object({ type: StorageLocationTypeSchema }), StorageLocationSchema.nullable()), method(_void(), array(StorageLocationDeclarationSchema).readonly()), method(StorageLocationSchema.omit({
22193
+ }), _instanceof(Uint8Array)), method(object({ downloadId: string() }), _void(), { kind: "mutation" }), method(object({ type: StorageLocationTypeSchema.optional() }), array(StorageLocationSchema).readonly()), method(_void(), array(StorageLocationDeclarationSchema).readonly()), method(StorageLocationSchema.omit({
22190
22194
  createdAt: true,
22191
22195
  updatedAt: true
22192
22196
  }), StorageLocationSchema, {
@@ -35035,12 +35039,6 @@ Object.freeze({
35035
35039
  addonId: null,
35036
35040
  access: "view"
35037
35041
  },
35038
- "storage.getDefaultLocation": {
35039
- capName: "storage",
35040
- capScope: "system",
35041
- addonId: null,
35042
- access: "view"
35043
- },
35044
35042
  "storage.list": {
35045
35043
  capName: "storage",
35046
35044
  capScope: "system",
@@ -8161,111 +8161,6 @@ var CameraSwitchGroupSchema = object({
8161
8161
  fetchedAt: number()
8162
8162
  });
8163
8163
  /**
8164
- * Per-component log CHANNELS — the gate a hot path consults, and the registry
8165
- * an addon declares its channels in.
8166
- *
8167
- * ## Two axes, deliberately separated
8168
- *
8169
- * - **DECLARATION** — which channels exist. Only the addon knows:
8170
- * `stream-broker` knows webrtc/ICE/RTP, `provider-reolink` knows
8171
- * baichuan/handshake. A hand-wired central list rots at the first addition,
8172
- * and rots silently. So a channel is declared where it is consulted, and the
8173
- * `log-channels` capability enumerates the declarations.
8174
- * - **VALUE** — at which level, for which scope, until when. That stays ONE
8175
- * thing: the logging settings document on the `system` cap. Two authorities
8176
- * over the values is the exact defect
8177
- * `docs/design/plans/2026-08-26-logging-per-componente.md` was written to
8178
- * remove; re-introducing it from the cure side would be grotesque.
8179
- *
8180
- * Nothing in this file reads a clock, an env var or a store. The registry is
8181
- * a MIRROR: it is moved only by {@link LogChannelRegistry.apply}, called off
8182
- * the hot path with a value somebody actually read, and by
8183
- * {@link LogChannelRegistry.tick}, called on a timer. A store read that fails
8184
- * never reaches here, so it can neither disarm an armed channel nor arm a
8185
- * disarmed one (D49).
8186
- *
8187
- * ## The canonical call shape
8188
- *
8189
- * ```ts
8190
- * if (CH_RTP.on && CH_RTP.wants(deviceId)) {
8191
- * CH_RTP.log(logger, 'rtp subscriber added', { tags: { deviceId }, meta: { ssrc } })
8192
- * }
8193
- * ```
8194
- *
8195
- * `on` is a plain boolean FIELD — never a getter — and it is the FIRST thing
8196
- * read. Disarmed, a call site costs one load and one branch, and the `extras`
8197
- * object literal is never constructed because it lives inside the branch. It
8198
- * is the same shape already proven in production at `stream-broker.ts:1650`,
8199
- * and the same discipline `LoggingGate.allowsDestination` uses for the
8200
- * destination floor (measured at 1.93 ns/call when off).
8201
- *
8202
- * ## Why a channel emits at `info`
8203
- *
8204
- * `loki-logging.addon.ts` pins the destination default at `info` and
8205
- * `loki-destination.ts` drops everything below it, so a line emitted at
8206
- * `debug` never reaches Loki and the hub's in-memory ring only holds ~35
8207
- * minutes. A diagnostic that cannot be read an hour later is worse than no
8208
- * diagnostic, because it looks done. {@link LogChannelGate.log} therefore
8209
- * emits at the channel's declared level, whose schema floor is `info`.
8210
- */
8211
- /**
8212
- * The level a channel writes at once armed.
8213
- *
8214
- * `debug` is absent ON PURPOSE and not by omission: below `info` the line does
8215
- * not leave the process for Loki, and the whole point of arming a channel is
8216
- * to read it later.
8217
- */
8218
- var LogChannelLevelSchema = _enum([
8219
- "info",
8220
- "warn",
8221
- "error"
8222
- ]);
8223
- /**
8224
- * What an addon declares about one channel. No value, no state — a
8225
- * declaration is inert.
8226
- */
8227
- var LogChannelDescriptorSchema = object({
8228
- /**
8229
- * Dotted `area.thing`, unique across the workspace. `area` is conventionally
8230
- * the addon's short name so an operator reading a channel list can tell who
8231
- * owns it without a second lookup.
8232
- */
8233
- name: string().min(3).regex(/^[a-z0-9-]+(\.[a-z0-9-]+)+$/, "a channel name is dotted lower-kebab, e.g. area.thing"),
8234
- /** One sentence: what the operator will SEE after arming it. */
8235
- description: string().min(1),
8236
- /** The level its lines are emitted at. Never below `info`. */
8237
- defaultLevel: LogChannelLevelSchema,
8238
- /**
8239
- * Whether this channel can be narrowed to a camera.
8240
- *
8241
- * `true` is a PROMISE with two halves, and both must hold: the gate is
8242
- * consulted with the numeric device id, AND every line the channel admits
8243
- * carries `tags: { deviceId }` with that same numeric id. The second half is
8244
- * what makes `| json | deviceId="617"` work in Loki — `loki-payload.ts`
8245
- * keeps `deviceId` out of the stream labels for cardinality, so the tag in
8246
- * the body is the only way to filter.
8247
- *
8248
- * A channel whose lines carry the device only in `meta` (or not at all) is
8249
- * declared `false`. Declaring it `true` anyway would be a lie the UI repeats:
8250
- * the operator narrows to one camera, sees nothing, and concludes the code
8251
- * path was never taken.
8252
- */
8253
- perDevice: boolean()
8254
- });
8255
- /**
8256
- * An armed window over one channel, as the document hands it to a mirror.
8257
- *
8258
- * A window is a DEADLINE, never a flag (ADR-0244): a channel somebody forgot
8259
- * expires by itself, which is the one failure a boolean cannot avoid.
8260
- */
8261
- var LogChannelWindowSchema = object({
8262
- channel: string().min(1),
8263
- /** Epoch ms the window closes at. */
8264
- armedUntilMs: number(),
8265
- /** `null` = every camera. A non-empty list narrows to those numeric ids. */
8266
- deviceIds: array(number().int()).readonly().nullable()
8267
- });
8268
- /**
8269
8164
  * Ops-log — the durable, append-only operations audit shared by the
8270
8165
  * recordings and events management surfaces.
8271
8166
  *
@@ -9211,8 +9106,11 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
9211
9106
  * `STORAGE_LOCATION_CARDINALITY` map has been removed.
9212
9107
  *
9213
9108
  * `id` is a stable namespaced string of the form `<type>:<slug>`.
9214
- * The default location for a type uses `id === <type>:default` by
9215
- * convention (the bare type ref like `'backups'` resolves to it).
9109
+ * The seed names its first instance `<type>:default` — a NAME, not a flag.
9110
+ * There is no default location any more (D383): `enabled` is the whole write
9111
+ * model, and a bare type ref resolves to the sole location of the type, or —
9112
+ * transitionally, only while legacy NULL-stamped rows exist — to the row whose
9113
+ * slug is `default`.
9216
9114
  *
9217
9115
  * `isSystem` is a legacy persisted flag. Seed still creates the initial
9218
9116
  * `<type>:default` locations; the flag is no longer a lock, a badge, or a
@@ -9233,21 +9131,20 @@ var StorageLocationSchema = object({
9233
9131
  * flag at upsert time, not here (the schema is provider-agnostic).
9234
9132
  */
9235
9133
  nodeId: string().optional(),
9236
- isDefault: boolean().default(false),
9237
9134
  isSystem: boolean().default(false),
9238
9135
  /**
9239
- * Operator opt-in: whether consumers that BALANCE across several locations
9240
- * of a type may write here. Recordings reads it today; event media and
9241
- * backups are the next consumers, which is why the flag lives on the
9242
- * location rather than in any one addon's store nothing has to be
9243
- * extended to add the next consumer.
9136
+ * THE write switch, and the only one (D383). `enabled: true` means every
9137
+ * consumer that chooses a write target for this type may write here, and all
9138
+ * enabled locations of a type are used TOGETHER; `false` means read-only
9139
+ * still read, still played back, still age-swept, still drained, never
9140
+ * written.
9244
9141
  *
9245
- * OPTIONAL, and ABSENT MEANS ACTIVE. Every location persisted before the
9246
- * flag existed reads back with no flag and keeps working exactly as before;
9247
- * that is the whole compat story, and it is why no migration ships with it.
9248
- * A newly CREATED sibling is stamped `false` by the orchestrator (creating a
9249
- * disk must not silently start writing to it); the default of a type is
9250
- * always stamped `true`.
9142
+ * OPTIONAL only for the wire: an upsert that omits it means "leave what is
9143
+ * stored" on an update and "born inert unless it is the first location of its
9144
+ * type" on a create. On a PERSISTED row absence is legacy and it means
9145
+ * enabled {@link isLocationEnabled} is the one place that says so, and the
9146
+ * orchestrator stamps every flagless row `true` once at hydrate so absence
9147
+ * stops existing rather than being re-derived on every read.
9251
9148
  */
9252
9149
  enabled: boolean().optional(),
9253
9150
  /** COMPUTED at read time by the orchestrator (statfs of the backing volume
@@ -9260,10 +9157,12 @@ var StorageLocationSchema = object({
9260
9157
  createdAt: number(),
9261
9158
  updatedAt: number()
9262
9159
  });
9160
+ object({ isDefault: boolean().optional() });
9263
9161
  /**
9264
9162
  * Reference accepted by consumer-facing `api.storage.*` calls.
9265
9163
  * Either:
9266
- * - a `StorageLocationType` (e.g. `'backups'`) → orchestrator resolves to the default of that type
9164
+ * - a `StorageLocationType` (e.g. `'backups'`) → the sole location of that type
9165
+ * (transitionally, the `<type>:default`-slugged row when several exist)
9267
9166
  * - a fully-qualified id (e.g. `'backups:nas-01'`) → addresses a specific instance
9268
9167
  *
9269
9168
  * The orchestrator's `resolveRef(ref)` handles both cases.
@@ -9439,6 +9338,111 @@ var DecoderSessionConfigSchema = object({
9439
9338
  */
9440
9339
  debug: boolean().optional()
9441
9340
  });
9341
+ /**
9342
+ * Per-component log CHANNELS — the gate a hot path consults, and the registry
9343
+ * an addon declares its channels in.
9344
+ *
9345
+ * ## Two axes, deliberately separated
9346
+ *
9347
+ * - **DECLARATION** — which channels exist. Only the addon knows:
9348
+ * `stream-broker` knows webrtc/ICE/RTP, `provider-reolink` knows
9349
+ * baichuan/handshake. A hand-wired central list rots at the first addition,
9350
+ * and rots silently. So a channel is declared where it is consulted, and the
9351
+ * `log-channels` capability enumerates the declarations.
9352
+ * - **VALUE** — at which level, for which scope, until when. That stays ONE
9353
+ * thing: the logging settings document on the `system` cap. Two authorities
9354
+ * over the values is the exact defect
9355
+ * `docs/design/plans/2026-08-26-logging-per-componente.md` was written to
9356
+ * remove; re-introducing it from the cure side would be grotesque.
9357
+ *
9358
+ * Nothing in this file reads a clock, an env var or a store. The registry is
9359
+ * a MIRROR: it is moved only by {@link LogChannelRegistry.apply}, called off
9360
+ * the hot path with a value somebody actually read, and by
9361
+ * {@link LogChannelRegistry.tick}, called on a timer. A store read that fails
9362
+ * never reaches here, so it can neither disarm an armed channel nor arm a
9363
+ * disarmed one (D49).
9364
+ *
9365
+ * ## The canonical call shape
9366
+ *
9367
+ * ```ts
9368
+ * if (CH_RTP.on && CH_RTP.wants(deviceId)) {
9369
+ * CH_RTP.log(logger, 'rtp subscriber added', { tags: { deviceId }, meta: { ssrc } })
9370
+ * }
9371
+ * ```
9372
+ *
9373
+ * `on` is a plain boolean FIELD — never a getter — and it is the FIRST thing
9374
+ * read. Disarmed, a call site costs one load and one branch, and the `extras`
9375
+ * object literal is never constructed because it lives inside the branch. It
9376
+ * is the same shape already proven in production at `stream-broker.ts:1650`,
9377
+ * and the same discipline `LoggingGate.allowsDestination` uses for the
9378
+ * destination floor (measured at 1.93 ns/call when off).
9379
+ *
9380
+ * ## Why a channel emits at `info`
9381
+ *
9382
+ * `loki-logging.addon.ts` pins the destination default at `info` and
9383
+ * `loki-destination.ts` drops everything below it, so a line emitted at
9384
+ * `debug` never reaches Loki and the hub's in-memory ring only holds ~35
9385
+ * minutes. A diagnostic that cannot be read an hour later is worse than no
9386
+ * diagnostic, because it looks done. {@link LogChannelGate.log} therefore
9387
+ * emits at the channel's declared level, whose schema floor is `info`.
9388
+ */
9389
+ /**
9390
+ * The level a channel writes at once armed.
9391
+ *
9392
+ * `debug` is absent ON PURPOSE and not by omission: below `info` the line does
9393
+ * not leave the process for Loki, and the whole point of arming a channel is
9394
+ * to read it later.
9395
+ */
9396
+ var LogChannelLevelSchema = _enum([
9397
+ "info",
9398
+ "warn",
9399
+ "error"
9400
+ ]);
9401
+ /**
9402
+ * What an addon declares about one channel. No value, no state — a
9403
+ * declaration is inert.
9404
+ */
9405
+ var LogChannelDescriptorSchema = object({
9406
+ /**
9407
+ * Dotted `area.thing`, unique across the workspace. `area` is conventionally
9408
+ * the addon's short name so an operator reading a channel list can tell who
9409
+ * owns it without a second lookup.
9410
+ */
9411
+ name: string().min(3).regex(/^[a-z0-9-]+(\.[a-z0-9-]+)+$/, "a channel name is dotted lower-kebab, e.g. area.thing"),
9412
+ /** One sentence: what the operator will SEE after arming it. */
9413
+ description: string().min(1),
9414
+ /** The level its lines are emitted at. Never below `info`. */
9415
+ defaultLevel: LogChannelLevelSchema,
9416
+ /**
9417
+ * Whether this channel can be narrowed to a camera.
9418
+ *
9419
+ * `true` is a PROMISE with two halves, and both must hold: the gate is
9420
+ * consulted with the numeric device id, AND every line the channel admits
9421
+ * carries `tags: { deviceId }` with that same numeric id. The second half is
9422
+ * what makes `| json | deviceId="617"` work in Loki — `loki-payload.ts`
9423
+ * keeps `deviceId` out of the stream labels for cardinality, so the tag in
9424
+ * the body is the only way to filter.
9425
+ *
9426
+ * A channel whose lines carry the device only in `meta` (or not at all) is
9427
+ * declared `false`. Declaring it `true` anyway would be a lie the UI repeats:
9428
+ * the operator narrows to one camera, sees nothing, and concludes the code
9429
+ * path was never taken.
9430
+ */
9431
+ perDevice: boolean()
9432
+ });
9433
+ /**
9434
+ * An armed window over one channel, as the document hands it to a mirror.
9435
+ *
9436
+ * A window is a DEADLINE, never a flag (ADR-0244): a channel somebody forgot
9437
+ * expires by itself, which is the one failure a boolean cannot avoid.
9438
+ */
9439
+ var LogChannelWindowSchema = object({
9440
+ channel: string().min(1),
9441
+ /** Epoch ms the window closes at. */
9442
+ armedUntilMs: number(),
9443
+ /** `null` = every camera. A non-empty list narrows to those numeric ids. */
9444
+ deviceIds: array(number().int()).readonly().nullable()
9445
+ });
9442
9446
  var MODEL_FORMATS = [
9443
9447
  "onnx",
9444
9448
  "coreml",
@@ -22165,7 +22169,7 @@ method(object({
22165
22169
  downloadId: string(),
22166
22170
  offset: number(),
22167
22171
  length: number()
22168
- }), _instanceof(Uint8Array)), method(object({ downloadId: string() }), _void(), { kind: "mutation" }), method(object({ type: StorageLocationTypeSchema.optional() }), array(StorageLocationSchema).readonly()), method(object({ type: StorageLocationTypeSchema }), StorageLocationSchema.nullable()), method(_void(), array(StorageLocationDeclarationSchema).readonly()), method(StorageLocationSchema.omit({
22172
+ }), _instanceof(Uint8Array)), method(object({ downloadId: string() }), _void(), { kind: "mutation" }), method(object({ type: StorageLocationTypeSchema.optional() }), array(StorageLocationSchema).readonly()), method(_void(), array(StorageLocationDeclarationSchema).readonly()), method(StorageLocationSchema.omit({
22169
22173
  createdAt: true,
22170
22174
  updatedAt: true
22171
22175
  }), StorageLocationSchema, {
@@ -35014,12 +35018,6 @@ Object.freeze({
35014
35018
  addonId: null,
35015
35019
  access: "view"
35016
35020
  },
35017
- "storage.getDefaultLocation": {
35018
- capName: "storage",
35019
- capScope: "system",
35020
- addonId: null,
35021
- access: "view"
35022
- },
35023
35021
  "storage.list": {
35024
35022
  capName: "storage",
35025
35023
  capScope: "system",
@@ -1,5 +1,5 @@
1
1
  import { h as e, l as t, u as n, y as r } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DJDHChgO.mjs";
2
- import { o as i, s as a } from "./responsive-BKfVQp1R.mjs";
2
+ import { o as i, s as a } from "./responsive-BmCAfELM.mjs";
3
3
  import { n as o, r as s, t as c } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-ds_Ehzaa.mjs";
4
4
  var l = a("chevron-down", [["path", {
5
5
  d: "m6 9 6 6 6-6",
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-CaE_D4tv.mjs";
1
+ import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-BwQ-YWk-.mjs";
2
2
  export { t as get, e as init };
@@ -1,6 +1,6 @@
1
1
  import { c as e, g as t, h as n, l as r, n as i, p as a, r as o, t as s, u as c, y as l } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DJDHChgO.mjs";
2
2
  import "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-ds_Ehzaa.mjs";
3
- import { n as u } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-pk3CFyYP.mjs";
3
+ import { n as u } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-aHUvVOD2.mjs";
4
4
  //#region ../ui-library/node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
5
5
  l();
6
6
  var d = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), f = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), p = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), m = (e) => {
@@ -1,4 +1,4 @@
1
- import { s as e } from "./responsive-BKfVQp1R.mjs";
1
+ import { s as e } from "./responsive-BmCAfELM.mjs";
2
2
  var t = e("eye-off", [
3
3
  ["path", {
4
4
  d: "M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",
@@ -1,4 +1,4 @@
1
- import { s as e } from "./responsive-BKfVQp1R.mjs";
1
+ import { s as e } from "./responsive-BmCAfELM.mjs";
2
2
  var t = e("trash-2", [
3
3
  ["path", {
4
4
  d: "M10 11v6",
@@ -1,5 +1,5 @@
1
1
  import { c as e, h as t, p as n, y as r } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DJDHChgO.mjs";
2
- import { s as i } from "./responsive-BKfVQp1R.mjs";
2
+ import { s as i } from "./responsive-BmCAfELM.mjs";
3
3
  var a = i("camera", [["path", {
4
4
  d: "M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z",
5
5
  key: "18u6gg"