@camstack/types 1.2.380 → 1.2.381

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/addon.d.ts CHANGED
@@ -24,6 +24,7 @@ export type { IAdminUiProvider } from './capabilities/admin-ui.cap.js';
24
24
  export { adminUiCapability } from './capabilities/admin-ui.cap.js';
25
25
  export { expandCapMethods } from './capabilities/capability-definition.js';
26
26
  export { describeCustomActions } from './capabilities/custom-actions.js';
27
+ export { CALLER_STAMPED_CAPABILITIES, withoutCallerStamp, } from './capabilities/caller-stamp.js';
27
28
  export { deviceOpsCapability } from './capabilities/device-ops.cap.js';
28
29
  export type { IViewerUiProvider } from './capabilities/viewer-ui.cap.js';
29
30
  export { viewerUiCapability } from './capabilities/viewer-ui.cap.js';
@@ -44,6 +45,7 @@ export type { CapStateLeaf } from './generated/addon-cap-facts.js';
44
45
  export { createDeviceProxy } from './generated/device-proxy.js';
45
46
  export { createEventBusSliceSource } from './device/device-state-handle.js';
46
47
  export type { SliceEventBus, SliceHandleApi } from './device/device-state-handle.js';
48
+ export { addonSliceHandleApi } from './helpers/addon-slice-handle.js';
47
49
  export { DEVICE_SCOPED_CAPS, isDeviceScopedCap } from './generated/device-scoped-caps.js';
48
50
  export type { AddonDeclaration, AddonInitResult, ICamstackAddon, ProviderRegistration, } from './interfaces/addon.js';
49
51
  export { DATAPLANE_SECRET_HEADER } from './interfaces/addon-data-plane.js';
package/dist/addon.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_sleep = require("./sleep-CIGOw58l.js");
2
+ const require_sleep = require("./sleep-D8yJVc4r.js");
3
3
  const require_event_category = require("./event-category-Hoe-mqbd.js");
4
4
  const require_err_msg = require("./err-msg-Bb-s4Xuj.js");
5
5
  //#region src/generated/cap-input-defaults.ts
@@ -2139,6 +2139,7 @@ exports.AdoptionPendingError = require_sleep.AdoptionPendingError;
2139
2139
  exports.BOOT_RECOVERY_BACKOFF_MS = require_sleep.BOOT_RECOVERY_BACKOFF_MS;
2140
2140
  exports.BaseAddon = require_sleep.BaseAddon;
2141
2141
  exports.BatchTooLargeError = require_sleep.BatchTooLargeError;
2142
+ exports.CALLER_STAMPED_CAPABILITIES = require_sleep.CALLER_STAMPED_CAPABILITIES;
2142
2143
  exports.CAP_ADVANCE_FIELDS = CAP_ADVANCE_FIELDS;
2143
2144
  exports.CAP_INPUT_DEFAULTS = CAP_INPUT_DEFAULTS;
2144
2145
  exports.CAP_STATE_LEAVES = CAP_STATE_LEAVES;
@@ -2197,8 +2198,11 @@ exports.RecordsError = require_sleep.RecordsError;
2197
2198
  exports.RevConflictError = require_sleep.RevConflictError;
2198
2199
  exports.SECRET_CLEAR = require_sleep.SECRET_CLEAR;
2199
2200
  exports.SECRET_REF_SCHEME = require_sleep.SECRET_REF_SCHEME;
2201
+ exports.SETTINGS_ARRAY_ADOPTS_PREFIX = require_sleep.SETTINGS_ARRAY_ADOPTS_PREFIX;
2202
+ exports.SETTINGS_BROKERS_ADOPTS_PREFIX = require_sleep.SETTINGS_BROKERS_ADOPTS_PREFIX;
2200
2203
  exports.UnindexedFilterError = require_sleep.UnindexedFilterError;
2201
2204
  exports.UnknownRecordKindError = require_sleep.UnknownRecordKindError;
2205
+ exports.addonSliceHandleApi = require_sleep.addonSliceHandleApi;
2202
2206
  exports.adminUiCapability = require_sleep.adminUiCapability;
2203
2207
  exports.arrayItemFieldPath = require_sleep.arrayItemFieldPath;
2204
2208
  exports.asJsonObject = require_sleep.asJsonObject;
@@ -2238,6 +2242,7 @@ exports.isSecretMarkerLike = require_sleep.isSecretMarkerLike;
2238
2242
  exports.isSecretRef = require_sleep.isSecretRef;
2239
2243
  exports.isZodSecret = require_sleep.isZodSecret;
2240
2244
  exports.knownSecretCount = require_sleep.knownSecretCount;
2245
+ exports.makeInMemoryRecords = require_sleep.makeInMemoryRecords;
2241
2246
  exports.makeSecretMarker = require_sleep.makeSecretMarker;
2242
2247
  exports.mapSecretLeaves = require_sleep.mapSecretLeaves;
2243
2248
  exports.maskUrlCredentials = require_sleep.maskUrlCredentials;
@@ -2247,6 +2252,8 @@ exports.normalizeSecretOwner = require_sleep.normalizeSecretOwner;
2247
2252
  exports.parseJsonUnknown = require_sleep.parseJsonUnknown;
2248
2253
  exports.parseSecretPath = require_sleep.parseSecretPath;
2249
2254
  exports.parseSecretRef = require_sleep.parseSecretRef;
2255
+ exports.parseSettingsArrayAdoptsFrom = require_sleep.parseSettingsArrayAdoptsFrom;
2256
+ exports.parseSettingsBrokersAdoptsFrom = require_sleep.parseSettingsBrokersAdoptsFrom;
2250
2257
  exports.readErrorI18n = require_sleep.readErrorI18n;
2251
2258
  exports.readNodePin = require_sleep.readNodePin;
2252
2259
  exports.recordArrayItemPath = require_sleep.recordArrayItemPath;
@@ -2258,8 +2265,11 @@ exports.resolveSecretViewsIn = require_sleep.resolveSecretViewsIn;
2258
2265
  exports.scopeKey = require_sleep.scopeKey;
2259
2266
  exports.scrubKnownSecrets = require_sleep.scrubKnownSecrets;
