@camstack/addon-provider-wyze 0.2.56 → 0.2.59

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
@@ -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({
@@ -13062,10 +13063,39 @@ var DevicePersistConfigPayloadSchema = object({
13062
13063
  deviceId: number(),
13063
13064
  data: record(string(), unknown())
13064
13065
  });
13066
+ /** What a migration actually did, per switch. `unreachable` is a first-class
13067
+ * answer: a camera that could not be asked is not a camera that was silenced. */
13068
+ var MigrateSwitchOutcomeSchema = _enum([
13069
+ "off",
13070
+ "on",
13071
+ "not-offered",
13072
+ "unreachable"
13073
+ ]);
13074
+ var MigrateSwitchReportSchema = object({
13075
+ deviceId: number(),
13076
+ switchId: CameraSwitchIdSchema,
13077
+ outcome: MigrateSwitchOutcomeSchema,
13078
+ detail: string().optional()
13079
+ });
13080
+ var MigrateDeviceResultSchema = object({
13081
+ sourceId: number(),
13082
+ targetId: number(),
13083
+ switches: array(MigrateSwitchReportSchema).readonly(),
13084
+ /** Switches that could NOT be turned off on the source. Empty is the only
13085
+ * value meaning the replaced hardware is quiet. */
13086
+ sourceStillLive: array(CameraSwitchIdSchema).readonly(),
13087
+ swapped: boolean()
13088
+ });
13065
13089
  method(object({
13066
13090
  addonId: string(),
13067
13091
  stableId: string()
13068
- }), 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({
13092
+ }), object({ id: number() }), { kind: "mutation" }), method(object({
13093
+ sourceId: number(),
13094
+ targetId: number()
13095
+ }), MigrateDeviceResultSchema, {
13096
+ kind: "mutation",
13097
+ auth: "admin"
13098
+ }), 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({
13069
13099
  deviceId: number(),
13070
13100
  name: string()
13071
13101
  }), _void(), {
@@ -13540,6 +13570,35 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
13540
13570
  auth: "admin"
13541
13571
  });
13542
13572
  /**
13573
+ * Transport bounds for AI capability methods.
13574
+ *
13575
+ * Its own module because `llm.cap.ts` and `llm-runtime.cap.ts` already import
13576
+ * each other: declaring the constant in either one hands the other `undefined`
13577
+ * at module-init time, and an undefined `timeoutMs` silently falls back to the
13578
+ * kernel's 60 s default — the exact failure this constant exists to prevent,
13579
+ * reintroduced invisibly. Found by the guard, not by review.
13580
+ */
13581
+ /**
13582
+ * Ceiling for a cap method that runs inference or loads a model.
13583
+ *
13584
+ * Deliberately far above anything the AI layer itself may wait for (a summary
13585
+ * asks 180 s by default, a rule may ask 600 s), because the TRANSPORT must
13586
+ * never be the layer that gives up first: when it does, the failure is
13587
+ * reported as a transport error for a model that was still thinking, naming
13588
+ * the wrong layer and hiding the real one.
13589
+ *
13590
+ * Measured 2026-09-03: a 6-image vision request needs 44.8 s warm and ~20 s
13591
+ * more on a cold model load. With no declaration every digest failed at
13592
+ * exactly 60 s and shipped without its text.
13593
+ *
13594
+ * A ceiling, not a budget. The AI layer's own timeouts (the rule's `timeoutMs`,
13595
+ * the profile's `timeoutMs` / `firstTokenTimeoutMs`) remain the things that
13596
+ * decide when to stop, because only they can say WHY.
13597
+ */
13598
+ var AI_CAP_TRANSPORT_TIMEOUT_MS = 6e5;
13599
+ /** A multi-gigabyte download. An hour is not generous, it is honest. */
13600
+ var AI_MODEL_INSTALL_TIMEOUT_MS = 60 * 6e4;
13601
+ /**
13543
13602
  * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
13544
13603
  * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
13545
13604
  * caps stay wire-compatible without a circular cap→cap import.
@@ -13811,16 +13870,19 @@ method(LlmGenerateBaseInputSchema.extend({
13811
13870
  timeoutMs: number().int().positive().optional()
13812
13871
  }), LlmGenerateResultSchema, {
13813
13872
  kind: "mutation",
13814
- auth: "admin"
13873
+ auth: "admin",
13874
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13815
13875
  }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13816
13876
  kind: "mutation",
13817
- auth: "admin"
13877
+ auth: "admin",
13878
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13818
13879
  }), method(object({}), _void(), {
13819
13880
  kind: "mutation",
13820
13881
  auth: "admin"
13821
13882
  }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13822
13883
  kind: "mutation",
13823
- auth: "admin"
13884
+ auth: "admin",
13885
+ timeoutMs: AI_MODEL_INSTALL_TIMEOUT_MS
13824
13886
  }), method(object({ file: string() }), _void(), {
13825
13887
  kind: "mutation",
13826
13888
  auth: "admin"
@@ -13988,7 +14050,13 @@ var ProfileRefInputSchema = object({
13988
14050
  addonId: string(),
13989
14051
  profileId: string()
13990
14052
  });
13991
- method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({
14053
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
14054
+ kind: "mutation",
14055
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14056
+ }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, {
14057
+ kind: "mutation",
14058
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14059
+ }), method(object({
13992
14060
  addonId: string().optional(),
13993
14061
  requestId: string()
13994
14062
  }), _void(), { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
@@ -13999,7 +14067,8 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }
13999
14067
  auth: "admin"
14000
14068
  }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
14001
14069
  kind: "mutation",
14002
- auth: "admin"
14070
+ auth: "admin",
14071
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14003
14072
  }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
14004
14073
  selector: LlmDefaultSelectorSchema,
14005
14074
  profileId: string().nullable()
@@ -34172,6 +34241,12 @@ Object.freeze({
34172
34241
  addonId: null,
34173
34242
  access: "view"
34174
34243
  },
34244
+ "deviceManager.migrateDevice": {
34245
+ capName: "device-manager",
34246
+ capScope: "system",
34247
+ addonId: null,
34248
+ access: "create"
34249
+ },
34175
34250
  "deviceManager.persistConfig": {
34176
34251
  capName: "device-manager",
34177
34252
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -7729,7 +7729,8 @@ var OpsLogReasonSchema = _enum([
7729
7729
  "quota",
7730
7730
  "manual",
7731
7731
  "operator",
7732
- "maintenance"
7732
+ "maintenance",
7733
+ "orphaned-device"
7733
7734
  ]);
7734
7735
  /** One audit row, shared verbatim by both domains. */
7735
7736
  var OpsLogEntrySchema = object({
@@ -13041,10 +13042,39 @@ var DevicePersistConfigPayloadSchema = object({
13041
13042
  deviceId: number(),
13042
13043
  data: record(string(), unknown())
13043
13044
  });
13045
+ /** What a migration actually did, per switch. `unreachable` is a first-class
13046
+ * answer: a camera that could not be asked is not a camera that was silenced. */
13047
+ var MigrateSwitchOutcomeSchema = _enum([
13048
+ "off",
13049
+ "on",
13050
+ "not-offered",
13051
+ "unreachable"
13052
+ ]);
13053
+ var MigrateSwitchReportSchema = object({
13054
+ deviceId: number(),
13055
+ switchId: CameraSwitchIdSchema,
13056
+ outcome: MigrateSwitchOutcomeSchema,
13057
+ detail: string().optional()
13058
+ });
13059
+ var MigrateDeviceResultSchema = object({
13060
+ sourceId: number(),
13061
+ targetId: number(),
13062
+ switches: array(MigrateSwitchReportSchema).readonly(),
13063
+ /** Switches that could NOT be turned off on the source. Empty is the only
13064
+ * value meaning the replaced hardware is quiet. */
13065
+ sourceStillLive: array(CameraSwitchIdSchema).readonly(),
13066
+ swapped: boolean()
13067
+ });
13044
13068
  method(object({
13045
13069
  addonId: string(),
13046
13070
  stableId: string()
13047
- }), 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({
13071
+ }), object({ id: number() }), { kind: "mutation" }), method(object({
13072
+ sourceId: number(),
13073
+ targetId: number()
13074
+ }), MigrateDeviceResultSchema, {
13075
+ kind: "mutation",
13076
+ auth: "admin"
13077
+ }), 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({
13048
13078
  deviceId: number(),
13049
13079
  name: string()
13050
13080
  }), _void(), {
@@ -13519,6 +13549,35 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
13519
13549
  auth: "admin"
13520
13550
  });
13521
13551
  /**
13552
+ * Transport bounds for AI capability methods.
13553
+ *
13554
+ * Its own module because `llm.cap.ts` and `llm-runtime.cap.ts` already import
13555
+ * each other: declaring the constant in either one hands the other `undefined`
13556
+ * at module-init time, and an undefined `timeoutMs` silently falls back to the
13557
+ * kernel's 60 s default — the exact failure this constant exists to prevent,
13558
+ * reintroduced invisibly. Found by the guard, not by review.
13559
+ */
13560
+ /**
13561
+ * Ceiling for a cap method that runs inference or loads a model.
13562
+ *
13563
+ * Deliberately far above anything the AI layer itself may wait for (a summary
13564
+ * asks 180 s by default, a rule may ask 600 s), because the TRANSPORT must
13565
+ * never be the layer that gives up first: when it does, the failure is
13566
+ * reported as a transport error for a model that was still thinking, naming
13567
+ * the wrong layer and hiding the real one.
13568
+ *
13569
+ * Measured 2026-09-03: a 6-image vision request needs 44.8 s warm and ~20 s
13570
+ * more on a cold model load. With no declaration every digest failed at
13571
+ * exactly 60 s and shipped without its text.
13572
+ *
13573
+ * A ceiling, not a budget. The AI layer's own timeouts (the rule's `timeoutMs`,
13574
+ * the profile's `timeoutMs` / `firstTokenTimeoutMs`) remain the things that
13575
+ * decide when to stop, because only they can say WHY.
13576
+ */
13577
+ var AI_CAP_TRANSPORT_TIMEOUT_MS = 6e5;
13578
+ /** A multi-gigabyte download. An hour is not generous, it is honest. */
13579
+ var AI_MODEL_INSTALL_TIMEOUT_MS = 60 * 6e4;
13580
+ /**
13522
13581
  * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
13523
13582
  * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
13524
13583
  * caps stay wire-compatible without a circular cap→cap import.
@@ -13790,16 +13849,19 @@ method(LlmGenerateBaseInputSchema.extend({
13790
13849
  timeoutMs: number().int().positive().optional()
13791
13850
  }), LlmGenerateResultSchema, {
13792
13851
  kind: "mutation",
13793
- auth: "admin"
13852
+ auth: "admin",
13853
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13794
13854
  }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13795
13855
  kind: "mutation",
13796
- auth: "admin"
13856
+ auth: "admin",
13857
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13797
13858
  }), method(object({}), _void(), {
13798
13859
  kind: "mutation",
13799
13860
  auth: "admin"
13800
13861
  }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13801
13862
  kind: "mutation",
13802
- auth: "admin"
13863
+ auth: "admin",
13864
+ timeoutMs: AI_MODEL_INSTALL_TIMEOUT_MS
13803
13865
  }), method(object({ file: string() }), _void(), {
13804
13866
  kind: "mutation",
13805
13867
  auth: "admin"
@@ -13967,7 +14029,13 @@ var ProfileRefInputSchema = object({
13967
14029
  addonId: string(),
13968
14030
  profileId: string()
13969
14031
  });
13970
- method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({
14032
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
14033
+ kind: "mutation",
14034
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14035
+ }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, {
14036
+ kind: "mutation",
14037
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14038
+ }), method(object({
13971
14039
  addonId: string().optional(),
13972
14040
  requestId: string()
13973
14041
  }), _void(), { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
@@ -13978,7 +14046,8 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }
13978
14046
  auth: "admin"
13979
14047
  }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
13980
14048
  kind: "mutation",
13981
- auth: "admin"
14049
+ auth: "admin",
14050
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13982
14051
  }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
13983
14052
  selector: LlmDefaultSelectorSchema,
13984
14053
  profileId: string().nullable()
@@ -34151,6 +34220,12 @@ Object.freeze({
34151
34220
  addonId: null,
34152
34221
  access: "view"
34153
34222
  },
34223
+ "deviceManager.migrateDevice": {
34224
+ capName: "device-manager",
34225
+ capScope: "system",
34226
+ addonId: null,
34227
+ access: "create"
34228
+ },
34154
34229
  "deviceManager.persistConfig": {
34155
34230
  capName: "device-manager",
34156
34231
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-wyze",
3
- "version": "0.2.56",
3
+ "version": "0.2.59",
4
4
  "description": "Wyze camera device-provider addon for CamStack — wraps the @apocaliss92/wyze-bridge-js P2P/DTLS client, feeding the stream-broker via the pull-rfc4571 lazy-publish path (a structural twin of addon-provider-reolink)",
5
5
  "keywords": [
6
6
  "camstack",