@camstack/addon-tailscale 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.
@@ -24,7 +24,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
24
  enumerable: true
25
25
  }) : target, mod));
26
26
  //#endregion
27
- const require_dist = require("../dist-BYSC8bJK.js");
27
+ const require_dist = require("../dist-BmbP0N1f.js");
28
28
  let node_child_process = require("node:child_process");
29
29
  let node_util = require("node:util");
30
30
  let node_fs = require("node:fs");
@@ -1,4 +1,4 @@
1
- import { a as EventCategory, i as BaseAddon, n as networkAccessCapability, r as BOOT_RECOVERY_BACKOFF_MS, t as meshNetworkCapability } from "../dist-COyLQeD1.mjs";
1
+ import { a as EventCategory, i as BaseAddon, n as networkAccessCapability, r as BOOT_RECOVERY_BACKOFF_MS, t as meshNetworkCapability } from "../dist-DSSjHdog.mjs";
2
2
  import { execFile, spawn } from "node:child_process";
3
3
  import { promisify } from "node:util";
4
4
  import * as fs from "node:fs";
@@ -7735,7 +7735,8 @@ var OpsLogReasonSchema = _enum([
7735
7735
  "quota",
7736
7736
  "manual",
7737
7737
  "operator",
7738
- "maintenance"
7738
+ "maintenance",
7739
+ "orphaned-device"
7739
7740
  ]);
7740
7741
  /** One audit row, shared verbatim by both domains. */
