@camstack/system 1.2.444 → 1.2.446

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 (144) hide show
  1. package/dist/addon-runner.js +40 -31
  2. package/dist/addon-runner.mjs +41 -32
  3. package/dist/{agent-https-DlpTMDqA.js → agent-https-5DYAOJMO.js} +810 -12
  4. package/dist/{agent-https-U0d4uvn2.mjs → agent-https-BWUEf6ev.mjs} +697 -13
  5. package/dist/auth/admin-token-manager.d.ts +9 -3
  6. package/dist/auth/api-key-manager.d.ts +9 -3
  7. package/dist/auth/auth-audit-log.d.ts +9 -3
  8. package/dist/auth/device-credential-manager.d.ts +5 -1
  9. package/dist/auth/external-identity-manager.d.ts +8 -21
  10. package/dist/auth/login-session-manager.d.ts +11 -3
  11. package/dist/auth/scoped-token-manager.d.ts +8 -52
  12. package/dist/auth/totp-manager.d.ts +11 -3
  13. package/dist/auth/user-manager.d.ts +10 -17
  14. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  15. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  16. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  17. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  18. package/dist/builtins/alerts/alert-store.d.ts +32 -0
  19. package/dist/builtins/alerts/alerts.addon.d.ts +9 -2
  20. package/dist/builtins/alerts/alerts.addon.js +373 -154
  21. package/dist/builtins/alerts/alerts.addon.mjs +372 -154
  22. package/dist/builtins/alerts/critical-push.d.ts +4 -0
  23. package/dist/builtins/alerts/emit-alert-policy.d.ts +28 -0
  24. package/dist/builtins/alerts/record-kinds.d.ts +15 -0
  25. package/dist/builtins/autotrack/index.js +1 -1
  26. package/dist/builtins/autotrack/index.mjs +1 -1
  27. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.d.ts +1 -0
  28. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +134 -193
  29. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +134 -193
  30. package/dist/builtins/backup-orchestrator/destination-policy.d.ts +4 -2
  31. package/dist/builtins/backup-orchestrator/encryption-key-store.d.ts +4 -2
  32. package/dist/builtins/backup-orchestrator/record-kinds.d.ts +58 -0
  33. package/dist/builtins/backup-orchestrator/schedule-store.d.ts +4 -2
  34. package/dist/builtins/backup-orchestrator/seed-marker-store.d.ts +4 -2
  35. package/dist/builtins/calendars/calendar-prefs-store.d.ts +13 -5
  36. package/dist/builtins/calendars/calendars.addon.d.ts +2 -2
  37. package/dist/builtins/calendars/calendars.addon.js +67 -64
  38. package/dist/builtins/calendars/calendars.addon.mjs +59 -64
  39. package/dist/builtins/calendars/record-kinds.d.ts +18 -0
  40. package/dist/builtins/camera-grid/index.js +1 -1
  41. package/dist/builtins/camera-grid/index.mjs +1 -1
  42. package/dist/builtins/cluster-agent/record-kinds.d.ts +36 -0
  43. package/dist/builtins/composer/composer.addon.js +2 -2
  44. package/dist/builtins/composer/composer.addon.mjs +2 -2
  45. package/dist/builtins/console-logging/index.js +1 -1
  46. package/dist/builtins/console-logging/index.mjs +1 -1
  47. package/dist/builtins/core-blocks/block-settings-store.d.ts +8 -4
  48. package/dist/builtins/core-blocks/core-block-store.d.ts +8 -16
  49. package/dist/builtins/core-blocks/core-blocks.addon.js +85 -112
  50. package/dist/builtins/core-blocks/core-blocks.addon.mjs +86 -113
  51. package/dist/builtins/core-blocks/index.mjs +1 -1
  52. package/dist/builtins/core-blocks/record-kinds.d.ts +26 -0
  53. package/dist/builtins/device-manager/device-manager.addon.js +111 -187
  54. package/dist/builtins/device-manager/device-manager.addon.mjs +110 -187
  55. package/dist/builtins/device-manager/device-tombstone-store.d.ts +9 -48
  56. package/dist/builtins/device-manager/record-kinds.d.ts +14 -0
  57. package/dist/builtins/hub-forwarder/index.js +1 -1
  58. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  59. package/dist/builtins/keychain/index.js +152 -22
  60. package/dist/builtins/keychain/index.mjs +152 -22
  61. package/dist/builtins/keychain/keychain-service.d.ts +3 -2
  62. package/dist/builtins/keychain/keychain-store.d.ts +13 -2
  63. package/dist/builtins/keychain/record-kinds.d.ts +16 -0
  64. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  65. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  66. package/dist/builtins/local-auth/auth-schema.d.ts +3 -1
  67. package/dist/builtins/local-auth/local-auth.addon.js +2903 -2123
  68. package/dist/builtins/local-auth/local-auth.addon.mjs +2904 -2124
  69. package/dist/builtins/local-auth/oauth-session-manager.d.ts +8 -48
  70. package/dist/builtins/local-auth/record-kinds.d.ts +141 -0
  71. package/dist/builtins/local-network/local-network.addon.js +2 -2
  72. package/dist/builtins/local-network/local-network.addon.mjs +2 -2
  73. package/dist/builtins/loki-logging/index.js +1 -1
  74. package/dist/builtins/loki-logging/index.mjs +1 -1
  75. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  76. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  77. package/dist/builtins/platform-probe/index.js +1 -1
  78. package/dist/builtins/platform-probe/index.mjs +1 -1
  79. package/dist/builtins/record-entries/index.js +1 -1
  80. package/dist/builtins/record-entries/index.mjs +1 -1
  81. package/dist/builtins/records/legacy-table-row-count.d.ts +5 -0
  82. package/dist/builtins/records/phase6-declare-gate.d.ts +28 -0
  83. package/dist/builtins/records-isolated.d.ts +10 -0
  84. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  85. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  86. package/dist/builtins/snapshot/index.js +1 -1
  87. package/dist/builtins/snapshot/index.mjs +1 -1
  88. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  89. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  90. package/dist/builtins/sqlite-storage/index.js +1 -1
  91. package/dist/builtins/sqlite-storage/index.mjs +1 -1
  92. package/dist/builtins/sqlite-storage/integration-record-kinds.d.ts +30 -0
  93. package/dist/builtins/sqlite-storage/integration-registry.d.ts +10 -16
  94. package/dist/builtins/sqlite-storage/records/count-settings-array-legacy.d.ts +5 -0
  95. package/dist/builtins/sqlite-storage/records/count-settings-brokers-legacy.d.ts +6 -0
  96. package/dist/builtins/sqlite-storage/records/records-engine-types.d.ts +5 -0
  97. package/dist/builtins/sqlite-storage/records/records-engine.d.ts +4 -0
  98. package/dist/builtins/sqlite-storage/records/records-provider.d.ts +5 -1
  99. package/dist/builtins/sqlite-storage/sqlite-settings-backend.d.ts +17 -0
  100. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +111 -3
  101. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +111 -3
  102. package/dist/builtins/sqlite-storage/storage-admin-provider.d.ts +9 -1
  103. package/dist/builtins/storage-orchestrator/drain-state-store.d.ts +5 -2
  104. package/dist/builtins/storage-orchestrator/location-store.d.ts +7 -2
  105. package/dist/builtins/storage-orchestrator/record-kinds.d.ts +38 -0
  106. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.d.ts +2 -0
  107. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +196 -5
  108. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +195 -6
  109. package/dist/builtins/system-config/record-kinds.d.ts +32 -0
  110. package/dist/builtins/system-config/system-config.addon.js +53 -618
  111. package/dist/builtins/system-config/system-config.addon.mjs +29 -577
  112. package/dist/builtins/winston-logging/index.js +1 -1
  113. package/dist/builtins/winston-logging/index.mjs +1 -1
  114. package/dist/{composition-sources-C3rKncIF.mjs → composition-sources-BmC5jAUv.mjs} +1 -1
  115. package/dist/{composition-sources-NAPZddic.js → composition-sources-BwIIltnZ.js} +1 -1
  116. package/dist/{constants-BKX2QnIg.mjs → constants-6XHGmEUF.mjs} +1 -1
  117. package/dist/{constants-BXiNEIeV.js → constants-DA_tjzIk.js} +1 -1
  118. package/dist/{device-ca-jxjSL8Ov.mjs → device-ca-Bh_ClxMO.mjs} +1 -1
  119. package/dist/{device-ca-DT9X2S6d.js → device-ca-CnbrgfmW.js} +1 -1
  120. package/dist/{dist-D1vECb_6.js → dist-BkNfEJKa.js} +521 -64
  121. package/dist/{dist-DERK-gP5.mjs → dist-CkZIrsAP.mjs} +462 -65
  122. package/dist/file-host-worker.js +1 -1
  123. package/dist/file-host-worker.mjs +1 -1
  124. package/dist/{hub-mdns-ciao-CRaC97V0.mjs → hub-mdns-ciao-CoyIUWHC.mjs} +2 -2
  125. package/dist/{hub-mdns-ciao-Cah9GCIg.js → hub-mdns-ciao-m5LIr4oA.js} +2 -2
  126. package/dist/index.d.ts +7 -0
  127. package/dist/index.js +3095 -2821
  128. package/dist/index.mjs +3067 -2810
  129. package/dist/kernel/index.d.ts +2 -0
  130. package/dist/kernel/moleculer/event-bus.d.ts +3 -1
  131. package/dist/kernel/moleculer/mesh-mtls/mesh-certificate-registry.d.ts +5 -1
  132. package/dist/kernel/moleculer/remote-logger.d.ts +2 -2
  133. package/dist/kernel/transport/cap-route-resolver.d.ts +9 -38
  134. package/dist/phase6-declare-gate-BDWZuB2n.mjs +93 -0
  135. package/dist/phase6-declare-gate-Bl7KocEs.js +98 -0
  136. package/dist/read-all-rows-CVoO1ONM.js +29 -0
  137. package/dist/read-all-rows-TaPqdWNF.mjs +25 -0
  138. package/dist/records/read-all-rows.d.ts +6 -0
  139. package/dist/{restore-archive-Dy-qKTdF.js → restore-archive-B57xI5Ue.js} +353 -5
  140. package/dist/{restore-archive-daKyE24F.mjs → restore-archive-CMr4V7Fi.mjs} +339 -9
  141. package/dist/tls/agent-https-names.d.ts +9 -13
  142. package/dist/{wal-maintenance-zRc24mOC.mjs → wal-maintenance-Bqm4zrNA.mjs} +0 -0
  143. package/dist/{wal-maintenance-dAv4IdzC.js → wal-maintenance-CuG1DUca.js} +0 -0
  144. package/package.json +1 -1
