Files
bare-operating-system/packages/bare-os-booter/lib/bare-os-kernel-program-proc.js
T
2026-04-04 16:39:15 -04:00

150 lines
6.3 KiB
JavaScript

/**
* Operator-facing `/proc/bare_os/kernel_program.json` snapshot (env-driven, non-secret).
* Legacy path `/proc/bare_os/giant_phase_program.json` resolves to the same payload.
* Guest surfaces avoid Node `node:*` built-ins.
* @param {Record<string, string | undefined>} env
*/
export const KERNEL_PROGRAM_PROC_SCHEMA = 2
export const KERNEL_PROGRAM_PROC_VERSION = 2
export function buildKernelProgramProcJson(env) {
const now = Date.now()
const esc = (k) => String(env[k] ?? '').trim()
const on = (k) => {
const v = esc(k)
return v === '1' || v === 'true'
}
function parseOverride() {
const rawNew = esc('BARE_OS_KERNEL_PROGRAM_PROC_JSON')
const rawLegacy = esc('BARE_OS_GIANT_PHASE_PROGRAM_JSON')
const raw = rawNew || rawLegacy
if (!raw) return null
const key = rawNew
? 'BARE_OS_KERNEL_PROGRAM_PROC_JSON'
: 'BARE_OS_GIANT_PHASE_PROGRAM_JSON'
try {
const o = JSON.parse(raw)
return o && typeof o === 'object' ? o : null
} catch {
return { error: 'invalid_json', key, atMs: now }
}
}
function parseJsonEnv(key) {
const raw = esc(key)
if (!raw) return null
try {
const o = JSON.parse(raw)
return o && typeof o === 'object' ? o : null
} catch {
return { error: 'invalid_json', key, atMs: now }
}
}
const base = {
schema: KERNEL_PROGRAM_PROC_SCHEMA,
program: 'bare-os-kernel-program',
programVersion: KERNEL_PROGRAM_PROC_VERSION,
atMs: now,
hooks: {
bootSafeMode: on('BARE_OS_BOOT_SAFE_MODE'),
bootTransactionJournal: (() => {
const v = esc('BARE_OS_BOOT_TRANSACTION_JOURNAL')
return v === '1' || v === 'true' || v === 'ndjson' ? v : ''
})(),
bootCheckpoint: on('BARE_OS_BOOT_CHECKPOINT'),
bootPolicy: on('BARE_OS_BOOT_POLICY'),
bootPolicyStrict: on('BARE_OS_BOOT_POLICY_STRICT'),
bootMinimal: on('BARE_OS_BOOT_MINIMAL'),
bootDryRun: on('BARE_OS_BOOT_DRY_RUN'),
bootRollbackApply: on('BARE_OS_BOOT_ROLLBACK_APPLY'),
kernelDebug: on('BARE_OS_KERNEL_DEBUG'),
lazyPersonalDrive: on('BARE_OS_LAZY_PERSONAL_DRIVE'),
kernelHotReload: on('BARE_OS_KERNEL_HOT_RELOAD'),
delegateTrace: on('BARE_OS_DELEGATE_TRACE'),
loaderAudit: on('BARE_OS_LOADER_AUDIT')
},
bareStacks: {
note:
'Prefer bare-module, bare-crypto, bare-fs, bare-net, bare-dns, bare-process, bare-subprocess, bare-ipc, bare-worker, bare-tls, bare-fetch, bare-http1, bare-ws per holepunch bare-node map.',
bareCryptoVersion: esc('BARE_OS_BARE_CRYPTO_VERSION').slice(0, 64),
pearIpcVersion: esc('BARE_OS_PEAR_IPC_PACKAGE_VERSION').slice(0, 64),
bareTlsVersion: esc('BARE_OS_BARE_TLS_VERSION').slice(0, 64)
},
workstreams: {
bootRuntime: { status: 'active', items: '1-20' },
moduleLoading: { status: 'active', items: '21-30' },
processIpc: { status: 'framework', items: '31-40' },
vfsStorage: { status: 'framework', items: '41-50' },
networking: { status: 'framework', items: '51-60' },
security: { status: 'framework', items: '61-70' },
observability: { status: 'framework', items: '71-80' },
distribution: { status: 'framework', items: '81-90' },
quality: { status: 'active', items: '91-100' }
},
operatorSketches: {
schema: 1,
bootBundleDigestHex: esc('BARE_OS_BOOT_BUNDLE_DIGEST_HEX').slice(0, 128),
requireCtxApiMin: esc('BARE_OS_REQUIRE_CTX_API_MIN').slice(0, 32),
dnsProfile: esc('BARE_OS_DNS_PROFILE').slice(0, 64),
netDelegateSketch: parseJsonEnv(
'BARE_OS_NET_DELEGATE_SKETCH_JSON'
) || parseJsonEnv('BARE_OS_GP2_NET_DELEGATE_SKETCH_JSON'),
egressPolicyV2: parseJsonEnv('BARE_OS_EGRESS_POLICY_V2_JSON'),
listenerRegistry: parseJsonEnv('BARE_OS_LISTENER_REGISTRY_JSON'),
tlsSessionCacheHint: parseJsonEnv('BARE_OS_BARE_TLS_SESSION_CACHE_HINT_JSON'),
wsDevtoolsSketch: parseJsonEnv('BARE_OS_BARE_WS_DEVTOOLS_SKETCH_JSON'),
subprocessResourceHints: parseJsonEnv('BARE_OS_SUBPROCESS_RESOURCE_HINTS_JSON'),
vfsWatchDebounceMs: Math.min(
60000,
Math.max(
0,
Number.parseInt(esc('BARE_OS_VFS_WATCH_DEBOUNCE_MS'), 10) || 0
)
),
binCacheStats: parseJsonEnv('BARE_OS_VFS_BIN_CACHE_STATS_JSON'),
zlibLogPolicy: parseJsonEnv('BARE_OS_ZLIB_LOG_POLICY_JSON'),
keyringRotationPointer: parseJsonEnv('BARE_OS_KEYRING_ROTATION_POINTER_JSON'),
configAttestation: parseJsonEnv('BARE_OS_CONFIG_ATTESTATION_JSON'),
entropyHealth: parseJsonEnv('BARE_OS_ENTROPY_HEALTH_JSON'),
otelResourceAttrs:
parseJsonEnv('BARE_OS_OTEL_RESOURCE_ATTRS_KERNEL_JSON') ||
parseJsonEnv('BARE_OS_OTEL_RESOURCE_ATTRS_GP2_JSON'),
logRetentionHints: parseJsonEnv('BARE_OS_LOG_RETENTION_HINTS_JSON'),
circuitBreakerDelegates: parseJsonEnv('BARE_OS_DELEGATE_CIRCUIT_BREAKER_JSON'),
execLineAnomalyThreshold: Math.min(
1e9,
Math.max(0, Number.parseInt(esc('BARE_OS_EXEC_LINE_ANOMALY_THRESHOLD'), 10) || 0)
),
signedComponentManifest: parseJsonEnv('BARE_OS_SIGNED_COMPONENT_MANIFEST_JSON'),
abChannelHint: esc('BARE_OS_AB_CHANNEL_HINT').slice(0, 64),
lockfileTransitiveAllow: parseJsonEnv('BARE_OS_LOCKFILE_TRANSITIVE_ALLOW_JSON'),
sandboxProfileRegistry: parseJsonEnv('BARE_OS_SANDBOX_PROFILE_REGISTRY_JSON'),
cpuSliceHints: parseJsonEnv('BARE_OS_CPU_SLICE_HINTS_JSON'),
ipcReadWatchdogMs: Math.min(
300000,
Math.max(0, Number.parseInt(esc('BARE_OS_IPC_READ_WATCHDOG_MS'), 10) || 0)
),
crossDriveTxPointer: parseJsonEnv('BARE_OS_CROSS_DRIVE_TX_POINTER_JSON'),
mountNamespaceSketch: parseJsonEnv('BARE_OS_MOUNT_NAMESPACE_SKETCH_JSON'),
note:
'Optional operator JSON hints (non-secret). See developer-guide/kernel-program.md and kernel-superfeature-backlog.md.'
},
docAnchor: 'developer-guide/kernel-program.md'
}
const override = parseOverride()
if (override && !override.error) {
const sch =
typeof override.schema === 'number' && override.schema >= 1 && override.schema <= 3
? override.schema
: KERNEL_PROGRAM_PROC_SCHEMA
return { ...base, ...override, schema: sch, atMs: now }
}
if (override && override.error) {
return { ...base, overrideError: override }
}
return base
}