@camstack/addon-model-studio 1.1.103 → 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-CixOJF-v.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-Bf2tt90B.mjs → hostInit-BW9e3qS4.mjs} +3 -3
  8. package/dist/model-studio.addon.js +158 -141
  9. package/dist/model-studio.addon.mjs +158 -141
  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-B62CQYmV.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",
@@ -11134,12 +11138,30 @@ var BackupDestinationInfoSchema = object({
11134
11138
  lastSuccessAt: number().optional(),
11135
11139
  /** Newest-archive size from `manifests.json`, or undefined. */
11136
11140
  lastSuccessSizeBytes: number().optional(),
11137
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
11141
+ /**
11142
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
11143
+ * destination, comma-joined. Absent when no enabled schedule targets it
11144
+ * — a destination nothing is scheduled to write to must not advertise a
11145
+ * cadence (D384). This is never the `backup_destination_policies.cron`
11146
+ * column: that per-location cron has scheduled nothing since 2026-07-28
11147
+ * and reading it made a destination with a DISABLED schedule claim a
11148
+ * nightly run.
11149
+ */
11138
11150
  cron: string().optional(),
11139
- /** ms-epoch of next computed firing for this destination's cron, if any. */
11151
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
11140
11152
  nextRunAt: number().optional(),
11141
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
11142
- lastRunAt: number().optional()
11153
+ /**
11154
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
11155
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
11156
+ * newest archive that actually landed) and `lastError`.
11157
+ */
11158
+ lastAttemptAt: number().optional(),
11159
+ /**
11160
+ * Why the last attempt failed, verbatim. Absent when the last attempt
11161
+ * landed the archive. A destination that has never been written to has
11162
+ * neither this nor `lastAttemptAt`.
11163
+ */
11164
+ lastError: string().optional()
11143
11165
  });
11144
11166
  /**
11145
11167
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -11302,8 +11324,16 @@ var BackupScheduleSchema = object({
11302
11324
  retentionCount: number().int().min(1).max(1e3),
11303
11325
  /** Optional subset of source locations to include; omitted = all. */
11304
11326
  dataSources: array(string()).readonly().optional(),
11305
- /** ms-epoch of last successful run. */
11306
- lastRunAt: number().optional(),
11327
+ /**
11328
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
11329
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
11330
+ * "succeeded" — a run refused by every destination stamps it too.
11331
+ */
11332
+ lastAttemptAt: number().optional(),
11333
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
11334
+ lastSuccessAt: number().optional(),
11335
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
11336
+ lastError: string().optional(),
11307
11337
  /** ms-epoch of next computed firing (read-only, filled on list). */
11308
11338
  nextRunAt: number().optional()
11309
11339
  });
@@ -11352,14 +11382,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
11352
11382
  locationId: string(),
11353
11383
  enabled: boolean(),
11354
11384
  retentionCount: number().int().min(1).max(1e3),
11355
- label: string().optional(),
11356
- /**
11357
- * Per-destination cron expression. Empty string clears the
11358
- * schedule (manual-only). Validated server-side via croner;
11359
- * malformed expressions reject the upsert with an actionable
11360
- * message.
11361
- */
11362
- cron: string().optional()
11385
+ label: string().optional()
11363
11386
  }), _void(), {
11364
11387
  kind: "mutation",
11365
11388
  auth: "admin"
@@ -22167,7 +22190,7 @@ method(object({
22167
22190
  downloadId: string(),
22168
22191
  offset: number(),
22169
22192
  length: number()
22170
- }), _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({
22171
22194
  createdAt: true,
22172
22195
  updatedAt: true
22173
22196
  }), StorageLocationSchema, {
@@ -35016,12 +35039,6 @@ Object.freeze({
35016
35039
  addonId: null,
35017
35040
  access: "view"
35018
35041
  },
35019
- "storage.getDefaultLocation": {
35020
- capName: "storage",
35021
- capScope: "system",
35022
- addonId: null,
35023
- access: "view"
35024
- },
35025
35042
  "storage.list": {
35026
35043
  capName: "storage",
35027
35044
  capScope: "system",