@camstack/addon-terminal 0.1.35 → 0.1.36

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
@@ -15826,7 +15826,23 @@ var NcHistoryEntrySchema = object({
15826
15826
  updatedAt: number(),
15827
15827
  /** Failure detail — present on a `dead` row. */
15828
15828
  error: string().optional(),
15829
- subject: NcHistorySubjectSchema
15829
+ subject: NcHistorySubjectSchema,
15830
+ /**
15831
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15832
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15833
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15834
+ * every delivery attempt). Absent on a row still pending/dead, a row
15835
+ * delivered before this field shipped, or a wiring with no artefact index.
15836
+ *
15837
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15838
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15839
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15840
+ * also answers `null` for an id whose artefact has since expired past the
15841
+ * retained shelf's own age bound — the degrade a caller (the Home
15842
+ * Assistant export) must render as "no image right now", never as a
15843
+ * broken link.
15844
+ */
15845
+ artifactIds: array(string().min(1)).optional()
15830
15846
  });
15831
15847
  /**
15832
15848
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16053,7 +16069,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16053
16069
  }), method(object({}), object({
16054
16070
  catalog: array(NcConditionDescriptorSchema),
16055
16071
  taxonomy: NcTaxonomySchema.optional()
16056
- })), 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 }), {
16072
+ })), 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 }), {
16057
16073
  kind: "mutation",
16058
16074
  caller: "required"
16059
16075
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -27221,6 +27237,39 @@ var ReadGopBytesResultSchema = object({
27221
27237
  /** Media ms the returned fragment covers. */
27222
27238
  gopDurMs: number()
27223
27239
  });
