@camstack/system 1.2.304 → 1.2.306

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.
Files changed (72) hide show
  1. package/dist/addon-runner.js +1 -1
  2. package/dist/addon-runner.mjs +1 -1
  3. package/dist/addon-utils.d.ts +1 -1
  4. package/dist/addon-utils.js +3 -1
  5. package/dist/addon-utils.mjs +2 -2
  6. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  7. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  8. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  9. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  10. package/dist/builtins/alerts/alerts.addon.js +1 -1
  11. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  12. package/dist/builtins/autotrack/index.js +1 -1
  13. package/dist/builtins/autotrack/index.mjs +1 -1
  14. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +1 -1
  15. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
  16. package/dist/builtins/camera-grid/index.js +1 -1
  17. package/dist/builtins/camera-grid/index.mjs +1 -1
  18. package/dist/builtins/console-logging/index.js +1 -1
  19. package/dist/builtins/console-logging/index.mjs +1 -1
  20. package/dist/builtins/core-blocks/core-blocks.addon.js +1 -1
  21. package/dist/builtins/core-blocks/core-blocks.addon.mjs +1 -1
  22. package/dist/builtins/device-manager/device-extension-linked-slot.d.ts +27 -0
  23. package/dist/builtins/device-manager/device-linked-devices.d.ts +55 -13
  24. package/dist/builtins/device-manager/device-manager.addon.js +324 -136
  25. package/dist/builtins/device-manager/device-manager.addon.mjs +324 -136
  26. package/dist/builtins/doorbell/binding-mirror.d.ts +37 -7
  27. package/dist/builtins/doorbell/doorbell-extension-slot.d.ts +66 -0
  28. package/dist/builtins/doorbell/virtual-doorbell.addon.d.ts +17 -36
  29. package/dist/builtins/doorbell/virtual-doorbell.addon.js +320 -124
  30. package/dist/builtins/doorbell/virtual-doorbell.addon.mjs +320 -124
  31. package/dist/builtins/hub-forwarder/index.js +1 -1
  32. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  33. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  34. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  35. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  36. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  37. package/dist/builtins/local-network/local-network.addon.js +1 -1
  38. package/dist/builtins/local-network/local-network.addon.mjs +1 -1
  39. package/dist/builtins/loki-logging/index.js +1 -1
  40. package/dist/builtins/loki-logging/index.mjs +1 -1
  41. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  42. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  43. package/dist/builtins/platform-probe/index.js +1 -1
  44. package/dist/builtins/platform-probe/index.mjs +1 -1
  45. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  46. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  47. package/dist/builtins/snapshot/index.js +1 -1
  48. package/dist/builtins/snapshot/index.mjs +1 -1
  49. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  50. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  51. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +0 -0
  52. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +0 -0
  53. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  54. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  55. package/dist/builtins/system-config/system-config.addon.js +1 -1
  56. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  57. package/dist/builtins/winston-logging/index.js +1 -1
  58. package/dist/builtins/winston-logging/index.mjs +1 -1
  59. package/dist/{child-cap-dispatch-C1c3rWaX.mjs → child-cap-dispatch-BCJjUtXV.mjs} +9 -1
  60. package/dist/{child-cap-dispatch-De5_HcvR.js → child-cap-dispatch-Be8e2cBP.js} +9 -1
  61. package/dist/{dist-Duqf80QM.mjs → dist-CLfJMMdf.mjs} +1056 -349
  62. package/dist/{dist-C571Y95Z.js → dist-vecbhDzu.js} +1079 -354
  63. package/dist/download/model-downloader.d.ts +15 -0
  64. package/dist/{event-loop-stall-monitor-GPrVvx14.mjs → event-loop-stall-monitor-EXjzIxDz.mjs} +25 -3
  65. package/dist/{event-loop-stall-monitor-CAsHdMwP.js → event-loop-stall-monitor-ey4mbofz.js} +36 -2
  66. package/dist/index.js +21 -3
  67. package/dist/index.mjs +21 -3
  68. package/dist/kernel/config-manager.d.ts +3 -1
  69. package/dist/{retired-settings-keys-0j8rNoa8.js → retired-settings-keys-Bm2p0Rot.js} +1 -1
  70. package/dist/{retired-settings-keys-CeO_dBHU.mjs → retired-settings-keys-C1ODcdnr.mjs} +1 -1
  71. package/package.json +7 -1
  72. package/dist/builtins/device-manager/device-store-sections.d.ts +0 -26
@@ -24,6 +24,21 @@ export declare function siblingUrl(mainUrl: string, sibling: string): string;
24
24
  */
25
25
  export declare function collectModelFiles(entry: ModelCatalogEntry, format: ModelFormat): string[];
26
26
  export type DownloadRedirectPolicy = (url: URL, hop: number) => void;
