@camstack/addon-post-analysis 1.2.371 → 1.2.373

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.
@@ -30,7 +30,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
30
30
  }) : target, mod));
31
31
  //#endregion
32
32
  let node_crypto = require("node:crypto");
33
- //#region ../types/dist/event-category-C4hVnRo8.mjs
33
+ //#region ../types/dist/event-category-BvOFi6PY.mjs
34
34
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
35
35
  EventCategory["SystemBoot"] = "system.boot";
36
36
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -94,6 +94,24 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
94
94
  * consumes this category and maps it to the `addon-crash-loop` kind.
95
95
  */
96
96
  EventCategory["AddonRunnerFailed"] = "addon.runner-failed";
97
+ /**
98
+ * A runner whose addon refused to start with a typed reason (D877) - parked
99
+ * in `refused`, never counted by the crash breaker, retried on operator
100
+ * action. One event per refusal.
101
+ */
102
+ EventCategory["AddonRunnerRefused"] = "addon.runner-refused";
103
+ /**
104
+ * A runner settled on a state (D877): `running` (READY), `crashed`, `failed` or
105
+ * `refused`. In-process telemetry for the boot check (re-evaluate while any
106
+ * runner is still pending) and the alert centre (close a recovered runner).
107
+ */
108
+ EventCategory["ProcessStateChanged"] = "process.state-changed";
109
+ /**
110
+ * The node's one-shot runner boot check (D877): planned runners against the
111
+ * process service, `degraded` when any is failed, refused or missing. The
112
+ * alert centre turns it into one alert and a direct critical push.
113
+ */
114
+ EventCategory["SystemRunnerCheck"] = "system.runner-check";
97
115
  EventCategory["AddonError"] = "addon.error";
98
116
  EventCategory["AddonPageReady"] = "addon.page-ready";
99
117
  EventCategory["AddonWidgetReady"] = "addon.widget-ready";
@@ -5490,7 +5508,7 @@ var ZodIssueCode = {
5490
5508
  var ZodFirstPartyTypeKind;
5491
5509
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5492
5510
  //#endregion
5493
- //#region ../types/dist/sleep-DRqxtc0C.mjs
5511
+ //#region ../types/dist/sleep-bgZLodYc.mjs
5494
5512
  /**
5495
5513
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5496
5514
  * window to float samples (D455).
@@ -6741,7 +6759,6 @@ function createHandle(raw, opts) {
6741
6759
  const writeAddon = (patch) => write("addon", opts.addonTree(), void 0, patch, () => readStoredAddonBlob(raw), (p) => raw.writeAddonStore(p));
6742
6760
  const readAddonStoreResult = raw.readAddonStoreResult;
6743
6761
  const readAddonStoreKeyResult = raw.readAddonStoreKeyResult;
6744
- const readDeviceStoreBatch = raw.readDeviceStoreBatch;
6745
6762
  const overrides = {
6746
6763
  readAddonStore: async () => resolveRead("addon", await raw.readAddonStore()),
6747
6764
  ...readAddonStoreResult !== void 0 ? { readAddonStoreResult: async () => {
@@ -6765,12 +6782,12 @@ function createHandle(raw, opts) {
6765
6782
  };
6766
6783
  } } : {},
6767
6784
  readDeviceStore: async (deviceId) => resolveRead(`device:${deviceId}`, await raw.readDeviceStore(deviceId)),
6768
- ...readDeviceStoreBatch !== void 0 ? { readDeviceStoreBatch: async (deviceIds) => {
6769
- const rows = await readDeviceStoreBatch.call(raw, deviceIds);
6785
+ readDeviceStoreBatch: async (deviceIds) => {
6786
+ const rows = await raw.readDeviceStoreBatch(deviceIds);
6770
6787
  const out = /* @__PURE__ */ new Map();
6771
6788
  for (const [deviceId, blob] of rows) out.set(deviceId, await resolveRead(`device:${deviceId}`, blob));
6772
6789
  return out;
6773
- } } : {},
6790
+ },
6774
6791
  writeAddonStore: async (patch) => {
6775
6792
  await writeAddon(patch);
6776
6793
  },