2260
2267
  exports.secretArrayPrefixes = require_sleep.secretArrayPrefixes;
2268
+ exports.settingsArrayAdoptsFrom = require_sleep.settingsArrayAdoptsFrom;
2269
+ exports.settingsBrokersAdoptsFrom = require_sleep.settingsBrokersAdoptsFrom;
2261
2270
  exports.shortSecretRefHash = require_sleep.shortSecretRefHash;
2262
2271
  exports.sleep = require_sleep.sleep;
2263
2272
  exports.toSecretFieldView = require_sleep.toSecretFieldView;
2264
2273
  exports.viewerUiCapability = require_sleep.viewerUiCapability;
2265
2274
  exports.withCapInputDefaults = withCapInputDefaults;
2275
+ exports.withoutCallerStamp = require_sleep.withoutCallerStamp;
package/dist/addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as nodePin, $t as AdoptionPendingError, An as RECORD_SETTINGS_MAX_ROWS, Ar as isSecretFieldView, At as defineEntryKind, Bn as scrubKnownSecrets, Bt as declarationsOf, Cn as RECORD_DELETE_BATCH, Dn as RECORD_MAX_INDEX_FIELDS, Dr as SECRET_CLEAR, En as RECORD_MAX_INDEXES, Fn as MIN_SCRUBBED_LENGTH, Ft as RecordIndexSchema, Gn as PEER_BYTES_TICKET_TTL_MS, Gt as parseSecretPath, Hn as PEER_BYTES_CHUNK_BYTES, Ht as REMOVE_LEAF, I as describeCustomActions, In as clearKnownSecrets, It as RecordKindDeclarationSchema, Jt as recordSecretRef, K as expandCapMethods, Kt as recordArrayItemPath, Ln as forgetKnownSecret, Lt as RecordKindNameSchema, M as viewerUiCapability, Mn as resolveSecretViewsIn, Mr as isSecretMarkerLike, Mt as createRecordsAccess, N as DEVICE_CHILDREN_BATCH_MAX, Nn as REVALIDATE_AFTER_MS, Nr as makeSecretMarker, Nt as EntryDescriptorSchema, O as HF_REPO, On as RECORD_QUERY_MAX, Or as classifySecretWrite, Pn as createSecretsAccess, Pr as toSecretFieldView, Pt as RecordFieldPathSchema, Qn as normalizeAddonInitResult, Qt as isZodSecret, R as adminUiCapability, Rn as knownSecretCount, Rt as RecordRetentionSchema, S as createEventBusSliceSource, Sn as RECORD_DEFAULT_MAX_DATA_BYTES, Tn as RECORD_MAX_DATA_BYTES, Un as PEER_BYTES_MAX_OUTSTANDING, Ut as collectSecretLeaves, Vn as shortSecretRefHash, Vt as defineRecordKinds, Wn as PEER_BYTES_STALL_MS, Wt as mapSecretLeaves, Xn as BaseAddon, Yn as DisposerChain, Yt as secretArrayPrefixes, Zt as collectZodSecretPaths, _ as readErrorI18n, _n as recordsErrorFromMessage, an as NoCallerError, b as isDeviceScopedCap, bn as RECORD_CLASSES, c as asString, cn as RecordNotFoundError, cr as SECRET_REF_SCHEME, d as parseJsonUnknown, dn as RecordUniqueViolationError, dr as formatSecretScope, en as BatchTooLargeError, et as readNodePin, f as hfModelUrl, fn as RecordsError, fr as globalSecretScope, g as ErrorI18nPayloadSchema, gn as asRecordsError, hn as UnknownRecordKindError, hr as parseSecretRef, in as InvalidRecordError, it as ReadinessTimeoutError, j as deviceOpsCapability, jn as RECORD_SWEEP_INTERVAL_MS, jr as isSecretMarker, jt as entryBody, kn as RECORD_SECRET_COLLECTION_PREFIX, kr as isSecretClear, ln as RecordSecretUnavailableError, lr as arrayItemFieldPath, mn as UnindexedFilterError, mr as normalizeSecretOwner, nn as FilterRequiredError, nt as MODEL_FORMATS, o as asJsonObject, on as PlaintextSecretError, p as BOOT_RECOVERY_BACKOFF_MS, pn as RevConflictError, pr as isSecretRef, qn as DATAPLANE_SECRET_HEADER, qt as recordSecretCollection, r as maskUrlCredentials, rn as ForeignSecretMarkerError, rt as ReadinessRegistry, sn as RECORDS_ERROR_CODES, st as scopeKey, t as sleep, tn as DeclarationRefusedError, un as RecordTooLargeError, ur as buildSecretRef, vn as RECORD_BATCH_MAX, vr as createEvent, wn as RECORD_ID_MAX_LENGTH, x as createDeviceProxy, xn as RECORD_DATABASES, y as DEVICE_SCOPED_CAPS, yn as RECORD_BATCH_MAX_BYTES, yr as emitReadiness, zn as registerKnownSecret, zt as assertValidDeclaration } from "./sleep-WsrozGDL.mjs";
1
+ import { $n as PEER_BYTES_CHUNK_BYTES, $t as REMOVE_LEAF, A as HF_REPO, An as RECORD_BATCH_MAX_BYTES, Ar as emitReadiness, B as describeCustomActions, Bn as RECORD_SECRET_COLLECTION_PREFIX, Br as SECRET_CLEAR, Bt as settingsBrokersAdoptsFrom, C as addonSliceHandleApi, Cn as RecordsError, Cr as globalSecretScope, Dn as asRecordsError, En as UnknownRecordKindError, Er as parseSecretRef, F as DEVICE_CHILDREN_BATCH_MAX, Fn as RECORD_ID_MAX_LENGTH, Ft as SETTINGS_ARRAY_ADOPTS_PREFIX, Gn as createSecretsAccess, Gr as isSecretMarkerLike, Gt as RecordFieldPathSchema, H as adminUiCapability, Hn as RECORD_SWEEP_INTERVAL_MS, Hr as isSecretClear, Ht as entryBody, I as CALLER_STAMPED_CAPABILITIES, In as RECORD_MAX_DATA_BYTES, It as parseSettingsArrayAdoptsFrom, Jn as forgetKnownSecret, Jt as RecordKindNameSchema, Kn as MIN_SCRUBBED_LENGTH, Kr as makeSecretMarker, Kt as RecordIndexSchema, L as withoutCallerStamp, Ln as RECORD_MAX_INDEXES, Lt as settingsArrayAdoptsFrom, Mn as RECORD_DATABASES, N as deviceOpsCapability, Nn as RECORD_DEFAULT_MAX_DATA_BYTES, On as recordsErrorFromMessage, P as viewerUiCapability, Pn as RECORD_DELETE_BATCH, Pt as makeInMemoryRecords, Qn as shortSecretRefHash, Qt as defineRecordKinds, Rn as RECORD_MAX_INDEX_FIELDS, Rt as SETTINGS_BROKERS_ADOPTS_PREFIX, Sn as RecordUniqueViolationError, Sr as formatSecretScope, Tn as UnindexedFilterError, Tr as normalizeSecretOwner, Un as resolveSecretViewsIn, Ur as isSecretFieldView, Ut as createRecordsAccess, Vn as RECORD_SETTINGS_MAX_ROWS, Vr as classifySecretWrite, Vt as defineEntryKind, Wn as REVALIDATE_AFTER_MS, Wr as isSecretMarker, Wt as EntryDescriptorSchema, X as expandCapMethods, Xn as registerKnownSecret, Xt as assertValidDeclaration, Yn as knownSecretCount, Yt as RecordRetentionSchema, Zn as scrubKnownSecrets, Zt as declarationsOf, _ as readErrorI18n, _n as PlaintextSecretError, an as recordSecretRef, b as isDeviceScopedCap, bn as RecordSecretUnavailableError, br as arrayItemFieldPath, c as asString, cn as collectZodSecretPaths, ct as ReadinessTimeoutError, d as parseJsonUnknown, dn as BatchTooLargeError, dt as scopeKey, en as collectSecretLeaves, er as PEER_BYTES_MAX_OUTSTANDING, f as hfModelUrl, fn as DeclarationRefusedError, g as ErrorI18nPayloadSchema, gn as NoCallerError, hn as InvalidRecordError, in as recordSecretCollection, ir as DATAPLANE_SECRET_HEADER, it as readNodePin, jn as RECORD_CLASSES, kn as RECORD_BATCH_MAX, kr as createEvent, ln as isZodSecret, lr as normalizeAddonInitResult, mn as ForeignSecretMarkerError, nn as parseSecretPath, nr as PEER_BYTES_TICKET_TTL_MS, o as asJsonObject, on as secretArrayPrefixes, or as DisposerChain, ot as MODEL_FORMATS, p as BOOT_RECOVERY_BACKOFF_MS, pn as FilterRequiredError, qn as clearKnownSecrets, qr as toSecretFieldView, qt as RecordKindDeclarationSchema, r as maskUrlCredentials, rn as recordArrayItemPath, rt as nodePin, sr as BaseAddon, st as ReadinessRegistry, t as sleep, tn as mapSecretLeaves, tr as PEER_BYTES_STALL_MS, un as AdoptionPendingError, vn as RECORDS_ERROR_CODES, w as createEventBusSliceSource, wn as RevConflictError, wr as isSecretRef, x as createDeviceProxy, xn as RecordTooLargeError, xr as buildSecretRef, y as DEVICE_SCOPED_CAPS, yn as RecordNotFoundError, yr as SECRET_REF_SCHEME, zn as RECORD_QUERY_MAX, zt as parseSettingsBrokersAdoptsFrom } from "./sleep-bZIhUvjd.mjs";
2
2
  import { t as EventCategory } from "./event-category-BvOFi6PY.mjs";
