@camstack/addon-provider-rtsp 1.2.52 → 1.2.55

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
@@ -7774,7 +7774,8 @@ var OpsLogReasonSchema = _enum([
7774
7774
  "quota",
7775
7775
  "manual",
7776
7776
  "operator",
7777
- "maintenance"
7777
+ "maintenance",
7778
+ "orphaned-device"
7778
7779
  ]);
7779
7780
  /** One audit row, shared verbatim by both domains. */
7780
7781
  var OpsLogEntrySchema = object({
@@ -13069,10 +13070,39 @@ var DevicePersistConfigPayloadSchema = object({
13069
13070
  deviceId: number(),
13070
13071
  data: record(string(), unknown())
13071
13072
  });
13073
+ /** What a migration actually did, per switch. `unreachable` is a first-class
13074
+ * answer: a camera that could not be asked is not a camera that was silenced. */
13075
+ var MigrateSwitchOutcomeSchema = _enum([
13076
+ "off",
13077
+ "on",
13078
+ "not-offered",
13079
+ "unreachable"
13080
+ ]);
13081
+ var MigrateSwitchReportSchema = object({
13082
+ deviceId: number(),
13083
+ switchId: CameraSwitchIdSchema,
13084
+ outcome: MigrateSwitchOutcomeSchema,
13085
+ detail: string().optional()
13086
+ });
13087
+ var MigrateDeviceResultSchema = object({
13088
+ sourceId: number(),
13089
+ targetId: number(),
13090
+ switches: array(MigrateSwitchReportSchema).readonly(),
13091
+ /** Switches that could NOT be turned off on the source. Empty is the only
13092
+ * value meaning the replaced hardware is quiet. */
13093
+ sourceStillLive: array(CameraSwitchIdSchema).readonly(),
13094
+ swapped: boolean()
13095
+ });
13072
13096
  method(object({
13073
13097
  addonId: string(),
13074
13098
  stableId: string()
13075
- }), object({ id: number() }), { kind: "mutation" }), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), DeviceMetaSchema.nullable()), method(object({
13099
+ }), object({ id: number() }), { kind: "mutation" }), method(object({
13100
+ sourceId: number(),
13101
+ targetId: number()
13102
+ }), MigrateDeviceResultSchema, {
13103
+ kind: "mutation",
13104
+ auth: "admin"
13105
+ }), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), DeviceMetaSchema.nullable()), method(object({
13076
13106
  deviceId: number(),
13077
13107
  name: string()
13078
13108
  }), _void(), {
@@ -13547,6 +13577,35 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
13547
13577
  auth: "admin"
13548
13578
  });
