Further Cleanup

This commit is contained in:
2026-08-18 16:43:40 -04:00
parent 45a99e5fde
commit 7e21c47b0f
92 changed files with 16037 additions and 17662 deletions
+13 -470
View File
@@ -309,6 +309,17 @@ import {
exitHostProcess,
teardownBareOsBootResources
} from './lib/bare-os-lifecycle-manager.js'
import {
applyHostFlagsFromArgv,
hostArgv
} from '../../lib/bare-os-host-flags.mjs'
import { BARE_OS_HOST_ENV_FORWARD_KEYS } from './lib/bare-os-host-env-keys.js'
import {
parseUnionReadPrefixes,
parseUnionWriteDenyPrefixes,
parseIpcChannelMaxBytesMap,
createReadLine
} from './lib/booter-host-session.js'
const { randomUUID, randomBytes } = bareCrypto
@@ -381,170 +392,10 @@ function kernelCapabilityStrictErrorKey(key) {
const KERNEL_CAPABILITY_SEED_STRICT_MISSING_MSG =
'seeder capabilities missing kernelCapabilityWords'
/**
* @param {Record<string, string>} env
* @returns {string[]}
*/
function parseUnionReadPrefixes(env) {
const raw = env && env.BARE_OS_VFS_UNION_PREFIXES
if (raw == null || !String(raw).trim()) return []
return String(raw)
.split(/[,:]+/)
.map((s) => s.trim())
.filter((s) => s.startsWith('/'))
}
/**
* @param {Record<string, string>} env
* @returns {string[]}
*/
function parseUnionWriteDenyPrefixes(env) {
const raw = env && env.BARE_OS_VFS_UNION_WRITE_DENY
if (raw == null || !String(raw).trim()) return []
return String(raw)
.split(/[,:]+/)
.map((s) => s.trim())
.filter((s) => s.startsWith('/'))
}
/**
* @param {Record<string, string>} env
* @returns {Map<string, number> | null}
*/
function parseIpcChannelMaxBytesMap(env) {
const raw = env && env.BARE_OS_IPC_CHANNEL_MAX_BYTES
if (raw == null || !String(raw).trim()) return null
try {
const o = JSON.parse(String(raw))
if (!o || typeof o !== 'object') return null
const m = new Map()
for (const [k, v] of Object.entries(o)) {
const n = Number(v)
if (
typeof k === 'string' &&
/^[a-zA-Z0-9._-]+$/.test(k) &&
Number.isFinite(n) &&
n > 0
) {
m.set(k, Math.min(Math.floor(n), 16 * 1024 * 1024))
}
}
return m.size ? m : null
} catch {
return null
}
}
function bootStorePath() {
return defaultBootCorestorePath(_pkg, import.meta.url)
}
/**
* @returns {Promise<{
* readLine: (p: string) => Promise<string | null>,
* interactiveAvailable: boolean,
* skipInteractive: boolean,
* stdout: import('stream').Writable | null,
* stdin: import('stream').Readable | null
* }>}
*/
async function createReadLine() {
const { stdin, stdout } = await resolveStdio()
const skipInteractive = globalThis.process?.env?.BARE_OS_SKIP_REPL === '1'
if (skipInteractive) {
return {
readLine: async () => null,
interactiveAvailable: false,
skipInteractive: true,
stdout,
stdin
}
}
if (!stdin || !stdout) {
bareOsHostBooterWarn(
'stdio_missing',
'No stdin/stdout (neither process nor bare-stdio). Cannot run interactive shell.'
)
return {
readLine: async () => null,
interactiveAvailable: false,
skipInteractive: false,
stdout,
stdin
}
}
const ttyRawCapable =
Boolean(stdin.isTTY) &&
typeof stdin.setRawMode === 'function' &&
typeof stdout.write === 'function'
/** Prefer fish-style raw editor on TTY — bare-readline / stream reader only (no Node readline). */
if (ttyRawCapable) {
/** Lazy: avoid bare-readline attaching to stdin before createFishReadLine runs. */
let ttyFallback = undefined
const lazyRawReadLine = async (prompt) => {
if (ttyFallback === undefined) {
try {
ttyFallback = await createBareReadlineQuestion(stdin, stdout)
} catch {
ttyFallback =
looksLikeInteractiveStdin(stdin) &&
typeof stdout.write === 'function'
? createStreamLineReader(stdin, stdout)
: false
}
}
if (ttyFallback === false) return null
return ttyFallback(prompt)
}
return {
readLine: lazyRawReadLine,
interactiveAvailable: true,
skipInteractive: false,
stdout,
stdin
}
}
try {
const readLine = await createBareReadlineQuestion(stdin, stdout)
return {
readLine,
interactiveAvailable: true,
skipInteractive: false,
stdout,
stdin
}
} catch {
/* bare-readline failed to load */
}
if (looksLikeInteractiveStdin(stdin) && typeof stdout.write === 'function') {
return {
readLine: createStreamLineReader(stdin, stdout),
interactiveAvailable: true,
skipInteractive: false,
stdout,
stdin
}
}
bareOsHostBooterWarn(
'line_input_unavailable',
'No line input. Set BARE_OS_SKIP_REPL=1 to exit after boot.'
)
return {
readLine: async () => null,
interactiveAvailable: false,
skipInteractive: false,
stdout,
stdin
}
}
/**
* @param {SwarmDisk} disk
* @param {import('corestore').default} store
@@ -591,289 +442,7 @@ async function executeKernel(disk, store, swarm, initSource) {
}
const hostEnv = globalThis.process?.env
if (hostEnv && typeof hostEnv === 'object') {
for (const k of [
'BARE_OS_PIPELINE_MAX_STAGES',
'BARE_OS_PIPELINE_MAX_BYTES',
'BARE_OS_PIPELINE_MAX_LINES',
'BARE_OS_BOOT_PROFILE',
'BARE_OS_ONBOOT',
'BARE_OS_BOOT_STRICT',
'BARE_OS_RC_D_SKIP',
'BARE_OS_BOOT_MINIMAL',
'BARE_OS_BOOT_SKIP',
'BARE_OS_BOOT_TRACE',
'BARE_OS_KERNEL_SELFTEST',
'BARE_OS_AUDIT',
'BARE_OS_AUDIT_JSON',
'BARE_OS_AUDIT_REDACT',
'BARE_OS_IMAGE_DIGEST',
'BARE_OS_EXEC_MAX_DEPTH',
'BARE_OS_IPC_MAX_BYTES',
'BARE_OS_VFS_WATCH',
'BARE_OS_BOOT_ALLOWLIST',
'BARE_OS_SELFTEST_FORMAT',
'BARE_OS_PEAR_CHANNEL',
'BARE_OS_PEAR_RELEASE',
'PEAR_CHANNEL',
'BARE_OS_IPC_RPC_TOKEN',
'BARE_OS_IPC_FANOUT',
'BARE_OS_IPC_JSON_MAX_BYTES',
'BARE_OS_HTTP_ALLOWLIST',
'BARE_OS_HTTP_DENYLIST',
'BARE_OS_IRC',
'BARE_OS_IRC_ALLOWLIST',
'BARE_OS_IRC_DENYLIST',
'BARE_OS_DISCORD',
'DISCORD_TOKEN',
'DISCORD_GUILD_ID',
'DISCORD_ID_WHITELIST',
'DISCORD_USER_INSTALL',
'DISCORD_ENV_FILE',
'BARE_OS_DISCORD_ENV_FILE',
'BARE_OS_TLS_PIN_SHA256',
'BARE_OS_BARE_MODULES',
'BARE_OS_BARE_DRIVE_BUNDLES',
'BARE_OS_BARE_SUBPROCESS_BRIDGE',
'BARE_OS_BARE_SUBPROCESS_TIMEOUT_MS',
'BARE_OS_CTX_BARE_SUBPROCESS_SPAWN',
'BARE_OS_PROC_BLIND_PEER_RELAY_HINTS',
'BARE_OS_PROC_PROTOMUX_EXTENSIONS_REGISTRY',
'BARE_OS_FIND_EXEC_MAX',
'BARE_OS_XARGS_MAX_PROCS',
'BARE_OS_YES_MAX_LINES',
'BARE_OS_SHUF_MAX_LINES',
'BARE_OS_SPLIT_MAX_FILES',
'BARE_OS_SSH_BIND_ALL',
'BARE_OS_SSH_LISTEN_PORT',
'BARE_OS_NPROC',
'BARE_OS_PHYS_PAGES_HINT',
'BARE_OS_BOOT_MANIFEST',
'BARE_OS_BOOT_MANIFEST_SIGN',
'BARE_OS_BOOT_MANIFEST_PUBKEY_HEX',
'BARE_OS_SANDBOX_SCRIPT',
'BARE_OS_TUI',
'BARE_OS_TUI_NO_ALTSCREEN',
'BARE_OS_TUI_DEBUG',
'BARE_OS_VFS_UNION_PREFIXES',
'BARE_OS_URANDOM_CRYPTO',
'BARE_OS_INITD_MAX_PARALLEL',
'BARE_OS_VFS_BIN_CACHE',
'BARE_OS_VFS_BIN_CACHE_BLAKE2B',
'BARE_OS_VFS_ENFORCE_ACL',
'BARE_OS_VFS_BIN_INDEX_BUILD',
'BARE_OS_VFS_SYSTEM_IMAGE_WRITE',
'BARE_OS_VFS_LIB_BARE_CACHE',
'BARE_OS_BOOT_PERF_DETAIL',
'BARE_OS_BIN_HYPERBEE_INDEX',
'BARE_OS_SANDBOX_WORKER',
'BARE_OS_BLIND_BOOTSTRAP_URL',
'BARE_OS_BLIND_BOOTSTRAP_JSON',
'BARE_OS_MIRROR_READ_KEY',
'BARE_OS_PEER_FIREWALL_E2E_JSON',
'BARE_OS_PEAR_SECURE_ENCLAVE_JSON',
'BARE_OS_ACCOUNT_KEY_ROTATION_STATE_JSON',
'BARE_OS_SEED_RPC_HANDSHAKE',
'BARE_OS_SEED_CAP_STRICT',
'BARE_OS_SEED_CAP_FAIL',
'BARE_OS_VFS_UNION_WRITE_DENY',
'BARE_OS_VFS_SYSTEM_RO_ALIAS',
'BARE_OS_VFS_HYPERBLOBS_DEDUP',
'BARE_OS_IPC_CHANNEL_MAX_BYTES',
'BARE_OS_IPC_MAX_CHANNELS',
'BARE_OS_POSIX_MQ_MAX_MSGS',
'BARE_OS_POSIX_MQ_MSG_BYTES',
'BARE_OS_PIPELINE_ABS_MAX_BYTES',
'BARE_OS_PIPELINE_ABS_MAX_LINES',
'BARE_OS_VFS_MAX_OPEN',
'BARE_OS_SHELL_STREAMING',
'BARE_OS_SHELL_STREAMING_MULT',
'BARE_OS_STREAMING_MULTIPLIER',
'BARE_OS_SHELL_CMDSUBST',
'BARE_OS_SHELL_CMDSUBST_MAX_BYTES',
'BARE_OS_SHELL_UNTIL',
'BARE_OS_SH_EXTENDED_PROFILE',
'BARE_OS_SHELL_LOOP_CONTROL',
'BARE_OS_SHELL_PIPEFAIL',
'BARE_OS_SHELL_PIPESTATUS',
'BARE_OS_SHELL_READ_BUILTIN',
'BARE_OS_SHELL_READ_MAX_BYTES',
'BARE_OS_SHELL_POSIX_MODE',
'BARE_OS_SHELL_GROUPING',
'BARE_OS_SHELL_DOUBLE_BRACKET',
'BARE_OS_SHELL_ERREXIT',
'BARE_OS_SHELL_NOUNSET',
'BARE_OS_TELEMETRY_NDJSON',
'BARE_OS_TELEMETRY_OTEL',
'BARE_OS_TELEMETRY_OTEL_JSONL',
'BARE_OS_VAR_LOG_DEBUG',
'BARE_OS_PROC_POLL_MS',
'BARE_OS_TIMER_EVERY_MS_MONOTONIC',
'BARE_OS_TRACE_ID',
'BARE_OS_SHELL_PARAM_EXPANSION',
'BARE_OS_EXEC_LINE_BUDGET_MS',
'BARE_OS_TIMER_BUDGET_MS',
'BARE_OS_DELEGATE_MAX_PER_MIN',
'BARE_OS_DELEGATE_GIT_MAX_PER_MIN',
'BARE_OS_DELEGATE_CURL_MAX_PER_MIN',
'BARE_OS_DELEGATE_WGET_MAX_PER_MIN',
'BARE_OS_DELEGATE_SYSTEMCTL_MAX_PER_MIN',
'BARE_OS_DELEGATE_AUDIT_ONLY',
'BARE_OS_BOOT_POLICY',
'BARE_OS_BOOT_POLICY_STRICT',
'BARE_OS_INITD_JOURNAL_MAX_LINES',
'BARE_OS_LAZY_PERSONAL_DRIVE',
'BARE_OS_SYSTEM_REVISION_ID',
'BARE_OS_SYSTEM_REVISION_PENDING',
'BARE_OS_SYSTEM_SLOT',
'BARE_OS_DELEGATE_ALLOW',
'BARE_OS_DNS_ALLOWLIST',
'BARE_OS_KERNEL_HOT_RELOAD',
'BARE_OS_KERNEL_EXT_D_HOT_RELOAD',
'BARE_OS_IPC_NAMESPACE',
'BARE_OS_OFFLINE_LKG_BOOT',
'BARE_OS_LKG_SYSTEM_KEY_HEX',
'BARE_OS_BUILD_ID',
'BARE_OS_BOOT_POLICY_DIGEST_SKETCH',
'BARE_OS_KERNEL_STARTUP_CLASS',
'BARE_OS_BOOT_BUDGET_MS_COLD',
'BARE_OS_BOOT_BUDGET_MS_BARE_STDLIB',
'BARE_OS_BARE_STDLIB_RESOLVE_CONCURRENCY',
'BARE_OS_BOOT_CAPABILITY_CONTRACT_DEBUG',
'BARE_OS_BOOT_EXT_RESOLUTION_TRACE',
'BARE_OS_KERNEL_EXT_GRAPH',
'BARE_OS_KERNEL_EXT_RESOLUTION_JSON_ALWAYS',
'BARE_OS_BOOT_RC_RESOLUTION_TRACE',
'BARE_OS_WARM_REBOOT',
'BARE_OS_WARM_REBOOT_EXTRA_CYCLES',
'BARE_OS_WASM_KERNEL',
'BARE_OS_WASM_KERNEL_SYSCALL',
'BARE_OS_WASM_KERNEL_MONOTONIC_MS',
'BARE_OS_WASM_KERNEL_HOSTNAME_IMPORT',
'BARE_OS_WASM_KERNEL_CTX_API_PEEK',
'BARE_OS_WASM_KERNEL_POSIX_PROFILE_PEEK',
'BARE_OS_POSIX_FD_SIM',
'BARE_OS_POSIX_FD_SIM_MAX_BYTES',
'BARE_OS_POSIX_SOCKET_FD_BRIDGE',
'BARE_OS_POSIX_SOCKET_CONNECT_TIMEOUT_MS',
'BARE_OS_POSIX_SOCKET_SCM_RIGHTS',
'BARE_OS_POSIX_SOCKET_SCM_RIGHTS_MAX_FDS',
'BARE_OS_POSIX_FCNTL_BLOCKING_WAIT',
'BARE_OS_FCNTL_LOCK_WAIT_MS_MAX',
'BARE_OS_VFS_WARM_CACHE_PREFIX_INVALIDATE',
'BARE_OS_HRPC_AUDIT',
'BARE_OS_HRPC_EMIT_UNLISTED',
'BARE_OS_HRPC_ALLOWLIST_JSON',
'BARE_OS_CORESTORE_SNAPSHOT_WORKFLOW_JSON',
'BARE_OS_BLIND_RELAY_TOPOLOGY_JSON',
'BARE_OS_MIRROR_DRIVE_COMPOSITION_HINT_JSON',
'BARE_OS_REPLICATION_PLAN_JSON',
'BARE_OS_REPLICATION_PEER_PRIORITY_JSON',
'BARE_OS_PEAR_DOCTOR_STATE_JSON',
'BARE_OS_PEAR_INSPECT_PROBE',
'BARE_OS_PEAR_DOCTOR_MODULE',
'BARE_OS_HYPERDHT_STATS_JSON',
'BARE_OS_RUNBIN_DEFAULT_TIMEOUT_MS',
'BARE_OS_VFS_SNAPSHOTS',
'BARE_OS_VFS_QUOTA_MODE',
'BARE_OS_VFS_QUOTA_GRACE_MS',
'BARE_OS_VFS_WATCH_CONSISTENCY',
'BARE_OS_KEY_HANDLE_TTL_MS',
'BARE_OS_EVENT_BUS_NDJSON',
'BARE_OS_HOST_STORAGE_JSON',
'BARE_OS_BOOT_POLICY_DENY_EXEC_LINE_BUILTINS',
'BARE_OS_BOOT_POLICY_ALLOWED_CTX_METHODS',
'BARE_OS_BOOT_POLICY_DENY_SEED_RPC_METHODS',
'BARE_OS_PEAR_RUNTIME_VERSION',
'BARE_OS_BARE_RUNTIME_VERSION',
'BARE_OS_CURL_RESOLVE_MAP_JSON',
'BARE_OS_HTTP_PROXY_MAP_JSON',
'BARE_OS_SOCKS_PROXY_MAP_JSON',
'BARE_OS_BARE_CRYPTO_VERSION',
'BARE_OS_BARE_BOOT_VERSION',
'BARE_OS_BARE_LOGGER_VERSION',
'BARE_OS_BARE_TLS_VERSION',
'BARE_OS_BARE_PACK_VERSION',
'BARE_OS_BARE_ADDON_POLICY_VERSION',
'BARE_OS_PEAR_IPC_PACKAGE_VERSION',
'BARE_OS_PEAR_UPDATER_CHANNEL',
'BARE_OS_PEAR_UPDATER_MODULE',
'BARE_OS_PEAR_UPDATER_DELEGATE',
'BARE_OS_PEAR_UPDATER_SNAPSHOT_JSON',
'BARE_OS_PEAR_RUNTIME_CHANNEL',
'BARE_OS_PEAR_RUNTIME_STAGE',
'BARE_OS_PEAR_INSPECTOR_ATTACH_HINT',
'BARE_OS_PEAR_RUNTIME_SNAPSHOT_JSON',
'BARE_OS_CORESTORE_SNAPSHOT_STATE_JSON',
'BARE_OS_CORESTORE_SNAPSHOT_PAUSED',
'BARE_OS_REPLICATION_PAUSED',
'BARE_OS_HAPPY_EYEBALLS_V3_MODE',
'BARE_OS_BIN_WORKER_WASM_MS_MAX',
'BARE_OS_PROBE_ID_BARE_MODULE_CRYPTO_STAGING',
'BARE_OS_PROBE_ID_PEAR_INSPECT_LOGGER_TLS',
'BARE_OS_PROBE_ID_HYPERCORE_PACK_HRPC_LIFECYCLE',
'BARE_OS_HIDE_PROC_HYPERCORE_PACK_HRPC_LIFECYCLE',
'BARE_OS_BARE_RPC_PROBE_CLASS',
'BARE_OS_MTLS_PROXY_MAP_JSON',
'BARE_OS_THREAD_POOL_TELEMETRY_JSON',
'BARE_OS_HAPPY_EYEBALLS_V4_MODE',
'BARE_OS_PROC_RLIMITS_JSON',
'BARE_OS_SUBPROCESS_BRIDGE_UID_GID_MAP_JSON',
'BARE_OS_HDMS_VAULT_ROTATE_COUNT',
'BARE_OS_HOLESAIL_INITD',
'BARE_OS_HOLESAIL_MANAGED',
'BARE_OS_HOLESAIL_SERVER',
'BARE_OS_HOLESAIL_CLIENT',
'BARE_OS_HOLESAIL_KEY',
'BARE_OS_HOLESAIL_SECURE',
'BARE_OS_HOLESAIL_PORT',
'BARE_OS_HOLESAIL_HOST',
'BARE_OS_HOLESAIL_UDP',
'BARE_OS_HOLESAIL_LOG',
'BARE_OS_HOLESAIL_DEBUG',
'BARE_OS_HOLESAIL_STATE',
'BARE_OS_HOLESAIL_KERNEL',
'BARE_OS_HOLESAIL_KERNEL_SERVER',
'BARE_OS_HOLESAIL_KERNEL_CLIENT',
'BARE_OS_HOLESAIL_KERNEL_KEY',
'BARE_OS_HOLESAIL_KERNEL_SECURE',
'BARE_OS_HOLESAIL_KERNEL_PORT',
'BARE_OS_HOLESAIL_KERNEL_HOST',
'BARE_OS_HOLESAIL_KERNEL_UDP',
'BARE_OS_HOLESAIL_KERNEL_LOG',
'BARE_OS_SUBPROCESS_BRIDGE_JOBS_JSON',
'BARE_OS_SUBPROCESS_BRIDGE_META_JSON',
'BARE_OS_HOST_BARE_OS_PROC',
'BARE_OS_HOST_OS_JSON',
'BARE_OS_NET_TRANSPORT_STATS_JSON',
'BARE_OS_UDX_TUNING_JSON',
'BARE_OS_HYPERSWARM_TUNING_JSON',
'BARE_OS_DHT_ADDRESS_CLASS_ALLOWLIST',
'BARE_OS_PEER_DENYLIST_HEX',
'BARE_OS_PEER_REQUIRE_CAPS_JSON',
'BARE_OS_PEER_ADMISSION_AUDIT_NDJSON',
'BARE_OS_PEER_ADMISSION_AUDIT_RATE_MS',
'BARE_OS_DISK_OS_PATH_MANIFEST',
'BARE_OS_DISK_OS_SEARCH_MANIFEST_ONLY',
'BARE_OS_DISK_OS_MANIFEST_CACHE_MS',
'BARE_OS_PATH_CAPABILITY_ENFORCE_READ',
'BARE_OS_PATH_CAPABILITY_PREFIX',
'BARE_OS_SAVEVAULT_PRESNAPSHOT_HINT',
'BARE_OS_VFS_WARM_CACHE_INVALIDATE_ON_APPEND',
'BARE_OS_KERNEL_DEBUG',
'BARE_OS_PEAR_INSPECT',
'BARE_OS_KERNEL_PROFILE_WARM',
'BARE_OS_REPLICATION_SYNC_WINDOWS',
'BARE_OS_HDMS_SUPPORT_CORRELATION_ID',
'BARE_OS_BIN_WORKER_ALLOW',
'BARE_OS_BIN_WORKER_OFFLOAD',
'BARE_OS_BIN_WORKER_CPU_MS_MAX',
'BARE_OS_IPC_AUDIT',
'BARE_OS_DELEGATE_MAX_CONCURRENT',
'BARE_OS_DELEGATE_GIT_MAX_CONCURRENT',
'BARE_OS_DELEGATE_CURL_MAX_CONCURRENT',
'BARE_OS_DELEGATE_WGET_MAX_CONCURRENT',
'BARE_OS_DELEGATE_SYSTEMCTL_MAX_CONCURRENT'
]) {
for (const k of BARE_OS_HOST_ENV_FORWARD_KEYS) {
const v = hostEnv[k]
if (v != null && v !== '') shellEnv[k] = v
}
@@ -11288,33 +10857,7 @@ function bareOsProtomuxTuningFromEnv(env) {
}
async function main() {
const hostArgv = (() => {
if (
typeof globalThis.Bare !== 'undefined' &&
Array.isArray(globalThis.Bare.argv)
) {
const a0 = String(globalThis.Bare.argv[0] || '')
const base = a0.split(/[/\\]/).pop() || ''
return globalThis.Bare.argv.slice(base === 'bare' ? 2 : 1)
}
return globalThis.process?.argv?.slice(2) || []
})()
for (let i = 0; i < hostArgv.length; i++) {
const a = hostArgv[i]
let datadir = null
if (a === '--datadir' || a === '--data-dir') datadir = hostArgv[++i]
else if (a.startsWith('--datadir=')) datadir = a.slice('--datadir='.length)
else if (a.startsWith('--data-dir='))
datadir = a.slice('--data-dir='.length)
if (datadir != null && String(datadir).trim()) {
if (!globalThis.process) globalThis.process = { env: {} }
if (!globalThis.process.env) globalThis.process.env = {}
globalThis.process.env.BARE_OS_HOST_DATA = path.resolve(
String(datadir).trim()
)
break
}
}
applyHostFlagsFromArgv(hostArgv())
await ensureBareFetchGlobals()
const hostEnvMain = globalThis.process?.env
@@ -0,0 +1,287 @@
/**
* Host environment keys copied into the guest shell env at boot.
* Keep this list exhaustive; executeKernel forwards any non-empty value.
*/
export const BARE_OS_HOST_ENV_FORWARD_KEYS = Object.freeze([
'BARE_OS_PIPELINE_MAX_STAGES',
'BARE_OS_PIPELINE_MAX_BYTES',
'BARE_OS_PIPELINE_MAX_LINES',
'BARE_OS_BOOT_PROFILE',
'BARE_OS_ONBOOT',
'BARE_OS_BOOT_STRICT',
'BARE_OS_RC_D_SKIP',
'BARE_OS_BOOT_MINIMAL',
'BARE_OS_BOOT_SKIP',
'BARE_OS_BOOT_TRACE',
'BARE_OS_KERNEL_SELFTEST',
'BARE_OS_AUDIT',
'BARE_OS_AUDIT_JSON',
'BARE_OS_AUDIT_REDACT',
'BARE_OS_IMAGE_DIGEST',
'BARE_OS_EXEC_MAX_DEPTH',
'BARE_OS_IPC_MAX_BYTES',
'BARE_OS_VFS_WATCH',
'BARE_OS_BOOT_ALLOWLIST',
'BARE_OS_SELFTEST_FORMAT',
'BARE_OS_PEAR_CHANNEL',
'BARE_OS_PEAR_RELEASE',
'PEAR_CHANNEL',
'BARE_OS_IPC_RPC_TOKEN',
'BARE_OS_IPC_FANOUT',
'BARE_OS_IPC_JSON_MAX_BYTES',
'BARE_OS_HTTP_ALLOWLIST',
'BARE_OS_HTTP_DENYLIST',
'BARE_OS_IRC',
'BARE_OS_IRC_ALLOWLIST',
'BARE_OS_IRC_DENYLIST',
'BARE_OS_DISCORD',
'DISCORD_TOKEN',
'DISCORD_GUILD_ID',
'DISCORD_ID_WHITELIST',
'DISCORD_USER_INSTALL',
'DISCORD_ENV_FILE',
'BARE_OS_DISCORD_ENV_FILE',
'BARE_OS_TLS_PIN_SHA256',
'BARE_OS_BARE_MODULES',
'BARE_OS_BARE_DRIVE_BUNDLES',
'BARE_OS_BARE_SUBPROCESS_BRIDGE',
'BARE_OS_BARE_SUBPROCESS_TIMEOUT_MS',
'BARE_OS_CTX_BARE_SUBPROCESS_SPAWN',
'BARE_OS_PROC_BLIND_PEER_RELAY_HINTS',
'BARE_OS_PROC_PROTOMUX_EXTENSIONS_REGISTRY',
'BARE_OS_FIND_EXEC_MAX',
'BARE_OS_XARGS_MAX_PROCS',
'BARE_OS_YES_MAX_LINES',
'BARE_OS_SHUF_MAX_LINES',
'BARE_OS_SPLIT_MAX_FILES',
'BARE_OS_SSH_BIND_ALL',
'BARE_OS_SSH_LISTEN_PORT',
'BARE_OS_NPROC',
'BARE_OS_PHYS_PAGES_HINT',
'BARE_OS_BOOT_MANIFEST',
'BARE_OS_BOOT_MANIFEST_SIGN',
'BARE_OS_BOOT_MANIFEST_PUBKEY_HEX',
'BARE_OS_SANDBOX_SCRIPT',
'BARE_OS_TUI',
'BARE_OS_TUI_NO_ALTSCREEN',
'BARE_OS_TUI_DEBUG',
'BARE_OS_VFS_UNION_PREFIXES',
'BARE_OS_URANDOM_CRYPTO',
'BARE_OS_INITD_MAX_PARALLEL',
'BARE_OS_VFS_BIN_CACHE',
'BARE_OS_VFS_BIN_CACHE_BLAKE2B',
'BARE_OS_VFS_ENFORCE_ACL',
'BARE_OS_VFS_BIN_INDEX_BUILD',
'BARE_OS_VFS_SYSTEM_IMAGE_WRITE',
'BARE_OS_VFS_LIB_BARE_CACHE',
'BARE_OS_BOOT_PERF_DETAIL',
'BARE_OS_BIN_HYPERBEE_INDEX',
'BARE_OS_SANDBOX_WORKER',
'BARE_OS_BLIND_BOOTSTRAP_URL',
'BARE_OS_BLIND_BOOTSTRAP_JSON',
'BARE_OS_MIRROR_READ_KEY',
'BARE_OS_PEER_FIREWALL_E2E_JSON',
'BARE_OS_PEAR_SECURE_ENCLAVE_JSON',
'BARE_OS_ACCOUNT_KEY_ROTATION_STATE_JSON',
'BARE_OS_SEED_RPC_HANDSHAKE',
'BARE_OS_SEED_CAP_STRICT',
'BARE_OS_SEED_CAP_FAIL',
'BARE_OS_VFS_UNION_WRITE_DENY',
'BARE_OS_VFS_SYSTEM_RO_ALIAS',
'BARE_OS_VFS_HYPERBLOBS_DEDUP',
'BARE_OS_IPC_CHANNEL_MAX_BYTES',
'BARE_OS_IPC_MAX_CHANNELS',
'BARE_OS_POSIX_MQ_MAX_MSGS',
'BARE_OS_POSIX_MQ_MSG_BYTES',
'BARE_OS_PIPELINE_ABS_MAX_BYTES',
'BARE_OS_PIPELINE_ABS_MAX_LINES',
'BARE_OS_VFS_MAX_OPEN',
'BARE_OS_SHELL_STREAMING',
'BARE_OS_SHELL_STREAMING_MULT',
'BARE_OS_STREAMING_MULTIPLIER',
'BARE_OS_SHELL_CMDSUBST',
'BARE_OS_SHELL_CMDSUBST_MAX_BYTES',
'BARE_OS_SHELL_UNTIL',
'BARE_OS_SH_EXTENDED_PROFILE',
'BARE_OS_SHELL_LOOP_CONTROL',
'BARE_OS_SHELL_PIPEFAIL',
'BARE_OS_SHELL_PIPESTATUS',
'BARE_OS_SHELL_READ_BUILTIN',
'BARE_OS_SHELL_READ_MAX_BYTES',
'BARE_OS_SHELL_POSIX_MODE',
'BARE_OS_SHELL_GROUPING',
'BARE_OS_SHELL_DOUBLE_BRACKET',
'BARE_OS_SHELL_ERREXIT',
'BARE_OS_SHELL_NOUNSET',
'BARE_OS_TELEMETRY_NDJSON',
'BARE_OS_TELEMETRY_OTEL',
'BARE_OS_TELEMETRY_OTEL_JSONL',
'BARE_OS_VAR_LOG_DEBUG',
'BARE_OS_PROC_POLL_MS',
'BARE_OS_TIMER_EVERY_MS_MONOTONIC',
'BARE_OS_TRACE_ID',
'BARE_OS_SHELL_PARAM_EXPANSION',
'BARE_OS_EXEC_LINE_BUDGET_MS',
'BARE_OS_TIMER_BUDGET_MS',
'BARE_OS_DELEGATE_MAX_PER_MIN',
'BARE_OS_DELEGATE_GIT_MAX_PER_MIN',
'BARE_OS_DELEGATE_CURL_MAX_PER_MIN',
'BARE_OS_DELEGATE_WGET_MAX_PER_MIN',
'BARE_OS_DELEGATE_SYSTEMCTL_MAX_PER_MIN',
'BARE_OS_DELEGATE_AUDIT_ONLY',
'BARE_OS_BOOT_POLICY',
'BARE_OS_BOOT_POLICY_STRICT',
'BARE_OS_INITD_JOURNAL_MAX_LINES',
'BARE_OS_LAZY_PERSONAL_DRIVE',
'BARE_OS_SYSTEM_REVISION_ID',
'BARE_OS_SYSTEM_REVISION_PENDING',
'BARE_OS_SYSTEM_SLOT',
'BARE_OS_DELEGATE_ALLOW',
'BARE_OS_DNS_ALLOWLIST',
'BARE_OS_KERNEL_HOT_RELOAD',
'BARE_OS_KERNEL_EXT_D_HOT_RELOAD',
'BARE_OS_IPC_NAMESPACE',
'BARE_OS_OFFLINE_LKG_BOOT',
'BARE_OS_LKG_SYSTEM_KEY_HEX',
'BARE_OS_BUILD_ID',
'BARE_OS_BOOT_POLICY_DIGEST_SKETCH',
'BARE_OS_KERNEL_STARTUP_CLASS',
'BARE_OS_BOOT_BUDGET_MS_COLD',
'BARE_OS_BOOT_BUDGET_MS_BARE_STDLIB',
'BARE_OS_BARE_STDLIB_RESOLVE_CONCURRENCY',
'BARE_OS_BOOT_CAPABILITY_CONTRACT_DEBUG',
'BARE_OS_BOOT_EXT_RESOLUTION_TRACE',
'BARE_OS_KERNEL_EXT_GRAPH',
'BARE_OS_KERNEL_EXT_RESOLUTION_JSON_ALWAYS',
'BARE_OS_BOOT_RC_RESOLUTION_TRACE',
'BARE_OS_WARM_REBOOT',
'BARE_OS_WARM_REBOOT_EXTRA_CYCLES',
'BARE_OS_WASM_KERNEL',
'BARE_OS_WASM_KERNEL_SYSCALL',
'BARE_OS_WASM_KERNEL_MONOTONIC_MS',
'BARE_OS_WASM_KERNEL_HOSTNAME_IMPORT',
'BARE_OS_WASM_KERNEL_CTX_API_PEEK',
'BARE_OS_WASM_KERNEL_POSIX_PROFILE_PEEK',
'BARE_OS_POSIX_FD_SIM',
'BARE_OS_POSIX_FD_SIM_MAX_BYTES',
'BARE_OS_POSIX_SOCKET_FD_BRIDGE',
'BARE_OS_POSIX_SOCKET_CONNECT_TIMEOUT_MS',
'BARE_OS_POSIX_SOCKET_SCM_RIGHTS',
'BARE_OS_POSIX_SOCKET_SCM_RIGHTS_MAX_FDS',
'BARE_OS_POSIX_FCNTL_BLOCKING_WAIT',
'BARE_OS_FCNTL_LOCK_WAIT_MS_MAX',
'BARE_OS_VFS_WARM_CACHE_PREFIX_INVALIDATE',
'BARE_OS_HRPC_AUDIT',
'BARE_OS_HRPC_EMIT_UNLISTED',
'BARE_OS_HRPC_ALLOWLIST_JSON',
'BARE_OS_CORESTORE_SNAPSHOT_WORKFLOW_JSON',
'BARE_OS_BLIND_RELAY_TOPOLOGY_JSON',
'BARE_OS_MIRROR_DRIVE_COMPOSITION_HINT_JSON',
'BARE_OS_REPLICATION_PLAN_JSON',
'BARE_OS_REPLICATION_PEER_PRIORITY_JSON',
'BARE_OS_PEAR_DOCTOR_STATE_JSON',
'BARE_OS_PEAR_INSPECT_PROBE',
'BARE_OS_PEAR_DOCTOR_MODULE',
'BARE_OS_HYPERDHT_STATS_JSON',
'BARE_OS_RUNBIN_DEFAULT_TIMEOUT_MS',
'BARE_OS_VFS_SNAPSHOTS',
'BARE_OS_VFS_QUOTA_MODE',
'BARE_OS_VFS_QUOTA_GRACE_MS',
'BARE_OS_VFS_WATCH_CONSISTENCY',
'BARE_OS_KEY_HANDLE_TTL_MS',
'BARE_OS_EVENT_BUS_NDJSON',
'BARE_OS_HOST_STORAGE_JSON',
'BARE_OS_BOOT_POLICY_DENY_EXEC_LINE_BUILTINS',
'BARE_OS_BOOT_POLICY_ALLOWED_CTX_METHODS',
'BARE_OS_BOOT_POLICY_DENY_SEED_RPC_METHODS',
'BARE_OS_PEAR_RUNTIME_VERSION',
'BARE_OS_BARE_RUNTIME_VERSION',
'BARE_OS_CURL_RESOLVE_MAP_JSON',
'BARE_OS_HTTP_PROXY_MAP_JSON',
'BARE_OS_SOCKS_PROXY_MAP_JSON',
'BARE_OS_BARE_CRYPTO_VERSION',
'BARE_OS_BARE_BOOT_VERSION',
'BARE_OS_BARE_LOGGER_VERSION',
'BARE_OS_BARE_TLS_VERSION',
'BARE_OS_BARE_PACK_VERSION',
'BARE_OS_BARE_ADDON_POLICY_VERSION',
'BARE_OS_PEAR_IPC_PACKAGE_VERSION',
'BARE_OS_PEAR_UPDATER_CHANNEL',
'BARE_OS_PEAR_UPDATER_MODULE',
'BARE_OS_PEAR_UPDATER_DELEGATE',
'BARE_OS_PEAR_UPDATER_SNAPSHOT_JSON',
'BARE_OS_PEAR_RUNTIME_CHANNEL',
'BARE_OS_PEAR_RUNTIME_STAGE',
'BARE_OS_PEAR_INSPECTOR_ATTACH_HINT',
'BARE_OS_PEAR_RUNTIME_SNAPSHOT_JSON',
'BARE_OS_CORESTORE_SNAPSHOT_STATE_JSON',
'BARE_OS_CORESTORE_SNAPSHOT_PAUSED',
'BARE_OS_REPLICATION_PAUSED',
'BARE_OS_HAPPY_EYEBALLS_V3_MODE',
'BARE_OS_BIN_WORKER_WASM_MS_MAX',
'BARE_OS_PROBE_ID_BARE_MODULE_CRYPTO_STAGING',
'BARE_OS_PROBE_ID_PEAR_INSPECT_LOGGER_TLS',
'BARE_OS_PROBE_ID_HYPERCORE_PACK_HRPC_LIFECYCLE',
'BARE_OS_HIDE_PROC_HYPERCORE_PACK_HRPC_LIFECYCLE',
'BARE_OS_BARE_RPC_PROBE_CLASS',
'BARE_OS_MTLS_PROXY_MAP_JSON',
'BARE_OS_THREAD_POOL_TELEMETRY_JSON',
'BARE_OS_HAPPY_EYEBALLS_V4_MODE',
'BARE_OS_PROC_RLIMITS_JSON',
'BARE_OS_SUBPROCESS_BRIDGE_UID_GID_MAP_JSON',
'BARE_OS_HDMS_VAULT_ROTATE_COUNT',
'BARE_OS_HOLESAIL_INITD',
'BARE_OS_HOLESAIL_MANAGED',
'BARE_OS_HOLESAIL_SERVER',
'BARE_OS_HOLESAIL_CLIENT',
'BARE_OS_HOLESAIL_KEY',
'BARE_OS_HOLESAIL_SECURE',
'BARE_OS_HOLESAIL_PORT',
'BARE_OS_HOLESAIL_HOST',
'BARE_OS_HOLESAIL_UDP',
'BARE_OS_HOLESAIL_LOG',
'BARE_OS_HOLESAIL_DEBUG',
'BARE_OS_HOLESAIL_STATE',
'BARE_OS_HOLESAIL_KERNEL',
'BARE_OS_HOLESAIL_KERNEL_SERVER',
'BARE_OS_HOLESAIL_KERNEL_CLIENT',
'BARE_OS_HOLESAIL_KERNEL_KEY',
'BARE_OS_HOLESAIL_KERNEL_SECURE',
'BARE_OS_HOLESAIL_KERNEL_PORT',
'BARE_OS_HOLESAIL_KERNEL_HOST',
'BARE_OS_HOLESAIL_KERNEL_UDP',
'BARE_OS_HOLESAIL_KERNEL_LOG',
'BARE_OS_SUBPROCESS_BRIDGE_JOBS_JSON',
'BARE_OS_SUBPROCESS_BRIDGE_META_JSON',
'BARE_OS_HOST_BARE_OS_PROC',
'BARE_OS_HOST_OS_JSON',
'BARE_OS_NET_TRANSPORT_STATS_JSON',
'BARE_OS_UDX_TUNING_JSON',
'BARE_OS_HYPERSWARM_TUNING_JSON',
'BARE_OS_DHT_ADDRESS_CLASS_ALLOWLIST',
'BARE_OS_PEER_DENYLIST_HEX',
'BARE_OS_PEER_REQUIRE_CAPS_JSON',
'BARE_OS_PEER_ADMISSION_AUDIT_NDJSON',
'BARE_OS_PEER_ADMISSION_AUDIT_RATE_MS',
'BARE_OS_DISK_OS_PATH_MANIFEST',
'BARE_OS_DISK_OS_SEARCH_MANIFEST_ONLY',
'BARE_OS_DISK_OS_MANIFEST_CACHE_MS',
'BARE_OS_PATH_CAPABILITY_ENFORCE_READ',
'BARE_OS_PATH_CAPABILITY_PREFIX',
'BARE_OS_SAVEVAULT_PRESNAPSHOT_HINT',
'BARE_OS_VFS_WARM_CACHE_INVALIDATE_ON_APPEND',
'BARE_OS_KERNEL_DEBUG',
'BARE_OS_PEAR_INSPECT',
'BARE_OS_KERNEL_PROFILE_WARM',
'BARE_OS_REPLICATION_SYNC_WINDOWS',
'BARE_OS_HDMS_SUPPORT_CORRELATION_ID',
'BARE_OS_BIN_WORKER_ALLOW',
'BARE_OS_BIN_WORKER_OFFLOAD',
'BARE_OS_BIN_WORKER_CPU_MS_MAX',
'BARE_OS_IPC_AUDIT',
'BARE_OS_DELEGATE_MAX_CONCURRENT',
'BARE_OS_DELEGATE_GIT_MAX_CONCURRENT',
'BARE_OS_DELEGATE_CURL_MAX_CONCURRENT',
'BARE_OS_DELEGATE_WGET_MAX_CONCURRENT',
'BARE_OS_DELEGATE_SYSTEMCTL_MAX_CONCURRENT'
])
@@ -1,49 +0,0 @@
/**
* Stable errno-style codes for kernel/VFS/shell surfaces (POSIX-inspired naming).
* Use with `bareOsErrnoName(code)` for diagnostics; map to exit status in utilities separately.
* @module bare-os-kernel-errno
*/
export const BARE_OS_ERRNO = Object.freeze({
EPERM: 1,
ENOENT: 2,
EIO: 5,
EBADF: 9,
EAGAIN: 11,
ENOMEM: 12,
EACCES: 13,
EEXIST: 17,
ENOTDIR: 20,
EISDIR: 21,
EINVAL: 22,
ENOSPC: 28,
EPIPE: 32,
ENOTSUP: 95,
ETIMEDOUT: 110
})
const _NAME_BY_NUM = Object.freeze(
Object.fromEntries(
Object.entries(BARE_OS_ERRNO).map(([k, v]) => [String(v), k])
)
)
/**
* @param {number} code
* @returns {string}
*/
export function bareOsErrnoName(code) {
const n = Number(code)
return _NAME_BY_NUM[String(n)] || `EUNKNOWN_${n}`
}
/**
* @param {string} name
* @returns {number | undefined}
*/
export function bareOsErrnoFromName(name) {
const k = String(name || '').toUpperCase()
return /** @type {number | undefined} */ (
BARE_OS_ERRNO[/** @type {keyof typeof BARE_OS_ERRNO} */ (k)]
)
}
@@ -0,0 +1,170 @@
/**
* Booter session helpers: guest env prefix maps and TTY readline setup.
*/
import {
createBareReadlineQuestion,
createStreamLineReader,
looksLikeInteractiveStdin
} from './cli-readline.js'
import { resolveStdio } from './resolve-stdio.js'
import { bareOsHostBooterWarn } from './bare-os-host-booter-log.js'
/**
* @param {Record<string, string>} env
* @returns {string[]}
*/
export function parseUnionReadPrefixes(env) {
const raw = env && env.BARE_OS_VFS_UNION_PREFIXES
if (raw == null || !String(raw).trim()) return []
return String(raw)
.split(/[,:]+/)
.map((s) => s.trim())
.filter((s) => s.startsWith('/'))
}
/**
* @param {Record<string, string>} env
* @returns {string[]}
*/
export function parseUnionWriteDenyPrefixes(env) {
const raw = env && env.BARE_OS_VFS_UNION_WRITE_DENY
if (raw == null || !String(raw).trim()) return []
return String(raw)
.split(/[,:]+/)
.map((s) => s.trim())
.filter((s) => s.startsWith('/'))
}
/**
* @param {Record<string, string>} env
* @returns {Map<string, number> | null}
*/
export function parseIpcChannelMaxBytesMap(env) {
const raw = env && env.BARE_OS_IPC_CHANNEL_MAX_BYTES
if (raw == null || !String(raw).trim()) return null
try {
const o = JSON.parse(String(raw))
if (!o || typeof o !== 'object') return null
const m = new Map()
for (const [k, v] of Object.entries(o)) {
const n = Number(v)
if (
typeof k === 'string' &&
/^[a-zA-Z0-9._-]+$/.test(k) &&
Number.isFinite(n) &&
n > 0
) {
m.set(k, Math.min(Math.floor(n), 16 * 1024 * 1024))
}
}
return m.size ? m : null
} catch {
return null
}
}
/**
* @returns {Promise<{
* readLine: (p: string) => Promise<string | null>,
* interactiveAvailable: boolean,
* skipInteractive: boolean,
* stdout: import('stream').Writable | null,
* stdin: import('stream').Readable | null
* }>}
*/
export async function createReadLine() {
const { stdin, stdout } = await resolveStdio()
const skipInteractive = globalThis.process?.env?.BARE_OS_SKIP_REPL === '1'
if (skipInteractive) {
return {
readLine: async () => null,
interactiveAvailable: false,
skipInteractive: true,
stdout,
stdin
}
}
if (!stdin || !stdout) {
bareOsHostBooterWarn(
'stdio_missing',
'No stdin/stdout (neither process nor bare-stdio). Cannot run interactive shell.'
)
return {
readLine: async () => null,
interactiveAvailable: false,
skipInteractive: false,
stdout,
stdin
}
}
const ttyRawCapable =
Boolean(stdin.isTTY) &&
typeof stdin.setRawMode === 'function' &&
typeof stdout.write === 'function'
/** Prefer fish-style raw editor on TTY — bare-readline / stream reader only (no Node readline). */
if (ttyRawCapable) {
/** Lazy: avoid bare-readline attaching to stdin before createFishReadLine runs. */
let ttyFallback = undefined
const lazyRawReadLine = async (prompt) => {
if (ttyFallback === undefined) {
try {
ttyFallback = await createBareReadlineQuestion(stdin, stdout)
} catch {
ttyFallback =
looksLikeInteractiveStdin(stdin) &&
typeof stdout.write === 'function'
? createStreamLineReader(stdin, stdout)
: false
}
}
if (ttyFallback === false) return null
return ttyFallback(prompt)
}
return {
readLine: lazyRawReadLine,
interactiveAvailable: true,
skipInteractive: false,
stdout,
stdin
}
}
try {
const readLine = await createBareReadlineQuestion(stdin, stdout)
return {
readLine,
interactiveAvailable: true,
skipInteractive: false,
stdout,
stdin
}
} catch {
/* bare-readline failed to load */
}
if (looksLikeInteractiveStdin(stdin) && typeof stdout.write === 'function') {
return {
readLine: createStreamLineReader(stdin, stdout),
interactiveAvailable: true,
skipInteractive: false,
stdout,
stdin
}
}
bareOsHostBooterWarn(
'line_input_unavailable',
'No line input. Set BARE_OS_SKIP_REPL=1 to exit after boot.'
)
return {
readLine: async () => null,
interactiveAvailable: false,
skipInteractive: false,
stdout,
stdin
}
}
+5 -13
View File
@@ -1,15 +1,7 @@
/**
* Corestore 7.11+ constructor extras used by the booter host store.
* `treeCache` forwards to Hypercore default storage (proof/tree node cache).
* Re-export shared Corestore ctor extras (single source: repo `lib/`).
*/
export const BARE_OS_CORESTORE_TREE_CACHE = { maxSize: 8192 }
/**
* @param {Record<string, unknown>} [extra]
*/
export function bareOsCorestoreConstructOpts(extra) {
return {
treeCache: BARE_OS_CORESTORE_TREE_CACHE,
...(extra && typeof extra === 'object' ? extra : {})
}
}
export {
BARE_OS_CORESTORE_TREE_CACHE,
bareOsCorestoreConstructOpts
} from '../../../lib/bare-os-corestore-opts.mjs'
@@ -0,0 +1,100 @@
/**
* POSIX-ish $(( )) arithmetic used by the guest shell.
*/
import { shellCheckUnboundParam } from './shell-nounset.js'
/**
* Expand `$VAR`, `${VAR}`, and `$N` inside arithmetic before identifier substitution.
* @param {string} inner
* @param {Record<string, string>} env
*/
export function bareOsArithmeticExpandDollarForms(inner, env) {
const s = String(inner || '')
if (s.length > 4096) throw new Error('shell: arithmetic: expression too long')
/** @type {string[]} */
const parts = []
let i = 0
let replacements = 0
const maxRep = 256
while (i < s.length) {
if (s[i] !== '$') {
parts.push(s[i++])
continue
}
if (++replacements > maxRep)
throw new Error('shell: arithmetic: expansion limit exceeded')
if (i + 1 >= s.length) {
parts.push('$')
i++
continue
}
if (s[i + 1] === '{') {
const end = s.indexOf('}', i + 2)
if (end === -1) {
parts.push('$')
i++
continue
}
const name = s.slice(i + 2, end).trim()
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name))
throw new Error('shell: arithmetic: invalid ${} in expression')
shellCheckUnboundParam(name, env)
const raw = env[name]
const n = Number.parseInt(String(raw ?? '0').trim(), 10)
parts.push(String(Number.isFinite(n) ? n : 0))
i = end + 1
continue
}
const c1 = s[i + 1]
if (/[0-9]/.test(c1)) {
shellCheckUnboundParam(c1, env)
const raw = env[c1]
const n = Number.parseInt(String(raw ?? '0').trim(), 10)
parts.push(String(Number.isFinite(n) ? n : 0))
i += 2
continue
}
if (!/[A-Za-z_]/.test(c1)) {
parts.push('$')
i++
continue
}
let k = i + 2
while (k < s.length && /[A-Za-z0-9_]/.test(s[k])) k++
const name = s.slice(i + 1, k)
shellCheckUnboundParam(name, env)
const raw = env[name]
const n = Number.parseInt(String(raw ?? '0').trim(), 10)
parts.push(String(Number.isFinite(n) ? n : 0))
i = k
}
return parts.join('')
}
/**
* @param {string} expr
* @param {Record<string, string>} env
*/
export function bareOsEvalArithmeticExpr(expr, env) {
const pre = bareOsArithmeticExpandDollarForms(String(expr || ''), env)
const src = pre.trim()
if (!src) return '0'
if (!/^[A-Za-z0-9_+\-*/%()\s]+$/.test(src)) {
throw new Error('shell: arithmetic: invalid token')
}
const replaced = src.replace(/\b[A-Za-z_][A-Za-z0-9_]*\b/g, (name) => {
shellCheckUnboundParam(name, env)
const raw = env[name]
const n = Number.parseInt(String(raw ?? '0').trim(), 10)
return String(Number.isFinite(n) ? n : 0)
})
let out = 0
try {
out = Function('"use strict"; return (' + replaced + ');')()
} catch {
throw new Error('shell: arithmetic: invalid expression')
}
const num = Number(out)
if (!Number.isFinite(num)) throw new Error('shell: arithmetic: non-finite result')
return String(Math.trunc(num))
}
@@ -0,0 +1,28 @@
/** @see execShellLine — nounset violations surface as exit status 1 */
export const BARE_OS_SHELL_NOUNSET_ERROR = 'BARE_OS_SHELL_NOUNSET'
/**
* @param {Record<string, string> | null | undefined} env
*/
export function shellNounsetEnvOn(env) {
return (
env &&
(env.BARE_OS_SHELL_NOUNSET === '1' || env.BARE_OS_SHELL_NOUNSET === 'true')
)
}
/**
* @param {string} name
* @param {Record<string, string>} env
*/
export function shellCheckUnboundParam(name, env) {
if (!shellNounsetEnvOn(env) || !name) return
const n = name.trim()
if (n === '?' || /^\d+$/.test(n)) return
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(n)) return
if (!Object.prototype.hasOwnProperty.call(env, n)) {
const e = new Error(`unbound variable: ${n}`)
e.code = BARE_OS_SHELL_NOUNSET_ERROR
throw e
}
}
+6 -124
View File
@@ -15,131 +15,13 @@ import {
} from './bare-os-theme-presets.js'
import { pathnameExpandShellWord, bareOsFnmatch } from './shell-glob.js'
import { bareOsKernelMetricSet } from './bare-os-kernel-metrics.js'
import {
BARE_OS_SHELL_NOUNSET_ERROR,
shellCheckUnboundParam
} from './shell-nounset.js'
import { bareOsEvalArithmeticExpr } from './shell-arithmetic.js'
/** @see execShellLine — nounset violations surface as exit status 1 */
export const BARE_OS_SHELL_NOUNSET_ERROR = 'BARE_OS_SHELL_NOUNSET'
/**
* @param {Record<string, string> | null | undefined} env
*/
function shellNounsetEnvOn(env) {
return (
env &&
(env.BARE_OS_SHELL_NOUNSET === '1' || env.BARE_OS_SHELL_NOUNSET === 'true')
)
}
/**
* @param {string} name
* @param {Record<string, string>} env
*/
function shellCheckUnboundParam(name, env) {
if (!shellNounsetEnvOn(env) || !name) return
const n = name.trim()
if (n === '?' || /^\d+$/.test(n)) return
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(n)) return
if (!Object.prototype.hasOwnProperty.call(env, n)) {
const e = new Error(`unbound variable: ${n}`)
e.code = BARE_OS_SHELL_NOUNSET_ERROR
throw e
}
}
/**
* Expand `$VAR`, `${VAR}`, and `$N` inside arithmetic before identifier substitution.
* @param {string} inner
* @param {Record<string, string>} env
*/
function bareOsArithmeticExpandDollarForms(inner, env) {
const s = String(inner || '')
if (s.length > 4096) throw new Error('shell: arithmetic: expression too long')
/** @type {string[]} */
const parts = []
let i = 0
let replacements = 0
const maxRep = 256
while (i < s.length) {
if (s[i] !== '$') {
parts.push(s[i++])
continue
}
if (++replacements > maxRep)
throw new Error('shell: arithmetic: expansion limit exceeded')
if (i + 1 >= s.length) {
parts.push('$')
i++
continue
}
if (s[i + 1] === '{') {
const end = s.indexOf('}', i + 2)
if (end === -1) {
parts.push('$')
i++
continue
}
const name = s.slice(i + 2, end).trim()
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name))
throw new Error('shell: arithmetic: invalid ${} in expression')
shellCheckUnboundParam(name, env)
const raw = env[name]
const n = Number.parseInt(String(raw ?? '0').trim(), 10)
parts.push(String(Number.isFinite(n) ? n : 0))
i = end + 1
continue
}
const c1 = s[i + 1]
if (/[0-9]/.test(c1)) {
shellCheckUnboundParam(c1, env)
const raw = env[c1]
const n = Number.parseInt(String(raw ?? '0').trim(), 10)
parts.push(String(Number.isFinite(n) ? n : 0))
i += 2
continue
}
if (!/[A-Za-z_]/.test(c1)) {
parts.push('$')
i++
continue
}
let k = i + 2
while (k < s.length && /[A-Za-z0-9_]/.test(s[k])) k++
const name = s.slice(i + 1, k)
shellCheckUnboundParam(name, env)
const raw = env[name]
const n = Number.parseInt(String(raw ?? '0').trim(), 10)
parts.push(String(Number.isFinite(n) ? n : 0))
i = k
}
return parts.join('')
}
/**
* @param {string} expr
* @param {Record<string, string>} env
*/
function bareOsEvalArithmeticExpr(expr, env) {
const pre = bareOsArithmeticExpandDollarForms(String(expr || ''), env)
const src = pre.trim()
if (!src) return '0'
if (!/^[A-Za-z0-9_+\-*/%()\s]+$/.test(src)) {
throw new Error('shell: arithmetic: invalid token')
}
const replaced = src.replace(/\b[A-Za-z_][A-Za-z0-9_]*\b/g, (name) => {
shellCheckUnboundParam(name, env)
const raw = env[name]
const n = Number.parseInt(String(raw ?? '0').trim(), 10)
return String(Number.isFinite(n) ? n : 0)
})
let out = 0
try {
out = Function('"use strict"; return (' + replaced + ');')()
} catch {
throw new Error('shell: arithmetic: invalid expression')
}
const num = Number(out)
if (!Number.isFinite(num)) throw new Error('shell: arithmetic: non-finite result')
return String(Math.trunc(num))
}
export { BARE_OS_SHELL_NOUNSET_ERROR }
const SHELL_BUILTINS = new Set([
'alias',
+161
View File
@@ -0,0 +1,161 @@
/**
* VFS path-class policy and Hyperdrive batch/diff helpers.
*/
/**
* Policy-oriented path class for VFS routing (system vs personal vs pseudo vs mount vs volatile).
* Used by operator tooling and future policy engines; routing itself stays in `createVfs`.
* @param {string} p
* @returns {'system' | 'personal' | 'pseudo' | 'mount' | 'volatile' | 'snapshot' | 'unknown'}
*/
export function classifyBareOsVfsPathClass(p) {
const path = String(p || '').replace(/\\/g, '/')
if (!path.startsWith('/')) return 'unknown'
if (path === '/snapshots' || path.startsWith('/snapshots/')) return 'snapshot'
if (path.startsWith('/proc/') || path === '/proc') return 'pseudo'
if (path.startsWith('/sys/') || path === '/sys') return 'pseudo'
if (path.startsWith('/dev/') || path === '/dev') return 'pseudo'
if (path.startsWith('/run/') || path === '/run') return 'volatile'
if (
path.startsWith('/mnt/') ||
path.startsWith('/media/') ||
path.startsWith('/mount/')
)
return 'mount'
if (path.startsWith('/home/')) return 'personal'
if (path === '/root' || path.startsWith('/root/')) return 'personal'
if (path.startsWith('/tmp/') || path === '/tmp') return 'volatile'
if (
path.startsWith('/boot/') ||
path.startsWith('/bin/') ||
path.startsWith('/lib/') ||
path.startsWith('/etc/') ||
path === '/etc' ||
path.startsWith('/usr/') ||
path.startsWith('/var/')
)
return 'system'
return 'system'
}
/**
* Declarative policy evaluation over {@link classifyBareOsVfsPathClass} (allow/deny/audit rule stack).
* Later rules override earlier allow/deny; **`audit`** matches are recorded but do not change verdict.
* @param {string} p
* @param {{ id?: string, effect: 'allow' | 'deny' | 'audit', pathClass?: string, prefix?: string }[]} [rules]
* @returns {{ path: string, pathClass: string, matched: { id?: string, effect: 'allow' | 'deny' | 'audit' }[], verdict: 'neutral' | 'allow' | 'deny', auditHits: number, metrics: { rulesEvaluated: number, matchCount: number } }}
*/
export function evaluateBareOsVfsPathPolicy(p, rules = []) {
const path = String(p || '').replace(/\\/g, '/')
const pathClass = classifyBareOsVfsPathClass(path)
/** @type {{ id?: string, effect: 'allow' | 'deny' | 'audit' }[]} */
const matched = []
let verdict = 'neutral'
let auditHits = 0
let rulesEvaluated = 0
for (const r of rules) {
rulesEvaluated++
if (
!r ||
(r.effect !== 'allow' && r.effect !== 'deny' && r.effect !== 'audit')
)
continue
if (r.pathClass && r.pathClass !== pathClass) continue
if (r.prefix && !path.startsWith(String(r.prefix))) continue
matched.push({ id: r.id, effect: r.effect })
if (r.effect === 'audit') {
auditHits++
continue
}
verdict = r.effect
}
return {
path,
pathClass,
matched,
verdict,
auditHits,
metrics: { rulesEvaluated, matchCount: matched.length }
}
}
/**
* Parse optional **`BARE_OS_VFS_POLICY_RULES_JSON`** env: `{ "rules": [ ... ] }`.
* @param {Record<string, unknown> | null | undefined} env
*/
export function parseBareOsVfsPolicyRulesFromEnv(env) {
const raw = env && env.BARE_OS_VFS_POLICY_RULES_JSON
if (raw == null || raw === '') return []
try {
const j = JSON.parse(String(raw))
if (j && typeof j === 'object' && Array.isArray(j.rules)) return j.rules
} catch {
/* ignore */
}
return []
}
/**
* Batch put helper: uses Hyperdrive `batch()` when present, else sequential `put`.
* @param {{ put?: Function, batch?: () => { put: Function, flush?: () => Promise<void> } }} drive
* @param {{ path: string, buf: Uint8Array | ArrayBuffer, opts?: Record<string, unknown> }[]} puts
*/
export async function bareOsVfsBatchPut(drive, puts) {
if (!drive || typeof drive.put !== 'function') {
throw new Error('bareOsVfsBatchPut: drive.put required')
}
if (!Array.isArray(puts) || !puts.length) return
if (typeof drive.batch === 'function') {
const b = drive.batch()
for (const row of puts) {
const p = String(row.path || '').trim()
if (!p) continue
await b.put(p, row.buf, row.opts)
}
if (typeof b.flush === 'function') await b.flush()
return
}
for (const row of puts) {
const p = String(row.path || '').trim()
if (!p) continue
await drive.put(p, row.buf, row.opts)
}
}
/**
* Collect diff entries when the drive exposes `diff` (signature varies by Hyperdrive version).
* @param {{ diff?: (...args: unknown[]) => AsyncIterable<unknown> | Iterable<unknown> }} drive
* @param {unknown} a
* @param {unknown} b
* @param {{ maxEntries?: number, diffOpts?: Record<string, unknown> }} [opts]
*/
export async function bareOsHyperdriveDiffCollect(drive, a, b, opts = {}) {
if (!drive || typeof drive.diff !== 'function') {
return { ok: false, error: 'diff-unavailable' }
}
const max = opts.maxEntries ?? 5000
/** @type {unknown[]} */
const entries = []
try {
const raw = drive.diff(a, b, opts.diffOpts)
if (raw && Symbol.asyncIterator in raw) {
for await (const ent of /** @type {AsyncIterable<unknown>} */ (raw)) {
entries.push(ent)
if (entries.length >= max) break
}
} else if (raw && Symbol.iterator in raw) {
for (const ent of /** @type {Iterable<unknown>} */ (raw)) {
entries.push(ent)
if (entries.length >= max) break
}
} else {
return { ok: false, error: 'diff-not-iterable' }
}
return {
ok: true,
entries,
truncated: entries.length >= max
}
} catch (e) {
return { ok: false, error: (e && e.message) || String(e) }
}
}
@@ -0,0 +1,135 @@
/**
* Capability-word /proc filename → id maps (words 611).
*/
/** Capability word 6 `/proc` pseudo files → {@link ./bare-os-proc-replication-operator-surface.js} ids. */
export const BARE_OS_PROC_FILE_TO_ID_REPLICATION_OPERATOR_SURFACE = Object.freeze({
bare_os_udx_extended: 'udx_extended',
bare_os_dht_status: 'dht_status',
bare_os_replication_backpressure: 'replication_backpressure',
bare_os_ipc_backpressure: 'ipc_backpressure',
bare_os_delegate_red: 'delegate_red',
bare_os_build_attestation_pointer: 'build_attestation_pointer',
bare_os_pear_ipc_health: 'pear_ipc_health',
bare_os_hypercore_lengths: 'hypercore_lengths',
bare_os_slo_hints: 'slo_hints',
bare_os_locale: 'locale',
bare_os_worker_budget: 'worker_budget',
bare_os_sandbox_profile: 'sandbox_profile',
bare_os_dns_map_active: 'dns_map_active',
bare_os_git_delegate_stats: 'git_delegate_stats',
bare_os_replication_operator_panel: 'replication_operator_panel'
})
/** Capability word 7 `/proc` pseudo files → {@link ./bare-os-proc-pear-corestore-hrpc.js} ids. */
export const BARE_OS_PROC_FILE_TO_ID_PEAR_CORESTORE_HRPC = Object.freeze({
bare_os_async_hooks_lag: 'async_hooks_lag',
bare_os_autopass_session_sketch: 'autopass_session_sketch',
bare_os_bare_diagnostics_channel: 'diagnostics_channel',
bare_os_bare_net_interfaces: 'bare_net_interfaces',
bare_os_bare_thread_pool: 'thread_pool',
bare_os_blind_relay_router: 'blind_relay_router',
bare_os_compact_encoding_profile: 'compact_encoding_profile',
bare_os_corestore_gc_hint: 'corestore_gc_hint',
bare_os_git_lfs_pointer_stats: 'git_lfs_pointer_stats',
bare_os_hrpc_bridge_health: 'hrpc_bridge_health',
bare_os_hyperdb_readonly_index: 'hyperdb_readonly_index',
bare_os_pear_build_fingerprint: 'pear_build_fingerprint',
bare_os_pear_runtime_channel: 'pear_runtime_channel',
bare_os_protomux_channels: 'protomux_channels',
bare_os_security_context: 'security_context',
bare_os_updater_download_state: 'updater_download_state'
})
/** Capability word 8 `/proc` pseudo files → {@link ./bare-os-proc-bare-runtime-proto-mux.js} ids. */
export const BARE_OS_PROC_FILE_TO_ID_BARE_RUNTIME_PROTO_MUX = Object.freeze({
bare_os_bare_kit_bridge: 'bare_kit_bridge',
bare_os_brittle_snapshot_ci: 'brittle_snapshot_ci',
bare_os_cellery_sidecar_hint: 'cellery_sidecar_hint',
bare_os_form_data_delegate_limits: 'form_data_delegate_limits',
bare_os_gip_transport_sketch: 'gip_transport_sketch',
bare_os_http_dht_proxy_route: 'http_dht_proxy_route',
bare_os_hyper_multisig_trust_pointer: 'hyper_multisig_trust_pointer',
bare_os_hypercore_signing_status: 'hypercore_signing_status',
bare_os_hypermininet_topology: 'hypermininet_topology',
bare_os_libmqjs_queue_depth: 'libmqjs_queue_depth',
bare_os_oidc_publishing_pointer: 'oidc_publishing_pointer',
bare_os_pear_sidecar_bundle_index: 'pear_sidecar_bundle_index',
bare_os_protomux_rpc_pool_health: 'protomux_rpc_pool_health',
bare_os_react_native_bare_kit: 'react_native_bare_kit',
bare_os_rocksdb_pointer: 'rocksdb_pointer',
bare_os_safe_sodium_buffer_policy: 'safe_sodium_buffer_policy',
bare_os_sandbox_worker_queue: 'sandbox_worker_queue',
bare_os_structured_clone_profile: 'structured_clone_profile'
})
/** Capability word 9 `/proc` pseudo files → {@link ./bare-os-proc-bare-module-crypto-staging.js} ids. */
export const BARE_OS_PROC_FILE_TO_ID_BARE_MODULE_CRYPTO_STAGING = Object.freeze({
bare_os_pear_stage_pointer: 'pear_stage_pointer',
bare_os_pear_updater_state: 'pear_updater_state',
bare_os_pear_appling_manifest: 'pear_appling_manifest',
bare_os_drive_resolve_cache: 'drive_resolve_cache',
bare_os_bare_module_resolution: 'bare_module_resolution',
bare_os_bare_crypto_policy: 'bare_crypto_policy',
bare_os_bare_ipc_bridge: 'bare_ipc_bridge',
bare_os_bare_vm_sandbox_sketch: 'bare_vm_sandbox_sketch',
bare_os_bare_daemon_hooks: 'bare_daemon_hooks',
bare_os_bare_storage_quota: 'bare_storage_quota',
bare_os_bare_worker_pool: 'bare_worker_pool',
bare_os_pear_wakeups_schedule: 'pear_wakeups_schedule',
bare_os_pear_drop_events: 'pear_drop_events',
bare_os_pear_radio_state: 'pear_radio_state',
bare_os_hypercore_repair_hint: 'hypercore_repair_hint',
bare_os_hyperdrive_sparse_index: 'hyperdrive_sparse_index',
bare_os_protomux_channel_alias_v2: 'protomux_channel_alias_v2',
bare_os_structured_clone_budget_v2: 'structured_clone_budget_v2',
bare_os_form_data_delegate_limits_v2: 'form_data_delegate_limits_v2'
})
/** Capability word 10 `/proc` pseudo files → {@link ./bare-os-proc-pear-inspect-logger-tls.js} ids. */
export const BARE_OS_PROC_FILE_TO_ID_PEAR_INSPECT_LOGGER_TLS = Object.freeze({
bare_os_activity_queue_depth: 'activity_queue_depth',
bare_os_autobase_writer_hint: 'autobase_writer_hint',
bare_os_bare_boot_phase_map: 'bare_boot_phase_map',
bare_os_bare_inspect_policy: 'bare_inspect_policy',
bare_os_bare_logger_policy: 'bare_logger_policy',
bare_os_bare_performance_counters: 'bare_performance_counters',
bare_os_bare_rpc_registry_sketch: 'bare_rpc_registry_sketch',
bare_os_bare_signals_mask: 'bare_signals_mask',
bare_os_bare_stream_backpressure: 'bare_stream_backpressure',
bare_os_bare_timers_budget: 'bare_timers_budget',
bare_os_bare_tls_session_hint: 'bare_tls_session_hint',
bare_os_bare_ws_gateway_sketch: 'bare_ws_gateway_sketch',
bare_os_blind_pairing_sketch: 'blind_pairing_sketch',
bare_os_broadcast_encryption_hint: 'broadcast_encryption_hint',
bare_os_pear_api_allowlist_sketch: 'pear_api_allowlist_sketch',
bare_os_pear_doctor_state: 'pear_doctor_state',
bare_os_pear_rti_pointer: 'pear_rti_pointer',
bare_os_pear_user_dirs_map: 'pear_user_dirs_map',
bare_os_pear_workshop_flags: 'pear_workshop_flags'
})
/** Capability word 11 `/proc` pseudo files → {@link ./bare-os-proc-hypercore-pack-hrpc-lifecycle.js} ids. */
export const BARE_OS_PROC_FILE_TO_ID_HYPERCORE_PACK_HRPC_LIFECYCLE = Object.freeze({
bare_os_autopass_rotation_sketch: 'autopass_rotation_sketch',
bare_os_bare_addon_policy: 'bare_addon_policy',
bare_os_bare_pack_cache: 'bare_pack_cache',
bare_os_bare_signals_profile: 'bare_signals_profile',
bare_os_bare_timers_histogram: 'bare_timers_histogram',
bare_os_bundle_preload_hint: 'bundle_preload_hint',
bare_os_drive_version_graph: 'drive_version_graph',
bare_os_git_lfs_budget: 'git_lfs_budget',
bare_os_hrpc_allowlist_sketch: 'hrpc_allowlist_sketch',
bare_os_hypercore_replicate_budget: 'hypercore_replicate_budget',
bare_os_indexer_catchup: 'indexer_catchup',
bare_os_multisig_quorum_pointer: 'multisig_quorum_pointer',
bare_os_net_qos_class: 'net_qos_class',
bare_os_pear_runtime_matrix: 'pear_runtime_matrix',
bare_os_protomux_backpressure: 'protomux_backpressure',
bare_os_relay_geo_hint: 'relay_geo_hint',
bare_os_sidecar_resource_cap: 'sidecar_resource_cap',
bare_os_storage_tier_hint: 'storage_tier_hint',
bare_os_wave11_operator_slo_v2: 'wave11_operator_slo_v2',
bare_os_wave11_peer_qos_sketch: 'wave11_peer_qos_sketch',
bare_os_kernel_program: 'kernel_program',
bare_os_giant_phase_program: 'giant_phase_program'
})
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+7 -1
View File
@@ -10,7 +10,7 @@
"start": "node ../../scripts/ensure-pear-node-modules.mjs packages/bare-os-booter && bare index.js",
"dev": "node ../../scripts/ensure-pear-node-modules.mjs packages/bare-os-booter && bare index.js",
"bin:dev": "bare ../../bin/bare-os-booter.mjs --no-updates",
"test": "../../node_modules/.bin/brittle-bare test.identity.js && node --require ./scripts/bare-node-test-shim.cjs ../../node_modules/.bin/brittle-node test.js test.bare-os-chat-service.js test.bare-os-chat-wire.js test.bare-os-chat-roundtrip.js test.bare-holesail.js test.bare-holesail-managed.js test.bare-os-www.js test.bare-os-bind-fallback.js test.bare-os-ssh-holesail.js test.bare-openssh-pty.js test.bare-openssh-sftp.js test.hrpc-allowlist.js test.socket-scm-rights.js test.peer-system-seed.js test.peer-visibility-proc.js test.qvac-host.js test.qvac-gpu-probe.js test.qvac-models-store.js test.tui-sdk.js test.irc-tls.js test.bare-discord-env.js test.bare-discord-initd.js",
"test": "../../node_modules/.bin/brittle-bare test.identity.js && node --require ./scripts/bare-node-test-shim.cjs ../../node_modules/.bin/brittle-node test.kernel.js test.vfs.js test.shell.js test.initd-fish.js test.coreutils.js test.runtime.js test.bare-os-chat-service.js test.bare-os-chat-wire.js test.bare-os-chat-roundtrip.js test.bare-holesail.js test.bare-holesail-managed.js test.bare-os-www.js test.bare-os-bind-fallback.js test.bare-os-ssh-holesail.js test.bare-openssh-pty.js test.bare-openssh-sftp.js test.hrpc-allowlist.js test.socket-scm-rights.js test.peer-system-seed.js test.peer-visibility-proc.js test.qvac-host.js test.qvac-gpu-probe.js test.qvac-models-store.js test.tui-sdk.js test.irc-tls.js test.bare-discord-env.js test.bare-discord-initd.js",
"test:bare": "../../node_modules/.bin/brittle-bare test.identity.js test.bare-smoke.js test.bare-discord-load.js",
"test:shell-bracket": "node --require ./scripts/bare-node-test-shim.cjs ../../node_modules/.bin/brittle-node test.shell-bracket-smoke.mjs",
"test:peer-seed": "node --require ./scripts/bare-node-test-shim.cjs ../../node_modules/.bin/brittle-node test.peer-system-seed.js",
@@ -88,6 +88,12 @@
"node_modules/.bin",
"node_modules/.package-lock.json",
"test.js",
"test.kernel.js",
"test.vfs.js",
"test.shell.js",
"test.initd-fish.js",
"test.coreutils.js",
"test.runtime.js",
"test.identity.js",
"test.bare-smoke.js",
"test.bare-holesail.js",
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-15
View File
@@ -1,15 +0,0 @@
h
pppThis is a test
File diff suppressed because it is too large Load Diff
+440
View File
@@ -0,0 +1,440 @@
import test from 'brittle'
import b4a from 'b4a'
import Hyperdrive from 'hyperdrive'
import Corestore from 'corestore'
import { mkdirSync, rmSync } from 'node:fs'
import { readFile, readdir } from 'node:fs/promises'
import path from 'node:path'
import { fileURLToPath } from 'node:url'
import { createRequire } from 'node:module'
import { PassThrough } from 'node:stream'
import { XTERM_CLEAR_SCROLLBACK_AND_VIEWPORT } from '../lib/terminal-escapes.js'
import { runKernelFromSource, runBinCommand } from '../lib/kernel-runner.js'
import { createGitFsFromVfs } from '../lib/git-fs-adapter.js'
import { runGitCli } from '../lib/git-cli.js'
import {
createStreamLineReader,
sanitizeInteractiveShellLine
} from '../lib/cli-readline.js'
import {
createVfs,
BARE_OS_PROC_FILE_TO_ID_HYPERCORE_PACK_HRPC_LIFECYCLE
} from '../lib/vfs.js'
import { parseHdmsPairArgv } from '../lib/hdms-cli-argv.js'
import hcCrypto from 'hypercore-crypto'
import idEnc from 'hypercore-id-encoding'
import {
decodeRwShareOffer,
decodeShareOffer,
HDMS_AUTOPASS_SHARE_KEY,
HDMS_AUTOPASS_SHARE_RW_KEY,
normalizeWriterSecretHex
} from '../lib/hdms-share-offer.js'
import { buildBareOsHypercorePackHrpcLifecycleProcJson } from '../lib/bare-os-proc-hypercore-pack-hrpc-lifecycle.js'
import { buildBareOsPearCorestoreHrpcProcJson } from '../lib/bare-os-proc-pear-corestore-hrpc.js'
import { buildBareOsPearInspectLoggerTlsProcJson } from '../lib/bare-os-proc-pear-inspect-logger-tls.js'
import { buildBareOsBareRuntimeProtoMuxProcJson } from '../lib/bare-os-proc-bare-runtime-proto-mux.js'
import { buildBareOsBootGraphProcJson } from '../lib/bare-os-boot-graph-proc.js'
import { pathnameExpandShellWord } from '../lib/shell-glob.js'
import { createBareOsIpc } from '../lib/bare-os-ipc.js'
import { BareOsSwarmConnectionManager } from '../lib/bare-os-swarm-connection-manager.js'
import {
createBareOsLifecycleStateMachine,
runTransactionalLifecycleHooks
} from '../lib/bare-os-lifecycle-manager.js'
import {
bareOsRegisterCorestoreSuspendResumeHooks,
bareOsInstallCorestoreSuspendResumeHooks
} from '../lib/corestore-host-lifecycle.js'
import { bareOsFindOrphanProcessRows } from '../lib/bare-os-process-table.js'
import {
topologicalOrderKernelExtensions,
resolveKernelExtensionsFull
} from '../lib/kernel-extension-resolver.js'
import { createBareOsProtomuxAliasRegistry } from '../lib/bare-os-protomux-alias-registry.js'
import { bareOsHttpUrlAllowed } from '../lib/bare-os-http-policy.js'
import {
bareOsParseBareAclText,
bareOsAclDeniesSubject
} from '../lib/bare-os-vfs-acl-enforce.js'
import { raceWithAbortAndTimeout } from '../lib/bare-os-abort.js'
import {
tokenize,
expandWord,
execShellLine,
expandArgvAliases,
defaultShellAliases,
loadBarerc,
BARERC_SKELETON,
splitTokensBySemicolon,
splitTokensByAndOr,
bareOsShellAstSnapshot,
planShellRedirections,
buildShellExecutionGraph,
dispatchShellTrapSignal,
BARE_OS_EXIT_STATUS_ENV,
syncBareOsExitStatusEnv,
getBareOsPipelineLimits,
DEFAULT_PIPELINE_MAX_STAGES,
} from '../lib/shell.js'
import { tokenizeBareShellLineDetailed } from '../lib/shell-tokenizer.js'
import { decodeBareOsDollarQuote } from '../lib/shell-lex.js'
import {
applyBareOsThemeFromEnv,
bareOsListThemeNames
} from '../lib/bare-os-theme-presets.js'
import {
bareParseLsColors,
bareSerializeLsColors,
bareLsColorOpenSgrFromMap,
bareDefaultDircolorsDatabase,
bareParseDircolorsDatabase
} from 'bare-os-lscolors'
import { BARE_OS_CTX_API_VERSION } from '../lib/bare-os-ctx-api.js'
import { buildBareOsRuntimeCaps } from '../lib/bare-os-runtime-caps.js'
import {
bareOsBareModulesEnabled,
bareOsBareModuleManifestEmbeddedRef,
buildBareCtxObjectFromHost,
buildPearCtxObjectFromHost,
loadBareModuleManifest,
maybeMergeBareFromDrive
} from '../lib/bare-os-ctx-bare.js'
import { maybeBareOsBuildBinManifest } from '../lib/bare-os-bin-index.js'
import {
createFishReadLine,
fuzzyMatch,
stripAnsi,
parseHistoryFile,
formatHistoryFile,
dedupeConsecutiveHistory,
searchHistoryEntries,
shouldPersistShellHistoryCommand,
scrubShellHistoryEntries,
SHELL_BUILTINS,
resolveShellPromptHookSegment
} from '../lib/fish-readline.js'
import {
parseCompletionContext,
rankCompletionItems,
suggestGhostFromHistory,
suggestGhostFromFs,
ghostReplaceCurrentWord,
longestCommonCompletionPrefix,
completeLine,
levenshtein
} from '../lib/completion-engine.js'
import {
fieldMatches,
dowFieldMatches,
parseCronLine,
jobMatchesDate
} from '../lib/bare-cron.js'
import '../lib/bare-openssh.js'
import {
bareInitdReadinessSnapshot,
bareInitdShutdownActiveUnitsReverse,
getBareServiceRuntime,
registerBareInitdDisposer,
registerKernelShutdownHook,
runKernelShutdownHooks,
startBareInitd,
stopBareInitd,
getLastBareInitdDagSnapshotJson
} from '../lib/bare-initd.js'
import {
appendVarLog,
ensureBareOsVarLogTree,
KERNEL_CONSOLE_LOG,
BOOT_LOG
} from '../lib/bare-os-var-log.js'
import {
bareOsKernelMetricsReset,
bareOsKernelMetricsSnapshot
} from '../lib/bare-os-kernel-metrics.js'
import { parseUnitDropInText } from '../lib/bare-initd-user.js'
import {
bareOsHyperswarmOptsFromEnv,
bareOsBootJoinPeerHexFromEnv
} from '../lib/swarm-opts.js'
import {
bareOsBootInitPrefetchEnabled,
bareOsBootWarmBinDownloadDiffEnabled
} from '../lib/boot-prefetch.js'
import { bareOsProcessTableSnapshot } from '../lib/bare-os-process-table.js'
import { buildBareOsSyscallsProcJson } from '../lib/bare-os-syscalls-proc-json.js'
import {
bareOsParseSendmsgScmRights,
wantPosixSocketScmRights
} from '../lib/bare-os-socket-scm-rights.js'
import {
parseBareOsHrpcAllowlistJson,
bareOsHrpcAllowlistDeniesRoute
} from '../lib/bare-os-hrpc-allowlist.js'
import { buildBareOsProtomuxExtensionsProcJson } from '../lib/bare-os-protomux-extensions-proc.js'
import { createBareOsDiskOsBridge } from '../lib/bare-os-disk-os-bridge.js'
import { buildBareOsReplicationLiveSketch } from '../lib/bare-os-replication-proc-live.js'
import {
evaluateBareOsPeerAdmission,
bareOsFormatPeerAdmissionAuditEvent,
bareOsPeerAdmissionAuditRateAllow
} from '../lib/bare-os-peer-admission.js'
import {
parseDelegateAllowSet,
isDelegateKindAllowed
} from '../lib/host-delegate-registry.js'
import {
bareOsAuditAppend,
bareOsAuditVerifyRows
} from '../lib/bare-os-audit-chain.js'
import { bareOsDrainFcntlLockWaiters } from '../lib/bare-os-fcntl-cooperative-lock.js'
import { buildBareOsReplicationOperatorSurfaceProcJson } from '../lib/bare-os-proc-replication-operator-surface.js'
import {
DEFAULT_CURL_USER_AGENT,
DEFAULT_WGET_USER_AGENT
} from '../lib/http-fetch-url.js'
import { filenameFromContentDisposition } from '../lib/curl-cli.js'
import { encodeUstarHeader, runTarCli } from '../lib/tar-cli.js'
export {
test,
b4a,
Hyperdrive,
Corestore,
mkdirSync,
rmSync,
readFile,
readdir,
path,
fileURLToPath,
PassThrough,
XTERM_CLEAR_SCROLLBACK_AND_VIEWPORT,
runKernelFromSource,
runBinCommand,
createGitFsFromVfs,
runGitCli,
createStreamLineReader,
sanitizeInteractiveShellLine,
createVfs,
BARE_OS_PROC_FILE_TO_ID_HYPERCORE_PACK_HRPC_LIFECYCLE,
parseHdmsPairArgv,
hcCrypto,
idEnc,
decodeRwShareOffer,
decodeShareOffer,
HDMS_AUTOPASS_SHARE_KEY,
HDMS_AUTOPASS_SHARE_RW_KEY,
normalizeWriterSecretHex,
buildBareOsHypercorePackHrpcLifecycleProcJson,
buildBareOsPearCorestoreHrpcProcJson,
buildBareOsPearInspectLoggerTlsProcJson,
buildBareOsBareRuntimeProtoMuxProcJson,
buildBareOsBootGraphProcJson,
pathnameExpandShellWord,
createBareOsIpc,
BareOsSwarmConnectionManager,
createBareOsLifecycleStateMachine,
runTransactionalLifecycleHooks,
bareOsRegisterCorestoreSuspendResumeHooks,
bareOsInstallCorestoreSuspendResumeHooks,
bareOsFindOrphanProcessRows,
topologicalOrderKernelExtensions,
resolveKernelExtensionsFull,
createBareOsProtomuxAliasRegistry,
bareOsHttpUrlAllowed,
bareOsParseBareAclText,
bareOsAclDeniesSubject,
raceWithAbortAndTimeout,
tokenize,
expandWord,
execShellLine,
expandArgvAliases,
defaultShellAliases,
loadBarerc,
BARERC_SKELETON,
splitTokensBySemicolon,
splitTokensByAndOr,
bareOsShellAstSnapshot,
planShellRedirections,
buildShellExecutionGraph,
dispatchShellTrapSignal,
BARE_OS_EXIT_STATUS_ENV,
syncBareOsExitStatusEnv,
getBareOsPipelineLimits,
DEFAULT_PIPELINE_MAX_STAGES,
tokenizeBareShellLineDetailed,
decodeBareOsDollarQuote,
applyBareOsThemeFromEnv,
bareOsListThemeNames,
bareParseLsColors,
bareSerializeLsColors,
bareLsColorOpenSgrFromMap,
bareDefaultDircolorsDatabase,
bareParseDircolorsDatabase,
BARE_OS_CTX_API_VERSION,
buildBareOsRuntimeCaps,
bareOsBareModulesEnabled,
bareOsBareModuleManifestEmbeddedRef,
buildBareCtxObjectFromHost,
buildPearCtxObjectFromHost,
loadBareModuleManifest,
maybeMergeBareFromDrive,
maybeBareOsBuildBinManifest,
createFishReadLine,
fuzzyMatch,
stripAnsi,
parseHistoryFile,
formatHistoryFile,
dedupeConsecutiveHistory,
searchHistoryEntries,
shouldPersistShellHistoryCommand,
scrubShellHistoryEntries,
SHELL_BUILTINS,
resolveShellPromptHookSegment,
parseCompletionContext,
rankCompletionItems,
suggestGhostFromHistory,
suggestGhostFromFs,
ghostReplaceCurrentWord,
longestCommonCompletionPrefix,
completeLine,
levenshtein,
fieldMatches,
dowFieldMatches,
parseCronLine,
jobMatchesDate,
bareInitdReadinessSnapshot,
bareInitdShutdownActiveUnitsReverse,
getBareServiceRuntime,
registerBareInitdDisposer,
registerKernelShutdownHook,
runKernelShutdownHooks,
startBareInitd,
stopBareInitd,
getLastBareInitdDagSnapshotJson,
appendVarLog,
ensureBareOsVarLogTree,
KERNEL_CONSOLE_LOG,
BOOT_LOG,
bareOsKernelMetricsReset,
bareOsKernelMetricsSnapshot,
parseUnitDropInText,
bareOsHyperswarmOptsFromEnv,
bareOsBootJoinPeerHexFromEnv,
bareOsBootInitPrefetchEnabled,
bareOsBootWarmBinDownloadDiffEnabled,
bareOsProcessTableSnapshot,
buildBareOsSyscallsProcJson,
bareOsParseSendmsgScmRights,
wantPosixSocketScmRights,
parseBareOsHrpcAllowlistJson,
bareOsHrpcAllowlistDeniesRoute,
buildBareOsProtomuxExtensionsProcJson,
createBareOsDiskOsBridge,
buildBareOsReplicationLiveSketch,
evaluateBareOsPeerAdmission,
bareOsFormatPeerAdmissionAuditEvent,
bareOsPeerAdmissionAuditRateAllow,
parseDelegateAllowSet,
isDelegateKindAllowed,
bareOsAuditAppend,
bareOsAuditVerifyRows,
bareOsDrainFcntlLockWaiters,
buildBareOsReplicationOperatorSurfaceProcJson,
DEFAULT_CURL_USER_AGENT,
DEFAULT_WGET_USER_AGENT,
filenameFromContentDisposition,
encodeUstarHeader,
runTarCli
}
/** bare-ssh2 needs Bare `require.addon` (bare-crypto); skip auto-start in brittle-node. */
if (
typeof process !== 'undefined' &&
process.env &&
process.env.BARE_OS_INITD_DISABLED === undefined
) {
process.env.BARE_OS_INITD_DISABLED = 'bare-openssh'
}
export const __dirname = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
export const require = createRequire(path.join(__dirname, 'package.json'))
export const TAR_BLK = 512
/** @param {Uint8Array[]} parts */
export function concatTarParts(parts) {
let n = 0
for (const p of parts) n += p.length
const out = new Uint8Array(n)
let o = 0
for (const p of parts) {
out.set(p, o)
o += p.length
}
return out
}
export function headerFromInit(init, name) {
if (!init?.headers) return undefined
const h = init.headers
if (typeof h.get === 'function') return h.get(name)
return undefined
}
export function testCorestoreDir(name) {
const dir = path.join(
__dirname,
'.test-data',
name + '-' + process.pid + '-' + Math.random().toString(36).slice(2)
)
mkdirSync(path.dirname(dir), { recursive: true })
return dir
}
export function testCtx(drive, personal, env) {
const shellEnv = {
HOME: '/home/user',
PATH: '/bin',
USER: 'user',
UID: '1000',
GID: '1000',
PWD: '/home/user',
BARE_OS_EXIT_STATUS: '0',
BARE_OS_SSH_LISTEN_PORT: '0',
...env
}
const bareOsIpc = createBareOsIpc()
const vfs = createVfs(drive, personal, shellEnv, null, { bareOsIpc })
const ctx = {
drive,
personalDrive: personal,
vfs,
bareOsIpc,
env: shellEnv,
console,
b4a,
async bareOsApplyTheme() {
return applyBareOsThemeFromEnv(this)
},
bareOsListThemes() {
return bareOsListThemeNames()
}
}
return ctx
}
/** Personal-drive path backing logical `/home/<seg>/…` (matches `vfs.js`). */
export function personalHomeBacking(homePath, rel = '') {
const seg = homePath.replace(/^\/home\//, '').split('/')[0] || 'user'
const r = String(rel).replace(/^\//, '')
return r ? `/.bare-os/home/${seg}/${r}` : `/.bare-os/home/${seg}`
}
/** Built `/bin/<name>` body from the repo kernel tree. */
export async function readBuiltBin(name) {
const fs = await import('node:fs/promises')
const p = path.join(__dirname, '../../kernel/bin', name)
return fs.readFile(p, 'utf8')
}
-1
View File
@@ -1 +0,0 @@
o