3
3
  import { a as DeviceType, t as errMsg } from "./err-msg--2RrYiLO.mjs";
4
4
  //#region src/generated/cap-input-defaults.ts
@@ -2134,4 +2134,4 @@ var CAP_STATE_LEAVES = Object.freeze({
2134
2134
  ]
2135
2135
  });
2136
2136
  //#endregion
2137
- export { AdoptionPendingError, BOOT_RECOVERY_BACKOFF_MS, BaseAddon, BatchTooLargeError, CAP_ADVANCE_FIELDS, CAP_INPUT_DEFAULTS, CAP_STATE_LEAVES, COLLECTION_ARRAY_METHODS, DATAPLANE_SECRET_HEADER, DEVICE_CHILDREN_BATCH_MAX, DEVICE_SCOPED_CAPS, DeclarationRefusedError, DeviceType, DisposerChain, EntryDescriptorSchema, ErrorI18nPayloadSchema, EventCategory, FilterRequiredError, ForeignSecretMarkerError, HF_REPO, InvalidRecordError, MIN_SCRUBBED_LENGTH, MODEL_FORMATS, NoCallerError, PEER_BYTES_CHUNK_BYTES, PEER_BYTES_MAX_OUTSTANDING, PEER_BYTES_STALL_MS, PEER_BYTES_TICKET_TTL_MS, PROVIDER_OPTIONAL_METHODS, PlaintextSecretError, RECORDS_ERROR_CODES, RECORD_BATCH_MAX, RECORD_BATCH_MAX_BYTES, RECORD_CLASSES, RECORD_DATABASES, RECORD_DEFAULT_MAX_DATA_BYTES, RECORD_DELETE_BATCH, RECORD_ID_MAX_LENGTH, RECORD_MAX_DATA_BYTES, RECORD_MAX_INDEXES, RECORD_MAX_INDEX_FIELDS, RECORD_QUERY_MAX, RECORD_SECRET_COLLECTION_PREFIX, RECORD_SETTINGS_MAX_ROWS, RECORD_SWEEP_INTERVAL_MS, REMOVE_LEAF, REVALIDATE_AFTER_MS, ReadinessRegistry, ReadinessTimeoutError, RecordFieldPathSchema, RecordIndexSchema, RecordKindDeclarationSchema, RecordKindNameSchema, RecordNotFoundError, RecordRetentionSchema, RecordSecretUnavailableError, RecordTooLargeError, RecordUniqueViolationError, RecordsError, RevConflictError, SECRET_CLEAR, SECRET_REF_SCHEME, UnindexedFilterError, UnknownRecordKindError, adminUiCapability, arrayItemFieldPath, asJsonObject, asRecordsError, asString, assertValidDeclaration, buildSecretRef, classifySecretWrite, clearKnownSecrets, collectSecretLeaves, collectZodSecretPaths, createDeviceProxy, createEvent, createEventBusSliceSource, createRecordsAccess, createSecretsAccess, declarationsOf, defineEntryKind, defineRecordKinds, describeCustomActions, deviceOpsCapability, emitReadiness, entryBody, errMsg, expandCapMethods, forgetKnownSecret, formatSecretScope, globalSecretScope, hfModelUrl, isCollectionArrayMethodName, isDeviceScopedCap, isProviderOptionalMethodName, isSecretClear, isSecretFieldView, isSecretMarker, isSecretMarkerLike, isSecretRef, isZodSecret, knownSecretCount, makeSecretMarker, mapSecretLeaves, maskUrlCredentials, nodePin, normalizeAddonInitResult, normalizeSecretOwner, parseJsonUnknown, parseSecretPath, parseSecretRef, readErrorI18n, readNodePin, recordArrayItemPath, recordSecretCollection, recordSecretRef, recordsErrorFromMessage, registerKnownSecret, resolveSecretViewsIn, scopeKey, scrubKnownSecrets, secretArrayPrefixes, shortSecretRefHash, sleep, toSecretFieldView, viewerUiCapability, withCapInputDefaults };
2137
+ export { AdoptionPendingError, BOOT_RECOVERY_BACKOFF_MS, BaseAddon, BatchTooLargeError, CALLER_STAMPED_CAPABILITIES, CAP_ADVANCE_FIELDS, CAP_INPUT_DEFAULTS, CAP_STATE_LEAVES, COLLECTION_ARRAY_METHODS, DATAPLANE_SECRET_HEADER, DEVICE_CHILDREN_BATCH_MAX, DEVICE_SCOPED_CAPS, DeclarationRefusedError, DeviceType, DisposerChain, EntryDescriptorSchema, ErrorI18nPayloadSchema, EventCategory, FilterRequiredError, ForeignSecretMarkerError, HF_REPO, InvalidRecordError, MIN_SCRUBBED_LENGTH, MODEL_FORMATS, NoCallerError, PEER_BYTES_CHUNK_BYTES, PEER_BYTES_MAX_OUTSTANDING, PEER_BYTES_STALL_MS, PEER_BYTES_TICKET_TTL_MS, PROVIDER_OPTIONAL_METHODS, PlaintextSecretError, RECORDS_ERROR_CODES, RECORD_BATCH_MAX, RECORD_BATCH_MAX_BYTES, RECORD_CLASSES, RECORD_DATABASES, RECORD_DEFAULT_MAX_DATA_BYTES, RECORD_DELETE_BATCH, RECORD_ID_MAX_LENGTH, RECORD_MAX_DATA_BYTES, RECORD_MAX_INDEXES, RECORD_MAX_INDEX_FIELDS, RECORD_QUERY_MAX, RECORD_SECRET_COLLECTION_PREFIX, RECORD_SETTINGS_MAX_ROWS, RECORD_SWEEP_INTERVAL_MS, REMOVE_LEAF, REVALIDATE_AFTER_MS, ReadinessRegistry, ReadinessTimeoutError, RecordFieldPathSchema, RecordIndexSchema, RecordKindDeclarationSchema, RecordKindNameSchema, RecordNotFoundError, RecordRetentionSchema, RecordSecretUnavailableError, RecordTooLargeError, RecordUniqueViolationError, RecordsError, RevConflictError, SECRET_CLEAR, SECRET_REF_SCHEME, SETTINGS_ARRAY_ADOPTS_PREFIX, SETTINGS_BROKERS_ADOPTS_PREFIX, UnindexedFilterError, UnknownRecordKindError, addonSliceHandleApi, adminUiCapability, arrayItemFieldPath, asJsonObject, asRecordsError, asString, assertValidDeclaration, buildSecretRef, classifySecretWrite, clearKnownSecrets, collectSecretLeaves, collectZodSecretPaths, createDeviceProxy, createEvent, createEventBusSliceSource, createRecordsAccess, createSecretsAccess, declarationsOf, defineEntryKind, defineRecordKinds, describeCustomActions, deviceOpsCapability, emitReadiness, entryBody, errMsg, expandCapMethods, forgetKnownSecret, formatSecretScope, globalSecretScope, hfModelUrl, isCollectionArrayMethodName, isDeviceScopedCap, isProviderOptionalMethodName, isSecretClear, isSecretFieldView, isSecretMarker, isSecretMarkerLike, isSecretRef, isZodSecret, knownSecretCount, makeInMemoryRecords, makeSecretMarker, mapSecretLeaves, maskUrlCredentials, nodePin, normalizeAddonInitResult, normalizeSecretOwner, parseJsonUnknown, parseSecretPath, parseSecretRef, parseSettingsArrayAdoptsFrom, parseSettingsBrokersAdoptsFrom, readErrorI18n, readNodePin, recordArrayItemPath, recordSecretCollection, recordSecretRef, recordsErrorFromMessage, registerKnownSecret, resolveSecretViewsIn, scopeKey, scrubKnownSecrets, secretArrayPrefixes, settingsArrayAdoptsFrom, settingsBrokersAdoptsFrom, shortSecretRefHash, sleep, toSecretFieldView, viewerUiCapability, withCapInputDefaults, withoutCallerStamp };
@@ -317,6 +317,28 @@ export declare const storageAdminCapability: {
317
317
  }, z.core.$strip>, z.ZodObject<{
318
318
  adopted: z.ZodNumber;
319
319
  }, z.core.$strip>, "mutation">;
