@camstack/system 1.2.67 → 1.2.68

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 (51) hide show
  1. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  2. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  3. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  4. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  5. package/dist/builtins/alerts/alerts.addon.js +1 -1
  6. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  7. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +1 -1
  8. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
  9. package/dist/builtins/console-logging/index.js +1 -1
  10. package/dist/builtins/console-logging/index.mjs +1 -1
  11. package/dist/builtins/core-blocks/core-blocks.addon.js +1 -1
  12. package/dist/builtins/core-blocks/core-blocks.addon.mjs +1 -1
  13. package/dist/builtins/device-manager/device-manager.addon.js +1 -1
  14. package/dist/builtins/device-manager/device-manager.addon.mjs +1 -1
  15. package/dist/builtins/doorbell/virtual-doorbell.addon.js +1 -1
  16. package/dist/builtins/doorbell/virtual-doorbell.addon.mjs +1 -1
  17. package/dist/builtins/hub-forwarder/index.js +1 -1
  18. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  19. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  20. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  21. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  22. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  23. package/dist/builtins/local-network/local-network.addon.js +1 -1
  24. package/dist/builtins/local-network/local-network.addon.mjs +1 -1
  25. package/dist/builtins/loki-logging/index.js +1 -1
  26. package/dist/builtins/loki-logging/index.mjs +1 -1
  27. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  28. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  29. package/dist/builtins/platform-probe/index.js +1 -1
  30. package/dist/builtins/platform-probe/index.mjs +1 -1
  31. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  32. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  33. package/dist/builtins/snapshot/index.js +339 -2
  34. package/dist/builtins/snapshot/index.mjs +339 -2
  35. package/dist/builtins/snapshot/snapshot-link-url.d.ts +66 -0
  36. package/dist/builtins/snapshot/snapshot.addon.d.ts +79 -0
  37. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  38. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  39. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +1 -1
  40. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +1 -1
  41. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  42. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  43. package/dist/builtins/system-config/system-config.addon.js +1 -1
  44. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  45. package/dist/builtins/winston-logging/index.js +1 -1
  46. package/dist/builtins/winston-logging/index.mjs +1 -1
  47. package/dist/{dist-CbS6uoSb.mjs → dist-D2J8RJ7m.mjs} +77 -0
  48. package/dist/{dist-NRYjb8qK.js → dist-Dhpte164.js} +77 -0
  49. package/dist/index.js +1 -1
  50. package/dist/index.mjs +1 -1
  51. package/package.json +1 -1