@@ -7597,7 +7614,7 @@ var BaseAddon = class {
7597
7614
  return this._addonSecretTree;
7598
7615
  }
7599
7616
  deviceSecretTree() {
7600
- this._deviceSecretTree ??= secretTreeFromSchema(this.deviceSettingsSchema());
7617
+ this._deviceSecretTree ??= mergeSecretStatePaths(secretTreeFromSchema(this.deviceSettingsSchema()), this.secretStatePaths);
7601
7618
  return this._deviceSecretTree;
7602
7619
  }
7603
7620
  /**
@@ -7673,42 +7690,135 @@ var BaseAddon = class {
7673
7690
  this[timerOf] = timer;
7674
7691
  }
7675
7692
  /**
7676
- * Wrap `ctx.settings.readAddonStore()` with a short retry budget so a
7677
- * transient settings-store outage (mid-restart of sqlite-settings, tsx-watch
7678
- * swap, or any race where the SqliteSettingsBackend is between shutdown and
7679
- * re-initialize) doesn't propagate up into `initialize()` and leave the
7693
+ * Wrap `ctx.settings.readAddonStore()` with a retry budget so a transient
7694
+ * settings-store outage doesn't propagate up into `initialize()` and leave the
7680
7695
  * addon permanently broken.
7681
7696
  *
7682
- * Retry only the two known infra fingerprints. Anything else propagates so
7683
- * real bugs surface immediately. After the budget expires we fall back to
7684
- * `{}` (defaults) — the addon's first successful patch will rehydrate.
7697
+ * Two kinds of outage, two budgets:
7698
+ * - the store's own restart fingerprints (`SqliteSettingsBackend not
7699
+ * initialized`, `provider not available`): a short budget, then the addon
7700
+ * falls back to `{}` (defaults) - its first successful patch rehydrates;
7701
+ * - a TRANSPORT failure (the hub is restarting while this runner boots:
7702
+ * `discovery deadline exceeded`, `parent could not route`, a refused or
7703
+ * timed-out connection). Since D870 a runner's settings read THROWS instead
7704
+ * of answering `{}`, so without a budget a hub restart ends in a respawn
7705
+ * loop. A long, bounded budget; only after it the error propagates - the
7706
+ * addon never runs on defaults for a store it could not ask.
7707
+ * Anything else propagates immediately so real bugs surface.
7685
7708
  */
7686
7709
  async readAddonStoreWithRetry() {
7687
7710
  const settings = this.rawSettings();
7688
7711
  if (!settings) return {};
7689
- const delaysMs = [
7690
- 150,
7691
- 350,
7692
- 600,
7693
- 900
7694
- ];
7695
7712
  let lastErr;
7696
- for (let attempt = 0; attempt <= delaysMs.length; attempt++) try {
7713
+ for (let attempt = 0;; attempt++) try {
7697
7714
  const stored = await settings.readAddonStore() ?? {};
7698
7715
  this.settingsStoreReady = true;
7699
7716
  return stored;
7700
7717
  } catch (err) {
7701
7718
  lastErr = err;
7702
- const msg = err instanceof Error ? err.message : String(err);
7703
- if (!(msg.includes("SqliteSettingsBackend not initialized") || msg.includes("provider not available"))) throw err;
7704
- if (attempt === delaysMs.length) break;
7705
- await new Promise((r) => setTimeout(r, delaysMs[attempt]));
7719
+ const kind = classifyStoreError(err);
7720
+ if (kind === "permanent") throw err;
7721
+ const delay = (kind === "transport" ? TRANSPORT_RETRY_DELAYS_MS : RESTART_RETRY_DELAYS_MS)[attempt];
7722
+ if (delay === void 0) {
7723
+ if (kind === "transport") throw err;
7724
+ break;
7725
+ }
7726
+ await new Promise((r) => setTimeout(r, delay));
7706
7727
  }
7707
7728
  this.settingsStoreReady = false;
7708
7729
  this._ctx?.logger?.warn?.("readAddonStore: settings-store unavailable after retries — using defaults", { meta: { error: lastErr instanceof Error ? lastErr.message : String(lastErr) } });
7709
7730
  return {};
7710
7731
  }
7711
7732
  };
