@camstack/system 1.2.378 → 1.2.380
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/assets/addon-pages-aggregator/icon.svg +5 -0
- package/assets/addon-widgets-aggregator/icon.svg +6 -0
- package/assets/alert-center/icon.svg +5 -0
- package/assets/autotrack/icon.svg +5 -0
- package/assets/backup-orchestrator/icon.svg +5 -0
- package/assets/calendars/icon.svg +5 -0
- package/assets/camera-grid/icon.svg +10 -0
- package/assets/composer/icon.svg +7 -0
- package/assets/console-logging/icon.svg +4 -0
- package/assets/core-blocks/icon.svg +6 -0
- package/assets/device-manager/icon.svg +6 -0
- package/assets/filesystem-storage/icon.svg +6 -0
- package/assets/hub-forwarder/icon.svg +7 -0
- package/assets/keychain/icon.svg +6 -0
- package/assets/liveness-monitor/icon.svg +4 -0
- package/assets/local-auth/icon.svg +5 -0
- package/assets/local-network/icon.svg +7 -0
- package/assets/loki-logging/icon.svg +7 -0
- package/assets/metrics-native/icon.svg +3 -0
- package/assets/platform-probe/icon.svg +5 -0
- package/assets/remote-access-orchestrator/icon.svg +5 -0
- package/assets/snapshot/icon.svg +4 -0
- package/assets/sqlite-settings/icon.svg +5 -0
- package/assets/storage-orchestrator/icon.svg +8 -0
- package/assets/system-config/icon.svg +4 -0
- package/assets/winston-logging/icon.svg +6 -0
- package/dist/addon-runner.js +1 -1
- package/dist/addon-runner.mjs +1 -1
- package/dist/addon-utils.js +1 -1
- package/dist/addon-utils.mjs +1 -1
- package/dist/auth/auth-manager.d.ts +10 -2
- package/dist/auth/jwt-signing-key.d.ts +42 -0
- package/dist/auth/user-manager.d.ts +19 -19
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
- package/dist/builtins/alerts/alerts.addon.js +1 -1
- package/dist/builtins/alerts/alerts.addon.mjs +1 -1
- package/dist/builtins/autotrack/index.js +1 -1
- package/dist/builtins/autotrack/index.mjs +1 -1
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +1 -1
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
- package/dist/builtins/calendars/calendars.addon.js +1 -1
- package/dist/builtins/calendars/calendars.addon.mjs +1 -1
- package/dist/builtins/camera-grid/index.js +1 -1
- package/dist/builtins/camera-grid/index.mjs +1 -1
- package/dist/builtins/composer/composer.addon.js +2 -2
- package/dist/builtins/composer/composer.addon.mjs +2 -2
- package/dist/builtins/console-logging/index.js +1 -1
- package/dist/builtins/console-logging/index.mjs +1 -1
- package/dist/builtins/core-blocks/core-blocks.addon.js +2 -2
- package/dist/builtins/core-blocks/core-blocks.addon.mjs +2 -2
- package/dist/builtins/device-manager/device-manager.addon.js +2 -2
- package/dist/builtins/device-manager/device-manager.addon.mjs +2 -2
- package/dist/builtins/hub-forwarder/index.js +1 -1
- package/dist/builtins/hub-forwarder/index.mjs +1 -1
- package/dist/builtins/keychain/index.js +34 -4
- package/dist/builtins/keychain/index.mjs +34 -4
- package/dist/builtins/keychain/keychain-service.d.ts +14 -2
- package/dist/builtins/keychain/system-held-secrets.d.ts +11 -0
- package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
- package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
- package/dist/builtins/local-auth/admin-account-boot.d.ts +1 -1
- package/dist/builtins/local-auth/auth-config-reader.d.ts +9 -7
- package/dist/builtins/local-auth/jwt-signing-key-keeper.d.ts +30 -0
- package/dist/builtins/local-auth/local-auth.addon.d.ts +2 -6
- package/dist/builtins/local-auth/local-auth.addon.js +127 -221
- package/dist/builtins/local-auth/local-auth.addon.mjs +126 -220
- package/dist/builtins/local-network/local-network.addon.js +1 -1
- package/dist/builtins/local-network/local-network.addon.mjs +1 -1
- package/dist/builtins/loki-logging/index.js +1 -1
- package/dist/builtins/loki-logging/index.mjs +1 -1
- package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
- package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
- package/dist/builtins/platform-probe/index.js +1 -1
- package/dist/builtins/platform-probe/index.mjs +1 -1
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
- package/dist/builtins/snapshot/index.js +1 -1
- package/dist/builtins/snapshot/index.mjs +1 -1
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +0 -0
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +0 -0
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
- package/dist/builtins/system-config/cluster-secret-keeper.d.ts +36 -0
- package/dist/builtins/system-config/system-config.addon.d.ts +13 -0
- package/dist/builtins/system-config/system-config.addon.js +244 -53
- package/dist/builtins/system-config/system-config.addon.mjs +244 -54
- package/dist/builtins/winston-logging/index.js +1 -1
- package/dist/builtins/winston-logging/index.mjs +1 -1
- package/dist/{child-cap-dispatch-C9lmrWFT.js → child-cap-dispatch-CZeRUgYF.js} +1 -1
- package/dist/{child-cap-dispatch-DpHovtQd.mjs → child-cap-dispatch-CpjohToR.mjs} +1 -1
- package/dist/cluster-secret-BDue-uJj.mjs +83 -0
- package/dist/cluster-secret-Dg0OOOSr.js +148 -0
- package/dist/{composition-sources-CxhGdtdh.js → composition-sources-CHvLMrFI.js} +1 -1
- package/dist/{composition-sources-BLBd338N.mjs → composition-sources-DT_uJwI3.mjs} +1 -1
- package/dist/{dist-Bvl5JgNt.mjs → dist-B9oFw2jh.mjs} +58 -2
- package/dist/{dist-KxsOMQik.js → dist-Cc6KOdY-.js} +69 -1
- package/dist/{event-loop-stall-monitor-D8rqSWfW.mjs → event-loop-stall-monitor-anUH2IE1.mjs} +14 -14
- package/dist/{event-loop-stall-monitor-CbSmCWkp.js → event-loop-stall-monitor-mk6WGxir.js} +14 -14
- package/dist/index.d.ts +4 -2
- package/dist/index.js +192 -62
- package/dist/index.mjs +171 -55
- package/dist/jwt-signing-key-C2rE3wH6.js +174 -0
- package/dist/jwt-signing-key-Qhde8r82.mjs +127 -0
- package/dist/kernel/config-manager.d.ts +1 -1
- package/dist/kernel/config-schema.d.ts +4 -11
- package/dist/kernel/index.d.ts +2 -1
- package/dist/kernel/moleculer/broker-factory.d.ts +0 -2
- package/dist/kernel/moleculer/cluster-secret.d.ts +31 -0
- package/dist/kernel/moleculer/hub-service.d.ts +7 -4
- package/dist/kernel/moleculer/node-registry.d.ts +1 -1
- package/dist/kernel/system-settings-policy.d.ts +7 -9
- package/dist/{retired-settings-keys-BAcfvFtm.mjs → retired-settings-keys-DlZ3VV6x.mjs} +1 -1
- package/dist/{retired-settings-keys-gTsZfpmP.js → retired-settings-keys-YOOKLA3v.js} +1 -1
- package/package.json +55 -3
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
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 { $t as looseSchema, At as extractNestedAddonId, Cr as
|
|
2
|
+
import { $t as looseSchema, At as extractNestedAddonId, Br as scopeKey, Cr as createEvent, E as LOG_LEVEL_RANK, Er as expandCapMethods, Fr as parseJsonUnknown, G as addonSettingsCapability, Ht as isVoidInput, Jt as lifecycleJobSchema, Lr as readinessKey, Lt as isArrayOutputSchema, On as scopesAllowAddon, P as RUNTIME_DEFAULTS, Pr as parseJsonObject, Qt as logLevelAtMost, Rr as resolveCapMount, Rt as isCollectionArrayMethod, Tn as resolveMethodAuth, Ut as kebabToCamel, Vt as isObjectInput, _r as asJsonObject$1, cr as errMsg$1, dr as DEVICE_SETTINGS_CONTRIBUTION_METHODS, fr as DEVICE_STATUS_METHOD, hn as procedureAuthKey, hr as ReadinessTimeoutError, k as METHOD_ACCESS_MAP, kn as scopesAllowDeviceCap, ln as objectInputDeclaresAddonId, mr as ReadinessRegistry, qr as EventCategory$1, t as ALL_CAPABILITY_DEFINITIONS, un as objectInputDeclaresRequiredDeviceId, ur as DATAPLANE_SECRET_HEADER$1, vr as asNumber, wr as emitDownForOwnedCaps, yr as asString$1 } from "./dist-B9oFw2jh.mjs";
|
|
3
|
+
import { c as staticJwtSigningKey, i as getProcessJwtSigningKeyState, n as JwtSigningKeyUnavailableError, o as processJwtSigningKey, r as SYSTEM_SECRET_OWNER, t as JWT_SIGNING_KEY_REF } from "./jwt-signing-key-Qhde8r82.mjs";
|
|
3
4
|
import { AlertCenterAddon } from "./builtins/alerts/alerts.addon.mjs";
|
|
4
5
|
import "./builtins/alerts/index.mjs";
|
|
5
6
|
import { CalendarsAddon } from "./builtins/calendars/calendars.addon.mjs";
|
|
@@ -15,7 +16,7 @@ import "./builtins/device-manager/index.mjs";
|
|
|
15
16
|
import { HubForwarderAddon, HubForwarderDestination } from "./builtins/hub-forwarder/index.mjs";
|
|
16
17
|
import { LivenessMonitorAddon } from "./builtins/liveness-monitor/liveness-monitor.addon.mjs";
|
|
17
18
|
import "./builtins/liveness-monitor/index.mjs";
|
|
18
|
-
import { LocalAuthAddon, a as AuthManager, c as require_ms, i as ScopedTokenManager, l as require_safe_buffer, n as
|
|
19
|
+
import { LocalAuthAddon, a as AuthManager, c as require_ms, i as ScopedTokenManager, l as require_safe_buffer, n as FIRST_BOOT_ADMIN_USERNAME, o as SettingsReadUnavailableError, r as UserManager, s as isSettingsReadUnavailable, t as FIRST_BOOT_ADMIN_PASSWORD, u as ApiKeyManager } from "./builtins/local-auth/local-auth.addon.mjs";
|
|
19
20
|
import "./builtins/local-auth/index.mjs";
|
|
20
21
|
import { LokiDestination, LokiLoggingAddon } from "./builtins/loki-logging/index.mjs";
|
|
21
22
|
import NativeMetricsAddon, { t as NativeMetricsProvider } from "./builtins/native-metrics/native-metrics.addon.mjs";
|
|
@@ -25,17 +26,18 @@ import { ConfigStore, DeviceStore } from "./builtins/sqlite-storage/index.mjs";
|
|
|
25
26
|
import { n as HUB_CAP_FWD_SERVICE, r as createHubCapForwardService, t as HUB_CAP_FWD_ACTION } from "./hub-cap-forward-CH6_VWVO.mjs";
|
|
26
27
|
import { StorageOrchestratorAddon, n as buildStorageLocationRegistry, t as StorageOrchestratorService } from "./builtins/storage-orchestrator/storage-orchestrator.addon.mjs";
|
|
27
28
|
import "./builtins/storage-orchestrator/index.mjs";
|
|
29
|
+
import { a as CLUSTER_SECRET_UNAVAILABLE_TYPE, c as getProcessClusterSecretGate, d as setProcessClusterSecretGate, i as CLUSTER_SECRET_SETTINGS_KEY, l as hashClusterSecret, n as CLUSTER_SECRET_REF, o as checkClusterSecret, r as CLUSTER_SECRET_REJECTED_EXIT_CODE, s as clusterSecretMatches, t as CLUSTER_SECRET_MISMATCH_TYPE, u as isClusterSecretMismatchError } from "./cluster-secret-BDue-uJj.mjs";
|
|
28
30
|
import { SystemConfigAddon } from "./builtins/system-config/system-config.addon.mjs";
|
|
29
31
|
import "./builtins/system-config/index.mjs";
|
|
30
32
|
import { WinstonDestination, WinstonLoggingAddon } from "./builtins/winston-logging/index.mjs";
|
|
31
|
-
import { C as resolveFormatRevision, S as isModelDownloaded, _ as downloadModel, a as createFileDataPlaneHandler, b as getModelFilePath, c as parseRangeHeader, d as ModelDownloadService, g as downloadFile, h as deleteModelFromDisk, i as startEventLoopStallMonitor, l as parseTokenizedUrl, m as collectModelFiles, n as STALL_TICK_MS, o as contentTypeFor, p as adoptModelRevisions, r as attributeStall, s as createAuthenticatedFileServer, t as STALL_REPORT_MS, u as resolveFilePath, v as ensureModel, w as revisionWeightUrl, y as fetchJson } from "./event-loop-stall-monitor-
|
|
33
|
+
import { C as resolveFormatRevision, S as isModelDownloaded, _ as downloadModel, a as createFileDataPlaneHandler, b as getModelFilePath, c as parseRangeHeader, d as ModelDownloadService, g as downloadFile, h as deleteModelFromDisk, i as startEventLoopStallMonitor, l as parseTokenizedUrl, m as collectModelFiles, n as STALL_TICK_MS, o as contentTypeFor, p as adoptModelRevisions, r as attributeStall, s as createAuthenticatedFileServer, t as STALL_REPORT_MS, u as resolveFilePath, v as ensureModel, w as revisionWeightUrl, y as fetchJson } from "./event-loop-stall-monitor-anUH2IE1.mjs";
|
|
32
34
|
import { A as allFamiliesListenHost, C as collectCertIdentity, D as SERVER_AUTH_OID, E as MAX_LEAF_VALIDITY_DAYS, F as registerLanHttpHandler, M as bindPendingLanHttp, N as closeLanHttp, O as evaluateExistingCert, P as readLanHttpState, S as CA_COMMON_NAME, T as LEAF_RENEWAL_WINDOW_DAYS, _ as writeExtraSans, a as validateUploadedTls, b as loadTlsCert, c as registerHttpsListener, d as prepareBootTls, f as UPLOADED_CA_FILE, g as splitPemCertificates, h as readTlsMode, i as storeUploadedCertificate, j as applyLanHttp, k as DEFAULT_LAN_HTTP_PORT, l as reloadHttpsListener, m as readTlsAccessStatus, n as regenerateCertificate, o as clearHttpsListener, p as readExtraSans, r as revertToGeneratedCertificate, s as leafFingerprintOf, t as applyCertificateToListener, u as servedHttpsLeafFingerprint, v as writeTlsMode, w as CA_VALIDITY_DAYS, x as reissueTlsLeaf, y as ensureTlsCert } from "./tls-CJHogwTl.mjs";
|
|
33
|
-
import { $ as stampCallerAddonId, $n as sampleSocketDirection, $t as HUB_MAIN_RSS_BUDGET_MB, A as resolveHwAccel, An as formatHeapSpaces, At as serializeTypedArrays, B as udsChildLogToWorkerEntry, Bn as createMeshQueueReader, Bt as isCredentialKeyName, C as getBrokerEventBus, Cn as createArrayBufferCensusGate, Ct as NATIVE_PROVIDER_SERVICE_INFIX, D as subscribePassthrough, Dn as DECISIVE_HEAP_SPACES, Dt as capServiceName, E as setNodeEventInterest, En as isArrayBufferCensusReport, Et as capBareAction, F as ipcParentLink, Fn as OUTBOUND_QUEUE_SUSTAIN_MS, Ft as installManifestNativeDeps, G as UDS_NO_ROUTE_PREFIX, Gn as createSocketPlaneMeter, Gt as hostNodeIdOf, H as createUdsLoggerWithControl, Hn as EMPTY_SOCKET_PLANE_BASELINE, Ht as redactLogMeta, I as localProviderLink, In as OUTBOUND_QUEUE_THRESHOLD_BYTES, It as resolveAddonClass, J as answerClaimedGetStatus, Jn as formatSocketPlane, Jt as HEAP_RECLAIM_STEADY_STATE_INTERVAL_MS, K as afterWorkerOnlineAnnounce, Kn as createSocketPlaneReader, Kt as createAddonDataPlaneFacility, L as createParentUnownedCallHandler, Ln as createOutboundQueueGate, Lt as buildNpmChildEnv, M as brokerTransportLink, Mn as readHeapSpaces, Mt as CapabilityHandle, N as buildLinkChain, Nn as selectReportedSpaces, Nt as CapabilityUnavailableError, O as AddonDepsManager, On as HEAP_SPACE_REPORT_MIN_MB, Ot as parseCapAction, P as deviceCapResolverLink, Pn as OUTBOUND_QUEUE_COOLDOWN_MS, Pt as copyBundledNativeModules, Q as CapRouteResolver, Qn as recordSocketFrame, Qt as HUB_MAIN_HEAP_WATCH_LABEL, R as createUdsEventBridge, Rn as formatOutboundQueueVerdict, Rt as resolveNpmInvocation, S as clusterEventTopic, Sn as ARRAY_BUFFER_RELEASE_MIN_DROP_RATIO, St as validateProviderRegistrations, T as registerEventBusService, Tn as formatArrayBufferCensus, Tt as capActionSuffix, U as LocalChildClient, Un as SOCKET_PLANE_TOP_N, Ut as redactLogText, V as createUdsLogger, Vn as formatMeshQueue, Vt as redactLogEntry, W as LocalChildRegistry, Wn as SOCKET_QUEUE_TOP_N, Wt as createAddonPeerBytesFacility, X as AGENT_CAP_FWD_ACTION, Xn as EMPTY_SOCKET_DIRECTION, Xt as HEAP_WATCH_INTERVAL_MS, Y as deviceOfGetStatus, Yn as readSocketQueues, Yt as HEAP_RECLAIM_TRIGGER_MB, Z as AGENT_CAP_FWD_SERVICE, Zn as createSocketDirectionCounters, Zt as HEAP_WATCH_WARN_RATIO, _ as getWorkerDeviceRegistry, _n as startRunnerHeapWatch, a as reapProcessGroup, an as ZERO_LOOP_DELAY, ar as MAX_CAP_ACTIONS_PER_PEER, at as __resetCapUsageRegistryForTests, b as setHubConnected, bn as ARRAY_BUFFER_CENSUS_SUSTAIN_MS, c as runnerOwnsProcessGroup, cn as createLoopDelayMeter, cr as diffCapActionCensus, ct as UdsLocalTransportClient, d as summarizeMembers, dn as hubMainRssBudget, dr as createEventPlaneReader, dt as PeerAnsweredError, en as HUB_RSS_BUDGET_ENV, er as socketDirectionBytes, et as CapRouteError, f as installManifestSystemDeps, fn as nextRssBudgetState, fr as diffEventPlane, ft as localEndpointPath, g as createUdsAddonContext, gn as startHeapWatch, gt as createBrokerDeviceManagerApi, h as createAddonContext, hn as shouldReclaim, ht as buildNativeCapProxy, in as RUNNER_RSS_BUDGET_ENV, ir as EMPTY_CAP_ACTION_READING, it as PARENT_ROUTED_PROVIDER_ADDON_ID, j as brokerCallForCap, jn as heapSpaceField, jt as DeviceRegistry, k as createKernelHwAccel, kn as emitHeapDiagnosticReport, kt as deserializeTypedArrays, l as signalAllRunnerGroups, ln as createV8Reclaimer, lr as EVENT_PLANE_TOP_N, lt as UdsLocalTransportServer, m as adaptBrokerToCluster, mn as reclaimIntervalMs, mt as encodeFrame, nn as RSS_BUDGET_RELEASE_RATIO, nr as CAP_ACTION_OVERFLOW_LABEL, nt as callWithServiceDiscovery, o as registerRunnerGroup, on as buildHeapSample, or as capActionLabel, ot as getCapUsageRegistry, p as installManifestPythonDeps, pn as parseRssBudgetMb, pr as formatEventPlane, pt as FrameDecoder, q as GET_STATUS_METHOD, qn as diffSocketPlane, qt as HEAP_RECLAIM_MIN_INTERVAL_MS, r as defaultProcessGroupOps, rn as RUNNER_HEAP_WATCH_INTERVAL_MS, rr as CAP_ACTION_UNLABELLED, rt as CapUsageRegistry, s as releaseRunnerGroup, sn as createDeferredHeapWatchSink, sr as createCapActionCensus, st as createLocalTransport, t as CAP_METHOD_NOT_IMPLEMENTED, tn as RSS_BUDGET_REANNOUNCE_MIN_MS, tr as socketDirectionMessages, tt as classifyCapRoute, un as describeRss, ur as createEventPlaneMeter, ut as SocketChannel, v as getOrInitReadinessRegistry, vn as strandedMb, w as getMoleculerEventStats, wn as createInspectorArrayBufferCensus, wt as capActionName, x as EVENT_TOPIC_PREFIX, xn as ARRAY_BUFFER_CENSUS_THRESHOLD_MB, xt as createAddonService, y as getOrInitReadinessRegistryForClient, yn as ARRAY_BUFFER_CENSUS_COOLDOWN_MS, yt as mountNativeCapService, z as createUdsEventBus, zn as MESH_QUEUE_TOP_N, zt as runNpm } from "./child-cap-dispatch-
|
|
35
|
+
import { $ as stampCallerAddonId, $n as sampleSocketDirection, $t as HUB_MAIN_RSS_BUDGET_MB, A as resolveHwAccel, An as formatHeapSpaces, At as serializeTypedArrays, B as udsChildLogToWorkerEntry, Bn as createMeshQueueReader, Bt as isCredentialKeyName, C as getBrokerEventBus, Cn as createArrayBufferCensusGate, Ct as NATIVE_PROVIDER_SERVICE_INFIX, D as subscribePassthrough, Dn as DECISIVE_HEAP_SPACES, Dt as capServiceName, E as setNodeEventInterest, En as isArrayBufferCensusReport, Et as capBareAction, F as ipcParentLink, Fn as OUTBOUND_QUEUE_SUSTAIN_MS, Ft as installManifestNativeDeps, G as UDS_NO_ROUTE_PREFIX, Gn as createSocketPlaneMeter, Gt as hostNodeIdOf, H as createUdsLoggerWithControl, Hn as EMPTY_SOCKET_PLANE_BASELINE, Ht as redactLogMeta, I as localProviderLink, In as OUTBOUND_QUEUE_THRESHOLD_BYTES, It as resolveAddonClass, J as answerClaimedGetStatus, Jn as formatSocketPlane, Jt as HEAP_RECLAIM_STEADY_STATE_INTERVAL_MS, K as afterWorkerOnlineAnnounce, Kn as createSocketPlaneReader, Kt as createAddonDataPlaneFacility, L as createParentUnownedCallHandler, Ln as createOutboundQueueGate, Lt as buildNpmChildEnv, M as brokerTransportLink, Mn as readHeapSpaces, Mt as CapabilityHandle, N as buildLinkChain, Nn as selectReportedSpaces, Nt as CapabilityUnavailableError, O as AddonDepsManager, On as HEAP_SPACE_REPORT_MIN_MB, Ot as parseCapAction, P as deviceCapResolverLink, Pn as OUTBOUND_QUEUE_COOLDOWN_MS, Pt as copyBundledNativeModules, Q as CapRouteResolver, Qn as recordSocketFrame, Qt as HUB_MAIN_HEAP_WATCH_LABEL, R as createUdsEventBridge, Rn as formatOutboundQueueVerdict, Rt as resolveNpmInvocation, S as clusterEventTopic, Sn as ARRAY_BUFFER_RELEASE_MIN_DROP_RATIO, St as validateProviderRegistrations, T as registerEventBusService, Tn as formatArrayBufferCensus, Tt as capActionSuffix, U as LocalChildClient, Un as SOCKET_PLANE_TOP_N, Ut as redactLogText, V as createUdsLogger, Vn as formatMeshQueue, Vt as redactLogEntry, W as LocalChildRegistry, Wn as SOCKET_QUEUE_TOP_N, Wt as createAddonPeerBytesFacility, X as AGENT_CAP_FWD_ACTION, Xn as EMPTY_SOCKET_DIRECTION, Xt as HEAP_WATCH_INTERVAL_MS, Y as deviceOfGetStatus, Yn as readSocketQueues, Yt as HEAP_RECLAIM_TRIGGER_MB, Z as AGENT_CAP_FWD_SERVICE, Zn as createSocketDirectionCounters, Zt as HEAP_WATCH_WARN_RATIO, _ as getWorkerDeviceRegistry, _n as startRunnerHeapWatch, a as reapProcessGroup, an as ZERO_LOOP_DELAY, ar as MAX_CAP_ACTIONS_PER_PEER, at as __resetCapUsageRegistryForTests, b as setHubConnected, bn as ARRAY_BUFFER_CENSUS_SUSTAIN_MS, c as runnerOwnsProcessGroup, cn as createLoopDelayMeter, cr as diffCapActionCensus, ct as UdsLocalTransportClient, d as summarizeMembers, dn as hubMainRssBudget, dr as createEventPlaneReader, dt as PeerAnsweredError, en as HUB_RSS_BUDGET_ENV, er as socketDirectionBytes, et as CapRouteError, f as installManifestSystemDeps, fn as nextRssBudgetState, fr as diffEventPlane, ft as localEndpointPath, g as createUdsAddonContext, gn as startHeapWatch, gt as createBrokerDeviceManagerApi, h as createAddonContext, hn as shouldReclaim, ht as buildNativeCapProxy, in as RUNNER_RSS_BUDGET_ENV, ir as EMPTY_CAP_ACTION_READING, it as PARENT_ROUTED_PROVIDER_ADDON_ID, j as brokerCallForCap, jn as heapSpaceField, jt as DeviceRegistry, k as createKernelHwAccel, kn as emitHeapDiagnosticReport, kt as deserializeTypedArrays, l as signalAllRunnerGroups, ln as createV8Reclaimer, lr as EVENT_PLANE_TOP_N, lt as UdsLocalTransportServer, m as adaptBrokerToCluster, mn as reclaimIntervalMs, mt as encodeFrame, nn as RSS_BUDGET_RELEASE_RATIO, nr as CAP_ACTION_OVERFLOW_LABEL, nt as callWithServiceDiscovery, o as registerRunnerGroup, on as buildHeapSample, or as capActionLabel, ot as getCapUsageRegistry, p as installManifestPythonDeps, pn as parseRssBudgetMb, pr as formatEventPlane, pt as FrameDecoder, q as GET_STATUS_METHOD, qn as diffSocketPlane, qt as HEAP_RECLAIM_MIN_INTERVAL_MS, r as defaultProcessGroupOps, rn as RUNNER_HEAP_WATCH_INTERVAL_MS, rr as CAP_ACTION_UNLABELLED, rt as CapUsageRegistry, s as releaseRunnerGroup, sn as createDeferredHeapWatchSink, sr as createCapActionCensus, st as createLocalTransport, t as CAP_METHOD_NOT_IMPLEMENTED, tn as RSS_BUDGET_REANNOUNCE_MIN_MS, tr as socketDirectionMessages, tt as classifyCapRoute, un as describeRss, ur as createEventPlaneMeter, ut as SocketChannel, v as getOrInitReadinessRegistry, vn as strandedMb, w as getMoleculerEventStats, wn as createInspectorArrayBufferCensus, wt as capActionName, x as EVENT_TOPIC_PREFIX, xn as ARRAY_BUFFER_CENSUS_THRESHOLD_MB, xt as createAddonService, y as getOrInitReadinessRegistryForClient, yn as ARRAY_BUFFER_CENSUS_COOLDOWN_MS, yt as mountNativeCapService, z as createUdsEventBus, zn as MESH_QUEUE_TOP_N, zt as runNpm } from "./child-cap-dispatch-CpjohToR.mjs";
|
|
34
36
|
import { n as getPlatformKeychainKey, r as setPlatformKeychainKey, t as clearPlatformKeychainKey } from "./platform-key-source-BWlq0jjn.mjs";
|
|
35
37
|
import { n as getSinglePidStats, t as getPidStats } from "./resource-monitor-B2WZ8_q9.mjs";
|
|
36
38
|
import { t as CustomActionRegistry } from "./custom-action-registry-B4Cf4O_X.mjs";
|
|
37
39
|
import { z } from "zod";
|
|
38
|
-
import { createHash, randomUUID
|
|
40
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
39
41
|
import { PYTHON_VERSION, buildBinaryPath, downloadBinary, ensureBinary, ensureFfmpeg, ensurePython, findInPath, getFfmpegDownloadUrl, getPlatformInfo, getPythonDownloadUrl, installPythonPackages, installPythonRequirements } from "@camstack/types/node";
|
|
40
42
|
import { lstat, readdir, readlink, realpath } from "node:fs/promises";
|
|
41
43
|
import * as path$39 from "node:path";
|
|
@@ -7762,6 +7764,157 @@ function createDoorSettingsView(addonId, door, sections) {
|
|
|
7762
7764
|
};
|
|
7763
7765
|
}
|
|
7764
7766
|
//#endregion
|
|
7767
|
+
//#region src/kernel/config-schema.ts
|
|
7768
|
+
/** Default data directory — used when CAMSTACK_DATA env var is not set */
|
|
7769
|
+
var DEFAULT_DATA_PATH = "camstack-data";
|
|
7770
|
+
/**
|
|
7771
|
+
* A list of browser origins from config.yaml (a YAML list) or from the
|
|
7772
|
+
* `CAMSTACK_CORS_ORIGINS` env var (one comma-separated string — env carries
|
|
7773
|
+
* only strings). Validation of each entry is the CORS policy's job
|
|
7774
|
+
* (`server/backend/src/api/cors/cors-policy.ts`), which logs what it rejects;
|
|
7775
|
+
* the schema only fixes the SHAPE so a typo cannot stop the hub from booting.
|
|
7776
|
+
*/
|
|
7777
|
+
var originListSchema = z.preprocess((value) => typeof value === "string" ? value.split(",").map((entry) => entry.trim()).filter((entry) => entry.length > 0) : value, z.array(z.string()));
|
|
7778
|
+
var serverSchema = z.object({
|
|
7779
|
+
port: z.number().default(4443),
|
|
7780
|
+
host: z.string().default("0.0.0.0"),
|
|
7781
|
+
dataPath: z.string().default(DEFAULT_DATA_PATH),
|
|
7782
|
+
/**
|
|
7783
|
+
* EXTRA browser origins allowed to call this hub cross-origin (D707), on
|
|
7784
|
+
* top of the built-ins: the hub's own origin, the hosted viewer PWA and the
|
|
7785
|
+
* native app's opaque `null` origin. Bootstrap-owned on purpose — widening
|
|
7786
|
+
* who may read hub responses in a browser is a security decision, and the
|
|
7787
|
+
* policy is live from the first request, before the settings store exists.
|
|
7788
|
+
*/
|
|
7789
|
+
corsOrigins: originListSchema.default([])
|
|
7790
|
+
});
|
|
7791
|
+
/**
|
|
7792
|
+
* The bootstrap `auth` section holds NO credential (D797): the session signing
|
|
7793
|
+
* key lives in the keychain, and a fresh hub seeds `admin` / `changeme`
|
|
7794
|
+
* (`FIRST_BOOT_ADMIN_*`). The retired keys `jwtSecret`, `adminUsername` and
|
|
7795
|
+
* `adminPassword` are stripped when a legacy config.yaml still carries them —
|
|
7796
|
+
* the boot warns so the operator removes them (the one-off ops script imports
|
|
7797
|
+
* a `jwtSecret` into the keychain first).
|
|
7798
|
+
*/
|
|
7799
|
+
var authSchema = z.object({});
|
|
7800
|
+
var hubSchema = z.object({
|
|
7801
|
+
url: z.string().default("ws://localhost:4443/agent"),
|
|
7802
|
+
token: z.string().default("")
|
|
7803
|
+
});
|
|
7804
|
+
var agentSchema = z.object({
|
|
7805
|
+
name: z.string().default(""),
|
|
7806
|
+
/** Port for the agent status page (minimal HTML) */
|
|
7807
|
+
statusPort: z.number().default(4444)
|
|
7808
|
+
});
|
|
7809
|
+
var tlsSchema = z.object({
|
|
7810
|
+
/**
|
|
7811
|
+
* Enable HTTPS (default: true). The certificate itself is never configured
|
|
7812
|
+
* here: the admin UI (Network → Local access) generates or uploads it
|
|
7813
|
+
* (D726), and boot serves whatever `tls/mode` says.
|
|
7814
|
+
*/
|
|
7815
|
+
enabled: z.boolean().default(true) });
|
|
7816
|
+
/**
|
|
7817
|
+
* Bootstrap-time addon configuration — read PURELY from YAML, before the
|
|
7818
|
+
* kernel can talk to the settings-store. This breaks the chicken-and-egg
|
|
7819
|
+
* where the settings store itself is implemented by an addon: the kernel
|
|
7820
|
+
* needs to know WHICH addon to load first to provide the store, and that
|
|
7821
|
+
* decision can't itself live in the store.
|
|
7822
|
+
*
|
|
7823
|
+
* Backward-compatible: every field is optional + defaults reproduce the
|
|
7824
|
+
* current hard-coded behavior. Existing config.yaml files keep working.
|
|
7825
|
+
*/
|
|
7826
|
+
var bootstrapAddonsSchema = z.object({
|
|
7827
|
+
/**
|
|
7828
|
+
* Addon implementing the `settings-store` capability. Loaded FIRST,
|
|
7829
|
+
* before any other addon is enabled — every other addon's enable
|
|
7830
|
+
* state, settings, and ordering lives in the store it provides.
|
|
7831
|
+
*
|
|
7832
|
+
* Default: '@camstack/addon-sqlite-storage' (the workspace's
|
|
7833
|
+
* default SQLite-backed store). Future alternatives could swap this
|
|
7834
|
+
* for postgres/redis without touching kernel code.
|
|
7835
|
+
*/
|
|
7836
|
+
settingsStoreAddon: z.string().default("@camstack/addon-sqlite-storage"),
|
|
7837
|
+
/**
|
|
7838
|
+
* How the launcher provisions REQUIRED_PACKAGES into `data/addons/`
|
|
7839
|
+
* on startup.
|
|
7840
|
+
*
|
|
7841
|
+
* - `'npm'` — pull from the npm registry (production default).
|
|
7842
|
+
* - `'local'` — copy `packages/<X>/` from the workspace into
|
|
7843
|
+
* `data/addons/<X>/`. Use for the Electron-
|
|
7844
|
+
* packaged bundle and the e2e harness.
|
|
7845
|
+
* - `'symlink'` — point `data/addons/<X>` at the workspace source
|
|
7846
|
+
* dir via a directory symlink. Dev-only: a
|
|
7847
|
+
* workspace rebuild (`npm run build -w <X>`) is
|
|
7848
|
+
* immediately reflected at the next addon load,
|
|
7849
|
+
* no copy step. Falls back to `'local'` on
|
|
7850
|
+
* platforms that reject symlink creation (Windows
|
|
7851
|
+
* without developer-mode).
|
|
7852
|
+
*
|
|
7853
|
+
* The `CAMSTACK_INSTALL_SOURCE` env var, when set, wins over this
|
|
7854
|
+
* field. Leave undefined to keep the launcher's default behaviour
|
|
7855
|
+
* (npm when no workspace, local when a bundled addons dir is
|
|
7856
|
+
* present, …).
|
|
7857
|
+
*/
|
|
7858
|
+
installSource: z.enum([
|
|
7859
|
+
"npm",
|
|
7860
|
+
"local",
|
|
7861
|
+
"symlink"
|
|
7862
|
+
]).optional(),
|
|
7863
|
+
/**
|
|
7864
|
+
* Override the kernel's hard-coded `AddonInstaller.REQUIRED_PACKAGES`.
|
|
7865
|
+
* Passing an array here REPLACES the default list entirely — useful
|
|
7866
|
+
* for stripped-down deployments (only the bundle of addons the
|
|
7867
|
+
* operator actually wants) and for forcing a different storage
|
|
7868
|
+
* backend at first boot.
|
|
7869
|
+
*
|
|
7870
|
+
* Leave undefined to use the kernel-shipped defaults.
|
|
7871
|
+
*/
|
|
7872
|
+
requiredAddons: z.array(z.string()).optional(),
|
|
7873
|
+
/**
|
|
7874
|
+
* Disable list applied AFTER the settings-store reports the enabled
|
|
7875
|
+
* set. Operator escape hatch — boot without a known-broken addon
|
|
7876
|
+
* without having to mutate the store.
|
|
7877
|
+
*/
|
|
7878
|
+
forceDisable: z.array(z.string()).default([])
|
|
7879
|
+
});
|
|
7880
|
+
/**
|
|
7881
|
+
* Where the keychain's master key lives (D788). config.yaml ONLY: no env var
|
|
7882
|
+
* maps here, and the settings store may not answer it
|
|
7883
|
+
* (`BOOTSTRAP_OWNED_SECTIONS`). Absent → the desktop OS keychain when the hub
|
|
7884
|
+
* runs inside the desktop app, else `<dataDir>/.keychain/master.key`.
|
|
7885
|
+
*/
|
|
7886
|
+
var keychainSchema = z.object({
|
|
7887
|
+
/** A file holding 32 random bytes, base64 (or hex). Keep it OFF the data volume. */
|
|
7888
|
+
keyFile: z.string().min(1).optional(),
|
|
7889
|
+
/**
|
|
7890
|
+
* The key being rotated away from — consulted only to UNLOCK, so a move to a
|
|
7891
|
+
* new key file is: new file, old one here, restart, rotate, remove this.
|
|
7892
|
+
*/
|
|
7893
|
+
previousKeyFile: z.string().min(1).optional()
|
|
7894
|
+
});
|
|
7895
|
+
/** Bootstrap config -- loaded from config.yaml ONLY at startup.
|
|
7896
|
+
* All other settings live in SQL (system_settings table). */
|
|
7897
|
+
var bootstrapSchema = z.object({
|
|
7898
|
+
/** Server mode: 'hub' (full server) or 'agent' (worker node) */
|
|
7899
|
+
mode: z.enum(["hub", "agent"]).default("hub"),
|
|
7900
|
+
server: serverSchema.default(serverSchema.parse({})),
|
|
7901
|
+
auth: authSchema.default(authSchema.parse({})),
|
|
7902
|
+
/** Hub connection config — only used when mode='agent' */
|
|
7903
|
+
hub: hubSchema.default(hubSchema.parse({})),
|
|
7904
|
+
/** Agent-specific config — only used when mode='agent' */
|
|
7905
|
+
agent: agentSchema.default(agentSchema.parse({})),
|
|
7906
|
+
/** TLS configuration */
|
|
7907
|
+
tls: tlsSchema.default(tlsSchema.parse({})),
|
|
7908
|
+
/**
|
|
7909
|
+
* Addon bootstrap directives — minimum addon set needed before the
|
|
7910
|
+
* kernel can reach the settings-store. See bootstrapAddonsSchema.
|
|
7911
|
+
* Spec: docs/superpowers/specs/2026-05-15-yaml-bootstrap-expansion.md
|
|
7912
|
+
*/
|
|
7913
|
+
bootstrap: bootstrapAddonsSchema.default(bootstrapAddonsSchema.parse({})),
|
|
7914
|
+
/** Keychain master-key location (config.yaml only). */
|
|
7915
|
+
keychain: keychainSchema.default({})
|
|
7916
|
+
});
|
|
7917
|
+
//#endregion
|
|
7765
7918
|
//#region ../../node_modules/js-yaml/dist/js-yaml.mjs
|
|
7766
7919
|
/*! js-yaml 4.2.0 https://github.com/nodeca/js-yaml @license MIT */
|
|
7767
7920
|
var __create = Object.create;
|
|
@@ -10116,9 +10269,6 @@ var ENV_VAR_MAP = {
|
|
|
10116
10269
|
CAMSTACK_PORT: "server.port",
|
|
10117
10270
|
CAMSTACK_HOST: "server.host",
|
|
10118
10271
|
CAMSTACK_DATA: "server.dataPath",
|
|
10119
|
-
CAMSTACK_JWT_SECRET: "auth.jwtSecret",
|
|
10120
|
-
CAMSTACK_ADMIN_USER: "auth.adminUsername",
|
|
10121
|
-
CAMSTACK_ADMIN_PASS: "auth.adminPassword",
|
|
10122
10272
|
CAMSTACK_CORS_ORIGINS: "server.corsOrigins"
|
|
10123
10273
|
};
|
|
10124
10274
|
/** config.yaml, env overrides applied, parsed. */
|
|
@@ -10308,16 +10458,14 @@ function createStoreSettingsView(addonId, cm) {
|
|
|
10308
10458
|
* Which `system-settings` keys the STORE may answer, and which the kernel
|
|
10309
10459
|
* loads from the door into memory at boot — D675.
|
|
10310
10460
|
*
|
|
10311
|
-
* ## The store never
|
|
10461
|
+
* ## The store never answers for a bootstrap section
|
|
10312
10462
|
*
|
|
10313
|
-
* `system-settings`
|
|
10314
|
-
* `auth.
|
|
10315
|
-
*
|
|
10316
|
-
*
|
|
10317
|
-
*
|
|
10318
|
-
*
|
|
10319
|
-
* in "highest priority" would let a stale DB copy replace the JWT secret —
|
|
10320
|
-
* invalidating every token — and change the login password.
|
|
10463
|
+
* `system-settings` may still hold `auth.jwtSecret`, `auth.adminUsername` and
|
|
10464
|
+
* `auth.adminPassword` — written there by `local-auth` (and by older builds)
|
|
10465
|
+
* next to `auth.tokenExpiry`. Since D797 none of the three is a setting at
|
|
10466
|
+
* all (the signing key is the keychain's, the first-boot admin is fixed), and
|
|
10467
|
+
* the stale rows must still never answer: merging them back in would let a
|
|
10468
|
+
* stale DB copy stand in for a credential. The one-off ops script deletes them.
|
|
10321
10469
|
*
|
|
10322
10470
|
* So a bootstrap-owned section is answered from env + config.yaml ONLY, and
|
|
10323
10471
|
* the store may add exactly the keys in {@link STORE_READABLE_BOOTSTRAP_KEYS}:
|
|
@@ -10576,7 +10724,7 @@ var ConfigManager = class {
|
|
|
10576
10724
|
* implementation (sqlite, redis, in-memory, …) behaves identically here.
|
|
10577
10725
|
*
|
|
10578
10726
|
* D675: a bootstrap-owned section takes ONLY allow-listed keys from the
|
|
10579
|
-
* store (a stored `auth.jwtSecret` never
|
|
10727
|
+
* store (a stale stored `auth.jwtSecret` never answers), and with only the
|
|
10580
10728
|
* door wired this sync read THROWS — the settings view's `getSection` reads
|
|
10581
10729
|
* the door.
|
|
10582
10730
|
*/
|
|
@@ -94265,7 +94413,7 @@ function resolveUseHostname() {
|
|
|
94265
94413
|
return process.env["CAMSTACK_MOLECULER_USE_HOSTNAME"] !== "false";
|
|
94266
94414
|
}
|
|
94267
94415
|
function createBroker(config) {
|
|
94268
|
-
const { nodeID, mode, hubAddress, logLevel = "warn",
|
|
94416
|
+
const { nodeID, mode, hubAddress, logLevel = "warn", tcpPort = DEFAULT_HUB_TCP_PORT, udpPort = DEFAULT_UDP_PORT } = config;
|
|
94269
94417
|
const useHostname = resolveUseHostname();
|
|
94270
94418
|
const infraLevel = "error";
|
|
94271
94419
|
const wildcardLevel = logLevel;
|
|
@@ -94287,7 +94435,6 @@ function createBroker(config) {
|
|
|
94287
94435
|
};
|
|
94288
94436
|
if (mode === "hub") return new ServiceBroker({
|
|
94289
94437
|
nodeID,
|
|
94290
|
-
namespace: secret || void 0,
|
|
94291
94438
|
serializer: "MsgPack",
|
|
94292
94439
|
transporter: {
|
|
94293
94440
|
type: "TCP",
|
|
@@ -94330,7 +94477,6 @@ function createBroker(config) {
|
|
|
94330
94477
|
}
|
|
94331
94478
|
return new ServiceBroker({
|
|
94332
94479
|
nodeID,
|
|
94333
|
-
namespace: secret || void 0,
|
|
94334
94480
|
serializer: "MsgPack",
|
|
94335
94481
|
transporter: {
|
|
94336
94482
|
type: "TCP",
|
|
@@ -94488,38 +94634,6 @@ var HubLogForwarder = class {
|
|
|
94488
94634
|
}
|
|
94489
94635
|
};
|
|
94490
94636
|
//#endregion
|
|
94491
|
-
//#region src/kernel/moleculer/cluster-secret.ts
|
|
94492
|
-
/**
|
|
94493
|
-
* Cluster-secret registration gate (opt-in). A registering node sends a
|
|
94494
|
-
* SHA-256 hash of its `CAMSTACK_CLUSTER_SECRET`; the receiver of a
|
|
94495
|
-
* `registerNode` RPC verifies it. The raw secret is never transmitted.
|
|
94496
|
-
*/
|
|
94497
|
-
/** Moleculer error `type` marking a registration rejected for a bad cluster secret. */
|
|
94498
|
-
var CLUSTER_SECRET_MISMATCH_TYPE = "CLUSTER_SECRET_MISMATCH";
|
|
94499
|
-
/** Process exit code a runner uses when its registration is rejected for a bad secret. */
|
|
94500
|
-
var CLUSTER_SECRET_REJECTED_EXIT_CODE = 78;
|
|
94501
|
-
/** SHA-256 hex digest of a cluster secret. Never transmit or log the raw secret. */
|
|
94502
|
-
function hashClusterSecret(secret) {
|
|
94503
|
-
return createHash("sha256").update(secret, "utf8").digest("hex");
|
|
94504
|
-
}
|
|
94505
|
-
/**
|
|
94506
|
-
* True if a registration carrying `presentedHash` is allowed against a
|
|
94507
|
-
* receiver whose own secret hashes to `expectedHash`.
|
|
94508
|
-
* - `expectedHash` undefined → the gate is OFF; everything is allowed.
|
|
94509
|
-
* - otherwise `presentedHash` must be present and equal (constant-time).
|
|
94510
|
-
*/
|
|
94511
|
-
function clusterSecretMatches(expectedHash, presentedHash) {
|
|
94512
|
-
if (expectedHash === void 0) return true;
|
|
94513
|
-
if (presentedHash === void 0 || presentedHash.length !== expectedHash.length) return false;
|
|
94514
|
-
return timingSafeEqual(Buffer.from(expectedHash), Buffer.from(presentedHash));
|
|
94515
|
-
}
|
|
94516
|
-
/** Recognises a cluster-secret rejection, including after a Moleculer RPC round-trip. */
|
|
94517
|
-
function isClusterSecretMismatchError(err) {
|
|
94518
|
-
if (typeof err !== "object" || err === null || !("type" in err)) return false;
|
|
94519
|
-
const { type } = err;
|
|
94520
|
-
return type === CLUSTER_SECRET_MISMATCH_TYPE;
|
|
94521
|
-
}
|
|
94522
|
-
//#endregion
|
|
94523
94637
|
//#region src/kernel/moleculer/hub-service.ts
|
|
94524
94638
|
function createHubService(deps) {
|
|
94525
94639
|
return {
|
|
@@ -94543,7 +94657,9 @@ function createHubService(deps) {
|
|
|
94543
94657
|
return true;
|
|
94544
94658
|
} },
|
|
94545
94659
|
registerNode: { handler(ctx) {
|
|
94546
|
-
|
|
94660
|
+
const verdict = checkClusterSecret(deps.clusterSecretGate?.() ?? { kind: "off" }, ctx.params.clusterSecretHash);
|
|
94661
|
+
if (verdict === "mismatch") throw new Errors.MoleculerError(`cluster secret mismatch — node "${ctx.params.nodeId}" rejected`, 403, CLUSTER_SECRET_MISMATCH_TYPE);
|
|
94662
|
+
if (verdict === "unavailable") throw new Errors.MoleculerRetryableError(`the hub cannot read its cluster secret yet — node "${ctx.params.nodeId}" must retry`, 503, CLUSTER_SECRET_UNAVAILABLE_TYPE);
|
|
94547
94663
|
deps.onRegisterNode?.(ctx.params);
|
|
94548
94664
|
return { ok: true };
|
|
94549
94665
|
} },
|
|
@@ -96316,4 +96432,4 @@ var LifecycleJobEngine = class {
|
|
|
96316
96432
|
}
|
|
96317
96433
|
};
|
|
96318
96434
|
//#endregion
|
|
96319
|
-
export { AGENT_CAP_FWD_ACTION, AGENT_CAP_FWD_SERVICE, AGENT_READINESS_SERVICE_NAME, ALL_CAPABILITY_DEFINITIONS, ARRAY_BUFFER_CENSUS_COOLDOWN_MS, ARRAY_BUFFER_CENSUS_SUSTAIN_MS, ARRAY_BUFFER_CENSUS_THRESHOLD_MB, ARRAY_BUFFER_RELEASE_MIN_DROP_RATIO, AddonApiFactory, AddonDepsManager, AddonEngineManager, AddonHealthMonitor, AddonInstaller, AddonLoader, AddonManifest, AddonRouteRegistry, AlertCenterAddon, ApiKeyManager, AuthManager, CAP_ACTION_OVERFLOW_LABEL, CAP_ACTION_UNLABELLED, CAP_METHOD_NOT_IMPLEMENTED, CA_COMMON_NAME, CA_VALIDITY_DAYS, CLUSTER_SECRET_MISMATCH_TYPE, CLUSTER_SECRET_REJECTED_EXIT_CODE, CORE_CAP_SERVICE_NAME, CalendarsAddon, CapRouteError, CapRouteResolver, CapUsageRegistry, CapabilityHandle, CapabilityRegistry, CapabilityUnavailableError, ComposerAddon, ConfigManager, ConfigStore, ConsoleDestination, ConsoleLoggingAddon, CoreBlocksAddon, CustomActionRegistry, DECISIVE_HEAP_SPACES, DEFAULT_DATA_PATH, DEFAULT_LAN_HTTP_PORT, DEFAULT_LOG_LEVEL, DEVICE_SETTINGS_CONTRIBUTION_METHODS, DEVICE_STATUS_METHOD, DataPlaneRegistry, DeviceManagerAddon, DeviceRegistry, DeviceStore, EMPTY_CAP_ACTION_READING, EMPTY_SOCKET_DIRECTION, EMPTY_SOCKET_PLANE_BASELINE, EVENT_PLANE_TOP_N, EVENT_TOPIC_PREFIX, EngineManagerResolver, EventBus, FeatureManager, FilesystemStorageAddon, FilesystemStorageProvider, FrameDecoder, FsStorageBackend, GET_STATUS_METHOD, HEALTH_MONITOR_GRACE_PERIOD_MS, HEALTH_MONITOR_RETRY_INTERVALS_MS, HEALTH_MONITOR_TICK_MS, HEAP_RECLAIM_MIN_INTERVAL_MS, HEAP_RECLAIM_STEADY_STATE_INTERVAL_MS, HEAP_RECLAIM_TRIGGER_MB, HEAP_SPACE_REPORT_MIN_MB, HEAP_WATCH_INTERVAL_MS, HEAP_WATCH_WARN_RATIO, HUB_CAP_FWD_ACTION, HUB_CAP_FWD_SERVICE, HUB_MAIN_HEAP_WATCH_LABEL, HUB_MAIN_RSS_BUDGET_MB, HUB_RSS_BUDGET_ENV, HubForwarderAddon, HubForwarderDestination, HubLogForwarder, HubNodeRegistry, INFRA_CAPABILITIES, IntegrationRegistry, JobJournal, LEAF_RENEWAL_WINDOW_DAYS, LifecycleJobEngine, LifecycleStateMachine, LivenessMonitorAddon, LocalAuthAddon, LocalChildClient, LocalChildRegistry, LogManager, LogRingBuffer, LoggingGate, LokiDestination, LokiLoggingAddon, MAX_CAP_ACTIONS_PER_PEER, MAX_LEAF_VALIDITY_DAYS, MESH_QUEUE_TOP_N, METHOD_ACCESS_MAP, ModelDownloadService, NATIVE_PROVIDER_SERVICE_INFIX, NATIVE_SCAN_DEPTH, NativeMetricsAddon, NativeMetricsProvider, NetworkQualityTracker, NotificationService, OUTBOUND_QUEUE_COOLDOWN_MS, OUTBOUND_QUEUE_SUSTAIN_MS, OUTBOUND_QUEUE_THRESHOLD_BYTES, PARENT_ROUTED_PROVIDER_ADDON_ID, PYTHON_VERSION, PeerAnsweredError, PipelineRunner, PipelineValidator, PythonEnvManager, QUARANTINE_DIRNAME, RESTART_MARKER_FILE, RSS_BUDGET_REANNOUNCE_MIN_MS, RSS_BUDGET_RELEASE_RATIO, RUNNER_HEAP_WATCH_INTERVAL_MS, RUNNER_RSS_BUDGET_ENV, RUNTIME_DEFAULTS, ReadinessRegistry, ReadinessTimeoutError, ReplEngine, RingBuffer, SERVER_AUTH_OID, SOCKET_PLANE_TOP_N, SOCKET_QUEUE_TOP_N, STALL_REPORT_MS, STALL_TICK_MS, STORE_READABLE_BOOTSTRAP_KEYS, ScopedLogger, ScopedTokenManager, SettingsReadUnavailableError, SocketChannel, SqliteSettingsAddon, SqliteSettingsBackend, StagingArea, StorageLocationManager, StorageManager, StorageOrchestratorAddon, StorageOrchestratorService, SystemConfigAddon, SystemEventBus, TRADITIONAL_NATIVE_PACKAGES, ToastService, UDS_NO_ROUTE_PREFIX, UNCLAIMED, UPLOADED_CA_FILE, UdsLocalTransportClient, UdsLocalTransportServer, UserManager, WinstonDestination, WinstonLoggingAddon, ZERO_LOOP_DELAY, __resetCapUsageRegistryForTests, __resetLoggingGateForTests, adaptBrokerToCluster, addonSettingsCapability, adoptModelRevisions, afterWorkerOnlineAnnounce, allFamiliesListenHost, answerClaimedGetStatus, applyCertificateToListener, applyLanHttp, attributeStall, bindPendingLanHttp, bootstrapSchema, brokerCallForCap, brokerTransportLink, buildBinaryPath, buildCapRouters, buildHeapSample, buildLinkChain, buildNativeCapProxy, buildNodeManifest, buildNpmChildEnv, buildStorageLocationRegistry, builderMountedCapNames, callRegisterNodeWithRetry, callWithServiceDiscovery, canServeDataPlane, capActionLabel, capActionName, capActionSuffix, capBareAction, capServiceName, classifyAddonDir, classifyCapRoute, clearHttpsListener, clearPendingRestart, clearPlatformKeychainKey, closeLanHttp, clusterEventTopic, clusterSecretMatches, collectCertIdentity, collectModelFiles, contentTypeFor, copyDirRecursive, copyExtraFileDirs, createAddonContext, createAddonDataPlaneFacility, createAddonPeerBytesFacility, createAddonService, createArrayBufferCensusGate, createAuthenticatedFileServer, createBroker, createBrokerDeviceManagerApi, createCapActionCensus, createCoreCapService, createDeferredHeapWatchSink, createDoorSettingsView, createEventPlaneMeter, createEventPlaneReader, createFileDataPlaneHandler, createHubCapForwardService, createHubService, createInspectorArrayBufferCensus, createKernelHwAccel, createLocalTransport, createLoopDelayMeter, createMeshQueueReader, createOutboundQueueGate, createParentUnownedCallHandler, createProcessService, createReadinessService, createReadinessServiceForRegistry, createScopedProcessManager, createSocketDirectionCounters, createSocketPlaneMeter, createSocketPlaneReader, createStreamProbeBrokerService, createUdsAddonContext, createUdsEventBridge, createUdsEventBus, createUdsLogger, createUdsLoggerWithControl, createV8Reclaimer, deleteModelFromDisk, deriveAgentListenPort, describeProviderKindDrift, describeRss, detectWorkspacePackagesDir, deviceCapResolverLink, deviceOfGetStatus, diffCapActionCensus, diffEventPlane, diffSocketPlane, downloadBinary, downloadFile, downloadModel, emitDownForOwnedCaps, emitHeapDiagnosticReport, encodeFrame, ensureAddonNativePrebuilds, ensureBinary, ensureDir, ensureFfmpeg, ensureLibraryBuilt, ensureModel, ensureNativePrebuilds, ensurePython, ensureTlsCert, evaluateExistingCert, expandCapMethods, fetchJson, findInPath, formatArrayBufferCensus, formatEventPlane, formatHeapSpaces, formatLogLine, formatMeshQueue, formatOutboundQueueVerdict, formatSocketPlane, getBrokerEventBus, getCapUsageRegistry, getFfmpegDownloadUrl, getLoggingGate, getModelFilePath, getMoleculerEventStats, getOrInitReadinessRegistry, getOrInitReadinessRegistryForClient, getPidStats, getPlatformInfo, getPlatformKeychainKey, getPythonDownloadUrl, getRestartMarkerPath, getSinglePidStats, getWorkerDeviceRegistry, hasDotNode, hashClusterSecret, heapSpaceField, hostNodeIdOf, hubMainRssBudget, installManifestNativeDeps, installManifestPythonDeps, installManifestSystemDeps, installPackageFromNpm, installPythonPackages, installPythonRequirements, ipcParentLink, isAddonDeploySource, isArrayBufferCensusReport, isArrayOutputSchema, isClusterSecretMismatchError, isCollectionArrayMethod, isCredentialKeyName, isInfraCapability, isModelDownloaded, isSettingsReadUnavailable, isSourceNewer, isolatedBuiltinPhase, leafFingerprintOf, loadTlsCert, localEndpointPath, localProviderLink, mountNativeCapService, nextRssBudgetState, overlayGetStatus, parseCapAction, parseRangeHeader, parseRssBudgetMb, parseTokenizedUrl, partitionIsolatedBuiltinIds, prepareBootTls, proxyToUpstream, quarantineAddonResidue, readExtraSans, readHeapSpaces, readLanHttpState, readPendingRestart, readSocketQueues, readTlsAccessStatus, readTlsMode, readinessKey, reclaimIntervalMs, recordSocketFrame, redactLogEntry, redactLogMeta, redactLogText, regenerateCertificate, registerEventBusService, registerHttpsListener, registerLanHttpHandler, reissueTlsLeaf, reloadHttpsListener, resolveFilePath, resolveFormatRevision, resolveHwAccel, resolveNpmInvocation, revertToGeneratedCertificate, revisionWeightUrl, runHubAddonBoot, runNpm, sampleSocketDirection, scheduleSelfRestart, scopeKey, scopesAllowAddon, scopesAllowDeviceCap, selectAddonResidue, selectReportedSpaces, serializeTypedArrays, servedHttpsLeafFingerprint, setHubConnected, setNodeEventInterest, setPlatformKeychainKey, setWrapperActive, shouldReclaim, signalAllRunnerGroups, socketDirectionBytes, socketDirectionMessages, splitPemCertificates, stampCallerAddonId, startEventLoopStallMonitor, startHeapWatch, startRunnerHeapWatch, storeMayAnswer, storeUploadedCertificate, strandedMb, stripCamstackDeps, subscribePassthrough, udsChildLogToWorkerEntry, validateProviderRegistrations, validateUploadedTls, waitUntilReady, writeExtraSans, writePendingRestart, writeTlsMode };
|
|
96435
|
+
export { AGENT_CAP_FWD_ACTION, AGENT_CAP_FWD_SERVICE, AGENT_READINESS_SERVICE_NAME, ALL_CAPABILITY_DEFINITIONS, ARRAY_BUFFER_CENSUS_COOLDOWN_MS, ARRAY_BUFFER_CENSUS_SUSTAIN_MS, ARRAY_BUFFER_CENSUS_THRESHOLD_MB, ARRAY_BUFFER_RELEASE_MIN_DROP_RATIO, AddonApiFactory, AddonDepsManager, AddonEngineManager, AddonHealthMonitor, AddonInstaller, AddonLoader, AddonManifest, AddonRouteRegistry, AlertCenterAddon, ApiKeyManager, AuthManager, CAP_ACTION_OVERFLOW_LABEL, CAP_ACTION_UNLABELLED, CAP_METHOD_NOT_IMPLEMENTED, CA_COMMON_NAME, CA_VALIDITY_DAYS, CLUSTER_SECRET_MISMATCH_TYPE, CLUSTER_SECRET_REF, CLUSTER_SECRET_REJECTED_EXIT_CODE, CLUSTER_SECRET_SETTINGS_KEY, CLUSTER_SECRET_UNAVAILABLE_TYPE, CORE_CAP_SERVICE_NAME, CalendarsAddon, CapRouteError, CapRouteResolver, CapUsageRegistry, CapabilityHandle, CapabilityRegistry, CapabilityUnavailableError, ComposerAddon, ConfigManager, ConfigStore, ConsoleDestination, ConsoleLoggingAddon, CoreBlocksAddon, CustomActionRegistry, DECISIVE_HEAP_SPACES, DEFAULT_DATA_PATH, DEFAULT_LAN_HTTP_PORT, DEFAULT_LOG_LEVEL, DEVICE_SETTINGS_CONTRIBUTION_METHODS, DEVICE_STATUS_METHOD, DataPlaneRegistry, DeviceManagerAddon, DeviceRegistry, DeviceStore, EMPTY_CAP_ACTION_READING, EMPTY_SOCKET_DIRECTION, EMPTY_SOCKET_PLANE_BASELINE, EVENT_PLANE_TOP_N, EVENT_TOPIC_PREFIX, EngineManagerResolver, EventBus, FIRST_BOOT_ADMIN_PASSWORD, FIRST_BOOT_ADMIN_USERNAME, FeatureManager, FilesystemStorageAddon, FilesystemStorageProvider, FrameDecoder, FsStorageBackend, GET_STATUS_METHOD, HEALTH_MONITOR_GRACE_PERIOD_MS, HEALTH_MONITOR_RETRY_INTERVALS_MS, HEALTH_MONITOR_TICK_MS, HEAP_RECLAIM_MIN_INTERVAL_MS, HEAP_RECLAIM_STEADY_STATE_INTERVAL_MS, HEAP_RECLAIM_TRIGGER_MB, HEAP_SPACE_REPORT_MIN_MB, HEAP_WATCH_INTERVAL_MS, HEAP_WATCH_WARN_RATIO, HUB_CAP_FWD_ACTION, HUB_CAP_FWD_SERVICE, HUB_MAIN_HEAP_WATCH_LABEL, HUB_MAIN_RSS_BUDGET_MB, HUB_RSS_BUDGET_ENV, HubForwarderAddon, HubForwarderDestination, HubLogForwarder, HubNodeRegistry, INFRA_CAPABILITIES, IntegrationRegistry, JWT_SIGNING_KEY_REF, JobJournal, JwtSigningKeyUnavailableError, LEAF_RENEWAL_WINDOW_DAYS, LifecycleJobEngine, LifecycleStateMachine, LivenessMonitorAddon, LocalAuthAddon, LocalChildClient, LocalChildRegistry, LogManager, LogRingBuffer, LoggingGate, LokiDestination, LokiLoggingAddon, MAX_CAP_ACTIONS_PER_PEER, MAX_LEAF_VALIDITY_DAYS, MESH_QUEUE_TOP_N, METHOD_ACCESS_MAP, ModelDownloadService, NATIVE_PROVIDER_SERVICE_INFIX, NATIVE_SCAN_DEPTH, NativeMetricsAddon, NativeMetricsProvider, NetworkQualityTracker, NotificationService, OUTBOUND_QUEUE_COOLDOWN_MS, OUTBOUND_QUEUE_SUSTAIN_MS, OUTBOUND_QUEUE_THRESHOLD_BYTES, PARENT_ROUTED_PROVIDER_ADDON_ID, PYTHON_VERSION, PeerAnsweredError, PipelineRunner, PipelineValidator, PythonEnvManager, QUARANTINE_DIRNAME, RESTART_MARKER_FILE, RSS_BUDGET_REANNOUNCE_MIN_MS, RSS_BUDGET_RELEASE_RATIO, RUNNER_HEAP_WATCH_INTERVAL_MS, RUNNER_RSS_BUDGET_ENV, RUNTIME_DEFAULTS, ReadinessRegistry, ReadinessTimeoutError, ReplEngine, RingBuffer, SERVER_AUTH_OID, SOCKET_PLANE_TOP_N, SOCKET_QUEUE_TOP_N, STALL_REPORT_MS, STALL_TICK_MS, STORE_READABLE_BOOTSTRAP_KEYS, SYSTEM_SECRET_OWNER, ScopedLogger, ScopedTokenManager, SettingsReadUnavailableError, SocketChannel, SqliteSettingsAddon, SqliteSettingsBackend, StagingArea, StorageLocationManager, StorageManager, StorageOrchestratorAddon, StorageOrchestratorService, SystemConfigAddon, SystemEventBus, TRADITIONAL_NATIVE_PACKAGES, ToastService, UDS_NO_ROUTE_PREFIX, UNCLAIMED, UPLOADED_CA_FILE, UdsLocalTransportClient, UdsLocalTransportServer, UserManager, WinstonDestination, WinstonLoggingAddon, ZERO_LOOP_DELAY, __resetCapUsageRegistryForTests, __resetLoggingGateForTests, adaptBrokerToCluster, addonSettingsCapability, adoptModelRevisions, afterWorkerOnlineAnnounce, allFamiliesListenHost, answerClaimedGetStatus, applyCertificateToListener, applyLanHttp, attributeStall, bindPendingLanHttp, bootstrapSchema, brokerCallForCap, brokerTransportLink, buildBinaryPath, buildCapRouters, buildHeapSample, buildLinkChain, buildNativeCapProxy, buildNodeManifest, buildNpmChildEnv, buildStorageLocationRegistry, builderMountedCapNames, callRegisterNodeWithRetry, callWithServiceDiscovery, canServeDataPlane, capActionLabel, capActionName, capActionSuffix, capBareAction, capServiceName, checkClusterSecret, classifyAddonDir, classifyCapRoute, clearHttpsListener, clearPendingRestart, clearPlatformKeychainKey, closeLanHttp, clusterEventTopic, clusterSecretMatches, collectCertIdentity, collectModelFiles, contentTypeFor, copyDirRecursive, copyExtraFileDirs, createAddonContext, createAddonDataPlaneFacility, createAddonPeerBytesFacility, createAddonService, createArrayBufferCensusGate, createAuthenticatedFileServer, createBroker, createBrokerDeviceManagerApi, createCapActionCensus, createCoreCapService, createDeferredHeapWatchSink, createDoorSettingsView, createEventPlaneMeter, createEventPlaneReader, createFileDataPlaneHandler, createHubCapForwardService, createHubService, createInspectorArrayBufferCensus, createKernelHwAccel, createLocalTransport, createLoopDelayMeter, createMeshQueueReader, createOutboundQueueGate, createParentUnownedCallHandler, createProcessService, createReadinessService, createReadinessServiceForRegistry, createScopedProcessManager, createSocketDirectionCounters, createSocketPlaneMeter, createSocketPlaneReader, createStreamProbeBrokerService, createUdsAddonContext, createUdsEventBridge, createUdsEventBus, createUdsLogger, createUdsLoggerWithControl, createV8Reclaimer, deleteModelFromDisk, deriveAgentListenPort, describeProviderKindDrift, describeRss, detectWorkspacePackagesDir, deviceCapResolverLink, deviceOfGetStatus, diffCapActionCensus, diffEventPlane, diffSocketPlane, downloadBinary, downloadFile, downloadModel, emitDownForOwnedCaps, emitHeapDiagnosticReport, encodeFrame, ensureAddonNativePrebuilds, ensureBinary, ensureDir, ensureFfmpeg, ensureLibraryBuilt, ensureModel, ensureNativePrebuilds, ensurePython, ensureTlsCert, evaluateExistingCert, expandCapMethods, fetchJson, findInPath, formatArrayBufferCensus, formatEventPlane, formatHeapSpaces, formatLogLine, formatMeshQueue, formatOutboundQueueVerdict, formatSocketPlane, getBrokerEventBus, getCapUsageRegistry, getFfmpegDownloadUrl, getLoggingGate, getModelFilePath, getMoleculerEventStats, getOrInitReadinessRegistry, getOrInitReadinessRegistryForClient, getPidStats, getPlatformInfo, getPlatformKeychainKey, getProcessClusterSecretGate, getProcessJwtSigningKeyState, getPythonDownloadUrl, getRestartMarkerPath, getSinglePidStats, getWorkerDeviceRegistry, hasDotNode, hashClusterSecret, heapSpaceField, hostNodeIdOf, hubMainRssBudget, installManifestNativeDeps, installManifestPythonDeps, installManifestSystemDeps, installPackageFromNpm, installPythonPackages, installPythonRequirements, ipcParentLink, isAddonDeploySource, isArrayBufferCensusReport, isArrayOutputSchema, isClusterSecretMismatchError, isCollectionArrayMethod, isCredentialKeyName, isInfraCapability, isModelDownloaded, isSettingsReadUnavailable, isSourceNewer, isolatedBuiltinPhase, leafFingerprintOf, loadTlsCert, localEndpointPath, localProviderLink, mountNativeCapService, nextRssBudgetState, overlayGetStatus, parseCapAction, parseRangeHeader, parseRssBudgetMb, parseTokenizedUrl, partitionIsolatedBuiltinIds, prepareBootTls, processJwtSigningKey, proxyToUpstream, quarantineAddonResidue, readExtraSans, readHeapSpaces, readLanHttpState, readPendingRestart, readSocketQueues, readTlsAccessStatus, readTlsMode, readinessKey, reclaimIntervalMs, recordSocketFrame, redactLogEntry, redactLogMeta, redactLogText, regenerateCertificate, registerEventBusService, registerHttpsListener, registerLanHttpHandler, reissueTlsLeaf, reloadHttpsListener, resolveFilePath, resolveFormatRevision, resolveHwAccel, resolveNpmInvocation, revertToGeneratedCertificate, revisionWeightUrl, runHubAddonBoot, runNpm, sampleSocketDirection, scheduleSelfRestart, scopeKey, scopesAllowAddon, scopesAllowDeviceCap, selectAddonResidue, selectReportedSpaces, serializeTypedArrays, servedHttpsLeafFingerprint, setHubConnected, setNodeEventInterest, setPlatformKeychainKey, setProcessClusterSecretGate, setWrapperActive, shouldReclaim, signalAllRunnerGroups, socketDirectionBytes, socketDirectionMessages, splitPemCertificates, stampCallerAddonId, startEventLoopStallMonitor, startHeapWatch, startRunnerHeapWatch, staticJwtSigningKey, storeMayAnswer, storeUploadedCertificate, strandedMb, stripCamstackDeps, subscribePassthrough, udsChildLogToWorkerEntry, validateProviderRegistrations, validateUploadedTls, waitUntilReady, writeExtraSans, writePendingRestart, writeTlsMode };
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
const require_dist = require("./dist-Cc6KOdY-.js");
|
|
2
|
+
let node_crypto = require("node:crypto");
|
|
3
|
+
//#region src/auth/jwt-signing-key.ts
|
|
4
|
+
/**
|
|
5
|
+
* The hub's session signing key — the HMAC key every JWT this hub mints
|
|
6
|
+
* (sessions, SSO bridge, TOTP challenges, service tokens) is signed with.
|
|
7
|
+
*
|
|
8
|
+
* It lives in the keychain, owner `system` ({@link JWT_SIGNING_KEY_REF}), and
|
|
9
|
+
* nowhere else: no environment variable, no `config.yaml` key (D797). The
|
|
10
|
+
* hub's `local-auth` builtin loads it after the keychain booted and registers
|
|
11
|
+
* it here; every `AuthManager` in the process asks this slot on every mint and
|
|
12
|
+
* every verify, so a key that arrives (or changes) after construction is used
|
|
13
|
+
* from the next call on.
|
|
14
|
+
*
|
|
15
|
+
* ## A locked keychain fails closed, visibly
|
|
16
|
+
*
|
|
17
|
+
* While the key cannot be read, sessions can be neither minted nor verified:
|
|
18
|
+
* {@link JwtSigningKeySource.current} throws {@link JwtSigningKeyUnavailableError}
|
|
19
|
+
* (a login answers that error, a bearer check reads it as "not authenticated").
|
|
20
|
+
* There is deliberately NO fallback — not an env var, and not a fresh random
|
|
21
|
+
* key, which would invalidate every session and every app token without
|
|
22
|
+
* anyone having asked for it. A key is generated ONLY when the keychain
|
|
23
|
+
* answers that none is stored (`missing`), i.e. on a fresh hub.
|
|
24
|
+
*
|
|
25
|
+
* Process-global through a registered symbol, like the desktop platform key,
|
|
26
|
+
* so a second copy of this module (an addon bundle) sees the same key.
|
|
27
|
+
*/
|
|
28
|
+
/** The keychain owner of every system-held secret. */
|
|
29
|
+
var SYSTEM_SECRET_OWNER = "system";
|
|
30
|
+
/** `secret://system/global/jwtSigningKey`. */
|
|
31
|
+
var JWT_SIGNING_KEY_REF = require_dist.buildSecretRef({
|
|
32
|
+
owner: SYSTEM_SECRET_OWNER,
|
|
33
|
+
scope: { kind: "global" },
|
|
34
|
+
fieldPath: "jwtSigningKey"
|
|
35
|
+
});
|
|
36
|
+
/** Sessions cannot be minted or verified: the signing key is not loaded. */
|
|
37
|
+
var JwtSigningKeyUnavailableError = class extends Error {
|
|
38
|
+
reason;
|
|
39
|
+
constructor(reason) {
|
|
40
|
+
super(`sessions are unavailable: the session signing key could not be read from the keychain (${reason}). Unlock the keychain (System → Secrets, or fix keychain.keyFile and restart).`);
|
|
41
|
+
this.reason = reason;
|
|
42
|
+
this.name = "JwtSigningKeyUnavailableError";
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
var SLOT = Symbol.for("camstack.auth.jwt-signing-key");
|
|
46
|
+
var NOT_LOADED = {
|
|
47
|
+
state: "unavailable",
|
|
48
|
+
reason: "not-loaded"
|
|
49
|
+
};
|
|
50
|
+
function isState(value) {
|
|
51
|
+
if (value === null || typeof value !== "object") return false;
|
|
52
|
+
const state = Reflect.get(value, "state");
|
|
53
|
+
if (state === "ready") return typeof Reflect.get(value, "key") === "string";
|
|
54
|
+
return state === "unavailable" && typeof Reflect.get(value, "reason") === "string";
|
|
55
|
+
}
|
|
56
|
+
/** Register the loaded (or unloadable) key. Called by the hub's `local-auth`. */
|
|
57
|
+
function setProcessJwtSigningKey(state) {
|
|
58
|
+
Reflect.set(globalThis, SLOT, state);
|
|
59
|
+
}
|
|
60
|
+
function getProcessJwtSigningKeyState() {
|
|
61
|
+
const value = Reflect.get(globalThis, SLOT);
|
|
62
|
+
return isState(value) ? value : NOT_LOADED;
|
|
63
|
+
}
|
|
64
|
+
/** The process slot — the default source of every `AuthManager`. */
|
|
65
|
+
var processJwtSigningKey = { current() {
|
|
66
|
+
const state = getProcessJwtSigningKeyState();
|
|
67
|
+
if (state.state === "ready") return state.key;
|
|
68
|
+
throw new JwtSigningKeyUnavailableError(state.reason);
|
|
69
|
+
} };
|
|
70
|
+
/** A fixed key — tests, and nothing else. */
|
|
71
|
+
function staticJwtSigningKey(key) {
|
|
72
|
+
return { current: () => key };
|
|
73
|
+
}
|
|
74
|
+
/** 32 random bytes, hex. */
|
|
75
|
+
function generateJwtSigningKey() {
|
|
76
|
+
return (0, node_crypto.randomBytes)(32).toString("hex");
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Read the key from the keychain; generate and store one ONLY when the
|
|
80
|
+
* keychain answers that none exists. Never throws.
|
|
81
|
+
*/
|
|
82
|
+
async function loadJwtSigningKey(deps) {
|
|
83
|
+
let entry;
|
|
84
|
+
try {
|
|
85
|
+
entry = (await deps.secrets.resolve([JWT_SIGNING_KEY_REF]))[JWT_SIGNING_KEY_REF];
|
|
86
|
+
} catch (err) {
|
|
87
|
+
return {
|
|
88
|
+
state: "unavailable",
|
|
89
|
+
reason: err instanceof Error ? err.message : String(err)
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
if (entry === void 0) return {
|
|
93
|
+
state: "unavailable",
|
|
94
|
+
reason: "no-answer"
|
|
95
|
+
};
|
|
96
|
+
switch (entry.kind) {
|
|
97
|
+
case "value": return {
|
|
98
|
+
state: "ready",
|
|
99
|
+
key: entry.value
|
|
100
|
+
};
|
|
101
|
+
case "unavailable": return {
|
|
102
|
+
state: "unavailable",
|
|
103
|
+
reason: entry.reason
|
|
104
|
+
};
|
|
105
|
+
case "forbidden": return {
|
|
106
|
+
state: "unavailable",
|
|
107
|
+
reason: "forbidden"
|
|
108
|
+
};
|
|
109
|
+
case "missing": {
|
|
110
|
+
const key = (deps.generate ?? generateJwtSigningKey)();
|
|
111
|
+
try {
|
|
112
|
+
await deps.secrets.put(JWT_SIGNING_KEY_REF, key);
|
|
113
|
+
} catch (err) {
|
|
114
|
+
return {
|
|
115
|
+
state: "unavailable",
|
|
116
|
+
reason: `could not store a new key: ${err instanceof Error ? err.message : String(err)}`
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
state: "ready",
|
|
121
|
+
key
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//#endregion
|
|
127
|
+
Object.defineProperty(exports, "JWT_SIGNING_KEY_REF", {
|
|
128
|
+
enumerable: true,
|
|
129
|
+
get: function() {
|
|
130
|
+
return JWT_SIGNING_KEY_REF;
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
Object.defineProperty(exports, "JwtSigningKeyUnavailableError", {
|
|
134
|
+
enumerable: true,
|
|
135
|
+
get: function() {
|
|
136
|
+
return JwtSigningKeyUnavailableError;
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
Object.defineProperty(exports, "SYSTEM_SECRET_OWNER", {
|
|
140
|
+
enumerable: true,
|
|
141
|
+
get: function() {
|
|
142
|
+
return SYSTEM_SECRET_OWNER;
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
Object.defineProperty(exports, "getProcessJwtSigningKeyState", {
|
|
146
|
+
enumerable: true,
|
|
147
|
+
get: function() {
|
|
148
|
+
return getProcessJwtSigningKeyState;
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
Object.defineProperty(exports, "loadJwtSigningKey", {
|
|
152
|
+
enumerable: true,
|
|
153
|
+
get: function() {
|
|
154
|
+
return loadJwtSigningKey;
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
Object.defineProperty(exports, "processJwtSigningKey", {
|
|
158
|
+
enumerable: true,
|
|
159
|
+
get: function() {
|
|
160
|
+
return processJwtSigningKey;
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
Object.defineProperty(exports, "setProcessJwtSigningKey", {
|
|
164
|
+
enumerable: true,
|
|
165
|
+
get: function() {
|
|
166
|
+
return setProcessJwtSigningKey;
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
Object.defineProperty(exports, "staticJwtSigningKey", {
|
|
170
|
+
enumerable: true,
|
|
171
|
+
get: function() {
|
|
172
|
+
return staticJwtSigningKey;
|
|
173
|
+
}
|
|
174
|
+
});
|