@@ -49,6 +49,8 @@ export { createAddonService, validateProviderRegistrations } from "./moleculer/a
49
49
  export { createCoreCapService, CORE_CAP_SERVICE_NAME } from "./moleculer/core-cap-service.js";
50
50
  export type { CoreCapAction, CoreCapCallOrigin, CoreCapServiceOptions } from "./moleculer/core-cap-service.js";
51
51
  export { createAddonContext, createUdsAddonContext, setHubConnected, adaptBrokerToCluster, registerEventBusService, setNodeEventInterest, getMoleculerEventStats, subscribePassthrough, getBrokerEventBus, clusterEventTopic, EVENT_TOPIC_PREFIX } from "./moleculer/addon-context-factory.js";
52
+ export { asBrokerLike } from "./moleculer/event-bus.js";
53
+ export type { BrokerLike } from "./moleculer/event-bus.js";
52
54
  export type { MoleculerEventStats } from "./moleculer/addon-context-factory.js";
53
55
  export { HubLogForwarder } from "./moleculer/hub-log-forwarder.js";
54
56
  export type { AddonContextOptions } from "./moleculer/addon-context-factory.js";
@@ -4,7 +4,7 @@ import type { ServiceBroker } from "moleculer";
4
4
  * Narrow interface for the Moleculer ServiceBroker surface used in this file.
