/** * Booter /proc snapshot helpers used while constructing executeKernel ctx. */ import { bareOsProcBlindPeerRelayHintsExposed, buildBareOsBlindRelaySwarmRuntime } from './bare-os-proc-blind-peer-relay-gate.js' import { bareOsChatMuxEnabled } from './bare-os-chat-service.js' import { bareOsMeshdropMuxEnabled } from './bare-os-meshdrop-service.js' /** * @param {{ * interactiveCtxRef: { ctx: Record | null }, * disk: Record, * shellEnv: Record, * hostEnv?: Record | null * }} deps */ export function createBooterProcHelpers(deps) { const { interactiveCtxRef, disk, shellEnv, hostEnv = null } = deps function bareOsCollectLogicalFdRows() { const c = interactiveCtxRef.ctx const o = c?.bareOsLogicalFds if (!o || typeof o !== 'object') return [] return Object.keys(o) .filter((k) => /^[0-9]+$/.test(k) && k !== '0' && k !== '1' && k !== '2') .sort((a, b) => Number(a) - Number(b)) .map((fdNum) => ({ fd: Number(fdNum), target: String(/** @type {Record} */ (o)[fdNum] ?? '') })) } function bareOsLiveShellJobsAndIpcStats() { const live = interactiveCtxRef.ctx const shellJobs = live && live.shellBackgroundJobs && typeof live.shellBackgroundJobs === 'object' && Array.isArray(live.shellBackgroundJobs.list) ? live.shellBackgroundJobs.list : [] let ipcStats try { ipcStats = live && live.bareOsIpc && typeof live.bareOsIpc.stats === 'function' ? live.bareOsIpc.stats() : undefined } catch { ipcStats = undefined } return { shellJobs, ipcStats } } function bareOsBlindRelayRuntimeHintsForProc() { if (!bareOsProcBlindPeerRelayHintsExposed(shellEnv)) return undefined const peers = disk.peers ? [...disk.peers] : [] return { swarm: buildBareOsBlindRelaySwarmRuntime(shellEnv, peers, { hasSystemDrive: !!disk.drive, hasPersonalDrive: !!disk.personalDrive, auxiliaryDriveCount: Array.isArray(disk.auxiliaryDrives) ? disk.auxiliaryDrives.length : 0 }) } } /** * Same object as `/proc/bare_os/chat.json` (single source for VFS + ctx hook). * @returns {Record} */ function bareOsChatProcSnapshotRecord() { const svc = disk.bareOsChatService if (!svc) { return { schema: 1, note: 'Swarm chat is off when BARE_OS_PROTOMUX_CHAT_CHANNEL=0/false/off (stock default is on).' } } return { schema: 1, atMs: Date.now(), protocol: svc.PROTOCOL_CHAT_CHANNEL_NAME, metrics: svc.snapshotMetrics(), protomuxChatRxTotal: typeof disk.protomuxChatChannelRxTotal === 'number' ? disk.protomuxChatChannelRxTotal : 0, swarmPeers: disk.peers && typeof disk.peers.size === 'number' ? disk.peers.size : 0, muxEnabled: bareOsChatMuxEnabled(shellEnv) || bareOsChatMuxEnabled(hostEnv || {}) } } /** * Same object as `/proc/bare_os/meshdrop.json`. * @returns {Record} */ function bareOsMeshdropProcSnapshotRecord() { const svc = disk.bareOsMeshdropService if (!svc) { return { schema: 1, note: 'Meshdrop channel is off when BARE_OS_PROTOMUX_MESHDROP_CHANNEL=0/false/off (stock default is on).' } } return { schema: 1, atMs: Date.now(), protocol: svc.PROTOCOL_MESHDROP_CHANNEL_NAME, metrics: svc.snapshotMetrics(), protomuxMeshdropRxTotal: typeof disk.protomuxMeshdropChannelRxTotal === 'number' ? disk.protomuxMeshdropChannelRxTotal : 0, swarmPeers: disk.peers && typeof disk.peers.size === 'number' ? disk.peers.size : 0, muxEnabled: bareOsMeshdropMuxEnabled(shellEnv) || bareOsMeshdropMuxEnabled(hostEnv || {}) } } return { bareOsCollectLogicalFdRows, bareOsLiveShellJobsAndIpcStats, bareOsBlindRelayRuntimeHintsForProc, bareOsChatProcSnapshotRecord, bareOsMeshdropProcSnapshotRecord } }