27
+ /**
28
+ * A download that the server ANSWERED with a non-2xx status. Typed so a caller
29
+ * can tell "the file is not there" (404/410 — nothing a retry changes) from
30
+ * "the server was unreachable" by the STATUS, never by matching the message:
31
+ * the embedding encoder's requirements gate (D649) sends the first to a
32
+ * terminal state after a bounded number of attempts and only cools down on
33
+ * the second.
34
+ */
35
+ export declare class ModelDownloadHttpError extends Error {
36
+ readonly status: number;
37
+ readonly url: string;
38
+ constructor(status: number, url: string, verb: 'downloading' | 'fetching');
39
+ }
40
+ /** True when `err` is a {@link ModelDownloadHttpError} — same process only. */
41
+ export declare function isModelDownloadHttpError(err: unknown): err is ModelDownloadHttpError;
27
42
  export interface DownloadFileOptions {
28
43
  readonly onProgress?: (downloaded: number, total: number) => void;
29
44
  /**
@@ -51,6 +51,28 @@ function buildHeaders(url) {
51
51
  if (hfToken && url.includes("huggingface.co")) headers["Authorization"] = `Bearer ${hfToken}`;
52
52
  return headers;
53
53
  }
54
+ /**
55
+ * A download that the server ANSWERED with a non-2xx status. Typed so a caller
56
+ * can tell "the file is not there" (404/410 — nothing a retry changes) from
57
+ * "the server was unreachable" by the STATUS, never by matching the message:
58
+ * the embedding encoder's requirements gate (D649) sends the first to a
59
+ * terminal state after a bounded number of attempts and only cools down on
60
+ * the second.
61
+ */
62
+ var ModelDownloadHttpError = class extends Error {
63
+ status;
64
+ url;
65
+ constructor(status, url, verb) {
66
+ super(`HTTP ${String(status)} ${verb} ${url}`);
67
+ this.status = status;
68
+ this.url = url;
69
+ this.name = "ModelDownloadHttpError";
70
+ }
71
+ };
72
+ /** True when `err` is a {@link ModelDownloadHttpError} — same process only. */
73
+ function isModelDownloadHttpError(err) {
74
+ return err instanceof ModelDownloadHttpError;
75
+ }
54
76
  var DEFAULT_MAX_REDIRECTS = 5;
55
77
  function normalizeDownloadOptions(third) {
56
78
  if (typeof third === "function") return { onProgress: third };
@@ -101,7 +123,7 @@ async function downloadFile(url, destPath, onProgressOrOptions) {
101
123
  }
102
124
  if (!response) throw new Error(`No response downloading ${url}`);
103
125
  if (manual && isRedirectStatus(response.status)) throw new Error(`Too many redirects (max ${maxRedirects}) downloading ${url}`);
104
- if (!response.ok) throw new Error(`HTTP ${response.status} downloading ${url}`);
126
+ if (!response.ok) throw new ModelDownloadHttpError(response.status, url, "downloading");
105
127
  if (!response.body) throw new Error(`No response body from ${url}`);
106
128
  const total = parseInt(response.headers.get("content-length") ?? "0", 10);
107
129
  let downloaded = 0;
@@ -140,7 +162,7 @@ async function fetchJson(url) {
140
162
  redirect: "follow",
141
163
  headers: buildHeaders(url)
142
164
  });
143
- if (!response.ok) throw new Error(`HTTP ${response.status} fetching ${url}`);
165
+ if (!response.ok) throw new ModelDownloadHttpError(response.status, url, "fetching");
144
166
  return response.json();
145
167
  }
146
168
  /**
@@ -1111,4 +1133,4 @@ function startEventLoopStallMonitor(logger, reportThresholdMs = STALL_REPORT_MS)
1111
1133
  };
1112
1134
  }
1113
1135
  //#endregion
1114
- export { fetchJson as _, createFileDataPlaneHandler as a, parseRangeHeader as c, ModelDownloadService as d, collectModelFiles as f, ensureModel as g, downloadModel as h, startEventLoopStallMonitor as i, parseTokenizedUrl as l, downloadFile as m, STALL_TICK_MS as n, contentTypeFor as o, deleteModelFromDisk as p, attributeStall as r, createAuthenticatedFileServer as s, STALL_REPORT_MS as t, resolveFilePath as u, getModelFilePath as v, isModelDownloaded as y };
1136
+ export { ensureModel as _, createFileDataPlaneHandler as a, isModelDownloadHttpError as b, parseRangeHeader as c, ModelDownloadService as d, ModelDownloadHttpError as f, downloadModel as g, downloadFile as h, startEventLoopStallMonitor as i, parseTokenizedUrl as l, deleteModelFromDisk as m, STALL_TICK_MS as n, contentTypeFor as o, collectModelFiles as p, attributeStall as r, createAuthenticatedFileServer as s, STALL_REPORT_MS as t, resolveFilePath as u, fetchJson as v, isModelDownloaded as x, getModelFilePath as y };
@@ -52,6 +52,28 @@ function buildHeaders(url) {
52
52
  if (hfToken && url.includes("huggingface.co")) headers["Authorization"] = `Bearer ${hfToken}`;
53
53
  return headers;
54
54
  }
55
+ /**
56
+ * A download that the server ANSWERED with a non-2xx status. Typed so a caller
57
+ * can tell "the file is not there" (404/410 — nothing a retry changes) from
58
+ * "the server was unreachable" by the STATUS, never by matching the message:
59
+ * the embedding encoder's requirements gate (D649) sends the first to a
60
+ * terminal state after a bounded number of attempts and only cools down on
61
+ * the second.
62
+ */
63
+ var ModelDownloadHttpError = class extends Error {
64
+ status;
65
+ url;
66
+ constructor(status, url, verb) {
67
+ super(`HTTP ${String(status)} ${verb} ${url}`);
68
+ this.status = status;
69
+ this.url = url;
70
+ this.name = "ModelDownloadHttpError";
71
+ }
72
+ };
73
+ /** True when `err` is a {@link ModelDownloadHttpError} — same process only. */
74
+ function isModelDownloadHttpError(err) {
75
+ return err instanceof ModelDownloadHttpError;
76
+ }
55
77
  var DEFAULT_MAX_REDIRECTS = 5;