320
+ /**
321
+ * Read rows from a legacy KV table by physical name, without a running
322
+ * `declareCollection`. Used by `records-adopt.ts` when the owner already
323
+ * moved to records and the collection door refuses the name.
324
+ */
325
+ readonly readLegacyCollection: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
326
+ collection: z.ZodString;
327
+ cursor: z.ZodOptional<z.ZodString>;
328
+ limit: z.ZodOptional<z.ZodNumber>;
329
+ }, z.core.$strip>, z.ZodObject<{
330
+ rows: z.ZodArray<z.ZodObject<{
331
+ id: z.ZodString;
332
+ data: z.ZodRecord<z.ZodString, z.ZodUnknown>;
333
+ }, z.core.$strip>>;
334
+ nextCursor: z.ZodNullable<z.ZodString>;
335
+ }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
336
+ /** True when a declared kind lists `collection` as `adoptsFrom` and adoption finished. */
337
+ readonly isAdoptedLegacyTable: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
338
+ collection: z.ZodString;
339
+ }, z.core.$strip>, z.ZodObject<{
340
+ adopted: z.ZodBoolean;
341
+ }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
320
342
  };
321
343
  };
322
344
  export type IStorageAdminProvider = InferProvider<typeof storageAdminCapability>;
package/dist/client.js CHANGED
@@ -25895,6 +25895,50 @@ function isSource(x) {
25895
25895
  return typeof x.read === "function" && typeof x.watch === "function";
25896
25896
  }
