@camstack/system 1.2.273 → 1.2.275

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 (65) 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/autotrack/index.js +1 -1
  8. package/dist/builtins/autotrack/index.mjs +1 -1
  9. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +1 -1
  10. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
  11. package/dist/builtins/camera-grid/index.js +1 -1
  12. package/dist/builtins/camera-grid/index.mjs +1 -1
  13. package/dist/builtins/console-logging/index.js +1 -1
  14. package/dist/builtins/console-logging/index.mjs +1 -1
  15. package/dist/builtins/core-blocks/core-blocks.addon.js +1 -1
  16. package/dist/builtins/core-blocks/core-blocks.addon.mjs +1 -1
  17. package/dist/builtins/device-manager/device-manager.addon.js +2 -2
  18. package/dist/builtins/device-manager/device-manager.addon.mjs +2 -2
  19. package/dist/builtins/doorbell/virtual-doorbell.addon.js +1 -1
  20. package/dist/builtins/doorbell/virtual-doorbell.addon.mjs +1 -1
  21. package/dist/builtins/hub-forwarder/index.js +1 -1
  22. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  23. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  24. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  25. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  26. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  27. package/dist/builtins/local-network/local-network.addon.js +2 -2
  28. package/dist/builtins/local-network/local-network.addon.mjs +2 -2
  29. package/dist/builtins/loki-logging/index.js +1 -1
  30. package/dist/builtins/loki-logging/index.mjs +1 -1
  31. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  32. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  33. package/dist/builtins/platform-probe/index.js +1 -1
  34. package/dist/builtins/platform-probe/index.mjs +1 -1
  35. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  36. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  37. package/dist/builtins/snapshot/index.js +26 -6
  38. package/dist/builtins/snapshot/index.mjs +26 -6
  39. package/dist/builtins/snapshot/snapshot-durable-store.d.ts +4 -0
  40. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  41. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  42. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +0 -0
  43. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +0 -0
  44. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  45. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  46. package/dist/builtins/system-config/system-config.addon.js +1 -1
  47. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  48. package/dist/builtins/winston-logging/index.js +1 -1
  49. package/dist/builtins/winston-logging/index.mjs +1 -1
  50. package/dist/{dist-D5ONNqL6.js → dist-CYXhwfDf.js} +103 -7
  51. package/dist/{dist-DrLhdcwI.mjs → dist-DWSJVcZe.mjs} +103 -7
  52. package/dist/index.js +2 -2
  53. package/dist/index.mjs +2 -2
  54. package/dist/{retired-settings-keys-Du_0qedo.mjs → retired-settings-keys-BHGnCLW0.mjs} +1 -1
  55. package/dist/{retired-settings-keys-1686ou3s.js → retired-settings-keys-DEFtUH8o.js} +1 -1
  56. package/dist/tls/cert-identity.d.ts +22 -0
  57. package/dist/tls/cert-issue.d.ts +31 -0
  58. package/dist/tls/cert-manager.d.ts +8 -2
  59. package/dist/tls/index.d.ts +2 -2
  60. package/dist/tls-D_wUeOTD.js +12122 -0
  61. package/dist/tls-IM-v7JV4.mjs +11984 -0
  62. package/package.json +2 -1
  63. package/dist/tls/cert-openssl.d.ts +0 -23
  64. package/dist/tls-2xbgg78V.mjs +0 -752
  65. package/dist/tls-BFs4PzoW.js +0 -890
@@ -4239,6 +4239,7 @@ var CameraSwitchIdSchema = zod.z.enum([
4239
4239
  "device-audio",
4240
4240
  "broker-audio",
4241
4241
  "audio-analysis",
4242
+ "event-saving",
4242
4243
  "recording",
4243
4244
  "notifications"
4244
4245
  ]);
@@ -4265,6 +4266,7 @@ var CAMERA_SWITCH_ORDER = [
4265
4266
  "device-audio",
4266
4267
  "broker-audio",
4267
4268
  "audio-analysis",
4269
+ "event-saving",
4268
4270
  "recording",
4269
4271
  "notifications"
4270
4272
  ];
@@ -4848,11 +4850,31 @@ var RecordingBandTriggersSchema = RecordingTriggersSchema;
4848
4850
  * band engine's `applies` rule). `start`/`end` are `HH:MM`; an `end <= start`
4849
4851
  * span wraps past midnight (handled by the band engine).
4850
4852
  */