@@ -17112,6 +17112,77 @@ var snapshotCapability = {
17112
17112
  lastCapturedAt: z.number().nullable(),
17113
17113
  cacheAgeMs: z.number().nullable(),
17114
17114
  etag: z.string().nullable()
17115
+ }))),
17116
+ /**
17117
+ * Signed, expiring links to a CLIENT-SIZED frame — and the demand signal
17118
+ * that makes those frames current.
17119
+ *
17120
+ * ## The problem it replaces
17121
+ *
17122
+ * `getSnapshotOverview` is cache-only by contract: it answers from whatever
17123
+ * the wrapper happens to hold and never captures. Under D93 the client
17124
+ * versions its image URL on that answer, and an image REQUEST is what enrols
17125
+ * a camera in the keep-warm loop. Both of those are satisfiable by the
17126
+ * client's own image cache — `expo-image` is URL-keyed and never revalidates
17127
+ * — so a URL painted in a previous session comes off disk with no network,
17128
+ * no enrolment, and nothing warming. Measured on the live hub: reopening
17129
+ * after two minutes idle painted 15 of 16 tiles at **168 s old** with zero
17130
+ * HTTP requests, and the fleet only recovered because a later poll happened
17131
+ * to observe a different identity.
17132
+ *
17133
+ * ## The two properties that fix it
17134
+ *
17135
+ * **It is an RPC, so no client cache can answer it.** The demand signal
17136
+ * always reaches the wrapper. This method therefore MAY create keep-warm
17137
+ * subscriptions, where `getSnapshotOverview` must never (D93) — the
17138
+ * distinction is not "one is newer" but that the overview poll is app-wide
17139
+ * (a creating overview would warm every camera on the install) while this is
17140
+ * called by a rendered surface naming the tiles it is actually painting, at
17141
+ * the width it is painting them.
17142
+ *
17143
+ * **It waits, briefly and boundedly, for the capture it triggered.** The
17144
+ * returned `capturedAt` is the frame the link will serve, not the frame the
17145
+ * cache held when the client asked, so a first paint is honest and current
17146
+ * instead of a generation behind. A device that does not settle inside the
17147
+ * bound still gets a link and its real (older) `capturedAt` — the next poll
17148
+ * carries it forward.
17149
+ *
17150
+ * `force` is never set on behalf of a client here. A sleeping battery camera
17151
+ * is reported with `sleeping: true` and the last frame it produced, however
17152
+ * old; the wrapper's existing sleep gate owns that decision and this method
17153
+ * adds no second one.
17154
+ */
17155
+ getSnapshotLinks: systemMethod(z.object({
17156
+ /** The tiles a surface is actually rendering. One entry per (device,
17157
+ * width) the caller will paint — the width is snapped to the server's
17158
+ * ladder and becomes part of the link's SIGNED identity. */
17159
+ targets: z.array(z.object({
17160
+ deviceId: z.number(),
17161
+ /** Target width in px. Omit for the frame as captured — correct
17162
+ * for a full-bleed surface, wrong (and expensive) for a grid. */
17163
+ width: z.number().int().positive().optional()
17164
+ })).min(1).max(200) }), z.array(z.object({
17165
+ deviceId: z.number(),
17166
+ /** Root-relative signed path, or null when the link plane is not
17167
+ * served (no data-plane facility). Present even for a device that has
17168
+ * never captured — the request is what triggers the first one (D94). */
17169
+ url: z.string().nullable(),
17170
+ /** Epoch ms of the frame this link serves. Null = never captured.
17171
+ * THE honest age: the tRPC path carried none before this. */
17172
+ capturedAt: z.number().nullable(),
17173
+ /** Age of that frame at the moment the answer was built. */
17174
+ ageMs: z.number().nullable(),
17175
+ /** Epoch ms after which `url` stops verifying. */
17176
+ expiresAt: z.number().nullable(),
17177
+ /** Ladder rung the bytes are at; null = the frame as captured. */
17178
+ width: z.number().nullable(),
17179
+ /** The device has never produced a frame. An empty state, not a
17180
+ * failure — and never a reason to withhold the link (D94). */
17181
+ neverCaptured: z.boolean(),
17182
+ /** A sleeping battery camera: the frame is deliberately stale and will
17183
+ * NOT refresh in the background. A surface should say so rather than
17184
+ * present it as current. */
17185
+ sleeping: z.boolean()
17115
17186
  })))
17116
17187
  },
17117
17188
  status: {
@@ -31425,6 +31496,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
31425
31496
  addonId: null,
31426
31497
  access: "view"
31427
31498
  },
