@camstack/addon-provider-rademacher 0.2.51 → 0.2.54

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
@@ -8703,7 +8703,8 @@ var OpsLogReasonSchema = _enum([
8703
8703
  "quota",
8704
8704
  "manual",
8705
8705
  "operator",
8706
- "maintenance"
8706
+ "maintenance",
8707
+ "orphaned-device"
8707
8708
  ]);
8708
8709
  /** One audit row, shared verbatim by both domains. */
8709
8710
  var OpsLogEntrySchema = object({
@@ -13998,10 +13999,39 @@ var DevicePersistConfigPayloadSchema = object({
13998
13999
  deviceId: number(),
13999
14000
  data: record(string(), unknown())
14000
14001
  });
14002
+ /** What a migration actually did, per switch. `unreachable` is a first-class
14003
+ * answer: a camera that could not be asked is not a camera that was silenced. */
14004
+ var MigrateSwitchOutcomeSchema = _enum([
14005
+ "off",
14006
+ "on",
14007
+ "not-offered",
14008
+ "unreachable"
14009
+ ]);
14010
+ var MigrateSwitchReportSchema = object({
14011
+ deviceId: number(),
14012
+ switchId: CameraSwitchIdSchema,
14013
+ outcome: MigrateSwitchOutcomeSchema,
14014
+ detail: string().optional()
14015
+ });
14016
+ var MigrateDeviceResultSchema = object({
14017
+ sourceId: number(),
14018
+ targetId: number(),
14019
+ switches: array(MigrateSwitchReportSchema).readonly(),
14020
+ /** Switches that could NOT be turned off on the source. Empty is the only
14021
+ * value meaning the replaced hardware is quiet. */
14022
+ sourceStillLive: array(CameraSwitchIdSchema).readonly(),
14023
+ swapped: boolean()
14024
+ });
14001
14025
  method(object({
14002
14026
  addonId: string(),
14003
14027
  stableId: string()
14004
- }), 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({
14028
+ }), object({ id: number() }), { kind: "mutation" }), method(object({
14029
+ sourceId: number(),
14030
+ targetId: number()
14031
+ }), MigrateDeviceResultSchema, {
14032
+ kind: "mutation",
14033
+ auth: "admin"
14034
+ }), 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({
14005
14035
  deviceId: number(),
14006
14036
  name: string()
14007
14037
  }), _void(), {
@@ -14476,6 +14506,35 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
14476
14506
  auth: "admin"
14477
14507
  });
14478
14508
  /**
14509
+ * Transport bounds for AI capability methods.
14510
+ *
14511
+ * Its own module because `llm.cap.ts` and `llm-runtime.cap.ts` already import
14512
+ * each other: declaring the constant in either one hands the other `undefined`
14513
+ * at module-init time, and an undefined `timeoutMs` silently falls back to the
14514
+ * kernel's 60 s default — the exact failure this constant exists to prevent,
14515
+ * reintroduced invisibly. Found by the guard, not by review.
14516
+ */
14517
+ /**
14518
+ * Ceiling for a cap method that runs inference or loads a model.
14519
+ *
14520
+ * Deliberately far above anything the AI layer itself may wait for (a summary
14521
+ * asks 180 s by default, a rule may ask 600 s), because the TRANSPORT must
14522
+ * never be the layer that gives up first: when it does, the failure is
14523
+ * reported as a transport error for a model that was still thinking, naming
14524
+ * the wrong layer and hiding the real one.
14525
+ *
14526
+ * Measured 2026-09-03: a 6-image vision request needs 44.8 s warm and ~20 s
14527
+ * more on a cold model load. With no declaration every digest failed at
14528
+ * exactly 60 s and shipped without its text.
14529
+ *
14530
+ * A ceiling, not a budget. The AI layer's own timeouts (the rule's `timeoutMs`,
14531
+ * the profile's `timeoutMs` / `firstTokenTimeoutMs`) remain the things that
14532
+ * decide when to stop, because only they can say WHY.
14533
+ */
14534
+ var AI_CAP_TRANSPORT_TIMEOUT_MS = 6e5;
14535
+ /** A multi-gigabyte download. An hour is not generous, it is honest. */
14536
+ var AI_MODEL_INSTALL_TIMEOUT_MS = 60 * 6e4;
14537
+ /**
14479
14538
  * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
14480
14539
  * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
14481
14540
  * caps stay wire-compatible without a circular cap→cap import.
@@ -14747,16 +14806,19 @@ method(LlmGenerateBaseInputSchema.extend({
14747
14806
  timeoutMs: number().int().positive().optional()
14748
14807
  }), LlmGenerateResultSchema, {
14749
14808
  kind: "mutation",
14750
- auth: "admin"
14809
+ auth: "admin",
14810
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14751
14811
  }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
14752
14812
  kind: "mutation",
14753
- auth: "admin"
14813
+ auth: "admin",
14814
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14754
14815
  }), method(object({}), _void(), {
14755
14816
  kind: "mutation",
14756
14817
  auth: "admin"
14757
14818
  }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
14758
14819
  kind: "mutation",
14759
- auth: "admin"
14820
+ auth: "admin",
14821
+ timeoutMs: AI_MODEL_INSTALL_TIMEOUT_MS
14760
14822
  }), method(object({ file: string() }), _void(), {
14761
14823
  kind: "mutation",
14762
14824
  auth: "admin"
@@ -14924,7 +14986,13 @@ var ProfileRefInputSchema = object({
14924
14986
  addonId: string(),
14925
14987
  profileId: string()
14926
14988
  });
14927
- method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({
14989
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
14990
+ kind: "mutation",
14991
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14992
+ }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, {
14993
+ kind: "mutation",
14994
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14995
+ }), method(object({
14928
14996
  addonId: string().optional(),
14929
14997
  requestId: string()
14930
14998
  }), _void(), { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
@@ -14935,7 +15003,8 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }
14935
15003
  auth: "admin"
14936
15004
  }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
14937
15005
  kind: "mutation",
14938
- auth: "admin"
15006
+ auth: "admin",
15007
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14939
15008
  }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
14940
15009
  selector: LlmDefaultSelectorSchema,
14941
15010
  profileId: string().nullable()
@@ -34996,6 +35065,12 @@ Object.freeze({
34996
35065
  addonId: null,
34997
35066
  access: "view"
34998
35067
  },
35068
+ "deviceManager.migrateDevice": {
35069
+ capName: "device-manager",
35070
+ capScope: "system",
35071
+ addonId: null,
35072
+ access: "create"
35073
+ },
34999
35074
  "deviceManager.persistConfig": {
35000
35075
  capName: "device-manager",
35001
35076
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -8702,7 +8702,8 @@ var OpsLogReasonSchema = _enum([
8702
8702
  "quota",
8703
8703
  "manual",
8704
8704
  "operator",
8705
- "maintenance"
8705
+ "maintenance",
8706
+ "orphaned-device"
8706
8707
  ]);
8707
8708
  /** One audit row, shared verbatim by both domains. */
8708
8709
  var OpsLogEntrySchema = object({
@@ -13997,10 +13998,39 @@ var DevicePersistConfigPayloadSchema = object({
13997
13998
  deviceId: number(),
13998
13999
  data: record(string(), unknown())
13999
14000
  });
14001
+ /** What a migration actually did, per switch. `unreachable` is a first-class
14002
+ * answer: a camera that could not be asked is not a camera that was silenced. */
14003
+ var MigrateSwitchOutcomeSchema = _enum([
14004
+ "off",
14005
+ "on",
14006
+ "not-offered",
14007
+ "unreachable"
14008
+ ]);
14009
+ var MigrateSwitchReportSchema = object({
14010
+ deviceId: number(),
14011
+ switchId: CameraSwitchIdSchema,
14012
+ outcome: MigrateSwitchOutcomeSchema,
14013
+ detail: string().optional()
14014
+ });
14015
+ var MigrateDeviceResultSchema = object({
14016
+ sourceId: number(),
14017
+ targetId: number(),
14018
+ switches: array(MigrateSwitchReportSchema).readonly(),
14019
+ /** Switches that could NOT be turned off on the source. Empty is the only
14020
+ * value meaning the replaced hardware is quiet. */
14021
+ sourceStillLive: array(CameraSwitchIdSchema).readonly(),
14022
+ swapped: boolean()
14023
+ });
14000
14024
  method(object({
14001
14025
  addonId: string(),
14002
14026
  stableId: string()
14003
- }), 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({
14027
+ }), object({ id: number() }), { kind: "mutation" }), method(object({
14028
+ sourceId: number(),
14029
+ targetId: number()
14030
+ }), MigrateDeviceResultSchema, {
14031
+ kind: "mutation",
14032
+ auth: "admin"
14033
+ }), 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({
14004
14034
  deviceId: number(),
14005
14035
  name: string()
14006
14036
  }), _void(), {
@@ -14475,6 +14505,35 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
14475
14505
  auth: "admin"
14476
14506
  });
14477
14507
  /**
14508
+ * Transport bounds for AI capability methods.
14509
+ *
14510
+ * Its own module because `llm.cap.ts` and `llm-runtime.cap.ts` already import
14511
+ * each other: declaring the constant in either one hands the other `undefined`
14512
+ * at module-init time, and an undefined `timeoutMs` silently falls back to the
14513
+ * kernel's 60 s default — the exact failure this constant exists to prevent,
14514
+ * reintroduced invisibly. Found by the guard, not by review.
14515
+ */
14516
+ /**
14517
+ * Ceiling for a cap method that runs inference or loads a model.
14518
+ *
14519
+ * Deliberately far above anything the AI layer itself may wait for (a summary
14520
+ * asks 180 s by default, a rule may ask 600 s), because the TRANSPORT must
14521
+ * never be the layer that gives up first: when it does, the failure is
14522
+ * reported as a transport error for a model that was still thinking, naming
14523
+ * the wrong layer and hiding the real one.
14524
+ *
14525
+ * Measured 2026-09-03: a 6-image vision request needs 44.8 s warm and ~20 s
14526
+ * more on a cold model load. With no declaration every digest failed at
14527
+ * exactly 60 s and shipped without its text.
14528
+ *
14529
+ * A ceiling, not a budget. The AI layer's own timeouts (the rule's `timeoutMs`,
14530
+ * the profile's `timeoutMs` / `firstTokenTimeoutMs`) remain the things that
14531
+ * decide when to stop, because only they can say WHY.
14532
+ */
14533
+ var AI_CAP_TRANSPORT_TIMEOUT_MS = 6e5;
14534
+ /** A multi-gigabyte download. An hour is not generous, it is honest. */
14535
+ var AI_MODEL_INSTALL_TIMEOUT_MS = 60 * 6e4;
14536
+ /**
14478
14537
  * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
14479
14538
  * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
14480
14539
  * caps stay wire-compatible without a circular cap→cap import.
@@ -14746,16 +14805,19 @@ method(LlmGenerateBaseInputSchema.extend({
14746
14805
  timeoutMs: number().int().positive().optional()
14747
14806
  }), LlmGenerateResultSchema, {
14748
14807
  kind: "mutation",
14749
- auth: "admin"
14808
+ auth: "admin",
14809
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14750
14810
  }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
14751
14811
  kind: "mutation",
14752
- auth: "admin"
14812
+ auth: "admin",
14813
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14753
14814
  }), method(object({}), _void(), {
14754
14815
  kind: "mutation",
14755
14816
  auth: "admin"
14756
14817
  }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
14757
14818
  kind: "mutation",
14758
- auth: "admin"
14819
+ auth: "admin",
14820
+ timeoutMs: AI_MODEL_INSTALL_TIMEOUT_MS
14759
14821
  }), method(object({ file: string() }), _void(), {
14760
14822
  kind: "mutation",
14761
14823
  auth: "admin"
@@ -14923,7 +14985,13 @@ var ProfileRefInputSchema = object({
14923
14985
  addonId: string(),
14924
14986
  profileId: string()
14925
14987
  });
14926
- method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({
14988
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
14989
+ kind: "mutation",
14990
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14991
+ }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, {
14992
+ kind: "mutation",
14993
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14994
+ }), method(object({
14927
14995
  addonId: string().optional(),
14928
14996
  requestId: string()
14929
14997
  }), _void(), { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
@@ -14934,7 +15002,8 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }
14934
15002
  auth: "admin"
14935
15003
  }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
14936
15004
  kind: "mutation",
14937
- auth: "admin"
15005
+ auth: "admin",
15006
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
14938
15007
  }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
14939
15008
  selector: LlmDefaultSelectorSchema,
14940
15009
  profileId: string().nullable()
@@ -34995,6 +35064,12 @@ Object.freeze({
34995
35064
  addonId: null,
34996
35065
  access: "view"
34997
35066
  },
35067
+ "deviceManager.migrateDevice": {
35068
+ capName: "device-manager",
35069
+ capScope: "system",
35070
+ addonId: null,
35071
+ access: "create"
35072
+ },
34998
35073
  "deviceManager.persistConfig": {
34999
35074
  capName: "device-manager",
35000
35075
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-rademacher",
3
- "version": "0.2.51",
3
+ "version": "0.2.54",
4
4
  "description": "Rademacher HomePilot device-provider addon for CamStack — wraps the @apocaliss92/noderademacher local-hub client (roller shutters over the cover cap)",
5
5
  "keywords": [
6
6
  "camstack",