@camstack/addon-agent-ui 1.1.27 → 1.1.28

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 (2) hide show
  1. package/dist/addon.js +145 -2
  2. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -7338,6 +7338,62 @@ var RecordingConfigSchema = object({
7338
7338
  scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7339
7339
  });
7340
7340
  /**
7341
+ * Ops-log — the durable, append-only operations audit shared by the
7342
+ * recordings and events management surfaces.
7343
+ *
7344
+ * ONE row shape is reused for both domains so a single "Activity" view can
7345
+ * merge the recorder's DurableState ring (recordings ops-log) and the
7346
+ * pipeline-analytics SQLite collection (events ops-log). Each row records a
7347
+ * management operation, WHY it ran (reason), and its measurable effect
7348
+ * (itemsAffected + bytesReclaimed). Writes are best-effort — a failed log must
7349
+ * never fail the operation it records.
7350
+ */
7351
+ /** Which management domain the operation belongs to. */
7352
+ var OpsLogDomainSchema = _enum(["recording", "events"]);
7353
+ /** The kind of management operation performed. */
7354
+ var OpsLogOpSchema = _enum([
7355
+ "prune",
7356
+ "manual-delete",
7357
+ "rescan",
7358
+ "retention-run"
7359
+ ]);
7360
+ /** Why the operation ran. */
7361
+ var OpsLogReasonSchema = _enum([
7362
+ "retention",
7363
+ "quota",
7364
+ "manual",
7365
+ "operator"
7366
+ ]);
7367
+ /** One audit row, shared verbatim by both domains. */
7368
+ var OpsLogEntrySchema = object({
7369
+ /** Unique row id. */
7370
+ id: string(),
7371
+ /** Epoch ms the operation completed. */
7372
+ at: number(),
7373
+ domain: OpsLogDomainSchema,
7374
+ op: OpsLogOpSchema,
7375
+ reason: OpsLogReasonSchema,
7376
+ /** The camera the op targeted; null for a cluster/global op. */
7377
+ deviceId: number().nullable(),
7378
+ /** Node that performed the op (the log carries nodeId — no cross-node aggregation). */
7379
+ nodeId: string(),
7380
+ /** Buckets / rows deleted (op-specific unit). */
7381
+ itemsAffected: number(),
7382
+ /** Bytes reclaimed by the op (0 when not measurable). */
7383
+ bytesReclaimed: number(),
7384
+ /** Free-text detail (e.g. "floor moved to <ts>"); null when none. */
7385
+ detail: string().nullable(),
7386
+ /** Who/what triggered the op. */
7387
+ actor: string()
7388
+ });
7389
+ /** Shared query input for the per-domain `listOpsLog` cap methods. */
7390
+ var OpsLogQueryInputSchema = object({
7391
+ /** Restrict to a single camera; omit for every row. */
7392
+ deviceId: number().optional(),
7393
+ /** Max rows returned, newest-first. */
7394
+ limit: number().int().min(1).max(1e3).optional()
7395
+ });
7396
+ /**
7341
7397
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
7342
7398
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
7343
7399
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -16138,6 +16194,26 @@ var TrackCascadeCountsSchema = object({
16138
16194
  /** Per-track CLIP search vectors removed (best-effort). */
16139
16195
  embeddings: number().int()
16140
16196
  });
16197
+ /** Event-store footprint for one camera. */
16198
+ var EventStoreDeviceFootprintSchema = object({
16199
+ deviceId: number(),
16200
+ /** Persisted event rows (motion + object + audio) for the camera. */
16201
+ rows: number().int(),
16202
+ /** Event-owned media bytes on disk for the camera. */
16203
+ bytes: number().int()
16204
+ });
16205
+ /** Aggregate event-store footprint: global totals + per-camera breakdown. */
16206
+ var EventStoreFootprintSchema = object({
16207
+ totalRows: number().int(),
16208
+ totalBytes: number().int(),
16209
+ devices: array(EventStoreDeviceFootprintSchema).readonly()
16210
+ });
16211
+ /** Per-kind counts returned by the event-prune / device-delete mutations. */
16212
+ var EventPruneCountsSchema = object({
16213
+ motion: number().int(),
16214
+ object: number().int(),
16215
+ audio: number().int()
16216
+ });
16141
16217
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
16142
16218
  deviceId: number(),
16143
16219
  trackId: string()