5
5
  * moleculer's index.d.ts chains through eventemitter2 whose package.json has
6
6
  * no `types` field; typescript-eslint's no-unsafe-* rules flag every
7
- * broker.X access. Cast once per function: `const bkr = broker as unknown as BrokerLike`.
7
+ * broker.X access when eslint no-unsafe rules apply elsewhere.
8
8
  */
9
9
  export interface BrokerLike {
10
10
  readonly nodeID: string;
@@ -19,6 +19,8 @@ export interface BrokerLike {
19
19
  warn?: (msg: string) => void;
20
20
  };
21
21
  }
22
+ /** Documented boundary: CamStack brokers are always `createBroker` products. */
23
+ export declare function asBrokerLike(broker: ServiceBroker): BrokerLike;
22
24
  /**
23
25
  * Topic prefix for clustered EventBus broadcasts. The `camstack.evt.`
24
26
  * namespace keeps our events disjoint from Moleculer internal events
@@ -1,4 +1,5 @@
1
- import type { CollectionColumn, IScopedLogger, SettingsStoreClient } from "@camstack/types";
1
+ import type { CollectionColumn, IScopedLogger, RecordKindHandle, SettingsStoreClient } from "@camstack/types";
2
+ import type { MeshNodeCertificateBody } from "../../../builtins/system-config/record-kinds.js";
2
3
  import type { MeshCrl } from "./mesh-crl.js";
3
4
  /**
4
5
  * @durable class=config owner=system-config
@@ -45,7 +46,9 @@ export declare class MeshCertificateRegistry {
45
46
  constructor(store: SettingsStoreClient, deps?: {
46
47
  readonly now?: () => number;
47
48
  readonly logger?: IScopedLogger;
49
+ readonly meshKind?: RecordKindHandle<MeshNodeCertificateBody> | null;
48
50
  });
51
+ private recordToBody;
49
52
  private now;
50
53
  load(): Promise<void>;
51
54
  /** Write down a leaf the hub just issued. Idempotent per fingerprint. */
