@camstack/addon-post-analysis 1.2.22 → 1.2.24

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.
@@ -7391,14 +7391,7 @@ var RecordingConfigSchema = object({
7391
7391
  * windows only — existing sheets are immutable, and each window's index
7392
7392
  * carries its own tile dims so mixed-preset history renders correctly.
7393
7393
  */
7394
- scrubThumbnails: ScrubThumbnailPresetSchema.optional(),
7395
- /**
7396
- * OPT-IN thumbnail-strip generation for this camera: every keyframe of the
7397
- * low recording saved as a JPEG (the fast-drag scrub depth), a derived
7398
- * cache that eviction reclaims with the footage. Absent/false = no strips
7399
- * are written and scrub reads exact keyframes at every velocity.
7400
- */
7401
- stripsEnabled: boolean().optional()
7394
+ scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7402
7395
  }).strict();
7403
7396
  /**
7404
7397
  * Ops-log — the durable, append-only operations audit shared by the
@@ -7460,7 +7453,7 @@ var OpsLogQueryInputSchema = object({
7460
7453
  /**
7461
7454
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
7462
7455
  *
7463
- * One shape shared by the recorder's `relocateFootage` (segments + strips) and
7456
+ * One shape shared by the recorder's `relocateFootage` (segments) and
7464
7457
  * pipeline-analytics' `relocateMedia` (event media blobs) so the admin Data
7465
7458
  * page renders both movers with one component. Jobs are in-RAM (a restart
7466
7459
  * forgets them — re-running is safe by construction: copy-if-absent, delete
@@ -7482,7 +7475,7 @@ var RelocateJobSchema = object({
7482
7475
  toLocationId: string(),
7483
7476
  /** Scoped device, or null = every device. */
7484
7477
  deviceId: number().nullable(),
7485
- /** What the job moves (owner-addon specific: segments/strips or media). */
7478
+ /** What the job moves (owner-addon specific: segments or media). */
7486
7479
  entities: array(string()),
7487
7480
  filesMoved: number().int(),
7488
7481
  bytesMoved: number().int(),
@@ -7496,7 +7489,7 @@ var RelocateFootageInputSchema = object({
7496
7489
  deviceId: number().optional(),
7497
7490
  fromLocationId: string(),
7498
7491
  toLocationId: string(),
7499
- entities: array(_enum(["segments", "strips"])).optional(),
7492
+ entities: array(_enum(["segments"])).optional(),
7500
7493
  /** Copy throttle in MB/s (default 40) — the drain is a background chore,
7501
7494
  * never allowed to starve live writers. */
7502
7495
  throttleMbps: number().min(1).max(1e3).optional()
@@ -15589,6 +15582,210 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
15589
15582
  kind: "mutation",
15590
15583
  auth: "admin"
15591
15584
  });