13549
13579
  /**
13580
+ * Transport bounds for AI capability methods.
13581
+ *
13582
+ * Its own module because `llm.cap.ts` and `llm-runtime.cap.ts` already import
13583
+ * each other: declaring the constant in either one hands the other `undefined`
13584
+ * at module-init time, and an undefined `timeoutMs` silently falls back to the
13585
+ * kernel's 60 s default — the exact failure this constant exists to prevent,
13586
+ * reintroduced invisibly. Found by the guard, not by review.
13587
+ */
13588
+ /**
13589
+ * Ceiling for a cap method that runs inference or loads a model.
13590
+ *
13591
+ * Deliberately far above anything the AI layer itself may wait for (a summary
13592
+ * asks 180 s by default, a rule may ask 600 s), because the TRANSPORT must
13593
+ * never be the layer that gives up first: when it does, the failure is
13594
+ * reported as a transport error for a model that was still thinking, naming
13595
+ * the wrong layer and hiding the real one.
13596
+ *
13597
+ * Measured 2026-09-03: a 6-image vision request needs 44.8 s warm and ~20 s
13598
+ * more on a cold model load. With no declaration every digest failed at
13599
+ * exactly 60 s and shipped without its text.
13600
+ *
13601
+ * A ceiling, not a budget. The AI layer's own timeouts (the rule's `timeoutMs`,
13602
+ * the profile's `timeoutMs` / `firstTokenTimeoutMs`) remain the things that
13603
+ * decide when to stop, because only they can say WHY.
13604
+ */
13605
+ var AI_CAP_TRANSPORT_TIMEOUT_MS = 6e5;
13606
+ /** A multi-gigabyte download. An hour is not generous, it is honest. */
13607
+ var AI_MODEL_INSTALL_TIMEOUT_MS = 60 * 6e4;
13608
+ /**
13550
13609
  * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
13551
13610
  * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
13552
13611
  * caps stay wire-compatible without a circular cap→cap import.
@@ -13818,16 +13877,19 @@ method(LlmGenerateBaseInputSchema.extend({
13818
13877
  timeoutMs: number().int().positive().optional()
13819
13878
  }), LlmGenerateResultSchema, {
13820
13879
  kind: "mutation",
13821
- auth: "admin"
13880
+ auth: "admin",
13881
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13822
13882
  }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13823
13883
  kind: "mutation",
13824
- auth: "admin"
13884
+ auth: "admin",
13885
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13825
13886
  }), method(object({}), _void(), {
13826
13887
  kind: "mutation",
13827
13888
  auth: "admin"
13828
13889
  }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13829
13890
  kind: "mutation",
13830
- auth: "admin"
13891
+ auth: "admin",
13892
+ timeoutMs: AI_MODEL_INSTALL_TIMEOUT_MS
13831
13893
  }), method(object({ file: string() }), _void(), {
13832
13894
  kind: "mutation",
13833
13895
  auth: "admin"
@@ -13995,7 +14057,13 @@ var ProfileRefInputSchema = object({
13995
14057
  addonId: string(),
13996
14058
  profileId: string()
13997
14059
  });
13998
- method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({
14060
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
14061
+ kind: "mutation",
14062
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14063
+ }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, {
14064
+ kind: "mutation",
14065
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14066
+ }), method(object({
13999
14067
  addonId: string().optional(),
14000
14068
  requestId: string()
14001
14069
  }), _void(), { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
@@ -14006,7 +14074,8 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }
14006
14074
  auth: "admin"
14007
14075
  }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
14008
14076
  kind: "mutation",
14009
- auth: "admin"
14077
+ auth: "admin",
14078
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14010
14079
  }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
14011
14080
  selector: LlmDefaultSelectorSchema,
14012
14081
  profileId: string().nullable()
@@ -34245,6 +34314,12 @@ Object.freeze({
34245
34314
  addonId: null,
34246
34315
  access: "view"
34247
34316
  },
34317
+ "deviceManager.migrateDevice": {
34318
+ capName: "device-manager",
34319
+ capScope: "system",
34320
+ addonId: null,
34321
+ access: "create"
34322
+ },
34248
34323
  "deviceManager.persistConfig": {
34249
34324
  capName: "device-manager",
34250
34325
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -7750,7 +7750,8 @@ var OpsLogReasonSchema = _enum([
7750
7750
  "quota",
7751
7751
  "manual",
7752
7752
  "operator",
7753
- "maintenance"
7753
+ "maintenance",
7754
+ "orphaned-device"
7754
7755
  ]);
7755
7756
  /** One audit row, shared verbatim by both domains. */
7756
7757
  var OpsLogEntrySchema = object({
@@ -13045,10 +13046,39 @@ var DevicePersistConfigPayloadSchema = object({
13045
13046
  deviceId: number(),
13046
13047
  data: record(string(), unknown())
13047
13048
  });
13049
+ /** What a migration actually did, per switch. `unreachable` is a first-class
13050
+ * answer: a camera that could not be asked is not a camera that was silenced. */
13051
+ var MigrateSwitchOutcomeSchema = _enum([
13052
+ "off",
13053
+ "on",
13054
+ "not-offered",
13055
+ "unreachable"
13056
+ ]);
13057
+ var MigrateSwitchReportSchema = object({
13058
+ deviceId: number(),
13059
+ switchId: CameraSwitchIdSchema,
13060
+ outcome: MigrateSwitchOutcomeSchema,
13061
+ detail: string().optional()
13062
+ });
13063
+ var MigrateDeviceResultSchema = object({
13064
+ sourceId: number(),
13065
+ targetId: number(),
13066
+ switches: array(MigrateSwitchReportSchema).readonly(),
13067
+ /** Switches that could NOT be turned off on the source. Empty is the only
13068
+ * value meaning the replaced hardware is quiet. */
13069
+ sourceStillLive: array(CameraSwitchIdSchema).readonly(),
13070
+ swapped: boolean()
13071
+ });
13048
13072
  method(object({
13049
13073
  addonId: string(),
13050
13074
  stableId: string()
13051
- }), object({ id: number() }), { kind: "mutation" }), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), DeviceMetaSchema.nullable()), method(object({
13075
+ }), object({ id: number() }), { kind: "mutation" }), method(object({
13076
+ sourceId: number(),
13077
+ targetId: number()
13078
+ }), MigrateDeviceResultSchema, {
13079
+ kind: "mutation",
13080
+ auth: "admin"
13081
+ }), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), DeviceMetaSchema.nullable()), method(object({
13052
13082
  deviceId: number(),
13053
13083
  name: string()
13054
13084
  }), _void(), {
@@ -13523,6 +13553,35 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
13523
13553
  auth: "admin"
13524
13554
  });