@@ -95,6 +98,7 @@ export declare class MeshCertificateRegistry {
95
98
  isRevoked(serial: string): boolean;
96
99
  reap(): Promise<number>;
97
100
  private insert;
101
+ private deleteRow;
98
102
  private persist;
99
103
  }
100
104
  export declare function setProcessMeshCertificateRegistry(registry: MeshCertificateRegistry | null): void;
@@ -1,6 +1,6 @@
1
1
  import type { ServiceBroker } from "moleculer";
2
2
  import type { IScopedLogger, LogTags } from "@camstack/types";
3
- import type { BrokerLike } from "./event-bus.js";
3
+ import { type BrokerLike } from "./event-bus.js";
4
4
  /**
5
5
  * Call after `broker.waitForServices('$hub')` to enable log forwarding.
6
6
  *
@@ -17,7 +17,7 @@ declare function setHubConnected(broker?: ServiceBroker): void;
17
17
  */
18
18
  declare function __resetHubConnectedForTests(): void;
19
19
  export { __resetHubConnectedForTests };
20
- declare function createRemoteLogger(broker: ServiceBroker, addonId: string, scope?: string, tags?: LogTags): IScopedLogger;
20
+ declare function createRemoteLogger(broker: BrokerLike, addonId: string, scope?: string, tags?: LogTags): IScopedLogger;
21
21
  export { createRemoteLogger };
22
22
  /**
23
23
  * Build a hub-forwarding logger for a forked-process runner (process-runner
@@ -1,28 +1,3 @@
1
- /**
2
- * CapRouteResolver — builds a live CapRouteSnapshot from injected deps and
3
- * dispatches a resolved CapRoute to the appropriate transport.
4
- *
5
- * Layer boundary: this file lives in `@camstack/kernel` and MUST NOT import
6
- * from `server/backend`. All server-side state is injected via narrow named
7
- * interfaces (NodeCapAuthority, InProcessProviderLookup, BrokerHandle).
8
- *
9
- * Wire conventions (kept here as the single source of truth):
10
- *
11
- * remote-moleculer dispatch
12
- * action : `${addonId}.${capName}.${method}`
13
- * params : methodArgs (passed through)
14
- * options : { nodeID: route.nodeId, timeout: 60_000 }
15
- * note : addonId is resolved by NodeCapAuthority.getAddonId(nodeId, cap)
16
- *
17
- * agent-child-forward dispatch
18
- * service : `$agent-cap-fwd`
19
- * action : `$agent-cap-fwd.forward`
20
- * params : { capName, method, args, childId, deviceId? }
21
- * options : { nodeID: route.agentNodeId, timeout: 60_000 }
22
- * note : Task 6's agent-side service MUST register the Moleculer service
23
- * `$agent-cap-fwd` with action `forward` that accepts this shape
24
- * and fans the call over UDS to route.childId.
25
- */
26
1
  import type { ServiceDiscoveryBroker } from "../moleculer/resilient-cap-call.js";