15585
+ /**
15586
+ * Query filter for settings-store collections.
15587
+ */
15588
+ var QueryFilterSchema = object({
15589
+ where: record(string(), unknown()).optional(),
15590
+ whereIn: record(string(), array(unknown())).optional(),
15591
+ whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
15592
+ orderBy: object({
15593
+ field: string(),
15594
+ direction: _enum(["asc", "desc"])
15595
+ }).optional(),
15596
+ limit: number().optional(),
15597
+ offset: number().optional()
15598
+ });
15599
+ /**
15600
+ * The predicate half of a filter, for BULK MUTATIONS.
15601
+ *
15602
+ * Deliberately not `QueryFilterSchema`: `orderBy` / `limit` / `offset` have no
15603
+ * meaning for a statement that rewrites a set, and accepting them would invite
15604
+ * a caller to believe `limit` bounds the damage. Every field is optional here
15605
+ * only so the shape stays composable — the implementation REJECTS a filter
15606
+ * that compiles to no predicate, because that is the whole collection.
15607
+ */
15608
+ var MutationFilterSchema = object({
15609
+ where: record(string(), unknown()).optional(),
15610
+ whereIn: record(string(), array(unknown())).optional(),
15611
+ whereBetween: record(string(), tuple([unknown(), unknown()])).optional()
15612
+ });
15613
+ /** A single stored record: `{ id, data }`. */
15614
+ var SettingsRecordSchema = object({
15615
+ id: string(),
15616
+ data: record(string(), unknown())
15617
+ });
15618
+ /**
15619
+ * Column declaration for a structured (SQL-backed) collection.
15620
+ *
15621
+ * Logical types — the backend translates each to the matching SQLite
15622
+ * storage class and handles per-type marshaling:
15623
+ * - `TEXT` / `INTEGER` / `REAL` — native SQLite types, pass-through
15624
+ * - `JSON` — TEXT under the hood; serialised on write, parsed on read
15625
+ * - `BOOLEAN` — INTEGER 0/1 under the hood; coerced both directions
15626
+ */
15627
+ var CollectionColumnSchema = object({
15628
+ name: string(),
15629
+ type: _enum([
15630
+ "TEXT",
15631
+ "INTEGER",
15632
+ "REAL",
15633
+ "JSON",
15634
+ "BOOLEAN"
15635
+ ]),
15636
+ primaryKey: boolean().optional(),
15637
+ notNull: boolean().optional(),
15638
+ unique: boolean().optional(),
15639
+ /**
15640
+ * Column DEFAULT. Required for B2: the four `ensureTable` consumers declare
15641
+ * columns like `enabled INTEGER NOT NULL DEFAULT 1`, and without this the
15642
+ * collection surface simply cannot express their existing tables — which is
15643
+ * why they were still on the uncapped `table*` API.
15644
+ */
15645
+ defaultValue: union([
15646
+ string(),
15647
+ number(),
15648
+ boolean()
15649
+ ]).optional()
15650
+ });
15651
+ var CollectionIndexSchema = object({
15652
+ name: string(),
15653
+ columns: array(string()).readonly(),
15654
+ unique: boolean().optional()
15655
+ });
15656
+ method(object({
15657
+ namespace: string().optional(),
15658
+ collection: string(),
15659
+ key: string()
15660
+ }), unknown()), method(object({
15661
+ namespace: string().optional(),
15662
+ collection: string(),
15663
+ key: string(),
15664
+ value: unknown()
15665
+ }), _void(), { kind: "mutation" }), method(object({
15666
+ namespace: string().optional(),
15667
+ collection: string(),
15668
+ filter: QueryFilterSchema.optional()
15669
+ }), array(SettingsRecordSchema).readonly()), method(object({
15670
+ namespace: string().optional(),
15671
+ collection: string(),
15672
+ record: SettingsRecordSchema
15673
+ }), _void(), { kind: "mutation" }), method(object({
15674
+ namespace: string().optional(),
15675
+ collection: string(),
15676
+ id: string(),
15677
+ data: record(string(), unknown())
15678
+ }), _void(), { kind: "mutation" }), method(object({
15679
+ namespace: string().optional(),
15680
+ collection: string(),
15681
+ key: string()
15682
+ }), _void(), { kind: "mutation" }), method(object({
15683
+ namespace: string().optional(),
15684
+ collection: string(),
15685
+ filter: MutationFilterSchema
15686
+ }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
15687
+ namespace: string().optional(),
15688
+ collection: string(),
15689
+ filter: MutationFilterSchema,
15690
+ data: record(string(), unknown())
15691
+ }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
15692
+ namespace: string().optional(),
15693
+ collection: string(),
15694
+ filter: QueryFilterSchema.optional()
15695
+ }), number()), method(object({
15696
+ namespace: string().optional(),
15697
+ collection: string(),
15698
+ field: string(),
15699
+ bucketSize: number().int().positive(),
15700
+ origin: number().int(),
15701
+ filter: QueryFilterSchema.optional()
15702
+ }), array(object({
15703
+ bucket: number().int(),
15704
+ count: number().int()
15705
+ })).readonly()), method(object({
15706
+ namespace: string().optional(),
15707
+ collection: string()
15708
+ }), boolean()), method(object({
15709
+ namespace: string().optional(),
15710
+ collection: string(),
15711
+ columns: array(CollectionColumnSchema).readonly(),
15712
+ indexes: array(CollectionIndexSchema).readonly().optional()
15713
+ }), _void(), { kind: "mutation" });
15714
+ /**
15715
+ * What one engine says about itself. The orchestrator uses `kind` to pick
15716
+ * a registrant for a collection; `engineId` is what a log line names when
15717
+ * a call is routed or refused.
15718
+ */
15719
+ var EngineInfoSchema = object({
15720
+ engineId: string(),
15721
+ /**
15722
+ * `relational` — rows, columns, indexes, the surface `settings-store`
15723
+ * has always described. `vector` — an embedding store answering
15724
+ * similarity queries. A registrant declares exactly one; an engine that
15725
+ * does both registers twice, because "both" would make the routing
15726
+ * decision ambiguous at exactly the point it must not be.
15727
+ */
15728
+ kind: _enum(["relational", "vector"]),
15729
+ displayName: string()
15730
+ });
15731
+ method(_void(), EngineInfoSchema), method(object({
15732
+ namespace: string().optional(),
15733
+ collection: string(),
15734
+ key: string()
15735
+ }), unknown()), method(object({
15736
+ namespace: string().optional(),
15737
+ collection: string(),
15738
+ key: string(),
15739
+ value: unknown()
15740
+ }), _void(), { kind: "mutation" }), method(object({
15741
+ namespace: string().optional(),
15742
+ collection: string(),
15743
+ filter: QueryFilterSchema.optional()
15744
+ }), array(SettingsRecordSchema).readonly()), method(object({
15745
+ namespace: string().optional(),
15746
+ collection: string(),
15747
+ record: SettingsRecordSchema
15748
+ }), _void(), { kind: "mutation" }), method(object({
15749
+ namespace: string().optional(),
15750
+ collection: string(),
15751
+ id: string(),
15752
+ data: record(string(), unknown())
15753
+ }), _void(), { kind: "mutation" }), method(object({
15754
+ namespace: string().optional(),
15755
+ collection: string(),
15756
+ key: string()
15757
+ }), _void(), { kind: "mutation" }), method(object({
15758
+ namespace: string().optional(),
15759
+ collection: string(),
15760
+ filter: MutationFilterSchema
15761
+ }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
15762
+ namespace: string().optional(),
15763
+ collection: string(),
15764
+ filter: MutationFilterSchema,
15765
+ data: record(string(), unknown())
15766
+ }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
15767
+ namespace: string().optional(),
15768
+ collection: string(),
15769
+ filter: QueryFilterSchema.optional()
15770
+ }), number()), method(object({
15771
+ namespace: string().optional(),
15772
+ collection: string(),
15773
+ field: string(),
15774
+ bucketSize: number().int().positive(),
15775
+ origin: number().int(),
15776
+ filter: QueryFilterSchema.optional()
15777
+ }), array(object({
15778
+ bucket: number().int(),
15779
+ count: number().int()
15780
+ })).readonly()), method(object({
15781
+ namespace: string().optional(),
15782
+ collection: string()
15783
+ }), boolean()), method(object({
15784
+ namespace: string().optional(),
15785
+ collection: string(),
15786
+ columns: array(CollectionColumnSchema).readonly(),
15787
+ indexes: array(CollectionIndexSchema).readonly().optional()
15788
+ }), _void(), { kind: "mutation" });
15592
15789
  DeviceType.Camera;
