@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 +77 -2
- package/dist/addon.mjs +77 -2
- package/package.json +1 -1
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.
|
|
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",
|