27
2
  import type { CapRoute, CapRouteOpts, HubLocalUdsRoute, InProcessProviderRef } from "./cap-route.js";
28
3
  import type { CapCallInput } from "./child-cap-protocol.js";
@@ -186,9 +161,10 @@ export declare function extractNodeId(args: unknown): string | undefined;
186
161
  * keychain owner-checks on this field, and until 2026-10-08 an unstamped
187
162
  * call let a child's own `callerAddonId` through untouched.
188
163
  *
189
- * A hub in-process caller never reaches this function (`localProviderLink`
190
- * calls the provider directly), which is the one place a stated identity is
191
- * trusted. A non-object `args` (or `null`/array) is returned unchanged: there
164
+ * Hub-main in-process contexts that bypass tRPC (addon-registry's stated
165
+ * transports) never reach this function. Co-located broker/agent callers
166
+ * stamp here inside `localProviderLink` before the zero-copy invoke.
167
+ * A non-object `args` (or `null`/array) is returned unchanged: there
192
168
  * is nowhere to attach a key, and nowhere one could hide.
193
169
  */
194
170
  export declare function stampCallerAddonId(args: unknown, callerAddonId: string | undefined): unknown;
@@ -234,19 +210,14 @@ export declare class CapRouteResolver {
234
210
  * provider). Only meaningful for `agent-child-forward` — a `remote-moleculer`
235
211
  * route already encodes the provider in its action name
236
212
  * (`${addonId}.${cap}.${method}`, via `NodeCapAuthority.getAddonId`), and a
237
- * `hub-local-uds` caller that already knows the addonId (`buildCapCallFn`)
238
- * talks to `LocalChildRegistry.callCapOnChild` directly rather than through
239
- * `dispatch`.
213
+ * `buildCapCallFn`'s direct UDS branch when it already knows the child.
240
214
  * @param callerAddonId Optional out-of-band CALLER-identity hint — the
241
215
  * addon that ORIGINATED the call, distinct from `addonId` above (which
242
216
  * names the resolved PROVIDER, not the caller). Set by
243
- * `onUnownedCall` from `CapCallInput.callerAddonId`
244
- * (`LocalChildRegistry` stamped it off the registered `childId`). Only
245
- * the `hub-in-process` branch consumes it — merged into `args` so a
246
- * diagnostic tool deep in that provider (e.g. device-manager's
247
- * fleet-read census) can read it without every provider method changing
248
- * signature, the same "extra field the provider destructures or
249
- * ignores" convention `nodeId` already uses on this path.
217
+ * `onUnownedCall` / `buildCapCallFn` from a stated in-process claim.
218
+ * `hub-in-process` merges it into `args`; `hub-local-uds` carries it on
219
+ * {@link CapCallInput.callerAddonId} so the child can stamp before invoke
220
+ * (without it, `stampCallerAddonId` strips an args-only claim).
250
221
  */
251
222
  dispatch(route: CapRoute, method: string, args: unknown, addonId?: string, callerAddonId?: string): Promise<unknown>;