7741
7742
  var OpsLogEntrySchema = object({
@@ -12766,10 +12767,39 @@ var DevicePersistConfigPayloadSchema = object({
12766
12767
  deviceId: number(),
12767
12768
  data: record(string(), unknown())
12768
12769
  });
12770
+ /** What a migration actually did, per switch. `unreachable` is a first-class
12771
+ * answer: a camera that could not be asked is not a camera that was silenced. */
12772
+ var MigrateSwitchOutcomeSchema = _enum([
12773
+ "off",
12774
+ "on",
12775
+ "not-offered",
12776
+ "unreachable"
12777
+ ]);
12778
+ var MigrateSwitchReportSchema = object({
12779
+ deviceId: number(),
12780
+ switchId: CameraSwitchIdSchema,
12781
+ outcome: MigrateSwitchOutcomeSchema,
12782
+ detail: string().optional()
12783
+ });
12784
+ var MigrateDeviceResultSchema = object({
12785
+ sourceId: number(),
12786
+ targetId: number(),
12787
+ switches: array(MigrateSwitchReportSchema).readonly(),
12788
+ /** Switches that could NOT be turned off on the source. Empty is the only
12789
+ * value meaning the replaced hardware is quiet. */
12790
+ sourceStillLive: array(CameraSwitchIdSchema).readonly(),
12791
+ swapped: boolean()
12792
+ });
12769
12793
  method(object({
12770
12794
  addonId: string(),
12771
12795
  stableId: string()
12772
- }), 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({
12796
+ }), object({ id: number() }), { kind: "mutation" }), method(object({
12797
+ sourceId: number(),
12798
+ targetId: number()
12799
+ }), MigrateDeviceResultSchema, {
12800
+ kind: "mutation",
12801
+ auth: "admin"
12802
+ }), 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({
12773
12803
  deviceId: number(),
12774
12804
  name: string()
12775
12805
  }), _void(), {
@@ -13244,6 +13274,35 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
13244
13274
  auth: "admin"
13245
13275
  });
13246
13276
  /**
13277
+ * Transport bounds for AI capability methods.
13278
+ *
13279
+ * Its own module because `llm.cap.ts` and `llm-runtime.cap.ts` already import
13280
+ * each other: declaring the constant in either one hands the other `undefined`
13281
+ * at module-init time, and an undefined `timeoutMs` silently falls back to the
13282
+ * kernel's 60 s default — the exact failure this constant exists to prevent,
13283
+ * reintroduced invisibly. Found by the guard, not by review.
13284
+ */
13285
+ /**
13286
+ * Ceiling for a cap method that runs inference or loads a model.
13287
+ *
13288
+ * Deliberately far above anything the AI layer itself may wait for (a summary
13289
+ * asks 180 s by default, a rule may ask 600 s), because the TRANSPORT must
13290
+ * never be the layer that gives up first: when it does, the failure is
13291
+ * reported as a transport error for a model that was still thinking, naming
13292
+ * the wrong layer and hiding the real one.
13293
+ *
13294
+ * Measured 2026-09-03: a 6-image vision request needs 44.8 s warm and ~20 s
13295
+ * more on a cold model load. With no declaration every digest failed at
13296
+ * exactly 60 s and shipped without its text.
13297
+ *
13298
+ * A ceiling, not a budget. The AI layer's own timeouts (the rule's `timeoutMs`,
13299
+ * the profile's `timeoutMs` / `firstTokenTimeoutMs`) remain the things that
13300
+ * decide when to stop, because only they can say WHY.
13301
+ */
13302
+ var AI_CAP_TRANSPORT_TIMEOUT_MS = 6e5;
13303
+ /** A multi-gigabyte download. An hour is not generous, it is honest. */
13304
+ var AI_MODEL_INSTALL_TIMEOUT_MS = 60 * 6e4;
13305
+ /**
13247
13306
  * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
13248
13307
  * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
13249
13308
  * caps stay wire-compatible without a circular cap→cap import.
@@ -13515,16 +13574,19 @@ method(LlmGenerateBaseInputSchema.extend({
13515
13574
  timeoutMs: number().int().positive().optional()
13516
13575
  }), LlmGenerateResultSchema, {
13517
13576
  kind: "mutation",
13518
- auth: "admin"
13577
+ auth: "admin",
13578
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13519
13579
  }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13520
13580
  kind: "mutation",
13521
- auth: "admin"
13581
+ auth: "admin",
13582
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13522
13583
  }), method(object({}), _void(), {
13523
13584
  kind: "mutation",
13524
13585
  auth: "admin"
13525
13586
  }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13526
13587
  kind: "mutation",
13527
- auth: "admin"
13588
+ auth: "admin",
13589
+ timeoutMs: AI_MODEL_INSTALL_TIMEOUT_MS
13528
13590
  }), method(object({ file: string() }), _void(), {
13529
13591
  kind: "mutation",
13530
13592
  auth: "admin"
@@ -13692,7 +13754,13 @@ var ProfileRefInputSchema = object({
13692
13754
  addonId: string(),
13693
13755
  profileId: string()
13694
13756
  });
13695
- method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({
13757
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
13758
+ kind: "mutation",
13759
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13760
+ }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, {
13761
+ kind: "mutation",
13762
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13763
+ }), method(object({
13696
13764
  addonId: string().optional(),
13697
13765
  requestId: string()
13698
13766
  }), _void(), { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
@@ -13703,7 +13771,8 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }
13703
13771
  auth: "admin"
13704
13772
  }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
13705
13773
  kind: "mutation",
13706
- auth: "admin"
13774
+ auth: "admin",
13775
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13707
13776
  }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
13708
13777
  selector: LlmDefaultSelectorSchema,
13709
13778
  profileId: string().nullable()
@@ -30350,6 +30419,12 @@ Object.freeze({
30350
30419
  addonId: null,
30351
30420
  access: "view"
30352
30421
  },
30422
+ "deviceManager.migrateDevice": {
30423
+ capName: "device-manager",
30424
+ capScope: "system",
30425
+ addonId: null,
30426
+ access: "create"
30427
+ },
30353
30428
  "deviceManager.persistConfig": {
30354
30429
  capName: "device-manager",
30355
30430
  capScope: "system",
@@ -7735,7 +7735,8 @@ var OpsLogReasonSchema = _enum([
7735
7735
  "quota",
7736
7736
  "manual",
7737
7737
  "operator",
7738
- "maintenance"
7738
+ "maintenance",
7739
+ "orphaned-device"
7739
7740
  ]);
7740
7741
  /** One audit row, shared verbatim by both domains. */
7741
7742
  var OpsLogEntrySchema = object({
@@ -12766,10 +12767,39 @@ var DevicePersistConfigPayloadSchema = object({
12766
12767
  deviceId: number(),
12767
12768
  data: record(string(), unknown())
12768
12769
  });
12770
+ /** What a migration actually did, per switch. `unreachable` is a first-class
12771
+ * answer: a camera that could not be asked is not a camera that was silenced. */
12772
+ var MigrateSwitchOutcomeSchema = _enum([
12773
+ "off",
12774
+ "on",
12775
+ "not-offered",
12776
+ "unreachable"
12777
+ ]);
12778
+ var MigrateSwitchReportSchema = object({
12779
+ deviceId: number(),
12780
+ switchId: CameraSwitchIdSchema,
12781
+ outcome: MigrateSwitchOutcomeSchema,
12782
+ detail: string().optional()
12783
+ });
12784
+ var MigrateDeviceResultSchema = object({
12785
+ sourceId: number(),
12786
+ targetId: number(),
12787
+ switches: array(MigrateSwitchReportSchema).readonly(),
12788
+ /** Switches that could NOT be turned off on the source. Empty is the only
12789
+ * value meaning the replaced hardware is quiet. */
12790
+ sourceStillLive: array(CameraSwitchIdSchema).readonly(),
12791
+ swapped: boolean()
12792
+ });
12769
12793
  method(object({
12770
12794
  addonId: string(),
12771
12795
  stableId: string()
12772
- }), 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({
12796
+ }), object({ id: number() }), { kind: "mutation" }), method(object({
12797
+ sourceId: number(),
12798
+ targetId: number()
12799
+ }), MigrateDeviceResultSchema, {
12800
+ kind: "mutation",
12801
+ auth: "admin"
12802
+ }), 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({
12773
12803
  deviceId: number(),
12774
12804
  name: string()
12775
12805
  }), _void(), {
@@ -13244,6 +13274,35 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
13244
13274
  auth: "admin"
13245
13275
  });
13246
13276
  /**
13277
+ * Transport bounds for AI capability methods.
13278
+ *
13279
+ * Its own module because `llm.cap.ts` and `llm-runtime.cap.ts` already import
13280
+ * each other: declaring the constant in either one hands the other `undefined`
13281
+ * at module-init time, and an undefined `timeoutMs` silently falls back to the
13282
+ * kernel's 60 s default — the exact failure this constant exists to prevent,
13283
+ * reintroduced invisibly. Found by the guard, not by review.
13284
+ */
13285
+ /**
13286
+ * Ceiling for a cap method that runs inference or loads a model.
13287
+ *
13288
+ * Deliberately far above anything the AI layer itself may wait for (a summary
13289
+ * asks 180 s by default, a rule may ask 600 s), because the TRANSPORT must
13290
+ * never be the layer that gives up first: when it does, the failure is
13291
+ * reported as a transport error for a model that was still thinking, naming
13292
+ * the wrong layer and hiding the real one.
13293
+ *
13294
+ * Measured 2026-09-03: a 6-image vision request needs 44.8 s warm and ~20 s
13295
+ * more on a cold model load. With no declaration every digest failed at
13296
+ * exactly 60 s and shipped without its text.
13297
+ *
13298
+ * A ceiling, not a budget. The AI layer's own timeouts (the rule's `timeoutMs`,
13299
+ * the profile's `timeoutMs` / `firstTokenTimeoutMs`) remain the things that
13300
+ * decide when to stop, because only they can say WHY.
13301
+ */
13302
+ var AI_CAP_TRANSPORT_TIMEOUT_MS = 6e5;
13303
+ /** A multi-gigabyte download. An hour is not generous, it is honest. */
13304
+ var AI_MODEL_INSTALL_TIMEOUT_MS = 60 * 6e4;
13305
+ /**
13247
13306
  * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
13248
13307
  * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
13249
13308
  * caps stay wire-compatible without a circular cap→cap import.
@@ -13515,16 +13574,19 @@ method(LlmGenerateBaseInputSchema.extend({
13515
13574
  timeoutMs: number().int().positive().optional()
13516
13575
  }), LlmGenerateResultSchema, {
13517
13576
  kind: "mutation",
13518
- auth: "admin"
13577
+ auth: "admin",
13578
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13519
13579
  }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13520
13580
  kind: "mutation",
13521
- auth: "admin"
13581
+ auth: "admin",
13582
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13522
13583
  }), method(object({}), _void(), {
13523
13584
  kind: "mutation",
13524
13585
  auth: "admin"
13525
13586
  }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13526
13587
  kind: "mutation",
13527
- auth: "admin"
13588
+ auth: "admin",
13589
+ timeoutMs: AI_MODEL_INSTALL_TIMEOUT_MS
13528
13590
  }), method(object({ file: string() }), _void(), {
13529
13591
  kind: "mutation",
13530
13592
  auth: "admin"
@@ -13692,7 +13754,13 @@ var ProfileRefInputSchema = object({
13692
13754
  addonId: string(),
13693
13755
  profileId: string()
13694
13756
  });
13695
- method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({
13757
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
13758
+ kind: "mutation",
13759
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13760
+ }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, {
13761
+ kind: "mutation",
13762
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13763
+ }), method(object({
13696
13764
  addonId: string().optional(),
13697
13765
  requestId: string()
13698
13766
  }), _void(), { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
@@ -13703,7 +13771,8 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }
13703
13771
  auth: "admin"
13704
13772
  }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
13705
13773
  kind: "mutation",
13706
- auth: "admin"
13774
+ auth: "admin",
13775
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13707
13776
  }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
13708
13777
  selector: LlmDefaultSelectorSchema,
13709
13778
  profileId: string().nullable()
@@ -30350,6 +30419,12 @@ Object.freeze({
30350
30419
  addonId: null,
30351
30420
  access: "view"
30352
30421
  },
30422
+ "deviceManager.migrateDevice": {
30423
+ capName: "device-manager",
30424
+ capScope: "system",
30425
+ addonId: null,
30426
+ access: "create"
30427
+ },
30353
30428
  "deviceManager.persistConfig": {
30354
30429
  capName: "device-manager",
30355
30430
  capScope: "system",
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-BYSC8bJK.js");
5
+ const require_dist = require("../dist-BmbP0N1f.js");
6
6
  let node_crypto = require("node:crypto");
7
7
  let node_child_process = require("node:child_process");
8
8
  //#region src/ingress/tailscale-cli.ts
@@ -1,4 +1,4 @@
1
- import { a as EventCategory, i as BaseAddon, n as networkAccessCapability } from "../dist-COyLQeD1.mjs";
1
+ import { a as EventCategory, i as BaseAddon, n as networkAccessCapability } from "../dist-DSSjHdog.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { execFile } from "node:child_process";
4
4
  import { promisify } from "node:util";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-tailscale",
3
- "version": "1.2.52",
3
+ "version": "1.2.55",
4
4
  "description": "Tailscale bundle for CamStack — joins the host to a tailnet (client) and exposes the hub via Serve/Funnel (ingress). Multi-entry npm package shipping 2 addons under a single bundle.",
5
5
  "keywords": [
6
6
  "camstack",