@camstack/addon-post-analysis 1.2.614 → 1.2.615

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.
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_clip_model_registry = require("../clip-model-registry-CM-m6e1l.js");
5
+ const require_clip_model_registry = require("../clip-model-registry-ycbGgfo_.js");
6
6
  let node_fs = require("node:fs");
7
7
  node_fs = require_clip_model_registry.__toESM(node_fs, 1);
8
8
  let node_path = require("node:path");
@@ -4078,6 +4078,224 @@ function ncAlarmPanelPort(panel) {
4078
4078
  };
4079
4079
  }
4080
4080
  //#endregion
4081
+ //#region src/durable/durable-record-body.ts
4082
+ /**
4083
+ * Zod body for phase-3 durable ledger record kinds. The engine validates on
4084
+ * write; each owner's `fromRecord` / `toValue` remain authoritative on read.
4085
+ */
4086
+ var DurableLedgerBodySchema = require_clip_model_registry.record(require_clip_model_registry.string(), require_clip_model_registry.unknown());
4087
+ //#endregion
4088
+ //#region src/notification-center/nc-durable-record-kinds.ts
4089
+ /**
4090
+ * Record kinds for NC live-state ledgers (records plan phase 3, steps 25–36).
4091
+ *
4092
+ * Hosted in the pipeline-analytics addon (`pipeline-analytics` owner stamp).
4093
+ * Declared by the hub; every node reads and writes them through `ctx.records`.
4094
+ * The legacy settings-store handles (`durableLegacyKind`, `legacyCollectionKind`)
4095
+ * serve only a centre built WITHOUT `records` — the specs.
4096
+ */
4097
+ /** The settings-store tables these kinds replaced; read only WITHOUT `ctx.records` (the specs). */
4098
+ var NC_LIVENESS_LEGACY = "notification-center:liveness";
4099
+ var NC_DEVICE_ALERTS_LEGACY = "notification-center:device-alerts";
4100
+ var NC_SYSTEM_STATE_LEGACY = "notification-center:system-state";
4101
+ var NC_OCCUPANCY_LEGACY = "notification-center:occupancy";
4102
+ var NC_DEVICE_PRUNES_LEGACY = "notification-center:device-prunes";
4103
+ var NC_STATE_SUMMARY_STAMPS_LEGACY = "notification-center:state-summary-stamps";
4104
+ var NC_ALERT_EPISODES_LEGACY = "notification-center:alert-episodes";
4105
+ var NC_META_LEGACY = "notification-center:meta";
4106
+ var NC_SNOOZES_LEGACY = "notification-center:snoozes";
4107
+ var NC_SNOOZE_SUPPRESSED_LEGACY = "notification-center:snooze-suppressed";
4108
+ var NC_TRACK_GROUPS_LEGACY = "notification-center:track-groups";
4109
+ var NC_OUTBOX_LEGACY = "notification-center:outbox";
4110
+ var NC_ARTIFACTS_LEGACY = "notification-center:artifacts";
4111
+ var ledger = (writeTrigger, database = "settings", retention = { none: "mirror load-all at boot; rows drop only via owner prune or device-removal hook" }) => ({
4112
+ schema: DurableLedgerBodySchema,
4113
+ class: "ledger",
4114
+ database,
4115
+ writeTrigger,
4116
+ device: "optional",
4117
+ at: "none",
4118
+ retention
4119
+ });
4120
+ /**
4121
+ * The shape the four QUERIED kinds share with the mirrors. Each spells its own
4122
+ * file, trigger, indexes and retention as literals (the records guards read them).
4123
+ * `device` and `at` stay what the first (empty) declaration said — the engine
4124
+ * refuses to change either — so every read is served by a DATA-field index, and
4125
+ * the camera rides the record envelope (`deviceId`) for the D865 removal.
4126
+ */
4127
+ var QUERIED = {
4128
+ schema: DurableLedgerBodySchema,
4129
+ device: "optional",
4130
+ at: "none"
4131
+ };
4132
+ var ncDurableRecordKinds = require_clip_model_registry.defineRecordKinds({
4133
+ liveness: ledger("a liveness state TRANSITION the centre accepted (seed or flip); a no-flip writes nothing"),
4134
+ "device-alerts": ledger("a sustained device alert episode the centre confirmed or cleared"),
4135
+ "system-state": ledger("a system-state subject flip the state summary accepted"),
4136
+ "alert-episodes": ledger("an alert episode the centre notified (critical or error); its resolution deletes the row"),
4137
+ occupancy: ledger("a confirmed occupancy level write-through after the watcher decided an edge"),
4138
+ "device-prunes": ledger("one row recording what a deleted-device prune removed"),
4139
+ "state-summary-stamps": ledger("digest delivery stamps per rule kind"),
4140
+ meta: ledger("outbox boot-reconcile watermark and other single-key meta rows", "settings", { none: "one fixed key (watermark), overwritten in place, never deleted" }),
4141
+ snoozes: ledger("operator opens or closes a snooze window (write-through)"),
4142
+ "snooze-suppressed": {
4143
+ ...QUERIED,
4144
+ class: "ledger",
4145
+ database: "events",
4146
+ writeTrigger: "aggregate count per (window, target, rule, camera) for suppressed notifications",
4147
+ indexes: [{
4148
+ name: "snooze",
4149
+ fields: ["snoozeId"]
4150
+ }],
4151
+ retention: {
4152
+ owner: "notification-center",
4153
+ reason: "deleted with its snooze window, 6 h after that window closes"
4154
+ }
4155
+ },
4156
+ "track-groups": {
4157
+ ...QUERIED,
4158
+ class: "ledger",
4159
+ database: "events",
4160
+ writeTrigger: "one row per grouped delivery window opened at admission time",
4161
+ indexes: [
4162
+ {
4163
+ name: "open",
4164
+ fields: ["sealed"]
4165
+ },
4166
+ {
4167
+ name: "opened",
4168
+ fields: ["openedAt"]
4169
+ },
4170
+ {
4171
+ name: "device_opened",
4172
+ fields: ["deviceId", "openedAt"]
4173
+ },
4174
+ {
4175
+ name: "rule_opened",
4176
+ fields: ["ruleId", "openedAt"]
4177
+ },
4178
+ {
4179
+ name: "rule_device_opened",
4180
+ fields: [
4181
+ "ruleId",
4182
+ "deviceId",
4183
+ "openedAt"
4184
+ ]
4185
+ }
4186
+ ],
4187
+ retention: {
4188
+ owner: "notification-center",
4189
+ reason: "ring: the newest NC_GROUP_MAX_ROWS_PER_DEVICE rows per camera, trimmed on write"
4190
+ }
4191
+ },
4192
+ outbox: {
4193
+ ...QUERIED,
4194
+ class: "ledger",
4195
+ database: "events",
4196
+ writeTrigger: "one row per (rule, dedupRef, target) enqueued for delivery",
4197
+ indexes: [
4198
+ {
4199
+ name: "created",
4200
+ fields: ["createdAt"]
4201
+ },
4202
+ {
4203
+ name: "rule_created",
4204
+ fields: ["ruleId", "createdAt"]
4205
+ },
4206
+ {
4207
+ name: "status_created",
4208
+ fields: ["status", "createdAt"]
4209
+ },
4210
+ {
4211
+ name: "device_created",
4212
+ fields: ["deviceId", "createdAt"]
4213
+ },
4214
+ {
4215
+ name: "rule_status_created",
4216
+ fields: [
4217
+ "ruleId",
4218
+ "status",
4219
+ "createdAt"
4220
+ ]
4221
+ },
4222
+ {
4223
+ name: "rule_device_created",
4224
+ fields: [
4225
+ "ruleId",
4226
+ "deviceId",
4227
+ "createdAt"
4228
+ ]
4229
+ },
4230
+ {
4231
+ name: "status_device_created",
4232
+ fields: [
4233
+ "status",
4234
+ "deviceId",
4235
+ "createdAt"
4236
+ ]
4237
+ },
4238
+ {
4239
+ name: "rule_status_device_created",
4240
+ fields: [
4241
+ "ruleId",
4242
+ "status",
4243
+ "deviceId",
4244
+ "createdAt"
4245
+ ]
4246
+ }
4247
+ ],
4248
+ retention: {
4249
+ owner: "notification-center",
4250
+ reason: "terminal (sent/dead) rows older than 7 days pruned at boot; a pending row retries to dead first"
4251
+ },
4252
+ maxDataBytes: require_clip_model_registry.RECORD_MAX_DATA_BYTES
4253
+ },
4254
+ artifacts: {
4255
+ ...QUERIED,
4256
+ class: "ledger",
4257
+ database: "events",
4258
+ writeTrigger: "retained notification artefact metadata indexed for lookup and expiry",
4259
+ indexes: [{
4260
+ name: "captured",
4261
+ fields: ["capturedAt"]
4262
+ }, {
4263
+ name: "expires",
4264
+ fields: ["expiresAt"]
4265
+ }],
4266
+ retention: {
4267
+ owner: "notification-center",
4268
+ reason: "falls with its bytes: expired rows on every node, orphans against the shelf on the producer node"
4269
+ }
4270
+ }
4271
+ });
4272
+ /**
4273
+ * The settings-store table each kind stands in for when a centre is built
4274
+ * WITHOUT `ctx.records` - the specs' fake store (`legacyCollectionKind`,
4275
+ * `durableLegacyKind`). Production never reads it: every node has
4276
+ * `ctx.records`, and the operator dropped these tables offline (D900).
4277
+ */
4278
+ var NC_DURABLE_LEGACY_TABLES = {
4279
+ liveness: NC_LIVENESS_LEGACY,
4280
+ "device-alerts": NC_DEVICE_ALERTS_LEGACY,
4281
+ "system-state": NC_SYSTEM_STATE_LEGACY,
4282
+ "alert-episodes": NC_ALERT_EPISODES_LEGACY,
4283
+ occupancy: NC_OCCUPANCY_LEGACY,
4284
+ "device-prunes": NC_DEVICE_PRUNES_LEGACY,
4285
+ "state-summary-stamps": NC_STATE_SUMMARY_STAMPS_LEGACY,
4286
+ meta: NC_META_LEGACY,
4287
+ snoozes: NC_SNOOZES_LEGACY,
4288
+ "snooze-suppressed": NC_SNOOZE_SUPPRESSED_LEGACY,
4289
+ "track-groups": NC_TRACK_GROUPS_LEGACY,
4290
+ outbox: NC_OUTBOX_LEGACY,
4291
+ artifacts: NC_ARTIFACTS_LEGACY
4292
+ };
4293
+ /** The legacy table of an NC durable kind by name, or `undefined` for any other kind. */
4294
+ function ncDurableLegacyTableOf(kind) {
4295
+ for (const [name, table] of Object.entries(NC_DURABLE_LEGACY_TABLES)) if (name === kind) return table;
4296
+ }
4297
+ Object.values(NC_DURABLE_LEGACY_TABLES);
4298
+ //#endregion
4081
4299
  //#region src/durable/legacy-collection-kind.ts