56
78
  function normalizeDownloadOptions(third) {
57
79
  if (typeof third === "function") return { onProgress: third };
@@ -102,7 +124,7 @@ async function downloadFile(url, destPath, onProgressOrOptions) {
102
124
  }
103
125
  if (!response) throw new Error(`No response downloading ${url}`);
104
126
  if (manual && isRedirectStatus(response.status)) throw new Error(`Too many redirects (max ${maxRedirects}) downloading ${url}`);
105
- if (!response.ok) throw new Error(`HTTP ${response.status} downloading ${url}`);
127
+ if (!response.ok) throw new ModelDownloadHttpError(response.status, url, "downloading");
106
128
  if (!response.body) throw new Error(`No response body from ${url}`);
107
129
  const total = parseInt(response.headers.get("content-length") ?? "0", 10);
108
130
  let downloaded = 0;
@@ -141,7 +163,7 @@ async function fetchJson(url) {
141
163
  redirect: "follow",
142
164
  headers: buildHeaders(url)
143
165
  });
144
- if (!response.ok) throw new Error(`HTTP ${response.status} fetching ${url}`);
166
+ if (!response.ok) throw new ModelDownloadHttpError(response.status, url, "fetching");
145
167
  return response.json();
146
168
  }
147
169
  /**
@@ -1112,6 +1134,12 @@ function startEventLoopStallMonitor(logger, reportThresholdMs = STALL_REPORT_MS)
1112
1134
  };
1113
1135
  }
1114
1136
  //#endregion
1137
+ Object.defineProperty(exports, "ModelDownloadHttpError", {
1138
+ enumerable: true,
1139
+ get: function() {
1140
+ return ModelDownloadHttpError;
1141
+ }
1142
+ });
1115
1143
  Object.defineProperty(exports, "ModelDownloadService", {
1116
1144
  enumerable: true,
1117
1145
  get: function() {
@@ -1196,6 +1224,12 @@ Object.defineProperty(exports, "getModelFilePath", {
1196
1224
  return getModelFilePath;
1197
1225
  }
1198
1226
  });
1227
+ Object.defineProperty(exports, "isModelDownloadHttpError", {
1228
+ enumerable: true,
1229
+ get: function() {
1230
+ return isModelDownloadHttpError;
1231
+ }
1232
+ });
1199
1233
  Object.defineProperty(exports, "isModelDownloaded", {
1200
1234
  enumerable: true,
1201
1235
  get: function() {
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_chunk = require("./chunk-Cek0wNdY.js");
3
- const require_dist = require("./dist-C571Y95Z.js");
3
+ const require_dist = require("./dist-vecbhDzu.js");
4
4
  const require_builtins_alerts_alerts_addon = require("./builtins/alerts/alerts.addon.js");
5
5
  require("./builtins/alerts/index.js");
6
6
  const require_formatter = require("./formatter-DqAKDlvN.js");
@@ -25,9 +25,9 @@ require("./builtins/storage-orchestrator/index.js");
25
25
  const require_builtins_system_config_system_config_addon = require("./builtins/system-config/system-config.addon.js");
26
26
  require("./builtins/system-config/index.js");
27
27
  const require_builtins_winston_logging_index = require("./builtins/winston-logging/index.js");
28
- const require_event_loop_stall_monitor = require("./event-loop-stall-monitor-CAsHdMwP.js");
28
+ const require_event_loop_stall_monitor = require("./event-loop-stall-monitor-ey4mbofz.js");
29
29
  const require_tls$1 = require("./tls-D_wUeOTD.js");
30
- const require_child_cap_dispatch = require("./child-cap-dispatch-De5_HcvR.js");
30
+ const require_child_cap_dispatch = require("./child-cap-dispatch-Be8e2cBP.js");
31
31
  const require_resource_monitor = require("./resource-monitor-LVE1BoLs.js");
32
32
  const require_custom_action_registry = require("./custom-action-registry-acBY3mHA.js");
33
33
  let zod = require("zod");
@@ -10189,6 +10189,24 @@ var ConfigManager = class ConfigManager {
10189
10189
  };
10190
10190
  return {
10191
10191
  readAddonStore: () => active().readAddonStore(),
10192
+ readAddonStoreResult: async () => {
10193
+ if (this.settingsStore === null && this.settingsDoor === null) return {
10194
+ kind: "failed",
10195
+ error: "settings store not wired"
10196
+ };
10197
+ try {
10198
+ const value = await active().readAddonStore();
10199
+ return Object.keys(value).length > 0 ? {
10200
+ kind: "value",
10201
+ value
10202
+ } : { kind: "missing" };
10203
+ } catch (err) {
10204
+ return {
10205
+ kind: "failed",
10206
+ error: err instanceof Error ? err.message : String(err)
10207
+ };
10208
+ }
10209
+ },
10192
10210
  writeAddonStore: (patch) => active().writeAddonStore(patch),
10193
10211
  readDeviceStore: (deviceId) => active().readDeviceStore(deviceId),
10194
10212
  readDeviceStoreBatch: (deviceIds) => active().readDeviceStoreBatch(deviceIds),
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { a as __toCommonJS, i as __require, n as __esmMin, o as __toESM$1, r as __exportAll, t as __commonJSMin$1 } from "./chunk-CNf5ZN-e.mjs";
2
- import { At as logLevelAtMost, Bn as EventCategory$1, Cn as asJsonObject$1, Ct as kebabToCamel, Dn as emitDownForOwnedCaps, En as createEvent, Et as lifecycleJobSchema, Fn as parseJsonUnknown, Ht as procedureAuthKey, In as readinessKey, Ln as resolveCapMount, Pn as parseJsonObject, R as addonSettingsCapability, Rn as scopeKey, Rt as objectInputDeclaresAddonId, St as isVoidInput, T as RUNTIME_DEFAULTS, Tn as asString$1, Xt as scopesAllowDeviceCap, Yt as scopesAllowAddon, _ as LOG_LEVEL_RANK, _t as isCollectionArrayMethod, b as METHOD_ACCESS_MAP, bn as ReadinessRegistry, dn as errMsg$1, dt as extractNestedAddonId, gn as DEVICE_STATUS_METHOD, gt as isArrayOutputSchema, hn as DEVICE_SETTINGS_CONTRIBUTION_METHODS, jt as looseSchema, kn as expandCapMethods, mn as DATAPLANE_SECRET_HEADER$1, qt as resolveMethodAuth, t as ALL_CAPABILITY_DEFINITIONS, wn as asNumber, xn as ReadinessTimeoutError, yt as isObjectInput, zt as objectInputDeclaresRequiredDeviceId } from "./dist-Duqf80QM.mjs";
2
+ import { An as emitDownForOwnedCaps, Bn as resolveCapMount, Bt as objectInputDeclaresAddonId, Cn as ReadinessRegistry, Dn as asNumber, En as asJsonObject$1, L as addonSettingsCapability, Ln as parseJsonObject, Mn as expandCapMethods, Mt as logLevelAtMost, Nt as looseSchema, On as asString$1, Ot as lifecycleJobSchema, Qt as scopesAllowDeviceCap, Rn as parseJsonUnknown, T as RUNTIME_DEFAULTS, Tt as kebabToCamel, Un as EventCategory$1, Vn as scopeKey, Vt as objectInputDeclaresRequiredDeviceId, Wt as procedureAuthKey, Yt as resolveMethodAuth, Zt as scopesAllowAddon, _ as LOG_LEVEL_RANK, _n as DATAPLANE_SECRET_HEADER$1, b as METHOD_ACCESS_MAP, kn as createEvent, mn as errMsg$1, pt as extractNestedAddonId, t as ALL_CAPABILITY_DEFINITIONS, vn as DEVICE_SETTINGS_CONTRIBUTION_METHODS, vt as isArrayOutputSchema, wn as ReadinessTimeoutError, wt as isVoidInput, xt as isObjectInput, yn as DEVICE_STATUS_METHOD, yt as isCollectionArrayMethod, zn as readinessKey } from "./dist-CLfJMMdf.mjs";
3
3
  import { AlertCenterAddon } from "./builtins/alerts/alerts.addon.mjs";
4
4
  import "./builtins/alerts/index.mjs";
5
5
  import { t as formatLogLine } from "./formatter-B7qW8bPJ.mjs";
@@ -24,9 +24,9 @@ import "./builtins/storage-orchestrator/index.mjs";
24
24
  import { SystemConfigAddon } from "./builtins/system-config/system-config.addon.mjs";
25
25
  import "./builtins/system-config/index.mjs";
26
26
  import { WinstonDestination, WinstonLoggingAddon } from "./builtins/winston-logging/index.mjs";
27
- import { _ as fetchJson, a as createFileDataPlaneHandler, c as parseRangeHeader, d as ModelDownloadService, f as collectModelFiles, g as ensureModel, h as downloadModel, i as startEventLoopStallMonitor, l as parseTokenizedUrl, m as downloadFile, n as STALL_TICK_MS, o as contentTypeFor, p as deleteModelFromDisk, r as attributeStall, s as createAuthenticatedFileServer, t as STALL_REPORT_MS, u as resolveFilePath, v as getModelFilePath, y as isModelDownloaded } from "./event-loop-stall-monitor-GPrVvx14.mjs";
27
+ import { _ as ensureModel, a as createFileDataPlaneHandler, c as parseRangeHeader, d as ModelDownloadService, g as downloadModel, h as downloadFile, i as startEventLoopStallMonitor, l as parseTokenizedUrl, m as deleteModelFromDisk, n as STALL_TICK_MS, o as contentTypeFor, p as collectModelFiles, r as attributeStall, s as createAuthenticatedFileServer, t as STALL_REPORT_MS, u as resolveFilePath, v as fetchJson, x as isModelDownloaded, y as getModelFilePath } from "./event-loop-stall-monitor-EXjzIxDz.mjs";
28
28
  import { C as registerLanHttpHandler, S as readLanHttpState, _ as DEFAULT_LAN_HTTP_PORT, a as writeTlsMode, b as bindPendingLanHttp, c as loadTlsCert, d as collectCertIdentity, f as CA_VALIDITY_DAYS, g as evaluateExistingCert, h as SERVER_AUTH_OID, i as writeExtraSans, l as reissueTlsLeaf, m as MAX_LEAF_VALIDITY_DAYS, n as readTlsAccessStatus, o as validateUploadedTls, p as LEAF_RENEWAL_WINDOW_DAYS, r as readTlsMode, s as ensureTlsCert, t as readExtraSans, u as CA_COMMON_NAME, v as allFamiliesListenHost, x as closeLanHttp, y as applyLanHttp } from "./tls-IM-v7JV4.mjs";
29
- import { $ as localEndpointPath, $t as shouldReclaim, A as createUdsEventBus, An as createSocketPlaneReader, At as createAddonDataPlaneFacility, B as LocalChildClient, Bn as CAP_ACTION_OVERFLOW_LABEL, Bt as RSS_BUDGET_RELEASE_RATIO, C as brokerTransportLink, Cn as MESH_QUEUE_TOP_N, Ct as installManifestNativeDeps, D as localProviderLink, Dn as SOCKET_PLANE_TOP_N, Dt as runNpm, E as ipcParentLink, En as EMPTY_SOCKET_PLANE_BASELINE, Et as resolveNpmInvocation, F as AGENT_CAP_FWD_SERVICE, Fn as createSocketDirectionCounters, Ft as HEAP_WATCH_WARN_RATIO, G as PARENT_ROUTED_PROVIDER_ADDON_ID, Gn as createCapActionCensus, Gt as createDeferredHeapWatchSink, H as UDS_NO_ROUTE_PREFIX, Hn as EMPTY_CAP_ACTION_READING, Ht as RUNNER_RSS_BUDGET_ENV, I as CapRouteResolver, In as recordSocketFrame, It as HUB_MAIN_HEAP_WATCH_LABEL, J as createLocalTransport, Jn as createEventPlaneMeter, Jt as describeRss, K as __resetCapUsageRegistryForTests, Kn as diffCapActionCensus, Kt as createLoopDelayMeter, L as callWithServiceDiscovery, Ln as sampleSocketDirection, Lt as HUB_MAIN_RSS_BUDGET_MB, M as createUdsLogger, Mn as formatSocketPlane, Mt as HEAP_RECLAIM_STEADY_STATE_INTERVAL_MS, N as createUdsLoggerWithControl, Nn as readSocketQueues, Nt as HEAP_RECLAIM_TRIGGER_MB, O as createParentUnownedCallHandler, On as SOCKET_QUEUE_TOP_N, Ot as createAddonPeerBytesFacility, P as AGENT_CAP_FWD_ACTION, Pn as EMPTY_SOCKET_DIRECTION, Pt as HEAP_WATCH_INTERVAL_MS, Q as PeerAnsweredError, Qt as reclaimIntervalMs, R as CapRouteError, Rn as socketDirectionBytes, Rt as HUB_RSS_BUDGET_ENV, S as brokerCallForCap, Sn as formatOutboundQueueVerdict, St as copyBundledNativeModules, T as deviceCapResolverLink, Tn as formatMeshQueue, Tt as buildNpmChildEnv, U as readMoleculerFanoutMode, Un as MAX_CAP_ACTIONS_PER_PEER, Ut as ZERO_LOOP_DELAY, V as LocalChildRegistry, Vn as CAP_ACTION_UNLABELLED, Vt as RUNNER_HEAP_WATCH_INTERVAL_MS, W as CapUsageRegistry, Wn as capActionLabel, Wt as buildHeapSample, X as UdsLocalTransportServer, Xn as diffEventPlane, Xt as nextRssBudgetState, Y as UdsLocalTransportClient, Yn as createEventPlaneReader, Yt as hubMainRssBudget, Z as SocketChannel, Zn as formatEventPlane, Zt as parseRssBudgetMb, _ as setNodeEventInterest, _n as selectReportedSpaces, _t as deserializeTypedArrays, a as adaptBrokerToCluster, an as ARRAY_BUFFER_CENSUS_THRESHOLD_MB, b as createKernelHwAccel, bn as OUTBOUND_QUEUE_THRESHOLD_BYTES, bt as CapabilityHandle, c as getWorkerDeviceRegistry, cn as createInspectorArrayBufferCensus, d as setHubConnected, dn as DECISIVE_HEAP_SPACES, dt as NATIVE_PROVIDER_SERVICE_INFIX, en as startHeapWatch, et as FrameDecoder, f as EVENT_TOPIC_PREFIX, fn as HEAP_SPACE_REPORT_MIN_MB, ft as capActionName, g as registerEventBusService, gn as readHeapSpaces, gt as parseCapAction, h as getMoleculerEventStats, hn as heapSpaceField, ht as capServiceName, i as installManifestPythonDeps, in as ARRAY_BUFFER_CENSUS_SUSTAIN_MS, it as createBrokerDeviceManagerApi, j as udsChildLogToWorkerEntry, jn as diffSocketPlane, jt as HEAP_RECLAIM_MIN_INTERVAL_MS, k as createUdsEventBridge, kn as createSocketPlaneMeter, kt as hostNodeIdOf, l as getOrInitReadinessRegistry, ln as formatArrayBufferCensus, lt as createAddonService, m as getBrokerEventBus, mn as formatHeapSpaces, mt as capBareAction, nn as strandedMb, nt as buildNativeCapProxy, o as createAddonContext, on as ARRAY_BUFFER_RELEASE_MIN_DROP_RATIO, p as clusterEventTopic, pn as emitHeapDiagnosticReport, pt as capActionSuffix, q as getCapUsageRegistry, qn as EVENT_PLANE_TOP_N, qt as createV8Reclaimer, r as installManifestSystemDeps, rn as ARRAY_BUFFER_CENSUS_COOLDOWN_MS, rt as buildUdsNativeCapProxy, s as createUdsAddonContext, sn as createArrayBufferCensusGate, st as mountNativeCapService, t as CAP_METHOD_NOT_IMPLEMENTED, tn as startRunnerHeapWatch, tt as encodeFrame, u as getOrInitReadinessRegistryForClient, un as isArrayBufferCensusReport, ut as validateProviderRegistrations, v as subscribePassthrough, vn as OUTBOUND_QUEUE_COOLDOWN_MS, vt as serializeTypedArrays, w as buildLinkChain, wn as createMeshQueueReader, wt as resolveAddonClass, x as resolveHwAccel, xn as createOutboundQueueGate, xt as CapabilityUnavailableError, y as AddonDepsManager, yn as OUTBOUND_QUEUE_SUSTAIN_MS, yt as DeviceRegistry, z as classifyCapRoute, zn as socketDirectionMessages, zt as RSS_BUDGET_REANNOUNCE_MIN_MS } from "./child-cap-dispatch-C1c3rWaX.mjs";
29
+ import { $ as localEndpointPath, $t as shouldReclaim, A as createUdsEventBus, An as createSocketPlaneReader, At as createAddonDataPlaneFacility, B as LocalChildClient, Bn as CAP_ACTION_OVERFLOW_LABEL, Bt as RSS_BUDGET_RELEASE_RATIO, C as brokerTransportLink, Cn as MESH_QUEUE_TOP_N, Ct as installManifestNativeDeps, D as localProviderLink, Dn as SOCKET_PLANE_TOP_N, Dt as runNpm, E as ipcParentLink, En as EMPTY_SOCKET_PLANE_BASELINE, Et as resolveNpmInvocation, F as AGENT_CAP_FWD_SERVICE, Fn as createSocketDirectionCounters, Ft as HEAP_WATCH_WARN_RATIO, G as PARENT_ROUTED_PROVIDER_ADDON_ID, Gn as createCapActionCensus, Gt as createDeferredHeapWatchSink, H as UDS_NO_ROUTE_PREFIX, Hn as EMPTY_CAP_ACTION_READING, Ht as RUNNER_RSS_BUDGET_ENV, I as CapRouteResolver, In as recordSocketFrame, It as HUB_MAIN_HEAP_WATCH_LABEL, J as createLocalTransport, Jn as createEventPlaneMeter, Jt as describeRss, K as __resetCapUsageRegistryForTests, Kn as diffCapActionCensus, Kt as createLoopDelayMeter, L as callWithServiceDiscovery, Ln as sampleSocketDirection, Lt as HUB_MAIN_RSS_BUDGET_MB, M as createUdsLogger, Mn as formatSocketPlane, Mt as HEAP_RECLAIM_STEADY_STATE_INTERVAL_MS, N as createUdsLoggerWithControl, Nn as readSocketQueues, Nt as HEAP_RECLAIM_TRIGGER_MB, O as createParentUnownedCallHandler, On as SOCKET_QUEUE_TOP_N, Ot as createAddonPeerBytesFacility, P as AGENT_CAP_FWD_ACTION, Pn as EMPTY_SOCKET_DIRECTION, Pt as HEAP_WATCH_INTERVAL_MS, Q as PeerAnsweredError, Qt as reclaimIntervalMs, R as CapRouteError, Rn as socketDirectionBytes, Rt as HUB_RSS_BUDGET_ENV, S as brokerCallForCap, Sn as formatOutboundQueueVerdict, St as copyBundledNativeModules, T as deviceCapResolverLink, Tn as formatMeshQueue, Tt as buildNpmChildEnv, U as readMoleculerFanoutMode, Un as MAX_CAP_ACTIONS_PER_PEER, Ut as ZERO_LOOP_DELAY, V as LocalChildRegistry, Vn as CAP_ACTION_UNLABELLED, Vt as RUNNER_HEAP_WATCH_INTERVAL_MS, W as CapUsageRegistry, Wn as capActionLabel, Wt as buildHeapSample, X as UdsLocalTransportServer, Xn as diffEventPlane, Xt as nextRssBudgetState, Y as UdsLocalTransportClient, Yn as createEventPlaneReader, Yt as hubMainRssBudget, Z as SocketChannel, Zn as formatEventPlane, Zt as parseRssBudgetMb, _ as setNodeEventInterest, _n as selectReportedSpaces, _t as deserializeTypedArrays, a as adaptBrokerToCluster, an as ARRAY_BUFFER_CENSUS_THRESHOLD_MB, b as createKernelHwAccel, bn as OUTBOUND_QUEUE_THRESHOLD_BYTES, bt as CapabilityHandle, c as getWorkerDeviceRegistry, cn as createInspectorArrayBufferCensus, d as setHubConnected, dn as DECISIVE_HEAP_SPACES, dt as NATIVE_PROVIDER_SERVICE_INFIX, en as startHeapWatch, et as FrameDecoder, f as EVENT_TOPIC_PREFIX, fn as HEAP_SPACE_REPORT_MIN_MB, ft as capActionName, g as registerEventBusService, gn as readHeapSpaces, gt as parseCapAction, h as getMoleculerEventStats, hn as heapSpaceField, ht as capServiceName, i as installManifestPythonDeps, in as ARRAY_BUFFER_CENSUS_SUSTAIN_MS, it as createBrokerDeviceManagerApi, j as udsChildLogToWorkerEntry, jn as diffSocketPlane, jt as HEAP_RECLAIM_MIN_INTERVAL_MS, k as createUdsEventBridge, kn as createSocketPlaneMeter, kt as hostNodeIdOf, l as getOrInitReadinessRegistry, ln as formatArrayBufferCensus, lt as createAddonService, m as getBrokerEventBus, mn as formatHeapSpaces, mt as capBareAction, nn as strandedMb, nt as buildNativeCapProxy, o as createAddonContext, on as ARRAY_BUFFER_RELEASE_MIN_DROP_RATIO, p as clusterEventTopic, pn as emitHeapDiagnosticReport, pt as capActionSuffix, q as getCapUsageRegistry, qn as EVENT_PLANE_TOP_N, qt as createV8Reclaimer, r as installManifestSystemDeps, rn as ARRAY_BUFFER_CENSUS_COOLDOWN_MS, rt as buildUdsNativeCapProxy, s as createUdsAddonContext, sn as createArrayBufferCensusGate, st as mountNativeCapService, t as CAP_METHOD_NOT_IMPLEMENTED, tn as startRunnerHeapWatch, tt as encodeFrame, u as getOrInitReadinessRegistryForClient, un as isArrayBufferCensusReport, ut as validateProviderRegistrations, v as subscribePassthrough, vn as OUTBOUND_QUEUE_COOLDOWN_MS, vt as serializeTypedArrays, w as buildLinkChain, wn as createMeshQueueReader, wt as resolveAddonClass, x as resolveHwAccel, xn as createOutboundQueueGate, xt as CapabilityUnavailableError, y as AddonDepsManager, yn as OUTBOUND_QUEUE_SUSTAIN_MS, yt as DeviceRegistry, z as classifyCapRoute, zn as socketDirectionMessages, zt as RSS_BUDGET_REANNOUNCE_MIN_MS } from "./child-cap-dispatch-BCJjUtXV.mjs";
30
30
  import { n as getSinglePidStats, t as getPidStats } from "./resource-monitor-Vp0bPV3U.mjs";
31
31
  import { t as CustomActionRegistry } from "./custom-action-registry-B4Cf4O_X.mjs";
32
32
  import { z } from "zod";
@@ -10182,6 +10182,24 @@ var ConfigManager = class ConfigManager {
10182
10182
  };
10183
10183
  return {
10184
10184
  readAddonStore: () => active().readAddonStore(),
10185
+ readAddonStoreResult: async () => {
10186
+ if (this.settingsStore === null && this.settingsDoor === null) return {
10187
+ kind: "failed",
10188
+ error: "settings store not wired"
10189
+ };
10190
+ try {
10191
+ const value = await active().readAddonStore();
10192
+ return Object.keys(value).length > 0 ? {
10193
+ kind: "value",
10194
+ value
10195
+ } : { kind: "missing" };
10196
+ } catch (err) {
10197
+ return {
10198
+ kind: "failed",
10199
+ error: err instanceof Error ? err.message : String(err)
10200
+ };
10201
+ }
10202
+ },
10185
10203
  writeAddonStore: (patch) => active().writeAddonStore(patch),
10186
10204
  readDeviceStore: (deviceId) => active().readDeviceStore(deviceId),
10187
10205
  readDeviceStoreBatch: (deviceIds) => active().readDeviceStoreBatch(deviceIds),
@@ -1,7 +1,9 @@
1
1
  import { AppConfig } from './config-schema.js';
2
- import { FeatureManifest, ISettingsStoreProvider } from '@camstack/types';
2
+ import { AddonStoreRead, FeatureManifest, ISettingsStoreProvider } from '@camstack/types';
3
3
  export interface AddonSettingsView {
4
4
  readAddonStore(): Promise<Record<string, unknown>>;
5
+ /** See `IAddonContext['settings'].readAddonStoreResult` (D651). */
6
+ readAddonStoreResult?(): Promise<AddonStoreRead>;
5
7
  writeAddonStore(patch: Record<string, unknown>): Promise<void>;