25897
25897
  //#endregion
25898
+ //#region src/helpers/addon-slice-handle.ts
25899
+ /** Structural bridge: every `AddonApi` client carries `deviceState` (+ optional `live`). */
25900
+ function addonSliceHandleApi(api) {
25901
+ return api;
25902
+ }
25903
+ //#endregion
25904
+ //#region src/helpers/trpc-leaf.ts
25905
+ function isTrpcProcedureLeaf(value) {
25906
+ if (typeof value !== "object" || value === null) return false;
25907
+ const record = value;
25908
+ return (typeof record.query === "function" || typeof record.mutate === "function" || typeof record.subscribe === "function") && !Array.isArray(value);
25909
+ }
25910
+ function readCapRecord(api, capProp) {
25911
+ const cap = Reflect.get(api, capProp);
25912
+ if (typeof cap !== "object" || cap === null || Array.isArray(cap)) return void 0;
25913
+ return cap;
25914
+ }
25915
+ function readTrpcLeaf(api, capProp, method) {
25916
+ const capRecord = readCapRecord(api, capProp);
25917
+ if (!capRecord) throw new Error(`tRPC client has no router '${capProp}'`);
25918
+ const leaf = capRecord[method];
25919
+ if (!isTrpcProcedureLeaf(leaf)) throw new Error(`tRPC client has no '${capProp}.${method}'`);
25920
+ return leaf;
25921
+ }
25922
+ /**
25923
+ * Invoke `api.<capProp>.<method>.{query|mutate|subscribe}(input)`.
25924
+ * `Result` is the generated proxy method's return. The leaf itself is only
25925
+ * `unknown` (the client is a structural bag), so the assertion is the one
25926
+ * boundary between that bag and the typed proxy.
25927
+ */
25928
+ function invokeTrpcLeaf(api, capProp, method, kind, input, push) {
25929
+ const fn = readTrpcLeaf(api, capProp, method);
25930
+ if (kind === "mutation") {
25931
+ if (typeof fn.mutate !== "function") throw new Error(`tRPC '${capProp}.${method}' has no mutate()`);
25932
+ return fn.mutate(input);
25933
+ }
25934
+ if (kind === "subscription") {
25935
+ if (typeof fn.subscribe !== "function") throw new Error(`tRPC '${capProp}.${method}' has no subscribe()`);
25936
+ return fn.subscribe(input, push);
25937
+ }
25938
+ if (typeof fn.query !== "function") throw new Error(`tRPC '${capProp}.${method}' has no query()`);
25939
+ return fn.query(input);
25940
+ }
25941
+ //#endregion
25898
25942
  //#region src/generated/device-proxy.ts
25899
25943
  /**
25900
25944
  * Build a DeviceProxy that pre-binds deviceId + nodeId on every method call
@@ -25912,8 +25956,7 @@ function isSource(x) {
25912
25956
  * field on the returned object.
25913
25957
  */