27240
+ /**
27241
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
27242
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
27243
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
27244
+ * a replay needs several seconds of native pixels, not one frame.
27245
+ *
27246
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
27247
+ * is `false` when the returned bytes were cut short by the read's own safety
27248
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
27249
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
27250
+ * degradation: a window whose end falls past the covering segment would need
27251
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
27252
+ * not one standalone-demuxable stream — the caller's answer is to request a
27253
+ * shorter window or one aligned to a single segment, not to receive spliced
27254
+ * bytes nothing has proven decodable.
27255
+ */
27256
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
27257
+ kind: literal("ok"),
27258
+ data: _instanceof(Uint8Array),
27259
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
27260
+ * the requested `fromMs` (anchored on the nearest keyframe). */
27261
+ gopStartMs: number(),
27262
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
27263
+ gopDurMs: number(),
27264
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
27265
+ * the requested `toMs`; the caller got fewer frames than asked for. */
27266
+ reachesRequestedEnd: boolean()
27267
+ }), object({
27268
+ kind: literal("spans-multiple-segments"),
27269
+ /** Where the covering segment's own footage runs out — informational,
27270
+ * not a retry hint (retrying the same window would refuse again). */
27271
+ segmentEndMs: number()
27272
+ })]);
27224
27273
  method(object({
27225
27274
  deviceId: number(),
27226
27275
  fromMs: number(),
@@ -27271,6 +27320,15 @@ method(object({
27271
27320
  }), ReadGopBytesResultSchema, {
27272
27321
  kind: "query",
27273
27322
  auth: "admin"
27323
+ }), method(object({
27324
+ deviceId: number(),
27325
+ profile: string(),
27326
+ startMs: number(),
27327
+ fromMs: number(),
27328
+ toMs: number()
27329
+ }), ReadWindowBytesResultSchema, {
27330
+ kind: "query",
27331
+ auth: "admin"
27274
27332
  }), method(object({
27275
27333
  deviceId: number(),
27276
27334
  config: RecordingConfigSchema
@@ -33356,6 +33414,12 @@ Object.freeze({
33356
33414
  addonId: null,
33357
33415
  access: "view"
33358
33416
  },
33417
+ "notificationRules.resolveArtifactUrl": {
33418
+ capName: "notification-rules",
33419
+ capScope: "system",
33420
+ addonId: null,
33421
+ access: "view"
33422
+ },
33359
33423
  "notificationRules.setAlarmConfig": {
33360
33424
  capName: "notification-rules",
33361
33425
  capScope: "system",
@@ -34760,6 +34824,12 @@ Object.freeze({
34760
34824
  addonId: null,
34761
34825
  access: "view"
34762
34826
  },
34827
+ "recording.readWindowBytes": {
34828
+ capName: "recording",
34829
+ capScope: "system",
34830
+ addonId: null,
34831
+ access: "view"
34832
+ },
34763
34833
  "recording.refreshStorageLocationsForMigration": {
34764
34834
  capName: "recording",
34765
34835
  capScope: "system",
@@ -37590,6 +37660,11 @@ Object.freeze({
37590
37660
  form: "single",
37591
37661
  optional: false
37592
37662
  }],
37663
+ "recording.readWindowBytes": [{
37664
+ name: "deviceId",
37665
+ form: "single",
37666
+ optional: false
37667
+ }],
37593
37668
  "recording.relocateFootage": [{
37594
37669
  name: "deviceId",
37595
37670
  form: "single",
package/dist/addon.mjs CHANGED
@@ -15803,7 +15803,23 @@ var NcHistoryEntrySchema = object({
15803
15803
  updatedAt: number(),
15804
15804
  /** Failure detail — present on a `dead` row. */
15805
15805
  error: string().optional(),
15806
- subject: NcHistorySubjectSchema
15806
+ subject: NcHistorySubjectSchema,
15807
+ /**
15808
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15809
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15810
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15811
+ * every delivery attempt). Absent on a row still pending/dead, a row
15812
+ * delivered before this field shipped, or a wiring with no artefact index.
15813
+ *
15814
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15815
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15816
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15817
+ * also answers `null` for an id whose artefact has since expired past the
15818
+ * retained shelf's own age bound — the degrade a caller (the Home
15819
+ * Assistant export) must render as "no image right now", never as a
15820
+ * broken link.
15821
+ */
15822
+ artifactIds: array(string().min(1)).optional()
15807
15823
  });
15808
15824
  /**
15809
15825
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -16030,7 +16046,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
16030
16046
  }), method(object({}), object({
16031
16047
  catalog: array(NcConditionDescriptorSchema),
16032
16048
  taxonomy: NcTaxonomySchema.optional()
16033
- })), 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 }), {
16049
+ })), 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 }), {
16034
16050
  kind: "mutation",
16035
16051
  caller: "required"
16036
16052
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -27198,6 +27214,39 @@ var ReadGopBytesResultSchema = object({
27198
27214
  /** Media ms the returned fragment covers. */
27199
27215
  gopDurMs: number()
27200
27216
  });
27217
+ /**
27218
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
27219
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
27220
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
27221
+ * a replay needs several seconds of native pixels, not one frame.
27222
+ *
27223
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
27224
+ * is `false` when the returned bytes were cut short by the read's own safety
27225
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
27226
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
27227
+ * degradation: a window whose end falls past the covering segment would need
27228
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
27229
+ * not one standalone-demuxable stream — the caller's answer is to request a
27230
+ * shorter window or one aligned to a single segment, not to receive spliced
27231
+ * bytes nothing has proven decodable.
27232
+ */
27233
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
27234
+ kind: literal("ok"),
27235
+ data: _instanceof(Uint8Array),
27236
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
27237
+ * the requested `fromMs` (anchored on the nearest keyframe). */
27238
+ gopStartMs: number(),
27239
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
27240
+ gopDurMs: number(),
27241
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
27242
+ * the requested `toMs`; the caller got fewer frames than asked for. */
27243
+ reachesRequestedEnd: boolean()
27244
+ }), object({
27245
+ kind: literal("spans-multiple-segments"),
27246
+ /** Where the covering segment's own footage runs out — informational,
27247
+ * not a retry hint (retrying the same window would refuse again). */
27248
+ segmentEndMs: number()
27249
+ })]);
27201
27250
  method(object({
27202
27251
  deviceId: number(),
27203
27252
  fromMs: number(),
@@ -27248,6 +27297,15 @@ method(object({
27248
27297
  }), ReadGopBytesResultSchema, {
27249
27298
  kind: "query",
27250
27299
  auth: "admin"
27300
+ }), method(object({
27301
+ deviceId: number(),
27302
+ profile: string(),
27303
+ startMs: number(),
27304
+ fromMs: number(),
27305
+ toMs: number()
27306
+ }), ReadWindowBytesResultSchema, {
27307
+ kind: "query",
27308
+ auth: "admin"
27251
27309
  }), method(object({
27252
27310
  deviceId: number(),
27253
27311
  config: RecordingConfigSchema
@@ -33333,6 +33391,12 @@ Object.freeze({
33333
33391
  addonId: null,
33334
33392
  access: "view"
33335
33393
  },
33394
+ "notificationRules.resolveArtifactUrl": {
33395
+ capName: "notification-rules",
33396
+ capScope: "system",
33397
+ addonId: null,
33398
+ access: "view"
33399
+ },
33336
33400
  "notificationRules.setAlarmConfig": {
33337
33401
  capName: "notification-rules",
33338
33402
  capScope: "system",
@@ -34737,6 +34801,12 @@ Object.freeze({
34737
34801
  addonId: null,
34738
34802
  access: "view"
34739
34803
  },
34804
+ "recording.readWindowBytes": {
34805
+ capName: "recording",
34806
+ capScope: "system",
34807
+ addonId: null,
34808
+ access: "view"
34809
+ },
34740
34810
  "recording.refreshStorageLocationsForMigration": {
34741
34811
  capName: "recording",
34742
34812
  capScope: "system",
@@ -37567,6 +37637,11 @@ Object.freeze({
37567
37637
  form: "single",
37568
37638
  optional: false
37569
37639
  }],
37640
+ "recording.readWindowBytes": [{
37641
+ name: "deviceId",
37642
+ form: "single",
37643
+ optional: false
37644
+ }],
37570
37645
  "recording.relocateFootage": [{
37571
37646
  name: "deviceId",
37572
37647
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-terminal",
3
- "version": "0.1.35",
3
+ "version": "0.1.36",
4
4
  "description": "Interactive terminal sessions (pty + xterm) as a CamStack addon",
5
5
  "keywords": [
6
6
  "camstack",