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/cli/terminal-escapes.js' import { runKernelFromSource, runBinCommand } from '../lib/boot/kernel-runner.js' import { createGitFsFromVfs } from '../lib/vfs/git-fs-adapter.js' import { runGitCli } from '../lib/tools/git-cli.js' import { createStreamLineReader, sanitizeInteractiveShellLine } from '../lib/cli/cli-readline.js' import { createVfs, BARE_OS_PROC_FILE_TO_ID_HYPERCORE_PACK_HRPC_LIFECYCLE } from '../lib/vfs/vfs.js' import { parseHdmsPairArgv } from '../lib/p2p/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/p2p/hdms-share-offer.js' import { buildBareOsHypercorePackHrpcLifecycleProcJson } from '../lib/proc/bare-os-proc-hypercore-pack-hrpc-lifecycle.js' import { buildBareOsPearCorestoreHrpcProcJson } from '../lib/proc/bare-os-proc-pear-corestore-hrpc.js' import { buildBareOsPearInspectLoggerTlsProcJson } from '../lib/proc/bare-os-proc-pear-inspect-logger-tls.js' import { buildBareOsBareRuntimeProtoMuxProcJson } from '../lib/proc/bare-os-proc-bare-runtime-proto-mux.js' import { buildBareOsBootGraphProcJson } from '../lib/boot/bare-os-boot-graph-proc.js' import { pathnameExpandShellWord } from '../lib/shell/shell-glob.js' import { createBareOsIpc } from '../lib/tools/bare-os-ipc.js' import { BareOsSwarmConnectionManager } from '../lib/p2p/bare-os-swarm-connection-manager.js' import { createBareOsLifecycleStateMachine, runTransactionalLifecycleHooks } from '../lib/host/bare-os-lifecycle-manager.js' import { bareOsRegisterCorestoreSuspendResumeHooks, bareOsInstallCorestoreSuspendResumeHooks } from '../lib/host/corestore-host-lifecycle.js' import { bareOsFindOrphanProcessRows } from '../lib/proc/bare-os-process-table.js' import { topologicalOrderKernelExtensions, resolveKernelExtensionsFull } from '../lib/boot/kernel-extension-resolver.js' import { createBareOsProtomuxAliasRegistry } from '../lib/p2p/bare-os-protomux-alias-registry.js' import { bareOsHttpUrlAllowed } from '../lib/security/bare-os-http-policy.js' import { bareOsParseBareAclText, bareOsAclDeniesSubject } from '../lib/vfs/bare-os-vfs-acl-enforce.js' import { raceWithAbortAndTimeout } from '../lib/security/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/shell.js' import { tokenizeBareShellLineDetailed } from '../lib/shell/shell-tokenizer.js' import { decodeBareOsDollarQuote } from '../lib/shell/shell-lex.js' import { applyBareOsThemeFromEnv, bareOsListThemeNames } from '../lib/cli/bare-os-theme-presets.js' import { bareParseLsColors, bareSerializeLsColors, bareLsColorOpenSgrFromMap, bareDefaultDircolorsDatabase, bareParseDircolorsDatabase } from 'bare-os-lscolors' import { BARE_OS_CTX_API_VERSION } from '../lib/ctx/bare-os-ctx-api.js' import { buildBareOsRuntimeCaps } from '../lib/ctx/bare-os-runtime-caps.js' import { bareOsBareModulesEnabled, bareOsBareModuleManifestEmbeddedRef, buildBareCtxObjectFromHost, buildPearCtxObjectFromHost, loadBareModuleManifest, maybeMergeBareFromDrive } from '../lib/ctx/bare-os-ctx-bare.js' import { maybeBareOsBuildBinManifest } from '../lib/tools/bare-os-bin-index.js' import { createFishReadLine, fuzzyMatch, stripAnsi, parseHistoryFile, formatHistoryFile, dedupeConsecutiveHistory, searchHistoryEntries, shouldPersistShellHistoryCommand, scrubShellHistoryEntries, SHELL_BUILTINS, resolveShellPromptHookSegment } from '../lib/cli/fish-readline.js' import { parseCompletionContext, rankCompletionItems, suggestGhostFromHistory, suggestGhostFromFs, ghostReplaceCurrentWord, longestCommonCompletionPrefix, completeLine, levenshtein } from '../lib/cli/completion-engine.js' import { fieldMatches, dowFieldMatches, parseCronLine, jobMatchesDate } from '../lib/initd/bare-cron.js' import '../lib/services/bare-openssh.js' import { bareInitdReadinessSnapshot, bareInitdShutdownActiveUnitsReverse, getBareServiceRuntime, registerBareInitdDisposer, registerKernelShutdownHook, runKernelShutdownHooks, startBareInitd, stopBareInitd, getLastBareInitdDagSnapshotJson } from '../lib/initd/bare-initd.js' import { appendVarLog, ensureBareOsVarLogTree, KERNEL_CONSOLE_LOG, BOOT_LOG } from '../lib/vfs/bare-os-var-log.js' import { bareOsKernelMetricsReset, bareOsKernelMetricsSnapshot } from '../lib/boot/bare-os-kernel-metrics.js' import { parseUnitDropInText } from '../lib/initd/bare-initd-user.js' import { bareOsHyperswarmOptsFromEnv, bareOsBootJoinPeerHexFromEnv } from '../lib/p2p/swarm-opts.js' import { bareOsBootInitPrefetchEnabled, bareOsBootWarmBinDownloadDiffEnabled } from '../lib/boot/boot-prefetch.js' import { bareOsProcessTableSnapshot } from '../lib/proc/bare-os-process-table.js' import { buildBareOsSyscallsProcJson } from '../lib/posix/bare-os-syscalls-proc-json.js' import { bareOsParseSendmsgScmRights, wantPosixSocketScmRights } from '../lib/posix/bare-os-socket-scm-rights.js' import { parseBareOsHrpcAllowlistJson, bareOsHrpcAllowlistDeniesRoute } from '../lib/tools/bare-os-hrpc-allowlist.js' import { buildBareOsProtomuxExtensionsProcJson } from '../lib/p2p/bare-os-protomux-extensions-proc.js' import { createBareOsDiskOsBridge } from '../lib/host/bare-os-disk-os-bridge.js' import { buildBareOsReplicationLiveSketch } from '../lib/p2p/bare-os-replication-proc-live.js' import { evaluateBareOsPeerAdmission, bareOsFormatPeerAdmissionAuditEvent, bareOsPeerAdmissionAuditRateAllow } from '../lib/p2p/bare-os-peer-admission.js' import { parseDelegateAllowSet, isDelegateKindAllowed } from '../lib/host/host-delegate-registry.js' import { bareOsAuditAppend, bareOsAuditVerifyRows } from '../lib/security/bare-os-audit-chain.js' import { bareOsDrainFcntlLockWaiters } from '../lib/posix/bare-os-fcntl-cooperative-lock.js' import { buildBareOsReplicationOperatorSurfaceProcJson } from '../lib/proc/bare-os-proc-replication-operator-surface.js' import { DEFAULT_CURL_USER_AGENT, DEFAULT_WGET_USER_AGENT } from '../lib/tools/http-fetch-url.js' import { filenameFromContentDisposition } from '../lib/tools/curl-cli.js' import { encodeUstarHeader, runTarCli } from '../lib/tools/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//…` (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/` 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') }