7733
+ /** The settings store's own restart fingerprints. */
7734
+ var RESTART_RETRY_DELAYS_MS = [
7735
+ 150,
7736
+ 350,
7737
+ 600,
7738
+ 900
7739
+ ];
7740
+ /** A hub restarting under a booting runner: ~100 s in total. */
7741
+ var TRANSPORT_RETRY_DELAYS_MS = [
7742
+ 150,
7743
+ 350,
7744
+ 600,
7745
+ 900,
7746
+ 2e3,
7747
+ 5e3,
7748
+ 1e4,
7749
+ 2e4,
7750
+ 3e4,
7751
+ 3e4
7752
+ ];
7753
+ var RESTART_FINGERPRINTS = ["SqliteSettingsBackend not initialized", "provider not available"];
7754
+ /** Node / socket error codes of a connection that did not happen or broke. */
7755
+ var TRANSPORT_CODES = new Set([
7756
+ "ECONNREFUSED",
7757
+ "ECONNRESET",
7758
+ "ETIMEDOUT",
7759
+ "EPIPE",
7760
+ "EHOSTUNREACH",
7761
+ "ENETUNREACH"
7762
+ ]);
7763
+ /** tRPC error codes that mean "the other side is not answering now", not "your call is wrong". */
7764
+ var UNAVAILABLE_TRPC_CODES = new Set([
7765
+ "TIMEOUT",
7766
+ "SERVICE_UNAVAILABLE",
7767
+ "BAD_GATEWAY",
7768
+ "GATEWAY_TIMEOUT"
7769
+ ]);
7770
+ /** The exact phrases OUR transport raises when it cannot reach the hub. */
7771
+ var TRANSPORT_PHRASES = [
7772
+ "discovery deadline exceeded",
7773
+ "parent could not route child unowned cap call",
7774
+ "UDS request timed out after",
7775
+ "channel closed"
7776
+ ];
7777
+ /** Moleculer error `type`s of a call that could not be served right now. */
7778
+ var MOLECULER_TRANSIENT_TYPES = new Set([
7779
+ "REQUEST_TIMEOUT",
7780
+ "SERVICE_NOT_FOUND",
7781
+ "SERVICE_NOT_AVAILABLE",
7782
+ "REQUEST_REJECTED",
7783
+ "BROKER_DISCONNECTED"
7784
+ ]);
7785
+ function stringProp(value, key) {
7786
+ if (typeof value !== "object" || value === null) return void 0;
7787
+ const found = Reflect.get(value, key);
7788
+ return typeof found === "string" ? found : void 0;
7789
+ }
7790
+ /** The code an error carries: its own, its cause's, or a tRPC `data.code`. */
7791
+ function errorCode(err) {
7792
+ const out = {};
7793
+ const cause = typeof err === "object" && err !== null ? Reflect.get(err, "cause") : void 0;
7794
+ const data = typeof err === "object" && err !== null ? Reflect.get(err, "data") : void 0;
7795
+ const node = stringProp(err, "code") ?? stringProp(cause, "code");
7796
+ if (node !== void 0) out.node = node;
7797
+ const trpc = stringProp(data, "code");
7798
+ if (trpc !== void 0) out.trpc = trpc;
7799
+ return out;
7800
+ }
7801
+ /**
7802
+ * Is a settings read failure worth retrying, and with which budget? Only
7803
+ * EXPLICIT signals count: a socket error code, a tRPC "unavailable" code, or
7804
+ * one of the exact phrases our own transport raises. A message that merely
7805
+ * contains "timed out" or "unreachable" is not evidence of anything, and
7806
+ * `settings store not wired` is a wiring bug that retrying cannot fix.
7807
+ */
7808
+ function classifyStoreError(err) {
7809
+ const message = err instanceof Error ? err.message : String(err);
7810
+ if (RESTART_FINGERPRINTS.some((f) => message.includes(f))) return "restart";
7811
+ const code = errorCode(err);
7812
+ if (code.node !== void 0 && TRANSPORT_CODES.has(code.node)) return "transport";
7813
+ if (code.trpc !== void 0 && UNAVAILABLE_TRPC_CODES.has(code.trpc)) return "transport";
7814
+ if (typeof err === "object" && err !== null) {
7815
+ if (Reflect.get(err, "retryable") === true) return "transport";
7816
+ const type = stringProp(err, "type");
7817
+ if (type !== void 0 && MOLECULER_TRANSIENT_TYPES.has(type)) return "transport";
7818
+ }
7819
+ if (TRANSPORT_PHRASES.some((f) => message.includes(f))) return "transport";
7820
+ return "permanent";
7821
+ }
7712
7822
  /**
7713
7823
  * Collect the keys of every field marked `perNode: true`, recursing into
7714
7824
  * layout containers (`group` fields and `sub-tabs` tabs) the same way
@@ -8549,7 +8659,7 @@ function sleep(ms) {
8549
8659
  return new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));
8550
8660
  }
8551
8661
  //#endregion
8552
- //#region ../types/dist/err-msg-DLerKiVO.mjs
8662
+ //#region ../types/dist/err-msg--2RrYiLO.mjs
8553
8663
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
8554
8664
  DeviceType["Camera"] = "camera";
8555
8665
  DeviceType["Hub"] = "hub";
@@ -8818,6 +8928,9 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
8818
8928
  /** Virtual HA toggle (input_boolean.*) — distinguishable from a
8819
8929
  * real Switch device for UI rendering / export adapters. */