25914
25958
  function createDeviceProxy(api, binding, opts) {
25915
- const typedApi = api;
25916
- const stateSource = opts?.stateSource ?? createLazyTrpcSource(api);
25959
+ const stateSource = opts?.stateSource ?? createLazyTrpcSource(addonSliceHandleApi(api));
25917
25960
  /** Merge `{deviceId, nodeId?}` into the caller-supplied input. */
25918
25961
  function mergeInput(input, nodeId) {
25919
25962
  const base = typeof input === "object" && input !== null ? input : {};
@@ -25926,20 +25969,8 @@ function createDeviceProxy(api, binding, opts) {
25926
25969
  deviceId: binding.deviceId
25927
25970
  };
25928
25971
  }
25929
- /**
25930
- * Invoke `api.<capProp>.<method>.{query|mutate|subscribe}(merged)`.
25931
- * Returns `any` so the caller-side per-method declaration assigns
25932
- * cleanly into the strongly-typed `InferDeviceProxyCap<...>` shape on
25933
- * the `DeviceProxy` interface — the proxy's contract is enforced by
25934
- * the interface, not the dispatch helper.
25935
- */
25936
25972
  function callLeaf(capProp, method, kind, merged, push) {
25937
- const leaf = typedApi[capProp]?.[method];
25938
- if (!leaf) throw new Error(`DeviceProxy: api has no '${capProp}.${method}'`);
25939
- const fn = leaf;
25940
- if (kind === "mutation") return fn.mutate(merged);
25941
- if (kind === "subscription") return fn.subscribe(merged, push);
25942
- return fn.query(merged);
25973
+ return invokeTrpcLeaf(api, capProp, method, kind, merged, push);
25943
25974
  }
25944
25975
  /**
25945
25976
  * Device-scoped cap dispatch. Looks up the binding entry for `capName`
@@ -27252,9 +27283,10 @@ var SystemMirror = class {
27252
27283
  for (let i = 0; i < targets.length; i += parallelism) {
27253
27284
  const chunk = targets.slice(i, i + parallelism);
27254
27285
  const settled = await Promise.allSettled(chunk.map(async (proxy) => {
27255
- const cap = proxy[capName];
27256
- if (!cap || typeof cap[methodName] !== "function") throw new Error(`device '${proxy.deviceId}' does not expose '${capName}.${methodName}'`);
27257
- return await cap[methodName](args);
27286
+ const cap = Reflect.get(proxy, capName);
27287
+ const method = typeof cap === "object" && cap !== null ? Reflect.get(cap, methodName) : void 0;
27288
+ if (typeof method !== "function") throw new Error(`device '${proxy.deviceId}' does not expose '${capName}.${methodName}'`);
27289
+ return await Reflect.apply(method, cap, [args]);
27258
27290
  }));
27259
27291
  for (let j = 0; j < settled.length; j++) {
27260
27292
  const proxy = chunk[j];
@@ -27489,21 +27521,8 @@ function matchesString(haystack, match) {
27489
27521
  * dropping the reference.
27490
27522
  */
27491
27523
  function createSystemProxy(api) {
27492
- const typedApi = api;
27493
- /**
27494
- * Invoke `api.<capProp>.<method>.{query|mutate|subscribe}(input)`.
27495
- * Returns `any` so the caller-side per-method declaration assigns
27496
- * cleanly into the strongly-typed `Pick<InferProvider<...>, ...>`
27497
- * shape on the `SystemProxy` interface — the proxy's contract is
27498
- * enforced by the interface, not the dispatch helper.
27499
- */
27500
27524
  function dispatch(capProp, method, kind, input, push) {
27501
- const leaf = typedApi[capProp]?.[method];
27502
- if (!leaf) throw new Error(`SystemProxy: api has no '${capProp}.${method}'`);
27503
- const fn = leaf;
27504
- if (kind === "mutation") return fn.mutate(input);
27505
- if (kind === "subscription") return fn.subscribe(input, push);
27506
- return fn.query(input);
27525
+ return invokeTrpcLeaf(api, capProp, method, kind, input, push);
27507
27526
  }
27508
27527
  return {
27509
27528
  addonPages: { listPages: (input) => dispatch("addonPages", "listPages", "query", input) },
package/dist/client.mjs CHANGED
@@ -25894,6 +25894,50 @@ function isSource(x) {
25894
25894
  return typeof x.read === "function" && typeof x.watch === "function";
25895
25895
  }
25896
25896
  //#endregion
25897
+ //#region src/helpers/addon-slice-handle.ts
25898
+ /** Structural bridge: every `AddonApi` client carries `deviceState` (+ optional `live`). */
25899
+ function addonSliceHandleApi(api) {
25900
+ return api;
25901
+ }
25902
+ //#endregion
25903
+ //#region src/helpers/trpc-leaf.ts
25904
+ function isTrpcProcedureLeaf(value) {
25905
+ if (typeof value !== "object" || value === null) return false;
25906
+ const record = value;
25907
+ return (typeof record.query === "function" || typeof record.mutate === "function" || typeof record.subscribe === "function") && !Array.isArray(value);
25908
+ }
25909
+ function readCapRecord(api, capProp) {
25910
+ const cap = Reflect.get(api, capProp);
25911
+ if (typeof cap !== "object" || cap === null || Array.isArray(cap)) return void 0;
25912
+ return cap;
25913
+ }
25914
+ function readTrpcLeaf(api, capProp, method) {
25915
+ const capRecord = readCapRecord(api, capProp);
25916
+ if (!capRecord) throw new Error(`tRPC client has no router '${capProp}'`);
25917
+ const leaf = capRecord[method];
25918
+ if (!isTrpcProcedureLeaf(leaf)) throw new Error(`tRPC client has no '${capProp}.${method}'`);
25919
+ return leaf;
25920
+ }
25921
+ /**
25922
+ * Invoke `api.<capProp>.<method>.{query|mutate|subscribe}(input)`.
25923
+ * `Result` is the generated proxy method's return. The leaf itself is only
25924
+ * `unknown` (the client is a structural bag), so the assertion is the one
25925
+ * boundary between that bag and the typed proxy.
25926
+ */
25927
+ function invokeTrpcLeaf(api, capProp, method, kind, input, push) {
25928
+ const fn = readTrpcLeaf(api, capProp, method);
25929
+ if (kind === "mutation") {
25930
+ if (typeof fn.mutate !== "function") throw new Error(`tRPC '${capProp}.${method}' has no mutate()`);
25931
+ return fn.mutate(input);
25932
+ }
25933
+ if (kind === "subscription") {
25934
+ if (typeof fn.subscribe !== "function") throw new Error(`tRPC '${capProp}.${method}' has no subscribe()`);
25935
+ return fn.subscribe(input, push);
25936
+ }
25937
+ if (typeof fn.query !== "function") throw new Error(`tRPC '${capProp}.${method}' has no query()`);
25938
+ return fn.query(input);
25939
+ }
25940
+ //#endregion
25897
25941
  //#region src/generated/device-proxy.ts
25898
25942
  /**
25899
25943
  * Build a DeviceProxy that pre-binds deviceId + nodeId on every method call
@@ -25911,8 +25955,7 @@ function isSource(x) {
25911
25955
  * field on the returned object.
25912
25956
  */
25913
25957
  function createDeviceProxy(api, binding, opts) {
25914
- const typedApi = api;
25915
- const stateSource = opts?.stateSource ?? createLazyTrpcSource(api);
25958
+ const stateSource = opts?.stateSource ?? createLazyTrpcSource(addonSliceHandleApi(api));
25916
25959
  /** Merge `{deviceId, nodeId?}` into the caller-supplied input. */
25917
25960
  function mergeInput(input, nodeId) {
25918
25961
  const base = typeof input === "object" && input !== null ? input : {};
@@ -25925,20 +25968,8 @@ function createDeviceProxy(api, binding, opts) {
25925
25968
  deviceId: binding.deviceId
25926
25969
  };
25927
25970
  }
25928
- /**
25929
- * Invoke `api.<capProp>.<method>.{query|mutate|subscribe}(merged)`.
25930
- * Returns `any` so the caller-side per-method declaration assigns
25931
- * cleanly into the strongly-typed `InferDeviceProxyCap<...>` shape on
25932
- * the `DeviceProxy` interface — the proxy's contract is enforced by
25933
- * the interface, not the dispatch helper.
25934
- */
25935
25971
  function callLeaf(capProp, method, kind, merged, push) {
25936
- const leaf = typedApi[capProp]?.[method];
25937
- if (!leaf) throw new Error(`DeviceProxy: api has no '${capProp}.${method}'`);
25938
- const fn = leaf;
25939
- if (kind === "mutation") return fn.mutate(merged);
25940
- if (kind === "subscription") return fn.subscribe(merged, push);
25941
- return fn.query(merged);
25972
+ return invokeTrpcLeaf(api, capProp, method, kind, merged, push);
25942
25973
  }
25943
25974
  /**
25944
25975
  * Device-scoped cap dispatch. Looks up the binding entry for `capName`
@@ -27251,9 +27282,10 @@ var SystemMirror = class {
27251
27282
  for (let i = 0; i < targets.length; i += parallelism) {
27252
27283
  const chunk = targets.slice(i, i + parallelism);
27253
27284
  const settled = await Promise.allSettled(chunk.map(async (proxy) => {
27254
- const cap = proxy[capName];
27255
- if (!cap || typeof cap[methodName] !== "function") throw new Error(`device '${proxy.deviceId}' does not expose '${capName}.${methodName}'`);
27256
- return await cap[methodName](args);
27285
+ const cap = Reflect.get(proxy, capName);
27286
+ const method = typeof cap === "object" && cap !== null ? Reflect.get(cap, methodName) : void 0;
27287
+ if (typeof method !== "function") throw new Error(`device '${proxy.deviceId}' does not expose '${capName}.${methodName}'`);
27288
+ return await Reflect.apply(method, cap, [args]);
27257
27289
  }));
27258
27290
  for (let j = 0; j < settled.length; j++) {
27259
27291
  const proxy = chunk[j];
@@ -27488,21 +27520,8 @@ function matchesString(haystack, match) {
27488
27520
  * dropping the reference.
27489
27521
  */
27490
27522
  function createSystemProxy(api) {
27491
- const typedApi = api;
27492
- /**
27493
- * Invoke `api.<capProp>.<method>.{query|mutate|subscribe}(input)`.
27494
- * Returns `any` so the caller-side per-method declaration assigns
27495
- * cleanly into the strongly-typed `Pick<InferProvider<...>, ...>`
27496
- * shape on the `SystemProxy` interface — the proxy's contract is
27497
- * enforced by the interface, not the dispatch helper.
27498
- */
27499
27523
  function dispatch(capProp, method, kind, input, push) {
27500
- const leaf = typedApi[capProp]?.[method];
27501
- if (!leaf) throw new Error(`SystemProxy: api has no '${capProp}.${method}'`);
27502
- const fn = leaf;
27503
- if (kind === "mutation") return fn.mutate(input);
27504
- if (kind === "subscription") return fn.subscribe(input, push);
27505
- return fn.query(input);
27524
+ return invokeTrpcLeaf(api, capProp, method, kind, input, push);
27506
27525
  }
27507
27526
  return {
27508
27527
  addonPages: { listPages: (input) => dispatch("addonPages", "listPages", "query", input) },
@@ -137,6 +137,8 @@ export interface DeviceContext {
137
137
  * + persistInitialConfig + createContext + register` flow.
138
138
  */
139
139
  export type DeviceConstructor<T extends IDevice = IDevice> = new (ctx: DeviceContext) => T;
140
+ /** Map entry helper — concrete camera/hub classes widen to `DeviceConstructor<IDevice>`. */
141
+ export declare function widenDeviceConstructor<T extends IDevice>(ctor: DeviceConstructor<T>): DeviceConstructor<IDevice>;
140
142
  export interface DeviceManagerApi {
141
143
  /**
142
144
  * Create, register, and persist a device in one call.
@@ -35,14 +35,14 @@
35
35
  * request schema on purpose (see `egressTransportFromRequest`): a plane is a
36
36
  * live object, so an off-node caller could not use one anyway.
37
37
  */
38
- import type { spawn as nodeSpawn } from 'node:child_process';
39
38
  import type { IScopedLogger } from '../interfaces/logging.js';
40
39
  import type { FfmpegInvocation } from './invocation.js';
40
+ import type { FfmpegSpawnFn } from './process.js';
41
41
  import type { Fmp4FragmentPlane } from './fmp4-fragment-plane.js';
42
42
  export interface Fmp4FragmentChildDeps {
43
43
  readonly logger: IScopedLogger;
44
44
  readonly ffmpegBinaryPath: string;
45
- readonly spawnFn: typeof nodeSpawn;
45
+ readonly spawnFn: FfmpegSpawnFn;
46
46
  /** How long the child may produce no UNIT before it is declared dead. */
47
47
  readonly firstUnitTimeoutMs?: number;
48
48
  /** The child exited, or its output stopped parsing, AFTER it went live. */
@@ -32,6 +32,27 @@
32
32
  */
33
33
  import { spawn, type ChildProcess, type SpawnOptions } from 'node:child_process';
34
34
  import type { IScopedLogger } from '../interfaces/logging.js';
35
+ /** Subset of {@link ChildProcess} every live-media ffmpeg site reads. */
36
+ export interface SpawnedFfmpegProcess {
37
+ readonly pid?: number;
38
+ readonly killed?: boolean;
39
+ readonly exitCode?: number | null;
40
+ readonly signalCode?: NodeJS.Signals | null;
41
+ readonly stdin?: {
42
+ on(event: string, listener: () => void): void;
43
+ end(): void;
44
+ } | null;
45
+ readonly stdout: NodeJS.ReadableStream | null;
46
+ readonly stderr: NodeJS.ReadableStream | null;
47
+ on(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
48
+ on(event: 'error', listener: (err: Error) => void): this;
49
+ once(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
50
+ once(event: 'error', listener: (err: Error) => void): this;
51
+ kill(signal?: NodeJS.Signals): boolean;
52
+ }
53
+ /** Injectable ffmpeg spawn — the three-arg shape live-media sites use. */
54
+ export type FfmpegSpawnFn = (command: string, args: readonly string[], options?: SpawnOptions) => SpawnedFfmpegProcess;
55
+ export declare function defaultFfmpegSpawn(command: string, args: readonly string[], options?: SpawnOptions): SpawnedFfmpegProcess;
35
56
  /** How a child ended. */
36
57
  export type FfmpegExitClass =
37
58
  /** Exited 0. */
@@ -9031,6 +9031,20 @@ export type AppRouter = TrpcCoreRouter<{
9031
9031
  output: z.infer<typeof storageAdminCapability.methods.adoptRecords.output>;
9032
9032
  meta: object;
9033
9033
  }>;
9034
+ readLegacyCollection: TRPCQueryProcedure<{
9035
+ input: {
9036
+ [x: string]: unknown;
9037
+ } & z.input<typeof storageAdminCapability.methods.readLegacyCollection.input>;
9038
+ output: z.infer<typeof storageAdminCapability.methods.readLegacyCollection.output>;
9039
+ meta: object;
9040
+ }>;
9041
+ isAdoptedLegacyTable: TRPCQueryProcedure<{
9042
+ input: {
9043
+ [x: string]: unknown;
9044
+ } & z.input<typeof storageAdminCapability.methods.isAdoptedLegacyTable.input>;
9045
+ output: z.infer<typeof storageAdminCapability.methods.isAdoptedLegacyTable.output>;
9046
+ meta: object;
9047
+ }>;
9034
9048
  }>>;
9035
9049
  storageEvictable: TRPCBuiltRouter<{
9036
9050
  ctx: TrpcContext;
@@ -6,7 +6,7 @@
6
6
  * scope+access check inside `protectedProcedure` (see
7
7
  * `server/backend/src/api/trpc/trpc.middleware.ts`).
8
8
  *
9
- * Coverage: 1367 method paths across 177 capabilities.
9
+ * Coverage: 1369 method paths across 177 capabilities.
10
10
  */
11
11
  import type { CapabilityMethodAccess } from '../capabilities/capability-definition.js';
12
12
  export interface MethodAccessRecord {
@@ -0,0 +1,4 @@
1
+ import type { SliceHandleApi } from '../device/device-state-handle.js';
2
+ import type { AddonApi } from '../generated/addon-api.js';
3
+ /** Structural bridge: every `AddonApi` client carries `deviceState` (+ optional `live`). */
4
+ export declare function addonSliceHandleApi(api: AddonApi): SliceHandleApi;
@@ -0,0 +1,17 @@
1
+ import type { AddonApi } from '../generated/addon-api.js';
2
+ /** tRPC client procedure bundle (`query` / `mutate` / `subscribe`). */
3
+ export interface TrpcProcedureLeaf {
4
+ readonly query?: (input?: unknown) => unknown;
5
+ readonly mutate?: (input?: unknown) => unknown;
6
+ readonly subscribe?: (input?: unknown, push?: unknown) => unknown;
7
+ }
8
+ export declare function isTrpcProcedureLeaf(value: unknown): value is TrpcProcedureLeaf;
9
+ export declare function readTrpcLeaf(api: AddonApi, capProp: string, method: string): TrpcProcedureLeaf;
10
+ export type TrpcDispatchKind = 'query' | 'mutation' | 'subscription';
11
+ /**
12
+ * Invoke `api.<capProp>.<method>.{query|mutate|subscribe}(input)`.
13
+ * `Result` is the generated proxy method's return. The leaf itself is only
14
+ * `unknown` (the client is a structural bag), so the assertion is the one
15
+ * boundary between that bag and the typed proxy.
16
+ */
17
+ export declare function invokeTrpcLeaf<Result>(api: AddonApi, capProp: string, method: string, kind: TrpcDispatchKind, input?: unknown, push?: unknown): Result;
package/dist/index.d.ts CHANGED
@@ -47,7 +47,7 @@ export type * from './interfaces/capability.js';
47
47
  export type * from './interfaces/config-port.js';
48
48
  export type * from './interfaces/config-ui.js';
49
49
  export type { HydratedFieldEntry } from './interfaces/config-ui.js';
50
- export { collectHydratedFieldEntries, collectHydratedFieldValues, hydrateSchema, resolveHydratedFieldValue, WELL_KNOWN_TAB_MAP, WELL_KNOWN_TABS, } from './interfaces/config-ui.js';
50
+ export { collectHydratedFieldEntries, collectHydratedFieldValues, dehydrateConfigField, dehydrateSchema, hydrateSchema, resolveHydratedFieldValue, WELL_KNOWN_TAB_MAP, WELL_KNOWN_TABS, } from './interfaces/config-ui.js';
51
51
  export { collectKeychainStoredKeys, collectSecretConfigKeys, isKeychainStoredField, isSecretConfigField, REDACTED_SECRET, schemaDeclaresAnyField, } from './interfaces/config-ui-secrets.js';
52
52
  export * from './keychain/index.js';
53
53
  export * from './records/index.js';
@@ -190,6 +190,7 @@ export type { IDevice } from './device/device.js';
190
190
  export type { DeviceBinding, DeviceBindingEntry } from './device/device-binding.js';
191
191
  export { DeviceConfig } from './device/device-config.js';
192
192
  export type { DeviceConstructor, DeviceContext, DeviceManagerApi, DevicePersistConfigOptions, IDeviceRegistry, IDeviceRegistryReader, } from './device/device-context.js';
193
+ export { widenDeviceConstructor } from './device/device-context.js';
193
194
  export type { AccessoryControlInput, AccessoryControlKind, AccessoryControlPick, DeviceControlKind, SensorMapping, } from './device/device-control-resolution.js';
194
195
  export { DEVICE_TYPE_CONTROL_KIND, hasMotionTrigger, isNode, MOTION_TRIGGER_FEATURE, pickAccessoryControl, resolveDeviceControlKind, resolveMutate, SENSOR_FEATURES, SENSOR_MAP, } from './device/device-control-resolution.js';
195
196
  export type { DeviceDoAction, DeviceDoOpenArg } from './device/device-do-actions.js';