4853
+ /**
4854
+ * Whether a band's footage carries sound.
4855
+ *
4856
+ * The recorder has always attached with `audio: 'aac'`, so every band of every
4857
+ * camera recorded sound whether anyone wanted it or not. The broker already
4858
+ * serves the other answer — `audio: 'none'` takes the video-only `/muted`
4859
+ * restream — so this was a choice the product could always have offered.
4860
+ *
4861
+ * It belongs on the BAND rather than the camera because one camera can want
4862
+ * both: silent across the shop floor during opening hours, sound overnight.
4863
+ * And it applies to BOTH modes — an events band firing on motion has the same
4864
+ * question to answer as a continuous one.
4865
+ */
4866
+ var RecordingBandAudioSchema = zod.z.enum(["on", "muted"]);
4851
4867
  var RecordingBandSchema = zod.z.object({
4852
4868
  days: zod.z.array(RecordingWeekdaySchema),
4853
4869
  start: zod.z.string().regex(HHMM),
4854
4870
  end: zod.z.string().regex(HHMM),
4855
4871
  mode: RecordingBandModeSchema,
4872
+ /**
4873
+ * Sound, or silence. OPTIONAL and absent-means-`on`: every recording
4874
+ * written before this existed carried sound, and a band whose key is
4875
+ * missing must keep meaning what it meant. See {@link RecordingBandAudioSchema}.
4876
+ */
4877
+ audio: RecordingBandAudioSchema.optional(),
4856
4878
  triggers: RecordingBandTriggersSchema.optional(),
4857
4879
  /**
4858
4880
  * RETIRED (D381). A band no longer carries a pre-buffer of its own.
@@ -23976,10 +23998,9 @@ var ServerBootModeSchema = zod.z.enum([
23976
23998
  * - `idle` / `checking` / `staging` — steady / in-flight registry work.
23977
23999
  * - `pending-restart` — a version is staged and the node has NOT yet
23978
24000
  * restarted onto it (still running the OLD version).
23979
- * - `awaiting-confirmation` — the node HAS restarted onto the staged version
23980
- * (it is the active probation boot) and is waiting to confirm boot-health.
23981
- * Apply/rollback are refused in this state and the node must NOT be
23982
- * manually restarted, or the probation boot auto-rolls-back.
24001
+ * - `awaiting-confirmation` — RETIRED with the probation boot (single-copy
24002
+ * collapse, 2026-07-18). Kept in the enum so an older client still parses;
24003
+ * no provider emits it.
23983
24004
  */
23984
24005
  var ServerUpdateStateSchema = zod.z.enum([
23985
24006
  "idle",
@@ -24136,12 +24157,35 @@ var ServerRollbackInfoSchema = zod.z.object({
24136
24157
  var ServerPackageStatusSchema = zod.z.object({
24137
24158
  /** Root package name (`@camstack/server` on the hub). */
24138
24159
  packageName: zod.z.string(),
24139
- /** Version of the code the running process ACTUALLY loaded. */
24160
+ /**
24161
+ * Version of the code THIS PROCESS loaded — captured once, at boot, from the
24162
+ * package.json of the copy the code was loaded from, and never re-read. A
24163
+ * copy replaced on disk under a live process must not move this number;
24164
+ * that divergence is what `installedVersion` is for. Before 2026-09-20 this
24165
+ * was a lazy disk read that would have followed such a swap silently.
24166
+ */
24140
24167
  runningVersion: zod.z.string().nullable(),
24141
24168
  /** Node.js runtime version the node's process runs on (`process.versions.node`). */
24142
24169
  nodeRuntimeVersion: zod.z.string().nullable(),
24143
24170
  /** Active data-dir root version; null when booted from seed/workspace. */
24144
24171
  activeVersion: zod.z.string().nullable(),
24172
+ /**
24173
+ * Version of the root package in the data-root `current/` copy RIGHT NOW —
24174
+ * what the next boot would load if nothing is staged. Normally equal to
24175
+ * `runningVersion`; differs only when the copy on disk changed under the
24176
+ * live process. `null` when there is no data-root copy (baked seed or
24177
+ * workspace boot). Optional for version skew: an older provider omits it.
24178
+ */
24179
+ installedVersion: zod.z.string().nullable().optional(),
24180
+ /**
24181
+ * True when the code that would run after a restart is NOT the code running
24182
+ * now: a version is staged (`pendingVersion`), or `installedVersion` differs
24183
+ * from `runningVersion`. Derived on every read, never stored. This is the
24184
+ * one field that lets an operator or a script say "1.2.353 is installed and
24185
+ * will run after a restart" instead of reading it off a number that means
24186
+ * "installed". Optional for version skew.
24187
+ */
24188
+ restartRequired: zod.z.boolean().optional(),
24145
24189
  /** N-1 version kept for rollback; null when no previous version exists. */
24146
24190
  previousVersion: zod.z.string().nullable(),
24147
24191
  /** Version of the immutable baked seed closure (image fallback). */
@@ -24176,19 +24220,71 @@ var ServerPackageStatusSchema = zod.z.object({
24176
24220
  });
24177
24221
  var ServerUpdateCheckResultSchema = zod.z.object({
24178
24222
  packageName: zod.z.string(),
24223
+ /** Same meaning as on the status payload: what THIS process loaded. */
24179
24224
  runningVersion: zod.z.string().nullable(),
24180
24225
  latestVersion: zod.z.string().nullable(),
24226
+ /**
24227
+ * `latestVersion` is newer than `runningVersion` AND is not the version
24228
+ * already staged on this node. A staged-and-waiting version is not "an
24229
+ * update available" — applying it again is refused (`already-staged`), and
24230
+ * a button that announced "updating…" on this boolean then got refused
24231
+ * would be lying. It is reported through `pendingVersion` instead.
24232
+ */
24181
24233
  updateAvailable: zod.z.boolean(),
24182
24234
  checkedAtMs: zod.z.number(),
24183
24235
  /** Non-null when the registry lookup failed (offline, bad registry, …). */
24184
- error: zod.z.string().nullable()
24236
+ error: zod.z.string().nullable(),
24237
+ /**
24238
+ * Version staged on this node and awaiting its restart, when one is. Before
24239
+ * 2026-09-20 a check answered `{runningVersion, updateAvailable:false}` for a
24240
+ * node whose staged closure had never booted, and the caller had no way to
24241
+ * see the difference. Optional for version skew.
24242
+ */
24243
+ pendingVersion: zod.z.string().nullable().optional(),
24244
+ /** See the status payload: staged, or installed-on-disk ≠ running. Optional for skew. */
24245
+ restartRequired: zod.z.boolean().optional()
24185
24246
  });
24247
+ /**
24248
+ * What an action DID — the discriminant `accepted` cannot carry. Before
24249
+ * 2026-09-20 `applyServerUpdate` answered `accepted:false` both for a refusal
24250
+ * where nothing was wrong (already current, already staged) and for a staging
24251
+ * install that died on `npm error code ECONNRESET`; the only difference was
24252
+ * prose in `message`, and an operator restarted a container on the strength of
24253
+ * it, booting the previous version.
24254
+ *
24255
+ * - `staged` — the closure is installed and validated; the node
24256
+ * restarts to apply it (`restarting:true`). NOTHING
24257
+ * runs the new code until that restart completes.
24258
+ * - `restart-scheduled` — a plain, version-preserving restart was accepted.
24259
+ * - `already-current` — the target IS the running version; nothing done.
24260
+ * - `refused` — dropped by a gate; `reason` names which.
24261
+ * - `failed` — attempted and did not land; `error` says why.
24262
+ */
24263
+ var ServerUpdateOutcomeSchema = zod.z.enum([
24264
+ "staged",
24265
+ "restart-scheduled",
24266
+ "already-current",
24267
+ "refused",
24268
+ "failed"
24269
+ ]);
24186
24270
  var ServerUpdateActionResultSchema = zod.z.object({
24187
24271
  accepted: zod.z.boolean(),
24188
24272
  targetVersion: zod.z.string().nullable(),
24189
24273
  /** True when a graceful restart was scheduled to apply the change. */
24190
24274
  restarting: zod.z.boolean(),
24191
- message: zod.z.string()
24275
+ message: zod.z.string(),
24276
+ /** See {@link ServerUpdateOutcomeSchema}. Optional for version skew. */
24277
+ outcome: ServerUpdateOutcomeSchema.optional(),
24278
+ /**
24279
+ * Stable, greppable cause for `refused` / `failed` (the engine's
24280
+ * `UpdateRefusalReason`, `staging-failed`, …). `null` on success.
24281
+ */
24282
+ reason: zod.z.string().nullable().optional(),
24283
+ /**
24284
+ * The failure itself, verbatim enough to act on (the npm output for a
24285
+ * staging install). Non-null only for `failed`.
24286
+ */
24287
+ error: zod.z.string().nullable().optional()
24192
24288
  });
24193
24289
  var serverManagementCapability = {
24194
24290
  name: "server-management",
@@ -4239,6 +4239,7 @@ var CameraSwitchIdSchema = z.enum([
4239
4239
  "device-audio",
4240
4240
  "broker-audio",
4241
4241
  "audio-analysis",
4242
+ "event-saving",
4242
4243
  "recording",
4243
4244
  "notifications"
4244
4245
  ]);
@@ -4265,6 +4266,7 @@ var CAMERA_SWITCH_ORDER = [
4265
4266
  "device-audio",
4266
4267
  "broker-audio",
4267
4268
  "audio-analysis",
4269
+ "event-saving",
4268
4270
  "recording",
4269
4271
  "notifications"
4270
4272
  ];
@@ -4848,11 +4850,31 @@ var RecordingBandTriggersSchema = RecordingTriggersSchema;
4848
4850
  * band engine's `applies` rule). `start`/`end` are `HH:MM`; an `end <= start`
4849
4851
  * span wraps past midnight (handled by the band engine).
4850
4852
  */
4853
+ /**
4854
+ * Whether a band's footage carries sound.
4855
+ *
4856
+ * The recorder has always attached with `audio: 'aac'`, so every band of every
4857
+ * camera recorded sound whether anyone wanted it or not. The broker already
4858
+ * serves the other answer — `audio: 'none'` takes the video-only `/muted`
4859
+ * restream — so this was a choice the product could always have offered.
4860
+ *
4861
+ * It belongs on the BAND rather than the camera because one camera can want
4862
+ * both: silent across the shop floor during opening hours, sound overnight.
4863
+ * And it applies to BOTH modes — an events band firing on motion has the same
4864
+ * question to answer as a continuous one.
4865
+ */
4866
+ var RecordingBandAudioSchema = z.enum(["on", "muted"]);
4851
4867
  var RecordingBandSchema = z.object({
4852
4868
  days: z.array(RecordingWeekdaySchema),
4853
4869
  start: z.string().regex(HHMM),
4854
4870
  end: z.string().regex(HHMM),
4855
4871
  mode: RecordingBandModeSchema,
4872
+ /**
4873
+ * Sound, or silence. OPTIONAL and absent-means-`on`: every recording
4874
+ * written before this existed carried sound, and a band whose key is
4875
+ * missing must keep meaning what it meant. See {@link RecordingBandAudioSchema}.
4876
+ */
4877
+ audio: RecordingBandAudioSchema.optional(),
4856
4878
  triggers: RecordingBandTriggersSchema.optional(),
4857
4879
  /**
4858
4880
  * RETIRED (D381). A band no longer carries a pre-buffer of its own.
@@ -23976,10 +23998,9 @@ var ServerBootModeSchema = z.enum([
23976
23998
  * - `idle` / `checking` / `staging` — steady / in-flight registry work.
23977
23999
  * - `pending-restart` — a version is staged and the node has NOT yet
23978
24000
  * restarted onto it (still running the OLD version).
23979
- * - `awaiting-confirmation` — the node HAS restarted onto the staged version
23980
- * (it is the active probation boot) and is waiting to confirm boot-health.
23981
- * Apply/rollback are refused in this state and the node must NOT be
23982
- * manually restarted, or the probation boot auto-rolls-back.
24001
+ * - `awaiting-confirmation` — RETIRED with the probation boot (single-copy
24002
+ * collapse, 2026-07-18). Kept in the enum so an older client still parses;
24003
+ * no provider emits it.
23983
24004
  */
23984
24005
  var ServerUpdateStateSchema = z.enum([
23985
24006
  "idle",
@@ -24136,12 +24157,35 @@ var ServerRollbackInfoSchema = z.object({
24136
24157
  var ServerPackageStatusSchema = z.object({
24137
24158
  /** Root package name (`@camstack/server` on the hub). */
24138
24159
  packageName: z.string(),
24139
- /** Version of the code the running process ACTUALLY loaded. */
24160
+ /**
24161
+ * Version of the code THIS PROCESS loaded — captured once, at boot, from the
24162
+ * package.json of the copy the code was loaded from, and never re-read. A
24163
+ * copy replaced on disk under a live process must not move this number;
24164
+ * that divergence is what `installedVersion` is for. Before 2026-09-20 this
24165
+ * was a lazy disk read that would have followed such a swap silently.
24166
+ */
24140
24167
  runningVersion: z.string().nullable(),
24141
24168
  /** Node.js runtime version the node's process runs on (`process.versions.node`). */
24142
24169
  nodeRuntimeVersion: z.string().nullable(),
24143
24170
  /** Active data-dir root version; null when booted from seed/workspace. */
24144
24171
  activeVersion: z.string().nullable(),
24172
+ /**
24173
+ * Version of the root package in the data-root `current/` copy RIGHT NOW —
24174
+ * what the next boot would load if nothing is staged. Normally equal to
24175
+ * `runningVersion`; differs only when the copy on disk changed under the
24176
+ * live process. `null` when there is no data-root copy (baked seed or
24177
+ * workspace boot). Optional for version skew: an older provider omits it.
24178
+ */
24179
+ installedVersion: z.string().nullable().optional(),
24180
+ /**
24181
+ * True when the code that would run after a restart is NOT the code running
24182
+ * now: a version is staged (`pendingVersion`), or `installedVersion` differs
24183
+ * from `runningVersion`. Derived on every read, never stored. This is the
24184
+ * one field that lets an operator or a script say "1.2.353 is installed and
24185
+ * will run after a restart" instead of reading it off a number that means
24186
+ * "installed". Optional for version skew.
24187
+ */
24188
+ restartRequired: z.boolean().optional(),
24145
24189
  /** N-1 version kept for rollback; null when no previous version exists. */
24146
24190
  previousVersion: z.string().nullable(),
24147
24191
  /** Version of the immutable baked seed closure (image fallback). */
@@ -24176,19 +24220,71 @@ var ServerPackageStatusSchema = z.object({
24176
24220
  });
24177
24221
  var ServerUpdateCheckResultSchema = z.object({
24178
24222
  packageName: z.string(),
24223
+ /** Same meaning as on the status payload: what THIS process loaded. */
24179
24224
  runningVersion: z.string().nullable(),
24180
24225
  latestVersion: z.string().nullable(),
24226
+ /**
24227
+ * `latestVersion` is newer than `runningVersion` AND is not the version
24228
+ * already staged on this node. A staged-and-waiting version is not "an
24229
+ * update available" — applying it again is refused (`already-staged`), and
24230
+ * a button that announced "updating…" on this boolean then got refused
24231
+ * would be lying. It is reported through `pendingVersion` instead.
24232
+ */
24181
24233
  updateAvailable: z.boolean(),
24182
24234
  checkedAtMs: z.number(),
24183
24235
  /** Non-null when the registry lookup failed (offline, bad registry, …). */
24184
- error: z.string().nullable()
24236
+ error: z.string().nullable(),
24237
+ /**
24238
+ * Version staged on this node and awaiting its restart, when one is. Before
24239
+ * 2026-09-20 a check answered `{runningVersion, updateAvailable:false}` for a
24240
+ * node whose staged closure had never booted, and the caller had no way to
24241
+ * see the difference. Optional for version skew.
24242
+ */
24243
+ pendingVersion: z.string().nullable().optional(),
24244
+ /** See the status payload: staged, or installed-on-disk ≠ running. Optional for skew. */
24245
+ restartRequired: z.boolean().optional()
24185
24246
  });
24247
+ /**
24248
+ * What an action DID — the discriminant `accepted` cannot carry. Before
24249
+ * 2026-09-20 `applyServerUpdate` answered `accepted:false` both for a refusal
24250
+ * where nothing was wrong (already current, already staged) and for a staging
24251
+ * install that died on `npm error code ECONNRESET`; the only difference was
24252
+ * prose in `message`, and an operator restarted a container on the strength of
24253
+ * it, booting the previous version.
24254
+ *
24255
+ * - `staged` — the closure is installed and validated; the node
24256
+ * restarts to apply it (`restarting:true`). NOTHING
24257
+ * runs the new code until that restart completes.
24258
+ * - `restart-scheduled` — a plain, version-preserving restart was accepted.
24259
+ * - `already-current` — the target IS the running version; nothing done.
24260
+ * - `refused` — dropped by a gate; `reason` names which.
24261
+ * - `failed` — attempted and did not land; `error` says why.
24262
+ */
24263
+ var ServerUpdateOutcomeSchema = z.enum([
24264
+ "staged",
24265
+ "restart-scheduled",
24266
+ "already-current",
24267
+ "refused",
24268
+ "failed"
24269
+ ]);
24186
24270
  var ServerUpdateActionResultSchema = z.object({
24187
24271
  accepted: z.boolean(),
24188
24272
  targetVersion: z.string().nullable(),
24189
24273
  /** True when a graceful restart was scheduled to apply the change. */
24190
24274
  restarting: z.boolean(),
24191
- message: z.string()
24275
+ message: z.string(),
24276
+ /** See {@link ServerUpdateOutcomeSchema}. Optional for version skew. */
24277
+ outcome: ServerUpdateOutcomeSchema.optional(),
24278
+ /**
24279
+ * Stable, greppable cause for `refused` / `failed` (the engine's
24280
+ * `UpdateRefusalReason`, `staging-failed`, …). `null` on success.
24281
+ */
24282
+ reason: z.string().nullable().optional(),
24283
+ /**
24284
+ * The failure itself, verbatim enough to act on (the npm output for a
24285
+ * staging install). Non-null only for `failed`.
24286
+ */
24287
+ error: z.string().nullable().optional()
24192
24288
  });
24193
24289
  var serverManagementCapability = {
24194
24290
  name: "server-management",
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-D5ONNqL6.js");
3
+ const require_dist = require("./dist-CYXhwfDf.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");
@@ -26,7 +26,7 @@ const require_builtins_system_config_system_config_addon = require("./builtins/s
26
26
  require("./builtins/system-config/index.js");
27
27
  const require_builtins_winston_logging_index = require("./builtins/winston-logging/index.js");
28
28
  const require_event_loop_stall_monitor = require("./event-loop-stall-monitor-CAsHdMwP.js");
29
- const require_tls$1 = require("./tls-BFs4PzoW.js");
29
+ const require_tls$1 = require("./tls-D_wUeOTD.js");
30
30
  const require_manifest_system_deps = require("./manifest-system-deps-CfVyUKLU.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");
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 { An as readinessKey, Cn as expandCapMethods, F as addonSettingsCapability, Ft as procedureAuthKey, Mn as scopeKey, Mt as objectInputDeclaresAddonId, On as parseJsonObject, Pn as EventCategory$1, S as RUNTIME_DEFAULTS, Tt as looseSchema, Ut as scopesAllowAddon, Vt as resolveMethodAuth, Wt as scopesAllowDeviceCap, _n as asJsonObject$1, _t as isVoidInput, an as errMsg$1, bn as createEvent, bt as lifecycleJobSchema, cn as DATAPLANE_SECRET_HEADER$1, dt as isArrayOutputSchema, ft as isCollectionArrayMethod, g as LOG_LEVEL_RANK, hn as ReadinessTimeoutError, jn as resolveCapMount, kn as parseJsonUnknown, ln as DEVICE_SETTINGS_CONTRIBUTION_METHODS, mn as ReadinessRegistry, mt as isObjectInput, st as extractNestedAddonId, t as ALL_CAPABILITY_DEFINITIONS, un as DEVICE_STATUS_METHOD, vn as asNumber, vt as kebabToCamel, wt as logLevelAtMost, xn as emitDownForOwnedCaps, y as METHOD_ACCESS_MAP, yn as asString$1 } from "./dist-DrLhdcwI.mjs";
2
+ import { An as readinessKey, Cn as expandCapMethods, F as addonSettingsCapability, Ft as procedureAuthKey, Mn as scopeKey, Mt as objectInputDeclaresAddonId, On as parseJsonObject, Pn as EventCategory$1, S as RUNTIME_DEFAULTS, Tt as looseSchema, Ut as scopesAllowAddon, Vt as resolveMethodAuth, Wt as scopesAllowDeviceCap, _n as asJsonObject$1, _t as isVoidInput, an as errMsg$1, bn as createEvent, bt as lifecycleJobSchema, cn as DATAPLANE_SECRET_HEADER$1, dt as isArrayOutputSchema, ft as isCollectionArrayMethod, g as LOG_LEVEL_RANK, hn as ReadinessTimeoutError, jn as resolveCapMount, kn as parseJsonUnknown, ln as DEVICE_SETTINGS_CONTRIBUTION_METHODS, mn as ReadinessRegistry, mt as isObjectInput, st as extractNestedAddonId, t as ALL_CAPABILITY_DEFINITIONS, un as DEVICE_STATUS_METHOD, vn as asNumber, vt as kebabToCamel, wt as logLevelAtMost, xn as emitDownForOwnedCaps, y as METHOD_ACCESS_MAP, yn as asString$1 } from "./dist-DWSJVcZe.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";
@@ -25,7 +25,7 @@ import { SystemConfigAddon } from "./builtins/system-config/system-config.addon.
25
25
  import "./builtins/system-config/index.mjs";
26
26
  import { WinstonDestination, WinstonLoggingAddon } from "./builtins/winston-logging/index.mjs";
27
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";
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-2xbgg78V.mjs";
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
29
  import { $ as buildNativeCapProxy, $t as ARRAY_BUFFER_CENSUS_SUSTAIN_MS, A as createUdsLogger, An as createSocketDirectionCounters, At as HEAP_WATCH_WARN_RATIO, B as UDS_NO_ROUTE_PREFIX, Bn as createCapActionCensus, Bt as createDeferredHeapWatchSink, C as deviceCapResolverLink, Cn as SOCKET_QUEUE_TOP_N, Ct as resolveNpmInvocation, D as createUdsEventBridge, Dn as formatSocketPlane, Dt as HEAP_RECLAIM_STEADY_STATE_INTERVAL_MS, E as createParentUnownedCallHandler, En as diffSocketPlane, Et as HEAP_RECLAIM_MIN_INTERVAL_MS, F as callWithServiceDiscovery, Fn as CAP_ACTION_OVERFLOW_LABEL, Ft as RSS_BUDGET_RELEASE_RATIO, G as getCapUsageRegistry, Gn as diffEventPlane, Gt as nextRssBudgetState, H as CapUsageRegistry, Hn as EVENT_PLANE_TOP_N, Ht as createV8Reclaimer, I as CapRouteError, In as CAP_ACTION_UNLABELLED, It as RUNNER_HEAP_WATCH_INTERVAL_MS, J as UdsLocalTransportServer, Jt as shouldReclaim, K as createLocalTransport, Kn as formatEventPlane, Kt as parseRssBudgetMb, L as classifyCapRoute, Ln as EMPTY_CAP_ACTION_READING, Lt as RUNNER_RSS_BUDGET_ENV, M as AGENT_CAP_FWD_ACTION, Mn as sampleSocketDirection, Mt as HUB_MAIN_RSS_BUDGET_MB, N as AGENT_CAP_FWD_SERVICE, Nn as socketDirectionBytes, Nt as HUB_RSS_BUDGET_ENV, O as createUdsEventBus, On as readSocketQueues, Ot as HEAP_RECLAIM_TRIGGER_MB, P as CapRouteResolver, Pn as socketDirectionMessages, Pt as RSS_BUDGET_REANNOUNCE_MIN_MS, Q as encodeFrame, Qt as ARRAY_BUFFER_CENSUS_COOLDOWN_MS, R as LocalChildClient, Rn as MAX_CAP_ACTIONS_PER_PEER, Rt as ZERO_LOOP_DELAY, S as buildLinkChain, Sn as SOCKET_PLANE_TOP_N, St as buildNpmChildEnv, T as localProviderLink, Tn as createSocketPlaneReader, Tt as createAddonDataPlaneFacility, U as PARENT_ROUTED_PROVIDER_ADDON_ID, Un as createEventPlaneMeter, Ut as describeRss, V as readMoleculerFanoutMode, Vn as diffCapActionCensus, Vt as createLoopDelayMeter, W as __resetCapUsageRegistryForTests, Wn as createEventPlaneReader, Wt as hubMainRssBudget, X as localEndpointPath, Xt as startRunnerHeapWatch, Y as SocketChannel, Yt as startHeapWatch, Z as FrameDecoder, Zt as strandedMb, _ as AddonDepsManager, _n as formatOutboundQueueVerdict, _t as CapabilityHandle, a as createUdsAddonContext, an as isArrayBufferCensusReport, b as brokerCallForCap, bn as formatMeshQueue, bt as installManifestNativeDeps, c as getOrInitReadinessRegistryForClient, cn as emitHeapDiagnosticReport, ct as NATIVE_PROVIDER_SERVICE_INFIX, d as clusterEventTopic, dn as readHeapSpaces, dt as capBareAction, en as ARRAY_BUFFER_CENSUS_THRESHOLD_MB, et as buildUdsNativeCapProxy, f as getBrokerEventBus, fn as selectReportedSpaces, ft as capServiceName, g as subscribePassthrough, gn as createOutboundQueueGate, gt as DeviceRegistry, h as setNodeEventInterest, hn as OUTBOUND_QUEUE_THRESHOLD_BYTES, ht as serializeTypedArrays, i as createAddonContext, in as formatArrayBufferCensus, it as mountNativeCapService, j as createUdsLoggerWithControl, jn as recordSocketFrame, jt as HUB_MAIN_HEAP_WATCH_LABEL, k as udsChildLogToWorkerEntry, kn as EMPTY_SOCKET_DIRECTION, kt as HEAP_WATCH_INTERVAL_MS, l as setHubConnected, ln as formatHeapSpaces, lt as capActionName, m as registerEventBusService, mn as OUTBOUND_QUEUE_SUSTAIN_MS, mt as deserializeTypedArrays, n as installManifestPythonDeps, nn as createArrayBufferCensusGate, o as getWorkerDeviceRegistry, on as DECISIVE_HEAP_SPACES, ot as createAddonService, p as getMoleculerEventStats, pn as OUTBOUND_QUEUE_COOLDOWN_MS, pt as parseCapAction, q as UdsLocalTransportClient, qt as reclaimIntervalMs, r as adaptBrokerToCluster, rn as createInspectorArrayBufferCensus, s as getOrInitReadinessRegistry, sn as HEAP_SPACE_REPORT_MIN_MB, st as validateProviderRegistrations, t as installManifestSystemDeps, tn as ARRAY_BUFFER_RELEASE_MIN_DROP_RATIO, tt as createBrokerDeviceManagerApi, u as EVENT_TOPIC_PREFIX, un as heapSpaceField, ut as capActionSuffix, v as createKernelHwAccel, vn as MESH_QUEUE_TOP_N, vt as CapabilityUnavailableError, w as ipcParentLink, wn as createSocketPlaneMeter, wt as runNpm, x as brokerTransportLink, xn as EMPTY_SOCKET_PLANE_BASELINE, xt as resolveAddonClass, y as resolveHwAccel, yn as createMeshQueueReader, yt as copyBundledNativeModules, z as LocalChildRegistry, zn as capActionLabel, zt as buildHeapSample } from "./manifest-system-deps-BXf-Ouqx.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";
@@ -1,4 +1,4 @@
1
- import { _n as asJsonObject } from "./dist-DrLhdcwI.mjs";
1
+ import { _n as asJsonObject } from "./dist-DWSJVcZe.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?
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-D5ONNqL6.js");
1
+ const require_dist = require("./dist-CYXhwfDf.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,3 +1,23 @@
1
+ /** One address on one interface — the slice of `os.NetworkInterfaceInfo` this uses. */
2
+ export interface HostInterfaceAddress {
3
+ readonly address: string;
4
+ readonly internal: boolean;
5
+ }
6
+ /**
7
+ * What the certificate needs to know about the machine it identifies.
8
+ *
9
+ * Injected rather than read, for the same reason `evaluateExistingCert`
10
+ * takes `now` instead of calling `Date.now()`: a rule whose inputs are
11
+ * ambient cannot be stated in a test, and a spec that reads the real
12
+ * `os.hostname()` is a statement about the machine running it. The CI
13
+ * runner and this laptop disagreed about both halves (D551).
14
+ */
15
+ export interface HostFacts {
16
+ readonly hostname: string;
17
+ readonly networkInterfaces: Readonly<Record<string, readonly HostInterfaceAddress[] | undefined>>;
18
+ }
19
+ /** The real machine. The only place in `tls/` that touches `os`. */
20
+ export declare function systemHostFacts(): HostFacts;
1
21
  /**
2
22
  * Names/addresses that go INTO the certificate, and the subset whose
3
23
  * absence forces a reissue.
@@ -17,6 +37,8 @@ export interface CertIdentity {
17
37
  export interface CertIdentityOptions {
18
38
  readonly commonName: string;
19
39
  readonly extraSans: readonly string[];
40
+ /** The machine being certified. Defaults to {@link systemHostFacts}. */
41
+ readonly hostFacts?: HostFacts;
20
42
  }
21
43
  export declare function isIpv4(value: string): boolean;
22
44
  export declare function isIpv6(value: string): boolean;
@@ -0,0 +1,31 @@
1
+ import { webcrypto as WebCrypto } from 'node:crypto';
2
+ import { X509Certificate as PeculiarCertificate } from '@peculiar/x509';
3
+ import { CertIdentity } from './cert-identity.js';
4
+ /** Subject of the local root. Distinct from the leaf's CN by construction. */
5
+ export declare const CA_COMMON_NAME = "CamStack Local CA";
6
+ /** A PEM-encoded certificate and the PKCS#8 PEM of its private key. */
7
+ export interface CertMaterial {
8
+ readonly certPem: string;
9
+ readonly keyPem: string;
10
+ }
11
+ /** An issuing root: its PEM, and the live key handle needed to sign with it. */
12
+ export interface CaSigner {
13
+ readonly certPem: string;
14
+ readonly keyPem: string;
15
+ readonly cert: PeculiarCertificate;
16
+ readonly privateKey: WebCrypto.CryptoKey;
17
+ }
18
+ /**
19
+ * A local root: 10 years, `pathlen:0` so it can sign leaves and nothing
20
+ * else, and **no EKU** — Apple rejects an anchor asserting
21
+ * `anyExtendedKeyUsage`, and a root with no EKU constrains nothing.
22
+ */
23
+ export declare function generateCa(now: Date): Promise<CaSigner>;
24
+ /** Re-open a root already on disk so a leaf can be issued under it. */
25
+ export declare function loadCa(certPem: string, keyPem: string): Promise<CaSigner>;
26
+ /**
27
+ * A server leaf signed by the local root: `CA:FALSE`, and
28
+ * `extendedKeyUsage=serverAuth` — not `anyExtendedKeyUsage`, which
29
+ * Apple's `testAppTrustRoot_AnyEKU_AfterJul2019` asserts must fail.
30
+ */
31
+ export declare function issueLeaf(ca: CaSigner, identity: CertIdentity, commonName: string, validDays: number, now: Date): Promise<CertMaterial>;
@@ -1,5 +1,5 @@
1
1
  import { CertRegenerationReason, evaluateExistingCert, MAX_LEAF_VALIDITY_DAYS } from './cert-evaluation.js';
2
- import { CertIdentity, collectCertIdentity } from './cert-identity.js';
2
+ import { CertIdentity, HostFacts, collectCertIdentity } from './cert-identity.js';
3
3
  export interface TlsCertPair {
4
4
  readonly cert: Buffer;
5
5
  readonly key: Buffer;
@@ -38,6 +38,12 @@ export interface CertOptions {
38
38
  readonly validDays?: number;
39
39
  /** Additional SANs (DNS names or IPs). Required coverage by definition. */
40
40
  readonly extraSans?: readonly string[];
41
+ /**
42
+ * The machine being certified. Defaults to the real one; injected by the
43
+ * spec so the regeneration rule can be stated without reference to
44
+ * whichever box happens to run it (D551).
45
+ */
46
+ readonly hostFacts?: HostFacts;
41
47
  }
42
48
  /**
43
49
  * Ensure the hub has a usable TLS identity under `<dataDir>/tls`, made of
@@ -87,5 +93,5 @@ export declare function reissueTlsLeaf(dataDir: string, options?: CertOptions):
87
93
  * root alongside the leaf.
88
94
  */
89
95
  export declare function loadTlsCert(certPath: string, keyPath: string): TlsCertPair;
90
- export type { CertIdentity, CertRegenerationReason };
96
+ export type { CertIdentity, CertRegenerationReason, HostFacts };
91
97
  export { collectCertIdentity, evaluateExistingCert, MAX_LEAF_VALIDITY_DAYS };
@@ -1,5 +1,5 @@
1
1
  export { CA_VALIDITY_DAYS, type CertEvaluationInput, LEAF_RENEWAL_WINDOW_DAYS, SERVER_AUTH_OID, } from './cert-evaluation.js';
2
- export { type CertIdentity, type CertOptions, type CertRegenerationReason, collectCertIdentity, type EnsureTlsResult, ensureTlsCert, reissueTlsLeaf, evaluateExistingCert, loadTlsCert, MAX_LEAF_VALIDITY_DAYS, type TlsCertPair, } from './cert-manager.js';
3
- export { CA_COMMON_NAME } from './cert-openssl.js';
2
+ export { type CertIdentity, type CertOptions, type HostFacts, type CertRegenerationReason, collectCertIdentity, type EnsureTlsResult, ensureTlsCert, reissueTlsLeaf, evaluateExistingCert, loadTlsCert, MAX_LEAF_VALIDITY_DAYS, type TlsCertPair, } from './cert-manager.js';
3
+ export { CA_COMMON_NAME } from './cert-issue.js';
4
4
  export { validateUploadedTls, type UploadedTlsValidation } from './uploaded-cert.js';
5
5
  export { type TlsAccessStatus, readTlsAccessStatus, writeTlsMode, readTlsMode, readExtraSans, writeExtraSans, } from './tls-status.js';