6
8
  readDeviceStore(deviceId: number): Promise<Record<string, unknown>>;
7
9
  /** See `IAddonContext['settings'].readDeviceStoreBatch` — optional there and
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-C571Y95Z.js");
1
+ const require_dist = require("./dist-vecbhDzu.js");
2
2
  //#region src/builtins/sqlite-storage/retired-settings-keys.ts
3
3
  /**
4
4
  * Is THIS node the one whose settings store is the cluster's authority?
@@ -1,4 +1,4 @@
1
- import { Cn as asJsonObject } from "./dist-Duqf80QM.mjs";
1
+ import { En as asJsonObject } from "./dist-CLfJMMdf.mjs";
2
2
  //#region src/builtins/sqlite-storage/retired-settings-keys.ts
3
3
  /**
4
4
  * Is THIS node the one whose settings store is the cluster's authority?
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/system",
3
- "version": "1.2.304",
3
+ "version": "1.2.306",
4
4
  "description": "Core addon for CamStack — builtins, pipeline, process management, auth, logging, events",
5
5
  "keywords": [
6
6
  "camstack",
@@ -196,6 +196,9 @@
196
196
  "capabilities": [
197
197
  {
198
198
  "name": "doorbell"
199
+ },
200
+ {
201
+ "name": "device-extension"
199
202
  }
200
203
  ]
201
204
  },
@@ -278,6 +281,9 @@
278
281
  },
279
282
  {
280
283
  "name": "device-state"
284
+ },
285
+ {
286
+ "name": "device-extension"
281
287
  }
282
288
  ]
283
289
  },
@@ -1,26 +0,0 @@
1
- import { ProviderContext } from './device-provider-context.js';
2
- /** One device-store-backed section: the keys it owns + how to persist them. */
3
- export interface DeviceStoreSection {
4
- /** Reserved config keys this section owns (must not reach the driver). */
5
- readonly keys: readonly string[];
6
- /** Persist this section's slice of a save into the device-store blob. */
7
- apply(pctx: Pick<ProviderContext, 'settings'>, deviceId: number, patch: Record<string, unknown>): Promise<unknown>;
8
- }
9
- /** The device-manager's device-store-backed sections. Add an entry to extend. */
10
- export declare const DEVICE_STORE_SECTIONS: readonly DeviceStoreSection[];
11
- /** Result of splitting a `device-manager`-writer patch by persistence target. */
12
- export interface DeviceStoreSplit {
13
- /** Per-section slices that persist to the device-store blob. */
14
- readonly storeGroups: ReadonlyArray<{
15
- section: DeviceStoreSection;
16
- patch: Record<string, unknown>;
17
- }>;
18
- /** The remaining keys, destined for the device driver's own config. */
19
- readonly driverPatch: Record<string, unknown>;
20
- }
21
- /**
22
- * Split a `writerCapName: 'device-manager'` patch into device-store slices
23
- * (one per matching registered section) and the leftover driver patch.
24
- * Generic — consults {@link DEVICE_STORE_SECTIONS}, no hardcoded key list.
25
- */
26
- export declare function splitDeviceStoreKeys(patch: Record<string, unknown>): DeviceStoreSplit;