31499
+ "snapshot.getSnapshotLinks": {
31500
+ capName: "snapshot",
31501
+ capScope: "device",
31502
+ addonId: null,
31503
+ access: "view"
31504
+ },
31428
31505
  "snapshot.getSnapshotOverview": {
31429
31506
  capName: "snapshot",
31430
31507
  capScope: "device",
@@ -17112,6 +17112,77 @@ var snapshotCapability = {
17112
17112
  lastCapturedAt: zod.z.number().nullable(),
17113
17113
  cacheAgeMs: zod.z.number().nullable(),
17114
17114
  etag: zod.z.string().nullable()
17115
+ }))),
17116
+ /**
17117
+ * Signed, expiring links to a CLIENT-SIZED frame — and the demand signal
17118
+ * that makes those frames current.
17119
+ *
17120
+ * ## The problem it replaces
17121
+ *
17122
+ * `getSnapshotOverview` is cache-only by contract: it answers from whatever
17123
+ * the wrapper happens to hold and never captures. Under D93 the client
17124
+ * versions its image URL on that answer, and an image REQUEST is what enrols
17125
+ * a camera in the keep-warm loop. Both of those are satisfiable by the
17126
+ * client's own image cache — `expo-image` is URL-keyed and never revalidates
17127
+ * — so a URL painted in a previous session comes off disk with no network,
17128
+ * no enrolment, and nothing warming. Measured on the live hub: reopening
17129
+ * after two minutes idle painted 15 of 16 tiles at **168 s old** with zero
17130
+ * HTTP requests, and the fleet only recovered because a later poll happened
17131
+ * to observe a different identity.
17132
+ *
17133
+ * ## The two properties that fix it
17134
+ *
17135
+ * **It is an RPC, so no client cache can answer it.** The demand signal
17136
+ * always reaches the wrapper. This method therefore MAY create keep-warm
17137
+ * subscriptions, where `getSnapshotOverview` must never (D93) — the
17138
+ * distinction is not "one is newer" but that the overview poll is app-wide
17139
+ * (a creating overview would warm every camera on the install) while this is
17140
+ * called by a rendered surface naming the tiles it is actually painting, at
17141
+ * the width it is painting them.
17142
+ *
17143
+ * **It waits, briefly and boundedly, for the capture it triggered.** The
17144
+ * returned `capturedAt` is the frame the link will serve, not the frame the
17145
+ * cache held when the client asked, so a first paint is honest and current
17146
+ * instead of a generation behind. A device that does not settle inside the
17147
+ * bound still gets a link and its real (older) `capturedAt` — the next poll
17148
+ * carries it forward.
17149
+ *
17150
+ * `force` is never set on behalf of a client here. A sleeping battery camera
17151
+ * is reported with `sleeping: true` and the last frame it produced, however
17152
+ * old; the wrapper's existing sleep gate owns that decision and this method
17153
+ * adds no second one.
17154
+ */
17155
+ getSnapshotLinks: systemMethod(zod.z.object({
17156
+ /** The tiles a surface is actually rendering. One entry per (device,
17157
+ * width) the caller will paint — the width is snapped to the server's
17158
+ * ladder and becomes part of the link's SIGNED identity. */
17159
+ targets: zod.z.array(zod.z.object({
17160
+ deviceId: zod.z.number(),
17161
+ /** Target width in px. Omit for the frame as captured — correct
17162
+ * for a full-bleed surface, wrong (and expensive) for a grid. */
17163
+ width: zod.z.number().int().positive().optional()
17164
+ })).min(1).max(200) }), zod.z.array(zod.z.object({
17165
+ deviceId: zod.z.number(),
17166
+ /** Root-relative signed path, or null when the link plane is not
17167
+ * served (no data-plane facility). Present even for a device that has
17168
+ * never captured — the request is what triggers the first one (D94). */
17169
+ url: zod.z.string().nullable(),
17170
+ /** Epoch ms of the frame this link serves. Null = never captured.
17171
+ * THE honest age: the tRPC path carried none before this. */
17172
+ capturedAt: zod.z.number().nullable(),
17173
+ /** Age of that frame at the moment the answer was built. */
17174
+ ageMs: zod.z.number().nullable(),
17175
+ /** Epoch ms after which `url` stops verifying. */
17176
+ expiresAt: zod.z.number().nullable(),
17177
+ /** Ladder rung the bytes are at; null = the frame as captured. */
17178
+ width: zod.z.number().nullable(),
17179
+ /** The device has never produced a frame. An empty state, not a
17180
+ * failure — and never a reason to withhold the link (D94). */
17181
+ neverCaptured: zod.z.boolean(),
17182
+ /** A sleeping battery camera: the frame is deliberately stale and will
17183
+ * NOT refresh in the background. A surface should say so rather than
17184
+ * present it as current. */
17185
+ sleeping: zod.z.boolean()
17115
17186
  })))
17116
17187
  },
17117
17188
  status: {
@@ -31425,6 +31496,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
31425
31496
  addonId: null,
31426
31497
  access: "view"
31427
31498
  },