13525
13555
  /**
13556
+ * Transport bounds for AI capability methods.
13557
+ *
13558
+ * Its own module because `llm.cap.ts` and `llm-runtime.cap.ts` already import
13559
+ * each other: declaring the constant in either one hands the other `undefined`
13560
+ * at module-init time, and an undefined `timeoutMs` silently falls back to the
13561
+ * kernel's 60 s default — the exact failure this constant exists to prevent,
13562
+ * reintroduced invisibly. Found by the guard, not by review.
13563
+ */
13564
+ /**
13565
+ * Ceiling for a cap method that runs inference or loads a model.
13566
+ *
13567
+ * Deliberately far above anything the AI layer itself may wait for (a summary
13568
+ * asks 180 s by default, a rule may ask 600 s), because the TRANSPORT must
13569
+ * never be the layer that gives up first: when it does, the failure is
13570
+ * reported as a transport error for a model that was still thinking, naming
13571
+ * the wrong layer and hiding the real one.
13572
+ *
13573
+ * Measured 2026-09-03: a 6-image vision request needs 44.8 s warm and ~20 s
13574
+ * more on a cold model load. With no declaration every digest failed at
13575
+ * exactly 60 s and shipped without its text.
13576
+ *
13577
+ * A ceiling, not a budget. The AI layer's own timeouts (the rule's `timeoutMs`,
13578
+ * the profile's `timeoutMs` / `firstTokenTimeoutMs`) remain the things that
13579
+ * decide when to stop, because only they can say WHY.
13580
+ */
13581
+ var AI_CAP_TRANSPORT_TIMEOUT_MS = 6e5;
13582
+ /** A multi-gigabyte download. An hour is not generous, it is honest. */
13583
+ var AI_MODEL_INSTALL_TIMEOUT_MS = 60 * 6e4;
13584
+ /**
13526
13585
  * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
13527
13586
  * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
13528
13587
  * caps stay wire-compatible without a circular cap→cap import.
@@ -13794,16 +13853,19 @@ method(LlmGenerateBaseInputSchema.extend({
13794
13853
  timeoutMs: number().int().positive().optional()
13795
13854
  }), LlmGenerateResultSchema, {
13796
13855
  kind: "mutation",
13797
- auth: "admin"
13856
+ auth: "admin",
13857
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13798
13858
  }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13799
13859
  kind: "mutation",
13800
- auth: "admin"
13860
+ auth: "admin",
13861
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13801
13862
  }), method(object({}), _void(), {
13802
13863
  kind: "mutation",
13803
13864
  auth: "admin"
13804
13865
  }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13805
13866
  kind: "mutation",
13806
- auth: "admin"
13867
+ auth: "admin",
13868
+ timeoutMs: AI_MODEL_INSTALL_TIMEOUT_MS
13807
13869
  }), method(object({ file: string() }), _void(), {
13808
13870
  kind: "mutation",
13809
13871
  auth: "admin"
@@ -13971,7 +14033,13 @@ var ProfileRefInputSchema = object({
13971
14033
  addonId: string(),
13972
14034
  profileId: string()
13973
14035
  });
13974
- method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({
14036
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
14037
+ kind: "mutation",
14038
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14039
+ }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, {
14040
+ kind: "mutation",
14041
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14042
+ }), method(object({
13975
14043
  addonId: string().optional(),
13976
14044
  requestId: string()
13977
14045
  }), _void(), { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
@@ -13982,7 +14050,8 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }
13982
14050
  auth: "admin"
13983
14051
  }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
13984
14052
  kind: "mutation",
13985
- auth: "admin"
14053
+ auth: "admin",
14054
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13986
14055
  }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
13987
14056
  selector: LlmDefaultSelectorSchema,
13988
14057
  profileId: string().nullable()
@@ -34221,6 +34290,12 @@ Object.freeze({
34221
34290
  addonId: null,
34222
34291
  access: "view"
34223
34292
  },
34293
+ "deviceManager.migrateDevice": {
34294
+ capName: "device-manager",
34295
+ capScope: "system",
34296
+ addonId: null,
34297
+ access: "create"
34298
+ },
34224
34299
  "deviceManager.persistConfig": {
34225
34300
  capName: "device-manager",
34226
34301
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-rtsp",
3
- "version": "1.2.52",
3
+ "version": "1.2.55",
4
4
  "description": "Generic RTSP camera device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",