15593
15790
  /**
15594
15791
  * `device-adoption` — generic discovery + adoption surface,
@@ -19024,6 +19221,28 @@ var ServerUpdateStateSchema = _enum([
19024
19221
  "pending-restart",
19025
19222
  "awaiting-confirmation"
19026
19223
  ]);
19224
+ var ImageContractSchema = object({
19225
+ state: _enum([
19226
+ "in-sync",
19227
+ "behind-patch",
19228
+ "behind-series",
19229
+ "ahead",
19230
+ "unknown"
19231
+ ]),
19232
+ /** The baked seed closure version — the image/app-bundle fingerprint. */
19233
+ seedVersion: string().nullable(),
19234
+ /** Best-known version the deployment contract delivers today. */
19235
+ contractVersion: string().nullable(),
19236
+ /**
19237
+ * Where `contractVersion` came from: a real registry check (`registry`), or
19238
+ * the node's own running version (`running` — a node can never run code
19239
+ * newer than the newest release, so `seed < running` proves image staleness
19240
+ * even before any registry check has run).
19241
+ */
19242
+ contractSource: _enum(["registry", "running"]).nullable(),
19243
+ /** One operator-grade sentence: this node runs image X; the contract says Y. */
19244
+ message: string()
19245
+ });
19027
19246
  var ServerRollbackInfoSchema = object({
19028
19247
  /** The version that failed (or was manually rolled back). */
19029
19248
  fromVersion: string(),
@@ -19060,7 +19279,12 @@ var ServerPackageStatusSchema = object({
19060
19279
  * versions are being IGNORED. Surfaced as a warning in the UI.
19061
19280
  */
19062
19281
  stateFileCorrupt: boolean(),
19063
- lastCheckedAtMs: number().nullable()
19282
+ lastCheckedAtMs: number().nullable(),
19283
+ /**
19284
+ * Seed-vs-contract verdict (see {@link ImageContractSchema}). Optional for
19285
+ * version skew: an older provider's payload simply omits it.
19286
+ */
19287
+ imageContract: ImageContractSchema.optional()
19064
19288
  });
19065
19289
  var ServerUpdateCheckResultSchema = object({
19066
19290
  packageName: string(),
@@ -19095,101 +19319,6 @@ version: string().optional() }), ServerUpdateActionResultSchema, {
19095
19319
  auth: "admin"
19096
19320
  });
19097
19321
  /**
19098
- * Query filter for settings-store collections.
19099
- */
19100
- var QueryFilterSchema = object({
19101
- where: record(string(), unknown()).optional(),
19102
- whereIn: record(string(), array(unknown())).optional(),
19103
- whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
19104
- orderBy: object({
19105
- field: string(),
19106
- direction: _enum(["asc", "desc"])
19107
- }).optional(),
19108
- limit: number().optional(),
19109
- offset: number().optional()
19110
- });
19111
- /** A single stored record: `{ id, data }`. */
19112
- var SettingsRecordSchema = object({
19113
- id: string(),
19114
- data: record(string(), unknown())
19115
- });
19116
- /**
19117
- * Column declaration for a structured (SQL-backed) collection.
19118
- *
19119
- * Logical types — the backend translates each to the matching SQLite
19120
- * storage class and handles per-type marshaling:
19121
- * - `TEXT` / `INTEGER` / `REAL` — native SQLite types, pass-through
19122
- * - `JSON` — TEXT under the hood; serialised on write, parsed on read
19123
- * - `BOOLEAN` — INTEGER 0/1 under the hood; coerced both directions
19124
- */
19125
- var CollectionColumnSchema = object({
19126
- name: string(),
19127
- type: _enum([
19128
- "TEXT",
19129
- "INTEGER",
19130
- "REAL",
19131
- "JSON",
19132
- "BOOLEAN"
19133
- ]),
19134
- primaryKey: boolean().optional(),
19135
- notNull: boolean().optional(),
19136
- unique: boolean().optional()
19137
- });
19138
- var CollectionIndexSchema = object({
19139
- name: string(),
19140
- columns: array(string()).readonly(),
19141
- unique: boolean().optional()
19142
- });
19143
- method(object({
19144
- namespace: string().optional(),
19145
- collection: string(),
19146
- key: string()
19147
- }), unknown()), method(object({
19148
- namespace: string().optional(),
19149
- collection: string(),
19150
- key: string(),
19151
- value: unknown()
19152
- }), _void(), { kind: "mutation" }), method(object({
19153
- namespace: string().optional(),
19154
- collection: string(),
19155
- filter: QueryFilterSchema.optional()
19156
- }), array(SettingsRecordSchema).readonly()), method(object({
19157
- namespace: string().optional(),
19158
- collection: string(),
19159
- record: SettingsRecordSchema
19160
- }), _void(), { kind: "mutation" }), method(object({
19161
- namespace: string().optional(),
19162
- collection: string(),
19163
- id: string(),
19164
- data: record(string(), unknown())
19165
- }), _void(), { kind: "mutation" }), method(object({
19166
- namespace: string().optional(),
19167
- collection: string(),
19168
- key: string()
19169
- }), _void(), { kind: "mutation" }), method(object({
19170
- namespace: string().optional(),
19171
- collection: string(),
19172
- filter: QueryFilterSchema.optional()
19173
- }), number()), method(object({
19174
- namespace: string().optional(),
19175
- collection: string(),
19176
- field: string(),
19177
- bucketSize: number().int().positive(),
19178
- origin: number().int(),
19179
- filter: QueryFilterSchema.optional()
19180
- }), array(object({
19181
- bucket: number().int(),
19182
- count: number().int()
19183
- })).readonly()), method(object({
19184
- namespace: string().optional(),
19185
- collection: string()
19186
- }), boolean()), method(object({
19187
- namespace: string().optional(),
19188
- collection: string(),
19189
- columns: array(CollectionColumnSchema).readonly(),
19190
- indexes: array(CollectionIndexSchema).readonly().optional()
19191
- }), _void(), { kind: "mutation" });
19192
- /**
19193
19322
  * `smtp-provider` — pluggable email delivery surface.
19194
19323
  *
19195
19324
  * Collection cap: a deployment may install multiple SMTP relays (e.g.
@@ -23158,6 +23287,84 @@ Object.freeze({
23158
23287
  addonId: null,
23159
23288
  access: "view"
23160
23289
  },
23290
+ "dataStoreProvider.count": {
23291
+ capName: "data-store-provider",
23292
+ capScope: "system",
23293
+ addonId: null,
23294
+ access: "view"
23295
+ },
23296
+ "dataStoreProvider.declareCollection": {
23297
+ capName: "data-store-provider",
23298
+ capScope: "system",
23299
+ addonId: null,
23300
+ access: "create"
23301
+ },
23302
+ "dataStoreProvider.delete": {
23303
+ capName: "data-store-provider",
23304
+ capScope: "system",
23305
+ addonId: null,
23306
+ access: "delete"
23307
+ },
23308
+ "dataStoreProvider.deleteWhere": {
23309
+ capName: "data-store-provider",
23310
+ capScope: "system",
23311
+ addonId: null,
23312
+ access: "delete"
23313
+ },
23314
+ "dataStoreProvider.get": {
23315
+ capName: "data-store-provider",
23316
+ capScope: "system",
23317
+ addonId: null,
23318
+ access: "view"
23319
+ },
23320
+ "dataStoreProvider.getEngineInfo": {
23321
+ capName: "data-store-provider",
23322
+ capScope: "system",
23323
+ addonId: null,
23324
+ access: "view"
23325
+ },
23326
+ "dataStoreProvider.histogram": {
23327
+ capName: "data-store-provider",
23328
+ capScope: "system",
23329
+ addonId: null,
23330
+ access: "view"
23331
+ },
23332
+ "dataStoreProvider.insert": {
23333
+ capName: "data-store-provider",
23334
+ capScope: "system",
23335
+ addonId: null,
23336
+ access: "create"
23337
+ },
23338
+ "dataStoreProvider.isEmpty": {
23339
+ capName: "data-store-provider",
23340
+ capScope: "system",
23341
+ addonId: null,
23342
+ access: "view"
23343
+ },
23344
+ "dataStoreProvider.query": {
23345
+ capName: "data-store-provider",
23346
+ capScope: "system",
23347
+ addonId: null,
23348
+ access: "view"
23349
+ },
23350
+ "dataStoreProvider.set": {
23351
+ capName: "data-store-provider",
23352
+ capScope: "system",
23353
+ addonId: null,
23354
+ access: "create"
23355
+ },
23356
+ "dataStoreProvider.update": {
23357
+ capName: "data-store-provider",
23358
+ capScope: "system",
23359
+ addonId: null,
23360
+ access: "create"
23361
+ },
23362
+ "dataStoreProvider.updateWhere": {
23363
+ capName: "data-store-provider",
23364
+ capScope: "system",
23365
+ addonId: null,
23366
+ access: "create"
23367
+ },
23161
23368
  "dayNight.getOptions": {
23162
23369
  capName: "day-night",
23163
23370
  capScope: "device",
@@ -26236,6 +26443,12 @@ Object.freeze({
26236
26443
  addonId: null,
26237
26444
  access: "delete"
26238
26445
  },
26446
+ "settingsStore.deleteWhere": {
26447
+ capName: "settings-store",
26448
+ capScope: "system",
26449
+ addonId: null,
26450
+ access: "delete"
26451
+ },
26239
26452
  "settingsStore.get": {
26240
26453
  capName: "settings-store",
26241
26454
  capScope: "system",
@@ -26278,6 +26491,12 @@ Object.freeze({
26278
26491
  addonId: null,
26279
26492
  access: "create"
26280
26493
  },
26494
+ "settingsStore.updateWhere": {
26495
+ capName: "settings-store",
26496
+ capScope: "system",
26497
+ addonId: null,
26498
+ access: "create"
26499
+ },
26281
26500
  "smtpProvider.getStatus": {
26282
26501
  capName: "smtp-provider",
26283
26502
  capScope: "system",