@camstack/addon-ai 0.4.23 → 0.4.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.
package/dist/addon.js CHANGED
@@ -15780,7 +15780,23 @@ var NcHistoryEntrySchema = object({
15780
15780
  updatedAt: number$1(),
15781
15781
  /** Failure detail — present on a `dead` row. */
15782
15782
  error: string().optional(),
15783
- subject: NcHistorySubjectSchema
15783
+ subject: NcHistorySubjectSchema,
15784
+ /**
15785
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15786
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15787
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15788
+ * every delivery attempt). Absent on a row still pending/dead, a row
15789
+ * delivered before this field shipped, or a wiring with no artefact index.
15790
+ *
15791
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15792
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15793
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15794
+ * also answers `null` for an id whose artefact has since expired past the
15795
+ * retained shelf's own age bound — the degrade a caller (the Home
15796
+ * Assistant export) must render as "no image right now", never as a
15797
+ * broken link.
15798
+ */
15799
+ artifactIds: array(string().min(1)).optional()
15784
15800
  });
15785
15801
  /**
15786
15802
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16007,7 +16023,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16007
16023
  }), method(object({}), object({
16008
16024
  catalog: array(NcConditionDescriptorSchema),
16009
16025
  taxonomy: NcTaxonomySchema.optional()
16010
- })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
16026
+ })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({ artifactId: string().min(1) }), object({ url: string().nullable() }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
16011
16027
  kind: "mutation",
16012
16028
  caller: "required"
16013
16029
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -25299,6 +25315,39 @@ var ReadGopBytesResultSchema = object({
25299
25315
  /** Media ms the returned fragment covers. */
25300
25316
  gopDurMs: number$1()
25301
25317
  });