@@ -16201,6 +16277,21 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
16201
16277
  }), {
16202
16278
  kind: "mutation",
16203
16279
  auth: "admin"
16280
+ }), method(object({}), EventStoreFootprintSchema, {
16281
+ kind: "query",
16282
+ auth: "admin"
16283
+ }), method(object({
16284
+ olderThanMs: number(),
16285
+ reason: OpsLogReasonSchema.optional()
16286
+ }), EventPruneCountsSchema, {
16287
+ kind: "mutation",
16288
+ auth: "admin"
16289
+ }), method(object({ deviceId: number() }), EventPruneCountsSchema, {
16290
+ kind: "mutation",
16291
+ auth: "admin"
16292
+ }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
16293
+ kind: "query",
16294
+ auth: "admin"
16204
16295
  }), method(object({
16205
16296
  eventId: string(),
16206
16297
  kind: MediaFileKindEnum.optional()
@@ -19434,13 +19525,29 @@ method(object({
19434
19525
  }), method(object({ deviceId: number() }), RecordingStatusSchema, {
19435
19526
  kind: "mutation",
19436
19527
  auth: "admin"
19437
- }), method(object({ deviceId: number() }), object({
19528
+ }), method(object({
19529
+ deviceId: number(),
19530
+ reason: OpsLogReasonSchema.optional()
19531
+ }), object({
19438
19532
  floorMs: number().nullable(),
19439
19533
  deletedBuckets: number().int(),
19440
19534
  reclaimedBytes: number().int()
19441
19535
  }), {
19442
19536
  kind: "mutation",
19443
19537
  auth: "admin"
19538
+ }), method(object({
19539
+ deviceId: number(),
19540
+ fromMs: number().optional(),
19541
+ toMs: number().optional()
19542
+ }), object({
19543
+ deletedBuckets: number().int(),
19544
+ reclaimedBytes: number().int()
19545
+ }), {
19546
+ kind: "mutation",
19547
+ auth: "admin"
19548
+ }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19549
+ kind: "query",
19550
+ auth: "admin"
19444
19551
  });
19445
19552
  /**
19446
19553
  * `recordingExport` cap — render a footage time range into a single downloadable
@@ -22562,6 +22669,12 @@ Object.freeze({
22562
22669
  addonId: null,
22563
22670
  access: "delete"
22564
22671
  },
22672
+ "pipelineAnalytics.deleteDeviceEvents": {
22673
+ capName: "pipeline-analytics",
22674
+ capScope: "device",
22675
+ addonId: null,
22676
+ access: "delete"
22677
+ },
22565
22678
  "pipelineAnalytics.deleteTracks": {
22566
22679
  capName: "pipeline-analytics",
22567
22680
  capScope: "device",
@@ -22592,6 +22705,12 @@ Object.freeze({
22592
22705
  addonId: null,
22593
22706
  access: "view"
22594
22707
  },
22708
+ "pipelineAnalytics.getEventStoreFootprint": {
22709
+ capName: "pipeline-analytics",
22710
+ capScope: "device",
22711
+ addonId: null,
22712
+ access: "view"
22713
+ },
22595
22714
  "pipelineAnalytics.getKeyEvents": {
22596
22715
  capName: "pipeline-analytics",
22597
22716
  capScope: "device",
@@ -22634,6 +22753,12 @@ Object.freeze({
22634
22753
  addonId: null,
22635
22754
  access: "view"
22636
22755
  },
22756
+ "pipelineAnalytics.listOpsLog": {
22757
+ capName: "pipeline-analytics",
22758
+ capScope: "device",
22759
+ addonId: null,
22760
+ access: "view"
22761
+ },
22637
22762
  "pipelineAnalytics.listRecentTracks": {
22638
22763
  capName: "pipeline-analytics",
22639
22764
  capScope: "device",
@@ -22646,6 +22771,12 @@ Object.freeze({
22646
22771
  addonId: null,
22647
22772
  access: "view"
22648
22773
  },
22774
+ "pipelineAnalytics.pruneEvents": {
22775
+ capName: "pipeline-analytics",
22776
+ capScope: "device",
22777
+ addonId: null,
22778
+ access: "create"
22779
+ },
22649
22780
  "pipelineAnalytics.pruneEventsBefore": {
22650
22781
  capName: "pipeline-analytics",
22651
22782
  capScope: "device",
@@ -23408,6 +23539,12 @@ Object.freeze({
23408
23539
  addonId: null,
23409
23540
  access: "create"
23410
23541
  },
23542
+ "recording.deleteFootprint": {
23543
+ capName: "recording",
23544
+ capScope: "system",
23545
+ addonId: null,
23546
+ access: "delete"
23547
+ },
23411
23548
  "recording.getAvailability": {
23412
23549
  capName: "recording",
23413
23550
  capScope: "system",
@@ -23438,6 +23575,12 @@ Object.freeze({
23438
23575
  addonId: null,
23439
23576
  access: "view"
23440
23577
  },
23578
+ "recording.listOpsLog": {
23579
+ capName: "recording",
23580
+ capScope: "system",
23581
+ addonId: null,
23582
+ access: "view"
23583
+ },
23441
23584
  "recording.locateSegment": {
23442
23585
  capName: "recording",
23443
23586
  capScope: "system",
@@ -24683,7 +24826,7 @@ var AgentUIAddon = class extends BaseAddon {
24683
24826
  capability: adminUiCapability,
24684
24827
  provider: {
24685
24828
  getStaticDir: async () => ({ staticDir: path.resolve(__dirname) }),
24686
- getVersion: async () => ({ version: "1.1.27" })
24829
+ getVersion: async () => ({ version: "1.1.28" })
24687
24830
  }
24688
24831
  }];
24689
24832
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-agent-ui",
3
- "version": "1.1.27",
3
+ "version": "1.1.28",
4
4
  "description": "CamStack Agent UI — lightweight status dashboard served by every agent node",
5
5
  "keywords": [
6
6
  "camstack",