31499
+ "snapshot.getSnapshotLinks": {
31500
+ capName: "snapshot",
31501
+ capScope: "device",
31502
+ addonId: null,
31503
+ access: "view"
31504
+ },
31428
31505
  "snapshot.getSnapshotOverview": {
31429
31506
  capName: "snapshot",
31430
31507
  capScope: "device",
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-NRYjb8qK.js");
3
+ const require_dist = require("./dist-Dhpte164.js");
4
4
  const require_model_download_service = require("./model-download-service-Caj1kaSi.js");
5
5
  const require_manifest_python_deps = require("./manifest-python-deps-BE6l8Y4W.js");
6
6
  const require_resource_monitor = require("./resource-monitor-DNNomR-i.js");
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 { $ as objectInputDeclaresAddonId, B as isCollectionArrayMethod, Ct as asJsonObject$1, Dt as emitDownForOwnedCaps, Et as createEvent, Ft as readinessKey, G as lifecycleJobSchema, It as resolveCapMount, J as logLevelAtMost, L as extractNestedAddonId, Lt as scopeKey, Nt as parseJsonObject, Pt as parseJsonUnknown$1, Tt as asString$1, U as isVoidInput, V as isObjectInput, W as kebabToCamel, Y as looseSchema, bt as ReadinessRegistry, d as METHOD_ACCESS_MAP, f as RUNTIME_DEFAULTS, ft as errMsg$1, gt as DEVICE_STATUS_METHOD, ht as DEVICE_SETTINGS_CONTRIBUTION_METHODS, kt as expandCapMethods, mt as DATAPLANE_SECRET_HEADER$1, nt as procedureAuthKey, t as ALL_CAPABILITY_DEFINITIONS, v as addonSettingsCapability, wt as asNumber, xt as ReadinessTimeoutError, z as isArrayOutputSchema, zt as EventCategory$1 } from "./dist-CbS6uoSb.mjs";
2
+ import { $ as objectInputDeclaresAddonId, B as isCollectionArrayMethod, Ct as asJsonObject$1, Dt as emitDownForOwnedCaps, Et as createEvent, Ft as readinessKey, G as lifecycleJobSchema, It as resolveCapMount, J as logLevelAtMost, L as extractNestedAddonId, Lt as scopeKey, Nt as parseJsonObject, Pt as parseJsonUnknown$1, Tt as asString$1, U as isVoidInput, V as isObjectInput, W as kebabToCamel, Y as looseSchema, bt as ReadinessRegistry, d as METHOD_ACCESS_MAP, f as RUNTIME_DEFAULTS, ft as errMsg$1, gt as DEVICE_STATUS_METHOD, ht as DEVICE_SETTINGS_CONTRIBUTION_METHODS, kt as expandCapMethods, mt as DATAPLANE_SECRET_HEADER$1, nt as procedureAuthKey, t as ALL_CAPABILITY_DEFINITIONS, v as addonSettingsCapability, wt as asNumber, xt as ReadinessTimeoutError, z as isArrayOutputSchema, zt as EventCategory$1 } from "./dist-D2J8RJ7m.mjs";
3
3
  import { a as downloadModel, c as getModelFilePath, d as contentTypeFor, f as createAuthenticatedFileServer, h as resolveFilePath, i as downloadFile, l as isModelDownloaded, m as parseTokenizedUrl, n as collectModelFiles, o as ensureModel, p as parseRangeHeader, r as deleteModelFromDisk, s as fetchJson, t as ModelDownloadService, u as createFileDataPlaneHandler } from "./model-download-service-CTBHzORJ.mjs";
4
4
  import { $ as buildNativeCapProxy, A as createHubCapForwardService, B as AGENT_CAP_FWD_ACTION, C as brokerTransportLink, Ct as resolveAddonClass, D as localProviderLink, E as ipcParentLink, F as createUdsLogger, G as callWithServiceDiscovery, H as CapRouteResolver, I as createUdsLoggerWithControl, J as UdsLocalTransportServer, K as createLocalTransport, L as LocalChildClient, M as createUdsEventBridge, N as createUdsEventBus, O as HUB_CAP_FWD_ACTION, P as udsChildLogToWorkerEntry, Q as encodeFrame, R as LocalChildRegistry, S as brokerCallForCap, St as runNpm, T as ipcChildLink, U as CapRouteError, V as AGENT_CAP_FWD_SERVICE, W as classifyCapRoute, X as localEndpointPath, Y as SocketChannel, Z as FrameDecoder, _ as createKernelHwAccel, _t as CapabilityHandle, a as getWorkerDeviceRegistry, b as __resetCapUsageRegistryForTests, bt as installManifestNativeDeps, c as setHubConnected, ct as NATIVE_PROVIDER_SERVICE_INFIX, d as getBrokerEventBus, dt as capBareAction, et as buildUdsNativeCapProxy, f as getMoleculerEventStats, ft as capServiceName, g as AddonDepsManager, gt as DeviceRegistry, h as subscribePassthrough, ht as serializeTypedArrays, i as createUdsAddonContext, it as mountNativeCapService, j as createParentUnownedCallHandler, k as HUB_CAP_FWD_SERVICE, l as EVENT_TOPIC_PREFIX, lt as capActionName, m as setNodeEventInterest, mt as deserializeTypedArrays, n as adaptBrokerToCluster, o as getOrInitReadinessRegistry, ot as createAddonService, p as registerEventBusService, pt as parseCapAction, q as UdsLocalTransportClient, r as createAddonContext, s as getOrInitReadinessRegistryForClient, st as validateProviderRegistrations, t as installManifestPythonDeps, tt as createBrokerDeviceManagerApi, u as clusterEventTopic, ut as capActionSuffix, v as resolveHwAccel, vt as CapabilityUnavailableError, w as buildLinkChain, wt as createAddonDataPlaneFacility, x as getCapUsageRegistry, xt as resolveNpmInvocation, y as CapUsageRegistry, yt as copyBundledNativeModules, z as UDS_NO_ROUTE_PREFIX } from "./manifest-python-deps-Dz1ryHIN.mjs";
5
5
  import { n as getSinglePidStats, t as getPidStats } from "./resource-monitor-BkP504Vq.mjs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/system",
3
- "version": "1.2.67",
3
+ "version": "1.2.68",
4
4
  "description": "Core addon for CamStack — builtins, pipeline, process management, auth, logging, events",
5
5
  "keywords": [
6
6
  "camstack",