25318
+ /**
25319
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
25320
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
25321
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
25322
+ * a replay needs several seconds of native pixels, not one frame.
25323
+ *
25324
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
25325
+ * is `false` when the returned bytes were cut short by the read's own safety
25326
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
25327
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
25328
+ * degradation: a window whose end falls past the covering segment would need
25329
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
25330
+ * not one standalone-demuxable stream — the caller's answer is to request a
25331
+ * shorter window or one aligned to a single segment, not to receive spliced
25332
+ * bytes nothing has proven decodable.
25333
+ */
25334
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
25335
+ kind: literal("ok"),
25336
+ data: _instanceof(Uint8Array),
25337
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
25338
+ * the requested `fromMs` (anchored on the nearest keyframe). */
25339
+ gopStartMs: number$1(),
25340
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
25341
+ gopDurMs: number$1(),
25342
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
25343
+ * the requested `toMs`; the caller got fewer frames than asked for. */
25344
+ reachesRequestedEnd: boolean()
25345
+ }), object({
25346
+ kind: literal("spans-multiple-segments"),
25347
+ /** Where the covering segment's own footage runs out — informational,
25348
+ * not a retry hint (retrying the same window would refuse again). */
25349
+ segmentEndMs: number$1()
25350
+ })]);
25302
25351
  method(object({
25303
25352
  deviceId: number$1(),
25304
25353
  fromMs: number$1(),
@@ -25349,6 +25398,15 @@ method(object({
25349
25398
  }), ReadGopBytesResultSchema, {
25350
25399
  kind: "query",
25351
25400
  auth: "admin"
25401
+ }), method(object({
25402
+ deviceId: number$1(),
25403
+ profile: string(),
25404
+ startMs: number$1(),
25405
+ fromMs: number$1(),
25406
+ toMs: number$1()
25407
+ }), ReadWindowBytesResultSchema, {
25408
+ kind: "query",
25409
+ auth: "admin"
25352
25410
  }), method(object({
25353
25411
  deviceId: number$1(),
25354
25412
  config: RecordingConfigSchema
@@ -29767,6 +29825,12 @@ Object.freeze({
29767
29825
  addonId: null,
29768
29826
  access: "view"
29769
29827
  },
29828
+ "notificationRules.resolveArtifactUrl": {
29829
+ capName: "notification-rules",
29830
+ capScope: "system",
29831
+ addonId: null,
29832
+ access: "view"
29833
+ },
29770
29834
  "notificationRules.setAlarmConfig": {
29771
29835
  capName: "notification-rules",
29772
29836
  capScope: "system",
@@ -31171,6 +31235,12 @@ Object.freeze({
31171
31235
  addonId: null,
31172
31236
  access: "view"
31173
31237
  },
31238
+ "recording.readWindowBytes": {
31239
+ capName: "recording",
31240
+ capScope: "system",
31241
+ addonId: null,
31242
+ access: "view"
31243
+ },
31174
31244
  "recording.refreshStorageLocationsForMigration": {
31175
31245
  capName: "recording",
31176
31246
  capScope: "system",
@@ -34001,6 +34071,11 @@ Object.freeze({
34001
34071
  form: "single",
34002
34072
  optional: false
34003
34073
  }],
34074
+ "recording.readWindowBytes": [{
34075
+ name: "deviceId",
34076
+ form: "single",
34077
+ optional: false
34078
+ }],
34004
34079
  "recording.relocateFootage": [{
34005
34080
  name: "deviceId",
34006
34081
  form: "single",
package/dist/addon.mjs CHANGED
@@ -15806,7 +15806,23 @@ var NcHistoryEntrySchema = object({
15806
15806
  updatedAt: number$1(),
15807
15807
  /** Failure detail — present on a `dead` row. */
15808
15808
  error: string().optional(),
15809
- subject: NcHistorySubjectSchema
15809
+ subject: NcHistorySubjectSchema,
15810
+ /**
15811
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15812
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15813
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15814
+ * every delivery attempt). Absent on a row still pending/dead, a row
15815
+ * delivered before this field shipped, or a wiring with no artefact index.
15816
+ *
15817
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15818
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15819
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15820
+ * also answers `null` for an id whose artefact has since expired past the
15821
+ * retained shelf's own age bound — the degrade a caller (the Home
15822
+ * Assistant export) must render as "no image right now", never as a
15823
+ * broken link.
15824
+ */
15825
+ artifactIds: array(string().min(1)).optional()
15810
15826
  });
15811
15827
  /**
15812
15828
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16033,7 +16049,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16033
16049
  }), method(object({}), object({
16034
16050
  catalog: array(NcConditionDescriptorSchema),
16035
16051
  taxonomy: NcTaxonomySchema.optional()
16036
- })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
16052
+ })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({ artifactId: string().min(1) }), object({ url: string().nullable() }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
16037
16053
  kind: "mutation",
16038
16054
  caller: "required"
16039
16055
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -25325,6 +25341,39 @@ var ReadGopBytesResultSchema = object({
25325
25341
  /** Media ms the returned fragment covers. */
25326
25342
  gopDurMs: number$1()
25327
25343
  });
25344
+ /**
25345
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
25346
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
25347
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
25348
+ * a replay needs several seconds of native pixels, not one frame.
25349
+ *
25350
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
25351
+ * is `false` when the returned bytes were cut short by the read's own safety
25352
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
25353
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
25354
+ * degradation: a window whose end falls past the covering segment would need
25355
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
25356
+ * not one standalone-demuxable stream — the caller's answer is to request a
25357
+ * shorter window or one aligned to a single segment, not to receive spliced
25358
+ * bytes nothing has proven decodable.
25359
+ */
25360
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
25361
+ kind: literal("ok"),
25362
+ data: _instanceof(Uint8Array),
25363
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
25364
+ * the requested `fromMs` (anchored on the nearest keyframe). */
25365
+ gopStartMs: number$1(),
25366
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
25367
+ gopDurMs: number$1(),
25368
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
25369
+ * the requested `toMs`; the caller got fewer frames than asked for. */
25370
+ reachesRequestedEnd: boolean()
25371
+ }), object({
25372
+ kind: literal("spans-multiple-segments"),
25373
+ /** Where the covering segment's own footage runs out — informational,
25374
+ * not a retry hint (retrying the same window would refuse again). */
25375
+ segmentEndMs: number$1()
25376
+ })]);
25328
25377
  method(object({
25329
25378
  deviceId: number$1(),
25330
25379
  fromMs: number$1(),
@@ -25375,6 +25424,15 @@ method(object({
25375
25424
  }), ReadGopBytesResultSchema, {
25376
25425
  kind: "query",
25377
25426
  auth: "admin"
25427
+ }), method(object({
25428
+ deviceId: number$1(),
25429
+ profile: string(),
25430
+ startMs: number$1(),
25431
+ fromMs: number$1(),
25432
+ toMs: number$1()
25433
+ }), ReadWindowBytesResultSchema, {
25434
+ kind: "query",
25435
+ auth: "admin"
25378
25436
  }), method(object({
25379
25437
  deviceId: number$1(),
25380
25438
  config: RecordingConfigSchema
@@ -29793,6 +29851,12 @@ Object.freeze({
29793
29851
  addonId: null,
29794
29852
  access: "view"
29795
29853
  },
29854
+ "notificationRules.resolveArtifactUrl": {
29855
+ capName: "notification-rules",
29856
+ capScope: "system",
29857
+ addonId: null,
29858
+ access: "view"
29859
+ },
29796
29860
  "notificationRules.setAlarmConfig": {
29797
29861
  capName: "notification-rules",
29798
29862
  capScope: "system",
@@ -31197,6 +31261,12 @@ Object.freeze({
31197
31261
  addonId: null,
31198
31262
  access: "view"
31199
31263
  },
31264
+ "recording.readWindowBytes": {
31265
+ capName: "recording",
31266
+ capScope: "system",
31267
+ addonId: null,
31268
+ access: "view"
31269
+ },
31200
31270
  "recording.refreshStorageLocationsForMigration": {
31201
31271
  capName: "recording",
31202
31272
  capScope: "system",
@@ -34027,6 +34097,11 @@ Object.freeze({
34027
34097
  form: "single",
34028
34098
  optional: false
34029
34099
  }],
34100
+ "recording.readWindowBytes": [{
34101
+ name: "deviceId",
34102
+ form: "single",
34103
+ optional: false
34104
+ }],
34030
34105
  "recording.relocateFootage": [{
34031
34106
  name: "deviceId",
34032
34107
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-ai",
3
- "version": "0.4.23",
3
+ "version": "0.4.24",
4
4
  "description": "AI addon for CamStack — the `llm` collection provider (cloud, LAN, and camstack-managed local llama.cpp profiles) plus the per-node `llm-runtime` managed executor.",
5
5
  "keywords": [
6
6
  "camstack",