252
223
  /**
@@ -0,0 +1,93 @@
1
+ import { Ti as declarationsOf } from "./dist-CkZIrsAP.mjs";
2
+ //#region src/builtins/records/legacy-table-row-count.ts
3
+ /** Row count for a physical settings-db table (matches the records engine `legacyRowCount`). */
4
+ function legacyTableRowCountFromList(tables, collection) {
5
+ return tables.find((t) => t.name === collection)?.rows ?? 0;
6
+ }
7
+ //#endregion
8
+ //#region src/builtins/records/phase6-declare-gate.ts
9
+ /**
10
+ * Phase 6 auth/alert builtins: do not call `ctx.records.declare` while legacy
11
+ * tables still hold rows unless every kind is already adopted, or the operator
12
+ * set {@link CAMSTACK_RECORDS_DECLARE_PHASE6} for the declare pass before
13
+ * `records-adopt.ts --apply`.
14
+ */
15
+ /** Operator override: declare kinds even when adoption is still pending (legacy path until adopt completes). */
16
+ var CAMSTACK_RECORDS_DECLARE_PHASE6 = "CAMSTACK_RECORDS_DECLARE_PHASE6";
17
+ function isPhase6RecordsDeclareForced() {
18
+ const raw = process.env[CAMSTACK_RECORDS_DECLARE_PHASE6]?.trim().toLowerCase();
19
+ return raw === "1" || raw === "true" || raw === "yes";
20
+ }
21
+ async function legacyTablesHoldRows(collections, legacyRowCount) {
22
+ for (const collection of collections) if (await legacyRowCount(collection) > 0) return true;
23
+ return false;
24
+ }
25
+ async function catalogKindsFullyAdopted(owner, kindNames, declarations, listKindsForOwner, isAdoptedLegacyTable) {
26
+ const listed = await listKindsForOwner(owner);
27
+ const byKind = new Map(listed.map((k) => [k.kind, k]));
28
+ for (const name of kindNames) {
29
+ if (byKind.get(name) === void 0) return false;
30
+ const legacy = declarations[name]?.adoptsFrom;
31
+ if (typeof legacy !== "string") continue;
32
+ if (!await isAdoptedLegacyTable(legacy)) return false;
33
+ }
34
+ return true;
35
+ }
36
+ /**
37
+ * @returns `true` when stores should bind record kinds; `false` for legacy collections only.
38
+ */
39
+ async function resolvePhase6UseRecordsPath(deps) {
40
+ const declarations = declarationsOf(deps.kinds);
41
+ const kindNames = Object.keys(deps.kinds);
42
+ if (await catalogKindsFullyAdopted(deps.owner, kindNames, declarations, deps.listKindsForOwner, deps.isAdoptedLegacyTable)) {
43
+ await deps.records.declare(deps.kinds);
44
+ return true;
45
+ }
46
+ if (!await legacyTablesHoldRows(deps.legacyCollections, deps.legacyRowCount)) {
47
+ await deps.records.declare(deps.kinds);
48
+ return true;
49
+ }
50
+ if (isPhase6RecordsDeclareForced()) {
51
+ try {
52
+ await deps.records.declare(deps.kinds);
53
+ } catch (err) {
54
+ if (!(err instanceof Error ? err.message : String(err)).startsWith("records/adoption-pending:")) throw err;
55
+ deps.log.info("phase 6: records kinds declared; legacy tables until adopt completes", { owner: deps.owner });
56
+ }
57
+ return false;
58
+ }
59
+ deps.log.info("phase 6: skipping records.declare — serving legacy collections until adopt completes", { owner: deps.owner });
60
+ return false;
61
+ }
62
+ /** Shared wiring for hub builtins (local-auth, keychain, alert-center). */
63
+ async function resolvePhase6UseRecordsPathForHub(ctx, owner, kinds, legacyCollections) {
64
+ const records = ctx.records;
65
+ const store = ctx.api?.settingsStore;
66
+ if (records === void 0 || store === void 0) return false;
67
+ const admin = ctx.api?.storageAdmin;
68
+ return resolvePhase6UseRecordsPath({
69
+ owner,
70
+ records,
71
+ kinds,
72
+ legacyCollections,
73
+ legacyRowCount: async (collection) => {
74
+ if (admin !== void 0) {
75
+ const fromEngine = legacyTableRowCountFromList((await admin.listTables.query({})).tables, collection);
76
+ if (fromEngine > 0) return fromEngine;
77
+ }
78
+ try {
79
+ return await store.count.query({ collection });
80
+ } catch {
81
+ return admin === void 0 ? 0 : legacyTableRowCountFromList((await admin.listTables.query({})).tables, collection);
82
+ }
83
+ },
84
+ listKindsForOwner: async (o) => admin === void 0 ? [] : (await admin.listKinds.query({
85
+ owner: o,
86
+ counts: false
87
+ })).kinds,
88
+ isAdoptedLegacyTable: async (collection) => admin === void 0 ? false : (await admin.isAdoptedLegacyTable.query({ collection })).adopted,
89
+ log: { info: (message, meta) => ctx.logger.info(message, meta ? { meta } : void 0) }
90
+ });
91
+ }
92
+ //#endregion
93
+ export { resolvePhase6UseRecordsPathForHub as t };
@@ -0,0 +1,98 @@
1
+ const require_dist = require("./dist-BkNfEJKa.js");
2
+ //#region src/builtins/records/legacy-table-row-count.ts
3
+ /** Row count for a physical settings-db table (matches the records engine `legacyRowCount`). */
4
+ function legacyTableRowCountFromList(tables, collection) {
5
+ return tables.find((t) => t.name === collection)?.rows ?? 0;
6
+ }
7
+ //#endregion
8
+ //#region src/builtins/records/phase6-declare-gate.ts
9
+ /**
10
+ * Phase 6 auth/alert builtins: do not call `ctx.records.declare` while legacy
11
+ * tables still hold rows unless every kind is already adopted, or the operator
12
+ * set {@link CAMSTACK_RECORDS_DECLARE_PHASE6} for the declare pass before
13
+ * `records-adopt.ts --apply`.
14
+ */
15
+ /** Operator override: declare kinds even when adoption is still pending (legacy path until adopt completes). */
16
+ var CAMSTACK_RECORDS_DECLARE_PHASE6 = "CAMSTACK_RECORDS_DECLARE_PHASE6";
17
+ function isPhase6RecordsDeclareForced() {
18
+ const raw = process.env[CAMSTACK_RECORDS_DECLARE_PHASE6]?.trim().toLowerCase();
19
+ return raw === "1" || raw === "true" || raw === "yes";
20
+ }
21
+ async function legacyTablesHoldRows(collections, legacyRowCount) {
22
+ for (const collection of collections) if (await legacyRowCount(collection) > 0) return true;
23
+ return false;
24
+ }
25
+ async function catalogKindsFullyAdopted(owner, kindNames, declarations, listKindsForOwner, isAdoptedLegacyTable) {
26
+ const listed = await listKindsForOwner(owner);
27
+ const byKind = new Map(listed.map((k) => [k.kind, k]));
28
+ for (const name of kindNames) {
29
+ if (byKind.get(name) === void 0) return false;
30
+ const legacy = declarations[name]?.adoptsFrom;
31
+ if (typeof legacy !== "string") continue;
32
+ if (!await isAdoptedLegacyTable(legacy)) return false;
33
+ }
34
+ return true;
35
+ }
36
+ /**
37
+ * @returns `true` when stores should bind record kinds; `false` for legacy collections only.
38
+ */
39
+ async function resolvePhase6UseRecordsPath(deps) {
40
+ const declarations = require_dist.declarationsOf(deps.kinds);
41
+ const kindNames = Object.keys(deps.kinds);
42
+ if (await catalogKindsFullyAdopted(deps.owner, kindNames, declarations, deps.listKindsForOwner, deps.isAdoptedLegacyTable)) {
43
+ await deps.records.declare(deps.kinds);
44
+ return true;
45
+ }
46
+ if (!await legacyTablesHoldRows(deps.legacyCollections, deps.legacyRowCount)) {
47
+ await deps.records.declare(deps.kinds);
48
+ return true;
49
+ }
50
+ if (isPhase6RecordsDeclareForced()) {
51
+ try {
52
+ await deps.records.declare(deps.kinds);
53
+ } catch (err) {
54
+ if (!(err instanceof Error ? err.message : String(err)).startsWith("records/adoption-pending:")) throw err;
55
+ deps.log.info("phase 6: records kinds declared; legacy tables until adopt completes", { owner: deps.owner });
56
+ }
57
+ return false;
58
+ }
59
+ deps.log.info("phase 6: skipping records.declare — serving legacy collections until adopt completes", { owner: deps.owner });
60
+ return false;
61
+ }
62
+ /** Shared wiring for hub builtins (local-auth, keychain, alert-center). */
63
+ async function resolvePhase6UseRecordsPathForHub(ctx, owner, kinds, legacyCollections) {
64
+ const records = ctx.records;
65
+ const store = ctx.api?.settingsStore;
66
+ if (records === void 0 || store === void 0) return false;
67
+ const admin = ctx.api?.storageAdmin;
68
+ return resolvePhase6UseRecordsPath({
69
+ owner,
70
+ records,
71
+ kinds,
72
+ legacyCollections,
73
+ legacyRowCount: async (collection) => {
74
+ if (admin !== void 0) {
75
+ const fromEngine = legacyTableRowCountFromList((await admin.listTables.query({})).tables, collection);
76
+ if (fromEngine > 0) return fromEngine;
77
+ }
78
+ try {
79
+ return await store.count.query({ collection });
80
+ } catch {
81
+ return admin === void 0 ? 0 : legacyTableRowCountFromList((await admin.listTables.query({})).tables, collection);
82
+ }
83
+ },
84
+ listKindsForOwner: async (o) => admin === void 0 ? [] : (await admin.listKinds.query({
85
+ owner: o,
86
+ counts: false
87
+ })).kinds,
88
+ isAdoptedLegacyTable: async (collection) => admin === void 0 ? false : (await admin.isAdoptedLegacyTable.query({ collection })).adopted,
89
+ log: { info: (message, meta) => ctx.logger.info(message, meta ? { meta } : void 0) }
90
+ });
91
+ }
92
+ //#endregion
93
+ Object.defineProperty(exports, "resolvePhase6UseRecordsPathForHub", {
94
+ enumerable: true,
95
+ get: function() {
96
+ return resolvePhase6UseRecordsPathForHub;
97
+ }
98
+ });
@@ -0,0 +1,29 @@
1
+ //#region src/records/read-all-rows.js
2
+ var require_read_all_rows = /* @__PURE__ */ require("./chunk-Cek0wNdY.js").__commonJSMin(((exports) => {
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.readAllRows = readAllRows;
5
+ var PAGE_SIZE = 1e3;
6
+ var MAX_PAGES = 100;
7
+ async function readAllRows(kind, query = {}, options = {}) {
8
+ const out = [];
9
+ let cursor;
10
+ for (let page = 0; page < MAX_PAGES; page += 1) {
11
+ const answer = await kind.query({
12
+ ...query,
13
+ limit: PAGE_SIZE,
14
+ ...cursor === void 0 ? {} : { cursor }
15
+ }, options);
16
+ out.push(...answer.records);
17
+ if (answer.nextCursor === null) return out;
18
+ cursor = answer.nextCursor;
19
+ }
20
+ throw new Error(`record kind "${kind.name}" holds more than ${MAX_PAGES * PAGE_SIZE} rows`);
21
+ }
22
+ }));
23
+ //#endregion
24
+ Object.defineProperty(exports, "require_read_all_rows", {
25
+ enumerable: true,
26
+ get: function() {
27
+ return require_read_all_rows;
28
+ }
29
+ });
@@ -0,0 +1,25 @@
1
+ import { t as __commonJSMin } from "./chunk-CNf5ZN-e.mjs";
2
+ //#region src/records/read-all-rows.js
3
+ var require_read_all_rows = /* @__PURE__ */ __commonJSMin(((exports) => {
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.readAllRows = readAllRows;
6
+ var PAGE_SIZE = 1e3;
7
+ var MAX_PAGES = 100;
8
+ async function readAllRows(kind, query = {}, options = {}) {
9
+ const out = [];
10
+ let cursor;
11
+ for (let page = 0; page < MAX_PAGES; page += 1) {
12
+ const answer = await kind.query({
13
+ ...query,
14
+ limit: PAGE_SIZE,
15
+ ...cursor === void 0 ? {} : { cursor }
16
+ }, options);
17
+ out.push(...answer.records);
18
+ if (answer.nextCursor === null) return out;
19
+ cursor = answer.nextCursor;
20
+ }
21
+ throw new Error(`record kind "${kind.name}" holds more than ${MAX_PAGES * PAGE_SIZE} rows`);
22
+ }
23
+ }));
24
+ //#endregion
25
+ export { require_read_all_rows as t };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Read every row of a record kind, page by page (hub-main stores, D881).
3
+ */
4
+ import type { RecordKindHandle, RecordQueryInput, RecordQueryOptions, RecordRow } from "@camstack/types";
5
+ export type RecordPageQuery = Omit<RecordQueryInput, "kind" | "limit" | "cursor">;
6
+ export declare function readAllRows<T>(kind: RecordKindHandle<T>, query?: RecordPageQuery, options?: RecordQueryOptions): Promise<RecordRow<T>[]>;