/** * 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} 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 }