4082
4300
  /** Bounds of a half-open range on the legacy filter (the store has no `>=`). */
4083
4301
  var RANGE_MIN = -864e13;
@@ -4223,8 +4441,8 @@ var LegacyCollectionKind = class {
4223
4441
  /** The handle an NC owner reads and writes through: records when present, else the legacy table. */
4224
4442
  function queriedKind(definition, deps) {
4225
4443
  if (deps.records !== void 0) return deps.records.kind(definition);
4226
- const collection = definition.declaration.adoptsFrom;
4227
- if (collection === void 0) throw new Error(`kind "${definition.name}" names no legacy table (adoptsFrom)`);
4444
+ const collection = ncDurableLegacyTableOf(definition.name);
4445
+ if (collection === void 0) throw new Error(`kind "${definition.name}" has no legacy table to stand in for it`);
4228
4446
  return new LegacyCollectionKind({
4229
4447
  definition,
4230
4448
  collection,
@@ -4269,203 +4487,6 @@ async function collectRecordPages(kind, q, max) {
4269
4487
  }
4270
4488
  }
4271
4489
  //#endregion
4272
- //#region src/durable/durable-record-body.ts
4273
- /**
4274
- * Zod body for phase-3 durable ledger record kinds. The engine validates on
4275
- * write; each owner's `fromRecord` / `toValue` remain authoritative on read.
4276
- */
4277
- var DurableLedgerBodySchema = require_clip_model_registry.record(require_clip_model_registry.string(), require_clip_model_registry.unknown());
4278
- //#endregion
4279
- //#region src/notification-center/nc-durable-record-kinds.ts
4280
- /**
4281
- * Record kinds for NC live-state ledgers (records plan phase 3, steps 25–36).
4282
- *
4283
- * Hosted in the pipeline-analytics addon (`pipeline-analytics` owner stamp).
4284
- * Declared by the hub; every node reads and writes them through `ctx.records`.
4285
- * The legacy settings-store handles (`durableLegacyKind`, `legacyCollectionKind`)
4286
- * serve only a centre built WITHOUT `records` — the specs.
4287
- */
4288
- /** Legacy collection names — keep in sync with owner constants. */
4289
- var NC_LIVENESS_LEGACY = "notification-center:liveness";
4290
- var NC_DEVICE_ALERTS_LEGACY = "notification-center:device-alerts";
4291
- var NC_SYSTEM_STATE_LEGACY = "notification-center:system-state";
4292
- var NC_OCCUPANCY_LEGACY = "notification-center:occupancy";
4293
- var NC_DEVICE_PRUNES_LEGACY = "notification-center:device-prunes";
4294
- var NC_STATE_SUMMARY_STAMPS_LEGACY = "notification-center:state-summary-stamps";
4295
- var NC_ALERT_EPISODES_LEGACY = "notification-center:alert-episodes";
4296
- var NC_META_LEGACY = "notification-center:meta";
4297
- var NC_SNOOZES_LEGACY = "notification-center:snoozes";
4298
- var NC_SNOOZE_SUPPRESSED_LEGACY = "notification-center:snooze-suppressed";
4299
- var NC_TRACK_GROUPS_LEGACY = "notification-center:track-groups";
4300
- var NC_OUTBOX_LEGACY = "notification-center:outbox";
4301
- var NC_ARTIFACTS_LEGACY = "notification-center:artifacts";
4302
- var ledger = (adoptsFrom, writeTrigger, database = "settings", retention = { none: "mirror load-all at boot; rows drop only via owner prune or device-removal hook" }) => ({
4303
- schema: DurableLedgerBodySchema,
4304
- class: "ledger",
4305
- database,
4306
- writeTrigger,
4307
- device: "optional",
4308
- at: "none",
4309
- retention,
4310
- adoptsFrom
4311
- });
4312
- /**
4313
- * The shape the four QUERIED kinds share with the mirrors. Each spells its own
4314
- * file, trigger, indexes and retention as literals (the records guards read them).
4315
- * `device` and `at` stay what the first (empty) declaration said — the engine
4316
- * refuses to change either — so every read is served by a DATA-field index, and
4317
- * the camera rides the record envelope (`deviceId`) for the D865 removal.
4318
- */
4319
- var QUERIED = {
4320
- schema: DurableLedgerBodySchema,
4321
- device: "optional",
4322
- at: "none"
4323
- };
4324
- var ncDurableRecordKinds = require_clip_model_registry.defineRecordKinds({
4325
- liveness: ledger(NC_LIVENESS_LEGACY, "a liveness state TRANSITION the centre accepted (seed or flip); a no-flip writes nothing"),
4326
- "device-alerts": ledger(NC_DEVICE_ALERTS_LEGACY, "a sustained device alert episode the centre confirmed or cleared"),
4327
- "system-state": ledger(NC_SYSTEM_STATE_LEGACY, "a system-state subject flip the state summary accepted"),
4328
- "alert-episodes": ledger(NC_ALERT_EPISODES_LEGACY, "an alert episode the centre notified (critical or error); its resolution deletes the row"),
4329
- occupancy: ledger(NC_OCCUPANCY_LEGACY, "a confirmed occupancy level write-through after the watcher decided an edge"),
4330
- "device-prunes": ledger(NC_DEVICE_PRUNES_LEGACY, "one row recording what a deleted-device prune removed"),
4331
- "state-summary-stamps": ledger(NC_STATE_SUMMARY_STAMPS_LEGACY, "digest delivery stamps per rule kind"),
4332
- meta: ledger(NC_META_LEGACY, "outbox boot-reconcile watermark and other single-key meta rows", "settings", { none: "one fixed key (watermark), overwritten in place, never deleted" }),
4333
- snoozes: ledger(NC_SNOOZES_LEGACY, "operator opens or closes a snooze window (write-through)"),
4334
- "snooze-suppressed": {
4335
- ...QUERIED,
4336
- class: "ledger",
4337
- database: "events",
4338
- writeTrigger: "aggregate count per (window, target, rule, camera) for suppressed notifications",
4339
- indexes: [{
4340
- name: "snooze",
4341
- fields: ["snoozeId"]
4342
- }],
4343
- retention: {
4344
- owner: "notification-center",
4345
- reason: "deleted with its snooze window, 6 h after that window closes"
4346
- },
4347
- adoptsFrom: NC_SNOOZE_SUPPRESSED_LEGACY
4348
- },
4349
- "track-groups": {
4350
- ...QUERIED,
4351
- class: "ledger",
4352
- database: "events",
4353
- writeTrigger: "one row per grouped delivery window opened at admission time",
4354
- indexes: [
4355
- {
4356
- name: "open",
4357
- fields: ["sealed"]
4358
- },
4359
- {
4360
- name: "opened",
4361
- fields: ["openedAt"]
4362
- },
4363
- {
4364
- name: "device_opened",
4365
- fields: ["deviceId", "openedAt"]
4366
- },
4367
- {
4368
- name: "rule_opened",
4369
- fields: ["ruleId", "openedAt"]
4370
- },
4371
- {
4372
- name: "rule_device_opened",
4373
- fields: [
4374
- "ruleId",
4375
- "deviceId",
4376
- "openedAt"
4377
- ]
4378
- }
4379
- ],
4380
- retention: {
4381
- owner: "notification-center",
4382
- reason: "ring: the newest NC_GROUP_MAX_ROWS_PER_DEVICE rows per camera, trimmed on write"
4383
- },
4384
- adoptsFrom: NC_TRACK_GROUPS_LEGACY
4385
- },
4386
- outbox: {
4387
- ...QUERIED,
4388
- class: "ledger",
4389
- database: "events",
4390
- writeTrigger: "one row per (rule, dedupRef, target) enqueued for delivery",
4391
- indexes: [
4392
- {
4393
- name: "created",
4394
- fields: ["createdAt"]
4395
- },
4396
- {
4397
- name: "rule_created",
4398
- fields: ["ruleId", "createdAt"]
4399
- },
4400
- {
4401
- name: "status_created",
4402
- fields: ["status", "createdAt"]
4403
- },
4404
- {
4405
- name: "device_created",
4406
- fields: ["deviceId", "createdAt"]
4407
- },
4408
- {
4409
- name: "rule_status_created",
4410
- fields: [
4411
- "ruleId",
4412
- "status",
4413
- "createdAt"
4414
- ]
4415
- },
4416
- {
4417
- name: "rule_device_created",
4418
- fields: [
4419
- "ruleId",
4420
- "deviceId",
4421
- "createdAt"
4422
- ]
4423
- },
4424
- {
4425
- name: "status_device_created",
4426
- fields: [
4427
- "status",
4428
- "deviceId",
4429
- "createdAt"
4430
- ]
4431
- },
4432
- {
4433
- name: "rule_status_device_created",
4434
- fields: [
4435
- "ruleId",
4436
- "status",
4437
- "deviceId",
4438
- "createdAt"
4439
- ]
4440
- }
4441
- ],
4442
- retention: {
4443
- owner: "notification-center",
4444
- reason: "terminal (sent/dead) rows older than 7 days pruned at boot; a pending row retries to dead first"
4445
- },
4446
- maxDataBytes: require_clip_model_registry.RECORD_MAX_DATA_BYTES,
4447
- adoptsFrom: NC_OUTBOX_LEGACY
4448
- },
4449
- artifacts: {
4450
- ...QUERIED,
4451
- class: "ledger",
4452
- database: "events",
4453
- writeTrigger: "retained notification artefact metadata indexed for lookup and expiry",
4454
- indexes: [{
4455
- name: "captured",
4456
- fields: ["capturedAt"]
4457
- }, {
4458
- name: "expires",
4459
- fields: ["expiresAt"]
4460
- }],
4461
- retention: {
4462
- owner: "notification-center",
4463
- reason: "falls with its bytes: expired rows on every node, orphans against the shelf on the producer node"
4464
- },
4465
- adoptsFrom: NC_ARTIFACTS_LEGACY
4466
- }
4467
- });
4468
- //#endregion
4469
4490
  //#region src/notification-center/artifact-index.ts
4470
4491
  /**
4471
4492
  * @durable class=ledger owner=notification-center database=events
@@ -9441,38 +9462,12 @@ var FaceRescoreJobStatusSchema = require_clip_model_registry.object({
9441
9462
  * Record kinds owned by the pipeline-analytics addon (records plan phase 2,
9442
9463
  * steps 7-11).
9443
9464
  *
9444
- * Each kind adopts the legacy `pipeline-analytics:*` collection of the same
9445
- * name: the boot guard keeps the addon down until `scripts/hub/records-adopt.ts`
9446
- * has copied it. Declared only on the hub (agents have no `ctx.records`). The
9447
- * addon declares no `execution.group`, so the hub owner stamp is the addon id
9465
+ * Each kind replaced the legacy `pipeline-analytics:*` collection of the same
9466
+ * name; the records migration that copied them is closed (D900) and the tables
9467
+ * are gone (`retired-legacy-tables.ts`). The addon declares no
9468
+ * `execution.group`, so the hub owner stamp is the addon id
9448
9469
  * (`pipeline-analytics`).
9449
9470
  */
9450
- /** Legacy names for phase-3 analytics ledgers (keep in sync with owner constants). */
9451
- var PA_PHANTOM_CELLS = "pipeline-analytics:phantom-cells";
9452
- var PA_PACKAGE_BACKGROUND = "pipeline-analytics:package-background";
9453
- var PA_STATIONARY_EVIDENCE = "pipeline-analytics:stationary-evidence";
9454
- var PA_STATIONARY_OBJECTS = "pipeline-analytics:stationary-objects";
9455
- var PA_SCENE_LATCH = "pipeline-analytics:scene-latch";
9456
- var PA_MOTION_EVENTS = "pipeline-analytics:motion-events";
9457
- var PA_AUDIO_EVENTS = "pipeline-analytics:audio-events";
9458
- var PA_SENSOR_EVENTS = "pipeline-analytics:sensor-events";
9459
- var PA_FACES = "pipeline-analytics:faces";
9460
- var PA_PLATES = "pipeline-analytics:plates";
9461
- var PA_TRACK_ALIASES = "pipeline-analytics:track-aliases";
9462
- var PA_TRACK_PURITY = "pipeline-analytics:track-purity";
9463
- var PA_TRACK_RELATIONS = "pipeline-analytics:track-relations";
9464
- var PA_TRACKING_TAPES = "pipeline-analytics:tracking-tapes";
9465
- var PA_BIRTH_DECISION_LEDGER = "pipeline-analytics:birth-decision-ledger";
9466
- var PA_DEBUG_NOTE_ARCHIVE = "pipeline-analytics:debug-note-archive";
9467
- var PA_OPS_LOG = "pipeline-analytics:ops-log";
9468
- var PA_RETRAIN_FRAMES = "pipeline-analytics:retrain-frames";
9469
- var PA_RETRAIN_ANNOTATIONS = "pipeline-analytics:retrain-annotations";
9470
- var PA_RETRAIN_COLLECTIONS = "pipeline-analytics:retrain-collections";
9471
- var PA_RETRAIN_COLLECTION_FRAMES = "pipeline-analytics:retrain-collection-frames";
9472
- var PA_IDENTITIES = "pipeline-analytics:identities";
9473
- var PA_IDENTITY_SAMPLES = "pipeline-analytics:identity-samples";
9474
- var PA_VEHICLES = "pipeline-analytics:vehicles";
9475
- var PA_VEHICLE_SAMPLES = "pipeline-analytics:vehicle-samples";
9476
9471
  /**
9477
9472
  * Kinds that must agree through ONE `transact` sit in one file under one family
9478
9473
  * name, and the engine refuses a family split across files (records plan risk 8).
@@ -9526,8 +9521,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9526
9521
  fields: ["deviceId"]
9527
9522
  }],
9528
9523
  retention: { none: "operator intent: a scene goes only through deleteScene, never by age" },
9529
- maxDataBytes: require_clip_model_registry.RECORD_MAX_DATA_BYTES,
9530
- adoptsFrom: "pipeline-analytics:scenes"
9524
+ maxDataBytes: require_clip_model_registry.RECORD_MAX_DATA_BYTES
9531
9525
  },
9532
9526
  migrations: {
9533
9527
  schema: MigrationMarkerBodySchema,
@@ -9536,8 +9530,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9536
9530
  writeTrigger: "one marker row when a boot migration (label-tier-4g, audio-track-class-d189) completes without truncating",
9537
9531
  device: "none",
9538
9532
  at: "none",
9539
- retention: { none: "its PRESENCE stops the migration re-scanning every track, face and event row on the next boot; bounded by the number of migrations ever written (two today)" },
9540
- adoptsFrom: "pipeline-analytics:migrations"
9533
+ retention: { none: "its PRESENCE stops the migration re-scanning every track, face and event row on the next boot; bounded by the number of migrations ever written (two today)" }
9541
9534
  },
9542
9535
  "sweep-cursors": {
9543
9536
  schema: SweepCursorBodySchema,
@@ -9546,8 +9539,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9546
9539
  writeTrigger: "the end of every orphan-audit pass rewrites the one row holding every scope cursor",
9547
9540
  device: "none",
9548
9541
  at: "none",
9549
- retention: { none: "one row (id orphan-audit); losing it costs a re-walk from offset 0, never a wrong delete" },
9550
- adoptsFrom: "pipeline-analytics:sweep-cursors"
9542
+ retention: { none: "one row (id orphan-audit); losing it costs a re-walk from offset 0, never a wrong delete" }
9551
9543
  },
9552
9544
  "face-rescore-state": {
9553
9545
  schema: FaceRescoreStateBodySchema,
@@ -9555,8 +9547,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9555
9547
  writeTrigger: "a whole-archive face rescore (manual or scheduled) completes",
9556
9548
  device: "none",
9557
9549
  at: "none",
9558
- retention: { none: "one row (id last-run); losing it costs one idempotent rescore on the next scheduler tick" },
9559
- adoptsFrom: "pipeline-analytics:face-rescore-state"
9550
+ retention: { none: "one row (id last-run); losing it costs one idempotent rescore on the next scheduler tick" }
9560
9551
  },
9561
9552
  "phantom-cells": {
9562
9553
  schema: DurableLedgerBodySchema,
@@ -9564,8 +9555,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9564
9555
  writeTrigger: "a phantom cell closes and the short-motionless bar records it",
9565
9556
  device: "required",
9566
9557
  at: "none",
9567
- retention: { none: "bounded by per-device cap in application code" },
9568
- adoptsFrom: PA_PHANTOM_CELLS
9558
+ retention: { none: "bounded by per-device cap in application code" }
9569
9559
  },
9570
9560
  "package-background": {
9571
9561
  schema: DurableLedgerBodySchema,
@@ -9573,8 +9563,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9573
9563
  writeTrigger: "package background state accepted for a device",
9574
9564
  device: "required",
9575
9565
  at: "none",
9576
- retention: { none: "one row per device key the owner tracks" },
9577
- adoptsFrom: PA_PACKAGE_BACKGROUND
9566
+ retention: { none: "one row per device key the owner tracks" }
9578
9567
  },
9579
9568
  "stationary-evidence": {
9580
9569
  schema: DurableLedgerBodySchema,
@@ -9582,8 +9571,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9582
9571
  writeTrigger: "stationary evidence row written on the registry sweep",
9583
9572
  device: "required",
9584
9573
  at: "none",
9585
- retention: { none: "owner sweep drops idle evidence; maxRowsPerDevice in kind metadata" },
9586
- adoptsFrom: PA_STATIONARY_EVIDENCE
9574
+ retention: { none: "owner sweep drops idle evidence; maxRowsPerDevice in kind metadata" }
9587
9575
  },
9588
9576
  "stationary-objects": {
9589
9577
  schema: DurableLedgerBodySchema,
@@ -9591,8 +9579,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9591
9579
  writeTrigger: "parked object registry upsert or flush on the sweep interval",
9592
9580
  device: "required",
9593
9581
  at: "none",
9594
- retention: { none: "rows drop when the object moves or TTL expires" },
9595
- adoptsFrom: PA_STATIONARY_OBJECTS
9582
+ retention: { none: "rows drop when the object moves or TTL expires" }
9596
9583
  },
9597
9584
  "scene-latch": {
9598
9585
  schema: DurableLedgerBodySchema,
@@ -9600,8 +9587,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9600
9587
  writeTrigger: "scene monitor latch state write-through after a verdict",
9601
9588
  device: "required",
9602
9589
  at: "none",
9603
- retention: { none: "one row per (deviceId, monitorId) scene latch" },
9604
- adoptsFrom: PA_SCENE_LATCH
9590
+ retention: { none: "one row per (deviceId, monitorId) scene latch" }
9605
9591
  },
9606
9592
  "motion-events": {
9607
9593
  schema: MotionEventBodySchema,
@@ -9618,8 +9604,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9618
9604
  retention: {
9619
9605
  owner: "device-window",
9620
9606
  reason: "terminal age-keyed root swept with the device retention window (D61/D62)"
9621
- },
9622
- adoptsFrom: PA_MOTION_EVENTS
9607
+ }
9623
9608
  },
9624
9609
  "audio-events": {
9625
9610
  schema: AudioEventBodySchema,
@@ -9636,8 +9621,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9636
9621
  retention: {
9637
9622
  owner: "device-window",
9638
9623
  reason: "terminal age-keyed root on the device window, same as motion-events"
9639
- },
9640
- adoptsFrom: PA_AUDIO_EVENTS
9624
+ }
9641
9625
  },
9642
9626
  "sensor-events": {
9643
9627
  schema: SensorEventBodySchema,
@@ -9657,8 +9641,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9657
9641
  retention: {
9658
9642
  owner: "device-window",
9659
9643
  reason: "terminal age-keyed root on the camera retention window (D61)"
9660
- },
9661
- adoptsFrom: PA_SENSOR_EVENTS
9644
+ }
9662
9645
  },
9663
9646
  faces: {
9664
9647
  schema: FaceLedgerBodySchema,
@@ -9685,8 +9668,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9685
9668
  fields: ["trackId"]
9686
9669
  }
9687
9670
  ],
9688
- retention: { none: "track-owned (D61): rows leave with their track; enrolled faces exempt from capacity sweeps" },
9689
- adoptsFrom: PA_FACES
9671
+ retention: { none: "track-owned (D61): rows leave with their track; enrolled faces exempt from capacity sweeps" }
9690
9672
  },
9691
9673
  identities: {
9692
9674
  schema: IdentityConfigBodySchema,
@@ -9700,8 +9682,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9700
9682
  name: "name",
9701
9683
  fields: ["name"]
9702
9684
  }],
9703
- retention: { none: "operator delete only — losing the gallery un-enrols every person" },
9704
- adoptsFrom: PA_IDENTITIES
9685
+ retention: { none: "operator delete only — losing the gallery un-enrols every person" }
9705
9686
  },
9706
9687
  "identity-samples": {
9707
9688
  schema: IdentitySampleLedgerBodySchema,
@@ -9715,7 +9696,6 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9715
9696
  fields: ["identityId", "addedAt"]
9716
9697
  }],
9717
9698
  retention: { none: "enrollment exempt — rows leave only on removeSample or deleteIdentity" },
9718
- adoptsFrom: PA_IDENTITY_SAMPLES,
9719
9699
  transactFamily: IDENTITY_GALLERY
9720
9700
  },
9721
9701
  vehicles: {
@@ -9730,8 +9710,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9730
9710
  name: "name",
9731
9711
  fields: ["name"]
9732
9712
  }],
9733
- retention: { none: "operator delete only — losing the gallery un-enrols every vehicle" },
9734
- adoptsFrom: PA_VEHICLES
9713
+ retention: { none: "operator delete only — losing the gallery un-enrols every vehicle" }
9735
9714
  },
9736
9715
  "vehicle-samples": {
9737
9716
  schema: VehicleSampleLedgerBodySchema,
@@ -9745,7 +9724,6 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9745
9724
  fields: ["vehicleId", "addedAt"]
9746
9725
  }],
9747
9726
  retention: { none: "enrollment exempt — rows leave only on removeSample or deleteVehicle" },
9748
- adoptsFrom: PA_VEHICLE_SAMPLES,
9749
9727
  transactFamily: VEHICLE_GALLERY
9750
9728
  },
9751
9729
  plates: {
@@ -9769,8 +9747,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9769
9747
  fields: ["recognizedVehicleId", "timestamp"]
9770
9748
  }
9771
9749
  ],
9772
- retention: { none: "track-owned (D61): rows leave with their track; corrected and enrolled reads exempt" },
9773
- adoptsFrom: PA_PLATES
9750
+ retention: { none: "track-owned (D61): rows leave with their track; corrected and enrolled reads exempt" }
9774
9751
  },
9775
9752
  "track-aliases": {
9776
9753
  schema: PaEventsLedgerBodySchema,
@@ -9786,8 +9763,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9786
9763
  name: "device",
9787
9764
  fields: ["deviceId"]
9788
9765
  }],
9789
- retention: { none: "track-owned via survivor `trackId`; widens retention cascade (D683)" },
9790
- adoptsFrom: PA_TRACK_ALIASES
9766
+ retention: { none: "track-owned via survivor `trackId`; widens retention cascade (D683)" }
9791
9767
  },
9792
9768
  "track-purity": {
9793
9769
  schema: PaEventsLedgerBodySchema,
@@ -9803,8 +9779,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9803
9779
  name: "updated",
9804
9780
  fields: ["updatedAt"]
9805
9781
  }],
9806
- retention: { none: "row-count ceiling MAX_TRACK_PURITIES in application code (D681)" },
9807
- adoptsFrom: PA_TRACK_PURITY
9782
+ retention: { none: "row-count ceiling MAX_TRACK_PURITIES in application code (D681)" }
9808
9783
  },
9809
9784
  "track-relations": {
9810
9785
  schema: PaEventsLedgerBodySchema,
@@ -9820,8 +9795,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9820
9795
  name: "updated",
9821
9796
  fields: ["updatedAt"]
9822
9797
  }],
9823
- retention: { none: "row-count ceiling MAX_TRACK_RELATIONS in application code (D681)" },
9824
- adoptsFrom: PA_TRACK_RELATIONS
9798
+ retention: { none: "row-count ceiling MAX_TRACK_RELATIONS in application code (D681)" }
9825
9799
  },
9826
9800
  "tracking-tapes": {
9827
9801
  schema: PaEventsLedgerBodySchema,
@@ -9834,8 +9808,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9834
9808
  name: "device_created",
9835
9809
  fields: ["deviceId", "createdAt"]
9836
9810
  }],
9837
- retention: { none: "promotion budget MAX_PROMOTED_TAPES — refused, never evicted by age" },
9838
- adoptsFrom: PA_TRACKING_TAPES
9811
+ retention: { none: "promotion budget MAX_PROMOTED_TAPES — refused, never evicted by age" }
9839
9812
  },
9840
9813
  "birth-decision-ledger": {
9841
9814
  schema: PaEventsLedgerBodySchema,
@@ -9851,8 +9824,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9851
9824
  name: "device_at",
9852
9825
  fields: ["deviceId", "at"]
9853
9826
  }],
9854
- retention: { none: "row-count ceiling MAX_BIRTH_DECISION_RECORDS in application code" },
9855
- adoptsFrom: PA_BIRTH_DECISION_LEDGER
9827
+ retention: { none: "row-count ceiling MAX_BIRTH_DECISION_RECORDS in application code" }
9856
9828
  },
9857
9829
  "debug-note-archive": {
9858
9830
  schema: PaEventsLedgerBodySchema,
@@ -9868,8 +9840,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9868
9840
  name: "device_archived",
9869
9841
  fields: ["deviceId", "archivedAt"]
9870
9842
  }],
9871
- retention: { none: "row-count ceiling MAX_ARCHIVED_DEBUG_NOTES in application code" },
9872
- adoptsFrom: PA_DEBUG_NOTE_ARCHIVE
9843
+ retention: { none: "row-count ceiling MAX_ARCHIVED_DEBUG_NOTES in application code" }
9873
9844
  },
9874
9845
  "ops-log": {
9875
9846
  schema: PaEventsLedgerBodySchema,
@@ -9888,8 +9859,7 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9888
9859
  retention: {
9889
9860
  ttlMs: 720 * 60 * 60 * 1e3,
9890
9861
  from: "at"
9891
- },
9892
- adoptsFrom: PA_OPS_LOG
9862
+ }
9893
9863
  },
9894
9864
  "retrain-frames": {
9895
9865
  schema: PaEventsLedgerBodySchema,
@@ -9906,7 +9876,6 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9906
9876
  fields: ["deviceId", "complete"]
9907
9877
  }],
9908
9878
  retention: { none: "operator curation only; blobs on artifacts tenant (D781)" },
9909
- adoptsFrom: PA_RETRAIN_FRAMES,
9910
9879
  transactFamily: RETRAIN
9911
9880
  },
9912
9881
  "retrain-annotations": {
@@ -9931,7 +9900,6 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9931
9900
  }
9932
9901
  ],
9933
9902
  retention: { none: "leaves with frame deselect / operator delete" },
9934
- adoptsFrom: PA_RETRAIN_ANNOTATIONS,
9935
9903
  transactFamily: RETRAIN
9936
9904
  },
9937
9905
  "retrain-collections": {
@@ -9950,7 +9918,6 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9950
9918
  fields: ["createdAt"]
9951
9919
  }],
9952
9920
  retention: { none: "deleted with operator deleteCollection" },
9953
- adoptsFrom: PA_RETRAIN_COLLECTIONS,
9954
9921
  transactFamily: RETRAIN
9955
9922
  },
9956
9923
  "retrain-collection-frames": {
@@ -9968,7 +9935,6 @@ var pipelineAnalyticsRecordKinds = require_clip_model_registry.defineRecordKinds
9968
9935
  fields: ["frameId"]
9969
9936
  }],
9970
9937
  retention: { none: "membership only; frame pixels live in retrain-frames" },
9971
- adoptsFrom: PA_RETRAIN_COLLECTION_FRAMES,
9972
9938
  transactFamily: RETRAIN
9973
9939
  }
9974
9940
  });
@@ -38485,22 +38451,8 @@ async function migrateLegacyRuleActions(actions, createSequence) {
38485
38451
  * The notification-center module is hosted inside the pipeline-analytics addon.
38486
38452
  * That addon declares no `execution.group`, so the UDS owner stamp is the addon
38487
38453
  * id: `pipeline-analytics`. Declared hub-only (agents have no `ctx.records`).
38488
- * One deploy covers all 7 kinds; adoption is kind-by-kind.
38489
- */
38490
- /** Legacy collection for the text-catalog document. */
38491
- var NC_TEXTS_COLLECTION$1 = "notification-center:texts";
38492
- /** Legacy collection for shared action sequences. */
38493
- var NC_SEQUENCES_COLLECTION$1 = "notification-center:sequences";
38494
- /** Legacy collection for per-rule AI sections. */
38495
- var NC_RULE_AI_COLLECTION$1 = "notification-center:rule-ai";
38496
- /** Legacy collection for calendar-events rules. */
38497
- var NC_CALENDAR_EVENTS_RULES_COLLECTION$1 = "notification-center:calendar-events-rules";
38498
- /** Legacy collection for multi-camera digest rules. */
38499
- var NC_SUMMARY_RULES_COLLECTION$1 = "notification-center:summary-rules";
38500
- /** Legacy collection for timelapse rules. */
38501
- var NC_TIMELAPSE_RULES_COLLECTION$1 = "notification-center:timelapse-rules";
38502
- /** Legacy collection for notification rules. */
38503
- var NC_RULES_COLLECTION$1 = "notification-center:rules";
38454
+ * One deploy covers all 7 kinds.
38455
+ */
38504
38456
  /**
38505
38457
  * The hub language and operator-authored per-key overrides.
38506
38458
  * One row, id `texts`. Losing it degrades to the shipped English catalog.
@@ -38542,8 +38494,7 @@ var ncRecordKinds = require_clip_model_registry.defineRecordKinds({
38542
38494
  writeTrigger: "an operator changes the hub language (setLanguage) or replaces the per-key override set (setOverrides)",
38543
38495
  device: "none",
38544
38496
  at: "none",
38545
- retention: { none: "one row (id `texts`); losing it costs the chosen language and household wording, never a notification — every read degrades to the shipped English catalog" },
38546
- adoptsFrom: NC_TEXTS_COLLECTION$1
38497
+ retention: { none: "one row (id `texts`); losing it costs the chosen language and household wording, never a notification — every read degrades to the shipped English catalog" }
38547
38498
  },
38548
38499
  /**
38549
38500
  * Shared action sequences — named, ordered runs of steps with their own throttle.
@@ -38555,8 +38506,7 @@ var ncRecordKinds = require_clip_model_registry.defineRecordKinds({
38555
38506
  writeTrigger: "an admin creates/edits/deletes a shared sequence via notificationRules.createSequence / updateSequence / deleteSequence, or the one-shot boot migration that materialises legacy inline sequences",
38556
38507
  device: "none",
38557
38508
  at: "none",
38558
- retention: { none: "a row goes only when an admin deletes it; bounded by the sequence set a human is willing to author" },
38559
- adoptsFrom: NC_SEQUENCES_COLLECTION$1
38509
+ retention: { none: "a row goes only when an admin deletes it; bounded by the sequence set a human is willing to author" }
38560
38510
  },
38561
38511
  /**
38562
38512
  * Per-rule AI section: whether and how a rule narrates itself.
@@ -38568,8 +38518,7 @@ var ncRecordKinds = require_clip_model_registry.defineRecordKinds({
38568
38518
  writeTrigger: "an operator switches the AI section of a notification rule on or off, or edits its prompt / word cap / language",
38569
38519
  device: "none",
38570
38520
  at: "none",
38571
- retention: { none: "a row goes when the operator clears the section or deletes the rule; bounded by the rule set a human is willing to author" },
38572
- adoptsFrom: NC_RULE_AI_COLLECTION$1
38521
+ retention: { none: "a row goes when the operator clears the section or deletes the rule; bounded by the rule set a human is willing to author" }
38573
38522
  },
38574
38523
  /**
38575
38524
  * Calendar-events rules. One row per rule, id = rule UUID.
@@ -38584,8 +38533,7 @@ var ncRecordKinds = require_clip_model_registry.defineRecordKinds({
38584
38533
  name: "enabled",
38585
38534
  fields: ["enabled"]
38586
38535
  }],
38587
- retention: { none: "a row goes only when the operator deletes the rule; bounded by the rule set a human is willing to author" },
38588
- adoptsFrom: NC_CALENDAR_EVENTS_RULES_COLLECTION$1
38536
+ retention: { none: "a row goes only when the operator deletes the rule; bounded by the rule set a human is willing to author" }
38589
38537
  },
38590
38538
  /**
38591
38539
  * Multi-camera digest rules. One row per rule, id = rule UUID.
@@ -38600,8 +38548,7 @@ var ncRecordKinds = require_clip_model_registry.defineRecordKinds({
38600
38548
  name: "enabled",
38601
38549
  fields: ["enabled"]
38602
38550
  }],
38603
- retention: { none: "a row goes only when the operator deletes the rule; bounded by the rule set a human is willing to author" },
38604
- adoptsFrom: NC_SUMMARY_RULES_COLLECTION$1
38551
+ retention: { none: "a row goes only when the operator deletes the rule; bounded by the rule set a human is willing to author" }
38605
38552
  },
38606
38553
  /**
38607
38554
  * Timelapse rules. One row per rule, id = rule UUID.
@@ -38617,8 +38564,7 @@ var ncRecordKinds = require_clip_model_registry.defineRecordKinds({
38617
38564
  name: "enabled",
38618
38565
  fields: ["enabled"]
38619
38566
  }],
38620
- retention: { none: "a row goes only when the operator deletes the rule; bounded by the rule set a human is willing to author" },
38621
- adoptsFrom: NC_TIMELAPSE_RULES_COLLECTION$1
38567
+ retention: { none: "a row goes only when the operator deletes the rule; bounded by the rule set a human is willing to author" }
38622
38568
  },
38623
38569
  /**
38624
38570
  * Notification rules — the main rule set. One row per rule, id = rule UUID.
@@ -38634,8 +38580,7 @@ var ncRecordKinds = require_clip_model_registry.defineRecordKinds({
38634
38580
  name: "delivery",
38635
38581
  fields: ["delivery"]
38636
38582
  }],
38637
- retention: { none: "a row goes only when the operator deletes the rule; bounded by the rule set a human is willing to author" },
38638
- adoptsFrom: NC_RULES_COLLECTION$1
38583
+ retention: { none: "a row goes only when the operator deletes the rule; bounded by the rule set a human is willing to author" }
38639
38584
  }
38640
38585
  });
38641
38586
  //#endregion