8820
8930
  DeviceRole["BinaryHelper"] = "binary-helper";
8931
+ /** A smart plug: a `switch` whose source says it is an outlet (HA
8932
+ * `device_class: outlet`). The Alexa export shows it as a SMARTPLUG. */
8933
+ DeviceRole["Outlet"] = "outlet";
8821
8934
  /** Generic motion / occupancy / moving event source. Distinct from
8822
8935
  * the camera accessory PirSensor role: that one is a camera child;
8823
8936
  * this is a standalone HA / 3rd-party motion sensor. */
@@ -8895,7 +9008,7 @@ function errMsg(err) {
8895
9008
  return String(err);
8896
9009
  }
8897
9010
  //#endregion
8898
- //#region ../types/dist/composition-EQ9Ok0Ee.mjs
9011
+ //#region ../types/dist/composition-DOwQB_Ua.mjs
8899
9012
  /**
8900
9013
  * Deterministic SHA-256 hash of an arbitrary serialisable value. The
8901
9014
  * canonical form sorts object keys alphabetically at every depth so two
@@ -17238,6 +17351,28 @@ id: union([string(), number()]) }), {
17238
17351
  kind: "mutation",
17239
17352
  auth: "admin"
17240
17353
  });
17354
+ /** One table of the settings database. */
17355
+ var StorageTableSchema = object({
17356
+ /** The table's full name, e.g. `recorder:addon-settings` or `addon-device-settings`. */
17357
+ name: string(),
17358
+ /** The owner prefix of a scoped name (`recorder` for `recorder:addon-settings`), else null. */
17359
+ owner: string().nullable(),
17360
+ rows: number().int().nonnegative(),
17361
+ /** Bytes the table's pages occupy (`dbstat`); null when the engine cannot measure. */
17362
+ bytes: number().int().nonnegative().nullable(),
17363
+ /** Declared by an addon since this engine process started (a running addon claims it). */
17364
+ declaredThisBoot: boolean()
17365
+ });
17366
+ method(object({ ownerPrefix: string().min(1).optional() }), object({ tables: array(StorageTableSchema) }), { auth: "admin" }), method(object({
17367
+ collection: string().min(1),
17368
+ expectRows: number().int().nonnegative()
17369
+ }), object({
17370
+ dropped: literal(true),
17371
+ rows: number().int().nonnegative()
17372
+ }), {
17373
+ kind: "mutation",
17374
+ auth: "admin"
17375
+ });
17241
17376
  /**
17242
17377
  * `keychain` — the hub's encrypted store of secret values (D787).
17243
17378
  *
@@ -17779,6 +17914,16 @@ method(object({}), KeychainStatusSchema, { auth: "admin" }), method(object({}),
17779
17914
  kind: "mutation",
17780
17915
  auth: "admin",
17781
17916
  caller: "required"
17917
+ }), method(object({
17918
+ ref: string().min(1),
17919
+ value: string().min(1)
17920
+ }), object({
17921
+ ref: string(),
17922
+ version: number().int()
17923
+ }), {
17924
+ kind: "mutation",
17925
+ auth: "admin",
17926
+ caller: "required"
17782
17927
  }), method(object({ refs: array(string().min(1)).max(1e3) }), object({
17783
17928
  deleted: array(string()).readonly(),
17784
17929
  kept: array(object({
@@ -40372,6 +40517,36 @@ method(LlmRuntimeCompleteInputSchema, LlmGenerateResultSchema, {
40372
40517
  timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
40373
40518
  });
40374
40519
  /**
40520
+ * The report of a one-shot "move this owner's plaintext secrets into the
40521
+ * keychain" run (D878). COUNTS only - never a value, never a ref.
40522
+ *
40523
+ * The owner runs it on its own rows, through its own write path; an operator
40524
+ * script (`scripts/hub/migrate-raw-secrets.ts`) calls the owner's cap method.
40525
+ * Dry run (`apply: false`) reports what WOULD move and changes nothing.
40526
+ */
40527
+ var RawSecretMigrationInputSchema = object({
40528
+ /** `false` (the default of the script) = report only. */
40529
+ apply: boolean() });
40530
+ var RawSecretMigrationReportSchema = object({
40531
+ apply: boolean(),
40532
+ /** Rows that can carry a secret (a profile, an enrolment). */
40533
+ rows: number().int(),
40534
+ /** Rows whose secret was plaintext when the run started. */
40535
+ raw: number().int(),
40536
+ /** Rows that already held a keychain marker when the run started. */
40537
+ markers: number().int(),
40538
+ /** Plaintext rows moved by THIS run (always 0 on a dry run). */
40539
+ migrated: number().int(),
40540
+ /** Plaintext rows left in place because the move or its read-back failed. */
40541
+ failed: number().int(),
40542
+ /** After the run: rows still holding plaintext. */
40543
+ remainingRaw: number().int(),
40544
+ /** After the run: markers the keychain could not resolve right now. */
40545
+ unresolvedMarkers: number().int(),
40546
+ /** True when nothing is raw and every marker resolves. */
40547
+ verified: boolean()
40548
+ });
40549
+ /**
40375
40550
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
40376
40551
  * methods concat-fan across providers; single-row methods route to ONE
40377
40552
  * provider by the `addonId` in the call input (the notification-output
@@ -40556,6 +40731,9 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
40556
40731
  }), _void(), { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
40557
40732
  kind: "mutation",
40558
40733
  auth: "admin"
40734
+ }), method(RawSecretMigrationInputSchema, RawSecretMigrationReportSchema, {
40735
+ kind: "mutation",
40736
+ auth: "admin"
40559
40737
  }), method(ProfileRefInputSchema, _void(), {
40560
40738
  kind: "mutation",
40561
40739
  auth: "admin"
@@ -52887,6 +53065,41 @@ var ServerRollbackInfoSchema = object({
52887
53065
  atMs: number(),
52888
53066
  reason: string()
52889
53067
  });
53068
+ /**
53069
+ * The runner boot check (D877): the runners this node PLANNED (hub: one per
53070
+ * `resolveRunnerId` over its forked addons; agent: the runners its process
53071
+ * service holds, because only the hub plans) against the states the process
53072
+ * service reports. Kept in memory, recomputed by the same one-shot check after
53073
+ * every boot, served on `getServerPackageStatus`.
53074
+ *
53075
+ * `failed` is the D6 breaker's terminal state, `refused` a deterministic Init
53076
+ * refusal (an addon that said "I will not start, and here is why"), `missing` a
53077
+ * planned runner the process service has no entry for.
53078
+ */
53079
+ var RunnerRefusalSchema = object({
53080
+ runnerId: string(),
53081
+ addonIds: array(string()),
53082
+ reason: string()
53083
+ });
53084
+ var RunnerBootCheckSchema = object({
53085
+ checkedAtMs: number(),
53086
+ /** Runners planned for this node. */
53087
+ expected: number(),
53088
+ /** Planned runners whose process is `running`. */
53089
+ running: number(),
53090
+ failed: array(string()),
53091
+ refused: array(RunnerRefusalSchema),
53092
+ missing: array(string()),
53093
+ /**
53094
+ * Runners still on their way: `starting`, or `crashed` waiting on a backoff
53095
+ * respawn. The check is FINAL only when this is empty; until then nothing is
53096
+ * pushed and the verdict is re-evaluated on the next runner state change.
53097
+ * Optional for version skew (absent = settled).
53098
+ */
53099
+ pending: array(string()).optional(),
53100
+ /** True when the plan is the hub's (`missing` is then meaningful); false on an agent. */
53101
+ planKnown: boolean()
53102
+ });
52890
53103
  var ServerPackageStatusSchema = object({
52891
53104
  /** Root package name (`@camstack/server` on the hub). */
52892
53105
  packageName: string(),
@@ -52949,7 +53162,14 @@ var ServerPackageStatusSchema = object({
52949
53162
  * for version skew: an older provider's payload simply omits it, and an
52950
53163
  * absent wrapper is unknown — never `native`.
52951
53164
  */
52952
- wrapper: WrapperIdentitySchema.optional()
53165
+ wrapper: WrapperIdentitySchema.optional(),
53166
+ /**
53167
+ * What this node PLANNED to run against what its process service reports
53168
+ * (D877). Absent until the one-shot boot check has run (~60 s after boot) and
53169
+ * on a provider that predates it. Absent is "not checked yet", never "all
53170
+ * well": a consumer that needs the answer treats it as pending.
53171
+ */
53172
+ runners: RunnerBootCheckSchema.optional()
52953
53173
  });
52954
53174
  var ServerUpdateCheckResultSchema = object({
52955
53175
  packageName: string(),
@@ -53000,6 +53220,13 @@ var ServerUpdateOutcomeSchema = _enum([
53000
53220
  "refused",
53001
53221
  "failed"
53002
53222
  ]);
53223
+ /** One addon the pre-flight found the target version would refuse (D877). */
53224
+ var UpdateBlockerSchema = object({
53225
+ addonId: string(),
53226
+ reason: string(),
53227
+ /** What the operator does about it. */
53228
+ remedy: string()
53229
+ });
53003
53230
  var ServerUpdateActionResultSchema = object({
53004
53231
  accepted: boolean(),
53005
53232
  targetVersion: string().nullable(),
@@ -53017,14 +53244,27 @@ var ServerUpdateActionResultSchema = object({
53017
53244
  * The failure itself, verbatim enough to act on (the npm output for a
53018
53245
  * staging install). Non-null only for `failed`.
53019
53246
  */
53020
- error: string().nullable().optional()
53247
+ error: string().nullable().optional(),
53248
+ /**
53249
+ * The addons the target version would refuse to start on this node's live
53250
+ * store (D877), present when the pre-flight refused the update
53251
+ * (`reason: 'addon-would-refuse'`). Optional for version skew.
53252
+ */
53253
+ blockers: array(UpdateBlockerSchema).optional()
53021
53254
  });
53022
53255
  method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), ServerUpdateCheckResultSchema, {
53023
53256
  kind: "mutation",
53024
53257
  auth: "admin"
53025
- }), method(object({
53026
- /** Explicit target version; omitted = latest from the registry. */
53027
- version: string().optional() }), ServerUpdateActionResultSchema, {
53258
+ }), method(object({
53259
+ /** Explicit target version; omitted = latest from the registry. */
53260
+ version: string().optional(),
53261
+ /**
53262
+ * Apply even though the pre-flight (D877) found addons the target would
53263
+ * refuse to start. Off by default: those addons stay down until the
53264
+ * remedy is run, which is the incident this gate exists to prevent.
53265
+ */
53266
+ acknowledgeRefusals: boolean().optional()
53267
+ }), ServerUpdateActionResultSchema, {
53028
53268
  kind: "mutation",
53029
53269
  auth: "admin",
53030
53270
  timeoutMs: 16 * 6e4
@@ -55504,7 +55744,9 @@ var ManifestShapeSchema = object({
55504
55744
  var AddonProcessSchema = object({
55505
55745
  pid: number().optional(),
55506
55746
  mode: string(),
55507
- state: string()
55747
+ state: string(),
55748
+ /** Why the runner is `refused` (an addon's own words), when it is (D877). */
55749
+ reason: string().optional()
55508
55750
  });
55509
55751
  /**
55510
55752
  * Per-addon health snapshot from the kernel's AddonHealthMonitor.
@@ -56920,6 +57162,12 @@ var ClimateControlStatusSchema = object({
56920
57162
  /** Horizontal louver swing on/off. Null when the device has no
56921
57163
  * horizontal swing surface (gate with `DeviceFeature.ClimateSwingHorizontal`). */
56922
57164
  swingHorizontal: boolean().nullable(),
57165
+ /** Lowest setpoint the device accepts, Celsius. Absent / null = not reported. */
57166
+ minTemp: number().nullable().optional(),
57167
+ /** Highest setpoint the device accepts, Celsius. Absent / null = not reported. */
57168
+ maxTemp: number().nullable().optional(),
57169
+ /** Setpoint granularity, Celsius (0.5, 1). Absent / null = not reported. */
57170
+ tempStep: number().positive().nullable().optional(),
56923
57171
  /** Ms epoch when the slice was last updated (push or command). */
56924
57172
  lastFetchedAt: number()
56925
57173
  });
@@ -66455,7 +66703,11 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
66455
66703
  kind: "mutation",
66456
66704
  auth: "admin",
66457
66705
  access: "delete"
66458
- }), method(object({ userId: string() }), TotpStatusSchema, { auth: "admin" }), method(object({
66706
+ }), method(object({ userId: string() }), TotpStatusSchema, { auth: "admin" }), method(RawSecretMigrationInputSchema, RawSecretMigrationReportSchema, {
66707
+ kind: "mutation",
66708
+ auth: "admin",
66709
+ access: "create"
66710
+ }), method(object({
66459
66711
  userId: string(),
66460
66712
  code: string()
66461
66713
  }), object({ valid: boolean() }), {
@@ -71843,6 +72095,12 @@ Object.freeze({
71843
72095
  addonId: null,
71844
72096
  access: "create"
71845
72097
  },
72098
+ "keychainAdmin.importSecret": {
72099
+ capName: "keychain-admin",
72100
+ capScope: "system",
72101
+ addonId: null,
72102
+ access: "create"
72103
+ },
71846
72104
  "keychainAdmin.listAudit": {
71847
72105
  capName: "keychain-admin",
71848
72106
  capScope: "system",
@@ -72011,6 +72269,12 @@ Object.freeze({
72011
72269
  addonId: null,
72012
72270
  access: "view"
72013
72271
  },
72272
+ "llm.migrateRawSecrets": {
72273
+ capName: "llm",
72274
+ capScope: "system",
72275
+ addonId: null,
72276
+ access: "create"
72277
+ },
72014
72278
  "llm.resolveModelRef": {
72015
72279
  capName: "llm",
72016
72280
  capScope: "system",
@@ -75629,6 +75893,18 @@ Object.freeze({
75629
75893
  addonId: null,
75630
75894
  access: "create"
75631
75895
  },
75896
+ "storageAdmin.dropCollection": {
75897
+ capName: "storage-admin",
75898
+ capScope: "system",
75899
+ addonId: null,
75900
+ access: "delete"
75901
+ },
75902
+ "storageAdmin.listTables": {
75903
+ capName: "storage-admin",
75904
+ capScope: "system",
75905
+ addonId: null,
75906
+ access: "view"
75907
+ },
75632
75908
  "storageEvictable.evict": {
75633
75909
  capName: "storage-evictable",
75634
75910
  capScope: "system",
@@ -76541,6 +76817,12 @@ Object.freeze({
76541
76817
  addonId: null,
76542
76818
  access: "view"
76543
76819
  },
76820
+ "userManagement.migrateRawSecrets": {
76821
+ capName: "user-management",
76822
+ capScope: "system",
76823
+ addonId: null,
76824
+ access: "create"
76825
+ },
76544
76826
  "userManagement.oauthExchangeCode": {
76545
76827
  capName: "user-management",
76546
76828
  capScope: "system",